mongodb_model 0.0.11 → 0.0.12
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/lib/mongo/model/db.rb +23 -40
- data/lib/mongo/model/file_model.rb +2 -2
- data/lib/mongo/model/model.rb +11 -10
- data/lib/mongo/model/query.rb +1 -1
- data/lib/mongo/model/query_mixin.rb +4 -0
- data/lib/mongo/model/scope.rb +4 -1
- data/lib/mongo/model/spec.rb +3 -3
- data/readme.md +3 -3
- data/spec/db_spec.rb +32 -47
- data/spec/query_spec.rb +8 -0
- data/spec/scope_spec.rb +10 -2
- data/spec/validation_spec.rb +13 -2
- metadata +10 -10
data/lib/mongo/model/db.rb
CHANGED
@@ -1,56 +1,39 @@
|
|
1
1
|
module Mongo::Model::Db
|
2
2
|
module ClassMethods
|
3
|
-
inheritable_accessor :
|
4
|
-
def db=
|
5
|
-
|
6
|
-
|
7
|
-
elsif v.is_a? ::Symbol
|
8
|
-
-> do
|
9
|
-
db_name = ::Mongo::Model.resolve_db_alias v
|
10
|
-
::Mongo::Model.connection.db db_name
|
11
|
-
end
|
3
|
+
inheritable_accessor :db_name, nil
|
4
|
+
def db name = nil
|
5
|
+
if name
|
6
|
+
self.db_name = name
|
12
7
|
else
|
13
|
-
|
8
|
+
Mongo.db db_name || Mongo::Model.default_database_name
|
14
9
|
end
|
15
10
|
end
|
16
11
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
args.size.must == 1
|
22
|
-
self.db = args.first
|
12
|
+
inheritable_accessor :collection_name, nil
|
13
|
+
def collection name = nil, &block
|
14
|
+
if name
|
15
|
+
self.collection_name = name
|
23
16
|
else
|
24
|
-
(
|
17
|
+
db.collection(collection_name || default_collection_name)
|
25
18
|
end
|
26
19
|
end
|
27
20
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
-> {db.collection v}
|
34
|
-
else
|
35
|
-
-> {v}
|
21
|
+
protected
|
22
|
+
def default_collection_name
|
23
|
+
first_ancestor_class = ancestors.find{|a| a.is_a? Class} ||
|
24
|
+
raise("can't evaluate default collection name for #{self}!")
|
25
|
+
first_ancestor_class.alias.pluralize.underscore.to_sym
|
36
26
|
end
|
37
|
-
|
27
|
+
end
|
28
|
+
end
|
38
29
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
elsif !args.empty?
|
43
|
-
args.size.must == 1
|
44
|
-
self.collection = args.first
|
45
|
-
else
|
46
|
-
(_collection && _collection.call) || db.collection(default_collection_name)
|
47
|
-
end
|
48
|
-
end
|
30
|
+
Mongo::Model.class_eval do
|
31
|
+
class << self
|
32
|
+
attr_accessor :default_database_name
|
49
33
|
|
50
|
-
def
|
51
|
-
|
52
|
-
raise("can't evaluate default collection name for #{self}!")
|
53
|
-
first_ancestor_class.alias.pluralize.underscore.to_sym
|
34
|
+
def default_database
|
35
|
+
Mongo.db default_database_name
|
54
36
|
end
|
55
37
|
end
|
38
|
+
self.default_database_name = :default
|
56
39
|
end
|
@@ -19,9 +19,9 @@ module Mongo::Model::FileModel
|
|
19
19
|
model.errors[attr_name] = file_model.errors unless file_model.errors.empty?
|
20
20
|
end
|
21
21
|
|
22
|
-
after_save{|model| model.send(attr_name).save}
|
22
|
+
after_save{|model| model.send(attr_name).save!}
|
23
23
|
|
24
|
-
after_destroy{|model| model.send(attr_name).destroy}
|
24
|
+
after_destroy{|model| model.send(attr_name).destroy!}
|
25
25
|
end
|
26
26
|
end
|
27
27
|
end
|
data/lib/mongo/model/model.rb
CHANGED
@@ -25,14 +25,15 @@ module Mongo::Model
|
|
25
25
|
variables == o_variables
|
26
26
|
end
|
27
27
|
|
28
|
-
class << self
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
end
|
28
|
+
# class << self
|
29
|
+
# attr_accessor :db, :connection
|
30
|
+
# attr_required :db, :connection
|
31
|
+
#
|
32
|
+
# # Override this method to provide custom alias to db name translation,
|
33
|
+
# # for example db_name = my_config[alias_name]
|
34
|
+
# def resolve_db_alias alias_name
|
35
|
+
# db_name = alias_name.to_s
|
36
|
+
# connection.db db_name
|
37
|
+
# end
|
38
|
+
# end
|
38
39
|
end
|
data/lib/mongo/model/query.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
class Mongo::Model::Query < Object
|
2
2
|
attr_reader :model_class, :selector, :options
|
3
3
|
|
4
|
-
def initialize model_class, selector = {}, options = {}
|
4
|
+
def initialize model_class, selector = {}, options = {}
|
5
5
|
@model_class, @selector, @options = model_class, selector, options
|
6
6
|
end
|
7
7
|
|
data/lib/mongo/model/scope.rb
CHANGED
@@ -87,7 +87,10 @@ module Mongo::Model::Scope
|
|
87
87
|
#
|
88
88
|
def limit n; query({}, limit: n) end
|
89
89
|
def skip n; query({}, skip: n) end
|
90
|
-
def sort *list
|
90
|
+
def sort *list
|
91
|
+
list = list.collect{|item| item.is_a?(Array) ? item : [item, 1]}
|
92
|
+
query({}, sort: list)
|
93
|
+
end
|
91
94
|
def snapshot; query({}, snapshot: true) end
|
92
95
|
|
93
96
|
def paginate page, per_page
|
data/lib/mongo/model/spec.rb
CHANGED
data/readme.md
CHANGED
@@ -4,14 +4,14 @@ Object Model for MongoDB (callbacks, validations, mass-assignment, finders, ...)
|
|
4
4
|
- Minimum extra abstractions, trying to keep things as close to the MongoDB semantic as possible.
|
5
5
|
- Schema-less, dynamic (with ability to specify types for mass-assignment).
|
6
6
|
- Models can be saved to any collection, dynamically.
|
7
|
-
- Full support for embedded objects (validations, callbacks, ...).
|
7
|
+
- Full support for composite / embedded objects (validations, callbacks, ...).
|
8
8
|
- Scope, default_scope
|
9
|
-
- Doesn't try to mimic ActiveRecord, MongoDB is differrent and
|
9
|
+
- Doesn't try to mimic ActiveRecord, MongoDB is differrent and the Object Model designed to get most of it.
|
10
10
|
- Works with multiple connections and databases.
|
11
11
|
- Associations.
|
12
12
|
- Very small, see [code stats][code_stats].
|
13
13
|
|
14
|
-
Other ODM usually try to cover simple but non-standard API of MongoDB behind complex ORM-like abstractions. This tool **exposes simplicity and power of MongoDB and leverages
|
14
|
+
Other ODM usually try to cover simple but non-standard API of MongoDB behind complex ORM-like abstractions. This tool **exposes simplicity and power of MongoDB and leverages its differences**.
|
15
15
|
|
16
16
|
``` ruby
|
17
17
|
# Connecting to MongoDB.
|
data/spec/db_spec.rb
CHANGED
@@ -3,61 +3,46 @@ require 'spec_helper'
|
|
3
3
|
describe 'Collection & Database' do
|
4
4
|
with_mongo_model
|
5
5
|
|
6
|
-
before
|
6
|
+
before do
|
7
7
|
class TheModel
|
8
8
|
inherit Mongo::Model
|
9
9
|
end
|
10
10
|
end
|
11
|
-
after
|
11
|
+
after{remove_constants :TheModel}
|
12
12
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
Mongo::Model.db = db
|
22
|
-
|
23
|
-
Mongo::Model.connection.should == db.connection
|
24
|
-
Mongo::Model.db.should == db
|
25
|
-
end
|
13
|
+
# Discarded
|
14
|
+
# it "global setting" do
|
15
|
+
# Mongo::Model.connection = db.connection
|
16
|
+
# Mongo::Model.db = db
|
17
|
+
#
|
18
|
+
# Mongo::Model.connection.should == db.connection
|
19
|
+
# Mongo::Model.db.should == db
|
20
|
+
# end
|
26
21
|
|
27
22
|
it "should allow set database per model" do
|
28
|
-
|
29
|
-
Mongo::Model.db = db
|
30
|
-
|
31
|
-
TheModel.db.should == db
|
32
|
-
|
33
|
-
TheModel.db :test
|
34
|
-
TheModel.db.name.should == 'test'
|
23
|
+
TheModel.db :special_db_name
|
35
24
|
|
36
|
-
|
37
|
-
TheModel.db
|
38
|
-
TheModel.db.should == db
|
39
|
-
|
40
|
-
TheModel.db = nil
|
41
|
-
TheModel.db{db}
|
42
|
-
TheModel.db.should == db
|
25
|
+
Mongo.should_receive(:db).with(:special_db_name).and_return(:special_db)
|
26
|
+
TheModel.db.should == :special_db
|
43
27
|
end
|
44
28
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
29
|
+
# Discarded
|
30
|
+
# it "should allow set collection per model" do
|
31
|
+
# Mongo::Model.db = db
|
32
|
+
#
|
33
|
+
# # TheModel.default_collection_name.should == :the_model
|
34
|
+
# # TheModel.collection.name.should == 'the_model'
|
35
|
+
#
|
36
|
+
# TheModel.collection :units
|
37
|
+
# TheModel.collection.name.should == 'units'
|
38
|
+
#
|
39
|
+
# TheModel.collection = nil
|
40
|
+
# units = db.units
|
41
|
+
# TheModel.collection units
|
42
|
+
# TheModel.collection.should == units
|
43
|
+
#
|
44
|
+
# TheModel.collection = nil
|
45
|
+
# TheModel.collection{units}
|
46
|
+
# TheModel.collection.should == units
|
47
|
+
# end
|
63
48
|
end
|
data/spec/query_spec.rb
CHANGED
@@ -87,4 +87,12 @@ describe "Model Query" do
|
|
87
87
|
u = SpecialUnit.query(name: 'Zeratul', status: 'active').build age: 500
|
88
88
|
u.status.should == 'active'
|
89
89
|
end
|
90
|
+
|
91
|
+
it "where" do
|
92
|
+
# Unit.where(name: 'Zeratul').should == Mongo::Model::Query.new(Unit, {name: 'Zeratul'}, {})
|
93
|
+
|
94
|
+
query = Unit.where(name: 'Zeratul')
|
95
|
+
query = query.where(race: 'Protoss')
|
96
|
+
query.should == Mongo::Model::Query.new(Unit, {name: 'Zeratul', race: 'Protoss'}, {})
|
97
|
+
end
|
90
98
|
end
|
data/spec/scope_spec.rb
CHANGED
@@ -150,9 +150,17 @@ describe "Scope" do
|
|
150
150
|
|
151
151
|
describe 'handy scopes' do
|
152
152
|
it "limit, skip, sort" do
|
153
|
-
query = Unit.skip(30).limit(10).sort([name
|
153
|
+
query = Unit.skip(30).limit(10).sort([:name, 1]).snapshot
|
154
154
|
query.selector.should == {}
|
155
|
-
query.options.should == {skip: 30, limit: 10, sort: [[name
|
155
|
+
query.options.should == {skip: 30, limit: 10, sort: [[:name, 1]], snapshot: true}
|
156
|
+
end
|
157
|
+
|
158
|
+
it "sort should understand simplified form" do
|
159
|
+
query = Unit.sort(:name)
|
160
|
+
query.options.should == {sort: [[:name, 1]]}
|
161
|
+
|
162
|
+
query = Unit.sort(:race, :name)
|
163
|
+
query.options.should == {sort: [[:race, 1], [:name, 1]]}
|
156
164
|
end
|
157
165
|
|
158
166
|
it 'paginate' do
|
data/spec/validation_spec.rb
CHANGED
@@ -34,10 +34,10 @@ describe "Validations" do
|
|
34
34
|
unit.errors.clear
|
35
35
|
unit.save.should be_true
|
36
36
|
|
37
|
-
unit.errors
|
37
|
+
unit.errors.stub(:empty?).and_return(false)
|
38
38
|
unit.save.should be_false
|
39
39
|
|
40
|
-
unit.errors.
|
40
|
+
unit.errors.stub(:empty?).and_return(true)
|
41
41
|
unit.save.should be_true
|
42
42
|
end
|
43
43
|
|
@@ -93,6 +93,17 @@ describe "Validations" do
|
|
93
93
|
end
|
94
94
|
end
|
95
95
|
|
96
|
+
it "should clear errors before validation" do
|
97
|
+
class Unit < BaseUnit
|
98
|
+
validates_presence_of :name
|
99
|
+
end
|
100
|
+
|
101
|
+
unit = Unit.new
|
102
|
+
unit.should_not be_valid
|
103
|
+
unit.name = 'Zeratul'
|
104
|
+
unit.should be_valid
|
105
|
+
end
|
106
|
+
|
96
107
|
describe "special" do
|
97
108
|
it 'validates_uniqueness_of' do
|
98
109
|
class Unit < BaseUnit
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mongodb_model
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.12
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2011-09-
|
12
|
+
date: 2011-09-15 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: mongodb
|
16
|
-
requirement: &
|
16
|
+
requirement: &2843630 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *2843630
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: file_model
|
27
|
-
requirement: &
|
27
|
+
requirement: &2843390 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *2843390
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: validatable2
|
38
|
-
requirement: &
|
38
|
+
requirement: &2843150 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *2843150
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: ruby_ext
|
49
|
-
requirement: &
|
49
|
+
requirement: &2842910 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,7 +54,7 @@ dependencies:
|
|
54
54
|
version: '0'
|
55
55
|
type: :runtime
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *2842910
|
58
58
|
description:
|
59
59
|
email:
|
60
60
|
executables: []
|