modelish 0.1.1 → 0.1.2

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/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