cfoo 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 5fcc988f1989d6b93a69fa74fac941f3294f5bea
4
+ data.tar.gz: ede4908b05d3c967c5b71d6b6ed4515298eac28a
5
+ SHA512:
6
+ metadata.gz: c6ce108951f4369e9d5018746c4f552d655acda9af47808104d5d69675643f016c4e63d46676973cd37591a9ad8776fa7d82235909a1c9062f02e5feb59b763a
7
+ data.tar.gz: 003f932fcacefab7b329a63c0716540d035a83d7302c322314a163a96d79f9d28592577e8c4c51b0bb0bf5a3fed2e874e3768551b2895797f2fb4a7a0d56e56d
data/Guardfile ADDED
@@ -0,0 +1,8 @@
1
+ notification :terminal_notifier
2
+
3
+ guard :rspec do
4
+ watch(%r{^spec/.+_spec\.rb$})
5
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
6
+ watch('spec/spec_helper.rb') { "spec" }
7
+ end
8
+
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Cfoo
2
2
 
3
- [![Build Status](https://travis-ci.org/drrb/cfoo.png?branch=master)](https://travis-ci.org/drrb/cfoo)
3
+ [![Build Status](https://travis-ci.org/drrb/cfoo.svg?branch=master)](https://travis-ci.org/drrb/cfoo)
4
4
  [![Coverage Status](https://coveralls.io/repos/drrb/cfoo/badge.png?branch=master)](https://coveralls.io/r/drrb/cfoo)
5
5
  [![Code Climate](https://codeclimate.com/github/drrb/cfoo.png)](https://codeclimate.com/github/drrb/cfoo)
6
6
 
@@ -75,7 +75,7 @@ Properties:
75
75
 
76
76
  function error_exit
77
77
  {
78
- /opt/aws/bin/cfn-signal -e 1 -r "$1" '$(WaitHandle)'
78
+ /opt/aws/bin/cfn-signal -e 1 -r "\$1" '$(WaitHandle)'
79
79
  exit 1
80
80
  }
81
81
 
@@ -139,9 +139,7 @@ Cfoo Shortcut: `$(SubnetConfig[VPC][CIDR])`
139
139
 
140
140
  CloudFormation: `{ "Fn::GetAtt" : [ "Ec2Instance", "PublicIp" ] }`
141
141
 
142
- Cfoo Shortcut: `$(Ec2Instance.PublicIp)`
143
-
144
- Other Shortcut: `$(Ec2Instance[PublicIp])`
142
+ Cfoo Shortcut: `$(Ec2Instance[PublicIp])`
145
143
 
146
144
  ##### Embedded Reference
147
145
 
data/cfoo.gemspec CHANGED
@@ -31,5 +31,11 @@ Gem::Specification.new do |gem|
31
31
  gem.add_development_dependency "cucumber"
32
32
  gem.add_development_dependency "simplecov"
33
33
  gem.add_development_dependency "coveralls", ">= 0.6.3"
34
- gem.add_development_dependency "json" # Coveralls needs it
34
+ gem.add_development_dependency "mime-types", "< 2" # Needed to support Ruby 1.8
35
+
36
+ unless ["1.8.7", "1.9.2"].include? RUBY_VERSION
37
+ gem.add_development_dependency "guard"
38
+ gem.add_development_dependency "guard-rspec"
39
+ gem.add_development_dependency "terminal-notifier-guard"
40
+ end
35
41
  end
@@ -8,7 +8,7 @@ Feature: Expand EL Attribute References
8
8
  """
9
9
  EntryPoint:
10
10
  Description: IP address of the Bastion Host
11
- Value: $(BastionHost.PublicIp)
11
+ Value: $(BastionHost[PublicIp])
12
12
  """
13
13
  When I process "outputs.yml"
14
14
  Then the output should match JSON
@@ -27,7 +27,7 @@ Feature: Expand EL Attribute References
27
27
  """
28
28
  WebSite:
29
29
  Description: URL of the website
30
- Value: http://$(PublicElasticLoadBalancer.DNSName)/index.html
30
+ Value: http://$(PublicElasticLoadBalancer[DNSName])/index.html
31
31
  """
32
32
  When I process "outputs.yml"
33
33
  Then the output should match JSON
@@ -28,13 +28,12 @@ module Cfoo
28
28
  rule(:dot) { str('.') }
29
29
  rule(:comma) { str(",") >> space? }
30
30
  rule(:text_character) { match['^\\\\$'] }
31
- rule(:identifier) { match['a-zA-Z0-9_\-:'].repeat(1).as(:identifier) >> space? }
31
+ rule(:identifier) { match['a-zA-Z0-9._\-:'].repeat(1).as(:identifier) >> space? }
32
32
  rule(:text) { text_character.repeat(1).as(:text) }
33
33
 
34
34
  rule(:attribute_reference) do
35
35
  (
36
36
  expression.as(:reference) >> (
37
- str(".") >> identifier.as(:attribute) |
38
37
  str("[") >> expression.as(:attribute) >> str("]")
39
38
  )
40
39
  ).as(:attribute_reference)
@@ -1,5 +1,22 @@
1
1
  require 'cfoo/yaml_parser'
2
2
 
3
+ class String
4
+ def coordinates_of_index(index)
5
+ lines = split("\n")
6
+ line_number = 1
7
+ column_number = index + 1
8
+ lines.each do |line|
9
+ if line.length < column_number
10
+ line_number += 1
11
+ column_number -= line.length
12
+ else
13
+ return [ line_number, column_number ]
14
+ end
15
+ end
16
+ [ -1, -1 ]
17
+ end
18
+ end
19
+
3
20
  module Cfoo
4
21
  class FileSystem
5
22
  def initialize(project_root, yaml_parser)
@@ -19,19 +36,19 @@ module Cfoo
19
36
  end
20
37
 
21
38
  def find_coordinates(string, file_name)
22
- matching_lines = []
23
39
  open(file_name) do |file|
24
- file.each_with_index do|line, row_index|
25
- if line.include? string
26
- column_index = line.index(string)
27
- row = row_index + 1
28
- column = column_index + 1
29
- return [row, column]
30
- end
40
+ content = file.read
41
+ lines = string.split "\n"
42
+ patterns = lines.map { |line| Regexp.escape(line) }
43
+ pattern = patterns.join '\n\s*'
44
+ regex = %r[#{pattern}]
45
+ index = regex =~ content
46
+ if index.nil?
47
+ raise CoordinatesNotFound, "Couldn't find '#{string.inspect}' in '#{file_name}'"
48
+ else
49
+ content.coordinates_of_index(index)
31
50
  end
32
51
  end
33
- #TODO test this
34
- raise "Couldn't find '#{string}' in '#{file}'"
35
52
  end
36
53
 
37
54
  def glob_relative(path)
@@ -45,4 +62,7 @@ module Cfoo
45
62
  Dir.glob("#{resolve_file path}/*")
46
63
  end
47
64
  end
65
+
66
+ class CoordinatesNotFound < StandardError
67
+ end
48
68
  end
data/lib/cfoo/parser.rb CHANGED
@@ -98,7 +98,7 @@ module Cfoo
98
98
  attr_accessor :file_name, :cause, :source, :line, :column
99
99
 
100
100
  def initialize(file_name, cause, source, line, column)
101
- super("Failed to parse '#{file_name}':\nSource: #{source}\nLocation: #{file_name} line #{line}, column #{column} \nCause: #{cause.ascii_tree}")
101
+ super("Failed to parse '#{file_name}':\nLocation: #{file_name} line #{line}, column #{column} \nSource: #{source}\nCause: #{cause.ascii_tree}")
102
102
 
103
103
  @file_name = file_name
104
104
  @cause = cause
data/lib/cfoo/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Cfoo
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
@@ -7,6 +7,10 @@ module Cfoo
7
7
  parser.parse("$(orange)").should == {"Ref" => "orange"}
8
8
  end
9
9
 
10
+ it 'turns simple EL references with dots into CloudFormation "Ref" maps' do
11
+ parser.parse("$(orange.color)").should == {"Ref" => "orange.color"}
12
+ end
13
+
10
14
  it 'turns EL references embedded in strings into appended arrays' do
11
15
  parser.parse("large $(MelonType) melon").should == {"Fn::Join" => [ "" , [ "large ", { "Ref" => "MelonType" }, " melon" ]]}
12
16
  end
@@ -15,14 +19,14 @@ module Cfoo
15
19
  parser.parse("I have $(number) apples and $(otherNumber) oranges").should == {"Fn::Join" => [ "" , ["I have ", { "Ref" => "number" }, " apples and ", { "Ref" => "otherNumber" }, " oranges" ]]}
16
20
  end
17
21
 
18
- it 'turns EL attribute references into CloudFormation "GetAtt" maps' do
19
- parser.parse("$(apple.color)").should == {"Fn::GetAtt" => ["apple", "color"]}
20
- end
21
-
22
22
  it 'turns EL attribute map references into CloudFormation "GetAtt" maps' do
23
23
  parser.parse("$(apple[color])").should == {"Fn::GetAtt" => ["apple", "color"]}
24
24
  end
25
25
 
26
+ it 'turns EL attribute map references with dots into CloudFormation "GetAtt" maps' do
27
+ parser.parse("$(apple[color.primary])").should == {"Fn::GetAtt" => ["apple", "color.primary"]}
28
+ end
29
+
26
30
  it 'turns EL map references into CloudFormation "FindInMap" maps' do
27
31
  parser.parse("$(fruit[apple][color])").should == {"Fn::FindInMap" => ["fruit", "apple", "color"]}
28
32
  end
@@ -50,9 +50,28 @@ module Cfoo
50
50
  dog
51
51
  EOF
52
52
 
53
- row, column = file_system.find_coordinates("lazy", "test.txt")
54
- row.should be 2
55
- column.should be 36
53
+ coordinates = file_system.find_coordinates("lazy", "test.txt")
54
+ expect(coordinates).to eq [2,37]
55
+ end
56
+ it "returns the coordinates of multiline strings" do
57
+ write_project_file "test.txt", <<-EOF
58
+ the quick brown fox
59
+ jumps over the lazy
60
+ dog
61
+ EOF
62
+
63
+ file_system.find_coordinates("lazy\ndog", "test.txt")
64
+ end
65
+ it "raises an error if it can't find the text" do
66
+ write_project_file "test.txt", <<-EOF
67
+ the quick brown fox
68
+ jumps over the lazy
69
+ dog
70
+ EOF
71
+
72
+ expect {
73
+ file_system.find_coordinates("xxxxxx", "test.txt")
74
+ }.to raise_error CoordinatesNotFound
56
75
  end
57
76
  end
58
77
 
@@ -74,7 +93,7 @@ module Cfoo
74
93
  file_system.glob_relative("modules/*.yml").should == ["modules/c.yml"]
75
94
  end
76
95
  end
77
-
96
+
78
97
  describe "#parse_file" do
79
98
  it "loads the file with the YAML parser" do
80
99
  yaml_parser.should_receive(:load_file).with("#{project_root}/yamlfile.yml")
@@ -51,6 +51,11 @@ module Cfoo
51
51
  parser.parse_file("myfile.yml").should == {"Ref" => "orange"}
52
52
  end
53
53
 
54
+ it 'turns simple EL references with dots into CloudFormation "Ref" maps' do
55
+ file_system.should_receive(:parse_file).with("myfile.yml").and_return("$(orange.color)")
56
+ parser.parse_file("myfile.yml").should == {"Ref" => "orange.color"}
57
+ end
58
+
54
59
  it 'turns EL references embedded in strings into appended arrays' do
55
60
  file_system.should_receive(:parse_file).with("myfile.yml").and_return("large $(MelonType) melon")
56
61
  parser.parse_file("myfile.yml").should == {"Fn::Join" => [ "", [ "large ", { "Ref" => "MelonType" }, " melon" ] ] }
@@ -63,10 +68,15 @@ module Cfoo
63
68
  end
64
69
 
65
70
  it 'turns EL attribute references into CloudFormation "GetAtt" maps' do
66
- file_system.should_receive(:parse_file).with("myfile.yml").and_return("$(apple.color)")
71
+ file_system.should_receive(:parse_file).with("myfile.yml").and_return("$(apple[color])")
67
72
  parser.parse_file("myfile.yml").should == {"Fn::GetAtt" => ["apple", "color"]}
68
73
  end
69
74
 
75
+ it 'turns EL attribute references with dots into CloudFormation "GetAtt" maps' do
76
+ file_system.should_receive(:parse_file).with("myfile.yml").and_return("$(apple[color.primary])")
77
+ parser.parse_file("myfile.yml").should == {"Fn::GetAtt" => ["apple", "color.primary"]}
78
+ end
79
+
70
80
  it 'turns EL map references into CloudFormation "FindInMap" maps' do
71
81
  file_system.should_receive(:parse_file).with("myfile.yml").and_return("$(fruit[apple][color])")
72
82
  parser.parse_file("myfile.yml").should == {"Fn::FindInMap" => ["fruit", "apple", "color"]}
metadata CHANGED
@@ -1,147 +1,196 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: cfoo
3
- version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 0
7
- - 0
8
- - 2
9
- version: 0.0.2
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.3
10
5
  platform: ruby
11
- authors:
6
+ authors:
12
7
  - drrb
13
8
  autorequire:
14
9
  bindir: bin
15
10
  cert_chain: []
16
-
17
- date: 2013-07-26 00:00:00 +10:00
18
- default_executable:
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
11
+ date: 2014-04-17 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
21
14
  name: json
22
- prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
24
- requirements:
25
- - - ">="
26
- - !ruby/object:Gem::Version
27
- segments:
28
- - 0
29
- version: "0"
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
30
20
  type: :runtime
31
- version_requirements: *id001
32
- - !ruby/object:Gem::Dependency
33
- name: parslet
34
21
  prerelease: false
35
- requirement: &id002 !ruby/object:Gem::Requirement
36
- requirements:
37
- - - ">="
38
- - !ruby/object:Gem::Version
39
- segments:
40
- - 0
41
- version: "0"
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: parslet
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
42
34
  type: :runtime
43
- version_requirements: *id002
44
- - !ruby/object:Gem::Dependency
45
- name: bundler
46
35
  prerelease: false
47
- requirement: &id003 !ruby/object:Gem::Requirement
48
- requirements:
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
49
45
  - - ~>
50
- - !ruby/object:Gem::Version
51
- segments:
52
- - 1
53
- - 3
54
- version: "1.3"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.3'
55
48
  type: :development
56
- version_requirements: *id003
57
- - !ruby/object:Gem::Dependency
58
- name: rake
59
49
  prerelease: false
60
- requirement: &id004 !ruby/object:Gem::Requirement
61
- requirements:
62
- - - ">="
63
- - !ruby/object:Gem::Version
64
- segments:
65
- - 0
66
- version: "0"
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: '1.3'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
67
62
  type: :development
68
- version_requirements: *id004
69
- - !ruby/object:Gem::Dependency
70
- name: rspec
71
63
  prerelease: false
72
- requirement: &id005 !ruby/object:Gem::Requirement
73
- requirements:
74
- - - ">="
75
- - !ruby/object:Gem::Version
76
- segments:
77
- - 0
78
- version: "0"
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: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
79
76
  type: :development
80
- version_requirements: *id005
81
- - !ruby/object:Gem::Dependency
82
- name: cucumber
83
77
  prerelease: false
84
- requirement: &id006 !ruby/object:Gem::Requirement
85
- requirements:
86
- - - ">="
87
- - !ruby/object:Gem::Version
88
- segments:
89
- - 0
90
- version: "0"
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: cucumber
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
91
90
  type: :development
92
- version_requirements: *id006
93
- - !ruby/object:Gem::Dependency
94
- name: simplecov
95
91
  prerelease: false
96
- requirement: &id007 !ruby/object:Gem::Requirement
97
- requirements:
98
- - - ">="
99
- - !ruby/object:Gem::Version
100
- segments:
101
- - 0
102
- version: "0"
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: simplecov
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - '>='
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
103
104
  type: :development
104
- version_requirements: *id007
105
- - !ruby/object:Gem::Dependency
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
106
112
  name: coveralls
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - '>='
116
+ - !ruby/object:Gem::Version
117
+ version: 0.6.3
118
+ type: :development
107
119
  prerelease: false
108
- requirement: &id008 !ruby/object:Gem::Requirement
109
- requirements:
110
- - - ">="
111
- - !ruby/object:Gem::Version
112
- segments:
113
- - 0
114
- - 6
115
- - 3
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - '>='
123
+ - !ruby/object:Gem::Version
116
124
  version: 0.6.3
125
+ - !ruby/object:Gem::Dependency
126
+ name: mime-types
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - <
130
+ - !ruby/object:Gem::Version
131
+ version: '2'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - <
137
+ - !ruby/object:Gem::Version
138
+ version: '2'
139
+ - !ruby/object:Gem::Dependency
140
+ name: guard
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - '>='
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
117
146
  type: :development
118
- version_requirements: *id008
119
- - !ruby/object:Gem::Dependency
120
- name: json
121
147
  prerelease: false
122
- requirement: &id009 !ruby/object:Gem::Requirement
123
- requirements:
124
- - - ">="
125
- - !ruby/object:Gem::Version
126
- segments:
127
- - 0
128
- version: "0"
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - '>='
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: guard-rspec
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - '>='
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
129
160
  type: :development
130
- version_requirements: *id009
131
- description: "Cfoo: CloudFormation master"
132
- email:
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - '>='
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ - !ruby/object:Gem::Dependency
168
+ name: terminal-notifier-guard
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - '>='
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - '>='
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
181
+ description: 'Cfoo: CloudFormation master'
182
+ email:
133
183
  - drrrrrrrrrrrb@gmail.com
134
- executables:
184
+ executables:
135
185
  - cfoo
136
186
  extensions: []
137
-
138
187
  extra_rdoc_files: []
139
-
140
- files:
188
+ files:
141
189
  - .gitignore
142
190
  - .simplecov
143
191
  - .travis.yml
144
192
  - Gemfile
193
+ - Guardfile
145
194
  - LICENSE.txt
146
195
  - README.md
147
196
  - Rakefile
@@ -188,37 +237,33 @@ files:
188
237
  - spec/cfoo/yaml_parser_spec.rb
189
238
  - spec/cfoo/yaml_spec.rb
190
239
  - spec/spec_helper.rb
191
- has_rdoc: true
192
240
  homepage: https://github.com/drrb/cfoo
193
- licenses:
241
+ licenses:
194
242
  - GPL-3
243
+ metadata: {}
195
244
  post_install_message:
196
245
  rdoc_options: []
197
-
198
- require_paths:
246
+ require_paths:
199
247
  - lib
200
- required_ruby_version: !ruby/object:Gem::Requirement
201
- requirements:
202
- - - ">="
203
- - !ruby/object:Gem::Version
204
- segments:
205
- - 0
206
- version: "0"
207
- required_rubygems_version: !ruby/object:Gem::Requirement
208
- requirements:
209
- - - ">="
210
- - !ruby/object:Gem::Version
211
- segments:
212
- - 0
213
- version: "0"
248
+ required_ruby_version: !ruby/object:Gem::Requirement
249
+ requirements:
250
+ - - '>='
251
+ - !ruby/object:Gem::Version
252
+ version: '0'
253
+ required_rubygems_version: !ruby/object:Gem::Requirement
254
+ requirements:
255
+ - - '>='
256
+ - !ruby/object:Gem::Version
257
+ version: '0'
214
258
  requirements: []
215
-
216
259
  rubyforge_project:
217
- rubygems_version: 1.3.6
260
+ rubygems_version: 2.2.1
218
261
  signing_key:
219
- specification_version: 3
220
- summary: Cfoo (pronounced 'sifu') allows you to write your CloudFormation templates in a YAML-based markup language, and organise it into modules to make it easier to maintain.
221
- test_files:
262
+ specification_version: 4
263
+ summary: Cfoo (pronounced 'sifu') allows you to write your CloudFormation templates
264
+ in a YAML-based markup language, and organise it into modules to make it easier
265
+ to maintain.
266
+ test_files:
222
267
  - features/attribute_expansion.feature
223
268
  - features/convert_yaml_to_json.feature
224
269
  - features/el_escaping.feature