mongoid 0.11.8 → 0.11.9

Sign up to get free protection for your applications and to get access to all the features.
data/HISTORY CHANGED
@@ -1,3 +1,22 @@
1
+ === 0.11.9
2
+ - Fixed issue with non-us time zones and formats
3
+ parsing incorrectly.
4
+
5
+ - Fixed error when specifying field restrictions
6
+ in criteria and not providing the _type. It
7
+ will now automaticall get added if it is not
8
+ present.
9
+
10
+ - Slight cleanup of delegated methods in Document.
11
+
12
+ - Dynamic attributes no longer create setters and
13
+ getters on the class. They can be accessed from
14
+ the attributes hash directly. If they are used
15
+ frequently it is preferrable to just add a field
16
+ to the class manually.
17
+
18
+ - Criteria#min no longer always returns 0.0.
19
+
1
20
  === 0.11.8
2
21
  - Added #min and #max to criteria which takes a
3
22
  single field argument.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.11.8
1
+ 0.11.9
@@ -14,10 +14,11 @@ module Mongoid #:nodoc:
14
14
  # put into the document's attributes.
15
15
  def process(attrs = {})
16
16
  attrs.each_pair do |key, value|
17
- unless respond_to?("#{key}=")
18
- self.class.field key, :type => value.class if Mongoid.allow_dynamic_fields
17
+ if Mongoid.allow_dynamic_fields && !respond_to?("#{key}=")
18
+ @attributes[key] = value
19
+ else
20
+ send("#{key}=", value) unless value.blank?
19
21
  end
20
- send("#{key}=", value) unless value.blank?
21
22
  end
22
23
  end
23
24
 
@@ -100,7 +100,7 @@ module Mongoid #:nodoc:
100
100
  #
101
101
  # Returns: <tt>Integer</tt>
102
102
  def count
103
- @count ||= @klass.collection.find(@selector, @options.dup).count
103
+ @count ||= @klass.collection.find(@selector, process_options).count
104
104
  end
105
105
 
106
106
  # Iterate over each +Document+ in the results. This can take an optional
@@ -228,7 +228,7 @@ module Mongoid #:nodoc:
228
228
  #
229
229
  # <tt>Criteria.select(:name).where(:name = "Chrissy").last</tt>
230
230
  def last
231
- opts = @options.dup
231
+ opts = process_options
232
232
  sorting = opts[:sort]
233
233
  sorting = [[:_id, :asc]] unless sorting
234
234
  opts[:sort] = sorting.collect { |option| [ option[0], option[1].invert ] }
@@ -253,6 +253,38 @@ module Mongoid #:nodoc:
253
253
  @options[:limit] = value; self
254
254
  end
255
255
 
256
+ MIN_REDUCE = "function(obj, prev) { if (prev.min == 'start') { prev.min = obj.[field]; } " +
257
+ "if (prev.min > obj.[field]) { prev.min = obj.[field]; } }"
258
+ # Return the min value for a field.
259
+ #
260
+ # This will take the internally built selector and options
261
+ # and pass them on to the Ruby driver's +group()+ method on the collection. The
262
+ # collection itself will be retrieved from the class provided, and once the
263
+ # query has returned it will provided a grouping of keys with sums.
264
+ #
265
+ # Example:
266
+ #
267
+ # <tt>criteria.min(:age)</tt>
268
+ def min(field)
269
+ grouped(:min, field.to_s, MIN_REDUCE)
270
+ end
271
+
272
+ MAX_REDUCE = "function(obj, prev) { if (prev.max == 'start') { prev.max = obj.[field]; } " +
273
+ "if (prev.max < obj.[field]) { prev.max = obj.[field]; } }"
274
+ # Return the max value for a field.
275
+ #
276
+ # This will take the internally built selector and options
277
+ # and pass them on to the Ruby driver's +group()+ method on the collection. The
278
+ # collection itself will be retrieved from the class provided, and once the
279
+ # query has returned it will provided a grouping of keys with sums.
280
+ #
281
+ # Example:
282
+ #
283
+ # <tt>criteria.max(:age)</tt>
284
+ def max(field)
285
+ grouped(:max, field.to_s, MAX_REDUCE)
286
+ end
287
+
256
288
  # Merges another object into this +Criteria+. The other object may be a
257
289
  # +Criteria+ or a +Hash+. This is used to combine multiple scopes together,
258
290
  # where a chained scope situation may be desired.
