enum_ish 1.2.3 → 1.4.0

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: 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