dependabot-github_actions 0.393.0 → 0.394.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.
@@ -0,0 +1,414 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ require "date"
5
+ require "sorbet-runtime"
6
+ require "yaml"
7
+
8
+ require "dependabot/github_actions/constants"
9
+
10
+ module Dependabot
11
+ module GithubActions
12
+ class WorkflowFile
13
+ extend T::Sig
14
+
15
+ Path = T.type_alias { T::Array[T.any(String, Integer)] }
16
+ Metadata = T.type_alias { T::Hash[Symbol, Object] }
17
+
18
+ require_relative "workflow_file/node_context"
19
+ require_relative "workflow_file/uses_declaration"
20
+ require_relative "workflow_file/uses_collector"
21
+ require_relative "workflow_file/metadata_builder"
22
+
23
+ sig { params(content: String).void }
24
+ def initialize(content)
25
+ @content = content
26
+ @data = T.let(
27
+ T.cast(
28
+ YAML.safe_load(content, aliases: true, permitted_classes: [Date, Time, Symbol]),
29
+ T.nilable(Object)
30
+ ),
31
+ T.nilable(Object)
32
+ )
33
+ @contexts = T.let({}, T::Hash[Path, NodeContext])
34
+ @anchors = T.let({}, T::Hash[String, Psych::Nodes::Node])
35
+ @alias_targets = T.let({}, T::Hash[Path, Psych::Nodes::Node])
36
+ @sequences = T.let([], T::Array[Psych::Nodes::Sequence])
37
+ @steps_key_nodes = T.let({}, T::Hash[Psych::Nodes::Sequence, Psych::Nodes::Scalar])
38
+ @lines = T.let(content.lines, T::Array[String])
39
+ @line_offsets = T.let(line_offsets(content), T::Array[Integer])
40
+
41
+ index_stream(YAML.parse_stream(content))
42
+ @uses_declarations = T.let(build_uses_declarations, T::Array[UsesDeclaration])
43
+ end
44
+
45
+ sig { returns(T.nilable(Object)) }
46
+ attr_reader :data
47
+
48
+ sig { returns(T::Array[UsesDeclaration]) }
49
+ attr_reader :uses_declarations
50
+
51
+ sig { returns(String) }
52
+ attr_reader :content
53
+
54
+ sig { returns(T::Array[Psych::Nodes::Sequence]) }
55
+ attr_reader :sequences
56
+
57
+ sig { returns(T::Array[Psych::Nodes::Sequence]) }
58
+ def steps_sequences = @steps_key_nodes.keys
59
+
60
+ sig { params(sequence: Psych::Nodes::Sequence).returns(T.nilable(Psych::Nodes::Scalar)) }
61
+ def steps_key_node_for(sequence) = @steps_key_nodes[sequence]
62
+
63
+ sig { params(path: Path).returns(T.nilable(UsesDeclaration)) }
64
+ def declaration_at(path) = uses_declarations.find { |declaration| declaration.path == path }
65
+
66
+ sig { params(sequence: Psych::Nodes::Sequence).returns(T::Array[UsesDeclaration]) }
67
+ def declarations_in_sequence(sequence) = uses_declarations.select { |item| item.steps_sequence.equal?(sequence) }
68
+
69
+ sig { params(declaration: UsesDeclaration).returns(T::Boolean) }
70
+ def source_metadata_required?(declaration)
71
+ return true if declaration.value_node.is_a?(Psych::Nodes::Alias)
72
+
73
+ source_node = declaration.source_node
74
+ if source_node.is_a?(Psych::Nodes::Scalar)
75
+ return true if block_scalar_style?(scalar_node_style(source_node))
76
+ return true unless node_source(source_node).include?(declaration.value.strip)
77
+ end
78
+
79
+ sequence = declaration.steps_sequence
80
+ return true if sequence && sequence_node_style(sequence) == Psych::Nodes::Sequence::FLOW
81
+
82
+ MetadataBuilder.new(self).comment_line_collision?(declaration)
83
+ end
84
+
85
+ sig { params(declaration: UsesDeclaration).returns(Metadata) }
86
+ def source_metadata(declaration) = MetadataBuilder.new(self).build(declaration)
87
+
88
+ sig { params(node: Psych::Nodes::Node).returns(String) }
89
+ def node_source(node)
90
+ start_offset = offset(node_start_line(node), node_start_column(node))
91
+ end_offset = offset(node_end_line(node), node_end_column(node))
92
+ T.must(content.byteslice(start_offset...end_offset))
93
+ end
94
+
95
+ sig { params(node: Psych::Nodes::Node).returns(Integer) }
96
+ def node_start_line(node)
97
+ T.cast(node.start_line, Integer)
98
+ end
99
+
100
+ sig { params(node: Psych::Nodes::Node).returns(Integer) }
101
+ def node_start_column(node)
102
+ T.cast(node.start_column, Integer)
103
+ end
104
+
105
+ sig { params(node: Psych::Nodes::Node).returns(Integer) }
106
+ def node_end_line(node)
107
+ T.cast(node.end_line, Integer)
108
+ end
109
+
110
+ sig { params(node: Psych::Nodes::Node).returns(Integer) }
111
+ def node_end_column(node)
112
+ T.cast(node.end_column, Integer)
113
+ end
114
+
115
+ sig { params(node: Psych::Nodes::Sequence).returns(Integer) }
116
+ def sequence_node_style(node)
117
+ T.cast(node.style, Integer)
118
+ end
119
+
120
+ sig { params(node: Psych::Nodes::Mapping).returns(Integer) }
121
+ def mapping_node_style(node)
122
+ T.cast(node.style, Integer)
123
+ end
124
+
125
+ sig { params(node: Psych::Nodes::Scalar).returns(Integer) }
126
+ def scalar_node_style(node)
127
+ T.cast(node.style, Integer)
128
+ end
129
+
130
+ sig { params(node: Psych::Nodes::Node).returns(T::Array[Psych::Nodes::Node]) }
131
+ def node_children(node)
132
+ children = node.children
133
+ return [] unless children.is_a?(Array)
134
+
135
+ children
136
+ end
137
+
138
+ sig { params(line: Integer, column: Integer).returns(Integer) }
139
+ def offset(line, column)
140
+ line_start = T.must(@line_offsets[line])
141
+ line_content = @lines[line] || ""
142
+ prefix = line_content[0, column] || ""
143
+ line_start + prefix.bytesize
144
+ end
145
+
146
+ sig { params(line: Integer, column: Integer).returns(Integer) }
147
+ def byte_column(line, column)
148
+ offset(line, column) - T.must(@line_offsets[line])
149
+ end
150
+
151
+ sig { params(line: Integer).returns(String) }
152
+ def line_body(line)
153
+ start_offset = T.must(@line_offsets[line])
154
+ end_offset = @line_offsets[line + 1] || content.bytesize
155
+ value = T.must(content.byteslice(start_offset...end_offset))
156
+ value = value.delete_suffix("\n")
157
+ value.delete_suffix("\r")
158
+ end
159
+
160
+ sig { params(line: Integer).returns(Integer) }
161
+ def line_end_offset(line)
162
+ T.must(@line_offsets[line]) + line_body(line).bytesize
163
+ end
164
+
165
+ sig { returns(String) }
166
+ def newline
167
+ content.include?("\r\n") ? "\r\n" : "\n"
168
+ end
169
+
170
+ private
171
+
172
+ sig { params(stream: Psych::Nodes::Stream).void }
173
+ def index_stream(stream)
174
+ document = node_children(stream).first
175
+ return unless document.is_a?(Psych::Nodes::Document)
176
+
177
+ root = node_children(document).first
178
+ return unless root
179
+
180
+ index_node(
181
+ root,
182
+ [],
183
+ mapping_node: nil,
184
+ key_node: nil,
185
+ steps_sequence: nil,
186
+ steps_key_node: nil,
187
+ sequence_item: nil,
188
+ sequence_item_index: nil
189
+ )
190
+ end
191
+
192
+ sig do
193
+ params(
194
+ node: Psych::Nodes::Node,
195
+ path: Path,
196
+ mapping_node: T.nilable(Psych::Nodes::Mapping),
197
+ key_node: T.nilable(Psych::Nodes::Scalar),
198
+ steps_sequence: T.nilable(Psych::Nodes::Sequence),
199
+ steps_key_node: T.nilable(Psych::Nodes::Scalar),
200
+ sequence_item: T.nilable(Psych::Nodes::Node),
201
+ sequence_item_index: T.nilable(Integer)
202
+ ).void
203
+ end
204
+ def index_node(
205
+ node,
206
+ path,
207
+ mapping_node:,
208
+ key_node:,
209
+ steps_sequence:,
210
+ steps_key_node:,
211
+ sequence_item:,
212
+ sequence_item_index:
213
+ )
214
+ record_node(
215
+ node,
216
+ path,
217
+ mapping_node: mapping_node,
218
+ key_node: key_node,
219
+ steps_sequence: steps_sequence,
220
+ steps_key_node: steps_key_node,
221
+ sequence_item: sequence_item,
222
+ sequence_item_index: sequence_item_index
223
+ )
224
+
225
+ index_node_children(
226
+ node,
227
+ path,
228
+ steps_sequence: steps_sequence,
229
+ steps_key_node: steps_key_node,
230
+ sequence_item: sequence_item,
231
+ sequence_item_index: sequence_item_index
232
+ )
233
+ end
234
+
235
+ sig do
236
+ params(
237
+ node: Psych::Nodes::Node,
238
+ path: Path,
239
+ mapping_node: T.nilable(Psych::Nodes::Mapping),
240
+ key_node: T.nilable(Psych::Nodes::Scalar),
241
+ steps_sequence: T.nilable(Psych::Nodes::Sequence),
242
+ steps_key_node: T.nilable(Psych::Nodes::Scalar),
243
+ sequence_item: T.nilable(Psych::Nodes::Node),
244
+ sequence_item_index: T.nilable(Integer)
245
+ ).void
246
+ end
247
+ def record_node(
248
+ node,
249
+ path,
250
+ mapping_node:,
251
+ key_node:,
252
+ steps_sequence:,
253
+ steps_key_node:,
254
+ sequence_item:,
255
+ sequence_item_index:
256
+ )
257
+ @contexts[path] = NodeContext.new(
258
+ node: node,
259
+ mapping_node: mapping_node,
260
+ key_node: key_node,
261
+ steps_sequence: steps_sequence,
262
+ steps_key_node: steps_key_node,
263
+ sequence_item: sequence_item,
264
+ sequence_item_index: sequence_item_index
265
+ )
266
+ if node.is_a?(Psych::Nodes::Alias)
267
+ target = @anchors[node.anchor]
268
+ @alias_targets[path] = target if target
269
+ end
270
+
271
+ anchor = node_anchor(node)
272
+ @anchors[anchor] = node if anchor
273
+ @sequences << node if node.is_a?(Psych::Nodes::Sequence)
274
+ end
275
+
276
+ sig do
277
+ params(
278
+ node: Psych::Nodes::Node,
279
+ path: Path,
280
+ steps_sequence: T.nilable(Psych::Nodes::Sequence),
281
+ steps_key_node: T.nilable(Psych::Nodes::Scalar),
282
+ sequence_item: T.nilable(Psych::Nodes::Node),
283
+ sequence_item_index: T.nilable(Integer)
284
+ ).void
285
+ end
286
+ def index_node_children(
287
+ node,
288
+ path,
289
+ steps_sequence:,
290
+ steps_key_node:,
291
+ sequence_item:,
292
+ sequence_item_index:
293
+ )
294
+ case node
295
+ when Psych::Nodes::Mapping
296
+ index_mapping(
297
+ node,
298
+ path,
299
+ steps_sequence: steps_sequence,
300
+ steps_key_node: steps_key_node,
301
+ sequence_item: sequence_item,
302
+ sequence_item_index: sequence_item_index
303
+ )
304
+ when Psych::Nodes::Sequence
305
+ node_children(node).each_with_index do |child, index|
306
+ index_node(
307
+ child,
308
+ path + [index],
309
+ mapping_node: nil,
310
+ key_node: nil,
311
+ steps_sequence: steps_sequence,
312
+ steps_key_node: steps_key_node,
313
+ sequence_item: child,
314
+ sequence_item_index: index
315
+ )
316
+ end
317
+ end
318
+ end
319
+
320
+ sig do
321
+ params(
322
+ node: Psych::Nodes::Mapping,
323
+ path: Path,
324
+ steps_sequence: T.nilable(Psych::Nodes::Sequence),
325
+ steps_key_node: T.nilable(Psych::Nodes::Scalar),
326
+ sequence_item: T.nilable(Psych::Nodes::Node),
327
+ sequence_item_index: T.nilable(Integer)
328
+ ).void
329
+ end
330
+ def index_mapping(
331
+ node,
332
+ path,
333
+ steps_sequence:,
334
+ steps_key_node:,
335
+ sequence_item:,
336
+ sequence_item_index:
337
+ )
338
+ node_children(node).each_slice(2) do |raw_key_node, value_node|
339
+ next unless raw_key_node.is_a?(Psych::Nodes::Scalar) && value_node
340
+
341
+ child_steps_sequence = steps_sequence
342
+ child_steps_key_node = steps_key_node
343
+ if raw_key_node.value == STEPS_KEY && value_node.is_a?(Psych::Nodes::Sequence)
344
+ child_steps_sequence = value_node
345
+ child_steps_key_node = raw_key_node
346
+ @steps_key_nodes[value_node] = raw_key_node
347
+ end
348
+
349
+ index_node(
350
+ value_node,
351
+ path + [raw_key_node.value],
352
+ mapping_node: node,
353
+ key_node: raw_key_node,
354
+ steps_sequence: child_steps_sequence,
355
+ steps_key_node: child_steps_key_node,
356
+ sequence_item: sequence_item,
357
+ sequence_item_index: sequence_item_index
358
+ )
359
+ end
360
+ end
361
+
362
+ sig { returns(T::Array[UsesDeclaration]) }
363
+ def build_uses_declarations
364
+ UsesCollector.new(data).uses.map do |resolved_use|
365
+ build_declaration(resolved_use.value, resolved_use.path)
366
+ end
367
+ end
368
+
369
+ sig { params(value: String, path: Path).returns(UsesDeclaration) }
370
+ def build_declaration(value, path)
371
+ context = @contexts[path]
372
+ value_node = context&.node
373
+ source_node =
374
+ if value_node.is_a?(Psych::Nodes::Alias)
375
+ @alias_targets[path]
376
+ else
377
+ value_node
378
+ end
379
+
380
+ UsesDeclaration.new(
381
+ value: value,
382
+ path: path,
383
+ value_node: value_node,
384
+ source_node: source_node,
385
+ mapping_node: context&.mapping_node,
386
+ steps_sequence: context&.steps_sequence,
387
+ steps_key_node: context&.steps_key_node,
388
+ sequence_item: context&.sequence_item,
389
+ sequence_item_index: context&.sequence_item_index
390
+ )
391
+ end
392
+
393
+ sig { params(style: Integer).returns(T::Boolean) }
394
+ def block_scalar_style?(style)
395
+ [Psych::Nodes::Scalar::LITERAL, Psych::Nodes::Scalar::FOLDED].include?(style)
396
+ end
397
+
398
+ sig { params(node: Psych::Nodes::Node).returns(T.nilable(String)) }
399
+ def node_anchor(node)
400
+ case node
401
+ when Psych::Nodes::Scalar, Psych::Nodes::Mapping, Psych::Nodes::Sequence
402
+ node.anchor
403
+ end
404
+ end
405
+
406
+ sig { params(value: String).returns(T::Array[Integer]) }
407
+ def line_offsets(value)
408
+ offsets = [0]
409
+ value.each_line { |line| offsets << (offsets.last + line.bytesize) }
410
+ offsets
411
+ end
412
+ end
413
+ end
414
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dependabot-github_actions
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.393.0
4
+ version: 0.394.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dependabot
@@ -15,14 +15,14 @@ dependencies:
15
15
  requirements:
16
16
  - - '='
17
17
  - !ruby/object:Gem::Version
18
- version: 0.393.0
18
+ version: 0.394.0
19
19
  type: :runtime
20
20
  prerelease: false
21
21
  version_requirements: !ruby/object:Gem::Requirement
22
22
  requirements:
23
23
  - - '='
24
24
  - !ruby/object:Gem::Version
25
- version: 0.393.0
25
+ version: 0.394.0
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: debug
28
28
  requirement: !ruby/object:Gem::Requirement
@@ -169,14 +169,14 @@ dependencies:
169
169
  requirements:
170
170
  - - "~>"
171
171
  - !ruby/object:Gem::Version
172
- version: '0.22'
172
+ version: '1.1'
173
173
  type: :development
174
174
  prerelease: false
175
175
  version_requirements: !ruby/object:Gem::Requirement
176
176
  requirements:
177
177
  - - "~>"
178
178
  - !ruby/object:Gem::Version
179
- version: '0.22'
179
+ version: '1.1'
180
180
  - !ruby/object:Gem::Dependency
181
181
  name: turbo_tests
182
182
  requirement: !ruby/object:Gem::Requirement
@@ -247,6 +247,13 @@ files:
247
247
  - lib/dependabot/github_actions/file_fetcher.rb
248
248
  - lib/dependabot/github_actions/file_parser.rb
249
249
  - lib/dependabot/github_actions/file_updater.rb
250
+ - lib/dependabot/github_actions/file_updater/workflow_updater.rb
251
+ - lib/dependabot/github_actions/file_updater/workflow_updater/flow_sequence_comments.rb
252
+ - lib/dependabot/github_actions/file_updater/workflow_updater/source_comment_locator.rb
253
+ - lib/dependabot/github_actions/file_updater/workflow_updater/source_comment_updater.rb
254
+ - lib/dependabot/github_actions/file_updater/workflow_updater/source_updater.rb
255
+ - lib/dependabot/github_actions/file_updater/workflow_updater/version_commenter.rb
256
+ - lib/dependabot/github_actions/file_updater/workflow_updater/yaml_comment_finder.rb
250
257
  - lib/dependabot/github_actions/helpers.rb
251
258
  - lib/dependabot/github_actions/lockfile.rb
252
259
  - lib/dependabot/github_actions/lockfile/cli_engine.rb
@@ -261,12 +268,17 @@ files:
261
268
  - lib/dependabot/github_actions/update_checker.rb
262
269
  - lib/dependabot/github_actions/update_checker/latest_version_finder.rb
263
270
  - lib/dependabot/github_actions/version.rb
271
+ - lib/dependabot/github_actions/workflow_file.rb
272
+ - lib/dependabot/github_actions/workflow_file/metadata_builder.rb
273
+ - lib/dependabot/github_actions/workflow_file/node_context.rb
274
+ - lib/dependabot/github_actions/workflow_file/uses_collector.rb
275
+ - lib/dependabot/github_actions/workflow_file/uses_declaration.rb
264
276
  homepage: https://github.com/dependabot/dependabot-core
265
277
  licenses:
266
278
  - MIT
267
279
  metadata:
268
280
  bug_tracker_uri: https://github.com/dependabot/dependabot-core/issues
269
- changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.393.0
281
+ changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.394.0
270
282
  rdoc_options: []
271
283
  require_paths:
272
284
  - lib