mongo_mapper-unstable 2010.2.8 → 2010.2.9

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 2010.02.08
1
+ 2010.02.09
@@ -43,7 +43,7 @@ module MongoMapper
43
43
  name_or_array
44
44
  end
45
45
 
46
- MongoMapper.ensure_index(self, keys_to_index, options)
46
+ collection.create_index(keys_to_index, options[:unique])
47
47
  end
48
48
 
49
49
  def find(*args)
data/lib/mongo_mapper.rb CHANGED
@@ -17,83 +17,93 @@ require 'validatable'
17
17
  module MongoMapper
18
18
  # generic MM error
19
19
  class MongoMapperError < StandardError; end
20
-
20
+
21
21
  # raised when key expected to exist but not found
22
22
  class KeyNotFound < MongoMapperError; end
23
-
23
+
24
24
  # raised when document expected but not found
25
25
  class DocumentNotFound < MongoMapperError; end
26
-
26
+
27
27
  # raised when document not valid and using !
28
28
  class DocumentNotValid < MongoMapperError
29
29
  def initialize(document)
30
30
  super("Validation failed: #{document.errors.full_messages.join(", ")}")
31
31
  end
32
32
  end
33
-
33
+
34
34
  # @api public
35
35
  def self.connection
36
36
  @@connection ||= Mongo::Connection.new
37
37
  end
38
-
38
+
39
39
  # @api public
40
40
  def self.connection=(new_connection)
41
41
  @@connection = new_connection
42
42
  end
43
-
43
+
44
44
  # @api public
45
45
  def self.logger
46
46
  connection.logger
47
47
  end
48
-
48
+
49
49
  # @api public
50
50
  def self.database=(name)
51
51
  @@database = nil
52
52
  @@database_name = name
53
53
  end
54
-
54
+
55
55
  # @api public
56
56
  def self.database
57
57
  if @@database_name.blank?
58
58
  raise 'You forgot to set the default database name: MongoMapper.database = "foobar"'
59
59
  end
60
-
60
+
61
61
  @@database ||= MongoMapper.connection.db(@@database_name)
62
62
  end
63
-
64
- # @api private
65
- def self.ensured_indexes
66
- @@ensured_indexes ||= []
63
+
64
+ def self.config=(hash)
65
+ @@config = hash
67
66
  end
68
-
69
- # @api private
70
- def self.ensured_indexes=(value)
71
- @@ensured_indexes = value
67
+
68
+ def self.config
69
+ raise 'Set config before connecting. MongoMapper.config = {...}' unless defined?(@@config)
70
+ @@config
72
71
  end
73
-
74
- # @api private
75
- def self.ensure_index(klass, keys, options={})
76
- ensured_indexes << {:klass => klass, :keys => keys, :options => options}
72
+
73
+ def self.connect(environment, options={})
74
+ raise 'Set config before connecting. MongoMapper.config = {...}' if config.blank?
75
+ MongoMapper.connection = Mongo::Connection.new(config[environment]['host'], config[environment]['port'], options)
76
+ MongoMapper.database = config[environment]['database']
77
+ if config[environment]['username'].present? && config[environment]['password'].present?
78
+ MongoMapper.database.authenticate(config[environment]['username'], config[environment]['password'])
79
+ end
77
80
  end
78
-
79
- # @api public
80
- def self.ensure_indexes!
81
- ensured_indexes.each do |index|
82
- unique = index[:options].delete(:unique)
83
- index[:klass].collection.create_index(index[:keys], unique)
81
+
82
+ def self.setup(config, environment, options={})
83
+ using_passenger = options.delete(:passenger)
84
+ handle_passenger_forking if using_passenger
85
+ self.config = config
86
+ connect(environment, options)
87
+ end
88
+
89
+ def self.handle_passenger_forking
90
+ if defined?(PhusionPassenger)
91
+ PhusionPassenger.on_event(:starting_worker_process) do |forked|
92
+ connection.connect_to_master if forked
93
+ end
84
94
  end
85
95
  end
86
-
96
+
87
97
  # @api private
88
98
  def self.use_time_zone?
89
99
  Time.respond_to?(:zone) && Time.zone ? true : false
90
100
  end
91
-
101
+
92
102
  # @api private
93
103
  def self.time_class
94
104
  use_time_zone? ? Time.zone : Time
95
105
  end
96
-
106
+
97
107
  # @api private
98
108
  def self.normalize_object_id(value)
99
109
  value.is_a?(String) ? Mongo::ObjectID.from_string(value) : value
@@ -778,68 +778,55 @@ class DocumentTest < Test::Unit::TestCase
778
778
 
779
779
  context "#save (with options)" do
780
780
  setup do
781
- MongoMapper.ensured_indexes = []
782
-
783
781
  @document = Doc do
784
782
  key :name, String
785
783
  set_collection_name 'test_indexes'
786
- ensure_index :name, :unique => true
787
- end
788
- if @document.database.collection_names.include?(@document.collection.name)
789
- @document.collection.drop_indexes
790
784
  end
791
-
792
- MongoMapper.ensure_indexes!
785
+ drop_indexes(@document)
786
+ @document.ensure_index :name, :unique => true
793
787
  end
794
-
788
+
795
789
  should "allow passing safe" do
796
- doc = @document.new(:name => 'John')
797
- doc.save
798
-
790
+ @document.create(:name => 'John')
799
791
  assert_raises(Mongo::OperationFailure) do
800
792
  @document.new(:name => 'John').save(:safe => true)
801
793
  end
802
794
  end
803
-
795
+
804
796
  should "raise argument error if options has unsupported key" do
805
- doc = @document.new
806
- assert_raises(ArgumentError) { doc.save(:foo => true) }
797
+ assert_raises(ArgumentError) do
798
+ @document.new.save(:foo => true)
799
+ end
807
800
  end
808
801
  end
809
802
 
810
803
  context "#save! (with options)" do
811
804
  setup do
812
- MongoMapper.ensured_indexes = []
813
-
814
805
  @document = Doc do
815
806
  key :name, String
816
807
  set_collection_name 'test_indexes'
817
- ensure_index :name, :unique => true
818
808
  end
819
-
820
- if @document.database.collection_names.include?(@document.collection.name)
821
- @document.collection.drop_indexes
822
- end
823
-
824
- MongoMapper.ensure_indexes!
809
+ drop_indexes(@document)
810
+ @document.ensure_index :name, :unique => true
825
811
  end
826
-
812
+
827
813
  should "allow passing safe" do
828
- doc = @document.create(:name => 'John')
829
-
814
+ @document.create(:name => 'John')
830
815
  assert_raises(Mongo::OperationFailure) do
831
816
  @document.new(:name => 'John').save!(:safe => true)
832
817
  end
833
818
  end
834
-
819
+
835
820
  should "raise argument error if options has unsupported key" do
836
- doc = @document.new
837
- assert_raises(ArgumentError) { doc.save!(:foo => true) }
821
+ assert_raises(ArgumentError) do
822
+ @document.new.save!(:foo => true)
823
+ end
838
824
  end
839
-
825
+
840
826
  should "raise argument error if using validate as that would be pointless with save!" do
841
- doc = @document.new
842
- assert_raises(ArgumentError) { doc.save!(:validate => false) }
827
+ assert_raises(ArgumentError) do
828
+ @document.new.save!(:validate => false)
829
+ end
843
830
  end
844
831
  end
845
832
 
@@ -1224,28 +1211,22 @@ class DocumentTest < Test::Unit::TestCase
1224
1211
 
1225
1212
  context "Indexing" do
1226
1213
  setup do
1227
- MongoMapper.ensured_indexes = []
1228
- @document.collection.drop_indexes
1214
+ drop_indexes(@document)
1229
1215
  end
1230
1216
 
1231
1217
  should "allow creating index for a key" do
1232
1218
  @document.ensure_index :first_name
1233
- MongoMapper.ensure_indexes!
1234
-
1235
1219
  @document.should have_index('first_name_1')
1236
1220
  end
1237
1221
 
1238
1222
  should "allow creating unique index for a key" do
1239
1223
  @document.ensure_index :first_name, :unique => true
1240
- MongoMapper.ensure_indexes!
1241
-
1242
1224
  @document.should have_index('first_name_1')
1243
1225
  end
1244
1226
 
1245
1227
  should "allow creating index on multiple keys" do
1246
1228
  @document.ensure_index [[:first_name, 1], [:last_name, -1]]
1247
- MongoMapper.ensure_indexes!
1248
-
1229
+
1249
1230
  # order is different for different versions of ruby so instead of
1250
1231
  # just checking have_index('first_name_1_last_name_-1') I'm checking
1251
1232
  # the values of the indexes to make sure the index creation was successful
@@ -1257,7 +1238,6 @@ class DocumentTest < Test::Unit::TestCase
1257
1238
 
1258
1239
  should "work with :index shortcut when defining key" do
1259
1240
  @document.key :father, String, :index => true
1260
- MongoMapper.ensure_indexes!
1261
1241
  @document.should have_index('father_1')
1262
1242
  end
1263
1243
  end
data/test/test_helper.rb CHANGED
@@ -46,6 +46,12 @@ class Test::Unit::TestCase
46
46
  klass.class_eval(&block) if block_given?
47
47
  klass
48
48
  end
49
+
50
+ def drop_indexes(klass)
51
+ if klass.database.collection_names.include?(klass.collection.name)
52
+ klass.collection.drop_indexes
53
+ end
54
+ end
49
55
  end
50
56
 
51
57
  test_dir = File.expand_path(File.dirname(__FILE__) + '/../tmp')
@@ -8,58 +8,118 @@ class MongoMapperTest < Test::Unit::TestCase
8
8
  MongoMapper.connection = conn
9
9
  MongoMapper.connection.should == conn
10
10
  end
11
-
11
+
12
12
  should "default connection to new mongo ruby driver" do
13
13
  MongoMapper.connection = nil
14
14
  MongoMapper.connection.should be_instance_of(Mongo::Connection)
15
15
  end
16
-
16
+
17
17
  should "be able to write and read default database" do
18
18
  MongoMapper.database = 'test'
19
19
  MongoMapper.database.should be_instance_of(Mongo::DB)
20
20
  MongoMapper.database.name.should == 'test'
21
21
  end
22
-
22
+
23
23
  should "have document not found error" do
24
24
  lambda {
25
25
  MongoMapper::DocumentNotFound
26
26
  }.should_not raise_error
27
27
  end
28
+
29
+ should "be able to read/write config" do
30
+ config = {
31
+ 'development' => {'host' => '127.0.0.1', 'port' => 27017, 'database' => 'test'},
32
+ 'production' => {'host' => '127.0.0.1', 'port' => 27017, 'database' => 'test-prod'}
33
+ }
34
+
35
+ MongoMapper.config = config
36
+ MongoMapper.config.should == config
37
+ end
38
+
39
+ context "connecting to environment from config" do
40
+ should "work without authentication" do
41
+ MongoMapper.config = {
42
+ 'development' => {'host' => '127.0.0.1', 'port' => 27017, 'database' => 'test'}
43
+ }
44
+
45
+ Mongo::Connection.expects(:new).with('127.0.0.1', 27017, {})
46
+ MongoMapper.expects(:database=).with('test')
47
+ Mongo::DB.any_instance.expects(:authenticate).never
48
+ MongoMapper.connect('development')
49
+ end
50
+
51
+ should "work with options" do
52
+ MongoMapper.config = {
53
+ 'development' => {'host' => '127.0.0.1', 'port' => 27017, 'database' => 'test'}
54
+ }
55
+
56
+ connection, logger = mock('connection'), mock('logger')
57
+ Mongo::Connection.expects(:new).with('127.0.0.1', 27017, :logger => logger)
58
+ MongoMapper.connect('development', :logger => logger)
59
+ end
60
+
61
+ should "work with authentication" do
62
+ MongoMapper.config = {
63
+ 'development' => {'host' => '127.0.0.1', 'port' => 27017, 'database' => 'test', 'username' => 'john', 'password' => 'secret'}
64
+ }
65
+
66
+ Mongo::DB.any_instance.expects(:authenticate).with('john', 'secret')
67
+ MongoMapper.connect('development')
68
+ end
69
+ end
70
+
71
+ context "setup" do
72
+ should "work as shortcut for setting config, environment and options" do
73
+ config, logger = mock('config'), mock('logger')
74
+ MongoMapper.expects(:config=).with(config)
75
+ MongoMapper.expects(:connect).with('development', :logger => logger)
76
+ MongoMapper.expects(:handle_passenger_forking).never
77
+ MongoMapper.setup(config, 'development', :logger => logger)
78
+ end
79
+
80
+ should "handle passenger if option present" do
81
+ config, logger = mock('config'), mock('logger')
82
+ MongoMapper.expects(:config=).with(config)
83
+ MongoMapper.expects(:connect).with('development', :logger => logger)
84
+ MongoMapper.expects(:handle_passenger_forking)
85
+ MongoMapper.setup(config, 'development', :logger => logger, :passenger => true)
86
+ end
87
+ end
28
88
 
89
+
29
90
  context "use_time_zone?" do
30
91
  should "be true if Time.zone set" do
31
92
  Time.zone = 'Hawaii'
32
93
  MongoMapper.use_time_zone?.should be_true
33
94
  Time.zone = nil
34
95
  end
35
-
96
+
36
97
  should "be false if Time.zone not set" do
37
98
  MongoMapper.use_time_zone?.should be_false
38
99
  end
39
100
  end
40
-
101
+
41
102
  context "time_class" do
42
103
  should "be Time.zone if using time zones" do
43
104
  Time.zone = 'Hawaii'
44
105
  MongoMapper.time_class.should == Time.zone
45
106
  Time.zone = nil
46
107
  end
47
-
108
+
48
109
  should "be Time if not using time zones" do
49
110
  MongoMapper.time_class.should == Time
50
111
  end
51
112
  end
52
-
113
+
53
114
  context "normalize_object_id" do
54
115
  should "turn string into object id" do
55
116
  id = Mongo::ObjectID.new
56
117
  MongoMapper.normalize_object_id(id.to_s).should == id
57
118
  end
58
-
119
+
59
120
  should "leave object id alone" do
60
121
  id = Mongo::ObjectID.new
61
122
  MongoMapper.normalize_object_id(id).should == id
62
123
  end
63
124
  end
64
-
65
125
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mongo_mapper-unstable
3
3
  version: !ruby/object:Gem::Version
4
- version: 2010.2.8
4
+ version: 2010.2.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Nunemaker
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2010-02-08 00:00:00 -05:00
12
+ date: 2010-02-09 00:00:00 -05:00
13
13
  default_executable: mmconsole
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency