schron 0.0.4 → 0.0.5
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.
- 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
|