Skip to content

Commit

Permalink
Progress on ruby tests
Browse files Browse the repository at this point in the history
  • Loading branch information
JoeRobich committed Apr 18, 2024
1 parent 5e61266 commit dd839ba
Show file tree
Hide file tree
Showing 14 changed files with 195 additions and 2,471 deletions.
Expand Up @@ -19,7 +19,7 @@ public void VersionFilter_VersionInIgnoredVersions_ReturnsFalse()
IgnoredVersions = [Requirement.Parse("< 1.0.0")],
Vulnerabilities = [],
};
var filter = VersionFinder.CreateVersionFilter(dependencyInfo, NuGetVersion.Parse(dependencyInfo.Version));
var filter = VersionFinder.CreateVersionFilter(dependencyInfo, VersionRange.Parse(dependencyInfo.Version));
var version = NuGetVersion.Parse("0.9.0");

var result = filter(version);
Expand All @@ -38,7 +38,7 @@ public void VersionFilter_VersionNotInIgnoredVersions_ReturnsTrue()
IgnoredVersions = [Requirement.Parse("< 1.0.0")],
Vulnerabilities = [],
};
var filter = VersionFinder.CreateVersionFilter(dependencyInfo, NuGetVersion.Parse(dependencyInfo.Version));
var filter = VersionFinder.CreateVersionFilter(dependencyInfo, VersionRange.Parse(dependencyInfo.Version));
var version = NuGetVersion.Parse("1.0.1");

var result = filter(version);
Expand All @@ -63,7 +63,7 @@ public void VersionFilter_VersionInVulnerabilities_ReturnsFalse()
VulnerableVersions = [Requirement.Parse("< 1.0.0")],
}],
};
var filter = VersionFinder.CreateVersionFilter(dependencyInfo, NuGetVersion.Parse(dependencyInfo.Version));
var filter = VersionFinder.CreateVersionFilter(dependencyInfo, VersionRange.Parse(dependencyInfo.Version));
var version = NuGetVersion.Parse("0.9.0");

var result = filter(version);
Expand All @@ -88,7 +88,7 @@ public void VersionFilter_VersionNotInVulnerabilities_ReturnsTrue()
VulnerableVersions = [Requirement.Parse("< 1.0.0")],
}],
};
var filter = VersionFinder.CreateVersionFilter(dependencyInfo, NuGetVersion.Parse(dependencyInfo.Version));
var filter = VersionFinder.CreateVersionFilter(dependencyInfo, VersionRange.Parse(dependencyInfo.Version));
var version = NuGetVersion.Parse("1.0.1");

var result = filter(version);
Expand All @@ -107,7 +107,7 @@ public void VersionFilter_VersionLessThanCurrentVersion_ReturnsFalse()
IgnoredVersions = [],
Vulnerabilities = [],
};
var filter = VersionFinder.CreateVersionFilter(dependencyInfo, NuGetVersion.Parse(dependencyInfo.Version));
var filter = VersionFinder.CreateVersionFilter(dependencyInfo, VersionRange.Parse(dependencyInfo.Version));
var version = NuGetVersion.Parse("0.9.0");

var result = filter(version);
Expand All @@ -126,7 +126,7 @@ public void VersionFilter_VersionHigherThanCurrentVersion_ReturnsTrue()
IgnoredVersions = [],
Vulnerabilities = [],
};
var filter = VersionFinder.CreateVersionFilter(dependencyInfo, NuGetVersion.Parse(dependencyInfo.Version));
var filter = VersionFinder.CreateVersionFilter(dependencyInfo, VersionRange.Parse(dependencyInfo.Version));
var version = NuGetVersion.Parse("1.0.1");

var result = filter(version);
Expand All @@ -145,7 +145,7 @@ public void VersionFilter_PreviewVersionDifferentThanCurrentVersion_ReturnsFalse
IgnoredVersions = [],
Vulnerabilities = [],
};
var filter = VersionFinder.CreateVersionFilter(dependencyInfo, NuGetVersion.Parse(dependencyInfo.Version));
var filter = VersionFinder.CreateVersionFilter(dependencyInfo, VersionRange.Parse(dependencyInfo.Version));
var version = NuGetVersion.Parse("1.0.1-beta");

