mongo_odm 0.1.8 → 0.1.9
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/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