acts_as_enumeration 0.1.5 → 0.1.6

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: f270cfec29a0cc1ce4a81e0e9924325b89e161c0
4
+ data.tar.gz: 9c1f15ed0a3f1d516a9f3a899acd551ff2168e05
5
+ SHA512:
6
+ metadata.gz: 2a40b0eeaa87e6112dacb74e21676f664868edfa575a97bbb54e3dd17b046e07acec5080125869a02df7b9885ee4b6b7db4cd1e5b8596e493a5f72d2715c8fc0
7
+ data.tar.gz: 1a5b9951d26819bde4f60b61619c86c8fa41c46d6cbe190310b330195eb552ab5471c3cb0ace644acac9f443abc3eeb5769cfb5a6ae23e08010a052ff18c49c8
@@ -1,96 +1,78 @@
1
1
  module ActiveRecord
2
2
  module Acts
3
3
  module Enumeration
4
- VERSION='0.1.5'
4
+
5
+ VERSION="0.1.6"
5
6
  class << self
7
+
6
8
  def included(base)
7
- base.class_eval do
9
+ base.instance_eval do
8
10
  extend ClassMethods
9
11
  end
10
12
  end
11
13
  end
12
14
 
13
- def method_missing(method_id, *args, &block)
14
- method_name=method_id.to_s
15
- if match_data=method_name.match(/^(is(?:_not)*)(\?|_(\w*)\?)/)
16
- method=match_data[1] << "?"
17
- new_args= ((match_data[2]=='?') ? args : match_data[3].split(/_or_/).map { |x| x.intern })
18
- respond_to?(method) ? send(method, *new_args, &block) : false
19
- else
20
- super
15
+ module ClassMethods
16
+ private
17
+ def portable_select(*args)
18
+ respond_to?(:scoped) ? scoped(:select => ["#{args.join(',')}"]) : select(*args)
21
19
  end
22
- end
23
20
 
21
+ def normalize(string)
22
+ string.to_s.gsub(/[\\W]+/, ' ').strip.gsub(/\s+/, '_').underscore
23
+ end
24
24
 
25
- module ClassMethods
26
- def normalize(field)
27
- field.to_s.gsub(/[\\W]+/, ' ').strip.gsub(/\s+/, '_').underscore
25
+ public
26
+ def normalize_intern(string)
27
+ normalize(string).intern
28
28
  end
29
29
 
30
- def acts_as_enumeration(*opts)
31
- opts.each do |field|
32
- klass=self
30
+ def acts_as_enumeration(*args)
31
+ class << self;
32
+ attr_accessor :enumeration;
33
+ end
34
+ self.enumeration||=HashWithIndifferentAccess.new
35
+ args.each do |field|
36
+ self.enumeration[field]=HashWithIndifferentAccess[
37
+ *portable_select(field, primary_key).map do |x|
38
+ [normalize_intern(x.send(field)), x.send(x.class.primary_key)]
39
+ end.flatten
40
+ ]
33
41
  (
34
- class<<self;
42
+ class << self;
35
43
  self;
36
44
  end).class_eval do
