gom-filesystem-adapter 0.1.0 → 0.2.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/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
- load_data
12
+ load_drafts
17
13
  end
18
14
 
19
15
  def fetch(id)
20
- @data[id]
16
+ @drafts[id]
17
+ end
18
+
19
+ def store(*arguments)
20
+ read_only_error
21
21
  end
22
22
 
23
- def store(object, storage_name = nil)
24
- read_only_error "store"
23
+ def remove(*arguments)
24
+ read_only_error
25
25
  end
26
26
 
27
- def remove(object)
28
- read_only_error "remove"
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 load_data
34
- @data = GOM::Storage::Filesystem::Loader.new(configuration[:directory]).data
36
+ def load_drafts
37
+ @drafts = GOM::Storage::Filesystem::Loader.new(configuration[:directory]).drafts
35
38
  end
36
39
 
37
- def read_only_error(method_name)
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,18 @@
1
+
2
+ module GOM
3
+
4
+ module Storage
5
+
6
+ module Filesystem
7
+
8
+ module Collection
9
+
10
+ autoload :Fetcher, File.join(File.dirname(__FILE__), "collection", "fetcher")
11
+
12
+ end
13
+
14
+ end
15
+
16
+ end
17
+
18
+ end
@@ -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 data
18
+ def drafts
19
+ @drafts = { }
20
20
  load_yml_files
21
- @data
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
- @data[id] = Builder.new(classname, hash).object_hash
39
+ @drafts[id] = Builder.new(classname, hash).draft
41
40
  end
42
41
  end
43
42
 
44
- # Builds an object hash out of the file hashes.
43
+ # Builds a draft out of the file hashes.
45
44
  class Builder
46
45
 
47
- attr_reader :object_hash
46
+ def initialize(class_name, hash)
47
+ @class_name, @hash = class_name, hash
48
+ end
48
49
 
49
- def initialize(classname, hash)
50
- @classname, @hash = classname, hash
51
- @object_hash = { }
52
- copy_classname
53
- copy_properties
54
- copy_relations
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 copy_classname
60
- @object_hash[:class] = @classname
60
+ def set_class_name
61
+ @draft.class_name = @class_name
61
62
  end
62
63
 
63
- def copy_properties
64
+ def set_properties
64
65
  properties = { }
65
66
  (@hash["properties"] || { }).each do |key, value|
66
67
  properties[key] = value
67
68
  end
68
- @object_hash[:properties] = properties unless properties.empty?
69
+ @draft.properties = properties unless properties.empty?
69
70
  end
70
71
 
71
- def copy_relations
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
- @object_hash[:relations] = relations unless relations.empty?
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
- @data = {
7
- "object_1" => {
8
- :class => "Object",
9
- :properties => { :test => "test value" }
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(:data).and_return(@data)
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 == @data["object_1"]
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 "data" do
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.data
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.data
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.data
58
+ @loader.drafts
59
59
  end
60
60
 
61
- it "should convert the file hash into object hashes" do
62
- @loader.data.should == {
63
- "object_1" => {
64
- :class => "Object",
65
- :properties => { "test" => "test value" },
66
- :relations => { "related_object" => @proxy }
67
- },
68
- "object_2" => {
69
- :class => "Object",
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
@@ -1,5 +1,8 @@
1
1
 
2
2
  test_storage:
3
- adapter: filesystem
4
- directory: /home/phifty/projects/gom-filesystem-adapter/spec/acceptance/data
5
- relation_detector: _id$
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
- - 1
7
+ - 2
8
8
  - 0
9
- version: 0.1.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-08 00:00:00 +01:00
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
- - 1
30
+ - 2
31
31
  - 0
32
- version: 0.1.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