diff --git a/src/Orchard.Tests/Utility/Extensions/StringExtensionsTests.cs b/src/Orchard.Tests/Utility/Extensions/StringExtensionsTests.cs index a9e9957ff..3240ab717 100644 --- a/src/Orchard.Tests/Utility/Extensions/StringExtensionsTests.cs +++ b/src/Orchard.Tests/Utility/Extensions/StringExtensionsTests.cs @@ -4,6 +4,20 @@ using Orchard.Utility.Extensions; namespace Orchard.Tests.Utility.Extensions { [TestFixture] public class StringExtensionsTests { + [Test] + public void OrDefault_ReturnsDefaultForNull() { + const string s = null; + Assert.That(s.OrDefault("test"), Is.SameAs("test")); + } + [Test] + public void OrDefault_ReturnsDefault() { + Assert.That("".OrDefault("test"), Is.SameAs("test")); + } + + [Test] + public void OrDefault_ReturnsString() { + Assert.That("bar".OrDefault("test"), Is.SameAs("bar")); + } [Test] public void IsNullOrEmptyTrimmed_EmptyStringReturnsTrue() { const string testString = ""; diff --git a/src/Orchard.Web/Modules/Orchard.Modules/Commands/FeatureCommand.cs b/src/Orchard.Web/Modules/Orchard.Modules/Commands/FeatureCommand.cs new file mode 100644 index 000000000..b2a40e5eb --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Modules/Commands/FeatureCommand.cs @@ -0,0 +1,60 @@ +using System.Linq; +using Orchard.Commands; +using Orchard.Utility.Extensions; + +namespace Orchard.Modules.Commands { + public class FeatureCommand : DefaultOrchardCommandHandler { + private readonly IModuleService _moduleService; + + public FeatureCommand(IModuleService moduleService) { + _moduleService = moduleService; + } + + [OrchardSwitch] + public bool Summary { get; set; } + + [CommandHelp("feature list [/Summary:true|false]\r\n\t" + "Display list of available features")] + [CommandName("feature list")] + [OrchardSwitches("Summary")] + public void List() { + if (Summary) { + foreach (var feature in _moduleService.GetAvailableFeatures().OrderBy(f => f.Descriptor.Name)) { + Context.Output.WriteLine(T("{0}, {1}", feature.Descriptor.Name, feature.IsEnabled ? T("Enabled") : T("Disabled"))); + } + } + else { + Context.Output.WriteLine(T("List of available features")); + Context.Output.WriteLine(T("--------------------------")); + + var categories = _moduleService.GetAvailableFeatures().GroupBy(f => f.Descriptor.Category); + foreach (var category in categories) { + Context.Output.WriteLine(T("{0}", category.Key.OrDefault("General"))); + foreach (var feature in category.OrderBy(f => f.Descriptor.Name)) { + Context.Output.WriteLine(T(" {0}", feature.Descriptor.Name)); + Context.Output.WriteLine(T(" State: {0}", feature.IsEnabled ? T("Enabled") : T("Disabled"))); + Context.Output.WriteLine(T(" Description: {0}", feature.Descriptor.Description.OrDefault(""))); + Context.Output.WriteLine(T(" Category: {0}", feature.Descriptor.Category.OrDefault(""))); + Context.Output.WriteLine(T(" Module: {0}", feature.Descriptor.Extension.Name.OrDefault(""))); + Context.Output.WriteLine(T(" Dependencies: {0}", string.Join(",", feature.Descriptor.Dependencies).OrDefault(""))); + } + } + } + } + + [CommandHelp("feature enable ... \r\n\t" + "Enable one or more features")] + [CommandName("feature enable")] + public void Enable(params string[] featureNames) { + Context.Output.WriteLine(T("Enabling features {0}", string.Join(",", featureNames))); + _moduleService.EnableFeatures(featureNames); + Context.Output.WriteLine(T("Enabled features {0}", string.Join(",", featureNames))); + } + + [CommandHelp("feature disable ... \r\n\t" + "Disable one or more features")] + [CommandName("feature disable")] + public void Disable(params string[] featureNames) { + Context.Output.WriteLine(T("Disabling features {0}", string.Join(",", featureNames))); + _moduleService.DisableFeatures(featureNames); + Context.Output.WriteLine(T("Disabled features {0}", string.Join(",", featureNames))); + } + } +} diff --git a/src/Orchard.Web/Modules/Orchard.Modules/Orchard.Modules.csproj b/src/Orchard.Web/Modules/Orchard.Modules/Orchard.Modules.csproj index a1206df0f..7296c0288 100644 --- a/src/Orchard.Web/Modules/Orchard.Modules/Orchard.Modules.csproj +++ b/src/Orchard.Web/Modules/Orchard.Modules/Orchard.Modules.csproj @@ -62,6 +62,7 @@ + diff --git a/src/Orchard/Commands/Builtin/HelpCommand.cs b/src/Orchard/Commands/Builtin/HelpCommand.cs index 9240623e3..a39bdbe64 100644 --- a/src/Orchard/Commands/Builtin/HelpCommand.cs +++ b/src/Orchard/Commands/Builtin/HelpCommand.cs @@ -17,7 +17,7 @@ namespace Orchard.Commands.Builtin { Context.Output.WriteLine(T("---------------------------")); Context.Output.WriteLine(); - var descriptors = _commandManager.GetCommandDescriptors(); + var descriptors = _commandManager.GetCommandDescriptors().OrderBy(d => d.Name); foreach (var descriptor in descriptors) { Context.Output.WriteLine(GetHelpText(descriptor)); Context.Output.WriteLine(); diff --git a/src/Orchard/Utility/Extensions/StringExtensions.cs b/src/Orchard/Utility/Extensions/StringExtensions.cs index e8c5f6b74..4e7e233f8 100644 --- a/src/Orchard/Utility/Extensions/StringExtensions.cs +++ b/src/Orchard/Utility/Extensions/StringExtensions.cs @@ -18,5 +18,12 @@ namespace Orchard.Utility.Extensions { if (text == null) return true; return string.IsNullOrEmpty(text.Trim()); } + + public static string OrDefault(this string text, string defaultValue) { + if (string.IsNullOrEmpty(text)) + return defaultValue; + else + return text; + } } } \ No newline at end of file