enum_ish 1.2.3 → 1.4.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 -4
- data/.github/workflows/ci.yml +47 -0
- data/CHANGELOG.md +24 -0
- data/README.md +16 -0
- data/gemfiles/rails61.gemfile +5 -0
- data/lib/enum_ish/active_record_definer.rb +11 -2
- data/lib/enum_ish/definer.rb +33 -14
- data/lib/enum_ish/dictionary.rb +25 -7
- data/lib/enum_ish/enum.rb +17 -0
- data/lib/enum_ish/version.rb +1 -1
- metadata +5 -4
- data/.travis.yml +0 -23
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 53a6b89fe82d91b0ae54a440f3ba3a4908af751b3b22064f3ddd085257f975d9
|
4
|
+
data.tar.gz: 033b3df71e3286482f86ad0cce38084cc7c745cf13c5c06ad3cec146c3a577ac
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f55c27359c26b39c6500357594e318da8027198b45073bfd772d9ae9047f295d53e2c23ffabf54118cb308c399b8dce546e4db0a23e6564534a7a28c9f18bdfc
|
7
|
+
data.tar.gz: ca8144b132543120f9fb810398df2252ad8e1051c76e32242fef1d6029ab9a458b988902271c779580c6673fe1f6ac2cada24dd4b8ce7edf499669991721d21a
|
@@ -0,0 +1,47 @@
|
|
1
|
+
name: CI
|
2
|
+
|
3
|
+
on: [push, pull_request]
|
4
|
+
|
5
|
+
jobs:
|
6
|
+
test:
|
7
|
+
runs-on: ubuntu-16.04
|
8
|
+
strategy:
|
9
|
+
fail-fast: false
|
10
|
+
matrix:
|
11
|
+
ruby: [2.3, 2.4, 2.5, 2.6, 2.7, 3.0]
|
12
|
+
gemfile: ['rails50', 'rails51', 'rails52', 'rails60', 'rails61']
|
13
|
+
exclude:
|
14
|
+
- ruby: 2.3
|
15
|
+
gemfile: rails60
|
16
|
+
- ruby: 2.3
|
17
|
+
gemfile: rails61
|
18
|
+
- ruby: 2.4
|
19
|
+
gemfile: rails60
|
20
|
+
- ruby: 2.4
|
21
|
+
gemfile: rails61
|
22
|
+
- ruby: 3.0
|
23
|
+
gemfile: rails50
|
24
|
+
- ruby: 3.0
|
25
|
+
gemfile: rails51
|
26
|
+
- ruby: 3.0
|
27
|
+
gemfile: rails52
|
28
|
+
|
29
|
+
name: ruby ${{ matrix.ruby }}, ${{ matrix.gemfile }}
|
30
|
+
|
31
|
+
env:
|
32
|
+
BUNDLE_GEMFILE: gemfiles/${{ matrix.gemfile }}.gemfile
|
33
|
+
|
34
|
+
steps:
|
35
|
+
- uses: actions/checkout@v2
|
36
|
+
- uses: ruby/setup-ruby@v1
|
37
|
+
with:
|
38
|
+
ruby-version: ${{ matrix.ruby }}
|
39
|
+
bundler-cache: true
|
40
|
+
- name: Prepare test
|
41
|
+
run: |
|
42
|
+
cd spec/dummy
|
43
|
+
BUNDLE_GEMFILE=../../${{ env.BUNDLE_GEMFILE }} RAILS_ENV=test bundle exec rake db:create db:migrate db:seed
|
44
|
+
cd ../..
|
45
|
+
- name: Run test
|
46
|
+
run: |
|
47
|
+
bundle exec rspec
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,29 @@
|
|
1
1
|
# CHANGELOG
|
2
2
|
|
3
|
+
## 1.4.0
|
4
|
+
|
5
|
+
* Generate `not` scope for activerecord class.
|
6
|
+
* Add prefix option to define short predicate method.
|
7
|
+
* Search translation including ancestor classes.
|
8
|
+
* Support multiple arguments for scope.
|
9
|
+
* Fix predicate and validation bugs for field with `accessor: true`.
|
10
|
+
|
11
|
+
## 1.3.3
|
12
|
+
|
13
|
+
* Support rails 6.1.
|
14
|
+
|
15
|
+
## 1.3.2
|
16
|
+
|
17
|
+
* Fix deprecation warning for ruby 2.7.
|
18
|
+
|
19
|
+
## 1.3.1
|
20
|
+
|
21
|
+
* Fix default value for model included ActiveModel.
|
22
|
+
|
23
|
+
## 1.3.0
|
24
|
+
|
25
|
+
* Support array field.
|
26
|
+
|
3
27
|
## 1.2.3
|
4
28
|
|
5
29
|
* Keep enum definitions as a hash internally.
|
data/README.md
CHANGED
@@ -121,6 +121,21 @@ user.status_enable? #=> true
|
|
121
121
|
user.status_disable? #=> false
|
122
122
|
```
|
123
123
|
|
124
|
+
Without prefix:
|
125
|
+
|
126
|
+
```ruby
|
127
|
+
class User
|
128
|
+
extend EnumIsh
|
129
|
+
attr_accessor :status
|
130
|
+
enum_ish :status, ['enable', 'disable'], predicate: { prefix: false }
|
131
|
+
end
|
132
|
+
|
133
|
+
user = User.new
|
134
|
+
user.status = 'enable'
|
135
|
+
user.enable? #=> true
|
136
|
+
user.disable? #=> false
|
137
|
+
```
|
138
|
+
|
124
139
|
### Accessor
|
125
140
|
|
126
141
|
Generate getter and setter for aliased symbols instead of raw values:
|
@@ -164,6 +179,7 @@ class User < ActiveRecord::Base
|
|
164
179
|
end
|
165
180
|
|
166
181
|
User.with_status(:enable) #=> SELECT "users".* FROM "users" WHERE "users"."status" = "enable"
|
182
|
+
User.with_status_not(:enable) #=> SELECT "users".* FROM "users" WHERE "users"."status" != 'enable'
|
167
183
|
```
|
168
184
|
|
169
185
|
#### Validation
|
@@ -24,7 +24,13 @@ module EnumIsh
|
|
24
24
|
enum.mapping.fetch(value, value)
|
25
25
|
end
|
26
26
|
|
27
|
-
|
27
|
+
args =
|
28
|
+
if ActiveRecord.version > Gem::Version.new('6.1.0.a')
|
29
|
+
[enum.name]
|
30
|
+
else
|
31
|
+
[enum.name, :enum]
|
32
|
+
end
|
33
|
+
decorate_attribute_type(*args) do |subtype|
|
28
34
|
EnumIsh::ActiveRecordEnumType.new(enum.name, enum.mapping, subtype)
|
29
35
|
end
|
30
36
|
end
|
@@ -32,9 +38,12 @@ module EnumIsh
|
|
32
38
|
|
33
39
|
def define_scope(enum)
|
34
40
|
@klass.class_eval do
|
35
|
-
scope "#{Config.scope_prefix}#{enum.name}#{Config.scope_suffix}", ->(value) {
|
41
|
+
scope "#{Config.scope_prefix}#{enum.name}#{Config.scope_suffix}", ->(*value) {
|
36
42
|
where(enum.name => enum.mapping.fetch(value, value))
|
37
43
|
}
|
44
|
+
scope "#{Config.scope_prefix}#{enum.name}_not#{Config.scope_suffix}", ->(*value) {
|
45
|
+
where.not(enum.name => enum.mapping.fetch(value, value))
|
46
|
+
}
|
38
47
|
end
|
39
48
|
end
|
40
49
|
end
|
data/lib/enum_ish/definer.rb
CHANGED
@@ -15,27 +15,41 @@ module EnumIsh
|
|
15
15
|
def define_text(enum)
|
16
16
|
@klass.class_eval do
|
17
17
|
define_method "#{Config.text_prefix}#{enum.name}#{Config.text_suffix}" do |options = {}|
|
18
|
-
|
19
|
-
|
20
|
-
dic[value] || value
|
18
|
+
dict = Dictionary.new(self.class, enum, options)
|
19
|
+
dict.translate_value(public_send(enum.name))
|
21
20
|
end
|
22
|
-
end
|
21
|
+
end
|
23
22
|
end
|
24
23
|
|
25
24
|
def define_options(enum)
|
26
25
|
@klass.class_eval do
|
27
26
|
define_singleton_method "#{Config.options_prefix}#{enum.name}#{Config.options_suffix}" do |options = {}|
|
28
|
-
|
29
|
-
|
27
|
+
dict = Dictionary.new(self, enum, options)
|
28
|
+
dict.translate_options
|
30
29
|
end
|
31
30
|
end
|
32
31
|
end
|
33
32
|
|
34
33
|
def define_predicate(enum)
|
35
|
-
enum.mapping.each do |
|
34
|
+
enum.mapping.each do |enum_key, enum_value|
|
35
|
+
method_name = if enum.setting[:predicate].is_a?(Hash) && enum.setting[:predicate][:prefix] == false
|
36
|
+
"#{enum_key}?"
|
37
|
+
else
|
38
|
+
"#{enum.name}_#{enum_key}?"
|
39
|
+
end
|
40
|
+
target_value = if enum.setting[:accessor]
|
41
|
+
enum_key
|
42
|
+
else
|
43
|
+
enum_value
|
44
|
+
end
|
36
45
|
@klass.class_eval do
|
37
|
-
define_method
|
38
|
-
public_send(enum.name)
|
46
|
+
define_method method_name.tr('.', '_') do
|
47
|
+
value = public_send(enum.name)
|
48
|
+
if value.is_a?(Array)
|
49
|
+
value == [target_value]
|
50
|
+
else
|
51
|
+
value == target_value
|
52
|
+
end
|
39
53
|
end
|
40
54
|
end
|
41
55
|
end
|
@@ -45,15 +59,15 @@ module EnumIsh
|
|
45
59
|
mod = Module.new
|
46
60
|
mod.module_eval do
|
47
61
|
define_method :initialize do |*args|
|
62
|
+
super(*args)
|
48
63
|
if respond_to?(enum.name) && public_send(enum.name).nil?
|
49
64
|
default = enum.setting[:default]
|
50
65
|
default = instance_exec(&default) if default.kind_of?(Proc)
|
51
66
|
public_send("#{enum.name}=", default)
|
52
67
|
end
|
53
|
-
super(*args)
|
54
68
|
end
|
55
69
|
end
|
56
|
-
@klass.
|
70
|
+
@klass.send(:include, mod)
|
57
71
|
end
|
58
72
|
|
59
73
|
def define_accessor(enum)
|
@@ -62,17 +76,22 @@ module EnumIsh
|
|
62
76
|
instance_variable_get("@#{enum.name}")
|
63
77
|
end
|
64
78
|
define_method "#{enum.name}" do
|
65
|
-
enum.
|
79
|
+
enum.to_sym(instance_variable_get("@#{enum.name}"))
|
66
80
|
end
|
67
81
|
define_method "#{enum.name}=" do |value|
|
68
|
-
instance_variable_set("@#{enum.name}", enum.
|
82
|
+
instance_variable_set("@#{enum.name}", enum.to_raw(value))
|
69
83
|
end
|
70
84
|
end
|
71
85
|
end
|
72
86
|
|
73
87
|
def define_validate(enum)
|
88
|
+
targets = if enum.setting[:accessor]
|
89
|
+
enum.mapping.keys
|
90
|
+
else
|
91
|
+
enum.mapping.values
|
92
|
+
end
|
74
93
|
@klass.class_eval do
|
75
|
-
validates enum.name, inclusion: { in:
|
94
|
+
validates enum.name, inclusion: { in: targets }, allow_nil: true
|
76
95
|
end
|
77
96
|
end
|
78
97
|
|
data/lib/enum_ish/dictionary.rb
CHANGED
@@ -1,17 +1,30 @@
|
|
1
1
|
module EnumIsh
|
2
2
|
class Dictionary
|
3
|
-
def initialize(klass)
|
3
|
+
def initialize(klass, enum, options = {})
|
4
4
|
@klass = klass
|
5
|
+
@dict = load(enum, options)
|
5
6
|
end
|
6
7
|
|
7
|
-
def
|
8
|
-
|
9
|
-
|
8
|
+
def translate_value(value)
|
9
|
+
if value.is_a?(Array)
|
10
|
+
value.map { |v| @dict[v] || v }
|
11
|
+
else
|
12
|
+
@dict[value] || value
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def translate_options
|
17
|
+
@dict.to_a.map { |value, label| [label, value] }
|
10
18
|
end
|
11
19
|
|
12
20
|
private
|
13
21
|
|
14
|
-
def
|
22
|
+
def load(enum, options)
|
23
|
+
dict = translate_dict(enum, options)
|
24
|
+
filter(dict, options)
|
25
|
+
end
|
26
|
+
|
27
|
+
def translate_dict(enum, options)
|
15
28
|
dict = load_dict(enum, options)
|
16
29
|
translated = enum.mapping.map { |k, v| dict[k] ? [k, dict[k]] : [k, v.to_s] }.to_h
|
17
30
|
translated = translated.map { |k, v| [enum.mapping[k], v] }.to_h unless enum.setting[:accessor]
|
@@ -20,7 +33,7 @@ module EnumIsh
|
|
20
33
|
|
21
34
|
def load_dict(enum, options)
|
22
35
|
key = i18n_key(enum, options)
|
23
|
-
dict = I18n.t("enum_ish.#{@klass.name.underscore}.#{key}", i18n_options(enum, options))
|
36
|
+
dict = I18n.t("enum_ish.#{@klass.name.to_s.underscore}.#{key}", **i18n_options(enum, options))
|
24
37
|
dict.map { |k, v| [k.to_s.to_sym, v.to_s] }.to_h
|
25
38
|
end
|
26
39
|
|
@@ -31,7 +44,12 @@ module EnumIsh
|
|
31
44
|
def i18n_options(enum, options)
|
32
45
|
key = i18n_key(enum, options)
|
33
46
|
opts = options[:i18n_options] || {}
|
34
|
-
opts.merge(default: [:"enum_ish.defaults.#{key}", enum.mapping.invert])
|
47
|
+
opts.merge(default: i18n_ancestors(key) + [:"enum_ish.defaults.#{key}", enum.mapping.invert])
|
48
|
+
end
|
49
|
+
|
50
|
+
def i18n_ancestors(key)
|
51
|
+
ancestors = @klass.ancestors.drop(1).select { |a| a.is_a?(Class) && !a.name.empty? }
|
52
|
+
ancestors.map { |a| :"enum_ish.#{a.name.underscore}.#{key}" }
|
35
53
|
end
|
36
54
|
|
37
55
|
def filter(translated, options)
|
data/lib/enum_ish/enum.rb
CHANGED
@@ -10,6 +10,23 @@ module EnumIsh
|
|
10
10
|
@setting = init_setting(setting)
|
11
11
|
end
|
12
12
|
|
13
|
+
def to_raw(value)
|
14
|
+
if value.is_a?(Array)
|
15
|
+
value.map { |v| @mapping.fetch(v, v) }
|
16
|
+
else
|
17
|
+
@mapping.fetch(value, value)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def to_sym(value)
|
22
|
+
inverted = @mapping.invert
|
23
|
+
if value.is_a?(Array)
|
24
|
+
value.map { |v| inverted[v] }
|
25
|
+
else
|
26
|
+
inverted[value]
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
13
30
|
private
|
14
31
|
|
15
32
|
def init_mapping(mapping)
|
data/lib/enum_ish/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: enum_ish
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yoshikazu Kaneta
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-05-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -101,9 +101,9 @@ executables: []
|
|
101
101
|
extensions: []
|
102
102
|
extra_rdoc_files: []
|
103
103
|
files:
|
104
|
+
- ".github/workflows/ci.yml"
|
104
105
|
- ".gitignore"
|
105
106
|
- ".rspec"
|
106
|
-
- ".travis.yml"
|
107
107
|
- CHANGELOG.md
|
108
108
|
- Gemfile
|
109
109
|
- LICENSE
|
@@ -114,6 +114,7 @@ files:
|
|
114
114
|
- gemfiles/rails51.gemfile
|
115
115
|
- gemfiles/rails52.gemfile
|
116
116
|
- gemfiles/rails60.gemfile
|
117
|
+
- gemfiles/rails61.gemfile
|
117
118
|
- lib/enum_ish.rb
|
118
119
|
- lib/enum_ish/active_record_definer.rb
|
119
120
|
- lib/enum_ish/active_record_enum_type.rb
|
@@ -141,7 +142,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
141
142
|
- !ruby/object:Gem::Version
|
142
143
|
version: '0'
|
143
144
|
requirements: []
|
144
|
-
rubygems_version: 3.
|
145
|
+
rubygems_version: 3.2.3
|
145
146
|
signing_key:
|
146
147
|
specification_version: 4
|
147
148
|
summary: A ruby and rails extension to generate enum-like methods
|
data/.travis.yml
DELETED
@@ -1,23 +0,0 @@
|
|
1
|
-
language: ruby
|
2
|
-
rvm:
|
3
|
-
- 2.3
|
4
|
-
- 2.4
|
5
|
-
- 2.5
|
6
|
-
- 2.6
|
7
|
-
gemfile:
|
8
|
-
- gemfiles/rails50.gemfile
|
9
|
-
- gemfiles/rails51.gemfile
|
10
|
-
- gemfiles/rails52.gemfile
|
11
|
-
- gemfiles/rails60.gemfile
|
12
|
-
matrix:
|
13
|
-
exclude:
|
14
|
-
- rvm: 2.3
|
15
|
-
gemfile: gemfiles/rails60.gemfile
|
16
|
-
- rvm: 2.4
|
17
|
-
gemfile: gemfiles/rails60.gemfile
|
18
|
-
before_script:
|
19
|
-
- cd spec/dummy
|
20
|
-
- bundle exec rake db:create db:migrate db:seed RAILS_ENV=test
|
21
|
-
- cd ../..
|
22
|
-
script:
|
23
|
-
- bundle exec rspec
|