sdr-client 0.33.0 → 0.37.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: 61620c0879bf47dd81a5481650eade57191620a6943ea8e0687748508e50490c
4
- data.tar.gz: 39ba9d51e9f957c712a5388c67722e2086eb8c59825d54b852f08d0ea9d094c0
3
+ metadata.gz: '0317804f79b720e64c6f6625b248c33ce62c90b41f7100b80f5a692f2686ff01'
4
+ data.tar.gz: 80cfbe267682f2b272a45ae380bb1db9749fd626f4b40279f4ce7bae76a2ed9a
5
5
  SHA512:
6
- metadata.gz: f4f8b2d7f879beed528924f10e2607a3809ac578079d20cbf0bb40609d3f6e8ac41c4cdee7d8c8d0cae72b3617f283736e330635a6bc90d9cff628e09d9c9d55
7
- data.tar.gz: 7d7562b81af79dd9b065e63e179bc4b6f0cabd0f8fe5a9edaba2327aad853271af8f368af589c465d6cadc5e20e6067d827d1a4e2cc3455941eb9ee8d615b83e
6
+ metadata.gz: 113498f64f0e405daa754b8e20ce126e8ed2c1ef2ce2c0cbe0c4cfb1a8343dd261529ec146228b560d7dc13af22a1837cf3b7377c1c62e8da17fbc9b0c493d63
7
+ data.tar.gz: d2fe355591c76be1c2242d6420eb08742bddee7c784b38419b6d99f1293e82024a17a2c66d0530a92a740805b3121a45dc76a6ca29524b807b76a6054f047d51
@@ -52,6 +52,7 @@ module SdrClient
52
52
  # rubocop:enable Metrics/MethodLength
53
53
  # rubocop:enable Metrics/ParameterLists
54
54
 
55
+ # @param [Array<String>] files absolute paths to files
55
56
  def self.model_run(request_dro:,
56
57
  files: [],
57
58
  url:,
@@ -67,6 +68,7 @@ module SdrClient
67
68
  end
68
69
  end
69
70
  require 'json'
71
+ require 'sdr_client/deposit/create_resource'
70
72
  require 'sdr_client/deposit/single_file_grouping_strategy'
71
73
  require 'sdr_client/deposit/matching_file_grouping_strategy'
72
74
  require 'sdr_client/deposit/files/direct_upload_request'
@@ -78,5 +80,8 @@ require 'sdr_client/deposit/request'
78
80
  require 'sdr_client/deposit/metadata_builder'
79
81
  require 'sdr_client/deposit/model_process'
80
82
  require 'sdr_client/deposit/process'
83
+ require 'sdr_client/deposit/unexpected_response'
84
+ require 'sdr_client/deposit/update_resource'
85
+ require 'sdr_client/deposit/update_dro_with_file_identifiers'
81
86
  require 'sdr_client/deposit/upload_files'
82
- require 'sdr_client/deposit/upload_resource'
87
+ require 'sdr_client/deposit/upload_files_metadata_builder'
@@ -2,8 +2,8 @@
2
2
 
3
3
  module SdrClient
4
4
  module Deposit
5
- # Uploads a resource (metadata) to the server
6
- class UploadResource
5
+ # Creates a resource (metadata) in SDR
6
+ class CreateResource
7
7
  DRO_PATH = '/v1/resources'
8
8
 
9
9
  def self.run(accession:, metadata:, logger:, connection:)
@@ -11,7 +11,7 @@ module SdrClient
11
11
  end
12
12
 
13
13
  # @param [Boolean] accession should the accessionWF be started
14
- # @param [String] metadata
14
+ # @param [Cocina::Models::RequestDRO, Cocina::Models::RequestCollection] metadata
15
15
  # @param [Hash<Symbol,String>] the result of the metadata call
16
16
  def initialize(accession:, metadata:, logger:, connection:)
17
17
  @accession = accession
@@ -24,7 +24,7 @@ module SdrClient
24
24
  # @return [String] job id for the background job result
25
25
  def run
26
26
  response = metadata_request
27
- unexpected_response(response) unless response.status == 201
27
+ UnexpectedResponse.call(response) unless response.status == 201
28
28
 
29
29
  logger.info("Response from server: #{response.body}")
30
30
 
@@ -36,16 +36,10 @@ module SdrClient
36
36
  attr_reader :metadata, :logger, :connection
37
37
 
38
38
  def metadata_request
39
- logger.debug("Starting upload metadata: #{metadata}")
39
+ json = metadata.to_json
40
+ logger.debug("Starting upload metadata: #{json}")
40
41
 
41
- connection.post(path, metadata, 'Content-Type' => 'application/json')
42
- end
43
-
44
- def unexpected_response(response)
45
- raise "There was an error with your request: #{response.body}" if response.status == 400
46
- raise 'There was an error with your credentials. Perhaps they have expired?' if response.status == 401
47
-
48
- raise "unexpected response: #{response.status} #{response.body}"
42
+ connection.post(path, json, 'Content-Type' => 'application/json')
49
43
  end
50
44
 
51
45
  def accession?
@@ -24,13 +24,13 @@ module SdrClient
24
24
  check_files_exist
25
25
  child_files_match
26
26
 
27
- upload_responses = UploadFiles.new(files: files,
28
- logger: logger,
29
- connection: connection,
30
- mime_types: mime_types).run
31
- new_request_dro = with_external_identifiers(upload_responses)
32
- UploadResource.run(accession: @accession,
33
- metadata: new_request_dro.to_json,
27
+ file_metadata = UploadFilesMetadataBuilder.build(files: files, mime_types: mime_types)
28
+ upload_responses = UploadFiles.upload(file_metadata: file_metadata,
29
+ logger: logger,
30
+ connection: connection)
31
+ new_request_dro = UpdateDroWithFileIdentifiers.update(request_dro: request_dro, upload_responses: upload_responses)
32
+ CreateResource.run(accession: @accession,
33
+ metadata: new_request_dro,
34
34
  logger: logger,
35
35
  connection: connection)
36
36
  end
@@ -73,7 +73,9 @@ module SdrClient
73
73
 
74
74
  # Map of filenames to request files
75
75
  def request_files
76
- @request_files ||=
76
+ @request_files ||= begin
77
+ return {} unless request_dro.structural
78
+
77
79
  Hash[
78
80
  request_dro.structural.contains.map do |file_set|
79
81
  file_set.structural.contains.map do |file|
@@ -81,20 +83,7 @@ module SdrClient
81
83
  end
82
84
  end.flatten(1)
83
85
  ]
84
- end
85
-
86
- def with_external_identifiers(upload_responses)
87
- signed_id_map = Hash[upload_responses.map { |response| [response.filename, response.signed_id] }]
88
-
89
- # Manipulating request_dro as hash since immutable
90
- request_dro_hash = request_dro.to_h
91
- request_dro_hash[:structural][:contains].each do |file_set|
92
- file_set[:structural][:contains].each do |file|
93
- file[:externalIdentifier] = signed_id_map[file[:filename]]
94
- end
95
86
  end
96
-
97
- Cocina::Models::RequestDRO.new(request_dro_hash)
98
87
  end
99
88
  end
100
89
  end
@@ -29,17 +29,18 @@ module SdrClient
29
29
  # @return [String] job id for the background job result
30
30
  def run
31
31
  check_files_exist
32
- upload_responses = UploadFiles.new(files: files,
33
- logger: logger,
34
- connection: connection,
35
- mime_types: mime_types).run
32
+
33
+ file_metadata = UploadFilesMetadataBuilder.build(files: files, mime_types: mime_types)
34
+ upload_responses = UploadFiles.upload(file_metadata: file_metadata,
35
+ logger: logger,
36
+ connection: connection)
36
37
  metadata_builder = MetadataBuilder.new(metadata: metadata,
37
38
  grouping_strategy: grouping_strategy,
38
39
  logger: logger)
39
40
  request = metadata_builder.with_uploads(upload_responses)
40
41
  model = Cocina::Models.build_request(request.as_json.with_indifferent_access)
41
- UploadResource.run(accession: @accession,
42
- metadata: JSON.generate(model.to_h),
42
+ CreateResource.run(accession: @accession,
43
+ metadata: model,
43
44
  logger: logger,
44
45
  connection: connection)
45
46
  end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SdrClient
4
+ module Deposit
5
+ # Handles unexpected responses when manipulating resources
6
+ class UnexpectedResponse
7
+ # @param [Faraday::Response] response
8
+ def self.call(response)
9
+ raise "There was an error with your request: #{response.body}" if response.status == 400
10
+ raise 'There was an error with your credentials. Perhaps they have expired?' if response.status == 401
11
+
12
+ raise "unexpected response: #{response.status} #{response.body}"
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SdrClient
4
+ module Deposit
5
+ # Updates a DRO so that the structural metadata references the uploaded file ids
6
+ class UpdateDroWithFileIdentifiers
7
+ # @param [Cocina::Model::RequestDRO] request_dro for depositing
8
+ # @param [Array<Files::DirectUploadResponse>] upload_responses the responses from uploading files
9
+ # @returns [Cocina::Models::RequestDRO]
10
+ def self.update(request_dro:, upload_responses:)
11
+ # Manipulating request_dro as hash since immutable
12
+ structural = request_dro.to_h[:structural]
13
+ return request_dro.new({}) unless structural
14
+
15
+ signed_ids = signed_id_map(upload_responses)
16
+ request_dro.new(structural: updated_structural(structural, signed_ids))
17
+ end
18
+
19
+ def self.signed_id_map(upload_responses)
20
+ Hash[upload_responses.map { |response| [response.filename, response.signed_id] }]
21
+ end
22
+ private_class_method :signed_id_map
23
+
24
+ def self.updated_structural(structural, signed_ids)
25
+ structural[:contains].each do |file_set|
26
+ file_set[:structural][:contains].each do |file|
27
+ file[:externalIdentifier] = signed_ids[file[:filename]]
28
+ end
29
+ end
30
+ structural
31
+ end
32
+ private_class_method :updated_structural
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SdrClient
4
+ module Deposit
5
+ # Updates a resource (metadata) in SDR
6
+ class UpdateResource
7
+ DRO_PATH = '/v1/resources/%<id>s'
8
+
9
+ def self.run(metadata:, logger:, connection:)
10
+ new(metadata: metadata, logger: logger, connection: connection).run
11
+ end
12
+
13
+ # @param [Cocina::Models::DRO] metadata
14
+ # @param [Hash<Symbol,String>] the result of the metadata call
15
+ def initialize(metadata:, logger:, connection:)
16
+ @metadata = metadata
17
+ @logger = logger
18
+ @connection = connection
19
+ end
20
+
21
+ # @param [Hash<Symbol,String>] the result of the metadata call
22
+ # @return [String] job id for the background job result
23
+ def run
24
+ response = metadata_request
25
+ UnexpectedResponse.call(response) unless response.status == 202
26
+
27
+ logger.info("Response from server: #{response.body}")
28
+
29
+ JSON.parse(response.body)['jobId']
30
+ end
31
+
32
+ private
33
+
34
+ attr_reader :metadata, :logger, :connection
35
+
36
+ def metadata_request
37
+ json = metadata.to_json
38
+ logger.debug("Starting upload metadata: #{json}")
39
+
40
+ connection.put(path(metadata), json, 'Content-Type' => 'application/json')
41
+ end
42
+
43
+ def path(metadata)
44
+ format(DRO_PATH, id: metadata.externalIdentifier)
45
+ end
46
+ end
47
+ end
48
+ end
@@ -7,40 +7,34 @@ module SdrClient
7
7
  # The file uploading part of a deposit
8
8
  class UploadFiles
9
9
  BLOB_PATH = '/v1/direct_uploads'
10
- # @param [Array<String>] files a list of filepaths to upload
10
+ # @param [Hash<String,Files::DirectUploadRequest>] the metadata for uploading the files
11
11
  # @param [Logger] logger the logger to use
12
12
  # @param [Connection] connection
13
- # @param [Hash<String,String] mime_types a map of filenames to mime types
14
- def initialize(files:, mime_types:, logger:, connection:)
15
- @files = files
16
- @mime_types = mime_types
13
+ def self.upload(file_metadata:, logger:, connection:)
14
+ new(file_metadata: file_metadata, logger: logger, connection: connection).run
15
+ end
16
+
17
+ # @param [Hash<String,Files::DirectUploadRequest>] the metadata for uploading the files
18
+ # @param [Logger] logger the logger to use
19
+ # @param [Connection] connection
20
+ def initialize(file_metadata:, logger:, connection:)
21
+ @file_metadata = file_metadata
17
22
  @logger = logger
18
23
  @connection = connection
19
24
  end
20
25
 
21
26
  # @return [Array<SdrClient::Deposit::Files::DirectUploadResponse>] the responses from the server for the uploads
22
27
  def run
23
- file_metadata = collect_file_metadata
24
- upload_responses = upload_file_metadata(file_metadata)
28
+ upload_responses = upload_file_metadata
25
29
  upload_files(upload_responses)
26
30
  upload_responses.values
27
31
  end
28
32
 
29
33
  private
30
34
 
31
- attr_reader :files, :mime_types, :logger, :connection
32
-
33
- def collect_file_metadata
34
- files.each_with_object({}) do |path, obj|
35
- file_name = ::File.basename(path)
36
- obj[path] = Files::DirectUploadRequest.from_file(path,
37
- file_name: file_name,
38
- content_type: mime_types[file_name])
39
- end
40
- end
35
+ attr_reader :logger, :connection, :file_metadata
41
36
 
42
- # @param [Hash<String,Files::DirectUploadRequest>] file_metadata the filenames and their upload request
43
- def upload_file_metadata(file_metadata)
37
+ def upload_file_metadata
44
38
  Hash[file_metadata.map { |filename, metadata| [filename, direct_upload(metadata.to_json)] }]
45
39
  end
46
40
 
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'logger'
4
+
5
+ module SdrClient
6
+ module Deposit
7
+ # Collecting all the metadata about the files for a deposit
8
+ class UploadFilesMetadataBuilder
9
+ # @param [Array<String>] files a list of filepaths to upload
10
+ # @param [Hash<String,String>] mime_types a map of filenames to mime types
11
+ # @return [Hash<String, Files::DirectUploadRequest>] the metadata for uploading the files
12
+ def self.build(files:, mime_types:)
13
+ new(files: files, mime_types: mime_types).build
14
+ end
15
+
16
+ # @param [Array<String>] files a list of filepaths to upload
17
+ # @param [Hash<String,String>] mime_types a map of filenames to mime types
18
+ def initialize(files:, mime_types:)
19
+ @files = files
20
+ @mime_types = mime_types
21
+ end
22
+
23
+ attr_reader :files, :mime_types
24
+
25
+ # @return [Hash<String, Files::DirectUploadRequest>] the metadata for uploading the files
26
+ def build
27
+ files.each_with_object({}) do |path, obj|
28
+ obj[path] = Files::DirectUploadRequest.from_file(path,
29
+ file_name: filename_for(path),
30
+ content_type: mime_type_for(path))
31
+ end
32
+ end
33
+
34
+ # This can be overridden in the case that the file on disk has a different
35
+ # name than we want to repo to know about.
36
+ def filename_for(file_path)
37
+ ::File.basename(file_path)
38
+ end
39
+
40
+ def mime_type_for(file_path)
41
+ mime_types[filename_for(file_path)]
42
+ end
43
+ end
44
+ end
45
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SdrClient
4
- VERSION = '0.33.0'
4
+ VERSION = '0.37.0'
5
5
  end
@@ -28,7 +28,7 @@ Gem::Specification.new do |spec|
28
28
  spec.require_paths = ['lib']
29
29
 
30
30
  spec.add_dependency 'activesupport'
31
- spec.add_dependency 'cocina-models', '~> 0.40.1'
31
+ spec.add_dependency 'cocina-models', '~> 0.42.1'
32
32
  spec.add_dependency 'dry-monads'
33
33
  spec.add_dependency 'faraday', '>= 0.16'
34
34
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sdr-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.33.0
4
+ version: 0.37.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Justin Coyne
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-09-11 00:00:00.000000000 Z
11
+ date: 2020-11-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 0.40.1
33
+ version: 0.42.1
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 0.40.1
40
+ version: 0.42.1
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: dry-monads
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -193,6 +193,7 @@ files:
193
193
  - lib/sdr_client/connection.rb
194
194
  - lib/sdr_client/credentials.rb
195
195
  - lib/sdr_client/deposit.rb
196
+ - lib/sdr_client/deposit/create_resource.rb
196
197
  - lib/sdr_client/deposit/file.rb
197
198
  - lib/sdr_client/deposit/file_metadata_builder.rb
198
199
  - lib/sdr_client/deposit/file_metadata_builder_operations/md5.rb
@@ -207,8 +208,11 @@ files:
207
208
  - lib/sdr_client/deposit/process.rb
208
209
  - lib/sdr_client/deposit/request.rb
209
210
  - lib/sdr_client/deposit/single_file_grouping_strategy.rb
211
+ - lib/sdr_client/deposit/unexpected_response.rb
212
+ - lib/sdr_client/deposit/update_dro_with_file_identifiers.rb
213
+ - lib/sdr_client/deposit/update_resource.rb
210
214
  - lib/sdr_client/deposit/upload_files.rb
211
- - lib/sdr_client/deposit/upload_resource.rb
215
+ - lib/sdr_client/deposit/upload_files_metadata_builder.rb
212
216
  - lib/sdr_client/login.rb
213
217
  - lib/sdr_client/login_prompt.rb
214
218
  - lib/sdr_client/version.rb
@@ -234,7 +238,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
234
238
  - !ruby/object:Gem::Version
235
239
  version: '0'
236
240
  requirements: []
237
- rubygems_version: 3.1.2
241
+ rubygems_version: 3.1.4
238
242
  signing_key:
239
243
  specification_version: 4
240
244
  summary: The CLI for https://github.com/sul-dlss/sdr-api