mongo_record 0.4.4 → 0.5

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/Rakefile CHANGED
@@ -23,9 +23,9 @@ namespace :gem do
23
23
  desc "Install the gem locally"
24
24
  task :install do
25
25
  sh <<EOS
26
- gem build mongo-activerecord-ruby.gemspec &&
27
- sudo gem install mongo_record*.gem &&
28
- rm mongo_record-*.gem
26
+ gem build mongo-record.gemspec &&
27
+ gem install mongo_record*.gem &&
28
+ rm mongo_record*.gem
29
29
  EOS
30
30
  end
31
31
 
@@ -1,4 +1,4 @@
1
- # Copyright 2009 10gen, Inc.
1
+ # Copyright 2009-2010 10gen, Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -13,26 +13,8 @@
13
13
  # limitations under the License.
14
14
 
15
15
  require 'rubygems'
16
- require 'mongo/types/objectid'
17
- require 'mongo/types/code'
18
- require 'mongo/cursor'
19
- require 'mongo_record/convert'
16
+ require 'mongo_record/core_ext'
20
17
  require 'mongo_record/sql'
21
- #require 'active_support/core_ext' # symbolize_keys!
22
-
23
- class String
24
- # Convert this String to an ObjectID.
25
- def to_oid
26
- Mongo::ObjectID.legal?(self) ? Mongo::ObjectID.from_string(self) : self
27
- end
28
- end
29
-
30
- class Mongo::ObjectID
31
- # Convert this object to an ObjectID.
32
- def to_oid
33
- self
34
- end
35
- end
36
18
 
37
19
  module MongoRecord
38
20
 
@@ -40,7 +22,7 @@ module MongoRecord
40
22
  def create_pk(row)
41
23
  return row if row[:_id]
42
24
  row.delete(:_id) # in case it is nil
43
- row['_id'] ||= Mongo::ObjectID.new
25
+ row['_id'] ||= BSON::ObjectID.new
44
26
  row
45
27
  end
46
28
  end
@@ -152,9 +134,8 @@ module MongoRecord
152
134
  # or an array of fields ([:title, :author, :date])
153
135
  # or an array of a field name and direction ([:title, :asc] or [:title, :desc])
154
136
  # or an array of field names and directions ([[:title, :asc], [:author, :desc]])
155
- # +unique+ should be true or false and indicates whether this index
156
- # should enforce a uniqueness constraint.
157
- def index(fields, unique = false)
137
+ # +options+ Same as options for create index in the ruby driver
138
+ def index(fields, options={})
158
139
  fields = Array(fields)
159
140
 
160
141
  if fields.length == 2 &&
@@ -169,7 +150,7 @@ module MongoRecord
169
150
  field
170
151
  end
171
152
 
172
- collection.create_index(fields, unique)
153
+ collection.create_index(fields, options)
173
154
  end
174
155
 
175
156
  # Returns list of indexes for model, unless fields are passed.
@@ -321,9 +302,6 @@ module MongoRecord
321
302
  # Person.find(:all, :offset => 10, :limit => 10, :order => :created_on)
322
303
  # is the same as
323
304
  # Person.find(:all).skip(10).limit(10).sort({:created_on => 1})
324
- #
325
-
326
-
327
305
  def find(*args)
328
306
  options = extract_options_from_args!(args)
329
307
  options.symbolize_keys!
@@ -525,7 +503,7 @@ module MongoRecord
525
503
  cursor = find_every(options)
526
504
  one = cursor.detect {|c| c}
527
505
  cursor.close
528
- one
506
+ one.nil? ? nil : new(one)
529
507
  end
530
508
 
531
509
  def find_every(options)
@@ -534,14 +512,15 @@ module MongoRecord
534
512
 
535
513
  find_options = {}
536
514
  find_options[:fields] = fields_from(options[:select]) if options[:select]
537
- find_options[:limit] = options[:limit].to_i if options[:limit]
515
+ find_options[:limit] = options[:limit].to_i if options[:limit]
538
516
  find_options[:offset] = options[:offset].to_i if options[:offset]
539
- find_options[:sort] = sort_by_from(options[:order]) if options[:order]
517
+ find_options[:hint] = options[:hint] if options[:hint]
518
+ find_options[:sort] = sort_by_from(options[:order]) if options[:order]
540
519
 
541
520
  cursor = collection.find(criteria, find_options)
542
521
 
543
522
  # Override cursor.next_object so it returns a new instance of this class
544
- eval "def cursor.next_object; #{self.name}.new(super()); end"
523
+ eval "def cursor.next_document; #{self.name}.new(super()); end"
545
524
  cursor
