active_enum 1.0.0.rc2 → 1.0.0.rc7

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: e0463e9528b9a2ec019caf593cfc2becaa1767a116d4657d93de5462c8fb5475
4
- data.tar.gz: 2cd9be66544fa2bd00cf2ace406c4c5010411f02d53f1c926d0f197609e89993
3
+ metadata.gz: 5c79754f5d68c12d7955e1a77e870612ffb1fdb62cc65681e50efc137da125ba
4
+ data.tar.gz: e0604ad18f10935d8111491b18481e3b273b7d6d064c0284c41c02836cadff3c
5
5
  SHA512:
6
- metadata.gz: efd7a02386a9e3a6a45812b35e8c509ac60d47249238bee485b00fc8d0a1598ed8a0ae5319e02d76f59ca06ccce5e22dfd25ad0b217ee29f7471510a8deeb15c
7
- data.tar.gz: d69b2b354382981ba79af48b3d0306839a1f218d7e7bf01136a2021fdc7026a4b0eedfc40e00e5d63c24deaf2eccf00b5727083a8a2023947a29a00ed579a5ec
6
+ metadata.gz: '07383e22c02937744c155c72e0c35333c03169f7f3807dfd54765f490a225035ecd24017664fe7b1274c134422e164b12d4fc1a18f57b227f649b93bb166c3b2'
7
+ data.tar.gz: 8bd02a86d9a478ec1bf1cbdf76f28fa6d673b00c61f2edddf6a9c3d90782a33986087ff8a3cf789ab439ab58b60227f3f7c36c4ab5ab097ee6b6430bff119119
@@ -1,8 +1,8 @@
1
- env:
2
- - "RAILS_VERSION=3.1.0"
3
- - "RAILS_VERSION=3.2.0"
4
- - "RAILS_VERSION=4.0.0"
5
- - "RAILS_VERSION=master"
1
+ gemfile:
2
+ - gemfiles/rails_4_2.gemfile
3
+ - gemfiles/rails_5_0.gemfile
4
+ - gemfiles/rails_5_1.gemfile
5
+ - gemfiles/rails_5_2.gemfile
6
6
  rvm:
7
- - 1.9.3
8
- - 2.0.0
7
+ - 2.5.8
8
+ - 2.6.6
@@ -15,7 +15,7 @@ From gem version 1.0 onwards this plugin will only have Rails 4+ support. If you
15
15
 
16
16
  Put this in your Gemfile
17
17
 
18
- gem 'active_enum', '~> 1.0.0.pre'
18
+ gem 'active_enum', '~> 1.0.0.rc4'
19
19
 
20
20
  Then generate the config initializer file
21
21
 
data/Rakefile CHANGED
@@ -24,8 +24,3 @@ end
24
24
 
25
25
  desc 'Default: run specs.'
26
26
  task :default => :spec
27
-
28
- task :all do
29
- sh "export FORMTASTIC=2.0 && bundle install && bundle exec rake"
30
- sh "export FORMTASTIC=1.2 && bundle install && bundle exec rake"
31
- end
@@ -0,0 +1,16 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "http://rubygems.org"
4
+
5
+ gem "rails", "~> 4.2.11"
6
+
7
+ gem 'sqlite3', '~> 1.3.0'
8
+
9
+ gem 'rake'
10
+ gem 'simple_form', '~> 3.0'
11
+ gem 'byebug'
12
+ gem 'rspec', '~> 3.4'
13
+ gem 'rspec-rails', '~> 3.4'
14
+ gem 'capybara'
15
+
16
+ gemspec path: "../"
@@ -0,0 +1,16 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "http://rubygems.org"
4
+
5
+ gem "rails", "~> 5.1.0"
6
+
7
+ gem 'sqlite3', '~> 1.3.0'
8
+
9
+ gem 'rake'
10
+ gem 'simple_form', '~> 5.0'
11
+ gem 'byebug'
12
+ gem 'rspec', '~> 3.4'
13
+ gem 'rspec-rails', '~> 3.4'
14
+ gem 'capybara'
15
+
16
+ gemspec path: "../"
@@ -0,0 +1,16 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "http://rubygems.org"
4
+
5
+ gem "rails", "~> 5.1.0"
6
+
7
+ gem 'sqlite3', '~> 1.3.0'
8
+
9
+ gem 'rake'
10
+ gem 'simple_form', '~> 5.0'
11
+ gem 'byebug'
12
+ gem 'rspec', '~> 3.4'
13
+ gem 'rspec-rails', '~> 3.4'
14
+ gem 'capybara'
15
+
16
+ gemspec path: "../"
@@ -0,0 +1,16 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "http://rubygems.org"
4
+
5
+ gem "rails", "~> 5.2.0"
6
+
7
+ gem 'sqlite3', '~> 1.3.0'
8
+
9
+ gem 'rake'
10
+ gem 'simple_form', '~> 5.0'
11
+ gem 'byebug'
12
+ gem 'rspec', '~> 3.4'
13
+ gem 'rspec-rails', '~> 3.4'
14
+ gem 'capybara'
15
+
16
+ gemspec path: "../"
@@ -7,15 +7,19 @@ module ActiveEnum
7
7
  extend ClassMethods