37
- define_method "enum_#{field}" do
38
- instance_variable_get("@enum_#{field}") || instance_variable_set("@enum_#{field}", HashWithIndifferentAccess[*klass.all.map { |x| [x.send(field).gsub(/[\\W]+/, ' ').strip.gsub(/\s+/, '_').underscore, x.send(x.class.primary_key)] }.flatten])
39
- end
40
-
41
- define_method :as_key do |value|
42
- return '' unless exists?(value)
43
- klass.find(value).as_key
44
- end
45
-
46
- alias_method :as_symbol, :as_key
47
-
48
- define_method "valid_#{field}?" do |value|
49
- send("enum_#{field}").has_key?(value)
50
- end
51
-
52
- define_method "id_for_#{field}" do |value|
53
- send("enum_#{field}")[value]
54
- end
55
-
56
- define_method "for_#{field}" do |value|
57
- klass.find(send("id_for_#{field}", value))
58
- end
59
- end
60
-
61
- define_method 'is?' do |*types|
62
- types.any? { |x| send(self.class.primary_key)==self.class.send("enum_#{field}")[x] }
63
- end
64
-
65
- define_method 'is_not?' do |*types|
66
- !is?(*types)
67
- end
68
-
69
- define_method :as_key do
70
- self.class.normalize(send(field)).intern
45
+ define_method(:enumerations) { |name| self.enumeration[name] }
46
+ define_method("#{field}_valid?") { |value| !!send("id_for_#{field}", value) }
47
+ alias_method "valid_#{field}?", "#{field}_valid?"
48
+ define_method("id_for_#{field}") { |value| enumerations(field)[value] }
49
+ define_method("for_#{field}") { |value| find(send("id_for_#{field}", value)) }
50
+ define_method("enum_#{field}") { enumerations(field) }
51
+ define_method("as_key") { |value| find(value).as_key rescue nil }
71
52
  end
72
53
 
73
- alias_method :as_symbol, :as_key
74
-
75
- all.map { |x| normalize(x.send(field)) }.each do |y|
76
-
77
- define_method "is_#{y}?" do
78
- is?("#{y}")
79
- end
80
-
81
- identifier = y.to_s=~/^[a-z_]/ ? y.to_s : "_#{y.to_s}"
82
-
83
- define_method "#{identifier}?" do
84
- is?("#{y}")
54
+ define_method(:is?) { |*types| types.any? { |x| self==(self.class.send(x) rescue nil) } }
55
+ define_method(:is_not?) { |*types| !is?(*types) }
56
+ define_method(:method_missing) do |method_id, *args, &block|
57
+ method_name=method_id.to_s
58
+ if match_data=method_name.match(/^(is[_not]*)(\?|_(\w*)\?)/)
59
+ method =match_data[1] << "?"
60
+ new_args= (match_data[2]=='?') ? args : match_data[3].split(/_or_/)
61
+ respond_to?(method) ? send(method, *new_args, &block) : false
62
+ else
63
+ super method_id, *args, &block
85
64
  end
65
+ end
86
66
 
87
- (
67
+ portable_select(field).map { |x| normalize_intern(x.send(field)) }.each do |y|
68
+ key = y.to_s=~/^[a-z_]/ ? y.to_s : "_#{y.to_s}"
69
+ define_method(:as_key) { self.class.normalize_intern(send(field)) }
70
+ define_method("is_#{y}?") { is?(y) }
71
+ alias_method "#{key}?", "is_#{y}?"
88
72
  class << self;
89
73
  self;
90
- end).class_eval do
91
- define_method identifier do
92
- self.send("for_#{field}", y)
93
- end
74
+ end.instance_eval do
75
+ define_method(key) { self.send("for_#{field}", y) }
94
76
  end
95
77
  end
96
78
  end
@@ -1,2 +1,2 @@
1
- require_relative File.join('active_record', 'acts', 'enumeration.rb')
1
+ require (File.join(File.dirname(__FILE__), 'active_record', 'acts', 'enumeration.rb'))
2
2
  ActiveRecord::Base.send :include, ActiveRecord::Acts::Enumeration
@@ -8,7 +8,7 @@ else
8
8
  require 'sqlite3'
9
9
  end
10
10
  $:.unshift File.dirname(__FILE__) + '/../lib'
11
- require File.dirname(__FILE__) + '/../acts_as_enumeration'
11
+ require 'acts_as_enumeration'
12
12
 
13
13
  ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :database => ":memory:")
14
14
 
@@ -33,6 +33,8 @@ class Enumerate < ActiveRecord::Base;
33
33
  end
34
34
  class EnumerateAll < Enumerate;
35
35
  end
36
+ class EnumerateSome < Enumerate;
37
+ end
36
38
 
37
39
  class EnumerateTest < (
38
40
  begin
@@ -44,11 +46,14 @@ end)
44
46
  klass.create! :name => 'first', :description => 'First field'
