has_enumeration 1.0.0 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -3,11 +3,11 @@ source 'http://rubygems.org'
3
3
  if ENV['AR_VERSION'] == '2.3'
4
4
  gem 'activerecord', '~> 2.3.8'
5
5
  else
6
- gem 'activerecord', '~> 3.0.1'
6
+ gem 'activerecord', '~> 3.0.3'
7
7
  gem 'meta_where'
8
8
  end
9
9
 
10
- gem 'rspec', '~> 2.0.1'
10
+ gem 'rspec', '~> 2.1.0'
11
11
  gem 'cucumber', '~> 0.9.3'
12
12
 
13
13
  platforms :ruby do
data/Gemfile.lock CHANGED
@@ -1,24 +1,19 @@
1
1
  GEM
2
2
  remote: http://rubygems.org/
3
3
  specs:
4
- activemodel (3.0.1)
5
- activesupport (= 3.0.1)
4
+ activemodel (3.0.3)
5
+ activesupport (= 3.0.3)
6
6
  builder (~> 2.1.2)
7
- i18n (~> 0.4.1)
8
- activerecord (3.0.1)
9
- activemodel (= 3.0.1)
10
- activesupport (= 3.0.1)
11
- arel (~> 1.0.0)
7
+ i18n (~> 0.4)
8
+ activerecord (3.0.3)
9
+ activemodel (= 3.0.3)
10
+ activesupport (= 3.0.3)
11
+ arel (~> 2.0.2)
12
12
  tzinfo (~> 0.3.23)
13
- activerecord-jdbc-adapter (0.9.7-java)
14
- activerecord-jdbcsqlite3-adapter (0.9.7-java)
15
- activerecord-jdbc-adapter (= 0.9.7)
16
- jdbc-sqlite3 (>= 3.6.3.054)
17
- activesupport (3.0.1)
18
- arel (1.0.1)
19
- activesupport (~> 3.0.0)
13
+ activesupport (3.0.3)
14
+ arel (2.0.4)
20
15
  builder (2.1.2)
21
- cucumber (0.9.3)
16
+ cucumber (0.9.4)
22
17
  builder (~> 2.1.2)
23
18
  diff-lcs (~> 1.1.2)
24
19
  gherkin (~> 2.2.9)
@@ -28,40 +23,32 @@ GEM
28
23
  gherkin (2.2.9)
29
24
  json (~> 1.4.6)
30
25
  term-ansicolor (~> 1.0.5)
31
- gherkin (2.2.9-java)
32
- json (~> 1.4.6)
33
- term-ansicolor (~> 1.0.5)
34
26
  i18n (0.4.2)
35
- jdbc-sqlite3 (3.6.14.2.056-java)
36
27
  json (1.4.6)
37
- json (1.4.6-java)
38
- meta_where (0.9.6)
39
- activerecord (~> 3.0.0)
40
- activesupport (~> 3.0.0)
41
- arel (~> 1.0.1)
42
- rspec (2.0.1)
43
- rspec-core (~> 2.0.1)
44
- rspec-expectations (~> 2.0.1)
45
- rspec-mocks (~> 2.0.1)
46
- rspec-core (2.0.1)
47
- rspec-expectations (2.0.1)
48
- diff-lcs (>= 1.1.2)
49
- rspec-mocks (2.0.1)
50
- rspec-core (~> 2.0.1)
51
- rspec-expectations (~> 2.0.1)
28
+ meta_where (0.9.9.2)
29
+ activerecord (~> 3.0.2)
30
+ activesupport (~> 3.0.2)
31
+ arel (~> 2.0.2)
32
+ rspec (2.1.0)
33
+ rspec-core (~> 2.1.0)
34
+ rspec-expectations (~> 2.1.0)
35
+ rspec-mocks (~> 2.1.0)
36
+ rspec-core (2.1.0)
37
+ rspec-expectations (2.1.0)
38
+ diff-lcs (~> 1.1.2)
39
+ rspec-mocks (2.1.0)
52
40
  sqlite3-ruby (1.3.2)
53
41
  term-ansicolor (1.0.5)
54
42
  tzinfo (0.3.23)
55
43
 
56
44
  PLATFORMS
57
- java
58
45
  ruby
59
46
 
60
47
  DEPENDENCIES
61
- activerecord (~> 3.0.1)
48
+ activerecord (~> 3.0.3)
62
49
  activerecord-jdbcsqlite3-adapter (~> 0.9.7)
63
50
  cucumber (~> 0.9.3)
64
51
  jdbc-sqlite3
65
52
  meta_where
66
- rspec (~> 2.0.1)
53
+ rspec (~> 2.1.0)
67
54
  sqlite3-ruby
data/HISTORY.txt CHANGED
@@ -1,3 +1,6 @@
1
+ Version 1.0.1:
2
+ - Added support for Arel 2, which is required by ActiveRecord >= 3.0.3
3
+
1
4
  Version 1.0.0:
2
5
  - Added #to_sym for generated enumeration class. #value is deprecated.
3
6
  - Raises ArgumentError when assigning, or querying, with a symbol that is
data/README.md CHANGED
@@ -103,12 +103,13 @@ environment.rb file:
103
103
 
104
104
  * 2.3.10
105
105
  * 3.0.1
106
+ * 3.0.3
106
107
 
107
108
  and the following Ruby implementations:
108
109
 
109
110
  * 1.8.7-p302
110
111
  * 1.9.2-p0
111
- * JRuby 1.5.3
112
+ * JRuby 1.5.5
112
113
  * Rubinius 1.1.0
113
114
 
114
115
 
data/Rakefile CHANGED
@@ -18,8 +18,8 @@ in the database. Predicates are provided for each symbol in the enumeration
18
18
  and the symbols may be used in finder methods. When using ActiveRecord 3,
19
19
  the symbols may also be used when interacting with the underlying Arel attribute
20
20
  for the enumeration. has_enumeration has been tested with Ruby 1.8.7,
21
- Ruby 1.9.2, JRuby 1.5.3, Rubinius 1.1.0, ActiveRecord 2.3.10, and ActiveRecord
22
- 3.0.1.
21
+ Ruby 1.9.2, JRuby 1.5.5, Rubinius 1.1.0, ActiveRecord 2.3.10, and ActiveRecord
22
+ 3.0.3.
23
23
  EOF
24
24
  gemspec.email = "greg@rujubu.com"
25
25
  gemspec.homepage = "http://github.com/gregspurrier/has_enumeration"
data/TODO.md ADDED
@@ -0,0 +1,8 @@
1
+ # Release 1.1
2
+ * Support string assignment
3
+ * Intended for bulk assignment from form posts
4
+ * Unlike symbol assignment, will not raise an exception when a value
5
+ is invalid
6
+ * Invalid values will fail validation and add an error on the attribute
7
+ * Expose the accepted values for an enumeration via something like
8
+ `Car::Color.values`
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.0.0
1
+ 1.0.1
@@ -55,7 +55,7 @@ end
55
55
 
56
56
  When /^I query for objects with the value :([a-z_]+) via arel$/ do |value|
57
57
  @desired_color = value.to_sym
58
- arel_attr = @model_class.arel_table.attributes[:color]
58
+ arel_attr = @model_class.arel_table[:color]
59
59
  @results = @model_class.where(arel_attr.eq(@desired_color)).order(:id)
60
60
  end
61
61
 
@@ -3,7 +3,7 @@ module HasEnumeration
3
3
  module TableExtensions
4
4
  def self.included(base)
5
5
  base.class_eval do
6
- alias_method_chain :attributes, :has_enumeration
6
+ alias_method_chain :columns, :has_enumeration
7
7
 
8
8
  def self.has_enumeration_mappings
9
9
  @has_enumeration_mappings ||= Hash.new {|h,k| h[k] = Hash.new}
@@ -11,17 +11,17 @@ module HasEnumeration
11
11
  end
12
12
  end
13
13
 
14
- def attributes_with_has_enumeration
15
- return @attributes if @attributes
16
- attrs = attributes_without_has_enumeration
14
+ def columns_with_has_enumeration
15
+ return @columns if @columns
16
+ columns = columns_without_has_enumeration
17
17
  mappings = self.class.has_enumeration_mappings[name]
18
18
  if mappings
19
19
  mappings.each do |attr_name, mapping|
20
- attr = attrs[attr_name]
20
+ attr = columns.detect {|c| c.name.to_s == attr_name.to_s}
21
21
  install_has_enumeration_attribute_mapping(attr, mapping)
22
22
  end
23
23
  end
24
- attrs
24
+ columns
25
25
  end
26
26
 
27
27
  private
@@ -45,18 +45,16 @@ module HasEnumeration
45
45
  end
46
46
  end
47
47
 
48
- ::Arel::Attribute::PREDICATES.each do |method_name|
49
- # Preserve the arity of the method we are overriding
48
+ predicates = ::Arel::Predications.instance_methods.map &:to_sym
49
+ predicates.each do |method_name|
50
50
  arity = ::Arel::Attribute.instance_method(method_name).arity
51
51
  case arity
52
52
  when 1
53
53
  define_method method_name do |arg|
54
54
  super(map_enumeration_arg(arg))
55
55
  end
56
- when -1
57
- define_method method_name do |*args|
58
- super(map_enumeration_arg(args))
59
- end
56
+ when 0
57
+ # No-op
60
58
  else
61
59
  raise "Unexpected arity #{arity} for #{method_name}"
62
60
  end
@@ -0,0 +1,70 @@
1
+ # Support for Arel 1. Will eventually be removed once most people are on
2
+ # Arel 2.
3
+ module HasEnumeration
4
+ module Arel
5
+ module TableExtensionsArelOne
6
+ def self.included(base)
7
+ base.class_eval do
8
+ alias_method_chain :attributes, :has_enumeration
9
+
10
+ def self.has_enumeration_mappings
11
+ @has_enumeration_mappings ||= Hash.new {|h,k| h[k] = Hash.new}
12
+ end
13
+ end
14
+ end
15
+
16
+ def attributes_with_has_enumeration
17
+ return @attributes if @attributes
18
+ attrs = attributes_without_has_enumeration
19
+ mappings = self.class.has_enumeration_mappings[name]
20
+ if mappings
21
+ mappings.each do |attr_name, mapping|
22
+ attr = attrs[attr_name]
23
+ install_has_enumeration_attribute_mapping(attr, mapping)
24
+ end
25
+ end
26
+ attrs
27
+ end
28
+
29
+ private
30
+ def install_has_enumeration_attribute_mapping(arel_attr, mapping)
31
+ # For this attribute only, override all of the methods defined
32
+ # in Arel::Attribute::PREDICATES so that they will perform the
33
+ # symbol-to-underlying-value mapping before proceeding with their work.
34
+ (class <<arel_attr;self;end).class_eval do
35
+ define_method :map_enumeration_arg do |arg|
36
+ if arg.is_a?(Symbol)
37
+ unless mapping.has_key?(arg)
38
+ raise ArgumentError.new(
39
+ "#{arg.inspect} is not one of {#{mapping.keys.map(&:inspect).sort.join(', ')}}"
40
+ )
41
+ end
42
+ mapping[arg]
43
+ elsif arg.is_a?(Array)
44
+ arg.map {|a| map_enumeration_arg(a)}
45
+ else
46
+ arg
47
+ end
48
+ end
49
+
50
+ ::Arel::Attribute::PREDICATES.each do |method_name|
51
+ # Preserve the arity of the method we are overriding
52
+ arity = ::Arel::Attribute.instance_method(method_name).arity
53
+ case arity
54
+ when 1
55
+ define_method method_name do |arg|
56
+ super(map_enumeration_arg(arg))
57
+ end
58
+ when -1
59
+ define_method method_name do |*args|
60
+ super(map_enumeration_arg(args))
61
+ end
62
+ else
63
+ raise "Unexpected arity #{arity} for #{method_name}"
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
@@ -7,8 +7,13 @@ ActiveRecord::Base.extend(HasEnumeration::ClassMethods)
7
7
  # For ActiveRecord 3, extend Arel::Table, otherwise we'll need
8
8
  # our specialization of aggregate_conditions_override
9
9
  if ActiveRecord::VERSION::MAJOR >= 3
10
- require 'has_enumeration/arel/table_extensions'
11
- Arel::Table.send(:include, HasEnumeration::Arel::TableExtensions)
10
+ if Arel::VERSION >= '2.0.0'
11
+ require 'has_enumeration/arel/table_extensions'
12
+ Arel::Table.send(:include, HasEnumeration::Arel::TableExtensions)
13
+ else
14
+ require 'has_enumeration/arel/table_extensions_arel_one'
15
+ Arel::Table.send(:include, HasEnumeration::Arel::TableExtensionsArelOne)
16
+ end
12
17
  else
13
18
  require 'has_enumeration/aggregate_conditions_override'
14
19
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: has_enumeration
3
3
  version: !ruby/object:Gem::Version
4
- hash: 23
4
+ hash: 21
5
5
  prerelease: false
6
6
  segments:
7
7
  - 1
8
8
  - 0
9
- - 0
10
- version: 1.0.0
9
+ - 1
10
+ version: 1.0.1
11
11
  platform: ruby
12
12
  authors:
13
13
  - Greg Spurrier
@@ -15,10 +15,115 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-11-07 00:00:00 -07:00
18
+ date: 2010-11-18 00:00:00 -08:00
19
19
  default_executable:
20
- dependencies: []
21
-
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ type: :runtime
23
+ prerelease: false
24
+ name: activerecord
25
+ version_requirements: &id001 !ruby/object:Gem::Requirement
26
+ none: false
27
+ requirements:
28
+ - - ~>
29
+ - !ruby/object:Gem::Version
30
+ hash: 1
31
+ segments:
32
+ - 3
33
+ - 0
34
+ - 3
35
+ version: 3.0.3
36
+ requirement: *id001
37
+ - !ruby/object:Gem::Dependency
38
+ type: :runtime
39
+ prerelease: false
40
+ name: meta_where
41
+ version_requirements: &id002 !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ hash: 3
47
+ segments:
48
+ - 0
49
+ version: "0"
50
+ requirement: *id002
51
+ - !ruby/object:Gem::Dependency
52
+ type: :runtime
53
+ prerelease: false
54
+ name: rspec
55
+ version_requirements: &id003 !ruby/object:Gem::Requirement
56
+ none: false
57
+ requirements:
58
+ - - ~>
59
+ - !ruby/object:Gem::Version
60
+ hash: 11
61
+ segments:
62
+ - 2
63
+ - 1
64
+ - 0
65
+ version: 2.1.0
66
+ requirement: *id003
67
+ - !ruby/object:Gem::Dependency
68
+ type: :runtime
69
+ prerelease: false
70
+ name: cucumber
71
+ version_requirements: &id004 !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ~>
75
+ - !ruby/object:Gem::Version
76
+ hash: 61
77
+ segments:
78
+ - 0
79
+ - 9
80
+ - 3
81
+ version: 0.9.3
82
+ requirement: *id004
83
+ - !ruby/object:Gem::Dependency
84
+ type: :runtime
85
+ prerelease: false
86
+ name: sqlite3-ruby
87
+ version_requirements: &id005 !ruby/object:Gem::Requirement
88
+ none: false
89
+ requirements:
90
+ - - ">="
91
+ - !ruby/object:Gem::Version
92
+ hash: 3
93
+ segments:
94
+ - 0
95
+ version: "0"
96
+ requirement: *id005
97
+ - !ruby/object:Gem::Dependency
98
+ type: :runtime
99
+ prerelease: false
100
+ name: jdbc-sqlite3
101
+ version_requirements: &id006 !ruby/object:Gem::Requirement
102
+ none: false
103
+ requirements:
104
+ - - ">="
105
+ - !ruby/object:Gem::Version
106
+ hash: 3
107
+ segments:
108
+ - 0
109
+ version: "0"
110
+ requirement: *id006
111
+ - !ruby/object:Gem::Dependency
112
+ type: :runtime
113
+ prerelease: false
114
+ name: activerecord-jdbcsqlite3-adapter
115
+ version_requirements: &id007 !ruby/object:Gem::Requirement
116
+ none: false
117
+ requirements:
118
+ - - ~>
119
+ - !ruby/object:Gem::Version
120
+ hash: 53
121
+ segments:
122
+ - 0
123
+ - 9
124
+ - 7
125
+ version: 0.9.7
126
+ requirement: *id007
22
127
  description: |
23
128
  Extends ActiveRecord with the has_enumeration method allowing a symbolic
24
129
  enumeration to be stored in an ActiveRecord attribute. The enumeration is
@@ -27,8 +132,8 @@ description: |
27
132
  and the symbols may be used in finder methods. When using ActiveRecord 3,
28
133
  the symbols may also be used when interacting with the underlying Arel attribute
29
134
  for the enumeration. has_enumeration has been tested with Ruby 1.8.7,
30
- Ruby 1.9.2, JRuby 1.5.3, Rubinius 1.1.0, ActiveRecord 2.3.10, and ActiveRecord
31
- 3.0.1.
135
+ Ruby 1.9.2, JRuby 1.5.5, Rubinius 1.1.0, ActiveRecord 2.3.10, and ActiveRecord
136
+ 3.0.3.
32
137
 
33
138
  email: greg@rujubu.com
34
139
  executables: []
@@ -45,6 +150,7 @@ files:
45
150
  - LICENSE.txt
46
151
  - README.md
47
152
  - Rakefile
153
+ - TODO.md
48
154
  - VERSION
49
155
  - features/arel_attributes.feature
50
156
  - features/explicitly_mapped_enumeration.feature
@@ -59,6 +165,7 @@ files:
59
165
  - lib/has_enumeration.rb
60
166
  - lib/has_enumeration/aggregate_conditions_override.rb
61
167
  - lib/has_enumeration/arel/table_extensions.rb
168
+ - lib/has_enumeration/arel/table_extensions_arel_one.rb
62
169
  - lib/has_enumeration/class_methods.rb
63
170
  - spec/has_enumeration/has_enumeration_spec.rb
64
171
  - spec/spec_helper.rb
@@ -67,8 +174,8 @@ homepage: http://github.com/gregspurrier/has_enumeration
67
174
  licenses: []
68
175
 
69
176
  post_install_message:
70
- rdoc_options:
71
- - --charset=UTF-8
177
+ rdoc_options: []
178
+
72
179
  require_paths:
73
180
  - lib
74
181
  required_ruby_version: !ruby/object:Gem::Requirement