From dc82505f7f118acf66966bcccadbe1baed709df5 Mon Sep 17 00:00:00 2001 From: Chris Canal Date: Fri, 18 Mar 2011 13:27:02 +0000 Subject: [PATCH 1/2] Issue 127: Added ablity to set -detailed flag when listing wraps to display a packages Description --- .../CommandDocumentation.resx | 3 + src/OpenWrap.Commands/Wrap/ListWrapCommand.cs | 14 ++++- .../Commands/Wrap/listWrapCommand.cs | 58 +++++++++++++++++++ ...ccessful_add_triggers_dependent_removal.cs | 2 +- .../Commands/contexts/command_context.cs | 20 +++++-- src/OpenWrap.Tests/OpenWrap.Tests.csproj | 4 +- .../DefaultPackageManager.cs | 8 +-- .../PackageManagement/IPackageManager.cs | 3 +- .../PackageFoundCommandOutput.cs | 37 +++++++++++- .../PackageManagement/PackageFoundResult.cs | 6 +- .../PackageManagement/PackageListOptions.cs | 3 +- 11 files changed, 138 insertions(+), 20 deletions(-) diff --git a/src/OpenWrap.Commands/CommandDocumentation.resx b/src/OpenWrap.Commands/CommandDocumentation.resx index 32450f68..9197ad0b 100644 --- a/src/OpenWrap.Commands/CommandDocumentation.resx +++ b/src/OpenWrap.Commands/CommandDocumentation.resx @@ -250,6 +250,9 @@ Note that the NuPack support is only provided for backward compatibility with le Lists or queries all packages in a repository. + + Displays package description if present. + Specifies the wildcard to be used when listing packages in a repository. diff --git a/src/OpenWrap.Commands/Wrap/ListWrapCommand.cs b/src/OpenWrap.Commands/Wrap/ListWrapCommand.cs index 50496e6e..6b44feb9 100644 --- a/src/OpenWrap.Commands/Wrap/ListWrapCommand.cs +++ b/src/OpenWrap.Commands/Wrap/ListWrapCommand.cs @@ -5,6 +5,8 @@ using OpenWrap.Collections; using OpenWrap.Commands.Remote; using OpenWrap.Configuration; +using OpenWrap.PackageManagement; +using OpenWrap.PackageModel; using OpenWrap.Repositories; using OpenWrap.Runtime; using OpenWrap.Services; @@ -20,6 +22,9 @@ public class ListWrapCommand : WrapCommand [CommandInput] public bool System { get; set; } + [CommandInput(IsValueRequired = false)] + public bool Detailed { get; set; } + string _remote; bool _remoteSet; @@ -44,10 +49,17 @@ public override IEnumerable Execute() yield break; } - foreach (var m in PackageManager.ListPackages(repoToList, Query)) + var currentPackages = CurrentPackages(); + + foreach (var m in PackageManager.ListPackages(repoToList, Query, Detailed ? PackageListOptions.Detailed : PackageListOptions.Default, currentPackages)) yield return ToOutput(m); } + IEnumerable CurrentPackages() + { + return Environment.ProjectRepository != null ? Environment.ProjectRepository.PackagesByName.NotNull().SelectMany(x => x) : Enumerable.Empty(); + } + IEnumerable GetRepositoryToList() { if (System) diff --git a/src/OpenWrap.Tests/Commands/Wrap/listWrapCommand.cs b/src/OpenWrap.Tests/Commands/Wrap/listWrapCommand.cs index c4c27d24..dcd694b2 100644 --- a/src/OpenWrap.Tests/Commands/Wrap/listWrapCommand.cs +++ b/src/OpenWrap.Tests/Commands/Wrap/listWrapCommand.cs @@ -68,5 +68,63 @@ public void packages_are_found_in_any_remote() .Check(x => x.ShouldHaveAtLeastOne(n => n.Name.Equals("ring-of-power"))); } } + public class listing_packages_with_detailed_option : command_context + { + public listing_packages_with_detailed_option() + { + given_project_package("one-ring", "1.1", "desc 1.1"); + given_project_package("sauron", "2.0"); + given_dependency("depends: one-ring"); + given_dependency("depends: sauron"); + when_executing_command("one*", "-detailed"); + } + [Test] + public void correct_description_is_returned() + { + Results.OfType() + .ShouldHaveCountOf(1) + .First().ToString().ShouldContain("desc 1.1"); + } + } + + public class listing_packages_will_hightlight_current : command_context + { + public listing_packages_will_hightlight_current() + { + given_project_package("one-ring", "1.0"); + given_remote_package("one-ring", "1.0".ToVersion()); + given_remote_package("one-ring", "1.1".ToVersion()); + given_remote_package("one-ring-rules-them-all", "1.1".ToVersion()); + given_project_package("sauron", "2.0"); + given_dependency("depends: one-ring"); + given_dependency("depends: sauron"); + + when_executing_command("*n*", "-remote"); + } + [Test] + public void correct_version_is_highlighted() + { + var s = Results.OfType() + .ShouldHaveCountOf(2) + .First().ToString(); + Console.WriteLine(s); + s.ShouldContain("current: 1.0"); + } + + [Test] + public void current_version_is_still_listed_as_available() + { + Results.OfType() + .ShouldHaveCountOf(2) + .First().ToString().ShouldContain("available: 1.0, 1.1"); + } + [Test] + public void current_version_list_only_for_installed_package() + { + Results.OfType() + .ShouldHaveCountOf(2) + .ElementAt(1).ToString().ShouldNotContain("current: "); + } + } } diff --git a/src/OpenWrap.Tests/Commands/add_wrap/hooks/successful_add_triggers_dependent_removal.cs b/src/OpenWrap.Tests/Commands/add_wrap/hooks/successful_add_triggers_dependent_removal.cs index 094f3b6d..1b5544a1 100644 --- a/src/OpenWrap.Tests/Commands/add_wrap/hooks/successful_add_triggers_dependent_removal.cs +++ b/src/OpenWrap.Tests/Commands/add_wrap/hooks/successful_add_triggers_dependent_removal.cs @@ -12,7 +12,7 @@ class successful_add_triggers_dependent_removal : contexts.add_wrap_with_hooks public successful_add_triggers_dependent_removal() { given_project_repository(); - given_project_package("one-ring", "1.0.0", "depends: fire = 1.0"); + given_project_package("one-ring", "1.0.0", string.Empty, "depends: fire = 1.0"); given_project_package("fire", "1.0"); given_dependency("depends: one-ring"); diff --git a/src/OpenWrap.Tests/Commands/contexts/command_context.cs b/src/OpenWrap.Tests/Commands/contexts/command_context.cs index 6598a59f..be4d5786 100644 --- a/src/OpenWrap.Tests/Commands/contexts/command_context.cs +++ b/src/OpenWrap.Tests/Commands/contexts/command_context.cs @@ -77,7 +77,13 @@ protected void given_dependency(string dependency) protected void given_project_package(string name, string version, params string[] dependencies) { given_project_repository(new InMemoryRepository("Project repository")); - AddPackage(Environment.ProjectRepository, name, version, dependencies); + AddPackage(Environment.ProjectRepository, name, version, dependencies, string.Empty); + } + + protected void given_project_package(string name, string version, string description, params string[] dependencies) + { + given_project_repository(new InMemoryRepository("Project repository")); + AddPackage(Environment.ProjectRepository, name, version, dependencies, description); } protected void given_project_repository() @@ -99,20 +105,21 @@ protected void given_current_directory_repository(CurrentDirectoryRepository rep protected void given_remote_package(string name, Version version, params string[] dependencies) { // note Version is a version type because of overload resolution... - AddPackage(Environment.RemoteRepository, name, version.ToString(), dependencies); + AddPackage(Environment.RemoteRepository, name, version.ToString(), dependencies, string.Empty); } protected void given_remote_package(string repositoryName, string name, Version version, params string[] dependencies) { - AddPackage(Environment.RemoteRepositories.First(x=>x.Name == repositoryName), name, version.ToString(), dependencies); + AddPackage(Environment.RemoteRepositories.First(x => x.Name == repositoryName), name, version.ToString(), dependencies, string.Empty); } protected void given_system_package(string name, string version, params string[] dependencies) { - AddPackage(Environment.SystemRepository, name, version, dependencies); + AddPackage(Environment.SystemRepository, name, version, dependencies, string.Empty); } - static void AddPackage(IPackageRepository repository, string name, string version, string[] dependencies) + + static void AddPackage(IPackageRepository repository, string name, string version, string[] dependencies, string description) { if (repository is InMemoryRepository) { @@ -121,6 +128,7 @@ static void AddPackage(IPackageRepository repository, string name, string versio Name = name, Source = repository, Version = version.ToVersion(), + Description = description, Dependencies = dependencies.SelectMany(x => DependsParser.ParseDependsInstruction(x).Dependencies).ToList() }); return; @@ -140,7 +148,7 @@ protected void given_currentdirectory_package(string packageName, string version protected void given_currentdirectory_package(string packageName, Version version, params string[] dependencies) { if (Environment.CurrentDirectoryRepository is InMemoryRepository) - AddPackage(Environment.CurrentDirectoryRepository, packageName, version.ToString(), dependencies); + AddPackage(Environment.CurrentDirectoryRepository, packageName, version.ToString(), dependencies,string.Empty); else { var localFile = Environment.CurrentDirectory.GetFile(PackageNameUtility.PackageFileName(packageName, version.ToString())).MustExist(); diff --git a/src/OpenWrap.Tests/OpenWrap.Tests.csproj b/src/OpenWrap.Tests/OpenWrap.Tests.csproj index 96af7c6a..b7323bff 100644 --- a/src/OpenWrap.Tests/OpenWrap.Tests.csproj +++ b/src/OpenWrap.Tests/OpenWrap.Tests.csproj @@ -149,9 +149,7 @@ ..\..\..\..\..\..\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\Microsoft.Build.Engine.dll - - False - false + ..\..\lib\nunit-2.5.5\nunit.framework.dll diff --git a/src/OpenWrap/PackageManagement/DefaultPackageManager.cs b/src/OpenWrap/PackageManagement/DefaultPackageManager.cs index a022ca89..89231ed1 100644 --- a/src/OpenWrap/PackageManagement/DefaultPackageManager.cs +++ b/src/OpenWrap/PackageManagement/DefaultPackageManager.cs @@ -255,9 +255,9 @@ public IPackageCleanResult CleanSystemPackages(IPackageRepository systemReposito return new PackageCleanResultIterator(CleanSystemPackagesCore(toClean, x => packageName.EqualsNoCase(packageName))); } - public IPackageListResult ListPackages(IEnumerable repositories, string query = null, PackageListOptions options = PackageListOptions.Default) + public IPackageListResult ListPackages(IEnumerable repositories, string query = null, PackageListOptions options = PackageListOptions.Default, IEnumerable currentPackages = null) { - return new PackageListResultIterator(ListPackagesCore(repositories, query)); + return new PackageListResultIterator(ListPackagesCore(repositories, query, options, currentPackages)); } public IPackageRemoveResult RemoveProjectPackage(PackageRequest packageToRemove, @@ -377,7 +377,7 @@ static IPackageInfo GetExistingPackage(ISupportPublishing destinationRepository, : null; } - static IEnumerable ListPackagesCore(IEnumerable repositories, string query) + static IEnumerable ListPackagesCore(IEnumerable repositories, string query, PackageListOptions options, IEnumerable list) { var packages = repositories.SelectMany(x => x.PackagesByName.NotNull()); if (query != null) @@ -386,7 +386,7 @@ static IEnumerable ListPackagesCore(IEnumerable queryRegex.IsMatch(x.Key)); } foreach (var x in packages) - yield return new PackageFoundResult(x); + yield return new PackageFoundResult(x, options, list ?? Enumerable.Empty()); } static PackageOperationResult PackageConflict(ResolvedPackage resolvedPackage) diff --git a/src/OpenWrap/PackageManagement/IPackageManager.cs b/src/OpenWrap/PackageManagement/IPackageManager.cs index 0eca72d6..7eabd0be 100644 --- a/src/OpenWrap/PackageManagement/IPackageManager.cs +++ b/src/OpenWrap/PackageManagement/IPackageManager.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Linq; using OpenWrap.PackageModel; using OpenWrap.Repositories; @@ -54,7 +55,7 @@ IPackageCleanResult CleanProjectPackages(IEnumerable project IPackageCleanResult CleanSystemPackages(IPackageRepository systemRepository, PackageCleanOptions options = PackageCleanOptions.Default); IPackageCleanResult CleanSystemPackages(IPackageRepository systemRepository, string packageName, PackageCleanOptions options = PackageCleanOptions.Default); - IPackageListResult ListPackages(IEnumerable repositories, string query = null, PackageListOptions options = PackageListOptions.Default); + IPackageListResult ListPackages(IEnumerable repositories, string query = null, PackageListOptions options = PackageListOptions.Default, IEnumerable currentPackages = null); event PackageUpdated PackageUpdated; event PackageChanged PackageAdded; diff --git a/src/OpenWrap/PackageManagement/PackageFoundCommandOutput.cs b/src/OpenWrap/PackageManagement/PackageFoundCommandOutput.cs index cfea3dee..bc3162f5 100644 --- a/src/OpenWrap/PackageManagement/PackageFoundCommandOutput.cs +++ b/src/OpenWrap/PackageManagement/PackageFoundCommandOutput.cs @@ -1,5 +1,7 @@ -using System.Linq; +using System; +using System.Linq; using OpenWrap.Commands; +using OpenWrap.PackageModel; namespace OpenWrap.PackageManagement { @@ -8,7 +10,7 @@ public class PackageFoundCommandOutput : GenericMessage readonly PackageFoundResult _result; public PackageFoundCommandOutput(PackageFoundResult result) - : base(" - {0} (available: {1})", result.Name, result.Packages.Select(x => x.Version + (x.Nuked ? " [nuked]" : string.Empty)).Join(", ")) + : base(string.Empty) { _result = result; } @@ -17,5 +19,36 @@ public string Name { get { return _result.Name; } } + + public override string ToString() + { + var versionInfo = _result.Packages.Select(x => x.Version + (x.Nuked ? " [nuked]" : string.Empty)).Join(", "); + var detailedInfo = shouldShowDescription() ? description() : string.Empty; + + var currentInfo = CurrentInfo(); + + return string.Format(" - {0} {2}({3}available: {1})", Name, versionInfo, detailedInfo, currentInfo); + } + + string CurrentInfo() + { + var item = _result.CurrentPackages.Where(x => x.Name.Equals(Name)).LastOrDefault(); + + if (item == null) + return string.Empty; + + return string.Format("current: {0} ", item.Version); + } + + string description() + { + var description = _result.Packages.Last().Description; + return !string.IsNullOrEmpty(description) ? string.Format("\r\n{0}\r\n", description) : string.Empty; + } + + bool shouldShowDescription() + { + return _result.Options.Equals(PackageListOptions.Detailed); + } } } \ No newline at end of file diff --git a/src/OpenWrap/PackageManagement/PackageFoundResult.cs b/src/OpenWrap/PackageManagement/PackageFoundResult.cs index a7ad198c..38592d10 100644 --- a/src/OpenWrap/PackageManagement/PackageFoundResult.cs +++ b/src/OpenWrap/PackageManagement/PackageFoundResult.cs @@ -8,14 +8,18 @@ namespace OpenWrap.PackageManagement { public class PackageFoundResult : PackageOperationResult { - public PackageFoundResult(IGrouping packageInfos) + public PackageFoundResult(IGrouping packageInfos, PackageListOptions options, IEnumerable currentPackages) { + Options = options; + CurrentPackages = currentPackages; Name = packageInfos.Key; Packages = packageInfos.ToList(); } public string Name { get; private set; } public List Packages { get; set; } + public PackageListOptions Options { get; private set; } + public IEnumerable CurrentPackages { get; set; } public override bool Success { diff --git a/src/OpenWrap/PackageManagement/PackageListOptions.cs b/src/OpenWrap/PackageManagement/PackageListOptions.cs index d8e97d01..af82a01a 100644 --- a/src/OpenWrap/PackageManagement/PackageListOptions.cs +++ b/src/OpenWrap/PackageManagement/PackageListOptions.cs @@ -5,6 +5,7 @@ namespace OpenWrap.PackageManagement [Flags] public enum PackageListOptions { - Default + Default, + Detailed } } \ No newline at end of file From 3f826569e1dcb4abca55427f0d9686825345bffe Mon Sep 17 00:00:00 2001 From: Chris Canal Date: Fri, 18 Mar 2011 16:01:21 +0000 Subject: [PATCH 2/2] Added rough pass of a ViewWrapCommand --- .../OpenWrap.Commands.csproj | 1 + src/OpenWrap.Commands/Wrap/ViewWrapCommand.cs | 72 ++++++++++++++++++ .../Commands/Wrap/viewWrapCommand.cs | 76 +++++++++++++++++++ src/OpenWrap.Tests/OpenWrap.Tests.csproj | 1 + src/OpenWrap/OpenWrap.csproj | 1 + .../ViewWrapCommandOutput.cs | 26 +++++++ 6 files changed, 177 insertions(+) create mode 100644 src/OpenWrap.Commands/Wrap/ViewWrapCommand.cs create mode 100644 src/OpenWrap.Tests/Commands/Wrap/viewWrapCommand.cs create mode 100644 src/OpenWrap/PackageManagement/ViewWrapCommandOutput.cs diff --git a/src/OpenWrap.Commands/OpenWrap.Commands.csproj b/src/OpenWrap.Commands/OpenWrap.Commands.csproj index 0d4d5276..b3fdc0be 100644 --- a/src/OpenWrap.Commands/OpenWrap.Commands.csproj +++ b/src/OpenWrap.Commands/OpenWrap.Commands.csproj @@ -65,6 +65,7 @@ + diff --git a/src/OpenWrap.Commands/Wrap/ViewWrapCommand.cs b/src/OpenWrap.Commands/Wrap/ViewWrapCommand.cs new file mode 100644 index 00000000..5eae87dd --- /dev/null +++ b/src/OpenWrap.Commands/Wrap/ViewWrapCommand.cs @@ -0,0 +1,72 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using OpenWrap.PackageManagement; +using OpenWrap.PackageModel; + +namespace OpenWrap.Commands.Wrap +{ + [Command(Noun = "wrap", Verb = "view")] + public class ViewWrapCommand : WrapCommand + { + bool? _project; + + [CommandInput(IsRequired = true, Position = 0)] + public string Name { get; set; } + + [CommandInput] + public Version Version { get; set; } + + [CommandInput] + public bool System { get; set; } + + [CommandInput] + public bool Project + { + get { return _project ?? !System; } + set { _project = value; } + } + + public override IEnumerable Execute() + { + return Either(VerifyInputs()).Or(ExecuteCore()); + } + + IEnumerable ExecuteCore() + { + IPackageInfo item = null; + + if ( System ) + { + item = PackageInfo(Environment.SystemRepository.PackagesByName[Name]); + } + if (Project) + { + item = PackageInfo(Environment.ProjectRepository.PackagesByName[Name]); + } + + if (item == null) + yield return new Error("No package found named {1}", Name); + else + yield return new ViewWrapCommandOutput(item); + } + + IEnumerable VerifyInputs() + { + if (System && !Environment.SystemRepository.PackagesByName[Name].Any()) + yield return new Error("Cannot find package named '{0}' in system repository.", Name); + if (Project && Environment.ProjectRepository == null) + yield return new Error("Not in a package directory."); + if (Project && Environment.ProjectRepository != null && !Environment.ProjectRepository.PackagesByName[Name].Any()) + yield return new Error("Cannot find package named '{0}' in project repository.", Name); + } + + IPackageInfo PackageInfo(IEnumerable packageInfos) + { + if (Version != null) + return packageInfos.OrderByDescending(x => x.Version).FirstOrDefault(x => x.Version.Major.Equals(Version.Major) && x.Version.Major.Equals(Version.Major)); + + return packageInfos.Last(); + } + } +} \ No newline at end of file diff --git a/src/OpenWrap.Tests/Commands/Wrap/viewWrapCommand.cs b/src/OpenWrap.Tests/Commands/Wrap/viewWrapCommand.cs new file mode 100644 index 00000000..4121b7b2 --- /dev/null +++ b/src/OpenWrap.Tests/Commands/Wrap/viewWrapCommand.cs @@ -0,0 +1,76 @@ +using System; +using System.Linq; +using NUnit.Framework; +using OpenWrap.Commands.contexts; +using OpenWrap.Commands.Wrap; +using OpenWrap.PackageManagement; +using OpenWrap.Testing; + +namespace viewWrap_specs +{ + public class viewing_a_package : command_context + { + public viewing_a_package() + { + given_project_package("one-ring", "1.0", string.Empty, "depends: sauron 2.0"); + given_project_package("sauron", "2.0"); + + when_executing_command("one-ring"); + } + [Test] + public void matching_package_is_returned() + { + var s = Results.OfType() + .ShouldHaveCountOf(1) + .First().ToString(); + Console.WriteLine(s); + s.ShouldContain("name: one-ring"); + } + [Test] + public void displays_dependencies() + { + Results.OfType() + .ShouldHaveCountOf(1) + .First().ToString().ShouldContain("dependencies: sauron 2.0"); + } + + } + + public class viewing_a_package_version : command_context + { + public viewing_a_package_version() + { + given_project_package("one-ring", "0.1.0"); + given_project_package("one-ring", "0.1.1"); + given_project_package("sauron", "2.0"); + + when_executing_command("one-ring", "-version", "0.1"); + } + [Test] + public void matching_package_is_returned() + { + Results.OfType() + .ShouldHaveCountOf(1) + .First().ToString().ShouldContain("version: 0.1.1"); + } + } + + public class viewing_a_system_package : command_context + { + public viewing_a_system_package() + { + given_project_package("one-ring", "1.0"); + given_system_package("one-ring", "1.0"); + given_system_package("one-ring", "2.0"); + + when_executing_command("one-ring", "-system"); + } + [Test] + public void matching_package_is_returned() + { + Results.OfType() + .ShouldHaveCountOf(1) + .First().ToString().ShouldContain("version: 2.0"); + } + } +} diff --git a/src/OpenWrap.Tests/OpenWrap.Tests.csproj b/src/OpenWrap.Tests/OpenWrap.Tests.csproj index b7323bff..41dd3e93 100644 --- a/src/OpenWrap.Tests/OpenWrap.Tests.csproj +++ b/src/OpenWrap.Tests/OpenWrap.Tests.csproj @@ -119,6 +119,7 @@ + diff --git a/src/OpenWrap/OpenWrap.csproj b/src/OpenWrap/OpenWrap.csproj index c100dd0e..43e4c1ff 100644 --- a/src/OpenWrap/OpenWrap.csproj +++ b/src/OpenWrap/OpenWrap.csproj @@ -122,6 +122,7 @@ + diff --git a/src/OpenWrap/PackageManagement/ViewWrapCommandOutput.cs b/src/OpenWrap/PackageManagement/ViewWrapCommandOutput.cs new file mode 100644 index 00000000..cadf84c8 --- /dev/null +++ b/src/OpenWrap/PackageManagement/ViewWrapCommandOutput.cs @@ -0,0 +1,26 @@ +using System; +using System.Linq; +using OpenWrap.Commands; +using OpenWrap.PackageModel; + +namespace OpenWrap.PackageManagement +{ + public class ViewWrapCommandOutput : GenericMessage + { + readonly IPackageInfo _result; + + public ViewWrapCommandOutput(IPackageInfo result) : base(string.Empty) + { + _result = result; + } + + public override string ToString() + { + return string.Format("name: {0} \r\ndescription: {1} \r\nversion: {2}\r\ndependencies: {3}", + _result.Name, + _result.Description, + _result.Version, + _result.Dependencies.Select(x => x.ToString()).Join(", ")); + } + } +} \ No newline at end of file