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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 58df4091edebc5965ce060bd1342f7088f4749aaa18977c76655b44fa823245d
4
- data.tar.gz: 3e97c949be6dc3a88bc03aa20fd5317e681cc68681857581bc9d24abc0fcb38c
3
+ metadata.gz: 53a6b89fe82d91b0ae54a440f3ba3a4908af751b3b22064f3ddd085257f975d9
4
+ data.tar.gz: 033b3df71e3286482f86ad0cce38084cc7c745cf13c5c06ad3cec146c3a577ac
5
5
  SHA512:
6
- metadata.gz: 2a08c825b4b4e77c904f77cf5088026d34dd66439c9553a47cce1abecc4dd7d52cc9514c3b48f9fab81d7bef4263bd0eb5e3cea34afdbbc446513e672a5f0276
7
- data.tar.gz: 62bd16fd0c155a7ca5144be68fb12d3b413996ce1a316caf70ede933842ce757d315054f47641d6a9de5b2dd1b1cc4744745c735a845c9cece3550d465e53622
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
@@ -0,0 +1,5 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem "rails", "~> 6.1.0"
4
+
5
+ gemspec path: "../"
@@ -24,7 +24,13 @@ module EnumIsh
24
24
  enum.mapping.fetch(value, value)
25
25
  end
26
26
 
27
- decorate_attribute_type(enum.name, :enum) do |subtype|
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
@@ -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
- value = public_send(enum.name)
19
- dic = Dictionary.new(self.class).load(enum, options)
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
- dic = Dictionary.new(self).load(enum, options)
29
- dic.to_a.map { |value, label| [label, value] }
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 |key, value|
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 "#{enum.name}_#{key}?".tr('.', '_') do
38
- public_send(enum.name) == value
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.prepend mod
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.mapping.invert[instance_variable_get("@#{enum.name}")]
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.mapping.fetch(value, value))
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: enum.mapping.values }, allow_nil: true
94
+ validates enum.name, inclusion: { in: targets }, allow_nil: true
76
95
  end
77
96
  end
78
97
 
@@ -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 load(enum, options = {})
8
- translated = translate(enum, options)
9
- filter(translated, options)
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 translate(enum, options)
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)
@@ -1,3 +1,3 @@
1
1
  module EnumIsh
2
- VERSION = '1.2.3'
2
+ VERSION = '1.4.0'
3
3
  end
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.2.3
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: 2019-10-05 00:00:00.000000000 Z
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.0.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