caesars 0.5.2 → 0.5.3
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.
- data/CHANGES.txt +29 -23
- data/README.rdoc +8 -4
- data/bin/example +7 -3
- data/caesars.gemspec +2 -2
- data/lib/caesars.rb +66 -21
- metadata +2 -2
data/CHANGES.txt
CHANGED
@@ -1,9 +1,15 @@
|
|
1
1
|
CAESAR -- CHANGES
|
2
2
|
|
3
3
|
|
4
|
+
#### 0.5.3 (2009-04-10) ###############################
|
5
|
+
|
6
|
+
* ADDED: Better error handling when reading DSL config files
|
7
|
+
* ADDED: forced_hash method
|
8
|
+
|
9
|
+
|
4
10
|
#### 0.5.2 (2009-03-31) ###############################
|
5
11
|
|
6
|
-
*
|
12
|
+
* ADDED: Caesars.debug?, Caesars.enable_debug, Caesars.disable_debug
|
7
13
|
* CHANGED: find_deferred now supports nested Arrays. See rdocs.
|
8
14
|
* BUG: Found bug related to string/symbol ambiguity when using find.
|
9
15
|
It's not fixed yet so for now be mindful of which attributes are
|
@@ -14,31 +20,31 @@ and method accessors are not affected.
|
|
14
20
|
|
15
21
|
#### 0.5.1 (2009-03-11) ###############################
|
16
22
|
|
17
|
-
*
|
18
|
-
*
|
23
|
+
* FIXED: Method-syntax was broken for attributes of top level method
|
24
|
+
* FIXED: Caesars::Hash#refresh was setting @options to nil
|
19
25
|
* UPDATED: docs and bin/example to reflect Caesars::Hash changes.
|
20
|
-
*
|
26
|
+
* FIXED: instance_variables in Ruby 1.9.1 returns Symbols
|
21
27
|
|
22
28
|
|
23
29
|
#### 0.5.0 (2009-03-11) ###############################
|
24
30
|
|
25
|
-
*
|
26
|
-
*
|
27
|
-
*
|
28
|
-
*
|
29
|
-
*
|
30
|
-
*
|
31
|
-
*
|
32
|
-
*
|
31
|
+
* FIXED: find_deferred now gracefully handles nil errors
|
32
|
+
* ADDED: empty? method in Caesars::Config
|
33
|
+
* ADDED: post processing hook in Caesars::Config#refresh
|
34
|
+
* ADDED: Caesars::Hash#to_hash now recursively casts children to ::Hash.
|
35
|
+
* FIXED: Added Array support to Caesars::Hash
|
36
|
+
* ADDED: Setters for Caesars attributes
|
37
|
+
* ADDED: Caesars::Config supports multiple config files
|
38
|
+
* ADDED: Top level methods used more than once now merges values
|
33
39
|
rather than overwrites.
|
34
|
-
*
|
40
|
+
* ADDED: Caesars::Config supports reloading config files on the fly
|
35
41
|
|
36
42
|
|
37
43
|
#### 0.4.2 (2009-03-05) ###############################
|
38
44
|
|
39
|
-
*
|
40
|
-
*
|
41
|
-
*
|
45
|
+
* FIXED: missing bin/party.conf in gem release
|
46
|
+
* FIXED: Now works with Ruby 1.8+
|
47
|
+
* ADDED: Cleaner rdocs.
|
42
48
|
* TODO: Fix support for top level methods with names:
|
43
49
|
food :extra do; end; # => food_extra
|
44
50
|
|
@@ -47,18 +53,18 @@ food :extra do; end; # => food_extra
|
|
47
53
|
|
48
54
|
* CHANGE: Removed bloody method. We now parse blocks immediately.
|
49
55
|
* CHANGE: Renamed virgin method to chill.
|
50
|
-
*
|
56
|
+
* ADDED: Caesars::Config class for loading DSLs as config files.
|
51
57
|
See Example 3.
|
52
|
-
*
|
58
|
+
* ADDED: Added find_deferred method to automatically jump up the
|
53
59
|
heirarchy when looking for a specific attribute.
|
54
|
-
*
|
60
|
+
* ADDED: Added to_hash and [] methods to Caesars to make it
|
55
61
|
more hashlike.
|
56
|
-
*
|
62
|
+
* FIXED: "chilled" attributes weren't available by method name
|
57
63
|
|
58
64
|
|
59
65
|
#### 0.3.2 (2009-03-04) ###############################
|
60
66
|
|
61
|
-
*
|
67
|
+
* FIXED: Added file and line info for eval code (better debugging).
|
62
68
|
* CHANGE: The top level DSL method names are now determined by
|
63
69
|
by the class name. Some::ClassName becomes classname.
|
64
70
|
This is less confusing than allowing it to be anything
|
@@ -68,9 +74,9 @@ namespace.
|
|
68
74
|
|
69
75
|
#### 0.3.1 (2009-03-04) ###############################
|
70
76
|
|
71
|
-
*
|
77
|
+
* ADDED: Accept instances without a name
|
72
78
|
* CHANGE: Updated examples.
|
73
|
-
*
|
79
|
+
* ADDED: More rdocs.
|
74
80
|
|
75
81
|
|
76
82
|
|
data/README.rdoc
CHANGED
@@ -56,17 +56,21 @@ Or for GitHub fans:
|
|
56
56
|
# will be included in the instance variable (@staff_fte).
|
57
57
|
staff :fte do
|
58
58
|
desc 'Our hard-working, "full-time" staff'
|
59
|
+
|
59
60
|
location :splashdown do
|
60
61
|
town :tsawwassen
|
62
|
+
|
61
63
|
person :steve, :sheila do
|
62
64
|
role :manager
|
63
65
|
end
|
66
|
+
|
64
67
|
person :steve do
|
65
68
|
role :cook
|
66
69
|
anger :high
|
67
70
|
hours 25
|
68
71
|
catchphrase "Rah! [strokes goatee]"
|
69
72
|
end
|
73
|
+
|
70
74
|
person :sheila do
|
71
75
|
catchphrase "This gravy tastes like food I ate in a Mexican prison."
|
72
76
|
hours rand(20)
|
@@ -75,6 +79,7 @@ Or for GitHub fans:
|
|
75
79
|
("%.2f" % [gumption * self.splashdown.sheila.rate.to_f]).to_f
|
76
80
|
end
|
77
81
|
end
|
82
|
+
|
78
83
|
person :delano do
|
79
84
|
role :cook
|
80
85
|
rate "8.35/h"
|
@@ -82,9 +87,9 @@ Or for GitHub fans:
|
|
82
87
|
satisfaction :low
|
83
88
|
calculate :salary do
|
84
89
|
self.splashdown.delano.rate.to_f * self.splashdown.delano.hours
|
85
|
-
|
86
90
|
end
|
87
91
|
end
|
92
|
+
|
88
93
|
end
|
89
94
|
end
|
90
95
|
|
@@ -104,7 +109,6 @@ Or for GitHub fans:
|
|
104
109
|
# You can call them manually and send arguments like you normally would.
|
105
110
|
p @staff_fte.splashdown.delano.salary.call # => 475.95
|
106
111
|
p @staff_fte.splashdown.sheila.salary.call(rand(100)) # => 549.77
|
107
|
-
p @staff_fte.splashdown.keys
|
108
112
|
|
109
113
|
|
110
114
|
== EXAMPLE 3 -- External Config file
|
@@ -159,9 +163,9 @@ Or for GitHub fans:
|
|
159
163
|
|
160
164
|
== Thanks
|
161
165
|
|
162
|
-
* Clams, Tomatoes,
|
166
|
+
* Clams, Tomatoes, Grey Goose, and the rest of the crew.
|
163
167
|
* Caleb Buxton (http://cpb.ca) for early feedback.
|
164
|
-
|
168
|
+
* Solutious Inc (http://solutious.com)
|
165
169
|
|
166
170
|
== License
|
167
171
|
|
data/bin/example
CHANGED
@@ -53,17 +53,21 @@ extend Staff::DSL
|
|
53
53
|
# will be included in the instance variable (@staff_fte).
|
54
54
|
staff :fte do
|
55
55
|
desc 'Our hard-working, "full-time" staff'
|
56
|
+
|
56
57
|
location :splashdown do
|
57
58
|
town :tsawwassen
|
59
|
+
|
58
60
|
person :steve, :sheila do
|
59
61
|
role :manager
|
60
62
|
end
|
63
|
+
|
61
64
|
person :steve do
|
62
65
|
role :cook
|
63
66
|
anger :high
|
64
67
|
hours 25
|
65
68
|
catchphrase "Rah! [strokes goatee]"
|
66
69
|
end
|
70
|
+
|
67
71
|
person :sheila do
|
68
72
|
catchphrase "This gravy tastes like food I ate in a Mexican prison."
|
69
73
|
hours rand(20)
|
@@ -72,16 +76,17 @@ staff :fte do
|
|
72
76
|
("%.2f" % [gumption * self.splashdown.sheila.rate.to_f]).to_f
|
73
77
|
end
|
74
78
|
end
|
79
|
+
|
75
80
|
person :delano do
|
76
81
|
role :cook
|
77
82
|
rate "8.35/h"
|
78
83
|
hours 57
|
79
84
|
satisfaction :low
|
80
85
|
calculate :salary do
|
81
|
-
self.splashdown.delano.rate.to_f * self.splashdown.delano.hours
|
82
|
-
|
86
|
+
self.splashdown.delano.rate.to_f * self.splashdown.delano.hours
|
83
87
|
end
|
84
88
|
end
|
89
|
+
|
85
90
|
end
|
86
91
|
end
|
87
92
|
|
@@ -101,7 +106,6 @@ p @staff_fte.splashdown[:steve][:role] # => [:manager, :cook]
|
|
101
106
|
# You can call them manually and send arguments like you normally would.
|
102
107
|
p @staff_fte.splashdown.delano.salary.call # => 475.95
|
103
108
|
p @staff_fte.splashdown.sheila.salary.call(rand(100)) # => 549.77
|
104
|
-
p @staff_fte.splashdown.keys
|
105
109
|
|
106
110
|
|
107
111
|
# ------------------------------------------------------------------
|
data/caesars.gemspec
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
@spec = Gem::Specification.new do |s|
|
2
2
|
s.name = %q{caesars}
|
3
|
-
s.version = "0.5.
|
4
|
-
s.date = %q{2009-
|
3
|
+
s.version = "0.5.3"
|
4
|
+
s.date = %q{2009-04-10}
|
5
5
|
s.specification_version = 1 if s.respond_to? :specification_version=
|
6
6
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
7
7
|
|
data/lib/caesars.rb
CHANGED
@@ -7,9 +7,9 @@
|
|
7
7
|
# See bin/example
|
8
8
|
#
|
9
9
|
class Caesars
|
10
|
-
VERSION = "0.5.
|
10
|
+
VERSION = "0.5.3"
|
11
11
|
@@debug = false
|
12
|
-
|
12
|
+
|
13
13
|
def Caesars.enable_debug; @@debug = true; end
|
14
14
|
def Caesars.disable_debug; @@debug = false; end
|
15
15
|
def Caesars.debug?; @@debug; end
|
@@ -108,21 +108,23 @@ class Caesars
|
|
108
108
|
# should be returned.
|
109
109
|
#
|
110
110
|
# find_deferred(:environment, :role:, [:disks, '/file/path'])
|
111
|
-
#
|
112
|
-
#
|
113
|
-
# [:environment][:disks]['/file/path']
|
114
|
-
# [:disks]['/file/path']
|
111
|
+
#
|
112
|
+
# Search order:
|
113
|
+
# * [:environment][:role][:disks]['/file/path']
|
114
|
+
# * [:environment][:disks]['/file/path']
|
115
|
+
# * [:disks]['/file/path']
|
115
116
|
#
|
116
117
|
# Other nested Arrays are treated special too. We look at the criteria from
|
117
118
|
# right to left and remove the first nested element we find.
|
118
119
|
#
|
119
120
|
# find_deferred([:region, :zone], :environment, :role, :ami)
|
120
121
|
#
|
121
|
-
#
|
122
|
-
# [:region][:environment][:role][:ami]
|
123
|
-
# [:environment][:role][:ami]
|
124
|
-
# [:environment][:ami]
|
125
|
-
# [:ami]
|
122
|
+
# Search order:
|
123
|
+
# * [:region][:zone][:environment][:role][:ami]
|
124
|
+
# * [:region][:environment][:role][:ami]
|
125
|
+
# * [:environment][:role][:ami]
|
126
|
+
# * [:environment][:ami]
|
127
|
+
# * [:ami]
|
126
128
|
#
|
127
129
|
# Returns the attribute if found or nil.
|
128
130
|
#
|
@@ -136,7 +138,7 @@ class Caesars
|
|
136
138
|
# i.e. find([1, 2, :attribute])
|
137
139
|
# We don't use flatten b/c we don't want to disturb nested Arrays
|
138
140
|
if criteria.empty?
|
139
|
-
criteria =
|
141
|
+
criteria = attribute
|
140
142
|
att = criteria.pop
|
141
143
|
end
|
142
144
|
|
@@ -144,7 +146,6 @@ class Caesars
|
|
144
146
|
sacrifice = nil
|
145
147
|
|
146
148
|
while !criteria.empty?
|
147
|
-
p [criteria, att].flatten if Caesars.debug?
|
148
149
|
found = find(criteria, att)
|
149
150
|
break if found
|
150
151
|
|
@@ -225,7 +226,12 @@ class Caesars
|
|
225
226
|
#(@caesars_pointer[:"#{meth}_values"] ||= []) << name
|
226
227
|
@caesars_pointer[name] ||= Caesars::Hash.new
|
227
228
|
@caesars_pointer = @caesars_pointer[name]
|
228
|
-
|
229
|
+
begin
|
230
|
+
b.call if b
|
231
|
+
rescue ArgumentError, SyntaxError => ex
|
232
|
+
STDERR.puts "CAESARS: error in #{meth} (#{args.join(', ')})"
|
233
|
+
raise ex
|
234
|
+
end
|
229
235
|
@caesars_pointer = prev
|
230
236
|
end
|
231
237
|
|
@@ -253,7 +259,7 @@ class Caesars
|
|
253
259
|
# end
|
254
260
|
# end
|
255
261
|
#
|
256
|
-
# @config.food.
|
262
|
+
# @config.food.count.call(3) # => 5
|
257
263
|
#
|
258
264
|
def self.chill(caesars_meth)
|
259
265
|
module_eval %Q{
|
@@ -261,7 +267,7 @@ class Caesars
|
|
261
267
|
# caesars.toplevel.unnamed_chilled_attribute
|
262
268
|
return @caesars_properties[:'#{caesars_meth}'] if @caesars_properties.has_key?(:'#{caesars_meth}') && caesars_names.empty? && b.nil?
|
263
269
|
|
264
|
-
# Use the name of the
|
270
|
+
# Use the name of the chilled method if no name is supplied.
|
265
271
|
caesars_names << :'#{caesars_meth}' if caesars_names.empty?
|
266
272
|
|
267
273
|
caesars_names.each do |name|
|
@@ -275,6 +281,46 @@ class Caesars
|
|
275
281
|
end
|
276
282
|
|
277
283
|
|
284
|
+
|
285
|
+
# Force the specified keyword to always be treated as a hash.
|
286
|
+
# Example:
|
287
|
+
#
|
288
|
+
# startup do
|
289
|
+
# disks do
|
290
|
+
# create "/path/2" # Available as hash: [action][disks][create][/path/2] == {}
|
291
|
+
# create "/path/4" do # Available as hash: [action][disks][create][/path/4] == {size => 14}
|
292
|
+
# size 14
|
293
|
+
# end
|
294
|
+
# end
|
295
|
+
# end
|
296
|
+
#
|
297
|
+
def self.forced_hash(caesars_meth, &b)
|
298
|
+
module_eval %Q{
|
299
|
+
def #{caesars_meth}(*caesars_names,&b)
|
300
|
+
if @caesars_properties.has_key?(:'#{caesars_meth}') && caesars_names.empty? && b.nil?
|
301
|
+
return @caesars_properties[:'#{caesars_meth}']
|
302
|
+
end
|
303
|
+
|
304
|
+
return nil if caesars_names.empty? && b.nil?
|
305
|
+
return method_missing(:'#{caesars_meth}', *caesars_names, &b) if caesars_names.empty?
|
306
|
+
|
307
|
+
caesars_name = caesars_names.shift
|
308
|
+
|
309
|
+
prev = @caesars_pointer
|
310
|
+
@caesars_pointer[:'#{caesars_meth}'] ||= Caesars::Hash.new
|
311
|
+
hash = Caesars::Hash.new
|
312
|
+
@caesars_pointer = hash
|
313
|
+
b.call if b
|
314
|
+
@caesars_pointer = prev
|
315
|
+
@caesars_pointer[:'#{caesars_meth}'][caesars_name] = hash
|
316
|
+
@caesars_pointer = prev
|
317
|
+
end
|
318
|
+
}
|
319
|
+
nil
|
320
|
+
|
321
|
+
|
322
|
+
end
|
323
|
+
|
278
324
|
# Executes automatically when Caesars is subclassed. This creates the
|
279
325
|
# YourClass::DSL module which contains a single method named after YourClass
|
280
326
|
# that is used to catch the top level DSL method.
|
@@ -350,7 +396,7 @@ class Caesars::Config
|
|
350
396
|
refresh
|
351
397
|
end
|
352
398
|
|
353
|
-
def
|
399
|
+
def caesars_init
|
354
400
|
# Remove instance variables used to populate DSL data
|
355
401
|
instance_variables.each do |varname|
|
356
402
|
next if varname == :'@options' || varname == :'@paths' # Ruby 1.9.1
|
@@ -373,7 +419,7 @@ class Caesars::Config
|
|
373
419
|
end
|
374
420
|
|
375
421
|
def refresh
|
376
|
-
|
422
|
+
caesars_init
|
377
423
|
|
378
424
|
@paths.each do |path|
|
379
425
|
puts "Loading config from #{path}" if @verbose
|
@@ -390,9 +436,10 @@ class Caesars::Config
|
|
390
436
|
|
391
437
|
postprocess
|
392
438
|
|
393
|
-
rescue SyntaxError => ex
|
439
|
+
rescue ArgumentError, SyntaxError => ex
|
394
440
|
puts "Syntax error in #{path}."
|
395
441
|
puts ex.message
|
442
|
+
puts ex.backtrace if Caesars.debug?
|
396
443
|
exit 1
|
397
444
|
end
|
398
445
|
end
|
@@ -429,5 +476,3 @@ end
|
|
429
476
|
|
430
477
|
|
431
478
|
|
432
|
-
|
433
|
-
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: caesars
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Delano Mandelbaum
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-04-10 00:00:00 -04:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|