humanoid 1.2.7

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 (210) hide show
  1. data/.gitignore +6 -0
  2. data/.watchr +29 -0
  3. data/HISTORY +342 -0
  4. data/MIT_LICENSE +20 -0
  5. data/README.rdoc +56 -0
  6. data/Rakefile +53 -0
  7. data/VERSION +1 -0
  8. data/caliper.yml +4 -0
  9. data/humanoid.gemspec +374 -0
  10. data/lib/humanoid.rb +111 -0
  11. data/lib/humanoid/associations.rb +258 -0
  12. data/lib/humanoid/associations/belongs_to.rb +64 -0
  13. data/lib/humanoid/associations/belongs_to_related.rb +62 -0
  14. data/lib/humanoid/associations/has_many.rb +180 -0
  15. data/lib/humanoid/associations/has_many_related.rb +109 -0
  16. data/lib/humanoid/associations/has_one.rb +95 -0
  17. data/lib/humanoid/associations/has_one_related.rb +81 -0
  18. data/lib/humanoid/associations/options.rb +57 -0
  19. data/lib/humanoid/associations/proxy.rb +31 -0
  20. data/lib/humanoid/attributes.rb +184 -0
  21. data/lib/humanoid/callbacks.rb +23 -0
  22. data/lib/humanoid/collection.rb +118 -0
  23. data/lib/humanoid/collections/cyclic_iterator.rb +34 -0
  24. data/lib/humanoid/collections/master.rb +28 -0
  25. data/lib/humanoid/collections/mimic.rb +46 -0
  26. data/lib/humanoid/collections/operations.rb +41 -0
  27. data/lib/humanoid/collections/slaves.rb +44 -0
  28. data/lib/humanoid/commands.rb +182 -0
  29. data/lib/humanoid/commands/create.rb +21 -0
  30. data/lib/humanoid/commands/delete.rb +16 -0
  31. data/lib/humanoid/commands/delete_all.rb +23 -0
  32. data/lib/humanoid/commands/deletion.rb +18 -0
  33. data/lib/humanoid/commands/destroy.rb +19 -0
  34. data/lib/humanoid/commands/destroy_all.rb +23 -0
  35. data/lib/humanoid/commands/save.rb +27 -0
  36. data/lib/humanoid/components.rb +24 -0
  37. data/lib/humanoid/config.rb +84 -0
  38. data/lib/humanoid/contexts.rb +25 -0
  39. data/lib/humanoid/contexts/enumerable.rb +117 -0
  40. data/lib/humanoid/contexts/ids.rb +25 -0
  41. data/lib/humanoid/contexts/mongo.rb +224 -0
  42. data/lib/humanoid/contexts/paging.rb +42 -0
  43. data/lib/humanoid/criteria.rb +259 -0
  44. data/lib/humanoid/criterion/complex.rb +21 -0
  45. data/lib/humanoid/criterion/exclusion.rb +65 -0
  46. data/lib/humanoid/criterion/inclusion.rb +91 -0
  47. data/lib/humanoid/criterion/optional.rb +128 -0
  48. data/lib/humanoid/cursor.rb +82 -0
  49. data/lib/humanoid/document.rb +300 -0
  50. data/lib/humanoid/enslavement.rb +38 -0
  51. data/lib/humanoid/errors.rb +77 -0
  52. data/lib/humanoid/extensions.rb +84 -0
  53. data/lib/humanoid/extensions/array/accessors.rb +17 -0
  54. data/lib/humanoid/extensions/array/aliasing.rb +4 -0
  55. data/lib/humanoid/extensions/array/assimilation.rb +26 -0
  56. data/lib/humanoid/extensions/array/conversions.rb +29 -0
  57. data/lib/humanoid/extensions/array/parentization.rb +13 -0
  58. data/lib/humanoid/extensions/boolean/conversions.rb +16 -0
  59. data/lib/humanoid/extensions/date/conversions.rb +15 -0
  60. data/lib/humanoid/extensions/datetime/conversions.rb +17 -0
  61. data/lib/humanoid/extensions/float/conversions.rb +16 -0
  62. data/lib/humanoid/extensions/hash/accessors.rb +38 -0
  63. data/lib/humanoid/extensions/hash/assimilation.rb +30 -0
  64. data/lib/humanoid/extensions/hash/conversions.rb +15 -0
  65. data/lib/humanoid/extensions/hash/criteria_helpers.rb +20 -0
  66. data/lib/humanoid/extensions/hash/scoping.rb +12 -0
  67. data/lib/humanoid/extensions/integer/conversions.rb +16 -0
  68. data/lib/humanoid/extensions/nil/assimilation.rb +13 -0
  69. data/lib/humanoid/extensions/object/conversions.rb +33 -0
  70. data/lib/humanoid/extensions/proc/scoping.rb +12 -0
  71. data/lib/humanoid/extensions/string/conversions.rb +15 -0
  72. data/lib/humanoid/extensions/string/inflections.rb +97 -0
  73. data/lib/humanoid/extensions/symbol/inflections.rb +36 -0
  74. data/lib/humanoid/extensions/time/conversions.rb +18 -0
  75. data/lib/humanoid/factory.rb +19 -0
  76. data/lib/humanoid/field.rb +39 -0
  77. data/lib/humanoid/fields.rb +62 -0
  78. data/lib/humanoid/finders.rb +224 -0
  79. data/lib/humanoid/identity.rb +39 -0
  80. data/lib/humanoid/indexes.rb +30 -0
  81. data/lib/humanoid/matchers.rb +36 -0
  82. data/lib/humanoid/matchers/all.rb +11 -0
  83. data/lib/humanoid/matchers/default.rb +26 -0
  84. data/lib/humanoid/matchers/exists.rb +13 -0
  85. data/lib/humanoid/matchers/gt.rb +11 -0
  86. data/lib/humanoid/matchers/gte.rb +11 -0
  87. data/lib/humanoid/matchers/in.rb +11 -0
  88. data/lib/humanoid/matchers/lt.rb +11 -0
  89. data/lib/humanoid/matchers/lte.rb +11 -0
  90. data/lib/humanoid/matchers/ne.rb +11 -0
  91. data/lib/humanoid/matchers/nin.rb +11 -0
  92. data/lib/humanoid/matchers/size.rb +11 -0
  93. data/lib/humanoid/memoization.rb +27 -0
  94. data/lib/humanoid/named_scope.rb +40 -0
  95. data/lib/humanoid/scope.rb +75 -0
  96. data/lib/humanoid/timestamps.rb +30 -0
  97. data/lib/humanoid/versioning.rb +28 -0
  98. data/perf/benchmark.rb +77 -0
  99. data/spec/integration/humanoid/associations_spec.rb +301 -0
  100. data/spec/integration/humanoid/attributes_spec.rb +22 -0
  101. data/spec/integration/humanoid/commands_spec.rb +216 -0
  102. data/spec/integration/humanoid/contexts/enumerable_spec.rb +33 -0
  103. data/spec/integration/humanoid/criteria_spec.rb +224 -0
  104. data/spec/integration/humanoid/document_spec.rb +587 -0
  105. data/spec/integration/humanoid/extensions_spec.rb +26 -0
  106. data/spec/integration/humanoid/finders_spec.rb +119 -0
  107. data/spec/integration/humanoid/inheritance_spec.rb +137 -0
  108. data/spec/integration/humanoid/named_scope_spec.rb +46 -0
  109. data/spec/models/address.rb +39 -0
  110. data/spec/models/animal.rb +6 -0
  111. data/spec/models/comment.rb +8 -0
  112. data/spec/models/country_code.rb +6 -0
  113. data/spec/models/employer.rb +5 -0
  114. data/spec/models/game.rb +6 -0
  115. data/spec/models/inheritance.rb +56 -0
  116. data/spec/models/location.rb +5 -0
  117. data/spec/models/mixed_drink.rb +4 -0
  118. data/spec/models/name.rb +13 -0
  119. data/spec/models/namespacing.rb +11 -0
  120. data/spec/models/patient.rb +4 -0
  121. data/spec/models/person.rb +98 -0
  122. data/spec/models/pet.rb +7 -0
  123. data/spec/models/pet_owner.rb +6 -0
  124. data/spec/models/phone.rb +7 -0
  125. data/spec/models/post.rb +15 -0
  126. data/spec/models/translation.rb +5 -0
  127. data/spec/models/vet_visit.rb +5 -0
  128. data/spec/spec.opts +3 -0
  129. data/spec/spec_helper.rb +31 -0
  130. data/spec/unit/mongoid/associations/belongs_to_related_spec.rb +141 -0
  131. data/spec/unit/mongoid/associations/belongs_to_spec.rb +193 -0
  132. data/spec/unit/mongoid/associations/has_many_related_spec.rb +387 -0
  133. data/spec/unit/mongoid/associations/has_many_spec.rb +471 -0
  134. data/spec/unit/mongoid/associations/has_one_related_spec.rb +179 -0
  135. data/spec/unit/mongoid/associations/has_one_spec.rb +282 -0
  136. data/spec/unit/mongoid/associations/options_spec.rb +191 -0
  137. data/spec/unit/mongoid/associations_spec.rb +545 -0
  138. data/spec/unit/mongoid/attributes_spec.rb +484 -0
  139. data/spec/unit/mongoid/callbacks_spec.rb +55 -0
  140. data/spec/unit/mongoid/collection_spec.rb +171 -0
  141. data/spec/unit/mongoid/collections/cyclic_iterator_spec.rb +75 -0
  142. data/spec/unit/mongoid/collections/master_spec.rb +41 -0
  143. data/spec/unit/mongoid/collections/mimic_spec.rb +43 -0
  144. data/spec/unit/mongoid/collections/slaves_spec.rb +81 -0
  145. data/spec/unit/mongoid/commands/create_spec.rb +30 -0
  146. data/spec/unit/mongoid/commands/delete_all_spec.rb +58 -0
  147. data/spec/unit/mongoid/commands/delete_spec.rb +35 -0
  148. data/spec/unit/mongoid/commands/destroy_all_spec.rb +23 -0
  149. data/spec/unit/mongoid/commands/destroy_spec.rb +44 -0
  150. data/spec/unit/mongoid/commands/save_spec.rb +105 -0
  151. data/spec/unit/mongoid/commands_spec.rb +282 -0
  152. data/spec/unit/mongoid/config_spec.rb +165 -0
  153. data/spec/unit/mongoid/contexts/enumerable_spec.rb +374 -0
  154. data/spec/unit/mongoid/contexts/mongo_spec.rb +505 -0
  155. data/spec/unit/mongoid/contexts_spec.rb +25 -0
  156. data/spec/unit/mongoid/criteria_spec.rb +769 -0
  157. data/spec/unit/mongoid/criterion/complex_spec.rb +19 -0
  158. data/spec/unit/mongoid/criterion/exclusion_spec.rb +91 -0
  159. data/spec/unit/mongoid/criterion/inclusion_spec.rb +211 -0
  160. data/spec/unit/mongoid/criterion/optional_spec.rb +329 -0
  161. data/spec/unit/mongoid/cursor_spec.rb +74 -0
  162. data/spec/unit/mongoid/document_spec.rb +986 -0
  163. data/spec/unit/mongoid/enslavement_spec.rb +63 -0
  164. data/spec/unit/mongoid/errors_spec.rb +103 -0
  165. data/spec/unit/mongoid/extensions/array/accessors_spec.rb +50 -0
  166. data/spec/unit/mongoid/extensions/array/assimilation_spec.rb +24 -0
  167. data/spec/unit/mongoid/extensions/array/conversions_spec.rb +35 -0
  168. data/spec/unit/mongoid/extensions/array/parentization_spec.rb +20 -0
  169. data/spec/unit/mongoid/extensions/boolean/conversions_spec.rb +49 -0
  170. data/spec/unit/mongoid/extensions/date/conversions_spec.rb +102 -0
  171. data/spec/unit/mongoid/extensions/datetime/conversions_spec.rb +70 -0
  172. data/spec/unit/mongoid/extensions/float/conversions_spec.rb +61 -0
  173. data/spec/unit/mongoid/extensions/hash/accessors_spec.rb +184 -0
  174. data/spec/unit/mongoid/extensions/hash/assimilation_spec.rb +46 -0
  175. data/spec/unit/mongoid/extensions/hash/conversions_spec.rb +21 -0
  176. data/spec/unit/mongoid/extensions/hash/criteria_helpers_spec.rb +17 -0
  177. data/spec/unit/mongoid/extensions/hash/scoping_spec.rb +14 -0
  178. data/spec/unit/mongoid/extensions/integer/conversions_spec.rb +61 -0
  179. data/spec/unit/mongoid/extensions/nil/assimilation_spec.rb +24 -0
  180. data/spec/unit/mongoid/extensions/object/conversions_spec.rb +43 -0
  181. data/spec/unit/mongoid/extensions/proc/scoping_spec.rb +34 -0
  182. data/spec/unit/mongoid/extensions/string/conversions_spec.rb +17 -0
  183. data/spec/unit/mongoid/extensions/string/inflections_spec.rb +208 -0
  184. data/spec/unit/mongoid/extensions/symbol/inflections_spec.rb +91 -0
  185. data/spec/unit/mongoid/extensions/time/conversions_spec.rb +70 -0
  186. data/spec/unit/mongoid/factory_spec.rb +31 -0
  187. data/spec/unit/mongoid/field_spec.rb +81 -0
  188. data/spec/unit/mongoid/fields_spec.rb +158 -0
  189. data/spec/unit/mongoid/finders_spec.rb +368 -0
  190. data/spec/unit/mongoid/identity_spec.rb +88 -0
  191. data/spec/unit/mongoid/indexes_spec.rb +93 -0
  192. data/spec/unit/mongoid/matchers/all_spec.rb +27 -0
  193. data/spec/unit/mongoid/matchers/default_spec.rb +27 -0
  194. data/spec/unit/mongoid/matchers/exists_spec.rb +56 -0
  195. data/spec/unit/mongoid/matchers/gt_spec.rb +39 -0
  196. data/spec/unit/mongoid/matchers/gte_spec.rb +49 -0
  197. data/spec/unit/mongoid/matchers/in_spec.rb +27 -0
  198. data/spec/unit/mongoid/matchers/lt_spec.rb +39 -0
  199. data/spec/unit/mongoid/matchers/lte_spec.rb +49 -0
  200. data/spec/unit/mongoid/matchers/ne_spec.rb +27 -0
  201. data/spec/unit/mongoid/matchers/nin_spec.rb +27 -0
  202. data/spec/unit/mongoid/matchers/size_spec.rb +27 -0
  203. data/spec/unit/mongoid/matchers_spec.rb +329 -0
  204. data/spec/unit/mongoid/memoization_spec.rb +75 -0
  205. data/spec/unit/mongoid/named_scope_spec.rb +123 -0
  206. data/spec/unit/mongoid/scope_spec.rb +240 -0
  207. data/spec/unit/mongoid/timestamps_spec.rb +25 -0
  208. data/spec/unit/mongoid/versioning_spec.rb +41 -0
  209. data/spec/unit/mongoid_spec.rb +37 -0
  210. metadata +431 -0
