fieldhand 0.8.0 → 0.9.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/LICENSE +1 -1
- data/README.md +8 -7
- data/lib/fieldhand/options.rb +6 -0
- data/lib/fieldhand/paginator.rb +13 -4
- data/lib/fieldhand/repository.rb +6 -5
- data/spec/fieldhand/options_spec.rb +14 -0
- data/spec/fieldhand/paginator_spec.rb +33 -0
- data/spec/fieldhand/repository_spec.rb +24 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fc45bc1384bec75919f2d929ee512748554511d90b0818024b930f4c133a70b2
|
4
|
+
data.tar.gz: c31b6bb9872a34e3bd65bc94cb76364c645c767970e3a277a3c69b6b1831f3c2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 76896e2562bd40ed991d10fe57bb07532a42aa08f5653c78342756819010d62ff66b854c39cf3fb74d6004ab049623870091a9725fbd960de8a89bcc25d02b83
|
7
|
+
data.tar.gz: 071e2ee3300fa813699eda02ab107c02f1362241a893e7beb2b1d2becba8ac14364ab7890a870fe4de43f0dde1f87a593856a310c19b26b3740f76baf4802d84
|
data/LICENSE
CHANGED
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.9.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.9'
|
12
12
|
```
|
13
13
|
|
14
14
|
Or, in your `Gemfile`:
|
15
15
|
|
16
16
|
```ruby
|
17
|
-
gem 'fieldhand', '~> 0.
|
17
|
+
gem 'fieldhand', '~> 0.9'
|
18
18
|
```
|
19
19
|
|
20
20
|
## Usage
|
@@ -114,15 +114,16 @@ A class to represent [an OAI-PMH repository](https://www.openarchives.org/OAI/op
|
|
114
114
|
```ruby
|
115
115
|
Fieldhand::Repository.new('http://www.example.com/oai')
|
116
116
|
Fieldhand::Repository.new(URI('http://www.example.com/oai'))
|
117
|
-
Fieldhand::Repository.new('http://www.example.com/oai', :logger => Logger.new(STDOUT), :timeout => 10)
|
117
|
+
Fieldhand::Repository.new('http://www.example.com/oai', :logger => Logger.new(STDOUT), :timeout => 10, :bearer_token => 'decafbad')
|
118
118
|
```
|
119
119
|
|
120
120
|
Return a new [`Repository`](#fieldhandrepository) instance accessible at the given `uri` (specified
|
121
121
|
either as a [`URI`][URI] or
|
122
|
-
something that can be coerced into a `URI` such as a `String`) with
|
122
|
+
something that can be coerced into a `URI` such as a `String`) with three options passed as a `Hash`:
|
123
123
|
|
124
124
|
* `:logger`: a [`Logger`](http://ruby-doc.org/stdlib/libdoc/logger/rdoc/Logger.html)-compatible `logger`, defaults to a platform-specific null logger;
|
125
|
-
* `:timeout`: a `Numeric` number of seconds to wait before timing out any HTTP requests, defaults to 60
|
125
|
+
* `:timeout`: a `Numeric` number of seconds to wait before timing out any HTTP requests, defaults to 60;
|
126
|
+
* `:bearer_token`: a `String` bearer token to authorize any HTTP requests, defaults to `nil`.
|
126
127
|
|
127
128
|
#### `Fieldhand::Repository#identify`
|
128
129
|
|
@@ -632,6 +633,6 @@ This can be used to rescue all the following child error types.
|
|
632
633
|
|
633
634
|
## License
|
634
635
|
|
635
|
-
Copyright © 2017 Altmetric LLP
|
636
|
+
Copyright © 2017-2018 Altmetric LLP
|
636
637
|
|
637
638
|
Distributed under the MIT License.
|
data/lib/fieldhand/options.rb
CHANGED
@@ -16,6 +16,7 @@ module Fieldhand
|
|
16
16
|
# * :logger - A `Logger`-compatible class for logging the activity of the library, defaults to a platform-specific
|
17
17
|
# null logger
|
18
18
|
# * :timeout - A `Numeric` number of seconds to wait for any HTTP requests, defaults to 60 seconds
|
19
|
+
# * :bearer_token - A `String` bearer token to use when sending any HTTP requests, defaults to nil
|
19
20
|
def initialize(logger_or_options = {})
|
20
21
|
@logger_or_options = logger_or_options
|
21
22
|
end
|
@@ -30,6 +31,11 @@ module Fieldhand
|
|
30
31
|
options.fetch(:logger) { Logger.null }
|
31
32
|
end
|
32
33
|
|
34
|
+
# Return the current bearer token.
|
35
|
+
def bearer_token
|
36
|
+
options[:bearer_token]
|
37
|
+
end
|
38
|
+
|
33
39
|
private
|
34
40
|
|
35
41
|
def options
|
data/lib/fieldhand/paginator.rb
CHANGED
@@ -11,19 +11,21 @@ module Fieldhand
|
|
11
11
|
#
|
12
12
|
# See https://www.openarchives.org/OAI/openarchivesprotocol.html#FlowControl
|
13
13
|
class Paginator
|
14
|
-
attr_reader :uri, :logger, :timeout, :http
|
14
|
+
attr_reader :uri, :logger, :timeout, :bearer_token, :http
|
15
15
|
|
16
|
-
# Return a new paginator for the given repository base URI and optional logger and
|
16
|
+
# Return a new paginator for the given repository base URI and optional logger, timeout and bearer token.
|
17
17
|
#
|
18
18
|
# The URI can be passed as either a `URI` or something that can be parsed as a URI such as a string.
|
19
19
|
#
|
20
|
-
# The logger will default to a null logger appropriate to this platform
|
20
|
+
# The logger will default to a null logger appropriate to this platform, timeout will default to 60 seconds and the
|
21
|
+
# bearer token will default to nil.
|
21
22
|
def initialize(uri, logger_or_options = {})
|
22
23
|
@uri = uri.is_a?(::URI) ? uri : URI(uri)
|
23
24
|
|
24
25
|
options = Options.new(logger_or_options)
|
25
26
|
@logger = options.logger
|
26
27
|
@timeout = options.timeout
|
28
|
+
@bearer_token = options.bearer_token
|
27
29
|
|
28
30
|
@http = ::Net::HTTP.new(@uri.host, @uri.port)
|
29
31
|
@http.read_timeout = @timeout
|
@@ -89,7 +91,7 @@ module Fieldhand
|
|
89
91
|
request_uri.query = encode_query(query)
|
90
92
|
|
91
93
|
logger.info('Fieldhand') { "GET #{request_uri}" }
|
92
|
-
http.
|
94
|
+
http.request(authenticated_request(request_uri.request_uri))
|
93
95
|
rescue ::Timeout::Error => e
|
94
96
|
raise NetworkError, "timeout requesting #{query}: #{e}"
|
95
97
|
rescue => e
|
@@ -99,5 +101,12 @@ module Fieldhand
|
|
99
101
|
def encode_query(query = {})
|
100
102
|
query.map { |k, v| ::CGI.escape(k) << '=' << ::CGI.escape(v) }.join('&')
|
101
103
|
end
|
104
|
+
|
105
|
+
def authenticated_request(uri)
|
106
|
+
request = ::Net::HTTP::Get.new(uri)
|
107
|
+
request['Authorization'] = "Bearer #{bearer_token}" if bearer_token
|
108
|
+
|
109
|
+
request
|
110
|
+
end
|
102
111
|
end
|
103
112
|
end
|
data/lib/fieldhand/repository.rb
CHANGED
@@ -14,22 +14,23 @@ module Fieldhand
|
|
14
14
|
#
|
15
15
|
# See https://www.openarchives.org/OAI/openarchivesprotocol.html
|
16
16
|
class Repository
|
17
|
-
attr_reader :uri, :logger, :timeout
|
17
|
+
attr_reader :uri, :logger, :timeout, :bearer_token
|
18
18
|
|
19
|
-
# Return a new repository with the given base URL and an optional logger and
|
19
|
+
# Return a new repository with the given base URL and an optional logger, timeout and bearer token.
|
20
20
|
#
|
21
21
|
# The base URL can be passed as a `URI` or anything that can be parsed as a URI such as a string.
|
22
22
|
#
|
23
23
|
# For backward compatibility, the second argument can either be a logger or a hash containing
|
24
|
-
# a logger and
|
24
|
+
# a logger, timeout and bearer token.
|
25
25
|
#
|
26
|
-
# Defaults to using a null logger specific to this platform
|
26
|
+
# Defaults to using a null logger specific to this platform, a timeout of 60 seconds and no bearer token.
|
27
27
|
def initialize(uri, logger_or_options = {})
|
28
28
|
@uri = uri.is_a?(::URI) ? uri : URI(uri)
|
29
29
|
|
30
30
|
options = Options.new(logger_or_options)
|
31
31
|
@logger = options.logger
|
32
32
|
@timeout = options.timeout
|
33
|
+
@bearer_token = options.bearer_token
|
33
34
|
end
|
34
35
|
|
35
36
|
# Send an Identify request to the repository and return an `Identify` response.
|
@@ -133,7 +134,7 @@ module Fieldhand
|
|
133
134
|
private
|
134
135
|
|
135
136
|
def paginator
|
136
|
-
@paginator ||= Paginator.new(uri, :logger => logger, :timeout => timeout)
|
137
|
+
@paginator ||= Paginator.new(uri, :logger => logger, :timeout => timeout, :bearer_token => bearer_token)
|
137
138
|
end
|
138
139
|
end
|
139
140
|
end
|
@@ -55,5 +55,19 @@ module Fieldhand
|
|
55
55
|
expect(options.logger).to be_nil
|
56
56
|
end
|
57
57
|
end
|
58
|
+
|
59
|
+
describe '#bearer_token' do
|
60
|
+
it 'defaults to nil' do
|
61
|
+
options = described_class.new({})
|
62
|
+
|
63
|
+
expect(options.bearer_token).to be_nil
|
64
|
+
end
|
65
|
+
|
66
|
+
it 'can be overridden by passing a token in an option' do
|
67
|
+
options = described_class.new(:bearer_token => 'decafbad')
|
68
|
+
|
69
|
+
expect(options.bearer_token).to eq('decafbad')
|
70
|
+
end
|
71
|
+
end
|
58
72
|
end
|
59
73
|
end
|
@@ -145,5 +145,38 @@ module Fieldhand
|
|
145
145
|
expect(paginator.logger).to eq(logger)
|
146
146
|
end
|
147
147
|
end
|
148
|
+
|
149
|
+
describe '#bearer_token' do
|
150
|
+
it 'defaults to nil' do
|
151
|
+
paginator = described_class.new('http://www.example.com/oai')
|
152
|
+
|
153
|
+
expect(paginator.bearer_token).to be_nil
|
154
|
+
end
|
155
|
+
|
156
|
+
it 'can be overridden with an option' do
|
157
|
+
paginator = described_class.new('http://www.example.com/oai', :bearer_token => 'decafbad')
|
158
|
+
|
159
|
+
expect(paginator.bearer_token).to eq('decafbad')
|
160
|
+
end
|
161
|
+
|
162
|
+
it 'sends no authorization header without a bearer token' do
|
163
|
+
request = stub_oai_request('http://www.example.com/oai?verb=Identify', 'identify.xml')
|
164
|
+
paginator = described_class.new('http://www.example.com/oai')
|
165
|
+
|
166
|
+
paginator.items('Identify', IdentifyParser).first
|
167
|
+
|
168
|
+
expect(request).to have_been_requested
|
169
|
+
end
|
170
|
+
|
171
|
+
it 'sends an authorization header with a bearer token' do
|
172
|
+
request = stub_oai_request('http://www.example.com/oai?verb=Identify', 'identify.xml').
|
173
|
+
with(:headers => { 'Authorization' => 'Bearer decafbad' })
|
174
|
+
paginator = described_class.new('http://www.example.com/oai', :bearer_token => 'decafbad')
|
175
|
+
|
176
|
+
paginator.items('Identify', IdentifyParser).first
|
177
|
+
|
178
|
+
expect(request).to have_been_requested
|
179
|
+
end
|
180
|
+
end
|
148
181
|
end
|
149
182
|
end
|
@@ -223,5 +223,29 @@ module Fieldhand
|
|
223
223
|
expect(repository.logger).to eq(logger)
|
224
224
|
end
|
225
225
|
end
|
226
|
+
|
227
|
+
describe '#bearer_token' do
|
228
|
+
it 'defaults to nil' do
|
229
|
+
repository = described_class.new('http://www.example.com/oai')
|
230
|
+
|
231
|
+
expect(repository.bearer_token).to be_nil
|
232
|
+
end
|
233
|
+
|
234
|
+
it 'can be overridden with an option' do
|
235
|
+
repository = described_class.new('http://www.example.com/oai', :bearer_token => 'decafbad')
|
236
|
+
|
237
|
+
expect(repository.bearer_token).to eq('decafbad')
|
238
|
+
end
|
239
|
+
|
240
|
+
it 'uses the bearer token to authorize HTTP requests' do
|
241
|
+
request = stub_oai_request('http://www.example.com/oai?verb=Identify', 'identify.xml').
|
242
|
+
with(:headers => { 'Authorization' => 'Bearer decafbad' })
|
243
|
+
repository = described_class.new('http://www.example.com/oai', :bearer_token => 'decafbad')
|
244
|
+
|
245
|
+
repository.identify
|
246
|
+
|
247
|
+
expect(request).to have_been_requested
|
248
|
+
end
|
249
|
+
end
|
226
250
|
end
|
227
251
|
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.9.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Paul Mucur
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2018-
|
14
|
+
date: 2018-06-26 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: ox
|