sparkle_formation 0.1.6 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +10 -0
- data/CONTRIBUTING.md +25 -0
- data/README.md +84 -76
- data/bin/aws_resources +36 -2
- data/examples/allinone/cloudformation/ec2_example.rb +1 -1
- data/examples/allinone/parse.rb +2 -0
- data/examples/ami_component/cloudformation/ec2_example.rb +13 -15
- data/examples/ami_component/parse.rb +2 -0
- data/lib/sparkle_formation.rb +1 -0
- data/lib/sparkle_formation/aws.rb +29 -14
- data/lib/sparkle_formation/sparkle_attribute.rb +64 -3
- data/lib/sparkle_formation/sparkle_formation.rb +133 -54
- data/lib/sparkle_formation/sparkle_struct.rb +3 -0
- data/lib/sparkle_formation/translation.rb +165 -39
- data/lib/sparkle_formation/translation/heat.rb +73 -8
- data/lib/sparkle_formation/translation/rackspace.rb +81 -10
- data/lib/sparkle_formation/utils.rb +37 -0
- data/lib/sparkle_formation/version.rb +1 -1
- data/sparkle_formation.gemspec +1 -1
- data/test/spec.rb +6 -0
- data/test/specs/attribute.rb +72 -0
- data/test/specs/basic.rb +76 -0
- data/test/specs/cloudformation/components/ami.rb +14 -0
- data/test/specs/cloudformation/dynamics/node.rb +16 -0
- data/test/specs/results/base.json +43 -0
- data/test/specs/results/base_with_map.json +50 -0
- data/test/specs/results/component.json +27 -0
- metadata +13 -5
- data/sparkle_formation-0.2.0.gem +0 -0
@@ -1,24 +1,31 @@
|
|
1
1
|
require 'sparkle_formation'
|
2
2
|
|
3
3
|
class SparkleFormation
|
4
|
+
# AWS resource helper
|
4
5
|
class Aws
|
5
6
|
class << self
|
6
7
|
|
7
8
|
include SparkleFormation::Utils::AnimalStrings
|
9
|
+
# @!parse include SparkleFormation::Utils::AnimalStrings
|
8
10
|
|
9
|
-
# type:: AWS CFN resource type
|
10
|
-
# hash:: Hash of information
|
11
11
|
# Register an AWS resource
|
12
|
+
#
|
13
|
+
# @param type [String] AWS CFN resource type
|
14
|
+
# @param hash [Hash] metadata information
|
15
|
+
# @return [TrueClass]
|
12
16
|
def register(type, hash)
|
13
17
|
unless(class_variable_defined?(:@@registry))
|
14
18
|
@@registry = AttributeStruct.hashish.new
|
15
19
|
end
|
16
20
|
@@registry[type] = hash
|
21
|
+
true
|
17
22
|
end
|
18
23
|
|
19
|
-
#
|
20
|
-
#
|
21
|
-
#
|
24
|
+
# Resource information
|
25
|
+
#
|
26
|
+
# @param identifier [String, Symbol] resource identifier
|
27
|
+
# @param key [String, Symbol] specific data
|
28
|
+
# @return [Hashish]
|
22
29
|
def resource(identifier, key=nil)
|
23
30
|
res = lookup(identifier)
|
24
31
|
if(key && res)
|
@@ -28,8 +35,10 @@ class SparkleFormation
|
|
28
35
|
end
|
29
36
|
end
|
30
37
|
|
31
|
-
# json_path_or_hash:: Path to JSON file or Hash instance of resources
|
32
38
|
# Register all discovered resources
|
39
|
+
#
|
40
|
+
# @param json_path_or_hash [String, Hashish] path to files or hash
|
41
|
+
# @return [TrueClass]
|
33
42
|
def load(json_path_or_hash)
|
34
43
|
if(json_path_or_hash.is_a?(String))
|
35
44
|
require 'json'
|
@@ -44,14 +53,18 @@ class SparkleFormation
|
|
44
53
|
end
|
45
54
|
|
46
55
|
# Load the builtin AWS resources
|
56
|
+
#
|
57
|
+
# @return [TrueClass]
|
47
58
|
def load!
|
48
59
|
require File.join(File.dirname(__FILE__), 'aws', 'cfn_resources.rb')
|
49
60
|
load(AWS_RESOURCES)
|
61
|
+
true
|
50
62
|
end
|
51
63
|
|
52
|
-
# key
|
53
|
-
#
|
54
|
-
#
|
64
|
+
# Discover registry key via part searching
|
65
|
+
#
|
66
|
+
# @param key [String, Symbol]
|
67
|
+
# @return [String, NilClass]
|
55
68
|
def registry_key(key)
|
56
69
|
key = key.to_s
|
57
70
|
@@registry.keys.detect do |ref|
|
@@ -66,19 +79,20 @@ class SparkleFormation
|
|
66
79
|
end
|
67
80
|
end
|
68
81
|
|
69
|
-
#
|
70
|
-
#
|
71
|
-
#
|
82
|
+
# Registry information for given type
|
83
|
+
#
|
84
|
+
# @param key [String, Symbol]
|
85
|
+
# @return [Hashish, NilClass]
|
72
86
|
def lookup(key)
|
73
87
|
@@registry[registry_key(key)]
|
74
88
|
end
|
75
89
|
|
76
|
-
#
|
90
|
+
# @return [Hashish] currently loaded AWS registry
|
77
91
|
def registry
|
78
92
|
if(class_variable_defined?(:@@registry))
|
79
93
|
@@registry
|
80
94
|
else
|
81
|
-
|
95
|
+
@@registry = AttributeStruct.hashish.new
|
82
96
|
end
|
83
97
|
end
|
84
98
|
|
@@ -86,4 +100,5 @@ class SparkleFormation
|
|
86
100
|
end
|
87
101
|
end
|
88
102
|
|
103
|
+
# Shortcut helper constant
|
89
104
|
SfnAws = SparkleFormation::Aws
|
@@ -19,8 +19,14 @@
|
|
19
19
|
require 'sparkle_formation'
|
20
20
|
|
21
21
|
class SparkleFormation
|
22
|
+
|
23
|
+
# Provides template helper methods
|
22
24
|
module SparkleAttribute
|
23
25
|
|
26
|
+
# Fn::Join generator
|
27
|
+
#
|
28
|
+
# @param args [Object]
|
29
|
+
# @return [Hash]
|
24
30
|
def _cf_join(*args)
|
25
31
|
options = args.detect{|i| i.is_a?(Hash) && i[:options]} || {:options => {}}
|
26
32
|
args.delete(options)
|
@@ -29,13 +35,26 @@ class SparkleFormation
|
|
29
35
|
end
|
30
36
|
{'Fn::Join' => [options[:options][:delimiter] || '', *args]}
|
31
37
|
end
|
38
|
+
alias_method :join!, :_cf_join
|
32
39
|
|
40
|
+
# Ref generator
|
41
|
+
#
|
42
|
+
# @param thing [String, Symbol] reference name
|
43
|
+
# @return [Hash]
|
44
|
+
# @note Symbol value will force key processing
|
33
45
|
def _cf_ref(thing)
|
34
46
|
thing = _process_key(thing, :force) if thing.is_a?(Symbol)
|
35
47
|
{'Ref' => thing}
|
36
48
|
end
|
37
49
|
alias_method :_ref, :_cf_ref
|
38
|
-
|
50
|
+
alias_method :ref!, :_cf_ref
|
51
|
+
|
52
|
+
# Fn::FindInMap generator
|
53
|
+
#
|
54
|
+
# @param thing [String, Symbol] thing to find
|
55
|
+
# @param key [String, Symbol] thing to search
|
56
|
+
# @param suffix [Object] additional args
|
57
|
+
# @return [Hash]
|
39
58
|
def _cf_map(thing, key, *suffix)
|
40
59
|
suffix = suffix.map do |item|
|
41
60
|
if(item.is_a?(Symbol))
|
@@ -49,7 +68,13 @@ class SparkleFormation
|
|
49
68
|
{'Fn::FindInMap' => [_process_key(thing), {'Ref' => _process_key(key)}, *suffix]}
|
50
69
|
end
|
51
70
|
alias_method :_cf_find_in_map, :_cf_map
|
71
|
+
alias_method :find_in_map!, :_cf_map
|
72
|
+
alias_method :map!, :_cf_map
|
52
73
|
|
74
|
+
# Fn::GetAtt generator
|
75
|
+
#
|
76
|
+
# @param [Object] pass through arguments
|
77
|
+
# @return [Hash]
|
53
78
|
def _cf_attr(*args)
|
54
79
|
args = args.map do |thing|
|
55
80
|
if(thing.is_a?(Symbol))
|
@@ -62,11 +87,22 @@ class SparkleFormation
|
|
62
87
|
{'Fn::GetAtt' => args}
|
63
88
|
end
|
64
89
|
alias_method :_cf_get_att, :_cf_attr
|
90
|
+
alias_method :get_att!, :_cf_attr
|
91
|
+
alias_method :attr!, :_cf_attr
|
65
92
|
|
93
|
+
# Fn::Base64 generator
|
94
|
+
#
|
95
|
+
# @param arg [Object] pass through
|
96
|
+
# @return [Hash]
|
66
97
|
def _cf_base64(arg)
|
67
98
|
{'Fn::Base64' => arg}
|
68
99
|
end
|
100
|
+
alias_method :base64!, :_cf_base64
|
69
101
|
|
102
|
+
# Fn::GetAZs generator
|
103
|
+
#
|
104
|
+
# @param region [String, Symbol] String will pass through. Symbol will be converted to ref
|
105
|
+
# @return [Hash]
|
70
106
|
def _cf_get_azs(region=nil)
|
71
107
|
region = case region
|
72
108
|
when Symbol
|
@@ -78,30 +114,55 @@ class SparkleFormation
|
|
78
114
|
end
|
79
115
|
{'Fn::GetAZs' => region}
|
80
116
|
end
|
81
|
-
|
117
|
+
alias_method :get_azs!, :_cf_get_azs
|
118
|
+
alias_method :azs!, :_cf_get_azs
|
119
|
+
|
120
|
+
# Fn::Select generator
|
121
|
+
#
|
122
|
+
# @param index [String, Symbol, Integer] Symbol will be converted to ref
|
123
|
+
# @param item [Object, Symbol] Symbol will be converted to ref
|
124
|
+
# @return [Hash]
|
82
125
|
def _cf_select(index, item)
|
126
|
+
index = index.is_a?(Symbol) ? _cf_ref(index) : index
|
83
127
|
item = _cf_ref(item) if item.is_a?(Symbol)
|
84
|
-
{'Fn::Select' => [index
|
128
|
+
{'Fn::Select' => [index, item]}
|
85
129
|
end
|
130
|
+
alias_method :select!, :_cf_select
|
86
131
|
|
132
|
+
# @return [TrueClass, FalseClass]
|
87
133
|
def rhel?
|
88
134
|
!!@platform[:rhel]
|
89
135
|
end
|
90
136
|
|
137
|
+
# @return [TrueClass, FalseClass]
|
91
138
|
def debian?
|
92
139
|
!!@platform[:debian]
|
93
140
|
end
|
94
141
|
|
142
|
+
# Set the destination platform
|
143
|
+
#
|
144
|
+
# @param plat [String, Symbol] one of :rhel or :debian
|
145
|
+
# @return [TrueClass]
|
95
146
|
def _platform=(plat)
|
96
147
|
@platform || __hashish
|
97
148
|
@platform.clear
|
98
149
|
@platform[plat.to_sym] = true
|
99
150
|
end
|
100
151
|
|
152
|
+
# Dynamic insertion helper method
|
153
|
+
#
|
154
|
+
# @param name [String, Symbol] dynamic name
|
155
|
+
# @param args [Object] argument list for dynamic
|
156
|
+
# @return [self]
|
101
157
|
def dynamic!(name, *args, &block)
|
102
158
|
SparkleFormation.insert(name, self, *args, &block)
|
103
159
|
end
|
104
160
|
|
161
|
+
# Registry insertion helper method
|
162
|
+
#
|
163
|
+
# @param name [String, Symbol] name of registry item
|
164
|
+
# @param args [Object] argument list for registry
|
165
|
+
# @return [self]
|
105
166
|
def registry!(name, *args)
|
106
167
|
SfnRegistry.insert(name, self, *args)
|
107
168
|
end
|
@@ -20,24 +20,31 @@ require 'sparkle_formation'
|
|
20
20
|
|
21
21
|
SparkleFormation::SparkleStruct.camel_keys = true
|
22
22
|
|
23
|
+
# Formation container
|
23
24
|
class SparkleFormation
|
24
25
|
|
25
26
|
include SparkleFormation::Utils::AnimalStrings
|
27
|
+
# @!parse include SparkleFormation::Utils::AnimalStrings
|
28
|
+
extend SparkleFormation::Utils::AnimalStrings
|
29
|
+
# @!parse extend SparkleFormation::Utils::AnimalStrings
|
26
30
|
|
27
31
|
class << self
|
28
32
|
|
29
|
-
|
30
|
-
|
31
|
-
|
33
|
+
# @return [Hashish] loaded dynamics
|
34
|
+
def dynamics
|
35
|
+
@dynamics ||= SparkleStruct.hashish.new
|
36
|
+
end
|
32
37
|
|
33
|
-
#
|
38
|
+
# @return [Hashish] custom paths
|
34
39
|
def custom_paths
|
35
|
-
@_paths ||=
|
40
|
+
@_paths ||= SparkleStruct.hashish.new
|
36
41
|
@_paths
|
37
42
|
end
|
38
43
|
|
39
|
-
# path
|
40
|
-
#
|
44
|
+
# Get/set path to sparkle directory
|
45
|
+
#
|
46
|
+
# @param path [String] path to directory
|
47
|
+
# @return [String] path to directory
|
41
48
|
def sparkle_path=(path=nil)
|
42
49
|
if(path)
|
43
50
|
custom_paths[:sparkle_path] = path
|
@@ -49,8 +56,10 @@ class SparkleFormation
|
|
49
56
|
end
|
50
57
|
alias_method(:sparkle_path, :sparkle_path=)
|
51
58
|
|
52
|
-
# path
|
53
|
-
#
|
59
|
+
# Get/set path to component files
|
60
|
+
#
|
61
|
+
# @param path [String] path to component files
|
62
|
+
# @return [String] path to component files
|
54
63
|
def components_path=(path=nil)
|
55
64
|
if(path)
|
56
65
|
custom_paths[:components_directory] = path
|
@@ -59,8 +68,10 @@ class SparkleFormation
|
|
59
68
|
end
|
60
69
|
alias_method(:components_path, :components_path=)
|
61
70
|
|
62
|
-
# path
|
63
|
-
#
|
71
|
+
# Get/set path to dynamic files
|
72
|
+
#
|
73
|
+
# @param path [String] path to dynamic files
|
74
|
+
# @return [String] path to dynamic files
|
64
75
|
def dynamics_path=(path=nil)
|
65
76
|
if(path)
|
66
77
|
custom_paths[:dynamics_directory] = path
|
@@ -69,8 +80,10 @@ class SparkleFormation
|
|
69
80
|
end
|
70
81
|
alias_method(:dynamics_path, :dynamics_path=)
|
71
82
|
|
72
|
-
# path
|
73
|
-
#
|
83
|
+
# Get/set path to registry files
|
84
|
+
#
|
85
|
+
# @param path [String] path to registry files
|
86
|
+
# @return [String] path to registry files
|
74
87
|
def registry_path=(path=nil)
|
75
88
|
if(path)
|
76
89
|
custom_paths[:registry_directory] = path
|
@@ -79,32 +92,40 @@ class SparkleFormation
|
|
79
92
|
end
|
80
93
|
alias_method(:registry_path, :registry_path=)
|
81
94
|
|
82
|
-
#
|
83
|
-
#
|
84
|
-
#
|
85
|
-
#
|
95
|
+
# Compile file
|
96
|
+
#
|
97
|
+
# @param path [String] path to file
|
98
|
+
# @param args [Object] use :sparkle to return struct
|
99
|
+
# @return [Hashish, SparkleStruct]
|
86
100
|
def compile(path, *args)
|
87
101
|
formation = self.instance_eval(IO.read(path), path, 1)
|
88
102
|
args.include?(:sparkle) ? formation : formation.compile._dump
|
89
103
|
end
|
90
104
|
|
91
|
-
#
|
92
|
-
#
|
105
|
+
# Execute given block within struct context
|
106
|
+
#
|
107
|
+
# @param base [SparkleStruct] context for block
|
108
|
+
# @yield block to execute
|
109
|
+
# @return [SparkleStruct] provided base or new struct
|
93
110
|
def build(base=nil, &block)
|
94
111
|
struct = base || SparkleStruct.new
|
95
112
|
struct.instance_exec(&block)
|
96
113
|
@_struct = struct
|
97
114
|
end
|
98
115
|
|
99
|
-
#
|
100
|
-
#
|
116
|
+
# Load component
|
117
|
+
#
|
118
|
+
# @param path [String] path to component
|
119
|
+
# @return [SparkleStruct] resulting struct
|
101
120
|
def load_component(path)
|
102
121
|
self.instance_eval(IO.read(path), path, 1)
|
103
122
|
@_struct
|
104
123
|
end
|
105
124
|
|
106
|
-
# directory
|
107
|
-
#
|
125
|
+
# Load all dynamics within a directory
|
126
|
+
#
|
127
|
+
# @param directory [String]
|
128
|
+
# @return [TrueClass]
|
108
129
|
def load_dynamics!(directory)
|
109
130
|
@loaded_dynamics ||= []
|
110
131
|
Dir.glob(File.join(directory, '*.rb')).each do |dyn|
|
@@ -117,8 +138,10 @@ class SparkleFormation
|
|
117
138
|
true
|
118
139
|
end
|
119
140
|
|
120
|
-
# directory
|
121
|
-
#
|
141
|
+
# Load all registry entries within a directory
|
142
|
+
#
|
143
|
+
# @param directory [String]
|
144
|
+
# @return [TrueClass]
|
122
145
|
def load_registry!(directory)
|
123
146
|
Dir.glob(File.join(directory, '*.rb')).each do |reg|
|
124
147
|
reg = File.expand_path(reg)
|
@@ -127,49 +150,66 @@ class SparkleFormation
|
|
127
150
|
true
|
128
151
|
end
|
129
152
|
|
130
|
-
#
|
131
|
-
#
|
132
|
-
#
|
153
|
+
# Define and register new dynamic
|
154
|
+
#
|
155
|
+
# @param name [String, Symbol] name of dynamic
|
156
|
+
# @param args [Hash] dynamic metadata
|
157
|
+
# @param args [Hash] :parameters description of _config parameters
|
158
|
+
# @example
|
159
|
+
# metadata describes dynamic parameters for _config hash:
|
160
|
+
# :item_name => {:description => 'Defines item name', :type => 'String'}
|
161
|
+
# @yield dynamic block
|
162
|
+
# @return [TrueClass]
|
133
163
|
def dynamic(name, args={}, &block)
|
134
164
|
@dynamics ||= SparkleStruct.hashish.new
|
135
|
-
|
165
|
+
dynamics[name] = SparkleStruct.hashish[
|
136
166
|
:block, block, :args, SparkleStruct.hashish[args.map(&:to_a)]
|
137
167
|
]
|
168
|
+
true
|
138
169
|
end
|
139
170
|
|
140
|
-
#
|
141
|
-
#
|
171
|
+
# Metadata for dynamic
|
172
|
+
#
|
173
|
+
# @param name [String, Symbol] dynamic name
|
174
|
+
# @return [Hashish] metadata information
|
142
175
|
def dynamic_info(name)
|
143
|
-
if(
|
144
|
-
|
176
|
+
if(dynamics[name])
|
177
|
+
dynamics[name][:args] ||= SparkleStruct.hashish.new
|
145
178
|
else
|
146
179
|
raise KeyError.new("No dynamic registered with provided name (#{name})")
|
147
180
|
end
|
148
181
|
end
|
149
182
|
alias_method :dynamic_information, :dynamic_info
|
150
183
|
|
151
|
-
#
|
152
|
-
#
|
153
|
-
#
|
154
|
-
#
|
184
|
+
# Insert a dynamic into a context
|
185
|
+
#
|
186
|
+
# @param dynamic_name [String, Symbol] dynamic name
|
187
|
+
# @param struct [SparkleStruct] context for insertion
|
188
|
+
# @param args [Object] parameters for dynamic
|
189
|
+
# @return [SparkleStruct]
|
155
190
|
def insert(dynamic_name, struct, *args, &block)
|
156
191
|
result = false
|
157
192
|
if(@dynamics && @dynamics[dynamic_name])
|
158
|
-
struct.instance_exec(*args, &@dynamics[dynamic_name][:block])
|
193
|
+
result = struct.instance_exec(*args, &@dynamics[dynamic_name][:block])
|
194
|
+
if(block_given?)
|
195
|
+
result.instance_exec(&block)
|
196
|
+
end
|
159
197
|
result = struct
|
160
198
|
else
|
161
199
|
result = builtin_insert(dynamic_name, struct, *args, &block)
|
162
200
|
end
|
163
201
|
unless(result)
|
164
|
-
raise "Failed to locate requested dynamic block for insertion: #{dynamic_name} (valid: #{@dynamics.keys.sort.join(', ')})"
|
202
|
+
raise "Failed to locate requested dynamic block for insertion: #{dynamic_name} (valid: #{(@dynamics || {}).keys.sort.join(', ')})"
|
165
203
|
end
|
166
204
|
result
|
167
205
|
end
|
168
206
|
|
169
|
-
#
|
170
|
-
#
|
171
|
-
#
|
172
|
-
#
|
207
|
+
# Insert a builtin dynamic into a context
|
208
|
+
#
|
209
|
+
# @param dynamic_name [String, Symbol] dynamic name
|
210
|
+
# @param struct [SparkleStruct] context for insertion
|
211
|
+
# @param args [Object] parameters for dynamic
|
212
|
+
# @return [SparkleStruct]
|
173
213
|
def builtin_insert(dynamic_name, struct, *args, &block)
|
174
214
|
if(defined?(SfnAws) && lookup_key = SfnAws.registry_key(dynamic_name))
|
175
215
|
_name, _config = *args
|
@@ -195,10 +235,11 @@ class SparkleFormation
|
|
195
235
|
end
|
196
236
|
end
|
197
237
|
|
198
|
-
# hash
|
199
|
-
#
|
200
|
-
#
|
201
|
-
#
|
238
|
+
# Convert hash to SparkleStruct instance
|
239
|
+
#
|
240
|
+
# @param hash [Hashish]
|
241
|
+
# @return [SparkleStruct]
|
242
|
+
# @note will do best effort on camel key auto discovery
|
202
243
|
def from_hash(hash)
|
203
244
|
struct = SparkleStruct.new
|
204
245
|
struct._camel_keys_set(:auto_discovery)
|
@@ -208,16 +249,33 @@ class SparkleFormation
|
|
208
249
|
end
|
209
250
|
end
|
210
251
|
|
252
|
+
# @return [Symbol] name of formation
|
211
253
|
attr_reader :name
|
254
|
+
# @return [String] base path
|
212
255
|
attr_reader :sparkle_path
|
256
|
+
# @return [String] components path
|
213
257
|
attr_reader :components_directory
|
258
|
+
# @return [String] dynamics path
|
214
259
|
attr_reader :dynamics_directory
|
260
|
+
# @return [String] registry path
|
215
261
|
attr_reader :registry_directory
|
262
|
+
# @return [Array] components to load
|
216
263
|
attr_reader :components
|
264
|
+
# @return [Array] order of loading
|
217
265
|
attr_reader :load_order
|
218
266
|
|
267
|
+
# Create new instance
|
268
|
+
#
|
269
|
+
# @param name [String, Symbol] name of formation
|
270
|
+
# @param options [Hash] options
|
271
|
+
# @option options [String] :sparkle_path custom base path
|
272
|
+
# @option options [String] :components_directory custom components path
|
273
|
+
# @option options [String] :dynamics_directory custom dynamics path
|
274
|
+
# @option options [String] :registry_directory custom registry path
|
275
|
+
# @option options [Truthy, Falsey] :disable_aws_builtins do not load builtins
|
276
|
+
# @yield base context
|
219
277
|
def initialize(name, options={}, &block)
|
220
|
-
@name = name
|
278
|
+
@name = name.to_sym
|
221
279
|
@sparkle_path = options[:sparkle_path] ||
|
222
280
|
self.class.custom_paths[:sparkle_path] ||
|
223
281
|
File.join(Dir.pwd, 'cloudformation')
|
@@ -244,15 +302,21 @@ class SparkleFormation
|
|
244
302
|
end
|
245
303
|
end
|
246
304
|
|
247
|
-
#
|
248
|
-
#
|
249
|
-
|
305
|
+
# Add block to load order
|
306
|
+
#
|
307
|
+
# @param block [Proc]
|
308
|
+
# @return [TrueClass]
|
309
|
+
def block(block)
|
250
310
|
@components[:__base__] = self.class.build(&block)
|
251
311
|
@load_order << :__base__
|
312
|
+
true
|
252
313
|
end
|
314
|
+
alias_method :load_block, :block
|
253
315
|
|
254
|
-
#
|
255
|
-
#
|
316
|
+
# Load components into instance
|
317
|
+
#
|
318
|
+
# @param args [String, Symbol] Symbol component names or String paths
|
319
|
+
# @return [self]
|
256
320
|
def load(*args)
|
257
321
|
args.each do |thing|
|
258
322
|
if(thing.is_a?(Symbol))
|
@@ -268,12 +332,17 @@ class SparkleFormation
|
|
268
332
|
end
|
269
333
|
|
270
334
|
# Registers block into overrides
|
335
|
+
#
|
336
|
+
# @param args [Hash] optional arguments to provide state
|
337
|
+
# @yield override block
|
271
338
|
def overrides(args={}, &block)
|
272
339
|
@overrides << {:args => args, :block => block}
|
273
340
|
self
|
274
341
|
end
|
275
342
|
|
276
|
-
#
|
343
|
+
# Compile the formation
|
344
|
+
#
|
345
|
+
# @return [SparkleStruct]
|
277
346
|
def compile
|
278
347
|
compiled = SparkleStruct.new
|
279
348
|
@load_order.each do |key|
|
@@ -288,4 +357,14 @@ class SparkleFormation
|
|
288
357
|
compiled
|
289
358
|
end
|
290
359
|
|
360
|
+
# @return [Hash] dumped hash
|
361
|
+
def dump
|
362
|
+
MultiJson.load(self.to_json)
|
363
|
+
end
|
364
|
+
|
365
|
+
# @return [String] dumped hash JSON
|
366
|
+
def to_json
|
367
|
+
MultiJson.dump(compile.dump!)
|
368
|
+
end
|
369
|
+
|
291
370
|
end
|