machinist_mongo 1.0.2 → 1.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/VERSION +1 -1
- data/lib/machinist/mongo_mapper.rb +12 -1
- data/lib/machinist/mongoid.rb +71 -0
- data/machinist_mongo.gemspec +6 -3
- data/spec/mongo_mapper_spec.rb +21 -1
- data/spec/mongoid_spec.rb +170 -0
- data/spec/spec_helper.rb +14 -0
- metadata +23 -9
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.0
|
1
|
+
1.1.0
|
@@ -9,6 +9,17 @@ rescue LoadError
|
|
9
9
|
end
|
10
10
|
|
11
11
|
module Machinist
|
12
|
+
|
13
|
+
class Lathe
|
14
|
+
def assign_attribute(key, value)
|
15
|
+
assigned_attributes[key.to_sym] = value
|
16
|
+
if @object.respond_to? "#{key}="
|
17
|
+
@object.send("#{key}=", value)
|
18
|
+
else
|
19
|
+
@object[key] = value
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
12
23
|
|
13
24
|
class MongoMapperAdapter
|
14
25
|
def self.has_association?(object, attribute)
|
@@ -69,4 +80,4 @@ end
|
|
69
80
|
MongoMapper::Document.append_extensions(Machinist::Blueprints::ClassMethods)
|
70
81
|
MongoMapper::Document.append_extensions(Machinist::MongoMapperExtensions::Document)
|
71
82
|
MongoMapper::EmbeddedDocument::ClassMethods.send(:include, Machinist::Blueprints::ClassMethods)
|
72
|
-
MongoMapper::EmbeddedDocument::ClassMethods.send(:include, Machinist::MongoMapperExtensions::EmbeddedDocument)
|
83
|
+
MongoMapper::EmbeddedDocument::ClassMethods.send(:include, Machinist::MongoMapperExtensions::EmbeddedDocument)
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require "machinist"
|
2
|
+
require "machinist/blueprints"
|
3
|
+
|
4
|
+
begin
|
5
|
+
require "mongoid"
|
6
|
+
rescue LoadError
|
7
|
+
puts "Mongoid is not installed (gem install mongoid)"
|
8
|
+
exit
|
9
|
+
end
|
10
|
+
|
11
|
+
module Machinist
|
12
|
+
class Lathe
|
13
|
+
def assign_attribute(key, value)
|
14
|
+
assigned_attributes[key.to_sym] = value
|
15
|
+
@object.process(key => value)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
class MongoidAdapter
|
20
|
+
class << self
|
21
|
+
def has_association?(object, attribute)
|
22
|
+
object.class.associations[attribute.to_s]
|
23
|
+
end
|
24
|
+
|
25
|
+
def class_for_association(object, attribute)
|
26
|
+
association = object.class.associations[attribute.to_s]
|
27
|
+
association && association.klass
|
28
|
+
end
|
29
|
+
|
30
|
+
def assigned_attributes_without_associations(lathe)
|
31
|
+
attributes = {}
|
32
|
+
lathe.assigned_attributes.each_pair do |attribute, value|
|
33
|
+
association = lathe.object.class.associations[attribute.to_s]
|
34
|
+
if association && (association.macro == :belongs_to_related) && !value.nil?
|
35
|
+
attributes[association.foreign_key.to_sym] = value.id
|
36
|
+
else
|
37
|
+
attributes[attribute] = value
|
38
|
+
end
|
39
|
+
end
|
40
|
+
attributes
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
module MongoidExtensions
|
46
|
+
module Document
|
47
|
+
def make(*args, &block)
|
48
|
+
lathe = Lathe.run(Machinist::MongoidAdapter, self.new, *args)
|
49
|
+
unless Machinist.nerfed? || embedded
|
50
|
+
lathe.object.save!
|
51
|
+
lathe.object.reload
|
52
|
+
end
|
53
|
+
lathe.object(&block)
|
54
|
+
end
|
55
|
+
|
56
|
+
def make_unsaved(*args)
|
57
|
+
returning(Machinist.with_save_nerfed { make(*args) }) do |object|
|
58
|
+
yield object if block_given?
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def plan(*args)
|
63
|
+
lathe = Lathe.run(Machinist::MongoidAdapter, self.new, *args)
|
64
|
+
Machinist::MongoidAdapter.assigned_attributes_without_associations(lathe)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
Mongoid::Document::ClassMethods.send(:include, Machinist::Blueprints::ClassMethods)
|
71
|
+
Mongoid::Document::ClassMethods.send(:include, Machinist::MongoidExtensions::Document)
|
data/machinist_mongo.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{machinist_mongo}
|
8
|
-
s.version = "1.0
|
8
|
+
s.version = "1.1.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Nicolas M\303\251rouze", "Cyril Mougel"]
|
12
|
-
s.date = %q{2010-
|
12
|
+
s.date = %q{2010-03-31}
|
13
13
|
s.email = %q{nicolas.merouze@gmail.com}
|
14
14
|
s.extra_rdoc_files = [
|
15
15
|
"LICENSE",
|
@@ -22,17 +22,20 @@ Gem::Specification.new do |s|
|
|
22
22
|
"Rakefile",
|
23
23
|
"VERSION",
|
24
24
|
"lib/machinist/mongo_mapper.rb",
|
25
|
+
"lib/machinist/mongoid.rb",
|
25
26
|
"machinist_mongo.gemspec",
|
26
27
|
"spec/mongo_mapper_spec.rb",
|
28
|
+
"spec/mongoid_spec.rb",
|
27
29
|
"spec/spec_helper.rb"
|
28
30
|
]
|
29
31
|
s.homepage = %q{http://github.com/nmerouze/machinist_mongo}
|
30
32
|
s.rdoc_options = ["--charset=UTF-8"]
|
31
33
|
s.require_paths = ["lib"]
|
32
|
-
s.rubygems_version = %q{1.3.
|
34
|
+
s.rubygems_version = %q{1.3.6}
|
33
35
|
s.summary = %q{Machinist adapters for MongoDB ORMs}
|
34
36
|
s.test_files = [
|
35
37
|
"spec/mongo_mapper_spec.rb",
|
38
|
+
"spec/mongoid_spec.rb",
|
36
39
|
"spec/spec_helper.rb"
|
37
40
|
]
|
38
41
|
|
data/spec/mongo_mapper_spec.rb
CHANGED
@@ -102,6 +102,20 @@ describe Machinist, "MongoMapper::Document adapter" do
|
|
102
102
|
comment[:post].should be_nil
|
103
103
|
comment[:post_id].should_not be_nil
|
104
104
|
end
|
105
|
+
|
106
|
+
context "attribute assignment" do
|
107
|
+
it "should allow assigning a value to an attribute" do
|
108
|
+
Post.blueprint { title "1234" }
|
109
|
+
post = Post.make
|
110
|
+
post.title.should == "1234"
|
111
|
+
end
|
112
|
+
|
113
|
+
it "should allow arbitrary attributes on the base model in its blueprint" do
|
114
|
+
Post.blueprint { foo "bar" }
|
115
|
+
post = Post.make
|
116
|
+
post.foo.should == "bar"
|
117
|
+
end
|
118
|
+
end
|
105
119
|
end
|
106
120
|
|
107
121
|
describe "make_unsaved method" do
|
@@ -152,6 +166,12 @@ describe Machinist, "MongoMapper::EmbeddedDocument adapter" do
|
|
152
166
|
end
|
153
167
|
Person.make.address.should be_instance_of(Address)
|
154
168
|
end
|
169
|
+
|
170
|
+
it "should allow arbitrary attributes on the base model in its blueprint" do
|
171
|
+
Address.blueprint { foo "bar" }
|
172
|
+
addr = Address.make
|
173
|
+
addr.foo.should == "bar"
|
174
|
+
end
|
155
175
|
end
|
156
176
|
|
157
|
-
end
|
177
|
+
end
|
@@ -0,0 +1,170 @@
|
|
1
|
+
require File.dirname(__FILE__) + "/spec_helper"
|
2
|
+
require "machinist/mongoid"
|
3
|
+
|
4
|
+
Spec::Mongoid.configure!
|
5
|
+
|
6
|
+
class Address
|
7
|
+
include Mongoid::Document
|
8
|
+
|
9
|
+
field :street
|
10
|
+
field :zip
|
11
|
+
field :country
|
12
|
+
belongs_to :person, :inverse_of => :address
|
13
|
+
end
|
14
|
+
|
15
|
+
class Person
|
16
|
+
include Mongoid::Document
|
17
|
+
|
18
|
+
field :name
|
19
|
+
field :type
|
20
|
+
field :password
|
21
|
+
field :admin, :type => Boolean, :default => false
|
22
|
+
|
23
|
+
has_one :address
|
24
|
+
end
|
25
|
+
|
26
|
+
class Post
|
27
|
+
include Mongoid::Document
|
28
|
+
|
29
|
+
field :title
|
30
|
+
field :body
|
31
|
+
field :published, :type => Boolean, :default => true
|
32
|
+
|
33
|
+
has_many_related :comments
|
34
|
+
end
|
35
|
+
|
36
|
+
class Comment
|
37
|
+
include Mongoid::Document
|
38
|
+
|
39
|
+
field :body
|
40
|
+
field :post_id
|
41
|
+
field :author_id
|
42
|
+
|
43
|
+
belongs_to_related :post
|
44
|
+
belongs_to_related :author, :class_name => "Person"
|
45
|
+
end
|
46
|
+
|
47
|
+
describe Machinist, "Mongoid::Document adapter" do
|
48
|
+
|
49
|
+
before(:each) do
|
50
|
+
Person.clear_blueprints!
|
51
|
+
Post.clear_blueprints!
|
52
|
+
Comment.clear_blueprints!
|
53
|
+
end
|
54
|
+
|
55
|
+
describe "make method" do
|
56
|
+
it "should save the constructed object" do
|
57
|
+
Person.blueprint { }
|
58
|
+
person = Person.make
|
59
|
+
person.should_not be_new_record
|
60
|
+
end
|
61
|
+
|
62
|
+
it "should create an object through belongs_to association" do
|
63
|
+
Post.blueprint { }
|
64
|
+
Comment.blueprint { post }
|
65
|
+
Comment.make.post.class.should == Post
|
66
|
+
end
|
67
|
+
|
68
|
+
it "should create an object through belongs_to association with a class_name attribute" do
|
69
|
+
Person.blueprint { }
|
70
|
+
Comment.blueprint { author }
|
71
|
+
Comment.make.author.class.should == Person
|
72
|
+
end
|
73
|
+
|
74
|
+
it "should create an object through belongs_to association using a named blueprint" do
|
75
|
+
Post.blueprint { }
|
76
|
+
Post.blueprint(:dummy) do
|
77
|
+
title { 'Dummy Post' }
|
78
|
+
end
|
79
|
+
Comment.blueprint { post(:dummy) }
|
80
|
+
Comment.make.post.title.should == 'Dummy Post'
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
describe "plan method" do
|
85
|
+
it "should not save the constructed object" do
|
86
|
+
person_count = Person.count
|
87
|
+
Person.blueprint { }
|
88
|
+
person = Person.plan
|
89
|
+
Person.count.should == person_count
|
90
|
+
end
|
91
|
+
|
92
|
+
it "should return a regular attribute in the hash" do
|
93
|
+
Post.blueprint { title "Test" }
|
94
|
+
post = Post.plan
|
95
|
+
post[:title].should == "Test"
|
96
|
+
end
|
97
|
+
|
98
|
+
it "should create an object through a belongs_to association, and return its id" do
|
99
|
+
Post.blueprint { }
|
100
|
+
Comment.blueprint { post }
|
101
|
+
post_count = Post.count
|
102
|
+
comment = Comment.plan
|
103
|
+
Post.count.should == post_count + 1
|
104
|
+
comment[:post].should be_nil
|
105
|
+
comment[:post_id].should_not be_nil
|
106
|
+
end
|
107
|
+
|
108
|
+
context "attribute assignment" do
|
109
|
+
it "should allow assigning a value to an attribute" do
|
110
|
+
Post.blueprint { title "1234" }
|
111
|
+
post = Post.make
|
112
|
+
post.title.should == "1234"
|
113
|
+
end
|
114
|
+
|
115
|
+
it "should allow arbitrary attributes on the base model in its blueprint" do
|
116
|
+
Post.blueprint { foo "bar" }
|
117
|
+
post = Post.make
|
118
|
+
post.foo.should == "bar"
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
describe "make_unsaved method" do
|
124
|
+
it "should not save the constructed object" do
|
125
|
+
Person.blueprint { }
|
126
|
+
person = Person.make_unsaved
|
127
|
+
person.should be_new_record
|
128
|
+
end
|
129
|
+
|
130
|
+
it "should not save associated objects" do
|
131
|
+
pending
|
132
|
+
# Post.blueprint { }
|
133
|
+
# Comment.blueprint { post }
|
134
|
+
# comment = Comment.make_unsaved
|
135
|
+
# comment.post.should be_new_record
|
136
|
+
end
|
137
|
+
|
138
|
+
it "should save objects made within a passed-in block" do
|
139
|
+
Post.blueprint { }
|
140
|
+
Comment.blueprint { }
|
141
|
+
comment = nil
|
142
|
+
post = Post.make_unsaved { comment = Comment.make }
|
143
|
+
post.should be_new_record
|
144
|
+
comment.should_not be_new_record
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
describe "make method with embedded documents" do
|
149
|
+
it "should construct object" do
|
150
|
+
Address.blueprint { }
|
151
|
+
address = Address.make
|
152
|
+
address.should be_instance_of(Address)
|
153
|
+
end
|
154
|
+
|
155
|
+
it "should make an embed object" do
|
156
|
+
Address.blueprint { }
|
157
|
+
Person.blueprint do
|
158
|
+
address { Address.make }
|
159
|
+
end
|
160
|
+
Person.make.address.should be_instance_of(Address)
|
161
|
+
end
|
162
|
+
|
163
|
+
it "should allow arbitrary attributes on the base model in its blueprint" do
|
164
|
+
Address.blueprint { foo "bar" }
|
165
|
+
addr = Address.make
|
166
|
+
addr.foo.should == "bar"
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -14,4 +14,18 @@ module Spec
|
|
14
14
|
end
|
15
15
|
end
|
16
16
|
end
|
17
|
+
|
18
|
+
module Mongoid
|
19
|
+
def self.configure!
|
20
|
+
::Mongoid.configure do |config|
|
21
|
+
config.master = Mongo::Connection.new.db("machinist_mongoid")
|
22
|
+
config.allow_dynamic_fields = true
|
23
|
+
end
|
24
|
+
|
25
|
+
Spec::Runner.configure do |config|
|
26
|
+
config.before(:each) { Sham.reset }
|
27
|
+
config.after(:all) { ::Mongoid.master.collections.each { |c| c.remove } }
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
17
31
|
end
|
metadata
CHANGED
@@ -1,7 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: machinist_mongo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 1
|
7
|
+
- 1
|
8
|
+
- 0
|
9
|
+
version: 1.1.0
|
5
10
|
platform: ruby
|
6
11
|
authors:
|
7
12
|
- "Nicolas M\xC3\xA9rouze"
|
@@ -10,19 +15,23 @@ autorequire:
|
|
10
15
|
bindir: bin
|
11
16
|
cert_chain: []
|
12
17
|
|
13
|
-
date: 2010-
|
18
|
+
date: 2010-03-31 00:00:00 +02:00
|
14
19
|
default_executable:
|
15
20
|
dependencies:
|
16
21
|
- !ruby/object:Gem::Dependency
|
17
22
|
name: machinist
|
18
|
-
|
19
|
-
|
20
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
21
25
|
requirements:
|
22
26
|
- - ~>
|
23
27
|
- !ruby/object:Gem::Version
|
28
|
+
segments:
|
29
|
+
- 1
|
30
|
+
- 0
|
31
|
+
- 4
|
24
32
|
version: 1.0.4
|
25
|
-
|
33
|
+
type: :runtime
|
34
|
+
version_requirements: *id001
|
26
35
|
description:
|
27
36
|
email: nicolas.merouze@gmail.com
|
28
37
|
executables: []
|
@@ -39,8 +48,10 @@ files:
|
|
39
48
|
- Rakefile
|
40
49
|
- VERSION
|
41
50
|
- lib/machinist/mongo_mapper.rb
|
51
|
+
- lib/machinist/mongoid.rb
|
42
52
|
- machinist_mongo.gemspec
|
43
53
|
- spec/mongo_mapper_spec.rb
|
54
|
+
- spec/mongoid_spec.rb
|
44
55
|
- spec/spec_helper.rb
|
45
56
|
has_rdoc: true
|
46
57
|
homepage: http://github.com/nmerouze/machinist_mongo
|
@@ -55,21 +66,24 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
55
66
|
requirements:
|
56
67
|
- - ">="
|
57
68
|
- !ruby/object:Gem::Version
|
69
|
+
segments:
|
70
|
+
- 0
|
58
71
|
version: "0"
|
59
|
-
version:
|
60
72
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
61
73
|
requirements:
|
62
74
|
- - ">="
|
63
75
|
- !ruby/object:Gem::Version
|
76
|
+
segments:
|
77
|
+
- 0
|
64
78
|
version: "0"
|
65
|
-
version:
|
66
79
|
requirements: []
|
67
80
|
|
68
81
|
rubyforge_project:
|
69
|
-
rubygems_version: 1.3.
|
82
|
+
rubygems_version: 1.3.6
|
70
83
|
signing_key:
|
71
84
|
specification_version: 3
|
72
85
|
summary: Machinist adapters for MongoDB ORMs
|
73
86
|
test_files:
|
74
87
|
- spec/mongo_mapper_spec.rb
|
88
|
+
- spec/mongoid_spec.rb
|
75
89
|
- spec/spec_helper.rb
|