classy_enum 3.5.0 → 4.0.0.beta1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +3 -7
- data/CHANGELOG.md +11 -0
- data/README.md +18 -43
- data/classy_enum.gemspec +1 -1
- data/gemfiles/Gemfile.rails-4.1.x +6 -0
- data/gemfiles/Gemfile.rails-4.2.x +6 -0
- data/lib/classy_enum/active_record.rb +49 -29
- data/lib/classy_enum/base.rb +7 -53
- data/lib/classy_enum/collection.rb +2 -0
- data/lib/classy_enum/conversion.rb +1 -5
- data/lib/classy_enum/predicate.rb +4 -2
- data/lib/classy_enum/translation.rb +1 -1
- data/lib/classy_enum/version.rb +1 -1
- data/lib/generators/classy_enum/classy_enum_generator.rb +2 -2
- data/lib/generators/rspec/classy_enum_generator.rb +2 -2
- data/lib/generators/test_unit/classy_enum_generator.rb +2 -2
- data/spec/classy_enum/active_record_spec.rb +127 -50
- data/spec/classy_enum/base_spec.rb +3 -13
- data/spec/classy_enum/collection_spec.rb +2 -0
- data/spec/classy_enum/conversion_spec.rb +2 -20
- data/spec/classy_enum/translation_spec.rb +3 -2
- data/spec/classy_enum_spec.rb +1 -1
- data/spec/spec_helper.rb +3 -1
- metadata +8 -8
- data/gemfiles/Gemfile.rails-3.0.x +0 -6
- data/gemfiles/Gemfile.rails-3.1.x +0 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 461b3c90498c65da6f580b4f0b2fd794eb28a832
|
4
|
+
data.tar.gz: 02b9a83c3337c4af82268c9e2ed48b18dc23f217
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3c438e006bef648f25c0217a752d1a8b9d8057afd720e0580dc09d10321bb970a81bdc9c369a07b5637a7b12586abfb58559d021c8f3d3ff98bc0fa897546b93
|
7
|
+
data.tar.gz: 4f8b082c843c9fbbbf27f36b39cc691c75984f13400bba0cf557a4a8c64b6a3a05cc69a46dd881241490ee519ebdb5dc60f15ebd070dde7825a62fdfa62a5c21
|
data/.travis.yml
CHANGED
@@ -2,13 +2,9 @@ language: ruby
|
|
2
2
|
rvm:
|
3
3
|
- 1.9.3
|
4
4
|
- 2.0.0
|
5
|
-
- 2.1.
|
5
|
+
- 2.1.3
|
6
6
|
gemfile:
|
7
|
-
- gemfiles/Gemfile.rails-3.0.x
|
8
|
-
- gemfiles/Gemfile.rails-3.1.x
|
9
7
|
- gemfiles/Gemfile.rails-3.2.x
|
10
8
|
- gemfiles/Gemfile.rails-4.0.x
|
11
|
-
|
12
|
-
|
13
|
-
- rvm: 1.8.7
|
14
|
-
gemfile: gemfiles/Gemfile.rails-4.0.x
|
9
|
+
- gemfiles/Gemfile.rails-4.1.x
|
10
|
+
- gemfiles/Gemfile.rails-4.2.x
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,16 @@
|
|
1
1
|
# ClassyEnum Changelog
|
2
2
|
|
3
|
+
## 4.0.0 (Unreleased)
|
4
|
+
|
5
|
+
* [BREAKING] Removes support for Ruby 1.8.7
|
6
|
+
* [BREAKING] Removes support for Rails 3.0.x and 3.1.x
|
7
|
+
* [BREAKING] Active Record models must explicitly include ClassyEnum::ActiveRecord now
|
8
|
+
* [BREAKING] Removed use of null objects. Blank values are now returned as is from Enum.build.
|
9
|
+
* [BREAKING] Removed serialize_as_json option. #as_json should be overriden in ClassyEnum::Base subclasses instead.
|
10
|
+
* [BREAKING] Removed allow_blank option from Enum.build. This was used internally for legacy reasons and is no longer needed.
|
11
|
+
* [BREAKING] Fixes support for ActiveModel::Dirty. Now dirty attribute methods always return enum class instance (instead of string).
|
12
|
+
* Prefer 'class_name' over 'enum' as optional class name argument
|
13
|
+
|
3
14
|
## 3.5.0
|
4
15
|
|
5
16
|
* Fixes long standing issue with default values not being persisted to
|
data/README.md
CHANGED
@@ -11,9 +11,9 @@ This README is also available in a [user-friendly DocumentUp format](http://beer
|
|
11
11
|
|
12
12
|
## Rails & Ruby Versions Supported
|
13
13
|
|
14
|
-
*Rails:* 3.
|
14
|
+
*Rails:* 3.2.x - 4.1.x
|
15
15
|
|
16
|
-
*Ruby:* 1.
|
16
|
+
*Ruby:* 1.9.2, 1.9.3, 2.0.0 and 2.1.0
|
17
17
|
|
18
18
|
## Installation
|
19
19
|
|
@@ -104,10 +104,12 @@ end
|
|
104
104
|
NOTE: Alternatively, you may use an enum type if your database supports it. See
|
105
105
|
[this issue](https://github.com/beerlington/classy_enum/issues/12) for more information.
|
106
106
|
|
107
|
-
Then in my model I've added a line that calls `classy_enum_attr` with a single argument representing the enum I want to associate with my model. I am also delegating the `#send_email?` method to my Priority enum class.
|
107
|
+
Then in my model I've included `ClassyEnum::ActiveRecord` and added a line that calls `classy_enum_attr` with a single argument representing the enum I want to associate with my model. I am also delegating the `#send_email?` method to my Priority enum class.
|
108
108
|
|
109
109
|
```ruby
|
110
110
|
class Alarm < ActiveRecord::Base
|
111
|
+
include ClassyEnum::ActiveRecord
|
112
|
+
|
111
113
|
classy_enum_attr :priority
|
112
114
|
|
113
115
|
delegate :send_email?, to: :priority
|
@@ -134,11 +136,13 @@ The enum field works like any other model attribute. It can be mass-assigned usi
|
|
134
136
|
|
135
137
|
#### What if your enum class name is not the same as your model's attribute name?
|
136
138
|
|
137
|
-
Just provide an optional `
|
139
|
+
Just provide an optional `class_name` argument to declare the enum's class name. In this case, the model's attribute is called *alarm_priority*.
|
138
140
|
|
139
141
|
```ruby
|
140
142
|
class Alarm < ActiveRecord::Base
|
141
|
-
|
143
|
+
include ClassyEnum::ActiveRecord
|
144
|
+
|
145
|
+
classy_enum_attr :alarm_priority, class_name: 'Priority'
|
142
146
|
end
|
143
147
|
|
144
148
|
@alarm = Alarm.create(alarm_priority: :medium)
|
@@ -177,7 +181,7 @@ I18n.locale = :es
|
|
177
181
|
|
178
182
|
## Using Enum as a Collection
|
179
183
|
|
180
|
-
ClassyEnum::Base extends the [Enumerable module](http://ruby-doc.org/core-1.
|
184
|
+
ClassyEnum::Base extends the [Enumerable module](http://ruby-doc.org/core-2.1.3/Enumerable.html)
|
181
185
|
which provides several traversal and searching methods. This can
|
182
186
|
be useful for situations where you are working with the collection,
|
183
187
|
as opposed to the attributes on an Active Record object.
|
@@ -198,8 +202,7 @@ Priority.map { |p| p.to_s } # => ["low", "medium", "high"]
|
|
198
202
|
Priority.find(&:send_email?) # => Priority::High.new
|
199
203
|
|
200
204
|
# Find the priorities that are lower than Priority::High
|
201
|
-
|
202
|
-
Priority.select {|p| p < high_priority } # => [Priority::Low.new, Priority::Medium.new]
|
205
|
+
Priority.select {|p| p < :high } # => [Priority::Low.new, Priority::Medium.new]
|
203
206
|
|
204
207
|
# Iterate over each priority:
|
205
208
|
Priority.each do |priority|
|
@@ -217,6 +220,8 @@ so:
|
|
217
220
|
|
218
221
|
```ruby
|
219
222
|
class Alarm < ActiveRecord::Base
|
223
|
+
include ClassyEnum::ActiveRecord
|
224
|
+
|
220
225
|
classy_enum_attr :priority, default: 'medium'
|
221
226
|
end
|
222
227
|
|
@@ -229,6 +234,8 @@ runtime.
|
|
229
234
|
|
230
235
|
```ruby
|
231
236
|
class Alarm < ActiveRecord::Base
|
237
|
+
include ClassyEnum::ActiveRecord
|
238
|
+
|
232
239
|
classy_enum_attr :priority, default: ->(enum){ enum.max }
|
233
240
|
end
|
234
241
|
|
@@ -287,26 +294,6 @@ In the above examples, high priority alarms are only emailed if the owning alarm
|
|
287
294
|
@alarm.send_email? # => false
|
288
295
|
```
|
289
296
|
|
290
|
-
## Serializing as JSON
|
291
|
-
|
292
|
-
By default, the enum will be serialized as a string representing the value:
|
293
|
-
|
294
|
-
```ruby
|
295
|
-
@alarm = Alarm.create(priority: :high, enabled: true)
|
296
|
-
@alarm.to_json.should == "{\"alarm\":{\"priority\":\"high\"}}"
|
297
|
-
```
|
298
|
-
|
299
|
-
This behavior can be overridden by using the `serialize_as_json: true` option in your Active Record model:
|
300
|
-
|
301
|
-
```ruby
|
302
|
-
class Alarm < ActiveRecord::Base
|
303
|
-
classy_enum_attr :priority, serialize_as_json: true
|
304
|
-
end
|
305
|
-
|
306
|
-
@alarm = Alarm.create(priority: :high, enabled: true)
|
307
|
-
@alarm.to_json.should == "{\"alarm\":{\"priority\":{}}}"
|
308
|
-
```
|
309
|
-
|
310
297
|
## Model Validation
|
311
298
|
|
312
299
|
An Active Record validator `validates_inclusion_of :field, in: ENUM` is automatically added to your model when you use `classy_enum_attr`.
|
@@ -324,6 +311,8 @@ To allow nil or blank values, you can pass in `:allow_nil` and `:allow_blank` as
|
|
324
311
|
|
325
312
|
```ruby
|
326
313
|
class Alarm < ActiveRecord::Base
|
314
|
+
include ClassyEnum::ActiveRecord
|
315
|
+
|
327
316
|
classy_enum_attr :priority, allow_nil: true
|
328
317
|
end
|
329
318
|
|
@@ -334,8 +323,7 @@ end
|
|
334
323
|
## Form Usage
|
335
324
|
|
336
325
|
ClassyEnum includes a `select_options` helper method to generate an array of enum options
|
337
|
-
that can be used by Rails' form builders such as SimpleForm and
|
338
|
-
Formtastic.
|
326
|
+
that can be used by Rails' form builders such as SimpleForm and Formtastic.
|
339
327
|
|
340
328
|
```erb
|
341
329
|
# SimpleForm
|
@@ -346,19 +334,6 @@ Formtastic.
|
|
346
334
|
<% end %>
|
347
335
|
```
|
348
336
|
|
349
|
-
```erb
|
350
|
-
# Formtastic
|
351
|
-
|
352
|
-
<%= semantic_form_for @alarm do |f| %>
|
353
|
-
<%= f.input :priority, as: :select, collection: Priority.select_options %>
|
354
|
-
<%= f.button :submit %>
|
355
|
-
<% end %>
|
356
|
-
```
|
357
|
-
|
358
|
-
Built-in Formtastic support has been removed as of ClassyEnum 2.0. It is still
|
359
|
-
available but needs to be enabled manually. To enable support visit
|
360
|
-
[the wiki](https://github.com/beerlington/classy_enum/wiki/Formtastic-Support)
|
361
|
-
|
362
337
|
## Copyright
|
363
338
|
|
364
339
|
Copyright (c) 2010-2014 [Peter Brown](https://github.com/beerlington). See LICENSE for details.
|
data/classy_enum.gemspec
CHANGED
@@ -15,7 +15,7 @@ Gem::Specification.new do |gem|
|
|
15
15
|
gem.require_paths = ["lib"]
|
16
16
|
gem.version = ClassyEnum::VERSION
|
17
17
|
|
18
|
-
gem.add_dependency('activerecord', '>= 3.
|
18
|
+
gem.add_dependency('activerecord', '>= 3.2')
|
19
19
|
|
20
20
|
gem.add_development_dependency('rspec', '>= 2.11')
|
21
21
|
gem.add_development_dependency('sqlite3', '>= 1.3')
|
@@ -28,58 +28,82 @@ module ClassyEnum
|
|
28
28
|
end
|
29
29
|
|
30
30
|
module ActiveRecord
|
31
|
+
def self.included(klass)
|
32
|
+
klass.extend self
|
33
|
+
end
|
31
34
|
|
32
35
|
# Class macro used to associate an enum with an attribute on an ActiveRecord model.
|
33
|
-
# This method is
|
34
|
-
# is
|
36
|
+
# This method is added to an ActiveRecord model when ClassEnum::ActiveRecord
|
37
|
+
# is included. Accepts an argument for the enum class to be associated with
|
35
38
|
# the model. ActiveRecord validation is automatically added to ensure
|
36
39
|
# that a value is one of its pre-defined enum members.
|
37
40
|
#
|
38
41
|
# ==== Example
|
39
42
|
# # Associate an enum Priority with Alarm model's priority attribute
|
40
43
|
# class Alarm < ActiveRecord::Base
|
44
|
+
# include ClassyEnum::ActiveRecord
|
45
|
+
#
|
41
46
|
# classy_enum_attr :priority
|
42
47
|
# end
|
43
|
-
|
48
|
+
|
44
49
|
# # Associate an enum Priority with Alarm model's alarm_priority attribute
|
45
|
-
# classy_enum_attr :alarm_priority, :
|
50
|
+
# classy_enum_attr :alarm_priority, class_name: 'Priority'
|
46
51
|
#
|
47
52
|
# # Allow enum value to be nil
|
48
|
-
# classy_enum_attr :priority, :
|
53
|
+
# classy_enum_attr :priority, allow_nil: true
|
49
54
|
#
|
50
55
|
# # Allow enum value to be blank
|
51
|
-
# classy_enum_attr :priority, :
|
56
|
+
# classy_enum_attr :priority, allow_blank: true
|
52
57
|
#
|
53
58
|
# # Specifying a default enum value
|
54
|
-
# classy_enum_attr :priority, :
|
59
|
+
# classy_enum_attr :priority, default: 'low'
|
55
60
|
def classy_enum_attr(attribute, options={})
|
56
|
-
enum = (options[:
|
61
|
+
enum = (options[:class_name] || options[:enum] || attribute).to_s.camelize.constantize
|
57
62
|
allow_blank = options[:allow_blank] || false
|
58
63
|
allow_nil = options[:allow_nil] || false
|
59
|
-
serialize_as_json = options[:serialize_as_json] || false
|
60
64
|
default = ClassyEnum._normalize_default(options[:default], enum)
|
61
65
|
|
62
66
|
# Add ActiveRecord validation to ensure it won't be saved unless it's an option
|
63
67
|
validates_inclusion_of attribute,
|
64
|
-
:
|
65
|
-
:
|
66
|
-
:
|
67
|
-
|
68
|
-
#
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
68
|
+
in: enum,
|
69
|
+
allow_blank: allow_blank,
|
70
|
+
allow_nil: allow_nil
|
71
|
+
|
72
|
+
# Use a module so that the reader methods can be overridden in classes and
|
73
|
+
# use super to get the enum value.
|
74
|
+
mod = Module.new do
|
75
|
+
|
76
|
+
# Define getter method that returns a ClassyEnum instance
|
77
|
+
define_method attribute do
|
78
|
+
enum.build(read_attribute(attribute), owner: self)
|
79
|
+
end
|
76
80
|
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
+
# Define setter method that accepts string, symbol, instance or class for member
|
82
|
+
define_method "#{attribute}=" do |value|
|
83
|
+
value = ClassyEnum._normalize_value(value, default, (allow_nil || allow_blank))
|
84
|
+
super(value)
|
85
|
+
end
|
86
|
+
|
87
|
+
define_method :save_changed_attribute do |attr_name, arg|
|
88
|
+
if attribute.to_s == attr_name.to_s && !attribute_changed?(attr_name)
|
89
|
+
arg = enum.build(arg)
|
90
|
+
current_value = clone_attribute_value(:read_attribute, attr_name)
|
91
|
+
|
92
|
+
if arg != current_value
|
93
|
+
if respond_to?(:set_attribute_was, true)
|
94
|
+
set_attribute_was(attr_name, enum.build(arg, owner: self))
|
95
|
+
else
|
96
|
+
changed_attributes[attr_name] = enum.build(current_value, owner: self)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
else
|
100
|
+
super(attr_name, arg)
|
101
|
+
end
|
102
|
+
end
|
81
103
|
end
|
82
104
|
|
105
|
+
include mod
|
106
|
+
|
83
107
|
# Initialize the object with the default value if it is present
|
84
108
|
# because this will let you store the default value in the
|
85
109
|
# database and make it searchable.
|
@@ -97,7 +121,3 @@ module ClassyEnum
|
|
97
121
|
|
98
122
|
end
|
99
123
|
end
|
100
|
-
|
101
|
-
if defined?(ActiveRecord::Base)
|
102
|
-
ActiveRecord::Base.send :extend, ClassyEnum::ActiveRecord
|
103
|
-
end
|
data/lib/classy_enum/base.rb
CHANGED
@@ -8,7 +8,7 @@ module ClassyEnum
|
|
8
8
|
include Translation
|
9
9
|
include Collection
|
10
10
|
|
11
|
-
attr_accessor :owner, :
|
11
|
+
attr_accessor :owner, :allow_blank
|
12
12
|
|
13
13
|
def base_class
|
14
14
|
self.class.base_class
|
@@ -24,8 +24,6 @@ module ClassyEnum
|
|
24
24
|
end
|
25
25
|
|
26
26
|
def inherited(klass)
|
27
|
-
return if klass.anonymous?
|
28
|
-
|
29
27
|
if self == ClassyEnum::Base
|
30
28
|
klass.base_class = klass
|
31
29
|
else
|
@@ -35,32 +33,6 @@ module ClassyEnum
|
|
35
33
|
raise SubclassNameError, "subclass must be namespaced with #{base_class.name}::"
|
36
34
|
end
|
37
35
|
|
38
|
-
# Add visit_EnumMember methods to support validates_uniqueness_of with enum field
|
39
|
-
# This is due to a bug in Rails where it uses the method result as opposed to the
|
40
|
-
# database value for validation scopes. A fix will be released in Rails 4, but
|
41
|
-
# this will remain until Rails 3.x is no longer prevalent.
|
42
|
-
if defined?(Arel::Visitors::ToSql)
|
43
|
-
visitor_method = "visit_#{klass.name.split('::').join('_')}"
|
44
|
-
|
45
|
-
Arel::Visitors::ToSql.class_eval do
|
46
|
-
define_method visitor_method, lambda {|*values|
|
47
|
-
values[0] = values[0].to_s
|
48
|
-
begin
|
49
|
-
quoted(*values)
|
50
|
-
rescue NoMethodError
|
51
|
-
quote(*values)
|
52
|
-
end
|
53
|
-
}
|
54
|
-
end
|
55
|
-
|
56
|
-
Arel::Visitors::DepthFirst.class_eval do
|
57
|
-
define_method visitor_method, lambda {|*values|
|
58
|
-
values[0] = values[0].to_s
|
59
|
-
terminal(*values)
|
60
|
-
}
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
36
|
# Convert from MyEnumClass::NumberTwo to :number_two
|
65
37
|
enum = klass.name.split('::').last.underscore.to_sym
|
66
38
|
|
@@ -88,18 +60,12 @@ module ClassyEnum
|
|
88
60
|
def build(value, options={})
|
89
61
|
object = find(value)
|
90
62
|
|
91
|
-
if object.nil?
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
end
|
63
|
+
if object.nil?
|
64
|
+
value
|
65
|
+
else
|
66
|
+
object.owner = options[:owner]
|
67
|
+
object
|
97
68
|
end
|
98
|
-
|
99
|
-
object.owner = options[:owner]
|
100
|
-
object.serialize_as_json = options[:serialize_as_json]
|
101
|
-
object.allow_blank = options[:allow_blank]
|
102
|
-
object
|
103
69
|
end
|
104
70
|
|
105
71
|
# DSL setter method for overriding reference to enum owner (ActiveRecord model)
|
@@ -116,20 +82,8 @@ module ClassyEnum
|
|
116
82
|
# end
|
117
83
|
# end
|
118
84
|
def owner(owner)
|
119
|
-
define_method owner,
|
120
|
-
end
|
121
|
-
|
122
|
-
private
|
123
|
-
|
124
|
-
# Subclass the base class and make it behave like the value that it is
|
125
|
-
def build_null_object(value)
|
126
|
-
Class.new(base_class) {
|
127
|
-
@option = value
|
128
|
-
@index = 0
|
129
|
-
delegate :blank?, :nil?, :to => :option
|
130
|
-
}.new
|
85
|
+
define_method owner, -> { @owner }
|
131
86
|
end
|
132
87
|
end
|
133
|
-
|
134
88
|
end
|
135
89
|
end
|
@@ -58,11 +58,7 @@ module ClassyEnum
|
|
58
58
|
|
59
59
|
# Overrides as_json to remove owner reference recursion issues
|
60
60
|
def as_json(options=nil)
|
61
|
-
|
62
|
-
json = super(options)
|
63
|
-
json.delete('owner')
|
64
|
-
json.delete('serialize_as_json')
|
65
|
-
json
|
61
|
+
to_s
|
66
62
|
end
|
67
63
|
|
68
64
|
private
|
@@ -4,7 +4,7 @@ module ClassyEnum
|
|
4
4
|
# Define attribute methods like two?
|
5
5
|
def self.define_predicate_method(klass, enum)
|
6
6
|
klass.base_class.class_eval do
|
7
|
-
define_method "#{enum}?",
|
7
|
+
define_method "#{enum}?", -> { attribute?(enum) }
|
8
8
|
end
|
9
9
|
end
|
10
10
|
|
@@ -22,10 +22,12 @@ module ClassyEnum
|
|
22
22
|
#
|
23
23
|
# # Create an ActiveRecord class using the Breed enum
|
24
24
|
# class Dog < ActiveRecord::Base
|
25
|
+
# include ClassyEnum::ActiveRecord
|
26
|
+
#
|
25
27
|
# classy_enum_attr :breed
|
26
28
|
# end
|
27
29
|
#
|
28
|
-
# @dog = Dog.new(:
|
30
|
+
# @dog = Dog.new(breed: :snoop)
|
29
31
|
# @dog.breed.snoop? # => true
|
30
32
|
# @dog.breed.golden_retriever? # => false
|
31
33
|
def attribute?(attribute)
|
data/lib/classy_enum/version.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
class ClassyEnumGenerator < Rails::Generators::NamedBase
|
2
2
|
desc "Generate a ClassyEnum definition in app/enums/"
|
3
3
|
|
4
|
-
argument :name, :
|
5
|
-
argument :values, :
|
4
|
+
argument :name, type: :string, required: true, banner: 'EnumName'
|
5
|
+
argument :values, type: :array, default: [], banner: 'value1 value2 value3 etc...'
|
6
6
|
|
7
7
|
source_root File.expand_path("../templates", __FILE__)
|
8
8
|
|
@@ -3,8 +3,8 @@ module Rspec
|
|
3
3
|
class ClassyEnumGenerator < Rails::Generators::NamedBase
|
4
4
|
desc "Generate a ClassyEnum spec in spec/enums/"
|
5
5
|
|
6
|
-
argument :name, :
|
7
|
-
argument :values, :
|
6
|
+
argument :name, type: :string, required: true, banner: 'EnumName'
|
7
|
+
argument :values, type: :array, default: [], banner: 'value1 value2 value3 etc...'
|
8
8
|
|
9
9
|
source_root File.expand_path("../templates", __FILE__)
|
10
10
|
|
@@ -3,8 +3,8 @@ module TestUnit
|
|
3
3
|
class ClassyEnumGenerator < Rails::Generators::NamedBase
|
4
4
|
desc "Generate a ClassyEnum test in test/enums/"
|
5
5
|
|
6
|
-
argument :name, :
|
7
|
-
argument :values, :
|
6
|
+
argument :name, type: :string, required: true, banner: 'EnumName'
|
7
|
+
argument :values, type: :array, default: [], banner: 'value1 value2 value3 etc...'
|
8
8
|
|
9
9
|
source_root File.expand_path("../templates", __FILE__)
|
10
10
|
|
@@ -1,7 +1,9 @@
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
2
|
|
3
|
-
ActiveRecord::Schema.define(:
|
4
|
-
|
3
|
+
ActiveRecord::Schema.define(version: 1) do
|
4
|
+
self.verbose = false
|
5
|
+
|
6
|
+
create_table :dogs, force: true do |t|
|
5
7
|
t.string :breed
|
6
8
|
t.string :other_breed
|
7
9
|
t.string :color
|
@@ -9,7 +11,7 @@ ActiveRecord::Schema.define(:version => 1) do
|
|
9
11
|
t.integer :age
|
10
12
|
end
|
11
13
|
|
12
|
-
create_table :cats, :
|
14
|
+
create_table :cats, force: true do |t|
|
13
15
|
t.string :breed
|
14
16
|
t.string :other_breed
|
15
17
|
t.string :another_breed
|
@@ -38,31 +40,33 @@ class CatBreed::Bengal < CatBreed; end
|
|
38
40
|
class CatBreed::Birman < CatBreed; end
|
39
41
|
class CatBreed::Persian < CatBreed; end
|
40
42
|
|
41
|
-
class Dog < ActiveRecord::Base
|
43
|
+
class Dog < ActiveRecord::Base
|
44
|
+
include ClassyEnum::ActiveRecord
|
45
|
+
end
|
42
46
|
|
43
47
|
class DefaultDog < Dog
|
44
48
|
classy_enum_attr :breed
|
45
49
|
end
|
46
50
|
|
47
51
|
class AllowBlankBreedDog < Dog
|
48
|
-
classy_enum_attr :breed, :
|
52
|
+
classy_enum_attr :breed, allow_blank: true
|
49
53
|
end
|
50
54
|
|
51
55
|
class AllowNilBreedDog < Dog
|
52
|
-
classy_enum_attr :breed, :
|
56
|
+
classy_enum_attr :breed, allow_nil: true
|
53
57
|
end
|
54
58
|
|
55
59
|
class OtherDog < Dog
|
56
|
-
classy_enum_attr :other_breed, :
|
60
|
+
classy_enum_attr :other_breed, class_name: 'Breed'
|
57
61
|
end
|
58
62
|
|
59
63
|
describe DefaultDog do
|
60
|
-
specify { DefaultDog.new(:
|
61
|
-
specify { DefaultDog.new(:
|
64
|
+
specify { DefaultDog.new(breed: nil).should_not be_valid }
|
65
|
+
specify { DefaultDog.new(breed: '').should_not be_valid }
|
62
66
|
|
63
67
|
[:golden_retriever, 'golden_retriever', Breed::GoldenRetriever.new, Breed::GoldenRetriever].each do |option|
|
64
68
|
context "with a valid breed option" do
|
65
|
-
subject { DefaultDog.new(:
|
69
|
+
subject { DefaultDog.new(breed: option) }
|
66
70
|
it { should be_valid }
|
67
71
|
its(:breed) { should be_a(Breed::GoldenRetriever) }
|
68
72
|
its('breed.allow_blank') { should be_false }
|
@@ -75,8 +79,80 @@ describe DefaultDog do
|
|
75
79
|
end
|
76
80
|
end
|
77
81
|
|
82
|
+
if ::ActiveRecord::VERSION::MAJOR == 4 && ::ActiveRecord::VERSION::MINOR > 0
|
83
|
+
context "works with ActiveModel's attributes" do
|
84
|
+
subject { DefaultDog.create(breed: :golden_retriever) }
|
85
|
+
let(:old_breed) { Breed::GoldenRetriever.new }
|
86
|
+
|
87
|
+
it "sets changed_attributes to enum object" do
|
88
|
+
subject.breed = :snoop
|
89
|
+
subject.changed_attributes[:breed].should eq(old_breed)
|
90
|
+
end
|
91
|
+
|
92
|
+
it "sets changes to array" do
|
93
|
+
subject.breed = :snoop
|
94
|
+
subject.changes[:breed].should eq([old_breed, :snoop])
|
95
|
+
end
|
96
|
+
|
97
|
+
it "works with attribute_changed?" do
|
98
|
+
subject.breed = :snoop
|
99
|
+
subject.breed_was.should eq(old_breed)
|
100
|
+
subject.breed_changed?.should be_true
|
101
|
+
|
102
|
+
if subject.respond_to? :attribute_changed?
|
103
|
+
subject.attribute_changed?(:breed, to: Breed::Snoop.new).should be_true
|
104
|
+
subject.breed_changed?(
|
105
|
+
from: Breed::GoldenRetriever.new,
|
106
|
+
to: Breed::Snoop.new
|
107
|
+
).should be_true
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
it "returns enum object for *_was" do
|
112
|
+
subject.breed = :snoop
|
113
|
+
subject.breed_was.golden_retriever?.should be_true
|
114
|
+
end
|
115
|
+
|
116
|
+
it "reverts changes" do
|
117
|
+
subject.breed = :snoop
|
118
|
+
subject.breed_changed?.should be_true
|
119
|
+
subject.breed = old_breed
|
120
|
+
subject.breed_changed?.should be_false
|
121
|
+
end
|
122
|
+
|
123
|
+
it "does not track the same value" do
|
124
|
+
subject.breed = :golden_retriever
|
125
|
+
subject.breed_changed?.should be_false
|
126
|
+
end
|
127
|
+
|
128
|
+
it "retains changes with multiple assignments" do
|
129
|
+
subject.breed = :snoop
|
130
|
+
subject.breed_changed?.should be_true
|
131
|
+
subject.breed = :husky
|
132
|
+
subject.breed_changed?.should be_true
|
133
|
+
end
|
134
|
+
|
135
|
+
it "allows tracks changes when nil is allowed" do
|
136
|
+
dog = AllowNilBreedDog.create(breed: :snoop)
|
137
|
+
dog.breed = nil
|
138
|
+
dog.save!
|
139
|
+
dog.breed = :snoop
|
140
|
+
dog.breed_changed?.should be_true
|
141
|
+
dog.breed = nil
|
142
|
+
dog.breed_changed?.should be_false
|
143
|
+
end
|
144
|
+
|
145
|
+
it "restores breed (Rails 4.2+)" do
|
146
|
+
if subject.respond_to?(:restore_breed)
|
147
|
+
subject.restore_breed!
|
148
|
+
subject.breed.should eq(:golden_retriever)
|
149
|
+
end
|
150
|
+
end
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
78
154
|
context "with invalid breed options" do
|
79
|
-
subject { DefaultDog.new(:
|
155
|
+
subject { DefaultDog.new(breed: :fake_breed) }
|
80
156
|
it { should_not be_valid }
|
81
157
|
it 'has an error on :breed' do
|
82
158
|
subject.valid?
|
@@ -86,17 +162,16 @@ describe DefaultDog do
|
|
86
162
|
end
|
87
163
|
|
88
164
|
describe "A ClassyEnum that allows blanks" do
|
89
|
-
specify { AllowBlankBreedDog.new(:
|
90
|
-
specify { AllowBlankBreedDog.new(:
|
165
|
+
specify { AllowBlankBreedDog.new(breed: nil).should be_valid }
|
166
|
+
specify { AllowBlankBreedDog.new(breed: '').should be_valid }
|
91
167
|
|
92
168
|
context "with valid breed options" do
|
93
|
-
subject { AllowBlankBreedDog.new(:
|
169
|
+
subject { AllowBlankBreedDog.new(breed: :golden_retriever) }
|
94
170
|
it { should be_valid }
|
95
|
-
its('breed.allow_blank') { should be_true }
|
96
171
|
end
|
97
172
|
|
98
173
|
context "with invalid breed options" do
|
99
|
-
subject { AllowBlankBreedDog.new(:
|
174
|
+
subject { AllowBlankBreedDog.new(breed: :fake_breed) }
|
100
175
|
it { should_not be_valid }
|
101
176
|
it 'has an error on :breed' do
|
102
177
|
subject.valid?
|
@@ -106,17 +181,16 @@ describe "A ClassyEnum that allows blanks" do
|
|
106
181
|
end
|
107
182
|
|
108
183
|
describe "A ClassyEnum that allows nils" do
|
109
|
-
specify { AllowNilBreedDog.new(:
|
110
|
-
specify { AllowNilBreedDog.new(:
|
184
|
+
specify { AllowNilBreedDog.new(breed: nil).should be_valid }
|
185
|
+
specify { AllowNilBreedDog.new(breed: '').should_not be_valid }
|
111
186
|
|
112
187
|
context "with valid breed options" do
|
113
|
-
subject { AllowNilBreedDog.new(:
|
188
|
+
subject { AllowNilBreedDog.new(breed: :golden_retriever) }
|
114
189
|
it { should be_valid }
|
115
|
-
its('breed.allow_blank') { should be_true }
|
116
190
|
end
|
117
191
|
|
118
192
|
context "with invalid breed options" do
|
119
|
-
subject { AllowNilBreedDog.new(:
|
193
|
+
subject { AllowNilBreedDog.new(breed: :fake_breed) }
|
120
194
|
it { should_not be_valid }
|
121
195
|
it 'has an error on :breed' do
|
122
196
|
subject.valid?
|
@@ -126,24 +200,24 @@ describe "A ClassyEnum that allows nils" do
|
|
126
200
|
end
|
127
201
|
|
128
202
|
describe "A ClassyEnum that has a different field name than the enum" do
|
129
|
-
subject { OtherDog.new(:
|
203
|
+
subject { OtherDog.new(other_breed: :snoop) }
|
130
204
|
its(:other_breed) { should be_a(Breed::Snoop) }
|
131
205
|
end
|
132
206
|
|
133
207
|
class ActiveDog < Dog
|
134
208
|
classy_enum_attr :color
|
135
|
-
validates_uniqueness_of :name, :
|
136
|
-
scope :goldens,
|
209
|
+
validates_uniqueness_of :name, scope: :color
|
210
|
+
scope :goldens, -> { where(breed: Breed.build('golden_retriever').to_s) }
|
137
211
|
end
|
138
212
|
|
139
213
|
describe ActiveDog do
|
140
214
|
context 'uniqueness on name' do
|
141
|
-
subject { ActiveDog.new(:
|
215
|
+
subject { ActiveDog.new(name: 'Kitteh', breed: :golden_retriever, color: :black) }
|
142
216
|
it { should be_valid }
|
143
217
|
|
144
218
|
context 'with existing kitteh' do
|
145
219
|
before do
|
146
|
-
ActiveDog.create!(:
|
220
|
+
ActiveDog.create!(name: 'Kitteh', breed: :husky, color: :black)
|
147
221
|
end
|
148
222
|
|
149
223
|
it 'has an error on :name' do
|
@@ -154,8 +228,8 @@ describe ActiveDog do
|
|
154
228
|
end
|
155
229
|
|
156
230
|
context 'scopes' do
|
157
|
-
let!(:golden) { ActiveDog.create!(:
|
158
|
-
let!(:husky) { ActiveDog.create!(:
|
231
|
+
let!(:golden) { ActiveDog.create!(name: 'Sebastian', breed: :golden_retriever, color: :white) }
|
232
|
+
let!(:husky) { ActiveDog.create!(name: 'Sirius', breed: :husky, color: :black) }
|
159
233
|
|
160
234
|
after { ActiveDog.destroy_all }
|
161
235
|
|
@@ -176,7 +250,7 @@ describe ActiveDog do
|
|
176
250
|
end
|
177
251
|
|
178
252
|
class DefaultValueDog < Dog
|
179
|
-
classy_enum_attr :breed, :
|
253
|
+
classy_enum_attr :breed, default: :snoop
|
180
254
|
end
|
181
255
|
|
182
256
|
describe DefaultValueDog do
|
@@ -184,7 +258,7 @@ describe DefaultValueDog do
|
|
184
258
|
end
|
185
259
|
|
186
260
|
class DynamicDefaultValueDog < Dog
|
187
|
-
classy_enum_attr :breed, :
|
261
|
+
classy_enum_attr :breed, default: ->(enum) { enum.max }
|
188
262
|
end
|
189
263
|
|
190
264
|
describe DynamicDefaultValueDog do
|
@@ -194,32 +268,35 @@ end
|
|
194
268
|
describe Dog, 'with invalid default value' do
|
195
269
|
it 'raises error with invalid default' do
|
196
270
|
expect {
|
197
|
-
Class.new(Dog) { classy_enum_attr :breed, :
|
271
|
+
Class.new(Dog) { classy_enum_attr :breed, default: :nope }
|
198
272
|
}.to raise_error(ClassyEnum::InvalidDefault)
|
199
273
|
end
|
200
274
|
end
|
201
275
|
|
202
276
|
class Cat < ActiveRecord::Base
|
277
|
+
include ClassyEnum::ActiveRecord
|
203
278
|
end
|
204
279
|
|
205
280
|
class DefaultCat < Cat
|
206
|
-
classy_enum_attr :breed, :
|
207
|
-
classy_enum_attr :other_breed, :
|
281
|
+
classy_enum_attr :breed, class_name: 'CatBreed'
|
282
|
+
classy_enum_attr :other_breed, class_name: 'CatBreed', default: 'persian'
|
208
283
|
attr_accessor :color
|
209
|
-
delegate :breed_color, :
|
284
|
+
delegate :breed_color, to: :breed
|
210
285
|
end
|
211
286
|
|
212
287
|
class OtherCat < Cat
|
213
|
-
classy_enum_attr :breed, :
|
214
|
-
classy_enum_attr :other_breed, :
|
215
|
-
|
288
|
+
classy_enum_attr :breed, class_name: 'CatBreed'
|
289
|
+
classy_enum_attr :other_breed, class_name: 'CatBreed', default: 'persian', allow_nil: true
|
290
|
+
|
291
|
+
# Use enum option to ensure the tests are covering it somewhere
|
292
|
+
classy_enum_attr :another_breed, enum: 'CatBreed', default: 'persian', allow_blank: true
|
216
293
|
attr_accessor :color
|
217
|
-
delegate :breed_color, :
|
294
|
+
delegate :breed_color, to: :breed
|
218
295
|
end
|
219
296
|
|
220
297
|
describe DefaultCat do
|
221
|
-
let(:abyssian) { DefaultCat.new(:
|
222
|
-
let(:persian) { OtherCat.new(:
|
298
|
+
let(:abyssian) { DefaultCat.new(breed: :abyssian, color: 'black') }
|
299
|
+
let(:persian) { OtherCat.new(breed: :persian, color: 'white') }
|
223
300
|
|
224
301
|
it 'should delegate breed color to breed with an ownership reference' do
|
225
302
|
abyssian.breed_color { should eql('black Abyssian') }
|
@@ -227,31 +304,31 @@ describe DefaultCat do
|
|
227
304
|
end
|
228
305
|
|
229
306
|
it 'persists the default, when set to nil' do
|
230
|
-
cat = DefaultCat.create(:
|
231
|
-
expect(DefaultCat.where(:
|
307
|
+
cat = DefaultCat.create(breed: :abyssian)
|
308
|
+
expect(DefaultCat.where(other_breed: 'persian')).to include(cat)
|
232
309
|
end
|
233
310
|
|
234
311
|
it 'uses the default if explictly set to nil and does not allow nil' do
|
235
|
-
abyssian.update_attributes!(:
|
236
|
-
DefaultCat.where(:
|
312
|
+
abyssian.update_attributes!(other_breed: nil)
|
313
|
+
DefaultCat.where(other_breed: 'persian').should include(abyssian)
|
237
314
|
DefaultCat.last.other_breed.should == 'persian'
|
238
315
|
end
|
239
316
|
|
240
317
|
it 'uses the default if explictly set to blank and does not allow blank' do
|
241
|
-
abyssian.update_attributes!(:
|
242
|
-
DefaultCat.where(:
|
318
|
+
abyssian.update_attributes!(other_breed: '')
|
319
|
+
DefaultCat.where(other_breed: 'persian').should include(abyssian)
|
243
320
|
DefaultCat.last.other_breed.should == 'persian'
|
244
321
|
end
|
245
322
|
|
246
323
|
it 'allows nil even with a default' do
|
247
|
-
persian.update_attributes!(:
|
248
|
-
OtherCat.where(:
|
324
|
+
persian.update_attributes!(other_breed: nil)
|
325
|
+
OtherCat.where(other_breed: nil).count.should eql(1)
|
249
326
|
OtherCat.last.other_breed.should be_nil
|
250
327
|
end
|
251
328
|
|
252
329
|
it 'allows blank even with a default' do
|
253
|
-
persian.update_attributes!(:
|
254
|
-
OtherCat.where(:
|
330
|
+
persian.update_attributes!(another_breed: '')
|
331
|
+
OtherCat.where(another_breed: '').count.should eql(1)
|
255
332
|
OtherCat.last.another_breed.should be_blank
|
256
333
|
OtherCat.last.another_breed.should_not be_nil
|
257
334
|
end
|
@@ -29,16 +29,12 @@ describe ClassyEnum::Base do
|
|
29
29
|
|
30
30
|
context 'nil' do
|
31
31
|
subject { ClassyEnumBase.build(nil) }
|
32
|
-
it { should
|
33
|
-
it { should be_nil }
|
34
|
-
it { should be_blank }
|
32
|
+
it { should eq(nil) }
|
35
33
|
end
|
36
34
|
|
37
35
|
context 'empty string' do
|
38
36
|
subject { ClassyEnumBase.build('') }
|
39
|
-
it { should
|
40
|
-
it { should_not be_nil }
|
41
|
-
it { should be_blank }
|
37
|
+
it { should eq('') }
|
42
38
|
end
|
43
39
|
end
|
44
40
|
|
@@ -50,7 +46,7 @@ describe ClassyEnum::Base do
|
|
50
46
|
|
51
47
|
context 'Subclass naming' do
|
52
48
|
it 'should raise an error when invalid' do
|
53
|
-
|
49
|
+
-> {
|
54
50
|
class WrongSublcassName < ClassyEnumBase; end
|
55
51
|
}.should raise_error(ClassyEnum::SubclassNameError)
|
56
52
|
end
|
@@ -66,9 +62,3 @@ describe ClassyEnum::Base do
|
|
66
62
|
end
|
67
63
|
end
|
68
64
|
end
|
69
|
-
|
70
|
-
describe ClassyEnum::Base, 'Arel visitor' do
|
71
|
-
specify do
|
72
|
-
Arel::Visitors::ToSql.instance_methods.map(&:to_sym).should include(:'visit_ClassyEnumBase_One', :'visit_ClassyEnumBase_Two')
|
73
|
-
end
|
74
|
-
end
|
@@ -23,6 +23,7 @@ describe ClassyEnum::Collection do
|
|
23
23
|
context '.map' do
|
24
24
|
it 'should behave like an enumerable' do
|
25
25
|
enum.map(&:to_s).should == %w(one two three)
|
26
|
+
enum.select {|e| e < :three }.should include(:one, :two)
|
26
27
|
end
|
27
28
|
end
|
28
29
|
|
@@ -34,6 +35,7 @@ describe ClassyEnum::Collection do
|
|
34
35
|
|
35
36
|
context '#<=> (equality)' do
|
36
37
|
its(:first) { should == ClassyEnumCollection::One.new }
|
38
|
+
its(:first) { should == ClassyEnumCollection::One }
|
37
39
|
its(:first) { should == :one }
|
38
40
|
its(:first) { should == 'one' }
|
39
41
|
its(:first) { should_not == :two }
|
@@ -31,25 +31,7 @@ describe ClassyEnum::Conversion do
|
|
31
31
|
end
|
32
32
|
|
33
33
|
context '#as_json' do
|
34
|
-
|
35
|
-
|
36
|
-
specify { ClassyEnumConversion::Two.new.as_json.should == 'two' }
|
37
|
-
end
|
38
|
-
|
39
|
-
context 'serialize_as_json is true' do
|
40
|
-
specify do
|
41
|
-
enum = ClassyEnumConversion::One.new
|
42
|
-
enum.serialize_as_json = true
|
43
|
-
enum.instance_variable_set('@key', 'value')
|
44
|
-
enum.as_json.should == {'key' => 'value' }
|
45
|
-
end
|
46
|
-
|
47
|
-
specify do
|
48
|
-
enum = ClassyEnumConversion::One.new
|
49
|
-
enum.serialize_as_json = true
|
50
|
-
enum.instance_variable_set('@key', 'value')
|
51
|
-
enum.as_json.should == {'key' => 'value' }
|
52
|
-
end
|
53
|
-
end
|
34
|
+
specify { ClassyEnumConversion::One.new.as_json.should == 'one' }
|
35
|
+
specify { ClassyEnumConversion::Two.new.as_json.should == 'two' }
|
54
36
|
end
|
55
37
|
end
|
@@ -13,8 +13,9 @@ describe ClassyEnum::Translation do
|
|
13
13
|
|
14
14
|
before do
|
15
15
|
I18n.reload!
|
16
|
-
I18n.
|
17
|
-
I18n.backend.store_translations :
|
16
|
+
I18n.available_locales = ['en', 'es']
|
17
|
+
I18n.backend.store_translations :en, classy_enum: {classy_enum_translation: {one: 'One!', two: 'Two!' } }
|
18
|
+
I18n.backend.store_translations :es, classy_enum: {classy_enum_translation: {one: 'Uno', two: 'Dos' } }
|
18
19
|
end
|
19
20
|
|
20
21
|
context '#text' do
|
data/spec/classy_enum_spec.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
@@ -5,7 +5,9 @@ require 'rubygems'
|
|
5
5
|
require 'active_record'
|
6
6
|
require 'classy_enum'
|
7
7
|
|
8
|
-
|
8
|
+
I18n.enforce_available_locales = true
|
9
|
+
|
10
|
+
ActiveRecord::Base.establish_connection(adapter: "sqlite3", database: ":memory:")
|
9
11
|
|
10
12
|
RSpec.configure do |config|
|
11
13
|
config.color_enabled = true
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: classy_enum
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 4.0.0.beta1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Peter Brown
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-12-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '3.
|
19
|
+
version: '3.2'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '3.
|
26
|
+
version: '3.2'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rspec
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -81,10 +81,10 @@ files:
|
|
81
81
|
- README.md
|
82
82
|
- Rakefile
|
83
83
|
- classy_enum.gemspec
|
84
|
-
- gemfiles/Gemfile.rails-3.0.x
|
85
|
-
- gemfiles/Gemfile.rails-3.1.x
|
86
84
|
- gemfiles/Gemfile.rails-3.2.x
|
87
85
|
- gemfiles/Gemfile.rails-4.0.x
|
86
|
+
- gemfiles/Gemfile.rails-4.1.x
|
87
|
+
- gemfiles/Gemfile.rails-4.2.x
|
88
88
|
- init.rb
|
89
89
|
- lib/classy_enum.rb
|
90
90
|
- lib/classy_enum/active_record.rb
|
@@ -124,9 +124,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
124
124
|
version: '0'
|
125
125
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
126
126
|
requirements:
|
127
|
-
- - "
|
127
|
+
- - ">"
|
128
128
|
- !ruby/object:Gem::Version
|
129
|
-
version:
|
129
|
+
version: 1.3.1
|
130
130
|
requirements: []
|
131
131
|
rubyforge_project:
|
132
132
|
rubygems_version: 2.2.2
|