546
525
  end
547
526
 
@@ -670,7 +649,7 @@ module MongoRecord
670
649
  # +func+ must be +nil+ or a JavaScript expression or function in a
671
650
  # string.
672
651
  def where_func(func) # :nodoc:
673
- func ? {'$where' => Mongo::Code.new(func)} : {}
652
+ func ? {'$where' => BSON::Code.new(func)} : {}
674
653
  end
675
654
 
676
655
  def replace_named_bind_variables(str, h) # :nodoc:
@@ -870,11 +849,11 @@ module MongoRecord
870
849
  key_names.each {|key|
871
850
  value = instance_variable_get("@#{key}").to_mongo_value
872
851
  if value.instance_of? Hash and value["_ns"]
873
- value = Mongo::DBRef.new(value["_ns"], value["_id"])
852
+ value = BSON::DBRef.new(value["_ns"], value["_id"])
874
853
  elsif value.instance_of? Array
875
854
  value = value.map {|v|
876
855
  if v.instance_of? Hash and v["_ns"]
877
- Mongo::DBRef.new(v["_ns"], v["_id"])
856
+ BSON::DBRef.new(v["_ns"], v["_id"])
878
857
  else
879
858
  v
880
859
  end
@@ -1011,7 +990,7 @@ module MongoRecord
1011
990
  def init_ivar(ivar_name, val)
1012
991
  sym = ivar_name[1..-1].to_sym
1013
992
  if self.class.subobjects.keys.include?(sym)
1014
- if val.instance_of? Mongo::DBRef
993
+ if val.instance_of? BSON::DBRef
1015
994
  val = self.class.collection.db.dereference(val)
1016
995
  end
1017
996
  instance_variable_set(ivar_name, self.class.subobjects[sym].new(val))
@@ -1019,7 +998,7 @@ module MongoRecord
1019
998
  klazz = self.class.arrays[sym]
1020
999
  val = [val] unless val.kind_of?(Array)
1021
1000
  instance_variable_set(ivar_name, val.collect {|v|
1022
- if v.instance_of? Mongo::DBRef
1001
+ if v.instance_of? BSON::DBRef
1023
1002
  v = self.class.collection.db.dereference(v)
1024
1003
  end
1025
1004
  v.kind_of?(MongoRecord::Base) ? v : klazz.new(v)
@@ -1,4 +1,4 @@
1
- # Copyright 2009 10gen, Inc.
1
+ # Copyright 2009-2010 10gen, Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -62,3 +62,19 @@ class Hash
62
62
  self.replace(self.symbolize_keys)
63
63
  end
64
64
  end
65
+
66
+ class String
67
+
68
+ # Convert this String to an ObjectID.
69
+ def to_oid
70
+ BSON::ObjectID.legal?(self) ? BSON::ObjectID.from_string(self) : self
71
+ end
72
+ end
73
+
74
+ class BSON::ObjectID
75
+
76
+ # Convert this object to an ObjectID.
77
+ def to_oid
78
+ self
79
+ end
80
+ end
@@ -1,4 +1,4 @@
1
- # Copyright 2009 10gen, Inc.
1
+ # Copyright 2009-2010 10gen, Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright 2009 10gen, Inc.
1
+ # Copyright 2009-2010 10gen, Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright 2009 10gen, Inc.
1
+ # Copyright 2009-2010 10gen, Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
data/lib/mongo_record.rb CHANGED
@@ -1,4 +1,4 @@
1
- # Copyright 2009 10gen, Inc.
1
+ # Copyright 2009-2010 10gen, Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,22 +1,22 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'mongo_record'
3
- s.version = '0.4.4'
3
+ s.version = '0.5'
4
4
  s.platform = Gem::Platform::RUBY
5
- s.summary = 'ActiveRecord-like models for the MongoDB'
6
- s.description = 'MongoRecord is an ActiveRecord-like framework for MongoDB. For more information about Mongo, see http://www.mongodb.org.'
5
+ s.summary = 'ActiveRecord-like models for MongoDB'
6
+ s.description = 'MongoRecord is an ActiveRecord-like framework for MongoDB. For more information about MongoDB, see http://www.mongodb.org.'
7
7
 
8
- s.add_dependency('mongo', ['>= 0.15.1'])
8
+ s.add_dependency('mongo', ['>= 0.20.1'])
9
9
 
10
10
  s.require_paths = ['lib']
11
11
 
12
12
  s.files = ['examples/tracks.rb', 'lib/mongo_record.rb',
13
13
  'lib/mongo_record/base.rb',
14
- 'lib/mongo_record/convert.rb',
14
+ 'lib/mongo_record/core_ext.rb',
15
15
  'lib/mongo_record/log_device.rb',
16
16
  'lib/mongo_record/sql.rb',
17
17
  'lib/mongo_record/subobject.rb',
18
18
  'README.rdoc', 'Rakefile',
19
- 'mongo-activerecord-ruby.gemspec',
19
+ 'mongo-record.gemspec',
20
20
  'LICENSE']
21
21
  s.test_files = ['tests/address.rb',
22
22
  'tests/course.rb',
@@ -1,4 +1,4 @@
1
- # Copyright 2009 10gen, Inc.
1
+ # Copyright 2009-2010 10gen, Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
data/tests/test_mongo.rb CHANGED
@@ -1,4 +1,4 @@
1
- # Copyright 2009 10gen, Inc.
1
+ # Copyright 2009-2010 10gen, Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -65,13 +65,13 @@ class MongoTest < Test::Unit::TestCase
65
65
  @@playlists.remove
66
66
 
67
67
  # Manually insert data without using MongoRecord::Base
68
- @@tracks.insert({:_id => Mongo::ObjectID.new, :artist => 'Thomas Dolby', :album => 'Aliens Ate My Buick', :song => 'The Ability to Swing'})
69
- @@tracks.insert({:_id => Mongo::ObjectID.new, :artist => 'Thomas Dolby', :album => 'Aliens Ate My Buick', :song => 'Budapest by Blimp'})
70
- @@tracks.insert({:_id => Mongo::ObjectID.new, :artist => 'Thomas Dolby', :album => 'The Golden Age of Wireless', :song => 'Europa and the Pirate Twins'})
71
- @@tracks.insert({:_id => Mongo::ObjectID.new, :artist => 'XTC', :album => 'Oranges & Lemons', :song => 'Garden Of Earthly Delights', :track => 1})
72
- @mayor_id = Mongo::ObjectID.new
68
+ @@tracks.insert({:_id => BSON::ObjectID.new, :artist => 'Thomas Dolby', :album => 'Aliens Ate My Buick', :song => 'The Ability to Swing'})
69
+ @@tracks.insert({:_id => BSON::ObjectID.new, :artist => 'Thomas Dolby', :album => 'Aliens Ate My Buick', :song => 'Budapest by Blimp'})
70
+ @@tracks.insert({:_id => BSON::ObjectID.new, :artist => 'Thomas Dolby', :album => 'The Golden Age of Wireless', :song => 'Europa and the Pirate Twins'})
71
+ @@tracks.insert({:_id => BSON::ObjectID.new, :artist => 'XTC', :album => 'Oranges & Lemons', :song => 'Garden Of Earthly Delights', :track => 1})
72
+ @mayor_id = BSON::ObjectID.new
73
73
  @@tracks.insert({:_id => @mayor_id, :artist => 'XTC', :album => 'Oranges & Lemons', :song => 'The Mayor Of Simpleton', :track => 2})
74
- @@tracks.insert({:_id => Mongo::ObjectID.new, :artist => 'XTC', :album => 'Oranges & Lemons', :song => 'King For A Day', :track => 3})
74
+ @@tracks.insert({:_id => BSON::ObjectID.new, :artist => 'XTC', :album => 'Oranges & Lemons', :song => 'King For A Day', :track => 3})
75
75
 
76
76
  @mayor_str = "artist: XTC, album: Oranges & Lemons, song: The Mayor Of Simpleton, track: 2"
77
77
  @mayor_song = 'The Mayor Of Simpleton'
@@ -323,6 +323,16 @@ class MongoTest < Test::Unit::TestCase
323
323
  assert_equal(x.id, z.id)
324
324
  end
325
325
 
326
+ def test_find_with_hint
327
+ @@tracks.create_index([['artist', 1]])
328
+ assert_equal "BtreeCursor artist_1",
329
+ Track.find(:all, :conditions => {:artist => 'XTC'}).explain["cursor"]
330
+
331
+ assert_equal "BasicCursor",
332
+ Track.find(:all, :hint => {'$natural' => 1},
333
+ :conditions => {:artist => 'XTC'}).explain["cursor"]
334
+ end
335
+
326
336
  def test_find_or_create_but_already_exists
327
337
  assert_equal("artist: Thomas Dolby, album: Aliens Ate My Buick, song: The Ability to Swing, track: ",
328
338
  Track.find_or_create_by_song('The Ability to Swing', :artist => 'ignored because song found').to_s)
@@ -404,7 +414,6 @@ class MongoTest < Test::Unit::TestCase
404
414
  assert_no_match(/song: Budapest by Blimp/, Track.all.inject('') { |str, t| str + t.to_s })
405
415
 
406
416
  assert_equal 6, Track.count
407
- Track.index [:song, :desc], true # reindex
408
417
  end
409
418
 
410
419
  def test_delete_all
@@ -447,9 +456,8 @@ class MongoTest < Test::Unit::TestCase
447
456
  t = Track.find_by_song('King For A Day')
448
457
  tid = t._id
449
458
  # first is string id, second is ObjectID
450
- str = Track.find([@mayor_id, tid]).inject('') { |str, t| str + t.to_s }
451
- assert str.include?(@mayor_str)
452
- assert str.include?('King For A Day')
459
+ records = Track.find([@mayor_id, tid]).to_a
460
+ assert_equal 2, records.size
453
461
  end
454
462
 
455
463
  def test_find_one_using_id
@@ -890,7 +898,7 @@ class MongoTest < Test::Unit::TestCase
890
898
  def test_indexing
891
899
  Track.index :artist
892
900
  Track.index [:artist, :created_at]
893
- Track.index [:song, :desc], true
901
+ Track.index [:song, :desc], :unique => true
894
902
  Track.index [:artist, [:album, :desc]]
895
903
  Track.index [:created_at, Mongo::ASCENDING]
896
904
 
data/tests/test_sql.rb CHANGED
@@ -1,4 +1,4 @@
1
- # Copyright 2009 10gen, Inc.
1
+ # Copyright 2009-2010 10gen, Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
metadata CHANGED
@@ -1,7 +1,11 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mongo_record
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.4
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 5
8
+ version: "0.5"
5
9
  platform: ruby
6
10
  authors:
7
11
  - Jim Menard
@@ -10,20 +14,24 @@ autorequire:
10
14
  bindir: bin
11
15
  cert_chain: []
12
16
 
13
- date: 2009-12-29 00:00:00 -05:00
17
+ date: 2010-04-27 00:00:00 -04:00
14
18
  default_executable:
15
19
  dependencies:
16
20
  - !ruby/object:Gem::Dependency
17
21
  name: mongo
18
- type: :runtime
19
- version_requirement:
20
- version_requirements: !ruby/object:Gem::Requirement
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
21
24
  requirements:
22
25
  - - ">="
23
26
  - !ruby/object:Gem::Version
24
- version: 0.15.1
25
- version:
26
- description: MongoRecord is an ActiveRecord-like framework for MongoDB. For more information about Mongo, see http://www.mongodb.org.
27
+ segments:
28
+ - 0
29
+ - 20
30
+ - 1
31
+ version: 0.20.1
32
+ type: :runtime
33
+ version_requirements: *id001
34
+ description: MongoRecord is an ActiveRecord-like framework for MongoDB. For more information about MongoDB, see http://www.mongodb.org.
27
35
  email: mongodb-user@googlegroups.com
28
36
  executables: []
29
37
 
@@ -35,13 +43,13 @@ files:
35
43
  - examples/tracks.rb
36
44
  - lib/mongo_record.rb
37
45
  - lib/mongo_record/base.rb
38
- - lib/mongo_record/convert.rb
46
+ - lib/mongo_record/core_ext.rb
39
47
  - lib/mongo_record/log_device.rb
40
48
  - lib/mongo_record/sql.rb
41
49
  - lib/mongo_record/subobject.rb
42
50
  - README.rdoc
43
51
  - Rakefile
44
- - mongo-activerecord-ruby.gemspec
52
+ - mongo-record.gemspec
45
53
  - LICENSE
46
54
  has_rdoc: true
47
55
  homepage: http://www.mongodb.org
@@ -58,21 +66,23 @@ required_ruby_version: !ruby/object:Gem::Requirement
58
66
  requirements:
59
67
  - - ">="
60
68
  - !ruby/object:Gem::Version
69
+ segments:
70
+ - 0
61
71
  version: "0"
62
- version:
63
72
  required_rubygems_version: !ruby/object:Gem::Requirement
64
73
  requirements:
65
74
  - - ">="
66
75
  - !ruby/object:Gem::Version
76
+ segments:
77
+ - 0
67
78
  version: "0"
68
- version:
69
79
  requirements: []
70
80
 
71
81
  rubyforge_project:
72
- rubygems_version: 1.3.5
82
+ rubygems_version: 1.3.6
73
83
  signing_key:
74
84
  specification_version: 3
75
- summary: ActiveRecord-like models for the MongoDB
85
+ summary: ActiveRecord-like models for MongoDB
76
86
  test_files:
77
87
  - tests/address.rb
78
88
  - tests/course.rb