var result = filter(version);
Expand All @@ -164,7 +164,26 @@ public void VersionFilter_PreviewVersionSameAsCurrentVersion_ReturnsTrue()
IgnoredVersions = [],
Vulnerabilities = [],
};
var filter = VersionFinder.CreateVersionFilter(dependencyInfo, NuGetVersion.Parse(dependencyInfo.Version));
var filter = VersionFinder.CreateVersionFilter(dependencyInfo, VersionRange.Parse(dependencyInfo.Version));
var version = NuGetVersion.Parse("1.0.0-beta");

var result = filter(version);

Assert.True(result);
}

[Fact]
public void VersionFilter_WildcardPreviewVersion_ReturnsTrue()
{
var dependencyInfo = new DependencyInfo
{
Name = "Dependency",
Version = "*-*",
IsVulnerable = false,
IgnoredVersions = [],
Vulnerabilities = [],
};
var filter = VersionFinder.CreateVersionFilter(dependencyInfo, VersionRange.Parse(dependencyInfo.Version));
var version = NuGetVersion.Parse("1.0.0-beta");

var result = filter(version);
Expand Down
Expand Up @@ -103,8 +103,6 @@ internal static async Task<T> DeserializeJsonFileAsync<T>(string path, string fi
Directory.CreateDirectory(nugetContext.TempPackageDirectory);
}

var currentVersion = NuGetVersion.Parse(dependencyInfo.Version);

var versionResult = await VersionFinder.GetVersionsAsync(
dependencyInfo,
nugetContext,
Expand All @@ -116,7 +114,7 @@ internal static async Task<T> DeserializeJsonFileAsync<T>(string path, string fi

return await FindFirstCompatibleVersion(
dependencyInfo.Name,
currentVersion,
dependencyInfo.Version,
versionResult,
orderedVersions,
projectFrameworks,
Expand All @@ -127,32 +125,35 @@ internal static async Task<T> DeserializeJsonFileAsync<T>(string path, string fi

internal static async Task<NuGetVersion?> FindFirstCompatibleVersion(
string packageId,
NuGetVersion currentVersion,
string versionString,
VersionResult versionResult,
IEnumerable<NuGetVersion> orderedVersions,
ImmutableArray<NuGetFramework> projectFrameworks,
NuGetContext nugetContext,
Logger logger,
CancellationToken cancellationToken)
{
var source = versionResult.GetPackageSources(currentVersion).First();
var isCompatible = await CompatibilityChecker.CheckAsync(
source,
new(packageId, currentVersion),
projectFrameworks,
nugetContext,
logger,
cancellationToken);
if (!isCompatible)
if (NuGetVersion.TryParse(versionString, out var currentVersion))
{
// If the current package is incompatible, then don't check for compatibility.
return orderedVersions.First();
var source = versionResult.GetPackageSources(currentVersion).First();
var isCompatible = await CompatibilityChecker.CheckAsync(
source,
new(packageId, currentVersion),
projectFrameworks,
nugetContext,
logger,
cancellationToken);
if (!isCompatible)
{
// If the current package is incompatible, then don't check for compatibility.
return orderedVersions.First();
}
}

foreach (var version in orderedVersions)
{
source = versionResult.GetPackageSources(version).First();
isCompatible = await CompatibilityChecker.CheckAsync(
var source = versionResult.GetPackageSources(version).First();
var isCompatible = await CompatibilityChecker.CheckAsync(
source,
new(packageId, version),
projectFrameworks,
Expand Down
Expand Up @@ -16,10 +16,11 @@ internal static class VersionFinder
CancellationToken cancellationToken)
{
var packageId = dependencyInfo.Name;
var currentVersion = NuGetVersion.Parse(dependencyInfo.Version);
var versionRange = VersionRange.Parse(dependencyInfo.Version);
var currentVersion = versionRange.MinVersion!;
var includePrerelease = currentVersion.IsPrerelease;

var versionFilter = CreateVersionFilter(dependencyInfo, currentVersion);
var versionFilter = CreateVersionFilter(dependencyInfo, versionRange);
VersionResult result = new(currentVersion);

var sourceMapping = PackageSourceMapping.GetPackageSourceMapping(nugetContext.Settings);
Expand Down Expand Up @@ -71,10 +72,15 @@ internal static class VersionFinder
return result;
}

internal static Func<NuGetVersion, bool> CreateVersionFilter(DependencyInfo dependencyInfo, NuGetVersion currentVersion)
internal static Func<NuGetVersion, bool> CreateVersionFilter(DependencyInfo dependencyInfo, VersionRange versionRange)
{
return version => version > currentVersion
&& (!currentVersion.IsPrerelease || !version.IsPrerelease || version.Version == currentVersion.Version)
// If we are floating to the aboslute latest version, we should not filter pre-release versions at all.

Check failure on line 77 in nuget/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/VersionFinder.cs

View workflow job for this annotation

GitHub Actions / Check for spelling errors

aboslute ==> absolute
var currentVersion = versionRange.Float?.FloatBehavior != NuGetVersionFloatBehavior.AbsoluteLatest
? versionRange.MinVersion
: null;

return version => versionRange.Satisfies(version)
&& (currentVersion is null || !currentVersion.IsPrerelease || !version.IsPrerelease || version.Version == currentVersion.Version)
&& !dependencyInfo.IgnoredVersions.Any(r => r.IsSatisfiedBy(version))
&& !dependencyInfo.Vulnerabilities.Any(v => v.IsVulnerable(version));
}
Expand Down
29 changes: 14 additions & 15 deletions nuget/lib/dependabot/nuget/analysis/analysis_json_reader.rb
Expand Up @@ -39,25 +39,24 @@ def initialize(analysis_json:)
@analysis_json = analysis_json
end

sig { returns(Dependabot::Nuget::Version) }
def updated_version
Version.new("1.0.0")
end
sig { returns(DependencyAnalysis) }
def dependency_analysis
@dependency_analysis ||= T.let(begin
raise Dependabot::DependencyFileNotParseable, analysis_json.path unless analysis_json.content

sig { returns(T::Boolean) }
def can_update?
true
end
Dependabot.logger.info("#{File.basename(analysis_json.path)} analysis content: #{analysis_json.content}")

sig { returns(T::Boolean) }
def version_comes_from_multi_dependency_property?
false
parsed_json = T.let(JSON.parse(T.must(analysis_json.content)), T::Hash[String, T.untyped])
DependencyAnalysis.from_json(parsed_json)
end, T.nilable(DependencyAnalysis))
rescue JSON::ParserError
raise Dependabot::DependencyFileNotParseable, analysis_json.path
end

sig { returns(T::Array[Dependabot::Dependency]) }
def updated_dependencies
[]
end
private

sig { returns(DependencyFile) }
attr_reader :analysis_json
end
end
end
61 changes: 61 additions & 0 deletions nuget/lib/dependabot/nuget/analysis/dependency_analysis.rb
@@ -0,0 +1,61 @@
# typed: strong
# frozen_string_literal: true

require "dependabot/nuget/version"
require "sorbet-runtime"

module Dependabot
module Nuget
class DependencyAnalysis
extend T::Sig

sig { params(json: T::Hash[String, T.untyped]).returns(DependencyAnalysis) }
def self.from_json(json)
updated_version = T.let(json.fetch("UpdatedVersion"), String)
can_update = T.let(json.fetch("CanUpdate"), T::Boolean)
version_comes_from_multi_dependency_property = T.let(json.fetch("VersionComesFromMultiDependencyProperty"),
T::Boolean)
updated_dependencies = T.let(json.fetch("UpdatedDependencies"),
T::Array[T::Hash[String, T.untyped]]).map do |dep|
DependencyDetails.from_json(dep)
end

DependencyAnalysis.new(updated_version: updated_version,
can_update: can_update,
version_comes_from_multi_dependency_property: version_comes_from_multi_dependency_property,
updated_dependencies: updated_dependencies)
end

sig do
params(updated_version: String,
can_update: T::Boolean,
version_comes_from_multi_dependency_property: T::Boolean,
updated_dependencies: T::Array[DependencyDetails]).void
end
def initialize(updated_version:, can_update:, version_comes_from_multi_dependency_property:,
updated_dependencies:)
@updated_version = updated_version
@can_update = can_update
@version_comes_from_multi_dependency_property = version_comes_from_multi_dependency_property
@updated_dependencies = updated_dependencies
end

sig { returns(String) }
attr_reader :updated_version

sig { returns(T::Boolean) }
attr_reader :can_update

sig { returns(T::Boolean) }
attr_reader :version_comes_from_multi_dependency_property

sig { returns(T::Array[DependencyDetails]) }
attr_reader :updated_dependencies

sig { returns(Dependabot::Nuget::Version) }
def numeric_updated_version
@numeric_updated_version ||= T.let(Version.new(updated_version), T.nilable(Dependabot::Nuget::Version))
end
end
end
end

0 comments on commit dd839ba

Please sign in to comment.