dependabot-terraform 0.295.0 → 0.296.1

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: '09f8ec862f1e15a9c1d42ce70957de2f6416f982711b11dac0d6ad805eda5b3d'
4
- data.tar.gz: 5f17aab0627b6d9efef8a8dece180b93860be06537ca160c0d319b84fc2aeb81
3
+ metadata.gz: 30eb2e7c99aefe9caa6a3e7b7fc64372b613ab51146eb17a701cd775116546f8
4
+ data.tar.gz: 6b197e83c13cd6a573524a1ce0cce325a78b5cf744792f95925a83d0dd68946e
5
5
  SHA512:
6
- metadata.gz: adbed28b55677301eb334f9722a0c1ab57494238a442a94716edbef3e2e6854855ae992a986303ae37f15a67b53f3a5f2e6a20f147e1114e76ba1f905b210382
7
- data.tar.gz: b0a3bca0733ee5165d45382c060272fa75d9d86fd2a550ae42b312f761c52ff164ed425110dcd6fd5151a86aff21bd336a24c11c1787e784fbf9d2d5133e3744
6
+ metadata.gz: ba1b5e22707cb62959165ebf7af175d50d3f7eea7c34f6058d7a91eca56ca50ab750b4fc13380627a34aefbcbcc518b2a184d5b9b197d8ce053d0f0e7a7deade
7
+ data.tar.gz: ab7527bec58714d60df2c9dc71a99906d1175f60a2a1ef85b9e45b1aa8461983d55b70faada0a25cf318cc3007a3500bd198870964f8b572cb4f34665d928b11
@@ -1,4 +1,4 @@
1
- # typed: true
1
+ # typed: strict
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require "dependabot/dependency"
@@ -12,35 +12,42 @@ module Dependabot
12
12
  # Terraform::RegistryClient is a basic API client to interact with a
13
13
  # terraform registry: https://www.terraform.io/docs/registry/api.html
14
14
  class RegistryClient
15
- ARCHIVE_EXTENSIONS = %w(.zip .tbz2 .tgz .txz).freeze
15
+ extend T::Sig
16
+
17
+ ARCHIVE_EXTENSIONS = T.let(%w(.zip .tbz2 .tgz .txz).freeze, T::Array[String])
16
18
  PUBLIC_HOSTNAME = "registry.terraform.io"
17
19
 
20
+ sig { params(hostname: String, credentials: T::Array[Dependabot::Credential]).void }
18
21
  def initialize(hostname: PUBLIC_HOSTNAME, credentials: [])
19
22
  @hostname = hostname
20
- @tokens = credentials.each_with_object({}) do |item, memo|
21
- memo[item["host"]] = item["token"] if item["type"] == "terraform_registry"
22
- end
23
+ @tokens = T.let(
24
+ credentials.each_with_object({}) do |item, memo|
25
+ memo[item["host"]] = item["token"] if item["type"] == "terraform_registry"
26
+ end,
27
+ T::Hash[String, String]
28
+ )
23
29
  end
24
30
 
25
31
  # rubocop:disable Metrics/PerceivedComplexity
26
- # See https://www.terraform.io/docs/modules/sources.html#http-urls for
27
- # details of how Terraform handle HTTP(S) sources for modules
28
32
  # rubocop:disable Metrics/AbcSize
29
33
  # rubocop:disable Metrics/CyclomaticComplexity
34
+ # See https://www.terraform.io/docs/modules/sources.html#http-urls for
35
+ # details of how Terraform handle HTTP(S) sources for modules
36
+ sig { params(raw_source: String).returns(String) }
30
37
  def self.get_proxied_source(raw_source)
31
38
  return raw_source unless raw_source.start_with?("http")
32
39
 
