enum_ish 1.5.1 → 1.6.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/CHANGELOG.md +5 -0
- data/README.md +1 -1
- data/lib/enum_ish/active_record_definer.rb +4 -4
- data/lib/enum_ish/base.rb +3 -3
- data/lib/enum_ish/config.rb +1 -0
- data/lib/enum_ish/definer.rb +11 -26
- data/lib/enum_ish/dictionary.rb +5 -62
- data/lib/enum_ish/dictionary_cache.rb +17 -1
- data/lib/enum_ish/dictionary_lookup.rb +51 -0
- data/lib/enum_ish/enum.rb +63 -8
- data/lib/enum_ish/version.rb +1 -1
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9578ab7ba6e720321c8706fabc463af41bcd7244e24d65ff736943a197abdc9b
|
4
|
+
data.tar.gz: 69b73002c3b790e6a737db306fadfb411e418c1ed5e25faf53a96c57f9f44582
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 955eb532c9bc238d8721589240bf600412e679f97b6d0c782f2b34916db04dbd757b389f551fa32605516216a5031730ac37c9778df9ff947cd81825c74e7cf7
|
7
|
+
data.tar.gz: ba5eabfa271493a71ea0d08950b674662535df79a37386b4b59b46000e365ed95f8175946edbd2236310de21b16fb6de3af827766b61db35f3d16820e56cdaf9
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -206,7 +206,7 @@ Rails.application.config.middleware.use EnumIsh::DictionaryCache
|
|
206
206
|
```
|
207
207
|
|
208
208
|
This middleware enables dictionary cache for each request.
|
209
|
-
|
209
|
+
Performance of dictionary lookup will be improved in case one dictionary is used repeatedly in the same request.
|
210
210
|
|
211
211
|
## Contributing
|
212
212
|
|
@@ -11,7 +11,7 @@ module EnumIsh
|
|
11
11
|
after_initialize method
|
12
12
|
define_method method do
|
13
13
|
if respond_to?(enum.name) && public_send(enum.name).nil?
|
14
|
-
default = enum.
|
14
|
+
default = enum.default
|
15
15
|
default = instance_exec(&default) if default.kind_of?(Proc)
|
16
16
|
public_send("#{enum.name}=", default)
|
17
17
|
end
|
@@ -21,7 +21,7 @@ module EnumIsh
|
|
21
21
|
|
22
22
|
def define_accessor(enum)
|
23
23
|
@klass.class_eval do
|
24
|
-
define_method
|
24
|
+
define_method enum.raw_method do
|
25
25
|
value = read_attribute(enum.name)
|
26
26
|
enum.mapping.fetch(value, value)
|
27
27
|
end
|
@@ -40,10 +40,10 @@ module EnumIsh
|
|
40
40
|
|
41
41
|
def define_scope(enum)
|
42
42
|
@klass.class_eval do
|
43
|
-
scope
|
43
|
+
scope enum.scope_method, ->(*value) {
|
44
44
|
where(enum.name => enum.mapping.fetch(value, value))
|
45
45
|
}
|
46
|
-
scope
|
46
|
+
scope enum.scope_method(:negative), ->(*value) {
|
47
47
|
where.not(enum.name => enum.mapping.fetch(value, value))
|
48
48
|
}
|
49
49
|
end
|
data/lib/enum_ish/base.rb
CHANGED
@@ -14,11 +14,11 @@ module EnumIsh
|
|
14
14
|
end
|
15
15
|
|
16
16
|
class_methods do
|
17
|
-
def enum_ish(name, map,
|
18
|
-
enum = Enum.new(name, map,
|
17
|
+
def enum_ish(name, map, setting = {})
|
18
|
+
enum = Enum.new(name, map, Config.defaults.merge(setting))
|
19
19
|
self._enum_ish_enums = _enum_ish_enums.merge(name.to_sym => enum)
|
20
20
|
|
21
|
-
if defined?(ActiveRecord::Base) &&
|
21
|
+
if defined?(ActiveRecord::Base) && ancestors.include?(ActiveRecord::Base)
|
22
22
|
ActiveRecordDefiner.new(self).define(enum)
|
23
23
|
else
|
24
24
|
Definer.new(self).define(enum)
|
data/lib/enum_ish/config.rb
CHANGED
data/lib/enum_ish/definer.rb
CHANGED
@@ -7,8 +7,8 @@ module EnumIsh
|
|
7
7
|
end
|
8
8
|
|
9
9
|
def define(enum)
|
10
|
-
|
11
|
-
send("define_#{
|
10
|
+
enum.features.each do |feature|
|
11
|
+
send("define_#{feature}", enum)
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
@@ -16,7 +16,7 @@ module EnumIsh
|
|
16
16
|
|
17
17
|
def define_text(enum)
|
18
18
|
@klass.class_eval do
|
19
|
-
define_method
|
19
|
+
define_method enum.text_method do |options = {}|
|
20
20
|
dict = Dictionary.new(self.class, enum, options)
|
21
21
|
dict.translate_value(public_send(enum.name))
|
22
22
|
end
|
@@ -25,7 +25,7 @@ module EnumIsh
|
|
25
25
|
|
26
26
|
def define_options(enum)
|
27
27
|
@klass.class_eval do
|
28
|
-
define_singleton_method
|
28
|
+
define_singleton_method enum.options_method do |options = {}|
|
29
29
|
dict = Dictionary.new(self, enum, options)
|
30
30
|
dict.translate_options
|
31
31
|
end
|
@@ -33,24 +33,14 @@ module EnumIsh
|
|
33
33
|
end
|
34
34
|
|
35
35
|
def define_predicate(enum)
|
36
|
-
enum.mapping.each do |
|
37
|
-
method_name = if enum.setting[:predicate].is_a?(Hash) && enum.setting[:predicate][:prefix] == false
|
38
|
-
"#{enum_key}?"
|
39
|
-
else
|
40
|
-
"#{enum.name}_#{enum_key}?"
|
41
|
-
end
|
42
|
-
target_value = if enum.setting[:accessor]
|
43
|
-
enum_key
|
44
|
-
else
|
45
|
-
enum_value
|
46
|
-
end
|
36
|
+
enum.mapping.keys.each do |key|
|
47
37
|
@klass.class_eval do
|
48
|
-
define_method
|
38
|
+
define_method enum.predicate_method(key) do
|
49
39
|
value = public_send(enum.name)
|
50
40
|
if value.is_a?(Array)
|
51
|
-
value == [
|
41
|
+
value == [enum.value(key)]
|
52
42
|
else
|
53
|
-
value ==
|
43
|
+
value == enum.value(key)
|
54
44
|
end
|
55
45
|
end
|
56
46
|
end
|
@@ -63,7 +53,7 @@ module EnumIsh
|
|
63
53
|
define_method :initialize do |*args|
|
64
54
|
super(*args)
|
65
55
|
if respond_to?(enum.name) && public_send(enum.name).nil?
|
66
|
-
default = enum.
|
56
|
+
default = enum.default
|
67
57
|
default = instance_exec(&default) if default.kind_of?(Proc)
|
68
58
|
public_send("#{enum.name}=", default)
|
69
59
|
end
|
@@ -74,7 +64,7 @@ module EnumIsh
|
|
74
64
|
|
75
65
|
def define_accessor(enum)
|
76
66
|
@klass.class_eval do
|
77
|
-
define_method
|
67
|
+
define_method enum.raw_method do
|
78
68
|
instance_variable_get("@#{enum.name}")
|
79
69
|
end
|
80
70
|
define_method "#{enum.name}" do
|
@@ -87,13 +77,8 @@ module EnumIsh
|
|
87
77
|
end
|
88
78
|
|
89
79
|
def define_validate(enum)
|
90
|
-
targets = if enum.setting[:accessor]
|
91
|
-
enum.mapping.keys
|
92
|
-
else
|
93
|
-
enum.mapping.values
|
94
|
-
end
|
95
80
|
@klass.class_eval do
|
96
|
-
validates enum.name, inclusion: { in:
|
81
|
+
validates enum.name, inclusion: { in: enum.values }, allow_nil: true
|
97
82
|
end
|
98
83
|
end
|
99
84
|
|
data/lib/enum_ish/dictionary.rb
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require_relative 'dictionary_lookup'
|
4
|
+
|
3
5
|
module EnumIsh
|
4
6
|
class Dictionary
|
5
|
-
CACHE_KEY = :_enum_ish_dictionary_cache
|
6
|
-
|
7
7
|
def initialize(klass, enum, options = {})
|
8
8
|
@klass = klass
|
9
9
|
@enum = enum
|
10
10
|
@options = options
|
11
|
-
@dict = cache {
|
11
|
+
@dict = cache { DictionaryLookup.new(@klass, @enum, @options).call }
|
12
12
|
end
|
13
13
|
|
14
14
|
def translate_value(value)
|
@@ -20,13 +20,13 @@ module EnumIsh
|
|
20
20
|
end
|
21
21
|
|
22
22
|
def translate_options
|
23
|
-
@dict.to_a.map { |value,
|
23
|
+
@dict.to_a.map { |value, text| [text, value] }
|
24
24
|
end
|
25
25
|
|
26
26
|
private
|
27
27
|
|
28
28
|
def cache
|
29
|
-
if (cache =
|
29
|
+
if (cache = EnumIsh::DictionaryCache.cache) != nil
|
30
30
|
cache[I18n.locale] ||= {}
|
31
31
|
cache[I18n.locale][@klass] ||= {}
|
32
32
|
cache[I18n.locale][@klass][@enum] ||= {}
|
@@ -35,62 +35,5 @@ module EnumIsh
|
|
35
35
|
yield
|
36
36
|
end
|
37
37
|
end
|
38
|
-
|
39
|
-
class << self
|
40
|
-
def cache
|
41
|
-
Thread.current[CACHE_KEY] = {}
|
42
|
-
yield
|
43
|
-
ensure
|
44
|
-
Thread.current[CACHE_KEY] = nil
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
class Lookup
|
50
|
-
def initialize(klass, enum, options = {})
|
51
|
-
@klass = klass
|
52
|
-
@enum = enum
|
53
|
-
@options = options
|
54
|
-
end
|
55
|
-
|
56
|
-
def call
|
57
|
-
i18n = lookup_for(@klass).transform_keys { |k| k.to_s.to_sym }
|
58
|
-
|
59
|
-
dict = {}
|
60
|
-
if @enum.setting[:accessor]
|
61
|
-
@enum.mapping.each { |k, v| dict[k] = i18n[k].to_s }
|
62
|
-
else
|
63
|
-
@enum.mapping.each { |k, v| dict[v] = i18n[k].to_s }
|
64
|
-
end
|
65
|
-
|
66
|
-
filter(dict)
|
67
|
-
end
|
68
|
-
|
69
|
-
private
|
70
|
-
|
71
|
-
def lookup_for(klass)
|
72
|
-
key = [@enum.name, @options[:format]].compact.join('/')
|
73
|
-
options = (@options[:i18n_options] || {}).merge(default: nil)
|
74
|
-
|
75
|
-
if klass.name.to_s.in?(['ActiveRecord::Base', 'Object'])
|
76
|
-
I18n.t(:"enum_ish.defaults.#{key}", **options) || @enum.mapping.invert
|
77
|
-
elsif klass.name.blank? || !klass.is_a?(Class)
|
78
|
-
resolve(klass.superclass)
|
79
|
-
else
|
80
|
-
I18n.t(:"enum_ish.#{klass.name.underscore}.#{key}", **options) || lookup_for(klass.superclass)
|
81
|
-
end
|
82
|
-
end
|
83
|
-
|
84
|
-
def filter(dict)
|
85
|
-
if @options[:except]
|
86
|
-
except = Array(@options[:except])
|
87
|
-
dict.reject! { |k, v| except.include?(k) }
|
88
|
-
end
|
89
|
-
if @options[:only]
|
90
|
-
only = Array(@options[:only])
|
91
|
-
dict.select! { |k, v| only.include?(k) }
|
92
|
-
end
|
93
|
-
dict
|
94
|
-
end
|
95
38
|
end
|
96
39
|
end
|
@@ -7,9 +7,25 @@ module EnumIsh
|
|
7
7
|
end
|
8
8
|
|
9
9
|
def call(env)
|
10
|
-
EnumIsh::
|
10
|
+
EnumIsh::DictionaryCache.enable do
|
11
11
|
@app.call(env)
|
12
12
|
end
|
13
13
|
end
|
14
|
+
|
15
|
+
class << self
|
16
|
+
class_attribute :cache_key
|
17
|
+
self.cache_key = :_enum_ish_dictionary_cache
|
18
|
+
|
19
|
+
def cache
|
20
|
+
Thread.current[cache_key]
|
21
|
+
end
|
22
|
+
|
23
|
+
def enable
|
24
|
+
Thread.current[cache_key] = {}
|
25
|
+
yield
|
26
|
+
ensure
|
27
|
+
Thread.current[cache_key] = nil
|
28
|
+
end
|
29
|
+
end
|
14
30
|
end
|
15
31
|
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module EnumIsh
|
2
|
+
class DictionaryLookup
|
3
|
+
def initialize(klass, enum, options = {})
|
4
|
+
@klass = klass
|
5
|
+
@enum = enum
|
6
|
+
@options = options
|
7
|
+
end
|
8
|
+
|
9
|
+
def call
|
10
|
+
i18n = lookup_for(@klass).transform_keys { |k| k.to_s.to_sym }
|
11
|
+
|
12
|
+
dict = {}
|
13
|
+
if @enum.use?(:accessor)
|
14
|
+
@enum.mapping.each { |k, v| dict[k] = i18n[k] }
|
15
|
+
else
|
16
|
+
@enum.mapping.each { |k, v| dict[v] = i18n[k] }
|
17
|
+
end
|
18
|
+
|
19
|
+
filter(dict)
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def lookup_for(klass)
|
25
|
+
if klass.name.blank? || !klass.is_a?(Class)
|
26
|
+
return lookup_for(klass.superclass)
|
27
|
+
end
|
28
|
+
|
29
|
+
key = [@enum.name, @options[:format]].compact.join('/')
|
30
|
+
options = (@options[:i18n_options] || {}).merge(default: nil)
|
31
|
+
|
32
|
+
if klass.name.to_s.in?(['ActiveRecord::Base', 'Object'])
|
33
|
+
I18n.t(:"enum_ish.defaults.#{key}", **options) || @enum.mapping
|
34
|
+
else
|
35
|
+
I18n.t(:"enum_ish.#{klass.name.underscore}.#{key}", **options) || lookup_for(klass.superclass)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def filter(dict)
|
40
|
+
if @options[:except]
|
41
|
+
except = Array(@options[:except])
|
42
|
+
dict.reject! { |k, v| except.include?(k) }
|
43
|
+
end
|
44
|
+
if @options[:only]
|
45
|
+
only = Array(@options[:only])
|
46
|
+
dict.select! { |k, v| only.include?(k) }
|
47
|
+
end
|
48
|
+
dict
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
data/lib/enum_ish/enum.rb
CHANGED
@@ -2,6 +2,9 @@
|
|
2
2
|
|
3
3
|
module EnumIsh
|
4
4
|
class Enum
|
5
|
+
class_attribute :features
|
6
|
+
self.features = [:text, :options, :predicate, :default, :accessor, :validate, :scope]
|
7
|
+
|
5
8
|
attr_accessor :name
|
6
9
|
attr_accessor :mapping
|
7
10
|
attr_accessor :setting
|
@@ -9,7 +12,37 @@ module EnumIsh
|
|
9
12
|
def initialize(name, mapping, setting)
|
10
13
|
@name = name
|
11
14
|
@mapping = init_mapping(mapping)
|
12
|
-
@setting =
|
15
|
+
@setting = setting
|
16
|
+
end
|
17
|
+
|
18
|
+
features.each do |feature|
|
19
|
+
define_method feature do
|
20
|
+
setting.fetch(feature)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def use?(feature)
|
25
|
+
@setting.key?(feature)
|
26
|
+
end
|
27
|
+
|
28
|
+
def features
|
29
|
+
self.class.features.select { |feature| use?(feature) }
|
30
|
+
end
|
31
|
+
|
32
|
+
def values
|
33
|
+
if use?(:accessor)
|
34
|
+
@mapping.keys
|
35
|
+
else
|
36
|
+
@mapping.values
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def value(key)
|
41
|
+
if use?(:accessor)
|
42
|
+
key
|
43
|
+
else
|
44
|
+
@mapping[key]
|
45
|
+
end
|
13
46
|
end
|
14
47
|
|
15
48
|
def to_raw(value)
|
@@ -29,6 +62,35 @@ module EnumIsh
|
|
29
62
|
end
|
30
63
|
end
|
31
64
|
|
65
|
+
def text_method
|
66
|
+
"#{Config.text_prefix}#{@name}#{Config.text_suffix}"
|
67
|
+
end
|
68
|
+
|
69
|
+
def options_method
|
70
|
+
"#{Config.options_prefix}#{@name}#{Config.options_suffix}"
|
71
|
+
end
|
72
|
+
|
73
|
+
def predicate_method(key)
|
74
|
+
key = key.to_s.tr('.', '_')
|
75
|
+
if predicate.is_a?(Hash) && predicate[:prefix] == false
|
76
|
+
"#{key}?"
|
77
|
+
else
|
78
|
+
"#{@name}_#{key}?"
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def raw_method
|
83
|
+
"#{Config.raw_prefix}#{@name}#{Config.raw_suffix}"
|
84
|
+
end
|
85
|
+
|
86
|
+
def scope_method(type = nil)
|
87
|
+
if type == :negative
|
88
|
+
"#{Config.scope_prefix}#{@name}_not#{Config.scope_suffix}"
|
89
|
+
else
|
90
|
+
"#{Config.scope_prefix}#{@name}#{Config.scope_suffix}"
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
32
94
|
private
|
33
95
|
|
34
96
|
def init_mapping(mapping)
|
@@ -42,12 +104,5 @@ module EnumIsh
|
|
42
104
|
mapping
|
43
105
|
end
|
44
106
|
end
|
45
|
-
|
46
|
-
def init_setting(setting)
|
47
|
-
[:text, :options].each do |key|
|
48
|
-
setting[key] = true unless setting.key?(key)
|
49
|
-
end
|
50
|
-
setting
|
51
|
-
end
|
52
107
|
end
|
53
108
|
end
|
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.6.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: 2021-
|
11
|
+
date: 2021-08-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -123,6 +123,7 @@ files:
|
|
123
123
|
- lib/enum_ish/definer.rb
|
124
124
|
- lib/enum_ish/dictionary.rb
|
125
125
|
- lib/enum_ish/dictionary_cache.rb
|
126
|
+
- lib/enum_ish/dictionary_lookup.rb
|
126
127
|
- lib/enum_ish/enum.rb
|
127
128
|
- lib/enum_ish/errors.rb
|
128
129
|
- lib/enum_ish/version.rb
|
@@ -144,7 +145,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
144
145
|
- !ruby/object:Gem::Version
|
145
146
|
version: '0'
|
146
147
|
requirements: []
|
147
|
-
rubygems_version: 3.1.
|
148
|
+
rubygems_version: 3.1.6
|
148
149
|
signing_key:
|
149
150
|
specification_version: 4
|
150
151
|
summary: A ruby and rails extension to generate enum-like methods
|