mongo_record 0.4.4 → 0.5

Sign up to get free protection for your applications and to get access to all the features.
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