Пример #1
0
        public static async Task <PackageInfo> FindBestMatchPackage(
            IEnumerable <IPackageFeed> packageFeeds,
            string packageName,
            SemanticVersionRange idealVersion)
        {
            var tasks = new List <Task <IEnumerable <PackageInfo> > >();

            foreach (var feed in packageFeeds)
            {
                tasks.Add(feed.FindPackagesByIdAsync(packageName));
            }

            var         results    = (await Task.WhenAll(tasks)).SelectMany(x => x);
            PackageInfo bestResult = null;

            foreach (var result in results)
            {
                if (VersionUtility.ShouldUseConsidering(
                        current: bestResult?.Version,
                        considering: result.Version,
                        ideal: idealVersion))
                {
                    bestResult = result;
                }
            }

            return(bestResult);
        }
Пример #2
0
        public static bool EqualsFloating(this SemanticVersionRange versionRange, SemanticVersion version)
        {
            switch (versionRange.VersionFloatBehavior)
            {
            case SemanticVersionFloatBehavior.Prerelease:
                return(versionRange.MinVersion.Version == version.Version &&
                       version.SpecialVersion.StartsWith(versionRange.MinVersion.SpecialVersion, StringComparison.OrdinalIgnoreCase));

            case SemanticVersionFloatBehavior.Revision:
                return(versionRange.MinVersion.Version.Major == version.Version.Major &&
                       versionRange.MinVersion.Version.Minor == version.Version.Minor &&
                       versionRange.MinVersion.Version.Build == version.Version.Build &&
                       versionRange.MinVersion.Version.Revision == version.Version.Revision);

            case SemanticVersionFloatBehavior.Build:
                return(versionRange.MinVersion.Version.Major == version.Version.Major &&
                       versionRange.MinVersion.Version.Minor == version.Version.Minor &&
                       versionRange.MinVersion.Version.Build == version.Version.Build);

            case SemanticVersionFloatBehavior.Minor:
                return(versionRange.MinVersion.Version.Major == version.Version.Major &&
                       versionRange.MinVersion.Version.Minor == version.Version.Minor);

            case SemanticVersionFloatBehavior.Major:
                return(versionRange.MinVersion.Version.Major == version.Version.Major);

            case SemanticVersionFloatBehavior.None:
                return(versionRange.MinVersion == version);

            default:
                return(false);
            }
        }
Пример #3
0
        public static async Task<PackageInfo> FindBestMatchPackage(
            IEnumerable<IPackageFeed> packageFeeds, 
            string packageName,
            SemanticVersionRange idealVersion)
        {
            var tasks = new List<Task<IEnumerable<PackageInfo>>>();

            foreach (var feed in packageFeeds)
            {
                tasks.Add(feed.FindPackagesByIdAsync(packageName));
            }

            var results = (await Task.WhenAll(tasks)).SelectMany(x => x);
            PackageInfo bestResult = null;

            foreach (var result in results)
            {
                if (VersionUtility.ShouldUseConsidering(
                    current: bestResult?.Version,
                    considering: result.Version,
                    ideal: idealVersion))
                {
                    bestResult = result;
                }
            }

            return bestResult;
        }
Пример #4
0
        public void VersionRangeToString()
        {
            var range = new SemanticVersionRange
            {
                MinVersion = new SemanticVersion("1.0.0-beta"),
                MaxVersion = new SemanticVersion("1.0.0-beta")
            };

            Assert.Equal("1.0.0-beta", range.ToString());
        }
Пример #5
0
            public void Should_Return_False_For_Higher_Version_When_Range_Is_Inclusive_Single_Version()
            {
                // Given
                SemanticVersionRange range;

                // When
                SemanticVersionRange.TryParse("[1.0]", out range);

                // Then
                Assert.False(range.IsIncluded("1.1"));
            }
Пример #6
0
            public void Should_Give_Correct_Rule_When_Range_Is_Single_Version()
            {
                // Given
                SemanticVersionRange range;

                // When
                SemanticVersionRange.TryParse("1.0", out range);

                // Then
                Assert.IsType <GreaterThanOrEqualsRule>(range.Rules[0]);
            }
Пример #7
0
            public void Should_Return_False_For_Version_Same_As_Upper_When_Range_Is_Inclusive_Lower_Exclusive_Upper()
            {
                // Given
                SemanticVersionRange range;

                // When
                SemanticVersionRange.TryParse("[1.0,2.0)", out range);

                // Then
                Assert.False(range.IsIncluded("2.0"));
            }
