Class: SparkleFormation
- Inherits:
-
Object
- Object
- SparkleFormation
- Extended by:
- Utils::AnimalStrings, Utils::TypeCheckers
- Includes:
- Bogo::Memoization, Utils::AnimalStrings
- Defined in:
- lib/sparkle_formation.rb,
lib/sparkle_formation/error.rb,
lib/sparkle_formation/utils.rb,
lib/sparkle_formation/sparkle.rb,
lib/sparkle_formation/version.rb,
lib/sparkle_formation/provider.rb,
lib/sparkle_formation/resources.rb,
lib/sparkle_formation/translation.rb,
lib/sparkle_formation/provider/aws.rb,
lib/sparkle_formation/provider/heat.rb,
lib/sparkle_formation/resources/aws.rb,
lib/sparkle_formation/provider/azure.rb,
lib/sparkle_formation/resources/heat.rb,
lib/sparkle_formation/sparkle_struct.rb,
lib/sparkle_formation/function_struct.rb,
lib/sparkle_formation/resources/azure.rb,
lib/sparkle_formation/translation/heat.rb,
lib/sparkle_formation/sparkle_attribute.rb,
lib/sparkle_formation/sparkle_formation.rb,
lib/sparkle_formation/sparkle_collection.rb,
lib/sparkle_formation/resources/rackspace.rb,
lib/sparkle_formation/sparkle_attribute/aws.rb,
lib/sparkle_formation/translation/rackspace.rb,
lib/sparkle_formation/sparkle_attribute/heat.rb,
lib/sparkle_formation/sparkle_attribute/azure.rb,
lib/sparkle_formation/sparkle_collection/rainbow.rb,
lib/sparkle_formation/sparkle_attribute/rackspace.rb
Overview
Formation container
Defined Under Namespace
Modules: Provider, SparkleAttribute, Utils Classes: Cache, Error, FunctionStruct, Registry, Resources, Sparkle, SparkleCollection, SparkleStruct, Translation
Constant Summary collapse
- SparklePack =
Alias for interfacing naming
Sparkle- VERSION =
Current library version
Gem::Version.new('2.1.2')
- IGNORE_DIRECTORIES =
[ 'components', 'dynamics', 'registry' ]
- DEFAULT_STACK_RESOURCE =
'AWS::CloudFormation::Stack'- VALID_STACK_RESOURCES =
[DEFAULT_STACK_RESOURCE]
- ALLOWED_GENERATION_PARAMETERS =
['type', 'default', 'description', 'multiple', 'prompt_when_nested']
- VALID_GENERATION_PARAMETER_TYPES =
['String', 'Number']
Instance Attribute Summary collapse
-
#blacklisted_templates ⇒ Array<String>
readonly
Black listed templates.
-
#compile_state ⇒ Hash
State hash for compile time parameters.
-
#components ⇒ Array
readonly
Components to load.
-
#components_directory ⇒ String
readonly
Components path.
-
#dynamics_directory ⇒ String
readonly
Dynamics path.
-
#load_order ⇒ Array
readonly
Order of loading.
-
#name ⇒ Symbol
Name of formation.
-
#parameters ⇒ Hash
readonly
Parameters for stack generation.
-
#parent ⇒ SparkleFormation
Parent stack.
-
#provider ⇒ Symbol
Target provider.
-
#provider_resources ⇒ Class
readonly
Provider resources.
-
#registry_directory ⇒ String
readonly
Registry path.
-
#sparkle ⇒ Sparkle
readonly
Parts store.
-
#sparkle_path ⇒ String
readonly
Base path.
-
#stack_resource_types ⇒ Array<String>
readonly
Valid stack resource types.
-
#template_path ⇒ String
Local path to template.
Class Method Summary collapse
-
.build(base = nil) { ... } ⇒ SparkleStruct
Execute given block within struct context.
-
.builtin_insert(dynamic_name, struct, *args, &block) ⇒ SparkleStruct
Insert a builtin dynamic into a context.
-
.compile(path, *args) ⇒ Hashish, SparkleStruct
Compile file.
-
.components_path=(path = nil) ⇒ String
(also: components_path)
Get/set path to component files.
-
.custom_paths ⇒ Hashish
Custom paths.
-
.dynamic(name, args = {}) { ... } ⇒ TrueClass
Define and register new dynamic.
-
.dynamic_info(name) ⇒ Hashish
(also: dynamic_information)
Metadata for dynamic.
-
.dynamics ⇒ Hashish
Loaded dynamics.
-
.dynamics_path=(path = nil) ⇒ String
(also: dynamics_path)
Get/set path to dynamic files.
-
.from_hash(hash) ⇒ SparkleStruct
Convert hash to SparkleStruct instance.
-
.insert(dynamic_name, struct, *args, &block) ⇒ SparkleStruct
Insert a dynamic into a context.
-
.load_component(path) ⇒ SparkleStruct
Load component.
-
.load_dynamics!(directory) ⇒ TrueClass
Load all dynamics within a directory.
-
.load_registry!(directory) ⇒ TrueClass
Load all registry entries within a directory.
-
.nest(template, struct, *args, &block) ⇒ SparkleStruct
Nest a template into a context.
-
.registry(registry_name, struct, *args) ⇒ SparkleStruct
Insert a dynamic into a context.
-
.registry_path=(path = nil) ⇒ String
(also: registry_path)
Get/set path to registry files.
-
.sparkle_path=(path = nil) ⇒ String
(also: sparkle_path)
Get/set path to sparkle directory.
Instance Method Summary collapse
-
#apply_deep_nesting(*args) {|stack, resource, s_name| ... } ⇒ Hash
Apply deeply nested stacks.
-
#apply_nesting(*args, &block) ⇒ Hash
Apply nesting logic to stack.
-
#apply_shallow_nesting(*args) {|resource_name, stack| ... } ⇒ Hash
Apply shallow nesting.
-
#block(block) ⇒ TrueClass
(also: #load_block)
Add block to load order.
- #collect_outputs(*args) ⇒ Smash<output_name:SparkleFormation>
-
#compile(args = {}) ⇒ SparkleStruct
Compile the formation.
-
#compile_time_parameter_setter {|| ... } ⇒ Proc, NilClass
Get or set the compile time parameter setting block.
-
#dump ⇒ Hash
Dumped hash.
-
#extract_template_data(template) ⇒ self
Extract information from given template and integrate with current instance.
-
#extract_templates {|stack, resource, s_name| ... } ⇒ Object
Extract and process nested stacks.
-
#generate_policy ⇒ Hash
Generate policy for stack.
-
#includes_policies?(stack_hash = nil) ⇒ TrueClass, FalseClass
Policies defined.
-
#inherit_from(template_name) ⇒ self
Inhert template structure.
-
#initialize(name, options = {}) { ... } ⇒ SparkleFormation
constructor
Create new instance.
-
#isolated_nests?(stack_hash = nil) ⇒ TrueClass, FalseClass
Includes only nested stacks.
-
#load(*args) ⇒ self
Load components into instance.
-
#make_output_available(output_name, outputs) ⇒ Object
Extract output to make available for stack parameter usage at the current depth.
-
#merge_previous! ⇒ self
Merge previous layer template structure.
-
#nested?(stack_hash = nil) ⇒ TrueClass, FalseClass
Includes nested stacks.
- #nested_stacks(*args) ⇒ Array<SparkleFormation>
-
#output_matched?(p_name, output_names) ⇒ String, NilClass
Check if parameter name matches an output name.
-
#overrides(args = {}) { ... } ⇒ Object
Registers block into overrides.
- #raw_overrides ⇒ Array<Proc>
-
#recompile ⇒ SparkleStruct
Clear compiled stack if cached and perform compilation again.
-
#remap_nested_parameters(template, parameters, stack_name, stack_resource, output_map) ⇒ TrueClass
Extract parameters from nested stacks.
-
#root ⇒ SparkleFormation
Root stack.
-
#root? ⇒ TrueClass, FalseClass
Current stack is root.
-
#root_path ⇒ Array<SparkleFormation] path to root
Array<SparkleFormation] path to root.
-
#seed_self ⇒ self
Update underlying data structures based on inherit or layering behavior if defined for this template.
-
#set_compile_time_parameters! ⇒ Object
Set the compile time parameters for the stack if the setter proc is available.
-
#set_generation_parameters!(params) ⇒ Hash
Validation parameters used for template generation to ensure they are in the expected format.
-
#stack_resource_type ⇒ String
Provider stack resource type.
-
#stack_resource_type?(type) ⇒ TrueClass, FalseClass
Check if type is a registered stack type.
-
#stack_template_extractor(x_stacks, &block) ⇒ Object
Run the stack extraction.
-
#to_json(*args) ⇒ String
Dumped hash JSON.
Methods included from Utils::TypeCheckers
__t_check, __t_hashish, __t_stringish
Methods included from Utils::AnimalStrings
Constructor Details
#initialize(name, options = {}) { ... } ⇒ SparkleFormation
Create new instance
392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 |
# File 'lib/sparkle_formation/sparkle_formation.rb', line 392 def initialize(name, ={}, &block) @name = name.to_sym @component_paths = [] if([:sparkle_collection]) @sparkle = [:sparkle_collection] else @sparkle = SparkleCollection.new @sparkle.set_root( Sparkle.new( Smash.new.tap{|h| s_path = .fetch(:sparkle_path, self.class.custom_paths[:sparkle_path] ) if(s_path) h[:root] = s_path end } ) ) end self.provider = .fetch(:provider, @parent ? @parent.provider : :aws) if(provider == :aws || ![:disable_aws_builtins]) require 'sparkle_formation/aws' end @parameters = set_generation_parameters!( .fetch(:compile_time_parameters, .fetch(:parameters, {}) ) ) @stack_resource_types = [ stack_resource_type, *.fetch(:stack_resource_types, []) ].compact.uniq @blacklisted_templates = [name] @components = Smash.new @load_order = [] @overrides = [] @parent = [:parent] @seed = Smash.new( :inherit => [:inherit], :layering => [:layering] ) if(block) load_block(block) end @compiled = nil end |
Instance Attribute Details
#blacklisted_templates ⇒ Array<String> (readonly)
379 380 381 |
# File 'lib/sparkle_formation/sparkle_formation.rb', line 379 def blacklisted_templates @blacklisted_templates end |
#compile_state ⇒ Hash
371 372 373 |
# File 'lib/sparkle_formation/sparkle_formation.rb', line 371 def compile_state @compile_state end |
#components ⇒ Array (readonly)
361 362 363 |
# File 'lib/sparkle_formation/sparkle_formation.rb', line 361 def components @components end |
#components_directory ⇒ String (readonly)
355 356 357 |
# File 'lib/sparkle_formation/sparkle_formation.rb', line 355 def components_directory @components_directory end |
#dynamics_directory ⇒ String (readonly)
357 358 359 |
# File 'lib/sparkle_formation/sparkle_formation.rb', line 357 def dynamics_directory @dynamics_directory end |
#load_order ⇒ Array (readonly)
363 364 365 |
# File 'lib/sparkle_formation/sparkle_formation.rb', line 363 def load_order @load_order end |
#name ⇒ Symbol
349 350 351 |
# File 'lib/sparkle_formation/sparkle_formation.rb', line 349 def name @name end |
#parameters ⇒ Hash (readonly)
365 366 367 |
# File 'lib/sparkle_formation/sparkle_formation.rb', line 365 def parameters @parameters end |
#parent ⇒ SparkleFormation
367 368 369 |
# File 'lib/sparkle_formation/sparkle_formation.rb', line 367 def parent @parent end |
#provider ⇒ Symbol
373 374 375 |
# File 'lib/sparkle_formation/sparkle_formation.rb', line 373 def provider @provider end |
#provider_resources ⇒ Class (readonly)
375 376 377 |
# File 'lib/sparkle_formation/sparkle_formation.rb', line 375 def provider_resources @provider_resources end |
#registry_directory ⇒ String (readonly)
359 360 361 |
# File 'lib/sparkle_formation/sparkle_formation.rb', line 359 def registry_directory @registry_directory end |
#sparkle ⇒ Sparkle (readonly)
351 352 353 |
# File 'lib/sparkle_formation/sparkle_formation.rb', line 351 def sparkle @sparkle end |
#sparkle_path ⇒ String (readonly)
353 354 355 |
# File 'lib/sparkle_formation/sparkle_formation.rb', line 353 def sparkle_path @sparkle_path end |
#stack_resource_types ⇒ Array<String> (readonly)
369 370 371 |
# File 'lib/sparkle_formation/sparkle_formation.rb', line 369 def stack_resource_types @stack_resource_types end |
#template_path ⇒ String
377 378 379 |
# File 'lib/sparkle_formation/sparkle_formation.rb', line 377 def template_path @template_path end |
Class Method Details
.build(base = nil) { ... } ⇒ SparkleStruct
Execute given block within struct context
117 118 119 120 121 122 123 124 125 |
# File 'lib/sparkle_formation/sparkle_formation.rb', line 117 def build(base=nil, &block) if(base || block.nil?) struct = base || SparkleStruct.new struct.instance_exec(&block) struct else block end end |
.builtin_insert(dynamic_name, struct, *args, &block) ⇒ SparkleStruct
Insert a builtin dynamic into a context
304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 |
# File 'lib/sparkle_formation/sparkle_formation.rb', line 304 def builtin_insert(dynamic_name, struct, *args, &block) if(struct._self.provider_resources && lookup_key = struct._self.provider_resources.registry_key(dynamic_name)) _name, _config = *args _config ||= {} __t_stringish(_name) __t_hashish(_config) resource_name = "#{_name}_#{_config.delete(:resource_name_suffix) || dynamic_name}".to_sym new_resource = struct.resources.set!(resource_name) new_resource.type lookup_key properties = new_resource.properties config_keys = _config.keys.zip(_config.keys.map{|k| snake(k).to_s.tr('_', '')}) struct._self.provider_resources.resource(dynamic_name, :properties).each do |prop_name| key = (config_keys.detect{|k| k.last == snake(prop_name).to_s.tr('_', '')} || []).first value = _config[key] if key if(value) if(value.is_a?(Proc)) properties.set!(prop_name, &value) else properties.set!(prop_name, value) end end end new_resource.instance_exec(&block) if block struct._self.provider_resources.resource_customizer(new_resource, lookup_key) new_resource end end |
.compile(path, *args) ⇒ Hashish, SparkleStruct
Compile file
95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 |
# File 'lib/sparkle_formation/sparkle_formation.rb', line 95 def compile(path, *args) opts = args.detect{|i| i.is_a?(Hash) } || {} unless(path.is_a?(String) && File.file?(path.to_s)) if(spath = (opts.delete(:sparkle_path) || SparkleFormation.sparkle_path)) container = Sparkle.new(:root => spath) path = container.get(:template, path)[:path] end end formation = instance_eval(IO.read(path), path, 1) formation.template_path = path if(args.delete(:sparkle)) formation else formation.compile(opts)._dump end end |
.components_path=(path = nil) ⇒ String Also known as: components_path
Get/set path to component files
57 58 59 60 61 62 |
# File 'lib/sparkle_formation/sparkle_formation.rb', line 57 def components_path=(path=nil) if(path) custom_paths[:components_directory] = path end custom_paths[:components_directory] end |
.custom_paths ⇒ Hashish
33 34 35 36 |
# File 'lib/sparkle_formation/sparkle_formation.rb', line 33 def custom_paths @_paths ||= SparkleStruct.hashish.new @_paths end |
.dynamic(name, args = {}) { ... } ⇒ TrueClass
Define and register new dynamic
174 175 176 177 178 179 180 |
# File 'lib/sparkle_formation/sparkle_formation.rb', line 174 def dynamic(name, args={}, &block) @dynamics ||= SparkleStruct.hashish.new dynamics[name] = SparkleStruct.hashish[ :block, block, :args, SparkleStruct.hashish[args.map(&:to_a)] ] true end |
.dynamic_info(name) ⇒ Hashish Also known as: dynamic_information
Metadata for dynamic
186 187 188 189 190 191 192 |
# File 'lib/sparkle_formation/sparkle_formation.rb', line 186 def dynamic_info(name) if(dynamics[name]) dynamics[name][:args] ||= SparkleStruct.hashish.new else raise KeyError.new("No dynamic registered with provided name (#{name})") end end |
.dynamics ⇒ Hashish
28 29 30 |
# File 'lib/sparkle_formation/sparkle_formation.rb', line 28 def dynamics @dynamics ||= SparkleStruct.hashish.new end |
.dynamics_path=(path = nil) ⇒ String Also known as: dynamics_path
Get/set path to dynamic files
69 70 71 72 73 74 |
# File 'lib/sparkle_formation/sparkle_formation.rb', line 69 def dynamics_path=(path=nil) if(path) custom_paths[:dynamics_directory] = path end custom_paths[:dynamics_directory] end |
.from_hash(hash) ⇒ SparkleStruct
will do best effort on camel key auto discovery
Convert hash to SparkleStruct instance
337 338 339 340 341 342 343 |
# File 'lib/sparkle_formation/sparkle_formation.rb', line 337 def from_hash(hash) struct = SparkleStruct.new struct._camel_keys_set(:auto_discovery) struct._load(hash) struct._camel_keys_set(nil) struct end |
.insert(dynamic_name, struct, *args, &block) ⇒ SparkleStruct
Insert a dynamic into a context
213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 |
# File 'lib/sparkle_formation/sparkle_formation.rb', line 213 def insert(dynamic_name, struct, *args, &block) __t_stringish(dynamic_name) result = false begin dyn = struct._self.sparkle.get(:dynamic, dynamic_name) raise dyn if dyn.is_a?(Exception) dyn.monochrome.each do |dynamic_item| if(result) opts = args.detect{|i| i.is_a?(Hash)} if(opts) opts[:previous_layer_result] = result else args.push(:previous_layer_result => result) end end result = struct.instance_exec(*args, &dynamic_item[:block]) end if(block_given?) result.instance_exec(&block) end rescue Error::NotFound::Dynamic result = builtin_insert(dynamic_name, struct, *args, &block) unless(result) = "Failed to locate requested dynamic block for insertion: #{dynamic_name} " \ "(valid: #{struct._self.sparkle.dynamics.keys.sort.join(', ')})" if(struct._self.provider_resources && struct._self.provider_resources.registry.keys.size > 1) t_name = struct._self.provider_resources.registry.keys.first valid_t_name = Bogo::Utility.snake( t_name.split( struct._self.provider_resources.resource_type_splitter ).join('_') ) << "\nBuiltin dynamics pattern `#{t_name}` -> `:#{Bogo::Utility.snake(valid_t_name)}`" end raise end end result end |
.load_component(path) ⇒ SparkleStruct
Load component
131 132 133 134 |
# File 'lib/sparkle_formation/sparkle_formation.rb', line 131 def load_component(path) instance_eval(IO.read(path), path, 1) @_struct end |
.load_dynamics!(directory) ⇒ TrueClass
Load all dynamics within a directory
140 141 142 143 144 145 146 147 148 149 150 |
# File 'lib/sparkle_formation/sparkle_formation.rb', line 140 def load_dynamics!(directory) @loaded_dynamics ||= [] Dir.glob(File.join(directory, '*.rb')).each do |dyn| dyn = File.(dyn) next if @loaded_dynamics.include?(dyn) instance_eval(IO.read(dyn), dyn, 1) @loaded_dynamics << dyn end @loaded_dynamics.uniq! true end |
.load_registry!(directory) ⇒ TrueClass
Load all registry entries within a directory
156 157 158 159 160 161 162 |
# File 'lib/sparkle_formation/sparkle_formation.rb', line 156 def load_registry!(directory) Dir.glob(File.join(directory, '*.rb')).each do |reg| reg = File.(reg) require reg end true end |
.nest(template, struct, *args, &block) ⇒ SparkleStruct
if symbol is provided for template, double underscores will be used for directory separator and dashes will match underscores
Nest a template into a context
261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 |
# File 'lib/sparkle_formation/sparkle_formation.rb', line 261 def nest(template, struct, *args, &block) = args.detect{|i| i.is_a?(Hash)} if() args.delete() else = {} end [template, *args].compact.each do |item| __t_stringish(item) end to_nest = struct._self.sparkle.get(:template, template) resource_name = template.to_s.gsub('__', '_') unless(args.empty?) resource_name = [ .delete(:overwrite_name) ? nil : resource_name, args.map{|a| Bogo::Utility.snake(a)}.join('_') ].flatten.compact.join('_').to_sym end nested_template = compile(to_nest[:path], :sparkle) nested_template.parent = struct._self nested_template.name = Bogo::Utility.camel(resource_name) if([:parameters]) nested_template.compile_state = [:parameters] end struct.resources.set!(resource_name) do type struct._self.stack_resource_type end unless(struct._self.sparkle.empty?) nested_template.sparkle.apply(struct._self.sparkle) end struct.resources[resource_name].properties.stack nested_template if(block_given?) struct.resources[resource_name].instance_exec(&block) end struct.resources[resource_name] end |
.registry(registry_name, struct, *args) ⇒ SparkleStruct
Insert a dynamic into a context
201 202 203 204 205 |
# File 'lib/sparkle_formation/sparkle_formation.rb', line 201 def registry(registry_name, struct, *args) __t_stringish(registry_name) reg = struct._self.sparkle.get(:registry, registry_name) struct.instance_exec(*args, ®[:block]) end |
.registry_path=(path = nil) ⇒ String Also known as: registry_path
Get/set path to registry files
81 82 83 84 85 86 |
# File 'lib/sparkle_formation/sparkle_formation.rb', line 81 def registry_path=(path=nil) if(path) custom_paths[:registry_directory] = path end custom_paths[:registry_directory] end |
.sparkle_path=(path = nil) ⇒ String Also known as: sparkle_path
Get/set path to sparkle directory
42 43 44 45 46 47 48 49 50 |
# File 'lib/sparkle_formation/sparkle_formation.rb', line 42 def sparkle_path=(path=nil) if(path) custom_paths[:sparkle_path] = path custom_paths[:components_directory] = File.join(path, 'components') custom_paths[:dynamics_directory] = File.join(path, 'dynamics') custom_paths[:registry_directory] = File.join(path, 'registry') end custom_paths[:sparkle_path] end |
Instance Method Details
#apply_deep_nesting(*args) {|stack, resource, s_name| ... } ⇒ Hash
Apply deeply nested stacks. This is the new nesting approach and does not bubble parameters up to the root stack. Parameters are isolated to the stack resource itself and output mapping is automatically applied.
820 821 822 |
# File 'lib/sparkle_formation/sparkle_formation.rb', line 820 def apply_deep_nesting(*args, &block) compile.dump! end |
#apply_nesting(*args, &block) ⇒ Hash
see specific version for expected block parameters
Apply nesting logic to stack
802 803 804 805 806 807 808 |
# File 'lib/sparkle_formation/sparkle_formation.rb', line 802 def apply_nesting(*args, &block) if(args.include?(:shallow)) apply_shallow_nesting(&block) else apply_deep_nesting(&block) end end |
#apply_shallow_nesting(*args) {|resource_name, stack| ... } ⇒ Hash
Apply shallow nesting. This style of nesting will bubble parameters up to the root stack. This type of nesting is the original and now deprecated, but remains for compat issues so any existing usage won’t be automatically busted.
878 879 880 |
# File 'lib/sparkle_formation/sparkle_formation.rb', line 878 def apply_shallow_nesting(*args, &block) compile.dump! end |
#block(block) ⇒ TrueClass Also known as: load_block
Add block to load order
628 629 630 631 632 |
# File 'lib/sparkle_formation/sparkle_formation.rb', line 628 def block(block) @components[:__base__] = block @load_order << :__base__ true end |
#collect_outputs(*args) ⇒ Smash<output_name:SparkleFormation>
883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 |
# File 'lib/sparkle_formation/sparkle_formation.rb', line 883 def collect_outputs(*args) if(args.include?(:force) || root?) unless(compile.outputs.nil?) outputs = Smash[ compile.outputs.keys!.zip( [self] * compile.outputs.keys!.size ) ] else outputs = Smash.new end nested_stacks.each do |nested_stack| outputs = nested_stack.collect_outputs(:force).merge(outputs) end outputs else root.collect_outputs(:force) end end |
#compile(args = {}) ⇒ SparkleStruct
Compile the formation
668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 |
# File 'lib/sparkle_formation/sparkle_formation.rb', line 668 def compile(args={}) if(args.key?(:state)) @compile_state = args[:state] unmemoize(:compile) end memoize(:compile) do # NOTE: this is where we inject inherit or layering seed_self set_compile_time_parameters! if(provider && SparkleAttribute.const_defined?(camel(provider))) const = SparkleAttribute.const_get(camel(provider)) struct_class = Class.new(SparkleStruct) struct_class.include(const) struct_name = [SparkleStruct.name, camel(provider)].join('::') struct_class.define_singleton_method(:name){ struct_name } struct_class.define_singleton_method(:to_s){ struct_name } else struct_class = SparkleStruct end if(Resources.const_defined?(camel(provider))) @provider_resources = Resources.const_get(camel(provider)) provider_resources.load! end compiled = struct_class.new compiled._set_self(self) compiled._struct_class = struct_class if(struct_class.const_defined?(:CAMEL_KEYS)) compiled._camel_keys = struct_class.const_get(:CAMEL_KEYS) end if(struct_class.const_defined?(:CAMEL_STYLE)) compiled._camel_style = struct_class.const_get(:CAMEL_STYLE) end if(compile_state) compiled.set_state!(compile_state) end @load_order.each do |key| if(components[key]) self.class.build(compiled, &components[key]) else sparkle.get(:component, key).monochrome.each do |component_block| self.class.build(compiled, &component_block[:block]) end end end @overrides.each do |override| if(override[:args] && !override[:args].empty?) compiled._set_state(override[:args]) end self.class.build(compiled, &override[:block]) end if(compile_state && !compile_state.empty?) compiled.outputs.compile_state.value MultiJson.dump(compile_state) end compiled end end |
#compile_time_parameter_setter {|| ... } ⇒ Proc, NilClass
Get or set the compile time parameter setting block. If a get request the ancestor path will be searched to root
586 587 588 589 590 591 592 593 594 595 596 |
# File 'lib/sparkle_formation/sparkle_formation.rb', line 586 def compile_time_parameter_setter(&block) if(block) @compile_time_parameter_setter = block else if(@compile_time_parameter_setter) @compile_time_parameter_setter else parent.nil? ? nil : parent.compile_time_parameter_setter end end end |
#dump ⇒ Hash
922 923 924 |
# File 'lib/sparkle_formation/sparkle_formation.rb', line 922 def dump MultiJson.load(to_json) end |
#extract_template_data(template) ⇒ self
Extract information from given template and integrate with current instance
496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 |
# File 'lib/sparkle_formation/sparkle_formation.rb', line 496 def extract_template_data(template) if(provider != template.provider) raise TypeError.new "This template `#{name}` cannot inherit template `#{template.name}`! Provider mismatch: `#{provider}` != `#{template.provider}`" # rubocop:disable Metrics/LineLength end template.sparkle.apply(sparkle) template.seed_self blacklisted_templates.replace( (blacklisted_templates + template.blacklisted_templates).map(&:to_s).uniq ) @parameters = template.parameters @overrides = template.raw_overrides + raw_overrides new_components = template.components new_load_order = template.load_order load_order.each do |comp_key| if(components[comp_key]) original_key = comp_key comp_key = "#{comp_key}_#{Smash.new(:name => name, :path => template_path).checksum}_child" new_components[comp_key] = components[original_key] end new_load_order << comp_key end @components = new_components @load_order = new_load_order self end |
#extract_templates {|stack, resource, s_name| ... } ⇒ Object
Extract and process nested stacks
852 853 854 |
# File 'lib/sparkle_formation/sparkle_formation.rb', line 852 def extract_templates(&block) stack_template_extractor(nested_stacks(:with_resource, :with_name), &block) end |
#generate_policy ⇒ Hash
Generate policy for stack
793 794 795 |
# File 'lib/sparkle_formation/sparkle_formation.rb', line 793 def generate_policy Smash.new end |
#includes_policies?(stack_hash = nil) ⇒ TrueClass, FalseClass
779 780 781 782 783 784 785 786 787 788 |
# File 'lib/sparkle_formation/sparkle_formation.rb', line 779 def includes_policies?(stack_hash=nil) if(stack_hash) raise Error::Deprecated.new "Hash parameter no longer valid for this method (`#{self.class}##{__callee__}`)" end unless(compile.resources.nil?) compile.resources._data.any? do |r_name, r_value| !r_value.policy.nil? end end end |
#inherit_from(template_name) ⇒ self
Inhert template structure
481 482 483 484 485 486 487 488 489 490 |
# File 'lib/sparkle_formation/sparkle_formation.rb', line 481 def inherit_from(template_name) if(blacklisted_templates.map(&:to_s).include?(template_name.to_s)) raise Error::CircularInheritance.new "Circular inheritance detected between templates `#{template_name}` and `#{name}`" # rubocop:disable Metrics/LineLength end template = self.class.compile(sparkle.get(:template, template_name)[:path], :sparkle) template.blacklisted_templates.replace( (template.blacklisted_templates + blacklisted_templates).map(&:to_s).uniq ) extract_template_data(template) end |
#isolated_nests?(stack_hash = nil) ⇒ TrueClass, FalseClass
767 768 769 770 771 772 773 774 775 776 |
# File 'lib/sparkle_formation/sparkle_formation.rb', line 767 def isolated_nests?(stack_hash=nil) if(stack_hash) raise Error::Deprecated.new "Hash parameter no longer valid for this method (`#{self.class}##{__callee__}`)" end unless(compile.resources.nil?) compile.resources._data.all? do |r_name, r_value| stack_resource_type?(r_value.type) end end end |
#load(*args) ⇒ self
Load components into instance
639 640 641 642 643 644 645 646 647 648 649 650 651 652 |
# File 'lib/sparkle_formation/sparkle_formation.rb', line 639 def load(*args) args.each do |thing| key = File.basename(thing.to_s).sub('.rb', '') if(thing.is_a?(String)) # NOTE: This needs to be deprecated and removed # TODO: deprecate components[key] = self.class.load_component(thing) @load_order << key else @load_order << thing end end self end |
#make_output_available(output_name, outputs) ⇒ Object
Extract output to make available for stack parameter usage at the current depth
842 843 844 |
# File 'lib/sparkle_formation/sparkle_formation.rb', line 842 def make_output_available(output_name, outputs) {} end |
#merge_previous! ⇒ self
Merge previous layer template structure
469 470 471 472 473 474 475 |
# File 'lib/sparkle_formation/sparkle_formation.rb', line 469 def merge_previous! my_index = sparkle.get(:template, name).spectrum.find_index do |item| item[:path] == template_path end template = self.class.compile(sparkle.get(:template, name).layer_at(my_index - 1)[:path], :sparkle) extract_template_data(template) end |
#nested?(stack_hash = nil) ⇒ TrueClass, FalseClass
755 756 757 758 759 760 761 762 763 764 |
# File 'lib/sparkle_formation/sparkle_formation.rb', line 755 def nested?(stack_hash=nil) if(stack_hash) raise Error::Deprecated.new "Hash parameter no longer valid for this method (`#{self.class}##{__callee__}`)" end unless(compile.resources.nil?) compile.resources._data.any? do |r_name, r_value| stack_resource_type?(r_value.type) end end end |
#nested_stacks(*args) ⇒ Array<SparkleFormation>
735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 |
# File 'lib/sparkle_formation/sparkle_formation.rb', line 735 def nested_stacks(*args) if(compile[:resources]) compile.resources.keys!.map do |key| if(stack_resource_type?(compile.resources[key].type)) result = [compile.resources[key].properties.stack] if(args.include?(:with_resource)) result.push(compile[:resources][key]) end if(args.include?(:with_name)) result.push(key) end result.size == 1 ? result.first : result end end.compact else [] end end |
#output_matched?(p_name, output_names) ⇒ String, NilClass
will auto downcase name prior to comparison
Check if parameter name matches an output name
830 831 832 833 834 |
# File 'lib/sparkle_formation/sparkle_formation.rb', line 830 def output_matched?(p_name, output_names) output_names.detect do |o_name| Bogo::Utility.snake(o_name).tr('_', '') == Bogo::Utility.snake(p_name).tr('_', '') end end |
#overrides(args = {}) { ... } ⇒ Object
Registers block into overrides
658 659 660 661 |
# File 'lib/sparkle_formation/sparkle_formation.rb', line 658 def overrides(args={}, &block) @overrides << {:args => args, :block => block} self end |
#raw_overrides ⇒ Array<Proc>
441 442 443 |
# File 'lib/sparkle_formation/sparkle_formation.rb', line 441 def raw_overrides @overrides end |
#recompile ⇒ SparkleStruct
Clear compiled stack if cached and perform compilation again
729 730 731 732 |
# File 'lib/sparkle_formation/sparkle_formation.rb', line 729 def recompile unmemoize(:compile) compile end |
#remap_nested_parameters(template, parameters, stack_name, stack_resource, output_map) ⇒ TrueClass
if parameter has includes ‘StackUnique` a new parameter will be added to container stack and it will not use outputs
Extract parameters from nested stacks. Check for previous nested stack outputs that match parameter. If match, set parameter to use output. If no match, check container stack parameters for match. If match, set to use ref. If no match, add parameter to container stack parameters and set to use ref.
917 918 919 |
# File 'lib/sparkle_formation/sparkle_formation.rb', line 917 def remap_nested_parameters(template, parameters, stack_name, stack_resource, output_map) true end |
#root ⇒ SparkleFormation
555 556 557 558 559 560 561 |
# File 'lib/sparkle_formation/sparkle_formation.rb', line 555 def root if(parent) parent.root else self end end |
#root? ⇒ TrueClass, FalseClass
573 574 575 |
# File 'lib/sparkle_formation/sparkle_formation.rb', line 573 def root? root == self end |
#root_path ⇒ Array<SparkleFormation] path to root
564 565 566 567 568 569 570 |
# File 'lib/sparkle_formation/sparkle_formation.rb', line 564 def root_path if(parent) [*parent.root_path, self].compact else [self] end end |
#seed_self ⇒ self
Update underlying data structures based on inherit or layering behavior if defined for this template
450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 |
# File 'lib/sparkle_formation/sparkle_formation.rb', line 450 def seed_self memoize(:seed) do = @seed if([:inherit] && [:layering].to_s == 'merge') raise ArgumentError.new 'Cannot merge and inherit!' end if([:inherit]) inherit_from([:inherit]) elsif([:layering].to_s == 'merge') merge_previous! end true end self end |
#set_compile_time_parameters! ⇒ Object
Set the compile time parameters for the stack if the setter proc is available
600 601 602 603 604 |
# File 'lib/sparkle_formation/sparkle_formation.rb', line 600 def set_compile_time_parameters! if(compile_time_parameter_setter) compile_time_parameter_setter.call(self) end end |
#set_generation_parameters!(params) ⇒ Hash
Validation parameters used for template generation to ensure they are in the expected format
612 613 614 615 616 617 618 619 620 621 622 |
# File 'lib/sparkle_formation/sparkle_formation.rb', line 612 def set_generation_parameters!(params) params.each do |name, value| unless(value.is_a?(Hash)) raise TypeError.new("Expecting `Hash` type. Received `#{value.class}`") end if(key = value.keys.detect{|k| !ALLOWED_GENERATION_PARAMETERS.include?(k.to_s) }) raise ArgumentError.new("Invalid generation parameter key provided `#{key}`") end end params end |
#stack_resource_type ⇒ String
523 524 525 |
# File 'lib/sparkle_formation/sparkle_formation.rb', line 523 def stack_resource_type DEFAULT_STACK_RESOURCE end |
#stack_resource_type?(type) ⇒ TrueClass, FalseClass
Check if type is a registered stack type
550 551 552 |
# File 'lib/sparkle_formation/sparkle_formation.rb', line 550 def stack_resource_type?(type) stack_resource_types.include?(type) end |
#stack_template_extractor(x_stacks, &block) ⇒ Object
Run the stack extraction
859 860 861 862 863 864 865 866 867 |
# File 'lib/sparkle_formation/sparkle_formation.rb', line 859 def stack_template_extractor(x_stacks, &block) x_stacks.each do |stack, resource, s_name| unless(stack.nested_stacks.empty?) stack_template_extractor(stack.nested_stacks(:with_resource, :with_name), &block) end resource.properties.set!(:stack, stack.compile.dump!) block.call(s_name, stack, resource) end end |
#to_json(*args) ⇒ String
927 928 929 |
# File 'lib/sparkle_formation/sparkle_formation.rb', line 927 def to_json(*args) MultiJson.dump(compile.dump!, *args) end |