sdr-client 0.4.0 → 0.8.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: b1d76c1422877b6b5f25f0a1cb46641e32771496771576f8f7c8fd2697c14b0e
4
- data.tar.gz: eb116e73a114a3966254a0996c5d843fc960e1454146214ca68fae11eff89bda
3
+ metadata.gz: d4ac0ef485cd0ede90e6bcb2b99dcf001f92f3f296720520e6f1d4f5dcccef47
4
+ data.tar.gz: 52d7af6780779c41dcb67d87b9f87a139568132e612c2118ae5170617b023d06
5
5
  SHA512:
6
- metadata.gz: acf219c807f4f22f87437f779cf4d3ab2bb8091bc810a616146a302a9e2bab4b5be99685c91ea072056344a59b5b0f37e9ed5008105d836078d1b70032720c75
7
- data.tar.gz: b6ec07336e2014a6fbf02470c08649c426384a51c40ee32a164f29c96ab75cd2057615ee5ee8081f7a70f406f794fed6c100fb93aba7848d629e8933fa91f589
6
+ metadata.gz: 48f9cb820ed8e23aada68d2bd65fe676b94941bb47e618832449df5bbcfe53ffb632fc961e1f5d3279d5fc9a8d6458dc32f28fd5b6e3ba240911cc50a9f137c8
7
+ data.tar.gz: 6ad9e1dd66c890a2ae771c95d53c3204872fc8c8fc3eb851863f021c1150748134a426b6aedd511b378a9bba29566d828c4eefa9b027462fedeeea0a170c9df7
@@ -13,3 +13,9 @@ Layout/LineLength:
13
13
  Metrics/BlockLength:
14
14
  Exclude:
15
15
  - 'spec/**/*'
16
+ ExcludedMethods:
17
+ - 'OptionParser.new'
18
+
19
+ Naming/FileName:
20
+ Exclude:
21
+ - 'lib/sdr-client.rb'
@@ -14,8 +14,3 @@ Metrics/AbcSize:
14
14
  # Configuration parameters: CountComments, ExcludedMethods.
15
15
  Metrics/MethodLength:
16
16
  Max: 13
17
-
18
- # Offense count: 2
19
- # Configuration parameters: CountKeywordArgs.
20
- Metrics/ParameterLists:
21
- Max: 8
data/exe/sdr CHANGED
@@ -3,6 +3,7 @@
3
3
 
4
4
  $LOAD_PATH.unshift 'lib'
5
5
  require 'optparse'
6
+ require 'sdr_client'
6
7
 
7
8
  options = {}
8
9
  global = OptionParser.new do |opts|
