schron 0.0.4 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/schron/datastore/mongo.rb +7 -6
- data/lib/schron/db.rb +13 -0
- data/lib/schron/identity_map_repository.rb +31 -12
- data/lib/schron/test/datastore_examples.rb +8 -1
- data/schron.gemspec +1 -1
- data/spec/lib/schron/identity_map_repository_spec.rb +22 -5
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f49a1d20dee523a612a54957311f0b2e0d6c1261
|
4
|
+
data.tar.gz: 1b86c1df7aaa310f1729032f2a029c3135293a88
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e4b7793227d44a52f21568e892a3f1525c03bc8d0f037daf4115bbeda4900c3d593e5c301a03e951fd6a50946edab32d564682dff67bc3e34dcb2874830fc938
|
7
|
+
data.tar.gz: 6c4a329eb00714ee3b258b88e94ea313718b7e09f879b6db011681e2bc3b9d4654df9ee0d38911cea5f9087b7c1bd0e58ab28812cf788e47570fe7d8b528d5c7
|
@@ -170,22 +170,23 @@ module Schron
|
|
170
170
|
selector = {}
|
171
171
|
query.filters.each do |(field, op, filter_value)|
|
172
172
|
mongo_field = mongoize_field(field)
|
173
|
+
selector[mongo_field] ||= {}
|
173
174
|
case op
|
174
175
|
when '='
|
175
176
|
selector[mongo_field] = filter_value
|
176
177
|
when '!='
|
177
|
-
selector[mongo_field]
|
178
|
+
selector[mongo_field]['$ne'] = filter_value
|
178
179
|
when 'in'
|
179
180
|
raise EmptyQueryError if filter_value.to_a.empty?
|
180
|
-
selector[mongo_field]
|
181
|
+
selector[mongo_field]['$in'] = filter_value.to_a
|
181
182
|
when '>'
|
182
|
-
selector[mongo_field]
|
183
|
+
selector[mongo_field]['$gt'] = filter_value
|
183
184
|
when '<'
|
184
|
-
selector[mongo_field]
|
185
|
+
selector[mongo_field]['$lt'] = filter_value
|
185
186
|
when '>='
|
186
|
-
selector[mongo_field]
|
187
|
+
selector[mongo_field]['$gte'] = filter_value
|
187
188
|
when '<='
|
188
|
-
selector[mongo_field]
|
189
|
+
selector[mongo_field]['$lte'] = filter_value
|
189
190
|
else
|
190
191
|
raise "unsupported op #{op}"
|
191
192
|
end
|
data/lib/schron/db.rb
CHANGED
@@ -26,11 +26,24 @@ module Schron
|
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
29
|
+
def session_end!
|
30
|
+
@repos.each do |name, repo|
|
31
|
+
repo.session_end! if repo.respond_to?(:session_end!)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
29
35
|
def session(&block)
|
30
36
|
session_begin
|
31
37
|
block.call
|
32
38
|
ensure
|
33
39
|
session_end
|
34
40
|
end
|
41
|
+
|
42
|
+
def session!(&block)
|
43
|
+
session_begin
|
44
|
+
block.call
|
45
|
+
ensure
|
46
|
+
session_end!
|
47
|
+
end
|
35
48
|
end
|
36
49
|
end
|
@@ -30,16 +30,27 @@ module Schron
|
|
30
30
|
# end
|
31
31
|
|
32
32
|
def session_begin
|
33
|
-
@
|
34
|
-
@sessions
|
35
|
-
@
|
33
|
+
@sessions ||= []
|
34
|
+
@sessions.push IdentityMap.new
|
35
|
+
# @id_map ||= IdentityMap.new
|
36
|
+
# @sessions ||= 0
|
37
|
+
# @sessions += 1
|
36
38
|
nil
|
37
39
|
end
|
38
40
|
|
39
41
|
def session_end
|
40
|
-
|
41
|
-
|
42
|
-
|
42
|
+
@sessions.pop
|
43
|
+
# raise 'no session is open' unless @id_map
|
44
|
+
# @sessions -= 1
|
45
|
+
# @id_map = nil if @sessions == 0
|
46
|
+
nil
|
47
|
+
end
|
48
|
+
|
49
|
+
def session_end!
|
50
|
+
@sessions = []
|
51
|
+
# raise 'no session is open' unless @id_map
|
52
|
+
# @sessions = 0
|
53
|
+
# @id_map = nil
|
43
54
|
nil
|
44
55
|
end
|
45
56
|
|
@@ -50,6 +61,13 @@ module Schron
|
|
50
61
|
session_end
|
51
62
|
end
|
52
63
|
|
64
|
+
def session!(&block)
|
65
|
+
session_begin
|
66
|
+
block.call
|
67
|
+
ensure
|
68
|
+
session_end!
|
69
|
+
end
|
70
|
+
|
53
71
|
# [:datastore, :kind, :entity_class, :indexed_fields,
|
54
72
|
# :identity].each do |repo_method|
|
55
73
|
# define_method(repo_method) do |*args, &block|
|
@@ -78,7 +96,6 @@ module Schron
|
|
78
96
|
def get(id)
|
79
97
|
identity_map.fetch(id) do
|
80
98
|
super
|
81
|
-
# @repo.get(id)
|
82
99
|
end
|
83
100
|
end
|
84
101
|
|
@@ -125,14 +142,16 @@ module Schron
|
|
125
142
|
end
|
126
143
|
|
127
144
|
def update(object)
|
128
|
-
super
|
129
|
-
|
145
|
+
result = super
|
146
|
+
assign_attributes from: result, to: object
|
130
147
|
object
|
131
148
|
end
|
132
149
|
|
133
150
|
def multi_update(objects)
|
134
|
-
super
|
135
|
-
|
151
|
+
results = super
|
152
|
+
objects.each_with_index do |o, i|
|
153
|
+
assign_attributes(from: results[i], to: o)
|
154
|
+
end
|
136
155
|
objects
|
137
156
|
end
|
138
157
|
|
@@ -153,7 +172,7 @@ module Schron
|
|
153
172
|
end
|
154
173
|
|
155
174
|
def identity_map
|
156
|
-
@
|
175
|
+
@sessions.last || raise('Must start a session before accessing data from an IdentityMapRepository')
|
157
176
|
end
|
158
177
|
|
159
178
|
private
|
@@ -242,6 +242,13 @@ if defined?(RSpec)
|
|
242
242
|
expect(ds.exec_query(query.filter(name: '123'))).to eq([])
|
243
243
|
end
|
244
244
|
|
245
|
+
it 'filters more than one condition on a single field' do
|
246
|
+
query.filter(:name, '>', 'a').filter(:name, '<', 'c')
|
247
|
+
found = ds.exec_query(query)
|
248
|
+
expect(found.size).to eq(1)
|
249
|
+
expect(found.first[:id]).to eq(@b[:id])
|
250
|
+
end
|
251
|
+
|
245
252
|
context 'nil filtering' do
|
246
253
|
it 'filters by = nil' do
|
247
254
|
found = ds.exec_query(query.filter(name: nil))
|
@@ -570,4 +577,4 @@ if defined?(RSpec)
|
|
570
577
|
end
|
571
578
|
end
|
572
579
|
|
573
|
-
end
|
580
|
+
end
|
data/schron.gemspec
CHANGED
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
|
5
5
|
Gem::Specification.new do |spec|
|
6
6
|
spec.name = "schron"
|
7
|
-
spec.version = "0.0.
|
7
|
+
spec.version = "0.0.5"
|
8
8
|
spec.authors = ["David Faber"]
|
9
9
|
spec.email = ["david@1bios.co"]
|
10
10
|
spec.summary = %q{Repository implementation for entity persistence}
|
@@ -42,11 +42,28 @@ describe Schron::IdentityMapRepository do
|
|
42
42
|
end
|
43
43
|
end
|
44
44
|
|
45
|
-
it '
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
45
|
+
it 'nests sessions' do
|
46
|
+
id_maps = []
|
47
|
+
repo.session do
|
48
|
+
id_maps << repo.identity_map
|
49
|
+
repo.session do
|
50
|
+
expect(repo.identity_map).not_to eq(id_maps.first)
|
51
|
+
end
|
52
|
+
expect(repo.identity_map).to eq(id_maps.first)
|
53
|
+
end
|
54
|
+
expect { repo.identity_map }.to raise_error
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'uses unique identity maps in nested sessions' do
|
58
|
+
obj = nil
|
59
|
+
repo.session do
|
60
|
+
obj = repo.insert(repo.entity_class.new)
|
61
|
+
repo.session do
|
62
|
+
expect(obj).not_to be(repo.get(obj.id))
|
63
|
+
end
|
64
|
+
expect(obj).to be(repo.get(obj.id))
|
65
|
+
end
|
66
|
+
|
50
67
|
end
|
51
68
|
|
52
69
|
it 'closes sessions after an equal number of begin and end calls have been made' do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: schron
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Faber
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-08-
|
11
|
+
date: 2014-08-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|