dependabot-terraform 0.148.7 → 0.148.8

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: 8abef0b1470a4358728a3683ee251009d1d3bff2d4c50b6eae8268abf010ea94
4
- data.tar.gz: f8e565b36fd766ff178ae5099dfe338104bce9942e5762bd81e6c7a16aaf041a
3
+ metadata.gz: cfde4822b690f9e4a302a1c9128ab55445f5143bc20c02de5b8ad1cafab64836
4
+ data.tar.gz: 26cb654b6ad3b04b35268d1d5b96bdb7e4203bb9dec061508892dc3537e97e90
5
5
  SHA512:
6
- metadata.gz: 71fb871a1ac7ccb2f97c9698f95eab70c0131840f56b6412967a73d76547dca04500fdab4193f74168d05f63a41bd64079b98f3d3455821bd4f653c7211f3c0b
7
- data.tar.gz: d8e8c0b3737f17e1f62703e62b48209898e9d54810a44b361027d9a2b84dcb63bfd9a8c4112dbc4f481291a98775154302dff4ca3585afebb6e8d56915e0dcf6
6
+ metadata.gz: d58215f50bafc56bd50bd6a78a897a857be6afb219e5c6140705aef283d5d4c646c29d216d725bcf1ee15714f83e5a8d1bfda8f6849ca460d5c71357dab67831
7
+ data.tar.gz: 7eea2d1dff06c749a432cf57ce1706a12fdc71867dd8cc0a30b846c68ab37113b9f3ed69927e7d4b29843215e2c26cc75f632ad257c029edd582a39fde4dc2d8
@@ -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 = 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: version, # resolved version should come from `.terraform.lock.hcl`.
98
+ package_manager: "terraform",
99
+ requirements: [
100
+ requirement: version,
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",
@@ -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,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dependabot-terraform
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.148.7
4
+ version: 0.148.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dependabot
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - '='
18
18
  - !ruby/object:Gem::Version
19
- version: 0.148.7
19
+ version: 0.148.8
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.7
26
+ version: 0.148.8
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: byebug
29
29
  requirement: !ruby/object:Gem::Requirement