gom 0.2.0 → 0.3.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.
Files changed (37) hide show
  1. data/README.rdoc +15 -0
  2. data/Rakefile +1 -1
  3. data/lib/gom.rb +1 -0
  4. data/lib/gom/object.rb +15 -19
  5. data/lib/gom/object/builder.rb +35 -33
  6. data/lib/gom/object/cached_builder.rb +23 -31
  7. data/lib/gom/object/collection.rb +49 -57
  8. data/lib/gom/object/draft.rb +17 -25
  9. data/lib/gom/object/id.rb +14 -22
  10. data/lib/gom/object/inspector.rb +46 -54
  11. data/lib/gom/object/mapping.rb +31 -47
  12. data/lib/gom/object/proxy.rb +25 -33
  13. data/lib/gom/spec.rb +11 -0
  14. data/lib/gom/spec/acceptance/adapter_that_needs_setup.rb +58 -0
  15. data/lib/gom/spec/acceptance/adapter_with_stateful_storage.rb +19 -21
  16. data/lib/gom/spec/acceptance/read_only_adapter_with_stateless_storage.rb +9 -8
  17. data/lib/gom/spec/object.rb +8 -0
  18. data/lib/gom/storage.rb +30 -26
  19. data/lib/gom/storage/adapter.rb +26 -43
  20. data/lib/gom/storage/configuration.rb +75 -68
  21. data/lib/gom/storage/configuration/view.rb +3 -16
  22. data/lib/gom/storage/configuration/view/class.rb +5 -22
  23. data/lib/gom/storage/configuration/view/map_reduce.rb +7 -24
  24. data/lib/gom/storage/fetcher.rb +24 -32
  25. data/lib/gom/storage/remover.rb +27 -35
  26. data/lib/gom/storage/saver.rb +35 -43
  27. data/spec/acceptance/adapter_spec.rb +16 -4
  28. data/spec/acceptance/fake_adapter_spec.rb +11 -0
  29. data/spec/acceptance/object_spec.rb +4 -1
  30. data/spec/fake_adapter.rb +12 -3
  31. data/spec/lib/gom/object/builder_spec.rb +5 -5
  32. data/spec/lib/gom/object/inspector_spec.rb +5 -9
  33. data/spec/lib/gom/object/mapping_spec.rb +27 -57
  34. data/spec/lib/gom/storage/adapter_spec.rb +1 -1
  35. data/spec/lib/gom/storage/configuration_spec.rb +33 -3
  36. data/spec/lib/gom/storage_spec.rb +19 -0
  37. metadata +50 -46
@@ -1,44 +1,36 @@
1
1
 
2
- module GOM
2
+ # Fetches an object from the storage.
3
+ class GOM::Storage::Fetcher
3
4
 
4
- module Storage
5
+ attr_accessor :id
5
6
 
6
- # Fetches an object from the storage.
7
- class Fetcher
8
-
9
- attr_accessor :id
10
-
11
- def initialize(id)
12
- @id = id
13
- end
14
-
15
- def object
16
- fetch_draft
17
- return unless has_draft?
18
- build_object
19
- @object
20
- end
21
-
22
- private
7
+ def initialize(id)
8
+ @id = id
9
+ end
23
10
 
24
- def fetch_draft
25
- @draft = @id ? adapter.fetch(@id.object_id) : nil
26
- end
11
+ def object
12
+ fetch_draft
13
+ return unless has_draft?
14
+ build_object
15
+ @object
16
+ end
27
17
 
28
- def has_draft?
29
- !!@draft
30
- end
18
+ private
31
19
 
32
- def build_object
33
- @object = GOM::Object::CachedBuilder.new(@draft, @id).object
34
- end
20
+ def fetch_draft
21
+ @draft = @id ? adapter.fetch(@id.object_id) : nil
22
+ end
35
23
 
36
- def adapter
37
- @adapter ||= GOM::Storage::Configuration[@id.storage_name].adapter
38
- end
24
+ def has_draft?
25
+ !!@draft
26
+ end
39
27
 
40
- end
28
+ def build_object
29
+ @object = GOM::Object::CachedBuilder.new(@draft, @id).object
30
+ end
41
31
 
32
+ def adapter
33
+ @adapter ||= GOM::Storage::Configuration[@id.storage_name].adapter
42
34
  end
43
35
 
44
36
  end
@@ -1,47 +1,39 @@
1
1
 
2
- module GOM
2
+ # Removes an object from the storage.
3
+ class GOM::Storage::Remover
3
4
 
4
- module Storage
5
+ attr_reader :object
6
+ attr_reader :id
5
7
 
6
- # Removes an object from the storage.
7
- class Remover
8
-
9
- attr_reader :object
10
- attr_reader :id
11
-
12
- def initialize(object_or_id)
13
- @object, @id = object_or_id.is_a?(GOM::Object::Id) ?
14
- [ nil, object_or_id ] :
15
- [ object_or_id, nil ]
16
- end
17
-
18
- def perform
19
- check_mapping
20
- remove_object
21
- remove_mapping
22
- end
23
-
24
- private
8
+ def initialize(object_or_id)
9
+ @object, @id = object_or_id.is_a?(GOM::Object::Id) ?
10
+ [ nil, object_or_id ] :
11
+ [ object_or_id, nil ]
12
+ end
25
13
 
26
- def check_mapping
27
- @id ||= GOM::Object::Mapping.id_by_object @object
28
- raise ArgumentError, "No id existing for the given object!" unless @id
29
- end
14
+ def perform
15
+ check_mapping
16
+ remove_object
17
+ remove_mapping
18
+ end
30
19
 
31
- def remove_object
32
- adapter.remove @id.object_id
33
- end
20
+ private
34
21
 
35
- def remove_mapping
36
- GOM::Object::Mapping.remove_by_object @object
37
- end
22
+ def check_mapping
23
+ @id ||= GOM::Object::Mapping.id_by_object @object
24
+ raise ArgumentError, "No id existing for the given object!" unless @id
25
+ end
38
26
 
39
- def adapter
40
- @adapter ||= GOM::Storage::Configuration[@id.storage_name].adapter
41
- end
27
+ def remove_object
28
+ adapter.remove @id.object_id
29
+ end
42
30
 
43
- end
31
+ def remove_mapping
32
+ GOM::Object::Mapping.remove_by_object @object
33
+ end
44
34
 
35
+ def adapter
36
+ @adapter ||= GOM::Storage::Configuration[@id.storage_name].adapter
45
37
  end
46
38
 
47
39
  end
@@ -1,57 +1,49 @@
1
1
 
2
- module GOM
2
+ # Stores an object to the storage.
3
+ class GOM::Storage::Saver
3
4
 
4
- module Storage
5
+ attr_reader :object
6
+ attr_reader :storage_name
5
7
 
6
- # Stores an object to the storage.
7
- class Saver
8
-
9
- attr_reader :object
10
- attr_reader :storage_name
11
-
12
- def initialize(object, storage_name = nil)
13
- @object, @storage_name = object, storage_name
14
- end
15
-
16
- def perform
17
- fetch_id
18
- update_storage_name
19
- inspect_object
20
- store_draft
21
- store_id
22
- end
23
-
24
- private
8
+ def initialize(object, storage_name = nil)
9
+ @object, @storage_name = object, storage_name
10
+ end
25
11
 
26
- def fetch_id
27
- @id = GOM::Object::Mapping.id_by_object @object
28
- end
12
+ def perform
13
+ fetch_id
14
+ update_storage_name
15
+ inspect_object
16
+ store_draft
17
+ store_id
18
+ end
29
19
 
30
- def update_storage_name
31
- @storage_name ||= @id.storage_name if @id
32
- @storage_name ||= GOM::Storage::Configuration.default.name
33
- end
20
+ private
34
21
 
35
- def inspect_object
36
- @draft = GOM::Object::Inspector.new(@object).draft
37
- @draft.id = @id.object_id if @id
38
- end
22
+ def fetch_id
23
+ @id = GOM::Object::Mapping.id_by_object @object
24
+ end
39
25
 
40
- def store_draft
41
- object_id = adapter.store @draft
42
- @id = GOM::Object::Id.new @storage_name.to_s, object_id
43
- end
26
+ def update_storage_name
27
+ @storage_name ||= @id.storage_name if @id
28
+ @storage_name ||= GOM::Storage::Configuration.default.name
29
+ end
44
30
 
45
- def store_id
46
- GOM::Object::Mapping.put @object, @id
47
- end
31
+ def inspect_object
32
+ @draft = GOM::Object::Inspector.new(@object).draft
33
+ @draft.id = @id.object_id if @id
34
+ end
48
35
 
