enum_accessor 0.2.0 → 0.3.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 +7 -0
- data/README.md +5 -2
- data/lib/enum_accessor/railtie.rb +7 -7
- data/lib/enum_accessor/version.rb +1 -1
- data/lib/enum_accessor.rb +6 -1
- data/spec/enum_accessor_spec.rb +28 -20
- data/spec/spec_helper.rb +1 -0
- metadata +17 -27
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 6b8947f56d293a6a55ae10dcdc009bfa6b2cfbd4
|
4
|
+
data.tar.gz: 75825ca40a5002cd3c1506b77df310aa6cb9138b
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: c41df44791461e8d1471a7d8a6567f3677cda98cb0b2a4226108cfc31adcb3feed3f894e6b0347a3881de61674149c478b40b4f320a3124a55d2d3df70e60a99
|
7
|
+
data.tar.gz: ff9bfc17e13950b8bb5844d625d4e8c1912221c0c46423250f569a4a5c0e438e0a39b27875e03c64e06d02852b2e2d3d985dc8b7d1d7814ff7bfda66de96fb2f
|
data/README.md
CHANGED
@@ -106,12 +106,14 @@ user.human_gender # => 'Female'
|
|
106
106
|
User.human_genders # => { :female => 'Female', :male => 'Male' }
|
107
107
|
```
|
108
108
|
|
109
|
+
## Changelog
|
110
|
+
|
111
|
+
- v0.3.0: Add support for `find_or_create_by`
|
112
|
+
|
109
113
|
## Why enum keys are internally stored as strings rather than symbols?
|
110
114
|
|
111
115
|
Because `params[:gender].to_sym` is dangerous. It could lead to problems like memory leak, slow symbol table lookup, or even DoS attack. If a user sends random strings for the parameter, it generates uncontrollable number of symbols, which can never be garbage collected, and eventually causes `symbol table overflow (RuntimeError)`, eating up gigabytes of memory.
|
112
116
|
|
113
|
-
We
|
114
|
-
|
115
117
|
For the same reason, `ActiveSupport::HashWithIndifferentAccess` (which is used for `params`) keeps hash keys as string internally.
|
116
118
|
|
117
119
|
https://github.com/rails/rails/blob/master/activesupport/lib/active_support/hash_with_indifferent_access.rb
|
@@ -130,5 +132,6 @@ There are tons of similar gems out there. Then why did I bother creating another
|
|
130
132
|
* [coded_options](https://github.com/jasondew/coded_options)
|
131
133
|
* [active_enum](https://github.com/adzap/active_enum)
|
132
134
|
* [classy_enum](https://github.com/beerlington/classy_enum)
|
135
|
+
* [enumerize](https://github.com/brainspec/enumerize)
|
133
136
|
|
134
137
|
Also, EnumAccessor has one of the simplest code base, so that you can easily hack on.
|
@@ -1,11 +1,11 @@
|
|
1
1
|
module EnumAccessor
|
2
2
|
if defined? Rails::Railtie
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
3
|
+
class Railtie < Rails::Railtie
|
4
|
+
initializer 'enum_accessor.insert_into_active_record' do |app|
|
5
|
+
ActiveSupport.on_load :active_record do
|
6
|
+
include EnumAccessor
|
7
|
+
end
|
8
|
+
end
|
9
|
+
end
|
10
10
|
end
|
11
11
|
end
|
data/lib/enum_accessor.rb
CHANGED
@@ -31,7 +31,12 @@ module EnumAccessor
|
|
31
31
|
|
32
32
|
# Setter
|
33
33
|
define_method("#{field}=") do |arg|
|
34
|
-
|
34
|
+
case arg
|
35
|
+
when String, Symbol
|
36
|
+
write_attribute field, const[arg.to_s]
|
37
|
+
when Integer
|
38
|
+
write_attribute field, arg
|
39
|
+
end
|
35
40
|
end
|
36
41
|
|
37
42
|
# Raw-value getter
|
data/spec/enum_accessor_spec.rb
CHANGED
@@ -16,57 +16,65 @@ describe EnumAccessor do
|
|
16
16
|
end
|
17
17
|
|
18
18
|
it 'adds checker' do
|
19
|
-
@user.gender_female
|
20
|
-
@user.gender_male
|
19
|
+
expect(@user.gender_female?).to eq(true)
|
20
|
+
expect(@user.gender_male?).to eq(false)
|
21
21
|
end
|
22
22
|
|
23
23
|
it 'adds getter' do
|
24
|
-
@user.gender.
|
24
|
+
expect(@user.gender).to eq(:female)
|
25
25
|
end
|
26
26
|
|
27
27
|
it 'adds setter' do
|
28
28
|
@user.gender = :male
|
29
|
-
@user.gender_male
|
29
|
+
expect(@user.gender_male?).to eq(true)
|
30
30
|
end
|
31
31
|
|
32
32
|
it 'adds raw value getter' do
|
33
|
-
@user.gender_raw.
|
33
|
+
expect(@user.gender_raw).to eq(0)
|
34
34
|
end
|
35
35
|
|
36
36
|
it 'adds raw value setter' do
|
37
37
|
@user.gender_raw = 1
|
38
|
-
@user.gender_male
|
38
|
+
expect(@user.gender_male?).to eq(true)
|
39
39
|
end
|
40
40
|
|
41
41
|
it 'adds humanized methods' do
|
42
42
|
I18n.locale = :ja
|
43
|
-
User.human_attribute_name(:gender).
|
44
|
-
@user.human_gender.
|
45
|
-
User.human_genders(:female).
|
46
|
-
User.human_genders.
|
43
|
+
expect(User.human_attribute_name(:gender)).to eq('性別')
|
44
|
+
expect(@user.human_gender).to eq('女')
|
45
|
+
expect(User.human_genders(:female)).to eq('女')
|
46
|
+
expect(User.human_genders).to eq({ :female => '女', :male => '男' })
|
47
47
|
|
48
48
|
I18n.locale = :en
|
49
|
-
User.human_attribute_name(:gender).
|
50
|
-
@user.human_gender.
|
51
|
-
User.human_genders(:female).
|
52
|
-
User.human_genders.
|
49
|
+
expect(User.human_attribute_name(:gender)).to eq('Gender')
|
50
|
+
expect(@user.human_gender).to eq('Female')
|
51
|
+
expect(User.human_genders(:female)).to eq('Female')
|
52
|
+
expect(User.human_genders).to eq({ :female => 'Female', :male => 'Male' })
|
53
53
|
end
|
54
54
|
|
55
55
|
it 'defines internal constant' do
|
56
|
-
User::GENDERS.
|
56
|
+
expect(User::GENDERS).to eq({ "female" => 0, "male" => 1 })
|
57
57
|
end
|
58
58
|
|
59
59
|
it 'adds class methods' do
|
60
|
-
User.genders.
|
61
|
-
User.genders[:female].
|
62
|
-
User.genders(:female).
|
60
|
+
expect(User.genders).to eq({ :female => 0, :male => 1 })
|
61
|
+
expect(User.genders[:female]).to eq(0)
|
62
|
+
expect(User.genders(:female)).to eq(0)
|
63
63
|
end
|
64
64
|
|
65
65
|
it 'adds validation' do
|
66
66
|
@user.gender = 'bogus'
|
67
|
-
@user.valid
|
67
|
+
expect(@user.valid?).to be_falsey
|
68
68
|
|
69
69
|
@user.gender = 'male'
|
70
|
-
@user.valid
|
70
|
+
expect(@user.valid?).to be_truthy
|
71
|
+
end
|
72
|
+
|
73
|
+
it 'supports find_or_create_by' do
|
74
|
+
# `find_or_create_by` uses where-based raw value for find,
|
75
|
+
# then passes the raw value to the setter method for create.
|
76
|
+
expect {
|
77
|
+
User.find_or_create_by(gender: User.genders(:female))
|
78
|
+
}.to change{ User.count }.by(1)
|
71
79
|
end
|
72
80
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,78 +1,69 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: enum_accessor
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.3.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Kenn Ejima
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2014-08-20 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: activesupport
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - ">="
|
20
18
|
- !ruby/object:Gem::Version
|
21
19
|
version: 3.0.0
|
22
20
|
type: :runtime
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
|
-
- -
|
24
|
+
- - ">="
|
28
25
|
- !ruby/object:Gem::Version
|
29
26
|
version: 3.0.0
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: activerecord
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
|
-
- -
|
31
|
+
- - ">="
|
36
32
|
- !ruby/object:Gem::Version
|
37
33
|
version: 3.0.0
|
38
34
|
type: :development
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
|
-
- -
|
38
|
+
- - ">="
|
44
39
|
- !ruby/object:Gem::Version
|
45
40
|
version: 3.0.0
|
46
41
|
- !ruby/object:Gem::Dependency
|
47
42
|
name: rspec
|
48
43
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
44
|
requirements:
|
51
|
-
- -
|
45
|
+
- - ">="
|
52
46
|
- !ruby/object:Gem::Version
|
53
47
|
version: '0'
|
54
48
|
type: :development
|
55
49
|
prerelease: false
|
56
50
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
51
|
requirements:
|
59
|
-
- -
|
52
|
+
- - ">="
|
60
53
|
- !ruby/object:Gem::Version
|
61
54
|
version: '0'
|
62
55
|
- !ruby/object:Gem::Dependency
|
63
56
|
name: sqlite3
|
64
57
|
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
58
|
requirements:
|
67
|
-
- -
|
59
|
+
- - ">="
|
68
60
|
- !ruby/object:Gem::Version
|
69
61
|
version: '0'
|
70
62
|
type: :development
|
71
63
|
prerelease: false
|
72
64
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
65
|
requirements:
|
75
|
-
- -
|
66
|
+
- - ">="
|
76
67
|
- !ruby/object:Gem::Version
|
77
68
|
version: '0'
|
78
69
|
description: Simple enum fields for ActiveRecord
|
@@ -82,8 +73,8 @@ executables: []
|
|
82
73
|
extensions: []
|
83
74
|
extra_rdoc_files: []
|
84
75
|
files:
|
85
|
-
- .gitignore
|
86
|
-
- .rspec
|
76
|
+
- ".gitignore"
|
77
|
+
- ".rspec"
|
87
78
|
- Gemfile
|
88
79
|
- LICENSE.txt
|
89
80
|
- README.md
|
@@ -97,27 +88,26 @@ files:
|
|
97
88
|
- spec/spec_helper.rb
|
98
89
|
homepage: https://github.com/kenn/enum_accessor
|
99
90
|
licenses: []
|
91
|
+
metadata: {}
|
100
92
|
post_install_message:
|
101
93
|
rdoc_options: []
|
102
94
|
require_paths:
|
103
95
|
- lib
|
104
96
|
required_ruby_version: !ruby/object:Gem::Requirement
|
105
|
-
none: false
|
106
97
|
requirements:
|
107
|
-
- -
|
98
|
+
- - ">="
|
108
99
|
- !ruby/object:Gem::Version
|
109
100
|
version: '0'
|
110
101
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
111
|
-
none: false
|
112
102
|
requirements:
|
113
|
-
- -
|
103
|
+
- - ">="
|
114
104
|
- !ruby/object:Gem::Version
|
115
105
|
version: '0'
|
116
106
|
requirements: []
|
117
107
|
rubyforge_project:
|
118
|
-
rubygems_version:
|
108
|
+
rubygems_version: 2.2.2
|
119
109
|
signing_key:
|
120
|
-
specification_version:
|
110
|
+
specification_version: 4
|
121
111
|
summary: Simple enum fields for ActiveRecord
|
122
112
|
test_files:
|
123
113
|
- spec/enum_accessor_spec.rb
|