dsl_maker 0.0.9 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0338de58f7a2ecf13d08d203c4682bde172292f5
4
- data.tar.gz: cc00e4a818b4aeb8b84841874878cd0851611703
3
+ metadata.gz: 99ee47867d6b31ded1c99a54a01aa793a61592f3
4
+ data.tar.gz: 5e11770909897a850465398142d13ea52e533f54
5
5
  SHA512:
6
- metadata.gz: 5b272b83ae0a2485dbe1890172fbf03ac7cf4885cfd97d21b853008f7cbd30c930b2f7734f1ec886c5d2924e46fc41bc1853bccec8223997e7f9af9bd45f8e0a
7
- data.tar.gz: 1cf59abb5d74f12358e234dde90d072348b938e993ab0884487a0715215ab15a5909abc17b11b0954035e81fe32edd11d2ad872dbb17dbd8fdc8aeadcc94b16b
6
+ metadata.gz: 9106d1d87a86d23e4eccb86b39d4a972e413cf3ce1dd7c469f36889de039f4162494da84abc0a5247312f61e64ca2c1b5b33e5ac694e3428d8640771d8de6504
7
+ data.tar.gz: 9e1084f369c61cc4029b90ff76a555f17203b3c52913d5aaca1168b93f7725d1b8f2696170b12047e12fb936a7dc24acb0cf8e2ad24688493249a3b17db03b7e
data/Changes CHANGED
@@ -1,5 +1,10 @@
1
1
  Revision history for DSL::Maker (ordered by revision number).
2
2
 
3
+ 0.1.0 Aug 11 2015
4
+ BREAKING CHANGE:
5
+ - parse_dsl() and execute_dsl() now always return an array, even if there is
6
+ only one value. This simplifies code to handle error cases.
7
+
3
8
  0.0.9 Aug 11 2015
4
9
  - Added the ArrayOf[<type>] type to allow for arrays to concatenate properly.
5
10
  - Added the AliasOf(<name>) type to allow for use of multiple names to refer to
data/README.md CHANGED
@@ -158,7 +158,7 @@ class PizzaBuilder < DSL::Maker
158
158
  end
159
159
  end
160
160
 
