dh-proteus 0.1.3

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 (60) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +21 -0
  3. data/.rspec +3 -0
  4. data/.travis.yml +7 -0
  5. data/Gemfile +4 -0
  6. data/Gemfile.lock +80 -0
  7. data/README.md +414 -0
  8. data/Rakefile +6 -0
  9. data/bin/console +14 -0
  10. data/bin/proteus +5 -0
  11. data/bin/proteus_testing +8 -0
  12. data/bin/setup +8 -0
  13. data/build.sh +28 -0
  14. data/dh-proteus.gemspec +50 -0
  15. data/lib/core_ext/hash.rb +14 -0
  16. data/lib/proteus.rb +9 -0
  17. data/lib/proteus/app.rb +86 -0
  18. data/lib/proteus/backend/backend.rb +41 -0
  19. data/lib/proteus/commands/apply.rb +53 -0
  20. data/lib/proteus/commands/clean.rb +22 -0
  21. data/lib/proteus/commands/destroy.rb +51 -0
  22. data/lib/proteus/commands/graph.rb +22 -0
  23. data/lib/proteus/commands/import.rb +75 -0
  24. data/lib/proteus/commands/move.rb +28 -0
  25. data/lib/proteus/commands/output.rb +29 -0
  26. data/lib/proteus/commands/plan.rb +55 -0
  27. data/lib/proteus/commands/remove.rb +71 -0
  28. data/lib/proteus/commands/render.rb +36 -0
  29. data/lib/proteus/commands/taint.rb +35 -0
  30. data/lib/proteus/common.rb +72 -0
  31. data/lib/proteus/config/config.rb +47 -0
  32. data/lib/proteus/context_management/context.rb +31 -0
  33. data/lib/proteus/context_management/helpers.rb +14 -0
  34. data/lib/proteus/generate.rb +18 -0
  35. data/lib/proteus/generators/context.rb +57 -0
  36. data/lib/proteus/generators/environment.rb +42 -0
  37. data/lib/proteus/generators/init.rb +40 -0
  38. data/lib/proteus/generators/module.rb +69 -0
  39. data/lib/proteus/generators/templates/config/config.yaml.erb +22 -0
  40. data/lib/proteus/generators/templates/context/main.tf.erb +7 -0
  41. data/lib/proteus/generators/templates/context/variables.tf.erb +3 -0
  42. data/lib/proteus/generators/templates/environment/terraform.tfvars.erb +6 -0
  43. data/lib/proteus/generators/templates/module/io.tf.erb +1 -0
  44. data/lib/proteus/generators/templates/module/module.tf.erb +1 -0
  45. data/lib/proteus/generators/templates/module/validator.rb.erb +9 -0
  46. data/lib/proteus/global_commands/validate.rb +45 -0
  47. data/lib/proteus/helpers.rb +91 -0
  48. data/lib/proteus/helpers/path_helpers.rb +90 -0
  49. data/lib/proteus/helpers/string_helpers.rb +13 -0
  50. data/lib/proteus/init.rb +16 -0
  51. data/lib/proteus/modules/manager.rb +53 -0
  52. data/lib/proteus/modules/terraform_module.rb +184 -0
  53. data/lib/proteus/templates/partial.rb +123 -0
  54. data/lib/proteus/templates/template_binding.rb +62 -0
  55. data/lib/proteus/validators/base_validator.rb +24 -0
  56. data/lib/proteus/validators/validation_dsl.rb +172 -0
  57. data/lib/proteus/validators/validation_error.rb +9 -0
  58. data/lib/proteus/validators/validation_helpers.rb +9 -0
  59. data/lib/proteus/version.rb +7 -0
  60. metadata +260 -0