@@ -60,6 +61,20 @@ subcommands = {
60
61
  options[:source_id] = source_id
61
62
  end
62
63
 
64
+ opts.on('--strategy STRATEGY',
65
+ 'The strategy to use for distributing files into filesets. Either "default" or "filename"') do |strategy|
66
+ strategy_class = case strategy
67
+ when 'filename'
68
+ SdrClient::Deposit::MatchingFileGroupingStrategy
69
+ when 'default'
70
+ SdrClient::Deposit::SingleFileGroupingStrategy
71
+ else
72
+ warn "Unknown strategy #{strategy}"
73
+ exit(1)
74
+ end
75
+ options[:grouping_strategy] = strategy_class
76
+ end
77
+
63
78
  opts.on('-h', '--help', 'Display this screen') do
64
79
  puts opts
65
80
  exit
@@ -75,6 +90,5 @@ end
75
90
 
76
91
  subcommands[command].order!
77
92
 
78
- require 'sdr_client'
79
93
  options[:files] = ARGV unless ARGV.empty?
80
94
  SdrClient::CLI.start(command, options)
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'sdr_client'
@@ -13,6 +13,9 @@ module SdrClient
13
13
  else
14
14
  raise "Unknown command #{command}"
15
15
  end
16
+ rescue SdrClient::Credentials::NoCredentialsError
17
+ puts 'Log in first'
18
+ exit(1)
16
19
  end
17
20
  end
18
21
  end
@@ -3,6 +3,8 @@
3
3
  module SdrClient
4
4
  # The stored credentials
5
5
  class Credentials
6
+ class NoCredentialsError < StandardError; end
7
+
6
8
  # @param [String] a json string that contains a field 'token'
7
9
  def self.write(body)
8
10
  json = JSON.parse(body)
@@ -10,14 +12,12 @@ module SdrClient
10
12
  File.open(credentials_file, 'w', 0o600) do |file|
11
13
  file.write(json.fetch('token'))
12
14
  end
13
- puts 'Signed in.'
14
15
  end
15
16
 
16
17
  def self.read
17
- return IO.readlines(credentials_file, chomp: true).first if ::File.exist?(credentials_file)
18
+ raise NoCredentialsError unless ::File.exist?(credentials_file)
18
19
 
19
- puts 'Log in first'
20
- exit(1)
20
+ IO.readlines(credentials_file, chomp: true).first
21
21
  end
22
22
 
23
23
  def self.credentials_path
@@ -1,15 +1,22 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'logger'
4
+
3
5
  module SdrClient
4
6
  # The namespace for the "deposit" command
5
7
  module Deposit
8
+ # rubocop:disable Metrics/ParameterLists
6
9
  def self.run(label: nil,
7
10
  type: 'http://cocina.sul.stanford.edu/models/book.jsonld',
8
11
  apo:,
9
12
  collection:,
10
13
  catkey: nil,
11
14
  source_id:,
12
- url:, files: [])
15
+ url:,
16
+ files: [],
17
+ files_metadata: {},
18
+ grouping_strategy: SingleFileGroupingStrategy,
19
+ logger: Logger.new(STDOUT))
13
20
  token = Credentials.read
14
21
 
15
22
  metadata = Request.new(label: label,
@@ -18,15 +25,20 @@ module SdrClient
18
25
  collection: collection,
19
26
  source_id: source_id,
20
27
  catkey: catkey)
21
- Process.new(metadata: metadata, url: url, token: token, files: files).run
28
+ Process.new(metadata: metadata, url: url, token: token, files: files,
29
+ files_metadata: files_metadata, grouping_strategy: grouping_strategy, logger: logger).run
22
30
  end
31
+ # rubocop:enable Metrics/ParameterLists
23
32
  end
24
33
  end
25
34
  require 'json'
26
- require 'sdr_client/deposit/default_file_set_builder'
35
+ require 'sdr_client/deposit/single_file_grouping_strategy'
36
+ require 'sdr_client/deposit/matching_file_grouping_strategy'
27
37
  require 'sdr_client/deposit/files/direct_upload_request'
28
38
  require 'sdr_client/deposit/files/direct_upload_response'
29
39
  require 'sdr_client/deposit/file'
30
40
  require 'sdr_client/deposit/file_set'
31
41
  require 'sdr_client/deposit/request'
42
+ require 'sdr_client/deposit/upload_files'
43
+ require 'sdr_client/deposit/metadata_builder'
32
44
  require 'sdr_client/deposit/process'
@@ -4,15 +4,23 @@ module SdrClient
4
4
  module Deposit
5
5
  # This represents the File metadata that we send to the server for doing a deposit
6
6
  class File
7
- def initialize(external_identifier:, label:, filename:, access: 'dark', preserve: false, shelve: false)
7
+ # rubocop:disable Metrics/ParameterLists
8
+ def initialize(external_identifier:, label:, filename:,
9
+ access: 'dark', preserve: false, shelve: false,
10
+ mime_type: nil, md5: nil, sha1: nil)
8
11
  @external_identifier = external_identifier
9
12
  @label = label
10
13
  @filename = filename
11
14
  @access = access
12
15
  @preserve = preserve
13
16
  @shelve = shelve
17
+ @mime_type = mime_type
18
+ @md5 = md5
19
+ @sha1 = sha1
14
20
  end
21
+ # rubocop:enable Metrics/ParameterLists
15
22
 
23
+ # rubocop:disable Metrics/MethodLength
16
24
  def as_json
17
25
  {
18
26
  "type": 'http://cocina.sul.stanford.edu/models/file.jsonld',
@@ -26,6 +34,26 @@ module SdrClient
26
34
  sdrPreserve: @preserve,
27
35
  shelve: @shelve
28
36
  }
37
+ }.tap do |json|
38
+ json['hasMessageDigests'] = message_digests unless message_digests.empty?
39
+ json['hasMimeType'] = @mime_type if @mime_type
40
+ end
41
+ end
42
+ # rubocop:enable Metrics/MethodLength
43
+
44
+ private
45
+
46
+ def message_digests
47
+ @message_digests ||= [].tap do |message_digests|
48
+ message_digests << create_message_digest('md5', @md5) unless @md5.nil?
49
+ message_digests << create_message_digest('sha1', @sha1) unless @sha1.nil?
50
+ end
51
+ end
52
+
53
+ def create_message_digest(algorithm, digest)
54
+ {
55
+ "type": algorithm,
56
+ digest: digest
29
57
  }
30
58
  end
31
59
  end
@@ -4,11 +4,11 @@ module SdrClient
4
4
  module Deposit
5
5
  # This represents the FileSet metadata that we send to the server for doing a deposit
6
6
  class FileSet
7
- def initialize(uploads: [], files: [], label:)
7
+ def initialize(uploads: [], uploads_metadata: {}, files: [], label:)
8
8
  @label = label
9
9
  @files = if !uploads.empty?
10
10
  uploads.map do |upload|
11
- File.new(external_identifier: upload.signed_id, label: upload.filename, filename: upload.filename)
11
+ File.new(file_args(upload, uploads_metadata.fetch(upload.filename, {})))
12
12
  end
13
13
  else
14
14
  files
@@ -20,7 +20,7 @@ module SdrClient
20
20
  "type": 'http://cocina.sul.stanford.edu/models/fileset.jsonld',
21
21
  "label": label,
22
22
  structural: {
23
- hasMember: files.map(&:as_json)
23
+ contains: files.map(&:as_json)
24
24
  }
25
25
  }
26
26
  end
@@ -28,6 +28,15 @@ module SdrClient
28
28
  private
29
29
 
30
30
  attr_reader :files, :label
31
+
32
+ def file_args(upload, upload_metadata)
33
+ args = {
34
+ external_identifier: upload.signed_id,
35
+ label: upload.filename,
36
+ filename: upload.filename
37
+ }
38
+ args.merge(upload_metadata)
39
+ end
31
40
  end
32
41
  end
33
42
  end
@@ -6,12 +6,12 @@ module SdrClient
6
6
  module Deposit
7
7
  module Files
8
8
  DirectUploadRequest = Struct.new(:checksum, :byte_size, :content_type, :filename, keyword_init: true) do
9
- def self.from_file(filename)
10
- checksum = Digest::MD5.file(filename).base64digest
9
+ def self.from_file(path, file_name:, content_type:)
10
+ checksum = Digest::MD5.file(path).base64digest
11
11
  new(checksum: checksum,
12
- byte_size: ::File.size(filename),
13
- content_type: 'text/html',
14
- filename: ::File.basename(filename))
12
+ byte_size: ::File.size(path),
13
+ content_type: content_type || 'application/octet-stream',
14
+ filename: file_name)
15
15
  end
16
16
 
17
17
  def as_json
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SdrClient
4
+ module Deposit
5
+ # This strategy is for building one file set per set of similarly prefixed uploaded files
6
+ class MatchingFileGroupingStrategy
7
+ # @param [Array<SdrClient::Deposit::Files::DirectUploadResponse>] uploads the uploaded files to attach.
8
+ # @return [Array<Array<SdrClient::Deposit::Files::DirectUploadResponse>>] uploads the grouped uploaded files.
9
+ def self.run(uploads: [])
10
+ # Call `#values` on the result of the grouping operation because 1)
11
+ # `Process#build_filesets` expects an array of arrays, not an array of
12
+ # hashes, and 2) the keys aren't used anywhere
13
+ uploads.group_by { |ul| ::File.basename(ul.filename, '.*') }.values
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'logger'
4
+
5
+ module SdrClient
6
+ module Deposit
7
+ # Constructs the deposit metadata for the DRO
8
+ class MetadataBuilder
9
+ # @param [Request] metadata information about the object
10
+ # @param [Class] grouping_strategy class whose run method groups an array of uploads
11
+ # @param [Hash<String, Hash<String, String>>] files_metadata file name, hash of additional file metadata
12
+ # Additional metadata includes access, preserve, shelve, md5, sha1
13
+ # @param [Logger] logger the logger to use
14
+ def initialize(metadata:, grouping_strategy:, files_metadata:, logger:)
15
+ @metadata = metadata
16
+ @logger = logger
17
+ @grouping_strategy = grouping_strategy
18
+ @files_metadata = files_metadata
19
+ end
20
+
21
+ def with_uploads(upload_responses)
22
+ file_sets = build_filesets(uploads: upload_responses)
23
+ metadata.with_file_sets(file_sets)
24
+ end
25
+
26
+ private
27
+
28
+ attr_reader :metadata, :files, :logger, :grouping_strategy, :files_metadata
29
+
30
+ # @param [Array<SdrClient::Deposit::Files::DirectUploadResponse>] uploads the uploaded files to attach.
31
+ # @return [Array<SdrClient::Deposit::FileSet>] the uploads transformed to filesets
32
+ def build_filesets(uploads:)
33
+ grouped_uploads = grouping_strategy.run(uploads: uploads)
34
+ grouped_uploads.map.with_index(1) do |upload_group, i|
35
+ metadata_group = {}
36
+ upload_group.each { |upload| metadata_group[upload.filename] = files_metadata.fetch(upload.filename, {}) }
37
+ FileSet.new(uploads: upload_group, uploads_metadata: metadata_group, label: "Object #{i}")
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -6,36 +6,43 @@ module SdrClient
6
6
  module Deposit
7
7
  # The process for doing a deposit
8
8
  class Process
9
- BLOB_PATH = '/v1/direct_uploads'
10
9
  DRO_PATH = '/v1/resources'
11
10
  # @param [Request] metadata information about the object
12
- # @param [#build] file_set_builder a strategy for constructing FileSets
11
+ # @param [Class] grouping_strategy class whose run method groups an array of uploads
13
12
  # @param [String] url the server to send to
14
13
  # @param [String] token the bearer auth token for the server
15
14
  # @param [Array<String>] files a list of file names to upload
15
+ # @param [Hash<String, Hash<String, String>>] files_metadata file name, hash of additional file metadata
16
+ # Additional metadata includes access, preserve, shelve, md5, sha1
16
17
  # @param [Logger] logger the logger to use
17
- def initialize(metadata:, file_set_builder: DefaultFileSetBuilder, url:,
18
- token:, files: [], logger: Logger.new(STDOUT))
18
+ # rubocop:disable Metrics/ParameterLists
19
+ def initialize(metadata:, grouping_strategy: SingleFileGroupingStrategy, url:,
20
+ token:, files: [], files_metadata: {}, logger: Logger.new(STDOUT))
19
21
  @files = files
20
22
  @url = url
21
23
  @token = token
22
24
  @metadata = metadata
23
25
  @logger = logger
24
- @file_set_builder = file_set_builder
26
+ @grouping_strategy = grouping_strategy
27
+ @files_metadata = files_metadata
25
28
  end
29
+ # rubocop:enable Metrics/ParameterLists
26
30
 
27
31
  def run
28
32
  check_files_exist
29
- file_metadata = collect_file_metadata
30
- upload_responses = upload_file_metadata(file_metadata)
31
- upload_files(upload_responses)
32
- request = file_set_builder.run(request: metadata, uploads: upload_responses.values)
33
+ upload_responses = UploadFiles.new(files: files, logger: logger,
34
+ connection: connection, files_metadata: files_metadata).run
35
+ metadata_builder = MetadataBuilder.new(metadata: metadata,
36
+ grouping_strategy: grouping_strategy,
37
+ files_metadata: files_metadata,
38
+ logger: logger)
39
+ request = metadata_builder.with_uploads(upload_responses)
33
40
  upload_metadata(request.as_json)
34
41
  end
35
42
 
36
43
  private
37
44
 
38
- attr_reader :metadata, :files, :url, :token, :logger, :file_set_builder
45
+ attr_reader :metadata, :files, :url, :token, :logger, :grouping_strategy, :files_metadata
39
46
 
40
47
  def check_files_exist
41
48
  logger.info('checking to see if files exist')
@@ -44,51 +51,6 @@ module SdrClient
44
51
  end
45
52
  end
46
53
 
47
- def collect_file_metadata
48
- files.each_with_object({}) do |filename, obj|
49
- obj[filename] = Files::DirectUploadRequest.from_file(filename)
50
- end
51
- end
52
-
53
- # @param [Hash<String,Files::DirectUploadRequest>] file_metadata the filenames and their upload request
54
- def upload_file_metadata(file_metadata)
55
- Hash[file_metadata.map { |filename, metadata| [filename, direct_upload(metadata.to_json)] }]
56
- end
57
-
58
- def direct_upload(metadata_json)
59
- logger.info("Starting an upload request: #{metadata_json}")
60
- response = connection.post(BLOB_PATH, metadata_json, 'Content-Type' => 'application/json')
61
- raise "unexpected response: #{response.inspect}" unless response.status == 200
62
-
63
- logger.info("Response from server: #{response.body}")
64
-
65
- Files::DirectUploadResponse.new(JSON.parse(response.body))
66
- end
67
-
68
- # @param [Hash<String,Files::DirectUploadResponse>] upload_responses the filenames and their upload response
69
- def upload_files(upload_responses)
70
- upload_responses.each do |filename, response|
71
- upload_file(filename: filename,
72
- url: response.direct_upload.fetch('url'),
73
- content_type: response.content_type,
74
- content_length: response.byte_size)
75
-
76
- logger.info('Upload complete')
77
- end
78
- end
79
-
80
- def upload_file(filename:, url:, content_type:, content_length:)
81
- logger.info("Uploading `#{filename}' to #{url}")
82
-
83
- upload_response = connection.put(url) do |req|
84
- req.body = ::File.open(filename)
85
- req.headers['Content-Type'] = content_type
86
- req.headers['Content-Length'] = content_length.to_s
87
- end
88
-
89
- raise "unexpected response: #{upload_response.inspect}" unless upload_response.status == 204
90
- end
91
-
92
54
  # @return [Hash<Symbol,String>] the result of the metadata call
93
55
  def upload_metadata(metadata)
94
56
  logger.info("Starting upload metadata: #{metadata}")
@@ -114,6 +76,22 @@ module SdrClient
114
76
  conn.adapter :net_http
115
77
  end
116
78
  end
79
+
80
+ # @param [Array<SdrClient::Deposit::Files::DirectUploadResponse>] uploads the uploaded files to attach.
81
+ # @return [Array<SdrClient::Deposit::FileSet>] the uploads transformed to filesets
82
+ def build_filesets(uploads:)
83
+ grouped_uploads = grouping_strategy.run(uploads: uploads)
84
+ grouped_uploads.map.with_index(1) do |upload_group, i|
85
+ metadata_group = {}
86
+ upload_group.each { |upload| metadata_group[upload.filename] = file_metadata_for(upload.filename) }
87
+ FileSet.new(uploads: upload_group, uploads_metadata: metadata_group, label: "Object #{i}")
88
+ end
89
+ end
90
+
91
+ # @return [Hash<Symbol,String>] the file metadata for this file
92
+ def file_metadata_for(filename)
93
+ files_metadata.fetch(filename, {})
94
+ end
117
95
  end
118
96
  end
119
97
  end
@@ -7,6 +7,7 @@ module SdrClient
7
7
  # @param [String] label the required object label
8
8
  # @param [String] type (http://cocina.sul.stanford.edu/models/object.jsonld) the required object type.
9
9
  # @param [Array<FileSet>] file_sets the file sets to attach.
10
+ # rubocop:disable Metrics/ParameterLists
10
11
  def initialize(label: nil,
11
12
  apo:,
12
13
  collection:,
@@ -22,6 +23,7 @@ module SdrClient
22
23
  @apo = apo
23
24
  @file_sets = file_sets
24
25
  end
26
+ # rubocop:enable Metrics/ParameterLists
25
27
 
26
28
  def as_json
27
29
  {
@@ -65,7 +67,7 @@ module SdrClient
65
67
  def structural
66
68
  {
67
69
  isMemberOf: collection,
68
- hasMember: file_sets.map(&:as_json)
70
+ contains: file_sets.map(&:as_json)
69
71
  }
70
72
  end
71
73
  end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SdrClient
4
+ module Deposit
5
+ # This strategy is for building one file set per uploaded file
6
+ class SingleFileGroupingStrategy
7
+ # @param [Array<SdrClient::Deposit::Files::DirectUploadResponse>] uploads the uploaded files to attach.
8
+ # @return [Array<Array<SdrClient::Deposit::Files::DirectUploadResponse>>] uploads the grouped uploaded files.
9
+ def self.run(uploads: [])
10
+ uploads.map { |upload| [upload] }
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,87 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'logger'
4
+
5
+ module SdrClient
6
+ module Deposit
7
+ # The file uploading part of a deposit
8
+ class UploadFiles
9
+ BLOB_PATH = '/v1/direct_uploads'
10
+ # @param [Array<String>] files a list of file names to upload
11
+ # @param [Logger] logger the logger to use
12
+ # @param [Faraday::Connection] connection
13
+ # @param [Hash<String, Hash<String, String>>] files_metadata file name, hash of additional file metadata
14
+ def initialize(files:, files_metadata:, logger:, connection:)
15
+ @files = files
16
+ @files_metadata = files_metadata
17
+ @logger = logger
18
+ @connection = connection
19
+ end
20
+
21
+ # @return [Array<SdrClient::Deposit::Files::DirectUploadResponse>] the responses from the server for the uploads
22
+ def run
23
+ file_metadata = collect_file_metadata
24
+ upload_responses = upload_file_metadata(file_metadata)
25
+ upload_files(upload_responses)
26
+ upload_responses.values
27
+ end
28
+
29
+ private
30
+
31
+ attr_reader :files, :files_metadata, :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: file_metadata_for(file_name)[:mime_type])
39
+ end
40
+ end
41
+
42
+ # @param [Hash<String,Files::DirectUploadRequest>] file_metadata the filenames and their upload request
43
+ def upload_file_metadata(file_metadata)
44
+ Hash[file_metadata.map { |filename, metadata| [filename, direct_upload(metadata.to_json)] }]
45
+ end
46
+
47
+ def direct_upload(metadata_json)
48
+ logger.info("Starting an upload request: #{metadata_json}")
49
+ response = connection.post(BLOB_PATH, metadata_json, 'Content-Type' => 'application/json')
50
+ raise "unexpected response: #{response.inspect}" unless response.status == 200
51
+
52
+ logger.info("Response from server: #{response.body}")
53
+
54
+ Files::DirectUploadResponse.new(JSON.parse(response.body))
55
+ end
56
+
57
+ # @param [Hash<String,Files::DirectUploadResponse>] upload_responses the filenames and their upload response
58
+ def upload_files(upload_responses)
59
+ upload_responses.each do |filename, response|
60
+ upload_file(filename: filename,
61
+ url: response.direct_upload.fetch('url'),
62
+ content_type: response.content_type,
63
+ content_length: response.byte_size)
64
+
65
+ logger.info('Upload complete')
66
+ end
67
+ end
68
+
69
+ def upload_file(filename:, url:, content_type:, content_length:)
70
+ logger.info("Uploading `#{filename}' to #{url}")
71
+
72
+ upload_response = connection.put(url) do |req|
73
+ req.body = ::File.open(filename)
74
+ req.headers['Content-Type'] = content_type
75
+ req.headers['Content-Length'] = content_length.to_s
76
+ end
77
+
78
+ raise "unexpected response: #{upload_response.inspect}" unless upload_response.status == 204
79
+ end
80
+
81
+ # @return [Hash<Symbol,String>] the file metadata for this file
82
+ def file_metadata_for(filename)
83
+ files_metadata.fetch(filename, {})
84
+ end
85
+ end
86
+ end
87
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SdrClient
4
- VERSION = '0.4.0'
4
+ VERSION = '0.8.0'
5
5
  end
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.4.0
4
+ version: 0.8.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-01-24 00:00:00.000000000 Z
11
+ date: 2020-01-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dry-monads
@@ -158,17 +158,21 @@ files:
158
158
  - bin/console
159
159
  - bin/setup
160
160
  - exe/sdr
161
+ - lib/sdr-client.rb
161
162
  - lib/sdr_client.rb
162
163
  - lib/sdr_client/cli.rb
163
164
  - lib/sdr_client/credentials.rb
164
165
  - lib/sdr_client/deposit.rb
165
- - lib/sdr_client/deposit/default_file_set_builder.rb
166
166
  - lib/sdr_client/deposit/file.rb
167
167
  - lib/sdr_client/deposit/file_set.rb
168
168
  - lib/sdr_client/deposit/files/direct_upload_request.rb
169
169
  - lib/sdr_client/deposit/files/direct_upload_response.rb
170
+ - lib/sdr_client/deposit/matching_file_grouping_strategy.rb
171
+ - lib/sdr_client/deposit/metadata_builder.rb
170
172
  - lib/sdr_client/deposit/process.rb
171
173
  - lib/sdr_client/deposit/request.rb
174
+ - lib/sdr_client/deposit/single_file_grouping_strategy.rb
175
+ - lib/sdr_client/deposit/upload_files.rb
172
176
  - lib/sdr_client/login.rb
173
177
  - lib/sdr_client/login_prompt.rb
174
178
  - lib/sdr_client/version.rb
@@ -194,7 +198,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
194
198
  - !ruby/object:Gem::Version
195
199
  version: '0'
196
200
  requirements: []
197
- rubygems_version: 3.0.3
201
+ rubygems_version: 3.0.6
198
202
  signing_key:
199
203
  specification_version: 4
200
204
  summary: The CLI for https://github.com/sul-dlss/sdr-api
@@ -1,18 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module SdrClient
4
- module Deposit
5
- # This strategy is for building one file set per uploaded file
6
- class DefaultFileSetBuilder
7
- # @return [Request] request The initial request
8
- # @param [Array<SdrClient::Deposit::Files::DirectUploadResponse>] uploads the uploaded files to attach.
9
- # @return [Request] a clone of this request with the uploads added
10
- def self.run(request:, uploads: [])
11
- file_sets = uploads.each_with_index.map do |upload, i|
12
- FileSet.new(uploads: [upload], label: "Object #{i + 1}")
13
- end
14
- request.with_file_sets(file_sets)
15
- end
16
- end
17
- end
18
- end