dependabot-terraform 0.148.5 → 0.148.10

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5ec608a474ca6e97494d0e18ec3c0b6463d5b95793519eee2bcd624f1ad252dd
4
- data.tar.gz: a8aed805dc5f16adbe6323785293fe0e3e3e7e5a4017f3cd0e41d76c2a406ede
3
+ metadata.gz: 6ed478756c01d88049afd53fc85a20ad7ed9063791ab30058d0f917e26dc47e5
4
+ data.tar.gz: 72510b0297858ce6b4d417542100a6697d546a4e0e4d0d405e55a1e51796fb43
5
5
  SHA512:
6
- metadata.gz: fc4a3cd31273d65e463f0adf47fdea2f01e4af563e14a94466e8bff87f16fd1ca384bae8aefcaf5f709e12295ba3e613f90323a5f847491bab794aeb58d9370d
7
- data.tar.gz: 386f1c035c64e6e1680b1b8c6e7adde3805b11ae8aa6b07b822b21d3ff982b21cdbccf52e33571e368297aa848be5e051935703756f53bf5e652143a1de2b3de
6
+ metadata.gz: 8c2c0a8a731d1ff0baf8ce05af819e819702be48302173d12e6973b84af8e304fe75cdb323198f28d4a20358c836a8edb699659bf5db3232944334cd76f7e735
7
+ data.tar.gz: 4a651ed95e4d097100595c457146faba5e097ea12b1f7ebecbd38156bd55c7f51ec07fdb84c0a07ff8defdcd4546c92376571ffc5b3e322bfd68402e33ddeec0
@@ -20,6 +20,10 @@ module Dependabot
20
20
  include FileSelector
21
21
 
22
22
  ARCHIVE_EXTENSIONS = %w(.zip .tbz2 .tgz .txz).freeze
23
+ DEFAULT_REGISTRY = "registry.terraform.io"
24
+ DEFAULT_NAMESPACE = "hashicorp"
25
+ # https://www.terraform.io/docs/language/providers/requirements.html#source-addresses
26
+ PROVIDER_SOURCE_ADDRESS = %r{\A((?<hostname>.+)/)?(?<namespace>.+)/(?<name>.+)\z}.freeze
23
27
 
24
28
  def parse
25
29
  dependency_set = DependencySet.new
@@ -27,14 +31,14 @@ module Dependabot
27
31
  terraform_files.each do |file|
28
32
  modules = parsed_file(file).fetch("module", {})
29
33
  modules.each do |name, details|
30
- dependency_set << build_terraform_dependency(file, name, details, false)
34
+ dependency_set << build_terraform_dependency(file, name, details)
31
35
  end
32
36
 
33
37
  parsed_file(file).fetch("terraform", []).each do |terraform|
34
38
  required_providers = terraform.fetch("required_providers", {})
35
39
  required_providers.each do |provider|
36
40
  provider.each do |name, details|
37
- dependency_set << build_terraform_dependency(file, name, details, true)
41
+ dependency_set << build_provider_dependency(file, name, details)
38
42
  end
39
43
  end
40
44
  end
@@ -54,10 +58,10 @@ module Dependabot
54
58
 
55
59
  private
56
60
 
57
- def build_terraform_dependency(file, name, details, provider)
58
- details = details.is_a?(Array) ? details.first : details
61
+ def build_terraform_dependency(file, name, details)
62
+ details = details.first
59
63
 
60
- source = source_from(details, provider)
64
+ source = source_from(details)
61
65
  dep_name = case source[:type]
62
66
  when "registry" then source[:module_identifier]
63
67
  when "provider" then details["source"]
@@ -82,8 +86,31 @@ module Dependabot
82
86
  )
83
87
  end
84
88
 
89
+ def build_provider_dependency(file, name, details = {})
90
+ source_address = details.fetch("source", nil)
91
+ version_req = details["version"]&.strip
92
+ hostname, namespace, name = provider_source_from(source_address, name)
93
+ dependency_name = source_address ? "#{namespace}/#{name}" : name
94
+
95
+ Dependency.new(
96
+ name: dependency_name,
97
+ version: determine_version_for(hostname, namespace, name, version_req),
98
+ package_manager: "terraform",
99
+ requirements: [
100
+ requirement: version_req,
101
+ groups: [],
102
+ file: file.name,
103
+ source: {
104
+ type: "provider",
105
+ registry_hostname: hostname,
106
+ module_identifier: "#{namespace}/#{name}"
107
+ }
108
+ ]
109
+ )
110
+ end
111
+
85
112
  def build_terragrunt_dependency(file, details)
86
- source = source_from(details, false)
113
+ source = source_from(details)
87
114
  dep_name =
88
115
  if Source.from_url(source[:url])
89
116
  Source.from_url(source[:url]).repo
@@ -107,7 +134,7 @@ module Dependabot
107
134
  end
108
135
 
109
136
  # Full docs at https://www.terraform.io/docs/modules/sources.html
110
- def source_from(details_hash, provider)
137
+ def source_from(details_hash)
111
138
  raw_source = details_hash.fetch("source")
112
139
  bare_source = get_proxied_source(raw_source)
113
140
 
@@ -118,23 +145,28 @@ module Dependabot
118
145
  when :github, :bitbucket, :git
119
146
  git_source_details_from(bare_source)
120
147
  when :registry
121
- registry_source_details_from(bare_source, provider)
148
+ registry_source_details_from(bare_source)
122
149
  end
123
150
 
124
151
  source_details[:proxy_url] = raw_source if raw_source != bare_source
125
152
  source_details
126
153
  end
127
154
 
128
- def registry_source_details_from(source_string, provider)
155
+ def provider_source_from(source_address, name)
156
+ return [DEFAULT_REGISTRY, DEFAULT_NAMESPACE, name] unless source_address
157
+
158
+ matches = source_address.match(PROVIDER_SOURCE_ADDRESS)
159
+ [
160
+ matches[:hostname] || DEFAULT_REGISTRY,
161
+ matches[:namespace],
162
+ matches[:name] || name
163
+ ]
164
+ end
165
+
166
+ def registry_source_details_from(source_string)
129
167
  parts = source_string.split("//").first.split("/")
130
168
 
131
- if provider && parts.count == 2
132
- {
133
- "type": "provider",
134
- "registry_hostname": "registry.terraform.io",
135
- "module_identifier": source_string
136
- }
137
- elsif parts.count == 3
169
+ if parts.count == 3
138
170
  {
139
171
  type: "registry",
140
172
  registry_hostname: "registry.terraform.io",
@@ -300,6 +332,23 @@ module Dependabot
300
332
 
301
333
  raise "No Terraform configuration file!"
302
334
  end
335
+
336
+ def determine_version_for(hostname, namespace, name, constraint)
337
+ return constraint if constraint&.match?(/\A\d/)
338
+
339
+ lock_file_content.
340
+ dig("provider", "#{hostname}/#{namespace}/#{name}", 0, "version")
341
+ end
342
+
343
+ def lock_file_content
344
+ @lock_file_content ||=
345
+ begin
346
+ lock_file = dependency_files.find do |file|
347
+ file.name == ".terraform.lock.hcl"
348
+ end
349
+ lock_file ? parsed_file(lock_file) : {}
350
+ end
351
+ end
303
352
  end
304
353
  end
305
354
  end
@@ -98,9 +98,9 @@ module Dependabot
98
98
  end
99
99
 
100
100
  def provider_declaration_regex
101
+ name = Regexp.escape(dependency.name)
101
102
  /
102
- (?:required_providers\s\{)*
103
- (source\s*=\s*["']#{Regexp.escape(dependency.name)}["']
103
+ ((source\s*=\s*["']#{name}["']|\s*#{name}\s*=\s*\{.*)
104
104
  (?:(?!^\}).)+)
105
105
  /mx
106
106
  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.148.5
4
+ version: 0.148.10
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-21 00:00:00.000000000 Z
11
+ date: 2021-05-26 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.148.5
19
+ version: 0.148.10
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.148.5
26
+ version: 0.148.10
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: byebug
29
29
  requirement: !ruby/object:Gem::Requirement