sparkle_formation 2.1.8 → 3.0.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.
@@ -95,7 +95,7 @@ class SparkleFormation
95
95
  def compile(path, *args)
96
96
  opts = args.detect{|i| i.is_a?(Hash) } || {}
97
97
  unless(path.is_a?(String) && File.file?(path.to_s))
98
- if(spath = (opts.delete(:sparkle_path) || SparkleFormation.sparkle_path))
98
+ if(spath = (opts.delete(:sparkle_path) || SparkleFormation.custom_paths[:sparkle_path]))
99
99
  container = Sparkle.new(:root => spath)
100
100
  path = container.get(:template, path)[:path]
101
101
  end
@@ -200,7 +200,8 @@ class SparkleFormation
200
200
  # @return [SparkleStruct]
201
201
  def registry(registry_name, struct, *args)
202
202
  __t_stringish(registry_name)
203
- reg = struct._self.sparkle.get(:registry, registry_name)
203
+ opts = args.detect{|item| item.is_a?(Hash)} || {}
204
+ reg = struct._self.sparkle.get(:registry, registry_name, opts[:provider])
204
205
  struct.instance_exec(*args, &reg[:block])
205
206
  end
206
207
 
@@ -214,7 +215,9 @@ class SparkleFormation
214
215
  __t_stringish(dynamic_name)
215
216
  result = false
216
217
  begin
217
- dyn = struct._self.sparkle.get(:dynamic, dynamic_name)
218
+ opts = args.detect{|i| i.is_a?(Hash)} || {}
219
+ dyn = struct._self.sparkle.get(:dynamic, dynamic_name, opts[:provider])
220
+ opts = nil
218
221
  raise dyn if dyn.is_a?(Exception)
219
222
  dyn.monochrome.each do |dynamic_item|
220
223
  if(result)
@@ -234,7 +237,7 @@ class SparkleFormation
234
237
  result = builtin_insert(dynamic_name, struct, *args, &block)
235
238
  unless(result)
236
239
  message = "Failed to locate requested dynamic block for insertion: #{dynamic_name} " \
237
- "(valid: #{struct._self.sparkle.dynamics.keys.sort.join(', ')})"
240
+ "(valid: #{struct._self.sparkle.dynamics.fetch(struct._self.sparkle.provider, {}).keys.sort.join(', ')})"
238
241
  if(struct._self.provider_resources && struct._self.provider_resources.registry.keys.size > 1)
239
242
  t_name = struct._self.provider_resources.registry.keys.first
240
243
  valid_t_name = Bogo::Utility.snake(
@@ -268,7 +271,7 @@ class SparkleFormation
268
271
  [template, *args].compact.each do |item|
269
272
  __t_stringish(item)
270
273
  end
271
- to_nest = struct._self.sparkle.get(:template, template)
274
+ to_nest = struct._self.sparkle.get(:template, template, options[:provider])
272
275
  resource_name = template.to_s.gsub('__', '_')
273
276
  unless(args.empty?)
274
277
  resource_name = [
@@ -276,23 +279,24 @@ class SparkleFormation
276
279
  args.map{|a| Bogo::Utility.snake(a)}.join('_')
277
280
  ].flatten.compact.join('_').to_sym
278
281
  end
282
+ resource_name = struct._process_key(resource_name.to_sym)
279
283
  nested_template = compile(to_nest[:path], :sparkle)
280
284
  nested_template.parent = struct._self
281
- nested_template.name = Bogo::Utility.camel(resource_name)
285
+ nested_template.name = resource_name
282
286
  if(options[:parameters])
283
287
  nested_template.compile_state = options[:parameters]
284
288
  end
285
- struct.resources.set!(resource_name) do
286
- type struct._self.stack_resource_type
287
- end
288
289
  unless(struct._self.sparkle.empty?)
289
290
  nested_template.sparkle.apply(struct._self.sparkle)
290
291
  end
291
- struct.resources[resource_name].properties.stack nested_template
292
- if(block_given?)
293
- struct.resources[resource_name].instance_exec(&block)
294
- end
295
- struct.resources[resource_name]
292
+ nested_resource = struct.dynamic!(
293
+ struct._self.stack_resource_type,
294
+ resource_name,
295
+ {:resource_name_suffix => nil},
296
+ &block
297
+ )
298
+ nested_resource.properties.stack nested_template
299
+ nested_resource
296
300
  end
297
301
 
298
302
  # Insert a builtin dynamic into a context
@@ -307,7 +311,11 @@ class SparkleFormation
307
311
  _config ||= {}
308
312
  __t_stringish(_name)
309
313
  __t_hashish(_config)
310
- resource_name = "#{_name}_#{_config.delete(:resource_name_suffix) || dynamic_name}".to_sym
314
+ resource_name = [
315
+ _name,
316
+ _config.fetch(:resource_name_suffix, dynamic_name)
317
+ ].compact.join('_').to_sym
318
+ _config.delete(:resource_name_suffix)
311
319
  new_resource = struct.resources.set!(resource_name)
312
320
  new_resource.type lookup_key
313
321
  properties = new_resource.properties
@@ -402,6 +410,8 @@ class SparkleFormation
402
410
  )
