dependabot-nuget 0.166.1 → 0.167.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1880021ddebc227f6c1793151b1d674e169def5b26cd549ac37aff97b8516bf5
4
- data.tar.gz: 844ce4f5abeb8b0733b0dcd9b74c380a2bbb041cede63f79b51d13eb4ea059e0
3
+ metadata.gz: dd50661c29ea424e1badac29db1bd3604155c95b604f683242d7b9123ec485db
4
+ data.tar.gz: a0a78364ec7de0244e02321f64c59fdb12f14e415becf20c332c4e0ce333f198
5
5
  SHA512:
6
- metadata.gz: 24a6623ef4b3925173a2274202ec1efeac7591e248bd8d91e5e71c06a33a28a151832015caf4b298a3c15dab0ba368bdb37772e34ad410db0c29fa5d0d32038c
7
- data.tar.gz: 5ed2ffcd69d6965f4879b29759d185fc9ab2d3244dc113d5991b3460edb5c8d0e939ad42452b38d85644fb9940933bd5581be22c6b5d64891be93a0042b8ffa2
6
+ metadata.gz: 2af5e06c5f76730ac8e04acc79ca42238746b15f788567cf9f22dd20541caa58f86a3a83c797143e2bdb27821e914eea44ee7b5a36fc40f9ed40f1a8db1de51b
7
+ data.tar.gz: 952c5056834c0d52c515d71b355f16e84f0689ad29538279083e73274381fbce18899d3ed9af0e3ed252a29fc24a6f21a55788ab07211eef6d495665609ee000
@@ -20,6 +20,7 @@ module Dependabot
20
20
  "ItemGroup > Dependency, "\
21
21
  "ItemGroup > DevelopmentDependency"
22
22
 
23
+ PROJECT_SDK_REGEX = %r{^([^/]+)/(\d+(?:[.]\d+(?:[.]\d+)?)?(?:[+-].*)?)$}.freeze
23
24
  PROPERTY_REGEX = /\$\((?<property>.*?)\)/.freeze
24
25
  ITEM_REGEX = /\@\((?<property>.*?)\)/.freeze
25
26
 
@@ -32,16 +33,19 @@ module Dependabot
32
33
 
33
34
  doc = Nokogiri::XML(project_file.content)
34
35
  doc.remove_namespaces!
36
+ # Look for regular package references
35
37
  doc.css(DEPENDENCY_SELECTOR).each do |dependency_node|
36
38
  name = dependency_name(dependency_node, project_file)
37
39
  req = dependency_requirement(dependency_node, project_file)
38
40
  version = dependency_version(dependency_node, project_file)
39
41
  prop_name = req_property_name(dependency_node)
40
42
 
41
- dependency =
42
- build_dependency(name, req, version, prop_name, project_file)
43
+ dependency = build_dependency(name, req, version, prop_name, project_file)
43
44
  dependency_set << dependency if dependency
44
45
  end
46
+ # Look for SDK references; see:
47
+ # https://docs.microsoft.com/en-us/visualstudio/msbuild/how-to-use-project-sdk
48
+ add_sdk_references(doc, dependency_set, project_file)
45
49
 
46
50
  dependency_set
47
51
  end
@@ -50,6 +54,61 @@ module Dependabot
50
54
 
51
55
  attr_reader :dependency_files
52
56
 
57
+ def add_sdk_references(doc, dependency_set, project_file)
58
+ # These come in 3 flavours:
59
+ # - <Project Sdk="Name/Version">
60
+ # - <Sdk Name="Name" Version="Version" />
61
+ # - <Import Project="..." Sdk="Name" Version="Version" />
62
+ # None of these support the use of properties, nor do they allow child
63
+ # elements instead of attributes.
64
+ add_sdk_refs_from_project(doc, dependency_set, project_file)
65
+ add_sdk_refs_from_sdk_tags(doc, dependency_set, project_file)
66
+ add_sdk_refs_from_import_tags(doc, dependency_set, project_file)
67
+ end
68
+
69
+ def add_sdk_ref_from_project(sdk_references, dependency_set, project_file)
70
+ sdk_references.split(";")&.each do |sdk_reference|
71
+ m = sdk_reference.match(PROJECT_SDK_REGEX)
72
+ if m
73
+ dependency = build_dependency(m[1], m[2], m[2], nil, project_file)
74
+ dependency_set << dependency if dependency
75
+ end
76
+ end
77
+ end
78
+
79
+ def add_sdk_refs_from_import_tags(doc, dependency_set, project_file)
80
+ doc.xpath("/Project/Import").each do |import_node|
81
+ next unless import_node.attribute("Sdk") && import_node.attribute("Version")
82
+
83
+ name = import_node.attribute("Sdk")&.value&.strip
84
+ version = import_node.attribute("Version")&.value&.strip
85
+
86
+ dependency = build_dependency(name, version, version, nil, project_file)
87
+ dependency_set << dependency if dependency
88
+ end
89
+ end
90
+
91
+ def add_sdk_refs_from_project(doc, dependency_set, project_file)
92
+ doc.xpath("/Project").each do |project_node|
93
+ sdk_references = project_node.attribute("Sdk")&.value&.strip
94
+ next unless sdk_references
95
+
96
+ add_sdk_ref_from_project(sdk_references, dependency_set, project_file)
97
+ end
98
+ end
99
+
100
+ def add_sdk_refs_from_sdk_tags(doc, dependency_set, project_file)
101
+ doc.xpath("/Project/Sdk").each do |sdk_node|
102
+ next unless sdk_node.attribute("Version")
103
+
104
+ name = sdk_node.attribute("Name")&.value&.strip
105
+ version = sdk_node.attribute("Version")&.value&.strip
106
+
107
+ dependency = build_dependency(name, version, version, nil, project_file)
108
+ dependency_set << dependency if dependency
109
+ end
110
+ end
111
+
53
112
  def build_dependency(name, req, version, prop_name, project_file)
54
113
  return unless name
55
114
 
@@ -20,6 +20,17 @@ module Dependabot
20
20
  <DevelopmentDependency [^>]*?/>|
21
21
  <DevelopmentDependency [^>]*?[^/]>.*?</DevelopmentDependency>
22
22
  }mx.freeze
23
+ SDK_IMPORT_REGEX =
24
+ / <Import [^>]*?Sdk="[^"]*?"[^>]*?Version="[^"]*?"[^>]*?>
25
+ | <Import [^>]*?Version="[^"]*?"[^>]*?Sdk="[^"]*?"[^>]*?>
26
+ /mx.freeze
27
+ SDK_PROJECT_REGEX =
28
+ / <Project [^>]*?Sdk="[^"]*?"[^>]*?>
29
+ /mx.freeze
30
+ SDK_SDK_REGEX =
31
+ / <Sdk [^>]*?Name="[^"]*?"[^>]*?Version="[^"]*?"[^>]*?>
32
+ | <Sdk [^>]*?Version="[^"]*?"[^>]*?Name="[^"]*?"[^>]*?>
33
+ /mx.freeze
23
34
 
24
35
  attr_reader :dependency_name, :declaring_requirement,
25
36
  :dependency_files
@@ -33,6 +44,7 @@ module Dependabot
33
44
 
34
45
  def declaration_strings
35
46
  @declaration_strings ||= fetch_declaration_strings
47
+ @declaration_strings += fetch_sdk_strings
36
48
  end
37
49
 
38
50
  def declaration_nodes
@@ -72,6 +84,10 @@ module Dependabot
72
84
  # rubocop:enable Metrics/PerceivedComplexity
73
85
  # rubocop:enable Metrics/CyclomaticComplexity
74
86
 
87
+ def fetch_sdk_strings
88
+ sdk_project_strings + sdk_sdk_strings + sdk_import_strings
89
+ end
90
+
75
91
  # rubocop:disable Metrics/PerceivedComplexity
76
92
  def get_node_version_value(node)
77
93
  attribute = "Version"
@@ -95,6 +111,71 @@ module Dependabot
95
111
 
96
112
  raise "No file found with name #{filename}!"
97
113
  end
114
+
115
+ def sdk_import_strings
116
+ sdk_strings(SDK_IMPORT_REGEX, "Import", "Sdk", "Version")
117
+ end
118
+
119
+ def parse_element(string, name)
120
+ xml = string
121
+ xml += "</#{name}>" unless string.end_with?("/>")
122
+ node = Nokogiri::XML(xml)
123
+ node.remove_namespaces!
124
+ node.at_xpath("/#{name}")
125
+ end
126
+
127
+ def get_attribute_value_nocase(element, name)
128
+ value = element.attribute(name)&.value ||
129
+ element.attribute(name.downcase)&.value ||
130
+ element.attribute(name.upcase)&.value
131
+ value&.strip
132
+ end
133
+
134
+ def desired_sdk_reference?(sdk_reference, dep_name, dep_version)
135
+ parts = sdk_reference.split("/")
136
+ parts.length == 2 && parts[0]&.downcase == dep_name && parts[1] == dep_version
137
+ end
138
+
139
+ def sdk_project_strings
140
+ dep_name = dependency_name&.downcase
141
+ dep_version = declaring_requirement.fetch(:requirement)
142
+ strings = []
143
+ declaring_file.content.scan(SDK_PROJECT_REGEX).each do |string|
144
+ element = parse_element(string, "Project")
145
+ next unless element
146
+
147
+ sdk_references = get_attribute_value_nocase(element, "Sdk")
148
+ next unless sdk_references&.include?("/")
149
+
150
+ sdk_references.split(";").each do |sdk_reference|
151
+ strings << sdk_reference if desired_sdk_reference?(sdk_reference, dep_name, dep_version)
152
+ end
153
+ end
154
+ strings.uniq
155
+ end
156
+
157
+ def sdk_sdk_strings
158
+ sdk_strings(SDK_SDK_REGEX, "Sdk", "Name", "Version")
159
+ end
160
+
161
+ def sdk_strings(regex, element_name, name_attribute, version_attribute)
162
+ dep_name = dependency_name&.downcase
163
+ dep_version = declaring_requirement.fetch(:requirement)
164
+ strings = []
165
+ declaring_file.content.scan(regex).each do |string|
166
+ element = parse_element(string, element_name)
167
+ next unless element
168
+
169
+ node_name = get_attribute_value_nocase(element, name_attribute)&.downcase
170
+ next unless node_name == dep_name
171
+
172
+ node_version = get_attribute_value_nocase(element, version_attribute)
173
+ next unless node_version == dep_version
174
+
175
+ strings << string
176
+ end
177
+ strings
178
+ end
98
179
  end
99
180
  end
100
181
  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.166.1
4
+ version: 0.167.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dependabot
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-11-14 00:00:00.000000000 Z
11
+ date: 2021-11-16 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.166.1
19
+ version: 0.167.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.166.1
26
+ version: 0.167.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: byebug
29
29
  requirement: !ruby/object:Gem::Requirement