dsl_maker 0.0.9 → 0.1.0

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.
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