pod4 0.9.0 → 0.9.1

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
- SHA1:
3
- metadata.gz: 8a9606d06dd2634ff0382a7985c25e65c1dd21e0
4
- data.tar.gz: 8a4dd824c41d8fc213dd1ebd3d29f53f2f2912d0
2
+ SHA256:
3
+ metadata.gz: 2136af8ee4ba964aecab03dc618b2573e3b2d13883d3ab6965db115922a6ed67
4
+ data.tar.gz: 485443950826a519387cf740a0e6b7d8ebd3b3fa747e9fb8202f31e95f991362
5
5
  SHA512:
6
- metadata.gz: c8cf85e89a6f2135e51712a6d5b06c1c233dfdc31c03852d9f4bfaf4ea3dbe7116bf1d0e81c425bdc2c91361a9811c0dee127092086c57fbf89f236e854bec34
7
- data.tar.gz: 192f0df1a101076226c8574d53eb9dd5db353422e8f279f2e575f87e00df8c47e7a8f323cae8b226e6694a4acd5e23db33cb41074b2473e0ffe3573218b5c61d
6
+ metadata.gz: aa2d550a2c50e9ec82a77e786b00b3f4250356964f946eb3a5235aecd0e76bc464f17176669baf40054db788fb81347c545ce2ce014d5459fadb9aceac1822b0
7
+ data.tar.gz: cb2081a8903ffd66c2d67e98162875101da19480390ffb795042099f7352d5a3ef7b847ac59bc439113cf369d5ef0dc22269be38a481b92fd6e69e95824b2112
data/.hgtags CHANGED
@@ -23,3 +23,4 @@ ccb4a8711560725e358f7fb87c76f4787eac5ed5 0.8.0
23
23
  8dff4cc52ea1e16536ad0677d8d62f52f4201366 0.8.1
24
24
  1c06f5b53ea3f3ff235f6e54fe412ec4396cd4b1 0.8.3
25
25
  9a241db13da0e043aae02cee2ed463beca38ed9a 0.9.0
26
+ f1b3a814e7a8c7d818b57f6d35ce7ed749573d76 0.9.1
@@ -50,9 +50,25 @@ module Pod4
50
50
  # success verb. If that's not true, then you will have to override #create and sort this out
51
51
  # yourself.
52
52
  #
53
- # Finally, note that all values are returned as strings; there is no typecasting. This is a given
53
+ # Note that all values are returned as strings; there is no typecasting. This is a given
54
54
  # limitation for Nebulous as a whole.
55
55
  #
56
+ # Calls to create, update and delete avoid (for obvious reasons) Nebulous' Redis cache if
57
+ # present. read and list use it. The interface methods take an extra options hash to control
58
+ # this, which, of course, Pod4::Model does not know about. If you want to enable a non-cached
59
+ # read in your model, it will need a method something like this:
60
+ #
61
+ # def read_no_cache
62
+ # r = interface.read(@model_id, caching: false)
63
+ #
64
+ # if r.empty?
65
+ # add_alert(:error, "Record ID '#@model_id' not found on the data source")
66
+ # else
67
+ # map_to_model(r)
68
+ # run_validation(:read)
69
+ # @model_status = :okay if @model_status == :empty
70
+ # end
71
+ #
56
72
  class NebulousInterface < Interface
57
73
 
58
74
  attr_reader :id_fld
@@ -176,14 +192,20 @@ module Pod4
176
192
  # Returns an array of Octothorpes, or an empty array if the responder could not make any
177
193
  # records out of our message.
178
194
  #
179
- def list(selection=nil)
195
+ # Note that the `opts` hash is not part of the protocol supported by Pod4::Model. If you want
196
+ # to make use of it, you will have to write your own method for that. Supported keys:
197
+ #
198
+ # * caching: true if you want to use redis caching (defaults to true)
199
+ #
200
+ def list(selection=nil, opts={})
180
201
  sel =
181
202
  case selection
182
203
  when Array, Hash, Octothorpe then param_string(:list, selection)
183
204
  else selection
184
205
  end
185
206
 
186
- send_message( verb_for(:list), sel )
207
+ caching = opts[:caching].nil? ? true : !!opts[:caching]
208
+ send_message( verb_for(:list), sel, caching )
187
209
  @response.body.is_a?(Array) ? @response.body.map{|e| Octothorpe.new e} : []
188
210
 
189
211
  rescue => e
@@ -192,14 +214,14 @@ module Pod4
192
214
 
193
215
 
194
216
  ##
195
- # Pass a parameter string or an array as the record. returns the ID.# We assume that the
217
+ # Pass a parameter string or an array as the record. returns the ID. We assume that the
196
218
  # response to the create message returns the ID as the parameter part of the success verb. If
197
219
  # that's not true, then you will have to override #create and sort this out yourself.
198
220
  #
199
221
  def create(record)
200
222
  raise ArgumentError, 'create takes a Hash or an Octothorpe' unless hashy?(record)
201
223
 
202
- send_message( verb_for(:create), param_string(:create, record) )
224
+ send_message( verb_for(:create), param_string(:create, record), false )
203
225
  @response.params
204
226
 
205
227
  rescue => e
@@ -212,10 +234,18 @@ module Pod4
212
234
  #
213
235
  # The actual parameters passed to nebulous depend on how you #set_verb
214
236
  #
215
- def read(id)
237
+ # Note that the `opts` hash is not part of the protocol supported by Pod4::Model. If you want
238
+ # to make use of it, you will have to write your own method for that. Supported keys:
239
+ #
240
+ # * caching: true if you want to use redis caching (defaults to true)
241
+ #
242
+ def read(id, opts={})
216
243
  raise ArgumentError, 'You must pass an ID to read' unless id
217
244
 
218
- send_message( verb_for(:read), param_string(:read, nil, id) )
245
+ caching = opts[:caching].nil? ? true : !!opts[:caching]
246
+ send_message( verb_for(:read),
247
+ param_string(:read, nil, id),
248
+ caching )
219
249
 
220
250
  Octothorpe.new( @response.body.is_a?(Hash) ? @response.body : {} )
221
251
  end
@@ -258,12 +288,16 @@ module Pod4
258
288
  #
259
289
  # @interface.clearing_cache.read(14)
260
290
  #
291
+ # Note that there is no guarantee that the request that clears the cache is actually the one
292
+ # you chain after (if multiple model instances are running against the same interface instance)
293
+ # but for the instance that calls `clearing_cache`, this is not important.
294
+ #
261
295
  def clearing_cache
262
296
  @clear_cache = true
263
297
  self
264
298
  end
265
299
 
266
-
300
+
267
301
  ##
268
302
  # Bonus method: send an arbitrary Nebulous message to the target and return the response object.
269
303
  #
data/lib/pod4/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Pod4
2
- VERSION = '0.9.0'
2
+ VERSION = '0.9.1'
3
3
  end
@@ -21,6 +21,13 @@ require_relative 'shared_examples_for_interface'
21
21
  #
22
22
  class FakeRequester
23
23
 
24
+ # Helper to record the first message sent to us.
25
+ class << self
26
+ def clear_method; @@method = nil; end
27
+ def set_method(x); @@method ||= x; end
28
+ def method; @@method; end
29
+ end
30
+
24
31
  def initialize(data={}); @data = data; end
25
32
 
26
33
  ##
@@ -35,6 +42,13 @@ class FakeRequester
35
42
  request = NebulousStomp::Request.new(target, requestmsg)
36
43
  request.stomp_handler = stomphandler
37
44
 
45
+ # We need to know which send method was called. Note that #send calls #send_no_cache, so we
46
+ # record the first method called.
47
+ class << request
48
+ def send(*args); FakeRequester.set_method :send; super; end
49
+ def send_no_cache(*args); FakeRequester.set_method :send_no_cache; super; end
50
+ end
51
+
38
52
  hash[:inReplyTo] = request.message.reply_id
39
53
  responsemsg = NebulousStomp::Message.new hash
40
54
  stomphandler.insert_fake(responsemsg)
@@ -162,9 +176,11 @@ describe "NebulousInterface" do
162
176
  3 => {id: 3, name: 'Betty', price: 3.33} }
163
177
  end
164
178
 
179
+ let(:fake) { FakeRequester.new(data) }
180
+
165
181
  let(:interface) do
166
182
  init_nebulous
167
- nebulous_interface_class.new( FakeRequester.new(data) )
183
+ nebulous_interface_class.new(fake)
168
184
  end
169
185
 
170
186
 
@@ -197,6 +213,12 @@ describe "NebulousInterface" do
197
213
  expect( interface.read(id).to_h ).to include ot.to_h
198
214
  end
199
215
 
216
+ it 'creates a non-caching request' do
217
+ FakeRequester.clear_method
218
+ id = interface.create(ot)
219
+ expect( FakeRequester.method ).to eq :send_no_cache
220
+ end
221
+
200
222
  end
201
223
  ##
202
224
 
@@ -216,11 +238,22 @@ describe "NebulousInterface" do
216
238
  expect( interface.read(99) ).to be_empty
217
239
  end
218
240
 
241
+ it 'creates a caching request' do
242
+ FakeRequester.clear_method
243
+ id = interface.read(1)
244
+ expect( FakeRequester.method ).to eq :send
245
+ end
246
+
247
+ it "creates a non-caching request when passed an option" do
248
+ FakeRequester.clear_method
249
+ id = interface.read(1, caching: false)
250
+ expect( FakeRequester.method ).to eq :send_no_cache
251
+ end
252
+
219
253
  end
220
254
  ##
221
255
 
222
256
 
223
-
224
257
  describe '#list' do
225
258
 
226
259
  it 'has an optional selection parameter, a hash' do
@@ -250,6 +283,19 @@ describe "NebulousInterface" do
250
283
  expect( interface.list ).to eq([])
251
284
  end
252
285
 
286
+ it 'creates a caching request' do
287
+ FakeRequester.clear_method
288
+ interface.list(name: 'Fred')
289
+ expect( FakeRequester.method ).to eq :send
290
+ end
291
+
292
+ it "creates a non-caching request when passed an option" do
293
+ FakeRequester.clear_method
294
+ interface.list({name: 'Fred'}, caching: false)
295
+ expect( FakeRequester.method ).to eq :send_no_cache
296
+ end
297
+
298
+
253
299
  end
254
300
  ##
255
301
 
@@ -265,6 +311,15 @@ describe "NebulousInterface" do
265
311
  expect( interface.read(id).to_h ).to include(rec)
266
312
  end
267
313
 
314
+ it 'creates a non-caching request' do
315
+ i = id # creates a request, so get it done now
316
+ rec = {price: 99.99}
317
+
318
+ FakeRequester.clear_method
319
+ interface.update(i, rec)
320
+ expect( FakeRequester.method ).to eq :send_no_cache
321
+ end
322
+
268
323
  end
269
324
  ##
270
325
 
@@ -288,6 +343,14 @@ describe "NebulousInterface" do
288
343
  expect( list_contains(id) ).to be_falsy
289
344
  end
290
345
 
346
+ it 'creates a non-caching request' do
347
+ i = id # creates a request, so get it done now
348
+
349
+ FakeRequester.clear_method
350
+ interface.delete(i)
351
+ expect( FakeRequester.method ).to eq :send_no_cache
352
+ end
353
+
291
354
  end
292
355
  ##
293
356
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pod4
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.0
4
+ version: 0.9.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andy Jones
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-12-15 00:00:00.000000000 Z
11
+ date: 2018-04-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: devnull
@@ -119,7 +119,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
119
119
  version: '0'
120
120
  requirements: []
121
121
  rubyforge_project:
122
- rubygems_version: 2.5.2
122
+ rubygems_version: 2.7.3
123
123
  signing_key:
124
124
  specification_version: 4
125
125
  summary: Totally not an ORM