@@ -340,7 +372,7 @@ module Mongoid #:nodoc:
340
372
  #
341
373
  # <tt>Criteria.select(:name).where(:name = "Chrissy").one</tt>
342
374
  def one
343
- attributes = @klass.collection.find_one(@selector, @options.dup)
375
+ attributes = @klass.collection.find_one(@selector, process_options)
344
376
  attributes ? attributes["_type"].constantize.instantiate(attributes) : nil
345
377
  end
346
378
 
@@ -421,7 +453,7 @@ module Mongoid #:nodoc:
421
453
  @options[:skip] = value; self
422
454
  end
423
455
 
424
- SUM_REDUCE = "function(obj, prev) { prev.sum += obj.[field]; }"
456
+ SUM_REDUCE = "function(obj, prev) { if (prev.sum == 'start') { prev.sum = 0; } prev.sum += obj.[field]; }"
425
457
  # Sum the criteria.
426
458
  #
427
459
  # This will take the internally built selector and options
@@ -436,36 +468,6 @@ module Mongoid #:nodoc:
436
468
  grouped(:sum, field.to_s, SUM_REDUCE)
437
469
  end
438
470
 
439
- MIN_REDUCE = "function(obj, prev) { if (prev.max > obj.[field]) { prev.max = obj.[field]; } }"
440
- # Return the min value for a field.
441
- #
442
- # This will take the internally built selector and options
443
- # and pass them on to the Ruby driver's +group()+ method on the collection. The
444
- # collection itself will be retrieved from the class provided, and once the
445
- # query has returned it will provided a grouping of keys with sums.
446
- #
447
- # Example:
448
- #
449
- # <tt>criteria.min(:age)</tt>
450
- def min(field)
451
- grouped(:min, field.to_s, MIN_REDUCE)
452
- end
453
-
454
- MAX_REDUCE = "function(obj, prev) { if (prev.max < obj.[field]) { prev.max = obj.[field]; } }"
455
- # Return the max value for a field.
456
- #
457
- # This will take the internally built selector and options
458
- # and pass them on to the Ruby driver's +group()+ method on the collection. The
459
- # collection itself will be retrieved from the class provided, and once the
460
- # query has returned it will provided a grouping of keys with sums.
461
- #
462
- # Example:
463
- #
464
- # <tt>criteria.max(:age)</tt>
465
- def max(field)
466
- grouped(:max, field.to_s, MAX_REDUCE)
467
- end
468
-
469
471
  # Translate the supplied arguments into a +Criteria+ object.
470
472
  #
471
473
  # If the passed in args is a single +String+, then it will
@@ -535,7 +537,7 @@ module Mongoid #:nodoc:
535
537
  # If this is a +Criteria+ to find multiple results, will return an +Array+ of
536
538
  # objects of the type of class provided.
537
539
  def execute
538
- attributes = @klass.collection.find(@selector, @options.dup)
540
+ attributes = @klass.collection.find(@selector, process_options)
539
541
  if attributes
540
542
  @count = attributes.count
541
543
  attributes.collect { |doc| doc["_type"].constantize.instantiate(doc) }
@@ -544,6 +546,17 @@ module Mongoid #:nodoc:
544
546
  end
545
547
  end
546
548
 
549
+ # Filters the field list. If no fields have been supplied, then it will be
550
+ # empty. If fields have been defined then _type will be included as well.
551
+ def process_options
552
+ fields = @options[:fields]
553
+ if fields && fields.size > 0 && !fields.include?(:_type)
554
+ fields << :_type
555
+ @options[:fields] = fields
556
+ end
557
+ @options.dup
558
+ end
559
+
547
560
  # Filters the unused options out of the options +Hash+. Currently this
548
561
  # takes into account the "page" and "per_page" options that would be passed
549
562
  # in if using will_paginate.
@@ -556,23 +569,24 @@ module Mongoid #:nodoc:
556
569
  end
557
570
  end
558
571
 
559
- # Update the selector setting the operator on the value for each key in the
560
- # supplied attributes +Hash+.
561
- def update_selector(attributes, operator)
562
- attributes.each { |key, value| @selector[key] = { operator => value } }; self
563
- end
564
-
565
572
  # Common functionality for grouping operations. Currently used by min, max
566
573
  # and sum. Will gsub the field name in the supplied reduce function.
567
574
  def grouped(start, field, reduce)