8
8
  class_attribute :active_enum_options
9
9
  self.active_enum_options = options.reverse_merge(:name_column => 'name')
10
- scope :enum_values, proc { select("#{primary_key}, #{active_enum_options[:name_column]}").
10
+ scope :enum_values, proc { select(Arel.sql("#{primary_key}, #{active_enum_options[:name_column]}")).
11
11
  where(active_enum_options[:conditions]).
12
- order("#{primary_key} #{active_enum_options[:order]}") }
12
+ order(Arel.sql("#{primary_key} #{active_enum_options[:order]}")) }
13
13
  end
14
14
 
15
15
  end
16
16
 
17
17
  module ClassMethods
18
18
 
19
+ def values
20
+ enum_values.map { |v| [ v.id, v.send(active_enum_options[:name_column]) ] }
21
+ end
22
+
19
23
  def ids
20
24
  enum_values.map { |v| v.id }
21
25
  end
@@ -42,6 +46,8 @@ module ActiveEnum
42
46
 
43
47
  # Enables use as a delimiter in inclusion validation
44
48
  def include?(value)
49
+ return super if value.is_a?(Module)
50
+
45
51
  !self[value].nil?
46
52
  end
47
53
 
@@ -57,7 +63,7 @@ module ActiveEnum
57
63
  if index.is_a?(Integer)
58
64
  enum_values.where(id: index)
59
65
  else
60
- enum_values.where("#{active_enum_options[:name_column]} like lower(?)", index.to_s)
66
+ enum_values.where("lower(#{active_enum_options[:name_column]}) = lower(?)", Arel.sql(index.to_s))
61
67
  end
62
68
  end
63
69
  end
@@ -34,9 +34,11 @@ module ActiveEnum
34
34
  @order = order
35
35
  end
36
36
 
37
- def all
37
+ # Array of arrays of stored values defined id, name, meta values hash
38
+ def values
38
39
  store.values
39
40
  end
41
+ alias_method :all, :values
40
42
 
41
43
  def each(&block)
42
44
  all.each(&block)
@@ -54,7 +56,14 @@ module ActiveEnum
54
56
 
55
57
  # Return enum values in an array suitable to pass to a Rails form select helper.
56
58
  def to_select
57
- store.values.map { |v| [v[1], v[0]] }
59
+ store.values.map { |v| [v[1].html_safe, v[0]] }
60
+ end
61
+
62
+ # Return enum values in a nested array suitable to pass to a Rails form grouped select helper.
63
+ def to_grouped_select(group_by)
64
+ store.values.group_by { |(_id, _name, meta)| (meta || {})[group_by] }.map { |group, collection|
65
+ [ group, collection.map { |(id, name, _meta)| [ name.html_safe, id ] } ]
66
+ }
58
67
  end
59
68
 
60
69
  # Access id or name value. Pass an id number to retrieve the name or
@@ -110,9 +110,9 @@ module ActiveEnum
110
110
  class_eval <<-DEF
111
111
  def #{attribute}=(arg)
112
112
  if arg.is_a?(Symbol)
