extended_has_enumeration 0.0.2 → 0.0.4
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/VERSION +1 -1
- data/features/step_definitions/has_enumeration_steps.rb +5 -5
- data/features/support/env.rb +4 -0
- data/features/support/explicitly_mapped_model.rb +1 -1
- data/features/support/explicitly_mapped_model_with_default.rb +3 -0
- data/features/support/mapped_model_with_initial.rb +3 -0
- data/features/support/model_with_wrong_default.rb +3 -0
- data/lib/extended_has_enumeration/class_methods.rb +38 -14
- data/spec/extended_has_enumeration/extended_has_enumeration_spec.rb +89 -11
- data/spec/spec_helper.rb +16 -1
- metadata +4 -1
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.4
|
@@ -34,16 +34,16 @@ Then /^the ([a-z_]+\?) predicate should be (true|false)$/ do |predicate, value|
|
|
34
34
|
else
|
35
35
|
expected_value = false
|
36
36
|
end
|
37
|
-
@object.color.send(predicate).should == expected_value
|
37
|
+
@object.color.send(predicate).should == expected_value
|
38
38
|
end
|
39
39
|
|
40
40
|
|
41
41
|
Given /^a set of objects with a variety of values for the enumeration$/ do
|
42
|
-
a = ExplicitlyMappedModel.new(:color => :red)
|
43
|
-
a.color = :red
|
44
|
-
p a
|
42
|
+
#a = ExplicitlyMappedModel.new(:color => :red)
|
43
|
+
#a.color = :red
|
44
|
+
#p a
|
45
45
|
@model_class.delete_all
|
46
|
-
|
46
|
+
|
47
47
|
2.times do
|
48
48
|
[:red, :green, :blue].each do |color|
|
49
49
|
@model_class.create!(:color => color)
|
data/features/support/env.rb
CHANGED
@@ -20,6 +20,10 @@ class CreateTables < ActiveRecord::Migration
|
|
20
20
|
t.integer :color
|
21
21
|
end
|
22
22
|
|
23
|
+
create_table :explicitly_mapped_model_with_defaults, :force => true do |t|
|
24
|
+
t.integer :color
|
25
|
+
end
|
26
|
+
|
23
27
|
create_table :implicitly_mapped_models, :force => true do |t|
|
24
28
|
t.string :color
|
25
29
|
end
|
@@ -29,13 +29,24 @@ module ExtendedHasEnumeration
|
|
29
29
|
mapping = mapping_hash
|
30
30
|
end
|
31
31
|
|
32
|
+
if options[:initial].present?
|
33
|
+
class_eval do
|
34
|
+
after_initialize :"initialize_#{enumeration}"
|
35
|
+
|
36
|
+
define_method :"initialize_#{enumeration}" do
|
37
|
+
self.send("#{enumeration}=", self.send(enumeration).blank? ? options[:initial] : self.send(enumeration))
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
|
32
43
|
# The underlying attribute
|
33
44
|
attribute = options[:attribute] || enumeration
|
34
45
|
|
35
46
|
# ActiveRecord's composed_of method will do most of the work for us.
|
36
47
|
# All we have to do is cons up a class that implements the bidirectional
|
37
48
|
# mapping described by the provided hash.
|
38
|
-
klass = create_enumeration_mapping_class(mapping)
|
49
|
+
klass = create_enumeration_mapping_class(mapping, options)
|
39
50
|
attr_enumeration_mapping_classes[enumeration] = klass
|
40
51
|
|
41
52
|
# Bind the class to a name within the scope of this class
|
@@ -46,8 +57,8 @@ module ExtendedHasEnumeration
|
|
46
57
|
composed_of(enumeration,
|
47
58
|
:class_name => scoped_class_name,
|
48
59
|
:mapping => [attribute.to_s, 'raw_value'],
|
49
|
-
:
|
50
|
-
:
|
60
|
+
:constructor => :constructor,
|
61
|
+
:converter => :from_sym
|
51
62
|
)
|
52
63
|
|
53
64
|
if ActiveRecord::VERSION::MAJOR >= 3 && ActiveRecord::VERSION::MINOR == 0
|
@@ -68,38 +79,44 @@ module ExtendedHasEnumeration
|
|
68
79
|
@attr_enumeration_mapping_classes ||= {}
|
69
80
|
end
|
70
81
|
|
71
|
-
def create_enumeration_mapping_class(mapping)
|
82
|
+
def create_enumeration_mapping_class(mapping, options={})
|
72
83
|
mapping = mapping.with_indifferent_access
|
84
|
+
default = options[:default]
|
85
|
+
allow_blank = options[:allow_blank]
|
73
86
|
Class.new do
|
74
|
-
attr_reader :raw_value
|
75
|
-
alias_method :humanize, :raw_value
|
87
|
+
# attr_reader :raw_value
|
88
|
+
# alias_method :humanize, :raw_value
|
89
|
+
delegate :blank?, to: :raw_value
|
76
90
|
|
77
91
|
define_method :initialize do |raw_value|
|
78
92
|
@raw_value = raw_value
|
79
|
-
@value = mapping[raw_value]
|
93
|
+
@value = mapping[@raw_value]
|
94
|
+
end
|
95
|
+
|
96
|
+
define_method :raw_value do
|
97
|
+
@raw_value.blank? ? default : @raw_value
|
80
98
|
end
|
81
99
|
|
82
100
|
define_method :to_sym do
|
83
|
-
|
101
|
+
raw_value.try(:to_sym)
|
84
102
|
end
|
85
103
|
|
86
104
|
define_method :value do
|
87
|
-
|
105
|
+
mapping[raw_value]
|
88
106
|
end
|
89
107
|
|
90
108
|
define_method :to_s do
|
91
|
-
|
109
|
+
raw_value.to_s
|
92
110
|
end
|
93
111
|
|
94
112
|
define_method :humanize do
|
95
|
-
|
113
|
+
to_s.humanize
|
96
114
|
end
|
97
115
|
|
98
116
|
mapping.keys.each do |sym|
|
99
117
|
predicate = "#{sym}?".to_sym
|
100
|
-
value = mapping[sym]
|
101
118
|
define_method predicate do
|
102
|
-
|
119
|
+
to_sym == sym.to_sym
|
103
120
|
end
|
104
121
|
end
|
105
122
|
|
@@ -108,13 +125,20 @@ module ExtendedHasEnumeration
|
|
108
125
|
mapping
|
109
126
|
end
|
110
127
|
define_method :from_sym do |sym|
|
111
|
-
|
128
|
+
if !mapping.has_key?(sym) && !sym.blank?
|
112
129
|
raise ArgumentError.new(
|
113
130
|
"#{sym.inspect} is not one of {#{mapping.keys.map(&:inspect).sort.join(', ')}}"
|
114
131
|
)
|
132
|
+
elsif !allow_blank && sym.blank?
|
133
|
+
raise ArgumentError.new(
|
134
|
+
"#{name.split('::').last} can't be blank"
|
135
|
+
)
|
115
136
|
end
|
116
137
|
new(sym)
|
117
138
|
end
|
139
|
+
define_method :constructor do |sym|
|
140
|
+
new(sym)
|
141
|
+
end
|
118
142
|
end
|
119
143
|
end
|
120
144
|
end
|
@@ -40,14 +40,14 @@ end
|
|
40
40
|
describe ExtendedHasEnumeration, 'with an uninitialied value' do
|
41
41
|
context 'in a newly-created object' do
|
42
42
|
it 'returns nil for the value of the enumeration' do
|
43
|
-
ExplicitlyMappedModel.new.color.should be_nil
|
43
|
+
ExplicitlyMappedModel.new.color.raw_value.should be_nil
|
44
44
|
end
|
45
45
|
end
|
46
46
|
|
47
47
|
context 'in an existing object' do
|
48
48
|
it 'returns nil for the value of the enumeration' do
|
49
49
|
object = ExplicitlyMappedModel.find(ExplicitlyMappedModel.create!.id)
|
50
|
-
object.color.should be_nil
|
50
|
+
object.color.raw_value.should be_nil
|
51
51
|
end
|
52
52
|
end
|
53
53
|
end
|
@@ -56,45 +56,123 @@ describe ExtendedHasEnumeration, 'assignment of nil' do
|
|
56
56
|
it 'sets the enumeration to nil' do
|
57
57
|
object = ExplicitlyMappedModel.new(:color => :red)
|
58
58
|
object.color = nil
|
59
|
-
object.color.should be_nil
|
59
|
+
object.color.raw_value.should be_nil
|
60
60
|
end
|
61
61
|
|
62
62
|
it 'persists across a trip to the database' do
|
63
63
|
object = ExplicitlyMappedModel.create!(:color => :red)
|
64
64
|
object.color = nil
|
65
65
|
object.save!
|
66
|
-
ExplicitlyMappedModel.find(object.id).color.should be_nil
|
66
|
+
ExplicitlyMappedModel.find(object.id).color.raw_value.should be_nil
|
67
67
|
end
|
68
68
|
end
|
69
69
|
|
70
70
|
describe ExtendedHasEnumeration, 'string formatting' do
|
71
|
-
it 'returns the value as a string if to_s is called on it'
|
71
|
+
it 'returns the value as a string if to_s is called on it' do
|
72
72
|
object = ExplicitlyMappedModel.new(:color => :red)
|
73
|
-
object.color.to_s.should == '
|
73
|
+
object.color.to_s.should == 'red'
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
describe ExtendedHasEnumeration, 'symbol formatting' do
|
78
|
+
it 'returns the value as a string if to_s is called on it' do
|
79
|
+
object = ExplicitlyMappedModel.new(:color => :red)
|
80
|
+
object.color.to_sym.should == :red
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
describe ExtendedHasEnumeration, 'symbol formatting' do
|
85
|
+
it 'returns the value as a string if to_s is called on it' do
|
86
|
+
object = ExplicitlyMappedModel.new(:color => :red)
|
87
|
+
object.color.value.should == 'Red color'
|
74
88
|
end
|
75
89
|
end
|
76
90
|
|
77
91
|
describe ExtendedHasEnumeration, 'hash value' do
|
78
|
-
it 'returns the raw value as a string if raw_value is called on it'
|
92
|
+
it 'returns the raw value as a string if raw_value is called on it' do
|
79
93
|
object = ExplicitlyMappedModel.new(:color => :red)
|
80
94
|
object.color.raw_value.should == :red
|
81
95
|
end
|
82
96
|
|
83
|
-
it 'returns the raw value as a string if humanize is called on it'
|
97
|
+
it 'returns the raw value as a string if humanize is called on it' do
|
84
98
|
object = ExplicitlyMappedModel.new(:color => :red)
|
85
99
|
object.color.humanize.should == 'Red'
|
86
100
|
end
|
87
101
|
end
|
88
102
|
|
89
103
|
describe ExtendedHasEnumeration, 'source' do
|
90
|
-
it 'returns the passed hash'
|
91
|
-
ExplicitlyMappedModel::Color.source.should == {'red'=>'Red color', 'green'=>2, 'blue'=>3}
|
104
|
+
it 'returns the passed hash' do
|
105
|
+
ExplicitlyMappedModel::Color.source.should == {'red' => 'Red color', 'green' => 2, 'blue' => 3}
|
92
106
|
end
|
93
107
|
end
|
94
108
|
|
95
109
|
describe ExtendedHasEnumeration, 'has hash with with_indifferent_access' do
|
96
|
-
it '
|
110
|
+
it 'allows assign string' do
|
97
111
|
object = ExplicitlyMappedModel.create!(:color => 'red')
|
98
112
|
object.color.raw_value.should == 'red'
|
99
113
|
end
|
100
114
|
end
|
115
|
+
|
116
|
+
describe ExtendedHasEnumeration, 'constructor' do
|
117
|
+
it 'returns class without passing value' do
|
118
|
+
object = ExplicitlyMappedModel.create!
|
119
|
+
object.color.class.should == ExplicitlyMappedModel::Color
|
120
|
+
end
|
121
|
+
|
122
|
+
it 'returns nil on raw_value without passing value' do
|
123
|
+
object = ExplicitlyMappedModel.create! color: nil
|
124
|
+
object.color.raw_value.should be_blank
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
describe ExtendedHasEnumeration, 'default value' do
|
129
|
+
|
130
|
+
it 'returns true when calls red? on it' do
|
131
|
+
object = ExplicitlyMappedModelWithDefault.create!
|
132
|
+
object.color.red?.should be_true
|
133
|
+
end
|
134
|
+
|
135
|
+
it 'returns default value' do
|
136
|
+
object = ExplicitlyMappedModelWithDefault.create!
|
137
|
+
object.color.raw_value.should == :red
|
138
|
+
end
|
139
|
+
|
140
|
+
it 'returns default value of hash' do
|
141
|
+
object = ExplicitlyMappedModelWithDefault.create!
|
142
|
+
object.color.value.should == 'Red color'
|
143
|
+
end
|
144
|
+
|
145
|
+
it 'returns nil if default is wrong' do
|
146
|
+
object = ModelWithWrongDefault.create!
|
147
|
+
object.color.value.should be_nil
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
describe ExtendedHasEnumeration, 'initial value' do
|
152
|
+
|
153
|
+
it 'returns true when calls red? on it' do
|
154
|
+
object = MappedModelWithInitial.create!
|
155
|
+
object.color.red?.should be_true
|
156
|
+
end
|
157
|
+
|
158
|
+
it 'returns initial value' do
|
159
|
+
object = MappedModelWithInitial.create!
|
160
|
+
object.color.raw_value.should == :red
|
161
|
+
end
|
162
|
+
|
163
|
+
it 'returns initial value of hash' do
|
164
|
+
object = MappedModelWithInitial.create!
|
165
|
+
object.color.value.should == 'Red color'
|
166
|
+
end
|
167
|
+
|
168
|
+
it 'returns nil after seting to it' do
|
169
|
+
object = MappedModelWithInitial.create!
|
170
|
+
object.color = nil
|
171
|
+
object.color.raw_value.should be_nil
|
172
|
+
end
|
173
|
+
|
174
|
+
it 'returns nil if default is wrong' do
|
175
|
+
object = ModelWithWrongDefault.create!
|
176
|
+
object.color.value.should be_nil
|
177
|
+
end
|
178
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -6,6 +6,9 @@ require 'rspec'
|
|
6
6
|
|
7
7
|
require File.expand_path('../lib/extended_has_enumeration', File.dirname(__FILE__))
|
8
8
|
require File.expand_path('../features/support/explicitly_mapped_model', File.dirname(__FILE__))
|
9
|
+
require File.expand_path('../features/support/explicitly_mapped_model_with_default', File.dirname(__FILE__))
|
10
|
+
require File.expand_path('../features/support/model_with_wrong_default', File.dirname(__FILE__))
|
11
|
+
require File.expand_path('../features/support/mapped_model_with_initial', File.dirname(__FILE__))
|
9
12
|
|
10
13
|
ActiveRecord::Base.establish_connection(
|
11
14
|
:adapter => defined?(JRUBY_VERSION) ? 'jdbcsqlite3': 'sqlite3',
|
@@ -18,6 +21,18 @@ end
|
|
18
21
|
|
19
22
|
class CreateTables < ActiveRecord::Migration
|
20
23
|
create_table :explicitly_mapped_models, :force => true do |t|
|
21
|
-
t.
|
24
|
+
t.string :color
|
25
|
+
end
|
26
|
+
|
27
|
+
create_table :explicitly_mapped_model_with_defaults, :force => true do |t|
|
28
|
+
t.string :color
|
29
|
+
end
|
30
|
+
|
31
|
+
create_table :model_with_wrong_defaults, :force => true do |t|
|
32
|
+
t.string :color
|
33
|
+
end
|
34
|
+
|
35
|
+
create_table :mapped_model_with_initials, :force => true do |t|
|
36
|
+
t.string :color
|
22
37
|
end
|
23
38
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: extended_has_enumeration
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -85,6 +85,9 @@ files:
|
|
85
85
|
- features/step_definitions/has_enumeration_steps.rb
|
86
86
|
- features/support/env.rb
|
87
87
|
- features/support/explicitly_mapped_model.rb
|
88
|
+
- features/support/explicitly_mapped_model_with_default.rb
|
89
|
+
- features/support/model_with_wrong_default.rb
|
90
|
+
- features/support/mapped_model_with_initial.rb
|
88
91
|
- features/support/implicitly_mapped_model.rb
|
89
92
|
- features/support/nonstandard_attribute_model.rb
|
90
93
|
- install_gemsets.sh
|