403
411
  if(s_path)
404
412
  h[:root] = s_path
413
+ else
414
+ h[:root] = :none
405
415
  end
406
416
  }
407
417
  )
@@ -531,6 +541,7 @@ class SparkleFormation
531
541
  if(Provider.const_defined?(provider_klass))
532
542
  extend Provider.const_get(provider_klass)
533
543
  end
544
+ sparkle.provider = val
534
545
  @provider
535
546
  else
536
547
  @provider = nil
@@ -629,7 +640,7 @@ class SparkleFormation
629
640
  #
630
641
  # @param args [String, Symbol] Symbol component names or String paths
631
642
  # @return [self]
632
- def load(*args)
643
+ def load(*args, &user_block)
633
644
  args.each do |thing|
634
645
  if(thing.is_a?(String))
635
646
  # NOTE: This needs to be deprecated and removed
@@ -640,6 +651,9 @@ class SparkleFormation
640
651
  composition.new_component(thing)
641
652
  end
642
653
  end
654
+ if(block_given?)
655
+ block(user_block)
656
+ end
643
657
  self
644
658
  end
645
659
 
@@ -791,7 +805,7 @@ class SparkleFormation
791
805
  # Apply nesting logic to stack
792
806
  #
793
807
  # @param nest_type [Symbol] values: :shallow, :deep (default: :deep)
794
- # @return [Hash] dumped stack
808
+ # @return [SparkleFormation::SparkleStruct] compiled structure
795
809
  # @note see specific version for expected block parameters
796
810
  def apply_nesting(*args, &block)
797
811
  if(args.include?(:shallow))
@@ -810,9 +824,9 @@ class SparkleFormation
810
824
  # @yieldparam resource [AttributeStruct] the stack resource
811
825
  # @yieldparam s_name [String] stack resource name
812
826
  # @yieldreturn [Hash] key/values to be merged into resource properties
813
- # @return [Hash] dumped stack
827
+ # @return [SparkleFormation::SparkleStruct] compiled structure
814
828
  def apply_deep_nesting(*args, &block)
815
- compile.dump!
829
+ compile
816
830
  end
817
831
 
818
832
  # Check if parameter name matches an output name
@@ -855,7 +869,10 @@ class SparkleFormation
855
869
  unless(stack.nested_stacks.empty?)
856
870
  stack_template_extractor(stack.nested_stacks(:with_resource, :with_name), &block)
857
871
  end
858
- resource.properties.set!(:stack, stack.compile.dump!)
872
+ resource.properties._delete(:stack)
873
+ s_parent = resource.properties.stack
874
+ stack.compile._parent(s_parent)
875
+ resource.properties.set!(:stack, stack.compile)
859
876
  block.call(s_name, stack, resource)
860
877
  end
861
878
  end
@@ -868,9 +885,9 @@ class SparkleFormation
868
885
  # @yieldparam resource_name [String] name of stack resource
869
886
  # @yieldparam stack [SparkleFormation] nested stack
870
887
  # @yieldreturn [String] Remote URL storage for template
871
- # @return [Hash]
888
+ # @return [SparkleFormation::SparkleStruct] compiled structure
872
889
  def apply_shallow_nesting(*args, &block)
873
- compile.dump!
890
+ compile
874
891
  end
875
892
 
876
893
  # @return [Smash<output_name:SparkleFormation>]
@@ -917,6 +934,15 @@ class SparkleFormation
917
934
  MultiJson.load(to_json)
918
935
  end
919
936
 
937
+ # @return [Hash] dumped hash
938
+ def sparkle_dump
939
+ MultiJson.load(
940
+ MultiJson.dump(
941
+ compile.sparkle_dump!
942
+ )
943
+ )
944
+ end
945
+
920
946
  # @return [String] dumped hash JSON
921
947
  def to_json(*args)
922
948
  # NOTE: Ported in from batali
@@ -130,5 +130,48 @@ class SparkleFormation
130
130
  end
131
131
  alias_method :state!, :_state
132
132
 
133
+ # TODO: Need to refactor attribute_struct dumping to allow hooking
134
+ # custom behavior instead of heavy copy/paste to modify a method call
135
+
136
+ # Process and unpack items for dumping within deeply nested
137
+ # enumerable types
138
+ #
139
+ # @param item [Object]
140
+ # @return [Object]
141
+ def _sparkle_dump_unpacker(item)
142
+ if(item.is_a?(::Enumerable))
143
+ if(item.respond_to?(:keys))
144
+ item.class[
145
+ *item.map do |entry|
146
+ _sparkle_dump_unpacker(entry)
147
+ end.flatten(1)
148
+ ]
149
+ else
150
+ item.class[
151
+ *item.map do |entry|
152
+ _sparkle_dump_unpacker(entry)
153
+ end
154
+ ]
155
+ end
156
+ elsif(item.is_a?(::AttributeStruct))
157
+ item.nil? ? UNSET_VALUE : item._sparkle_dump
158
+ elsif(item.is_a?(::SparkleFormation))
159
+ item.sparkle_dump
160
+ else
161
+ item
162
+ end
163
+ end
164
+
165
+ # @return [AttributeStruct::AttributeHash, Mash] dump struct to hashish
166
+ def _sparkle_dump
167
+ processed = @table.keys.map do |key|
168
+ value = @table[key]
169
+ val = _sparkle_dump_unpacker(value)
170
+ [_sparkle_dump_unpacker(key), val] unless val == UNSET_VALUE
171
+ end.compact
172
+ __hashish[*processed.flatten(1)]
173
+ end
174
+ alias_method :sparkle_dump!, :_sparkle_dump
175
+
133
176
  end
134
177
  end
@@ -1,5 +1,5 @@
1
1
  # Unicorns and rainbows
2
2
  class SparkleFormation
3
3
  # Current library version
4
- VERSION = Gem::Version.new('2.1.8')
4
+ VERSION = Gem::Version.new('3.0.0')
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sparkle_formation
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.8
4
+ version: 3.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chris Roberts
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-04-05 00:00:00.000000000 Z
11
+ date: 2016-04-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: attribute_struct
@@ -161,6 +161,7 @@ files:
161
161
  - docs/inheritance-merging.md
162
162
  - docs/nested-stacks.md
163
163
  - docs/overview.md
164
+ - docs/provider-restrictions.md
164
165
  - docs/sparkle-packs.md
165
166
  - docs/sparkleformation-dsl.md
166
167
  - docs/stack-policies.md
@@ -180,12 +181,15 @@ files:
180
181
  - lib/sparkle_formation/provider.rb
181
182
  - lib/sparkle_formation/provider/aws.rb
182
183
  - lib/sparkle_formation/provider/azure.rb
184
+ - lib/sparkle_formation/provider/google.rb
183
185
  - lib/sparkle_formation/provider/heat.rb
184
186
  - lib/sparkle_formation/resources.rb
185
187
  - lib/sparkle_formation/resources/aws.rb
186
188
  - lib/sparkle_formation/resources/aws_resources.json
187
189
  - lib/sparkle_formation/resources/azure.rb
188
190
  - lib/sparkle_formation/resources/azure_resources.json
191
+ - lib/sparkle_formation/resources/google.rb
192
+ - lib/sparkle_formation/resources/google_resources.json
189
193
  - lib/sparkle_formation/resources/heat.rb
190
194
  - lib/sparkle_formation/resources/heat_resources.json
191
195
  - lib/sparkle_formation/resources/rackspace.rb
@@ -194,6 +198,7 @@ files:
194
198
  - lib/sparkle_formation/sparkle_attribute.rb
195
199
  - lib/sparkle_formation/sparkle_attribute/aws.rb
196
200
  - lib/sparkle_formation/sparkle_attribute/azure.rb
201
+ - lib/sparkle_formation/sparkle_attribute/google.rb
197
202
  - lib/sparkle_formation/sparkle_attribute/heat.rb
198
203
  - lib/sparkle_formation/sparkle_attribute/rackspace.rb
199
204
  - lib/sparkle_formation/sparkle_collection.rb