568
575
  collection = @klass.collection.group(
569
576
  nil,
570
577
  @selector,
571
- { start => 0 },
578
+ { start => "start" },
572
579
  reduce.gsub("[field]", field),
573
580
  true
574
581
  )
575
582
  collection.first[start.to_s]
576
583
  end
584
+
585
+ # Update the selector setting the operator on the value for each key in the
586
+ # supplied attributes +Hash+.
587
+ def update_selector(attributes, operator)
588
+ attributes.each { |key, value| @selector[key] = { operator => value } }; self
589
+ end
590
+
577
591
  end
578
592
  end
@@ -28,7 +28,7 @@ module Mongoid #:nodoc:
28
28
  attr_accessor :association_name, :_parent
29
29
  attr_reader :attributes, :new_record
30
30
 
31
- delegate :collection, :defaults, :embedded?, :fields, :primary_key, :to => :klass
31
+ delegate :collection, :defaults, :embedded?, :fields, :primary_key, :to => "self.class"
32
32
 
33
33
  # Define all the callbacks that are accepted by the document.
34
34
  define_callbacks :before_create, :before_destroy, :before_save, :before_update, :before_validation
@@ -348,11 +348,6 @@ module Mongoid #:nodoc:
348
348
  @attributes[:_type] ||= self.class.name
349
349
  end
350
350
 
351
- # Convenience method to get the document's class
352
- def klass
353
- self.class
354
- end
355
-
356
351
  end
357
352
 
358
353
  end
@@ -5,12 +5,12 @@ module Mongoid #:nodoc:
5
5
  module Conversions #:nodoc:
6
6
  def set(value)
7
7
  return nil if value.blank?
8
- time = ::Time.parse(value.to_s)
8
+ time = ::Time.parse(value.is_a?(::Time) ? value.strftime("%Y-%m-%d %H:%M:%S %Z") : value.to_s)
9
9
  time.utc? ? time : time.utc
10
10
  end
11
11
  def get(value)
12
12
  return nil if value.blank?
13
- ::Time.zone ? ::Time.zone.parse(value.to_s).getlocal : value
13
+ ::Time.zone ? value.getlocal : value
14
14
  end
15
15
  end
16
16
  end
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{mongoid}
8
- s.version = "0.11.8"
8
+ s.version = "0.11.9"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Durran Jordan"]
12
- s.date = %q{2010-01-06}
12
+ s.date = %q{2010-01-07}
13
13
  s.email = %q{durran@gmail.com}
14
14
  s.extra_rdoc_files = [
15
15
  "README.textile"
@@ -14,8 +14,8 @@ describe Mongoid::Criteria do
14
14
  Person.delete_all
15
15
  end
16
16
 
17
- it "provides sums for all the fields provided" do
18
- Person.criteria.max(:age).should == 90.0
17
+ it "provides max for the field provided" do
18
+ Person.max(:age).should == 90.0
19
19
  end
20
20
 
21
21
  end
@@ -24,7 +24,7 @@ describe Mongoid::Criteria do
24
24
 
25
25
  before do
26
26
  10.times do |n|
27
- Person.create(:title => "Sir", :age => (n * 10), :aliases => ["D", "Durran"])
27
+ Person.create(:title => "Sir", :age => ((n + 1) * 10), :aliases => ["D", "Durran"])
28
28
  end
29
29
  end
30
30
 
@@ -32,8 +32,8 @@ describe Mongoid::Criteria do
32
32
  Person.delete_all
33
33
  end
34
34
 
35
- it "provides sums for all the fields provided" do
36
- Person.criteria.min(:age).should == 0.0
35
+ it "provides min for the field provided" do
36
+ Person.min(:age).should == 10.0
37
37
  end
38
38
 
39
39
  end
@@ -50,7 +50,7 @@ describe Mongoid::Criteria do
50
50
  Person.delete_all
51
51
  end
52
52
 
53
- it "provides sums for all the fields provided" do
53
+ it "provides sum for the field provided" do
54
54
  Person.where(:age.gt => 3).sum(:age).should == 50.0
55
55
  end
56
56
 
@@ -193,6 +193,15 @@ describe Mongoid::Document do
193
193
 
194
194
  end
195
195
 
196
+ context "limiting result fields" do
197
+
198
+ it "adds the type field to the options" do
199
+ people = Person.all(:fields => [ :title ])
200
+ people.first.title.should == "Test"
201
+ end
202
+
203
+ end
204
+
196
205
  end
197
206
 
198
207
  describe "#find_by_id" do
@@ -48,10 +48,11 @@ class Person
48
48
  accepts_nested_attributes_for :addresses, :reject_if => lambda { |attrs| attrs["street"].blank? }
49
49
  accepts_nested_attributes_for :name
50
50
 
51
- index :title
52
- index :dob
51
+ index :age
53
52
  index :addresses
53
+ index :dob
54
54
  index :name
55
+ index :title
55
56
 
56
57
  has_one_related :game
57
58
  has_many_related :posts
@@ -111,20 +111,15 @@ describe Mongoid::Attributes do
111
111
  context "when attribute is a string" do
112
112
 
113
113
  it "adds a string field" do
114
- @person.nofieldstring.should == "Testing"
115
- @person.nofieldstring = "Test"
116
- @person.nofieldstring.should == "Test"
114
+ @person.attributes[:nofieldstring].should == "Testing"
117
115
  end
118
116
 
119
117
  end
120
118
 
121
-
122
119
  context "when attribute is not a string" do
123
120
 
124
121
  it "adds a properly typed field" do
125
- @person.nofieldint.should == 5
126
- @person.nofieldint = 50
127
- @person.nofieldint.should == 50
122
+ @person.attributes[:nofieldint].should == 5
128
123
  end
129
124
 
130
125
  end
@@ -495,7 +495,7 @@ describe Mongoid::Criteria do
495
495
  describe "#max" do
496
496
 
497
497
  before do
498
- @reduce = "function(obj, prev) { if (prev.max < obj.age) { prev.max = obj.age; } }"
498
+ @reduce = Mongoid::Criteria::MAX_REDUCE.gsub("[field]", "age")
499
499
  @collection = mock
500
500
  Person.expects(:collection).returns(@collection)
501
501
  end
@@ -504,7 +504,7 @@ describe Mongoid::Criteria do
504
504
  @collection.expects(:group).with(
505
505
  nil,
506
506
  {:_type => { "$in" => ["Doctor", "Person"] } },
507
- {:max => 0},
507
+ {:max => "start"},
508
508
  @reduce,
509
509
  true
510
510
  ).returns([{"max" => 200.0}])
@@ -615,7 +615,7 @@ describe Mongoid::Criteria do
615
615
  describe "#min" do
616
616
 
617
617
  before do
618
- @reduce = "function(obj, prev) { if (prev.max > obj.age) { prev.max = obj.age; } }"
618
+ @reduce = Mongoid::Criteria::MIN_REDUCE.gsub("[field]", "age")
619
619
  @collection = mock
620
620
  Person.expects(:collection).returns(@collection)
621
621
  end
@@ -624,7 +624,7 @@ describe Mongoid::Criteria do
624
624
  @collection.expects(:group).with(
625
625
  nil,
626
626
  {:_type => { "$in" => ["Doctor", "Person"] } },
627
- {:min => 0},
627
+ {:min => "start"},
628
628
  @reduce,
629
629
  true
630
630
  ).returns([{"min" => 4.0}])
@@ -891,7 +891,7 @@ describe Mongoid::Criteria do
891
891
  context "when klass not provided" do
892
892
 
893
893
  before do
894
- @reduce = "function(obj, prev) { prev.sum += obj.age; }"
894
+ @reduce = Mongoid::Criteria::SUM_REDUCE.gsub("[field]", "age")
895
895
  @collection = mock
896
896
  Person.expects(:collection).returns(@collection)
897
897
  end
@@ -900,7 +900,7 @@ describe Mongoid::Criteria do
900
900
  @collection.expects(:group).with(
901
901
  nil,
902
902
  {:_type => { "$in" => ["Doctor", "Person"] } },
903
- {:sum => 0},
903
+ {:sum => "start"},
904
904
  @reduce,
905
905
  true
906
906
  ).returns([{"sum" => 50.0}])
@@ -3,7 +3,7 @@ require "spec_helper"
3
3
  describe Mongoid::Extensions::Time::Conversions do
4
4
 
5
5
  before do
6
- Time.zone = "Eastern Time (US & Canada)"
6
+ Time.zone = "Canberra"
7
7
  @time = Time.local(1976, 11, 19)
8
8
  end
9
9
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mongoid
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.11.8
4
+ version: 0.11.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Durran Jordan
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2010-01-06 00:00:00 -05:00
12
+ date: 2010-01-07 00:00:00 -05:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency