mongo_odm 0.1.8 → 0.1.9
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +7 -2
- data/Rakefile +15 -12
- data/lib/mongo_odm.rb +6 -8
- data/lib/mongo_odm/criteria.rb +20 -0
- data/lib/mongo_odm/cursor.rb +1 -1
- data/lib/mongo_odm/document.rb +9 -2
- data/lib/mongo_odm/document/associations.rb +0 -7
- data/lib/mongo_odm/document/attribute_methods.rb +2 -0
- data/lib/mongo_odm/document/attribute_methods/inspect.rb +19 -0
- data/lib/mongo_odm/document/attribute_methods/localization.rb +36 -32
- data/lib/mongo_odm/document/fields.rb +1 -1
- data/lib/mongo_odm/document/inspect.rb +1 -1
- data/lib/mongo_odm/document/persistence.rb +11 -3
- data/lib/mongo_odm/version.rb +1 -1
- data/spec/models/02-circle.rb +0 -1
- data/spec/models/03-big_red_circle.rb +1 -2
- data/spec/mongo_odm/collection_spec.rb +6 -0
- data/spec/mongo_odm/core_ext/conversions_spec.rb +14 -4
- data/spec/mongo_odm/cursor_spec.rb +6 -0
- data/spec/mongo_odm/document/attribute_methods/dirty_spec.rb +6 -0
- data/spec/mongo_odm/document/attribute_methods/localization_spec.rb +6 -0
- data/spec/mongo_odm/document/attribute_methods/query_spec.rb +6 -0
- data/spec/mongo_odm/document/attribute_methods/read_spec.rb +6 -0
- data/spec/mongo_odm/document/attribute_methods/write_spec.rb +6 -0
- data/spec/mongo_odm/document/attribute_methods_spec.rb +6 -0
- data/spec/mongo_odm/document/callbacks_spec.rb +6 -0
- data/spec/mongo_odm/document/fields_spec.rb +15 -33
- data/spec/mongo_odm/document/inspect_spec.rb +7 -0
- data/spec/mongo_odm/document/persistence_spec.rb +6 -0
- data/spec/mongo_odm/document/validations_spec.rb +6 -0
- data/spec/mongo_odm/document_spec.rb +15 -7
- data/spec/mongo_odm/mongo_odm_spec.rb +25 -30
- data/spec/spec_helper.rb +1 -2
- metadata +118 -19
- data/spec/spec.opts +0 -4
data/Gemfile
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# Use `bundle install` in order to install these gems
|
1
2
|
source 'http://rubygems.org'
|
2
3
|
|
3
4
|
gem "activesupport", "3.0.0.beta3"
|
@@ -6,6 +7,10 @@ gem "mongo", "~>1.0.2"
|
|
6
7
|
gem "bson_ext", "~>1.0.1"
|
7
8
|
gem "tzinfo", "~>0.3.22"
|
8
9
|
|
9
|
-
group :
|
10
|
-
gem '
|
10
|
+
group :development do
|
11
|
+
gem 'jeweler', '1.4.0'
|
12
|
+
gem 'yard', '0.5.6'
|
13
|
+
gem 'rcov', '0.9.8'
|
14
|
+
gem 'rspec', '2.0.0.beta.12'
|
15
|
+
gem 'watchr', '~>0.6'
|
11
16
|
end
|
data/Rakefile
CHANGED
@@ -4,6 +4,7 @@ require 'rake'
|
|
4
4
|
## gem building
|
5
5
|
require File.dirname(__FILE__) + "/lib/mongo_odm/version.rb"
|
6
6
|
if Gem.available? 'jeweler'
|
7
|
+
require 'bundler'
|
7
8
|
require 'jeweler'
|
8
9
|
Jeweler::Tasks.new do |gemspec|
|
9
10
|
gemspec.name = "mongo_odm"
|
@@ -14,11 +15,14 @@ if Gem.available? 'jeweler'
|
|
14
15
|
gemspec.authors = ["Carlos Paramio"]
|
15
16
|
gemspec.files = FileList["[A-Z]*", "{lib,spec}/**/*"]
|
16
17
|
gemspec.version = MongoODM::VERSION
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
18
|
+
bundle = Bundler::Definition.from_gemfile('Gemfile')
|
19
|
+
bundle.dependencies.each do |dependency|
|
20
|
+
if dependency.groups.include?(:default)
|
21
|
+
gemspec.add_dependency(dependency.name, dependency.requirement.to_s)
|
22
|
+
elsif dependency.groups.include?(:development)
|
23
|
+
gemspec.add_development_dependency(dependency.name, dependency.requirement.to_s)
|
24
|
+
end
|
25
|
+
end
|
22
26
|
end
|
23
27
|
Jeweler::GemcutterTasks.new
|
24
28
|
else
|
@@ -27,19 +31,18 @@ end
|
|
27
31
|
|
28
32
|
## rspec tasks
|
29
33
|
if Gem.available? 'rspec'
|
30
|
-
require
|
34
|
+
require "rspec"
|
35
|
+
require "rspec/core/rake_task"
|
31
36
|
desc "Run all specs"
|
32
|
-
|
33
|
-
|
37
|
+
Rspec::Core::RakeTask.new(:spec) do |spec|
|
38
|
+
spec.pattern = "spec/**/*_spec.rb"
|
34
39
|
end
|
35
40
|
|
36
41
|
## rcov task
|
37
42
|
if Gem.available? 'rcov'
|
38
43
|
require 'rcov/rcovtask'
|
39
|
-
|
40
|
-
spec.libs << "lib" << "spec"
|
44
|
+
Rspec::Core::RakeTask.new(:rcov) do |spec|
|
41
45
|
spec.pattern = "spec/**/*_spec.rb"
|
42
|
-
spec.spec_opts = ["--options", "spec/spec.opts"]
|
43
46
|
spec.rcov = true
|
44
47
|
end
|
45
48
|
end
|
@@ -51,7 +54,7 @@ end
|
|
51
54
|
if Gem.available? 'yard'
|
52
55
|
require 'yard'
|
53
56
|
YARD::Rake::YardocTask.new do |yard|
|
54
|
-
docfiles = FileList['lib/**/*.rb'
|
57
|
+
docfiles = FileList['lib/**/*.rb']
|
55
58
|
yard.files = docfiles
|
56
59
|
yard.options = ["--no-private"]
|
57
60
|
end
|
data/lib/mongo_odm.rb
CHANGED
@@ -11,6 +11,7 @@ module MongoODM
|
|
11
11
|
include ActiveSupport::Configurable
|
12
12
|
|
13
13
|
autoload :VERSION
|
14
|
+
autoload :Criteria
|
14
15
|
autoload :Cursor
|
15
16
|
autoload :Collection
|
16
17
|
autoload :Document
|
@@ -34,15 +35,12 @@ module MongoODM
|
|
34
35
|
end
|
35
36
|
|
36
37
|
def self.instanciate(value)
|
37
|
-
return
|
38
|
-
|
39
|
-
|
38
|
+
return value if value.is_a?(MongoODM::Document)
|
39
|
+
if value.is_a?(Hash)
|
40
|
+
klass = value["_class"] || value[:_class]
|
41
|
+
return klass.constantize.new(value) if klass
|
42
|
+
end
|
40
43
|
value.class.type_cast(value.to_mongo)
|
41
44
|
end
|
42
|
-
|
43
|
-
def self.instanciate_doc(doc)
|
44
|
-
return doc if doc["_class"].nil?
|
45
|
-
doc["_class"].constantize.new(doc)
|
46
|
-
end
|
47
45
|
|
48
46
|
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module MongoODM
|
3
|
+
|
4
|
+
class Criteria
|
5
|
+
def initialize(collection, selector = {}, opts = {})
|
6
|
+
@collection, @selector, @opts = collection, selector, opts
|
7
|
+
end
|
8
|
+
|
9
|
+
def find(selector = {}, opts = {})
|
10
|
+
@selector.merge!(selector)
|
11
|
+
@opts.merge!(opts)
|
12
|
+
self
|
13
|
+
end
|
14
|
+
|
15
|
+
def method_missing(method_name, *args)
|
16
|
+
@collection.find(@selector, @opts).send(method_name, *args)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
data/lib/mongo_odm/cursor.rb
CHANGED
data/lib/mongo_odm/document.rb
CHANGED
@@ -7,7 +7,7 @@ module MongoODM
|
|
7
7
|
extend ActiveSupport::Concern
|
8
8
|
extend ActiveSupport::Autoload
|
9
9
|
|
10
|
-
autoload :Associations
|
10
|
+
#autoload :Associations
|
11
11
|
autoload :AttributeMethods
|
12
12
|
autoload :Callbacks
|
13
13
|
autoload :Fields
|
@@ -25,10 +25,17 @@ module MongoODM
|
|
25
25
|
include MongoODM::Document::AttributeMethods
|
26
26
|
include MongoODM::Document::Fields
|
27
27
|
include MongoODM::Document::Inspect
|
28
|
-
include MongoODM::Document::Associations
|
28
|
+
#include MongoODM::Document::Associations
|
29
29
|
include MongoODM::Document::Callbacks
|
30
30
|
include MongoODM::Document::Validations
|
31
31
|
end
|
32
|
+
|
33
|
+
module InstanceMethods
|
34
|
+
def ==(other)
|
35
|
+
return false unless other.is_a?(MongoODM::Document)
|
36
|
+
attributes == other.attributes
|
37
|
+
end
|
38
|
+
end
|
32
39
|
|
33
40
|
end
|
34
41
|
end
|
@@ -25,13 +25,6 @@ module MongoODM
|
|
25
25
|
end
|
26
26
|
|
27
27
|
module ClassMethods
|
28
|
-
def associate(type, options)
|
29
|
-
name = options.name.to_s
|
30
|
-
associations[name] = MetaData.new(type, options)
|
31
|
-
define_method(name) { memoized(name) { type.instantiate(self, options) } }
|
32
|
-
define_method("#{name}=") { |object| reset(name) { type.update(object, self, options) } }
|
33
|
-
end
|
34
|
-
protected :associate
|
35
28
|
end
|
36
29
|
|
37
30
|
end
|
@@ -12,6 +12,7 @@ module MongoODM
|
|
12
12
|
autoload :Write
|
13
13
|
autoload :Query
|
14
14
|
autoload :Dirty
|
15
|
+
autoload :Inspect
|
15
16
|
autoload :Localization
|
16
17
|
|
17
18
|
included do
|
@@ -20,6 +21,7 @@ module MongoODM
|
|
20
21
|
include MongoODM::Document::AttributeMethods::Write
|
21
22
|
include MongoODM::Document::AttributeMethods::Query
|
22
23
|
include MongoODM::Document::AttributeMethods::Dirty
|
24
|
+
include MongoODM::Document::AttributeMethods::Inspect
|
23
25
|
include MongoODM::Document::AttributeMethods::Localization
|
24
26
|
end
|
25
27
|
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module MongoODM
|
4
|
+
module Document
|
5
|
+
module AttributeMethods
|
6
|
+
module Inspect
|
7
|
+
|
8
|
+
extend ActiveSupport::Concern
|
9
|
+
|
10
|
+
module InstanceMethods
|
11
|
+
def inspect_attribute(attr_name)
|
12
|
+
"#{attr_name}: #{read_attribute(attr_name).inspect}"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -10,54 +10,58 @@ module MongoODM
|
|
10
10
|
|
11
11
|
included do
|
12
12
|
attribute_method_suffix "_localized?"
|
13
|
-
attribute_method_suffix "
|
14
|
-
|
15
|
-
|
16
|
-
alias_method_chain :
|
17
|
-
alias_method_chain :inspect, :localization
|
13
|
+
attribute_method_suffix "_localized"
|
14
|
+
attribute_method_suffix "_localized="
|
15
|
+
|
16
|
+
alias_method_chain :inspect_attribute, :localization
|
18
17
|
end
|
19
18
|
|
20
19
|
module ClassMethods
|
21
|
-
def define_method_attribute_localized?(attr_name)
|
22
|
-
generated_attribute_methods.module_eval("def #{attr_name}_localized?; localized_attribute?('#{attr_name}'); end", __FILE__, __LINE__)
|
23
|
-
end
|
24
|
-
protected :define_method_attribute_localized?
|
25
|
-
|
26
|
-
def define_method_attribute_without_localization(attr_name)
|
27
|
-
generated_attribute_methods.module_eval("def #{attr_name}_without_localization; read_attribute_without_localization('#{attr_name}'); end", __FILE__, __LINE__)
|
28
|
-
end
|
29
|
-
protected :define_method_attribute_localized?
|
30
|
-
end
|
31
|
-
|
32
|
-
module InstanceMethods
|
33
20
|
def localized_attribute?(attr_name)
|
34
|
-
field =
|
21
|
+
field = fields[attr_name]
|
35
22
|
localized = field ? !!field.options[:localized] : false
|
36
23
|
raise MongoODM::Errors::InvalidLocalizedField.new(field.name, field.type) if localized && field && field.type != Hash
|
37
24
|
localized
|
38
25
|
end
|
39
26
|
|
40
|
-
def
|
27
|
+
def define_method_attribute_localized?(attr_name)
|
28
|
+
generated_attribute_methods.module_eval("def #{attr_name}_localized?; self.class.localized_attribute?('#{attr_name}'); end", __FILE__, __LINE__)
|
29
|
+
end
|
30
|
+
protected :define_method_attribute_localized?
|
31
|
+
|
32
|
+
def define_method_attribute_localized(attr_name)
|
41
33
|
if localized_attribute?(attr_name)
|
42
|
-
|
43
|
-
(read_attribute_without_localization(attr_name) || {}.with_indifferent_access)[locale]
|
44
|
-
else
|
45
|
-
read_attribute_without_localization(attr_name)
|
34
|
+
generated_attribute_methods.module_eval("def #{attr_name}_localized; read_localized_attribute('#{attr_name}'); end", __FILE__, __LINE__)
|
46
35
|
end
|
47
36
|
end
|
48
|
-
|
49
|
-
|
37
|
+
protected :define_method_attribute_localized
|
38
|
+
|
39
|
+
def define_method_attribute_localized=(attr_name)
|
50
40
|
if localized_attribute?(attr_name)
|
51
|
-
|
52
|
-
current_value = read_attribute_without_localization(attr_name) || {}.with_indifferent_access
|
53
|
-
write_attribute_without_localization(attr_name, current_value.merge(locale => value))
|
54
|
-
else
|
55
|
-
write_attribute_without_localization(attr_name, value)
|
41
|
+
generated_attribute_methods.module_eval("def #{attr_name}_localized=(new_value); write_localized_attribute('#{attr_name}', new_value); end", __FILE__, __LINE__)
|
56
42
|
end
|
57
43
|
end
|
44
|
+
protected :define_method_attribute_localized=
|
45
|
+
end
|
46
|
+
|
47
|
+
module InstanceMethods
|
48
|
+
def read_localized_attribute(attr_name, locale = nil)
|
49
|
+
locale = I18n.locale || I18n.default_locale if locale.nil?
|
50
|
+
(read_attribute(attr_name) || {}.with_indifferent_access)[locale]
|
51
|
+
end
|
52
|
+
|
53
|
+
def write_localized_attribute(attr_name, value, locale = nil)
|
54
|
+
locale = I18n.locale || I18n.default_locale if locale.nil?
|
55
|
+
current_value = read_attribute(attr_name) || {}.with_indifferent_access
|
56
|
+
write_attribute(attr_name, current_value.merge(locale => value))
|
57
|
+
end
|
58
58
|
|
59
|
-
def
|
60
|
-
|
59
|
+
def inspect_attribute_with_localization(attr_name)
|
60
|
+
if self.class.localized_attribute?(attr_name)
|
61
|
+
"#{attr_name}[:#{I18n.locale}]: #{read_localized_attribute(attr_name).inspect}"
|
62
|
+
else
|
63
|
+
inspect_attribute_without_localization(attr_name)
|
64
|
+
end
|
61
65
|
end
|
62
66
|
end
|
63
67
|
|
@@ -23,9 +23,9 @@ module MongoODM
|
|
23
23
|
# @param [Hash] options configuration options.
|
24
24
|
# @option options [Object, Proc] :default (nil) a default value for the field, or a lambda to evaluate when providing the default.
|
25
25
|
def initialize(name, type, options = {})
|
26
|
-
@options = options.to_options
|
27
26
|
@name = name.to_sym
|
28
27
|
@type = type
|
28
|
+
@options = options.to_options
|
29
29
|
end
|
30
30
|
|
31
31
|
# @return [Object] The default value for this field if defined, or nil.
|
@@ -19,7 +19,7 @@ module MongoODM
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def inspect
|
22
|
-
"#<#{self.class.name} #{attributes.except(*private_attribute_names).keys.map{|k|
|
22
|
+
"#<#{self.class.name} #{attributes.except(*private_attribute_names).keys.map{|k| inspect_attribute(k)}.join(", ")}>"
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
@@ -49,7 +49,7 @@ module MongoODM
|
|
49
49
|
|
50
50
|
def to_mongo
|
51
51
|
attributes.inject({}.with_indifferent_access) do |attrs, (key, value)|
|
52
|
-
attrs[key] = value.to_mongo unless value.nil?
|
52
|
+
attrs[key] = value.to_mongo unless value.nil? # self.class.fields[key].default == value
|
53
53
|
attrs
|
54
54
|
end
|
55
55
|
end
|
@@ -57,7 +57,11 @@ module MongoODM
|
|
57
57
|
|
58
58
|
module ClassMethods
|
59
59
|
def collection
|
60
|
-
@collection ||=
|
60
|
+
@collection ||= if self.superclass.included_modules.include?(MongoODM::Document)
|
61
|
+
self.superclass.collection
|
62
|
+
else
|
63
|
+
MongoODM::Collection.new(MongoODM.database, name.tableize)
|
64
|
+
end
|
61
65
|
end
|
62
66
|
|
63
67
|
def set_collection(name_or_collection)
|
@@ -71,6 +75,10 @@ module MongoODM
|
|
71
75
|
end
|
72
76
|
end
|
73
77
|
|
78
|
+
def find(*args)
|
79
|
+
MongoODM::Criteria.new(collection, *args)
|
80
|
+
end
|
81
|
+
|
74
82
|
def destroy_all(*args)
|
75
83
|
documents = find(*args)
|
76
84
|
count = documents.count
|
@@ -86,7 +94,7 @@ module MongoODM
|
|
86
94
|
|
87
95
|
extend Forwardable
|
88
96
|
def_delegators :collection, :db, :hint, :hint=, :pk_factory, :[], :count, :create_index, :distinct,
|
89
|
-
:drop, :drop_index, :drop_indexes, :
|
97
|
+
:drop, :drop_index, :drop_indexes, :find_and_modify, :find_one, :group,
|
90
98
|
:index_information, :insert, :<<, :map_reduce, :mapreduce, :options, :remove, :rename,
|
91
99
|
:save, :stats, :update
|
92
100
|
end
|
data/lib/mongo_odm/version.rb
CHANGED
data/spec/models/02-circle.rb
CHANGED
@@ -12,22 +12,26 @@ describe "Conversions" do
|
|
12
12
|
end
|
13
13
|
|
14
14
|
it "tries to convert any other value to an array" do
|
15
|
-
Array.type_cast({:a => 1, :b => 2}).should == [[:a, 1], [:b, 2]]
|
16
15
|
Array.type_cast([1, 2]).should == [1, 2]
|
16
|
+
Array.type_cast({:a => 1, :b => 2}).should == [[:a, 1], [:b, 2]]
|
17
|
+
end
|
18
|
+
|
19
|
+
it "tries to instantiate each of its values, recursively" do
|
20
|
+
Array.type_cast([3.1415, {"_class" => "Shape", "x" => 2.0, "y" => 3.0 } ]).should == [3.1415, Shape.new(:x => 2.0, :y => 3.0)]
|
21
|
+
Array.type_cast(["test", [ {"_class" => "Shape", "x" => 2.0, "y" => 3.0 } ]]).should == ["test", [ Shape.new(:x => 2.0, :y => 3.0) ]]
|
17
22
|
end
|
18
23
|
|
19
24
|
end
|
20
25
|
|
21
26
|
describe "#to_mongo" do
|
22
27
|
|
23
|
-
it "tries to
|
28
|
+
it "tries to convert each of its elements to valid BSON" do
|
24
29
|
num = 1
|
25
30
|
float = 2.3
|
26
31
|
string = "test"
|
27
32
|
time = Time.now
|
28
33
|
klass = Shape.new
|
29
|
-
[num, float, string, time, klass].
|
30
|
-
[num, float, string, time, klass].to_mongo
|
34
|
+
[num, float, string, time, klass].to_mongo.should == [1, 2.3, "test", time.utc, {"_class"=>"Shape", "x"=>1.0, "y"=>1.0}]
|
31
35
|
end
|
32
36
|
|
33
37
|
end
|
@@ -370,6 +374,12 @@ describe "Conversions" do
|
|
370
374
|
Hash.type_cast({:a => 1}).should == {:a => 1}
|
371
375
|
end
|
372
376
|
|
377
|
+
it "tries to instantiate each of its keys and values, recursively" do
|
378
|
+
result = Hash.type_cast({"_class" => "Circle", "x" => 2.0, "y" => 3.0, "radius" => 5.0 } => { "test" => {"_class" => "Shape", "x" => 2.0, "y" => 3.0 }} )
|
379
|
+
result.keys.first.should == Circle.new(:x => 2.0, :y => 3.0, :radius => 5.0)
|
380
|
+
result.values.first.values.first.should == Shape.new(:x => 2.0, :y => 3.0)
|
381
|
+
end
|
382
|
+
|
373
383
|
end
|
374
384
|
|
375
385
|
describe "#to_mongo" do
|
@@ -8,16 +8,12 @@ describe MongoODM::Document::Fields do
|
|
8
8
|
context "with a name and no type" do
|
9
9
|
|
10
10
|
before do
|
11
|
-
BlankSlate
|
12
|
-
end
|
13
|
-
|
14
|
-
after do
|
15
|
-
BlankSlate.instance_variable_set(:@fields, nil)
|
11
|
+
class TestingNoType < BlankSlate; field :testing_no_type; end
|
16
12
|
end
|
17
13
|
|
18
14
|
it "adds a String field to the class" do
|
19
|
-
|
20
|
-
|
15
|
+
TestingNoType.fields[:testing_no_type].should be_kind_of(MongoODM::Document::Fields::Field)
|
16
|
+
TestingNoType.fields[:testing_no_type].type.should == String
|
21
17
|
end
|
22
18
|
|
23
19
|
end
|
@@ -25,12 +21,12 @@ describe MongoODM::Document::Fields do
|
|
25
21
|
context "with a name and a type" do
|
26
22
|
|
27
23
|
before do
|
28
|
-
BlankSlate
|
24
|
+
class TestingFloat < BlankSlate; field :testing_float, Float; end
|
29
25
|
end
|
30
26
|
|
31
27
|
it "adds the typed field to the class" do
|
32
|
-
|
33
|
-
|
28
|
+
TestingFloat.fields[:testing_float].should be_kind_of(MongoODM::Document::Fields::Field)
|
29
|
+
TestingFloat.fields[:testing_float].type.should == Float
|
34
30
|
end
|
35
31
|
|
36
32
|
end
|
@@ -41,51 +37,37 @@ describe MongoODM::Document::Fields do
|
|
41
37
|
|
42
38
|
context "on classes without defined fields" do
|
43
39
|
|
44
|
-
before do
|
45
|
-
@klass = BlankSlate
|
46
|
-
end
|
47
|
-
|
48
40
|
it "returns an empty hash" do
|
49
|
-
|
41
|
+
BlankSlate.fields.should == {}
|
50
42
|
end
|
51
43
|
|
52
44
|
end
|
53
45
|
|
54
46
|
context "on parent classes" do
|
55
47
|
|
56
|
-
before do
|
57
|
-
@klass = Shape
|
58
|
-
end
|
59
|
-
|
60
48
|
it "returns a hash with the defined fields" do
|
61
|
-
|
62
|
-
|
63
|
-
@klass.fields[field_name].should be_kind_of(MongoODM::Document::Fields::Field)
|
49
|
+
[:x, :y, :color].each do |field_name|
|
50
|
+
Shape.fields[field_name].should be_kind_of(MongoODM::Document::Fields::Field)
|
64
51
|
end
|
65
52
|
end
|
66
53
|
|
67
54
|
it "allows indifferent access to the hash" do
|
68
|
-
|
55
|
+
Shape.fields[:x].should == Shape.fields["x"]
|
69
56
|
end
|
70
57
|
|
71
58
|
end
|
72
59
|
|
73
60
|
context "on subclasses" do
|
74
61
|
|
75
|
-
before do
|
76
|
-
@klass = BigRedCircle
|
77
|
-
end
|
78
|
-
|
79
62
|
it "returns all the fields defined on the class and its subclasses" do
|
80
|
-
|
81
|
-
|
82
|
-
@klass.fields[field_name].should be_kind_of(MongoODM::Document::Fields::Field)
|
63
|
+
[:x, :y, :radius, :color].each do |field_name|
|
64
|
+
BigRedCircle.fields[field_name].should be_kind_of(MongoODM::Document::Fields::Field)
|
83
65
|
end
|
84
66
|
end
|
85
67
|
|
86
68
|
it "overrides field descriptions on any parent class" do
|
87
|
-
|
88
|
-
|
69
|
+
BigRedCircle.fields[:color].default.should == "red"
|
70
|
+
BigRedCircle.fields[:radius].default.should == 20.0
|
89
71
|
end
|
90
72
|
|
91
73
|
end
|
@@ -176,7 +158,7 @@ describe MongoODM::Document::Fields::Field do
|
|
176
158
|
@field = MongoODM::Document::Fields::Field.new(:invalid, InvalidClass)
|
177
159
|
end
|
178
160
|
|
179
|
-
it "
|
161
|
+
it "raises MongoODM::Errors::TypeCastMissing" do
|
180
162
|
lambda { @field.type_cast("whatever") }.should raise_error(MongoODM::Errors::TypeCastMissing)
|
181
163
|
end
|
182
164
|
|
@@ -9,6 +9,13 @@ describe MongoODM::Document::Inspect do
|
|
9
9
|
end
|
10
10
|
end
|
11
11
|
|
12
|
+
describe "#private_attribute_names" do
|
13
|
+
it "returns ['_class']" do
|
14
|
+
circle = Circle.new
|
15
|
+
circle.private_attribute_names.should == ['_class']
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
12
19
|
describe "#inspect" do
|
13
20
|
it "returns a string with the name of the class that includes the MongoODM::Document module and a list of its attributes with values" do
|
14
21
|
circle = Circle.new(:x => 10, :y => 12.5, :radius => 1.2)
|
@@ -2,11 +2,19 @@
|
|
2
2
|
require "spec_helper"
|
3
3
|
|
4
4
|
describe MongoODM::Document do
|
5
|
-
# TODO:
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
5
|
+
# TODO: Test global behavior
|
6
|
+
|
7
|
+
describe "#==" do
|
8
|
+
it "returns false if the compared element is not a MongoODM::Document" do
|
9
|
+
(Shape.new == 1).should be_false
|
10
|
+
end
|
11
|
+
|
12
|
+
it "returns true if the compared document has the same attribute values" do
|
13
|
+
(Shape.new(:x => 2, :y => 3) == Shape.new(:x => 2, :y => 3)).should be_true
|
14
|
+
end
|
15
|
+
|
16
|
+
it "returns false if the compared document hasn't the same attribute values" do
|
17
|
+
(Shape.new(:x => 2, :y => 3) == Shape.new(:x => 1, :y => 3)).should be_false
|
18
|
+
end
|
19
|
+
end
|
12
20
|
end
|
@@ -2,8 +2,31 @@
|
|
2
2
|
require "spec_helper"
|
3
3
|
|
4
4
|
describe MongoODM do
|
5
|
-
|
6
|
-
describe "
|
5
|
+
|
6
|
+
describe "#config" do
|
7
|
+
|
8
|
+
context "when no configuration was passed" do
|
9
|
+
it "returns an empty hash" do
|
10
|
+
MongoODM.config.should == {}
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
|
+
|
15
|
+
context "when a custom configuration was passed" do
|
16
|
+
|
17
|
+
before do
|
18
|
+
MongoODM.config = {:host => "localhost", :port => 9000}
|
19
|
+
end
|
20
|
+
|
21
|
+
after do
|
22
|
+
MongoODM.config = {}
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should return the configuration as a hash" do
|
26
|
+
MongoODM.config.should == {:host => "localhost", :port => 9000}
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
7
30
|
|
8
31
|
end
|
9
32
|
|
@@ -53,32 +76,4 @@ describe MongoODM do
|
|
53
76
|
end
|
54
77
|
end
|
55
78
|
|
56
|
-
describe "#config" do
|
57
|
-
|
58
|
-
context "when no configuration was passed" do
|
59
|
-
|
60
|
-
it "returns an empty hash" do
|
61
|
-
MongoODM.config.should == {}
|
62
|
-
end
|
63
|
-
|
64
|
-
end
|
65
|
-
|
66
|
-
context "when a custom configuration was passed" do
|
67
|
-
|
68
|
-
before do
|
69
|
-
MongoODM.config = {:host => "localhost", :port => 9000}
|
70
|
-
end
|
71
|
-
|
72
|
-
after do
|
73
|
-
MongoODM.config = {}
|
74
|
-
end
|
75
|
-
|
76
|
-
it "should return the configuration as a hash" do
|
77
|
-
MongoODM.config.should == {:host => "localhost", :port => 9000}
|
78
|
-
end
|
79
|
-
|
80
|
-
end
|
81
|
-
|
82
|
-
end
|
83
|
-
|
84
79
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 1
|
8
|
-
-
|
9
|
-
version: 0.1.
|
8
|
+
- 9
|
9
|
+
version: 0.1.9
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Carlos Paramio
|
@@ -14,12 +14,11 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-06-
|
17
|
+
date: 2010-06-17 00:00:00 +02:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
name: activesupport
|
22
|
-
prerelease: false
|
23
22
|
requirement: &id001 !ruby/object:Gem::Requirement
|
24
23
|
none: false
|
25
24
|
requirements:
|
@@ -32,10 +31,10 @@ dependencies:
|
|
32
31
|
- beta3
|
33
32
|
version: 3.0.0.beta3
|
34
33
|
type: :runtime
|
34
|
+
prerelease: false
|
35
35
|
version_requirements: *id001
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: activemodel
|
38
|
-
prerelease: false
|
39
38
|
requirement: &id002 !ruby/object:Gem::Requirement
|
40
39
|
none: false
|
41
40
|
requirements:
|
@@ -48,29 +47,29 @@ dependencies:
|
|
48
47
|
- beta3
|
49
48
|
version: 3.0.0.beta3
|
50
49
|
type: :runtime
|
50
|
+
prerelease: false
|
51
51
|
version_requirements: *id002
|
52
52
|
- !ruby/object:Gem::Dependency
|
53
53
|
name: mongo
|
54
|
-
prerelease: false
|
55
54
|
requirement: &id003 !ruby/object:Gem::Requirement
|
56
55
|
none: false
|
57
56
|
requirements:
|
58
|
-
- -
|
57
|
+
- - ~>
|
59
58
|
- !ruby/object:Gem::Version
|
60
59
|
segments:
|
61
60
|
- 1
|
62
61
|
- 0
|
63
|
-
-
|
64
|
-
version: 1.0.
|
62
|
+
- 2
|
63
|
+
version: 1.0.2
|
65
64
|
type: :runtime
|
65
|
+
prerelease: false
|
66
66
|
version_requirements: *id003
|
67
67
|
- !ruby/object:Gem::Dependency
|
68
|
-
name:
|
69
|
-
prerelease: false
|
68
|
+
name: bson_ext
|
70
69
|
requirement: &id004 !ruby/object:Gem::Requirement
|
71
70
|
none: false
|
72
71
|
requirements:
|
73
|
-
- -
|
72
|
+
- - ~>
|
74
73
|
- !ruby/object:Gem::Version
|
75
74
|
segments:
|
76
75
|
- 1
|
@@ -78,22 +77,99 @@ dependencies:
|
|
78
77
|
- 1
|
79
78
|
version: 1.0.1
|
80
79
|
type: :runtime
|
80
|
+
prerelease: false
|
81
81
|
version_requirements: *id004
|
82
82
|
- !ruby/object:Gem::Dependency
|
83
|
-
name:
|
84
|
-
prerelease: false
|
83
|
+
name: tzinfo
|
85
84
|
requirement: &id005 !ruby/object:Gem::Requirement
|
86
85
|
none: false
|
87
86
|
requirements:
|
88
|
-
- -
|
87
|
+
- - ~>
|
89
88
|
- !ruby/object:Gem::Version
|
90
89
|
segments:
|
91
|
-
- 1
|
92
90
|
- 0
|
93
|
-
-
|
94
|
-
|
91
|
+
- 3
|
92
|
+
- 22
|
93
|
+
version: 0.3.22
|
95
94
|
type: :runtime
|
95
|
+
prerelease: false
|
96
96
|
version_requirements: *id005
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: jeweler
|
99
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
100
|
+
none: false
|
101
|
+
requirements:
|
102
|
+
- - "="
|
103
|
+
- !ruby/object:Gem::Version
|
104
|
+
segments:
|
105
|
+
- 1
|
106
|
+
- 4
|
107
|
+
- 0
|
108
|
+
version: 1.4.0
|
109
|
+
type: :development
|
110
|
+
prerelease: false
|
111
|
+
version_requirements: *id006
|
112
|
+
- !ruby/object:Gem::Dependency
|
113
|
+
name: yard
|
114
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
115
|
+
none: false
|
116
|
+
requirements:
|
117
|
+
- - "="
|
118
|
+
- !ruby/object:Gem::Version
|
119
|
+
segments:
|
120
|
+
- 0
|
121
|
+
- 5
|
122
|
+
- 6
|
123
|
+
version: 0.5.6
|
124
|
+
type: :development
|
125
|
+
prerelease: false
|
126
|
+
version_requirements: *id007
|
127
|
+
- !ruby/object:Gem::Dependency
|
128
|
+
name: rcov
|
129
|
+
requirement: &id008 !ruby/object:Gem::Requirement
|
130
|
+
none: false
|
131
|
+
requirements:
|
132
|
+
- - "="
|
133
|
+
- !ruby/object:Gem::Version
|
134
|
+
segments:
|
135
|
+
- 0
|
136
|
+
- 9
|
137
|
+
- 8
|
138
|
+
version: 0.9.8
|
139
|
+
type: :development
|
140
|
+
prerelease: false
|
141
|
+
version_requirements: *id008
|
142
|
+
- !ruby/object:Gem::Dependency
|
143
|
+
name: rspec
|
144
|
+
requirement: &id009 !ruby/object:Gem::Requirement
|
145
|
+
none: false
|
146
|
+
requirements:
|
147
|
+
- - "="
|
148
|
+
- !ruby/object:Gem::Version
|
149
|
+
segments:
|
150
|
+
- 2
|
151
|
+
- 0
|
152
|
+
- 0
|
153
|
+
- beta
|
154
|
+
- 12
|
155
|
+
version: 2.0.0.beta.12
|
156
|
+
type: :development
|
157
|
+
prerelease: false
|
158
|
+
version_requirements: *id009
|
159
|
+
- !ruby/object:Gem::Dependency
|
160
|
+
name: watchr
|
161
|
+
requirement: &id010 !ruby/object:Gem::Requirement
|
162
|
+
none: false
|
163
|
+
requirements:
|
164
|
+
- - ~>
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
segments:
|
167
|
+
- 0
|
168
|
+
- 6
|
169
|
+
version: "0.6"
|
170
|
+
type: :development
|
171
|
+
prerelease: false
|
172
|
+
version_requirements: *id010
|
97
173
|
description: mongo_odm is a flexible persistence module for any Ruby class to MongoDB.
|
98
174
|
email: carlos@evolve.st
|
99
175
|
executables: []
|
@@ -111,6 +187,7 @@ files:
|
|
111
187
|
- lib/mongo_odm.rb
|
112
188
|
- lib/mongo_odm/collection.rb
|
113
189
|
- lib/mongo_odm/core_ext/conversions.rb
|
190
|
+
- lib/mongo_odm/criteria.rb
|
114
191
|
- lib/mongo_odm/cursor.rb
|
115
192
|
- lib/mongo_odm/document.rb
|
116
193
|
- lib/mongo_odm/document/associations.rb
|
@@ -118,6 +195,7 @@ files:
|
|
118
195
|
- lib/mongo_odm/document/associations/has_one.rb
|
119
196
|
- lib/mongo_odm/document/attribute_methods.rb
|
120
197
|
- lib/mongo_odm/document/attribute_methods/dirty.rb
|
198
|
+
- lib/mongo_odm/document/attribute_methods/inspect.rb
|
121
199
|
- lib/mongo_odm/document/attribute_methods/localization.rb
|
122
200
|
- lib/mongo_odm/document/attribute_methods/query.rb
|
123
201
|
- lib/mongo_odm/document/attribute_methods/read.rb
|
@@ -133,12 +211,22 @@ files:
|
|
133
211
|
- spec/models/01-shape.rb
|
134
212
|
- spec/models/02-circle.rb
|
135
213
|
- spec/models/03-big_red_circle.rb
|
214
|
+
- spec/mongo_odm/collection_spec.rb
|
136
215
|
- spec/mongo_odm/core_ext/conversions_spec.rb
|
216
|
+
- spec/mongo_odm/cursor_spec.rb
|
217
|
+
- spec/mongo_odm/document/attribute_methods/dirty_spec.rb
|
218
|
+
- spec/mongo_odm/document/attribute_methods/localization_spec.rb
|
219
|
+
- spec/mongo_odm/document/attribute_methods/query_spec.rb
|
220
|
+
- spec/mongo_odm/document/attribute_methods/read_spec.rb
|
221
|
+
- spec/mongo_odm/document/attribute_methods/write_spec.rb
|
222
|
+
- spec/mongo_odm/document/attribute_methods_spec.rb
|
223
|
+
- spec/mongo_odm/document/callbacks_spec.rb
|
137
224
|
- spec/mongo_odm/document/fields_spec.rb
|
138
225
|
- spec/mongo_odm/document/inspect_spec.rb
|
226
|
+
- spec/mongo_odm/document/persistence_spec.rb
|
227
|
+
- spec/mongo_odm/document/validations_spec.rb
|
139
228
|
- spec/mongo_odm/document_spec.rb
|
140
229
|
- spec/mongo_odm/mongo_odm_spec.rb
|
141
|
-
- spec/spec.opts
|
142
230
|
- spec/spec_helper.rb
|
143
231
|
has_rdoc: true
|
144
232
|
homepage: http://github.com/carlosparamio/mongo_odm
|
@@ -177,9 +265,20 @@ test_files:
|
|
177
265
|
- spec/models/01-shape.rb
|
178
266
|
- spec/models/02-circle.rb
|
179
267
|
- spec/models/03-big_red_circle.rb
|
268
|
+
- spec/mongo_odm/collection_spec.rb
|
180
269
|
- spec/mongo_odm/core_ext/conversions_spec.rb
|
270
|
+
- spec/mongo_odm/cursor_spec.rb
|
271
|
+
- spec/mongo_odm/document/attribute_methods/dirty_spec.rb
|
272
|
+
- spec/mongo_odm/document/attribute_methods/localization_spec.rb
|
273
|
+
- spec/mongo_odm/document/attribute_methods/query_spec.rb
|
274
|
+
- spec/mongo_odm/document/attribute_methods/read_spec.rb
|
275
|
+
- spec/mongo_odm/document/attribute_methods/write_spec.rb
|
276
|
+
- spec/mongo_odm/document/attribute_methods_spec.rb
|
277
|
+
- spec/mongo_odm/document/callbacks_spec.rb
|
181
278
|
- spec/mongo_odm/document/fields_spec.rb
|
182
279
|
- spec/mongo_odm/document/inspect_spec.rb
|
280
|
+
- spec/mongo_odm/document/persistence_spec.rb
|
281
|
+
- spec/mongo_odm/document/validations_spec.rb
|
183
282
|
- spec/mongo_odm/document_spec.rb
|
184
283
|
- spec/mongo_odm/mongo_odm_spec.rb
|
185
284
|
- spec/spec_helper.rb
|
data/spec/spec.opts
DELETED