33
- uri = URI.parse(raw_source.split(%r{(?<!:)//}).first)
40
+ uri = URI.parse(T.must(raw_source.split(%r{(?<!:)//}).first))
34
41
  return raw_source if ARCHIVE_EXTENSIONS.any? { |ext| uri.path&.end_with?(ext) }
35
42
  return raw_source if URI.parse(raw_source).query&.include?("archive=")
36
43
 
37
- url = raw_source.split(%r{(?<!:)//}).first + "?terraform-get=1"
44
+ url = T.must(raw_source.split(%r{(?<!:)//}).first) + "?terraform-get=1"
38
45
  host = URI.parse(raw_source).host
39
46
 
40
47
  response = Dependabot::RegistryClient.get(url: url)
41
48
  raise PrivateSourceAuthenticationFailure, host if response.status == 401
42
49
 
43
- return response.headers["X-Terraform-Get"] if response.headers["X-Terraform-Get"]
50
+ return T.must(response.headers["X-Terraform-Get"]) if response.headers["X-Terraform-Get"]
44
51
 
45
52
  doc = Nokogiri::XML(response.body)
46
53
  doc.css("meta").find do |tag|
@@ -62,6 +69,7 @@ module Dependabot
62
69
  # "hashicorp/aws"
63
70
  # @return [Array<Dependabot::Terraform::Version>]
64
71
  # @raise [Dependabot::DependabotError] when the versions cannot be retrieved
72
+ sig { params(identifier: String).returns(T::Array[Dependabot::Terraform::Version]) }
65
73
  def all_provider_versions(identifier:)
66
74
  base_url = service_url_for("providers.v1")
67
75
  response = http_get!(URI.join(base_url, "#{identifier}/versions"))
@@ -80,6 +88,7 @@ module Dependabot
80
88
  # "hashicorp/consul/aws"
81
89
  # @return [Array<Dependabot::Terraform::Version>]
82
90
  # @raise [Dependabot::DependabotError] when the versions cannot be retrieved
91
+ sig { params(identifier: String).returns(T::Array[Dependabot::Terraform::Version]) }
83
92
  def all_module_versions(identifier:)
84
93
  base_url = service_url_for("modules.v1")
85
94
  response = http_get!(URI.join(base_url, "#{identifier}/versions"))
@@ -97,8 +106,9 @@ module Dependabot
97
106
  # @param dependency [Dependabot::Dependency] the dependency who's source
98
107
  # we're attempting to find
99
108
  # @return [nil, Dependabot::Source]
109
+ sig { params(dependency: Dependabot::Dependency).returns(T.nilable(Dependabot::Source)) }
100
110
  def source(dependency:)
101
- type = dependency.requirements.first[:source][:type]
111
+ type = T.must(dependency.requirements.first)[:source][:type]
102
112
  base_url = service_url_for(service_key_for(type))
103
113
  case type
104
114
  # https://www.terraform.io/internals/module-registry-protocol#download-source-code-for-a-specific-module-version
@@ -130,6 +140,7 @@ module Dependabot
130
140
  # @param service_key [String] the service type described in https://www.terraform.io/docs/internals/remote-service-discovery.html#supported-services
131
141
  # @param return String
132
142
  # @raise [Dependabot::PrivateSourceAuthenticationFailure] when the service is not available
143
+ sig { params(service_key: String).returns(String) }
133
144
  def service_url_for(service_key)
134
145
  url_for(services.fetch(service_key))
135
146
  rescue KeyError
@@ -138,26 +149,35 @@ module Dependabot
138
149
 
139
150
  private
140
151
 
152
+ sig { returns(String) }
141
153
  attr_reader :hostname
154
+
155
+ sig { returns(T::Hash[String, String]) }
142
156
  attr_reader :tokens
143
157
 
158
+ sig { returns(T.class_of(Dependabot::Terraform::Version)) }
144
159
  def version_class
145
160
  Version
146
161
  end
147
162
 
163
+ sig { params(hostname: String).returns(T::Hash[String, String]) }
148
164
  def headers_for(hostname)
149
165
  token = tokens[hostname]
150
166
  token ? { "Authorization" => "Bearer #{token}" } : {}
151
167
  end
152
168
 
169
+ sig { returns(T::Hash[String, String]) }
153
170
  def services
154
- @services ||=
171
+ @services ||= T.let(
155
172
  begin
156
173
  response = http_get(url_for("/.well-known/terraform.json"))
157
174
  response.status == 200 ? JSON.parse(response.body) : {}
158
- end
175
+ end,
176
+ T.nilable(T::Hash[String, String])
177
+ )
159
178
  end
160
179
 
180
+ sig { params(type: String).returns(String) }
161
181
  def service_key_for(type)
162
182
  case type
163
183
  when "module", "modules", "registry"
@@ -169,13 +189,17 @@ module Dependabot
169
189
  end
170
190
  end
171
191
 
192
+ sig { params(url: T.any(String, URI::Generic)).returns(Excon::Response) }
172
193
  def http_get(url)
173
194
  Dependabot::RegistryClient.get(
174
195
  url: url.to_s,
175
196
  headers: headers_for(hostname)
176
197
  )
198
+ rescue Excon::Error::Socket, Excon::Error::Timeout
199
+ raise PrivateSourceBadResponse, hostname
177
200
  end
178
201
 
202
+ sig { params(url: URI::Generic).returns(Excon::Response) }
179
203
  def http_get!(url)
180
204
  response = http_get(url)
181
205
 
@@ -185,6 +209,7 @@ module Dependabot
185
209
  response
186
210
  end
187
211
 
212
+ sig { params(path: String).returns(String) }
188
213
  def url_for(path)
189
214
  uri = URI.parse(path)
190
215
  return uri.to_s if uri.scheme == "https"
@@ -195,6 +220,7 @@ module Dependabot
195
220
  uri.to_s
196
221
  end
197
222
 
223
+ sig { params(message: String).returns(Dependabot::DependabotError) }
198
224
  def error(message)
199
225
  Dependabot::DependabotError.new(message)
200
226
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dependabot-terraform
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.295.0
4
+ version: 0.296.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dependabot
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-01-30 00:00:00.000000000 Z
11
+ date: 2025-02-11 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.295.0
19
+ version: 0.296.1
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.295.0
26
+ version: 0.296.1
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: debug
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -261,7 +261,7 @@ licenses:
261
261
  - MIT
262
262
  metadata:
263
263
  bug_tracker_uri: https://github.com/dependabot/dependabot-core/issues
264
- changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.295.0
264
+ changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.296.1
265
265
  post_install_message:
266
266
  rdoc_options: []
267
267
  require_paths: