sparkle_formation 0.2.2 → 0.2.4

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 (42) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +6 -0
  3. data/README.md +7 -1
  4. data/bin/generate_sparkle_docs +31 -0
  5. data/lib/sparkle_formation/aws.rb +6 -7
  6. data/lib/sparkle_formation/sparkle_attribute.rb +97 -0
  7. data/lib/sparkle_formation/translation/heat.rb +184 -2
  8. data/lib/sparkle_formation/translation/rackspace.rb +7 -3
  9. data/lib/sparkle_formation/translation.rb +28 -2
  10. data/lib/sparkle_formation/version.rb +1 -1
  11. data/sparkle_formation.gemspec +2 -1
  12. metadata +5 -33
  13. data/CONTRIBUTING.md +0 -25
  14. data/Gemfile +0 -3
  15. data/Gemfile.lock +0 -18
  16. data/bin/aws_resources +0 -85
  17. data/bin/heat_resources +0 -33
  18. data/docs/README.md +0 -177
  19. data/docs/anatomy.md +0 -203
  20. data/docs/building-blocks.md +0 -275
  21. data/docs/examples/cloudformation/components/base.rb +0 -25
  22. data/docs/examples/cloudformation/dynamics/elb.rb +0 -23
  23. data/docs/examples/cloudformation/templates/website.rb +0 -30
  24. data/docs/examples/template_json/website.json +0 -88
  25. data/docs/examples/website.rb +0 -74
  26. data/docs/functions.md +0 -41
  27. data/docs/properties.md +0 -32
  28. data/docs/provisioning.md +0 -82
  29. data/docs/resource-reference.md +0 -49
  30. data/examples/allinone/cloudformation/ec2_example.rb +0 -59
  31. data/examples/allinone/parse.rb +0 -14
  32. data/examples/ami_component/cloudformation/components/ami.rb +0 -21
  33. data/examples/ami_component/cloudformation/ec2_example.rb +0 -39
  34. data/examples/ami_component/parse.rb +0 -14
  35. data/test/spec.rb +0 -6
  36. data/test/specs/attribute.rb +0 -72
  37. data/test/specs/basic.rb +0 -76
  38. data/test/specs/cloudformation/components/ami.rb +0 -14
  39. data/test/specs/cloudformation/dynamics/node.rb +0 -16
  40. data/test/specs/results/base.json +0 -43
  41. data/test/specs/results/base_with_map.json +0 -50
  42. data/test/specs/results/component.json +0 -27
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: cba70b56deef5fd41dfd28df337ac9f1af137119
4
- data.tar.gz: 08122ae8c40990d331d8be3bbff0b58293162f18
3
+ metadata.gz: 3f49e3aceb2896698cfb226e53c06f02ed9607d7
4
+ data.tar.gz: 4db5fff53aff957f05f6e933a22a273d52548457
5
5
  SHA512:
6
- metadata.gz: 5fdcff8822399fa54d5274642e865198514607ef84c8eacb70bbe6ab06e86da2fb9fdd97c4092e5abfd2c3a991a4c1bf2c61c8b7f57c31b59c89276ef8604411
7
- data.tar.gz: 027bae7862955e2e0d3ff4aac121daa4a4f67a1937850ce62d90a3d3528c6470b3f8f51009ae58989af726c7c06e11400a38826b9a46cbb7e6d220e732bc8a0c
6
+ metadata.gz: b5a8aea5a9c132d0f7bddf6fa537c37f2d03e7b4e4d93a58690a29c65dc441ab26e6cec640ac7965b4281f68bced0954078762f10b86c84a5e68d7af92190c58
7
+ data.tar.gz: db9da97bd24fe89858a8b822ed4ebb7ec328e24c2dc3d1646d8582236aa6f41ce8d2942a64916a8d5b4d925c9294db668916c8249afd647ee342913e117a59bc
data/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ ## v0.2.4
2
+ * Update builtin registry lookup to better handle all caps types
3
+ * Add helper methods for conditionals
4
+ * Provide better error message when dereferencing mappings that do not exist
5
+ * Add more coverage within heat translation
6
+
1
7
  ## v0.2.2
2
8
  * Lots of translation updates (AWS -> RS "hot")
3
9
  * User Documentation!
data/README.md CHANGED
@@ -13,6 +13,10 @@ Yes. Well, kinda. It also has some extra features, like defining
13
13
  components, dynamics, merging, AWS builtin function helpers, and
14
14
  conjouring magic (to get unicorns).
15
15
 
16
+ ## Expanded User Docs
17
+
18
+ New user documentation is now here! [User Documentation](http://sparkleformation.github.io/sparkle_formation/UserDocs/)
19
+
16
20
  ## What's it look like?
17
21
 
18
22
  Lets use one of the example CF templates that creates an EC2 instance. First
@@ -266,5 +270,7 @@ end
266
270
  * Add examples of accessing parent hash elements
267
271
 
268
272
  # Infos
269
- * Repository: https://github.com/heavywater/sparkle_formation
273
+ * Documentation: http://sparkleformation.github.io/sparkle_formation
274
+ * User Documentation: http://sparkleformation.github.io/sparkle_formation/UserDocs/README.html
275
+ * Repository: https://github.com/sparkleformation/sparkle_formation
270
276
  * IRC: Freenode @ #heavywater
@@ -0,0 +1,31 @@
1
+ #!/usr/bin/env ruby
2
+ require 'fileutils'
3
+
4
+ unless(system("yardoc"))
5
+ $stderr.puts 'ACK: Failed to create docs!'
6
+ exit -1
7
+ end
8
+
9
+ FileUtils.mkdir_p('doc/UserDocs')
10
+
11
+ Dir.glob('docs/**/*').each do |path|
12
+ next unless File.file?(path)
13
+ content = File.read(path)
14
+ new_path = File.join('doc/UserDocs', path.sub(/.*?docs\//, ''))
15
+ FileUtils.mkdir_p(File.dirname(new_path))
16
+ File.open(new_path.sub('.md', '.html'), 'w') do |file|
17
+ if(path.end_with?('.md'))
18
+ file.puts '<!DOCTYPE html><html><title>SparkleFormation User Documentation</title><xmp theme="simplex" style="display:none;">'
19
+ file.puts content.gsub('.md', '.html')
20
+ file.puts '</xmp><script src="http://strapdownjs.com/v/0.2/strapdown.js"></script></html>'
21
+ else
22
+ file.puts content
23
+ end
24
+ end
25
+ end
26
+
27
+ File.open('doc/UserDocs/index.html', 'w') do |file|
28
+ file.puts '<html><head><meta http-equiv="refresh" content="0; url=README.html" /></head></html>'
29
+ end
30
+
31
+ puts 'done.'
@@ -41,8 +41,8 @@ class SparkleFormation
41
41
  # @return [TrueClass]
42
42
  def load(json_path_or_hash)
43
43
  if(json_path_or_hash.is_a?(String))
44
- require 'json'
45
- content = AttributeStruct.hashish.new(JSON.load(File.read(json)))
44
+ require 'multi_json'
45
+ content = AttributeStruct.hashish.new(MultiJson.load(File.read(json)))
46
46
  else
47
47
  content = json_path_or_hash
48
48
  end
@@ -66,13 +66,12 @@ class SparkleFormation
66
66
  # @param key [String, Symbol]
67
67
  # @return [String, NilClass]
68
68
  def registry_key(key)
69
- key = key.to_s
69
+ key = key.to_s.tr('_', '')
70
70
  @@registry.keys.detect do |ref|
71
- ref = ref.tr('::', '_')
72
- snake_ref = snake(ref).to_s.gsub('__', '_')
73
- snake_parts = snake_ref.split('_')
71
+ ref = ref.downcase
72
+ snake_parts = ref.split('::')
74
73
  until(snake_parts.empty?)
75
- break if snake_parts.join('_') == key
74
+ break if snake_parts.join('') == key
76
75
  snake_parts.shift
77
76
  end
78
77
  !snake_parts.empty?
@@ -129,6 +129,103 @@ class SparkleFormation
129
129
  end
130
130
  alias_method :select!, :_cf_select
131
131
 
132
+ # Condition generator
133
+ #
134
+ # @param name [String, Symbol] symbol will be processed
135
+ # @return [Hash]
136
+ def _condition(name)
137
+ {'Condition' => name.is_a?(Symbol) ? _process_key(name) : name}
138
+ end
139
+ alias_method :condition!, :_condition
140
+
141
+ # Condition setter
142
+ #
143
+ # @param name [String, Symbol] condition name
144
+ # @return [SparkleStruct]
145
+ # @note this is used to set a {"Condition" => "Name"} into the
146
+ # current context, generally the top level of a resource
147
+ def _on_condition(name)
148
+ _set(*_condition(name).to_a.flatten)
149
+ end
150
+ alias_method :on_condition!, :_on_condition
151
+
152
+ # Fn::If generator
153
+ #
154
+ # @param cond [String, Symbol] symbol will be converted to condition
155
+ # @param true_value [Object]
156
+ # @param false_value [Object]
157
+ # @return [Hash]
158
+ def _if(cond, true_value, false_value)
159
+ cond = cond.is_a?(Symbol) ? _condition(cond) : cond
160
+ {'Fn::If' => _array(true_value, false_value)}
161
+ end
162
+ alias_method :if!, :_if
163
+
164
+ # Fn::And generator
165
+ #
166
+ # @param args [Object]
167
+ # @return [Hash]
168
+ # @note symbols will be processed and set as condition. strings
169
+ # will be set as condition directly. procs will be evaluated
170
+ def _and(*args)
171
+ {
172
+ 'Fn::And' => _array(
173
+ args.map{|v|
174
+ if(v.is_a?(Symbol) || v.is_a?(String))
175
+ _condition(v)
176
+ else
177
+ v
178
+ end
179
+ }
180
+ )
181
+ }
182
+ end
183
+ alias_method :and!, :_and
184
+
185
+ # Fn::Equals generator
186
+ #
187
+ # @param v1 [Object]
188
+ # @param v2 [Object]
189
+ # @return [Hash]
190
+ def _equals(v1, v2)
191
+ {'Fn::Equals' => _array(v1, v2)}
192
+ end
193
+ alias_method :equals!, :_equals
194
+
195
+ # Fn::Not generator
196
+ #
197
+ # @param arg [Object]
198
+ # @return [Hash]
199
+ def _not(arg)
200
+ if(arg.is_a?(String) || arg.is_a?(Symbol))
201
+ arg = _condition(arg)
202
+ else
203
+ arg = _array(arg).first
204
+ end
205
+ {'Fn::Not' => [arg]}
206
+ end
207
+ alias_method :not!, :_not
208
+
209
+ # Fn::Or generator
210
+ #
211
+ # @param v1 [Object]
212
+ # @param v2 [Object]
213
+ # @return [Hash]
214
+ def _or(v1, v2)
215
+ {
216
+ 'Fn::Or' => _array(
217
+ [v1,v2].map{|v|
218
+ if(v.is_a?(Symbol) || v.is_a?(String))
219
+ _condition(v)
220
+ else
221
+ v
222
+ end
223
+ }
224
+ )
225
+ }
226
+ end
227
+ alias_method :or!, :_or
228
+
132
229
  # @return [TrueClass, FalseClass]
133
230
  def rhel?
134
231
  !!@platform[:rhel]
@@ -60,6 +60,132 @@ class SparkleFormation
60
60
  translated['outputs'] = rename_processor(translated['outputs'])
61
61
  end
62
62
  translated.delete('mappings')
63
+ complete_launch_config_lb_setups
64
+ true
65
+ end
66
+
67
+ # Finalizer for the neutron load balancer resource. This
68
+ # finalizer may generate new resources if the load balancer has
69
+ # multiple listeners defined (neutron lb implementation defines
70
+ # multiple isolated resources sharing a common virtual IP)
71
+ #
72
+ #
73
+ # @param resource_name [String]
74
+ # @param new_resource [Hash]
75
+ # @param old_resource [Hash]
76
+ # @return [Object]
77
+ def neutron_loadbalancer_finalizer(resource_name, new_resource, old_resource)
78
+ listeners = new_resource['Properties'].delete('listeners') || []
79
+ healthcheck = new_resource['Properties'].delete('health_check')
80
+ subnet = (new_resource['Properties'].delete('subnets') || []).first
81
+
82
+ # if health check is provided, create resource and apply to
83
+ # all pools generated
84
+ if(healthcheck)
85
+ healthcheck_name = "#{resource_name}HealthCheck"
86
+ check = {
87
+ healthcheck_name => {
88
+ 'Type' => 'OS::Neutron::HealthMonitor',
89
+ 'Properties' => {}.tap{ |properties|
90
+ {'Timeout' => 'timeout', 'Interval' => 'delay', 'HealthyThreshold' => 'max_retries'}.each do |aws, hot|
91
+ if(healthcheck[aws])
92
+ properties[hot] = healthcheck[aws]
93
+ end
94
+ end
95
+ type, port, path = healthcheck['Target'].split(/(:|\/.*)/).find_all{|x| x != ':'}
96
+ properties['type'] = type
97
+ if(path)
98
+ properties['url_path'] = path
99
+ end
100
+ }
101
+ }
102
+ }
103
+ translated['Resources'].merge!(check)
104
+ end
105
+
106
+ base_listener = listeners.shift
107
+ base_pool_name = "#{resource_name}Pool"
108
+ base_pool = {
109
+ base_pool_name => {
110
+ 'Type' => 'OS::Neutron::Pool',
111
+ 'Properties' => {
112
+ 'lb_method' => 'ROUND_ROBIN',
113
+ 'monitors' => [
114
+ {'get_resource' => healthcheck_name}
115
+ ],
116
+ 'protocol' => base_listener['Protocol'],
117
+ 'vip' => {
118
+ 'protocol_port' => base_listener['LoadBalancerPort']
119
+ },
120
+ 'subnet' => subnet
121
+ }
122
+ }
123
+ }
124
+ if(healthcheck)
125
+ base_pool[base_pool_name]['Properties'].merge(
126
+ 'monitors' => [
127
+ {'get_resource' => healthcheck_name}
128
+ ]
129
+ )
130
+ end
131
+
132
+ translated['Resources'].merge!(base_pool)
133
+ new_resource['Properties']['pool_id'] = {'get_resource' => base_pool_name}
134
+ new_resource['Properties']['protocol_port'] = base_listener['InstancePort']
135
+
136
+ listeners.each_with_index do |listener, count|
137
+ pool_name = "#{resource_name}PoolVip#{count}"
138
+ pool = {
139
+ pool_name => {
140
+ 'Type' => 'OS::Neutron::Pool',
141
+ 'Properties' => {
142
+ 'lb_method' => 'ROUND_ROBIN',
143
+ 'protocol' => listener['Protocol'],
144
+ 'subnet' => subnet,
145
+ 'vip' => {
146
+ 'protocol_port' => listener['LoadBalancerPort']
147
+ }
148
+ }
149
+ }
150
+ }
151
+ if(healthcheck)
152
+ pool[pool_name]['Properties'].merge(
153
+ 'monitors' => [
154
+ {'get_resource' => healthcheck_name}
155
+ ]
156
+ )
157
+ end
158
+
159
+ lb_name = "#{resource_name}Vip#{count}"
160
+ lb = {lb_name => MultiJson.load(MultiJson.dump(new_resource))}
161
+ lb[lb_name]['Properties']['pool_id'] = {'get_resource' => pool_name}
162
+ lb[lb_name]['Properties']['protocol_port'] = listener['InstancePort']
163
+ translated['Resources'].merge!(pool)
164
+ translated['Resources'].merge!(lb)
165
+ end
166
+ end
167
+
168
+ # Update any launch configuration which define load balancers to
169
+ # ensure they are attached to the correct resources when
170
+ # multiple listeners (ports) have been defined resulting in
171
+ # multiple isolated LB resources
172
+ def complete_launch_config_lb_setups
173
+ translated['resources'].find_all do |resource_name, resource|
174
+ resource['type'] == 'OS::Heat::AutoScalingGroup'
175
+ end.each do |name, value|
176
+ if(lbs = value['properties'].delete('load_balancers'))
177
+ lbs.each do |lb_ref|
178
+ lb_name = resource_name(lb_ref)
179
+ lb_resource = translated['resources'][lb_name]
180
+ vip_resources = translated['resources'].find_all do |k, v|
181
+ k.match(/#{lb_name}Vip\d+/) && v['type'] == 'OS::Neutron::LoadBalancer'
182
+ end
183
+ value['properties']['load_balancers'] = vip_resources.map do |vip_name|
184
+ {'get_resource' => vip_name}
185
+ end
186
+ end
187
+ end
188
+ end
63
189
  true
64
190
  end
65
191
 
@@ -129,6 +255,37 @@ class SparkleFormation
129
255
  end
130
256
  end
131
257
 
258
+ # Finalizer for the neutron subnet resource. Creates a stub
259
+ # network to attach subnet if availability zones are defined
260
+ # (aws classic)
261
+ #
262
+ # @param resource_name [String]
263
+ # @param new_resource [Hash]
264
+ # @param old_resource [Hash]
265
+ # @return [TrueClass]
266
+ def neutron_subnet_finalizer(resource_name, new_resource, old_resource)
267
+ azs = new_resource['Properties'].delete('availability_zone')
268
+ if(azs)
269
+ network_name = "NetworkFor#{resource_name}"
270
+ translated['Resources'][network_name] = {
271
+ 'type' => 'OS::Neutron::Network'
272
+ }
273
+ new_resource['Properties']['network'] = {'get_resource' => network_name}
274
+ end
275
+ true
276
+ end
277
+
278
+ # Finalizer for the neutron net resource. Scrub properties.
279
+ #
280
+ # @param resource_name [String]
281
+ # @param new_resource [Hash]
282
+ # @param old_resource [Hash]
283
+ # @return [TrueClass]
284
+ def neutron_net_finalizer(resource_name, new_resource, old_resource)
285
+ new_resource['Properties'].clear
286
+ true
287
+ end
288
+
132
289
  # Finalizer applied to all new resources
133
290
  #
134
291
  # @param resource_name [String]
@@ -194,7 +351,32 @@ class SparkleFormation
194
351
  'LaunchConfigurationName' => :autoscaling_group_launchconfig
195
352
  }
196
353
  },
197
- 'AWS::AutoScaling::LaunchConfiguration' => :delete
354
+ 'AWS::AutoScaling::LaunchConfiguration' => :delete,
355
+ 'AWS::ElasticLoadBalancing::LoadBalancer' => {
356
+ :name => 'OS::Neutron::LoadBalancer',
357
+ :finalizer => :neutron_loadbalancer_finalizer,
358
+ :properties => {
359
+ 'Instances' => 'members',
360
+ 'Listeners' => 'listeners',
361
+ 'HealthCheck' => 'health_check',
362
+ 'Subnets' => 'subnets'
363
+ }
364
+ },
365
+ 'AWS::EC2::VPC' => {
366
+ :name => 'OS::Neutron::Net',
367
+ :finalizer => :neutron_net_finalizer,
368
+ :properties => {
369
+ }
370
+ },
371
+ 'AWS::EC2::Subnet' => {
372
+ :name => 'OS::Neutron::Subnet',
373
+ :finalizer => :neutron_subnet_finalizer,
374
+ :properties => {
375
+ 'CidrBlock' => 'cidr',
376
+ 'VpcId' => 'network',
377
+ 'AvailabilityZone' => 'availability_zone'
378
+ }
379
+ }
198
380
  }
199
381
  }
200
382
 
@@ -206,7 +388,7 @@ class SparkleFormation
206
388
 
207
389
  FN_MAPPING = {
208
390
  'Fn::GetAtt' => 'get_attr',
209
- 'Fn::Join' => 'list_join' # @todo why is this not working?
391
+ 'Fn::Join' => 'list_join'
210
392
  }
211
393
 
212
394
  end
@@ -164,7 +164,11 @@ class SparkleFormation
164
164
  source_listener = listeners.shift
165
165
  if(source_listener)
166
166
  new_resource['Properties']['port'] = source_listener['LoadBalancerPort']
167
- new_resource['Properties']['protocol'] = source_listener['Protocol']
167
+ if(['HTTP', 'HTTPS'].include?(source_listener['Protocol']))
168
+ new_resource['Properties']['protocol'] = source_listener['Protocol']
169
+ else
170
+ new_resource['Properties']['protocol'] = 'TCP_CLIENT_FIRST'
171
+ end
168
172
  new_resource['cache_instance_port'] = source_listener['InstancePort']
169
173
  end
170
174
  new_resource['Properties']['virtualIps'] = ['type' => 'PUBLIC', 'ipVersion' => 'IPV4']
@@ -183,14 +187,14 @@ class SparkleFormation
183
187
  check['type'] = check_type
184
188
  check['path'] = check_args.last
185
189
  else
186
- check['type'] = 'TCP_STREAM'
190
+ check['type'] = 'TCP_CLIENT_FIRST'
187
191
  end
188
192
  end
189
193
  end
190
194
  unless(listeners.empty?)
191
195
  listeners.each_with_index do |listener, idx|
192
196
  port = listener['LoadBalancerPort']
193
- proto = listener['Protocol']
197
+ proto = ['HTTP', 'HTTPS'].include?(listener['Protocol']) ? listener['Protocol'] : 'TCP_CLIENT_FIRST'
194
198
  vip_name = "#{resource_name}Vip#{idx}"
195
199
  vip_resource = MultiJson.load(MultiJson.dump(new_resource))
196
200
  vip_resource['Properties']['name'] = vip_name
@@ -260,7 +260,7 @@ class SparkleFormation
260
260
  k,v = hash.first
261
261
  if(hash.size == 1)
262
262
  if(k.start_with?('Fn::'))
263
- {self.class.const_get(:FN_MAPPING).fetch(k, k) => v}
263
+ {self.class.const_get(:FN_MAPPING).fetch(k, k) => attr_mapping(*v)}
264
264
  elsif(k == 'Ref')
265
265
  if(resources.has_key?(v))
266
266
  {'get_resource' => v}
@@ -275,6 +275,22 @@ class SparkleFormation
275
275
  end
276
276
  end
277
277
 
278
+ # Apply `GetAttr` mapping if available
279
+ #
280
+ # @param resource_name [String]
281
+ # @param value [String]
282
+ # @return [Array]
283
+ def attr_mapping(resource_name, value)
284
+ result = [resource_name, value]
285
+ if(r = resources[resource_name])
286
+ attr_map = self.class.const_get(:FN_ATT_MAPPING)
287
+ if(attr_map[r['Type']] && replacement = attr_map[r['Type']][value])
288
+ result = [resource_name, *[replacement].flatten.compact]
289
+ end
290
+ end
291
+ result
292
+ end
293
+
278
294
  # Apply function if possible
279
295
  #
280
296
  # @param hash [Hash]
@@ -289,7 +305,17 @@ class SparkleFormation
289
305
  when 'Fn::Join'
290
306
  v.last.join(v.first)
291
307
  when 'Fn::FindInMap'
292
- mappings[v[0]][dereference(v[1])][v[2]]
308
+ map_holder = mappings[v[0]]
309
+ if(map_holder)
310
+ map_item = map_holder[dereference(v[1])]
311
+ if(map_item)
312
+ map_item[v[2]]
313
+ else
314
+ raise "Failed to find mapping item! (#{v[0]} -> #{v[1]})"
315
+ end
316
+ else
317
+ raise "Failed to find mapping! (#{v[0]})"
318
+ end
293
319
  when 'Ref'
294
320
  {'Ref' => self.class.const_get(:REF_MAPPING).fetch(v, v)}
295
321
  else
@@ -18,5 +18,5 @@
18
18
 
19
19
  class SparkleFormation
20
20
  # Current library version
21
- VERSION = Gem::Version.new('0.2.2')
21
+ VERSION = Gem::Version.new('0.2.4')
22
22
  end
@@ -12,5 +12,6 @@ Gem::Specification.new do |s|
12
12
  s.require_path = 'lib'
13
13
  s.add_dependency 'attribute_struct', '~> 0.2.2'
14
14
  s.add_dependency 'multi_json'
15
- s.files = Dir['**/*']
15
+ s.executables << 'generate_sparkle_docs'
16
+ s.files = Dir['lib/**/*'] + %w(sparkle_formation.gemspec README.md CHANGELOG.md LICENSE)
16
17
  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: 0.2.2
4
+ version: 0.2.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chris Roberts
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-10-28 00:00:00.000000000 Z
11
+ date: 2014-12-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: attribute_struct
@@ -40,35 +40,15 @@ dependencies:
40
40
  version: '0'
41
41
  description: Cloud Formation builder
42
42
  email: chrisroberts.code@gmail.com
43
- executables: []
43
+ executables:
44
+ - generate_sparkle_docs
44
45
  extensions: []
45
46
  extra_rdoc_files: []
46
47
  files:
47
48
  - CHANGELOG.md
48
- - CONTRIBUTING.md
49
- - Gemfile
50
- - Gemfile.lock
51
49
  - LICENSE
52
50
  - README.md
53
- - bin/aws_resources
54
- - bin/heat_resources
55
- - docs/README.md
56
- - docs/anatomy.md
57
- - docs/building-blocks.md
58
- - docs/examples/cloudformation/components/base.rb
59
- - docs/examples/cloudformation/dynamics/elb.rb
60
- - docs/examples/cloudformation/templates/website.rb
61
- - docs/examples/template_json/website.json
62
- - docs/examples/website.rb
63
- - docs/functions.md
64
- - docs/properties.md
65
- - docs/provisioning.md
66
- - docs/resource-reference.md
67
- - examples/allinone/cloudformation/ec2_example.rb
68
- - examples/allinone/parse.rb
69
- - examples/ami_component/cloudformation/components/ami.rb
70
- - examples/ami_component/cloudformation/ec2_example.rb
71
- - examples/ami_component/parse.rb
51
+ - bin/generate_sparkle_docs
72
52
  - lib/sparkle_formation.rb
73
53
  - lib/sparkle_formation/aws.rb
74
54
  - lib/sparkle_formation/aws/cfn_resources.rb
@@ -81,14 +61,6 @@ files:
81
61
  - lib/sparkle_formation/utils.rb
82
62
  - lib/sparkle_formation/version.rb
83
63
  - sparkle_formation.gemspec
84
- - test/spec.rb
85
- - test/specs/attribute.rb
86
- - test/specs/basic.rb
87
- - test/specs/cloudformation/components/ami.rb
88
- - test/specs/cloudformation/dynamics/node.rb
89
- - test/specs/results/base.json
90
- - test/specs/results/base_with_map.json
91
- - test/specs/results/component.json
92
64
  homepage: http://github.com/heavywater/sparkle_formation
93
65
  licenses:
94
66
  - Apache-2.0
data/CONTRIBUTING.md DELETED
@@ -1,25 +0,0 @@
1
- # Contributing
2
-
3
- ## Branches
4
-
5
- ### `master` branch
6
-
7
- The master branch is the current stable released version.
8
-
9
- ### `develop` branch
10
-
11
- The develop branch is the current edge of development.
12
-
13
- ## Pull requests
14
-
15
- * https://github.com/heavywater/sparkle_formation/pulls
16
-
17
- Please base all pull requests off the `develop` branch. Merges to
18
- `master` only occur through the `develop` branch. Pull requests
19
- based on `master` will likely be cherry picked.
20
-
21
- ## Issues
22
-
23
- Need to report an issue? Use the github issues:
24
-
25
- * https://github.com/heavywater/sparkle_formation/issues
data/Gemfile DELETED
@@ -1,3 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- gemspec
data/Gemfile.lock DELETED
@@ -1,18 +0,0 @@
1
- PATH
2
- remote: .
3
- specs:
4
- sparkle_formation (0.2.2)
5
- attribute_struct (~> 0.2.2)
6
- multi_json
7
-
8
- GEM
9
- remote: https://rubygems.org/
10
- specs:
11
- attribute_struct (0.2.8)
12
- multi_json (1.10.1)
13
-
14
- PLATFORMS
15
- ruby
16
-
17
- DEPENDENCIES
18
- sparkle_formation!