mongoid-with-auth 1.9.4
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/MIT_LICENSE +20 -0
- data/README.rdoc +49 -0
- data/lib/mongoid.rb +122 -0
- data/lib/mongoid/associations.rb +300 -0
- data/lib/mongoid/associations/belongs_to_related.rb +58 -0
- data/lib/mongoid/associations/embedded_in.rb +72 -0
- data/lib/mongoid/associations/embeds_many.rb +254 -0
- data/lib/mongoid/associations/embeds_one.rb +96 -0
- data/lib/mongoid/associations/has_many_related.rb +181 -0
- data/lib/mongoid/associations/has_one_related.rb +85 -0
- data/lib/mongoid/associations/meta_data.rb +29 -0
- data/lib/mongoid/associations/options.rb +57 -0
- data/lib/mongoid/associations/proxy.rb +24 -0
- data/lib/mongoid/attributes.rb +204 -0
- data/lib/mongoid/callbacks.rb +23 -0
- data/lib/mongoid/collection.rb +120 -0
- data/lib/mongoid/collections.rb +41 -0
- data/lib/mongoid/collections/cyclic_iterator.rb +34 -0
- data/lib/mongoid/collections/master.rb +29 -0
- data/lib/mongoid/collections/operations.rb +41 -0
- data/lib/mongoid/collections/slaves.rb +45 -0
- data/lib/mongoid/components.rb +27 -0
- data/lib/mongoid/concern.rb +31 -0
- data/lib/mongoid/config.rb +205 -0
- data/lib/mongoid/contexts.rb +25 -0
- data/lib/mongoid/contexts/enumerable.rb +151 -0
- data/lib/mongoid/contexts/ids.rb +25 -0
- data/lib/mongoid/contexts/mongo.rb +285 -0
- data/lib/mongoid/contexts/paging.rb +50 -0
- data/lib/mongoid/criteria.rb +239 -0
- data/lib/mongoid/criterion/complex.rb +21 -0
- data/lib/mongoid/criterion/exclusion.rb +65 -0
- data/lib/mongoid/criterion/inclusion.rb +110 -0
- data/lib/mongoid/criterion/optional.rb +136 -0
- data/lib/mongoid/cursor.rb +81 -0
- data/lib/mongoid/deprecation.rb +22 -0
- data/lib/mongoid/dirty.rb +253 -0
- data/lib/mongoid/document.rb +311 -0
- data/lib/mongoid/errors.rb +108 -0
- data/lib/mongoid/extensions.rb +101 -0
- data/lib/mongoid/extensions/array/accessors.rb +17 -0
- data/lib/mongoid/extensions/array/aliasing.rb +4 -0
- data/lib/mongoid/extensions/array/assimilation.rb +26 -0
- data/lib/mongoid/extensions/array/conversions.rb +29 -0
- data/lib/mongoid/extensions/array/parentization.rb +13 -0
- data/lib/mongoid/extensions/big_decimal/conversions.rb +19 -0
- data/lib/mongoid/extensions/binary/conversions.rb +17 -0
- data/lib/mongoid/extensions/boolean/conversions.rb +22 -0
- data/lib/mongoid/extensions/date/conversions.rb +24 -0
- data/lib/mongoid/extensions/datetime/conversions.rb +12 -0
- data/lib/mongoid/extensions/float/conversions.rb +20 -0
- data/lib/mongoid/extensions/hash/accessors.rb +38 -0
- data/lib/mongoid/extensions/hash/assimilation.rb +39 -0
- data/lib/mongoid/extensions/hash/conversions.rb +45 -0
- data/lib/mongoid/extensions/hash/criteria_helpers.rb +20 -0
- data/lib/mongoid/extensions/hash/scoping.rb +12 -0
- data/lib/mongoid/extensions/integer/conversions.rb +20 -0
- data/lib/mongoid/extensions/nil/assimilation.rb +17 -0
- data/lib/mongoid/extensions/object/conversions.rb +33 -0
- data/lib/mongoid/extensions/objectid/conversions.rb +15 -0
- data/lib/mongoid/extensions/proc/scoping.rb +12 -0
- data/lib/mongoid/extensions/string/conversions.rb +15 -0
- data/lib/mongoid/extensions/string/inflections.rb +97 -0
- data/lib/mongoid/extensions/symbol/inflections.rb +36 -0
- data/lib/mongoid/extensions/time_conversions.rb +35 -0
- data/lib/mongoid/extras.rb +61 -0
- data/lib/mongoid/factory.rb +20 -0
- data/lib/mongoid/field.rb +59 -0
- data/lib/mongoid/fields.rb +65 -0
- data/lib/mongoid/finders.rb +136 -0
- data/lib/mongoid/identity.rb +39 -0
- data/lib/mongoid/indexes.rb +30 -0
- data/lib/mongoid/javascript.rb +21 -0
- data/lib/mongoid/javascript/functions.yml +37 -0
- data/lib/mongoid/matchers.rb +36 -0
- data/lib/mongoid/matchers/all.rb +11 -0
- data/lib/mongoid/matchers/default.rb +26 -0
- data/lib/mongoid/matchers/exists.rb +13 -0
- data/lib/mongoid/matchers/gt.rb +11 -0
- data/lib/mongoid/matchers/gte.rb +11 -0
- data/lib/mongoid/matchers/in.rb +11 -0
- data/lib/mongoid/matchers/lt.rb +11 -0
- data/lib/mongoid/matchers/lte.rb +11 -0
- data/lib/mongoid/matchers/ne.rb +11 -0
- data/lib/mongoid/matchers/nin.rb +11 -0
- data/lib/mongoid/matchers/size.rb +11 -0
- data/lib/mongoid/memoization.rb +33 -0
- data/lib/mongoid/named_scope.rb +37 -0
- data/lib/mongoid/observable.rb +30 -0
- data/lib/mongoid/paths.rb +62 -0
- data/lib/mongoid/persistence.rb +222 -0
- data/lib/mongoid/persistence/command.rb +39 -0
- data/lib/mongoid/persistence/insert.rb +50 -0
- data/lib/mongoid/persistence/insert_embedded.rb +38 -0
- data/lib/mongoid/persistence/remove.rb +39 -0
- data/lib/mongoid/persistence/remove_all.rb +37 -0
- data/lib/mongoid/persistence/remove_embedded.rb +50 -0
- data/lib/mongoid/persistence/update.rb +63 -0
- data/lib/mongoid/scope.rb +75 -0
- data/lib/mongoid/state.rb +39 -0
- data/lib/mongoid/timestamps.rb +27 -0
- data/lib/mongoid/version.rb +4 -0
- data/lib/mongoid/versioning.rb +27 -0
- metadata +284 -0
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Mongoid #:nodoc:
|
|
3
|
+
class Identity #:nodoc:
|
|
4
|
+
class << self
|
|
5
|
+
# Create the identity for the +Document+.
|
|
6
|
+
#
|
|
7
|
+
# The id will be set in either in the form of a Mongo
|
|
8
|
+
# +ObjectId+ or a composite key set up by defining a key on the document.
|
|
9
|
+
#
|
|
10
|
+
# The _type will be set to the document's class name.
|
|
11
|
+
def create(doc)
|
|
12
|
+
identify(doc); type(doc); doc
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
protected
|
|
16
|
+
# Return the proper id for the document.
|
|
17
|
+
def generate_id
|
|
18
|
+
id = BSON::ObjectId.new
|
|
19
|
+
Mongoid.use_object_ids ? id : id.to_s
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# Set the id for the document.
|
|
23
|
+
def identify(doc)
|
|
24
|
+
doc.id = compose(doc).join(" ").identify if doc.primary_key
|
|
25
|
+
doc.id = generate_id if doc.id.blank?
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# Set the _type field on the document.
|
|
29
|
+
def type(doc)
|
|
30
|
+
doc._type = doc.class.name if doc.hereditary?
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# Generates the composite key for a document.
|
|
34
|
+
def compose(doc)
|
|
35
|
+
doc.primary_key.collect { |key| doc.attributes[key] }.reject { |val| val.nil? }
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Mongoid #:nodoc
|
|
3
|
+
module Indexes #:nodoc
|
|
4
|
+
def self.included(base)
|
|
5
|
+
base.class_eval do
|
|
6
|
+
extend ClassMethods
|
|
7
|
+
|
|
8
|
+
cattr_accessor :indexed
|
|
9
|
+
self.indexed = false
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
module ClassMethods #:nodoc
|
|
14
|
+
# Add the default indexes to the root document if they do not already
|
|
15
|
+
# exist. Currently this is only _type.
|
|
16
|
+
def add_indexes
|
|
17
|
+
if hereditary && !indexed
|
|
18
|
+
self._collection.create_index(:_type, :unique => false, :background => true)
|
|
19
|
+
self.indexed = true
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# Adds an index on the field specified. Options can be :unique => true or
|
|
24
|
+
# :unique => false. It will default to the latter.
|
|
25
|
+
def index(name, options = { :unique => false })
|
|
26
|
+
collection.create_index(name, options)
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Mongoid #:nodoc:
|
|
3
|
+
class Javascript
|
|
4
|
+
# Constant for the file that defines all the js functions.
|
|
5
|
+
FUNCTIONS = File.join(File.dirname(__FILE__), "javascript", "functions.yml")
|
|
6
|
+
|
|
7
|
+
# Load the javascript functions and define a class method for each one,
|
|
8
|
+
# that memoizes the value.
|
|
9
|
+
#
|
|
10
|
+
# Example:
|
|
11
|
+
#
|
|
12
|
+
# <tt>Mongoid::Javascript.aggregate</tt>
|
|
13
|
+
YAML.load(File.read(FUNCTIONS)).each_pair do |key, function|
|
|
14
|
+
(class << self; self; end).class_eval <<-EOT
|
|
15
|
+
def #{key}
|
|
16
|
+
@#{key} ||= "#{function}"
|
|
17
|
+
end
|
|
18
|
+
EOT
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
aggregate:
|
|
2
|
+
"function(obj, prev) {
|
|
3
|
+
prev.count++;
|
|
4
|
+
}"
|
|
5
|
+
|
|
6
|
+
group:
|
|
7
|
+
"function(obj, prev) {
|
|
8
|
+
prev.group.push(obj);
|
|
9
|
+
}"
|
|
10
|
+
|
|
11
|
+
max:
|
|
12
|
+
"function(obj, prev) {
|
|
13
|
+
if (prev.max == 'start') {
|
|
14
|
+
prev.max = obj.[field];
|
|
15
|
+
}
|
|
16
|
+
if (prev.max < obj.[field]) {
|
|
17
|
+
prev.max = obj.[field];
|
|
18
|
+
}
|
|
19
|
+
}"
|
|
20
|
+
|
|
21
|
+
min:
|
|
22
|
+
"function(obj, prev) {
|
|
23
|
+
if (prev.min == 'start') {
|
|
24
|
+
prev.min = obj.[field];
|
|
25
|
+
}
|
|
26
|
+
if (prev.min > obj.[field]) {
|
|
27
|
+
prev.min = obj.[field];
|
|
28
|
+
}
|
|
29
|
+
}"
|
|
30
|
+
|
|
31
|
+
sum:
|
|
32
|
+
"function(obj, prev) {
|
|
33
|
+
if (prev.sum == 'start') {
|
|
34
|
+
prev.sum = 0;
|
|
35
|
+
}
|
|
36
|
+
prev.sum += obj.[field];
|
|
37
|
+
}"
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
require "mongoid/matchers/default"
|
|
3
|
+
require "mongoid/matchers/all"
|
|
4
|
+
require "mongoid/matchers/exists"
|
|
5
|
+
require "mongoid/matchers/gt"
|
|
6
|
+
require "mongoid/matchers/gte"
|
|
7
|
+
require "mongoid/matchers/in"
|
|
8
|
+
require "mongoid/matchers/lt"
|
|
9
|
+
require "mongoid/matchers/lte"
|
|
10
|
+
require "mongoid/matchers/ne"
|
|
11
|
+
require "mongoid/matchers/nin"
|
|
12
|
+
require "mongoid/matchers/size"
|
|
13
|
+
|
|
14
|
+
module Mongoid #:nodoc:
|
|
15
|
+
module Matchers
|
|
16
|
+
# Determines if this document has the attributes to match the supplied
|
|
17
|
+
# MongoDB selector. Used for matching on embedded associations.
|
|
18
|
+
def matches?(selector)
|
|
19
|
+
selector.each_pair do |key, value|
|
|
20
|
+
return false unless matcher(key, value).matches?(value)
|
|
21
|
+
end
|
|
22
|
+
true
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
protected
|
|
26
|
+
# Get the matcher for the supplied key and value. Will determine the class
|
|
27
|
+
# name from the key.
|
|
28
|
+
def matcher(key, value)
|
|
29
|
+
if value.is_a?(Hash)
|
|
30
|
+
name = "Mongoid::Matchers::#{value.keys.first.gsub("$", "").camelize}"
|
|
31
|
+
return name.constantize.new(attributes[key])
|
|
32
|
+
end
|
|
33
|
+
Default.new(attributes[key])
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Mongoid #:nodoc:
|
|
3
|
+
module Matchers #:nodoc:
|
|
4
|
+
class Default
|
|
5
|
+
# Creating a new matcher only requires the value.
|
|
6
|
+
def initialize(attribute)
|
|
7
|
+
@attribute = attribute
|
|
8
|
+
end
|
|
9
|
+
# Return true if the attribute and value are equal.
|
|
10
|
+
def matches?(value)
|
|
11
|
+
@attribute == value
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
protected
|
|
15
|
+
# Return the first value in the hash.
|
|
16
|
+
def first(value)
|
|
17
|
+
value.values.first
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# If object exists then compare, else return false
|
|
21
|
+
def determine(value, operator)
|
|
22
|
+
@attribute ? @attribute.send(operator, first(value)) : false
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Mongoid #:nodoc:
|
|
3
|
+
module Matchers #:nodoc:
|
|
4
|
+
class Exists < Default
|
|
5
|
+
# Return true if the attribute exists and checking for existence or
|
|
6
|
+
# return true if the attribute does not exist and checking for
|
|
7
|
+
# non-existence.
|
|
8
|
+
def matches?(value)
|
|
9
|
+
@attribute.nil? != value.values.first
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
module Mongoid #:nodoc
|
|
2
|
+
module Memoization
|
|
3
|
+
|
|
4
|
+
# Handles cases when accessing an association that should be memoized in
|
|
5
|
+
# the Mongoid specific manner. Does not memoize nil values though
|
|
6
|
+
def memoized(name, &block)
|
|
7
|
+
var = "@#{name}"
|
|
8
|
+
if instance_variable_defined?(var)
|
|
9
|
+
return instance_variable_get(var)
|
|
10
|
+
end
|
|
11
|
+
value = yield
|
|
12
|
+
instance_variable_set(var, value) if value
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# Removes an memozied association if it exists
|
|
16
|
+
def unmemoize(name)
|
|
17
|
+
var = "@#{name}"
|
|
18
|
+
remove_instance_variable(var) if instance_variable_defined?(var)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# Mongoid specific behavior is to remove the memoized object when setting
|
|
22
|
+
# the association, or if it wasn't previously memoized it will get set.
|
|
23
|
+
def reset(name, &block)
|
|
24
|
+
var = "@#{name}"
|
|
25
|
+
value = yield
|
|
26
|
+
if instance_variable_defined?(var)
|
|
27
|
+
remove_instance_variable(var)
|
|
28
|
+
else
|
|
29
|
+
instance_variable_set(var, value)
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Mongoid #:nodoc:
|
|
3
|
+
module NamedScope
|
|
4
|
+
# Creates a named_scope for the +Document+, similar to ActiveRecord's
|
|
5
|
+
# named_scopes. +NamedScopes+ are proxied +Criteria+ objects that can be
|
|
6
|
+
# chained.
|
|
7
|
+
#
|
|
8
|
+
# Example:
|
|
9
|
+
#
|
|
10
|
+
# class Person
|
|
11
|
+
# include Mongoid::Document
|
|
12
|
+
# field :active, :type => Boolean
|
|
13
|
+
# field :count, :type => Integer
|
|
14
|
+
#
|
|
15
|
+
# named_scope :active, :where => { :active => true }
|
|
16
|
+
# named_scope :count_gt_one, :where => { :count.gt => 1 }
|
|
17
|
+
# named_scope :at_least_count, lambda { |count| { :where => { :count.gt => count } } }
|
|
18
|
+
# end
|
|
19
|
+
def named_scope(name, options = {}, &block)
|
|
20
|
+
name = name.to_sym
|
|
21
|
+
scopes[name] = lambda do |parent, *args|
|
|
22
|
+
Scope.new(parent, options.scoped(*args), &block)
|
|
23
|
+
end
|
|
24
|
+
(class << self; self; end).class_eval <<-EOT
|
|
25
|
+
def #{name}(*args)
|
|
26
|
+
scopes[:#{name}].call(self, *args)
|
|
27
|
+
end
|
|
28
|
+
EOT
|
|
29
|
+
end
|
|
30
|
+
alias :scope :named_scope
|
|
31
|
+
|
|
32
|
+
# Return the scopes or default to an empty +Hash+.
|
|
33
|
+
def scopes
|
|
34
|
+
read_inheritable_attribute(:scopes) || write_inheritable_attribute(:scopes, {})
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Mongoid #:nodoc:
|
|
3
|
+
module Observable #:nodoc:
|
|
4
|
+
extend ActiveSupport::Concern
|
|
5
|
+
included do
|
|
6
|
+
attr_reader :observers
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
# Add an observer to this object. This mimics the standard Ruby observable
|
|
10
|
+
# library.
|
|
11
|
+
#
|
|
12
|
+
# Example:
|
|
13
|
+
#
|
|
14
|
+
# <tt>address.add_observer(person)</tt>
|
|
15
|
+
def add_observer(object)
|
|
16
|
+
@observers ||= []
|
|
17
|
+
@observers.push(object)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# Notify all the objects observing this object of an update. All observers
|
|
21
|
+
# need to respond to the update method in order to handle this.
|
|
22
|
+
#
|
|
23
|
+
# Example:
|
|
24
|
+
#
|
|
25
|
+
# <tt>document.notify_observers(self)</tt>
|
|
26
|
+
def notify_observers(*args)
|
|
27
|
+
@observers.dup.each { |observer| observer.observe(*args) } if @observers
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Mongoid #:nodoc:
|
|
3
|
+
module Paths #:nodoc:
|
|
4
|
+
extend ActiveSupport::Concern
|
|
5
|
+
included do
|
|
6
|
+
attr_accessor :__path
|
|
7
|
+
attr_accessor :_index
|
|
8
|
+
end
|
|
9
|
+
module InstanceMethods
|
|
10
|
+
# Get the insertion modifier for the document. Will be nil on root
|
|
11
|
+
# documents, $set on embeds_one, $push on embeds_many.
|
|
12
|
+
#
|
|
13
|
+
# Example:
|
|
14
|
+
#
|
|
15
|
+
# <tt>name.inserter</tt>
|
|
16
|
+
def _inserter
|
|
17
|
+
embedded? ? (embedded_many? ? "$push" : "$set") : nil
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# Return the path to this +Document+ in JSON notation, used for atomic
|
|
21
|
+
# updates via $set in MongoDB.
|
|
22
|
+
#
|
|
23
|
+
# Example:
|
|
24
|
+
#
|
|
25
|
+
# <tt>address.path # returns "addresses"</tt>
|
|
26
|
+
def _path
|
|
27
|
+
_position.sub!(/\.\d+$/, '') || _position
|
|
28
|
+
end
|
|
29
|
+
alias :_pull :_path
|
|
30
|
+
|
|
31
|
+
# Returns the positional operator of this document for modification.
|
|
32
|
+
#
|
|
33
|
+
# Example:
|
|
34
|
+
#
|
|
35
|
+
# <tt>address.position</tt>
|
|
36
|
+
def _position
|
|
37
|
+
locator = _index ? (new_record? ? "" : ".#{_index}") : ""
|
|
38
|
+
embedded? ? "#{_parent._position}#{"." unless _parent._position.blank?}#{@association_name}#{locator}" : ""
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# Get the removal modifier for the document. Will be nil on root
|
|
42
|
+
# documents, $unset on embeds_one, $set on embeds_many.
|
|
43
|
+
#
|
|
44
|
+
# Example:
|
|
45
|
+
#
|
|
46
|
+
# <tt>name.remover</tt>
|
|
47
|
+
def _remover
|
|
48
|
+
embedded? ? (_index ? "$pull" : "$unset") : nil
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# Return the selector for this document to be matched exactly for use
|
|
52
|
+
# with MongoDB's $ operator.
|
|
53
|
+
#
|
|
54
|
+
# Example:
|
|
55
|
+
#
|
|
56
|
+
# <tt>address.selector</tt>
|
|
57
|
+
def _selector
|
|
58
|
+
embedded? ? _parent._selector.merge("#{_path}._id" => id) : { "_id" => id }
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|