enum_ish 1.3.0 → 1.4.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b366f9ef0d71e73ff92c214008d0459135a03cc5aa6b32d944c1bdc5c5042d8e
4
- data.tar.gz: a428a5f900c77c1caf3c6c9344cbc30e4cee6f10e99868d5b1b18d481bc5ed5c
3
+ metadata.gz: 34d21d01c11cb32143d1ce656228165fc93059f820b60f2cc109668a61e70680
4
+ data.tar.gz: a26baa4da8d0ae6e5ad1dce8cdf169f24fbe79ec8ddc88acf5fb2180db817b6f
5
5
  SHA512:
6
- metadata.gz: d0cfa988dc99c79277ae238f9235743655ec7b51e1ca6e8a3df22951b91e2091193926ca76c5e449663dc2ed64734652303dec847ee377709fba1f9f013a3efc
7
- data.tar.gz: 48b90411d86d74ef8a4c62d0676deb93d0a784376acbb5127fdfd08b9778d46cef8d8c38b85ae754e609ae496f817568d16289f759069934f8e7188a502d9663
6
+ metadata.gz: cc05a7517f723a1df0f521e031d2c171ed6a3ad0614974326c52464ce5ecf7f89b5e591f0da34a15fac70212ab44ab883f64b7dff45b67ba865c153c2ebd3dd9
7
+ data.tar.gz: 8cb363ef8d2f7988dee963d3baef608b076484afa46268f1d08a7b21fe5ef12c736d09cb05ba3e6efaa01ce8b6acbf85f0748aef6d39a407338b499aa94f22c4
@@ -0,0 +1,47 @@
1
+ name: CI
2
+
3
+ on: [push, pull_request]
4
+
5
+ jobs:
6
+ test:
7
+ runs-on: ubuntu-18.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,30 @@
1
1
  # CHANGELOG
2
2
 
3
+ ## 1.4.1
4
+
5
+ * Avoid overwrite of superclass's `_enum_ish_enums`.
6
+ * Filter ancestors for dictionary lookup.
7
+
8
+ ## 1.4.0
9
+
10
+ * Generate `not` scope for activerecord class.
11
+ * Add prefix option to define short predicate method.
12
+ * Search translation including ancestor classes.
13
+ * Support multiple arguments for scope.
14
+ * Fix predicate and validation bugs for field with `accessor: true`.
15
+
16
+ ## 1.3.3
17
+
18
+ * Support rails 6.1.
19
+
20
+ ## 1.3.2
21
+
22
+ * Fix deprecation warning for ruby 2.7.
23
+
24
+ ## 1.3.1
25
+
26
+ * Fix default value for model included ActiveModel.
27
+
3
28
  ## 1.3.0
4
29
 
5
30
  * Support array field.
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: "../"
data/lib/enum_ish.rb CHANGED
@@ -22,6 +22,15 @@ module EnumIsh
22
22
  end
23
23
 
24
24
  def self.extended(klass)
25
+ super
25
26
  klass.class_attribute :_enum_ish_enums
27
+ klass.extend ClassMethods
28
+ end
29
+
30
+ module ClassMethods
31
+ def inherited(subclass)
32
+ super
33
+ subclass._enum_ish_enums = self._enum_ish_enums.dup
34
+ end
26
35
  end
27
36
  end
@@ -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
@@ -32,13 +32,23 @@ module EnumIsh
32
32
 
33
33
  def define_predicate(enum)
34
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
35
45
  @klass.class_eval do
36
- define_method "#{enum.name}_#{enum_key}?".tr('.', '_') do
46
+ define_method method_name.tr('.', '_') do
37
47
  value = public_send(enum.name)
38
48
  if value.is_a?(Array)
39
- value == [enum_value]
49
+ value == [target_value]
40
50
  else
41
- value == enum_value
51
+ value == target_value
42
52
  end
43
53
  end
44
54
  end
@@ -49,15 +59,15 @@ module EnumIsh
49
59
  mod = Module.new
50
60
  mod.module_eval do
51
61
  define_method :initialize do |*args|
62
+ super(*args)
52
63
  if respond_to?(enum.name) && public_send(enum.name).nil?
53
64
  default = enum.setting[:default]
54
65
  default = instance_exec(&default) if default.kind_of?(Proc)
55
66
  public_send("#{enum.name}=", default)
56
67
  end
57
- super(*args)
58
68
  end
59
69
  end
60
- @klass.prepend mod
70
+ @klass.send(:include, mod)
61
71
  end
62
72
 
63
73
  def define_accessor(enum)
@@ -75,8 +85,13 @@ module EnumIsh
75
85
  end
76
86
 
77
87
  def define_validate(enum)
88
+ targets = if enum.setting[:accessor]
89
+ enum.mapping.keys
90
+ else
91
+ enum.mapping.values
92
+ end
78
93
  @klass.class_eval do
79
- validates enum.name, inclusion: { in: enum.mapping.values }, allow_nil: true
94
+ validates enum.name, inclusion: { in: targets }, allow_nil: true
80
95
  end
81
96
  end
82
97
 
@@ -2,7 +2,9 @@ module EnumIsh
2
2
  class Dictionary
3
3
  def initialize(klass, enum, options = {})
4
4
  @klass = klass
5
- @dict = load(enum, options)
5
+ @enum = enum
6
+ @options = options
7
+ @dict = load_dict
6
8
  end
7
9
 
8
10
  def translate_value(value)
@@ -11,7 +13,7 @@ module EnumIsh
11
13
  else
12
14
  @dict[value] || value
13
15
  end
14
- end
16
+ end
15
17
 
16
18
  def translate_options
17
19
  @dict.to_a.map { |value, label| [label, value] }
@@ -19,44 +21,52 @@ module EnumIsh
19
21
 
20
22
  private
21
23
 
22
- def load(enum, options)
23
- dict = translate_dict(enum, options)
24
- filter(dict, options)
25
- end
24
+ def load_dict
25
+ i18n = load_from_i18n.transform_keys { |k| k.to_s.to_sym }
26
26
 
27
- def translate_dict(enum, options)
28
- dict = load_dict(enum, options)
29
- translated = enum.mapping.map { |k, v| dict[k] ? [k, dict[k]] : [k, v.to_s] }.to_h
30
- translated = translated.map { |k, v| [enum.mapping[k], v] }.to_h unless enum.setting[:accessor]
31
- translated
32
- end
27
+ dict = {}
28
+ if @enum.setting[:accessor]
29
+ @enum.mapping.each { |k, v| dict[k] = i18n[k].to_s }
30
+ else
31
+ @enum.mapping.each { |k, v| dict[v] = i18n[k].to_s }
32
+ end
33
33
 
34
- def load_dict(enum, options)
35
- key = i18n_key(enum, options)
36
- dict = I18n.t("enum_ish.#{@klass.name.underscore}.#{key}", i18n_options(enum, options))
37
- dict.map { |k, v| [k.to_s.to_sym, v.to_s] }.to_h
34
+ filter(dict)
38
35
  end
39
36
 
40
- def i18n_key(enum, options)
41
- [enum.name, options[:format]].compact.join('/')
37
+ def load_from_i18n
38
+ key = [@enum.name, @options[:format]].compact.join('/')
39
+ options = (@options[:i18n_options] || {}).merge(default: nil)
40
+ dict = I18n.t(:"enum_ish.#{@klass.name.underscore}.#{key}", **options)
41
+ return dict if dict
42
+
43
+ i18n_ancestors.each do |ancestor|
44
+ dict = I18n.t(:"enum_ish.#{ancestor.name.underscore}.#{key}", **options)
45
+ return dict if dict
46
+ end
47
+
48
+ dict = I18n.t(:"enum_ish.defaults.#{key}", **options)
49
+ return dict if dict
50
+
51
+ @enum.mapping.invert
42
52
  end
43
53
 
44
- def i18n_options(enum, options)
45
- key = i18n_key(enum, options)
46
- opts = options[:i18n_options] || {}
47
- opts.merge(default: [:"enum_ish.defaults.#{key}", enum.mapping.invert])
54
+ def i18n_ancestors
55
+ @klass.ancestors.drop(1)
56
+ .take_while { |a| a.name != 'ActiveRecord::Base' && a.name != 'Object' }
57
+ .select { |a| a.is_a?(Class) && !a.name.empty? }
48
58
  end
49
59
 
50
- def filter(translated, options)
51
- if options[:except]
52
- except = Array(options[:except])
53
- translated.reject! { |k, v| except.include?(k) }
60
+ def filter(dict)
61
+ if @options[:except]
62
+ except = Array(@options[:except])
63
+ dict.reject! { |k, v| except.include?(k) }
54
64
  end
55
- if options[:only]
56
- only = Array(options[:only])
57
- translated.select! { |k, v| only.include?(k) }
65
+ if @options[:only]
66
+ only = Array(@options[:only])
67
+ dict.select! { |k, v| only.include?(k) }
58
68
  end
59
- translated
69
+ dict
60
70
  end
61
71
  end
62
72
  end
@@ -1,3 +1,3 @@
1
1
  module EnumIsh
2
- VERSION = '1.3.0'
2
+ VERSION = '1.4.1'
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.3.0
4
+ version: 1.4.1
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-11-23 00:00:00.000000000 Z
11
+ date: 2021-05-25 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.1.2
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