mongodb 0.0.2 → 0.0.3
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/Rakefile +1 -1
- data/lib/mongodb/object/object_helper.rb +2 -2
- data/readme.md +56 -129
- data/spec/object/crud_spec.rb +1 -1
- metadata +8 -36
- data/lib/mongodb/integration/locales.rb +0 -4
- data/lib/mongodb/integration/locales/activemodel/ru.yml +0 -27
- data/lib/mongodb/model.rb +0 -26
- data/lib/mongodb/model/assignment.rb +0 -65
- data/lib/mongodb/model/attribute_convertors.rb +0 -54
- data/lib/mongodb/model/callbacks.rb +0 -36
- data/lib/mongodb/model/crud.rb +0 -57
- data/lib/mongodb/model/db.rb +0 -53
- data/lib/mongodb/model/misc.rb +0 -33
- data/lib/mongodb/model/model.rb +0 -11
- data/lib/mongodb/model/query.rb +0 -36
- data/lib/mongodb/model/scope.rb +0 -99
- data/lib/mongodb/model/spec.rb +0 -12
- data/lib/mongodb/model/support/types.rb +0 -110
- data/lib/mongodb/model/validation.rb +0 -5
- data/spec/integration/am_conversion_spec.rb +0 -1
- data/spec/integration/am_validation_spec.rb +0 -34
- data/spec/integration/validatable2_spec.rb +0 -40
- data/spec/model/assignment_spec.rb +0 -80
- data/spec/model/attribute_convertors_spec.rb +0 -73
- data/spec/model/callbacks_spec.rb +0 -47
- data/spec/model/crud_spec.rb +0 -151
- data/spec/model/db_spec.rb +0 -63
- data/spec/model/misc_spec.rb +0 -58
- data/spec/model/query_spec.rb +0 -47
- data/spec/model/scope_spec.rb +0 -149
- data/spec/model/spec_helper.rb +0 -4
- data/spec/model/validation_spec.rb +0 -37
@@ -1,54 +0,0 @@
|
|
1
|
-
require 'json'
|
2
|
-
require 'yaml'
|
3
|
-
|
4
|
-
module Mongo::Model::AttributeConvertors
|
5
|
-
CONVERTORS = {
|
6
|
-
line: {
|
7
|
-
from_string: -> s {(s || "").split(',').collect{|s| s.strip}},
|
8
|
-
to_string: -> v {v.join(', ')}
|
9
|
-
},
|
10
|
-
column: {
|
11
|
-
from_string: -> s {(s || "").split("\n").collect{|s| s.strip}},
|
12
|
-
to_string: -> v {v.join("\n")}
|
13
|
-
},
|
14
|
-
yaml: {
|
15
|
-
from_string: -> s {YAML.load s rescue {}},
|
16
|
-
to_string: -> v {v.to_yaml.strip}
|
17
|
-
},
|
18
|
-
json: {
|
19
|
-
from_string: -> s {JSON.parse s rescue {}},
|
20
|
-
to_string: -> v {v.to_json.strip}
|
21
|
-
}
|
22
|
-
}
|
23
|
-
|
24
|
-
module ClassMethods
|
25
|
-
def available_as_string name, converter_name
|
26
|
-
converter = CONVERTORS[converter_name]
|
27
|
-
raise "unknown converter name :#{converter_name} for :#{name} field!" unless converter
|
28
|
-
|
29
|
-
from_string, to_string = converter[:from_string], converter[:to_string]
|
30
|
-
name_as_string = "#{name}_as_string".to_sym
|
31
|
-
define_method name_as_string do
|
32
|
-
_cache[name_as_string] ||= to_string.call(send(name))
|
33
|
-
end
|
34
|
-
|
35
|
-
define_method "#{name_as_string}=" do |value|
|
36
|
-
_cache.delete name_as_string
|
37
|
-
self.send "#{name}=", from_string.call(value)
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
def available_as_yaml name
|
42
|
-
raise "delimiter not specified for :#{name} field!" unless delimiter
|
43
|
-
method = "#{name}_as_string"
|
44
|
-
define_method method do
|
45
|
-
self.send(name).join(delimiter)
|
46
|
-
end
|
47
|
-
define_method "#{method}=" do |value|
|
48
|
-
value = (value || "").split(delimiter.strip).collect{|s| s.strip}
|
49
|
-
self.send "#{name}=", value
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
end
|
@@ -1,36 +0,0 @@
|
|
1
|
-
module Mongo::Model::Callbacks
|
2
|
-
inherit RubyExt::Callbacks
|
3
|
-
|
4
|
-
def _run_callbacks type, method_name
|
5
|
-
if type == :before
|
6
|
-
run_before_callbacks method_name, method: method_name
|
7
|
-
elsif type == :after
|
8
|
-
run_after_callbacks method_name, method: method_name
|
9
|
-
else
|
10
|
-
raise "invalid callback type (#{type})!"
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
module ClassMethods
|
15
|
-
[:validate, :update, :save, :destroy].each do |method_name|
|
16
|
-
define_method "before_#{method_name}" do |*args, &block|
|
17
|
-
opt = args.extract_options!
|
18
|
-
if block
|
19
|
-
set_callback method_name, :before, opt, &block
|
20
|
-
else
|
21
|
-
opt[:terminator] = false unless opt.include? :terminator
|
22
|
-
args.each{|executor| set_callback method_name, :before, executor, opt}
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
define_method "after_#{method_name}" do |*args, &block|
|
27
|
-
opt = args.extract_options!
|
28
|
-
if block
|
29
|
-
set_callback method_name, :after, opt, &block
|
30
|
-
else
|
31
|
-
args.each{|executor| set_callback method_name, :after, executor, opt}
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
data/lib/mongodb/model/crud.rb
DELETED
@@ -1,57 +0,0 @@
|
|
1
|
-
module Mongo::Model::Crud
|
2
|
-
def save opts = {}
|
3
|
-
with_collection opts do |collection, opts|
|
4
|
-
collection.save self, opts
|
5
|
-
end
|
6
|
-
end
|
7
|
-
|
8
|
-
def save! *args
|
9
|
-
save(*args) || raise(Mongo::Error, "can't save #{self.inspect}!")
|
10
|
-
end
|
11
|
-
|
12
|
-
def destroy opts = {}
|
13
|
-
with_collection opts do |collection, opts|
|
14
|
-
collection.destroy self, opts
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
def destroy! *args
|
19
|
-
destroy(*args) || raise(Mongo::Error, "can't destroy #{self.inspect}!")
|
20
|
-
end
|
21
|
-
|
22
|
-
module ClassMethods
|
23
|
-
def build attributes, opts = {}
|
24
|
-
self.new.set attributes, opts
|
25
|
-
end
|
26
|
-
|
27
|
-
def create attributes, opts = {}
|
28
|
-
o = build attributes, opts
|
29
|
-
o.save
|
30
|
-
o
|
31
|
-
end
|
32
|
-
|
33
|
-
def create! attributes, opts = {}
|
34
|
-
o = create attributes
|
35
|
-
raise(Mongo::Error, "can't create #{attributes.inspect}!") if o.new_record?
|
36
|
-
o
|
37
|
-
end
|
38
|
-
|
39
|
-
def destroy_all selector = {}, opts = {}
|
40
|
-
success = true
|
41
|
-
collection = opts[:collection] || self.collection
|
42
|
-
each(selector){|o| success = false unless o.destroy}
|
43
|
-
success
|
44
|
-
end
|
45
|
-
|
46
|
-
def destroy_all! selector = {}, opts = {}
|
47
|
-
destroy_all(selector, opts) || raise(Mongo::Error, "can't destroy #{selector.inspect}!")
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
protected
|
52
|
-
def with_collection opts, &block
|
53
|
-
opts = opts.clone
|
54
|
-
collection = opts.delete(:collection) || self.class.collection
|
55
|
-
block.call collection, opts
|
56
|
-
end
|
57
|
-
end
|
data/lib/mongodb/model/db.rb
DELETED
@@ -1,53 +0,0 @@
|
|
1
|
-
module Mongo::Model::Db
|
2
|
-
module ClassMethods
|
3
|
-
inheritable_accessor :_db, nil
|
4
|
-
def db= v
|
5
|
-
self._db = if v.is_a? ::Proc
|
6
|
-
v
|
7
|
-
elsif v.is_a? ::Symbol
|
8
|
-
-> {::Mongo::Model.connection.db v.to_s}
|
9
|
-
else
|
10
|
-
-> {v}
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
def db *args, &block
|
15
|
-
if block
|
16
|
-
self.db = block
|
17
|
-
elsif !args.empty?
|
18
|
-
args.size.must == 1
|
19
|
-
self.db = args.first
|
20
|
-
else
|
21
|
-
(_db && _db.call) || ::Mongo::Model.db
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
inheritable_accessor :_collection, nil
|
26
|
-
def collection= v
|
27
|
-
self._collection = if v.is_a? ::Proc
|
28
|
-
v
|
29
|
-
elsif v.is_a? ::Symbol
|
30
|
-
-> {db.collection v}
|
31
|
-
else
|
32
|
-
-> {v}
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
def collection *args, &block
|
37
|
-
if block
|
38
|
-
self.collection = block
|
39
|
-
elsif !args.empty?
|
40
|
-
args.size.must == 1
|
41
|
-
self.collection = args.first
|
42
|
-
else
|
43
|
-
(_collection && _collection.call) || db.collection(default_collection_name)
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
def default_collection_name
|
48
|
-
first_ancestor_class = ancestors.find{|a| a.is_a? Class} ||
|
49
|
-
raise("can't evaluate default collection name for #{self}!")
|
50
|
-
first_ancestor_class.alias.pluralize.underscore.to_sym
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
data/lib/mongodb/model/misc.rb
DELETED
@@ -1,33 +0,0 @@
|
|
1
|
-
module Mongo::Model::Misc
|
2
|
-
def update_timestamps
|
3
|
-
now = Time.now.utc
|
4
|
-
self.created_at ||= now
|
5
|
-
self.updated_at = now
|
6
|
-
end
|
7
|
-
|
8
|
-
|
9
|
-
def _cache
|
10
|
-
@_cache ||= {}
|
11
|
-
end
|
12
|
-
def _clear_cache
|
13
|
-
@_cache = {}
|
14
|
-
end
|
15
|
-
|
16
|
-
|
17
|
-
def dom_id
|
18
|
-
# new_record? ? "new_#{self.class.name.underscore}" : to_param
|
19
|
-
to_param
|
20
|
-
end
|
21
|
-
|
22
|
-
def to_param
|
23
|
-
(_id || '').to_s
|
24
|
-
end
|
25
|
-
|
26
|
-
|
27
|
-
module ClassMethods
|
28
|
-
def timestamps!
|
29
|
-
attr_accessor :created_at, :updated_at
|
30
|
-
before_save :update_timestamps
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
data/lib/mongodb/model/model.rb
DELETED
data/lib/mongodb/model/query.rb
DELETED
@@ -1,36 +0,0 @@
|
|
1
|
-
module Mongo::Model::Query
|
2
|
-
module ClassMethods
|
3
|
-
include Mongo::DynamicFinders
|
4
|
-
|
5
|
-
def count selector = {}, opts = {}
|
6
|
-
collection.count selector, opts
|
7
|
-
end
|
8
|
-
|
9
|
-
def first selector = {}, opts = {}
|
10
|
-
collection.first selector, opts
|
11
|
-
end
|
12
|
-
|
13
|
-
def each selector = {}, opts = {}, &block
|
14
|
-
collection.each selector, opts, &block
|
15
|
-
end
|
16
|
-
|
17
|
-
def all selector = {}, opts = {}, &block
|
18
|
-
if block
|
19
|
-
each selector, opts, &block
|
20
|
-
else
|
21
|
-
list = []
|
22
|
-
each(selector, opts){|doc| list << doc}
|
23
|
-
list
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
def first! selector = {}, opts = {}
|
28
|
-
first(selector, opts) || raise(Mongo::NotFound, "document with selector #{selector} not found!")
|
29
|
-
end
|
30
|
-
|
31
|
-
def exists? selector = {}, opts = {}
|
32
|
-
count(selector, opts) > 0
|
33
|
-
end
|
34
|
-
alias :exist? :exists?
|
35
|
-
end
|
36
|
-
end
|
data/lib/mongodb/model/scope.rb
DELETED
@@ -1,99 +0,0 @@
|
|
1
|
-
module Mongo::Model::Scope
|
2
|
-
class ScopeProxy < BasicObject
|
3
|
-
def initialize model, scope
|
4
|
-
@model, @scope = model, scope
|
5
|
-
end
|
6
|
-
|
7
|
-
def class
|
8
|
-
::Mongo::Model::Scope::ScopeProxy
|
9
|
-
end
|
10
|
-
|
11
|
-
def reverse_merge! scope
|
12
|
-
@scope = scope.merge @scope
|
13
|
-
end
|
14
|
-
|
15
|
-
def inspect
|
16
|
-
"#<ScopeProxy:{#{scope.inspect}}>"
|
17
|
-
end
|
18
|
-
alias_method :to_s, :inspect
|
19
|
-
|
20
|
-
protected
|
21
|
-
attr_reader :model, :scope
|
22
|
-
|
23
|
-
def method_missing method, *args, &block
|
24
|
-
model.with_scope scope do
|
25
|
-
result = model.send method, *args, &block
|
26
|
-
result.reverse_merge! scope if result.class == ::Mongo::Model::Scope::ScopeProxy
|
27
|
-
result
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
module ClassMethods
|
33
|
-
def current_scope
|
34
|
-
scope, exclusive = Thread.current[:mongo_model_scope]
|
35
|
-
if exclusive
|
36
|
-
scope
|
37
|
-
elsif scope
|
38
|
-
default_scope.merge scope
|
39
|
-
else
|
40
|
-
default_scope
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
def with_exclusive_scope options = {}, &block
|
45
|
-
with_scope options, true, &block
|
46
|
-
end
|
47
|
-
|
48
|
-
def with_scope options = {}, exclusive = false, &block
|
49
|
-
previous_options, previous_exclusive = Thread.current[:mongo_model_scope]
|
50
|
-
raise "exclusive scope already applied!" if previous_exclusive
|
51
|
-
|
52
|
-
begin
|
53
|
-
options = previous_options.merge options if previous_options and !exclusive
|
54
|
-
Thread.current[:mongo_model_scope] = [options, exclusive]
|
55
|
-
return block.call
|
56
|
-
ensure
|
57
|
-
Thread.current[:mongo_model_scope] = [previous_options, false]
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
inheritable_accessor :_default_scope, -> {{}}
|
62
|
-
def default_scope *args, &block
|
63
|
-
if block
|
64
|
-
self._default_scope = block
|
65
|
-
elsif !args.empty?
|
66
|
-
args.size.must == 1
|
67
|
-
args.first.must_be.a Hash
|
68
|
-
scope = args.first
|
69
|
-
self._default_scope = -> {args.first}
|
70
|
-
else
|
71
|
-
_default_scope.call
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
|
-
def scope name, options = nil, &block
|
76
|
-
model = self
|
77
|
-
metaclass.define_method name do
|
78
|
-
scope = (block && block.call) || options
|
79
|
-
ScopeProxy.new model, scope
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
|
84
|
-
#
|
85
|
-
# finders
|
86
|
-
#
|
87
|
-
def count selector = {}, opts = {}
|
88
|
-
super current_scope.merge(selector), opts
|
89
|
-
end
|
90
|
-
|
91
|
-
def first selector = {}, opts = {}
|
92
|
-
super current_scope.merge(selector), opts
|
93
|
-
end
|
94
|
-
|
95
|
-
def each selector = {}, opts = {}, &block
|
96
|
-
super current_scope.merge(selector), opts, &block
|
97
|
-
end
|
98
|
-
end
|
99
|
-
end
|
data/lib/mongodb/model/spec.rb
DELETED
@@ -1,110 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# Boolean
|
3
|
-
#
|
4
|
-
module Mongo::Model::BooleanType
|
5
|
-
Mapping = {
|
6
|
-
true => true,
|
7
|
-
'true' => true,
|
8
|
-
'TRUE' => true,
|
9
|
-
'True' => true,
|
10
|
-
't' => true,
|
11
|
-
'T' => true,
|
12
|
-
'1' => true,
|
13
|
-
1 => true,
|
14
|
-
1.0 => true,
|
15
|
-
false => false,
|
16
|
-
'false' => false,
|
17
|
-
'FALSE' => false,
|
18
|
-
'False' => false,
|
19
|
-
'f' => false,
|
20
|
-
'F' => false,
|
21
|
-
'0' => false,
|
22
|
-
0 => false,
|
23
|
-
0.0 => false,
|
24
|
-
nil => nil
|
25
|
-
}
|
26
|
-
|
27
|
-
def cast value
|
28
|
-
if value.is_a? Boolean
|
29
|
-
value
|
30
|
-
else
|
31
|
-
Mapping[value] || false
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
class Boolean; end unless defined?(Boolean)
|
37
|
-
|
38
|
-
Boolean.extend Mongo::Model::BooleanType
|
39
|
-
|
40
|
-
|
41
|
-
#
|
42
|
-
# Date
|
43
|
-
#
|
44
|
-
require 'date'
|
45
|
-
Date.class_eval do
|
46
|
-
def self.cast value
|
47
|
-
if value.nil? || value == ''
|
48
|
-
nil
|
49
|
-
else
|
50
|
-
date = value.is_a?(::Date) || value.is_a?(::Time) ? value : ::Date.parse(value.to_s)
|
51
|
-
date.to_date
|
52
|
-
end
|
53
|
-
rescue
|
54
|
-
nil
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
|
59
|
-
#
|
60
|
-
# Float
|
61
|
-
#
|
62
|
-
Float.class_eval do
|
63
|
-
def self.cast value
|
64
|
-
value.nil? ? nil : value.to_f
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
|
69
|
-
#
|
70
|
-
# Integer
|
71
|
-
#
|
72
|
-
Integer.class_eval do
|
73
|
-
def self.cast value
|
74
|
-
value_to_i = value.to_i
|
75
|
-
if value_to_i == 0 && value != value_to_i
|
76
|
-
value.to_s =~ /^(0x|0b)?0+/ ? 0 : nil
|
77
|
-
else
|
78
|
-
value_to_i
|
79
|
-
end
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
|
84
|
-
#
|
85
|
-
# String
|
86
|
-
#
|
87
|
-
String.class_eval do
|
88
|
-
def self.cast value
|
89
|
-
value.nil? ? nil : value.to_s
|
90
|
-
end
|
91
|
-
end
|
92
|
-
|
93
|
-
|
94
|
-
#
|
95
|
-
# Time
|
96
|
-
#
|
97
|
-
Time.class_eval do
|
98
|
-
def self.cast value
|
99
|
-
if value.nil? || value == ''
|
100
|
-
nil
|
101
|
-
else
|
102
|
-
# time_class = ::Time.try(:zone).present? ? ::Time.zone : ::Time
|
103
|
-
# time = value.is_a?(::Time) ? value : time_class.parse(value.to_s)
|
104
|
-
# strip milliseconds as Ruby does micro and bson does milli and rounding rounded wrong
|
105
|
-
# at(time.to_i).utc if time
|
106
|
-
|
107
|
-
value.is_a?(::Time) ? value : Date.parse(value.to_s).to_time
|
108
|
-
end
|
109
|
-
end
|
110
|
-
end
|