tfdsl 0.1.11 → 0.2.0

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.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.rubocop.yml +24 -21
  4. data/CLAUDE.md +86 -0
  5. data/Gemfile +7 -3
  6. data/README.md +144 -35
  7. data/Rakefile +4 -5
  8. data/bin/console +3 -9
  9. data/lib/terraform_dsl/action.rb +7 -0
  10. data/lib/terraform_dsl/block.rb +64 -0
  11. data/lib/terraform_dsl/check.rb +7 -0
  12. data/lib/terraform_dsl/data_source.rb +7 -0
  13. data/lib/terraform_dsl/ephemeral.rb +7 -0
  14. data/lib/terraform_dsl/formatter.rb +26 -0
  15. data/lib/terraform_dsl/import.rb +8 -0
  16. data/lib/terraform_dsl/json_syntax.rb +33 -0
  17. data/lib/terraform_dsl/locals.rb +7 -0
  18. data/lib/terraform_dsl/moved.rb +8 -0
  19. data/lib/terraform_dsl/output.rb +7 -0
  20. data/lib/terraform_dsl/provider.rb +7 -0
  21. data/lib/terraform_dsl/removed.rb +8 -0
  22. data/lib/terraform_dsl/resource.rb +7 -0
  23. data/lib/terraform_dsl/stack.rb +40 -0
  24. data/lib/terraform_dsl/template.rb +74 -0
  25. data/lib/terraform_dsl/terraform.rb +7 -0
  26. data/lib/terraform_dsl/tfmodule.rb +7 -0
  27. data/lib/terraform_dsl/variable.rb +8 -0
  28. data/lib/terraform_dsl/version.rb +5 -0
  29. data/lib/terraform_dsl.rb +34 -0
  30. data/lib/tfdsl.rb +5 -29
  31. data/tfdsl.gemspec +9 -28
  32. metadata +32 -155
  33. data/.travis.yml +0 -8
  34. data/Gemfile.lock +0 -73
  35. data/lib/tfdsl/block.rb +0 -88
  36. data/lib/tfdsl/data_formatter.rb +0 -63
  37. data/lib/tfdsl/data_source.rb +0 -4
  38. data/lib/tfdsl/formatter.rb +0 -77
  39. data/lib/tfdsl/kind_translator.rb +0 -20
  40. data/lib/tfdsl/locals.rb +0 -4
  41. data/lib/tfdsl/output.rb +0 -4
  42. data/lib/tfdsl/provider.rb +0 -4
  43. data/lib/tfdsl/resource.rb +0 -4
  44. data/lib/tfdsl/stack.rb +0 -36
  45. data/lib/tfdsl/template.rb +0 -46
  46. data/lib/tfdsl/terraform.rb +0 -4
  47. data/lib/tfdsl/tfmodule.rb +0 -4
  48. data/lib/tfdsl/variable.rb +0 -4
  49. data/lib/tfdsl/version.rb +0 -3
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TerraformDSL
4
+ class Resource < Block
5
+ KEYWORD = 'resource'
6
+ end
7
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TerraformDSL
4
+ # A collection of top level terraform blocks, rendered as one .tf file.
5
+ class Stack
6
+ BLOCKS = {
7
+ terraform: Terraform, provider: Provider, variable: Variable, locals: Locals,
8
+ tfmodule: TFModule, datasource: DataSource, resource: Resource, output: Output,
9
+ moved: Moved, import: Import, removed: Removed, check: Check,
10
+ ephemeral: Ephemeral, action: Action
11
+ }.freeze
12
+
13
+ def initialize(&block)
14
+ @objects = []
15
+ instance_eval(&block) if block
16
+ end
17
+
18
+ BLOCKS.each do |name, cls|
19
+ define_method(name) do |type = nil, *labels, &block|
20
+ @objects << cls.new(type, *labels, &block)
21
+ @objects.last
22
+ end
23
+ end
24
+ alias data datasource
25
+
26
+ def to_s
27
+ @objects.map(&:to_tf).join("\n")
28
+ end
29
+
30
+ def to_h
31
+ @objects.each_with_object({}) do |block, hash|
32
+ JsonSyntax.insert(hash, [block.class::KEYWORD, block.__type__, *block.__labels__].compact, block.to_h)
33
+ end
34
+ end
35
+
36
+ def to_json(*)
37
+ JSON.pretty_generate(to_h)
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,74 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TerraformDSL
4
+ # Renders Ruby values as HCL values.
5
+ #
6
+ # String -> "quoted" (heredoc when it ends with a newline)
7
+ # Symbol -> raw expression, e.g. :'aws_vpc.main.id' or :string
8
+ # Numeric, true, false -> as is
9
+ # nil -> null
10
+ # Array -> [ ... ]
11
+ # Hash -> { key = value }
12
+ module Template
13
+ module_function
14
+
15
+ IDENTIFIER = /\A[A-Za-z_][\w-]*\z/.freeze
16
+ ESCAPES = { '"' => '\"', '\\' => '\\\\', "\n" => '\n', "\r" => '\r', "\t" => '\t' }.freeze
17
+
18
+ def value(value, depth = 0)
19
+ case value
20
+ when Hash then map(value, depth)
21
+ when Array then list(value, depth)
22
+ when String then string(value, depth)
23
+ when nil then 'null'
24
+ else value.to_s # Symbol (raw expression), Numeric, true, false
25
+ end
26
+ end
27
+
28
+ def string(str, depth = 0)
29
+ return heredoc(str, depth) if str.end_with?("\n")
30
+
31
+ %("#{str.gsub(/["\\\n\r\t]/, ESCAPES)}")
32
+ end
33
+
34
+ def heredoc(str, depth)
35
+ pad = INDENT * depth
36
+ "<<-EOT\n#{str.gsub(/^(?!$)/, pad + INDENT)}#{pad}EOT"
37
+ end
38
+
39
+ def list(array, depth)
40
+ return '[]' if array.empty?
41
+
42
+ pad = INDENT * depth
43
+ items = array.map { |v| "#{pad}#{INDENT}#{value(v, depth + 1)}" }
44
+ "[\n#{items.join(",\n")}\n#{pad}]"
45
+ end
46
+
47
+ def map(hash, depth)
48
+ return '{}' if hash.empty?
49
+
50
+ pad = INDENT * depth
51
+ items = hash.map { |k, v| [key(k), value(v, depth + 1)] }
52
+ "{\n#{assignments(items, pad + INDENT).join("\n")}\n#{pad}}"
53
+ end
54
+
55
+ # Renders [name, value] pairs as "name = value" lines, aligning the equals
56
+ # signs the way terraform fmt does: consecutive single-line values share a
57
+ # column, a multi-line value ({ or [) breaks the run and is not aligned.
58
+ def assignments(pairs, pad)
59
+ pairs.slice_when { |a, b| multiline?(a[1]) || multiline?(b[1]) }.flat_map do |run|
60
+ width = run.map { |name, _| name.size }.max
61
+ run.map { |name, value| "#{pad}#{name.ljust(width)} = #{value}" }
62
+ end
63
+ end
64
+
65
+ def multiline?(value)
66
+ value.start_with?("{\n", "[\n")
67
+ end
68
+
69
+ def key(key)
70
+ key = key.to_s
71
+ key.match?(IDENTIFIER) ? key : string(key)
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TerraformDSL
4
+ class Terraform < Block
5
+ KEYWORD = 'terraform'
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TerraformDSL
4
+ class TFModule < Block
5
+ KEYWORD = 'module'
6
+ end
7
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TerraformDSL
4
+ class Variable < Block
5
+ KEYWORD = 'variable'
6
+ STATIC_REFS = (Block::STATIC_REFS + %w[type]).freeze
7
+ end
8
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TerraformDSL
4
+ VERSION = '0.2.0'
5
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'json'
4
+ require_relative 'terraform_dsl/version'
5
+
6
+ # A Chef like DSL that renders Terraform (HCL) configuration.
7
+ module TerraformDSL
8
+ INDENT = ' '
9
+
10
+ require_relative 'terraform_dsl/template'
11
+ require_relative 'terraform_dsl/json_syntax'
12
+ require_relative 'terraform_dsl/formatter'
13
+ require_relative 'terraform_dsl/block'
14
+ require_relative 'terraform_dsl/terraform'
15
+ require_relative 'terraform_dsl/provider'
16
+ require_relative 'terraform_dsl/variable'
17
+ require_relative 'terraform_dsl/locals'
18
+ require_relative 'terraform_dsl/tfmodule'
19
+ require_relative 'terraform_dsl/data_source'
20
+ require_relative 'terraform_dsl/resource'
21
+ require_relative 'terraform_dsl/output'
22
+ require_relative 'terraform_dsl/moved'
23
+ require_relative 'terraform_dsl/import'
24
+ require_relative 'terraform_dsl/removed'
25
+ require_relative 'terraform_dsl/check'
26
+ require_relative 'terraform_dsl/ephemeral'
27
+ require_relative 'terraform_dsl/action'
28
+ require_relative 'terraform_dsl/stack'
29
+
30
+ # Shortcut for Stack.new
31
+ def self.stack(&block)
32
+ Stack.new(&block)
33
+ end
34
+ end
data/lib/tfdsl.rb CHANGED
@@ -1,31 +1,7 @@
1
- require 'tfdsl/version'
2
- require 'yaml'
3
- require 'erb'
1
+ # frozen_string_literal: true
4
2
 
