cfoo 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -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