dependabot-terraform 0.149.3 → 0.149.4

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: c3d1b1f161ca1de8f1f6f728cc4d28f700ea12f4407870609729fd235ad029d5
4
- data.tar.gz: 2ca0a7c87535de7b22604571e9e48a1e2e51e2027a4becab2ae65a73e29603a0
3
+ metadata.gz: e9de51bfa366e94b80943405b7083988d76080444dc177b57d9a8fd425e9292f
4
+ data.tar.gz: 1d4794c8175cac535813c12a8e017e3b8e3c4f96068a91e5db3c75db5945ceba
5
5
  SHA512:
6
- metadata.gz: c26e03c55858649e5ae2f9f7d881b7ce5ff6ee23e8bf9f66892641273cad9558af0493c45f37a9f63d74d92d50036ab6345e3bc6e5b8474d8d3257b175f73e15
7
- data.tar.gz: 359f7ac0b27e267b395352b390379713db6caa45067a452c674318e678884fab25227693dc22153a2a867747f4b7d5e00fa94d32237f6e11b2dd90e8c3088a59
6
+ metadata.gz: 74431e13c158375f439e50127078fd7db31b56387cf3a2ff5d013ebff91427642c2b67874dd94a22e83d336f58efddcb6ec9edeb4181d7cadc25fe759fe12fcc
7
+ data.tar.gz: 384487d5ad087fee58324485f1c288ae7803f550e6b763128efadc883999931dd233182f56afc8c26ec2030d20179b234d32b0c96b535722c72fedf4cfa0e49e
@@ -99,19 +99,19 @@ module Dependabot
99
99
 
100
100
  def provider_declaration_regex
101
101
  name = Regexp.escape(dependency.name)
102
- /
103
- ((source\s*=\s*["']#{name}["']|\s*#{name}\s*=\s*\{.*)
102
+ %r{
103
+ ((source\s*=\s*["'](#{Regexp.escape(registry_host_for(dependency))}/)?#{name}["']|\s*#{name}\s*=\s*\{.*)
104
104
  (?:(?!^\}).)+)
105
- /mx
105
+ }mx
106
106
  end
107
107
 
108
108
  def registry_declaration_regex
109
- /
109
+ %r{
110
110
  (?<=\{)
111
111
  (?:(?!^\}).)*
112
- source\s*=\s*["']#{Regexp.escape(dependency.name)}["']
112
+ source\s*=\s*["'](#{Regexp.escape(registry_host_for(dependency))}/)?#{Regexp.escape(dependency.name)}["']
113
113
  (?:(?!^\}).)*
114
- /mx
114
+ }mx
115
115
  end
116
116
 
117
117
  def git_declaration_regex(filename)
@@ -126,6 +126,11 @@ module Dependabot
126
126
  (?:(?!^\}).)*
127
127
  /mx
128
128
  end
129
+
130
+ def registry_host_for(dependency)
131
+ source = dependency.requirements.map { |r| r[:source] }.compact.first
132
+ source[:registry_hostname] || source["registry_hostname"] || "registry.terraform.io"
133
+ end
129
134
  end
130
135
  end
131
136
  end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "dependabot/dependency"
4
+ require "dependabot/errors"
4
5
  require "dependabot/source"
5
6
  require "dependabot/terraform/version"
6
7
 
@@ -24,11 +25,12 @@ module Dependabot
24
25
  # @param identifier [String] the identifier for the dependency, i.e:
25
26
  # "hashicorp/aws"
26
27
  # @return [Array<Dependabot::Terraform::Version>]
27
- # @raise [RuntimeError] when the versions cannot be retrieved
28
+ # @raise [Dependabot::DependabotError] when the versions cannot be retrieved
28
29
  def all_provider_versions(identifier:)
29
- response = get(endpoint: "providers/#{identifier}/versions")
30
+ base_url = service_url_for("providers.v1")
31
+ response = http_get!(URI.join(base_url, "#{identifier}/versions"))
30
32
 
31
- JSON.parse(response).
33
+ JSON.parse(response.body).
32
34
  fetch("versions").
33
35
  map { |release| version_class.new(release.fetch("version")) }
34
36
  end
@@ -39,11 +41,12 @@ module Dependabot
39
41
  # @param identifier [String] the identifier for the dependency, i.e:
40
42
  # "hashicorp/consul/aws"
41
43
  # @return [Array<Dependabot::Terraform::Version>]
42
- # @raise [RuntimeError] when the versions cannot be retrieved
44
+ # @raise [Dependabot::DependabotError] when the versions cannot be retrieved
43
45
  def all_module_versions(identifier:)
44
- response = get(endpoint: "modules/#{identifier}/versions")
46
+ base_url = service_url_for("modules.v1")
47
+ response = http_get!(URI.join(base_url, "#{identifier}/versions"))
45
48
 
46
- JSON.parse(response).
49
+ JSON.parse(response.body).
47
50
  fetch("modules").first.fetch("versions").
48
51
  map { |release| version_class.new(release.fetch("version")) }
49
52
  end
@@ -56,40 +59,33 @@ module Dependabot
56
59
  # @param dependency [Dependabot::Dependency] the dependency who's source
57
60
  # we're attempting to find
58
61
  # @return Dependabot::Source
59
- # @raise [RuntimeError] when the source cannot be retrieved
62
+ # @raise [Dependabot::DependabotError] when the source cannot be retrieved
60
63
  def source(dependency:)
61
64
  type = dependency.requirements.first[:source][:type]
62
- endpoint = if type == "registry"
63
- "modules/#{dependency.name}/#{dependency.version}"
64
- elsif type == "provider"
65
- "providers/#{dependency.name}/#{dependency.version}"
66
- else
67
- raise "Invalid source type"
68
- end
69
- response = get(endpoint: endpoint)
70
-
71
- source_url = JSON.parse(response).fetch("source")
65
+ base_url = service_url_for(service_key_for(type))
66
+ response = http_get!(URI.join(base_url, "#{dependency.name}/#{dependency.version}"))
67
+
68
+ source_url = JSON.parse(response.body).fetch("source")
72
69
  Source.from_url(source_url) if source_url
73
70
  end
74
71
 
72
+ # Perform service discovery and return the absolute URL for
73
+ # the requested service.
74
+ # https://www.terraform.io/docs/internals/remote-service-discovery.html
75
+ #
76
+ # @param service_key [String] the service type described in https://www.terraform.io/docs/internals/remote-service-discovery.html#supported-services
77
+ # @param return String
78
+ # @raise [Dependabot::DependabotError] when the service is not available
79
+ def service_url_for(service_key)
80
+ url_for(services.fetch(service_key))
81
+ rescue KeyError
82
+ raise error("Host does not support required Terraform-native service")
83
+ end
84
+
75
85
  private
76
86
 
77
87
  attr_reader :hostname, :tokens
78
88
 
79
- def get(endpoint:)
80
- url = "https://#{hostname}/v1/#{endpoint}"
81
-
82
- response = Excon.get(
83
- url,
84
- idempotent: true,
85
- **SharedHelpers.excon_defaults(headers: headers_for(hostname))
86
- )
87
-
88
- raise "Response from registry was #{response.status}" unless response.status == 200
89
-
90
- response.body
91
- end
92
-
93
89
  def version_class
94
90
  Version
95
91
  end
@@ -98,6 +94,51 @@ module Dependabot
98
94
  token = tokens[hostname]
99
95
  token ? { "Authorization" => "Bearer #{token}" } : {}
100
96
  end
97
+
98
+ def services
99
+ @services ||=
100
+ begin
101
+ response = http_get(url_for("/.well-known/terraform.json"))
102
+ response.status == 200 ? JSON.parse(response.body) : {}
103
+ end
104
+ end
105
+
106
+ def service_key_for(type)
107
+ case type
108
+ when "module", "modules", "registry"
109
+ "modules.v1"
110
+ when "provider", "providers"
111
+ "providers.v1"
112
+ else
113
+ raise error("Invalid source type")
114
+ end
115
+ end
116
+
117
+ def http_get(url)
118
+ Excon.get(url.to_s, idempotent: true, **SharedHelpers.excon_defaults(headers: headers_for(hostname)))
119
+ end
120
+
121
+ def http_get!(url)
122
+ response = http_get(url)
123
+
124
+ raise error("Response from registry was #{response.status}") unless response.status == 200
125
+
126
+ response
127
+ end
128
+
129
+ def url_for(path)
130
+ uri = URI.parse(path)
131
+ return uri.to_s if uri.scheme == "https"
132
+ raise error("Unsupported scheme provided") if uri.host && uri.scheme
133
+
134
+ uri.host = hostname
135
+ uri.scheme = "https"
136
+ uri.to_s
137
+ end
138
+
139
+ def error(message)
140
+ Dependabot::DependabotError.new(message)
141
+ end
101
142
  end
102
143
  end
103
144
  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.149.3
4
+ version: 0.149.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dependabot
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-05-28 00:00:00.000000000 Z
11
+ date: 2021-06-01 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.149.3
19
+ version: 0.149.4
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.149.3
26
+ version: 0.149.4
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: byebug
29
29
  requirement: !ruby/object:Gem::Requirement