preservation-client 2.1.0 → 3.2.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cb9503d9df7485a439b8f65ae7eb319dab3386e6cf316edc4c9d7f04793a8880
4
- data.tar.gz: 39c772d761d5309ca4f8bf7910b044fdc6b11c079a9ccadb61e48b62e522f136
3
+ metadata.gz: 346519c8c530b30507578d91469ffd1f50cf08fe3b6b5f5e46905f35e6d870ab
4
+ data.tar.gz: 38afa1c113b86737ac3593101b3bfc1133de42bc58398de19250636bbdbefc05
5
5
  SHA512:
6
- metadata.gz: d41e1ab66f52b1746a972983512321637de9081578cee2810214fe9d454337342d6903bef283172c4be934005cbc3109201ccfed3d19a9ab265f3a6c8684ab0d
7
- data.tar.gz: 88d29967a9630ba8b693a4b551f6460233e8994b06365b1c6101f06c4239ed2d3e0ddb33ac2cd494931130aacd372135b5875e3e29b5eae6e39b54b1acef6583
6
+ metadata.gz: 81c98f1a410de28f6c8bf90dff39c5537670aa4c8ce4625779d21bd8fbbe3c6341a0930f0fc8572a417d6fd1bd5cba4d69586deb402cf8d9d70e695114138306
7
+ data.tar.gz: 38e22150bc23cf59501893becb24a39c98eb51d8ac12b5acad80f0a8ad108381a6d9cf88a5f1120a32e9388cfc36c0d1e1dfea5c6cf8b3cf42de74e2c6bda5d7
@@ -1,4 +1,12 @@
1
1
  ## Why was this change made?
2
2
 
3
3
 
4
- ## Was the documentation (README, API, wiki, consul, etc.) updated?
4
+
5
+ ## How was this change tested?
6
+
7
+
8
+
9
+ ## Which documentation and/or configurations were updated?
10
+
11
+
12
+
@@ -24,6 +24,5 @@ Style/Documentation:
24
24
  Exclude:
25
25
  - 'spec/**/*'
26
26
 
27
-
28
27
  Style/WordArray:
29
28
  Enabled: false
@@ -1,11 +1,15 @@
1
1
  # This configuration was generated by
2
2
  # `rubocop --auto-gen-config`
3
- # on 2019-12-03 15:41:39 -0800 using RuboCop version 0.74.0.
3
+ # on 2020-01-27 18:06:55 -0800 using RuboCop version 0.77.0.
4
4
  # The point is for the user to remove these configuration records
5
5
  # one by one as the offenses are removed from the code base.
6
6
  # Note that changes in the inspected code, or installation of new
7
7
  # versions of RuboCop, may require this file to be generated again.
8
8
 
9
- # Offense count: 3
9
+ # Offense count: 2
10
10
  Metrics/AbcSize:
11
11
  Max: 34
12
+
13
+ # Offense count: 1
14
+ Metrics/CyclomaticComplexity:
15
+ Max: 7
@@ -3,12 +3,16 @@ cache: bundler
3
3
  rvm:
4
4
  - 2.5.3
5
5
  - 2.6.4
6
+ - 2.7.1
6
7
 
7
8
  env:
8
- - "RAILS_VERSION=5.2.3"
9
- - "RAILS_VERSION=6.0.0"
9
+ jobs:
10
+ - RAILS_VERSION=5.2.3
11
+ - RAILS_VERSION=6.0.0
12
+ global:
13
+ - CC_TEST_REPORTER_ID=02e8afad8d0b699828dd69b6f45b598e7317b2d9828ea23380c3a97113068a0c
10
14
 
11
- before_install: gem install bundler -v 2.0.2
15
+ before_install: gem install bundler -v 2.1.2
12
16
 
13
17
  before_script:
14
18
  - curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
data/README.md CHANGED
@@ -37,7 +37,7 @@ end
37
37
  private
38
38
 
39
39
  def client
40
- @client ||= Preservation::Client.configure(url: Settings.preservation_catalog.url)
40
+ @client ||= Preservation::Client.configure(url: Settings.preservation_catalog.url, token: Settings.preservation_catalog.token)
41
41
  end
42
42
  ```
43
43
 
@@ -47,7 +47,7 @@ OR
47
47
  require 'preservation/client'
48
48
 
49
49
  def initialize
50
- Preservation::Client.configure(url: Settings.preservation_catalog.url)
50
+ Preservation::Client.configure(url: Settings.preservation_catalog.url, token: Settings.preservation_catalog.token)
51
51
  end
52
52
 
53
53
  def do_the_thing
@@ -55,7 +55,9 @@ def do_the_thing
55
55
  end
56
56
  ```
57
57
 
58
- Note that the client may **not** be used without first having been configured, and the `url` keyword is **required**.
58
+ Note that the client may **not** be used without first having been configured, and both the `url` and `token` keywords are **required**.
59
+
60
+ See https://github.com/sul-dlss/preservation_catalog#api for info on obtaining a valid API token.
59
61
 
60
62
  Note that the preservation service is behind a firewall.
61
63
 
@@ -86,6 +88,10 @@ Note that the preservation service is behind a firewall.
86
88
  - `client.objects.metadata(druid: 'oo000oo0000', filepath: 'identityMetadata.xml', version: '8')` - returns contents of identityMetadata.xml in version 8 of Moab object
87
89
  - `client.objects.signature_catalog('oo000oo0000')` - returns latest Moab::SignatureCatalog from Moab
88
90
 
91
+ ### Retrieve the primary moab storage location
92
+
93
+ - `client.objects.primary_moab_location(druid: 'ooo000oo0000')` - returns the path to the storage location for the primary moab
94
+
89
95
  ### Get difference information between passed contentMetadata.xml and files in the Moab
90
96
 
91
97
  - `client.objects.content_inventory_diff(druid: 'oo000oo0000', content_metadata: '<contentMetadata>...</contentMetadata>')` - returns Moab::FileInventoryDifference containing differences between passed content metadata and latest version for subset 'all'
@@ -27,6 +27,7 @@ module Preservation
27
27
  class ConnectionFailedError < Error; end
28
28
 
29
29
  DEFAULT_API_VERSION = 'v1'
30
+ TOKEN_HEADER = 'Authorization'
30
31
 
31
32
  include Singleton
32
33
 
@@ -42,8 +43,10 @@ module Preservation
42
43
 
43
44
  class << self
44
45
  # @param [String] url
45
- def configure(url:)
46
+ # @param [String] token a bearer token for HTTP authentication
47
+ def configure(url:, token:)
46
48
  instance.url = url
49
+ instance.token = token
47
50
 
48
51
  # Force connection to be re-established when `.configure` is called
49
52
  instance.connection = nil
@@ -54,7 +57,7 @@ module Preservation
54
57
  delegate :objects, :update, to: :instance
55
58
  end
56
59
 
57
- attr_writer :url, :connection
60
+ attr_writer :url, :connection, :token
58
61
  delegate :update, to: :catalog
59
62
 
60
63
  private
@@ -63,6 +66,10 @@ module Preservation
63
66
  @url || raise(Error, 'url has not yet been configured')
64
67
  end
65
68
 
69
+ def token
70
+ @token || raise(Error, 'auth token has not been configured')
71
+ end
72
+
66
73
  def connection
67
74
  @connection ||= Faraday.new(url) do |builder|
68
75
  builder.use ErrorFaradayMiddleware
@@ -70,6 +77,7 @@ module Preservation
70
77
  builder.use Faraday::Response::RaiseError # raise exceptions on 40x, 50x responses
71
78
  builder.adapter Faraday.default_adapter
72
79
  builder.headers[:user_agent] = user_agent
80
+ builder.headers[TOKEN_HEADER] = "Bearer #{token}"
73
81
  end
74
82
  end
75
83
 
@@ -33,7 +33,7 @@ module Preservation
33
33
  end
34
34
 
35
35
  true
36
- rescue Faraday::ClientError => e
36
+ rescue Faraday::Error => e
37
37
  raise UnexpectedResponseError, e
38
38
  end
39
39
  end
@@ -50,8 +50,9 @@ module Preservation
50
50
  # @param [String] druid - with or without prefix: 'druid:ab123cd4567' OR 'ab123cd4567'
51
51
  # @param [String] filepath - the path of the file relative to the moab content directory
52
52
  # @param [String] version - the version of the file requested (defaults to nil for latest version)
53
- def content(druid:, filepath:, version: nil)
54
- file(druid, 'content', filepath, version)
53
+ # @param [Proc] on_data a block, if provided is called to do streaming responses
54
+ def content(druid:, filepath:, version: nil, on_data: nil)
55
+ file(druid, 'content', filepath, version, on_data: on_data)
55
56
  end
56
57
 
57
58
  # retrieve a manifest file from a Moab object
@@ -70,6 +71,14 @@ module Preservation
70
71
  file(druid, 'metadata', filepath, version)
71
72
  end
72
73
 
74
+ # retrieve the storage location for the primary moab of the given druid
75
+ # @param [String] druid - with or without prefix: 'druid:ab123cd4567' or 'ab123cd4567'
76
+ # @return [String] the storage location of the primary moab for the given druid
77
+ # @raise [Preservation::Client::NotFoundError] when druid is not found
78
+ def primary_moab_location(druid:)
79
+ get("objects/#{druid}/primary_moab_location", {}, on_data: nil)
80
+ end
81
+
73
82
  # convenience method for retrieving latest Moab::SignatureCatalog from a Moab object,
74
83
  # @param [String] druid - with or without prefix: 'druid:ab123cd4567' OR 'ab123cd4567'
75
84
  # @return [Moab::SignatureCatalog] the manifest of all files previously ingested
@@ -83,10 +92,11 @@ module Preservation
83
92
  # @param [String] druid - with or without prefix: 'druid:ab123cd4567' OR 'ab123cd4567'
84
93
  # @param [String] category - one of 'manifest', 'metadata' or 'content'
85
94
  # @param [String] filepath - the path of the file relative to the moab category directory
86
- # @param [String] version - the version of the file requested (defaults to nil for latest version)
95
+ # @param [String] version - the version of the file requested
96
+ # @param [Proc] on_data a block, if provided is called to do streaming responses
87
97
  # @return the retrieved file
88
- def file(druid, category, filepath, version = nil)
89
- get("objects/#{druid}/file", category: category, filepath: filepath, version: version)
98
+ def file(druid, category, filepath, version, on_data: nil)
99
+ get("objects/#{druid}/file", { category: category, filepath: filepath, version: version }, on_data: on_data)
90
100
  end
91
101
  end
92
102
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Preservation
4
4
  class Client
5
- VERSION = '2.1.0'
5
+ VERSION = '3.2.1'
6
6
  end
7
7
  end
@@ -15,7 +15,7 @@ module Preservation
15
15
 
16
16
  # @param path [String] path to be appended to connection url (no leading slash)
17
17
  def get_json(path, object_id)
18
- req_url = api_version.present? ? "#{api_version}/#{path}" : path
18
+ req_url = "#{api_version}/#{path}"
19
19
  resp = connection.get do |req|
20
20
  req.url req_url
21
21
  req.headers['Content-Type'] = 'application/json'
@@ -36,23 +36,53 @@ module Preservation
36
36
  end
37
37
 
38
38
  # @param path [String] path to be appended to connection url (no leading slash)
39
- # @param params [Hash] optional params
40
- def get(path, params)
41
- http_response(:get, path, params)
39
+ # @param params [Hash] optional request parameters
40
+ # @param on_data [Proc] a callback to use when a streaming response is desired.
41
+ def get(path, params, on_data:)
42
+ return http_response(:get, path, params) unless on_data
43
+
44
+ connection.get("#{api_version}/#{path}", params) do |req|
45
+ req.options.on_data = on_data
46
+ end
42
47
  end
43
48
 
44
49
  # @param path [String] path to be appended to connection url (no leading slash)
45
- # @param params [Hash] optional params
50
+ # @param params [Hash] optional request parameters
46
51
  def post(path, params)
47
52
  http_response(:post, path, params)
48
53
  end
49
54
 
50
- # @param method [Symbol] :get or :post
51
55
  # @param path [String] path to be appended to connection url (no leading slash)
52
- # @param params [Hash] optional params
56
+ # @param params [Hash] optional request parameters
57
+ def patch(path, params)
58
+ http_response(:patch, path, params)
59
+ end
60
+
61
+ # @param path [String] path to be appended to connection url (no leading slash)
62
+ # @param params [Hash] optional request parameters
63
+ def put(path, params)
64
+ http_response(:put, path, params)
65
+ end
66
+
67
+ # @param path [String] path to be appended to connection url (no leading slash)
68
+ # @param params [Hash] optional request parameters
69
+ def delete(path, params)
70
+ http_response(:delete, path, params)
71
+ end
72
+
73
+ # @param method [Symbol] a symbol representing an HTTP method: :get, :post, :patch, :put, :delete
74
+ # @param path [String] path to be appended to connection url (no leading slash)
75
+ # @param params [Hash] optional request parameters
53
76
  def http_response(method, path, params)
54
- req_url = api_version.present? ? "#{api_version}/#{path}" : path
55
- resp = connection.send(method, req_url, params)
77
+ req_url = "#{api_version}/#{path}"
78
+ resp =
79
+ case method
80
+ when :delete, :get
81
+ connection.public_send(method, req_url, params)
82
+ when :patch, :post, :put
83
+ request_json = params.to_json if params&.any?
84
+ connection.public_send(method, req_url, request_json, 'Content-Type' => 'application/json')
85
+ end
56
86
  return resp.body if resp.success?
57
87
 
58
88
  errmsg = ResponseErrorFormatter.format(response: resp, client_method_name: caller_locations.first.label)
@@ -29,15 +29,15 @@ Gem::Specification.new do |spec|
29
29
  spec.require_paths = ['lib']
30
30
 
31
31
  spec.add_dependency 'activesupport', '>= 4.2', '< 7'
32
- spec.add_dependency 'faraday', '~> 0.15'
32
+ spec.add_dependency 'faraday', '>= 0.15', '< 2.0'
33
33
  spec.add_dependency 'moab-versioning', '~> 4.3'
34
34
  spec.add_dependency 'zeitwerk', '~> 2.1'
35
35
 
36
36
  spec.add_development_dependency 'bundler', '~> 2.0'
37
37
  spec.add_development_dependency 'pry-byebug'
38
- spec.add_development_dependency 'rake', '~> 10.0'
38
+ spec.add_development_dependency 'rake', '>= 12.3.3'
39
39
  spec.add_development_dependency 'rspec', '~> 3.0'
40
40
  spec.add_development_dependency 'rubocop', '~> 0.77.0'
41
- spec.add_development_dependency 'simplecov'
41
+ spec.add_development_dependency 'simplecov', '~> 0.17.0' # For CodeClimate
42
42
  spec.add_development_dependency 'webmock'
43
43
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: preservation-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.0
4
+ version: 3.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Naomi Dushay
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-12-20 00:00:00.000000000 Z
11
+ date: 2020-06-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -34,16 +34,22 @@ dependencies:
34
34
  name: faraday
35
35
  requirement: !ruby/object:Gem::Requirement
36
36
  requirements:
37
- - - "~>"
37
+ - - ">="
38
38
  - !ruby/object:Gem::Version
39
39
  version: '0.15'
40
+ - - "<"
41
+ - !ruby/object:Gem::Version
42
+ version: '2.0'
40
43
  type: :runtime
41
44
  prerelease: false
42
45
  version_requirements: !ruby/object:Gem::Requirement
43
46
  requirements:
44
- - - "~>"
47
+ - - ">="
45
48
  - !ruby/object:Gem::Version
46
49
  version: '0.15'
50
+ - - "<"
51
+ - !ruby/object:Gem::Version
52
+ version: '2.0'
47
53
  - !ruby/object:Gem::Dependency
48
54
  name: moab-versioning
49
55
  requirement: !ruby/object:Gem::Requirement
@@ -104,16 +110,16 @@ dependencies:
104
110
  name: rake
105
111
  requirement: !ruby/object:Gem::Requirement
106
112
  requirements:
107
- - - "~>"
113
+ - - ">="
108
114
  - !ruby/object:Gem::Version
109
- version: '10.0'
115
+ version: 12.3.3
110
116
  type: :development
111
117
  prerelease: false
112
118
  version_requirements: !ruby/object:Gem::Requirement
113
119
  requirements:
114
- - - "~>"
120
+ - - ">="
115
121
  - !ruby/object:Gem::Version
116
- version: '10.0'
122
+ version: 12.3.3
117
123
  - !ruby/object:Gem::Dependency
118
124
  name: rspec
119
125
  requirement: !ruby/object:Gem::Requirement
@@ -146,16 +152,16 @@ dependencies:
146
152
  name: simplecov
147
153
  requirement: !ruby/object:Gem::Requirement
148
154
  requirements:
149
- - - ">="
155
+ - - "~>"
150
156
  - !ruby/object:Gem::Version
151
- version: '0'
157
+ version: 0.17.0
152
158
  type: :development
153
159
  prerelease: false
154
160
  version_requirements: !ruby/object:Gem::Requirement
155
161
  requirements:
156
- - - ">="
162
+ - - "~>"
157
163
  - !ruby/object:Gem::Version
158
- version: '0'
164
+ version: 0.17.0
159
165
  - !ruby/object:Gem::Dependency
160
166
  name: webmock
161
167
  requirement: !ruby/object:Gem::Requirement
@@ -219,7 +225,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
219
225
  - !ruby/object:Gem::Version
220
226
  version: '0'
221
227
  requirements: []
222
- rubygems_version: 3.1.1
228
+ rubygems_version: 3.1.2
223
229
  signing_key:
224
230
  specification_version: 4
225
231
  summary: A thin client for getting info from SDR preservation.