161
- pizza = PizzaBuilder.parse_dsl("
161
+ pizzas = PizzaBuilder.parse_dsl("
162
162
  pizza {
163
163
  cheese yes
164
164
  pepperoni Yes
@@ -199,7 +199,7 @@ class FamilyTree < DSL::Maker
199
199
  end
200
200
  end
201
201
 
202
- john_smith = FamilyTree.parse_dsl("
202
+ people = FamilyTree.parse_dsl("
203
203
  person {
204
204
  name 'John Smith'
205
205
  mother {
@@ -210,6 +210,7 @@ john_smith = FamilyTree.parse_dsl("
210
210
  }
211
211
  }
212
212
  ")
213
+ john_smith = people[0]
213
214
  ```
214
215
 
215
216
  Pretty easy. We can even refactor that a bit and end up with:
@@ -261,7 +262,7 @@ class FamilyTreeDSL < DSL::Maker
261
262
  end
262
263
  end
263
264
 
264
- john_smith = FamilyTreeDSL.parse_dsl("
265
+ people = FamilyTreeDSL.parse_dsl("
265
266
  person 'John Smith' do
266
267
  age 20
267
268
  mother 'Mary Smith' do
@@ -273,6 +274,7 @@ john_smith = FamilyTreeDSL.parse_dsl("
273
274
  }
274
275
  end
275
276
  ")
277
+ john_smith = people[0]
276
278
  ```
277
279
 
278
280
  The result is exactly the same as before.
@@ -304,8 +306,10 @@ Now, we can handle an arbitrarily-deep family tree.
304
306
 
305
307
  ### Handling multiple items
306
308
 
307
- Chef's recipe files have many entries of different types in them. It doesn't do
308
- you any good if you can't do the same thing.
309
+ You'll note we've been receiving an Array from `parse_dsl()`. This is because
310
+ DSL::Maker automagically handles files with multiple entries. Chef's recipe files
311
+ have many entries of different types in them. It doesn't do you any good if you
312
+ can't do the same thing.
309
313
 
310
314
  ```ruby
311
315
  Car = Struct.new(:make, :model)
@@ -341,8 +345,8 @@ vehicles = VehicleDSL.parse_dsl("
341
345
  ```
342
346
 
343
347
  `vehicles` is an `Array` with a `Car` and a `Truck` in it, in that order. If your
344
- DSL snippet has only one item, you get back that item. If it has multiple items,
345
- you get back an `Array` with everything in the right order.
348
+ DSL snippet has only one item, you get back an Array with just that item. If it
349
+ has multiple items, you get back an `Array` with everything in the right order.
346
350
 
347
351
  ## API
348
352
 
@@ -394,11 +398,12 @@ This creates global helpers that are available at every level of your DSLs.
394
398
  * `parse_dsl(String)` / `execute_dsl(&block)`
395
399
 
396
400
  You call this on your DSL class when you're ready to invoke your DSL. It will
397
- return whatever the block provided to `add_entrypoint()` returns.
401
+ return an array containing whatever the block provided to `add_entrypoint()`
402
+ returns.
398
403
 
399
- In the case of multiple DSL entrypoints (for example, a normal Chef recipe),
400
- these methods will return an array with all the return values in the order they
401
- were encountered.
404
+ It returns an array for the case of multiple DSL entrypoints (for example, a
405
+ normal Chef recipe). The array will contain the values in the order they were
406
+ encountered.
402
407
 
403
408
  ### Type Coercions
404
409
 
@@ -444,7 +449,6 @@ $ gem install dsl_maker
444
449
 
445
450
  ## TODO
446
451
 
447
- * Add support for Arrays (ArrayOf[Type]?)
448
452
  * Add support for generating useful errors (ideally with line numbers ... ?)
449
453
  * Add support for auto-generating documentation
450
454
  * Add default block that returns a Struct-of-Structs named after entrypoints
data/lib/dsl/maker.rb CHANGED
@@ -109,7 +109,7 @@ class DSL::Maker
109
109
  raise 'Must call add_entrypoint before parse_dsl' unless @klass
110
110
  raise 'String required for parse_dsl' unless dsl.instance_of? String
111
111
 
112
- run_dsl() { eval dsl, @klass.new.get_binding }
112
+ run_dsl { eval dsl, @klass.new.get_binding }
113
113
  end
114
114
 
115
115
  # Execute the DSL provided in the block.
@@ -124,7 +124,7 @@ class DSL::Maker
124
124
  raise 'Must call add_entrypoint before execute_dsl' unless @klass
125
125
  raise 'Block required for execute_dsl' unless block_given?
126
126
 
127
- run_dsl() { @klass.new.instance_eval(&block) }
127
+ run_dsl { @klass.new.instance_eval(&block) }
128
128
  end
129
129
 
130
130
  # This adds a type coercion that's used when creating the DSL.
@@ -416,9 +416,6 @@ class DSL::Maker
416
416
 
417
417
  yield
418
418
 
419
- if @accumulator.length <= 1
420
- return @accumulator[0]
421
- end
422
419
  return @accumulator
423
420
  end
424
421
 
@@ -1,6 +1,6 @@
1
1
  module DSL
2
2
  class Maker
3
3
  # The current version of this library
4
- VERSION = '0.0.9'
4
+ VERSION = '0.1.0'
5
5
  end
6
6
  end
@@ -22,7 +22,7 @@ describe "Packager DSL AliasOf" do
22
22
  pizza = dsl_class.execute_dsl {
23
23
  pizza { cheese yes }
24
24
  }
25
- verify_pizza(pizza, :cheese => true)
25
+ verify_pizza(pizza[0], :cheese => true)
26
26
  end
27
27
 
28
28
  it "can alias multiple times" do
@@ -39,7 +39,7 @@ describe "Packager DSL AliasOf" do
39
39
  pizza = dsl_class.execute_dsl {
40
40
  pizza { fromage yes }
41
41
  }
42
- verify_pizza(pizza, :cheese => true)
42
+ verify_pizza(pizza[0], :cheese => true)
43
43
  end
44
44
 
45
45
  it "can have many different aliases" do
@@ -60,7 +60,7 @@ describe "Packager DSL AliasOf" do
60
60
  bacon yes
61
61
  }
62
62
  }
63
- verify_pizza(pizza, :cheese => true, :bacon => true)
63
+ verify_pizza(pizza[0], :cheese => true, :bacon => true)
64
64
  end
65
65
 
66
66
  it "can alias a DSL" do
@@ -86,6 +86,6 @@ describe "Packager DSL AliasOf" do
86
86
  }
87
87
  }
88
88
  }
89
- verify_pizza(pizza, :cheese => Structs::Cheese.new('mozzarrella', 'white'))
89
+ verify_pizza(pizza[0], :cheese => Structs::Cheese.new('mozzarrella', 'white'))
90
90
  end
91
91
  end
data/spec/args_spec.rb CHANGED
@@ -16,7 +16,7 @@ describe "A DSL with argument handling describing fruit" do
16
16
  it "can handle nil" do
17
17
  fruit = dsl_class.parse_dsl("
18
18
  fruit {}
19
- ")
19
+ ")[0]
20
20
  expect(fruit).to be_instance_of(Structs::Fruit)
21
21
  expect(fruit.name).to be_nil
22
22
  end
@@ -24,7 +24,7 @@ describe "A DSL with argument handling describing fruit" do
24
24
  it "can handle the name in the attribute" do
25
25
  fruit = dsl_class.parse_dsl("
26
26
  fruit { name 'banana' }
27
- ")
27
+ ")[0]
28
28
  expect(fruit).to be_instance_of(Structs::Fruit)
29
29
  expect(fruit.name).to eq('banana')
30
30
  end
@@ -32,7 +32,7 @@ describe "A DSL with argument handling describing fruit" do
32
32
  it "can handle the name in the args" do
33
33
  fruit = dsl_class.parse_dsl("
34
34
  fruit 'banana'
35
- ")
35
+ ")[0]
36
36
  expect(fruit).to be_instance_of(Structs::Fruit)
37
37
  expect(fruit.name).to eq('banana')
38
38
  end
@@ -43,7 +43,7 @@ describe "A DSL with argument handling describing fruit" do
43
43
  fruit 'buh-nana!' do
44
44
  name 'banana'
45
45
  end
46
- ")
46
+ ")[0]
47
47
  expect(fruit).to be_instance_of(Structs::Fruit)
48
48
  expect(fruit.name).to eq('banana')
49
49
  end
@@ -67,7 +67,7 @@ describe "A DSL with argument handling describing fruit" do
67
67
  it "can handle no arguments" do
68
68
  fruit = dsl_class.parse_dsl("
69
69
  fruit {}
70
- ")
70
+ ")[0]
71
71
  expect(fruit).to be_instance_of(Structs::Fruit)
72
72
  expect(fruit.name).to be_nil
73
73
  expect(fruit.color).to be_nil
@@ -79,7 +79,7 @@ describe "A DSL with argument handling describing fruit" do
79
79
  fruit('banana') {
80
80
  color 'yellow'
81
81
  }
82
- ")
82
+ ")[0]
83
83
  expect(fruit).to be_instance_of(Structs::Fruit)
84
84
  expect(fruit.name).to eq('banana')
85
85
  expect(fruit.color).to eq('yellow')
@@ -89,7 +89,7 @@ describe "A DSL with argument handling describing fruit" do
89
89
  fruit 'plantain' do
90
90
  color 'green'
91
91
  end
92
- ")
92
+ ")[0]
93
93
  expect(fruit).to be_instance_of(Structs::Fruit)
94
94
  expect(fruit.name).to eq('plantain')
95
95
  expect(fruit.color).to eq('green')
@@ -98,7 +98,7 @@ describe "A DSL with argument handling describing fruit" do
98
98
  it "can handle everything in the args" do
99
99
  fruit = dsl_class.parse_dsl("
100
100
  fruit 'banana', 'yellow'
101
- ")
101
+ ")[0]
102
102
  expect(fruit).to be_instance_of(Structs::Fruit)
103
103
  expect(fruit.name).to eq('banana')
104
104
  expect(fruit.color).to eq('yellow')
@@ -130,7 +130,7 @@ describe "A DSL with argument handling describing fruit" do
130
130
  name 'yellow'
131
131
  }
132
132
  end
133
- ")
133
+ ")[0]
134
134
  expect(fruit).to be_instance_of(Structs::Fruit)
135
135
  expect(fruit.name).to eq('banana')
136
136
  expect(fruit.color).to be_instance_of(Structs::Color)
@@ -142,7 +142,7 @@ describe "A DSL with argument handling describing fruit" do
142
142
  fruit 'banana' do
143
143
  color 'yellow'
144
144
  end
145
- ")
145
+ ")[0]
146
146
  expect(fruit).to be_instance_of(Structs::Fruit)
147
147
  expect(fruit.name).to eq('banana')
148
148
  expect(fruit.color).to be_instance_of(Structs::Color)
@@ -156,7 +156,7 @@ describe "A DSL with argument handling describing fruit" do
156
156
  name 'green'
157
157
  end
158
158
  end
159
- ")
159
+ ")[0]
160
160
  expect(fruit).to be_instance_of(Structs::Fruit)
161
161
  expect(fruit.name).to eq('banana')
162
162
  expect(fruit.color).to be_instance_of(Structs::Color)
@@ -23,14 +23,14 @@ describe "Packager DSL ArrayOf" do
23
23
  cheeses 'mozzarrella'
24
24
  }
25
25
  }
26
- verify_pizza(pizza, :cheese => %w(cheddar mozzarrella))
26
+ verify_pizza(pizza[0], :cheese => %w(cheddar mozzarrella))
27
27
 
28
28
  pizza = dsl_class.execute_dsl {
29
29
  pizza {
30
30
  cheeses 'cheddar', 'mozzarrella'
31
31
  }
32
32
  }
33
- verify_pizza(pizza, :cheese => %w(cheddar mozzarrella))
33
+ verify_pizza(pizza[0], :cheese => %w(cheddar mozzarrella))
34
34
  end
35
35
 
36
36
  it "can array a DSL" do
@@ -62,7 +62,7 @@ describe "Packager DSL ArrayOf" do
62
62
  }
63
63
  }
64
64
  }
