mongoid-enum 0.1.1 → 0.2.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 +4 -12
- data/.travis.yml +6 -6
- data/README.md +41 -25
- data/lib/mongoid/enum.rb +48 -17
- data/lib/mongoid/enum/version.rb +1 -1
- data/mongoid-enum.gemspec +1 -1
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,15 +1,7 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
|
-
metadata.gz:
|
4
|
-
|
5
|
-
data.tar.gz: !binary |-
|
6
|
-
MzgxMTU4ZjJhYzA0ZTg5ZWZjY2QzOGM5YWM4N2NmNDZiODBjYThkZQ==
|
3
|
+
metadata.gz: c0380dc80b62126bdaec73b7b84f45eff8ecc607
|
4
|
+
data.tar.gz: 1ea999b331c3500038eaa3e22309ba67fd1f6b51
|
7
5
|
SHA512:
|
8
|
-
metadata.gz:
|
9
|
-
|
10
|
-
ZDdiMTU2OTJjMmFmMTQzZThhODhkNmJkMDUzYTJlODI1YWExOWU0ZmU1OGYy
|
11
|
-
ZTYwNmFlNDZiZGEwZGM0MmNkODNlM2IzYWViNTJlNGJjNjZmODY=
|
12
|
-
data.tar.gz: !binary |-
|
13
|
-
MWVkNDk1ODg1YWVjZWM5Y2U5NzQ3NmFlNjY4N2Y2N2Y2OTQyMzQ5Y2U5N2Zh
|
14
|
-
MTExODgyNzQxYThiMGQxZjQwMzYzY2Q1MzFjZjIxZWE2NmMzZDE5ZmI2MDdl
|
15
|
-
NDVjYmQwODBlYmJkZWViY2JjY2MyZTdhMjljMWYwYTk2NDYyODU=
|
6
|
+
metadata.gz: 63a8a27751a95d12b23fa52619810079782218ca18d72febcc6dcc1baff257d7aefe9f01eb27eb8a2918b0cac75d7de7a6c65f7c95f0e47d2124059a9b864249
|
7
|
+
data.tar.gz: 6a3d706e2115b79da8a51925a7d57ba385953b1d24c3ea196e563bb88ce24b914ce5fe08d346643747d5b02fa16c9ec7b3521e5d5d075feaabd580fc4657a85b
|
data/.travis.yml
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
script: "bundle exec rspec spec"
|
2
|
+
|
2
3
|
language: ruby
|
4
|
+
|
3
5
|
rvm:
|
4
6
|
- 1.9.3
|
5
7
|
- 2.0.0
|
8
|
+
- 2.1.0
|
9
|
+
- 2.1.1
|
10
|
+
- 2.1.2
|
6
11
|
- jruby-19mode
|
7
|
-
|
8
|
-
gemfile:
|
9
|
-
- Gemfile
|
10
|
-
notifications:
|
11
|
-
recipients:
|
12
|
-
- nicholas@bruning.com.au
|
12
|
+
|
13
13
|
services:
|
14
14
|
- mongodb
|
data/README.md
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
[](https://travis-ci.org/thetron/mongoid-enum)
|
5
|
+
[](https://codeclimate.com/github/thetron/mongoid-enum)
|
5
6
|
|
6
7
|
Heavily inspired by [DHH's
|
7
8
|
ActiveRecord::Enum](https://github.com/rails/rails/commit/db41eb8a6ea88b854bf5cd11070ea4245e1639c5), this little library is
|
@@ -16,25 +17,27 @@ and a few other bits-and-bobs.
|
|
16
17
|
|
17
18
|
Add this to your Gemfile:
|
18
19
|
|
19
|
-
|
20
|
+
```ruby
|
21
|
+
gem "mongoid-enum"
|
22
|
+
```
|
20
23
|
|
21
24
|
And then run `bundle install`.
|
22
25
|
|
23
26
|
|
24
27
|
# Usage
|
25
28
|
|
26
|
-
|
29
|
+
```ruby
|
27
30
|
class Payment
|
28
31
|
include Mongoid::Document
|
29
32
|
include Mongoid::Enum
|
30
33
|
|
31
|
-
enum :status, [:pending, :approved, :declined]
|
34
|
+
enum :status, [:pending, :approved, :declined]
|
32
35
|
end
|
33
|
-
|
36
|
+
```
|
34
37
|
|
35
38
|
Aaaaaaand then you get things like:
|
36
39
|
|
37
|
-
|
40
|
+
```ruby
|
38
41
|
payment = Payment.create
|
39
42
|
|
40
43
|
payment.status
|
@@ -49,7 +52,7 @@ payment.pending?
|
|
49
52
|
Payment.approved
|
50
53
|
# => Mongoid::Criteria for payments with status == :approved
|
51
54
|
|
52
|
-
|
55
|
+
```
|
53
56
|
|
54
57
|
# Features
|
55
58
|
|
@@ -64,13 +67,13 @@ convenience.
|
|
64
67
|
## Accessors
|
65
68
|
|
66
69
|
Your enums will get getters-and-setters with the same name. So using the
|
67
|
-
|
70
|
+
`Payment` example above:
|
68
71
|
|
69
|
-
|
72
|
+
```ruby
|
70
73
|
payment.status = :declined
|
71
74
|
payment.status
|
72
75
|
# => :declined
|
73
|
-
|
76
|
+
```
|
74
77
|
|
75
78
|
And you also get bang(!) and query(?) methods for each of the values in
|
76
79
|
your enum (see [this example](#usage).
|
@@ -82,10 +85,10 @@ For each enum, you'll also get a constant named after it. This is to
|
|
82
85
|
help you elsewhere in your app, should you need to display, or leverage
|
83
86
|
the list of values. Using the above example:
|
84
87
|
|
85
|
-
|
88
|
+
```ruby
|
86
89
|
Payment::STATUS
|
87
90
|
# => [:pending, :approved, :declined]
|
88
|
-
|
91
|
+
```
|
89
92
|
|
90
93
|
|
91
94
|
## Validations
|
@@ -99,11 +102,11 @@ disable this behaviour (see [below](#options)).
|
|
99
102
|
A scope added for each of your enum's values. Using the example above,
|
100
103
|
you'd automatically get:
|
101
104
|
|
102
|
-
|
105
|
+
```ruby
|
103
106
|
Payment.pending # => Mongoid::Criteria
|
104
107
|
Payment.approved # => Mongoid::Criteria
|
105
108
|
Payment.declined # => Mongoid::Criteria
|
106
|
-
|
109
|
+
```
|
107
110
|
|
108
111
|
|
109
112
|
# Options
|
@@ -114,25 +117,37 @@ If not specified, the default will be the first in your list of values
|
|
114
117
|
(`:pending` in the example above). You can override this with the
|
115
118
|
`:default` option:
|
116
119
|
|
117
|
-
|
118
|
-
|
120
|
+
```ruby
|
121
|
+
enum :roles, [:manager, :administrator], :default => ""
|
122
|
+
```
|
119
123
|
|
120
124
|
## Multiple values
|
121
125
|
|
122
126
|
Sometimes you'll need to store multiple values from your list, this
|
123
127
|
couldn't be easier:
|
124
128
|
|
125
|
-
|
129
|
+
```ruby
|
130
|
+
enum :roles, [:basic, :manager, :administrator], :multiple => true
|
131
|
+
|
132
|
+
# ...
|
126
133
|
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
134
|
+
user = User.create
|
135
|
+
user.roles << :basic
|
136
|
+
user.roles << :manager
|
137
|
+
user.save!
|
131
138
|
|
132
|
-
|
133
|
-
|
134
|
-
|
139
|
+
user.manager? # => true
|
140
|
+
user.administrator? # => false
|
141
|
+
user.roles # => [:basic, :manager]
|
142
|
+
```
|
135
143
|
|
144
|
+
Since the underlying datatype for storing values is an array, if you
|
145
|
+
need to specify default(s), ensure you use an array:
|
146
|
+
|
147
|
+
```ruby
|
148
|
+
enum :roles, [:noob, :author, :editor], :multiple => true, :default => [:author, :editor] # two defaults
|
149
|
+
enum :roles, [:noob, :author, :editor], :multiple => true, :default => [] # no default
|
150
|
+
```
|
136
151
|
|
137
152
|
## Validations
|
138
153
|
|
@@ -141,8 +156,9 @@ your field are always from your list of options. If you need more
|
|
141
156
|
complex validations, or you just want to throw caution to the wind, you
|
142
157
|
can turn them off:
|
143
158
|
|
144
|
-
|
145
|
-
|
159
|
+
```ruby
|
160
|
+
enum :status, [:up, :down], :validate => false
|
161
|
+
```
|
146
162
|
|
147
163
|
# Issues and Feature Requests
|
148
164
|
|
data/lib/mongoid/enum.rb
CHANGED
@@ -5,38 +5,69 @@ module Mongoid
|
|
5
5
|
module Enum
|
6
6
|
extend ActiveSupport::Concern
|
7
7
|
module ClassMethods
|
8
|
+
|
8
9
|
def enum(name, values, options = {})
|
9
10
|
field_name = :"_#{name}"
|
10
|
-
|
11
|
-
multiple = options[:multiple] || false
|
12
|
-
default = options[:default].nil? && values.first || options[:default]
|
13
|
-
required = options[:required].nil? || options[:required]
|
14
|
-
validate = options[:validate].nil? || options[:validate]
|
11
|
+
options = default_options(values).merge(options)
|
15
12
|
|
16
|
-
|
13
|
+
set_values_constant name, values
|
17
14
|
|
18
|
-
|
19
|
-
field field_name, :type => type, :default => default
|
15
|
+
create_field field_name, options
|
20
16
|
alias_attribute name, field_name
|
21
17
|
|
22
|
-
|
23
|
-
|
18
|
+
create_validations field_name, values, options
|
19
|
+
define_value_scopes_and_accessors field_name, values, options
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
def default_options(values)
|
24
|
+
{
|
25
|
+
:multiple => false,
|
26
|
+
:default => values.first,
|
27
|
+
:required => true,
|
28
|
+
:validate => true
|
29
|
+
}
|
30
|
+
end
|
31
|
+
|
32
|
+
def set_values_constant(name, values)
|
33
|
+
const_name = name.to_s.upcase
|
34
|
+
const_set const_name, values
|
35
|
+
end
|
36
|
+
|
37
|
+
def create_field(field_name, options)
|
38
|
+
type = options[:multiple] && Array || Symbol
|
39
|
+
field field_name, :type => type, :default => options[:default]
|
40
|
+
end
|
41
|
+
|
42
|
+
def create_validations(field_name, values, options)
|
43
|
+
if options[:multiple] && options[:validate]
|
44
|
+
validates field_name, :'mongoid/enum/validators/multiple' => { :in => values, :allow_nil => !options[:required] }
|
24
45
|
elsif validate
|
25
|
-
validates field_name, :inclusion => {:in => values}, :allow_nil => !required
|
46
|
+
validates field_name, :inclusion => {:in => values}, :allow_nil => !options[:required]
|
26
47
|
end
|
48
|
+
end
|
27
49
|
|
50
|
+
def define_value_scopes_and_accessors(field_name, values, options)
|
28
51
|
values.each do |value|
|
29
|
-
scope value, where(field_name => value)
|
52
|
+
scope value, ->{ where(field_name => value) }
|
30
53
|
|
31
|
-
if multiple
|
32
|
-
|
33
|
-
class_eval "def #{value}!() update_attributes! :#{field_name} => (self.#{field_name} || []) + [:#{value}] end"
|
54
|
+
if options[:multiple]
|
55
|
+
define_array_accessor(field_name, value)
|
34
56
|
else
|
35
|
-
|
36
|
-
class_eval "def #{value}!() update_attributes! :#{field_name} => :#{value} end"
|
57
|
+
define_string_accessor(field_name, value)
|
37
58
|
end
|
38
59
|
end
|
39
60
|
end
|
61
|
+
|
62
|
+
def define_array_accessor(field_name, value)
|
63
|
+
class_eval "def #{value}?() self.#{field_name}.include?(:#{value}) end"
|
64
|
+
class_eval "def #{value}!() update_attributes! :#{field_name} => (self.#{field_name} || []) + [:#{value}] end"
|
65
|
+
end
|
66
|
+
|
67
|
+
def define_string_accessor(field_name, value)
|
68
|
+
class_eval "def #{value}?() self.#{field_name} == :#{value} end"
|
69
|
+
class_eval "def #{value}!() update_attributes! :#{field_name} => :#{value} end"
|
70
|
+
end
|
40
71
|
end
|
41
72
|
end
|
42
73
|
end
|
data/lib/mongoid/enum/version.rb
CHANGED
data/mongoid-enum.gemspec
CHANGED
@@ -18,7 +18,7 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
|
-
spec.
|
21
|
+
spec.add_runtime_dependency "mongoid", "~> 4.0"
|
22
22
|
|
23
23
|
spec.add_development_dependency "bundler", "~> 1.3"
|
24
24
|
spec.add_development_dependency "rake"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mongoid-enum
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nicholas Bruning
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2014-07-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: mongoid
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ~>
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '4.0'
|
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: '
|
26
|
+
version: '4.0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: bundler
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -153,7 +153,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
153
153
|
version: '0'
|
154
154
|
requirements: []
|
155
155
|
rubyforge_project:
|
156
|
-
rubygems_version: 2.
|
156
|
+
rubygems_version: 2.2.2
|
157
157
|
signing_key:
|
158
158
|
specification_version: 4
|
159
159
|
summary: Sweet enum sugar for your Mongoid documents
|