dependabot-common 0.236.0 → 0.237.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: 945c135096f005a7d416b56d1e8f9e6b91e1a02b0590758887eba5a110fb5b19
4
- data.tar.gz: 0cc101754418b3b1aa682c273e5c6ed2fa72b796d72a9b4d30b3c0f0aa41c39b
3
+ metadata.gz: e29557fff3ec856a4ebcb95a2b53dd70f91b5d7f2ea66cd6230e90dbcbbc2dc0
4
+ data.tar.gz: f6b2ce2a845422872e58b37681909fb4357bb1ebcac22c1085db113dc2429426
5
5
  SHA512:
6
- metadata.gz: 76e41c5707a11e8a5b17df8fa71fc81a4ebbf1a3fd71469931d84cebe1573588afa6605751af2a65c849884bcdf0dd79b5bc4a1d63b9ac69d39466cf8a4b952e
7
- data.tar.gz: 53204ad41f102502301e483b3175280673849b0ab0d530b8458aa77289251dfaf287f9ee051e90bd5b39722a7b25a2993e8a49aa15c03982e82990df475fd9dd
6
+ metadata.gz: 367d715ab3cb1b0c2c498555419e2212e9986c8e824128ce56695c00cdc190371fa0b7b9115258146ff0573f2e4a8461e1c66651b9d84bb2fdb7b0fe00b901ff
7
+ data.tar.gz: 4e5b3e040476f17cb7cf268ccc0cae90f17178da6a5954b14ca2a2ce280cf0f067b1ce8b88ecc8da5c04ae919cc34b670258b1555f9bfb707fb061cc8439acb3
@@ -271,9 +271,9 @@ module Dependabot
271
271
  )
272
272
  )
273
273
 
274
- raise InternalServerError if response&.status == 500
275
- raise BadGateway if response&.status == 502
276
- raise ServiceNotAvailable if response&.status == 503
274
+ raise InternalServerError if response.status == 500
275
+ raise BadGateway if response.status == 502
276
+ raise ServiceNotAvailable if response.status == 503
277
277
  end
278
278
 
279
279
  raise Unauthorized if response&.status == 401
@@ -1,4 +1,4 @@
1
- # typed: true
1
+ # typed: strict
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require "dependabot/config/update_config"
@@ -10,11 +10,22 @@ module Dependabot
10
10
  class File
11
11
  extend T::Sig
12
12
 
13
- attr_reader :updates, :registries
13
+ sig { returns(T::Array[T::Hash[Symbol, String]]) }
14
+ attr_reader :updates
14
15
 
16
+ sig { returns T::Array[T.untyped] }
17
+ attr_reader :registries
18
+
19
+ sig do
20
+ params(
21
+ updates: T.nilable(T::Array[T::Hash[Symbol, String]]),
22
+ registries: T.nilable(T::Array[T.untyped])
23
+ )
24
+ .void
25
+ end
15
26
  def initialize(updates:, registries: nil)
16
- @updates = updates || []
17
- @registries = registries || []
27
+ @updates = T.let(updates || [], T::Array[T::Hash[Symbol, String]])
28
+ @registries = T.let(registries || [], T::Array[T.untyped])
18
29
  end
19
30
 
20
31
  sig do
@@ -46,7 +57,7 @@ module Dependabot
46
57
 
47
58
  private
48
59
 
49
- PACKAGE_MANAGER_LOOKUP = {
60
+ PACKAGE_MANAGER_LOOKUP = T.let({
50
61
  "bundler" => "bundler",
51
62
  "cargo" => "cargo",
52
63
  "composer" => "composer",
@@ -64,7 +75,7 @@ module Dependabot
64
75
  "pub" => "pub",
65
76
  "swift" => "swift",
66
77
  "terraform" => "terraform"
67
- }.freeze
78
+ }.freeze, T::Hash[String, String])
68
79
 
69
80
  sig { params(cfg: T.nilable(T::Hash[Symbol, T.untyped])).returns(T::Array[IgnoreCondition]) }
70
81
  def ignore_conditions(cfg)
@@ -1,4 +1,4 @@
1
- # typed: true
1
+ # typed: strict
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require "dependabot/config/ignore_condition"
@@ -23,17 +23,17 @@ module Dependabot
23
23
  ).void
24
24
  end
25
25
  def initialize(ignore_conditions: nil, commit_message_options: nil)
