caesars 0.5.1 → 0.5.2
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES.txt +12 -0
- data/README.rdoc +19 -4
- data/caesars.gemspec +2 -2
- data/lib/caesars.rb +98 -4
- metadata +3 -3
data/CHANGES.txt
CHANGED
@@ -1,6 +1,17 @@
|
|
1
1
|
CAESAR -- CHANGES
|
2
2
|
|
3
3
|
|
4
|
+
#### 0.5.2 (2009-03-31) ###############################
|
5
|
+
|
6
|
+
* NEW: Caesars.debug?, Caesars.enable_debug, Caesars.disable_debug
|
7
|
+
* CHANGED: find_deferred now supports nested Arrays. See rdocs.
|
8
|
+
* BUG: Found bug related to string/symbol ambiguity when using find.
|
9
|
+
It's not fixed yet so for now be mindful of which attributes are
|
10
|
+
strings and which are symbols. String attributes are stored as
|
11
|
+
strings but find and find_deferred look for symbols. The hash syntax
|
12
|
+
and method accessors are not affected.
|
13
|
+
|
14
|
+
|
4
15
|
#### 0.5.1 (2009-03-11) ###############################
|
5
16
|
|
6
17
|
* FIX: Method-syntax was broken for attributes of top level method
|
@@ -8,6 +19,7 @@ CAESAR -- CHANGES
|
|
8
19
|
* UPDATED: docs and bin/example to reflect Caesars::Hash changes.
|
9
20
|
* FIX: instance_variables in Ruby 1.9.1 returns Symbols
|
10
21
|
|
22
|
+
|
11
23
|
#### 0.5.0 (2009-03-11) ###############################
|
12
24
|
|
13
25
|
* FIX: find_deferred now gracefully handles nil errors
|
data/README.rdoc
CHANGED
@@ -11,9 +11,9 @@ One of:
|
|
11
11
|
|
12
12
|
Or for GitHub fans:
|
13
13
|
|
14
|
+
* gem install delano-caesars --source http://gems.github.com
|
14
15
|
* git clone git://github.com/delano/caesar.git
|
15
|
-
|
16
|
-
* gem install delano-caesar
|
16
|
+
|
17
17
|
|
18
18
|
== EXAMPLE 1 -- Flavour
|
19
19
|
|
@@ -133,10 +133,23 @@ Or for GitHub fans:
|
|
133
133
|
# [... make changes to party.conf ...]
|
134
134
|
|
135
135
|
@config.refresh
|
136
|
-
|
136
|
+
|
137
|
+
*party.conf*
|
138
|
+
|
139
|
+
food do
|
140
|
+
oysters "10kg"
|
141
|
+
order do
|
142
|
+
self.oysters
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
drink do
|
147
|
+
wine "12L"
|
148
|
+
end
|
149
|
+
|
137
150
|
== More Info
|
138
151
|
|
139
|
-
* GitHub[http://github.com/delano/
|
152
|
+
* GitHub[http://github.com/delano/caesars]
|
140
153
|
* Inspiration[http://www.youtube.com/watch?v=ycElb0tB9_U]
|
141
154
|
* Recipe[http://twitter.com/solutious/status/1264327499]
|
142
155
|
|
@@ -147,6 +160,8 @@ Or for GitHub fans:
|
|
147
160
|
== Thanks
|
148
161
|
|
149
162
|
* Clams, Tomatoes, Vodka, and the rest of the crew.
|
163
|
+
* Caleb Buxton (http://cpb.ca) for early feedback.
|
164
|
+
|
150
165
|
|
151
166
|
== License
|
152
167
|
|
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-03-
|
3
|
+
s.version = "0.5.2"
|
4
|
+
s.date = %q{2009-03-31}
|
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,7 +7,13 @@
|
|
7
7
|
# See bin/example
|
8
8
|
#
|
9
9
|
class Caesars
|
10
|
-
VERSION = "0.5.
|
10
|
+
VERSION = "0.5.2"
|
11
|
+
@@debug = false
|
12
|
+
|
13
|
+
def Caesars.enable_debug; @@debug = true; end
|
14
|
+
def Caesars.disable_debug; @@debug = false; end
|
15
|
+
def Caesars.debug?; @@debug; end
|
16
|
+
|
11
17
|
# A subclass of ::Hash that provides method names for hash parameters.
|
12
18
|
# It's like a lightweight OpenStruct.
|
13
19
|
# ch = Caesars::Hash[:tabasco => :lots!]
|
@@ -55,7 +61,9 @@ class Caesars
|
|
55
61
|
def to_hash
|
56
62
|
@caesars_properties.to_hash
|
57
63
|
end
|
58
|
-
|
64
|
+
|
65
|
+
# DEPRECATED -- use find_deferred
|
66
|
+
#
|
59
67
|
# Look for an attribute, bubbling up to the parent if it's not found
|
60
68
|
# +criteria+ is an array of attribute names, orders according to their
|
61
69
|
# relationship. The last element is considered to the desired attribute.
|
@@ -69,12 +77,13 @@ class Caesars
|
|
69
77
|
#
|
70
78
|
# Returns the attribute if found or nil.
|
71
79
|
#
|
72
|
-
def
|
80
|
+
def find_deferred_old(*criteria)
|
73
81
|
# This is a nasty implementation. Sorry me! I'll enjoy a few
|
74
82
|
# caesars and be right with you.
|
75
83
|
att = criteria.pop
|
76
84
|
val = nil
|
77
85
|
while !criteria.empty?
|
86
|
+
p [criteria, att].flatten if Caesars.debug?
|
78
87
|
val = find(criteria, att)
|
79
88
|
break if val
|
80
89
|
criteria.pop
|
@@ -84,6 +93,88 @@ class Caesars
|
|
84
93
|
val
|
85
94
|
end
|
86
95
|
|
96
|
+
# Look for an attribute, bubbling up through the parents until it's found.
|
97
|
+
# +criteria+ is an array of hierarchical attributes, ordered according to
|
98
|
+
# their relationship. The last element is the desired attribute to find.
|
99
|
+
# Looking for 'ami':
|
100
|
+
#
|
101
|
+
# find_deferred(:environment, :role, :ami)
|
102
|
+
#
|
103
|
+
# First checks at @caesars_properties[:environment][:role][:ami]
|
104
|
+
# Then, @caesars_properties[:environment][:ami]
|
105
|
+
# Finally, @caesars_properties[:ami]
|
106
|
+
#
|
107
|
+
# If the last element is an Array, it's assumed that only that combination
|
108
|
+
# should be returned.
|
109
|
+
#
|
110
|
+
# find_deferred(:environment, :role:, [:disks, '/file/path'])
|
111
|
+
#
|
112
|
+
# [:environment][:role][:disks]['/file/path']
|
113
|
+
# [:environment][:disks]['/file/path']
|
114
|
+
# [:disks]['/file/path']
|
115
|
+
#
|
116
|
+
# Other nested Arrays are treated special too. We look at the criteria from
|
117
|
+
# right to left and remove the first nested element we find.
|
118
|
+
#
|
119
|
+
# find_deferred([:region, :zone], :environment, :role, :ami)
|
120
|
+
#
|
121
|
+
# [:region][:zone][:environment][:role][:ami]
|
122
|
+
# [:region][:environment][:role][:ami]
|
123
|
+
# [:environment][:role][:ami]
|
124
|
+
# [:environment][:ami]
|
125
|
+
# [:ami]
|
126
|
+
#
|
127
|
+
# Returns the attribute if found or nil.
|
128
|
+
#
|
129
|
+
def find_deferred(*criteria)
|
130
|
+
# The last element is assumed to be the attribute we're looking for.
|
131
|
+
# The purpose of this function is to bubble up the hierarchy of a
|
132
|
+
# hash to find it.
|
133
|
+
att = criteria.pop
|
134
|
+
|
135
|
+
# Account for everything being sent as an Array
|
136
|
+
# i.e. find([1, 2, :attribute])
|
137
|
+
# We don't use flatten b/c we don't want to disturb nested Arrays
|
138
|
+
if criteria.empty?
|
139
|
+
criteria = att
|
140
|
+
att = criteria.pop
|
141
|
+
end
|
142
|
+
|
143
|
+
found = nil
|
144
|
+
sacrifice = nil
|
145
|
+
|
146
|
+
while !criteria.empty?
|
147
|
+
p [criteria, att].flatten if Caesars.debug?
|
148
|
+
found = find(criteria, att)
|
149
|
+
break if found
|
150
|
+
|
151
|
+
# Nested Arrays are treated special. We look at the criteria from
|
152
|
+
# right to left and remove the first nested element we find.
|
153
|
+
#
|
154
|
+
# i.e. [['a', 'b'], 1, 2, [:first, :second], :attribute]
|
155
|
+
#
|
156
|
+
# In this example, :second will be removed first.
|
157
|
+
criteria.reverse.each_with_index do |el,index|
|
158
|
+
next unless el.is_a?(Array) # Ignore regular criteria
|
159
|
+
next if el.empty? # Ignore empty nested hashes
|
160
|
+
sacrifice = el.pop
|
161
|
+
break
|
162
|
+
end
|
163
|
+
|
164
|
+
# Remove empty nested Arrays
|
165
|
+
criteria.delete_if { |el| el.is_a?(Array) && el.empty? }
|
166
|
+
|
167
|
+
# We need to make a sacrifice
|
168
|
+
sacrifice = criteria.pop if sacrifice.nil?
|
169
|
+
|
170
|
+
break if (@limit ||= 0) > 5 # A failsafe
|
171
|
+
@limit += 1
|
172
|
+
sacrifice = nil
|
173
|
+
end
|
174
|
+
|
175
|
+
found || find(att) # One last try in the root namespace
|
176
|
+
end
|
177
|
+
|
87
178
|
# Looks for the specific attribute specified.
|
88
179
|
# +criteria+ is an array of attribute names, orders according to their
|
89
180
|
# relationship. The last element is considered to the desired attribute.
|
@@ -92,8 +183,11 @@ class Caesars
|
|
92
183
|
# Unlike find_deferred, it will return only the value specified, otherwise nil.
|
93
184
|
def find(*criteria)
|
94
185
|
criteria.flatten! if criteria.first.is_a?(Array)
|
186
|
+
p criteria if Caesars.debug?
|
187
|
+
# BUG: Attributes can be stored as strings and here we only look for symbols
|
95
188
|
str = criteria.collect { |v| "[:'#{v}']" if v }.join
|
96
|
-
|
189
|
+
eval_str = "@caesars_properties#{str} if defined?(@caesars_properties#{str})"
|
190
|
+
val = eval eval_str
|
97
191
|
val
|
98
192
|
end
|
99
193
|
|
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.2
|
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-03-
|
12
|
+
date: 2009-03-31 00:00:00 -04:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -60,7 +60,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
60
60
|
requirements: []
|
61
61
|
|
62
62
|
rubyforge_project: caesars
|
63
|
-
rubygems_version: 1.
|
63
|
+
rubygems_version: 1.3.1
|
64
64
|
signing_key:
|
65
65
|
specification_version: 1
|
66
66
|
summary: "Caesars: A simple class for rapid DSL prototyping in Ruby."
|