5
- # Terraform DSL
6
- module TFDSL
7
- module_function
3
+ # Entry point for the tfdsl gem. TFDSL is kept as an alias for code written
4
+ # against tfdsl 0.1.x.
5
+ require_relative 'terraform_dsl'
8
6
 
9
- LIB_DIR = "#{__dir__}/tfdsl/".freeze
10
-
11
- require "#{LIB_DIR}/template"
12
- require "#{LIB_DIR}/data_formatter"
13
- require "#{LIB_DIR}/kind_translator"
14
- require "#{LIB_DIR}/formatter"
15
- require "#{LIB_DIR}/block"
16
- require "#{LIB_DIR}/resource"
17
- require "#{LIB_DIR}/variable"
18
- require "#{LIB_DIR}/output"
19
- require "#{LIB_DIR}/data_source"
20
- require "#{LIB_DIR}/provider"
21
- require "#{LIB_DIR}/tfmodule"
22
- require "#{LIB_DIR}/locals"
23
- require "#{LIB_DIR}/terraform"
24
- require "#{LIB_DIR}/stack"
25
-
26
- def stack(&block)
27
- Stack.new do
28
- instance_eval(&block) if block_given?
29
- end
30
- end
31
- end
7
+ TFDSL = TerraformDSL
data/tfdsl.gemspec CHANGED
@@ -1,43 +1,24 @@
1
+ # frozen_string_literal: true
2
+
1
3
  lib = File.expand_path('lib', __dir__)
2
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
- require 'tfdsl/version'
5
+ require 'terraform_dsl/version'
4
6
 
5
7
  Gem::Specification.new do |spec|
6
8
  spec.name = 'tfdsl'
7
- spec.version = TFDSL::VERSION
9
+ spec.version = TerraformDSL::VERSION
8
10
  spec.authors = ['Tiago Lopo']
9
11
  spec.email = ['tlopo@github.com']
10
12
 
11
13
  spec.summary = 'A chef like DSL for terraform'
12
- spec.description = 'A chef like DSL for terraform'
13
- spec.homepage = 'https://github.com/tlopo-ruby/tfdsl.git'
14
+ spec.description = 'A Ruby DSL that renders Terraform (HCL) configuration'
15
+ spec.homepage = 'https://github.com/tlopo-ruby/terraform-dsl'
14
16
  spec.license = 'MIT'
17
+ spec.required_ruby_version = '>= 2.7'
18
+ spec.metadata['rubygems_mfa_required'] = 'true'
15
19
 
16
- # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
17
- # to allow pushing to a single host or delete this section to allow pushing to any host.
18
- if spec.respond_to?(:metadata)
19
- # spec.metadata["allowed_push_host"] = "TODO: Set to 'http://mygemserver.com'"
20
- else
21
- raise 'RubyGems 2.0 or newer is required to protect against ' \
22
- 'public gem pushes.'
23
- end
24
-
25
- # Specify which files should be added to the gem when it is released.
26
- # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
27
20
  spec.files = Dir.chdir(File.expand_path(__dir__)) do
28
- `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
21
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features|\.github)/}) }
29
22
  end
30
- spec.bindir = 'exe'
31
- spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
32
23
  spec.require_paths = ['lib']
33
-
34
- spec.add_dependency 'deep_merge', '~> 1.2'
35
- spec.add_development_dependency 'bundler', '~> 1.16'
36
- spec.add_development_dependency 'coveralls', '~> 0.8'
37
- spec.add_development_dependency 'minitest', '~> 5.0'
38
- spec.add_development_dependency 'pry', '~> 0.12'
39
- spec.add_development_dependency 'pry-coolline', '~> 0.2'
40
- spec.add_development_dependency 'rake', '~> 13.0'
41
- spec.add_development_dependency 'rubocop', '~> 0.63'
42
- spec.add_development_dependency 'simplecov', '~> 0.16'
43
24
  end
metadata CHANGED
@@ -1,142 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tfdsl
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.11
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tiago Lopo
8
- autorequire:
9
- bindir: exe
8
+ bindir: bin
10
9
  cert_chain: []
11
- date: 2020-10-15 00:00:00.000000000 Z
12
- dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: deep_merge
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - "~>"
18
- - !ruby/object:Gem::Version
19
- version: '1.2'
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - "~>"
25
- - !ruby/object:Gem::Version
26
- version: '1.2'
27
- - !ruby/object:Gem::Dependency
28
- name: bundler
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - "~>"
32
- - !ruby/object:Gem::Version
33
- version: '1.16'
34
- type: :development
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - "~>"
39
- - !ruby/object:Gem::Version
40
- version: '1.16'
41
- - !ruby/object:Gem::Dependency
42
- name: coveralls
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - "~>"
46
- - !ruby/object:Gem::Version
47
- version: '0.8'
48
- type: :development
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - "~>"
53
- - !ruby/object:Gem::Version
54
- version: '0.8'
55
- - !ruby/object:Gem::Dependency
56
- name: minitest
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - "~>"
60
- - !ruby/object:Gem::Version
61
- version: '5.0'
62
- type: :development
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - "~>"
67
- - !ruby/object:Gem::Version
68
- version: '5.0'
69
- - !ruby/object:Gem::Dependency
70
- name: pry
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - "~>"
74
- - !ruby/object:Gem::Version
75
- version: '0.12'
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - "~>"
81
- - !ruby/object:Gem::Version
82
- version: '0.12'
83
- - !ruby/object:Gem::Dependency
84
- name: pry-coolline
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - "~>"
88
- - !ruby/object:Gem::Version
89
- version: '0.2'
90
- type: :development
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - "~>"
95
- - !ruby/object:Gem::Version
96
- version: '0.2'
97
- - !ruby/object:Gem::Dependency
98
- name: rake
99
- requirement: !ruby/object:Gem::Requirement
100
- requirements:
101
- - - "~>"
102
- - !ruby/object:Gem::Version
103
- version: '13.0'
104
- type: :development
105
- prerelease: false
106
- version_requirements: !ruby/object:Gem::Requirement
107
- requirements:
108
- - - "~>"
109
- - !ruby/object:Gem::Version
110
- version: '13.0'
111
- - !ruby/object:Gem::Dependency
112
- name: rubocop
113
- requirement: !ruby/object:Gem::Requirement
114
- requirements:
115
- - - "~>"
116
- - !ruby/object:Gem::Version
117
- version: '0.63'
118
- type: :development
119
- prerelease: false
120
- version_requirements: !ruby/object:Gem::Requirement
121
- requirements:
122
- - - "~>"
123
- - !ruby/object:Gem::Version
124
- version: '0.63'
125
- - !ruby/object:Gem::Dependency
126
- name: simplecov
127
- requirement: !ruby/object:Gem::Requirement
128
- requirements:
129
- - - "~>"
130
- - !ruby/object:Gem::Version
131
- version: '0.16'
132
- type: :development
133
- prerelease: false
134
- version_requirements: !ruby/object:Gem::Requirement
135
- requirements:
136
- - - "~>"
137
- - !ruby/object:Gem::Version
138
- version: '0.16'
139
- description: A chef like DSL for terraform
10
+ date: 2026-10-11 00:00:00.000000000 Z
11
+ dependencies: []
12
+ description: A Ruby DSL that renders Terraform (HCL) configuration
140
13
  email:
141
14
  - tlopo@github.com
142
15
  executables: []
@@ -145,37 +18,42 @@ extra_rdoc_files: []
145
18
  files:
146
19
  - ".gitignore"
147
20
  - ".rubocop.yml"
148
- - ".travis.yml"
21
+ - CLAUDE.md
149
22
  - CODE_OF_CONDUCT.md
150
23
  - Gemfile
151
- - Gemfile.lock
152
24
  - LICENSE.txt
153
25
  - README.md
154
26
  - Rakefile
155
27
  - bin/console
156
28
  - bin/setup
29
+ - lib/terraform_dsl.rb
30
+ - lib/terraform_dsl/action.rb
31
+ - lib/terraform_dsl/block.rb
32
+ - lib/terraform_dsl/check.rb
33
+ - lib/terraform_dsl/data_source.rb
34
+ - lib/terraform_dsl/ephemeral.rb
35
+ - lib/terraform_dsl/formatter.rb
36
+ - lib/terraform_dsl/import.rb
37
+ - lib/terraform_dsl/json_syntax.rb
38
+ - lib/terraform_dsl/locals.rb
39
+ - lib/terraform_dsl/moved.rb
40
+ - lib/terraform_dsl/output.rb
41
+ - lib/terraform_dsl/provider.rb
42
+ - lib/terraform_dsl/removed.rb
43
+ - lib/terraform_dsl/resource.rb
44
+ - lib/terraform_dsl/stack.rb
45
+ - lib/terraform_dsl/template.rb
46
+ - lib/terraform_dsl/terraform.rb
47
+ - lib/terraform_dsl/tfmodule.rb
48
+ - lib/terraform_dsl/variable.rb
49
+ - lib/terraform_dsl/version.rb
157
50
  - lib/tfdsl.rb
158
- - lib/tfdsl/block.rb
159
- - lib/tfdsl/data_formatter.rb
160
- - lib/tfdsl/data_source.rb
161
- - lib/tfdsl/formatter.rb
162
- - lib/tfdsl/kind_translator.rb
163
- - lib/tfdsl/locals.rb
164
- - lib/tfdsl/output.rb
165
- - lib/tfdsl/provider.rb
166
- - lib/tfdsl/resource.rb
167
- - lib/tfdsl/stack.rb
168
- - lib/tfdsl/template.rb
169
- - lib/tfdsl/terraform.rb
170
- - lib/tfdsl/tfmodule.rb
171
- - lib/tfdsl/variable.rb
172
- - lib/tfdsl/version.rb
173
51
  - tfdsl.gemspec
174
- homepage: https://github.com/tlopo-ruby/tfdsl.git
52
+ homepage: https://github.com/tlopo-ruby/terraform-dsl
175
53
  licenses:
176
54
  - MIT
177
- metadata: {}
178
- post_install_message:
55
+ metadata:
56
+ rubygems_mfa_required: 'true'
179
57
  rdoc_options: []
180
58
  require_paths:
181
59
  - lib
@@ -183,15 +61,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
183
61
  requirements:
184
62
  - - ">="
185
63
  - !ruby/object:Gem::Version
186
- version: '0'
64
+ version: '2.7'
187
65
  required_rubygems_version: !ruby/object:Gem::Requirement
188
66
  requirements:
189
67
  - - ">="
190
68
  - !ruby/object:Gem::Version
191
69
  version: '0'
192
70
  requirements: []
193
- rubygems_version: 3.1.2
194
- signing_key:
71
+ rubygems_version: 3.6.2
195
72
  specification_version: 4
196
73
  summary: A chef like DSL for terraform
197
74
  test_files: []
data/.travis.yml DELETED
@@ -1,8 +0,0 @@
1
- language: ruby
2
- rvm:
3
- - "2.6.0"
4
- sudo: false
5
- cache: bundler
6
- script: bundle exec rake $TASK
7
- env:
8
- - TASK=test_with_coveralls
data/Gemfile.lock DELETED
@@ -1,73 +0,0 @@
1
- PATH
2
- remote: .
3
- specs:
4
- tfdsl (0.1.11)
5
- deep_merge (~> 1.2)
6
-
7
- GEM
8
- remote: https://rubygems.org/
9
- specs:
10
- ast (2.4.0)
11
- coderay (1.1.2)
12
- coolline (0.5.0)
13
- unicode_utils (~> 1.4)
14
- coveralls (0.8.22)
15
- json (>= 1.8, < 3)
16
- simplecov (~> 0.16.1)
17
- term-ansicolor (~> 1.3)
18
- thor (~> 0.19.4)
19
- tins (~> 1.6)
20
- deep_merge (1.2.1)
21
- docile (1.3.1)
22
- jaro_winkler (1.5.2)
23
- json (2.1.0)
24
- method_source (0.9.2)
25
- minitest (5.11.3)
26
- parallel (1.13.0)
27
- parser (2.6.0.0)
28
- ast (~> 2.4.0)
29
- powerpack (0.1.2)
30
- pry (0.12.2)
31
- coderay (~> 1.1.0)
32
- method_source (~> 0.9.0)
33
- pry-coolline (0.2.5)
34
- coolline (~> 0.5)
35
- rainbow (3.0.0)
36
- rake (13.0.1)
37
- rubocop (0.63.1)
38
- jaro_winkler (~> 1.5.1)
39
- parallel (~> 1.10)
40
- parser (>= 2.5, != 2.5.1.1)
41
- powerpack (~> 0.1)
42
- rainbow (>= 2.2.2, < 4.0)
43
- ruby-progressbar (~> 1.7)
44
- unicode-display_width (~> 1.4.0)
45
- ruby-progressbar (1.10.0)
46
- simplecov (0.16.1)
47
- docile (~> 1.1)
48
- json (>= 1.8, < 3)
49
- simplecov-html (~> 0.10.0)
50
- simplecov-html (0.10.2)
51
- term-ansicolor (1.7.1)
52
- tins (~> 1.0)
53
- thor (0.19.4)
54
- tins (1.20.2)
55
- unicode-display_width (1.4.1)
56
- unicode_utils (1.4.0)
57
-
58
- PLATFORMS
59
- ruby
60
-
61
- DEPENDENCIES
62
- bundler (~> 1.16)
63
- coveralls (~> 0.8)
64
- minitest (~> 5.0)
65
- pry (~> 0.12)
66
- pry-coolline (~> 0.2)
67
- rake (~> 13.0)
68
- rubocop (~> 0.63)
69
- simplecov (~> 0.16)
70
- tfdsl!
71
-
72
- BUNDLED WITH
73
- 1.17.2
data/lib/tfdsl/block.rb DELETED
@@ -1,88 +0,0 @@
1
- module TFDSL
2
- # This class is the representation of terraform configuration block
3
- # https://www.terraform.io/docs/configuration/
4
- class Block
5
- attr_reader :__type__, :__labels__
6
- @@formatter = Formatter.new
7
- def initialize(&block)
8
- @__blocks__ = []
9
- instance_eval(&block) if block_given?
10
- end
11
-
12
- def method_missing(method_name, *args, &block)
13
- super if [:respond_to_missing?].include? method_name
14
- return method_missing_handler(method_name, *args, &block)
15
- end
16
-
17
- def method_missing_handler(method_name, *args, &block)
18
- method = method_name.to_s.gsub(/=$/, '')
19
-
20
- if block_given?
21
- r = Block.new
22
- r.__type__ = method
23
- r.__labels__ = args
24
- @__blocks__ << r
25
- return r.instance_eval(&block)
26
- end
27
-
28
- return instance_variable_set "@#{method}", *args unless args.empty?
29
- return instance_variable_get "@#{method}" if args.empty?
30
- end
31
-
32
- def timeout(*args, &block)
33
- method_missing_handler :timeout, *args, &block
34
- end
35
-
36
- def respond_to_missing?(_method_name, _include_private = true)
37
- true
38
- end
39
-
40
- def to_tf
41
- @@formatter.format self
42
- end
43
-
44
- def to_str
45
- to_tf
46
- end
47
-
48
- def to_s
49
- to_tf
50
- end
51
-
52
- def to_json_repr(depth = 0)
53
- block = { 'tmp' => {} }
54
-
55
- ref = block['tmp']
56
-
57
- labels = __labels__.dup
58
- labels = [__type__] + labels if !__type__.empty? && depth.zero?
59
-
60
- labels.each do |l|
61
- ref[l] = {} if ref[l].nil?
62
- ref = ref[l]
63
- end
64
-
65
- instance_variables.each do |var|
66
- var_name = var.to_s.gsub(/^@/, '')
67
- next if var_name =~ /^__/
68
-
69
- ref[var_name] = send var_name
70
- end
71
-
72
- __blocks__.each do |b|
73
- json = b.to_json_repr depth + 1
74
- if b.__labels__.empty?
75
- if ref[b.__type__].nil?
76
- ref[b.__type__] = json
77
- else
78
- ref[b.__type__] = [ref[b.__type__], json].flatten
79
- end
80
- else
81
- ref[b.__type__] = [] if ref[b.__type__].nil?
82
- ref[b.__type__] << json
83
- end
84
- end
85
- block['tmp']
86
- end
87
- end
88
- end