Пример #8
0
            public void Should_Return_True_For_Version_Between_Lower_And_Upper_When_Range_Is_Exclusive_Lower_Inclusive_Upper()
            {
                // Given
                SemanticVersionRange range;

                // When
                SemanticVersionRange.TryParse("(1.0,2.0]", out range);

                // Then
                Assert.True(range.IsIncluded("1.5"));
            }
Пример #9
0
            public void Should_Return_False_For_Version_Lower_Than_Lower_When_Range_Is_Exclusive_Lower_Inclusive_Upper()
            {
                // Given
                SemanticVersionRange range;

                // When
                SemanticVersionRange.TryParse("(1.0,2.0]", out range);

                // Then
                Assert.False(range.IsIncluded("0.9"));
            }
Пример #10
0
            public void Should_Give_Correct_Rule_When_Range_Is_Exclusive_No_Lower_With_Exclusive_Upper()
            {
                // Given
                SemanticVersionRange range;

                // When
                SemanticVersionRange.TryParse("(,1.0)", out range);

                // Then
                Assert.IsType <LessThanRule>(range.Rules[0]);
            }
Пример #11
0
 public IWebLibrary Find(string name, SemanticVersionRange range)
 {
     if (items.TryGetValue(name, out IWebLibrary lib))
     {
         return(lib);
     }
     else
     {
         throw new Exception($"No library named '{name}' was not found");
     }
 }
Пример #12
0
            public void Should_Return_False_For_Higher_Version_When_Range_Is_Exclusive_No_Lower_With_Exclusive_Upper()
            {
                // Given
                SemanticVersionRange range;

                // When
                SemanticVersionRange.TryParse("(,1.0)", out range);

                // Then
                Assert.False(range.IsIncluded("1.0"));
            }
Пример #13
0
            public void Should_Give_Correct_Rule_When_Range_Is_Inclusive_Single_Version()
            {
                // Given
                SemanticVersionRange range;

                // When
                SemanticVersionRange.TryParse("[1.0]", out range);

                // Then
                Assert.IsType <EqualsRule>(range.Rules[0]);
            }
Пример #14
0
            public void Should_Return_True_For_Lower_Version_When_Range_Is_Exclusive_No_Lower_With_Inclusive_Upper()
            {
                // Given
                SemanticVersionRange range;

                // When
                SemanticVersionRange.TryParse("(,1.0]", out range);

                // Then
                Assert.True(range.IsIncluded("0.9"));
            }
Пример #15
0
            public void Should_Return_True_For_Higher_Version_When_Range_Is_Exclusive_Lower_Exclusive_No_Upper()
            {
                // Given
                SemanticVersionRange range;

                // When
                SemanticVersionRange.TryParse("(1.0,)", out range);

                // Then
                Assert.True(range.IsIncluded("1.1"));
            }
Пример #16
0
            public void Should_Return_True_For_Same_Version_When_Range_Is_Single_Version()
            {
                // Given
                SemanticVersionRange range;

                // When
                SemanticVersionRange.TryParse("1.0", out range);

                // Then
                Assert.True(range.IsIncluded("1.0"));
            }
Пример #17
0
            public void Should_Give_No_Rule_When_Range_Is_Exclusive_Single_Version()
            {
                // Given
                SemanticVersionRange range;

                // When
                var result = SemanticVersionRange.TryParse("(1.0)", out range);

                // Then
                Assert.False(result);
                Assert.Null(range);
            }
Пример #18
0
            public void Should_Give_Correct_Rule_When_Range_Is_Exclusive_Lower_With_Inclusive_Upper()
            {
                // Given
                SemanticVersionRange range;

                // When
                SemanticVersionRange.TryParse("(1.0,2.0]", out range);

                // Then
                Assert.IsType <GreaterThanRule>(range.Rules[0]);
                Assert.IsType <LessThanOrEqualsRule>(range.Rules[1]);
            }
Пример #19
0
            public void Should_Return_False_If_Range_Upper_Is_Invalid()
            {
                // Given
                SemanticVersionRange range;

                // When
                var result = SemanticVersionRange.TryParse("(1.0,invalid)", out range);

                // Then
                Assert.False(result);
                Assert.Null(range);
            }
Пример #20
0
        public IEnumerable <Dependency> Parse(JToken value)
        {
            var dependencyList = value as JArray;

            if (dependencyList == null)
            {
                throw new InvalidDataException("Value of 'dependencies' must be an array.");
            }

            if (dependencyList.Children().Any(c => c.Type != JTokenType.Object))
            {
                throw new InvalidDataException("Elements of the 'dependencies' array must be objects.");
            }

            var result = new List <Dependency>();

            foreach (var item in dependencyList.Children <JObject>())
            {
                var props = item.Properties().OrderBy(p => p.Name).Select(p => p.Name).ToList();

                if (!ValidDependencyProperties.SequenceEqual(props))
                {
                    var unexpectedProperties = string.Join(",", props.Except(ValidDependencyProperties));
                    throw new UnexpectedPropertyException(unexpectedProperties);
                }

                var id      = item["id"].Value <string>();
                var version = item["version"].Value <string>();

                SemanticVersionRange range;

                if (!SemanticVersionRange.TryParse(version, out range))
                {
                    throw new InvalidDataException("Invalid semantic version range: " + version);
                }

                result.Add(new Dependency
                {
                    Name         = id,
                    VersionRange = range
                });
            }

            return(result);
        }
Пример #21
0
        public PackageDependency(string id, SemanticVersionRange versionRange)
        {
            if (string.IsNullOrEmpty(id))
            {
                throw new ArgumentException(nameof(id));
            }

            Id = id;
            VersionSpec = versionRange != null ?
                new VersionSpec
                {
                    IsMinInclusive = true,
                    IsMaxInclusive = versionRange.IsMaxInclusive,
                    MinVersion = versionRange.MinVersion,
                    MaxVersion = versionRange.MaxVersion
                } :
                null;
        }
Пример #22
0
        public PackageDependency(string id, SemanticVersionRange versionRange)
        {
            if (string.IsNullOrEmpty(id))
            {
                throw new ArgumentException(nameof(id));
            }

            Id          = id;
            VersionSpec = versionRange != null ?
                          new VersionSpec
            {
                IsMinInclusive = true,
                IsMaxInclusive = versionRange.IsMaxInclusive,
                MinVersion     = versionRange.MinVersion,
                MaxVersion     = versionRange.MaxVersion
            } :
            null;
        }
Пример #23
0
        public static bool ShouldUseConsidering(
            SemanticVersion current,
            SemanticVersion considering,
            SemanticVersionRange ideal)
        {
            if (considering == null)
            {
                // skip nulls
                return(false);
            }

            if (!ideal.EqualsFloating(considering) && considering < ideal.MinVersion)
            {
                // Don't use anything that can't be satisfied
                return(false);
            }

            /*
             * Come back to this later
             * if (ideal.VersionFloatBehavior == SemanticVersionFloatBehavior.None &&
             *  considering != ideal.MinVersion)
             * {
             *  return false;
             * }
             */

            if (current == null)
            {
                // always use version when it's the first valid
                return(true);
            }

            if (ideal.EqualsFloating(current) &&
                ideal.EqualsFloating(considering))
            {
                // favor higher version when they both match a floating pattern
                return(current < considering);
            }

            // Favor lower versions
            return(current > considering);
        }
Пример #24
0
        private PackageInfo FindCandidate(string name, SemanticVersionRange versionRange)
        {
            var packages = _repository.FindPackagesById(name);

            if (versionRange == null)
            {
                // TODO: Disallow null versions for nuget packages
                var packageInfo = packages.FirstOrDefault();
                if (packageInfo != null)
                {
                    return packageInfo;
                }

                return null;
            }

            PackageInfo bestMatch = null;

            foreach (var packageInfo in packages)
            {
                if (VersionUtility.ShouldUseConsidering(
                    current: bestMatch?.Version,
                    considering: packageInfo.Version,
                    ideal: versionRange))
                {
                    bestMatch = packageInfo;
                }
            }

            if (bestMatch == null)
            {
                return null;
            }

            return bestMatch;
        }
        public void ToString_should_render_proper_NuGet_style_range_strings()
        {
            // Arrange
            var formats = new[] {"1.0", "(,1.0]", "(,1.0)", "[1.0]", "(1.0,)", "(1.0,2.0)", "[1.0,2.0]"};

            foreach (var format in formats)
            {
                // Act
                var range = new SemanticVersionRange(format);

                // Assert
                var actual = range.ToString().Should().Be(format);
            }
        }
        public void Parse_should_return_parsed_range()
        {
            // Arrange
            var expected = new SemanticVersionRange("1.0");

            // Act
            var actual = SemanticVersionRange.Parse("1.0");

            // Assert
            actual.Should().Be(expected);
        }