113
- super self.class.active_enum_for(:#{attribute})[arg]
113
+ super(self.class.active_enum_for(:#{attribute})[arg])
114
114
  else
115
- super arg
115
+ super
116
116
  end
117
117
  end
118
118
  DEF
@@ -127,7 +127,7 @@ module ActiveEnum
127
127
  class_eval <<-DEF
128
128
  def #{attribute}?(arg=nil)
129
129
  if arg
130
- self.#{attribute}(:id) == self.class.active_enum_for(:#{attribute})[arg]
130
+ self.#{attribute}(:id).present? && self.#{attribute}(:id) == self.class.active_enum_for(:#{attribute})[arg]
131
131
  else
132
132
  super()
133
133
  end
@@ -23,9 +23,21 @@ class ActiveEnum::FormHelpers::SimpleForm::EnumInput < ::SimpleForm::Inputs::Col
23
23
  end
24
24
  end
25
25
 
26
+ class ActiveEnum::FormHelpers::SimpleForm::GroupedEnumInput < ::SimpleForm::Inputs::GroupedCollectionSelectInput
27
+ def initialize(*args)
28
+ super
29
+ raise "Attribute '#{attribute_name}' has no enum class" unless enum = object.class.active_enum_for(attribute_name)
30
+
31
+ input_options[:collection] = enum.to_grouped_select(input_options[:group_by])
32
+ input_options[:group_method] = :last
33
+ end
34
+ end
35
+
26
36
  SimpleForm::FormBuilder.class_eval do
27
37
  prepend ActiveEnum::FormHelpers::SimpleForm::BuilderExtension
28
38
 
29
- map_type :enum, :to => ActiveEnum::FormHelpers::SimpleForm::EnumInput
39
+ map_type :enum, to: ActiveEnum::FormHelpers::SimpleForm::EnumInput
40
+ map_type :grouped_enum, to: ActiveEnum::FormHelpers::SimpleForm::GroupedEnumInput
41
+
30
42
  alias_method :collection_enum, :collection_select
31
43
  end
@@ -1,3 +1,3 @@
1
1
  module ActiveEnum
2
- VERSION = '1.0.0.rc2'
2
+ VERSION = '1.0.0.rc7'
3
3
  end
@@ -45,6 +45,12 @@ describe ActiveEnum::ActsAsEnum do
45
45
  end
46
46
  end
47
47
 
48
+ context '#values' do
49
+ it "should return array of arrays containing id and name column values" do
50
+ expect(Person.values).to eq([[1, 'Dave'], [2, 'John']])
51
+ end
52
+ end
53
+
48
54
  context '#to_select' do
49
55
  it "should return array for select helpers" do
50
56
  expect(Person.to_select).to eq([['Dave', 1], ['John', 2]])
@@ -60,4 +66,22 @@ describe ActiveEnum::ActsAsEnum do
60
66
  expect(Person.meta(1)).to eq(Person.find(1).attributes.except('id', 'first_name'))
61
67
  end
62
68
  end
69
+
70
+ context '#include?' do
71
+ it "should return true if value is integer and model has id" do
72
+ expect(Person.exists?(id: 1)).to eq(true)
73
+ expect(Person.include?(1)).to eq(true)
74
+ end
75
+
76
+ it "should return false if value is integer and model does not have id" do
77
+ expect(Person.exists?(id: 100)).to eq(false)
78
+ expect(Person.include?(100)).to eq(false)
79
+ end
80
+
81
+ it "should return super if value is a module" do
82
+ expect(Person.include?(ActiveRecord::Attributes)).to eq(true)
83
+
84
+ expect(Person.include?(Module.new)).to eq(false)
85
+ end
86
+ end
63
87
  end
@@ -24,9 +24,9 @@ describe ActiveEnum::Base do
24
24
  end
25
25
  end
26
26
 
27
- describe ".all" do
27
+ describe ".values" do
28
28
  it 'should return an empty array when no values defined' do
29
- expect(define_enum.all).to eq([])
29
+ expect(define_enum.values).to eq([])
30
30
  end
31
31
 
32
32
  it 'should return an array of arrays with all values defined as [id, name]' do
@@ -34,7 +34,7 @@ describe ActiveEnum::Base do
34
34
  value :name => 'Name 1'
35
35
  value :name => 'Name 2'
36
36
  end
37
- expect(enum.all).to eq([[1,'Name 1'], [2, 'Name 2']])
37
+ expect(enum.values).to eq([[1,'Name 1'], [2, 'Name 2']])
38
38
  end
39
39
  end
40
40
 
@@ -43,28 +43,28 @@ describe ActiveEnum::Base do
43
43
  enum = define_enum do
44
44
  value :id => 1, :name => 'Name'
45
45
  end
46
- expect(enum.all).to eq([[1,'Name']])
46
+ expect(enum.values).to eq([[1,'Name']])
47
47
  end
48
48
 
49
49
  it 'should allow me to define a value with a name only' do
50
50
  enum = define_enum do
51
51
  value :name => 'Name'
52
52
  end
53
- expect(enum.all).to eq([[1,'Name']])
53
+ expect(enum.values).to eq([[1,'Name']])
54
54
  end
55
55
 
56
56
  it 'should allow me to define a value as hash with id as key and name as value' do
57
57
  enum = define_enum do
58
58
  value 1 => 'Name'
59
59
  end
60
- expect(enum.all).to eq([[1,'Name']])
60
+ expect(enum.values).to eq([[1,'Name']])
61
61
  end
62
62
 
63
63
  it 'should allow to define meta data value with extra key value pairs' do
64
64
  enum = define_enum do
65
65
  value :id => 1, :name => 'Name', :description => 'extra'
66
66
  end
67
- expect(enum.all).to eq([[1,'Name',{:description => 'extra'}]])
67
+ expect(enum.values).to eq([[1,'Name',{:description => 'extra'}]])
68
68
  end
69
69
 
70
70
  it 'should increment value ids when defined without ids' do
@@ -72,7 +72,7 @@ describe ActiveEnum::Base do
72
72
  value :name => 'Name 1'
73
73
  value :name => 'Name 2'
74
74
  end
75
- expect(enum.all).to eq([[1,'Name 1'], [2, 'Name 2']])
75
+ expect(enum.values).to eq([[1,'Name 1'], [2, 'Name 2']])
76
76
  end
77
77
 
78
78
  it 'should raise error if the id is a duplicate' do
@@ -117,7 +117,7 @@ describe ActiveEnum::Base do
117
117
  value :id => 2, :name => 'Name 2'
118
118
  value :id => 1, :name => 'Name 1'
119
119
  end
120
- expect(enum.all).to eq([[1,'Name 1'], [2, 'Name 2']])
120
+ expect(enum.values).to eq([[1,'Name 1'], [2, 'Name 2']])
121
121
  end
122
122
 
123
123
  it 'should return sorted values by id using order setting' do
@@ -126,7 +126,7 @@ describe ActiveEnum::Base do
126
126
  value :id => 1, :name => 'Name 1'
127
127
  value :id => 2, :name => 'Name 2'
128
128
  end
129
- expect(enum.all).to eq([[2, 'Name 2'], [1,'Name 1']])
129
+ expect(enum.values).to eq([[2, 'Name 2'], [1,'Name 1']])
130
130
  end
131
131
 
132
132
  it 'should return sorted values by id using order setting' do
@@ -136,7 +136,7 @@ describe ActiveEnum::Base do
136
136
  value :id => 1, :name => 'Name 1'
137
137
  value :id => 2, :name => 'Name 2'
138
138
  end
139
- expect(enum.all).to eq([[3,'Name 3'], [1,'Name 1'], [2, 'Name 2']])
139
+ expect(enum.values).to eq([[3,'Name 3'], [1,'Name 1'], [2, 'Name 2']])
140
140
  end
141
141
  end
142
142
 
@@ -248,6 +248,32 @@ describe ActiveEnum::Base do
248
248
  end
249
249
  end
250
250
 
251
+ describe ".to_grouped_select" do
252
+ it 'should return array for grouped select helpers grouped by meta key value' do
253
+ enum = define_enum do
254
+ value :id => 1, :name => 'Name 1', :category => 'Foo'
255
+ value :id => 2, :name => 'Name 2', :category => 'Bar'
256
+ end
257
+
258
+ expect(enum.to_grouped_select(:category)).to eq([
259
+ [ 'Foo', [ ['Name 1',1] ] ],
260
+ [ 'Bar', [ ['Name 2',2] ] ]
261
+ ])
262
+ end
263
+
264
+ it 'should group any value missing the group_by key by nil' do
265
+ enum = define_enum do
266
+ value :id => 1, :name => 'Name 1', :category => 'Foo'
267
+ value :id => 2, :name => 'Name 2'
268
+ end
269
+
270
+ expect(enum.to_grouped_select(:category)).to eq([
271
+ [ 'Foo', [ ['Name 1',1] ] ],
272
+ [ nil, [ ['Name 2',2] ] ]
273
+ ])
274
+ end
275
+ end
276
+
251
277
  def define_enum(&block)
252
278
  Class.new(ActiveEnum::Base, &block)
253
279
  end
@@ -176,6 +176,11 @@ describe ActiveEnum::Extensions do
176
176
  expect(person.sex?(:female)).to be_falsey
177
177
  expect(person.sex?(:Female)).to be_falsey
178
178
  end
179
+
180
+ it 'should return false if attribute is nil regardless of enum value' do
181
+ person.sex = nil
182
+ expect(person.sex?(:nonexistent)).to be_falsey
183
+ end
179
184
  end
180
185
 
181
186
  context "with value as enum name symbol" do
@@ -13,6 +13,16 @@ describe ActiveEnum::FormHelpers::SimpleForm, :type => :helper do
13
13
  value :id => 1, :name => 'Male'
14
14
  value :id => 2, :name => 'Female'
15
15
  end
16
+
17
+ enumerate :employment_status do
18
+ value :id => 1, :name => 'Full-time', group: 'Waged'
19
+ value :id => 3, :name => 'Part-time', group: 'Waged'
20
+ value :id => 4, :name => 'Casual', group: 'Waged'
21
+ value :id => 5, :name => 'Student', group: 'Un-waged'
22
+ value :id => 6, :name => 'Retired', group: 'Un-waged'
23
+ value :id => 7, :name => 'Unemployed', group: 'Un-waged'
24
+ value :id => 8, :name => 'Carer', group: 'Un-waged'
25
+ end
16
26
  end
17
27
  end
18
28
 
@@ -34,6 +44,15 @@ describe ActiveEnum::FormHelpers::SimpleForm, :type => :helper do
34
44
  expect(output).to have_xpath('//option[@value=2]', :text => 'Female')
35
45
  end
36
46
 
47
+ it "should use explicit :grouped_enum input type" do
48
+ output = simple_form_for(Person.new, :url => people_path) do |f|
49
+ concat f.input(:employment_status, :as => :grouped_enum, :group_by => :group)
50
+ end
51
+ expect(output).to have_selector('select#person_employment_status')
52
+ expect(output).to have_xpath('//optgroup[@label="Waged"]/option[@value=1]', :text => 'Full-time')
53
+ expect(output).to have_xpath('//optgroup[@label="Un-waged"]/option[@value=8]', :text => 'Carer')
54
+ end
55
+
37
56
  it "should not use enum input type if :as option indicates other type" do
38
57
  output = simple_form_for(Person.new, :url => people_path) do |f|
39
58
  concat f.input(:sex, :as => :string)
@@ -5,6 +5,7 @@ ActiveRecord::Schema.define(:version => 1) do
5
5
  t.integer :sex
6
6
  t.integer :attending
7
7
  t.integer :staying
8
+ t.integer :employment_status
8
9
  end
9
10
 
10
11
  create_table :sorted_people, :force => true do |t|
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_enum
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.rc2
4
+ version: 1.0.0.rc7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adam Meehan
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-09-07 00:00:00.000000000 Z
11
+ date: 2020-07-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -39,6 +39,10 @@ files:
39
39
  - README.rdoc
40
40
  - Rakefile
41
41
  - active_enum.gemspec
42
+ - gemfiles/rails_4_2.gemfile
43
+ - gemfiles/rails_5_0.gemfile
44
+ - gemfiles/rails_5_1.gemfile
45
+ - gemfiles/rails_5_2.gemfile
42
46
  - init.rb
43
47
  - lib/active_enum.rb
44
48
  - lib/active_enum/acts_as_enum.rb
@@ -68,7 +72,7 @@ files:
68
72
  homepage: http://github.com/adzap/active_enum
69
73
  licenses: []
70
74
  metadata: {}
71
- post_install_message:
75
+ post_install_message:
72
76
  rdoc_options: []
73
77
  require_paths:
74
78
  - lib
@@ -83,9 +87,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
83
87
  - !ruby/object:Gem::Version
84
88
  version: 1.3.1
85
89
  requirements: []
86
- rubyforge_project:
87
- rubygems_version: 2.7.6.2
88
- signing_key:
90
+ rubygems_version: 3.0.3
91
+ signing_key:
89
92
  specification_version: 4
90
93
  summary: Define enum classes in Rails and use them to enumerate ActiveRecord attributes
91
94
  test_files: