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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8f4bf73bf955f3f82baa2bab5bc3acc1b812cd61
4
- data.tar.gz: 334dc42717de4a920f6c698a031829d6113615c3
3
+ metadata.gz: f49a1d20dee523a612a54957311f0b2e0d6c1261
4
+ data.tar.gz: 1b86c1df7aaa310f1729032f2a029c3135293a88
5
5
  SHA512:
6
- metadata.gz: 978dfca8ba3c7ea74efd6ad4825fcc34f6cf9641c2b8417185a9242c15e9a68122442c3736711288ccbb5b2fb48ce73364aaf602598ab517d5391d8be5b4dac1
7
- data.tar.gz: 4385936c35b1df5c92c15d00fef37d12641f613766305d78baf319f1a3317618205f7f1d736734f03ab6027bf0f6ff0abba6dd3dd10be757f0b8d10d6d94d0b0
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] = { "$ne" => filter_value }
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] = { "$in" => filter_value.to_a }
181
+ selector[mongo_field]['$in'] = filter_value.to_a
181
182
  when '>'
182
- selector[mongo_field] = { "$gt" => filter_value }
183
+ selector[mongo_field]['$gt'] = filter_value
183
184
  when '<'
184
- selector[mongo_field] = { "$lt" => filter_value }
185
+ selector[mongo_field]['$lt'] = filter_value
185
186
  when '>='
186
- selector[mongo_field] = { "$gte" => filter_value }
187
+ selector[mongo_field]['$gte'] = filter_value
187
188
  when '<='
188
- selector[mongo_field] = { "$lte" => filter_value }
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
- @id_map ||= IdentityMap.new
34
- @sessions ||= 0
35
- @sessions += 1
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
- raise 'no session is open' unless @id_map
41
- @sessions -= 1
42
- @id_map = nil if @sessions == 0
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
- # @repo.update(object)
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
- # @repo.multi_update(objects)
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
- @id_map || raise('Must start a session before accessing data from an IdentityMapRepository')
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.4"
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 'uses the same identity map if a session has already started' do
46
- repo.session_begin
47
- id_map = repo.identity_map
48
- repo.session_begin
49
- expect(id_map).to be(repo.identity_map)
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
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-22 00:00:00.000000000 Z
11
+ date: 2014-08-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake