zentradi 0.0.1 → 0.0.2

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/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.1
1
+ 0.0.2
@@ -2,7 +2,7 @@ require 'hashie'
2
2
  require 'mongo'
3
3
 
4
4
  module Zdi
5
- autoload :Delegate , 'zentradi/delegate'
5
+ autoload :DocumentHelpers , 'zentradi/document_helpers'
6
6
  autoload :DocumentWrapper , 'zentradi/document_wrapper'
7
7
  autoload :Collection , 'zentradi/collection'
8
8
 
@@ -10,9 +10,8 @@ module Zdi
10
10
  attr_accessor :default_database
11
11
 
12
12
  def Collection(collection, database = Zdi.default_database)
13
- Class.new(Zdi::Collection) do
14
- instance_variable_set("@collection", database[collection])
15
- end
13
+ raise ArgumentError, "please provide a database. The default one is #{database.inspect}" unless database.is_a?(Mongo::DB)
14
+ Class.new(Zdi::Collection) { instance_variable_set("@collection", database[collection]) }
16
15
  end
17
16
  end
18
17
  end
@@ -1,9 +1,5 @@
1
1
  module Zdi
2
2
  class Collection
3
- class << self
4
- extend Zdi::Delegate
5
- delegate *(Mongo::Collection.public_instance_methods - public_instance_methods), :to => :collection
6
- end
7
3
 
8
4
  module ClassMethods
9
5
  attr_accessor :collection
@@ -29,9 +25,7 @@ module Zdi
29
25
  end
30
26
 
31
27
  def create(attributes = {})
32
- doc = build(attributes)
33
- doc.save
34
- doc
28
+ build(attributes).tap { |o| o.save }
35
29
  end
36
30
 
37
31
  def find_or_build(attributes)
@@ -42,15 +36,22 @@ module Zdi
42
36
  update(attributes, attributes, :upsert => true)
43
37
  end
44
38
 
45
- def all
46
- find
39
+ def delegate_to_collection(methods)
40
+ Array(methods).each { |meth| extend(Module.new { module_eval(<<-METHOD, __FILE__, __LINE__ + 1) }) }
41
+ def #{ meth }(*args, &block)
42
+ Zdi::DocumentWrapper.mongo_collection_method_wrap(collection, #{ meth.inspect }, self, *args, &block)
43
+ end
44
+ METHOD
47
45
  end
48
46
  end
49
47
 
50
48
  extend ClassMethods
51
49
 
50
+ delegate_to_collection(Mongo::Collection.public_instance_methods - public_instance_methods)
51
+
52
52
  class << self
53
53
  alias_method :first, :find_one
54
+ alias_method :all, :find
54
55
  end
55
56
  end
56
57
  end
@@ -0,0 +1,27 @@
1
+ module Zdi
2
+ module DocumentHelpers
3
+
4
+ def id
5
+ super || _id
6
+ end
7
+
8
+ def new?
9
+ id.nil? || @collection.find("_id" => id).count == 0
10
+ end
11
+
12
+ def save
13
+ if id.nil?
14
+ self.id = @collection.save(self)
15
+ else
16
+ @collection.update({"_id" => id}, self)
17
+ end
18
+ raise RuntimeError, "document lacks an id after save!" if id.nil?
19
+ self
20
+ end
21
+
22
+ def destroy
23
+ @collection.remove("_id" => id)
24
+ end
25
+
26
+ end
27
+ end
@@ -1,37 +1,53 @@
1
1
  module Zdi
2
2
  class DocumentWrapper < Hashie::Mash
3
3
 
4
- attr_reader :collection
5
-
6
- def initialize(collection, hash = {})
7
- super(hash)
8
- @collection = collection
9
- end
4
+ module ClassMethods
5
+ # Sends a method to a mongo collection.
6
+ # On send, all DocumentWrapper args are converted to hash.
7
+ # On return, all hashes in the result are converted to DocumentWrappers.
8
+ def mongo_collection_method_wrap(mongo_collection, method, zdi_collection_class, *args, &block)
9
+ new_args = Zdi::DocumentWrapper.unwrap(args)
10
+ result = mongo_collection.send(method, *new_args, &block)
11
+ Zdi::DocumentWrapper.wrap(zdi_collection_class, result)
12
+ end
10
13
 
11
- def id
12
- super || _id
13
- end
14
+ # Convert DocumentWrapper instance/s to normal hashes.
15
+ def unwrap(object)
16
+ case object
17
+ when DocumentWrapper then object.to_hash
18
+ when Array then object.map { |e| DocumentWrapper.unwrap(e) }
19
+ else
20
+ object
21
+ end
22
+ end
14
23
 
15
- def new?
16
- id.nil? || @collection.find("_id" => id).count == 0
24
+ # Convert hashes instance/s to normal DocumentWrapper instances.
25
+ def wrap(zdi_collection_class, object)
26
+ case object
27
+ when Hash then DocumentWrapper.new(zdi_collection_class, object)
28
+ when Array then object.map { |e| DocumentWrapper.wrap(zdi_collection_class, e) }
29
+ when Mongo::Cursor then object.extend(MongoCursorMethods).zentradi_collection = zdi_collection_class; object
30
+ else
31
+ object
32
+ end
33
+ end
17
34
  end
18
35
 
19
- def save
20
- if id.nil?
21
- self.id = @collection.save(self)
22
- else
23
- @collection.update({"_id" => id}, self)
36
+ module MongoCursorMethods
37
+ def next_document
38
+ Zdi::DocumentWrapper.wrap(zentradi_collection, super)
24
39
  end
25
- self
40
+ attr_accessor :zentradi_collection
26
41
  end
27
42
 
28
- def update(attributes)
29
- super(attributes)
30
- save
31
- end
43
+ extend ClassMethods
44
+ include DocumentHelpers
45
+
46
+ attr_reader :collection
32
47
 
33
- def destroy
34
- @collection.remove("_id" => id)
48
+ def initialize(collection, hash = {})
49
+ super(hash)
50
+ @collection = collection
35
51
  end
36
52
 
37
53
  end
@@ -39,16 +39,17 @@ describe Zdi::Collection do
39
39
  post.save
40
40
 
41
41
  post.update(:title => post.title + " DEF")
42
+ post.save
42
43
 
43
44
  from_db = Post.first("_id" => post.id)
44
45
  from_db.title.should == "ABC DEF"
45
46
  end
46
47
 
47
48
  it "destroys a document" do
48
- @post = Post.create(:title => "Hola Mundo", :body => "Hi.")
49
- id = @post.id
50
- @post.should_not be_new
51
- @post.destroy
49
+ post = Post.create(:title => "Hola Mundo", :body => "Hi.")
50
+ id = post.id
51
+ post.should_not be_new
52
+ post.destroy
52
53
  Post.first(id).should be_nil
53
54
  end
54
55
 
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{zentradi}
8
- s.version = "0.0.1"
8
+ s.version = "0.0.2"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Emmanuel Oga"]
12
- s.date = %q{2010-03-29}
12
+ s.date = %q{2010-04-04}
13
13
  s.description = %q{minimalistic tools for accessing mongodb}
14
14
  s.email = %q{EmmanuelOga@gmail.com}
15
15
  s.extra_rdoc_files = [
@@ -26,7 +26,7 @@ Gem::Specification.new do |s|
26
26
  "VERSION",
27
27
  "lib/zentradi.rb",
28
28
  "lib/zentradi/collection.rb",
29
- "lib/zentradi/delegate.rb",
29
+ "lib/zentradi/document_helpers.rb",
30
30
  "lib/zentradi/document_wrapper.rb",
31
31
  "spec/spec_helper.rb",
32
32
  "spec/zentradi/document_spec.rb",
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 0
8
- - 1
9
- version: 0.0.1
8
+ - 2
9
+ version: 0.0.2
10
10
  platform: ruby
11
11
  authors:
12
12
  - Emmanuel Oga
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-03-29 00:00:00 -03:00
17
+ date: 2010-04-04 00:00:00 -03:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -98,7 +98,7 @@ files:
98
98
  - VERSION
99
99
  - lib/zentradi.rb
100
100
  - lib/zentradi/collection.rb
101
- - lib/zentradi/delegate.rb
101
+ - lib/zentradi/document_helpers.rb
102
102
  - lib/zentradi/document_wrapper.rb
103
103
  - spec/spec_helper.rb
104
104
  - spec/zentradi/document_spec.rb
@@ -1,32 +0,0 @@
1
- module Zdi
2
- module Delegate
3
- def delegate(*methods)
4
- include Wrapper unless ancestors.include?(Wrapper)
5
- to = methods.pop[:to]
6
- methods.each do |name|
7
- module_eval(<<-EOMETHOD, __FILE__, __LINE__ + 1)
8
- def #{ name }(*args, &block)
9
- new_args = args.map { |a| a.is_a?(DocumentWrapper) ? a.to_hash : a }
10
-
11
- result = #{to}.send :#{name}, *new_args, &block
12
-
13
- return wrap_if_document(result)
14
- end
15
- EOMETHOD
16
- end
17
- end
18
-
19
- module Wrapper
20
- def wrap_if_document(object)
21
- if object.is_a?(OrderedHash)
22
- DocumentWrapper.new(self, object)
23
- elsif object.respond_to?(:map)
24
- object.map { |e| wrap_if_document(e) }
25
- else
26
- return object
27
- end
28
- end
29
- end
30
-
31
- end
32
- end