enumerize 2.6.1 → 2.7.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: 07d568d0eb005ebea8b0ded7cb260d6c7792b1d676bd46f8441c7e33445e366c
4
- data.tar.gz: b811acb983e8fac641fb2b9f9340089e8fd6149b1431af7f12446cb5203c39e1
3
+ metadata.gz: a2c0c71e8e7b38b6ec3eb0e0f53429a21465bd1dcea61ea87761a497fa9f55ab
4
+ data.tar.gz: b2803acb5138d2a471ddf84cbcc8b5b3fde56507e8f6db7135ea7ea6f50f5f98
5
5
  SHA512:
6
- metadata.gz: b68609dbbc3eede78b640395ef59bf149f1bf00d7b55f2b03a1397430f4e8816bd6a19bdfe06151e28fb1a64a9595fe48893810b015899b00d4991af6539f5d7
7
- data.tar.gz: 3999ab755693815c52779ca0124f6aec629a1dd639c41d33330211b0948f6f9d4aa3d79a3f20713bb99a508afa5b7e2b776a0465fe0c3c5a3c250043bbdfc0aa
6
+ metadata.gz: 3cb1506ba0eed847bf0e8f09df719ad06f88034b3f58988046bad0f36ecbcabf8e43f8b31f2e38160f15cf0d7886667fbc36a59b91b73f85a6b09efd6d925877
7
+ data.tar.gz: 4e927b95541a1cd89584d65c7abc5bd1ab7b0fdcda8abaa7e9c53c7b0b4c0e928c5a2055e0c160ffd0e1b295f276d534909f0411c0c6ea35342ee10f2dca9380
@@ -33,6 +33,7 @@ jobs:
33
33
  fail-fast: false
34
34
  matrix:
35
35
  ruby-version: ['2.7', '3.0', '3.1']
36
+ test: ['minitest', 'rspec']
36
37
  gemfile:
37
38
  - Gemfile
38
39
  - Gemfile.rails60
@@ -58,6 +59,7 @@ jobs:
58
59
  env:
59
60
  BUNDLE_GEMFILE: "${{ matrix.gemfile }}"
60
61
  DB: "${{ matrix.db }}"
62
+ TEST_FRAMEWORK: "${{ matrix.test }}"
61
63
  steps:
62
64
  - uses: actions/checkout@v2
63
65
  - name: Set up Ruby
data/CHANGELOG.md CHANGED
@@ -1,3 +1,19 @@
1
+ ## 2.7.0 (July 7, 2023)
2
+
3
+ ### bug fix
4
+
5
+ * Warn about already defined predicate methods only when we generate predicate methods with `predicate: true` (by [@nashby](https://github.com/nashby))
6
+ * Define `Type#cast` instead of deserialize to fix serialization issue. (by [@nashby](https://github.com/nashby))
7
+ * Fix `Undefined method 'enumerize' for RSpec::ExampleGroups` (by [@softwaregravy](https://github.com/softwaregravy))
8
+
9
+ ### enchancements
10
+
11
+ * Add support for procs as `i18n_scope` option value. (by [@nashby](https://github.com/nashby))
12
+
13
+ ```ruby
14
+ enumerize :color, in: %w[green blue], i18n_scope: proc { |value| "color" }
15
+ ```
16
+
1
17
  ## 2.6.1 (March 17, 2023)
2
18
 
3
19
  ### bug fix
data/Gemfile.global CHANGED
@@ -3,7 +3,10 @@ source 'https://rubygems.org'
3
3
  gemspec
4
4
 
5
5
  gem 'rake'
6
- gem 'rspec', :require => false
6
+
7
+ if ENV['TEST_FRAMEWORK'] == 'rspec'
8
+ gem 'rspec', :require => false
9
+ end
7
10
 
8
11
  gem 'pg', '~> 1.2.3', :platform => [:ruby, :mswin, :mingw]
9
12
  gem 'sequel'
data/README.md CHANGED
@@ -161,6 +161,7 @@ class Person
161
161
 
162
162
  enumerize :status, in: %w[student employed retired], i18n_scope: "status"
163
163
  enumerize :roles, in: %w[user admin], i18n_scope: ["user.roles", "roles"]
164
+ enumerize :color, in: %w[green blue], i18n_scope: proc { |value| "color" }
164
165
  end
165
166
 
166
167
  # localization file
data/Rakefile CHANGED
@@ -4,7 +4,6 @@
4
4
  require "bundler/gem_tasks"
5
5
 
6
6
  require 'rake/testtask'
7
- require 'rspec/core/rake_task'
8
7
 
9
8
  Rake::TestTask.new do |t|
10
9
  t.libs << 'test'
@@ -12,6 +11,11 @@ Rake::TestTask.new do |t|
12
11
  t.verbose = true
13
12
  end
14
13
 
15
- RSpec::Core::RakeTask.new
14
+ if ENV['TEST_FRAMEWORK'] == 'rspec'
15
+ require 'rspec/core/rake_task'
16
+ RSpec::Core::RakeTask.new
16
17
 
17
- task :default => [:test, :spec]
18
+ task :default => [:spec]
19
+ else
20
+ task :default => [:test]
21
+ end
@@ -115,11 +115,11 @@ module Enumerize
115
115
 
116
116
  alias type_cast_for_database serialize
117
117
 
118
- def deserialize(value)
118
+ def cast(value)
119
119
  @attr.find_value(value)
120
120
  end
121
121
 
122
- alias type_cast_from_database deserialize
122
+ alias type_cast_from_database cast
123
123
 
124
124
  def as_json(options = nil)
125
125
  {attr: @attr.name}.as_json(options)
@@ -12,11 +12,7 @@ module Enumerize
12
12
 
13
13
  @klass = klass
14
14
  @name = name.to_sym
15
-
16
- if options[:i18n_scope]
17
- raise ArgumentError, ':i18n_scope option accepts only String or Array of strings' unless Array(options[:i18n_scope]).all? { |s| s.is_a?(String) }
18
- @i18n_scope = options[:i18n_scope]
19
- end
15
+ @i18n_scope = options[:i18n_scope]
20
16
 
21
17
  value_class = options.fetch(:value_class, Value)
22
18
  @values = Array(options[:in]).map { |v| value_class.new(self, *v).freeze }
@@ -69,8 +69,22 @@ module Enumerize
69
69
  end
70
70
 
71
71
  def build(klass)
72
+ warn_on_already_defined_methods
73
+
72
74
  klass.delegate(*names, to: @attr.name, prefix: @options[:prefix], allow_nil: true)
73
75
  end
76
+
77
+ def warn_on_already_defined_methods
78
+ names.each do |name|
79
+ method_name = [@options[:prefix], name].compact.join('_')
80
+
81
+ if @attr.klass.respond_to?(method_name)
82
+ warn(
83
+ "Predicate method `#{name}` is already defined as #{@attr.klass.name}##{name}. Use enumerize's :prefix option to avoid it"
84
+ )
85
+ end
86
+ end
87
+ end
74
88
  end
75
89
  end
76
90
  end
@@ -10,16 +10,16 @@ module Enumerize
10
10
  attr_reader :value
11
11
 
12
12
  def initialize(attr, name, value=nil)
13
- if self.class.method_defined?("#{name}?")
14
- warn("It's not recommended to use `#{name}` as a field value since `#{name}?` is defined. (#{attr.klass.name}##{attr.name})")
15
- end
16
-
17
13
  @attr = attr
18
14
  @value = value.nil? ? name.to_s : value
19
15
 
20
16
  super(name.to_s)
21
17
 
22
- @i18n_keys = @attr.i18n_scopes.map { |s| :"#{s}.#{self}" }
18
+ @i18n_keys = @attr.i18n_scopes.map do |s|
19
+ scope = Utils.call_if_callable(s, @value)
20
+
21
+ :"#{scope}.#{self}"
22
+ end
23
23
  @i18n_keys << :"enumerize.defaults.#{@attr.name}.#{self}"
24
24
  @i18n_keys << :"enumerize.#{@attr.name}.#{self}"
25
25
  @i18n_keys << ActiveSupport::Inflector.humanize(ActiveSupport::Inflector.underscore(self)) # humanize value if there are no translations
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Enumerize
4
- VERSION = '2.6.1'
4
+ VERSION = '2.7.0'
5
5
  end
data/lib/enumerize.rb CHANGED
@@ -82,7 +82,7 @@ module Enumerize
82
82
  end
83
83
 
84
84
  begin
85
- require 'rspec'
85
+ require 'rspec/matchers'
86
86
  rescue LoadError
87
87
  else
88
88
  require 'enumerize/integrations/rspec'
@@ -249,6 +249,15 @@ class ActiveRecordTest < MiniTest::Spec
249
249
  expect(user.interests).must_equal %w[music dancing]
250
250
  end
251
251
 
252
+ it 'has enumerized values in active record attributes after reload' do
253
+ User.delete_all
254
+ user = User.new
255
+ user.status = :blocked
256
+ user.save!
257
+ user.reload
258
+ expect(user.attributes["status"]).must_equal 'blocked'
259
+ end
260
+
252
261
  it 'validates inclusion when using write_attribute with string attribute' do
253
262
  user = User.new
254
263
  user.send(:write_attribute, 'role', 'wrong')
@@ -37,10 +37,6 @@ class AttributeTest < MiniTest::Spec
37
37
  build_attr nil, 'foo', :in => %w[a b], :i18n_scope => %w[bar buzz]
38
38
  expect(attr.i18n_scopes).must_equal %w[bar buzz]
39
39
  end
40
-
41
- it 'accepts only string scopes' do
42
- expect(proc { build_attr nil, 'foo', :in => %w[a b], :i18n_scope => [%w[bar buzz], "bar.buzz"] }).must_raise ArgumentError
43
- end
44
40
  end
45
41
 
46
42
  describe 'options for select' do
@@ -6,6 +6,8 @@ class PredicatesTest < MiniTest::Spec
6
6
  let(:kklass) do
7
7
  Class.new do
8
8
  extend Enumerize
9
+
10
+ def self.c?; end
9
11
  end
10
12
  end
11
13
 
@@ -62,4 +64,22 @@ class PredicatesTest < MiniTest::Spec
62
64
  expect(object).wont_respond_to :a?
63
65
  expect(object).must_respond_to :b?
64
66
  end
67
+
68
+ it 'warns if predicate method is already defined' do
69
+ assert_output(nil, /`c\?` is already defined/) do
70
+ kklass.enumerize(:bar, in: %w(a b c), predicates: true)
71
+ end
72
+ end
73
+
74
+ it 'does not warn if predicate has prefix and does not collide with defined method' do
75
+ assert_output(nil, '') do
76
+ kklass.enumerize(:bar, in: %w(a b c), predicates: { prefix: 'bar' })
77
+ end
78
+ end
79
+
80
+ it 'does not warn if predicate method is already defined but enumerize does not generate predicates' do
81
+ assert_output(nil, '') do
82
+ kklass.enumerize(:bar, in: %w(a b c))
83
+ end
84
+ end
65
85
  end
data/test/value_test.rb CHANGED
@@ -8,6 +8,9 @@ class ValueTest < MiniTest::Spec
8
8
  end
9
9
 
10
10
  class Attr < Struct.new(:values, :name, :i18n_scopes, :klass)
11
+ def value?(value)
12
+ values.include?(value)
13
+ end
11
14
  end
12
15
 
13
16
  let(:attr) { Attr.new([], "attribute_name", [], Model) }
@@ -84,6 +87,14 @@ class ValueTest < MiniTest::Spec
84
87
  expect(val.text).must_be :==, "Scope specific translation"
85
88
  end
86
89
  end
90
+
91
+ it 'allows to pass a proc as i18n_scopes param' do
92
+ attr.i18n_scopes = [proc { |v| "other.scope.#{v}" }]
93
+
94
+ store_translations(:en, :other => {:scope => {:"1" => {:test_value => "Scope specific translation"}}}) do
95
+ expect(val.text).must_be :==, "Scope specific translation"
96
+ end
97
+ end
87
98
  end
88
99
 
89
100
  describe 'boolean methods comparison' do
@@ -150,9 +161,5 @@ class ValueTest < MiniTest::Spec
150
161
  it 'no output if undefined boolean method' do
151
162
  assert_silent() { Enumerize::Value.new(attr, 'test_value') }
152
163
  end
153
-
154
- it 'error output if defined boolean method' do
155
- assert_output(nil, /`empty\?` is defined/) { Enumerize::Value.new(attr, 'empty') }
156
- end
157
164
  end
158
165
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: enumerize
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.6.1
4
+ version: 2.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sergey Nartimov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-03-17 00:00:00.000000000 Z
11
+ date: 2023-07-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport