tfdsl 0.1.10 → 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 -80
  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
@@ -1,63 +0,0 @@
1
- module TFDSL
2
- # This will format hash maps, lists and elements in HCL format
3
- class DataFormatter
4
- def initialize
5
- @sio = StringIO.new
6
- @indent = ' ' * 4
7
- end
8
-
9
- def format(input, level = 0, last = false, parent_is_list = false)
10
- if input.class == Hash
11
- handle_hash input, level, last, parent_is_list
12
- elsif input.class == Array
13
- handle_list input, level, last, parent_is_list
14
- else
15
- handle_element input, level, last, parent_is_list
16
- end
17
-
18
- return @sio.string if level.zero?
19
- end
20
-
21
- def handle_element(input, _level, last, parent_is_list)
22
- if last
23
- @sio << %("#{input}"\n)
24
- elsif parent_is_list
25
- @sio << %("#{input}",\n)
26
- else
27
- @sio << %("#{input}"\n)
28
- end
29
- end
30
-
31
- def handle_list(input, level, _last, _parent_is_list)
32
- @sio << "[\n#{@indent * (level + 1)}"
33
- input.each_with_index do |e, i|
34
- if i == input.size - 1
35
- format e, level + 1, true, true
36
- else
37
- format e, level + 1, false, true
38
- end
39
-
40
- @sio << @indent * (level + 1) unless i == input.size - 1
41
- end
42
- @sio << "#{@indent * level}]\n"
43
- end
44
-
45
- def handle_hash(input, level, last, _parent_is_list)
46
- @sio << "{\n"
47
- input.each_with_index do |e, i|
48
- k, v = e
49
- @sio << "#{@indent * (level + 1)}#{k} = "
50
- if i == input.size - 1
51
- format v, level + 1, true
52
- else
53
- format v, level + 1
54
- end
55
- end
56
- if last || level.zero?
57
- @sio << @indent * level + "}\n"
58
- else
59
- @sio << @indent * level + "},\n"
60
- end
61
- end
62
- end
63
- end
@@ -1,4 +0,0 @@
1
- module TFDSL
2
- class DataSource < Block
3
- end
4
- end
@@ -1,77 +0,0 @@
1
- module TFDSL
2
- # Class responsible for formatting the string representation of terraform blocks
3
- class Formatter
4
- def kind(cls)
5
- KindTranslator.kind cls
6
- end
7
-
8
- def format(tf_block)
9
- @depth ||= 0
10
- str = []
11
-
12
- if @depth.zero?
13
- str << first_line(tf_block)
14
- close = true
15
- end
16
-
17
- str << local_vars(tf_block) unless local_vars(tf_block).empty?
18
-
19
- str << child_blocks(tf_block) unless tf_block.__blocks__.empty?
20
- str[1..-1] = str[1..-1].map { |line| line.gsub(/^/, ' ' * 4) } unless str[1..-1].nil?
21
- str << "}\n\n" if close
22
- str.join("\n")
23
- end
24
-
25
- private
26
-
27
- def first_line(tf_block)
28
- labels = tf_block.__labels__.nil? ? [] : tf_block.__labels__
29
- labels_str = labels.map { |l| %("#{l}") }.join ' '
30
- kind = kind tf_block.class
31
- type = tf_block.__type__.to_s.empty? ? '' : %( "#{tf_block.__type__}" )
32
- "#{kind}#{type}#{labels_str} {"
33
- end
34
-
35
- def local_vars(tf_block)
36
- str = []
37
- tf_block.instance_variables.sort.each do |var_name|
38
- next if var_name =~ /@__/
39
-
40
- var = tf_block.instance_variable_get var_name
41
- var_name = var_name.to_s.delete('@')
42
-
43
- str << Template.list(var_name, var) if var.class == Array
44
- str << Template.map(var_name, var) if var.class == Hash
45
- unless [Array, Hash].include? var.class
46
- safe_var = safe_quote safe_multiline var.to_s
47
- str << Template.value(var_name, safe_var)
48
- end
49
- end
50
- str.join "\n"
51
- end
52
-
53
- def safe_multiline(str)
54
- str.gsub "\n", '\n'
55
- end
56
-
57
- def safe_quote(str)
58
- # Don't escape when string is interpolation
59
- return str if str =~ /^\s*\$\{/
60
-
61
- str.gsub(/([^\\])"/, '\1\"').gsub(/([^\\])"/, '\1\"')
62
- end
63
-
64
- def child_blocks(tf_block)
65
- str = []
66
- tf_block.__blocks__.each do |b|
67
- @depth += 1
68
- indent = ' ' * 4
69
- child = Template.child_block b
70
- child = child.gsub(/^/, indent) if @depth > 1
71
- str << child
72
- @depth -= 1
73
- end
74
- str.join("\n")
75
- end
76
- end
77
- end
@@ -1,20 +0,0 @@
1
- module TFDSL
2
- # Translates Class names into terraform block types
3
- module KindTranslator
4
- module_function
5
-
6
- def kind(cls)
7
- kinds = {
8
- Provider => 'provider',
9
- TFModule => 'module',
10
- Locals => 'locals',
11
- Resource => 'resource',
12
- Variable => 'variable',
13
- DataSource => 'data',
14
- Output => 'output',
15
- Terraform => 'terraform'
16
- }
17
- kinds[cls]
18
- end
19
- end
20
- end
data/lib/tfdsl/locals.rb DELETED
@@ -1,4 +0,0 @@
1
- module TFDSL
2
- class Locals < Block
3
- end
4
- end
data/lib/tfdsl/output.rb DELETED
@@ -1,4 +0,0 @@
1
- module TFDSL
2
- class Output < Resource
3
- end
4
- end
@@ -1,4 +0,0 @@
1
- module TFDSL
2
- class Provider < Block
3
- end
4
- end
@@ -1,4 +0,0 @@
1
- module TFDSL
2
- class Resource < Block
3
- end
4
- end
data/lib/tfdsl/stack.rb DELETED
@@ -1,36 +0,0 @@
1
- require 'deep_merge'
2
- module TFDSL
3
- # This class is the representation of a terraform stack, or in another words
4
- # is a collection of terraform configuration blocks
5
- class Stack
6
- def initialize(&block)
7
- @objects = []
8
- instance_eval(&block) if block_given?
9
- end
10
-
11
- %w[Provider Variable Locals TFModule DataSource Resource Output Terraform].each do |word|
12
- define_method word.downcase do |type = '', *labels, &b|
13
- cls = Object.const_get "TFDSL::#{word}"
14
- w = cls.new
15
- w.__type__ = type
16
- w.__labels__ = labels
17
- @objects << w
18
- w.instance_eval(&b) unless b.nil?
19
- end
20
- end
21
-
22
- def to_s
23
- @objects.each_with_object('') { |o, str| str << o }
24
- end
25
-
26
- def to_json
27
- stack = {}
28
- @objects.each do |obj|
29
- key = KindTranslator.kind obj.class
30
- stack[key] = {} if stack[key].nil?
31
- stack[key] = stack[key].deep_merge obj.to_json_repr
32
- end
33
- JSON.pretty_generate(stack)
34
- end
35
- end
36
- end
@@ -1,46 +0,0 @@
1
- module TFDSL
2
- # Collection of small templates to be used on to_s / to_str of blocks
3
- module Template
4
- module_function
5
-
6
- def list(name, value)
7
- template = <<-TEXT.gsub(/^ {6}/, '')
8
- <%=name%> = <%=DataFormatter.new.format value%>
9
- TEXT
10
- ERB.new(template, trim_mode: '-').result(binding).strip
11
- end
12
-
13
- def map(name, value)
14
- template = <<-TEXT.gsub(/^ {6}/, '')
15
- <%=name%> = <%=DataFormatter.new.format value%>
16
- TEXT
17
- ERB.new(template, trim_mode: '-').result(binding).strip
18
- end
19
-
20
- def child_block(value)
21
- labels = value.__labels__.nil? ? [] : value.__labels__
22
- labels_str = labels.map { |l| %("#{l}") }.join ' '
23
- type = value.__type__.nil? ? '' : %( #{value.__type__} )
24
-
25
- # This is just to get ride of the warning of unused variables
26
- # The variable are used, but as part of binding
27
- _ = "#{labels_str}, #{type}"
28
-
29
- template = <<-TEXT.gsub(/^ {6}/, '')
30
- <%=type%><%=labels_str%> {
31
- <%- unless value.to_s.empty? -%>
32
- <%=value.to_tf.strip.gsub(/^/,' ')%>
33
- <%- end -%>
34
- }
35
- TEXT
36
- ERB.new(template, trim_mode: '-').result(binding).strip
37
- end
38
-
39
- def value(name, value)
40
- template = <<-TEXT.gsub(/^ {6}/, '')
41
- <%=name%> = "<%=value%>"
42
- TEXT
43
- ERB.new(template, trim_mode: '-').result(binding).strip
44
- end
45
- end
46
- end
@@ -1,4 +0,0 @@
1
- module TFDSL
2
- class Terraform < Block
3
- end
4
- end
@@ -1,4 +0,0 @@
1
- module TFDSL
2
- class TFModule < Block
3
- end
4
- end
@@ -1,4 +0,0 @@
1
- module TFDSL
2
- class Variable < Block
3
- end
4
- end
data/lib/tfdsl/version.rb DELETED
@@ -1,3 +0,0 @@
1
- module TFDSL
2
- VERSION = '0.1.10'.freeze
3
- end