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 +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
|