49
- def adapter
50
- GOM::Storage::Configuration[@storage_name].adapter
51
- end
36
+ def store_draft
37
+ object_id = adapter.store @draft
38
+ @id = GOM::Object::Id.new @storage_name.to_s, object_id
39
+ end
52
40
 
53
- end
41
+ def store_id
42
+ GOM::Object::Mapping.put @object, @id
43
+ end
54
44
 
45
+ def adapter
46
+ GOM::Storage::Configuration[@storage_name].adapter
55
47
  end
56
48
 
57
49
  end
@@ -1,10 +1,22 @@
1
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
2
 
4
3
  GOM::Storage::Configuration.read File.join(File.dirname(__FILE__), "..", "storage.configuration")
5
4
 
6
- describe "fake adapter" do
5
+ describe "adapter" do
7
6
 
8
- it_should_behave_like "an adapter connected to a stateful storage"
7
+ before :each do
8
+ GOM::Storage.teardown
9
+ end
9
10
 
10
- end
11
+ describe "setup" do
12
+
13
+ it "should raise a #{GOM::Storage::AdapterNotFoundError} if no adapter of that name is registered" do
14
+ GOM::Storage::Configuration[:test_storage].hash[:adapter] = "invalid"
15
+ lambda do
16
+ GOM::Storage.setup
17
+ end.should raise_error(GOM::Storage::AdapterNotFoundError)
18
+ end
19
+
20
+ end
21
+
22
+ end
@@ -0,0 +1,11 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), "..", "spec_helper"))
2
+
3
+ GOM::Storage::Configuration.read File.join(File.dirname(__FILE__), "..", "storage.configuration")
4
+
5
+ describe "fake adapter" do
6
+
7
+ it_should_behave_like "an adapter that needs setup"
8
+
9
+ it_should_behave_like "an adapter connected to a stateful storage"
10
+
11
+ end
@@ -1,5 +1,4 @@
1
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
2
 
4
3
  GOM::Storage::Configuration.read File.join(File.dirname(__FILE__), "..", "storage.configuration")
5
4
 
@@ -10,6 +9,10 @@ describe "object" do
10
9
  @object = Object.new
11
10
  end
12
11
 
12
+ after :each do
13
+ GOM::Storage.teardown
14
+ end
15
+
13
16
  describe "getting it's id" do
14
17
 
15
18
  before :each do
data/spec/fake_adapter.rb CHANGED
@@ -37,15 +37,22 @@ class FakeAdapter < GOM::Storage::Adapter
37
37
  @store = { }
38
38
  end
39
39
 
40
+ def teardown
41
+ @store = nil
42
+ end
43
+
40
44
  def fetch(id)
45
+ raise GOM::Storage::Adapter::NoSetupError unless @store
41
46
  @store[id]
42
47
  end
43
48
 
44
49
  def store(draft)
50
+ raise GOM::Storage::Adapter::NoSetupError unless @store
45
51
  # store relations
46
52
  draft.relations.each do |key, related_object_proxy|
47
- GOM::Storage.store related_object_proxy.object, configuration.name
48
- id = GOM::Object::Mapping.id_by_object related_object_proxy.object
53
+ related_object = related_object_proxy.object
54
+ GOM::Storage.store related_object, configuration.name
55
+ id = GOM::Object::Mapping.id_by_object related_object
49
56
  draft.relations[key] = GOM::Object::Proxy.new id
50
57
  end
51
58
 
@@ -59,13 +66,15 @@ class FakeAdapter < GOM::Storage::Adapter
59
66
  end
60
67
 
61
68
  def remove(id)
69
+ raise GOM::Storage::Adapter::NoSetupError unless @store
62
70
  @store.delete id
63
71
  end
64
72
 
65
73
  def collection(view_name)
74
+ raise GOM::Storage::Adapter::NoSetupError unless @store
66
75
  case view_name.to_sym
67
76
  when :test_object_class_view
68
- GOM::Object::Collection.new ClassCollectionFetcher.new(@store, configuration.name, "Object")
77
+ GOM::Object::Collection.new ClassCollectionFetcher.new(@store, configuration.name, "GOM::Spec::Object")
69
78
  when :test_map_view
70
79
  GOM::Object::Collection.new MapReduceCollectionFetcher.new(@store, configuration.name, :number, 11)
71
80
  end
@@ -3,9 +3,9 @@ require File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "..", "sp
3
3
  describe GOM::Object::Builder do
4
4
 
5
5
  before :each do
6
- @related_object_proxy = Object.new
6
+ @related_object_proxy = mock GOM::Object::Proxy
7
7
 
8
- @draft = GOM::Object::Draft.new nil, "Object", { :test => "test value" }, { :related_object => @related_object_proxy }
8
+ @draft = GOM::Object::Draft.new nil, GOM::Spec::Object.to_s, { :number => 21 }, { :related_object => @related_object_proxy }
9
9
  @builder = described_class.new @draft
10
10
  end
11
11
 
@@ -13,7 +13,7 @@ describe GOM::Object::Builder do
13
13
 
14
14
  it "should initialize an object of the right class" do
15
15
  object = @builder.object
16
- object.class.should == Object
16
+ object.class.should == GOM::Spec::Object
17
17
  end
18
18
 
19
19
  it "should not initialize an object if one is given" do
@@ -24,12 +24,12 @@ describe GOM::Object::Builder do
24
24
 
25
25
  it "should set the properties" do
26
26
  object = @builder.object
27
- object.instance_variable_get(:@test).should == "test value"
27
+ object.number.should == 21
28
28
  end
29
29
 
30
30
  it "should set the relations" do
31
31
  object = @builder.object
32
- object.instance_variable_get(:@related_object).should == @related_object_proxy
32
+ object.related_object.should == @related_object_proxy
33
33
  end
34
34
 
35
35
  it "should work without a properties hash" do
@@ -3,24 +3,20 @@ require File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "..", "sp
3
3
  describe GOM::Object::Inspector do
4
4
 
5
5
  before :each do
6
- @related_object_proxy = GOM::Object.reference Object.new
6
+ @related_object_proxy = GOM::Object.reference GOM::Spec::Object.new
7
7
 
8
- @object = Object.new
9
- @object.instance_variable_set :@test, "test value"
10
- @object.instance_variable_set :@related_object, @related_object_proxy
8
+ @object = GOM::Spec::Object.new
9
+ @object.number = 12
10
+ @object.related_object = @related_object_proxy
11
11
 
12
12
  @inspector = GOM::Object::Inspector.new @object
13
13
  end
14
14
 
15
15
  describe "draft" do
16
16
 
17
- before :each do
18
- @draft = GOM::Object::Draft.new nil, "Object", { :test => "test value" }, { :related_object => @related_object_proxy }
19
- end
20
-
21
17
  it "should return the correct draft" do
22
18
  draft = @inspector.draft
23
- draft.should == @draft
19
+ draft.should == GOM::Object::Draft.new(nil, GOM::Spec::Object.to_s, { :number => 12 }, { :related_object => @related_object_proxy })
24
20
  end
25
21
 
26
22
  end
@@ -60,6 +60,23 @@ describe GOM::Object::Mapping do
60
60
 
61
61
  end
62
62
 
63
+ describe "size" do
64
+
65
+ it "should return the number of mapping entries" do
66
+ @mapping.size.should == 1
67
+ end
68
+
69
+ end
70
+
71
+ describe "clear!" do
72
+
73
+ it "should remove all mappings" do
74
+ @mapping.clear!
75
+ @mapping.size.should == 0
76
+ end
77
+
78
+ end
79
+
63
80
  end
64
81
 
65
82
  describe "class method" do
@@ -88,67 +105,20 @@ describe GOM::Object::Mapping do
88
105
 
89
106
  end
90
107
 
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
108
+ [ :put, :object_by_id, :id_by_object, :remove_by_id, :remove_by_object, :size ].each do |method_name|
127
109
 
128
- end
110
+ describe "put" do
129
111
 
130
- describe "remove_by_id" do
112
+ before :each do
113
+ GOM::Object::Mapping.stub(:singleton).and_return(@mapping)
114
+ end
131
115
 
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
116
+ it "should call #{method_name} on the mapping instance" do
117
+ @mapping.should_receive(method_name).with(:argument).and_return(:result)
118
+ result = GOM::Object::Mapping.send method_name, :argument
119
+ result.should == :result
120
+ end
148
121
 
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
122
  end
153
123
 
154
124
  end