enumerated_type 0.2.3 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +23 -3
- data/lib/enumerated_type.rb +6 -2
- data/lib/enumerated_type/version.rb +1 -1
- data/test/enumerated_type_spec.rb +38 -8
- metadata +4 -4
data/README.md
CHANGED
@@ -154,9 +154,9 @@ Add arbitrary attributes:
|
|
154
154
|
class JobStatus
|
155
155
|
include EnumeratedType
|
156
156
|
|
157
|
-
declare :pending, :message => "Your Job is waiting to be processed"
|
158
|
-
declare :success, :message => "Your Job has completed"
|
159
|
-
declare :failure, :message => "Oops, it looks like there was a problem"
|
157
|
+
declare :pending, :code => 1, :message => "Your Job is waiting to be processed"
|
158
|
+
declare :success, :code => 2, :message => "Your Job has completed"
|
159
|
+
declare :failure, :code => 3, :message => "Oops, it looks like there was a problem"
|
160
160
|
end
|
161
161
|
|
162
162
|
JobStatus::SUCCESS.message # => "Your job has completed"
|
@@ -175,6 +175,26 @@ JobStatus.coerce(:wrong) # => raises an ArgumentError
|
|
175
175
|
|
176
176
|
`.coerce` is particularly useful for scrubbing parameters, allowing you to succinctly assert that arguments are valid for your `EnumeratedType`, while also broadening the range of types that can be used as input. Using `.coerce` at the boundaries of your code allows clients the freedom to pass in full fledged `EnumeratedType` objects, symbols or even strings, and allows you to use the `.coerce`d input with confidence (i.e without any type or validity checking beyond the call to `.coerce`).
|
177
177
|
|
178
|
+
Look up an enum by a property:
|
179
|
+
|
180
|
+
```ruby
|
181
|
+
JobStatus.by(:code, 2) # => #<JobStatus:success>
|
182
|
+
JobStatus.by(:code, 4) # => raises a TypeError
|
183
|
+
```
|
184
|
+
|
185
|
+
The first parameter specifies the method that will be called on instances of your `EnumeratedType` during lookup. This works for attributes specified with `declare` (such as `:code` above) but also for .
|
186
|
+
|
187
|
+
```ruby
|
188
|
+
class JobStatus
|
189
|
+
def display
|
190
|
+
"#{name}-#{code}"
|
191
|
+
end
|
192
|
+
end
|
193
|
+
|
194
|
+
JobStatus.by(:display, "pending-1") # => #<JobStatus:pending>
|
195
|
+
```
|
196
|
+
If more than one instance of your `EnumeratedType` matches, the first match will be returned in the order the types were `declared`.
|
197
|
+
|
178
198
|
## Development
|
179
199
|
|
180
200
|
To run the tests (assuming you have already run `gem install bundler`):
|
data/lib/enumerated_type.rb
CHANGED
@@ -52,9 +52,13 @@ module EnumeratedType
|
|
52
52
|
@all.each(&block)
|
53
53
|
end
|
54
54
|
|
55
|
+
def by(name, value)
|
56
|
+
found = find { |e| e.send(name) == value }
|
57
|
+
found || raise(ArgumentError, "Could not find #{self.name} with ##{name} == #{value.inspect}'")
|
58
|
+
end
|
59
|
+
|
55
60
|
def [](name)
|
56
|
-
|
57
|
-
found || raise(ArgumentError, "Unrecognized #{self.name} name #{name.inspect}'")
|
61
|
+
by(:name, name)
|
58
62
|
end
|
59
63
|
|
60
64
|
def recognized?(name)
|
@@ -83,25 +83,25 @@ describe EnumeratedType do
|
|
83
83
|
it "freezes String properties" do
|
84
84
|
Gender::MALE.planet.frozen?.must_equal true
|
85
85
|
end
|
86
|
-
|
86
|
+
|
87
87
|
it "does not freeze other properties" do
|
88
88
|
NonString = Class.new do
|
89
89
|
def frozen?
|
90
90
|
!!@frozen
|
91
91
|
end
|
92
|
-
|
92
|
+
|
93
93
|
def freeze
|
94
94
|
@frozen = true
|
95
95
|
end
|
96
96
|
end
|
97
|
-
|
97
|
+
|
98
98
|
non_string = NonString.new
|
99
|
-
|
99
|
+
|
100
100
|
Class.new do
|
101
101
|
include EnumeratedType
|
102
102
|
declare :test, :other => non_string
|
103
103
|
end
|
104
|
-
|
104
|
+
|
105
105
|
non_string.frozen?.must_equal false
|
106
106
|
end
|
107
107
|
|
@@ -173,6 +173,36 @@ describe EnumeratedType do
|
|
173
173
|
end
|
174
174
|
end
|
175
175
|
|
176
|
+
describe ".by" do
|
177
|
+
class Shapes
|
178
|
+
include EnumeratedType
|
179
|
+
|
180
|
+
declare :triangle, :sides => 3, :pretty_hip => "YEAH"
|
181
|
+
declare :rectangle, :sides => 4, :pretty_hip => "NAH"
|
182
|
+
declare :pentagon, :sides => 5, :pretty_hip => "YEAH"
|
183
|
+
|
184
|
+
def sides_squared
|
185
|
+
sides * sides
|
186
|
+
end
|
187
|
+
end
|
188
|
+
|
189
|
+
it "looks the value up by the specified attribute" do
|
190
|
+
Shapes.by(:sides, 4).must_equal(Shapes::RECTANGLE)
|
191
|
+
end
|
192
|
+
|
193
|
+
it "raises an argumetn if there is no match" do
|
194
|
+
lambda { Shapes.by(:sides, 6) }.must_raise(ArgumentError)
|
195
|
+
end
|
196
|
+
|
197
|
+
it "returns the first declared value if there is more than one match" do
|
198
|
+
Shapes.by(:pretty_hip, "YEAH").must_equal(Shapes::TRIANGLE)
|
199
|
+
end
|
200
|
+
|
201
|
+
it "works with arbitrary methods" do
|
202
|
+
Shapes.by(:sides_squared, 16).must_equal(Shapes::RECTANGLE)
|
203
|
+
end
|
204
|
+
end
|
205
|
+
|
176
206
|
describe "#inspect" do
|
177
207
|
it "looks reasonable" do
|
178
208
|
Gender::FEMALE.inspect.must_equal "#<Gender:female>"
|
@@ -189,17 +219,17 @@ describe EnumeratedType do
|
|
189
219
|
it "is the name (as a string)" do
|
190
220
|
Gender::MALE.to_json.must_equal '"male"'
|
191
221
|
end
|
192
|
-
|
222
|
+
|
193
223
|
it "doesn't raise an exception when given options" do
|
194
224
|
Gender::MALE.to_json(:stuff => "here")
|
195
225
|
end
|
196
226
|
end
|
197
|
-
|
227
|
+
|
198
228
|
describe "#as_json" do
|
199
229
|
it "is the name (as a string)" do
|
200
230
|
Gender::MALE.as_json.must_equal "male"
|
201
231
|
end
|
202
|
-
|
232
|
+
|
203
233
|
it "doesn't raise an exception when given options" do
|
204
234
|
Gender::MALE.as_json(:stuff => "here")
|
205
235
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: enumerated_type
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-03-
|
12
|
+
date: 2014-03-28 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -90,7 +90,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
90
90
|
version: '0'
|
91
91
|
segments:
|
92
92
|
- 0
|
93
|
-
hash:
|
93
|
+
hash: 2282385263752842432
|
94
94
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
95
95
|
none: false
|
96
96
|
requirements:
|
@@ -99,7 +99,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
99
99
|
version: '0'
|
100
100
|
segments:
|
101
101
|
- 0
|
102
|
-
hash:
|
102
|
+
hash: 2282385263752842432
|
103
103
|
requirements: []
|
104
104
|
rubyforge_project:
|
105
105
|
rubygems_version: 1.8.23
|