dependabot-nuget 0.289.0 → 0.291.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. checksums.yaml +4 -4
  2. data/helpers/lib/NuGetUpdater/Directory.Packages.props +1 -1
  3. data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli/Commands/AnalyzeCommand.cs +7 -3
  4. data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli/Commands/RunCommand.cs +1 -1
  5. data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli.Test/EntryPointTests.Analyze.cs +26 -1
  6. data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli.Test/EntryPointTests.Discover.cs +2 -1
  7. data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli.Test/EntryPointTests.Run.cs +0 -6
  8. data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli.Test/EntryPointTests.Update.cs +1 -1
  9. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/AnalyzeWorker.cs +6 -1
  10. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/CompatabilityChecker.cs +24 -9
  11. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/DependencyFinder.cs +2 -0
  12. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/NuGetContext.cs +0 -13
  13. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/RequirementConverter.cs +17 -0
  14. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/DiscoveryWorker.cs +44 -5
  15. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/PackagesConfigDiscovery.cs +2 -2
  16. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/ProjectDiscoveryResult.cs +2 -0
  17. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/SdkProjectDiscovery.cs +19 -11
  18. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/ErrorType.cs +1 -0
  19. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/ExperimentsManager.cs +3 -0
  20. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/Advisory.cs +13 -0
  21. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/AllowedUpdate.cs +18 -1
  22. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/CommitOptions.cs +8 -0
  23. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/Condition.cs +19 -0
  24. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/DependencyGroup.cs +8 -0
  25. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/GroupPullRequest.cs +9 -0
  26. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/Job.cs +13 -10
  27. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/PullRequest.cs +11 -0
  28. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/RequirementsUpdateStrategy.cs +15 -0
  29. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/RunWorker.cs +24 -4
  30. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/VersionConverter.cs +19 -0
  31. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/BindingRedirectManager.cs +2 -1
  32. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/LockFileUpdater.cs +3 -2
  33. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/PackageReferenceUpdater.cs +43 -18
  34. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/PackagesConfigUpdater.cs +13 -12
  35. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/UpdaterWorker.cs +1 -1
  36. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/JsonHelper.cs +2 -0
  37. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/MSBuildHelper.cs +40 -14
  38. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/NuGetHelper.cs +2 -2
  39. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/ProcessExtensions.cs +45 -7
  40. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/ProjectHelper.cs +2 -2
  41. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Analyze/AnalyzeWorkerTestBase.cs +5 -2
  42. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/DiscoveryWorkerTests.DotNetToolsJson.cs +45 -1
  43. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/DiscoveryWorkerTests.GlobalJson.cs +35 -1
  44. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/DiscoveryWorkerTests.Project.cs +0 -4
  45. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/DiscoveryWorkerTests.cs +41 -0
  46. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/ExpectedDiscoveryResults.cs +1 -0
  47. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/SdkProjectDiscoveryTests.cs +1 -1
  48. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/MockNuGetPackage.cs +2 -1
  49. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/MiscellaneousTests.cs +85 -0
  50. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/RunWorkerTests.cs +7 -31
  51. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/SerializationTests.cs +340 -0
  52. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/TemporaryDirectory.cs +18 -7
  53. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/PackagesConfigUpdaterTests.cs +24 -0
  54. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTestBase.cs +0 -12
  55. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTests.DotNetTools.cs +84 -0
  56. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTests.GlobalJson.cs +66 -0
  57. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTests.PackageReference.cs +55 -0
  58. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTests.PackagesConfig.cs +0 -6
  59. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Utilities/MSBuildHelperTests.cs +785 -755
  60. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Utilities/PathHelperTests.cs +2 -2
  61. data/lib/dependabot/nuget/analysis/analysis_json_reader.rb +1 -1
  62. data/lib/dependabot/nuget/analysis/dependency_analysis.rb +3 -3
  63. data/lib/dependabot/nuget/discovery/dependency_details.rb +10 -3
  64. data/lib/dependabot/nuget/discovery/dependency_file_discovery.rb +8 -12
  65. data/lib/dependabot/nuget/discovery/discovery_json_reader.rb +214 -29
  66. data/lib/dependabot/nuget/discovery/project_discovery.rb +41 -8
  67. data/lib/dependabot/nuget/discovery/workspace_discovery.rb +14 -19
  68. data/lib/dependabot/nuget/file_fetcher.rb +3 -3
  69. data/lib/dependabot/nuget/file_parser.rb +92 -3
  70. data/lib/dependabot/nuget/file_updater.rb +13 -13
  71. data/lib/dependabot/nuget/language.rb +82 -0
  72. data/lib/dependabot/nuget/native_helpers.rb +37 -5
  73. data/lib/dependabot/nuget/package_manager.rb +51 -0
  74. data/lib/dependabot/nuget/update_checker/requirements_updater.rb +23 -27
  75. data/lib/dependabot/nuget/update_checker.rb +116 -190
  76. metadata +20 -29
  77. data/lib/dependabot/nuget/discovery/directory_packages_props_discovery.rb +0 -43
  78. data/lib/dependabot/nuget/http_response_helpers.rb +0 -19
  79. data/lib/dependabot/nuget/native_discovery/native_dependency_details.rb +0 -102
  80. data/lib/dependabot/nuget/native_discovery/native_dependency_file_discovery.rb +0 -122
  81. data/lib/dependabot/nuget/native_discovery/native_discovery_json_reader.rb +0 -277
  82. data/lib/dependabot/nuget/native_discovery/native_evaluation_details.rb +0 -63
  83. data/lib/dependabot/nuget/native_discovery/native_project_discovery.rb +0 -104
  84. data/lib/dependabot/nuget/native_discovery/native_property_details.rb +0 -43
  85. data/lib/dependabot/nuget/native_discovery/native_workspace_discovery.rb +0 -61
  86. data/lib/dependabot/nuget/native_update_checker/native_requirements_updater.rb +0 -105
  87. data/lib/dependabot/nuget/native_update_checker/native_update_checker.rb +0 -214
  88. data/lib/dependabot/nuget/nuget_client.rb +0 -223
  89. data/lib/dependabot/nuget/update_checker/compatibility_checker.rb +0 -116
  90. data/lib/dependabot/nuget/update_checker/dependency_finder.rb +0 -297
  91. data/lib/dependabot/nuget/update_checker/nupkg_fetcher.rb +0 -221
  92. data/lib/dependabot/nuget/update_checker/nuspec_fetcher.rb +0 -110
  93. data/lib/dependabot/nuget/update_checker/property_updater.rb +0 -196
  94. data/lib/dependabot/nuget/update_checker/repository_finder.rb +0 -466
  95. data/lib/dependabot/nuget/update_checker/tfm_comparer.rb +0 -34
  96. data/lib/dependabot/nuget/update_checker/tfm_finder.rb +0 -30
  97. data/lib/dependabot/nuget/update_checker/version_finder.rb +0 -449
