cfoo 0.0.1 → 0.0.2

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.
@@ -26,6 +26,36 @@ module Cfoo
26
26
  end
27
27
  end
28
28
 
29
+ describe "#open" do
30
+ it "opens a file on disk for reading and passes it to the provided block" do
31
+ write_project_file "file.txt", "test content"
32
+
33
+ actual_content = "block not called"
34
+ file_system.open("file.txt") do |file|
35
+ actual_content = file.read
36
+ end
37
+
38
+ actual_content.should include "test content"
39
+ end
40
+ end
41
+
42
+ describe "#find_coordinates" do
43
+ it "returns the coordinates of the first match of the specified string in the specified file" do
44
+ write_project_file "test.txt", <<-EOF
45
+ the quick brown fox
46
+ jumps over the lazy
47
+ dog
48
+ the quick brown fox
49
+ jumps over the lazy
50
+ dog
51
+ EOF
52
+
53
+ row, column = file_system.find_coordinates("lazy", "test.txt")
54
+ row.should be 2
55
+ column.should be 36
56
+ end
57
+ end
58
+
29
59
  describe "#glob_relative" do
30
60
  it "returns relative path of files, resolved relative to project root" do
31
61
  files = %w[a b c].map {|file| File.join(project_root, "modules", file) }
@@ -52,10 +82,18 @@ module Cfoo
52
82
  end
53
83
  end
54
84
 
85
+ def relative(file)
86
+ File.join(project_root, file)
87
+ end
88
+
55
89
  def write(file, content)
56
90
  File.open(file, "w+") do |f|
57
91
  f.puts content
58
92
  end
59
93
  end
94
+
95
+ def write_project_file(file, content)
96
+ write(relative(file), content)
97
+ end
60
98
  end
61
99
  end
@@ -6,6 +6,13 @@ module Cfoo
6
6
  let(:parser) { Parser.new(file_system) }
7
7
 
8
8
  describe "#parse_file" do
9
+ context "when parsing fails" do
10
+ it "raises an error" do
11
+ file_system.should_receive(:parse_file).and_raise "parsing failed"
12
+ expect { parser.parse_file("myfile.yml") }.to raise_error Parser::CfooParseError, "Failed to parse 'myfile.yml':\nparsing failed"
13
+ end
14
+ end
15
+
9
16
  context "when processing a normal array" do
10
17
  it "returns it" do
11
18
  file_system.should_receive(:parse_file).with("myfile.yml").and_return([1, 2, 3])
@@ -106,6 +113,11 @@ module Cfoo
106
113
 
107
114
  parser.parse_file("b64.yml").should == {"Fn::Base64" => "myencodedstring"}
108
115
  end
116
+ it "raises an error when finding other (unknown) domain types" do
117
+ file_system.should_receive(:parse_file).with("domaintype.yml").and_return(YAML::DomainType.create("Unknown type", "unknowntypecontent"))
118
+
119
+ expect {parser.parse_file("domaintype.yml")}.to raise_error /Couldn't parse object/
120
+ end
109
121
  end
110
122
 
111
123
  context "in an array" do
@@ -140,7 +152,7 @@ module Cfoo
140
152
  context "when presented with an unknown object" do
141
153
  it "raises an error" do
142
154
  file_system.should_receive(:parse_file).with("myfile.yml").and_return(/a regex/)
143
- expect {parser.parse_file("myfile.yml")}.to raise_error Parser::ElParseError
155
+ expect {parser.parse_file("myfile.yml")}.to raise_error Parser::ElExpansionError
144
156
  end
145
157
  end
146
158
  end
@@ -8,8 +8,8 @@ module Cfoo
8
8
  let(:processor) { Processor.new(parser, project) }
9
9
 
10
10
  describe "#process" do
11
- it "parses the specified files" do
12
- parser.should_receive(:parse_file).with("app.yml").and_return({"Resources" => { "AppServer" => { "Type" => "EC2Instance" } } })
11
+ it "parses and merges the specified files" do
12
+ parser.should_receive(:parse_file).with("app.yml").and_return({"Resources" => { "AppServer" => { "Type" => "LaunchConfiguration"} } })
13
13
  parser.should_receive(:parse_file).with("db.yml").and_return({"Resources" => { "DbServer" => { "Type" => "EC2Instance" } } })
14
14
  parser.should_receive(:parse_file).with("network.yml").and_return({"Parameters" => { "LoadBalancerIpAddress" => "10.0.0.51" } })
15
15
  processor.process("app.yml", "db.yml", "network.yml").should == {
@@ -18,11 +18,119 @@ module Cfoo
18
18
  "LoadBalancerIpAddress" => "10.0.0.51"
19
19
  },
20
20
  "Resources" => {
21
- "AppServer" => { "Type" => "EC2Instance" },
21
+ "AppServer" => { "Type" => "LaunchConfiguration" },
22
22
  "DbServer" => { "Type" => "EC2Instance" }
23
23
  }
24
24
  }
25
25
  end
26
+ context "when there's a duplicate resource definition" do
27
+ it "merges them" do
28
+ parser.should_receive(:parse_file).with("app.yml").and_return(
29
+ "Resources" => {
30
+ "FrontendFleet" => {
31
+ "Type" => "AutoScalingGroup"
32
+ }
33
+ }
34
+ )
35
+ parser.should_receive(:parse_file).with("app_extra.yml").and_return(
36
+ "Resources" => {
37
+ "FrontendFleet" => {
38
+ "LoadBalancerNames" => [ "load balancer" ]
39
+ }
40
+ }
41
+ )
42
+ processor.process("app.yml", "app_extra.yml").should == {
43
+ "AWSTemplateFormatVersion" => "2010-09-09",
44
+ "Resources" => {
45
+ "FrontendFleet" => {
46
+ "Type" => "AutoScalingGroup",
47
+ "LoadBalancerNames" => [ "load balancer" ]
48
+ }
49
+ }
50
+ }
51
+ end
52
+ context "when the resources both define the same property" do
53
+ it "replaces strings" do
54
+ parser.should_receive(:parse_file).with("app.yml").and_return(
55
+ "Resources" => {
56
+ "WebApp" => {
57
+ "Type" => "Ec2Instance"
58
+ }
59
+ }
60
+ )
61
+ parser.should_receive(:parse_file).with("app_extra.yml").and_return(
62
+ "Resources" => {
63
+ "WebApp" => {
64
+ "Type" => "LaunchConfiguration"
65
+ }
66
+ }
67
+ )
68
+ processor.process("app.yml", "app_extra.yml").should == {
69
+ "AWSTemplateFormatVersion" => "2010-09-09",
70
+ "Resources" => {
71
+ "WebApp" => {
72
+ "Type" => "LaunchConfiguration"
73
+ }
74
+ }
75
+ }
76
+ end
77
+ it "merges arrays" do
78
+ parser.should_receive(:parse_file).with("app.yml").and_return(
79
+ "Resources" => {
80
+ "FrontendFleet" => {
81
+ "LoadBalancerNames" => [ "load balancer A" ]
82
+ }
83
+ }
84
+ )
85
+ parser.should_receive(:parse_file).with("app_extra.yml").and_return(
86
+ "Resources" => {
87
+ "FrontendFleet" => {
88
+ "LoadBalancerNames" => [ "load balancer B" ]
89
+ }
90
+ }
91
+ )
92
+ processor.process("app.yml", "app_extra.yml").should == {
93
+ "AWSTemplateFormatVersion" => "2010-09-09",
94
+ "Resources" => {
95
+ "FrontendFleet" => {
96
+ "LoadBalancerNames" => [ "load balancer A", "load balancer B" ]
97
+ }
98
+ }
99
+ }
100
+ end
101
+ it "merges maps" do
102
+ parser.should_receive(:parse_file).with("app.yml").and_return(
103
+ "Resources" => {
104
+ "FrontendFleet" => {
105
+ "Properties" => {
106
+ "LoadBalancerNames" => [ "load balancer A" ]
107
+ }
108
+ }
109
+ }
110
+ )
111
+ parser.should_receive(:parse_file).with("app_extra.yml").and_return(
112
+ "Resources" => {
113
+ "FrontendFleet" => {
114
+ "Properties" => {
115
+ "MinSize" => "1"
116
+ }
117
+ }
118
+ }
119
+ )
120
+ processor.process("app.yml", "app_extra.yml").should == {
121
+ "AWSTemplateFormatVersion" => "2010-09-09",
122
+ "Resources" => {
123
+ "FrontendFleet" => {
124
+ "Properties" => {
125
+ "LoadBalancerNames" => [ "load balancer A" ],
126
+ "MinSize" => "1"
127
+ }
128
+ }
129
+ }
130
+ }
131
+ end
132
+ end
133
+ end
26
134
  end
