gom 0.1.0
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/LICENSE +20 -0
- data/README.rdoc +111 -0
- data/Rakefile +48 -0
- data/lib/gom.rb +7 -0
- data/lib/gom/object.rb +23 -0
- data/lib/gom/object/id.rb +30 -0
- data/lib/gom/object/injector.rb +45 -0
- data/lib/gom/object/inspector.rb +55 -0
- data/lib/gom/object/mapping.rb +61 -0
- data/lib/gom/object/proxy.rb +44 -0
- data/lib/gom/spec.rb +4 -0
- data/lib/gom/spec/acceptance/adapter_with_stateful_storage.rb +111 -0
- data/lib/gom/spec/acceptance/read_only_adapter_with_stateless_storage.rb +50 -0
- data/lib/gom/storage.rb +35 -0
- data/lib/gom/storage/adapter.rb +51 -0
- data/lib/gom/storage/configuration.rb +65 -0
- data/lib/gom/storage/fetcher.rb +69 -0
- data/lib/gom/storage/remover.rb +47 -0
- data/lib/gom/storage/saver.rb +59 -0
- data/spec/acceptance/adapter_spec.rb +10 -0
- data/spec/acceptance/object_spec.rb +33 -0
- data/spec/fake_adapter.rb +37 -0
- data/spec/lib/gom/object/id_spec.rb +56 -0
- data/spec/lib/gom/object/injector_spec.rb +51 -0
- data/spec/lib/gom/object/inspector_spec.rb +30 -0
- data/spec/lib/gom/object/mapping_spec.rb +158 -0
- data/spec/lib/gom/object/proxy_spec.rb +91 -0
- data/spec/lib/gom/object_spec.rb +40 -0
- data/spec/lib/gom/storage/adapter_spec.rb +73 -0
- data/spec/lib/gom/storage/configuration_spec.rb +92 -0
- data/spec/lib/gom/storage/fetcher_spec.rb +89 -0
- data/spec/lib/gom/storage/remover_spec.rb +47 -0
- data/spec/lib/gom/storage/saver_spec.rb +86 -0
- data/spec/lib/gom/storage_spec.rb +106 -0
- data/spec/spec_helper.rb +7 -0
- data/spec/storage.configuration +4 -0
- metadata +138 -0
@@ -0,0 +1,10 @@
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), "..", "spec_helper"))
|
2
|
+
require File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "lib", "gom"))
|
3
|
+
|
4
|
+
GOM::Storage::Configuration.read File.join(File.dirname(__FILE__), "..", "storage.configuration")
|
5
|
+
|
6
|
+
describe "fake adapter" do
|
7
|
+
|
8
|
+
it_should_behave_like "an adapter connected to a stateful storage"
|
9
|
+
|
10
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), "..", "spec_helper"))
|
2
|
+
require File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "lib", "gom"))
|
3
|
+
|
4
|
+
GOM::Storage::Configuration.read File.join(File.dirname(__FILE__), "..", "storage.configuration")
|
5
|
+
|
6
|
+
describe "object" do
|
7
|
+
|
8
|
+
before :each do
|
9
|
+
@object = Object.new
|
10
|
+
end
|
11
|
+
|
12
|
+
describe "getting it's id" do
|
13
|
+
|
14
|
+
before :each do
|
15
|
+
GOM::Storage.store @object, "test_storage"
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should return the id" do
|
19
|
+
id = GOM::Object.id @object
|
20
|
+
id.should == "test_storage:object_1"
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
describe "getting an object reference" do
|
26
|
+
|
27
|
+
it "should create an object proxy" do
|
28
|
+
GOM::Object.reference(@object).should be_instance_of(GOM::Object::Proxy)
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
|
2
|
+
class FakeAdapter < GOM::Storage::Adapter
|
3
|
+
|
4
|
+
STORE = { }
|
5
|
+
|
6
|
+
def setup
|
7
|
+
|
8
|
+
end
|
9
|
+
|
10
|
+
def fetch(id)
|
11
|
+
STORE[id]
|
12
|
+
end
|
13
|
+
|
14
|
+
def store(object_hash)
|
15
|
+
# store relations
|
16
|
+
(object_hash[:relations] || { }).each do |key, related_object_proxy|
|
17
|
+
GOM::Storage.store related_object_proxy.object, configuration.name
|
18
|
+
id = GOM::Object::Mapping.id_by_object related_object_proxy.object
|
19
|
+
object_hash[:relations][key] = GOM::Object::Proxy.new id
|
20
|
+
end
|
21
|
+
|
22
|
+
# may generate an id
|
23
|
+
object_id = object_hash[:id] || "object_#{STORE.size + 1}"
|
24
|
+
|
25
|
+
# store the object hash
|
26
|
+
STORE[object_id] = object_hash
|
27
|
+
|
28
|
+
object_id
|
29
|
+
end
|
30
|
+
|
31
|
+
def remove(id)
|
32
|
+
STORE.delete id
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
GOM::Storage::Adapter.register :fake_adapter, FakeAdapter
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "..", "spec_helper"))
|
2
|
+
|
3
|
+
describe GOM::Object::Id do
|
4
|
+
|
5
|
+
before :each do
|
6
|
+
@id = GOM::Object::Id.new "test_storage", "object_1"
|
7
|
+
end
|
8
|
+
|
9
|
+
describe "initialize" do
|
10
|
+
|
11
|
+
it "should initialize a blank id" do
|
12
|
+
id = GOM::Object::Id.new
|
13
|
+
id.storage_name.should == nil
|
14
|
+
id.object_id.should == nil
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should initialize with an id string" do
|
18
|
+
id = GOM::Object::Id.new "test_storage:object_1"
|
19
|
+
id.storage_name.should == "test_storage"
|
20
|
+
id.object_id.should == "object_1"
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should initialize with separated parameters" do
|
24
|
+
id = GOM::Object::Id.new "test_storage", "object_1"
|
25
|
+
id.storage_name.should == "test_storage"
|
26
|
+
id.object_id.should == "object_1"
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
describe "==" do
|
32
|
+
|
33
|
+
before :each do
|
34
|
+
@id_one = GOM::Object::Id.new "test_storage", "object_1"
|
35
|
+
@id_two = GOM::Object::Id.new "test_storage", "object_2"
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should be true when compared to an id with the same parameters" do
|
39
|
+
(@id == @id_one).should be_true
|
40
|
+
end
|
41
|
+
|
42
|
+
it "should be false when compared to a different id" do
|
43
|
+
(@id == @id_two).should be_false
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
|
48
|
+
describe "to_s" do
|
49
|
+
|
50
|
+
it "should return the combined parameters" do
|
51
|
+
@id.to_s.should == "test_storage:object_1"
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "..", "spec_helper"))
|
2
|
+
|
3
|
+
describe GOM::Object::Injector do
|
4
|
+
|
5
|
+
before :each do
|
6
|
+
@related_object_proxy = Object.new
|
7
|
+
|
8
|
+
@object = Object.new
|
9
|
+
@object.instance_variable_set :@old, "old value"
|
10
|
+
@object_hash = {
|
11
|
+
:class => "Object",
|
12
|
+
:properties => { :test => "test value" },
|
13
|
+
:relations => { :related_object => @related_object_proxy }
|
14
|
+
}
|
15
|
+
@injector = GOM::Object::Injector.new @object, @object_hash
|
16
|
+
end
|
17
|
+
|
18
|
+
describe "perform" do
|
19
|
+
|
20
|
+
it "should clear all instance variables" do
|
21
|
+
@injector.perform
|
22
|
+
@injector.object.instance_variables.should_not include(:@old)
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should set the properties" do
|
26
|
+
@injector.perform
|
27
|
+
@injector.object.instance_variable_get(:@test).should == "test value"
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should set the relations" do
|
31
|
+
@injector.perform
|
32
|
+
@injector.object.instance_variable_get(:@related_object).should == @related_object_proxy
|
33
|
+
end
|
34
|
+
|
35
|
+
it "should work without a properties hash" do
|
36
|
+
@object_hash.delete :properties
|
37
|
+
lambda do
|
38
|
+
@injector.perform
|
39
|
+
end.should_not raise_error
|
40
|
+
end
|
41
|
+
|
42
|
+
it "should work without a relations hash" do
|
43
|
+
@object_hash.delete :relations
|
44
|
+
lambda do
|
45
|
+
@injector.perform
|
46
|
+
end.should_not raise_error
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "..", "spec_helper"))
|
2
|
+
|
3
|
+
describe GOM::Object::Inspector do
|
4
|
+
|
5
|
+
before :each do
|
6
|
+
@related_object_proxy = GOM::Object.reference Object.new
|
7
|
+
|
8
|
+
@object = Object.new
|
9
|
+
@object.instance_variable_set :@test, "test value"
|
10
|
+
@object.instance_variable_set :@related_object, @related_object_proxy
|
11
|
+
|
12
|
+
@object_hash = {
|
13
|
+
:class => "Object",
|
14
|
+
:properties => { :test => "test value" },
|
15
|
+
:relations => { :related_object => @related_object_proxy }
|
16
|
+
}
|
17
|
+
|
18
|
+
@inspector = GOM::Object::Inspector.new @object
|
19
|
+
end
|
20
|
+
|
21
|
+
describe "perform" do
|
22
|
+
|
23
|
+
it "should return the correct object hash" do
|
24
|
+
@inspector.perform
|
25
|
+
@inspector.object_hash.should == @object_hash
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
@@ -0,0 +1,158 @@
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "..", "spec_helper"))
|
2
|
+
|
3
|
+
describe GOM::Object::Mapping do
|
4
|
+
|
5
|
+
before :each do
|
6
|
+
@object = Object.new
|
7
|
+
@id = GOM::Object::Id.new "test_storage", "object_1"
|
8
|
+
@mapping = GOM::Object::Mapping.new
|
9
|
+
end
|
10
|
+
|
11
|
+
describe "put" do
|
12
|
+
|
13
|
+
it "should store a mapping between an object and an id" do
|
14
|
+
@mapping.put @object, @id
|
15
|
+
@mapping.object_by_id(@id).should == @object
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
|
20
|
+
describe "with a mapping" do
|
21
|
+
|
22
|
+
before :each do
|
23
|
+
@same_id = GOM::Object::Id.new "test_storage", "object_1"
|
24
|
+
@mapping.put @object, @id
|
25
|
+
end
|
26
|
+
|
27
|
+
describe "object_by_id" do
|
28
|
+
|
29
|
+
it "should return the object to the given id" do
|
30
|
+
@mapping.object_by_id(@id).should == @object
|
31
|
+
@mapping.object_by_id(@same_id).should == @object
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
describe "id_by_object" do
|
37
|
+
|
38
|
+
it "should return the id to the given object" do
|
39
|
+
@mapping.id_by_object(@object).should == @id
|
40
|
+
@mapping.id_by_object(@object).should == @same_id
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
describe "remove_by_id" do
|
46
|
+
|
47
|
+
it "should remove the mapping identified by id" do
|
48
|
+
@mapping.remove_by_id @id
|
49
|
+
@mapping.object_by_id(@id).should be_nil
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
|
54
|
+
describe "remove_by_object" do
|
55
|
+
|
56
|
+
it "should remove the mapping identified by object" do
|
57
|
+
@mapping.remove_by_object @object
|
58
|
+
@mapping.id_by_object(@object).should be_nil
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
|
65
|
+
describe "class method" do
|
66
|
+
|
67
|
+
before :each do
|
68
|
+
@object = Object.new
|
69
|
+
@id = GOM::Object::Id.new "test_storage", "object_1"
|
70
|
+
|
71
|
+
@mapping = Object.new
|
72
|
+
@mapping.stub!(:put)
|
73
|
+
@mapping.stub!(:object_by_id).and_return(@object)
|
74
|
+
@mapping.stub!(:id_by_object).and_return(@id)
|
75
|
+
end
|
76
|
+
|
77
|
+
describe "singleton" do
|
78
|
+
|
79
|
+
before :each do
|
80
|
+
GOM::Object::Mapping.stub!(:new).and_return(@mapping)
|
81
|
+
end
|
82
|
+
|
83
|
+
it "should initialize just one mapping instance" do
|
84
|
+
GOM::Object::Mapping.should_receive(:new).once.and_return(@mapping)
|
85
|
+
GOM::Object::Mapping.singleton
|
86
|
+
GOM::Object::Mapping.singleton
|
87
|
+
end
|
88
|
+
|
89
|
+
end
|
90
|
+
|
91
|
+
describe "put" do
|
92
|
+
|
93
|
+
before :each do
|
94
|
+
GOM::Object::Mapping.stub!(:singleton).and_return(@mapping)
|
95
|
+
end
|
96
|
+
|
97
|
+
it "should call put on the mapping instance" do
|
98
|
+
@mapping.should_receive(:put).with(@object, @id)
|
99
|
+
GOM::Object::Mapping.put @object, @id
|
100
|
+
end
|
101
|
+
|
102
|
+
end
|
103
|
+
|
104
|
+
describe "object_by_id" do
|
105
|
+
|
106
|
+
before :each do
|
107
|
+
GOM::Object::Mapping.stub!(:singleton).and_return(@mapping)
|
108
|
+
end
|
109
|
+
|
110
|
+
it "should call object_by_id on the mapping instance" do
|
111
|
+
@mapping.should_receive(:object_by_id).with(@id).and_return(@object)
|
112
|
+
GOM::Object::Mapping.object_by_id(@id).should == @object
|
113
|
+
end
|
114
|
+
|
115
|
+
end
|
116
|
+
|
117
|
+
describe "id_by_object" do
|
118
|
+
|
119
|
+
before :each do
|
120
|
+
GOM::Object::Mapping.stub!(:singleton).and_return(@mapping)
|
121
|
+
end
|
122
|
+
|
123
|
+
it "should call id_by_object on the mapping instance" do
|
124
|
+
@mapping.should_receive(:id_by_object).with(@object).and_return(@id)
|
125
|
+
GOM::Object::Mapping.id_by_object(@object).should == @id
|
126
|
+
end
|
127
|
+
|
128
|
+
end
|
129
|
+
|
130
|
+
describe "remove_by_id" do
|
131
|
+
|
132
|
+
before :each do
|
133
|
+
GOM::Object::Mapping.stub!(:singleton).and_return(@mapping)
|
134
|
+
end
|
135
|
+
|
136
|
+
it "should call remove_by_id on the mapping instance" do
|
137
|
+
@mapping.should_receive(:remove_by_id).with(@id)
|
138
|
+
GOM::Object::Mapping.remove_by_id(@id)
|
139
|
+
end
|
140
|
+
|
141
|
+
end
|
142
|
+
|
143
|
+
describe "remove_by_object" do
|
144
|
+
|
145
|
+
before :each do
|
146
|
+
GOM::Object::Mapping.stub!(:singleton).and_return(@mapping)
|
147
|
+
end
|
148
|
+
|
149
|
+
it "should call remove_by_object on the mapping instance" do
|
150
|
+
@mapping.should_receive(:remove_by_object).with(@object)
|
151
|
+
GOM::Object::Mapping.remove_by_object(@object)
|
152
|
+
end
|
153
|
+
|
154
|
+
end
|
155
|
+
|
156
|
+
end
|
157
|
+
|
158
|
+
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "..", "spec_helper"))
|
2
|
+
|
3
|
+
describe GOM::Object::Proxy do
|
4
|
+
|
5
|
+
describe "initialized with an object" do
|
6
|
+
|
7
|
+
before :each do
|
8
|
+
@object = mock Object, :test_method => nil
|
9
|
+
|
10
|
+
@proxy = GOM::Object::Proxy.new @object
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should pass every call to the object" do
|
14
|
+
@object.should_receive(:test_method).with(:test_argument).and_return(:test_result)
|
15
|
+
@proxy.test_method(:test_argument).should == :test_result
|
16
|
+
end
|
17
|
+
|
18
|
+
describe "object" do
|
19
|
+
|
20
|
+
it "should return the original object" do
|
21
|
+
@proxy.object.should == @object
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "id" do
|
27
|
+
|
28
|
+
before :each do
|
29
|
+
@id = mock GOM::Object::Id
|
30
|
+
GOM::Object::Mapping.stub(:id_by_object).and_return(@id)
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should fetch the id from the mapping" do
|
34
|
+
GOM::Object::Mapping.should_receive(:id_by_object).with(@object).and_return(@id)
|
35
|
+
@proxy.id
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should return the fetched id" do
|
39
|
+
@proxy.id.should == @id
|
40
|
+
end
|
41
|
+
|
42
|
+
it "should return nil if no mapping exists" do
|
43
|
+
GOM::Object::Mapping.stub(:id_by_object).and_return(nil)
|
44
|
+
@proxy.id.should be_nil
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
|
51
|
+
describe "initialized with an id" do
|
52
|
+
|
53
|
+
before :each do
|
54
|
+
@id = GOM::Object::Id.new "test_storage", "object_1"
|
55
|
+
|
56
|
+
@object = mock Object, :test_method => nil
|
57
|
+
|
58
|
+
@fetcher = mock GOM::Storage::Fetcher, :object => @object
|
59
|
+
GOM::Storage::Fetcher.stub(:new).and_return(@fetcher)
|
60
|
+
|
61
|
+
@proxy = GOM::Object::Proxy.new @id
|
62
|
+
end
|
63
|
+
|
64
|
+
it "should fetch the object before the call is passed to it" do
|
65
|
+
GOM::Storage::Fetcher.should_receive(:new).with(@id).and_return(@fetcher)
|
66
|
+
@fetcher.should_receive(:object).and_return(@object)
|
67
|
+
@object.should_receive(:test_method).with(:test_argument).and_return(:test_result)
|
68
|
+
@proxy.test_method(:test_argument).should == :test_result
|
69
|
+
end
|
70
|
+
|
71
|
+
describe "object" do
|
72
|
+
|
73
|
+
it "should return the original object" do
|
74
|
+
GOM::Storage::Fetcher.should_receive(:new).with(@id).and_return(@fetcher)
|
75
|
+
@fetcher.should_receive(:object).and_return(@object)
|
76
|
+
@proxy.object.should == @object
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
80
|
+
|
81
|
+
describe "id" do
|
82
|
+
|
83
|
+
it "should return the id" do
|
84
|
+
@proxy.id.should == @id
|
85
|
+
end
|
86
|
+
|
87
|
+
end
|
88
|
+
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|