has_constant 0.6.1 → 0.6.2

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.6.1
1
+ 0.6.2
data/has_constant.gemspec CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{has_constant}
8
- s.version = "0.6.1"
8
+ s.version = "0.6.2"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["mattbeedle"]
@@ -16,7 +16,7 @@ module HasConstant
16
16
  if values.is_a?(Array)
17
17
  self.class.send(name)[read_attribute(singular).to_i]
18
18
  elsif values.is_a?(Hash)
19
- self.class.send(name)[read_attribute(singular)]
19
+ HashWithIndifferentAccess.new(self.class.send(name))[read_attribute(singular)]
20
20
  end
21
21
  end
22
22
  end
@@ -23,7 +23,7 @@ module HasConstant
23
23
 
24
24
  class_eval do
25
25
  unless fields.map(&:first).include?(singular.to_s)
26
- field singular.to_sym, { :type => values.is_a?(Hash) ? String : Integer }.merge(options)
26
+ field singular.to_sym, { :type => Integer }.merge(options)
27
27
  end
28
28
 
29
29
  index singular.to_sym, :background => true if options[:index]
@@ -34,10 +34,8 @@ module HasConstant
34
34
 
35
35
  define_method("#{singular}=") do |val|
36
36
  if val.instance_of?(String)
37
- if values.is_a?(Array) && index = self.class.send(name.to_s).index(val)
37
+ if index = self.class.send(name.to_s).index(val)
38
38
  write_attribute singular.to_sym, index
39
- elsif values.is_a?(Hash) && values.has_value?(val)
40
- write_attribute singular.to_sym, values.invert[val]
41
39
  elsif !val.blank?
42
40
  values = values.call if values.respond_to?(:call)
43
41
  @has_constant_errors ||= {}
@@ -50,11 +48,7 @@ module HasConstant
50
48
 
51
49
  # Add the getter method. This returns the string representation of the stored value
52
50
  define_method(singular) do
53
- if values.is_a?(Array)
54
- self.class.send(name.to_s)[attributes[singular].to_i] if attributes[singular]
55
- else
56
- self.class.send(name.to_s)[attributes[singular]] if attributes[singular]
57
- end
51
+ eval("#{self.class}.#{name.to_s}[self.attributes[singular].to_i] if self.attributes[singular]")
58
52
  end
59
53
 
60
54
  (class << self; self; end).instance_eval do
data/lib/has_constant.rb CHANGED
@@ -42,7 +42,6 @@ module HasConstant
42
42
  singular = (options[:accessor] || name.to_s.singularize).to_s
43
43
 
44
44
  (class << self; self; end).instance_eval do
45
- values = HashWithIndifferentAccess.new(values) if values.is_a?(Hash)
46
45
  define_method(name.to_s, values) if values.respond_to?(:call)
47
46
  define_method(name.to_s, lambda { values }) unless values.respond_to?(:call)
48
47
  end
@@ -54,10 +53,8 @@ module HasConstant
54
53
  # Add the setter method. This takes the string representation and converts it to an integer to store in the DB
55
54
  define_method("#{singular}=") do |val|
56
55
  if val.instance_of?(String)
57
- if values.is_a?(Array) && values.index(val)
56
+ if values.index(val)
58
57
  instance_variable_set("@#{singular}", values.index(val))
59
- elsif values.is_a?(Hash) && values.has_value?(val)
60
- instance_variable_set("@#{singular}", values.invert[val].to_s)
61
58
  else
62
59
  raise ArgumentError,
63
60
  "value for #{singular} must be in #{self.class.send(name.to_s).join(', ')}"
@@ -7,13 +7,6 @@ end
7
7
 
8
8
  class TestHasConstant < Test::Unit::TestCase
9
9
 
10
- should 'be able to store values in a hash' do
11
- Model.has_constant :salutations, { :first => 'Mr', :second => 'Mrs' }
12
- m = Model.new
13
- m.salutation = 'Mr'
14
- assert m.instance_variable_get("@salutation") == 'first'
15
- end
16
-
17
10
  should 'default values to translated values list' do
18
11
  I18n.stubs(:t).returns(['a', 'b'])
19
12
  Model.has_constant :titles
@@ -6,76 +6,68 @@ setup_mongoid
6
6
  class MongoUser
7
7
  include Mongoid::Document
8
8
  include HasConstant
9
+
10
+ has_constant :salutations, ['Mr', 'Mrs']
9
11
  end if defined?(Mongoid)
10
12
 
11
- class MongoUser2
13
+ class MongoUserWithProc
12
14
  include Mongoid::Document
13
15
  include HasConstant
16
+
17
+ has_constant :salutations, lambda { ['Mr', 'Mrs'] }
14
18
  end if defined?(Mongoid)
15
19
 
16
- class MongoUserWithHash
20
+ class MongoUserWithout
17
21
  include Mongoid::Document
18
22
  include HasConstant
19
- end if defined?(Mongoid)
23
+ end
24
+
25
+ class AnotherUser
26
+ include Mongoid::Document
27
+ include HasConstant
28
+ end
20
29
 
21
30
  class MongoidTest < Test::Unit::TestCase
22
31
  context 'Instance' do
23
-
24
- context 'using a hash' do
25
- setup do
26
- MongoUserWithHash.has_constant :salutations, { :first => 'Mr', :second => 'Mrs' }
27
- @m = MongoUserWithHash.new(:salutation => 'Mr')
28
- end
29
-
30
- should 'store the hash key' do
31
- assert_equal 'first', @m.attributes['salutation']
32
- end
33
-
34
- should 'return the correct value' do
35
- assert_equal 'Mr', @m.salutation
36
- end
37
- end
38
-
39
32
  should 'add the field automatically' do
40
- MongoUser.has_constant :salutations, ['Mr', 'Mrs']
41
- assert MongoUser.fields.map(&:first).include?('salutation')
33
+ MongoUserWithout.has_constant :salutations, ['Mr', 'Mrs']
34
+ assert MongoUserWithout.fields.map(&:first).include?('salutation')
42
35
  end
43
36
 
44
37
  should 'not add the field if it is already there' do
45
- MongoUser.send(:field, :salutation, :type => Integer, :default => 0)
46
- MongoUser.has_constant :salutations, ['Mr', 'Mrs']
47
- assert_equal 'Mr', MongoUser.new.salutation
38
+ MongoUserWithout.send(:field, :salutation, :type => Integer, :default => 0)
39
+ MongoUserWithout.has_constant :salutations, ['Mr', 'Mrs']
40
+ assert_equal 'Mr', MongoUserWithout.new.salutation
48
41
  end
49
42
 
50
43
  should 'be able to take default option' do
51
- MongoUser2.has_constant :salutations, lambda { %w(Mr Mrs) }, { :default => 0 }
52
- assert_equal 'Mr', MongoUser2.new.salutation
44
+ AnotherUser.has_constant :salutations, lambda { %w(Mr Mrs) }, { :default => 0 }
45
+ assert_equal 'Mr', AnotherUser.new.salutation
53
46
  end
54
47
 
55
48
  should 'take the accessor into account when adding the field' do
56
- MongoUser.has_constant :salutations, ['Mr', 'Mrs'], :accessor => :sal
57
- assert MongoUser.fields.map(&:first).include?('sal')
49
+ MongoUserWithProc.has_constant :salutations, ['Mr', 'Mrs'], :accessor => :sal
50
+ assert MongoUserWithProc.fields.map(&:first).include?('sal')
58
51
  end
59
52
 
60
53
  should 'default values to translated values list' do
61
54
  I18n.stubs(:t).returns(['a', 'b'])
62
- MongoUser.has_constant :titles
63
- assert_equal ['a', 'b'], MongoUser.titles
55
+ MongoUserWithout.has_constant :titles
56
+ assert_equal ['a', 'b'], MongoUserWithout.titles
64
57
  end
65
58
 
66
59
  should 'add index when index option is supplied' do
67
- MongoUser.has_constant :salutations, ['Mr', 'Mrs'], :index => true
68
- MongoUser.create_indexes
69
- assert MongoUser.index_information.keys.any? { |key| key.match(/salutation/) }
60
+ MongoUserWithout.has_constant :salutations, ['Mr', 'Mrs'], :index => true
61
+ MongoUserWithout.create_indexes
62
+ assert MongoUserWithout.index_information.keys.any? { |key| key.match(/salutation/) }
70
63
  end
71
64
 
72
65
  should 'not index when index option is not supplied' do
73
- MongoUser2.create_indexes
74
- assert !MongoUser2.index_information.keys.any? { |key| key.match(/salutation/) }
66
+ MongoUser.create_indexes
67
+ assert !MongoUser.index_information.keys.any? { |key| key.match(/salutation/) }
75
68
  end
76
69
 
77
70
  should 'save values as integers' do
78
- MongoUser.has_constant :salutations, %w(Mr Mrs)
79
71
  m = MongoUser.new(:salutation => 'Mr')
80
72
  m.save!
81
73
  assert_equal 'Mr', m.salutation
@@ -83,29 +75,25 @@ class MongoidTest < Test::Unit::TestCase
83
75
  end
84
76
 
85
77
  should 'not be valid when an incorrect value is supplied' do
86
- MongoUser.has_constant :salutations, %w(Mr Mrs)
87
78
  m = MongoUser.new(:salutation => 'asefe')
88
79
  assert !m.valid?
89
80
  assert_equal ['must be one of Mr, Mrs'], m.errors[:salutation]
90
81
  end
91
82
 
92
83
  should 'not be valid with an incorrect value is supplied and a proc/lambda has been used' do
93
- MongoUser.has_constant :salutations, Proc.new { %w(Mr Mrs) }
94
- m = MongoUser.new(:salutation => 'asefe')
84
+ m = MongoUserWithProc.new(:salutation => 'asefe')
95
85
  assert !m.valid?
96
86
  assert_equal ['must be one of Mr, Mrs'], m.errors[:salutation]
97
87
  end
98
88
 
99
89
  should 'be valid when a blank value is supplied' do
100
- MongoUser.has_constant :salutations, Proc.new { %w(Mr Mrs) }
101
- m = MongoUser.new(:salutation => '')
90
+ m = MongoUserWithProc.new(:salutation => '')
102
91
  assert m.valid?
103
92
  end
104
93
  end
105
94
 
106
95
  context 'Named Scopes' do
107
96
  setup do
108
- MongoUser.has_constant :salutations, %w(Mr Mrs)
109
97
  @man = MongoUser.create!(:salutation => 'Mr')
110
98
  @woman = MongoUser.create!(:salutation => 'Mrs')
111
99
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: has_constant
3
3
  version: !ruby/object:Gem::Version
4
- hash: 5
4
+ hash: 3
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 6
9
- - 1
10
- version: 0.6.1
9
+ - 2
10
+ version: 0.6.2
11
11
  platform: ruby
12
12
  authors:
13
13
  - mattbeedle