65
- verify_pizza(pizza, :cheese => [
65
+ verify_pizza(pizza[0], :cheese => [
66
66
  Structs::Cheese.new('mozzarrella', 'white'),
67
67
  Structs::Cheese.new('cheddar', 'orange'),
68
68
  ])
@@ -127,7 +127,7 @@ describe "Packager DSL ArrayOf" do
127
127
  end
128
128
  }
129
129
  }
130
- verify_pizza(pizza, :cheese => [
130
+ verify_pizza(pizza[0], :cheese => [
131
131
  Structs::Cheese.new('mozzarrella', 'white'),
132
132
  Structs::Cheese.new('cheddar', 'orange'),
133
133
  ])
@@ -29,7 +29,7 @@ describe "Passing a class into generate_dsl" do
29
29
  size 26
30
30
  end
31
31
  end
32
- end
32
+ end[0]
33
33
  expect(car).to be_instance_of(Structs::Car)
34
34
  expect(car.maker).to eq('honda')
35
35
  expect(car.wheel).to be_instance_of(Structs::Wheel)
@@ -70,7 +70,7 @@ describe "Passing a class into generate_dsl" do
70
70
  size 26
71
71
  end
72
72
  end
73
- end
73
+ end[0]
74
74
  expect(car).to be_instance_of(Structs::Car)
75
75
  expect(car.maker).to eq('honda')
76
76
  expect(car.wheel).to be_instance_of(Structs::Wheel)
data/spec/helper_spec.rb CHANGED
@@ -18,7 +18,7 @@ describe "A DSL with helpers" do
18
18
  car {
19
19
  maker transform('Honda')
20
20
  }
21
- ")
21
+ ")[0]
22
22
  expect(car).to be_instance_of(Structs::Car)
23
23
  expect(car.maker).to eq('HONDA')
24
24
  end
@@ -51,7 +51,7 @@ describe "A DSL with helpers" do
51
51
  maker transform2('goodyear')
52
52
  }
53
53
  }
54
- ")
54
+ ")[0]
55
55
  expect(car).to be_instance_of(Structs::Car)
56
56
  expect(car.maker).to eq('Honda')
57
57
  expect(car.wheel).to be_instance_of(Structs::Wheel)
@@ -18,7 +18,7 @@ describe 'A multi-level DSL making family-trees' do
18
18
  end
19
19
  end
20
20
 
21
- person = dsl_class.parse_dsl('person { name "Tom" }')
21
+ person = dsl_class.parse_dsl('person { name "Tom" }')[0]
22
22
  expect(person).to be_instance_of(Structs::Person)
23
23
  expect(person.name).to eq('Tom')
24
24
  expect(person.child).to be_nil
@@ -45,7 +45,7 @@ describe 'A multi-level DSL making family-trees' do
45
45
  name 'Bill'
46
46
  }
47
47
  }
48
- ")
48
+ ")[0]
49
49
  expect(person).to be_instance_of(Structs::Person)
50
50
  expect(person.name).to eq('Tom')
51
51
  expect(person.child).to be_instance_of(Structs::Person)
@@ -81,7 +81,7 @@ describe 'A multi-level DSL making family-trees' do
81
81
  }
82
82
  }
83
83
  }
84
- ")
84
+ ")[0]
85
85
  expect(person).to be_instance_of(Structs::Person)
86
86
  expect(person.name).to eq('Tom')
87
87
  expect(person.child).to be_instance_of(Structs::Person)
@@ -137,7 +137,7 @@ describe 'A multi-level DSL making family-trees' do
137
137
  }
138
138
  }
139
139
  }
140
- ")
140
+ ")[0]
141
141
 
142
142
  [
143
143
  'Adam', 'Seth', 'Enos', 'Cainan', 'Mahalaleel', 'Jared',
@@ -170,7 +170,7 @@ describe 'A multi-level DSL making family-trees' do
170
170
  name 'Tom Smith'
171
171
  }
172
172
  }
173
- ")
173
+ ")[0]
174
174
 
175
175
  expect(person).to be_instance_of(Structs::OtherPerson)
176
176
  expect(person.name).to eq('John Smith')
@@ -28,7 +28,7 @@ describe 'A single-level DSL for pizza' do
28
28
  end
29
29
 
30
30
  pizza = dsl_class.parse_dsl('')
31
- expect(pizza).to be(nil)
31
+ expect(pizza[0]).to be(nil)
32
32
  end
33
33
 
34
34
  it 'with :execute_dsl' do
@@ -39,7 +39,7 @@ describe 'A single-level DSL for pizza' do
39
39
  end
40
40
 
41
41
  pizza = dsl_class.execute_dsl {}
42
- expect(pizza).to be(nil)
42
+ expect(pizza[0]).to be(nil)
43
43
  end
44
44
  end
45
45
 
@@ -51,7 +51,7 @@ describe 'A single-level DSL for pizza' do
51
51
  end