@@ -0,0 +1,19 @@
1
+ require "spec_helper"
2
+
3
+ describe Humanoid::Criterion::Complex do
4
+
5
+ let(:complex) { Humanoid::Criterion::Complex.new(:key => :field, :operator => "$gt") }
6
+
7
+ describe "#initialize" do
8
+
9
+ it "sets the key" do
10
+ complex.key.should == :field
11
+ end
12
+
13
+ it "sets the operator" do
14
+ complex.operator.should == "$gt"
15
+ end
16
+
17
+ end
18
+
19
+ end
@@ -0,0 +1,91 @@
1
+ require "spec_helper"
2
+
3
+ describe Humanoid::Criterion::Exclusion do
4
+
5
+ before do
6
+ @criteria = Humanoid::Criteria.new(Person)
7
+ @canvas_criteria = Humanoid::Criteria.new(Canvas)
8
+ end
9
+
10
+ describe "#excludes" do
11
+
12
+ it "adds the $ne query to the selector" do
13
+ @criteria.excludes(:title => "Bad Title", :text => "Bad Text")
14
+ @criteria.selector.should ==
15
+ {
16
+ :title =>
17
+ { "$ne" => "Bad Title"},
18
+ :text =>
19
+ { "$ne" => "Bad Text" }
20
+ }
21
+ end
22
+
23
+ it "returns self" do
24
+ @criteria.excludes(:title => "Bad").should == @criteria
25
+ end
26
+
27
+ context "when passing an id" do
28
+
29
+ it "accepts id" do
30
+ @criteria.excludes(:id => "1")
31
+ @criteria.selector.should ==
32
+ {
33
+ :_id => { "$ne" => "1" }
34
+ }
35
+ end
36
+
37
+ it "accepts _id" do
38
+ @criteria.excludes(:_id => "1")
39
+ @criteria.selector.should ==
40
+ {
41
+ :_id => { "$ne" => "1" }
42
+ }
43
+ end
44
+
45
+ end
46
+
47
+ end
48
+
49
+ describe "#not_in" do
50
+
51
+ it "adds the exclusion to the selector" do
52
+ @criteria.not_in(:title => ["title1", "title2"], :text => ["test"])
53
+ @criteria.selector.should == {
54
+ :title => { "$nin" => ["title1", "title2"] },
55
+ :text => { "$nin" => ["test"] }
56
+ }
57
+ end
58
+
59
+ it "returns self" do
60
+ @criteria.not_in(:title => ["title1"]).should == @criteria
61
+ end
62
+
63
+ end
64
+
65
+ describe "#only" do
66
+
67
+ context "when args are provided" do
68
+
69
+ it "adds the options for limiting by fields" do
70
+ @criteria.only(:title, :text)
71
+ @criteria.options.should == { :fields => [ :title, :text ] }
72
+ end
73
+
74
+ it "returns self" do
75
+ @criteria.only.should == @criteria
76
+ end
77
+
78
+ end
79
+
80
+ context "when no args provided" do
81
+
82
+ it "does not add the field option" do
83
+ @criteria.only
84
+ @criteria.options[:fields].should be_nil
85
+ end
86
+
87
+ end
88
+
89
+ end
90
+
91
+ end
@@ -0,0 +1,211 @@
1
+ require "spec_helper"
2
+
3
+ describe Humanoid::Criterion::Inclusion do
4
+
5
+ before do
6
+ @criteria = Humanoid::Criteria.new(Person)
7
+ @canvas_criteria = Humanoid::Criteria.new(Canvas)
8
+ end
9
+
10
+ describe "#all" do
11
+
12
+ it "adds the $all query to the selector" do
13
+ @criteria.all(:title => ["title1", "title2"])
14
+ @criteria.selector.should ==
15
+ {
16
+ :title => { "$all" => ["title1", "title2"] }
17
+ }
18
+ end
19
+
20
+ it "returns self" do
21
+ @criteria.all(:title => [ "title1" ]).should == @criteria
22
+ end
23
+
24
+ end
25
+
26
+ describe "#and" do
27
+
28
+ context "when provided a hash" do
29
+
30
+ it "adds the clause to the selector" do
31
+ @criteria.and(:title => "Title", :text => "Text")
32
+ @criteria.selector.should ==
33
+ {
34
+ :title => "Title",
35
+ :text => "Text"
36
+ }
37
+ end
38
+
39
+ end
40
+
41
+ context "when provided a string" do
42
+
43
+ it "adds the $where clause to the selector" do
44
+ @criteria.and("this.date < new Date()")
45
+ @criteria.selector.should ==
46
+ {
47
+ "$where" => "this.date < new Date()"
48
+ }
49
+ end
50
+
51
+ end
52
+
53
+ it "returns self" do
54
+ @criteria.and.should == @criteria
55
+ end
56
+
57
+ end
58
+
59
+ describe "#in" do
60
+
61
+ it "adds the $in clause to the selector" do
62
+ @criteria.in(:title => ["title1", "title2"], :text => ["test"])
63
+ @criteria.selector.should ==
64
+ {
65
+ :title => { "$in" => ["title1", "title2"] }, :text => { "$in" => ["test"] }
66
+ }
67
+ end
68
+
69
+ it "returns self" do
70
+ @criteria.in(:title => ["title1"]).should == @criteria
71
+ end
72
+
73
+ end
74
+
75
+ describe "#where" do
76
+
77
+ context "when provided a hash" do
78
+
79
+ context "with simple hash keys" do
80
+
81
+ it "adds the clause to the selector" do
82
+ @criteria.where(:title => "Title", :text => "Text")
83
+ @criteria.selector.should ==
84
+ { :title => "Title", :text => "Text" }
85
+ end
86
+
87
+ end
88
+
89
+ context "with complex criterion" do
90
+
91
+ context "#all" do
92
+
93
+ it "returns those matching an all clause" do
94
+ @criteria.where(:title.all => ["Sir"])
95
+ @criteria.selector.should ==
96
+ { :title => { "$all" => ["Sir"] } }
97
+ end
98
+
99
+ end
100
+
101
+ context "#exists" do
102
+
103
+ it "returns those matching an exists clause" do
104
+ @criteria.where(:title.exists => true)
105
+ @criteria.selector.should ==
106
+ { :title => { "$exists" => true } }
107
+ end
108
+
109
+ end
110
+
111
+ context "#gt" do
112
+
113
+ it "returns those matching a gt clause" do
114
+ @criteria.where(:age.gt => 30)
115
+ @criteria.selector.should ==
116
+ { :age => { "$gt" => 30 } }
117
+ end
118
+
119
+ end
120
+
121
+ context "#gte" do
122
+
123
+ it "returns those matching a gte clause" do
124
+ @criteria.where(:age.gte => 33)
125
+ @criteria.selector.should ==
126
+ { :age => { "$gte" => 33 } }
127
+ end
128
+
129
+ end
130
+
131
+ context "#in" do
132
+
133
+ it "returns those matching an in clause" do
134
+ @criteria.where(:title.in => ["Sir", "Madam"])
135
+ @criteria.selector.should ==
136
+ { :title => { "$in" => ["Sir", "Madam"] } }
137
+ end
138
+
139
+ end
140
+
141
+ context "#lt" do
142
+
143
+ it "returns those matching a lt clause" do
144
+ @criteria.where(:age.lt => 34)
145
+ @criteria.selector.should ==
146
+ { :age => { "$lt" => 34 } }
147
+ end
148
+
149
+ end
150
+
151
+ context "#lte" do
152
+
153
+ it "returns those matching a lte clause" do
154
+ @criteria.where(:age.lte => 33)
155
+ @criteria.selector.should ==
156
+ { :age => { "$lte" => 33 } }
157
+ end
158
+
159
+ end
160
+
161
+ context "#ne" do
162
+
163
+ it "returns those matching a ne clause" do
164
+ @criteria.where(:age.ne => 50)
165
+ @criteria.selector.should ==
166
+ { :age => { "$ne" => 50 } }
167
+ end
168
+
169
+ end
170
+
171
+ context "#nin" do
172
+
173
+ it "returns those matching a nin clause" do
174
+ @criteria.where(:title.nin => ["Esquire", "Congressman"])
175
+ @criteria.selector.should ==
176
+ { :title => { "$nin" => ["Esquire", "Congressman"] } }
177
+ end
178
+
179
+ end
180
+
181
+ context "#size" do
182
+
183
+ it "returns those matching a size clause" do
184
+ @criteria.where(:aliases.size => 2)
185
+ @criteria.selector.should ==
186
+ { :aliases => { "$size" => 2 } }
187
+ end
188
+
189
+ end
190
+
191
+ end
192
+
193
+ end
194
+
195
+ context "when provided a string" do
196
+
197
+ it "adds the $where clause to the selector" do
198
+ @criteria.where("this.date < new Date()")
199
+ @criteria.selector.should ==
200
+ { "$where" => "this.date < new Date()" }
201
+ end
202
+
203
+ end
204
+
205
+ it "returns self" do
206
+ @criteria.where.should == @criteria
207
+ end
208
+
209
+ end
210
+
211
+ end
@@ -0,0 +1,329 @@
1
+ require "spec_helper"
2
+
3
+ describe Humanoid::Criterion::Optional do
4
+
5
+ before do
6
+ @criteria = Humanoid::Criteria.new(Person)
7
+ @canvas_criteria = Humanoid::Criteria.new(Canvas)
8
+ end
9
+
10
+ describe "#cache" do
11
+
12
+ it "sets the cache option on the criteria" do
13
+ @criteria.cache
14
+ @criteria.options[:cache].should be_true
15
+ end
16
+
17
+ it "returns self" do
18
+ @criteria.cache.should == @criteria
19
+ end
20
+ end
21
+
22
+ describe "#cached?" do
23
+
24
+ context "when the criteria has a cache option" do
25
+
26
+ before do
27
+ @criteria.cache
28
+ end
29
+
30
+ it "returns true" do
31
+ @criteria.cached?.should be_true
32
+ end
33
+
34
+ it "removes cache from the options" do
35
+ @criteria.cached?
36
+ @criteria.options[:cache].should be_nil
37
+ end
38
+
39
+ it "sets the cache instance variable" do
40
+ @criteria.cached?
41
+ @criteria.instance_variable_get(:@cached).should be_true
42
+ end
43
+ end
44
+
45
+ context "when the criteria has no cache option" do
46
+
47
+ it "returns false" do
48
+ @criteria.cached?.should be_false
49
+ end
50
+ end
51
+ end
52
+
53
+ describe "#enslave" do
54
+
55
+ it "sets the enslaved option on the criteria" do
56
+ @criteria.enslave
57
+ @criteria.options[:enslave].should be_true
58
+ end
59
+
60
+ it "returns self" do
61
+ @criteria.enslave.should == @criteria
62
+ end
63
+ end
64
+
65
+ describe "#extras" do
66
+
67
+ context "filtering" do
68
+
69
+ context "when page is provided" do
70
+
71
+ it "sets the limit and skip options" do
72
+ @criteria.extras({ :page => "2" })
73
+ @criteria.page.should == 2
74
+ @criteria.options.should == { :skip => 20, :limit => 20 }
75
+ end
76
+
77
+ end
78
+
79
+ context "when per_page is provided" do
80
+
81
+ it "sets the limit and skip options" do
82
+ @criteria.extras({ :per_page => 45 })
83
+ @criteria.options.should == { :skip => 0, :limit => 45 }
84
+ end
85
+
86
+ end
87
+
88
+ context "when page and per_page both provided" do
89
+
90
+ it "sets the limit and skip options" do
91
+ @criteria.extras({ :per_page => 30, :page => "4" })
92
+ @criteria.options.should == { :skip => 90, :limit => 30 }
93
+ @criteria.page.should == 4
94
+ end
95
+
96
+ end
97
+
98
+ end
99
+
100
+ it "adds the extras to the options" do
101
+ @criteria.limit(10).extras({ :skip => 10 })
102
+ @criteria.options.should == { :skip => 10, :limit => 10 }
103
+ end
104
+
105
+ it "returns self" do
106
+ @criteria.extras({}).should == @criteria
107
+ end
108
+
109
+ end
110
+
111
+ describe "#id" do
112
+
113
+ context "when passing a single id" do
114
+
115
+ context "when the id is a string" do
116
+
117
+ it "adds the _id query to the selector" do
118
+ id = Mongo::ObjectID.new.to_s
119
+ @criteria.id(id)
120
+ @criteria.selector.should == { :_id => id }
121
+ end
122
+
123
+ it "returns self" do
124
+ id = Mongo::ObjectID.new.to_s
125
+ @criteria.id(id).should == @criteria
126
+ end
127
+ end
128
+
129
+ context "when the id is an object id" do
130
+
131
+ it "adds the _id query to the selector" do
132
+ id = Mongo::ObjectID.new
133
+ @criteria.id(id)
134
+ @criteria.selector.should == { :_id => id }
135
+ end
136
+
137
+ it "returns self" do
138
+ id = Mongo::ObjectID.new
139
+ @criteria.id(id).should == @criteria
140
+ end
141
+ end
142
+
143
+ end
144
+
145
+ context "when passing in an array of ids" do
146
+
147
+ before do
148
+ @ids = []
149
+ 3.times { @ids << Mongo::ObjectID.new.to_s }
150
+ end
151
+
152
+ it "adds the _id query to the selector" do
153
+ @criteria.id(@ids)
154
+ @criteria.selector.should ==
155
+ { :_id => { "$in" => @ids } }
156
+ end
157
+
158
+ end
159
+
160
+ end
161
+
162
+ describe "#limit" do
163
+
164
+ context "when value provided" do
165
+
166
+ it "adds the limit to the options" do
167
+ @criteria.limit(100)
168
+ @criteria.options.should == { :limit => 100 }
169
+ end
170
+
171
+ end
172
+
173
+ context "when value not provided" do
174
+
175
+ it "defaults to 20" do
176
+ @criteria.limit
177
+ @criteria.options.should == { :limit => 20 }
178
+ end
179
+
180
+ end
181
+
182
+ it "returns self" do
183
+ @criteria.limit.should == @criteria
184
+ end
185
+
186
+ end
187
+
188
+ describe "#offset" do
189
+
190
+ context "when the per_page option exists" do
191
+
192
+ before do
193
+ @criteria = Humanoid::Criteria.new(Person).extras({ :per_page => 20, :page => 3 })
194
+ end
195
+
196
+ it "returns the per_page option" do
197
+ @criteria.offset.should == 40
198
+ end
199
+
200
+ end
201
+
202
+ context "when the skip option exists" do
203
+
204
+ before do
205
+ @criteria = Humanoid::Criteria.new(Person).extras({ :skip => 20 })
206
+ end
207
+
208
+ it "returns the skip option" do
209
+ @criteria.offset.should == 20
210
+ end
211
+
212
+ end
213
+
214
+ context "when an argument is provided" do
215
+
216
+ before do
217
+ @criteria = Humanoid::Criteria.new(Person)
218
+ @criteria.offset(40)
219
+ end
220
+
221
+ it "delegates to skip" do
222
+ @criteria.options[:skip].should == 40
223
+ end
224
+
225
+ end
226
+
227
+ context "when no option exists" do
228
+
229
+ context "when page option exists" do
230
+
231
+ before do
232
+ @criteria = Humanoid::Criteria.new(Person).extras({ :page => 2 })
233
+ end
234
+
235
+ it "adds the skip option to the options and returns it" do
236
+ @criteria.offset.should == 20
237
+ @criteria.options[:skip].should == 20
238
+ end
239
+
240
+ end
241
+
242
+ context "when page option does not exist" do
243
+
244
+ before do
245
+ @criteria = Humanoid::Criteria.new(Person)
246
+ end
247
+
248
+ it "returns nil" do
249
+ @criteria.offset.should be_nil
250
+ @criteria.options[:skip].should be_nil
251
+ end
252
+
253
+ end
254
+
255
+ end
256
+
257
+ end
258
+
259
+ describe "#order_by" do
260
+
261
+ context "when field names and direction specified" do
262
+
263
+ it "adds the sort to the options" do
264
+ @criteria.order_by([[:title, :asc], [:text, :desc]])
265
+ @criteria.options.should == { :sort => [[:title, :asc], [:text, :desc]] }
266
+ end
267
+
268
+ end
269
+
270
+ it "returns self" do
271
+ @criteria.order_by.should == @criteria
272
+ end
273
+
274
+ end
275
+
276
+ describe "#page" do
277
+
278
+ context "when the page option exists" do
279
+
280
+ before do
281
+ @criteria = Humanoid::Criteria.new(Person).extras({ :page => 5 })
282
+ end
283
+
284
+ it "returns the page option" do
285
+ @criteria.page.should == 5
286
+ end
287
+
288
+ end
289
+
290
+ context "when the page option does not exist" do
291
+
292
+ before do
293
+ @criteria = Humanoid::Criteria.new(Person)
294
+ end
295
+
296
+ it "returns 1" do
297
+ @criteria.page.should == 1
298
+ end
299
+
300
+ end
301
+
302
+ end
303
+
304
+ describe "#skip" do
305
+
306
+ context "when value provided" do
307
+
308
+ it "adds the skip value to the options" do
309
+ @criteria.skip(20)
310
+ @criteria.options.should == { :skip => 20 }
311
+ end
312
+
313
+ end
314
+
315
+ context "when value not provided" do
316
+
317
+ it "defaults to zero" do
318
+ @criteria.skip
319
+ @criteria.options.should == { :skip => 0 }
320
+ end
321
+
322
+ end
323
+
324
+ it "returns self" do
325
+ @criteria.skip.should == @criteria
326
+ end
327
+
328
+ end
329
+ end