mongoid_identity_map 0.0.1
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/.gitignore +6 -0
- data/.rvmrc +2 -0
- data/Gemfile +4 -0
- data/Rakefile +5 -0
- data/lib/mongoid_identity_map/clear_middleware.rb +13 -0
- data/lib/mongoid_identity_map/current_thread_hash.rb +23 -0
- data/lib/mongoid_identity_map/identity_map.rb +11 -0
- data/lib/mongoid_identity_map/identity_mappable.rb +20 -0
- data/lib/mongoid_identity_map/version.rb +3 -0
- data/lib/mongoid_identity_map.rb +5 -0
- data/mongoid_identity_map.gemspec +27 -0
- data/spec/mongoid_identity_map/clear_middleware_spec.rb +20 -0
- data/spec/mongoid_identity_map/current_thread_hash_spec.rb +30 -0
- data/spec/mongoid_identity_map/identity_map_spec.rb +48 -0
- data/spec/mongoid_identity_map/identity_mappable_spec.rb +19 -0
- data/spec/spec_helper.rb +12 -0
- data/spec/support/model.rb +3 -0
- metadata +157 -0
data/.gitignore
ADDED
data/.rvmrc
ADDED
data/Gemfile
ADDED
data/Rakefile
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
module MongoidIdentityMap
|
2
|
+
class CurrentThreadHash
|
3
|
+
class << self
|
4
|
+
def get(key)
|
5
|
+
current_thread_hash[key]
|
6
|
+
end
|
7
|
+
|
8
|
+
def set(key, value)
|
9
|
+
current_thread_hash[key] = value
|
10
|
+
end
|
11
|
+
|
12
|
+
def clear
|
13
|
+
Thread.current[:mongoid_identity_map_current_thread_hash] = nil
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def current_thread_hash
|
19
|
+
Thread.current[:mongoid_identity_map_current_thread_hash] ||= Hash.new
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'active_support/core_ext'
|
2
|
+
require 'mongoid/collection'
|
3
|
+
|
4
|
+
module MongoidIdentityMap
|
5
|
+
module IdentityMappable
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
|
8
|
+
included do
|
9
|
+
alias_method_chain :find_one, :identity_map
|
10
|
+
end
|
11
|
+
|
12
|
+
def find_one_with_identity_map(selector = {}, options = {})
|
13
|
+
IdentityMap.fetch(selector.merge(:_collection_name => self.name)) do
|
14
|
+
find_one_without_identity_map(selector, options)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
Mongoid::Collection.send(:include, MongoidIdentityMap::IdentityMappable)
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path("../lib/mongoid_identity_map/version", __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |s|
|
5
|
+
s.name = "mongoid_identity_map"
|
6
|
+
s.version = MongoidIdentityMap::VERSION
|
7
|
+
s.platform = Gem::Platform::RUBY
|
8
|
+
s.authors = ["Guilherme Cirne"]
|
9
|
+
s.email = ["gcirne@gmail.com"]
|
10
|
+
s.homepage = "http://rubygems.org/gems/mongoid_identity_map"
|
11
|
+
s.summary = "IdentityMap for Mongoid"
|
12
|
+
s.description = "Simple and transparent IdentityMap implementation for Mongoid"
|
13
|
+
|
14
|
+
s.required_rubygems_version = ">= 1.3.6"
|
15
|
+
s.rubyforge_project = "mongoid_identity_map"
|
16
|
+
|
17
|
+
s.add_dependency "activesupport", "~> 3.0.0"
|
18
|
+
s.add_dependency "mongoid", "~> 2.0.0"
|
19
|
+
|
20
|
+
s.add_development_dependency "bson_ext", ">= 1.3.0"
|
21
|
+
s.add_development_dependency "bundler", ">= 1.0.0"
|
22
|
+
s.add_development_dependency "rspec", ">= 2.5.0"
|
23
|
+
|
24
|
+
s.files = `git ls-files`.split("\n")
|
25
|
+
s.executables = `git ls-files`.split("\n").map{|f| f =~ /^bin\/(.*)/ ? $1 : nil}.compact
|
26
|
+
s.require_path = 'lib'
|
27
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe MongoidIdentityMap::ClearMiddleware do
|
4
|
+
before do
|
5
|
+
@env = {}
|
6
|
+
@resp = stub("resp")
|
7
|
+
@app = stub("app")
|
8
|
+
@app.stub!(:call).with(@env).and_return(@resp)
|
9
|
+
@clear_middleware = MongoidIdentityMap::ClearMiddleware.new(@app)
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should return app response" do
|
13
|
+
@clear_middleware.call(@env).should be(@resp)
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should clear identity map" do
|
17
|
+
MongoidIdentityMap::CurrentThreadHash.should_receive(:clear)
|
18
|
+
@clear_middleware.call(@env)
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe MongoidIdentityMap::CurrentThreadHash do
|
4
|
+
describe ".set and .get" do
|
5
|
+
it "should set and get key based value" do
|
6
|
+
MongoidIdentityMap::CurrentThreadHash.set(:key, "value")
|
7
|
+
|
8
|
+
Thread.new do
|
9
|
+
MongoidIdentityMap::CurrentThreadHash.set(:key, "value2")
|
10
|
+
MongoidIdentityMap::CurrentThreadHash.get(:key).should == "value2"
|
11
|
+
end.join
|
12
|
+
|
13
|
+
MongoidIdentityMap::CurrentThreadHash.get(:key).should == "value"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
describe ".clear" do
|
18
|
+
it "should clear" do
|
19
|
+
MongoidIdentityMap::CurrentThreadHash.set(:key, "value")
|
20
|
+
|
21
|
+
Thread.new do
|
22
|
+
MongoidIdentityMap::CurrentThreadHash.set(:key, "value")
|
23
|
+
MongoidIdentityMap::CurrentThreadHash.clear
|
24
|
+
MongoidIdentityMap::CurrentThreadHash.get(:key).should be_nil
|
25
|
+
end.join
|
26
|
+
|
27
|
+
MongoidIdentityMap::CurrentThreadHash.get(:key).should == "value"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe MongoidIdentityMap::IdentityMap do
|
4
|
+
before do
|
5
|
+
@model = Model.new
|
6
|
+
@selector = {:_id => BSON::ObjectId("4da13240312f916cd2000002")}
|
7
|
+
end
|
8
|
+
|
9
|
+
describe ".fetch" do
|
10
|
+
context "when document doesn't exist in identity map" do
|
11
|
+
before do
|
12
|
+
MongoidIdentityMap::CurrentThreadHash.stub!(:get).with(@selector).and_return(nil)
|
13
|
+
Model.collection.stub!(:find_one_without_identity_map).with(@selector).and_return(@model)
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should return document from database" do
|
17
|
+
Model.collection.should_receive(:find_one_without_identity_map).with(@selector).and_return(@model)
|
18
|
+
fetch.should be(@model)
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should set document in identity map" do
|
22
|
+
MongoidIdentityMap::CurrentThreadHash.stub!(:set).with(@selector, @model)
|
23
|
+
fetch
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
context "when document exists in identity map" do
|
28
|
+
before do
|
29
|
+
MongoidIdentityMap::CurrentThreadHash.stub!(:get).with(@selector).and_return(@model)
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should return document from identity map" do
|
33
|
+
fetch.should be(@model)
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should not hit database" do
|
37
|
+
Model.collection.should_not_receive(:find_one_without_identity_map)
|
38
|
+
fetch
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def fetch
|
43
|
+
MongoidIdentityMap::IdentityMap.fetch(@selector) do
|
44
|
+
Model.collection.find_one_without_identity_map(@selector)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe MongoidIdentityMap::IdentityMappable do
|
4
|
+
describe "#find_one" do
|
5
|
+
before do
|
6
|
+
@model = Model.new
|
7
|
+
Model.collection.stub!(:find_one_without_identity_map).with({:_id => BSON::ObjectId("4da13240312f916cd2000002")}, {}).and_return(@model)
|
8
|
+
end
|
9
|
+
|
10
|
+
it "should return model" do
|
11
|
+
Model.collection.find_one({:_id => BSON::ObjectId("4da13240312f916cd2000002")}, {}).should be(@model)
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should include collection name in identity map fetch selector" do
|
15
|
+
MongoidIdentityMap::IdentityMap.should_receive(:fetch).with(hash_including(:_collection_name => "models"))
|
16
|
+
Model.collection.find_one({:_id => BSON::ObjectId("4da13240312f916cd2000002")}, {})
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
require "mongoid_identity_map"
|
2
|
+
require "mongoid"
|
3
|
+
require "support/model"
|
4
|
+
|
5
|
+
RSpec.configure do |config|
|
6
|
+
config.filter_run :focus => true
|
7
|
+
config.run_all_when_everything_filtered = true
|
8
|
+
|
9
|
+
config.before(:each) do
|
10
|
+
MongoidIdentityMap::CurrentThreadHash.clear
|
11
|
+
end
|
12
|
+
end
|
metadata
ADDED
@@ -0,0 +1,157 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: mongoid_identity_map
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
version: 0.0.1
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- Guilherme Cirne
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain: []
|
16
|
+
|
17
|
+
date: 2011-04-29 00:00:00 -03:00
|
18
|
+
default_executable:
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: activesupport
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
none: false
|
25
|
+
requirements:
|
26
|
+
- - ~>
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
segments:
|
29
|
+
- 3
|
30
|
+
- 0
|
31
|
+
- 0
|
32
|
+
version: 3.0.0
|
33
|
+
type: :runtime
|
34
|
+
version_requirements: *id001
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
name: mongoid
|
37
|
+
prerelease: false
|
38
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ~>
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
segments:
|
44
|
+
- 2
|
45
|
+
- 0
|
46
|
+
- 0
|
47
|
+
version: 2.0.0
|
48
|
+
type: :runtime
|
49
|
+
version_requirements: *id002
|
50
|
+
- !ruby/object:Gem::Dependency
|
51
|
+
name: bson_ext
|
52
|
+
prerelease: false
|
53
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
54
|
+
none: false
|
55
|
+
requirements:
|
56
|
+
- - ">="
|
57
|
+
- !ruby/object:Gem::Version
|
58
|
+
segments:
|
59
|
+
- 1
|
60
|
+
- 3
|
61
|
+
- 0
|
62
|
+
version: 1.3.0
|
63
|
+
type: :development
|
64
|
+
version_requirements: *id003
|
65
|
+
- !ruby/object:Gem::Dependency
|
66
|
+
name: bundler
|
67
|
+
prerelease: false
|
68
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
69
|
+
none: false
|
70
|
+
requirements:
|
71
|
+
- - ">="
|
72
|
+
- !ruby/object:Gem::Version
|
73
|
+
segments:
|
74
|
+
- 1
|
75
|
+
- 0
|
76
|
+
- 0
|
77
|
+
version: 1.0.0
|
78
|
+
type: :development
|
79
|
+
version_requirements: *id004
|
80
|
+
- !ruby/object:Gem::Dependency
|
81
|
+
name: rspec
|
82
|
+
prerelease: false
|
83
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
84
|
+
none: false
|
85
|
+
requirements:
|
86
|
+
- - ">="
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
segments:
|
89
|
+
- 2
|
90
|
+
- 5
|
91
|
+
- 0
|
92
|
+
version: 2.5.0
|
93
|
+
type: :development
|
94
|
+
version_requirements: *id005
|
95
|
+
description: Simple and transparent IdentityMap implementation for Mongoid
|
96
|
+
email:
|
97
|
+
- gcirne@gmail.com
|
98
|
+
executables: []
|
99
|
+
|
100
|
+
extensions: []
|
101
|
+
|
102
|
+
extra_rdoc_files: []
|
103
|
+
|
104
|
+
files:
|
105
|
+
- .gitignore
|
106
|
+
- .rvmrc
|
107
|
+
- Gemfile
|
108
|
+
- Rakefile
|
109
|
+
- lib/mongoid_identity_map.rb
|
110
|
+
- lib/mongoid_identity_map/clear_middleware.rb
|
111
|
+
- lib/mongoid_identity_map/current_thread_hash.rb
|
112
|
+
- lib/mongoid_identity_map/identity_map.rb
|
113
|
+
- lib/mongoid_identity_map/identity_mappable.rb
|
114
|
+
- lib/mongoid_identity_map/version.rb
|
115
|
+
- mongoid_identity_map.gemspec
|
116
|
+
- spec/mongoid_identity_map/clear_middleware_spec.rb
|
117
|
+
- spec/mongoid_identity_map/current_thread_hash_spec.rb
|
118
|
+
- spec/mongoid_identity_map/identity_map_spec.rb
|
119
|
+
- spec/mongoid_identity_map/identity_mappable_spec.rb
|
120
|
+
- spec/spec_helper.rb
|
121
|
+
- spec/support/model.rb
|
122
|
+
has_rdoc: true
|
123
|
+
homepage: http://rubygems.org/gems/mongoid_identity_map
|
124
|
+
licenses: []
|
125
|
+
|
126
|
+
post_install_message:
|
127
|
+
rdoc_options: []
|
128
|
+
|
129
|
+
require_paths:
|
130
|
+
- lib
|
131
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
132
|
+
none: false
|
133
|
+
requirements:
|
134
|
+
- - ">="
|
135
|
+
- !ruby/object:Gem::Version
|
136
|
+
segments:
|
137
|
+
- 0
|
138
|
+
version: "0"
|
139
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
140
|
+
none: false
|
141
|
+
requirements:
|
142
|
+
- - ">="
|
143
|
+
- !ruby/object:Gem::Version
|
144
|
+
segments:
|
145
|
+
- 1
|
146
|
+
- 3
|
147
|
+
- 6
|
148
|
+
version: 1.3.6
|
149
|
+
requirements: []
|
150
|
+
|
151
|
+
rubyforge_project: mongoid_identity_map
|
152
|
+
rubygems_version: 1.3.7
|
153
|
+
signing_key:
|
154
|
+
specification_version: 3
|
155
|
+
summary: IdentityMap for Mongoid
|
156
|
+
test_files: []
|
157
|
+
|