preservation-client 2.0.0 → 2.1.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e3d54508719f54afb0229364f2e9deee3a765d14359b5b27bf3424470193d68c
4
- data.tar.gz: 48642fbe62b2f68bf896ada3629a8e9e662e6e4e65a988fbcd49c0188f5f7487
3
+ metadata.gz: cb9503d9df7485a439b8f65ae7eb319dab3386e6cf316edc4c9d7f04793a8880
4
+ data.tar.gz: 39c772d761d5309ca4f8bf7910b044fdc6b11c079a9ccadb61e48b62e522f136
5
5
  SHA512:
6
- metadata.gz: 8a10daad6e088616be9af53476d244c7fc7fc3a027db67f0197c0f19248962108f035ac70fda19386e9ac75babd234ea874741b4d90604346a44e6b49106e57b
7
- data.tar.gz: 6991d66c54291b48ad76e5ac37b14200d965b4ec3e0bb5903bd2f9250619e6fd9ca2c53d6d579009e1db2a548a05649982d42d45b2cb86877ddb295290fa61c7
6
+ metadata.gz: d41e1ab66f52b1746a972983512321637de9081578cee2810214fe9d454337342d6903bef283172c4be934005cbc3109201ccfed3d19a9ab265f3a6c8684ab0d
7
+ data.tar.gz: 88d29967a9630ba8b693a4b551f6460233e8994b06365b1c6101f06c4239ed2d3e0ddb33ac2cd494931130aacd372135b5875e3e29b5eae6e39b54b1acef6583
data/README.md CHANGED
@@ -94,6 +94,9 @@ Note that the preservation service is behind a firewall.
94
94
 
95
95
  - `client.objects.shelve_content_diff(druid: 'oo000oo0000', content_metadata: '<contentMetadata>...</contentMetadata>')` - returns Moab::FileGroupDifference containing differences between passed content metadata and latest version for subset 'shelve'
96
96
 
97
+ ### Alert the catalog that an object has been changed and needs to be updated
98
+
99
+ - `client.update(druid: 'oo000oo0000', version: 3, size: 2342, storage_location: 'some/storage/location')` - returns true if it worked
97
100
  ## Development
98
101
 
99
102
  After checking out the repo, run `bundle` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
@@ -7,20 +7,8 @@ require 'faraday'
7
7
  require 'singleton'
8
8
  require 'zeitwerk'
9
9
 
10
- # Provides version exception to camels-case conversion
11
- class PreservationClientInflector < Zeitwerk::Inflector
12
- def camelize(basename, _abspath)
13
- case basename
14
- when 'version'
15
- 'VERSION'
16
- else
17
- super
18
- end
19
- end
20
- end
21
-
22
10
  loader = Zeitwerk::Loader.new
23
- loader.inflector = PreservationClientInflector.new
11
+ loader.inflector = Zeitwerk::GemInflector.new(__FILE__)
24
12
  loader.push_dir(File.absolute_path("#{__FILE__}/../.."))
25
13
  loader.setup
26
14
 
@@ -38,7 +26,7 @@ module Preservation
38
26
 
39
27
  class ConnectionFailedError < Error; end
40
28
 
41
- DEFAULT_API_VERSION = '' # should be v1 once PreservationCatalog has versioned API
29
+ DEFAULT_API_VERSION = 'v1'
42
30
 
43
31
  include Singleton
44
32
 
@@ -47,6 +35,11 @@ module Preservation
47
35
  @objects ||= Objects.new(connection: connection, api_version: DEFAULT_API_VERSION)
48
36
  end
49
37
 
38
+ # @return [Preservation::Client::Catalog] an instance of the `Client::Catalog` class
39
+ def catalog
40
+ @catalog ||= Catalog.new(connection: connection, api_version: DEFAULT_API_VERSION)
41
+ end
42
+
50
43
  class << self
51
44
  # @param [String] url
52
45
  def configure(url:)
@@ -58,10 +51,11 @@ module Preservation
58
51
  self
59
52
  end
60
53
 
61
- delegate :objects, to: :instance
54
+ delegate :objects, :update, to: :instance
62
55
  end
63
56
 
64
57
  attr_writer :url, :connection
58
+ delegate :update, to: :catalog
65
59
 
66
60
  private
67
61
 
@@ -73,7 +67,7 @@ module Preservation
73
67
  @connection ||= Faraday.new(url) do |builder|
74
68
  builder.use ErrorFaradayMiddleware
75
69
  builder.use Faraday::Request::UrlEncoded
76
-
70
+ builder.use Faraday::Response::RaiseError # raise exceptions on 40x, 50x responses
77
71
  builder.adapter Faraday.default_adapter
78
72
  builder.headers[:user_agent] = user_agent
79
73
  end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Preservation
4
+ class Client
5
+ # API calls that are about the catalog
6
+ class Catalog < VersionedApiService
7
+ # @param [String] druid the object identifierx
8
+ # @param [Integer] version the version of the object
9
+ # @param [Integer] size the size of the object
10
+ # @param [String] storage_location the location of storage
11
+ def update(druid:, version:, size:, storage_location:)
12
+ http_args = {
13
+ druid: druid,
14
+ incoming_version: version,
15
+ incoming_size: size,
16
+ storage_location: storage_location,
17
+ checksums_validated: true
18
+ }
19
+
20
+ request(druid: druid, version: version, http_args: http_args)
21
+ end
22
+
23
+ private
24
+
25
+ def request(druid:, version:, http_args:)
26
+ result = if version == 1
27
+ connection.post "/#{api_version}/catalog", http_args
28
+ else
29
+ connection.patch "/#{api_version}/catalog/#{druid}", http_args
30
+ end
31
+ unless result.success?
32
+ raise UnexpectedResponseError, "response was not successful. Received status #{result.status}"
33
+ end
34
+
35
+ true
36
+ rescue Faraday::ClientError => e
37
+ raise UnexpectedResponseError, e
38
+ end
39
+ end
40
+ end
41
+ end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Preservation
4
4
  class Client
5
- VERSION = '2.0.0'
5
+ VERSION = '2.1.0'
6
6
  end
7
7
  end
@@ -2,8 +2,6 @@
2
2
 
3
3
  module Preservation
4
4
  class Client
5
- DEFAULT_API_VERSION = 'v1'
6
-
7
5
  # @abstract API calls to a versioned endpoint
8
6
  class VersionedApiService
9
7
  def initialize(connection:, api_version: DEFAULT_API_VERSION)
@@ -25,19 +23,15 @@ module Preservation
25
23
  end
26
24
  return JSON.parse(resp.body).with_indifferent_access if resp.success?
27
25
 
28
- if resp.status == 404
29
- errmsg = "#{object_id} not found in Preservation at #{connection.url_prefix}#{req_url}"
30
- raise Preservation::Client::NotFoundError, errmsg
31
- else
32
- errmsg = ResponseErrorFormatter
33
- .format(response: resp, object_id: object_id, client_method_name: caller_locations.first.label)
34
- raise Preservation::Client::UnexpectedResponseError, errmsg
35
- end
36
- rescue Faraday::ResourceNotFound => e
37
- errmsg = "HTTP GET to #{connection.url_prefix}#{req_url} failed with #{e.class}: #{e.message}"
26
+ errmsg = ResponseErrorFormatter
27
+ .format(response: resp, object_id: object_id, client_method_name: caller_locations.first.label)
28
+ raise Preservation::Client::UnexpectedResponseError, errmsg
29
+ rescue Faraday::ResourceNotFound
30
+ errmsg = "#{object_id} not found in Preservation at #{connection.url_prefix}#{req_url}"
38
31
  raise Preservation::Client::NotFoundError, errmsg
39
32
  rescue Faraday::Error => e
40
- errmsg = "HTTP GET to #{connection.url_prefix}#{req_url} failed with #{e.class}: #{e.message}"
33
+ errmsg = "Preservation::Client.#{caller_locations.first.label} for #{object_id} " \
34
+ "got #{e.response[:status]} from Preservation at #{req_url}: #{e.response[:body]}"
41
35
  raise Preservation::Client::UnexpectedResponseError, errmsg
42
36
  end
43
37
 
@@ -57,19 +51,19 @@ module Preservation
57
51
  # @param path [String] path to be appended to connection url (no leading slash)
58
52
  # @param params [Hash] optional params
59
53
  def http_response(method, path, params)
60
- req_path = api_version.present? ? "#{api_version}/#{path}" : path
61
- resp = connection.send(method, req_path, params)
54
+ req_url = api_version.present? ? "#{api_version}/#{path}" : path
55
+ resp = connection.send(method, req_url, params)
62
56
  return resp.body if resp.success?
63
57
 
64
58
  errmsg = ResponseErrorFormatter.format(response: resp, client_method_name: caller_locations.first.label)
65
- raise Preservation::Client::NotFoundError, errmsg if resp.status == 404
66
-
67
59
  raise Preservation::Client::UnexpectedResponseError, errmsg
68
60
  rescue Faraday::ResourceNotFound => e
69
- errmsg = "HTTP #{method.to_s.upcase} to #{connection.url_prefix}#{path} failed with #{e.class}: #{e.message}"
61
+ errmsg = "Preservation::Client.#{caller_locations.first.label} " \
62
+ "got #{e.response[:status]} from Preservation at #{req_url}: #{e.response[:body]}"
70
63
  raise Preservation::Client::NotFoundError, errmsg
71
64
  rescue Faraday::Error => e
72
- errmsg = "HTTP #{method.to_s.upcase} to #{connection.url_prefix}#{path} failed with #{e.class}: #{e.message}"
65
+ errmsg = "Preservation::Client.#{caller_locations.first.label} " \
66
+ "got #{e.response[:status]} from Preservation at #{req_url}: #{e.response[:body]}"
73
67
  raise Preservation::Client::UnexpectedResponseError, errmsg
74
68
  end
75
69
  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.0.0
4
+ version: 2.1.0
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-16 00:00:00.000000000 Z
11
+ date: 2019-12-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -191,6 +191,7 @@ files:
191
191
  - bin/console
192
192
  - bin/setup
193
193
  - lib/preservation/client.rb
194
+ - lib/preservation/client/catalog.rb
194
195
  - lib/preservation/client/error_faraday_middleware.rb
195
196
  - lib/preservation/client/objects.rb
196
197
  - lib/preservation/client/response_error_formatter.rb