adapter-mongo 0.5.5 → 0.5.6

Sign up to get free protection for your applications and to get access to all the features.
data/Guardfile CHANGED
@@ -4,6 +4,7 @@ guard 'bundler' do
4
4
  end
5
5
 
6
6
  guard 'rspec', :version => 2 do
7
+ watch('spec/support/shared_mongo_adapter.rb') { 'spec' }
7
8
  watch(%r{^spec/.+_spec\.rb$})
8
9
  watch(%r{^lib/adapter/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
9
10
  watch('spec/spec_helper.rb') { "spec" }
data/README.md CHANGED
@@ -22,6 +22,42 @@ puts 'Should be nil: ' + adapter.read('foo').inspect
22
22
  puts 'Should be bar: ' + adapter.fetch('foo', 'bar')
23
23
  ```
24
24
 
25
+ ## Flavors
26
+
27
+ There are two adapters included with this gem -- `:mongo` and `:mongo_atomic`. `:mongo` assumes that you are writing the full document each time. `:mongo_atomic` allows for partially updating documents. The difference is best shown with a bit of code.
28
+
29
+ ```ruby
30
+ require 'adapter/mongo_atomic'
31
+
32
+ key = BSON::ObjectId.new
33
+ full_doc = {'a' => 'c', 'b' => 'd'}
34
+ partial_doc = {'a' => 'z'}
35
+ client = Mongo::Connection.new.db('adapter')['testing']
36
+ adapter = Adapter[:mongo].new(client)
37
+ atomic_adapter = Adapter[:mongo_atomic].new(client)
38
+
39
+ adapter.clear
40
+ atomic_adapter.clear
41
+
42
+ adapter.write(key, full_doc)
43
+ adapter.write(key, partial_doc)
44
+
45
+ doc = adapter.read(key)
46
+ doc.delete('_id')
47
+
48
+ # full doc must always be written with :mongo adapter
49
+ puts 'Should be {"a"=>"z"}: ' + doc.inspect
50
+
51
+ atomic_adapter.write(key, full_doc)
52
+ atomic_adapter.write(key, partial_doc)
53
+
54
+ doc = atomic_adapter.read(key)
55
+ doc.delete('_id')
56
+
57
+ # partial updates can be written with atomic adapter as $set is used
58
+ puts 'Should be {"a"=>"z", "b"=>"d"}: ' + doc.inspect
59
+ ```
60
+
25
61
  See examples/ or specs/ for more usage.
26
62
 
27
63
  ## Contributing
@@ -0,0 +1,36 @@
1
+ require 'rubygems'
2
+ require 'pathname'
3
+
4
+ root_path = Pathname(__FILE__).dirname.join('..').expand_path
5
+ lib_path = root_path.join('lib')
6
+ $:.unshift(lib_path)
7
+
8
+ require 'adapter/mongo_atomic'
9
+
10
+ key = BSON::ObjectId.new
11
+ full_doc = {'a' => 'c', 'b' => 'd'}
12
+ partial_doc = {'a' => 'z'}
13
+ client = Mongo::Connection.new.db('adapter')['testing']
14
+ adapter = Adapter[:mongo].new(client)
15
+ atomic_adapter = Adapter[:mongo_atomic].new(client)
16
+
17
+ adapter.clear
18
+ atomic_adapter.clear
19
+
20
+ adapter.write(key, full_doc)
21
+ adapter.write(key, partial_doc)
22
+
23
+ doc = adapter.read(key)
24
+ doc.delete('_id')
25
+
26
+ # full doc must always be written with :mongo adapter
27
+ puts 'Should be {"a"=>"z"}: ' + doc.inspect
28
+
29
+ atomic_adapter.write(key, full_doc)
30
+ atomic_adapter.write(key, partial_doc)
31
+
32
+ doc = atomic_adapter.read(key)
33
+ doc.delete('_id')
34
+
35
+ # partial updates can be written with atomic adapter as $set is used
36
+ puts 'Should be {"a"=>"z", "b"=>"d"}: ' + doc.inspect
@@ -0,0 +1,19 @@
1
+ require 'rubygems'
2
+ require 'pathname'
3
+
4
+ root_path = Pathname(__FILE__).dirname.join('..').expand_path
5
+ lib_path = root_path.join('lib')
6
+ $:.unshift(lib_path)
7
+
8
+ require 'adapter/mongo'
9
+
10
+ key = BSON::OrderedHash['s' => 1, 'n' => 1]
11
+ client = Mongo::Connection.new.db('adapter')['testing']
12
+ adapter = Adapter[:mongo].new(client)
13
+ adapter.clear
14
+
15
+ adapter.write(key, :v => 1)
16
+
17
+ doc = adapter.read(key)
18
+
19
+ puts doc.inspect
data/lib/adapter/mongo.rb CHANGED
@@ -24,7 +24,12 @@ module Adapter
24
24
  end
25
25
 
26
26
  def key_for(key)
27
- key.is_a?(BSON::ObjectId) ? key : super
27
+ case key
28
+ when BSON::ObjectId, Hash
29
+ key
30
+ else
31
+ super
32
+ end
28
33
  end
29
34
 
30
35
  def encode(value)
@@ -38,4 +43,4 @@ module Adapter
38
43
  end
39
44
  end
40
45
 
41
- Adapter.define(:mongo, Adapter::Mongo)
46
+ Adapter.define(:mongo, Adapter::Mongo)
@@ -1,5 +1,5 @@
1
1
  module Adapter
2
2
  module Mongo
3
- VERSION = "0.5.5"
3
+ VERSION = "0.5.6"
4
4
  end
5
5
  end
data/spec/helper.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  $:.unshift(File.expand_path('../../lib', __FILE__))
2
+ $:.unshift(File.expand_path('../', __FILE__))
2
3
 
3
4
  require 'rubygems'
4
5
  require 'bundler'
@@ -9,54 +10,7 @@ require 'adapter/spec/an_adapter'
9
10
  require 'adapter/spec/types'
10
11
  require 'adapter-mongo'
11
12
 
12
- shared_examples_for "a mongo adapter" do
13
- it_should_behave_like 'an adapter'
14
-
15
- Adapter::Spec::Types.each do |type, (key, key2)|
16
- it "writes Object values to keys that are #{type}s like a Hash" do
17
- adapter[key] = {:foo => :bar}
18
- # mongo knows hashes and can serialize symbol values
19
- adapter[key].should == {'_id' => 'key', 'foo' => :bar}
20
- end
21
- end
22
-
23
- it "allows using object id's as keys in correct type" do
24
- id = BSON::ObjectId.new
25
- adapter.write(id, 'ham')
26
- client.find_one('_id' => id).should_not be_nil
27
- adapter.read(id).should == 'ham'
28
- end
29
-
30
- it "stores hashes right in document" do
31
- adapter.write('foo', 'steak' => 'bacon')
32
- client.find_one('_id' => 'foo').should == {'_id' => 'foo', 'steak' => 'bacon'}
33
- end
34
-
35
- describe "with safe option" do
36
- before do
37
- client.ensure_index([['email', 1]], :unique => true)
38
- @adapter = Adapter[adapter_name].new(client, :safe => true)
39
- end
40
-
41
- after do
42
- client.drop_index('email_1')
43
- end
44
-
45
- it "does not raise operation failure on write if operation succeeds" do
46
- adapter.write(BSON::ObjectId.new, {'email' => 'john@orderedlist.com'})
47
- lambda {
48
- adapter.write(BSON::ObjectId.new, {'email' => 'steve@orderedlist.com'})
49
- }.should_not raise_error(Mongo::OperationFailure)
50
- end
51
-
52
- it "raises operation failure on write if operation fails" do
53
- adapter.write(BSON::ObjectId.new, {'email' => 'john@orderedlist.com'})
54
- lambda {
55
- adapter.write(BSON::ObjectId.new, {'email' => 'john@orderedlist.com'})
56
- }.should raise_error(Mongo::OperationFailure)
57
- end
58
- end
59
- end
13
+ require 'support/shared_mongo_adapter'
60
14
 
61
15
  RSpec.configure do |c|
62
16
 
@@ -0,0 +1,62 @@
1
+ shared_examples_for "a mongo adapter" do
2
+ it_should_behave_like 'an adapter'
3
+
4
+ Adapter::Spec::Types.each do |type, (key, key2)|
5
+ it "writes Object values to keys that are #{type}s like a Hash" do
6
+ adapter[key] = {:foo => :bar}
7
+ # mongo knows hashes and can serialize symbol values
8
+ adapter[key].should == {'_id' => 'key', 'foo' => :bar}
9
+ end
10
+ end
11
+
12
+ it "allows using object id's as keys in correct type" do
13
+ id = BSON::ObjectId.new
14
+ adapter.write(id, 'ham')
15
+ client.find_one('_id' => id).should_not be_nil
16
+ adapter.read(id).should == 'ham'
17
+ end
18
+
19
+ it "allows using ordered hashes as keys" do
20
+ key = BSON::OrderedHash['d', 1, 'n', 1]
21
+ adapter.write(key, 'ham')
22
+ client.find_one('_id' => key).should_not be_nil
23
+ adapter.read(key).should == 'ham'
24
+ end
25
+
26
+ it "allows using hashes as keys" do
27
+ key = {:d => 1}
28
+ adapter.write(key, 'ham')
29
+ client.find_one('_id' => key).should_not be_nil
30
+ adapter.read(key).should == 'ham'
31
+ end
32
+
33
+ it "stores hashes right in document" do
34
+ adapter.write('foo', 'steak' => 'bacon')
35
+ client.find_one('_id' => 'foo').should == {'_id' => 'foo', 'steak' => 'bacon'}
36
+ end
37
+
38
+ describe "with safe option" do
39
+ before do
40
+ client.ensure_index([['email', 1]], :unique => true)
41
+ @adapter = Adapter[adapter_name].new(client, :safe => true)
42
+ end
43
+
44
+ after do
45
+ client.drop_index('email_1')
46
+ end
47
+
48
+ it "does not raise operation failure on write if operation succeeds" do
49
+ adapter.write(BSON::ObjectId.new, {'email' => 'john@orderedlist.com'})
50
+ lambda {
51
+ adapter.write(BSON::ObjectId.new, {'email' => 'steve@orderedlist.com'})
52
+ }.should_not raise_error(Mongo::OperationFailure)
53
+ end
54
+
55
+ it "raises operation failure on write if operation fails" do
56
+ adapter.write(BSON::ObjectId.new, {'email' => 'john@orderedlist.com'})
57
+ lambda {
58
+ adapter.write(BSON::ObjectId.new, {'email' => 'john@orderedlist.com'})
59
+ }.should raise_error(Mongo::OperationFailure)
60
+ end
61
+ end
62
+ end
metadata CHANGED
@@ -1,62 +1,45 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: adapter-mongo
3
- version: !ruby/object:Gem::Version
4
- hash: 1
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.5.6
5
5
  prerelease:
6
- segments:
7
- - 0
8
- - 5
9
- - 5
10
- version: 0.5.5
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - John Nunemaker
14
9
  autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
-
18
- date: 2012-05-19 00:00:00 Z
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
21
- type: :runtime
22
- prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
12
+ date: 2012-07-09 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: adapter
16
+ requirement: &70364766280940 !ruby/object:Gem::Requirement
24
17
  none: false
25
- requirements:
18
+ requirements:
26
19
  - - ~>
27
- - !ruby/object:Gem::Version
28
- hash: 1
29
- segments:
30
- - 0
31
- - 5
32
- version: "0.5"
33
- version_requirements: *id001
34
- name: adapter
35
- - !ruby/object:Gem::Dependency
20
+ - !ruby/object:Gem::Version
21
+ version: '0.5'
36
22
  type: :runtime
37
23
  prerelease: false
38
- requirement: &id002 !ruby/object:Gem::Requirement
24
+ version_requirements: *70364766280940
25
+ - !ruby/object:Gem::Dependency
26
+ name: mongo
27
+ requirement: &70364766280440 !ruby/object:Gem::Requirement
39
28
  none: false
40
- requirements:
29
+ requirements:
41
30
  - - ~>
42
- - !ruby/object:Gem::Version
43
- hash: 5
44
- segments:
45
- - 1
46
- - 5
47
- version: "1.5"
48
- version_requirements: *id002
49
- name: mongo
31
+ - !ruby/object:Gem::Version
32
+ version: '1.5'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: *70364766280440
50
36
  description: Adapter for mongo
51
- email:
37
+ email:
52
38
  - nunemaker@gmail.com
53
39
  executables: []
54
-
55
40
  extensions: []
56
-
57
41
  extra_rdoc_files: []
58
-
59
- files:
42
+ files:
60
43
  - .gitignore
61
44
  - .travis.yml
62
45
  - Gemfile
@@ -66,6 +49,8 @@ files:
66
49
  - Rakefile
67
50
  - adapter-mongo.gemspec
68
51
  - examples/mongo.rb
52
+ - examples/mongo_atomic.rb
53
+ - examples/object_for_key.rb
69
54
  - lib/adapter-mongo.rb
70
55
  - lib/adapter/mongo.rb
71
56
  - lib/adapter/mongo/version.rb
@@ -73,40 +58,39 @@ files:
73
58
  - spec/helper.rb
74
59
  - spec/mongo_atomic_spec.rb
75
60
  - spec/mongo_spec.rb
76
- homepage: ""
61
+ - spec/support/shared_mongo_adapter.rb
62
+ homepage: ''
77
63
  licenses: []
78
-
79
64
  post_install_message:
80
65
  rdoc_options: []
81
-
82
- require_paths:
66
+ require_paths:
83
67
  - lib
84
- required_ruby_version: !ruby/object:Gem::Requirement
68
+ required_ruby_version: !ruby/object:Gem::Requirement
85
69
  none: false
86
- requirements:
87
- - - ">="
88
- - !ruby/object:Gem::Version
89
- hash: 3
90
- segments:
70
+ requirements:
71
+ - - ! '>='
72
+ - !ruby/object:Gem::Version
73
+ version: '0'
74
+ segments:
91
75
  - 0
92
- version: "0"
93
- required_rubygems_version: !ruby/object:Gem::Requirement
76
+ hash: 3131877323408847219
77
+ required_rubygems_version: !ruby/object:Gem::Requirement
94
78
  none: false
95
- requirements:
96
- - - ">="
97
- - !ruby/object:Gem::Version
98
- hash: 3
99
- segments:
79
+ requirements:
80
+ - - ! '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ segments:
100
84
  - 0
101
- version: "0"
85
+ hash: 3131877323408847219
102
86
  requirements: []
103
-
104
87
  rubyforge_project:
105
88
  rubygems_version: 1.8.10
106
89
  signing_key:
107
90
  specification_version: 3
108
91
  summary: Adapter for mongo
109
- test_files:
92
+ test_files:
110
93
  - spec/helper.rb
111
94
  - spec/mongo_atomic_spec.rb
112
95
  - spec/mongo_spec.rb
96
+ - spec/support/shared_mongo_adapter.rb