52
52
 
53
53
  pizza = dsl_class.parse_dsl('pizza {}')
54
- verify_pizza(pizza)
54
+ verify_pizza(pizza[0])
55
55
  end
56
56
 
57
57
  # This tests all the possible Boolean invocations
@@ -68,39 +68,39 @@ describe 'A single-level DSL for pizza' do
68
68
  # retrieve the value from within the DSL. Therefore, we assume it's a getter
69
69
  # and don't default the value to true. Otherwise, false values wouldn't work.
70
70
  pizza = dsl_class.parse_dsl('pizza { cheese }')
71
- verify_pizza(pizza, :cheese => false)
71
+ verify_pizza(pizza[0], :cheese => false)
72
72
 
73
73
  # Test the Ruby booleans and falsey's.
74
74
  [ true, false, nil ].each do |cheese|
75
75
  pizza = dsl_class.parse_dsl("pizza { cheese #{cheese} }")
76
- verify_pizza(pizza, :cheese => !!cheese)
76
+ verify_pizza(pizza[0], :cheese => !!cheese)
77
77
  end
78
78
 
79
79
  # Test the true values we provide
80
80
  %w(Yes On True yes on).each do |cheese|
81
81
  pizza = dsl_class.parse_dsl("pizza { cheese #{cheese} }")
82
- verify_pizza(pizza, :cheese => true)
82
+ verify_pizza(pizza[0], :cheese => true)
83
83
  end
84
84
 
85
85
  # Test the false values we provide
86
86
  %w(No Off False no off).each do |cheese|
87
87
  pizza = dsl_class.parse_dsl("pizza { cheese #{cheese} }")
88
- verify_pizza(pizza, :cheese => false)
88
+ verify_pizza(pizza[0], :cheese => false)
89
89
  end
90
90
 
91
91
  # Test the boolean-ized strings we provide
92
92
  %w(Yes On True yes on true).each do |cheese|
93
93
  pizza = dsl_class.parse_dsl("pizza { cheese '#{cheese}' }")
94
- verify_pizza(pizza, :cheese => true)
94
+ verify_pizza(pizza[0], :cheese => true)
95
95
  end
96
96
  %w(No Off False no off false nil).each do |cheese|
97
97
  pizza = dsl_class.parse_dsl("pizza { cheese '#{cheese}' }")
98
- verify_pizza(pizza, :cheese => false)
98
+ verify_pizza(pizza[0], :cheese => false)
99
99
  end
100
100
 
101
101
  # Test some other things which should all be true
102
102
  pizza = dsl_class.parse_dsl("pizza { cheese 5 }")
103
- verify_pizza(pizza, :cheese => true)
103
+ verify_pizza(pizza[0], :cheese => true)
104
104
  end
105
105
 
106
106
  it 'makes a saucy pizza' do
@@ -121,7 +121,7 @@ describe 'A single-level DSL for pizza' do
121
121
  else
122
122
  raise "Unexpected class #{level.class}"
123
123
  end
124
- verify_pizza(pizza, :sauce => level.to_s)
124
+ verify_pizza(pizza[0], :sauce => level.to_s)
125
125
  end
126
126
  end
127
127
 
@@ -147,7 +147,7 @@ describe 'A single-level DSL for pizza' do
147
147
  sauce :extra
148
148
  }
149
149
  ")
150
- verify_pizza(pizza,
150
+ verify_pizza(pizza[0],
151
151
  :sauce => 'extra',
152
152
  :pepperoni => true,
153
153
  :bacon => false,
@@ -177,7 +177,7 @@ describe 'A single-level DSL for pizza' do
177
177
  sauce :extra
178
178
  }
179
179
  end
180
- verify_pizza(pizza,
180
+ verify_pizza(pizza[0],
181
181
  :sauce => 'extra',
182
182
  :pepperoni => true,
183
183
  :bacon => false,
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dsl_maker
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.9
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rob Kinyon