27
135
 
28
136
  describe "#process_all" do
@@ -66,6 +66,11 @@ module Cfoo
66
66
 
67
67
  parser.load_file("#{working_dir}/base64.yml").should == YAML::DomainType.create("Base64", "myencodedstring")
68
68
  end
69
+ it "converts AZ lookups to GetAZs function-calls" do
70
+ write "#{working_dir}/get_azs.yml", "!GetAZs myregion"
71
+
72
+ parser.load_file("#{working_dir}/get_azs.yml").should == YAML::DomainType.create("GetAZs", "myregion")
73
+ end
69
74
  end
70
75
  end
71
76
 
@@ -0,0 +1,36 @@
1
+ require 'spec_helper'
2
+
3
+ module YAML
4
+ describe DomainType do
5
+ describe "#eq?" do
6
+ it "returns true when all properties are equal" do
7
+ left = DomainType.create("type", "value")
8
+ right = DomainType.create("type", "value")
9
+ left.should == right
10
+ end
11
+ it "returns false when type IDs are different" do
12
+ left = DomainType.create("type_a", "value")
13
+ right = DomainType.create("type_b", "value")
14
+ left.should_not == right
15
+ end
16
+ it "returns false when values are different" do
17
+ left = DomainType.create("type", "value_1")
18
+ right = DomainType.create("type", "value_2")
19
+ left.should_not == right
20
+ end
21
+ it "returns false when domains are different" do
22
+ left = DomainType.create("type", "value")
23
+ right = DomainType.create("type", "value")
24
+ left.domain = "some domain"
25
+ right.domain = "some other domain"
26
+ left.should_not == right
27
+ end
28
+ it "returns false when other type is not a domain type" do
29
+ left = DomainType.create("type", "value")
30
+ right = "not a domain type"
31
+ left.should_not == right
32
+ end
33
+ end
34
+ end
35
+ end
36
+
metadata CHANGED
@@ -1,149 +1,143 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: cfoo
3
- version: !ruby/object:Gem::Version
4
- version: 0.0.1
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 0
8
+ - 2
9
+ version: 0.0.2
5
10
  platform: ruby
6
- authors:
11
+ authors:
7
12
  - drrb
8
13
  autorequire:
9
14
  bindir: bin
10
15
  cert_chain: []
11
- date: 2013-05-04 00:00:00.000000000 Z
12
- dependencies:
13
- - !ruby/object:Gem::Dependency
16
+
17
+ date: 2013-07-26 00:00:00 +10:00
18
+ default_executable:
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
14
21
  name: json
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - '>='
18
- - !ruby/object:Gem::Version
19
- version: '0'
20
- type: :runtime
21
22
  prerelease: false
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'
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ segments:
28
+ - 0
29
+ version: "0"
34
30
  type: :runtime
31
+ version_requirements: *id001
32
+ - !ruby/object:Gem::Dependency
33
+ name: parslet
35
34
  prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - '>='
39
- - !ruby/object:Gem::Version
40
- version: '0'
41
- - !ruby/object:Gem::Dependency
35
+ requirement: &id002 !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ segments:
40
+ - 0
41
+ version: "0"
42
+ type: :runtime
43
+ version_requirements: *id002
44
+ - !ruby/object:Gem::Dependency
42
45
  name: bundler
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - ~>
46
- - !ruby/object:Gem::Version
47
- version: '1.3'
48
- type: :development
49
46
  prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
47
+ requirement: &id003 !ruby/object:Gem::Requirement
48
+ requirements:
52
49
  - - ~>
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'
50
+ - !ruby/object:Gem::Version
51
+ segments:
52
+ - 1
53
+ - 3
54
+ version: "1.3"
62
55
  type: :development
56
+ version_requirements: *id003
57
+ - !ruby/object:Gem::Dependency
58
+ name: rake
63
59
  prerelease: false
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'
60
+ requirement: &id004 !ruby/object:Gem::Requirement
61
+ requirements:
62
+ - - ">="
63
+ - !ruby/object:Gem::Version
64
+ segments:
65
+ - 0
66
+ version: "0"
76
67
  type: :development
68
+ version_requirements: *id004
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
77
71
  prerelease: false
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'
72
+ requirement: &id005 !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ segments:
77
+ - 0
78
+ version: "0"
90
79
  type: :development
80
+ version_requirements: *id005
81
+ - !ruby/object:Gem::Dependency
82
+ name: cucumber
91
83
  prerelease: false
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'
84
+ requirement: &id006 !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ segments:
89
+ - 0
90
+ version: "0"
104
91
  type: :development
92
+ version_requirements: *id006
93
+ - !ruby/object:Gem::Dependency
94
+ name: simplecov
105
95
  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
112
- name: coveralls
113
- requirement: !ruby/object:Gem::Requirement
114
- requirements:
115
- - - '>='
116
- - !ruby/object:Gem::Version
117
- version: 0.6.3
96
+ requirement: &id007 !ruby/object:Gem::Requirement
97
+ requirements:
98
+ - - ">="
99
+ - !ruby/object:Gem::Version
100
+ segments:
101
+ - 0
102
+ version: "0"
118
103
  type: :development
104
+ version_requirements: *id007
105
+ - !ruby/object:Gem::Dependency
106
+ name: coveralls
119
107
  prerelease: false
120
- version_requirements: !ruby/object:Gem::Requirement
121
- requirements:
122
- - - '>='
123
- - !ruby/object:Gem::Version
108
+ requirement: &id008 !ruby/object:Gem::Requirement
109
+ requirements:
110
+ - - ">="
111
+ - !ruby/object:Gem::Version
112
+ segments:
113
+ - 0
114
+ - 6
115
+ - 3
124
116
  version: 0.6.3
125
- - !ruby/object:Gem::Dependency
126
- name: json
127
- requirement: !ruby/object:Gem::Requirement
128
- requirements:
129
- - - '>='
130
- - !ruby/object:Gem::Version
131
- version: '0'
132
117
  type: :development
118
+ version_requirements: *id008
119
+ - !ruby/object:Gem::Dependency
120
+ name: json
133
121
  prerelease: false
134
- version_requirements: !ruby/object:Gem::Requirement
135
- requirements:
136
- - - '>='
137
- - !ruby/object:Gem::Version
138
- version: '0'
139
- description: 'Cfoo: CloudFormation master'
140
- email:
122
+ requirement: &id009 !ruby/object:Gem::Requirement
123
+ requirements:
124
+ - - ">="
125
+ - !ruby/object:Gem::Version
126
+ segments:
127
+ - 0
128
+ version: "0"
129
+ type: :development
130
+ version_requirements: *id009
131
+ description: "Cfoo: CloudFormation master"
132
+ email:
141
133
  - drrrrrrrrrrrb@gmail.com
142
- executables:
134
+ executables:
143
135
  - cfoo
144
136
  extensions: []
137
+
145
138
  extra_rdoc_files: []
146
- files:
139
+
140
+ files:
147
141
  - .gitignore
148
142
  - .simplecov
149
143
  - .travis.yml
@@ -157,6 +151,8 @@ files:
157
151
  - features/attribute_expansion.feature
158
152
  - features/convert_yaml_to_json.feature
159
153
  - features/el_escaping.feature
154
+ - features/error_reporting.feature
155
+ - features/function_expansion.feature
160
156
  - features/map_reference_expansion.feature
161
157
  - features/modules.feature
162
158
  - features/parse_files.feature
@@ -165,8 +161,11 @@ files:
165
161
  - features/support/env.rb
166
162
  - features/yamly_shortcuts.feature
167
163
  - lib/cfoo.rb
164
+ - lib/cfoo/array.rb
168
165
  - lib/cfoo/cfoo.rb
166
+ - lib/cfoo/constants.rb
169
167
  - lib/cfoo/el_parser.rb
168
+ - lib/cfoo/factory.rb
170
169
  - lib/cfoo/file_system.rb
171
170
  - lib/cfoo/module.rb
172
171
  - lib/cfoo/parser.rb
@@ -176,8 +175,10 @@ files:
176
175
  - lib/cfoo/version.rb
177
176
  - lib/cfoo/yaml.rb
178
177
  - lib/cfoo/yaml_parser.rb
178
+ - spec/cfoo/array_spec.rb
179
179
  - spec/cfoo/cfoo_spec.rb
180
180
  - spec/cfoo/el_parser_spec.rb
181
+ - spec/cfoo/factory_spec.rb
181
182
  - spec/cfoo/file_system_spec.rb
182
183
  - spec/cfoo/module_spec.rb
183
184
  - spec/cfoo/parser_spec.rb
@@ -185,37 +186,44 @@ files:
185
186
  - spec/cfoo/project_spec.rb
186
187
  - spec/cfoo/renderer_spec.rb
187
188
  - spec/cfoo/yaml_parser_spec.rb
189
+ - spec/cfoo/yaml_spec.rb
188
190
  - spec/spec_helper.rb
191
+ has_rdoc: true
189
192
  homepage: https://github.com/drrb/cfoo
190
- licenses:
193
+ licenses:
191
194
  - GPL-3
192
- metadata: {}
193
195
  post_install_message:
194
196
  rdoc_options: []
195
- require_paths:
197
+
198
+ require_paths:
196
199
  - lib
197
- required_ruby_version: !ruby/object:Gem::Requirement
198
- requirements:
199
- - - '>='
200
- - !ruby/object:Gem::Version
201
- version: '0'
202
- required_rubygems_version: !ruby/object:Gem::Requirement
203
- requirements:
204
- - - '>='
205
- - !ruby/object:Gem::Version
206
- version: '0'
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"
207
214
  requirements: []
215
+
208
216
  rubyforge_project:
209
- rubygems_version: 2.0.3
217
+ rubygems_version: 1.3.6
210
218
  signing_key:
211
- specification_version: 4
212
- summary: Cfoo (pronounced 'sifu') allows you to write your CloudFormation templates
213
- in a YAML-based markup language, and organise it into modules to make it easier
214
- to maintain.
215
- test_files:
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:
216
222
  - features/attribute_expansion.feature
217
223
  - features/convert_yaml_to_json.feature
218
224
  - features/el_escaping.feature
225
+ - features/error_reporting.feature
226
+ - features/function_expansion.feature
219
227
  - features/map_reference_expansion.feature
220
228
  - features/modules.feature
221
229
  - features/parse_files.feature
@@ -223,8 +231,10 @@ test_files:
223
231
  - features/step_definitions/cfoo_steps.rb
224
232
  - features/support/env.rb
225
233
  - features/yamly_shortcuts.feature
234
+ - spec/cfoo/array_spec.rb
226
235
  - spec/cfoo/cfoo_spec.rb
227
236
  - spec/cfoo/el_parser_spec.rb
237
+ - spec/cfoo/factory_spec.rb
228
238
  - spec/cfoo/file_system_spec.rb
229
239
  - spec/cfoo/module_spec.rb
230
240
  - spec/cfoo/parser_spec.rb
@@ -232,4 +242,5 @@ test_files:
232
242
  - spec/cfoo/project_spec.rb
233
243
  - spec/cfoo/renderer_spec.rb
234
244
  - spec/cfoo/yaml_parser_spec.rb
245
+ - spec/cfoo/yaml_spec.rb
235
246
  - spec/spec_helper.rb