enumerate_it 2.0.0 → 3.2.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: ea808ecb79d456eee5cfc618c6ee340415023e369c3cd2e454dc757b113109bb
4
- data.tar.gz: cd92b32d4dedb4b58fea015a789acec4f9a8283f61b89b18a0f871c738ff9446
3
+ metadata.gz: 71119e1fa6ccbb6d77ba404a1009c31a3174de08fb540bef2c98550bd6062a28
4
+ data.tar.gz: 4247b33c271222ca52293ae9c5ef55f8d4f9d9c8af28dfe198a23ef64ca4a6d2
5
5
  SHA512:
6
- metadata.gz: c4bf5dcd952944079438c35ac0ba80100b7283a003b6a80910965c3d9bc746645c06cf61547ebd5621a7bd4e5e295ee14d9bab8f7b63958f77abef1f11afc111
7
- data.tar.gz: 11cea26f79cb273b9f77cf800d9759067a3731e83caaeb20ac5958a824cf3f3152a71c4d438337dc41a2f61e6be2157f9b709d72debcbcb4f1a6840c85a7b73a
6
+ metadata.gz: 696c8511a033407677a8cced966bb6bac68b56e0abd0b97b2d96f2400a71165e57f5685aa288ab25a7f7938682562a24933301126197e0ec491fbcbfbe1f717a
7
+ data.tar.gz: 59ddf99c1c9358908abc21fdc7b4fcd42513c8326ffdae8f54fba0d06ae4738720ef56827e0abdfa0041cbfe2cbab870fb1950905d9b3763095d02ef5736fd1a
@@ -1,12 +1,14 @@
1
- require: rubocop-rspec
1
+ require:
2
+ - rubocop-rspec
3
+ - rubocop-rake
2
4
 
3
5
  inherit_mode:
4
6
  merge:
5
7
  - Exclude
6
8
 
7
9
  AllCops:
8
- TargetRubyVersion: 2.6
9
- DisplayCopNames: true
10
+ NewCops: enable
11
+ TargetRubyVersion: 2.5
10
12
 
11
13
  Exclude:
12
14
  - 'lib/generators/enumerate_it/enum/templates/**/*'
@@ -18,14 +20,20 @@ Gemspec/RequiredRubyVersion:
18
20
  Layout/EndAlignment:
19
21
  Enabled: false
20
22
 
21
- Metrics/LineLength:
23
+ Layout/LineLength:
22
24
  Max: 100
23
25
 
26
+ Lint/RaiseException:
27
+ Enabled: true
28
+
29
+ Lint/StructNewOverride:
30
+ Enabled: true
31
+
24
32
  Metrics/BlockLength:
25
33
  Exclude:
26
34
  - 'spec/**/*'
27
35
 
28
- Layout/AlignHash:
36
+ Layout/HashAlignment:
29
37
  EnforcedColonStyle: table
30
38
  EnforcedLastArgumentHashStyle: ignore_implicit
31
39
 
@@ -47,10 +55,22 @@ Style/Documentation:
47
55
  Style/GuardClause:
48
56
  MinBodyLength: 3
49
57
 
58
+ Style/HashEachMethods:
59
+ Enabled: true
60
+
61
+ Style/HashTransformKeys:
62
+ Enabled: true
63
+
64
+ Style/HashTransformValues:
65
+ Enabled: true
66
+
50
67
  Naming/PredicateName:
51
68
  Exclude:
52
69
  - 'lib/enumerate_it/class_methods.rb'
53
70
 
71
+ Naming/VariableNumber:
72
+ EnforcedStyle: snake_case
73
+
54
74
  RSpec/MultipleExpectations:
55
75
  Enabled: false
56
76
 
@@ -4,44 +4,20 @@ sudo: false
4
4
 
5
5
  cache: bundler
6
6
 
7
- before_install:
8
- - ruby .ci/prepare
9
-
10
7
  script:
11
- - "ruby -e \"RUBY_VERSION == '2.6.3' ? system('bundle exec rubocop') : exit(0)\""
8
+ - "ruby -e \"RUBY_VERSION == '2.7.2' ? system('bundle exec rubocop') : exit(0)\""
12
9
  - bundle exec rake spec
13
10
 
14
11
  rvm:
15
- - 2.2.10
16
- - 2.3.8
17
- - 2.4.6
18
- - 2.5.5
19
- - 2.6.3
12
+ - 2.5.8
13
+ - 2.6.6
14
+ - 2.7.2
20
15
 
21
16
  gemfile:
22
- - gemfiles/rails_4.0.gemfile
23
- - gemfiles/rails_4.1.gemfile
24
- - gemfiles/rails_4.2.gemfile
25
17
  - gemfiles/rails_5.0.gemfile
26
18
  - gemfiles/rails_5.1.gemfile
27
19
  - gemfiles/rails_5.2.gemfile
28
-
29
- matrix:
30
- exclude:
31
- # Rails 4.0 and 4.1 requires an old version of `json` gem, which isn't compatible with Ruby 2.4+
32
- # https://github.com/flori/json/issues/308
33
- - rvm: 2.4.6
34
- gemfile: gemfiles/rails_4.0.gemfile
35
- - rvm: 2.4.6
36
- gemfile: gemfiles/rails_4.1.gemfile
37
- - rvm: 2.5.5
38
- gemfile: gemfiles/rails_4.0.gemfile
39
- - rvm: 2.5.5
40
- gemfile: gemfiles/rails_4.1.gemfile
41
- - rvm: 2.6.3
42
- gemfile: gemfiles/rails_4.0.gemfile
43
- - rvm: 2.6.3
44
- gemfile: gemfiles/rails_4.1.gemfile
20
+ - gemfiles/rails_6.0.gemfile
45
21
 
46
22
  addons:
47
23
  code_climate:
data/Appraisals CHANGED
@@ -4,7 +4,7 @@ require 'json'
4
4
  rails_versions = JSON.parse(Net::HTTP.get(URI('https://rubygems.org/api/v1/versions/rails.json')))
5
5
  .group_by { |version| version['number'] }.keys.reject { |key| key =~ /rc|racecar|beta|pre/ }
6
6
 
7
- %w[4.0 4.1 4.2 5.0 5.1 5.2].each do |version|
7
+ %w[5.0 5.1 5.2 6.0].each do |version|
8
8
  appraise "rails_#{version}" do
9
9
  current_version = rails_versions
10
10
  .select { |key| key.match(/\A#{version}/) }
@@ -13,6 +13,6 @@ rails_versions = JSON.parse(Net::HTTP.get(URI('https://rubygems.org/api/v1/versi
13
13
  gem 'activesupport', "~> #{current_version}"
14
14
  gem 'activerecord', "~> #{current_version}"
15
15
 
16
- gem 'sqlite3', Gem::Version.new(version) > Gem::Version.new(5.0) ? '~> 1.4.1' : '< 1.4'
16
+ gem 'sqlite3', Gem::Version.new(version) > Gem::Version.new(5.0) ? '~> 1.4.2' : '< 1.4'
17
17
  end
18
18
  end
@@ -1,67 +1,77 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- enumerate_it (2.0.0)
5
- activesupport (>= 4.0.0)
4
+ enumerate_it (3.2.0)
5
+ activesupport (>= 5.0.7.2)
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
9
9
  specs:
10
- activesupport (5.2.3)
10
+ activesupport (6.0.3.4)
11
11
  concurrent-ruby (~> 1.0, >= 1.0.2)
12
12
  i18n (>= 0.7, < 2)
13
13
  minitest (~> 5.1)
14
14
  tzinfo (~> 1.1)
15
- appraisal (2.2.0)
15
+ zeitwerk (~> 2.2, >= 2.2.2)
16
+ appraisal (2.3.0)
16
17
  bundler
17
18
  rake
18
19
  thor (>= 0.14.0)
19
- ast (2.4.0)
20
- coderay (1.1.2)
21
- concurrent-ruby (1.1.5)
22
- diff-lcs (1.3)
23
- i18n (1.6.0)
20
+ ast (2.4.1)
21
+ coderay (1.1.3)
22
+ concurrent-ruby (1.1.7)
23
+ diff-lcs (1.4.4)
24
+ i18n (1.8.5)
24
25
  concurrent-ruby (~> 1.0)
25
- jaro_winkler (1.5.2)
26
- method_source (0.9.2)
27
- minitest (5.11.3)
28
- parallel (1.17.0)
29
- parser (2.6.3.0)
30
- ast (~> 2.4.0)
31
- pry (0.12.2)
32
- coderay (~> 1.1.0)
33
- method_source (~> 0.9.0)
26
+ method_source (1.0.0)
27
+ minitest (5.14.2)
28
+ parallel (1.20.1)
29
+ parser (2.7.2.0)
30
+ ast (~> 2.4.1)
31
+ pry (0.13.1)
32
+ coderay (~> 1.1)
33
+ method_source (~> 1.0)
34
34
  rainbow (3.0.0)
35
- rake (12.3.2)
36
- rspec (3.8.0)
37
- rspec-core (~> 3.8.0)
38
- rspec-expectations (~> 3.8.0)
39
- rspec-mocks (~> 3.8.0)
40
- rspec-core (3.8.0)
41
- rspec-support (~> 3.8.0)
42
- rspec-expectations (3.8.3)
35
+ rake (13.0.1)
36
+ regexp_parser (2.0.0)
37
+ rexml (3.2.4)
38
+ rspec (3.10.0)
39
+ rspec-core (~> 3.10.0)
40
+ rspec-expectations (~> 3.10.0)
41
+ rspec-mocks (~> 3.10.0)
42
+ rspec-core (3.10.0)
43
+ rspec-support (~> 3.10.0)
44
+ rspec-expectations (3.10.0)
43
45
  diff-lcs (>= 1.2.0, < 2.0)
44
- rspec-support (~> 3.8.0)
45
- rspec-mocks (3.8.0)
46
+ rspec-support (~> 3.10.0)
47
+ rspec-mocks (3.10.0)
46
48
  diff-lcs (>= 1.2.0, < 2.0)
47
- rspec-support (~> 3.8.0)
48
- rspec-support (3.8.0)
49
- rubocop (0.69.0)
50
- jaro_winkler (~> 1.5.1)
49
+ rspec-support (~> 3.10.0)
50
+ rspec-support (3.10.0)
51
+ rubocop (1.5.2)
51
52
  parallel (~> 1.10)
52
- parser (>= 2.6)
53
+ parser (>= 2.7.1.5)
53
54
  rainbow (>= 2.2.2, < 4.0)
55
+ regexp_parser (>= 1.8, < 3.0)
56
+ rexml
57
+ rubocop-ast (>= 1.2.0, < 2.0)
54
58
  ruby-progressbar (~> 1.7)
55
- unicode-display_width (>= 1.4.0, < 1.7)
56
- rubocop-rspec (1.33.0)
57
- rubocop (>= 0.60.0)
58
- ruby-progressbar (1.10.0)
59
- thor (0.20.3)
59
+ unicode-display_width (>= 1.4.0, < 2.0)
60
+ rubocop-ast (1.3.0)
61
+ parser (>= 2.7.1.5)
62
+ rubocop-rake (0.5.1)
63
+ rubocop
64
+ rubocop-rspec (2.0.1)
65
+ rubocop (~> 1.0)
66
+ rubocop-ast (>= 1.1.0)
67
+ ruby-progressbar (1.10.1)
68
+ thor (1.0.1)
60
69
  thread_safe (0.3.6)
61
- tzinfo (1.2.5)
70
+ tzinfo (1.2.8)
62
71
  thread_safe (~> 0.1)
63
- unicode-display_width (1.6.0)
64
- wwtd (1.3.0)
72
+ unicode-display_width (1.7.0)
73
+ wwtd (1.4.1)
74
+ zeitwerk (2.4.2)
65
75
 
66
76
  PLATFORMS
67
77
  ruby
@@ -74,8 +84,9 @@ DEPENDENCIES
74
84
  rake
75
85
  rspec
76
86
  rubocop
87
+ rubocop-rake
77
88
  rubocop-rspec
78
89
  wwtd
79
90
 
80
91
  BUNDLED WITH
81
- 2.0.1
92
+ 2.1.4
data/LICENSE CHANGED
@@ -2,7 +2,7 @@ LICENSE
2
2
 
3
3
  The MIT License
4
4
 
5
- Copyright (c) 2010-2019 Cássio Marques and Lucas Caton
5
+ Copyright (c) 2010-2020 Cássio Marques and Lucas Caton
6
6
 
7
7
  Permission is hereby granted, free of charge, to any person obtaining
8
8
  a copy of this software and associated documentation files (the
data/README.md CHANGED
@@ -391,7 +391,7 @@ Remember that you can add validations to any kind of class and not only `ActiveR
391
391
 
392
392
  ## FAQ
393
393
 
394
- #### Why to define enumerations outside the class that uses them?
394
+ #### Why define enumerations outside the class that uses them?
395
395
 
396
396
  * It's clearer.
397
397
  * You can add behaviour to the enumeration class.
@@ -403,8 +403,8 @@ You sure can! 😄
403
403
 
404
404
  #### What versions of Ruby and Rails are supported?
405
405
 
406
- * **Ruby**: `2.0+`
407
- * **Rails** `3.0+`
406
+ * **Ruby**: `2.5+`
407
+ * **Rails** `5.0+`
408
408
 
409
409
  All versions are tested via
410
410
  [Travis](https://github.com/lucascaton/enumerate_it/blob/master/.travis.yml).
@@ -528,11 +528,11 @@ Changes are maintained under [Releases page](https://github.com/lucascaton/enume
528
528
  * Fork the project.
529
529
  * Make your feature addition or bug fix.
530
530
  * Add tests for it. This is important so we don't break it in a future version unintentionally.
531
- * [Optional] Run the tests agaist a specific Gemfile: `$ bundle exec appraisal rails_5.2 rake spec`.
531
+ * [Optional] Run the tests agaist a specific Gemfile: `$ bundle exec appraisal rails_6.0 rake spec`.
532
532
  * Run the tests agaist all supported versions: `$ bundle exec rake` (or `$ bundle exec wwtd`)
533
533
  * Commit, but please do not mess with `Rakefile`, version, or history.
534
534
  * Send a Pull Request. Bonus points for topic branches.
535
535
 
536
536
  ## Copyright
537
537
 
538
- Copyright (c) 2010-2019 Cássio Marques and Lucas Caton. See `LICENSE` file for details.
538
+ Copyright (c) 2010-2020 Cássio Marques and Lucas Caton. See `LICENSE` file for details.
data/Rakefile CHANGED
@@ -1,14 +1,7 @@
1
1
  require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
2
3
 
3
- if ENV['APPRAISAL_INITIALIZED'] || ENV['TRAVIS']
4
- require 'rspec/core/rake_task'
4
+ Bundler::GemHelper.install_tasks
5
+ RSpec::Core::RakeTask.new(:spec)
5
6
 
6
- Bundler::GemHelper.install_tasks
7
- RSpec::Core::RakeTask.new(:spec)
8
-
9
- task default: :spec
10
- else
11
- require 'appraisal'
12
-
13
- task default: :appraisal
14
- end
7
+ task default: :spec
@@ -1,4 +1,5 @@
1
- require File.expand_path('lib/enumerate_it/version', __dir__)
1
+ $LOAD_PATH << File.expand_path('lib', __dir__)
2
+ require 'enumerate_it/version'
2
3
 
3
4
  Gem::Specification.new do |gem|
4
5
  gem.authors = ['Cássio Marques', 'Lucas Caton']
@@ -12,9 +13,14 @@ Gem::Specification.new do |gem|
12
13
  gem.name = 'enumerate_it'
13
14
  gem.require_paths = ['lib']
14
15
  gem.version = EnumerateIt::VERSION
15
- gem.required_ruby_version = '>= 2.2.0'
16
+ gem.required_ruby_version = '>= 2.5.8'
16
17
 
17
- gem.add_dependency 'activesupport', '>= 4.0.0'
18
+ gem.metadata = {
19
+ 'source_code_uri' => 'https://github.com/lucascaton/enumerate_it',
20
+ 'changelog_uri' => 'https://github.com/lucascaton/enumerate_it/releases'
21
+ }
22
+
23
+ gem.add_dependency 'activesupport', '>= 5.0.7.2'
18
24
 
19
25
  gem.add_development_dependency 'appraisal'
20
26
  gem.add_development_dependency 'bundler'
@@ -22,6 +28,7 @@ Gem::Specification.new do |gem|
22
28
  gem.add_development_dependency 'rake'
23
29
  gem.add_development_dependency 'rspec'
24
30
  gem.add_development_dependency 'rubocop'
31
+ gem.add_development_dependency 'rubocop-rake'
25
32
  gem.add_development_dependency 'rubocop-rspec'
26
33
  gem.add_development_dependency 'wwtd'
27
34
  end
@@ -4,6 +4,6 @@ source 'https://rubygems.org'
4
4
 
5
5
  gem 'activerecord', '~> 5.1.7'
6
6
  gem 'activesupport', '~> 5.1.7'
7
- gem 'sqlite3', '~> 1.4.1'
7
+ gem 'sqlite3', '~> 1.4.2'
8
8
 
9
9
  gemspec path: '../'
@@ -2,8 +2,8 @@
2
2
 
3
3
  source 'https://rubygems.org'
4
4
 
5
- gem 'activerecord', '~> 5.2.3'
6
- gem 'activesupport', '~> 5.2.3'
7
- gem 'sqlite3', '~> 1.4.1'
5
+ gem 'activerecord', '~> 5.2.4.4'
6
+ gem 'activesupport', '~> 5.2.4.4'
7
+ gem 'sqlite3', '~> 1.4.2'
8
8
 
9
9
  gemspec path: '../'
@@ -0,0 +1,9 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source 'https://rubygems.org'
4
+
5
+ gem 'activerecord', '~> 6.0.3.4'
6
+ gem 'activesupport', '~> 6.0.3.4'
7
+ gem 'sqlite3', '~> 1.4.2'
8
+
9
+ gemspec path: '../'
@@ -1,8 +1,14 @@
1
+ require 'forwardable'
2
+
1
3
  module EnumerateIt
2
4
  class Base
3
5
  class << self
6
+ extend Forwardable
7
+
4
8
  attr_reader :sort_mode
5
9
 
10
+ def_delegators :enumeration, :keys, :each_key
11
+
6
12
  def associate_values(*args)
7
13
  values = values_hash(args)
8
14
 
@@ -21,6 +27,10 @@ module EnumerateIt
21
27
  sorted_map.map { |_k, v| v.first }
22
28
  end
23
29
 
30
+ def to_h
31
+ sorted_map.transform_values(&:first)
32
+ end
33
+
24
34
  def enumeration
25
35
  @registered_enumerations[self]
26
36
  end
@@ -33,16 +43,16 @@ module EnumerateIt
33
43
  list.length
34
44
  end
35
45
 
36
- def each_translation
37
- each_value { |value| yield t(value) }
46
+ def each_translation(&block)
47
+ each_value { |value| block.call t(value) }
38
48
  end
39
49
 
40
50
  def translations
41
51
  list.map { |value| t(value) }
42
52
  end
43
53
 
44
- def each_value
45
- list.each { |value| yield value }
54
+ def each_value(&block)
55
+ list.each(&block)
46
56
  end
47
57
 
48
58
  def to_json(options = nil)
@@ -70,10 +80,6 @@ module EnumerateIt
70
80
  (enumeration[key.to_sym] || []).first
71
81
  end
72
82
 
73
- def keys
74
- enumeration.keys
75
- end
76
-
77
83
  def key_for(value)
78
84
  enumeration.map { |e| e[0] if e[1][0] == value }.compact.first
79
85
  end
@@ -67,6 +67,7 @@ module EnumerateIt
67
67
  klass.enumeration.each_pair do |key, values|
68
68
  define_method "#{prefix_name}#{key}!" do
69
69
  send "#{attribute_name}=", values.first
70
+ save! if respond_to?(:save!)
70
71
  end
71
72
  end
72
73
  end
@@ -1,3 +1,3 @@
1
1
  module EnumerateIt
2
- VERSION = '2.0.0'.freeze
2
+ VERSION = '3.2.0'.freeze
3
3
  end
@@ -1,4 +1,4 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
1
+ require 'spec_helper'
2
2
 
3
3
  describe EnumerateIt::Base do
4
4
  it 'creates constants for each enumeration value' do
@@ -85,6 +85,16 @@ describe EnumerateIt::Base do
85
85
  end
86
86
  end
87
87
 
88
+ describe '.each_key' do
89
+ it "yields each enumeration's key" do
90
+ keys = []
91
+ TestEnumeration.each_key do |key|
92
+ keys << key
93
+ end
94
+ expect(keys).to eq(%i[value_1 value_2 value_3])
95
+ end
96
+ end
97
+
88
98
  describe '.each_value' do
89
99
  it "yields each enumeration's value" do
90
100
  values = []
@@ -113,6 +123,12 @@ describe EnumerateIt::Base do
113
123
  end
114
124
  end
115
125
 
126
+ describe '.to_h' do
127
+ it 'returns a hash' do
128
+ expect(TestEnumerationWithoutArray.to_h).to eq(value_one: '1', value_two: '2')
129
+ end
130
+ end
131
+
116
132
  describe '.to_json' do
117
133
  it 'gives a valid json back' do
118
134
  I18n.locale = :inexsistent
@@ -246,12 +262,14 @@ describe EnumerateIt::Base do
246
262
  end
247
263
 
248
264
  context 'when included in ActiveRecord::Base' do
249
- before do
250
- class ActiveRecordStub
265
+ let(:active_record_stub_class) do
266
+ Class.new do
267
+ extend EnumerateIt
268
+
251
269
  attr_accessor :bla
252
270
 
253
271
  class << self
254
- def validates_inclusion_of(_attribute)
272
+ def validates_inclusion_of(_attribute, _options)
255
273
  true
256
274
  end
257
275
 
@@ -260,42 +278,41 @@ describe EnumerateIt::Base do
260
278
  end
261
279
  end
262
280
  end
263
-
264
- allow(ActiveRecordStub).to receive(:validates_inclusion_of).and_return(true)
265
- ActiveRecordStub.extend EnumerateIt
266
281
  end
267
282
 
268
283
  it 'creates a validation for inclusion' do
269
- expect(ActiveRecordStub)
284
+ expect(active_record_stub_class)
270
285
  .to receive(:validates_inclusion_of).with(:bla, in: TestEnumeration.list, allow_blank: true)
271
286
 
272
- class ActiveRecordStub
287
+ active_record_stub_class.class_eval do
273
288
  has_enumeration_for :bla, with: TestEnumeration
274
289
  end
275
290
  end
276
291
 
277
292
  context 'using the :required option' do
278
293
  before do
279
- allow(ActiveRecordStub).to receive(:validates_presence_of).and_return(true)
294
+ allow(active_record_stub_class).to receive(:validates_presence_of).and_return(true)
280
295
  end
281
296
 
282
297
  it 'creates a validation for presence' do
283
- expect(ActiveRecordStub).to receive(:validates_presence_of)
284
- class ActiveRecordStub
298
+ expect(active_record_stub_class).to receive(:validates_presence_of)
299
+ active_record_stub_class.class_eval do
285
300
  has_enumeration_for :bla, with: TestEnumeration, required: true
286
301
  end
287
302
  end
288
303
 
289
304
  it 'passes the given options to the validation method' do
290
- expect(ActiveRecordStub).to receive(:validates_presence_of).with(:bla, if: :some_method)
291
- class ActiveRecordStub
305
+ expect(active_record_stub_class)
306
+ .to receive(:validates_presence_of).with(:bla, if: :some_method)
307
+
308
+ active_record_stub_class.class_eval do
292
309
  has_enumeration_for :bla, with: TestEnumeration, required: { if: :some_method }
293
310
  end
294
311
  end
295
312
 
296
313
  it 'does not require the attribute by default' do
297
- expect(ActiveRecordStub).not_to receive(:validates_presence_of)
298
- class ActiveRecordStub
314
+ expect(active_record_stub_class).not_to receive(:validates_presence_of)
315
+ active_record_stub_class.class_eval do
299
316
  has_enumeration_for :bla, with: TestEnumeration
300
317
  end
301
318
  end
@@ -303,15 +320,15 @@ describe EnumerateIt::Base do
303
320
 
304
321
  context 'using :skip_validation option' do
305
322
  it "doesn't create a validation for inclusion" do
306
- expect(ActiveRecordStub).not_to receive(:validates_inclusion_of)
307
- class ActiveRecordStub
323
+ expect(active_record_stub_class).not_to receive(:validates_inclusion_of)
324
+ active_record_stub_class.class_eval do
308
325
  has_enumeration_for :bla, with: TestEnumeration, skip_validation: true
309
326
  end
310
327
  end
311
328
 
312
329
  it "doesn't create a validation for presence" do
313
- expect(ActiveRecordStub).not_to receive(:validates_presence_of)
314
- class ActiveRecordStub
330
+ expect(active_record_stub_class).not_to receive(:validates_presence_of)
331
+ active_record_stub_class.class_eval do
315
332
  has_enumeration_for :bla, with: TestEnumeration, require: true, skip_validation: true
316
333
  end
317
334
  end
@@ -1,10 +1,11 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
1
+ require 'spec_helper'
2
2
 
3
3
  describe EnumerateIt do
4
- let :target do
5
- class TestClass
4
+ let :test_class do
5
+ Class.new do
6
6
  extend EnumerateIt
7
7
  attr_accessor :foobar
8
+
8
9
  has_enumeration_for :foobar, with: TestEnumeration
9
10
 
10
11
  def initialize(foobar)
@@ -13,10 +14,10 @@ describe EnumerateIt do
13
14
 
14
15
  I18n.locale = :en
15
16
  end
16
-
17
- TestClass.new(TestEnumeration::VALUE_2)
18
17
  end
19
18
 
19
+ let(:target) { test_class.new(TestEnumeration::VALUE_2) }
20
+
20
21
  context 'associating an enumeration with a class attribute' do
21
22
  it "creates an humanized description for the attribute's value" do
22
23
  expect(target.foobar_humanize).to eq('Hey, I am 2!')
@@ -32,17 +33,12 @@ describe EnumerateIt do
32
33
  end
33
34
 
34
35
  it 'stores the enumeration class in a class-level hash' do
35
- expect(TestClass.enumerations[:foobar]).to eq(TestEnumeration)
36
+ expect(test_class.enumerations[:foobar]).to eq(TestEnumeration)
36
37
  end
37
38
 
38
39
  context 'use the same enumeration from an inherited class' do
39
- let :target do
40
- class SomeClassWithoutEnum < BaseClass
41
- end
42
-
43
- SomeClassWithoutEnum.new
44
- end
45
-
40
+ let(:some_class_without_enum) { Class.new(BaseClass) }
41
+ let(:target) { some_class_without_enum.new }
46
42
  let(:base) { BaseClass.new }
47
43
 
48
44
  it 'has use the correct class' do
@@ -52,14 +48,8 @@ describe EnumerateIt do
52
48
  end
53
49
 
54
50
  context 'declaring a simple enum on an inherited class' do
55
- let :target do
56
- class SomeClass < BaseClass
57
- has_enumeration_for :foobar
58
- end
59
-
60
- SomeClass.new
61
- end
62
-
51
+ let(:some_class) { Class.new(BaseClass) { has_enumeration_for :foobar } }
52
+ let(:target) { some_class.new }
63
53
  let(:base) { BaseClass.new }
64
54
 
65
55
  it 'has use the corret class' do
@@ -69,18 +59,21 @@ describe EnumerateIt do
69
59
  end
70
60
 
71
61
  context 'passing options values without the human string (just the value, without an array)' do
72
- let :target do
73
- class TestClassForEnumerationWithoutArray
62
+ let :test_class_for_enumeration_without_array do
63
+ Class.new do
74
64
  extend EnumerateIt
75
65
  attr_accessor :foobar
66
+
76
67
  has_enumeration_for :foobar, with: TestEnumerationWithoutArray
77
68
 
78
69
  def initialize(foobar)
79
70
  @foobar = foobar
80
71
  end
81
72
  end
73
+ end
82
74
 
83
- TestClassForEnumerationWithoutArray.new(TestEnumerationWithoutArray::VALUE_TWO)
75
+ let :target do
76
+ test_class_for_enumeration_without_array.new(TestEnumerationWithoutArray::VALUE_TWO)
84
77
  end
85
78
 
86
79
  it 'humanizes the respective hash key' do
@@ -97,37 +90,39 @@ describe EnumerateIt do
97
90
  end
98
91
 
99
92
  context 'without passing the enumeration class' do
100
- let :target do
101
- class FooBar
93
+ let :foo_bar_class do
94
+ Class.new do
102
95
  extend EnumerateIt
103
96
  attr_accessor :test_enumeration
97
+
104
98
  has_enumeration_for :test_enumeration
105
99
 
106
100
  def initialize(test_enumeration_value)
107
101
  @test_enumeration = test_enumeration_value
108
102
  end
109
103
  end
110
-
111
- FooBar.new(TestEnumeration::VALUE_1)
112
104
  end
113
105
 
106
+ let(:target) { foo_bar_class.new(TestEnumeration::VALUE_1) }
107
+
114
108
  it 'finds out which enumeration class to use' do
115
109
  expect(target.test_enumeration_humanize).to eq('Hey, I am 1!')
116
110
  end
117
111
 
118
112
  context 'when using a nested class as the enumeration' do
119
- before do
120
- class NestedEnum < EnumerateIt::Base
121
- associate_values foo: %w[1 Fooo], bar: %w[2 Barrrr]
122
- end
123
-
124
- class ClassWithNestedEnum
113
+ let :class_with_nested_enum do
114
+ Class.new do
115
+ # rubocop:disable Lint/ConstantDefinitionInBlock
116
+ # rubocop:disable RSpec/LeakyConstantDeclaration
125
117
  class NestedEnum < EnumerateIt::Base
126
118
  associate_values foo: %w[1 Blerrgh], bar: ['2' => 'Blarghhh']
127
119
  end
120
+ # rubocop:enable RSpec/LeakyConstantDeclaration
121
+ # rubocop:enable Lint/ConstantDefinitionInBlock
128
122
 
129
123
  extend EnumerateIt
130
124
  attr_accessor :nested_enum
125
+
131
126
  has_enumeration_for :nested_enum
132
127
 
133
128
  def initialize(nested_enum_value)
@@ -137,17 +132,18 @@ describe EnumerateIt do
137
132
  end
138
133
 
139
134
  it 'uses the inner class as the enumeration class' do
140
- expect(ClassWithNestedEnum.new('1').nested_enum_humanize).to eq('Blerrgh')
135
+ expect(class_with_nested_enum.new('1').nested_enum_humanize).to eq('Blerrgh')
141
136
  end
142
137
  end
143
138
  end
144
139
  end
145
140
 
146
141
  context 'using the :create_helpers option' do
147
- before do
148
- class TestClassWithHelper
142
+ let :test_class_with_helper do
143
+ Class.new do
149
144
  extend EnumerateIt
150
145
  attr_accessor :foobar
146
+
151
147
  has_enumeration_for :foobar, with: TestEnumeration, create_helpers: true
152
148
 
153
149
  def initialize(foobar)
@@ -157,60 +153,87 @@ describe EnumerateIt do
157
153
  end
158
154
 
159
155
  it 'creates helpers methods with question marks for each enumeration option' do
160
- target = TestClassWithHelper.new(TestEnumeration::VALUE_2)
156
+ target = test_class_with_helper.new(TestEnumeration::VALUE_2)
161
157
  expect(target).to be_value_2
162
158
  expect(target).not_to be_value_1
163
159
  end
164
160
 
165
161
  it 'creates a mutator method for each enumeration value' do
166
162
  %i[value_1 value_2 value_3].each do |value|
167
- expect(TestClassWithHelper.new(TestEnumeration::VALUE_1)).to respond_to(:"#{value}!")
163
+ expect(test_class_with_helper.new(TestEnumeration::VALUE_1)).to respond_to(:"#{value}!")
168
164
  end
169
165
  end
170
166
 
171
167
  it "changes the attribute's value through mutator methods" do
172
- target = TestClassWithHelper.new(TestEnumeration::VALUE_2)
168
+ target = test_class_with_helper.new(TestEnumeration::VALUE_2)
173
169
  target.value_3!
174
170
  expect(target.foobar).to eq(TestEnumeration::VALUE_3)
175
171
  end
176
172
 
173
+ context 'when class responds to save! method' do
174
+ it 'calls save!' do
175
+ target = test_class_with_helper.new(TestEnumeration::VALUE_2)
176
+ allow(target).to receive(:save!)
177
+ target.value_3!
178
+ expect(target).to have_received(:save!)
179
+ end
180
+ end
181
+
177
182
  context 'with :prefix option' do
178
- before do
179
- class TestClassWithHelper
183
+ let :test_class_with_prefixed_helper do
184
+ Class.new do
185
+ extend EnumerateIt
186
+ attr_accessor :foobar
187
+
180
188
  has_enumeration_for :foobar, with: TestEnumeration, create_helpers: { prefix: true }
189
+
190
+ def initialize(foobar)
191
+ @foobar = foobar
192
+ end
181
193
  end
182
194
  end
183
195
 
184
196
  it 'creates helpers methods with question marks and prefixes for each enumeration option' do
185
- target = TestClassWithHelper.new(TestEnumeration::VALUE_2)
197
+ target = test_class_with_prefixed_helper.new(TestEnumeration::VALUE_2)
186
198
  expect(target).to be_foobar_value_2
187
199
  end
188
200
 
189
201
  it 'creates a mutator method for each enumeration value' do
190
202
  %i[value_1 value_2 value_3].each do |value|
191
- expect(TestClassWithHelper.new(TestEnumeration::VALUE_1))
203
+ expect(test_class_with_prefixed_helper.new(TestEnumeration::VALUE_1))
192
204
  .to respond_to(:"foobar_#{value}!")
193
205
  end
194
206
  end
195
207
 
196
208
  it "changes the attribute's value through mutator methods" do
197
- target = TestClassWithHelper.new(TestEnumeration::VALUE_2)
209
+ target = test_class_with_prefixed_helper.new(TestEnumeration::VALUE_2)
198
210
  target.foobar_value_3!
199
211
  expect(target.foobar).to eq(TestEnumeration::VALUE_3)
200
212
  end
213
+
214
+ context 'when class responds to save! method' do
215
+ it 'calls save!' do
216
+ target = test_class_with_prefixed_helper.new(TestEnumeration::VALUE_2)
217
+ allow(target).to receive(:save!)
218
+ target.foobar_value_3!
219
+ expect(target).to have_received(:save!)
220
+ end
221
+ end
201
222
  end
202
223
 
203
224
  context 'with :polymorphic option' do
204
- before do
205
- class Polymorphic
225
+ let :polymorphic_class do
226
+ Class.new do
206
227
  extend EnumerateIt
207
228
  attr_accessor :foo
229
+
208
230
  has_enumeration_for :foo, with: PolymorphicEnum, create_helpers: { polymorphic: true }
209
231
  end
210
232
  end
211
233
 
234
+ let(:target) { polymorphic_class.new }
235
+
212
236
  it "calls methods on the enum constants' objects" do
213
- target = Polymorphic.new
214
237
  target.foo = PolymorphicEnum::NORMAL
215
238
 
216
239
  expect(target.foo_object.print('Gol')).to eq("I'm Normal: Gol")
@@ -221,21 +244,23 @@ describe EnumerateIt do
221
244
  end
222
245
 
223
246
  it 'returns nil if foo is not set' do
224
- target = Polymorphic.new
225
-
226
247
  expect(target.foo_object).to be_nil
227
248
  end
228
249
 
229
250
  context 'and :suffix' do
230
- before do
231
- class Polymorphic
251
+ let :polymorphic_class_with_suffix do
252
+ Class.new do
253
+ extend EnumerateIt
254
+ attr_accessor :foo
255
+
232
256
  has_enumeration_for :foo, with: PolymorphicEnum,
233
257
  create_helpers: { polymorphic: { suffix: '_strategy' } }
234
258
  end
235
259
  end
236
260
 
261
+ let(:target) { polymorphic_class_with_suffix.new }
262
+
237
263
  it "calls methods on the enum constants' objects" do
238
- target = Polymorphic.new
239
264
  target.foo = PolymorphicEnum::NORMAL
240
265
 
241
266
  expect(target.foo_strategy.print('Gol')).to eq("I'm Normal: Gol")
@@ -250,17 +275,16 @@ describe EnumerateIt do
250
275
 
251
276
  describe 'using the :create_scopes option' do
252
277
  context 'if the hosting class responds to :scope' do
253
- before do
254
- Object.send :remove_const, 'TestClassWithScope' if defined?(TestClassWithScope)
255
-
256
- class TestClassWithScope < ActiveRecord::Base
278
+ let :test_class_with_scope do
279
+ Class.new(ActiveRecord::Base) do
280
+ self.table_name = 'test_class_with_scopes'
257
281
  has_enumeration_for :foobar, with: TestEnumeration, create_scopes: true
258
282
  end
259
283
  end
260
284
 
261
285
  it 'creates a scope for each enumeration value' do
262
286
  TestEnumeration.enumeration.each_key do |symbol|
263
- expect(TestClassWithScope).to respond_to(symbol)
287
+ expect(test_class_with_scope).to respond_to(symbol)
264
288
  end
265
289
  end
266
290
 
@@ -268,29 +292,25 @@ describe EnumerateIt do
268
292
  ActiveRecord::Schema.define { create_table :test_class_with_scopes }
269
293
 
270
294
  TestEnumeration.enumeration.each do |symbol, pair|
271
- expect(TestClassWithScope.public_send(symbol).to_sql)
272
- .to match(/WHERE "test_class_with_scopes"."foobar" = \'#{pair.first}\'/)
295
+ expect(test_class_with_scope.public_send(symbol).to_sql)
296
+ .to match(/WHERE "test_class_with_scopes"."foobar" = '#{pair.first}'/)
273
297
  end
274
298
  end
275
299
  end
276
300
 
277
301
  context 'when the hosting class does not respond to :scope' do
278
- before do
279
- class GenericClass
280
- extend EnumerateIt
281
- end
282
- end
302
+ let(:generic_class) { Class.new { extend EnumerateIt } }
283
303
 
284
304
  it 'raises no errors' do
285
305
  expect do
286
- GenericClass.has_enumeration_for(:foobar, with: TestEnumeration, create_scopes: true)
306
+ generic_class.has_enumeration_for(:foobar, with: TestEnumeration, create_scopes: true)
287
307
  end.not_to raise_error
288
308
  end
289
309
  end
290
310
 
291
311
  context 'with :prefix option' do
292
- before do
293
- class OtherTestClass < ActiveRecord::Base
312
+ let :other_test_class do
313
+ Class.new(ActiveRecord::Base) do
294
314
  has_enumeration_for :foobar, with: TestEnumerationWithReservedWords,
295
315
  create_scopes: { prefix: true }
296
316
  end
@@ -298,7 +318,7 @@ describe EnumerateIt do
298
318
 
299
319
  it 'creates a scope with prefix for each enumeration value' do
300
320
  TestEnumerationWithReservedWords.enumeration.each_key do |symbol|
301
- expect(OtherTestClass).to respond_to(:"foobar_#{symbol}")
321
+ expect(other_test_class).to respond_to(:"foobar_#{symbol}")
302
322
  end
303
323
  end
304
324
  end
@@ -5,7 +5,7 @@ require 'enumerate_it'
5
5
  require 'active_support/all'
6
6
  require 'active_record'
7
7
 
8
- Dir['./spec/support/**/*.rb'].each { |f| require f }
8
+ Dir['./spec/support/**/*.rb'].sort.each { |f| require f }
9
9
 
10
10
  I18n.config.enforce_available_locales = false
11
11
  I18n.load_path = Dir['spec/i18n/*.yml']
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: enumerate_it
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 3.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Cássio Marques
8
8
  - Lucas Caton
9
- autorequire:
9
+ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2019-05-22 00:00:00.000000000 Z
12
+ date: 2020-12-07 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
@@ -17,14 +17,14 @@ dependencies:
17
17
  requirements:
18
18
  - - ">="
19
19
  - !ruby/object:Gem::Version
20
- version: 4.0.0
20
+ version: 5.0.7.2
21
21
  type: :runtime
22
22
  prerelease: false
23
23
  version_requirements: !ruby/object:Gem::Requirement
24
24
  requirements:
25
25
  - - ">="
26
26
  - !ruby/object:Gem::Version
27
- version: 4.0.0
27
+ version: 5.0.7.2
28
28
  - !ruby/object:Gem::Dependency
29
29
  name: appraisal
30
30
  requirement: !ruby/object:Gem::Requirement
@@ -109,6 +109,20 @@ dependencies:
109
109
  - - ">="
110
110
  - !ruby/object:Gem::Version
111
111
  version: '0'
112
+ - !ruby/object:Gem::Dependency
113
+ name: rubocop-rake
114
+ requirement: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - ">="
117
+ - !ruby/object:Gem::Version
118
+ version: '0'
119
+ type: :development
120
+ prerelease: false
121
+ version_requirements: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - ">="
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
112
126
  - !ruby/object:Gem::Dependency
113
127
  name: rubocop-rspec
114
128
  requirement: !ruby/object:Gem::Requirement
@@ -138,12 +152,11 @@ dependencies:
138
152
  - !ruby/object:Gem::Version
139
153
  version: '0'
140
154
  description: Enumerations for Ruby with some magic powers!
141
- email:
155
+ email:
142
156
  executables: []
143
157
  extensions: []
144
158
  extra_rdoc_files: []
145
159
  files:
146
- - ".ci/prepare"
147
160
  - ".gitignore"
148
161
  - ".rspec"
149
162
  - ".rubocop.yml"
@@ -156,12 +169,10 @@ files:
156
169
  - README.md
157
170
  - Rakefile
158
171
  - enumerate_it.gemspec
159
- - gemfiles/rails_4.0.gemfile
160
- - gemfiles/rails_4.1.gemfile
161
- - gemfiles/rails_4.2.gemfile
162
172
  - gemfiles/rails_5.0.gemfile
163
173
  - gemfiles/rails_5.1.gemfile
164
174
  - gemfiles/rails_5.2.gemfile
175
+ - gemfiles/rails_6.0.gemfile
165
176
  - lib/enumerate_it.rb
166
177
  - lib/enumerate_it/base.rb
167
178
  - lib/enumerate_it/class_methods.rb
@@ -179,8 +190,10 @@ files:
179
190
  homepage: https://github.com/lucascaton/enumerate_it
180
191
  licenses:
181
192
  - MIT
182
- metadata: {}
183
- post_install_message:
193
+ metadata:
194
+ source_code_uri: https://github.com/lucascaton/enumerate_it
195
+ changelog_uri: https://github.com/lucascaton/enumerate_it/releases
196
+ post_install_message:
184
197
  rdoc_options: []
185
198
  require_paths:
186
199
  - lib
@@ -188,15 +201,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
188
201
  requirements:
189
202
  - - ">="
190
203
  - !ruby/object:Gem::Version
191
- version: 2.2.0
204
+ version: 2.5.8
192
205
  required_rubygems_version: !ruby/object:Gem::Requirement
193
206
  requirements:
194
207
  - - ">="
195
208
  - !ruby/object:Gem::Version
196
209
  version: '0'
197
210
  requirements: []
198
- rubygems_version: 3.0.3
199
- signing_key:
211
+ rubygems_version: 3.1.4
212
+ signing_key:
200
213
  specification_version: 4
201
214
  summary: Ruby Enumerations
202
215
  test_files:
@@ -1,7 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- RUBY_GEMS_VERSION = RUBY_VERSION >= '2.6.0' ? '' : '2.7.8'
4
- BUNDLER_VERSION = RUBY_VERSION >= '2.6.0' ? '>= 2' : '> 2'
5
-
6
- system("gem update --system '#{RUBY_GEMS_VERSION}'")
7
- system("gem install bundler -v '#{BUNDLER_VERSION}'")
@@ -1,9 +0,0 @@
1
- # This file was generated by Appraisal
2
-
3
- source 'https://rubygems.org'
4
-
5
- gem 'activerecord', '~> 4.0.13'
6
- gem 'activesupport', '~> 4.0.13'
7
- gem 'sqlite3', '< 1.4'
8
-
9
- gemspec path: '../'
@@ -1,9 +0,0 @@
1
- # This file was generated by Appraisal
2
-
3
- source 'https://rubygems.org'
4
-
5
- gem 'activerecord', '~> 4.1.16'
6
- gem 'activesupport', '~> 4.1.16'
7
- gem 'sqlite3', '< 1.4'
8
-
9
- gemspec path: '../'
@@ -1,9 +0,0 @@
1
- # This file was generated by Appraisal
2
-
3
- source 'https://rubygems.org'
4
-
5
- gem 'activerecord', '~> 4.2.11.1'
6
- gem 'activesupport', '~> 4.2.11.1'
7
- gem 'sqlite3', '< 1.4'
8
-
9
- gemspec path: '../'