oai 1.0.1 → 1.1.0

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
  SHA256:
3
- metadata.gz: e7cdbec6f4b6ca5a672add7fe1463748bd9f8a9cdf50a55400a5711e45be6ef9
4
- data.tar.gz: 6a22c53d9520777e69bb6e32032880cb53793d89a2712a5b7b7370d02553ff25
3
+ metadata.gz: a38ed7a207f21bd0453bc57e1fbc85afd5bc185ea015c165883b35fa919324f2
4
+ data.tar.gz: af3b9d1dd6b6a541c14d8f45589a195639124c1320e3c8b457ceef7587b79d30
5
5
  SHA512:
6
- metadata.gz: 1cf4fa083c9c4486110ec0c7322ac077addd66050a3085291b591597c02ec8d02ca8230594e2fc16070d700dd243ec0f3f74d63ca4684522828f6431f15f6bf7
7
- data.tar.gz: 8bca0a510ff38a28e0e4119e645759e627a19aca0aed1259b2129592094c4851da7337b0824054660b2b87fd07daf7b529ad7fe30dfe237aa90f9b5a5faac81a
6
+ metadata.gz: c9ed45d797ebac1874e5bbd07801724b674f72057700c8826e0dd1bd2d19dd1303d991c5da7165737c546c22492e3e37a629b6f9ec04c553710e833ac4987987
7
+ data.tar.gz: db70ac4bf68c40a2bb78e1fa2d722ee9fdb52a53486ccaa7b3effa634aa0a536699474f64d25e1c0a47aed8ab62d0bc02a1be16d12f8b24c5a1e5524aef8f319
@@ -139,6 +139,35 @@ end
139
139
  #
140
140
  # Special thanks to Jose Hales-Garcia for this solution.
141
141
  #
142
+ # ### Leverage the Provider instance
143
+ #
144
+ # The traditional implementation of the OAI::Provider would pass the OAI::Provider
145
+ # class to the different resposnes. This made it hard to inject context into a
146
+ # common provider. Consider that we might have different request headers that
147
+ # change the scope of the OAI::Provider queries.
148
+ #
149
+ # ```ruby
150
+ # class InstanceProvider
151
+ # def initialize(options = {})
152
+ # super({ :provider_context => :instance_based })
153
+ # @controller = options.fetch(:controller)
154
+ # end
155
+ # attr_reader :controller
156
+ # end
157
+ #
158
+ # class OaiController < ApplicationController
159
+ # def index
160
+ # provider = InstanceProvider.new({ :controller => self })
161
+ # request_body = provider.process_request(oai_params.to_h)
162
+ # render :body => request_body, :content_type => 'text/xml'
163
+ # end
164
+ # ```
165
+ #
166
+ # In the above example, the underlying response object will now receive an
167
+ # instance of the InstanceProvider. Without the `super({ :provider_context => :instance_based })`
168
+ # the response objects would have received the class InstanceProvider as the
169
+ # given provider.
170
+ #
142
171
  # ## Supporting custom metadata formats
143
172
  #
144
173
  # See {OAI::MetadataFormat} for details.
@@ -292,39 +321,132 @@ module OAI::Provider
292
321
 
293
322
  Base.register_format(OAI::Provider::Metadata::DublinCore.instance)
294
323
 
