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 +7 -0
- data/lib/active_record/acts/enumeration.rb +51 -69
- data/lib/acts_as_enumeration.rb +1 -1
- data/test/enumeration_test.rb +40 -13
- metadata +48 -67
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
|
-
|
4
|
+
|
5
|
+
VERSION="0.1.6"
|
5
6
|
class << self
|
7
|
+
|
6
8
|
def included(base)
|
7
|
-
base.
|
9
|
+
base.instance_eval do
|
8
10
|
extend ClassMethods
|
9
11
|
end
|
10
12
|
end
|
11
13
|
end
|
12
14
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
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
|
-
|
26
|
-
def
|
27
|
-
|
25
|
+
public
|
26
|
+
def normalize_intern(string)
|
27
|
+
normalize(string).intern
|
28
28
|
end
|
29
29
|
|
30
|
-
def acts_as_enumeration(*
|
31
|
-
|
32
|
-
|
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
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
define_method
|
42
|
-
|
43
|
-
|
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
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
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
|
91
|
-
define_method
|
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
|
data/lib/acts_as_enumeration.rb
CHANGED
@@ -1,2 +1,2 @@
|
|
1
|
-
|
1
|
+
require (File.join(File.dirname(__FILE__), 'active_record', 'acts', 'enumeration.rb'))
|
2
2
|
ActiveRecord::Base.send :include, ActiveRecord::Acts::Enumeration
|
data/test/enumeration_test.rb
CHANGED
@@ -8,7 +8,7 @@ else
|
|
8
8
|
require 'sqlite3'
|
9
9
|
end
|
10
10
|
$:.unshift File.dirname(__FILE__) + '/../lib'
|
11
|
-
require
|
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
|
-
|
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
|
68
|
-
assert
|
69
|
-
assert
|
70
|
-
assert_equal
|
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,
|
73
|
-
assert
|
74
|
-
assert
|
75
|
-
assert !
|
76
|
-
assert !
|
77
|
-
assert Enumerate.first.id,
|
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
|
-
|
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
|
-
|
19
|
-
|
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
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
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
|
-
|
39
|
-
|
40
|
-
|
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
|
-
|
44
|
-
segments:
|
45
|
-
- 0
|
46
|
-
version: "0"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
47
34
|
type: :development
|
48
|
-
|
49
|
-
|
50
|
-
|
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
|
-
|
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
|
-
|
80
|
-
requirements:
|
68
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
69
|
+
requirements:
|
81
70
|
- - ">="
|
82
|
-
- !ruby/object:Gem::Version
|
83
|
-
|
84
|
-
|
85
|
-
|
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
|
-
|
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:
|
80
|
+
rubygems_version: 2.5.1
|
100
81
|
signing_key:
|
101
|
-
specification_version:
|
82
|
+
specification_version: 4
|
102
83
|
summary: enumerable values from database columns
|
103
|
-
test_files:
|
84
|
+
test_files:
|
104
85
|
- test/enumeration_test.rb
|