bigamy 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.
data/.gitignore ADDED
@@ -0,0 +1,3 @@
1
+ *.swp
2
+ *.swo
3
+ pkg/
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2009 Ryan Angilly
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README ADDED
@@ -0,0 +1,11 @@
1
+ = Bigamy
2
+
3
+ Enable seamless Ruby-ness between ActiveRecord objects & MongoMapper documents
4
+
5
+ = License
6
+
7
+ Bigmay is released under the MIT license.
8
+
9
+ = Support
10
+
11
+ Just email me at ryan@angilly.com with questions, bugs, or patches.
data/Rakefile ADDED
@@ -0,0 +1,22 @@
1
+ begin
2
+ require 'jeweler'
3
+ Jeweler::Tasks.new do |gemspec|
4
+ gemspec.name = "bigamy"
5
+ gemspec.summary = "Have associations between ActiveRecord objects and MongoMapper documents"
6
+ gemspec.description = ""
7
+ gemspec.email = "ryan@angilly.com"
8
+ gemspec.homepage = "http://github.com/ryana/bigamy"
9
+ gemspec.authors = ["Ryan Angilly"]
10
+
11
+ gemspec.add_development_dependency 'shoulda', '2.11.0'
12
+ gemspec.add_development_dependency 'mocha', '0.9.8'
13
+ gemspec.add_development_dependency 'factory_girl', '1.3.1'
14
+ gemspec.add_development_dependency 'ruby-debug', '0.10.3'
15
+ gemspec.add_development_dependency 'mongo_mapper', '0.8.2'
16
+ gemspec.add_development_dependency 'active_record', '>=2.3.5'
17
+
18
+ end
19
+ Jeweler::GemcutterTasks.new
20
+ rescue LoadError
21
+ puts "Jeweler not available. Install it with: gem install jeweler"
22
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.1.0
data/bigamy.gemspec ADDED
@@ -0,0 +1,76 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{bigamy}
8
+ s.version = "0.1.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Ryan Angilly"]
12
+ s.date = %q{2010-06-30}
13
+ s.description = %q{}
14
+ s.email = %q{ryan@angilly.com}
15
+ s.extra_rdoc_files = [
16
+ "README"
17
+ ]
18
+ s.files = [
19
+ ".gitignore",
20
+ "MIT-LICENSE",
21
+ "README",
22
+ "Rakefile",
23
+ "VERSION",
24
+ "bigamy.gemspec",
25
+ "lib/bigamy.rb",
26
+ "lib/bigamy/ar.rb",
27
+ "lib/bigamy/mongo.rb",
28
+ "lib/bigamy/proxy.rb",
29
+ "test/functional/test_helper.rb",
30
+ "test/test_helper.rb",
31
+ "test/unit/test_ar_side.rb",
32
+ "test/unit/test_helper.rb",
33
+ "test/unit/test_mongo_side.rb"
34
+ ]
35
+ s.homepage = %q{http://github.com/ryana/bigamy}
36
+ s.rdoc_options = ["--charset=UTF-8"]
37
+ s.require_paths = ["lib"]
38
+ s.rubygems_version = %q{1.3.6}
39
+ s.summary = %q{Have associations between ActiveRecord objects and MongoMapper documents}
40
+ s.test_files = [
41
+ "test/functional/test_helper.rb",
42
+ "test/test_helper.rb",
43
+ "test/unit/test_ar_side.rb",
44
+ "test/unit/test_helper.rb",
45
+ "test/unit/test_mongo_side.rb"
46
+ ]
47
+
48
+ if s.respond_to? :specification_version then
49
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
50
+ s.specification_version = 3
51
+
52
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
53
+ s.add_development_dependency(%q<shoulda>, ["= 2.11.0"])
54
+ s.add_development_dependency(%q<mocha>, ["= 0.9.8"])
55
+ s.add_development_dependency(%q<factory_girl>, ["= 1.3.1"])
56
+ s.add_development_dependency(%q<ruby-debug>, ["= 0.10.3"])
57
+ s.add_development_dependency(%q<mongo_mapper>, ["= 0.8.2"])
58
+ s.add_development_dependency(%q<active_record>, [">= 2.3.5"])
59
+ else
60
+ s.add_dependency(%q<shoulda>, ["= 2.11.0"])
61
+ s.add_dependency(%q<mocha>, ["= 0.9.8"])
62
+ s.add_dependency(%q<factory_girl>, ["= 1.3.1"])
63
+ s.add_dependency(%q<ruby-debug>, ["= 0.10.3"])
64
+ s.add_dependency(%q<mongo_mapper>, ["= 0.8.2"])
65
+ s.add_dependency(%q<active_record>, [">= 2.3.5"])
66
+ end
67
+ else
68
+ s.add_dependency(%q<shoulda>, ["= 2.11.0"])
69
+ s.add_dependency(%q<mocha>, ["= 0.9.8"])
70
+ s.add_dependency(%q<factory_girl>, ["= 1.3.1"])
71
+ s.add_dependency(%q<ruby-debug>, ["= 0.10.3"])
72
+ s.add_dependency(%q<mongo_mapper>, ["= 0.8.2"])
73
+ s.add_dependency(%q<active_record>, [">= 2.3.5"])
74
+ end
75
+ end
76
+
data/lib/bigamy.rb ADDED
@@ -0,0 +1,119 @@
1
+ require 'mongo_mapper'
2
+ require 'set'
3
+
4
+ require 'bigamy/proxy'
5
+ require 'bigamy/mongo'
6
+ require 'bigamy/ar'
7
+
8
+ module Bigamy
9
+ class NewRecordAssignment < StandardError; end
10
+
11
+ def self.setup *args
12
+ args.each do |klass|
13
+ case
14
+ when klass.ancestors.include?(::ActiveRecord::Base)
15
+ Bigamy::ActiveRecord.configure klass
16
+ when (klass.included_modules & [::MongoMapper::Document, ::MongoMapper::EmbeddedDocument]).present?
17
+ klass.plugin Bigamy::Mongo
18
+ else
19
+ raise "NO #{klass}"
20
+ end
21
+ end
22
+ end
23
+
24
+ module Base
25
+ def self.configure(model)
26
+ model.class_inheritable_accessor :bigamy_associations
27
+ model.bigamy_associations = {}
28
+ end
29
+ end
30
+
31
+ module Mongo
32
+
33
+ def self.configure(model)
34
+ ::Bigamy::Base.configure(model)
35
+ end
36
+
37
+ module ClassMethods
38
+ def divorce_everyone
39
+ self.bigamy_associations.each {|k,v| v.divorce_everyone }
40
+ end
41
+
42
+ def belongs_to_ar name, options = {}, &ext
43
+ bigamy_associations[name] = MongoBelongsTo.new(self, name, options)
44
+ end
45
+
46
+ def has_one_ar name, options = {}, &ext
47
+ bigamy_associations[name] = MongoHasOne.new(self, name, options)
48
+ end
49
+
50
+ def has_many_ar name, options = {}, &ext
51
+ bigamy_associations[name] = MongoHasMany.new(self, name, options)
52
+ end
53
+ end
54
+
55
+ module InstanceMethods
56
+ def set_value c, val
57
+ write_key c, val
58
+ end
59
+
60
+ def read_val c
61
+ read_key c
62
+ end
63
+
64
+ def export_id_val i
65
+ i.to_s
66
+ end
67
+
68
+ def import_id_val i
69
+ i
70
+ end
71
+ end
72
+ end
73
+
74
+ module ActiveRecord
75
+ def self.configure(model)
76
+ ::Bigamy::Base.configure(model)
77
+
78
+ model.extend ClassMethods
79
+ model.send :include, InstanceMethods
80
+ end
81
+
82
+ module ClassMethods
83
+ def divorce_everyone
84
+ self.bigamy_associations.each {|k,v| v.divorce_everyone }
85
+ end
86
+
87
+ def belongs_to_ar name, options = {}, &ext
88
+ bigamy_associations[name] = ARBelongsTo.new(self, name, options)
89
+ end
90
+
91
+ def has_one_ar name, options = {}, &ext
92
+ bigamy_associations[name] = ARHasOne.new(self, name, options)
93
+ end
94
+
95
+ def has_many_ar name, options = {}, &ext
96
+ bigamy_associations[name] = ARHasMany.new(self, name, options)
97
+ end
98
+ end
99
+
100
+ module InstanceMethods
101
+ def set_value c, val
102
+ self[c] = val
103
+ end
104
+
105
+ def read_val c
106
+ read_attribute c
107
+ end
108
+
109
+ def export_id_val i
110
+ i
111
+ end
112
+
113
+ def import_id_val i
114
+ BSON::ObjectID.from_string(i)
115
+ end
116
+ end
117
+ end
118
+
119
+ end
data/lib/bigamy/ar.rb ADDED
@@ -0,0 +1,20 @@
1
+ module Bigamy
2
+
3
+ class ARBelongsTo < BelongsTo
4
+ end
5
+
6
+ class ARHasOne < HasOne
7
+ def initialize parent, name, options
8
+ super
9
+ target_klass.key foreign_key
10
+ end
11
+ end
12
+
13
+ class ARHasMany < HasMany
14
+ def initialize parent, name, options
15
+ super
16
+ target_klass.key foreign_key
17
+ end
18
+ end
19
+
20
+ end
@@ -0,0 +1,16 @@
1
+ module Bigamy
2
+
3
+ class MongoBelongsTo < BelongsTo
4
+ def initialize parent, name, options
5
+ super
6
+ me.key foreign_key
7
+ end
8
+ end
9
+
10
+ class MongoHasMany < HasMany
11
+ end
12
+
13
+ class MongoHasOne < HasOne
14
+ end
15
+
16
+ end
@@ -0,0 +1,154 @@
1
+ module Bigamy
2
+
3
+ class Proxy
4
+ attr_accessor :name, :me, :primary_key, :foreign_key, :klass, :methods_added,
5
+ :options
6
+
7
+ def initialize parent, name, options
8
+ self.name = name
9
+ self.me = parent
10
+ self.primary_key = options.delete(:primary_key) || :id
11
+ self.klass = options.delete(:class) || target_klass
12
+ self.methods_added = Set.new
13
+ self.options = options
14
+
15
+ serialize_foreign_key
16
+ create_accessors
17
+ serialize_foreign_key
18
+ end
19
+
20
+ def foreign_key
21
+ options[:foreign_key] || :"#{name.to_s.singularize}_id"
22
+ end
23
+
24
+ def create_accessors
25
+ methods_added << name
26
+ methods_added << "#{name}="
27
+
28
+ add_getter
29
+ add_setter
30
+ end
31
+
32
+ def add_getter
33
+ raise
34
+ end
35
+
36
+ def add_setter
37
+ raise
38
+ end
39
+
40
+ def serialize_foreign_key
41
+ target_klass.class_eval <<-EOF
42
+ def #{foreign_key}
43
+ import_id_val read_val(:#{foreign_key})
44
+ end
45
+ EOF
46
+ end
47
+
48
+ def divorce_everyone
49
+ methods_added.each {|m| me.send(:undef_method, m) if me.respond_to?(m)}
50
+ self.methods_added = Set.new
51
+ end
52
+
53
+ def target_klass
54
+ name.to_s.camelcase.singularize.constantize
55
+ end
56
+
57
+ def target_klass_name
58
+ name.to_s.underscore.singularize.gsub('/', '_')
59
+ end
60
+
61
+ def root_klass
62
+ me
63
+ end
64
+
65
+ def root_klass_name
66
+ me.to_s.underscore.singularize.gsub('/', '_')
67
+ end
68
+ end
69
+
70
+ class HasOne < Proxy
71
+ def foreign_key
72
+ options[:foreign_key] || :"#{root_klass_name}_id"
73
+ end
74
+
75
+ def add_getter
76
+ me.class_eval <<-EOF
77
+ def #{name}
78
+ self.id.nil? ? nil : #{target_klass}.first(:conditions => {:#{foreign_key} => export_id_val(self.id)})
79
+ end
80
+ EOF
81
+ end
82
+
83
+ def add_setter
84
+ me.class_eval <<-EOF
85
+ def #{name}= v
86
+ raise NewRecordAssignment.new('Child must be saved') if v.new_record?
87
+ raise NewRecordAssignment.new('Parent must be saved') if self.new_record?
88
+ raise TypeError unless v.is_a? #{klass}
89
+
90
+ v.#{foreign_key} = export_id_val(self.id)
91
+ v.save!
92
+ end
93
+ EOF
94
+ end
95
+ end
96
+
97
+ class HasMany < Proxy
98
+ def foreign_key
99
+ options[:foreign_key] || :"#{root_klass_name}_id"
100
+ end
101
+
102
+ def add_getter
103
+ me.class_eval <<-EOF
104
+ def #{name}
105
+ self.id.nil? ? nil : #{target_klass}.all(:conditions => {:#{foreign_key} => export_id_val(self.id)})
106
+ end
107
+ EOF
108
+ end
109
+
110
+ def add_setter
111
+ me.class_eval <<-EOF
112
+ def #{name}= val
113
+ raise NewRecordAssignment.new('All children must be saved') if val.select(&:new_record?).present?
114
+ raise NewRecordAssignment.new('Parent must be saved') if self.new_record?
115
+
116
+ val.each {|v| v.send "#{foreign_key}=", export_id_val(self.id); v.save! }
117
+ end
118
+ EOF
119
+ end
120
+ end
121
+
122
+ class BelongsTo < Proxy
123
+ def initialize parent, name, options
124
+ super
125
+ end
126
+
127
+ def foreign_key
128
+ options[:foreign_key] || :"#{target_klass_name}_id"
129
+ end
130
+
131
+ def add_getter
132
+ code = <<-EOF
133
+ def #{name}
134
+ self.id.blank? ? nil : #{klass}.first(:conditions => {:#{primary_key} => export_id_val(self.id)})
135
+ end
136
+ EOF
137
+
138
+ me.class_eval code, __FILE__, __LINE__
139
+ end
140
+
141
+ def add_setter
142
+ code = <<-EOF
143
+ def #{name}= val
144
+ raise NewRecordAssignment if val.new_record?
145
+ raise TypeError.new("Should get #{klass}") unless val.is_a? #{klass}
146
+
147
+ set_value :#{foreign_key}, val.id
148
+ end
149
+ EOF
150
+
151
+ me.class_eval code, __FILE__, __LINE__
152
+ end
153
+ end
154
+ end
@@ -0,0 +1 @@
1
+ require File.join(File.dirname(__FILE__), '..', 'test_helper')
@@ -0,0 +1,27 @@
1
+ require 'test/unit'
2
+ require 'mocha'
3
+ require 'ruby-debug'
4
+ require 'shoulda'
5
+ require 'factory_girl'
6
+ require 'active_record'
7
+ require 'mongo_mapper'
8
+
9
+ MongoMapper.database = 'bigamy-test'
10
+ ActiveRecord::Base.establish_connection :adapter => 'mysql', :database => 'bigamy_test', :username => 'root', :password => 'ryan'
11
+ ActiveRecord::Migration.execute 'drop table if exists users'
12
+ ActiveRecord::Migration.create_table :users do |t|
13
+ t.string :name
14
+ t.integer :id
15
+ t.string :doc_id
16
+ end
17
+
18
+ class Doc
19
+ include MongoMapper::Document
20
+ end
21
+
22
+ class User < ActiveRecord::Base
23
+ end
24
+
25
+ $:.unshift File.join(File.dirname(__FILE__), '..', 'lib')
26
+
27
+ require 'bigamy'
@@ -0,0 +1,159 @@
1
+ require File.join(File.dirname(__FILE__), 'test_helper')
2
+
3
+ class TestArSide < Test::Unit::TestCase
4
+
5
+ should "have Bigamy" do
6
+ assert Bigamy
7
+ end
8
+
9
+ should "have Bigmany::Mongo plugin" do
10
+ assert Bigamy::ActiveRecord
11
+ assert Bigamy::ActiveRecord::ClassMethods
12
+ end
13
+
14
+ def setup
15
+ Doc.delete_all
16
+ User.delete_all
17
+ end
18
+
19
+ should "have User & Doc" do
20
+ assert User
21
+ assert Doc
22
+ end
23
+
24
+ context "User" do
25
+ setup do
26
+ Bigamy.setup User, Doc
27
+ end
28
+
29
+ teardown do
30
+ User.divorce_everyone
31
+ end
32
+
33
+ should "have divorce_everyone" do
34
+ assert User.respond_to?(:divorce_everyone)
35
+ end
36
+
37
+ context "that has_one_ar :doc" do
38
+ setup do
39
+ User.has_one_ar :doc
40
+ @doc = Doc.create!
41
+ end
42
+
43
+ should "create accessors" do
44
+ assert User.new.respond_to?(:doc)
45
+ assert User.new.respond_to?(:doc=)
46
+ end
47
+
48
+ should "raise on assignment if User is new" do
49
+ assert_raises(Bigamy::NewRecordAssignment) { User.new.doc = @doc }
50
+ end
51
+
52
+ context "With a created userument" do
53
+ setup do
54
+ @user = User.create!
55
+ @user.doc = @doc
56
+ end
57
+
58
+ should "set @doc.foreign_key on assignment" do
59
+ assert_equal @doc.user_id, @user.id
60
+ end
61
+
62
+ should "save doc on assignment" do
63
+ u = Doc.find(@doc.id)
64
+ assert_equal u.user_id, @user.id
65
+ end
66
+
67
+ should "retrieve doc from user" do
68
+ d = User.find(@user.id)
69
+ assert_equal d.doc, @doc
70
+ end
71
+ end
72
+ end
73
+
74
+ context "that has_many_ar :doc" do
75
+ setup do
76
+ User.has_many_ar :docs
77
+ end
78
+
79
+ should "create accessors" do
80
+ assert User.new.respond_to?(:docs)
81
+ assert User.new.respond_to?(:docs=)
82
+ end
83
+
84
+ context "with instance and doc" do
85
+ setup do
86
+ @user = User.new
87
+ @u1 = Doc.new
88
+ @u2 = Doc.new
89
+ end
90
+
91
+ should "raise if user is new" do
92
+ @u1.save! && @u2.save!
93
+ assert_raises(Bigamy::NewRecordAssignment) { @user.docs = [@u1, @u2] }
94
+ end
95
+
96
+ should "raise if any docs are new" do
97
+ @user.save!
98
+ @u1.save!
99
+ assert_raises(Bigamy::NewRecordAssignment) { @user.docs = [@u1, @u2] }
100
+ end
101
+
102
+ context "with users & docs saved" do
103
+ setup do
104
+ @user.save! && @u1.save! && @u2.save!
105
+ @user.docs = [@u1, @u2]
106
+ end
107
+
108
+ should "assign user_id on docs" do
109
+ assert Doc.find(@u1.id, @u2.id).all? {|x| x.user_id == @user.id}
110
+ end
111
+
112
+ should "retrieve targets" do
113
+ assert_same_elements [@u1, @u2], User.find(@user.id).docs
114
+ end
115
+ end
116
+
117
+ end
118
+ end
119
+
120
+ context "that belongs_to_ar :doc" do
121
+ setup do
122
+ User.belongs_to_ar :doc
123
+ end
124
+
125
+ should "create accessors" do
126
+ assert User.new.respond_to?(:doc)
127
+ assert User.new.respond_to?(:doc=)
128
+ end
129
+
130
+ context "with an instance and doc" do
131
+ setup do
132
+ @user = User.new
133
+ @doc = Doc.new
134
+ end
135
+
136
+ should "raise if assigning a new Doc" do
137
+ assert_raises(Bigamy::NewRecordAssignment) do
138
+ @user.doc = @doc
139
+ end
140
+ end
141
+
142
+ context "with a saved doc" do
143
+ setup { @doc.save! }
144
+
145
+ should "save user" do
146
+ @user.doc = @doc
147
+ @user.save!
148
+
149
+ assert !@user.doc_id.nil?
150
+ assert_equal @user.doc_id, @doc.id
151
+ assert_equal 1, Doc.count
152
+ assert_equal 1, User.count
153
+ end
154
+ end
155
+ end
156
+ end
157
+ end
158
+
159
+ end
@@ -0,0 +1 @@
1
+ require File.join(File.dirname(__FILE__), '..', 'test_helper')
@@ -0,0 +1,166 @@
1
+ require File.join(File.dirname(__FILE__), 'test_helper')
2
+
3
+ class TestMongoSide < Test::Unit::TestCase
4
+
5
+ should "have Bigamy" do
6
+ assert Bigamy
7
+ end
8
+
9
+ should "have Bigmany::Mongo plugin" do
10
+ assert Bigamy::Mongo
11
+ assert Bigamy::Mongo::ClassMethods
12
+ assert Bigamy::Mongo::InstanceMethods
13
+ assert Bigamy::Mongo.respond_to?(:configure)
14
+ end
15
+
16
+ def setup
17
+ User.delete_all
18
+ Doc.delete_all
19
+ end
20
+
21
+ should "have Doc & User" do
22
+ assert Doc
23
+ assert User
24
+ end
25
+
26
+ context "Doc" do
27
+ setup do
28
+ Bigamy.setup Doc, User
29
+ end
30
+
31
+ teardown do
32
+ Doc.divorce_everyone
33
+ end
34
+
35
+ should "setup bigamy" do
36
+ assert Doc.included_modules.include?(Bigamy::Mongo::InstanceMethods)
37
+ assert User.included_modules.include?(Bigamy::ActiveRecord::InstanceMethods)
38
+ end
39
+
40
+ context "that has_one_ar :user" do
41
+ setup do
42
+ Doc.has_one_ar :user
43
+ @user = User.create!
44
+ end
45
+
46
+ should "create accessors" do
47
+ assert Doc.new.respond_to?(:user)
48
+ assert Doc.new.respond_to?(:user=)
49
+ end
50
+
51
+ should "raise on assignment if Doc is new" do
52
+ assert_raises(Bigamy::NewRecordAssignment) { Doc.new.user = @user }
53
+ end
54
+
55
+ context "With a created document" do
56
+ setup do
57
+ @doc = Doc.create!
58
+ @doc.user = @user
59
+ end
60
+
61
+ should "set @user.foreign_key on assignment" do
62
+ assert_equal @user.doc_id, @doc.id
63
+ end
64
+
65
+ should "save user on assignment" do
66
+ u = User.find(@user.id)
67
+ assert_equal u.doc_id, @doc.id
68
+ end
69
+
70
+ should "retrieve user from doc" do
71
+ d = Doc.find(@doc.id)
72
+ assert_equal d.user, @user
73
+ end
74
+ end
75
+ end
76
+
77
+ context "that has_many_ar :user" do
78
+ setup do
79
+ Doc.has_many_ar :users
80
+ end
81
+
82
+ should "create accessors" do
83
+ assert Doc.new.respond_to?(:users)
84
+ assert Doc.new.respond_to?(:users=)
85
+ end
86
+
87
+ context "with instance and user" do
88
+ setup do
89
+ @doc = Doc.new
90
+ @u1 = User.new
91
+ @u2 = User.new
92
+ end
93
+
94
+ should "raise if doc is new" do
95
+ @u1.save! && @u2.save!
96
+ assert_raises(Bigamy::NewRecordAssignment) { @doc.users = [@u1, @u2] }
97
+ end
98
+
99
+ should "raise if any users are new" do
100
+ @doc.save!
101
+ @u1.save!
102
+ assert_raises(Bigamy::NewRecordAssignment) { @doc.users = [@u1, @u2] }
103
+ end
104
+
105
+ context "with docs & users saved" do
106
+ setup do
107
+ @doc.save! && @u1.save! && @u2.save!
108
+ @doc.users = [@u1, @u2]
109
+ end
110
+
111
+ should "assign doc_id on users" do
112
+ assert User.find(@u1.id, @u2.id).all? {|x| x.doc_id == @doc.id}
113
+ end
114
+
115
+ should "retrieve targets" do
116
+ assert_same_elements [@u1, @u2], Doc.find(@doc.id).users
117
+ end
118
+ end
119
+
120
+ end
121
+ end
122
+
123
+ context "that belongs_to_ar :user" do
124
+ setup do
125
+ Doc.belongs_to_ar :user
126
+ end
127
+
128
+ should "create accessors" do
129
+ assert Doc.new.respond_to?(:user)
130
+ assert Doc.new.respond_to?(:user=)
131
+ end
132
+
133
+ should "create key" do
134
+ assert Doc.new.respond_to?(:user_id)
135
+ assert Doc.new.respond_to?(:user_id=)
136
+ end
137
+
138
+ context "with an instance and user" do
139
+ setup do
140
+ @doc = Doc.new
141
+ @user = User.new
142
+ end
143
+
144
+ should "raise if assigning a new User" do
145
+ assert_raises(Bigamy::NewRecordAssignment) do
146
+ @doc.user = @user
147
+ end
148
+ end
149
+
150
+ context "with a saved user" do
151
+ setup { @user.save! }
152
+
153
+ should "save doc" do
154
+ @doc.user = @user
155
+ @doc.save!
156
+
157
+ assert !@doc.user_id.nil?
158
+ assert_equal @doc.user_id, @user.id
159
+ assert_equal 1, User.count
160
+ assert_equal 1, Doc.count
161
+ end
162
+ end
163
+ end
164
+ end
165
+ end
166
+ end
metadata ADDED
@@ -0,0 +1,163 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: bigamy
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 1
8
+ - 0
9
+ version: 0.1.0
10
+ platform: ruby
11
+ authors:
12
+ - Ryan Angilly
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2010-06-30 00:00:00 -04:00
18
+ default_executable:
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: shoulda
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - "="
26
+ - !ruby/object:Gem::Version
27
+ segments:
28
+ - 2
29
+ - 11
30
+ - 0
31
+ version: 2.11.0
32
+ type: :development
33
+ version_requirements: *id001
34
+ - !ruby/object:Gem::Dependency
35
+ name: mocha
36
+ prerelease: false
37
+ requirement: &id002 !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - "="
40
+ - !ruby/object:Gem::Version
41
+ segments:
42
+ - 0
43
+ - 9
44
+ - 8
45
+ version: 0.9.8
46
+ type: :development
47
+ version_requirements: *id002
48
+ - !ruby/object:Gem::Dependency
49
+ name: factory_girl
50
+ prerelease: false
51
+ requirement: &id003 !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - "="
54
+ - !ruby/object:Gem::Version
55
+ segments:
56
+ - 1
57
+ - 3
58
+ - 1
59
+ version: 1.3.1
60
+ type: :development
61
+ version_requirements: *id003
62
+ - !ruby/object:Gem::Dependency
63
+ name: ruby-debug
64
+ prerelease: false
65
+ requirement: &id004 !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "="
68
+ - !ruby/object:Gem::Version
69
+ segments:
70
+ - 0
71
+ - 10
72
+ - 3
73
+ version: 0.10.3
74
+ type: :development
75
+ version_requirements: *id004
76
+ - !ruby/object:Gem::Dependency
77
+ name: mongo_mapper
78
+ prerelease: false
79
+ requirement: &id005 !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - "="
82
+ - !ruby/object:Gem::Version
83
+ segments:
84
+ - 0
85
+ - 8
86
+ - 2
87
+ version: 0.8.2
88
+ type: :development
89
+ version_requirements: *id005
90
+ - !ruby/object:Gem::Dependency
91
+ name: active_record
92
+ prerelease: false
93
+ requirement: &id006 !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ segments:
98
+ - 2
99
+ - 3
100
+ - 5
101
+ version: 2.3.5
102
+ type: :development
103
+ version_requirements: *id006
104
+ description: ""
105
+ email: ryan@angilly.com
106
+ executables: []
107
+
108
+ extensions: []
109
+
110
+ extra_rdoc_files:
111
+ - README
112
+ files:
113
+ - .gitignore
114
+ - MIT-LICENSE
115
+ - README
116
+ - Rakefile
117
+ - VERSION
118
+ - bigamy.gemspec
119
+ - lib/bigamy.rb
120
+ - lib/bigamy/ar.rb
121
+ - lib/bigamy/mongo.rb
122
+ - lib/bigamy/proxy.rb
123
+ - test/functional/test_helper.rb
124
+ - test/test_helper.rb
125
+ - test/unit/test_ar_side.rb
126
+ - test/unit/test_helper.rb
127
+ - test/unit/test_mongo_side.rb
128
+ has_rdoc: true
129
+ homepage: http://github.com/ryana/bigamy
130
+ licenses: []
131
+
132
+ post_install_message:
133
+ rdoc_options:
134
+ - --charset=UTF-8
135
+ require_paths:
136
+ - lib
137
+ required_ruby_version: !ruby/object:Gem::Requirement
138
+ requirements:
139
+ - - ">="
140
+ - !ruby/object:Gem::Version
141
+ segments:
142
+ - 0
143
+ version: "0"
144
+ required_rubygems_version: !ruby/object:Gem::Requirement
145
+ requirements:
146
+ - - ">="
147
+ - !ruby/object:Gem::Version
148
+ segments:
149
+ - 0
150
+ version: "0"
151
+ requirements: []
152
+
153
+ rubyforge_project:
154
+ rubygems_version: 1.3.6
155
+ signing_key:
156
+ specification_version: 3
157
+ summary: Have associations between ActiveRecord objects and MongoMapper documents
158
+ test_files:
159
+ - test/functional/test_helper.rb
160
+ - test/test_helper.rb
161
+ - test/unit/test_ar_side.rb
162
+ - test/unit/test_helper.rb
163
+ - test/unit/test_mongo_side.rb