324
+ PROVIDER_CONTEXTS = {
325
+ :class_based => :class_based,
326
+ :instance_based => :instance_based
327
+ }
328
+
329
+ def initialize(options = {})
330
+ provider_context = options.fetch(:provider_context) { :class_based }
331
+ @provider_context = PROVIDER_CONTEXTS.fetch(provider_context)
332
+ end
333
+
334
+ # @note These are the accessor methods on the class. If you need to overwrite
335
+ # them on the instance level you can do that. However, an instance of this
336
+ # class won't be used unless you initialize with:
337
+ # { :provider_context => :instance_based }
338
+ attr_writer :name, :url, :prefix, :email, :delete_support, :granularity, :model, :identifier, :description
339
+
340
+ # The traditional interaction of a Provider has been to:
341
+ #
342
+ # 1) Assign attributes to the Provider class
343
+ # 2) Instantiate the Provider class
344
+ # 3) Call response instance methods for theProvider which pass
345
+ # the Provider class and not the instance.
346
+ #
347
+ # The above behavior continues unless you initialize the Provider with
348
+ # { :provider_context => :instance_based }. If you do that, then the
349
+ # Provider behavior will be:
350
+ #
351
+ # 1) Assign attributes to Provider class
352
+ # 2) Instantiate the Provider class
353
+ # 3) Call response instance methods for theProvider which pass an
354
+ # instance of the Provider to those response objects.
355
+ # a) The instance will mirror all of the assigned Provider class
356
+ # attributes, but allows for overriding and extending on a
357
+ # case by case basis.
358
+ # (Dear reader, please note the second behavior is something most
359
+ # of us would've assumed to be the case, but for historic now lost
360
+ # reasons is not the case.)
361
+ def provider_context
362
+ if @provider_context == :instance_based
363
+ self
364
+ else
365
+ self.class
366
+ end
367
+ end
368
+
369
+ def format_supported?(*args)
370
+ self.class.format_supported?(*args)
371
+ end
372
+
373
+ def format(*args)
374
+ self.class.format(*args)
375
+ end
376
+
377
+ def formats
378
+ self.class.formats
379
+ end
380
+
381
+ def name
382
+ @name || self.class.name
383
+ end
384
+
385
+ def url
386
+ @url || self.class.url
387
+ end
388
+
389
+ def prefix
390
+ @prefix || self.class.prefix
391
+ end
392
+
393
+ def email
394
+ @email || self.class.email
395
+ end
396
+
397
+ def delete_support
398
+ @delete_support || self.class.delete_support
399
+ end
400
+
401
+ def granularity
402
+ @granularity || self.class.granularity
403
+ end
404
+
405
+ def model
406
+ @model || self.class.model
407
+ end
408
+
409
+ def identifier
410
+ @identifier || self.class.identifier
411
+ end
412
+
413
+ def description
414
+ @description || self.class.description
415
+ end
416
+
295
417
  # Equivalent to '&verb=Identify', returns information about the repository
296
418
  def identify(options = {})
297
- Response::Identify.new(self.class, options).to_xml
419
+ Response::Identify.new(provider_context, options).to_xml
298
420
  end
299
421
 
300
422
  # Equivalent to '&verb=ListSets', returns a list of sets that are supported
301
423
  # by the repository or an error if sets are not supported.
302
424
  def list_sets(options = {})
303
- Response::ListSets.new(self.class, options).to_xml
425
+ Response::ListSets.new(provider_context, options).to_xml
304
426
  end
305
427
 
306
428
  # Equivalent to '&verb=ListMetadataFormats', returns a list of metadata formats
307
429
  # supported by the repository.
308
430
  def list_metadata_formats(options = {})
309
- Response::ListMetadataFormats.new(self.class, options).to_xml
431
+ Response::ListMetadataFormats.new(provider_context, options).to_xml
310
432
  end
311
433
 
312
434
  # Equivalent to '&verb=ListIdentifiers', returns a list of record headers that
313
435
  # meet the supplied criteria.
314
436
  def list_identifiers(options = {})
315
- Response::ListIdentifiers.new(self.class, options).to_xml
437
+ Response::ListIdentifiers.new(provider_context, options).to_xml
316
438
  end
317
439
 
318
440
  # Equivalent to '&verb=ListRecords', returns a list of records that meet the
319
441
  # supplied criteria.
320
442
  def list_records(options = {})
321
- Response::ListRecords.new(self.class, options).to_xml
443
+ Response::ListRecords.new(provider_context, options).to_xml
322
444
  end
323
445
 
324
446
  # Equivalent to '&verb=GetRecord', returns a record matching the required
325
447
  # :identifier option
326
448
  def get_record(options = {})
327
- Response::GetRecord.new(self.class, options).to_xml
449
+ Response::GetRecord.new(provider_context, options).to_xml
328
450
  end
329
451
 
330
452
  # xml_response = process_verb('ListRecords', :from => 'October 1, 2005',
@@ -336,7 +458,7 @@ module OAI::Provider
336
458
  begin
337
459
 
338
460
  # Allow the request to pass in a url
339
- self.class.url = params['url'] ? params.delete('url') : self.class.url
461
+ provider_context.url = params['url'] ? params.delete('url') : self.url
340
462
 
341
463
  verb = params.delete('verb') || params.delete(:verb)
342
464
 
@@ -0,0 +1,41 @@
1
+ require 'test_helper_provider'
2
+
3
+ class TestInstanceProvider < Test::Unit::TestCase
4
+
5
+ # Prior to the commit introducing this code, the InstanceProvider#identify
6
+ # method would instantiate a Response::Identify object, passing the
7
+ # InstanceProvider class as the provider for the Response::Identify
8
+ # instance. With the commit introducing this test, the
9
+ # InstanceProvider#identify now passes the instance of InstanceProvider
10
+ # to the instantiation of Response::Identify.
11
+ #
12
+ # Thus we can override, on an instance by instance basis, the behavior of a
13
+ # response object.
14
+ def test_instance_used_in_responses
15
+ @url_path = "/stringy-mc-string-face"
16
+ @instance_provider = InstanceProvider.new({ :provider_context => :instance_based, :url_path => @url_path })
17
+
18
+ xml = @instance_provider.identify
19
+ doc = REXML::Document.new(xml)
20
+ assert_equal "http://localhost#{@url_path}", doc.elements["OAI-PMH/Identify/baseURL"].text
21
+ end
22
+
23
+ def test_class_used_in_responses
24
+ @url_path = "/stringy-mc-string-face"
25
+ @instance_provider = InstanceProvider.new({ :provider_context => :class_based, :url_path => @url_path })
26
+
27
+ xml = @instance_provider.identify
28
+ doc = REXML::Document.new(xml)
29
+ assert_equal "http://localhost", doc.elements["OAI-PMH/Identify/baseURL"].text
30
+ end
31
+
32
+ def test_by_default_class_used_in_responses
33
+ @url_path = "/stringy-mc-string-face"
34
+ @instance_provider = InstanceProvider.new({ :url_path => @url_path })
35
+
36
+ xml = @instance_provider.identify
37
+ doc = REXML::Document.new(xml)
38
+ assert_equal "http://localhost", doc.elements["OAI-PMH/Identify/baseURL"].text
39
+ end
40
+
41
+ end
@@ -43,3 +43,20 @@ class DescribedProvider < Provider::Base
43
43
  sample_id '13900'
44
44
  extra_description "<my_custom_xml />"
45
45
  end
46
+
47
+ class InstanceProvider < Provider::Base
48
+ repository_name 'Instance Provider'
49
+ record_prefix 'oai:test'
50
+ repository_url 'http://localhost'
51
+ source_model SimpleModel.new
52
+
53
+ def initialize(options = {})
54
+ super
55
+ @url_path = options.fetch(:url_path)
56
+ end
57
+ attr_reader :url_path
58
+
59
+ def url
60
+ File.join(super, url_path)
61
+ end
62
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: oai
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ed Summers
8
8
  autorequire: oai
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-01-21 00:00:00.000000000 Z
11
+ date: 2020-03-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: builder
@@ -172,6 +172,7 @@ files:
172
172
  - test/provider/models.rb
173
173
  - test/provider/tc_exceptions.rb
174
174
  - test/provider/tc_functional_tokens.rb
175
+ - test/provider/tc_instance_provider.rb
175
176
  - test/provider/tc_provider.rb
176
177
  - test/provider/tc_resumption_tokens.rb
177
178
  - test/provider/tc_simple_provider.rb
@@ -195,7 +196,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
195
196
  - !ruby/object:Gem::Version
196
197
  version: '0'
197
198
  requirements: []
198
- rubygems_version: 3.0.3
199
+ rubygems_version: 3.1.2
199
200
  signing_key:
200
201
  specification_version: 4
201
202
  summary: A ruby library for working with the Open Archive Initiative Protocol for