26
- @ignore_conditions = ignore_conditions || []
26
+ @ignore_conditions = T.let(ignore_conditions || [], T::Array[IgnoreCondition])
27
27
  @commit_message_options = commit_message_options
28
28
  end
29
29
 
30
30
  sig { params(dependency: Dependency, security_updates_only: T::Boolean).returns(T::Array[String]) }
31
31
  def ignored_versions_for(dependency, security_updates_only: false)
32
32
  normalizer = name_normaliser_for(dependency)
33
- dep_name = normalizer.call(dependency.name)
33
+ dep_name = T.must(normalizer).call(dependency.name)
34
34
 
35
35
  @ignore_conditions
36
- .select { |ic| self.class.wildcard_match?(normalizer.call(ic.dependency_name), dep_name) }
36
+ .select { |ic| self.class.wildcard_match?(T.must(normalizer).call(ic.dependency_name), dep_name) }
37
37
  .map { |ic| ic.ignored_versions(dependency, security_updates_only) }
38
38
  .flatten
39
39
  .compact
@@ -53,6 +53,7 @@ module Dependabot
53
53
 
54
54
  private
55
55
 
56
+ sig { params(dep: Dependency).returns(T.nilable(T.proc.params(arg0: String).returns(String))) }
56
57
  def name_normaliser_for(dep)
57
58
  name_normaliser ||= {}
58
59
  name_normaliser[dep] ||= Dependency.name_normaliser_for_package_manager(dep.package_manager)
@@ -61,18 +62,35 @@ module Dependabot
61
62
  class CommitMessageOptions
62
63
  extend T::Sig
63
64
 
64
- attr_reader :prefix, :prefix_development, :include
65
+ sig { returns(T.nilable(String)) }
66
+ attr_reader :prefix
65
67
 
68
+ sig { returns(T.nilable(String)) }
69
+ attr_reader :prefix_development
70
+
71
+ sig { returns(T.nilable(String)) }
72
+ attr_reader :include
73
+
74
+ sig do
75
+ params(
76
+ prefix: T.nilable(String),
77
+ prefix_development: T.nilable(String),
78
+ include: T.nilable(String)
79
+ )
80
+ .void
81
+ end
66
82
  def initialize(prefix:, prefix_development:, include:)
67
83
  @prefix = prefix
68
84
  @prefix_development = prefix_development
69
85
  @include = include
70
86
  end
71
87
 
88
+ sig { returns(T::Boolean) }
72
89
  def include_scope?
73
90
  @include == "scope"
74
91
  end
75
92
 
93
+ sig { returns(T::Hash[Symbol, String]) }
76
94
  def to_h
77
95
  {
78
96
  prefix: @prefix,
@@ -1,13 +1,47 @@
1
- # typed: true
1
+ # typed: strict
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require "pathname"
5
+ require "sorbet-runtime"
5
6
 
6
7
  module Dependabot
7
8
  class DependencyFile
8
- attr_accessor :name, :content, :directory, :type, :support_file,
9
- :vendored_file, :symlink_target, :content_encoding,
10
- :operation, :mode
9
+ extend T::Sig
10
+
11
+ sig { returns(String) }
12
+ attr_accessor :name
13
+
14
+ sig { returns(T.nilable(String)) }
15
+ attr_accessor :content
16
+
17
+ sig { returns(String) }
18
+ attr_accessor :directory
19
+
20
+ sig { returns(String) }
21
+ attr_accessor :type
22
+
23
+ sig { returns(T::Boolean) }
24
+ attr_accessor :support_file
25
+
26
+ sig { returns(T::Boolean) }
27
+ attr_accessor :vendored_file
28
+
29
+ sig { returns(T.nilable(String)) }
30
+ attr_accessor :symlink_target
31
+
32
+ sig { returns(String) }
33
+ attr_accessor :content_encoding
34
+
35
+ sig { returns(String) }
36
+ attr_accessor :operation
37
+
38
+ sig { returns(T.nilable(String)) }
39
+ attr_accessor :mode
40
+
41
+ # The directory that this file was fetched for. This is useful for multi-directory
42
+ # updates, where a set of files that are related to each other are updated together.
43
+ sig { returns(T.nilable(String)) }
44
+ attr_accessor :job_directory
11
45
 
12
46
  class ContentEncoding
13
47
  UTF_8 = "utf-8"
@@ -25,18 +59,36 @@ module Dependabot
25
59
  SUBMODULE = "160000"
26
60
  end
27
61
 
62
+ sig do
63
+ params(
64
+ name: String,
65
+ content: T.nilable(String),
66
+ directory: String,
67
+ type: String,
68
+ support_file: T::Boolean,
69
+ vendored_file: T::Boolean,
70
+ symlink_target: T.nilable(String),
71
+ content_encoding: String,
72
+ deleted: T::Boolean,
73
+ operation: String,
74
+ mode: T.nilable(String),
75
+ job_directory: T.nilable(String)
76
+ )
77
+ .void
78
+ end
28
79
  def initialize(name:, content:, directory: "/", type: "file",
29
80
  support_file: false, vendored_file: false, symlink_target: nil,
30
81
  content_encoding: ContentEncoding::UTF_8, deleted: false,
31
- operation: Operation::UPDATE, mode: nil)
82
+ operation: Operation::UPDATE, mode: nil, job_directory: nil)
32
83
  @name = name
