dependabot-terraform 0.148.4 → 0.148.9

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: c8ca1ec08f424bc547f1dbc61dbec39cf74fe5f02c76b5a378e621d0d4d1c13f
4
- data.tar.gz: c2a120087174b7bfff10fae4923df97b6893b96fa47b140b8953e9a504b70651
3
+ metadata.gz: d7ec549a6b6283f3ab90166318138d130e95ee433a8b17ec48157c376b322bfe
4
+ data.tar.gz: fe1e3b9b7e348e614c5da531da53ef226b4be07db71a0744e382a5d863cbbad5
5
5
  SHA512:
6
- metadata.gz: 17cc904c667b03e8a59119279bbd6d6e773240eb5975ca468fa2c0de46912ae45ba7012decde4cea36f3b0c238ba64f9600d50ea12ca6a28b26936d099e2de35
7
- data.tar.gz: 7a2dc3715196dc4056ef3b8fbff389e4be26a993031ca0af993cb4c1c0e0b2ad2f13f5927e8f4b8c9a3b325954e034c40745c1923b811766e225c2283d6c345b
6
+ metadata.gz: 11878a5dff8b23bf22568e1dc44734578175012b41eff9b5d0d7e8e774e1040d1720150d135e570f0814234d3c663bd04ed79c0339a5188ab8cc19729167e8f9
7
+ data.tar.gz: ac36440f83d0e54ee77e7aab101790bd58cce625dd8bbe4bbad4a2a90f599cc9356a452b63ecc6784c938619afc87f7c97ec33a3e07a3d136ea6c0dd59703634
@@ -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
@@ -73,7 +73,8 @@ module Dependabot
73
73
  end
74
74
 
75
75
  def update_registry_declaration(new_req, old_req, updated_content)
76
- updated_content.sub!(registry_declaration_regex) do |regex_match|
76
+ regex = new_req[:source][:type] == "provider" ? provider_declaration_regex : registry_declaration_regex
77
+ updated_content.sub!(regex) do |regex_match|
77
78
  regex_match.sub(/^\s*version\s*=.*/) do |req_line_match|
78
79
  req_line_match.sub(old_req[:requirement], new_req[:requirement])
79
80
  end
@@ -96,6 +97,14 @@ module Dependabot
96
97
  raise "No Terraform configuration file!"
97
98
  end
98
99
 
100
+ def provider_declaration_regex
101
+ name = Regexp.escape(dependency.name)
102
+ /
103
+ ((source\s*=\s*["']#{name}["']|\s*#{name}\s*=\s*\{.*)
104
+ (?:(?!^\}).)+)
105
+ /mx
106
+ end
107
+
99
108
  def registry_declaration_regex
100
109
  /
101
110
  (?<=\{)
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.4
4
+ version: 0.148.9
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.4
19
+ version: 0.148.9
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.4
26
+ version: 0.148.9
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: byebug
29
29
  requirement: !ruby/object:Gem::Requirement