45
47
  klass.create! :name => 'second', :description => 'Second field'
46
48
  klass.create! :name => 'third', :description => 'Third field'
49
+ end
50
+ [EnumerateSome].each do |klass|
47
51
  klass.create! :name => 'forth', :description => 'Forth field'
48
52
  klass.create! :name => 'fifth', :description => 'Fifth field'
49
53
  klass.create! :name => 'sixth', :description => 'Sixth field'
50
54
  end
51
- Enumerate.acts_as_enumeration :description
55
+ EnumerateAll.acts_as_enumeration :description
56
+ EnumerateSome.acts_as_enumeration :description
52
57
  end
53
58
 
54
59
  def teardown
@@ -56,25 +61,47 @@ end)
56
61
  end
57
62
 
58
63
  def test_basics
59
- assert Enumerate.first.is?(:first_field)
60
64
  assert Enumerate.first.is?('first_field')
65
+ assert Enumerate.first.is?(:first_field)
61
66
  assert Enumerate.first.is_not?(:second_field)
62
67
  assert Enumerate.first.is?(:first_field, :second_field)
63
68
  assert Enumerate.first.is_not?(:second_field, :third_field)
64
69
  assert Enumerate.first.is_first_field?
65
70
  assert Enumerate.first.is_not_second_field?
66
71
  assert Enumerate.first.is_first_field_or_second_field?
67
- assert Enumerate.second_field.is_first_field_or_second_field?
68
- assert Enumerate.second_field.is_not_first_field?
69
- assert Enumerate.first.first_field?
70
- assert_equal Enumerate.first, Enumerate.first_field
72
+ assert EnumerateAll.second_field.is_first_field_or_second_field?
73
+ assert EnumerateAll.second_field.is_not_first_field?
74
+ assert EnumerateAll.first.first_field?
75
+ assert_equal EnumerateAll.first, EnumerateAll.first_field
71
76
  assert_equal(:first_field, Enumerate.first.as_key)
72
- assert_equal(:first_field, Enumerate.as_key(Enumerate.first.id))
73
- assert Enumerate.valid_description?(:first_field)
74
- assert Enumerate.valid_description?('first_field')
75
- assert !Enumerate.valid_description?(:blah_blah_field)
76
- assert !Enumerate.valid_description?('blah_blah_field')
77
- assert Enumerate.first.id, Enumerate.id_for_description(:first_field)
77
+ assert_equal(:first_field, EnumerateAll.as_key(Enumerate.first.id))
78
+ assert EnumerateAll.valid_description?(:first_field)
79
+ assert EnumerateAll.valid_description?('first_field')
80
+ assert !EnumerateAll.valid_description?(:blah_blah_field)
81
+ assert !EnumerateAll.valid_description?('blah_blah_field')
82
+ assert Enumerate.first.id, EnumerateAll.id_for_description(:first_field)
83
+ end
84
+
85
+ def test_sti
86
+ assert EnumerateSome.first.is?('forth_field')
87
+ assert EnumerateSome.first.is?(:forth_field)
88
+ assert EnumerateSome.first.is_not?(:second_field)
89
+ assert EnumerateSome.first.is?(:forth_field, :second_field)
90
+ assert EnumerateSome.first.is_not?(:second_field, :third_field)
91
+ assert EnumerateSome.first.is_forth_field?
92
+ assert EnumerateSome.first.is_not_second_field?
93
+ assert EnumerateSome.first.is_forth_field_or_second_field?
94
+ assert EnumerateSome.forth_field.is_forth_field_or_second_field?
95
+ assert EnumerateSome.forth_field.is_not_fifth_field?
96
+ assert EnumerateSome.first.forth_field?
97
+ assert_equal EnumerateSome.first, EnumerateSome.forth_field
98
+ assert_equal(:forth_field, EnumerateSome.first.as_key)
99
+ assert_equal(:forth_field, EnumerateSome.as_key(EnumerateSome.first.id))
100
+ assert EnumerateSome.valid_description?(:forth_field)
101
+ assert EnumerateSome.valid_description?('forth_field')
102
+ assert !EnumerateSome.valid_description?(:first_field)
103
+ assert !EnumerateSome.valid_description?('first_field')
104
+ assert EnumerateSome.first.id, EnumerateSome.id_for_description(:forth_field)
78
105
  end
79
106
  end
80
107
 
metadata CHANGED
@@ -1,62 +1,52 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: acts_as_enumeration
3
- version: !ruby/object:Gem::Version
4
- hash: 17
5
- prerelease:
6
- segments:
7
- - 0
8
- - 1
9
- - 5
10
- version: 0.1.5
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.6
11
5
  platform: ruby
12
- authors:
6
+ authors:
13
7
  - Paul McKibbin
14
8
  autorequire:
15
9
  bindir: bin
16
10
  cert_chain: []
17
-
18
- date: 2016-03-18 00:00:00 Z
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
11
+ date: 2016-04-04 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
21
14
  name: bundler
22
- prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
24
- none: false
25
- requirements:
26
- - - ~>
27
- - !ruby/object:Gem::Version
28
- hash: 9
29
- segments:
30
- - 1
31
- - 3
32
- version: "1.3"
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.3'
33
20
  type: :development
34
- version_requirements: *id001
35
- - !ruby/object:Gem::Dependency
36
- name: rake
37
21
  prerelease: false
38
- requirement: &id002 !ruby/object:Gem::Requirement
39
- none: false
40
- requirements:
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
41
31
  - - ">="
42
- - !ruby/object:Gem::Version
43
- hash: 3
44
- segments:
45
- - 0
46
- version: "0"
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
47
34
  type: :development
48
- version_requirements: *id002
49
- description: Active Record extender to enable the selection of a database column and have all of it's values enumerable
50
- email:
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ description: Active Record extender to enable the selection of a database column and
42
+ have all of it's values enumerable
43
+ email:
51
44
  - pmckibbin@gmail.com
52
45
  executables: []
53
-
54
46
  extensions: []
55
-
56
47
  extra_rdoc_files: []
57
-
58
- files:
59
- - .gitignore
48
+ files:
49
+ - ".gitignore"
60
50
  - Gemfile
61
51
  - LICENSE.txt
62
52
  - README
@@ -68,37 +58,28 @@ files:
68
58
  - lib/acts_as_enumeration.rb
69
59
  - test/enumeration_test.rb
70
60
  homepage: http://blackrat.org
71
- licenses:
61
+ licenses:
72
62
  - MIT
63
+ metadata: {}
73
64
  post_install_message:
74
65
  rdoc_options: []
75
-
76
- require_paths:
66
+ require_paths:
77
67
  - lib
78
- required_ruby_version: !ruby/object:Gem::Requirement
79
- none: false
80
- requirements:
68
+ required_ruby_version: !ruby/object:Gem::Requirement
69
+ requirements:
81
70
  - - ">="
82
- - !ruby/object:Gem::Version
83
- hash: 3
84
- segments:
85
- - 0
86
- version: "0"
87
- required_rubygems_version: !ruby/object:Gem::Requirement
88
- none: false
89
- requirements:
71
+ - !ruby/object:Gem::Version
72
+ version: '0'
73
+ required_rubygems_version: !ruby/object:Gem::Requirement
74
+ requirements:
90
75
  - - ">="
91
- - !ruby/object:Gem::Version
92
- hash: 3
93
- segments:
94
- - 0
95
- version: "0"
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
96
78
  requirements: []
97
-
98
79
  rubyforge_project:
99
- rubygems_version: 1.8.15
80
+ rubygems_version: 2.5.1
100
81
  signing_key:
101
- specification_version: 3
82
+ specification_version: 4
102
83
  summary: enumerable values from database columns
103
- test_files:
84
+ test_files:
104
85
  - test/enumeration_test.rb