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 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