objectified_sessions 1.0.1 → 1.0.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.
- checksums.yaml +5 -5
- data/lib/objectified_sessions/base.rb +3 -3
- data/lib/objectified_sessions/field_definition.rb +15 -2
- data/lib/objectified_sessions/version.rb +1 -1
- data/spec/objectified_sessions/system/basic_system_spec.rb +12 -0
- data/spec/objectified_sessions/system/error_handling_system_spec.rb +2 -2
- data/spec/objectified_sessions/unit/objectified_sessions/field_definition_spec.rb +47 -5
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
SHA1:
|
3
|
-
metadata.gz: 3ddbe03428f2939faa0bae986029767c4bcfa112
|
4
|
-
data.tar.gz: 8f562df0cc6716bcf4262d413a54375e1eca5810
|
5
2
|
SHA512:
|
6
|
-
|
7
|
-
|
3
|
+
data.tar.gz: e57eb2d7c2aaebc88310d412bafa67bd20f99268153bac567234776f77169a027e495e5a9010fe1b86d8d5bbbef3f7b8c74c2cc3b4209435ecafdf1a9bb4245e
|
4
|
+
metadata.gz: d896af16837d0fbfdd9d3db4f4c2d66223fbbb60d975be3101355f5338907840c573d41b51389c0430f5ff46238e4f2425c912c4e1dbd4e0115f31f4e14c483f
|
5
|
+
SHA1:
|
6
|
+
data.tar.gz: 3aceba4aa45c04acb79fecfac7f63220bf55411f
|
7
|
+
metadata.gz: 63dcb0a0ba471ba0e15b3dd1f7ab4c06abc77505
|
@@ -186,13 +186,13 @@ module ObjectifiedSessions
|
|
186
186
|
new_field = ObjectifiedSessions::FieldDefinition.new(self, name, options)
|
187
187
|
|
188
188
|
# Check for a conflict with the field name.
|
189
|
-
if @fields[new_field.name]
|
189
|
+
if (other_field = @fields[new_field.name]) && (other_field != new_field)
|
190
190
|
raise ObjectifiedSessions::Errors::DuplicateFieldNameError.new(self, new_field.name)
|
191
191
|
end
|
192
192
|
|
193
193
|
# Check for a conflict with the storage name.
|
194
|
-
if @fields_by_storage_name[new_field.storage_name]
|
195
|
-
raise ObjectifiedSessions::Errors::DuplicateFieldStorageNameError.new(self,
|
194
|
+
if (other_field = @fields_by_storage_name[new_field.storage_name]) && (other_field != new_field)
|
195
|
+
raise ObjectifiedSessions::Errors::DuplicateFieldStorageNameError.new(self, other_field.name, new_field.name, new_field.storage_name)
|
196
196
|
end
|
197
197
|
|
198
198
|
@fields[new_field.name] = new_field
|
@@ -37,6 +37,19 @@ module ObjectifiedSessions
|
|
37
37
|
create_methods!
|
38
38
|
end
|
39
39
|
|
40
|
+
# Allow field comparison. We do this when you define a field that has the exact same name or storage name as another
|
41
|
+
# field -- we allow it if (and only if) they are identical in every other way.
|
42
|
+
def ==(other)
|
43
|
+
return false unless other.kind_of?(ObjectifiedSessions::FieldDefinition)
|
44
|
+
session_class == other.send(:session_class) && name == other.name && storage_name == other.storage_name &&
|
45
|
+
type == other.send(:type) && visibility == other.send(:visibility)
|
46
|
+
end
|
47
|
+
|
48
|
+
# Make sure eql? works the same as ==.
|
49
|
+
def eql?(other)
|
50
|
+
self == other
|
51
|
+
end
|
52
|
+
|
40
53
|
# Returns the key under which this field should read and write its data. This will be its name, unless a
|
41
54
|
# +:storage+ option was passed to the constructor, in which case it will be that value, instead.
|
42
55
|
def storage_name
|
@@ -56,7 +69,7 @@ module ObjectifiedSessions
|
|
56
69
|
end
|
57
70
|
|
58
71
|
private
|
59
|
-
attr_reader :type, :visibility
|
72
|
+
attr_reader :type, :visibility, :session_class
|
60
73
|
|
61
74
|
# Process the options passed in; this validates them, and sets +@type+, +@visibility+, and +@storage_name+
|
62
75
|
# appropriately.
|
@@ -86,7 +99,7 @@ module ObjectifiedSessions
|
|
86
99
|
return unless type == :normal
|
87
100
|
|
88
101
|
fn = name
|
89
|
-
dmm =
|
102
|
+
dmm = session_class._dynamic_methods_module
|
90
103
|
mn = name.to_s.downcase
|
91
104
|
|
92
105
|
dmm.define_method(mn) do
|
@@ -35,6 +35,18 @@ describe "ObjectifiedSessions basic operations" do
|
|
35
35
|
@controller_instance.objsession.foo.should == 234
|
36
36
|
end
|
37
37
|
|
38
|
+
it "should let you redefine a field if it's exactly identical" do
|
39
|
+
define_objsession_class { field :foo, :visibility => :private, :storage => :baz }
|
40
|
+
|
41
|
+
@objsession_class.class_eval { field :foo, :visibility => :private, :storage => :baz }
|
42
|
+
|
43
|
+
lambda { @objsession_class.class_eval { field :foo, :visibility => :public, :storage => :baz } }.should raise_error(ObjectifiedSessions::Errors::DuplicateFieldNameError)
|
44
|
+
lambda { @objsession_class.class_eval { field :foo, :visibility => :private, :storage => :aaa } }.should raise_error(ObjectifiedSessions::Errors::DuplicateFieldNameError)
|
45
|
+
lambda { @objsession_class.class_eval { field :quux, :visibility => :public, :storage => :baz } }.should raise_error(ObjectifiedSessions::Errors::DuplicateFieldStorageNameError)
|
46
|
+
lambda { @objsession_class.class_eval { inactive :foo, :visibility => :private, :storage => :baz } }.should raise_error(ObjectifiedSessions::Errors::DuplicateFieldNameError)
|
47
|
+
lambda { @objsession_class.class_eval { retired :foo, :visibility => :private, :storage => :baz } }.should raise_error(ObjectifiedSessions::Errors::DuplicateFieldNameError)
|
48
|
+
end
|
49
|
+
|
38
50
|
it "should allow hash access to the underlying session" do
|
39
51
|
define_objsession_class do
|
40
52
|
field :foo, :visibility => :private
|
@@ -171,11 +171,11 @@ describe "ObjectifiedSessions error handling" do
|
|
171
171
|
e.message.should match(/baz/i)
|
172
172
|
end
|
173
173
|
|
174
|
-
it "should not let you define more than one field with the same name" do
|
174
|
+
it "should not let you define more than one field with the same name, but that differ" do
|
175
175
|
e = capture_exception(ObjectifiedSessions::Errors::DuplicateFieldNameError) do
|
176
176
|
define_objsession_class do
|
177
177
|
field :foo
|
178
|
-
field 'foo'
|
178
|
+
field 'foo', :visibility => :private
|
179
179
|
end
|
180
180
|
end
|
181
181
|
|
@@ -5,16 +5,22 @@ describe ObjectifiedSessions::FieldDefinition do
|
|
5
5
|
ObjectifiedSessions::FieldDefinition
|
6
6
|
end
|
7
7
|
|
8
|
-
|
9
|
-
|
10
|
-
allow(
|
8
|
+
def new_session_class
|
9
|
+
out = double("session_class")
|
10
|
+
allow(out).to receive(:kind_of?).with(Class).and_return(true)
|
11
11
|
|
12
|
-
|
12
|
+
dmm = Module.new do
|
13
13
|
class << self
|
14
14
|
public :define_method, :private
|
15
15
|
end
|
16
16
|
end
|
17
|
-
allow(
|
17
|
+
allow(out).to receive(:_dynamic_methods_module).with().and_return(dmm)
|
18
|
+
out
|
19
|
+
end
|
20
|
+
|
21
|
+
before :each do
|
22
|
+
@session_class = new_session_class
|
23
|
+
@dmm = @session_class._dynamic_methods_module
|
18
24
|
end
|
19
25
|
|
20
26
|
it "should normalize field names properly" do
|
@@ -58,6 +64,42 @@ describe ObjectifiedSessions::FieldDefinition do
|
|
58
64
|
klass.new(@session_class, :foo, { :type => :retired, :visibility => :public }).allow_access_to_data?.should_not be
|
59
65
|
end
|
60
66
|
|
67
|
+
[ "==", "eql?" ].each do |method_name|
|
68
|
+
describe method_name do
|
69
|
+
before :each do
|
70
|
+
@mn = method_name
|
71
|
+
@basis = klass.new(@session_class, :foo, { :type => :normal, :visibility => :public })
|
72
|
+
end
|
73
|
+
|
74
|
+
it "should match for fields that are identical" do
|
75
|
+
expect(@basis.send(@mn, klass.new(@session_class, :foo, { :type => :normal, :visibility => :public }))).to be_true
|
76
|
+
expect(@basis.send(@mn, klass.new(@session_class, :foo, { :type => :normal, :visibility => :public, :storage => :foo }))).to be_true
|
77
|
+
end
|
78
|
+
|
79
|
+
it "should not match if the session class is different" do
|
80
|
+
session_class_2 = new_session_class
|
81
|
+
expect(@basis.send(@mn, klass.new(session_class_2, :foo, { :type => :normal, :visibility => :public, :storage => :foo }))).not_to be_true
|
82
|
+
end
|
83
|
+
|
84
|
+
it "should not match if the name is different" do
|
85
|
+
expect(@basis.send(@mn, klass.new(@session_class, :bar, { :type => :normal, :visibility => :public }))).not_to be_true
|
86
|
+
end
|
87
|
+
|
88
|
+
it "should not match if the type is different" do
|
89
|
+
expect(@basis.send(@mn, klass.new(@session_class, :foo, { :type => :inactive, :visibility => :public }))).not_to be_true
|
90
|
+
expect(@basis.send(@mn, klass.new(@session_class, :foo, { :type => :retired, :visibility => :public }))).not_to be_true
|
91
|
+
end
|
92
|
+
|
93
|
+
it "should not match if the visibility is different" do
|
94
|
+
expect(@basis.send(@mn, klass.new(@session_class, :bar, { :type => :normal, :visibility => :private }))).not_to be_true
|
95
|
+
end
|
96
|
+
|
97
|
+
it "should not match if the storage is different" do
|
98
|
+
expect(@basis.send(@mn, klass.new(@session_class, :bar, { :type => :normal, :visibility => :public, :storage => :baz }))).not_to be_true
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
61
103
|
context "with dynamic-methods module testing" do
|
62
104
|
before :each do
|
63
105
|
dmm = @dmm
|