mongo_persist 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc CHANGED
@@ -1,50 +1,60 @@
1
- = mongo_persist
1
+ = MongoPersist
2
2
 
3
3
  Library to add MongoDB Persistance to normal Ruby objects
4
4
 
5
5
  = Example
6
6
 
7
- class Order
8
- include MongoPersist
9
- attr_accessor :po_number
10
- fattr(:order_products) { [] }
11
- def products
12
- order_products.map { |x| x.product }
7
+ require 'rubygems'
8
+ require 'mongo'
9
+ require 'mongo_persist'
10
+
11
+ class Order
12
+ include MongoPersist
13
+ attr_accessor :po_number
14
+ fattr(:order_products) { [] }
15
+ def products
16
+ order_products.map { |x| x.product }
17
+ end
13
18
  end
14
- end
15
19
 
16
- class OrderProduct
17
- include MongoPersist
18
- attr_accessor :unit_price, :quantity, :product
19
- mongo_reference_attributes ['product']
20
- end
20
+ class OrderProduct
21
+ include MongoPersist
22
+ attr_accessor :unit_price, :quantity, :product
23
+
24
+ # Store a reference to objects for this attribute, not the entire object.
25
+ mongo_reference_attributes ['product']
26
+ end
21
27
 
22
- class Product
23
- include MongoPersist
24
- attr_accessor :name
25
- end
28
+ class Product
29
+ include MongoPersist
30
+ attr_accessor :name
31
+ end
26
32
 
27
- products = [Product.new(:name => 'Leather Couch'),Product.new(:name => 'Maroon Chair')].each { |x| x.mongo_save! }
33
+ products = [Product.new(:name => 'Leather Couch'),Product.new(:name => 'Maroon Chair')].each { |x| x.mongo_save! }
28
34
 
29
- orders = []
30
- orders << Order.new(:po_number => 1234, :order_products => [OrderProduct.new(:unit_price => 1000, :quantity => 1, :product => products[0])]).mongo_save!
31
- orders << Order.new(:po_number => 1235, :order_products => [OrderProduct.new(:unit_price => 200, :quantity => 2, :product => products[1])]).mongo_save!
35
+ orders = []
36
+ orders << Order.new(:po_number => 1234, :order_products => [OrderProduct.new(:unit_price => 1000, :quantity => 1, :product => products[0])]).mongo_save!
37
+ orders << Order.new(:po_number => 1235, :order_products => [OrderProduct.new(:unit_price => 200, :quantity => 2, :product => products[1])]).mongo_save!
32
38
 
33
- # objects are saved to MongoDB as JSON objects
39
+ # objects are saved to MongoDB as JSON objects
34
40
 
35
- # get all order objects back from Mongo
36
- # you get back the ruby objects you put in, not raw JSON objects
37
- Order.collection.find_objects
41
+ # get all order objects back from Mongo
42
+ # you get back the ruby objects you put in, not raw JSON objects
43
+ Order.collection.find_objects
38
44
 
39
- # Since on OrderProduct, the product attribute was marked as a reference attribute, the product is stored in MongoDB only as a reference to the product obj
40
- # When you read the Order/OrderProduct back out, MongoPersist takes care of fetching the Product object again. You don't have to do anything.
41
- Order.collection.find_one_object.products.first # An object of class Product
42
- Order.collection.find_one_object.products.first.name # Leather Couch
45
+ # Since on OrderProduct, the product attribute was marked as a reference attribute,
46
+ # the product is stored in MongoDB only as a reference to the product obj
47
+ #
48
+ # When you read the Order/OrderProduct back out, MongoPersist takes care of
49
+ # fetching the Product object again. You don't have to do anything.
50
+ Order.collection.find_one_object.products.first # An object of class Product
51
+ Order.collection.find_one_object.products.first.name # Leather Couch
43
52
 
44
- # Because the product is stored as a reference, if you update that product elsewhere and save to Mongo, later reads of Orders with that product will be correctly updated
45
- products[0].name = 'White Leather Couch'
46
- products[0].mongo_save!
47
- Order.collection.find_one_object.products.first.name # White Leather Couch
53
+ # Because the product is stored as a reference, if you update that product
54
+ # elsewhere and save to Mongo, later reads of Orders with that product will be correctly updated
55
+ products[0].name = 'White Leather Couch'
56
+ products[0].mongo_save!
57
+ Order.collection.find_one_object.products.first.name # White Leather Couch
48
58
 
49
59
 
50
60
  == Note on Patches/Pull Requests
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.1
1
+ 0.0.2
@@ -0,0 +1,41 @@
1
+ require File.dirname(__FILE__) + "/../mongo_persist"
2
+
3
+ def db
4
+ Mongo::Connection.new.db('test-db')
5
+ end
6
+
7
+ class Order
8
+ include MongoPersist
9
+ attr_accessor :po_number, :customers
10
+ mongo_reference_attributes ['customers']
11
+ fattr(:order_products) { [] }
12
+ def products
13
+ order_products.map { |x| x.product }
14
+ end
15
+ end
16
+
17
+ class OrderProduct
18
+ include MongoPersist
19
+ attr_accessor :unit_price, :quantity, :product
20
+ mongo_reference_attributes ['product']
21
+ end
22
+
23
+ class Product
24
+ include MongoPersist
25
+ attr_accessor :name
26
+ end
27
+
28
+ class Customer
29
+ include MongoPersist
30
+ attr_accessor :email
31
+ end
32
+
33
+ [Order,Product].each { |x| x.collection.remove }
34
+ @products = [Product.new(:name => 'Leather Couch'),Product.new(:name => 'Maroon Chair')].each { |x| x.mongo.save! }
35
+ @customers = [Customer.new(:email => 'a'),Customer.new(:email => 'b')].each { |x| x.mongo.save! }
36
+
37
+ @orders = []
38
+ @orders << Order.new(:customers => @customers, :po_number => 1234, :order_products => [OrderProduct.new(:unit_price => 1000, :quantity => 1, :product => @products[0])]).mongo.save!
39
+ @orders << Order.new(:customers => @customers, :po_number => 1235, :order_products => [OrderProduct.new(:unit_price => 200, :quantity => 2, :product => @products[1])]).mongo.save!
40
+
41
+ $orders = @orders
data/lib/mongo_persist.rb CHANGED
@@ -3,6 +3,7 @@ require 'mongo'
3
3
  require 'activesupport'
4
4
  require 'fattr'
5
5
  require File.dirname(__FILE__) + "/mongo_persist/util"
6
+ require 'andand'
6
7
 
7
8
  class Object
8
9
  def safe_to_mongo_hash
@@ -20,6 +21,9 @@ class Array
20
21
  def to_mongo_object
21
22
  map { |x| x.safe_to_mongo_object }
22
23
  end
24
+ def to_mongo_ref_hash
25
+ map { |x| x.to_mongo_ref_hash }
26
+ end
23
27
  end
24
28
 
25
29
  class Hash
@@ -39,29 +43,50 @@ class Hash
39
43
  h.reject { |k,v| k == '_id' }
40
44
  end
41
45
  def to_mongo_object
42
- return self unless mongo_class
46
+ return map_value { |v| v.safe_to_mongo_object } unless mongo_class
43
47
  if naked_reference?
44
48
  mongo_class.collection.find_one_object('_id' => get_mongo_id)
45
49
  else
46
50
  mongo_class.from_mongo_hash(to_mongo_hash_for_obj)
47
51
  end
48
52
  end
53
+ def to_mongo_hash
54
+ res = {}
55
+ each { |k,v| res[k.safe_to_mongo_hash] = v.safe_to_mongo_hash }
56
+ res
57
+ end
58
+ end
59
+
60
+ class MongoWrapper
61
+ attr_accessor :obj
62
+ include FromHash
63
+ def save!
64
+ if obj.mongo_id
65
+ obj.klass.collection.update({'_id' => obj.mongo_id},obj.to_mongo_hash)
66
+ else
67
+ obj.mongo_id = obj.class.collection.save(obj.to_mongo_hash)
68
+ end
69
+ obj
70
+ end
49
71
  end
50
72
 
51
73
  module MongoPersist
52
74
  attr_accessor :mongo_id
53
75
  #can be overriden by class. If not, assumes that all instance variables should be saved.
54
76
  def mongo_attributes
55
- instance_variables.map { |x| x[1..-1] }
77
+ instance_variables.map { |x| x[1..-1] } - ['mongo']
56
78
  end
57
79
  def mongo_child_attributes
58
80
  mongo_attributes - self.class.mongo_reference_attributes
59
81
  end
82
+ def to_mongo_ref_hash
83
+ {'_mongo_class' => klass.to_s, '_id' => mongo_id}
84
+ end
60
85
  def to_mongo_hash
61
86
  res = mongo_child_attributes.inject({}) { |h,attr| h.merge(attr => send(attr).safe_to_mongo_hash) }.merge("_mongo_class" => self.class.to_s)
62
87
  klass.mongo_reference_attributes.each do |attr|
63
- obj = send(attr)
64
- res[attr] = {'_mongo_class' => obj.class.to_s, '_id' => send(attr).mongo_id}
88
+ val = send(attr)
89
+ res[attr] = val.to_mongo_ref_hash if val
65
90
  end
66
91
  res
67
92
  end
@@ -69,14 +94,7 @@ module MongoPersist
69
94
  h = h.map_value { |v| v.safe_to_mongo_object }
70
95
  from_hash(h)
71
96
  end
72
- def mongo_save!
73
- if mongo_id
74
- klass.collection.update({'_id' => mongo_id},to_mongo_hash)
75
- else
76
- self.mongo_id = self.class.collection.save(to_mongo_hash)
77
- end
78
- self
79
- end
97
+ fattr(:mongo) { MongoWrapper.new(:obj => self) }
80
98
 
81
99
  module ClassMethods
82
100
  dsl_method(:mongo_reference_attributes) { [] }
@@ -0,0 +1,61 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run `rake gemspec`
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{mongo_persist}
8
+ s.version = "0.0.2"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Mike Harris"]
12
+ s.date = %q{2009-11-19}
13
+ s.description = %q{Library to add MongoDB Persistance to normal Ruby objects}
14
+ s.email = %q{mharris717@gmail.com}
15
+ s.extra_rdoc_files = [
16
+ "LICENSE",
17
+ "README.rdoc"
18
+ ]
19
+ s.files = [
20
+ ".document",
21
+ ".gitignore",
22
+ "LICENSE",
23
+ "README.rdoc",
24
+ "Rakefile",
25
+ "VERSION",
26
+ "lib/mongo_persist.rb",
27
+ "lib/mongo_persist/sandbox.rb",
28
+ "lib/mongo_persist/util.rb",
29
+ "mongo_persist.gemspec",
30
+ "spec/mongo_persist_spec.rb",
31
+ "spec/spec_helper.rb"
32
+ ]
33
+ s.homepage = %q{http://github.com/mharris717/mongo_persist}
34
+ s.rdoc_options = ["--charset=UTF-8"]
35
+ s.require_paths = ["lib"]
36
+ s.rubygems_version = %q{1.3.5}
37
+ s.summary = %q{Library to add MongoDB Persistance to normal Ruby objects}
38
+ s.test_files = [
39
+ "spec/mongo_persist_spec.rb",
40
+ "spec/spec_helper.rb"
41
+ ]
42
+
43
+ if s.respond_to? :specification_version then
44
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
45
+ s.specification_version = 3
46
+
47
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
48
+ s.add_development_dependency(%q<rspec>, [">= 0"])
49
+ s.add_runtime_dependency(%q<fattr>, [">= 0"])
50
+ s.add_runtime_dependency(%q<activesupport>, [">= 0"])
51
+ else
52
+ s.add_dependency(%q<rspec>, [">= 0"])
53
+ s.add_dependency(%q<fattr>, [">= 0"])
54
+ s.add_dependency(%q<activesupport>, [">= 0"])
55
+ end
56
+ else
57
+ s.add_dependency(%q<rspec>, [">= 0"])
58
+ s.add_dependency(%q<fattr>, [">= 0"])
59
+ s.add_dependency(%q<activesupport>, [">= 0"])
60
+ end
61
+ end
@@ -6,17 +6,24 @@ end
6
6
 
7
7
  class Order
8
8
  include MongoPersist
9
- attr_accessor :po_number
9
+ attr_accessor :po_number, :customers, :some_hash
10
+ mongo_reference_attributes ['customers']
10
11
  fattr(:order_products) { [] }
11
12
  def products
12
13
  order_products.map { |x| x.product }
13
14
  end
15
+ def subtotal
16
+ order_products.map { |x| x.subtotal }.sum
17
+ end
14
18
  end
15
19
 
16
20
  class OrderProduct
17
21
  include MongoPersist
18
22
  attr_accessor :unit_price, :quantity, :product
19
23
  mongo_reference_attributes ['product']
24
+ def subtotal
25
+ quantity.to_f * unit_price
26
+ end
20
27
  end
21
28
 
22
29
  class Product
@@ -24,15 +31,22 @@ class Product
24
31
  attr_accessor :name
25
32
  end
26
33
 
34
+ class Customer
35
+ include MongoPersist
36
+ attr_accessor :email
37
+ end
38
+
27
39
  # too many assertions per test, too many "this is how things should be before i check the point of this test" assertions
28
40
  describe MongoPersist do
29
41
  before do
42
+ $abc = false
30
43
  [Order,Product].each { |x| x.collection.remove }
31
- @products = [Product.new(:name => 'Leather Couch'),Product.new(:name => 'Maroon Chair')].each { |x| x.mongo_save! }
44
+ @products = [Product.new(:name => 'Leather Couch'),Product.new(:name => 'Maroon Chair')].each { |x| x.mongo.save! }
45
+ @customers = [Customer.new(:email => 'a'),Customer.new(:email => 'b')].each { |x| x.mongo.save! }
32
46
 
33
47
  @orders = []
34
- @orders << Order.new(:po_number => 1234, :order_products => [OrderProduct.new(:unit_price => 1000, :quantity => 1, :product => @products[0])]).mongo_save!
35
- @orders << Order.new(:po_number => 1235, :order_products => [OrderProduct.new(:unit_price => 200, :quantity => 2, :product => @products[1])]).mongo_save!
48
+ @orders << Order.new(:customers => @customers, :po_number => 1234, :order_products => [OrderProduct.new(:unit_price => 1000, :quantity => 1, :product => @products[0])]).mongo.save!
49
+ @orders << Order.new(:customers => @customers, :po_number => 1235, :order_products => [OrderProduct.new(:unit_price => 200, :quantity => 2, :product => @products[1])]).mongo.save!
36
50
  end
37
51
  it 'should have id' do
38
52
  @orders.first.mongo_id.should be
@@ -53,13 +67,23 @@ describe MongoPersist do
53
67
  h.to_mongo_object.name.should == 'Leather Couch'
54
68
  end
55
69
  it 'updates' do
56
- @products.first.from_hash(:name => 'White Leather Couch').mongo_save!
70
+ @products.first.from_hash(:name => 'White Leather Couch').mongo.save!
57
71
  Product.collection.find.count.should == 2
58
72
  Product.collection.find_objects(:name => /Leather/).count.should == 1
59
73
  Product.collection.find_one_object(:name => /Leather/).name.should == 'White Leather Couch'
60
74
  end
61
75
  it 'reference loading' do
62
- @products.first.from_hash(:name => 'White Leather Couch').mongo_save!
76
+ @products.first.from_hash(:name => 'White Leather Couch').mongo.save!
63
77
  Order.collection.find_one_object(:po_number => 1234).products.first.name.should == 'White Leather Couch'
64
78
  end
79
+ it 'customers' do
80
+ @customers.first.from_hash(:email => 'z').mongo.save!
81
+ Order.collection.find_one_object.customers.first.email.should == 'z'
82
+ end
83
+ it 'saving hashes' do
84
+ o = Order.new(:po_number => 1, :some_hash => {'1' => Product.new(:name => 'Chair')})
85
+ o.mongo.save!
86
+ Order.collection.find_one_object(:po_number => 1).some_hash['1'].name.should == 'Chair'
87
+ Order.collection.find_one_object.subtotal.should == 1000
88
+ end
65
89
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mongo_persist
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mike Harris
@@ -59,7 +59,9 @@ files:
59
59
  - Rakefile
60
60
  - VERSION
61
61
  - lib/mongo_persist.rb
62
+ - lib/mongo_persist/sandbox.rb
62
63
  - lib/mongo_persist/util.rb
64
+ - mongo_persist.gemspec
63
65
  - spec/mongo_persist_spec.rb
64
66
  - spec/spec_helper.rb
65
67
  has_rdoc: true