has_enumeration 0.4.0 → 0.5.0
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.
- data/Gemfile.lock +8 -0
- data/HISTORY.txt +5 -0
- data/README.txt +6 -3
- data/Rakefile +3 -2
- data/TODO +3 -2
- data/VERSION +1 -1
- data/features/nonstandard_attribute_enumeration.feature +51 -0
- data/features/step_definitions/has_enumeration_steps.rb +4 -0
- data/features/support/env.rb +4 -0
- data/features/support/nonstandard_attribute_model.rb +4 -0
- data/lib/has_enumeration/class_methods.rb +15 -13
- data/lib/has_enumeration.rb +6 -5
- metadata +7 -5
data/Gemfile.lock
CHANGED
@@ -10,6 +10,10 @@ GEM
|
|
10
10
|
activesupport (= 3.0.0)
|
11
11
|
arel (~> 1.0.0)
|
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)
|
13
17
|
activesupport (3.0.0)
|
14
18
|
arel (1.0.1)
|
15
19
|
activesupport (~> 3.0.0)
|
@@ -23,7 +27,10 @@ GEM
|
|
23
27
|
diff-lcs (1.1.2)
|
24
28
|
gherkin (2.1.5)
|
25
29
|
trollop (~> 1.16.2)
|
30
|
+
gherkin (2.1.5-java)
|
31
|
+
trollop (~> 1.16.2)
|
26
32
|
i18n (0.4.1)
|
33
|
+
jdbc-sqlite3 (3.6.3.054)
|
27
34
|
json_pure (1.4.6)
|
28
35
|
meta_where (0.9.2)
|
29
36
|
activerecord (~> 3.0.0.rc2)
|
@@ -43,6 +50,7 @@ GEM
|
|
43
50
|
tzinfo (0.3.23)
|
44
51
|
|
45
52
|
PLATFORMS
|
53
|
+
java
|
46
54
|
ruby
|
47
55
|
|
48
56
|
DEPENDENCIES
|
data/HISTORY.txt
CHANGED
data/README.txt
CHANGED
@@ -7,9 +7,12 @@ class TestObject < ActiveRecord::Base
|
|
7
7
|
# Integer attribute with explicit value mapping
|
8
8
|
has_enumeration :color, :red => 1, :green => 2, :blue => 3
|
9
9
|
|
10
|
-
|
11
10
|
# String attribute with implicit value mapping
|
12
11
|
# has_enumeration :color, [:red, :green, :blue]
|
12
|
+
|
13
|
+
# Attribute with a name other than the enumeration's name
|
14
|
+
# has_enumeration :color, {:red => 1, :green => 2, :blue => 3},
|
15
|
+
# :attribute => :hue
|
13
16
|
end
|
14
17
|
|
15
18
|
# Value and predicates
|
@@ -44,7 +47,7 @@ has_enumeration has been tested with all combinations for the following:
|
|
44
47
|
Rubies:
|
45
48
|
- 1.8.7-p302
|
46
49
|
- 1.9.2-p0
|
47
|
-
- JRuby 1.5.
|
50
|
+
- JRuby 1.5.3
|
48
51
|
ActiveRecord:
|
49
|
-
- 2.3.
|
52
|
+
- 2.3.9
|
50
53
|
- 3.0.0
|
data/Rakefile
CHANGED
@@ -15,7 +15,7 @@ in the database. Predicates are provided for each symbol in the enumeration
|
|
15
15
|
and the symbols may be used in finder methods. When using ActiveRecord 3,
|
16
16
|
the symbols may also be used when interacting with the underlying Arel attribute
|
17
17
|
for the enumeration. has_enumeration has been tested with Ruby 1.8.7,
|
18
|
-
Ruby 1.9.2, JRuby 1.5.
|
18
|
+
Ruby 1.9.2, JRuby 1.5.3, ActiveRecord 2.3.9, and ActiveRecord 3.0.0.
|
19
19
|
EOF
|
20
20
|
gemspec.email = "greg@rujubu.com"
|
21
21
|
gemspec.homepage = "http://github.com/gregspurrier/has_enumeration"
|
@@ -31,7 +31,8 @@ namespace :features do
|
|
31
31
|
task :all => [:common, :rails3]
|
32
32
|
|
33
33
|
Cucumber::Rake::Task.new(:common) do |t|
|
34
|
-
features = %w(explicitly_mapped_enumeration implicitly_mapped_enumeration
|
34
|
+
features = %w(explicitly_mapped_enumeration implicitly_mapped_enumeration
|
35
|
+
nonstandard_attribute_enumeration)
|
35
36
|
feature_files = features.map {|f| "features/#{f}.feature"}.join(' ')
|
36
37
|
t.cucumber_opts = feature_files
|
37
38
|
end
|
data/TODO
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
Prior to 1.0.0:
|
2
|
-
- Raise exception when assigning an invalid value
|
3
|
-
-
|
2
|
+
- Raise exception when assigning an invalid value (?)
|
3
|
+
- Configurable support for nil
|
4
|
+
- rdoc documentation for has_enumeration
|
4
5
|
- Rake task to automate testing the supported Rubies and ActiveRecord versions
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.5.0
|
@@ -0,0 +1,51 @@
|
|
1
|
+
Feature:
|
2
|
+
|
3
|
+
As a programmer using an ActiveRecord model with an integer column
|
4
|
+
representing an enumerated value
|
5
|
+
I want to be able to refer to the enumeration symbolically and have
|
6
|
+
predicates to test its value
|
7
|
+
So that I can write pretty, concise code.
|
8
|
+
|
9
|
+
Scenario Outline: set an enumerated value on an unsaved object
|
10
|
+
Given a model with an nonstandard-attribute enumeration of red, green, and blue
|
11
|
+
And an unsaved instance of that model
|
12
|
+
When I assign a symbolic value <assigned> to the enumeration
|
13
|
+
Then it should have the assigned value as its value
|
14
|
+
And the red? predicate should be <red?>
|
15
|
+
And the green? predicate should be <green?>
|
16
|
+
And the blue? predicate should be <blue?>
|
17
|
+
|
18
|
+
Scenarios: setting various values
|
19
|
+
| assigned | red? | green? | blue? |
|
20
|
+
| :red | true | false | false |
|
21
|
+
| :green | false | true | false |
|
22
|
+
| :blue | false | false | true |
|
23
|
+
|
24
|
+
Scenario Outline: set an enumerated value then save and reload
|
25
|
+
Given a model with an nonstandard-attribute enumeration of red, green, and blue
|
26
|
+
And an unsaved instance of that model
|
27
|
+
When I assign a symbolic value <assigned> to the enumeration
|
28
|
+
And I save and reload the object
|
29
|
+
Then it should have the assigned value as its value
|
30
|
+
And the red? predicate should be <red?>
|
31
|
+
And the green? predicate should be <green?>
|
32
|
+
And the blue? predicate should be <blue?>
|
33
|
+
|
34
|
+
Scenarios: setting various values
|
35
|
+
| assigned | red? | green? | blue? |
|
36
|
+
| :red | true | false | false |
|
37
|
+
| :green | false | true | false |
|
38
|
+
| :blue | false | false | true |
|
39
|
+
|
40
|
+
Scenario Outline: find objects with a specific enumerated value
|
41
|
+
Given a model with an nonstandard-attribute enumeration of red, green, and blue
|
42
|
+
And a set of objects with a variety of values for the enumeration
|
43
|
+
When I query for objects with the value <value>
|
44
|
+
Then I should get all of the objects having that value
|
45
|
+
And I should not get any objects having other values
|
46
|
+
|
47
|
+
Scenarios: querying various values
|
48
|
+
| value |
|
49
|
+
| :red |
|
50
|
+
| :green |
|
51
|
+
| :blue |
|
@@ -6,6 +6,10 @@ Given /^a model with an implicitly-mapped enumeration of red, green, and blue$/
|
|
6
6
|
@model_class = ImplicitlyMappedModel
|
7
7
|
end
|
8
8
|
|
9
|
+
Given /^a model with an nonstandard-attribute enumeration of red, green, and blue$/ do
|
10
|
+
@model_class = NonstandardAttributeModel
|
11
|
+
end
|
12
|
+
|
9
13
|
Given /^an unsaved instance of that model$/ do
|
10
14
|
@object = @model_class.new
|
11
15
|
end
|
data/features/support/env.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
module HasEnumeration
|
2
2
|
module ClassMethods
|
3
|
-
def has_enumeration(
|
3
|
+
def has_enumeration(enumeration, mapping, options = {})
|
4
4
|
unless mapping.is_a?(Hash)
|
5
5
|
# Recast the mapping as a symbol -> string hash
|
6
6
|
mapping_hash = {}
|
@@ -8,34 +8,36 @@ module HasEnumeration
|
|
8
8
|
mapping = mapping_hash
|
9
9
|
end
|
10
10
|
|
11
|
+
# The underlying attribute
|
12
|
+
attribute = options[:attribute] || enumeration
|
13
|
+
|
11
14
|
# ActiveRecord's composed_of method will do most of the work for us.
|
12
15
|
# All we have to do is cons up a class that implements the bidirectional
|
13
16
|
# mapping described by the provided hash.
|
14
17
|
klass = create_enumeration_mapping_class(mapping)
|
15
|
-
attr_enumeration_mapping_classes[
|
18
|
+
attr_enumeration_mapping_classes[enumeration] = klass
|
16
19
|
|
17
20
|
# Bind the class to a name within the scope of this class
|
18
|
-
|
19
|
-
mapping_class_name = attribute_name.camelize
|
21
|
+
mapping_class_name = enumeration.to_s.camelize
|
20
22
|
const_set(mapping_class_name, klass)
|
21
23
|
scoped_class_name = [self.name, mapping_class_name].join('::')
|
22
24
|
|
23
|
-
composed_of(
|
25
|
+
composed_of(enumeration,
|
24
26
|
:class_name => scoped_class_name,
|
25
|
-
:mapping => [
|
27
|
+
:mapping => [attribute.to_s, 'raw_value'],
|
26
28
|
:converter => :from_sym
|
27
29
|
)
|
28
30
|
|
29
|
-
|
30
|
-
unless @aggregate_conditions_override_installed
|
31
|
-
extend HasEnumeration::AggregateConditionsOverride
|
32
|
-
@aggregate_conditions_override_installed = true
|
33
|
-
end
|
34
|
-
|
35
|
-
if respond_to?(:arel_table)
|
31
|
+
if ActiveRecord::VERSION::MAJOR >= 3
|
36
32
|
# Install this attributes mapping for use later when extending
|
37
33
|
# Arel attributes on the fly.
|
38
34
|
::Arel::Table.has_enumeration_mappings[table_name][attribute] = mapping
|
35
|
+
else
|
36
|
+
# Install our aggregate condition handling override, but only once
|
37
|
+
unless @aggregate_conditions_override_installed
|
38
|
+
extend HasEnumeration::AggregateConditionsOverride
|
39
|
+
@aggregate_conditions_override_installed = true
|
40
|
+
end
|
39
41
|
end
|
40
42
|
end
|
41
43
|
|
data/lib/has_enumeration.rb
CHANGED
@@ -1,13 +1,14 @@
|
|
1
1
|
require 'active_record'
|
2
2
|
|
3
|
+
# Install our common ActiveRecord extentions
|
3
4
|
require 'has_enumeration/class_methods'
|
4
|
-
require 'has_enumeration/aggregate_conditions_override'
|
5
|
-
|
6
|
-
# Install our ActiveRecord extentions
|
7
5
|
ActiveRecord::Base.extend(HasEnumeration::ClassMethods)
|
8
6
|
|
9
|
-
#
|
10
|
-
|
7
|
+
# For ActiveRecord 3, extend Arel::Table, otherwise we'll need
|
8
|
+
# our specialization of aggregate_conditions_override
|
9
|
+
if ActiveRecord::VERSION::MAJOR >= 3
|
11
10
|
require 'has_enumeration/arel/table_extensions'
|
12
11
|
Arel::Table.send(:include, HasEnumeration::Arel::TableExtensions)
|
12
|
+
else
|
13
|
+
require 'has_enumeration/aggregate_conditions_override'
|
13
14
|
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:
|
4
|
+
hash: 11
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
8
|
+
- 5
|
9
9
|
- 0
|
10
|
-
version: 0.
|
10
|
+
version: 0.5.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Greg Spurrier
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-
|
18
|
+
date: 2010-10-05 00:00:00 -07:00
|
19
19
|
default_executable:
|
20
20
|
dependencies: []
|
21
21
|
|
@@ -27,7 +27,7 @@ description: |
|
|
27
27
|
and the symbols may be used in finder methods. When using ActiveRecord 3,
|
28
28
|
the symbols may also be used when interacting with the underlying Arel attribute
|
29
29
|
for the enumeration. has_enumeration has been tested with Ruby 1.8.7,
|
30
|
-
Ruby 1.9.2, JRuby 1.5.
|
30
|
+
Ruby 1.9.2, JRuby 1.5.3, ActiveRecord 2.3.9, and ActiveRecord 3.0.0.
|
31
31
|
|
32
32
|
email: greg@rujubu.com
|
33
33
|
executables: []
|
@@ -51,10 +51,12 @@ files:
|
|
51
51
|
- features/explicitly_mapped_enumeration.feature
|
52
52
|
- features/implicitly_mapped_enumeration.feature
|
53
53
|
- features/meta_where_queries.feature
|
54
|
+
- features/nonstandard_attribute_enumeration.feature
|
54
55
|
- features/step_definitions/has_enumeration_steps.rb
|
55
56
|
- features/support/env.rb
|
56
57
|
- features/support/explicitly_mapped_model.rb
|
57
58
|
- features/support/implicitly_mapped_model.rb
|
59
|
+
- features/support/nonstandard_attribute_model.rb
|
58
60
|
- lib/has_enumeration.rb
|
59
61
|
- lib/has_enumeration/aggregate_conditions_override.rb
|
60
62
|
- lib/has_enumeration/arel/table_extensions.rb
|