33
84
  @content = content
34
- @directory = clean_directory(directory)
85
+ @directory = T.let(clean_directory(directory), String)
35
86
  @symlink_target = symlink_target
36
87
  @support_file = support_file
37
88
  @vendored_file = vendored_file
38
89
  @content_encoding = content_encoding
39
90
  @operation = operation
91
+ @job_directory = job_directory
40
92
 
41
93
  # Make deleted override the operation. Deleted is kept when operation
42
94
  # was introduced to keep compatibility with downstream dependants.
@@ -50,7 +102,7 @@ module Dependabot
50
102
  @type = type
51
103
 
52
104
  begin
53
- @mode = File.stat(realpath).mode.to_s(8)
105
+ @mode = T.let(File.stat(realpath).mode.to_s(8), T.nilable(String))
54
106
  rescue StandardError
55
107
  @mode = mode
56
108
  end
@@ -61,6 +113,7 @@ module Dependabot
61
113
  raise "Only symlinked files must specify a target!" if symlink_target
62
114
  end
63
115
 
116
+ sig { returns(T::Hash[String, T.untyped]) }
64
117
  def to_h
65
118
  details = {
66
119
  "name" => name,
@@ -74,66 +127,83 @@ module Dependabot
74
127
  "mode" => mode
75
128
  }
76
129
 
130
+ details["job_directory"] = job_directory if job_directory
77
131
  details["symlink_target"] = symlink_target if symlink_target
78
132
  details
79
133
  end
80
134
 
135
+ sig { returns(String) }
81
136
  def path
82
137
  Pathname.new(File.join(directory, name)).cleanpath.to_path
83
138
  end
84
139
 
140
+ sig { returns(String) }
85
141
  def realpath
86
142
  (symlink_target || path).sub(%r{^/}, "")
87
143
  end
88
144
 
145
+ sig { params(other: BasicObject).returns(T::Boolean) }
89
146
  def ==(other)
90
- return false unless other.instance_of?(self.class)
91
-
92
- my_hash = to_h.reject { |k| k == "support_file" }
93
- their_hash = other.to_h.reject { |k| k == "support_file" }
94
- my_hash == their_hash
147
+ case other
148
+ when DependencyFile
149
+ my_hash = to_h.reject { |k| k == "support_file" }
150
+ their_hash = other.to_h.reject { |k| k == "support_file" }
151
+ my_hash == their_hash
152
+ else
153
+ false
154
+ end
95
155
  end
96
156
 
157
+ sig { returns(Integer) }
97
158
  def hash
98
159
  to_h.hash
99
160
  end
100
161
 
162
+ sig { params(other: BasicObject).returns(T::Boolean) }
101
163
  def eql?(other)
102
164
  self == other
103
165
  end
104
166
 
167
+ sig { returns(T::Boolean) }
105
168
  def support_file?
106
169
  @support_file
107
170
  end
108
171
 
172
+ sig { returns(T::Boolean) }
109
173
  def vendored_file?
110
174
  @vendored_file
111
175
  end
112
176
 
177
+ sig { returns(T::Boolean) }
113
178
  def deleted
114
179
  @operation == Operation::DELETE
115
180
  end
116
181
 
182
+ sig { params(deleted: T::Boolean).void }
117
183
  def deleted=(deleted)
118
184
  @operation = deleted ? Operation::DELETE : Operation::UPDATE
119
185
  end
120
186
 
187
+ sig { returns(T::Boolean) }
121
188
  def deleted?
122
189
  deleted
123
190
  end
124
191
 
192
+ sig { returns(T::Boolean) }
125
193
  def binary?
126
194
  content_encoding == ContentEncoding::BASE64
127
195
  end
128
196
 
197
+ sig { returns(String) }
129
198
  def decoded_content
130
- return Base64.decode64(content) if binary?
199
+ return Base64.decode64(T.must(content)) if binary?
131
200
 
132
- content
201
+ T.must(content)
133
202
  end
134
203
 
135
204
  private
136
205
 
206
+ sig { params(directory: String).returns(String) }
137
207
  def clean_directory(directory)
138
208
  # Directory should always start with a `/`
139
209
  directory.sub(%r{^/*}, "/")
@@ -1,23 +1,41 @@
1
- # typed: true
1
+ # typed: strict
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require "dependabot/experiments"
5
5
  require "dependabot/config/ignore_condition"
6
6
  require "dependabot/logger"
7
7
 
8
+ require "sorbet-runtime"
8
9
  require "wildcard_matcher"
9
10
  require "yaml"
10
11
 
11
12
  module Dependabot
12
13
  class DependencyGroup
13
- attr_reader :name, :rules, :dependencies
14
+ extend T::Sig
14
15
 
16
+ sig { returns(String) }
17
+ attr_reader :name
18
+
19
+ sig { returns(T::Hash[String, T.any(String, T::Array[String])]) }
20
+ attr_reader :rules
21
+
22
+ sig { returns(T::Array[Dependabot::Dependency]) }
23
+ attr_reader :dependencies
24
+
25
+ sig do
26
+ params(
27
+ name: String,
28
+ rules: T::Hash[String, T.untyped]
29
+ )
30
+ .void
31
+ end
15
32
  def initialize(name:, rules:)
16
33
  @name = name
17
34
  @rules = rules
18
- @dependencies = []
35
+ @dependencies = T.let([], T::Array[Dependabot::Dependency])
19
36
  end
20
37
 
38
+ sig { params(dependency: Dependabot::Dependency).returns(T::Boolean) }
21
39
  def contains?(dependency)
22
40
  return true if @dependencies.include?(dependency)
23
41
  return false if matches_excluded_pattern?(dependency.name)
@@ -25,11 +43,13 @@ module Dependabot
25
43
  matches_pattern?(dependency.name) && matches_dependency_type?(dependency)
26
44
  end
27
45
 
46
+ sig { returns(T::Hash[String, String]) }
28
47
  def to_h
29
48
  { "name" => name }
30
49
  end
31
50
 
32
51
  # Provides a debug utility to view the group as it appears in the config file.
52
+ sig { returns(String) }
33
53
  def to_config_yaml
34
54
  {
35
55
  "groups" => { name => rules }
@@ -38,18 +58,21 @@ module Dependabot
38
58
 
39
59
  private
40
60
 
61
+ sig { params(dependency_name: String).returns(T::Boolean) }
41
62
  def matches_pattern?(dependency_name)
42
63
  return true unless rules.key?("patterns") # If no patterns are defined, we pass this check by default
43
64
 
44
- rules["patterns"].any? { |rule| WildcardMatcher.match?(rule, dependency_name) }
65
+ T.unsafe(rules["patterns"]).any? { |rule| WildcardMatcher.match?(rule, dependency_name) }
45
66
  end
46
67
 
68
+ sig { params(dependency_name: String).returns(T::Boolean) }
47
69
  def matches_excluded_pattern?(dependency_name)
48
70
  return false unless rules.key?("exclude-patterns") # If there are no exclusions, fail by default
49
71
 
50
- rules["exclude-patterns"].any? { |rule| WildcardMatcher.match?(rule, dependency_name) }
72
+ T.unsafe(rules["exclude-patterns"]).any? { |rule| WildcardMatcher.match?(rule, dependency_name) }
51
73
  end
52
74
 
75
+ sig { params(dependency: Dependabot::Dependency).returns(T::Boolean) }
53
76
  def matches_dependency_type?(dependency)
54
77
  return true unless rules.key?("dependency-type") # If no dependency-type is set, match by default
55
78
 
@@ -60,6 +83,7 @@ module Dependabot
60
83
  end
61
84
  end
62
85
 
86
+ sig { returns(T::Boolean) }
63
87
  def experimental_rules_enabled?
64
88
  Dependabot::Experiments.enabled?(:grouped_updates_experimental_rules)
65
89
  end