gom-filesystem-adapter 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +4 -0
- data/lib/gom/storage/filesystem.rb +1 -0
- data/lib/gom/storage/filesystem/adapter.rb +16 -13
- data/lib/gom/storage/filesystem/collection.rb +18 -0
- data/lib/gom/storage/filesystem/collection/fetcher.rb +32 -0
- data/lib/gom/storage/filesystem/loader.rb +20 -19
- data/spec/gom/storage/filesystem/adapter_spec.rb +51 -14
- data/spec/gom/storage/filesystem/collection/fetcher_spec.rb +24 -0
- data/spec/gom/storage/filesystem/loader_spec.rb +13 -16
- data/spec/storage.configuration +6 -3
- metadata +9 -5
data/README.rdoc
CHANGED
@@ -42,6 +42,10 @@ A fetch of that book would look like:
|
|
42
42
|
The fetched object would have the instance variable <tt>@pages</tt> set to <tt>1253</tt> and <tt>@author</tt> would
|
43
43
|
point to an object of the class <tt>Author</tt> with the id <tt>author_1</tt>.
|
44
44
|
|
45
|
+
== Views
|
46
|
+
|
47
|
+
This adapter currently supports class views. For documentation see http://github.com/phifty/gom.
|
48
|
+
|
45
49
|
== Development
|
46
50
|
|
47
51
|
Development has been done test-driven and the code follows at most the Clean Code paradigms. Code smells has been
|
@@ -6,6 +6,7 @@ module GOM
|
|
6
6
|
module Filesystem
|
7
7
|
|
8
8
|
autoload :Adapter, File.join(File.dirname(__FILE__), "filesystem", "adapter")
|
9
|
+
autoload :Collection, File.join(File.dirname(__FILE__), "filesystem", "collection")
|
9
10
|
autoload :Loader, File.join(File.dirname(__FILE__), "filesystem", "loader")
|
10
11
|
|
11
12
|
end
|
@@ -8,33 +8,36 @@ module GOM
|
|
8
8
|
# The filesystem storage adapter
|
9
9
|
class Adapter < GOM::Storage::Adapter
|
10
10
|
|
11
|
-
def initialize(configuration)
|
12
|
-
super configuration
|
13
|
-
end
|
14
|
-
|
15
11
|
def setup
|
16
|
-
|
12
|
+
load_drafts
|
17
13
|
end
|
18
14
|
|
19
15
|
def fetch(id)
|
20
|
-
@
|
16
|
+
@drafts[id]
|
17
|
+
end
|
18
|
+
|
19
|
+
def store(*arguments)
|
20
|
+
read_only_error
|
21
21
|
end
|
22
22
|
|
23
|
-
def
|
24
|
-
read_only_error
|
23
|
+
def remove(*arguments)
|
24
|
+
read_only_error
|
25
25
|
end
|
26
26
|
|
27
|
-
def
|
28
|
-
|
27
|
+
def collection(view_name, options = { })
|
28
|
+
view = configuration.views[view_name.to_sym]
|
29
|
+
raise ViewNotFoundError, "there are no view with the name #{view_name}" unless view
|
30
|
+
fetcher = Collection::Fetcher.new @drafts, view
|
31
|
+
GOM::Object::Collection.new fetcher
|
29
32
|
end
|
30
33
|
|
31
34
|
private
|
32
35
|
|
33
|
-
def
|
34
|
-
@
|
36
|
+
def load_drafts
|
37
|
+
@drafts = GOM::Storage::Filesystem::Loader.new(configuration[:directory]).drafts
|
35
38
|
end
|
36
39
|
|
37
|
-
def read_only_error
|
40
|
+
def read_only_error
|
38
41
|
raise GOM::Storage::ReadOnlyError, "The adapter doesn't provide write methods"
|
39
42
|
end
|
40
43
|
|
@@ -0,0 +1,32 @@
|
|
1
|
+
|
2
|
+
module GOM
|
3
|
+
|
4
|
+
module Storage
|
5
|
+
|
6
|
+
module Filesystem
|
7
|
+
|
8
|
+
module Collection
|
9
|
+
|
10
|
+
# A class collection fetcher for the filesystem adapter.
|
11
|
+
class Fetcher
|
12
|
+
|
13
|
+
attr_accessor :drafts
|
14
|
+
attr_accessor :view
|
15
|
+
|
16
|
+
def initialize(drafts, view)
|
17
|
+
@drafts, @view = drafts, view
|
18
|
+
end
|
19
|
+
|
20
|
+
def drafts
|
21
|
+
@drafts.values.select{ |draft| draft.class_name == @view.class_name }
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
@@ -13,18 +13,17 @@ module GOM
|
|
13
13
|
|
14
14
|
def initialize(directory)
|
15
15
|
@directory = directory
|
16
|
-
@data = { }
|
17
16
|
end
|
18
17
|
|
19
|
-
def
|
18
|
+
def drafts
|
19
|
+
@drafts = { }
|
20
20
|
load_yml_files
|
21
|
-
@
|
21
|
+
@drafts
|
22
22
|
end
|
23
23
|
|
24
24
|
private
|
25
25
|
|
26
26
|
def load_yml_files
|
27
|
-
@data = { }
|
28
27
|
Dir[File.join(@directory, "*.yml")].each do |filename|
|
29
28
|
load_yml_file filename
|
30
29
|
end
|
@@ -37,43 +36,45 @@ module GOM
|
|
37
36
|
|
38
37
|
def load_file_hash(classname, file_hash)
|
39
38
|
file_hash.each do |id, hash|
|
40
|
-
@
|
39
|
+
@drafts[id] = Builder.new(classname, hash).draft
|
41
40
|
end
|
42
41
|
end
|
43
42
|
|
44
|
-
# Builds
|
43
|
+
# Builds a draft out of the file hashes.
|
45
44
|
class Builder
|
46
45
|
|
47
|
-
|
46
|
+
def initialize(class_name, hash)
|
47
|
+
@class_name, @hash = class_name, hash
|
48
|
+
end
|
48
49
|
|
49
|
-
def
|
50
|
-
@
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
50
|
+
def draft
|
51
|
+
@draft = GOM::Object::Draft.new
|
52
|
+
set_class_name
|
53
|
+
set_properties
|
54
|
+
set_relations
|
55
|
+
@draft
|
55
56
|
end
|
56
57
|
|
57
58
|
private
|
58
59
|
|
59
|
-
def
|
60
|
-
@
|
60
|
+
def set_class_name
|
61
|
+
@draft.class_name = @class_name
|
61
62
|
end
|
62
63
|
|
63
|
-
def
|
64
|
+
def set_properties
|
64
65
|
properties = { }
|
65
66
|
(@hash["properties"] || { }).each do |key, value|
|
66
67
|
properties[key] = value
|
67
68
|
end
|
68
|
-
@
|
69
|
+
@draft.properties = properties unless properties.empty?
|
69
70
|
end
|
70
71
|
|
71
|
-
def
|
72
|
+
def set_relations
|
72
73
|
relations = { }
|
73
74
|
(@hash["relations"] || { }).each do |key, value|
|
74
75
|
relations[key] = GOM::Object::Proxy.new GOM::Object::Id.new(value)
|
75
76
|
end
|
76
|
-
@
|
77
|
+
@draft.relations = relations unless relations.empty?
|
77
78
|
end
|
78
79
|
|
79
80
|
end
|
@@ -3,18 +3,10 @@ require File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "..", "sp
|
|
3
3
|
describe GOM::Storage::Filesystem::Adapter do
|
4
4
|
|
5
5
|
before :each do
|
6
|
-
@
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
},
|
11
|
-
"object_2" => {
|
12
|
-
:class => "Object",
|
13
|
-
:properties => { :test => "another test value" }
|
14
|
-
}
|
15
|
-
}
|
16
|
-
|
17
|
-
@loader = mock GOM::Storage::Filesystem::Loader, :data => @data
|
6
|
+
@draft = mock GOM::Object::Draft
|
7
|
+
@drafts = mock Hash, :[] => @draft
|
8
|
+
|
9
|
+
@loader = mock GOM::Storage::Filesystem::Loader, :drafts => @drafts
|
18
10
|
GOM::Storage::Filesystem::Loader.stub(:new).and_return(@loader)
|
19
11
|
|
20
12
|
@configuration = mock GOM::Storage::Configuration
|
@@ -34,7 +26,7 @@ describe GOM::Storage::Filesystem::Adapter do
|
|
34
26
|
end
|
35
27
|
|
36
28
|
it "should load the data" do
|
37
|
-
@loader.should_receive(:
|
29
|
+
@loader.should_receive(:drafts).and_return(@drafts)
|
38
30
|
@adapter.setup
|
39
31
|
end
|
40
32
|
|
@@ -47,7 +39,7 @@ describe GOM::Storage::Filesystem::Adapter do
|
|
47
39
|
end
|
48
40
|
|
49
41
|
it "should return the object hash" do
|
50
|
-
@adapter.fetch("object_1").should == @
|
42
|
+
@adapter.fetch("object_1").should == @draft
|
51
43
|
end
|
52
44
|
|
53
45
|
end
|
@@ -72,4 +64,49 @@ describe GOM::Storage::Filesystem::Adapter do
|
|
72
64
|
|
73
65
|
end
|
74
66
|
|
67
|
+
describe "collection" do
|
68
|
+
|
69
|
+
before :each do
|
70
|
+
@adapter.setup
|
71
|
+
|
72
|
+
@view = mock GOM::Storage::Configuration::View::Class
|
73
|
+
@views = mock Hash, :[] => @view
|
74
|
+
@configuration.stub(:views).and_return(@views)
|
75
|
+
|
76
|
+
@fetcher = mock GOM::Storage::Filesystem::Collection::Fetcher
|
77
|
+
GOM::Storage::Filesystem::Collection::Fetcher.stub(:new).and_return(@fetcher)
|
78
|
+
|
79
|
+
@collection = mock GOM::Object::Collection
|
80
|
+
GOM::Object::Collection.stub(:new).and_return(@collection)
|
81
|
+
end
|
82
|
+
|
83
|
+
it "should select the right view" do
|
84
|
+
@views.should_receive(:[]).with(:test_object_class_view).and_return(@view)
|
85
|
+
@adapter.collection "test_object_class_view"
|
86
|
+
end
|
87
|
+
|
88
|
+
it "should raise a #{described_class::ViewNotFoundError} if view name if invalid" do
|
89
|
+
@views.stub(:[]).and_return(nil)
|
90
|
+
lambda do
|
91
|
+
@adapter.collection :test_object_class_view
|
92
|
+
end.should raise_error(described_class::ViewNotFoundError)
|
93
|
+
end
|
94
|
+
|
95
|
+
it "should initialize the collection fetcher" do
|
96
|
+
GOM::Storage::Filesystem::Collection::Fetcher.should_receive(:new).with(@drafts, @view).and_return(@fetcher)
|
97
|
+
@adapter.collection :test_object_class_view
|
98
|
+
end
|
99
|
+
|
100
|
+
it "should initialize the collection" do
|
101
|
+
GOM::Object::Collection.should_receive(:new).and_return(@collection)
|
102
|
+
@adapter.collection :test_object_class_view
|
103
|
+
end
|
104
|
+
|
105
|
+
it "should return the collection" do
|
106
|
+
collection = @adapter.collection :test_object_class_view
|
107
|
+
collection.should == @collection
|
108
|
+
end
|
109
|
+
|
110
|
+
end
|
111
|
+
|
75
112
|
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "..", "..", "spec_helper"))
|
2
|
+
|
3
|
+
describe GOM::Storage::Filesystem::Collection::Fetcher do
|
4
|
+
|
5
|
+
before :each do
|
6
|
+
@draft_one = mock GOM::Object::Draft, :class_name => "Object"
|
7
|
+
@draft_two = mock GOM::Object::Draft, :class_name => "Test"
|
8
|
+
@drafts = mock Hash, :values => [ @draft_one, @draft_two ]
|
9
|
+
@view = mock GOM::Storage::Configuration::View::Class, :class_name => "Object"
|
10
|
+
|
11
|
+
@fetcher = described_class.new @drafts, @view
|
12
|
+
end
|
13
|
+
|
14
|
+
describe "drafts" do
|
15
|
+
|
16
|
+
it "should return an array with a selection of drafts" do
|
17
|
+
drafts = @fetcher.drafts
|
18
|
+
drafts.should include(@draft_one)
|
19
|
+
drafts.should_not include(@draft_two)
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
@@ -15,7 +15,7 @@ describe GOM::Storage::Filesystem::Loader do
|
|
15
15
|
|
16
16
|
end
|
17
17
|
|
18
|
-
describe "
|
18
|
+
describe "drafts" do
|
19
19
|
|
20
20
|
before :each do
|
21
21
|
@filename = "directory/Object.yml"
|
@@ -45,31 +45,28 @@ describe GOM::Storage::Filesystem::Loader do
|
|
45
45
|
|
46
46
|
it "should searches all .yml file in the directory" do
|
47
47
|
Dir.should_receive(:[]).with("directory/*.yml").and_return(@filenames)
|
48
|
-
@loader.
|
48
|
+
@loader.drafts
|
49
49
|
end
|
50
50
|
|
51
51
|
it "should load the files" do
|
52
52
|
YAML.should_receive(:load_file).with(@filename).and_return(@file_hash)
|
53
|
-
@loader.
|
53
|
+
@loader.drafts
|
54
54
|
end
|
55
55
|
|
56
56
|
it "should create object proxies for relations" do
|
57
57
|
GOM::Object::Proxy.should_receive(:new).with(GOM::Object::Id.new("test_storage:object_2")).and_return(@proxy)
|
58
|
-
@loader.
|
58
|
+
@loader.drafts
|
59
59
|
end
|
60
60
|
|
61
|
-
it "should convert the file hash into
|
62
|
-
@loader.
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
:properties => { "test" => "another test value" }
|
71
|
-
}
|
72
|
-
}
|
61
|
+
it "should convert the file hash into drafts" do
|
62
|
+
draft_one = @loader.drafts["object_1"]
|
63
|
+
draft_one.class_name.should == "Object"
|
64
|
+
draft_one.properties.should == { "test" => "test value" }
|
65
|
+
draft_one.relations.should == { "related_object" => @proxy }
|
66
|
+
|
67
|
+
draft_two = @loader.drafts["object_2"]
|
68
|
+
draft_two.class_name.should == "Object"
|
69
|
+
draft_two.properties.should == { "test" => "another test value" }
|
73
70
|
end
|
74
71
|
|
75
72
|
end
|
data/spec/storage.configuration
CHANGED
@@ -1,5 +1,8 @@
|
|
1
1
|
|
2
2
|
test_storage:
|
3
|
-
adapter:
|
4
|
-
directory:
|
5
|
-
|
3
|
+
adapter: filesystem
|
4
|
+
directory: /home/phifty/projects/gom-filesystem-adapter/spec/acceptance/data
|
5
|
+
views:
|
6
|
+
test_object_class_view:
|
7
|
+
type: class
|
8
|
+
class: Object
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
-
-
|
7
|
+
- 2
|
8
8
|
- 0
|
9
|
-
version: 0.
|
9
|
+
version: 0.2.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- "Philipp Br\xC3\xBCll"
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-12-
|
17
|
+
date: 2010-12-20 00:00:00 +01:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -27,9 +27,9 @@ dependencies:
|
|
27
27
|
- !ruby/object:Gem::Version
|
28
28
|
segments:
|
29
29
|
- 0
|
30
|
-
-
|
30
|
+
- 2
|
31
31
|
- 0
|
32
|
-
version: 0.
|
32
|
+
version: 0.2.0
|
33
33
|
type: :runtime
|
34
34
|
version_requirements: *id001
|
35
35
|
- !ruby/object:Gem::Dependency
|
@@ -73,9 +73,12 @@ files:
|
|
73
73
|
- Rakefile
|
74
74
|
- lib/gom/storage/filesystem/adapter.rb
|
75
75
|
- lib/gom/storage/filesystem/loader.rb
|
76
|
+
- lib/gom/storage/filesystem/collection/fetcher.rb
|
77
|
+
- lib/gom/storage/filesystem/collection.rb
|
76
78
|
- lib/gom/storage/filesystem.rb
|
77
79
|
- lib/gom/storage.rb
|
78
80
|
- lib/filesystem.rb
|
81
|
+
- spec/gom/storage/filesystem/collection/fetcher_spec.rb
|
79
82
|
- spec/gom/storage/filesystem/adapter_spec.rb
|
80
83
|
- spec/gom/storage/filesystem/loader_spec.rb
|
81
84
|
- spec/storage.configuration
|
@@ -115,6 +118,7 @@ signing_key:
|
|
115
118
|
specification_version: 3
|
116
119
|
summary: Filesystem storage adapter for the General Object Mapper.
|
117
120
|
test_files:
|
121
|
+
- spec/gom/storage/filesystem/collection/fetcher_spec.rb
|
118
122
|
- spec/gom/storage/filesystem/adapter_spec.rb
|
119
123
|
- spec/gom/storage/filesystem/loader_spec.rb
|
120
124
|
- spec/acceptance/adapter_spec.rb
|