fieldhand 0.4.0 → 0.5.0
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/README.md +13 -9
- data/lib/fieldhand/network_errors.rb +14 -0
- data/lib/fieldhand/paginator.rb +6 -7
- data/spec/fieldhand/paginator_spec.rb +24 -0
- metadata +3 -3
- data/lib/fieldhand/network_error.rb +0 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 67cb8ee7c5ff120c78181ef597a9f2ea46ed4e51
|
4
|
+
data.tar.gz: c83dbeb7abe6832c9e2b65fef55689c195c63805
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b5adbfea0e91229dce93d0e95a4daca0d206cb7746875f956c912e4934170b152e8afd3719ab851190a7f5c57a1b3f852db14b0f73a06aaffda9ad29ca09ad4a
|
7
|
+
data.tar.gz: 667cc59bb4b785d383eeb3314483bc3a05ba66ada5843d27d3998e2d75baf0605ea35de2cc83949bafaf31115a2389b8975bf1523bc66b69ee7b6effb996ba3c
|
data/README.md
CHANGED
@@ -2,19 +2,19 @@
|
|
2
2
|
|
3
3
|
A Ruby library for harvesting metadata from [OAI-PMH](https://www.openarchives.org/OAI/openarchivesprotocol.html) repositories.
|
4
4
|
|
5
|
-
**Current version:** 0.
|
5
|
+
**Current version:** 0.5.0
|
6
6
|
**Supported Ruby versions:** 1.8.7, 1.9.2, 1.9.3, 2.0, 2.1, 2.2
|
7
7
|
|
8
8
|
## Installation
|
9
9
|
|
10
10
|
```
|
11
|
-
gem install fieldhand -v '~> 0.
|
11
|
+
gem install fieldhand -v '~> 0.5'
|
12
12
|
```
|
13
13
|
|
14
14
|
Or, in your `Gemfile`:
|
15
15
|
|
16
16
|
```ruby
|
17
|
-
gem 'fieldhand', '~> 0.
|
17
|
+
gem 'fieldhand', '~> 0.5'
|
18
18
|
```
|
19
19
|
|
20
20
|
## Usage
|
@@ -88,7 +88,8 @@ repository.get('oai:www.example.com:12345')
|
|
88
88
|
* [`#sets`](#fieldhandheadersets)
|
89
89
|
* [`#response_date`](#fieldhandheaderresponse_date)
|
90
90
|
* [`Fieldhand::NetworkError`](#fieldhandnetworkerror)
|
91
|
-
* [`Fieldhand::
|
91
|
+
* [`Fieldhand::ResponseError`](#fieldhandresponseerror)
|
92
|
+
* [`Fieldhand::ResponseError#response`](#fieldhandresponseerrorresponse)
|
92
93
|
* [`Fieldhand::ProtocolError`](#fieldhandprotocolerror)
|
93
94
|
* [`Fieldhand::BadArgumentError`](#fieldhandbadargumenterror)
|
94
95
|
* [`Fieldhand::BadResumptionTokenError`](#fieldhandbadresumptiontokenerror)
|
@@ -537,19 +538,22 @@ Return the time and date that the response was sent.
|
|
537
538
|
|
538
539
|
### `Fieldhand::NetworkError`
|
539
540
|
|
540
|
-
An error (descended from `StandardError`) to represent any network issues encountered during interaction with the repository.
|
541
|
+
An error (descended from `StandardError`) to represent any network issues encountered during interaction with the repository. Any underlying exception is exposed in Ruby 2.1 onwards through [`Exception#cause`](https://ruby-doc.org/core-2.1.0/Exception.html#method-i-cause).
|
542
|
+
|
543
|
+
#### `Fieldhand::ResponseError`
|
544
|
+
|
545
|
+
An error (descended from `NetworkError`) to represent any issues in the response from the repository.
|
541
546
|
If the HTTP request is not successful (returning a status code other than 200),
|
542
|
-
a `
|
543
|
-
Any underlying exception is exposed in Ruby 2.1 onwards through [`Exception#cause`](https://ruby-doc.org/core-2.1.0/Exception.html#method-i-cause).
|
547
|
+
a `ResponseError` exception will be raised containing the error message and the response object.
|
544
548
|
|
545
|
-
|
549
|
+
##### Fieldhand::ResponseError#response
|
546
550
|
|
547
551
|
```ruby
|
548
552
|
begin
|
549
553
|
repository.records.each do |record|
|
550
554
|
# ...
|
551
555
|
end
|
552
|
-
rescue Fieldhand::
|
556
|
+
rescue Fieldhand::ResponseError => e
|
553
557
|
puts e.response
|
554
558
|
#=> #<Net::HTTPServiceUnavailable 503 Service Unavailable readbody=true>
|
555
559
|
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Fieldhand
|
2
|
+
NetworkError = ::Class.new(::StandardError)
|
3
|
+
|
4
|
+
# Custom exception to handle unexpected HTTP responses
|
5
|
+
class ResponseError < NetworkError
|
6
|
+
attr_reader :response
|
7
|
+
|
8
|
+
def initialize(response)
|
9
|
+
super("Invalid response: #{response.code} #{response.msg}")
|
10
|
+
|
11
|
+
@response = response
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
data/lib/fieldhand/paginator.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
require 'fieldhand/logger'
|
2
|
-
require 'fieldhand/
|
2
|
+
require 'fieldhand/network_errors'
|
3
3
|
require 'fieldhand/response_parser'
|
4
4
|
require 'cgi'
|
5
5
|
require 'net/http'
|
@@ -67,7 +67,10 @@ module Fieldhand
|
|
67
67
|
private
|
68
68
|
|
69
69
|
def parse_response(query = {})
|
70
|
-
|
70
|
+
response = request(query)
|
71
|
+
raise ResponseError, response unless response.is_a?(::Net::HTTPSuccess)
|
72
|
+
|
73
|
+
response_parser = ResponseParser.new(response.body)
|
71
74
|
response_parser.errors.each do |error|
|
72
75
|
raise error
|
73
76
|
end
|
@@ -80,14 +83,10 @@ module Fieldhand
|
|
80
83
|
request_uri.query = encode_query(query)
|
81
84
|
|
82
85
|
logger.info('Fieldhand') { "GET #{request_uri}" }
|
83
|
-
|
84
|
-
raise NetworkError.new("Invalid response: #{res.code} #{res.msg}", res) unless res.is_a?(::Net::HTTPSuccess)
|
85
|
-
|
86
|
-
res.body
|
86
|
+
http.get(request_uri.request_uri)
|
87
87
|
rescue ::Timeout::Error => e
|
88
88
|
raise NetworkError, "timeout requesting #{query}: #{e}"
|
89
89
|
rescue => e
|
90
|
-
raise e if e.is_a?(NetworkError)
|
91
90
|
raise NetworkError, "error requesting #{query}: #{e}"
|
92
91
|
end
|
93
92
|
|
@@ -84,6 +84,30 @@ module Fieldhand
|
|
84
84
|
expect { paginator.items('ListSets', ListSetsParser).first }.
|
85
85
|
to raise_error(NoSetHierarchyError)
|
86
86
|
end
|
87
|
+
|
88
|
+
it 'raises a Response Error if an unsuccessful response is returned' do
|
89
|
+
stub_request(:get, 'http://www.example.com/oai?verb=Identify').
|
90
|
+
to_return(:status => 503, :body => 'Retry after 5 seconds')
|
91
|
+
paginator = described_class.new('http://www.example.com/oai')
|
92
|
+
|
93
|
+
expect { paginator.items('Identify', IdentifyParser).first }.
|
94
|
+
to raise_error(ResponseError)
|
95
|
+
end
|
96
|
+
|
97
|
+
it 'raises a Response Error containing a response object' do
|
98
|
+
stub_request(:get, 'http://www.example.com/oai?verb=Identify').
|
99
|
+
to_return(:status => 503, :body => 'Retry after 5 seconds')
|
100
|
+
paginator = described_class.new('http://www.example.com/oai')
|
101
|
+
error = nil
|
102
|
+
|
103
|
+
begin
|
104
|
+
paginator.items('Identify', IdentifyParser).first
|
105
|
+
rescue => e
|
106
|
+
error = e
|
107
|
+
end
|
108
|
+
|
109
|
+
expect(error.response.body).to eq('Retry after 5 seconds')
|
110
|
+
end
|
87
111
|
end
|
88
112
|
end
|
89
113
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fieldhand
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Paul Mucur
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2017-07-
|
13
|
+
date: 2017-07-11 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: ox
|
@@ -101,7 +101,7 @@ files:
|
|
101
101
|
- lib/fieldhand/list_sets_parser.rb
|
102
102
|
- lib/fieldhand/logger.rb
|
103
103
|
- lib/fieldhand/metadata_format.rb
|
104
|
-
- lib/fieldhand/
|
104
|
+
- lib/fieldhand/network_errors.rb
|
105
105
|
- lib/fieldhand/paginator.rb
|
106
106
|
- lib/fieldhand/record.rb
|
107
107
|
- lib/fieldhand/repository.rb
|