@@ -1,7 +1,8 @@
1
- # typed: strict
1
+ # typed: strong
2
2
  # frozen_string_literal: true
3
3
 
4
- require "dependabot/nuget/file_parser"
4
+ require "dependabot/nuget/analysis/analysis_json_reader"
5
+ require "dependabot/nuget/discovery/discovery_json_reader"
5
6
  require "dependabot/update_checkers"
6
7
  require "dependabot/update_checkers/base"
7
8
  require "sorbet-runtime"
@@ -11,38 +12,22 @@ module Dependabot
11
12
  class UpdateChecker < Dependabot::UpdateCheckers::Base
12
13
  extend T::Sig
13
14
 
14
- require_relative "update_checker/version_finder"
15
- require_relative "update_checker/property_updater"
16
15
  require_relative "update_checker/requirements_updater"
17
- require_relative "update_checker/dependency_finder"
18
-
19
- require_relative "native_update_checker/native_update_checker"
20
-
21
- PROPERTY_REGEX = /\$\((?<property>.*?)\)/
22
-
23
- sig { returns(T::Boolean) }
24
- def self.native_analysis_enabled?
25
- Dependabot::Experiments.enabled?(:nuget_native_analysis)
26
- end
27
16
 
28
17
  sig { override.returns(T.nilable(String)) }
29
18
  def latest_version
30
- return native_update_checker.latest_version if UpdateChecker.native_analysis_enabled?
31
-
32
19
  # No need to find latest version for transitive dependencies unless they have a vulnerability.
33
20
  return dependency.version if !dependency.top_level? && !vulnerable?
34
21
 
35
22
  # if no update sources have the requisite package, then we can only assume that the current version is correct
36
23
  @latest_version = T.let(
37
- latest_version_details&.fetch(:version)&.to_s || dependency.version,
24
+ update_analysis.dependency_analysis.updated_version,
38
25
  T.nilable(String)
39
26
  )
40
27
  end
41
28
 
42
29
  sig { override.returns(T.nilable(T.any(String, Gem::Version))) }
43
30
  def latest_resolvable_version
44
- return native_update_checker.latest_resolvable_version if UpdateChecker.native_analysis_enabled?
45
-
46
31
  # We always want a full unlock since any package update could update peer dependencies as well.
47
32
  # To force a full unlock instead of an own unlock, we return nil.
48
33
  nil
@@ -50,232 +35,173 @@ module Dependabot
50
35
 
51
36
  sig { override.returns(Dependabot::Nuget::Version) }
52
37
  def lowest_security_fix_version
53
- return native_update_checker.lowest_security_fix_version if UpdateChecker.native_analysis_enabled?
54
-
55
- lowest_security_fix_version_details&.fetch(:version)
38
+ update_analysis.dependency_analysis.numeric_updated_version
56
39
  end
57
40
 
58
41
  sig { override.returns(T.nilable(Dependabot::Nuget::Version)) }
59
42
  def lowest_resolvable_security_fix_version
60
43
  return nil if version_comes_from_multi_dependency_property?
61
44
 
62
- lowest_security_fix_version
45
+ update_analysis.dependency_analysis.numeric_updated_version
63
46
  end
64
47
 
65
48
  sig { override.returns(NilClass) }
66
49
  def latest_resolvable_version_with_no_unlock
67
- return native_update_checker.latest_resolvable_version_with_no_unlock if UpdateChecker.native_analysis_enabled?
68
-
69
50
  # Irrelevant, since Nuget has a single dependency file
70
51
  nil
71
52
  end
72
53
 
73
54
  sig { override.returns(T::Array[T::Hash[Symbol, T.untyped]]) }
74
55
  def updated_requirements
75
- return native_update_checker.updated_requirements if UpdateChecker.native_analysis_enabled?
76
-
56
+ dep_details = updated_dependency_details.find { |d| d.name.casecmp?(dependency.name) }
77
57
  RequirementsUpdater.new(
78
58
  requirements: dependency.requirements,
79
- latest_version: preferred_resolvable_version_details&.fetch(:version, nil)&.to_s,
80
- source_details: preferred_resolvable_version_details&.slice(:nuspec_url, :repo_url, :source_url)
59
+ dependency_details: dep_details
81
60
  ).updated_requirements
82
61
  end
83
62
 
84
63
  sig { returns(T::Boolean) }
85
64
  def up_to_date?
86
- return native_update_checker.up_to_date? if UpdateChecker.native_analysis_enabled?
87
-
88
- # No need to update transitive dependencies unless they have a vulnerability.
89
- return true if !dependency.top_level? && !vulnerable?
90
-
91
- # If any requirements have an uninterpolated property in them then
92
- # that property couldn't be found, and we assume that the dependency
93
- # is up-to-date
94
- return true unless requirements_unlocked_or_can_be?
95
-
96
- super
65
+ !update_analysis.dependency_analysis.can_update
97
66
  end
98
67
 
99
68
  sig { returns(T::Boolean) }
100
69
  def requirements_unlocked_or_can_be?
101
- # If any requirements have an uninterpolated property in them then
102
- # that property couldn't be found, and the requirement therefore
103
- # cannot be unlocked (since we can't update that property)
104
- dependency.requirements.none? do |req|
105
- req.fetch(:requirement)&.match?(PROPERTY_REGEX)
106
- end
70
+ update_analysis.dependency_analysis.can_update
107
71
  end
108
72
 
109
73
  private
110
74
 
111
- sig { returns(Dependabot::Nuget::NativeUpdateChecker) }
112
- def native_update_checker
113
- @native_update_checker ||=
114
- T.let(
115
- Dependabot::Nuget::NativeUpdateChecker.new(
116
- dependency: dependency,
117
- dependency_files: dependency_files,
118
- credentials: credentials,
119
- repo_contents_path: repo_contents_path,
120
- ignored_versions: ignored_versions,
121
- raise_on_ignored: raise_on_ignored,
122
- security_advisories: security_advisories,
123
- requirements_update_strategy: requirements_update_strategy,
124
- dependency_group: dependency_group,
125
- options: options
126
- ),
127
- T.nilable(Dependabot::Nuget::NativeUpdateChecker)
128
- )
75
+ sig { returns(String) }
76
+ def job_file_path
77
+ ENV.fetch("DEPENDABOT_JOB_PATH")
129
78
  end
130
79
 
131
- sig { returns(T.nilable(T::Hash[Symbol, T.untyped])) }
132
- def preferred_resolvable_version_details
133
- # If this dependency is vulnerable, prefer trying to update to the
134
- # lowest_resolvable_security_fix_version. Otherwise update all the way
135
- # to the latest_resolvable_version.
136
- return lowest_security_fix_version_details if vulnerable?
137
-
138
- latest_version_details
80
+ sig { returns(AnalysisJsonReader) }
81
+ def update_analysis
82
+ @update_analysis ||= T.let(request_analysis, T.nilable(AnalysisJsonReader))
139
83
  end
140
84
 
141
- sig { override.returns(T::Boolean) }
142
- def latest_version_resolvable_with_full_unlock?
143
- if UpdateChecker.native_analysis_enabled?
144
- return native_update_checker.public_latest_version_resolvable_with_full_unlock?
145
- end
146
-
147
- # We always want a full unlock since any package update could update peer dependencies as well.
148
- return true unless version_comes_from_multi_dependency_property?
149
-
150
- property_updater.update_possible?
85
+ sig { returns(String) }
86
+ def dependency_file_path
87
+ d = File.join(Dir.tmpdir, "dependency")
88
+ FileUtils.mkdir_p(d)
89
+ File.join(d, "#{dependency.name}.json")
151
90
  end
152
91
 
153
- sig { override.returns(T::Array[Dependabot::Dependency]) }
154
- def updated_dependencies_after_full_unlock
155
- if UpdateChecker.native_analysis_enabled?
156
- return native_update_checker.public_updated_dependencies_after_full_unlock
92
+ sig { returns(T::Array[String]) }
93
+ def dependency_file_paths
94
+ dependency_files.map do |file|
95
+ DiscoveryJsonReader.dependency_file_path(
96
+ repo_contents_path: T.must(repo_contents_path),
97
+ dependency_file: file
98
+ )
157
99
  end
100
+ end
158
101
 
159
- return property_updater.updated_dependencies if version_comes_from_multi_dependency_property?
160
-
161
- puts "Finding updated dependencies for #{dependency.name}."
162
-
163
- updated_dependency = Dependency.new(
164
- name: dependency.name,
165
- version: latest_version,
166
- requirements: updated_requirements,
167
- previous_version: dependency.version,
168
- previous_requirements: dependency.requirements,
169
- package_manager: dependency.package_manager
102
+ sig { returns(AnalysisJsonReader) }
103
+ def request_analysis
104
+ discovery_file_path = DiscoveryJsonReader.get_discovery_json_path_for_dependency_file_paths(
105
+ dependency_file_paths
170
106
  )
171
- updated_dependencies = [updated_dependency]
172
- updated_dependencies += DependencyFinder.new(
173
- dependency: updated_dependency,
174
- dependency_files: dependency_files,
175
- ignored_versions: ignored_versions,
176
- credentials: credentials,
177
- repo_contents_path: @repo_contents_path
178
- ).updated_peer_dependencies
179
- updated_dependencies
180
- end
107
+ analysis_folder_path = AnalysisJsonReader.temp_directory
108
+
109
+ write_dependency_info
110
+
111
+ NativeHelpers.run_nuget_analyze_tool(job_path: job_file_path,
112
+ repo_root: T.must(repo_contents_path),
113
+ discovery_file_path: discovery_file_path,
114
+ dependency_file_path: dependency_file_path,
115
+ analysis_folder_path: analysis_folder_path,
116
+ credentials: credentials)
117
+
118
+ analysis_json = AnalysisJsonReader.analysis_json(dependency_name: dependency.name)
119
+
120
+ AnalysisJsonReader.new(analysis_json: T.must(analysis_json))
121
+ end
122
+
123
+ sig { void }
124
+ def write_dependency_info
125
+ dependency_info = {
126
+ Name: dependency.name,
127
+ Version: dependency.version.to_s,
128
+ IsVulnerable: vulnerable?,
129
+ IgnoredVersions: ignored_versions,
130
+ Vulnerabilities: security_advisories.map do |vulnerability|
131
+ {
132
+ DependencyName: vulnerability.dependency_name,
133
+ PackageManager: vulnerability.package_manager,
134
+ VulnerableVersions: vulnerability.vulnerable_versions.map(&:to_s),
135
+ SafeVersions: vulnerability.safe_versions.map(&:to_s)
136
+ }
137
+ end
138
+ }.to_json
139
+ dependency_directory = File.dirname(dependency_file_path)
181
140
 
182
- sig { returns(T.nilable(T::Hash[Symbol, T.untyped])) }
183
- def preferred_version_details
184
- return lowest_security_fix_version_details if vulnerable?
141
+ begin
142
+ Dir.mkdir(dependency_directory)
143
+ rescue StandardError
144
+ nil?
145
+ end
185
146
 
186
- latest_version_details
147
+ Dependabot.logger.info("Writing dependency info: #{dependency_info}")
148
+ File.write(dependency_file_path, dependency_info)
187
149
  end
188
150
 
189
- sig { returns(T.nilable(T::Hash[Symbol, T.untyped])) }
190
- def latest_version_details
191
- @latest_version_details ||=
192
- T.let(
193
- version_finder.latest_version_details,
194
- T.nilable(T::Hash[Symbol, T.untyped])
195
- )
151
+ sig { returns(Dependabot::FileParsers::Base::DependencySet) }
152
+ def discovered_dependencies
153
+ DiscoveryJsonReader.load_discovery_for_dependency_file_paths(dependency_file_paths).dependency_set
196
154
  end
197
155
 
198
- sig { returns(T.nilable(T::Hash[Symbol, T.untyped])) }
199
- def lowest_security_fix_version_details
200
- @lowest_security_fix_version_details ||=
201
- T.let(
202
- version_finder.lowest_security_fix_version_details,
203
- T.nilable(T::Hash[Symbol, T.untyped])
204
- )
156
+ sig { override.returns(T::Boolean) }
157
+ def latest_version_resolvable_with_full_unlock?
158
+ # We always want a full unlock since any package update could update peer dependencies as well.
159
+ true
205
160
  end
206
161
 
207
- sig { returns(Dependabot::Nuget::UpdateChecker::VersionFinder) }
208
- def version_finder
209
- @version_finder ||=
210
- T.let(
211
- VersionFinder.new(
212
- dependency: dependency,
213
- dependency_files: dependency_files,
214
- credentials: credentials,
215
- ignored_versions: ignored_versions,
216
- raise_on_ignored: @raise_on_ignored,
217
- security_advisories: security_advisories,
218
- repo_contents_path: @repo_contents_path
219
- ),
220
- T.nilable(Dependabot::Nuget::UpdateChecker::VersionFinder)
221
- )
222
- end
162
+ sig { override.returns(T::Array[Dependabot::Dependency]) }
163
+ def updated_dependencies_after_full_unlock
164
+ dependencies = discovered_dependencies.dependencies
165
+ updated_dependency_details.filter_map do |dependency_details|
166
+ dep = dependencies.find { |d| d.name.casecmp(dependency_details.name)&.zero? }
167
+ next unless dep
168
+
169
+ metadata = {}
170
+ # For peer dependencies, instruct updater to not directly update this dependency
171
+ metadata = { information_only: true } unless dependency.name.casecmp(dependency_details.name)&.zero?
172
+
173
+ # rebuild the new requirements with the updated dependency details
174
+ updated_reqs = dep.requirements.map do |r|
175
+ r = r.clone
176
+ r[:requirement] = dependency_details.version
177
+ r[:source] = {
178
+ type: "nuget_repo",
179
+ source_url: dependency_details.info_url
180
+ }
181
+ r
182
+ end
223
183
 
224
- sig { returns(Dependabot::Nuget::UpdateChecker::PropertyUpdater) }
225
- def property_updater
226
- @property_updater ||=
227
- T.let(
228
- PropertyUpdater.new(
229
- dependency: dependency,
230
- dependency_files: dependency_files,
231
- target_version_details: latest_version_details,
232
- credentials: credentials,
233
- ignored_versions: ignored_versions,
234
- raise_on_ignored: @raise_on_ignored,
235
- repo_contents_path: @repo_contents_path
236
- ),
237
- T.nilable(Dependabot::Nuget::UpdateChecker::PropertyUpdater)
184
+ Dependency.new(
185
+ name: dep.name,
186
+ version: dependency_details.version,
187
+ requirements: updated_reqs,
188
+ previous_version: dep.version,
189
+ previous_requirements: dep.requirements,
190
+ package_manager: dep.package_manager,
191
+ metadata: metadata
238
192
  )
239
- end
240
-
241
- sig { returns(T::Boolean) }
242
- def version_comes_from_multi_dependency_property?
243
- declarations_using_a_property.any? do |requirement|
244
- property_name = requirement.fetch(:metadata).fetch(:property_name)
245
-
246
- all_property_based_dependencies.any? do |dep|
247
- next false if dep.name == dependency.name
248
-
249
- dep.requirements.any? do |req|
250
- req.dig(:metadata, :property_name) == property_name
251
- end
252
- end
253
193
  end
254
194
  end
255
195
 
256
- sig { returns(T::Array[T::Hash[Symbol, T.untyped]]) }
257
- def declarations_using_a_property
258
- @declarations_using_a_property ||=
259
- T.let(
260
- dependency.requirements
261
- .select { |req| req.dig(:metadata, :property_name) },
262
- T.nilable(T::Array[T::Hash[Symbol, T.untyped]])
263
- )
196
+ sig { returns(T::Array[Dependabot::Nuget::DependencyDetails]) }
197
+ def updated_dependency_details
198
+ @updated_dependency_details ||= T.let(update_analysis.dependency_analysis.updated_dependencies,
199
+ T.nilable(T::Array[Dependabot::Nuget::DependencyDetails]))
264
200
  end
265
201
 
266
- sig { returns(T::Array[Dependabot::Dependency]) }
267
- def all_property_based_dependencies
268
- @all_property_based_dependencies ||=
269
- T.let(
270
- Nuget::FileParser.new(
271
- dependency_files: dependency_files,
272
- repo_contents_path: repo_contents_path,
273
- source: nil
274
- ).parse.select do |dep|
275
- dep.requirements.any? { |req| req.dig(:metadata, :property_name) }
276
- end,
277
- T.nilable(T::Array[Dependabot::Dependency])
278
- )
202
+ sig { returns(T::Boolean) }
203
+ def version_comes_from_multi_dependency_property?
204
+ update_analysis.dependency_analysis.version_comes_from_multi_dependency_property
279
205
  end
280
206
  end
281
207
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dependabot-nuget
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.289.0
4
+ version: 0.291.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dependabot
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-12-05 00:00:00.000000000 Z
11
+ date: 2024-12-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dependabot-common
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - '='
18
18
  - !ruby/object:Gem::Version
19
- version: 0.289.0
19
+ version: 0.291.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - '='
25
25
  - !ruby/object:Gem::Version
26
- version: 0.289.0
26
+ version: 0.291.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rubyzip
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -331,6 +331,7 @@ files:
331
331
  - helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/FrameworkChecker/SupportedFrameworkFacts.cs
332
332
  - helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/MockNuGetPackage.cs
333
333
  - helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/NuGetUpdater.Core.Test.csproj
334
+ - helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/MiscellaneousTests.cs
334
335
  - helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/RunWorkerTests.cs
335
336
  - helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/SerializationTests.cs
336
337
  - helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/TestApiHandler.cs
@@ -370,6 +371,7 @@ files:
370
371
  - helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/NuGetContext.cs
371
372
  - helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/Requirement.cs
372
373
  - helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/RequirementArrayConverter.cs
374
+ - helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/RequirementConverter.cs
373
375
  - helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/SecurityVulnerability.cs
374
376
  - helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/SecurityVulnerabilityExtensions.cs
375
377
  - helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/VersionFinder.cs
@@ -413,10 +415,15 @@ files:
413
415
  - helpers/lib/NuGetUpdater/NuGetUpdater.Core/NativeResult.cs
414
416
  - helpers/lib/NuGetUpdater/NuGetUpdater.Core/NuGetUpdater.Core.csproj
415
417
  - helpers/lib/NuGetUpdater/NuGetUpdater.Core/Property.cs
418
+ - helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/Advisory.cs
416
419
  - helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/AllowedUpdate.cs
420
+ - helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/CommitOptions.cs
421
+ - helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/Condition.cs
417
422
  - helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/CreatePullRequest.cs
418
423
  - helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/DependencyFile.cs
419
424
  - helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/DependencyFileNotFound.cs
425
+ - helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/DependencyGroup.cs
426
+ - helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/GroupPullRequest.cs
420
427
  - helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/IncrementMetric.cs
421
428
  - helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/Job.cs
422
429
  - helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/JobErrorBase.cs
@@ -425,9 +432,11 @@ files:
425
432
  - helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/JobSource.cs
426
433
  - helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/MarkAsProcessed.cs
427
434
  - helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/PrivateSourceAuthenticationFailure.cs
435
+ - helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/PullRequest.cs
428
436
  - helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/ReportedDependency.cs
429
437
  - helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/ReportedRequirement.cs
430
438
  - helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/RequirementSource.cs
439
+ - helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/RequirementsUpdateStrategy.cs
431
440
  - helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/UnknownError.cs
432
441
  - helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/UpdateNotPossible.cs
433
442
  - helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/UpdatedDependencyList.cs
@@ -435,6 +444,7 @@ files:
435
444
  - helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/IApiHandler.cs
436
445
  - helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/RunResult.cs
437
446
  - helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/RunWorker.cs
447
+ - helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/VersionConverter.cs
438
448
  - helpers/lib/NuGetUpdater/NuGetUpdater.Core/TargetFrameworkReporter.targets
439
449
  - helpers/lib/NuGetUpdater/NuGetUpdater.Core/UpdateNotPossibleException.cs
440
450
  - helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/BindingRedirectManager.cs
@@ -473,7 +483,6 @@ files:
473
483
  - lib/dependabot/nuget/cache_manager.rb
474
484
  - lib/dependabot/nuget/discovery/dependency_details.rb
475
485
  - lib/dependabot/nuget/discovery/dependency_file_discovery.rb
476
- - lib/dependabot/nuget/discovery/directory_packages_props_discovery.rb
477
486
  - lib/dependabot/nuget/discovery/discovery_json_reader.rb
478
487
  - lib/dependabot/nuget/discovery/evaluation_details.rb
479
488
  - lib/dependabot/nuget/discovery/project_discovery.rb
@@ -482,40 +491,22 @@ files:
482
491
  - lib/dependabot/nuget/file_fetcher.rb
483
492
  - lib/dependabot/nuget/file_parser.rb
484
493
  - lib/dependabot/nuget/file_updater.rb
485
- - lib/dependabot/nuget/http_response_helpers.rb
494
+ - lib/dependabot/nuget/language.rb
486
495
  - lib/dependabot/nuget/metadata_finder.rb
487
- - lib/dependabot/nuget/native_discovery/native_dependency_details.rb
488
- - lib/dependabot/nuget/native_discovery/native_dependency_file_discovery.rb
489
- - lib/dependabot/nuget/native_discovery/native_discovery_json_reader.rb
490
- - lib/dependabot/nuget/native_discovery/native_evaluation_details.rb
491
- - lib/dependabot/nuget/native_discovery/native_project_discovery.rb
492
- - lib/dependabot/nuget/native_discovery/native_property_details.rb
493
- - lib/dependabot/nuget/native_discovery/native_workspace_discovery.rb
494
496
  - lib/dependabot/nuget/native_helpers.rb
495
- - lib/dependabot/nuget/native_update_checker/native_requirements_updater.rb
496
- - lib/dependabot/nuget/native_update_checker/native_update_checker.rb
497
- - lib/dependabot/nuget/nuget_client.rb
498
497
  - lib/dependabot/nuget/nuget_config_credential_helpers.rb
498
+ - lib/dependabot/nuget/package_manager.rb
499
499
  - lib/dependabot/nuget/requirement.rb
500
500
  - lib/dependabot/nuget/update_checker.rb
501
- - lib/dependabot/nuget/update_checker/compatibility_checker.rb
502
- - lib/dependabot/nuget/update_checker/dependency_finder.rb
503
- - lib/dependabot/nuget/update_checker/nupkg_fetcher.rb
504
- - lib/dependabot/nuget/update_checker/nuspec_fetcher.rb
505
- - lib/dependabot/nuget/update_checker/property_updater.rb
506
- - lib/dependabot/nuget/update_checker/repository_finder.rb
507
501
  - lib/dependabot/nuget/update_checker/requirements_updater.rb
508
- - lib/dependabot/nuget/update_checker/tfm_comparer.rb
509
- - lib/dependabot/nuget/update_checker/tfm_finder.rb
510
- - lib/dependabot/nuget/update_checker/version_finder.rb
511
502
  - lib/dependabot/nuget/version.rb
512
503
  homepage: https://github.com/dependabot/dependabot-core
513
504
  licenses:
514
505
  - MIT
515
506
  metadata:
516
507
  bug_tracker_uri: https://github.com/dependabot/dependabot-core/issues
517
- changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.289.0
518
- post_install_message:
508
+ changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.291.0
509
+ post_install_message:
519
510
  rdoc_options: []
520
511
  require_paths:
521
512
  - lib
@@ -531,7 +522,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
531
522
  version: 3.1.0
532
523
  requirements: []
533
524
  rubygems_version: 3.5.9
534
- signing_key:
525
+ signing_key:
535
526
  specification_version: 4
536
527
  summary: Provides Dependabot support for .NET (NuGet)
537
528
  test_files: []
@@ -1,43 +0,0 @@
1
- # typed: strong
2
- # frozen_string_literal: true
3
-
4
- require "dependabot/nuget/discovery/dependency_details"
5
- require "sorbet-runtime"
6
-
7
- module Dependabot
8
- module Nuget
9
- class DirectoryPackagesPropsDiscovery < DependencyFileDiscovery
10
- extend T::Sig
11
-
12
- sig do
13
- params(json: T.nilable(T::Hash[String, T.untyped])).returns(T.nilable(DirectoryPackagesPropsDiscovery))
14
- end
15
- def self.from_json(json)
16
- return nil if json.nil?
17
-
18
- file_path = T.let(json.fetch("FilePath"), String)
19
- is_transitive_pinning_enabled = T.let(json.fetch("IsTransitivePinningEnabled"), T::Boolean)
20
- dependencies = T.let(json.fetch("Dependencies"), T::Array[T::Hash[String, T.untyped]]).map do |dep|
21
- DependencyDetails.from_json(dep)
22
- end
23
-
24
- DirectoryPackagesPropsDiscovery.new(file_path: file_path,
25
- is_transitive_pinning_enabled: is_transitive_pinning_enabled,
26
- dependencies: dependencies)
27
- end
28
-
29
- sig do
30
- params(file_path: String,
31
- is_transitive_pinning_enabled: T::Boolean,
32
- dependencies: T::Array[DependencyDetails]).void
33
- end
34
- def initialize(file_path:, is_transitive_pinning_enabled:, dependencies:)
35
- super(file_path: file_path, dependencies: dependencies)
36
- @is_transitive_pinning_enabled = is_transitive_pinning_enabled
37
- end
38
-
39
- sig { returns(T::Boolean) }
40
- attr_reader :is_transitive_pinning_enabled
41
- end
42
- end
43
- end
@@ -1,19 +0,0 @@
1
- # typed: strict
2
- # frozen_string_literal: true
3
-
4
- require "sorbet-runtime"
5
-
6
- module Dependabot
7
- module Nuget
8
- module HttpResponseHelpers
9
- extend T::Sig
10
-
11
- sig { params(string: String).returns(String) }
12
- def self.remove_wrapping_zero_width_chars(string)
13
- string.force_encoding("UTF-8").encode
14
- .gsub(/\A[\u200B-\u200D\uFEFF]/, "")
15
- .gsub(/[\u200B-\u200D\uFEFF]\Z/, "")
16
- end
17
- end
18
- end
19
- end