modelish 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG.md CHANGED
@@ -1,3 +1,8 @@
1
+ ## O.1.2 (2011-03-31)
2
+
3
+ * Fixed SystemStackError when a typed property with the same name is defined multiple times.
4
+ * Use explicit path when loading modelish classes.
5
+
1
6
  ## O.1.1 (2011-03-28)
2
7
 
3
8
  * Add DateTime to standard supported property types.
@@ -38,38 +38,45 @@ module Modelish
38
38
  # passing in the raw value as an argument
39
39
  def add_property_type(property_name, property_type=String)
40
40
  accessor = property_name.to_sym
41
- property_types[accessor] = property_type
42
41
 
43
- raw_accessor = define_raw_accessor(accessor)
44
- bang_accessor = define_bang_accessor(accessor)
42
+ # TODO: Refactor. This method is getting unwieldy as more
43
+ # corner cases are discovered. A few well-placed design
44
+ # refinements should take care of it (now we just need to figure
45
+ # out what those are.)
46
+ unless property_types[accessor] == property_type
47
+ property_types[accessor] = property_type
45
48
 
46
- typed_accessor = "_typed_#{accessor}".to_sym
47
- typed_mutator = "#{typed_accessor}=".to_sym
48
- to_safe = "_to_safe_#{accessor}".to_sym
49
+ raw_accessor = define_raw_accessor(accessor)
50
+ bang_accessor = define_bang_accessor(accessor)
49
51
 
50
- class_eval do
51
- attr_accessor typed_accessor
52
- private typed_accessor, typed_mutator
53
-
54
- define_method(to_safe) do
55
- self.send(bang_accessor) rescue self.send(raw_accessor)
56
- end
57
- private to_safe
52
+ typed_accessor = "_typed_#{accessor}".to_sym
53
+ typed_mutator = "#{typed_accessor}=".to_sym
54
+ to_safe = "_to_safe_#{accessor}".to_sym
58
55
 
59
- define_method(accessor) do
60
- val = self.send(typed_accessor)
56
+ class_eval do
57
+ attr_accessor typed_accessor
58
+ private typed_accessor, typed_mutator
61
59
 
62
- unless val || self.send(raw_accessor).nil?
63
- val = self.send(to_safe)
64
- self.send(typed_mutator, val)
60
+ define_method(to_safe) do
61
+ self.send(bang_accessor) rescue self.send(raw_accessor)
65
62
  end
63
+ private to_safe
66
64
 
67
- val
68
- end
65
+ define_method(accessor) do
66
+ val = self.send(typed_accessor)
67
+
68
+ unless val || self.send(raw_accessor).nil?
69
+ val = self.send(to_safe)
70
+ self.send(typed_mutator, val)
71
+ end
69
72
 
70
- define_method("#{accessor}=") do |val|
71
- self.send("#{raw_accessor}=", val)
72
- self.send(typed_mutator, self.send(to_safe))
73
+ val
74
+ end
75
+
76
+ define_method("#{accessor}=") do |val|
77
+ self.send("#{raw_accessor}=", val)
78
+ self.send(typed_mutator, self.send(to_safe))
79
+ end
73
80
  end
74
81
  end
75
82
  end
@@ -87,11 +94,13 @@ module Modelish
87
94
  raw_mutator = "raw_#{name}=".to_sym
88
95
 
89
96
  class_eval do
90
- if method_defined?(accessor) && method_defined?(mutator)
91
- alias_method(raw_accessor, accessor)
92
- alias_method(raw_mutator, mutator)
93
- else
94
- attr_accessor raw_accessor
97
+ unless method_defined?(raw_accessor) && method_defined?(raw_mutator)
98
+ if method_defined?(accessor) && method_defined?(mutator)
99
+ alias_method(raw_accessor, accessor)
100
+ alias_method(raw_mutator, mutator)
101
+ else
102
+ attr_accessor raw_accessor
103
+ end
95
104
  end
96
105
  end
97
106
 
@@ -1,3 +1,3 @@
1
1
  module Modelish
2
- VERSION = "0.1.1"
2
+ VERSION = "0.1.2"
3
3
  end
data/lib/modelish.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  $:.unshift(File.expand_path('modelish',File.dirname(__FILE__)))
2
2
 
3
- require 'version'
4
- require 'base'
3
+ require 'modelish/version'
4
+ require 'modelish/base'
5
5
 
6
6
  module Modelish
7
7
  # Your code goes here...
@@ -134,5 +134,39 @@ describe Modelish::PropertyTypes do
134
134
  let(:invalid_value) { Object.new }
135
135
  end
136
136
  end
137
+
138
+ context "when a property is defined more than once" do
139
+ before { model_class.add_property_type(property_name, other_property_type) }
140
+
141
+ let(:property_type) { Integer }
142
+
143
+ context "with the same property_type" do
144
+ let(:other_property_type) { property_type }
145
+
146
+ it "should not raise an error when the property is accessed" do
147
+ expect { model.send(property_name) }.to_not raise_error
148
+ end
149
+
150
+ it_should_behave_like 'a typed property', :my_property, Integer do
151
+ let(:valid_string) { '112358' }
152
+ let(:valid_typed_value) { 112358 }
153
+ let(:invalid_value) { 'blah' }
154
+ end
155
+ end
156
+
157
+ context "with different property_types" do
158
+ let(:other_property_type) { Float }
159
+
160
+ it "should not raise an error when the property is accessed" do
161
+ expect { model.send(property_name) }.to_not raise_error
162
+ end
163
+
164
+ it_should_behave_like 'a typed property', :my_property, Float do
165
+ let(:valid_string) { '112358.13' }
166
+ let(:valid_typed_value) { 112358.13 }
167
+ let(:invalid_value) { 'blah' }
168
+ end
169
+ end
170
+ end
137
171
  end
138
172
  end
@@ -29,7 +29,11 @@ shared_examples_for "a typed property" do |prop_name, prop_type|
29
29
  it { should be }
30
30
  it { should have_key(prop_name) }
31
31
 
32
- its([prop_name]) { should == property_type }
32
+ if prop_type
33
+ its([prop_name]) { should == prop_type }
34
+ else
35
+ its([prop_name]) { should be_a Proc }
36
+ end
33
37
  end
34
38
 
35
39
  describe "assignment" do
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: modelish
3
3
  version: !ruby/object:Gem::Version
4
- hash: 25
4
+ hash: 31
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 1
9
- - 1
10
- version: 0.1.1
9
+ - 2
10
+ version: 0.1.2
11
11
  platform: ruby
12
12
  authors:
13
13
  - Maeve Revels
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-03-28 00:00:00 -07:00
18
+ date: 2011-03-31 00:00:00 -07:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency