sdr-client 0.8.1 → 0.9.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 +4 -4
- data/README.md +9 -0
- data/exe/sdr +5 -0
- data/lib/sdr_client/deposit.rb +3 -2
- data/lib/sdr_client/deposit/file.rb +3 -1
- data/lib/sdr_client/deposit/file_set.rb +6 -0
- data/lib/sdr_client/deposit/metadata_builder.rb +3 -5
- data/lib/sdr_client/deposit/process.rb +6 -24
- data/lib/sdr_client/deposit/request.rb +15 -3
- data/lib/sdr_client/deposit/upload_files.rb +5 -10
- data/lib/sdr_client/version.rb +1 -2
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '0578c4fbb93d5b8118a9d55f9751f1b50b633d15405411a31b8a4376b3d2f297'
|
4
|
+
data.tar.gz: 0bc45cbbe780f1e386685bca4cd500ca8ed8b227ddd0377c290c36b918a5dd96
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8cc065044b53e035c4eb73901ab635684c8b956ec280713ad50293e410a6525c5d15d274acaf7cf266f3a7f31a77309c85a9067449f03885ca1abde0b0e4d53a
|
7
|
+
data.tar.gz: 7a03cfd0cbf6a48e2fea9c71fb587c74e58b624a6ce1a299c55534c7fce9043d0a4dd0c4682f914ad54b4074bf4fda4ee95e3c70ac3d17d77d0b0a6c9a786bf0
|
data/README.md
CHANGED
@@ -27,3 +27,12 @@ sdr --service-url https://sdr-api-server:3000 deposit --label 'hey there' \
|
|
27
27
|
--collection 'druid:gh456kw9876' \
|
28
28
|
--source-id 'googlebooks:stanford_12345' file1.png file2.png
|
29
29
|
```
|
30
|
+
|
31
|
+
Deposit a new object, providing metadata for files:
|
32
|
+
```
|
33
|
+
sdr --service-url https://sdr-api-server:3000 deposit --label 'hey there' \
|
34
|
+
--files-metadata '{"image42.jp2":{"mime_type":"image/jp2"},"ocr.html":{"use":"transcription"}}'
|
35
|
+
--admin-policy 'druid:bk123gh4567' \
|
36
|
+
--collection 'druid:gh456kw9876' \
|
37
|
+
--source-id 'googlebooks:stanford_12345' image42.jp2 ocr.html
|
38
|
+
```
|
data/exe/sdr
CHANGED
@@ -49,6 +49,7 @@ subcommands = {
|
|
49
49
|
opts.on('--admin-policy ADMIN_POLICY', 'The druid identifier of the admin policy object') do |apo|
|
50
50
|
options[:apo] = apo
|
51
51
|
end
|
52
|
+
|
52
53
|
opts.on('--collection COLLECTION', 'The druid identifier of the collection object') do |collection|
|
53
54
|
options[:collection] = collection
|
54
55
|
end
|
@@ -61,6 +62,10 @@ subcommands = {
|
|
61
62
|
options[:source_id] = source_id
|
62
63
|
end
|
63
64
|
|
65
|
+
opts.on('--files-metadata FILES_METADATA', 'A JSON object representing per-file metadata') do |files_metadata|
|
66
|
+
options[:files_metadata] = JSON.parse(files_metadata)
|
67
|
+
end
|
68
|
+
|
64
69
|
opts.on('--strategy STRATEGY',
|
65
70
|
'The strategy to use for distributing files into filesets. Either "default" or "filename"') do |strategy|
|
66
71
|
strategy_class = case strategy
|
data/lib/sdr_client/deposit.rb
CHANGED
@@ -24,9 +24,10 @@ module SdrClient
|
|
24
24
|
apo: apo,
|
25
25
|
collection: collection,
|
26
26
|
source_id: source_id,
|
27
|
-
catkey: catkey
|
27
|
+
catkey: catkey,
|
28
|
+
files_metadata: files_metadata)
|
28
29
|
Process.new(metadata: metadata, url: url, token: token, files: files,
|
29
|
-
|
30
|
+
grouping_strategy: grouping_strategy, logger: logger).run
|
30
31
|
end
|
31
32
|
# rubocop:enable Metrics/ParameterLists
|
32
33
|
end
|
@@ -7,7 +7,7 @@ module SdrClient
|
|
7
7
|
# rubocop:disable Metrics/ParameterLists
|
8
8
|
def initialize(external_identifier:, label:, filename:,
|
9
9
|
access: 'dark', preserve: false, shelve: false,
|
10
|
-
mime_type: nil, md5: nil, sha1: nil)
|
10
|
+
mime_type: nil, md5: nil, sha1: nil, use: nil)
|
11
11
|
@external_identifier = external_identifier
|
12
12
|
@label = label
|
13
13
|
@filename = filename
|
@@ -17,6 +17,7 @@ module SdrClient
|
|
17
17
|
@mime_type = mime_type
|
18
18
|
@md5 = md5
|
19
19
|
@sha1 = sha1
|
20
|
+
@use = use
|
20
21
|
end
|
21
22
|
# rubocop:enable Metrics/ParameterLists
|
22
23
|
|
@@ -37,6 +38,7 @@ module SdrClient
|
|
37
38
|
}.tap do |json|
|
38
39
|
json['hasMessageDigests'] = message_digests unless message_digests.empty?
|
39
40
|
json['hasMimeType'] = @mime_type if @mime_type
|
41
|
+
json['use'] = @use if @use
|
40
42
|
end
|
41
43
|
end
|
42
44
|
# rubocop:enable Metrics/MethodLength
|
@@ -4,6 +4,10 @@ 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
|
+
# @param [Array] uploads
|
8
|
+
# @param [Hash<String,Hash<String,String>>] the file level metadata
|
9
|
+
# @param [Array] files
|
10
|
+
# @param [String] label
|
7
11
|
def initialize(uploads: [], uploads_metadata: {}, files: [], label:)
|
8
12
|
@label = label
|
9
13
|
@files = if !uploads.empty?
|
@@ -29,6 +33,8 @@ module SdrClient
|
|
29
33
|
|
30
34
|
attr_reader :files, :label
|
31
35
|
|
36
|
+
# This creates the metadata for each file and symbolizes the keys
|
37
|
+
# @return [Hash<Symbol,String>]
|
32
38
|
def file_args(upload, upload_metadata)
|
33
39
|
args = {
|
34
40
|
external_identifier: upload.signed_id,
|
@@ -8,14 +8,12 @@ module SdrClient
|
|
8
8
|
class MetadataBuilder
|
9
9
|
# @param [Request] metadata information about the object
|
10
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
11
|
# Additional metadata includes access, preserve, shelve, md5, sha1
|
13
12
|
# @param [Logger] logger the logger to use
|
14
|
-
def initialize(metadata:, grouping_strategy:,
|
13
|
+
def initialize(metadata:, grouping_strategy:, logger:)
|
15
14
|
@metadata = metadata
|
16
15
|
@logger = logger
|
17
16
|
@grouping_strategy = grouping_strategy
|
18
|
-
@files_metadata = files_metadata
|
19
17
|
end
|
20
18
|
|
21
19
|
def with_uploads(upload_responses)
|
@@ -25,7 +23,7 @@ module SdrClient
|
|
25
23
|
|
26
24
|
private
|
27
25
|
|
28
|
-
attr_reader :metadata, :files, :logger, :grouping_strategy
|
26
|
+
attr_reader :metadata, :files, :logger, :grouping_strategy
|
29
27
|
|
30
28
|
# @param [Array<SdrClient::Deposit::Files::DirectUploadResponse>] uploads the uploaded files to attach.
|
31
29
|
# @return [Array<SdrClient::Deposit::FileSet>] the uploads transformed to filesets
|
@@ -33,7 +31,7 @@ module SdrClient
|
|
33
31
|
grouped_uploads = grouping_strategy.run(uploads: uploads)
|
34
32
|
grouped_uploads.map.with_index(1) do |upload_group, i|
|
35
33
|
metadata_group = {}
|
36
|
-
upload_group.each { |upload| metadata_group[upload.filename] =
|
34
|
+
upload_group.each { |upload| metadata_group[upload.filename] = metadata.for(upload.filename) }
|
37
35
|
FileSet.new(uploads: upload_group, uploads_metadata: metadata_group, label: "Object #{i}")
|
38
36
|
end
|
39
37
|
end
|
@@ -12,29 +12,27 @@ module SdrClient
|
|
12
12
|
# @param [String] url the server to send to
|
13
13
|
# @param [String] token the bearer auth token for the server
|
14
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
|
17
15
|
# @param [Logger] logger the logger to use
|
18
16
|
# rubocop:disable Metrics/ParameterLists
|
19
17
|
def initialize(metadata:, grouping_strategy: SingleFileGroupingStrategy, url:,
|
20
|
-
token:, files: [],
|
18
|
+
token:, files: [], logger: Logger.new(STDOUT))
|
21
19
|
@files = files
|
22
20
|
@url = url
|
23
21
|
@token = token
|
24
22
|
@metadata = metadata
|
25
23
|
@logger = logger
|
26
24
|
@grouping_strategy = grouping_strategy
|
27
|
-
@files_metadata = files_metadata
|
28
25
|
end
|
29
26
|
# rubocop:enable Metrics/ParameterLists
|
30
27
|
|
31
28
|
def run
|
32
29
|
check_files_exist
|
33
|
-
upload_responses = UploadFiles.new(files: files,
|
34
|
-
|
30
|
+
upload_responses = UploadFiles.new(files: files,
|
31
|
+
logger: logger,
|
32
|
+
connection: connection,
|
33
|
+
metadata: metadata).run
|
35
34
|
metadata_builder = MetadataBuilder.new(metadata: metadata,
|
36
35
|
grouping_strategy: grouping_strategy,
|
37
|
-
files_metadata: files_metadata,
|
38
36
|
logger: logger)
|
39
37
|
request = metadata_builder.with_uploads(upload_responses)
|
40
38
|
upload_metadata(request.as_json)
|
@@ -42,7 +40,7 @@ module SdrClient
|
|
42
40
|
|
43
41
|
private
|
44
42
|
|
45
|
-
attr_reader :metadata, :files, :url, :token, :logger, :grouping_strategy
|
43
|
+
attr_reader :metadata, :files, :url, :token, :logger, :grouping_strategy
|
46
44
|
|
47
45
|
def check_files_exist
|
48
46
|
logger.info('checking to see if files exist')
|
@@ -76,22 +74,6 @@ module SdrClient
|
|
76
74
|
conn.adapter :net_http
|
77
75
|
end
|
78
76
|
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
|
95
77
|
end
|
96
78
|
end
|
97
79
|
end
|
@@ -7,6 +7,8 @@ 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
|
+
# @param [Hash<String, Hash<String, String>>] files_metadata file name, hash of additional file metadata
|
11
|
+
# Additional metadata includes access, preserve, shelve, md5, sha1
|
10
12
|
# rubocop:disable Metrics/ParameterLists
|
11
13
|
def initialize(label: nil,
|
12
14
|
apo:,
|
@@ -14,7 +16,8 @@ module SdrClient
|
|
14
16
|
source_id:,
|
15
17
|
catkey: nil,
|
16
18
|
type: 'http://cocina.sul.stanford.edu/models/object.jsonld',
|
17
|
-
file_sets: []
|
19
|
+
file_sets: [],
|
20
|
+
files_metadata: {})
|
18
21
|
@label = label
|
19
22
|
@type = type
|
20
23
|
@source_id = source_id
|
@@ -22,6 +25,7 @@ module SdrClient
|
|
22
25
|
@catkey = catkey
|
23
26
|
@apo = apo
|
24
27
|
@file_sets = file_sets
|
28
|
+
@files_metadata = files_metadata
|
25
29
|
end
|
26
30
|
# rubocop:enable Metrics/ParameterLists
|
27
31
|
|
@@ -45,12 +49,20 @@ module SdrClient
|
|
45
49
|
source_id: source_id,
|
46
50
|
catkey: catkey,
|
47
51
|
type: type,
|
48
|
-
file_sets: file_sets
|
52
|
+
file_sets: file_sets,
|
53
|
+
files_metadata: files_metadata)
|
54
|
+
end
|
55
|
+
|
56
|
+
# @param [String] filename
|
57
|
+
# @return [Hash] the metadata for the file
|
58
|
+
def for(filename)
|
59
|
+
files_metadata.fetch(filename, {})
|
49
60
|
end
|
50
61
|
|
51
62
|
private
|
52
63
|
|
53
|
-
attr_reader :label, :file_sets, :source_id, :catkey, :apo, :collection,
|
64
|
+
attr_reader :label, :file_sets, :source_id, :catkey, :apo, :collection,
|
65
|
+
:type, :files_metadata
|
54
66
|
|
55
67
|
def administrative
|
56
68
|
{
|
@@ -10,10 +10,10 @@ module SdrClient
|
|
10
10
|
# @param [Array<String>] files a list of file names to upload
|
11
11
|
# @param [Logger] logger the logger to use
|
12
12
|
# @param [Faraday::Connection] connection
|
13
|
-
# @param [
|
14
|
-
def initialize(files:,
|
13
|
+
# @param [Request] metadata information about the object
|
14
|
+
def initialize(files:, metadata:, logger:, connection:)
|
15
15
|
@files = files
|
16
|
-
@
|
16
|
+
@metadata = metadata
|
17
17
|
@logger = logger
|
18
18
|
@connection = connection
|
19
19
|
end
|
@@ -28,14 +28,14 @@ module SdrClient
|
|
28
28
|
|
29
29
|
private
|
30
30
|
|
31
|
-
attr_reader :files, :
|
31
|
+
attr_reader :files, :metadata, :logger, :connection
|
32
32
|
|
33
33
|
def collect_file_metadata
|
34
34
|
files.each_with_object({}) do |path, obj|
|
35
35
|
file_name = ::File.basename(path)
|
36
36
|
obj[path] = Files::DirectUploadRequest.from_file(path,
|
37
37
|
file_name: file_name,
|
38
|
-
content_type:
|
38
|
+
content_type: metadata.for(file_name)[:mime_type])
|
39
39
|
end
|
40
40
|
end
|
41
41
|
|
@@ -77,11 +77,6 @@ module SdrClient
|
|
77
77
|
|
78
78
|
raise "unexpected response: #{upload_response.inspect}" unless upload_response.status == 204
|
79
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
80
|
end
|
86
81
|
end
|
87
82
|
end
|
data/lib/sdr_client/version.rb
CHANGED
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
|
+
version: 0.9.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-02-
|
11
|
+
date: 2020-02-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: dry-monads
|