@@ -0,0 +1,24 @@
1
+ require 'proteus/validators/validation_error'
2
+ require 'proteus/validators/validation_helpers'
3
+ require 'proteus/validators/validation_dsl'
4
+
5
+ module Proteus
6
+ module Validators
7
+ class BaseValidator
8
+ include ValidationDSL
9
+ include ValidationHelpers
10
+
11
+ def initialize(data, environment = nil)
12
+ @data = data
13
+ @environment = environment
14
+ validate
15
+ end
16
+
17
+ private
18
+
19
+ def validate
20
+ raise "Override this method in your module validator class."
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,172 @@
1
+ module Proteus
2
+ module Validators
3
+ module ValidationDSL
4
+ def init
5
+ @key_stack ||= []
6
+ end
7
+
8
+ def current_data
9
+ data = @data.dig(*@key_stack)
10
+ if data.nil?
11
+ raise ValidationError.new(message_suffix: "Key hierarchy #{keys_to_hierarchy(*@key_stack)} not found or empty.")
12
+ end
13
+ data
14
+ end
15
+
16
+ def peek
17
+ @data.dig(*@key_stack)
18
+ end
19
+
20
+ def within(key, optional: false)
21
+ init
22
+
23
+ key.is_a?(Numeric) ? @key_stack.push(key) : @key_stack.push(key.to_s)
24
+
25
+ if !peek && optional
26
+ @key_stack.pop
27
+ return
28
+ end
29
+
30
+ current_data
31
+ yield if block_given?
32
+
33
+ @key_stack.pop
34
+ end
35
+
36
+ def ensure_unique_values
37
+ unless current_data.length == current_data.uniq.length
38
+ raise ValidationError.new(message_suffix: "Values in hierarchy #{keys_to_hierarchy(*@key_stack)} have to be unique.")
39
+ end
40
+ end
41
+
42
+ def ensure_data_type(type)
43
+ unless current_data.is_a? type
44
+ raise ValidationError.new(message_suffix: "Data in hierarchy #{keys_to_hierarchy(*@key_stack)} has to be of type #{type}.")
45
+ end
46
+ end
47
+
48
+ def ensure_value(key, options = {})
49
+ if current_data.key?(key.to_s)
50
+ if current_data[key.to_s].is_a? Array
51
+ if options.key?(:in)
52
+ current_data[key.to_s].each_with_index do |item, index|
53
+ unless options[:in].include?(item)
54
+ raise ValidationError.new(message_suffix: "Data in hierarchy #{keys_to_hierarchy(*@key_stack, key, index)} invalid. Value #{current_data[key.to_s][index]} is not allowed. Should be one of [#{options[:in].join(', ')}].")
55
+ end
56
+ end
57
+ end
58
+
59
+ if options.key?(:matches)
60
+ current_data[key.to_s].each_with_index do |item, index|
61
+ unless options[:matches].match?(item)
62
+ raise ValidationError.new(message_suffix: "Data in hierarchy #{keys_to_hierarchy(*@key_stack, key, index)} invalid. Value of must match #{options[:matches].inspect}.")
63
+ end
64
+ end
65
+ end
66
+
67
+ else
68
+ if options.key?(:in_range)
69
+ unless options[:in_range].include?(current_data[key.to_s])
70
+ raise ValidationError.new(message_suffix: "Data in hierarchy #{keys_to_hierarchy(*@key_stack)} invalid. Value #{current_data[key.to_s]} is out of range (Valid range: #{options[:in_range]}).")
71
+ end
72
+ end
73
+
74
+ if options.key?(:in)
75
+ unless options[:in].include?(current_data[key.to_s])
76
+ raise ValidationError.new(message_suffix: "Data in hierarchy #{keys_to_hierarchy(*@key_stack)} invalid. Value of #{key.to_s} must be one of [#{options[:in].join(', ')}]")
77
+ end
78
+ end
79
+
80
+ if options.key?(:matches)
81
+ unless options[:matches].match?(current_data[key.to_s])
82
+ raise ValidationError.new(message_suffix: "Data in hierarchy #{keys_to_hierarchy(*@key_stack)} invalid. Value of #{current_data[key.to_s]} must match #{options[:matches].inspect}.")
83
+ end
84
+ end
85
+ end
86
+ else
87
+ unless options.key?(:optional)
88
+ raise ValidationError.new(message_suffix: "Data in hierarchy #{keys_to_hierarchy(*@key_stack)} invalid. Key #{key} not found.")
89
+ end
90
+ end
91
+ end
92
+
93
+ def collect(key)
94
+ current_data.collect { |item| item[key.to_s] }
95
+ end
96
+
97
+ def ensure_uniqueness_across(*keys)
98
+ keys.each do |key|
99
+ @current_paths = []
100
+ transform_to_paths(current_data)
101
+ @current_paths = @current_paths.grep(/^:#{key}/)
102
+
103
+ unless @current_paths.length == @current_paths.uniq.length
104
+ raise ValidationError.new(message_suffix: "Values in hierarchy #{keys_to_hierarchy(*@key_stack)} => * => #{key} have to be unique.")
105
+ end
106
+ end
107
+ end
108
+
109
+ def transform_to_paths(data, current_prefix = "", include_prefixes: false)
110
+ if data.is_a?(Hash)
111
+ data.each do |key, value|
112
+ transform_to_paths(value, "#{current_prefix}:#{key}")
113
+ end
114
+ elsif data.is_a?(Array)
115
+ if data.any?
116
+ data.each do |value|
117
+ transform_to_paths(value, "#{current_prefix}")
118
+ end
119
+ end
120
+
121
+ if current_prefix.length > 0 && include_prefixes
122
+ @current_paths << current_prefix
123
+ end
124
+ else
125
+ @current_paths << "#{current_prefix}:#{data}"
126
+ end
127
+ end
128
+
129
+ def in_case(key, options = {})
130
+ if current_data.key?(key.to_s)
131
+ if options.key?(:has_value)
132
+ if options[:has_value].is_a? Array
133
+ if options[:has_value].include?(current_data[key.to_s])
134
+ yield
135
+ end
136
+ else
137
+ if current_data[key.to_s] == options[:has_value]
138
+ yield
139
+ end
140
+ end
141
+ end
142
+ end
143
+ end
144
+
145
+ def each_key
146
+ current_data.each do |key, value|
147
+ within key do
148
+ yield
149
+ end
150
+ end
151
+ end
152
+
153
+ def ensure_keys(*keys)
154
+ keys.each do |key|
155
+ within key
156
+ end
157
+ end
158
+
159
+ def each
160
+ current_data.each_with_index do |item, index|
161
+ within index do
162
+ yield
163
+ end
164
+ end
165
+ end
166
+
167
+ def ensure_presence(key, optional: false)
168
+ within(key, optional: optional)
169
+ end
170
+ end
171
+ end
172
+ end
@@ -0,0 +1,9 @@
1
+ module Proteus
2
+ module Validators
3
+ class ValidationError < StandardError
4
+ def initialize(message: "A validation error occured: ", message_suffix: "")
5
+ super("#{message}#{message_suffix}")
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Proteus
2
+ module Validators
3
+ module ValidationHelpers
4
+ def keys_to_hierarchy(*keys)
5
+ keys.inject() { |hierarchy, key| "#{hierarchy} => #{key}" }
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,7 @@
1
+ module Proteus
2
+ VERSION = "0.1.3"
3
+ end
4
+
5
+ if $0 == __FILE__
6
+ puts Proteus::VERSION
7
+ end
metadata ADDED
@@ -0,0 +1,260 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dh-proteus
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.3
5
+ platform: ruby
6
+ authors:
7
+ - Simon Albrecht
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2019-06-24 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2.0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '2.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: pry
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: activesupport
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 5.1.1
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 5.1.1
83
+ - !ruby/object:Gem::Dependency
84
+ name: thor
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 0.20.0
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 0.20.0
97
+ - !ruby/object:Gem::Dependency
98
+ name: erubis
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: 2.7.0
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: 2.7.0
111
+ - !ruby/object:Gem::Dependency
112
+ name: hcl-checker
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: 1.0.5
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: 1.0.5
125
+ - !ruby/object:Gem::Dependency
126
+ name: aws-sdk-rds
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: 1.11.0
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: 1.11.0
139
+ - !ruby/object:Gem::Dependency
140
+ name: aws-sdk-route53
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: 1.7.0
146
+ type: :runtime
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: 1.7.0
153
+ - !ruby/object:Gem::Dependency
154
+ name: aws-sdk-elasticsearchservice
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - "~>"
158
+ - !ruby/object:Gem::Version
159
+ version: 1.4.0
160
+ type: :runtime
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - "~>"
165
+ - !ruby/object:Gem::Version
166
+ version: 1.4.0
167
+ description:
168
+ email:
169
+ - simon.albrecht@deliveryhero.com
170
+ executables:
171
+ - proteus
172
+ extensions: []
173
+ extra_rdoc_files: []
174
+ files:
175
+ - ".gitignore"
176
+ - ".rspec"
177
+ - ".travis.yml"
178
+ - Gemfile
179
+ - Gemfile.lock
180
+ - README.md
181
+ - Rakefile
182
+ - bin/console
183
+ - bin/proteus
184
+ - bin/proteus_testing
185
+ - bin/setup
186
+ - build.sh
187
+ - dh-proteus.gemspec
188
+ - lib/core_ext/hash.rb
189
+ - lib/proteus.rb
190
+ - lib/proteus/app.rb
191
+ - lib/proteus/backend/backend.rb
192
+ - lib/proteus/commands/apply.rb
193
+ - lib/proteus/commands/clean.rb
194
+ - lib/proteus/commands/destroy.rb
195
+ - lib/proteus/commands/graph.rb
196
+ - lib/proteus/commands/import.rb
197
+ - lib/proteus/commands/move.rb
198
+ - lib/proteus/commands/output.rb
199
+ - lib/proteus/commands/plan.rb
200
+ - lib/proteus/commands/remove.rb
201
+ - lib/proteus/commands/render.rb
202
+ - lib/proteus/commands/taint.rb
203
+ - lib/proteus/common.rb
204
+ - lib/proteus/config/config.rb
205
+ - lib/proteus/context_management/context.rb
206
+ - lib/proteus/context_management/helpers.rb
207
+ - lib/proteus/generate.rb
208
+ - lib/proteus/generators/context.rb
209
+ - lib/proteus/generators/environment.rb
210
+ - lib/proteus/generators/init.rb
211
+ - lib/proteus/generators/module.rb
212
+ - lib/proteus/generators/templates/config/config.yaml.erb
213
+ - lib/proteus/generators/templates/context/main.tf.erb
214
+ - lib/proteus/generators/templates/context/variables.tf.erb
215
+ - lib/proteus/generators/templates/environment/terraform.tfvars.erb
216
+ - lib/proteus/generators/templates/module/io.tf.erb
217
+ - lib/proteus/generators/templates/module/module.tf.erb
218
+ - lib/proteus/generators/templates/module/validator.rb.erb
219
+ - lib/proteus/global_commands/validate.rb
220
+ - lib/proteus/helpers.rb
221
+ - lib/proteus/helpers/path_helpers.rb
222
+ - lib/proteus/helpers/string_helpers.rb
223
+ - lib/proteus/init.rb
224
+ - lib/proteus/modules/manager.rb
225
+ - lib/proteus/modules/terraform_module.rb
226
+ - lib/proteus/templates/partial.rb
227
+ - lib/proteus/templates/template_binding.rb
228
+ - lib/proteus/validators/base_validator.rb
229
+ - lib/proteus/validators/validation_dsl.rb
230
+ - lib/proteus/validators/validation_error.rb
231
+ - lib/proteus/validators/validation_helpers.rb
232
+ - lib/proteus/version.rb
233
+ homepage: https://github.com/deliveryhero/proteus
234
+ licenses: []
235
+ metadata:
236
+ allowed_push_host: https://rubygems.org
237
+ homepage_uri: https://github.com/deliveryhero/proteus
238
+ source_code_uri: https://github.com/deliveryhero/proteus
239
+ changelog_uri: https://github.com/deliveryhero/proteus/CHANGELOG
240
+ post_install_message:
241
+ rdoc_options: []
242
+ require_paths:
243
+ - lib
244
+ required_ruby_version: !ruby/object:Gem::Requirement
245
+ requirements:
246
+ - - ">="
247
+ - !ruby/object:Gem::Version
248
+ version: '0'
249
+ required_rubygems_version: !ruby/object:Gem::Requirement
250
+ requirements:
251
+ - - ">="
252
+ - !ruby/object:Gem::Version
253
+ version: '0'
254
+ requirements: []
255
+ rubyforge_project:
256
+ rubygems_version: 2.7.6.2
257
+ signing_key:
258
+ specification_version: 4
259
+ summary: Proteus is a Terraform wrapper application.
260
+ test_files: []