fieldhand 0.7.0 → 0.8.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
- SHA1:
3
- metadata.gz: 52d3d4940c27abdd47bf06f7ad49f46e742a6e92
4
- data.tar.gz: 22510d14c27a88f49529a36f6f6e901674073ece
2
+ SHA256:
3
+ metadata.gz: 48341fcf65a936b5bc42a7f6cdcc9881d2d3f11ef29352a14f0f545f1318b5a0
4
+ data.tar.gz: 17ce75aba6b336de464b496604aec0bbda5d673ff98d6c8ee1a659b0f75fb425
5
5
  SHA512:
6
- metadata.gz: bd40718309d4404942fc03fe278121d3bb9bdbba21c0c632fa9e5770fe6b38dbcac55725cb121730ce851ddb03711e98996a00b0746cdc82a6747aa4b8e6708b
7
- data.tar.gz: 665247958faacf0cf52fe06884b3642918b1a34185babf4947f527733827a18e7345b5ce273b9297d2cb1ef9791a26e52baa3c7a707e26fa47831f2f8028b6a9
6
+ metadata.gz: fddd10cde8fc771c259234deadef079468f8a3517174a82e92dd480a29d5ccbbd655dfeb5f1f4fceeda85b1e4d9707ab715ddde8baf6fa2e43fd2fedd6867121
7
+ data.tar.gz: 9f201592dc6968fdf41c5bd8134c67496f4eed2c89077442474b0491ef83417e170a182da2c1262aaca3d811ad6dd2e756a18e1e8e025a799e4cbd6e1ef2f616
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.7.0
5
+ **Current version:** 0.8.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.7'
11
+ gem install fieldhand -v '~> 0.8'
12
12
  ```
13
13
 
14
14
  Or, in your `Gemfile`:
15
15
 
16
16
  ```ruby
17
- gem 'fieldhand', '~> 0.7'
17
+ gem 'fieldhand', '~> 0.8'
18
18
  ```
19
19
 
20
20
  ## Usage
@@ -43,7 +43,7 @@ repository.get('oai:www.example.com:12345')
43
43
  ## API Documentation
44
44
 
45
45
  * [`Fieldhand::Repository`](#fieldhandrepository)
46
- * [`.new(uri[, logger])`](#fieldhandrepositorynewuri-logger)
46
+ * [`.new(uri[, options])`](#fieldhandrepositorynewuri-options)
47
47
  * [`#identify`](#fieldhandrepositoryidentify)
48
48
  * [`#metadata_formats([identifier])`](#fieldhandrepositorymetadata_formatsidentifier)
49
49
  * [`#sets`](#fieldhandrepositorysets)
@@ -109,19 +109,20 @@ A class to represent [an OAI-PMH repository](https://www.openarchives.org/OAI/op
109
109
  > requests [...]. A repository is managed by a data provider to expose metadata
110
110
  > to harvesters.
111
111
 
112
- #### `Fieldhand::Repository.new(uri[, logger])`
112
+ #### `Fieldhand::Repository.new(uri[, options])`
113
113
 
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.new(STDOUT))
117
+ Fieldhand::Repository.new('http://www.example.com/oai', :logger => Logger.new(STDOUT), :timeout => 10)
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 an optional
123
- [`Logger`](http://ruby-doc.org/stdlib/libdoc/logger/rdoc/Logger.html)-compatible
124
- `logger`.
122
+ something that can be coerced into a `URI` such as a `String`) with two options passed as a `Hash`:
123
+
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
126
 
126
127
  #### `Fieldhand::Repository#identify`
127
128
 
@@ -0,0 +1,41 @@
1
+ require 'fieldhand/logger'
2
+
3
+ module Fieldhand
4
+ # A wrapper around Repository and Paginator options for backward-compatibility.
5
+ #
6
+ # In short, this handles passing a Logger directly or passing it and a timeout as a hash.
7
+ # Note this attempts to preserve the previous behaviour of passing nil/falsey values as a
8
+ # logger even though this will cause errors if someone tries to use it that way.
9
+ class Options
10
+ attr_reader :logger_or_options
11
+
12
+ # Return a new, normalized set of options based on the given value.
13
+ #
14
+ # This supports both a `Logger`-compatible object to use for logging directly and a hash of options:
15
+ #
16
+ # * :logger - A `Logger`-compatible class for logging the activity of the library, defaults to a platform-specific
17
+ # null logger
18
+ # * :timeout - A `Numeric` number of seconds to wait for any HTTP requests, defaults to 60 seconds
19
+ def initialize(logger_or_options = {})
20
+ @logger_or_options = logger_or_options
21
+ end
22
+
23
+ # Return the current timeout in seconds.
24
+ def timeout
25
+ options.fetch(:timeout, 60)
26
+ end
27
+
28
+ # Return the current logger.
29
+ def logger
30
+ options.fetch(:logger) { Logger.null }
31
+ end
32
+
33
+ private
34
+
35
+ def options
36
+ return logger_or_options if logger_or_options.is_a?(Hash)
37
+
38
+ { :logger => logger_or_options }
39
+ end
40
+ end
41
+ end
@@ -1,5 +1,5 @@
1
- require 'fieldhand/logger'
2
1
  require 'fieldhand/network_errors'
2
+ require 'fieldhand/options'
3
3
  require 'fieldhand/response_parser'
4
4
  require 'cgi'
5
5
  require 'net/http'
@@ -11,17 +11,23 @@ module Fieldhand
11
11
  #
12
12
  # See https://www.openarchives.org/OAI/openarchivesprotocol.html#FlowControl
13
13
  class Paginator
14
- attr_reader :uri, :logger, :http
14
+ attr_reader :uri, :logger, :timeout, :http
15
15
 
16
- # Return a new paginator for the given repository base URI and optional logger.
16
+ # Return a new paginator for the given repository base URI and optional logger and timeout.
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.
21
- def initialize(uri, logger = Logger.null)
20
+ # The logger will default to a null logger appropriate to this platform and timeout will default to 60 seconds.
21
+ def initialize(uri, logger_or_options = {})
22
22
  @uri = uri.is_a?(::URI) ? uri : URI(uri)
23
- @logger = logger
23
+
24
+ options = Options.new(logger_or_options)
25
+ @logger = options.logger
26
+ @timeout = options.timeout
27
+
24
28
  @http = ::Net::HTTP.new(@uri.host, @uri.port)
29
+ @http.read_timeout = @timeout
30
+ @http.open_timeout = @timeout
25
31
  @http.use_ssl = true if @uri.scheme == 'https'
26
32
  end
27
33
 
@@ -5,7 +5,7 @@ require 'fieldhand/list_identifiers_parser'
5
5
  require 'fieldhand/list_metadata_formats_parser'
6
6
  require 'fieldhand/list_records_parser'
7
7
  require 'fieldhand/list_sets_parser'
8
- require 'fieldhand/logger'
8
+ require 'fieldhand/options'
9
9
  require 'fieldhand/paginator'
10
10
  require 'uri'
11
11
 
@@ -14,16 +14,22 @@ module Fieldhand
14
14
  #
15
15
  # See https://www.openarchives.org/OAI/openarchivesprotocol.html
16
16
  class Repository
17
- attr_reader :uri, :logger
17
+ attr_reader :uri, :logger, :timeout
18
18
 
19
- # Return a new repository with the given base URL and an optional logger.
19
+ # Return a new repository with the given base URL and an optional logger and timeout.
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
- # Defaults to using a null logger specific to this platform.
24
- def initialize(uri, logger = Logger.null)
23
+ # For backward compatibility, the second argument can either be a logger or a hash containing
24
+ # a logger and timeout.
25
+ #
26
+ # Defaults to using a null logger specific to this platform and a timeout of 60 seconds.
27
+ def initialize(uri, logger_or_options = {})
25
28
  @uri = uri.is_a?(::URI) ? uri : URI(uri)
26
- @logger = logger
29
+
30
+ options = Options.new(logger_or_options)
31
+ @logger = options.logger
32
+ @timeout = options.timeout
27
33
  end
28
34
 
29
35
  # Send an Identify request to the repository and return an `Identify` response.
@@ -127,7 +133,7 @@ module Fieldhand
127
133
  private
128
134
 
129
135
  def paginator
130
- @paginator ||= Paginator.new(uri, logger)
136
+ @paginator ||= Paginator.new(uri, :logger => logger, :timeout => timeout)
131
137
  end
132
138
  end
133
139
  end
@@ -0,0 +1,59 @@
1
+ require 'fieldhand/options'
2
+
3
+ module Fieldhand
4
+ RSpec.describe Options do
5
+ describe '#timeout' do
6
+ it 'defaults to 60 seconds' do
7
+ options = described_class.new({})
8
+
9
+ expect(options.timeout).to eq(60)
10
+ end
11
+
12
+ it 'can be overridden by passing an option' do
13
+ options = described_class.new(:timeout => 10)
14
+
15
+ expect(options.timeout).to eq(10)
16
+ end
17
+
18
+ it 'can be set to nil' do
19
+ options = described_class.new(:timeout => nil)
20
+
21
+ expect(options.timeout).to be_nil
22
+ end
23
+ end
24
+
25
+ describe '#logger' do
26
+ it 'defaults to a null logger' do
27
+ options = described_class.new({})
28
+
29
+ expect(options.logger).to be_a(::Logger)
30
+ end
31
+
32
+ it 'can be overridden by passing a logger directly' do
33
+ logger = ::Logger.new(STDOUT)
34
+ options = described_class.new(logger)
35
+
36
+ expect(options.logger).to eq(logger)
37
+ end
38
+
39
+ it 'can be overridden by passing a logger in an option' do
40
+ logger = ::Logger.new(STDOUT)
41
+ options = described_class.new(:logger => logger)
42
+
43
+ expect(options.logger).to eq(logger)
44
+ end
45
+
46
+ it 'can be set to nil directly' do
47
+ options = described_class.new(nil)
48
+
49
+ expect(options.logger).to be_nil
50
+ end
51
+
52
+ it 'can be set to nil through an option' do
53
+ options = described_class.new(:logger => nil)
54
+
55
+ expect(options.logger).to be_nil
56
+ end
57
+ end
58
+ end
59
+ end
@@ -109,5 +109,41 @@ module Fieldhand
109
109
  expect(error.response.body).to eq('Retry after 5 seconds')
110
110
  end
111
111
  end
112
+
113
+ describe '#timeout' do
114
+ it 'defaults to 60 seconds' do
115
+ paginator = described_class.new('http://www.example.com/oai')
116
+
117
+ expect(paginator.timeout).to eq(60)
118
+ end
119
+
120
+ it 'can be overridden with an option' do
121
+ paginator = described_class.new('http://www.example.com/oai', :timeout => 10)
122
+
123
+ expect(paginator.timeout).to eq(10)
124
+ end
125
+ end
126
+
127
+ describe '#logger' do
128
+ it 'defaults to a null logger' do
129
+ paginator = described_class.new('http://www.example.com/oai')
130
+
131
+ expect(paginator.logger).to be_a(::Logger)
132
+ end
133
+
134
+ it 'can be overridden with an option' do
135
+ logger = ::Logger.new(STDOUT)
136
+ paginator = described_class.new('http://www.example.com/oai', :logger => logger)
137
+
138
+ expect(paginator.logger).to eq(logger)
139
+ end
140
+
141
+ it 'can be overridden by passing as a second argument for historic reasons' do
142
+ logger = ::Logger.new(STDOUT)
143
+ paginator = described_class.new('http://www.example.com/oai', logger)
144
+
145
+ expect(paginator.logger).to eq(logger)
146
+ end
147
+ end
112
148
  end
113
149
  end
@@ -187,5 +187,41 @@ module Fieldhand
187
187
  to have_attributes(:identifier => 'oai:oai.datacite.org:32356')
188
188
  end
189
189
  end
190
+
191
+ describe '#timeout' do
192
+ it 'defaults to 60 seconds' do
193
+ repository = described_class.new('http://www.example.com/oai')
194
+
195
+ expect(repository.timeout).to eq(60)
196
+ end
197
+
198
+ it 'can be overridden with an option' do
199
+ repository = described_class.new('http://www.example.com/oai', :timeout => 10)
200
+
201
+ expect(repository.timeout).to eq(10)
202
+ end
203
+ end
204
+
205
+ describe '#logger' do
206
+ it 'defaults to a null logger' do
207
+ repository = described_class.new('http://www.example.com/oai')
208
+
209
+ expect(repository.logger).to be_a(::Logger)
210
+ end
211
+
212
+ it 'can be overridden with an option' do
213
+ logger = ::Logger.new(STDOUT)
214
+ repository = described_class.new('http://www.example.com/oai', :logger => logger)
215
+
216
+ expect(repository.logger).to eq(logger)
217
+ end
218
+
219
+ it 'can be overridden by passing as a second argument for historic reasons' do
220
+ logger = ::Logger.new(STDOUT)
221
+ repository = described_class.new('http://www.example.com/oai', logger)
222
+
223
+ expect(repository.logger).to eq(logger)
224
+ end
225
+ end
190
226
  end
191
227
  end
@@ -1,3 +1,4 @@
1
+ require 'date'
1
2
  require 'webmock/rspec'
2
3
 
3
4
  RSpec.configure do |config|
metadata CHANGED
@@ -1,16 +1,17 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fieldhand
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.0
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Paul Mucur
8
8
  - Maciej Gajewski
9
9
  - Giovanni Derks
10
+ - Abeer Salameh
10
11
  autorequire:
11
12
  bindir: bin
12
13
  cert_chain: []
13
- date: 2017-07-27 00:00:00.000000000 Z
14
+ date: 2018-05-12 00:00:00.000000000 Z
14
15
  dependencies:
15
16
  - !ruby/object:Gem::Dependency
16
17
  name: ox
@@ -102,6 +103,7 @@ files:
102
103
  - lib/fieldhand/logger.rb
103
104
  - lib/fieldhand/metadata_format.rb
104
105
  - lib/fieldhand/network_errors.rb
106
+ - lib/fieldhand/options.rb
105
107
  - lib/fieldhand/paginator.rb
106
108
  - lib/fieldhand/record.rb
107
109
  - lib/fieldhand/repository.rb
@@ -112,6 +114,7 @@ files:
112
114
  - spec/fieldhand/header_spec.rb
113
115
  - spec/fieldhand/identify_spec.rb
114
116
  - spec/fieldhand/metadata_format_spec.rb
117
+ - spec/fieldhand/options_spec.rb
115
118
  - spec/fieldhand/paginator_spec.rb
116
119
  - spec/fieldhand/record_spec.rb
117
120
  - spec/fieldhand/repository_spec.rb
@@ -137,18 +140,19 @@ required_rubygems_version: !ruby/object:Gem::Requirement
137
140
  version: '0'
138
141
  requirements: []
139
142
  rubyforge_project:
140
- rubygems_version: 2.6.11
143
+ rubygems_version: 2.7.3
141
144
  signing_key:
142
145
  specification_version: 4
143
146
  summary: An OAI-PMH harvester
144
147
  test_files:
145
- - spec/fieldhand/arguments_spec.rb
146
- - spec/fieldhand/datestamp_spec.rb
148
+ - spec/spec_helper.rb
149
+ - spec/fieldhand/set_spec.rb
150
+ - spec/fieldhand/repository_spec.rb
151
+ - spec/fieldhand/options_spec.rb
147
152
  - spec/fieldhand/header_spec.rb
148
- - spec/fieldhand/identify_spec.rb
149
- - spec/fieldhand/metadata_format_spec.rb
150
153
  - spec/fieldhand/paginator_spec.rb
154
+ - spec/fieldhand/arguments_spec.rb
151
155
  - spec/fieldhand/record_spec.rb
152
- - spec/fieldhand/repository_spec.rb
153
- - spec/fieldhand/set_spec.rb
154
- - spec/spec_helper.rb
156
+ - spec/fieldhand/identify_spec.rb
157
+ - spec/fieldhand/datestamp_spec.rb
158
+ - spec/fieldhand/metadata_format_spec.rb