acts_as_enumeration 0.1.5 → 0.1.6

Sign up to get free protection for your applications and to get access to all the features.
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