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.
Files changed (37) hide show
  1. data/LICENSE +20 -0
  2. data/README.rdoc +111 -0
  3. data/Rakefile +48 -0
  4. data/lib/gom.rb +7 -0
  5. data/lib/gom/object.rb +23 -0
  6. data/lib/gom/object/id.rb +30 -0
  7. data/lib/gom/object/injector.rb +45 -0
  8. data/lib/gom/object/inspector.rb +55 -0
  9. data/lib/gom/object/mapping.rb +61 -0
  10. data/lib/gom/object/proxy.rb +44 -0
  11. data/lib/gom/spec.rb +4 -0
  12. data/lib/gom/spec/acceptance/adapter_with_stateful_storage.rb +111 -0
  13. data/lib/gom/spec/acceptance/read_only_adapter_with_stateless_storage.rb +50 -0
  14. data/lib/gom/storage.rb +35 -0
  15. data/lib/gom/storage/adapter.rb +51 -0
  16. data/lib/gom/storage/configuration.rb +65 -0
  17. data/lib/gom/storage/fetcher.rb +69 -0
  18. data/lib/gom/storage/remover.rb +47 -0
  19. data/lib/gom/storage/saver.rb +59 -0
  20. data/spec/acceptance/adapter_spec.rb +10 -0
  21. data/spec/acceptance/object_spec.rb +33 -0
  22. data/spec/fake_adapter.rb +37 -0
  23. data/spec/lib/gom/object/id_spec.rb +56 -0
  24. data/spec/lib/gom/object/injector_spec.rb +51 -0
  25. data/spec/lib/gom/object/inspector_spec.rb +30 -0
  26. data/spec/lib/gom/object/mapping_spec.rb +158 -0
  27. data/spec/lib/gom/object/proxy_spec.rb +91 -0
  28. data/spec/lib/gom/object_spec.rb +40 -0
  29. data/spec/lib/gom/storage/adapter_spec.rb +73 -0
  30. data/spec/lib/gom/storage/configuration_spec.rb +92 -0
  31. data/spec/lib/gom/storage/fetcher_spec.rb +89 -0
  32. data/spec/lib/gom/storage/remover_spec.rb +47 -0
  33. data/spec/lib/gom/storage/saver_spec.rb +86 -0
  34. data/spec/lib/gom/storage_spec.rb +106 -0
  35. data/spec/spec_helper.rb +7 -0
  36. data/spec/storage.configuration +4 -0
  37. metadata +138 -0
@@ -0,0 +1,40 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "spec_helper"))
2
+
3
+ describe GOM::Object do
4
+
5
+ describe "id" do
6
+
7
+ before :each do
8
+ @id_string = "test_storage:object_1"
9
+ @id = GOM::Object::Id.new @id_string
10
+ @object = Object.new
11
+ GOM::Object::Mapping.stub!(:id_by_object).and_return(@id)
12
+ end
13
+
14
+ it "should call id_by_object of object mapping" do
15
+ GOM::Object::Mapping.should_receive(:id_by_object).with(@object).and_return(@id)
16
+ GOM::Object.id(@object).should == @id_string
17
+ end
18
+
19
+ it "should return nil if the call of id_by_object returned nil" do
20
+ GOM::Object::Mapping.stub!(:id_by_object).and_return(nil)
21
+ GOM::Object.id(@object).should be_nil
22
+ end
23
+
24
+ end
25
+
26
+ describe "reference" do
27
+
28
+ before :each do
29
+ @object = Object.new
30
+ end
31
+
32
+ it "should return a proxy for the given object" do
33
+ proxy = GOM::Object.reference @object
34
+ proxy.should be_instance_of(GOM::Object::Proxy)
35
+ proxy.object.should == @object
36
+ end
37
+
38
+ end
39
+
40
+ end
@@ -0,0 +1,73 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "..", "spec_helper"))
2
+
3
+ describe GOM::Storage::Adapter do
4
+
5
+ before :each do
6
+ @configuration = Object.new
7
+ @adapter = GOM::Storage::Adapter.new @configuration
8
+ end
9
+
10
+ describe "register" do
11
+
12
+ it "should register a given adapter with a given id" do
13
+ GOM::Storage::Adapter.register :test_adapter, @adapter.class
14
+ GOM::Storage::Adapter[:test_adapter].should == @adapter.class
15
+ end
16
+
17
+ end
18
+
19
+ describe "[]" do
20
+
21
+ it "should return the adapter class" do
22
+ GOM::Storage::Adapter.register :test_adapter, @adapter.class
23
+ GOM::Storage::Adapter[:test_adapter].should == @adapter.class
24
+ end
25
+
26
+ it "should return nil if no adapter is registered" do
27
+ GOM::Storage::Adapter.instance_variable_set :@adapter_classes, nil
28
+ GOM::Storage::Adapter[:test_adapter].should be_nil
29
+ end
30
+
31
+ end
32
+
33
+ describe "setup" do
34
+
35
+ it "should raise a NotImplementedError" do
36
+ lambda do
37
+ @adapter.setup
38
+ end.should raise_error(NotImplementedError)
39
+ end
40
+
41
+ end
42
+
43
+ describe "fetch" do
44
+
45
+ it "should raise a NotImplementedError" do
46
+ lambda do
47
+ @adapter.fetch
48
+ end.should raise_error(NotImplementedError)
49
+ end
50
+
51
+ end
52
+
53
+ describe "store" do
54
+
55
+ it "should raise a NotImplementedError" do
56
+ lambda do
57
+ @adapter.store
58
+ end.should raise_error(NotImplementedError)
59
+ end
60
+
61
+ end
62
+
63
+ describe "remove" do
64
+
65
+ it "should raise a NotImplementedError" do
66
+ lambda do
67
+ @adapter.remove
68
+ end.should raise_error(NotImplementedError)
69
+ end
70
+
71
+ end
72
+
73
+ end
@@ -0,0 +1,92 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "..", "spec_helper"))
2
+
3
+ describe GOM::Storage::Configuration do
4
+
5
+ before :each do
6
+ @adapter = mock GOM::Storage::Adapter, :setup => nil
7
+ @adapter_class = mock Class, :new => @adapter
8
+ GOM::Storage::Adapter.stub(:[]).and_return(@adapter_class)
9
+
10
+ described_class.read File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "..", "storage.configuration"))
11
+ @configuration = described_class[:test_storage]
12
+ end
13
+
14
+ describe "setup" do
15
+
16
+ it "should call setup on the adapter instance" do
17
+ @adapter.should_receive(:setup)
18
+ @configuration.setup
19
+ end
20
+
21
+ end
22
+
23
+ describe "name" do
24
+
25
+ it "should return the configuration's name" do
26
+ @configuration.name.should == "test_storage"
27
+ end
28
+
29
+ end
30
+
31
+ describe "[]" do
32
+
33
+ it "should return the configuration value" do
34
+ @configuration[:test].should == "test value"
35
+ end
36
+
37
+ end
38
+
39
+ describe "values_at" do
40
+
41
+ it "should return multiple configuration values" do
42
+ @configuration.values_at(:adapter, :test).should == [ "fake_adapter", "test value" ]
43
+ end
44
+
45
+ end
46
+
47
+ describe "read" do
48
+
49
+ it "should read the configuration file" do
50
+ @configuration.should be_instance_of(described_class)
51
+ end
52
+
53
+ it "should initialize the right adapter class" do
54
+ @configuration.adapter_class.should == @adapter_class
55
+ end
56
+
57
+ it "should create an adapter instance if requested" do
58
+ @adapter_class.should_receive(:new).with(@configuration).and_return(@adapter)
59
+ @configuration.adapter.should == @adapter
60
+ end
61
+
62
+ end
63
+
64
+ describe "setup_all" do
65
+
66
+ before :each do
67
+ @configuration.stub(:setup)
68
+ end
69
+
70
+ it "should call setup on each configuration" do
71
+ @configuration.should_receive(:setup)
72
+ described_class.setup_all
73
+ end
74
+
75
+ end
76
+
77
+ describe "default" do
78
+
79
+ it "should select the first configuration" do
80
+ described_class.default.should == GOM::Storage::Configuration[:test_storage]
81
+ end
82
+
83
+ it "should raise StandardError if no configuration loaded" do
84
+ described_class.instance_variable_set :@configurations, { }
85
+ lambda do
86
+ described_class.default
87
+ end.should raise_error(StandardError)
88
+ end
89
+
90
+ end
91
+
92
+ end
@@ -0,0 +1,89 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "..", "spec_helper"))
2
+
3
+ describe GOM::Storage::Fetcher do
4
+
5
+ before :each do
6
+ @id = GOM::Object::Id.new "test_storage", "object_1"
7
+ @object = Object.new
8
+ @object.instance_variable_set :@test, "test value"
9
+ @object_hash = {
10
+ :class => "Object",
11
+ :properties => { :test => "test value" }
12
+ }
13
+
14
+ @new_method = mock Method, :arity => 3
15
+ @klass = mock Class, :new => @object, :method => @new_method
16
+ Object.stub(:const_get).and_return(@klass)
17
+
18
+ @adapter = mock GOM::Storage::Adapter, :fetch => @object_hash
19
+ @configuration = mock GOM::Storage::Configuration, :adapter => @adapter
20
+ GOM::Storage::Configuration.stub(:[]).and_return(@configuration)
21
+
22
+ GOM::Object::Mapping.stub(:object_by_id)
23
+ GOM::Object::Mapping.stub(:put)
24
+
25
+ @injector = mock GOM::Object::Injector, :perform => nil, :object => @object
26
+ GOM::Object::Injector.stub(:new).and_return(@injector)
27
+
28
+ @fetcher = described_class.new @id
29
+ @fetcher.stub(:object_class).and_return(@klass)
30
+ end
31
+
32
+ describe "object" do
33
+
34
+ it "should do no fetch if no id is given" do
35
+ @fetcher.id = nil
36
+ @adapter.should_not_receive(:fetch)
37
+ @fetcher.object
38
+ end
39
+
40
+ it "should route the call to the correct storage" do
41
+ GOM::Storage::Configuration.should_receive(:[]).with("test_storage")
42
+ @fetcher.object
43
+ end
44
+
45
+ it "should fetch the id from the adapter instance" do
46
+ @adapter.should_receive(:fetch).with("object_1").and_return(@object_hash)
47
+ @fetcher.object
48
+ end
49
+
50
+ it "should initialize the object with nil-arguments to the constructor" do
51
+ @klass.should_receive(:new).with(nil, nil, nil).and_return(@object)
52
+ @fetcher.object
53
+ end
54
+
55
+ it "should initialize the object with no arguments to the constructor if a variable argument count is needed" do
56
+ @new_method.stub(:arity).and_return(-1)
57
+ @klass.should_receive(:new).with(no_args).and_return(@object)
58
+ @fetcher.object
59
+ end
60
+
61
+ it "should check if a mapping exists for the object" do
62
+ GOM::Object::Mapping.should_receive(:object_by_id).with(@id).and_return(Object.new)
63
+ @fetcher.object
64
+ end
65
+
66
+ it "should initialize the object if not given" do
67
+ GOM::Object::Injector.should_receive(:new).with(anything, @object_hash).and_return(@injector)
68
+ @fetcher.object
69
+ end
70
+
71
+ it "should create mapping between object and id" do
72
+ GOM::Object::Mapping.should_receive(:put).with(@object, @id)
73
+ @fetcher.object
74
+ end
75
+
76
+ it "should set the object's instance variables" do
77
+ object = @fetcher.object
78
+ object.instance_variable_get(:@test).should == "test value"
79
+ end
80
+
81
+ it "should return nil if storage adapter returned nil" do
82
+ @adapter.stub(:fetch).and_return(nil)
83
+ object = @fetcher.object
84
+ object.should be_nil
85
+ end
86
+
87
+ end
88
+
89
+ end
@@ -0,0 +1,47 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "..", "spec_helper"))
2
+
3
+ describe GOM::Storage::Remover do
4
+
5
+ before :each do
6
+ @id = GOM::Object::Id.new "test_storage", "object_1"
7
+ @object = Object.new
8
+
9
+ @adapter = Object.new
10
+ @adapter.stub!(:remove)
11
+ @configuration = Object.new
12
+ @configuration.stub!(:adapter).and_return(@adapter)
13
+ GOM::Storage::Configuration.stub!(:[]).and_return(@configuration)
14
+
15
+ GOM::Object::Mapping.stub!(:id_by_object).with(@object).and_return(@id)
16
+ GOM::Object::Mapping.stub!(:remove_by_object)
17
+
18
+ @remover = GOM::Storage::Remover.new @object
19
+ end
20
+
21
+ describe "perform" do
22
+
23
+ it "should route the call to the correct storage" do
24
+ GOM::Storage::Configuration.should_receive(:[]).with("test_storage")
25
+ @remover.perform
26
+ end
27
+
28
+ it "should remove the object with the adapter instance" do
29
+ @adapter.should_receive(:remove).with("object_1")
30
+ @remover.perform
31
+ end
32
+
33
+ it "should raise an ArugmentError if no mapping for the given object exists" do
34
+ GOM::Object::Mapping.stub!(:id_by_object).with(@object).and_return(nil)
35
+ lambda do
36
+ @remover.perform
37
+ end.should raise_error(ArgumentError)
38
+ end
39
+
40
+ it "should remove the mapping" do
41
+ GOM::Object::Mapping.should_receive(:remove_by_object).with(@object)
42
+ @remover.perform
43
+ end
44
+
45
+ end
46
+
47
+ end
@@ -0,0 +1,86 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "..", "spec_helper"))
2
+
3
+ describe GOM::Storage::Saver do
4
+
5
+ before :each do
6
+ @id = GOM::Object::Id.new "test_storage", "object_1"
7
+ @object = Object.new
8
+ @object.instance_variable_set :@test, "test value"
9
+ @object.freeze
10
+ @object_hash = {
11
+ :class => "Object",
12
+ :id => "object_1",
13
+ :properties => {
14
+ :test => "test value"
15
+ }
16
+ }
17
+
18
+ GOM::Object::Mapping.stub!(:id_by_object).with(@object).and_return(@id)
19
+ GOM::Object::Mapping.stub!(:put)
20
+
21
+ @adapter = Object.new
22
+ @adapter.stub!(:store).and_return("object_1")
23
+ @configuration = Object.new
24
+ @configuration.stub!(:name).and_return("default_test_storage")
25
+ @configuration.stub!(:adapter).and_return(@adapter)
26
+ GOM::Storage::Configuration.stub!(:[]).and_return(@configuration)
27
+ GOM::Storage::Configuration.stub!(:default).and_return(@configuration)
28
+
29
+ @inspector = Object.new
30
+ @inspector.stub!(:perform)
31
+ @inspector.stub!(:object_hash).and_return(@object_hash)
32
+ GOM::Object::Inspector.stub!(:new).and_return(@inspector)
33
+
34
+ @saver = GOM::Storage::Saver.new @object
35
+ end
36
+
37
+ describe "perform" do
38
+
39
+ it "should check the mapping if an id is existing" do
40
+ GOM::Object::Mapping.should_receive(:id_by_object).with(@object).and_return(@id)
41
+ @saver.perform
42
+ end
43
+
44
+ it "should override the storage name if given" do
45
+ @saver.instance_variable_set :@storage_name, "another_test_storage"
46
+ @saver.perform
47
+ @saver.storage_name.should == "another_test_storage"
48
+ end
49
+
50
+ it "should select the default storage if no storage name can be detected" do
51
+ GOM::Object::Mapping.stub!(:id_by_object).with(@object).and_return(nil)
52
+ @saver.perform
53
+ @saver.storage_name.should == "default_test_storage"
54
+ end
55
+
56
+ it "should select the correct storage" do
57
+ GOM::Storage::Configuration.should_receive(:[]).with("test_storage").and_return(@configuration)
58
+ @saver.perform
59
+ end
60
+
61
+ it "should store the object with the adapter instance" do
62
+ @adapter.should_receive(:store).with(@object_hash).and_return("object_1")
63
+ @saver.perform
64
+ end
65
+
66
+ it "should store the object without an id if no mapping exists" do
67
+ GOM::Object::Mapping.stub!(:id_by_object).with(@object).and_return(nil)
68
+ @object_hash.delete :id
69
+
70
+ @adapter.should_receive(:store).with(@object_hash).and_return("object_1")
71
+ @saver.perform
72
+ end
73
+
74
+ it "should inspect the object" do
75
+ @inspector.should_receive(:perform)
76
+ @saver.perform
77
+ end
78
+
79
+ it "should create a mapping between object and id" do
80
+ GOM::Object::Mapping.should_receive(:put).with(@object, @id)
81
+ @saver.perform
82
+ end
83
+
84
+ end
85
+
86
+ end
@@ -0,0 +1,106 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "spec_helper"))
2
+
3
+ describe GOM::Storage do
4
+
5
+ before :each do
6
+ @id_string = "test_storage:object_1"
7
+ @object = Object.new
8
+ end
9
+
10
+ describe "setup" do
11
+
12
+ before :each do
13
+ described_class::Configuration.stub(:setup_all)
14
+ end
15
+
16
+ it "should setup all storage configurations" do
17
+ described_class::Configuration.should_receive(:setup_all)
18
+ described_class.setup
19
+ end
20
+
21
+ end
22
+
23
+ describe "fetch" do
24
+
25
+ before :each do
26
+ @id = mock GOM::Object::Id
27
+ GOM::Object::Id.stub(:new).and_return(@id)
28
+
29
+ @fetcher = mock GOM::Storage::Fetcher, :object => @object
30
+ described_class::Fetcher.stub(:new).and_return(@fetcher)
31
+ end
32
+
33
+ it "should initialize the id correctly" do
34
+ GOM::Object::Id.should_receive(:new).with(@id_string).and_return(@id)
35
+ described_class.fetch @id_string
36
+ end
37
+
38
+ it "should initialize the fetcher correctly" do
39
+ GOM::Storage::Fetcher.should_receive(:new).with(@id).and_return(@fetcher)
40
+ described_class.fetch @id_string
41
+ end
42
+
43
+ it "should return the object" do
44
+ described_class.fetch(@id_string).should == @object
45
+ end
46
+
47
+ it "should return nil if nil is given" do
48
+ described_class::Fetcher.should_receive(:new).with(nil).and_return(@fetcher)
49
+ @fetcher.stub(:object).and_return(nil)
50
+
51
+ described_class.fetch(nil).should be_nil
52
+ end
53
+
54
+ end
55
+
56
+ describe "store" do
57
+
58
+ before :each do
59
+ @storage_name = "another_test_storage"
60
+ @saver = Object.new
61
+ @saver.stub!(:perform)
62
+ described_class::Saver.stub!(:new).and_return(@saver)
63
+ end
64
+
65
+ it "should initialize the saver correctly" do
66
+ described_class::Saver.should_receive(:new).with(@object, @storage_name).and_return(@saver)
67
+ described_class.store @object, @storage_name
68
+ end
69
+
70
+ it "should perform a store" do
71
+ @saver.should_receive(:perform)
72
+ described_class.store @object
73
+ end
74
+
75
+ end
76
+
77
+ describe "remove" do
78
+
79
+ before :each do
80
+ @id = Object.new
81
+ GOM::Object::Id.stub!(:new).and_return(@id)
82
+
83
+ @remover = Object.new
84
+ @remover.stub!(:perform)
85
+ described_class::Remover.stub!(:new).and_return(@remover)
86
+ end
87
+
88
+ it "should initialize the remover correctly" do
89
+ described_class::Remover.should_receive(:new).with(@object).and_return(@remover)
90
+ described_class.remove @object
91
+ end
92
+
93
+ it "should perform a remove" do
94
+ @remover.should_receive(:perform)
95
+ described_class.remove @object
96
+ end
97
+
98
+ it "should convert a given string into an id" do
99
+ GOM::Object::Id.should_receive(:new).with("test_storage:object_1").and_return(@id)
100
+ described_class::Remover.should_receive(:new).with(@id).and_return(@remover)
101
+ described_class::remove "test_storage:object_1"
102
+ end
103
+
104
+ end
105
+
106
+ end