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.
Files changed (104) hide show
  1. data/MIT_LICENSE +20 -0
  2. data/README.rdoc +49 -0
  3. data/lib/mongoid.rb +122 -0
  4. data/lib/mongoid/associations.rb +300 -0
  5. data/lib/mongoid/associations/belongs_to_related.rb +58 -0
  6. data/lib/mongoid/associations/embedded_in.rb +72 -0
  7. data/lib/mongoid/associations/embeds_many.rb +254 -0
  8. data/lib/mongoid/associations/embeds_one.rb +96 -0
  9. data/lib/mongoid/associations/has_many_related.rb +181 -0
  10. data/lib/mongoid/associations/has_one_related.rb +85 -0
  11. data/lib/mongoid/associations/meta_data.rb +29 -0
  12. data/lib/mongoid/associations/options.rb +57 -0
  13. data/lib/mongoid/associations/proxy.rb +24 -0
  14. data/lib/mongoid/attributes.rb +204 -0
  15. data/lib/mongoid/callbacks.rb +23 -0
  16. data/lib/mongoid/collection.rb +120 -0
  17. data/lib/mongoid/collections.rb +41 -0
  18. data/lib/mongoid/collections/cyclic_iterator.rb +34 -0
  19. data/lib/mongoid/collections/master.rb +29 -0
  20. data/lib/mongoid/collections/operations.rb +41 -0
  21. data/lib/mongoid/collections/slaves.rb +45 -0
  22. data/lib/mongoid/components.rb +27 -0
  23. data/lib/mongoid/concern.rb +31 -0
  24. data/lib/mongoid/config.rb +205 -0
  25. data/lib/mongoid/contexts.rb +25 -0
  26. data/lib/mongoid/contexts/enumerable.rb +151 -0
  27. data/lib/mongoid/contexts/ids.rb +25 -0
  28. data/lib/mongoid/contexts/mongo.rb +285 -0
  29. data/lib/mongoid/contexts/paging.rb +50 -0
  30. data/lib/mongoid/criteria.rb +239 -0
  31. data/lib/mongoid/criterion/complex.rb +21 -0
  32. data/lib/mongoid/criterion/exclusion.rb +65 -0
  33. data/lib/mongoid/criterion/inclusion.rb +110 -0
  34. data/lib/mongoid/criterion/optional.rb +136 -0
  35. data/lib/mongoid/cursor.rb +81 -0
  36. data/lib/mongoid/deprecation.rb +22 -0
  37. data/lib/mongoid/dirty.rb +253 -0
  38. data/lib/mongoid/document.rb +311 -0
  39. data/lib/mongoid/errors.rb +108 -0
  40. data/lib/mongoid/extensions.rb +101 -0
  41. data/lib/mongoid/extensions/array/accessors.rb +17 -0
  42. data/lib/mongoid/extensions/array/aliasing.rb +4 -0
  43. data/lib/mongoid/extensions/array/assimilation.rb +26 -0
  44. data/lib/mongoid/extensions/array/conversions.rb +29 -0
  45. data/lib/mongoid/extensions/array/parentization.rb +13 -0
  46. data/lib/mongoid/extensions/big_decimal/conversions.rb +19 -0
  47. data/lib/mongoid/extensions/binary/conversions.rb +17 -0
  48. data/lib/mongoid/extensions/boolean/conversions.rb +22 -0
  49. data/lib/mongoid/extensions/date/conversions.rb +24 -0
  50. data/lib/mongoid/extensions/datetime/conversions.rb +12 -0
  51. data/lib/mongoid/extensions/float/conversions.rb +20 -0
  52. data/lib/mongoid/extensions/hash/accessors.rb +38 -0
  53. data/lib/mongoid/extensions/hash/assimilation.rb +39 -0
  54. data/lib/mongoid/extensions/hash/conversions.rb +45 -0
  55. data/lib/mongoid/extensions/hash/criteria_helpers.rb +20 -0
  56. data/lib/mongoid/extensions/hash/scoping.rb +12 -0
  57. data/lib/mongoid/extensions/integer/conversions.rb +20 -0
  58. data/lib/mongoid/extensions/nil/assimilation.rb +17 -0
  59. data/lib/mongoid/extensions/object/conversions.rb +33 -0
  60. data/lib/mongoid/extensions/objectid/conversions.rb +15 -0
  61. data/lib/mongoid/extensions/proc/scoping.rb +12 -0
  62. data/lib/mongoid/extensions/string/conversions.rb +15 -0
  63. data/lib/mongoid/extensions/string/inflections.rb +97 -0
  64. data/lib/mongoid/extensions/symbol/inflections.rb +36 -0
  65. data/lib/mongoid/extensions/time_conversions.rb +35 -0
  66. data/lib/mongoid/extras.rb +61 -0
  67. data/lib/mongoid/factory.rb +20 -0
  68. data/lib/mongoid/field.rb +59 -0
  69. data/lib/mongoid/fields.rb +65 -0
  70. data/lib/mongoid/finders.rb +136 -0
  71. data/lib/mongoid/identity.rb +39 -0
  72. data/lib/mongoid/indexes.rb +30 -0
  73. data/lib/mongoid/javascript.rb +21 -0
  74. data/lib/mongoid/javascript/functions.yml +37 -0
  75. data/lib/mongoid/matchers.rb +36 -0
  76. data/lib/mongoid/matchers/all.rb +11 -0
  77. data/lib/mongoid/matchers/default.rb +26 -0
  78. data/lib/mongoid/matchers/exists.rb +13 -0
  79. data/lib/mongoid/matchers/gt.rb +11 -0
  80. data/lib/mongoid/matchers/gte.rb +11 -0
  81. data/lib/mongoid/matchers/in.rb +11 -0
  82. data/lib/mongoid/matchers/lt.rb +11 -0
  83. data/lib/mongoid/matchers/lte.rb +11 -0
  84. data/lib/mongoid/matchers/ne.rb +11 -0
  85. data/lib/mongoid/matchers/nin.rb +11 -0
  86. data/lib/mongoid/matchers/size.rb +11 -0
  87. data/lib/mongoid/memoization.rb +33 -0
  88. data/lib/mongoid/named_scope.rb +37 -0
  89. data/lib/mongoid/observable.rb +30 -0
  90. data/lib/mongoid/paths.rb +62 -0
  91. data/lib/mongoid/persistence.rb +222 -0
  92. data/lib/mongoid/persistence/command.rb +39 -0
  93. data/lib/mongoid/persistence/insert.rb +50 -0
  94. data/lib/mongoid/persistence/insert_embedded.rb +38 -0
  95. data/lib/mongoid/persistence/remove.rb +39 -0
  96. data/lib/mongoid/persistence/remove_all.rb +37 -0
  97. data/lib/mongoid/persistence/remove_embedded.rb +50 -0
  98. data/lib/mongoid/persistence/update.rb +63 -0
  99. data/lib/mongoid/scope.rb +75 -0
  100. data/lib/mongoid/state.rb +39 -0
  101. data/lib/mongoid/timestamps.rb +27 -0
  102. data/lib/mongoid/version.rb +4 -0
  103. data/lib/mongoid/versioning.rb +27 -0
  104. metadata +284 -0
@@ -0,0 +1,15 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ module Extensions #:nodoc:
4
+ module ObjectId #:nodoc:
5
+ module Conversions #:nodoc:
6
+ def set(value)
7
+ value
8
+ end
9
+ def get(value)
10
+ value
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,12 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ module Extensions #:nodoc:
4
+ module Proc #:nodoc:
5
+ module Scoping #:nodoc:
6
+ def scoped(*args)
7
+ call(*args).scoped
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,15 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ module Extensions #:nodoc:
4
+ module String #:nodoc:
5
+ module Conversions #:nodoc:
6
+ def set(value)
7
+ value.to_s unless value.nil?
8
+ end
9
+ def get(value)
10
+ value
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,97 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ module Extensions #:nodoc:
4
+ module String #:nodoc:
5
+ module Inflections #:nodoc:
6
+
7
+ ActiveSupport::Inflector.inflections do |inflect|
8
+ inflect.singular("address", "address")
9
+ inflect.singular("addresses", "address")
10
+ inflect.irregular("canvas", "canvases")
11
+ end
12
+
13
+ # Represents how special characters will get converted when creating a
14
+ # composite key that should be unique and part of a url.
15
+ CHAR_CONV = {
16
+ " " => "-",
17
+ "!" => "-excl-",
18
+ "\"" => "-bckslsh-",
19
+ "#" => "-hash-",
20
+ "$" => "-dol-",
21
+ "%" => "-perc-",
22
+ "&" => "-and-",
23
+ "'" => "-quo-",
24
+ "(" => "-oparen-",
25
+ ")" => "-cparen-",
26
+ "*" => "-astx-",
27
+ "+" => "-plus-",
28
+ "," => "-comma-",
29
+ "-" => "-dash-",
30
+ "." => "-period-",
31
+ "/" => "-fwdslsh-",
32
+ ":" => "-colon-",
33
+ ";" => "-semicol-",
34
+ "<" => "-lt-",
35
+ "=" => "-eq-",
36
+ ">" => "-gt-",
37
+ "?" => "-ques-",
38
+ "@" => "-at-",
39
+ "[" => "-obrck-",
40
+ "\\" => "-bckslsh-",
41
+ "]" => "-clbrck-",
42
+ "^" => "-carat-",
43
+ "_" => "-undscr-",
44
+ "`" => "-bcktick-",
45
+ "{" => "-ocurly-",
46
+ "|" => "-pipe-",
47
+ "}" => "-clcurly-",
48
+ "~" => "-tilda-"
49
+ }
50
+
51
+ REVERSALS = {
52
+ "asc" => "desc",
53
+ "ascending" => "descending",
54
+ "desc" => "asc",
55
+ "descending" => "ascending"
56
+ }
57
+
58
+ def collectionize
59
+ tableize.gsub("/", "_")
60
+ end
61
+
62
+ def identify
63
+ if Mongoid.parameterize_keys
64
+ key = ""
65
+ each_char { |c| key += (CHAR_CONV[c] || c.downcase) }; key
66
+ else
67
+ self
68
+ end
69
+ end
70
+
71
+ def labelize
72
+ underscore.humanize
73
+ end
74
+
75
+ def invert
76
+ REVERSALS[self]
77
+ end
78
+
79
+ def singular?
80
+ singularize == self
81
+ end
82
+
83
+ def plural?
84
+ pluralize == self
85
+ end
86
+
87
+ def reader
88
+ writer? ? gsub("=", "") : self
89
+ end
90
+
91
+ def writer?
92
+ include?("=")
93
+ end
94
+ end
95
+ end
96
+ end
97
+ end
@@ -0,0 +1,36 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ module Extensions #:nodoc:
4
+ module Symbol #:nodoc:
5
+ module Inflections #:nodoc:
6
+
7
+ REVERSALS = {
8
+ :asc => :desc,
9
+ :ascending => :descending,
10
+ :desc => :asc,
11
+ :descending => :ascending
12
+ }
13
+
14
+ def invert
15
+ REVERSALS[self]
16
+ end
17
+
18
+ def singular?
19
+ to_s.singular?
20
+ end
21
+
22
+ def plural?
23
+ to_s.plural?
24
+ end
25
+
26
+ ["gt", "lt", "gte", "lte", "ne", "near", "in", "nin", "mod", "all", "size", "exists", "within"].each do |oper|
27
+ class_eval <<-OPERATORS
28
+ def #{oper}
29
+ Criterion::Complex.new(:key => self, :operator => "#{oper}")
30
+ end
31
+ OPERATORS
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,35 @@
1
+ module Mongoid #:nodoc:
2
+ module Extensions #:nodoc:
3
+ module TimeConversions #:nodoc:
4
+ def set(value)
5
+ return nil if value.blank?
6
+ time = convert_to_time(value)
7
+ strip_milliseconds(time).utc
8
+ end
9
+
10
+ def get(value)
11
+ return nil if value.blank?
12
+ if Mongoid::Config.instance.use_utc?
13
+ value
14
+ else
15
+ value.getlocal
16
+ end
17
+ end
18
+
19
+ protected
20
+
21
+ def strip_milliseconds(time)
22
+ ::Time.at(time.to_i)
23
+ end
24
+
25
+ def convert_to_time(value)
26
+ case value
27
+ when ::String then ::Time.parse(value)
28
+ when ::DateTime then ::Time.utc(value.year, value.month, value.day, value.hour, value.min, value.sec)
29
+ when ::Date then ::Time.utc(value.year, value.month, value.day)
30
+ else value
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,61 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ module Extras #:nodoc:
4
+ extend ActiveSupport::Concern
5
+ included do
6
+ class_inheritable_accessor :cached, :enslaved
7
+ self.cached = false
8
+ self.enslaved = false
9
+ delegate :cached?, :enslaved?, :to => "self.class"
10
+ end
11
+
12
+ module ClassMethods #:nodoc
13
+ # Sets caching on for this class. This class level configuration will
14
+ # default all queries to cache the results of the first iteration over
15
+ # the cursor into an internal array. This should only be used for queries
16
+ # that return a small number of results or have small documents, as after
17
+ # the first iteration the entire results will be stored in memory.
18
+ #
19
+ # Example:
20
+ #
21
+ # class Person
22
+ # include Mongoid::Document
23
+ # cache
24
+ # end
25
+ def cache
26
+ self.cached = true
27
+ end
28
+
29
+ # Determines if the class is cached or not.
30
+ #
31
+ # Returns:
32
+ #
33
+ # True if cached, false if not.
34
+ def cached?
35
+ !!self.cached
36
+ end
37
+
38
+ # Set whether or not this documents read operations should delegate to
39
+ # the slave database by default.
40
+ #
41
+ # Example:
42
+ #
43
+ # class Person
44
+ # include Mongoid::Document
45
+ # enslave
46
+ # end
47
+ def enslave
48
+ self.enslaved = true
49
+ end
50
+
51
+ # Determines if the class is enslaved or not.
52
+ #
53
+ # Returns:
54
+ #
55
+ # True if enslaved, false if not.
56
+ def enslaved?
57
+ !!self.enslaved
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,20 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ class Factory #:nodoc:
4
+ # Builds a new +Document+ from the supplied attributes.
5
+ #
6
+ # Example:
7
+ #
8
+ # <tt>Mongoid::Factory.build(Person, {})</tt>
9
+ #
10
+ # Options:
11
+ #
12
+ # klass: The class to instantiate from if _type is not present.
13
+ # attributes: The +Document+ attributes.
14
+ def self.build(klass, attributes)
15
+ attrs = {}.merge(attributes)
16
+ type = attrs["_type"]
17
+ type ? type.constantize.instantiate(attrs) : klass.instantiate(attrs)
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,59 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ class Field
4
+ attr_reader :name, :type
5
+
6
+ # Determine if the field is able to be accessible via a mass update.
7
+ #
8
+ # Returns:
9
+ #
10
+ # true if accessible, false if not.
11
+ def accessible?
12
+ !!@accessible
13
+ end
14
+
15
+ # Get the default value for the field.
16
+ #
17
+ # Returns:
18
+ #
19
+ # The primitive value or a copy of the default.
20
+ def default
21
+ copy
22
+ end
23
+
24
+ # Create the new field with a name and optional additional options. Valid
25
+ # options are :default
26
+ #
27
+ # Options:
28
+ #
29
+ # name: The name of the field as a +Symbol+.
30
+ # options: A +Hash+ of options for the field.
31
+ #
32
+ # Example:
33
+ #
34
+ # <tt>Field.new(:score, :default => 0)</tt>
35
+ def initialize(name, options = {})
36
+ @name, @default = name, options[:default]
37
+ @copyable = (@default.is_a?(Array) || @default.is_a?(Hash))
38
+ @type = options[:type] || String
39
+ @accessible = options.has_key?(:accessible) ? options[:accessible] : true
40
+ end
41
+
42
+ # Used for setting an object in the attributes hash. If nil is provided the
43
+ # default will get returned if it exists.
44
+ def set(object)
45
+ type.set(object)
46
+ end
47
+
48
+ # Used for retrieving the object out of the attributes hash.
49
+ def get(object)
50
+ type.get(object)
51
+ end
52
+
53
+ protected
54
+ # Slightly faster default check.
55
+ def copy
56
+ @copyable ? @default.dup : @default
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,65 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc
3
+ module Fields #:nodoc
4
+ def self.included(base)
5
+ base.class_eval do
6
+ extend ClassMethods
7
+ # Set up the class attributes that must be available to all subclasses.
8
+ # These include defaults, fields
9
+ class_inheritable_accessor :fields
10
+
11
+ self.fields = {}
12
+
13
+ delegate :defaults, :fields, :to => "self.class"
14
+ end
15
+ end
16
+
17
+ module ClassMethods #:nodoc
18
+ # Defines all the fields that are accessable on the Document
19
+ # For each field that is defined, a getter and setter will be
20
+ # added as an instance method to the Document.
21
+ #
22
+ # Options:
23
+ #
24
+ # name: The name of the field, as a +Symbol+.
25
+ # options: A +Hash+ of options to supply to the +Field+.
26
+ #
27
+ # Example:
28
+ #
29
+ # <tt>field :score, :default => 0</tt>
30
+ def field(name, options = {})
31
+ access = name.to_s
32
+ set_field(access, options)
33
+ end
34
+
35
+ # Returns the default values for the fields on the document
36
+ def defaults
37
+ fields.inject({}) do |defs,(field_name,field)|
38
+ next(defs) if field.default.nil?
39
+ defs[field_name.to_s] = field.default
40
+ defs
41
+ end
42
+ end
43
+
44
+ protected
45
+ # Define a field attribute for the +Document+.
46
+ def set_field(name, options = {})
47
+ meth = options.delete(:as) || name
48
+ fields[name] = Field.new(name, options)
49
+ create_accessors(name, meth, options)
50
+ add_dirty_methods(name)
51
+ end
52
+
53
+ # Create the field accessors.
54
+ def create_accessors(name, meth, options = {})
55
+ define_method(meth) { read_attribute(name) }
56
+ define_method("#{meth}=") { |value| write_attribute(name, value) }
57
+ define_method("#{meth}?") do
58
+ attr = read_attribute(name)
59
+ (options[:type] == Boolean) ? attr == true : attr.present?
60
+ end
61
+ end
62
+
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,136 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ module Finders #:nodoc:
4
+
5
+ # Delegate to the criteria methods that are natural for creating a new
6
+ # criteria.
7
+ [ :all_in, :any_in, :avg, :excludes, :limit, :max, :min,
8
+ :not_in, :only, :order_by, :skip, :sum, :where ].each do |name|
9
+ define_method(name) do |*args|
10
+ criteria.send(name, *args)
11
+ end
12
+ end
13
+
14
+ # Find +Documents+ given the conditions.
15
+ #
16
+ # Options:
17
+ #
18
+ # args: A +Hash+ with a conditions key and other options
19
+ #
20
+ # <tt>Person.all(:conditions => { :attribute => "value" })</tt>
21
+ def all(*args)
22
+ find(:all, *args)
23
+ end
24
+
25
+ # Returns a count of matching records in the database based on the
26
+ # provided arguments.
27
+ #
28
+ # <tt>Person.count(:first, :conditions => { :attribute => "value" })</tt>
29
+ def count(*args)
30
+ Criteria.translate(self, *args).count
31
+ end
32
+
33
+ # Helper to initialize a new +Criteria+ object for this class.
34
+ #
35
+ # Example:
36
+ #
37
+ # <tt>Person.criteria</tt>
38
+ def criteria
39
+ Criteria.new(self)
40
+ end
41
+
42
+ # Find a +Document+ in several different ways.
43
+ #
44
+ # If a +String+ is provided, it will be assumed that it is a
45
+ # representation of a Mongo::ObjectId and will attempt to find a single
46
+ # +Document+ based on that id. If a +Symbol+ and +Hash+ is provided then
47
+ # it will attempt to find either a single +Document+ or multiples based
48
+ # on the conditions provided and the first parameter.
49
+ #
50
+ # <tt>Person.find(:first, :conditions => { :attribute => "value" })</tt>
51
+ #
52
+ # <tt>Person.find(:all, :conditions => { :attribute => "value" })</tt>
53
+ #
54
+ # <tt>Person.find(Mongo::ObjectId.new.to_s)</tt>
55
+ def find(*args)
56
+ raise Errors::InvalidOptions.new("Calling Document#find with nil is invalid") if args[0].nil?
57
+ type = args.delete_at(0) if args[0].is_a?(Symbol)
58
+ criteria = Criteria.translate(self, *args)
59
+ case type
60
+ when :first then return criteria.one
61
+ when :last then return criteria.last
62
+ else
63
+ return criteria
64
+ end
65
+ end
66
+
67
+ # Find the first +Document+ given the conditions, or creates a new document
68
+ # with the conditions that were supplied
69
+ #
70
+ # Options:
71
+ #
72
+ # args: A +Hash+ of attributes
73
+ #
74
+ # <tt>Person.find_or_create_by(:attribute => "value")</tt>
75
+ def find_or_create_by(attrs = {})
76
+ find_or(:create, attrs)
77
+ end
78
+
79
+ # Find the first +Document+ given the conditions, or instantiates a new document
80
+ # with the conditions that were supplied
81
+ #
82
+ # Options:
83
+ #
84
+ # args: A +Hash+ of attributes
85
+ #
86
+ # <tt>Person.find_or_initialize_by(:attribute => "value")</tt>
87
+ def find_or_initialize_by(attrs = {})
88
+ find_or(:new, attrs)
89
+ end
90
+
91
+ # Find the first +Document+ given the conditions.
92
+ #
93
+ # Options:
94
+ #
95
+ # args: A +Hash+ with a conditions key and other options
96
+ #
97
+ # <tt>Person.first(:conditions => { :attribute => "value" })</tt>
98
+ def first(*args)
99
+ find(:first, *args)
100
+ end
101
+
102
+ # Find the last +Document+ given the conditions.
103
+ #
104
+ # Options:
105
+ #
106
+ # args: A +Hash+ with a conditions key and other options
107
+ #
108
+ # <tt>Person.last(:conditions => { :attribute => "value" })</tt>
109
+ def last(*args)
110
+ find(:last, *args)
111
+ end
112
+
113
+ # Find all documents in paginated fashion given the supplied arguments.
114
+ # If no parameters are passed just default to offset 0 and limit 20.
115
+ #
116
+ # Options:
117
+ #
118
+ # params: A +Hash+ of params to pass to the Criteria API.
119
+ #
120
+ # Example:
121
+ #
122
+ # <tt>Person.paginate(:conditions => { :field => "Test" }, :page => 1,
123
+ # :per_page => 20)</tt>
124
+ #
125
+ # Returns paginated array of docs.
126
+ def paginate(params = {})
127
+ Criteria.translate(self, params).paginate
128
+ end
129
+
130
+ protected
131
+ # Find the first object or create/initialize it.
132
+ def find_or(method, attrs = {})
133
+ first(:conditions => attrs) || send(method, attrs)
134
+ end
135
+ end
136
+ end