sdr-client 0.2.1 → 0.3.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/lib/sdr_client.rb +3 -1
- data/lib/sdr_client/cli.rb +2 -1
- data/lib/sdr_client/credentials.rb +1 -1
- data/lib/sdr_client/deposit.rb +2 -0
- data/lib/sdr_client/deposit/file.rb +33 -0
- data/lib/sdr_client/deposit/file_set.rb +31 -0
- data/lib/sdr_client/deposit/files/direct_upload_request.rb +2 -2
- data/lib/sdr_client/deposit/process.rb +2 -2
- data/lib/sdr_client/deposit/request.rb +14 -21
- data/lib/sdr_client/login.rb +7 -4
- data/lib/sdr_client/version.rb +1 -1
- data/sdr-client.gemspec +1 -0
- metadata +18 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 80a6d11a266d546eb1e0763b99b13b18d9f64c558ef21db50f3f509623a4f4bf
|
|
4
|
+
data.tar.gz: 5ec2344617583af3322f0426e39328aee355ee4c12d7338d8734f529110e8da6
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 3a145ef20a1c42abaed33ab79746778844e922b530a6c48d1b7f6d6f50a0e5a2c3f23e15a804fc5b75b3baeaac6baa4e67b35391965b5bb5da34892b345c9805
|
|
7
|
+
data.tar.gz: 2600c209c4f35f2ab7a8d7209189c690ec8f06de819666fd7bdd38f63290b997aa87355d54c7a5b5b2e4633ecfd02f75e908815923c2f44116373a999789bf68
|
data/lib/sdr_client.rb
CHANGED
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
require 'dry/monads'
|
|
4
|
+
require 'faraday'
|
|
5
|
+
|
|
3
6
|
require 'sdr_client/version'
|
|
4
7
|
require 'sdr_client/deposit'
|
|
5
8
|
require 'sdr_client/credentials'
|
|
6
9
|
require 'sdr_client/login'
|
|
7
10
|
require 'sdr_client/login_prompt'
|
|
8
11
|
require 'sdr_client/cli'
|
|
9
|
-
require 'faraday'
|
|
10
12
|
|
|
11
13
|
module SdrClient
|
|
12
14
|
class Error < StandardError; end
|
data/lib/sdr_client/cli.rb
CHANGED
|
@@ -14,7 +14,7 @@ module SdrClient
|
|
|
14
14
|
end
|
|
15
15
|
|
|
16
16
|
def self.read
|
|
17
|
-
return IO.readlines(credentials_file, chomp: true).first if File.exist?(credentials_file)
|
|
17
|
+
return IO.readlines(credentials_file, chomp: true).first if ::File.exist?(credentials_file)
|
|
18
18
|
|
|
19
19
|
puts 'Log in first'
|
|
20
20
|
exit(1)
|
data/lib/sdr_client/deposit.rb
CHANGED
|
@@ -25,5 +25,7 @@ end
|
|
|
25
25
|
require 'json'
|
|
26
26
|
require 'sdr_client/deposit/files/direct_upload_request'
|
|
27
27
|
require 'sdr_client/deposit/files/direct_upload_response'
|
|
28
|
+
require 'sdr_client/deposit/file'
|
|
29
|
+
require 'sdr_client/deposit/file_set'
|
|
28
30
|
require 'sdr_client/deposit/request'
|
|
29
31
|
require 'sdr_client/deposit/process'
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module SdrClient
|
|
4
|
+
module Deposit
|
|
5
|
+
# This represents the File metadata that we send to the server for doing a deposit
|
|
6
|
+
class File
|
|
7
|
+
def initialize(external_identifier:, label:, filename:, access: 'dark', preserve: false, shelve: false)
|
|
8
|
+
@external_identifier = external_identifier
|
|
9
|
+
@label = label
|
|
10
|
+
@filename = filename
|
|
11
|
+
@access = access
|
|
12
|
+
@preserve = preserve
|
|
13
|
+
@shelve = shelve
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def as_json
|
|
17
|
+
{
|
|
18
|
+
"type": 'http://cocina.sul.stanford.edu/models/file.jsonld',
|
|
19
|
+
label: @label,
|
|
20
|
+
filename: @filename,
|
|
21
|
+
externalIdentifier: @external_identifier,
|
|
22
|
+
access: {
|
|
23
|
+
access: @access
|
|
24
|
+
},
|
|
25
|
+
administrative: {
|
|
26
|
+
sdrPreserve: @preserve,
|
|
27
|
+
shelve: @shelve
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module SdrClient
|
|
4
|
+
module Deposit
|
|
5
|
+
# This represents the FileSet metadata that we send to the server for doing a deposit
|
|
6
|
+
class FileSet
|
|
7
|
+
def initialize(uploads: [], files: [])
|
|
8
|
+
@files = if !uploads.empty?
|
|
9
|
+
uploads.map do |upload|
|
|
10
|
+
File.new(external_identifier: upload.signed_id, label: upload.filename, filename: upload.filename)
|
|
11
|
+
end
|
|
12
|
+
else
|
|
13
|
+
files
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def as_json
|
|
18
|
+
{
|
|
19
|
+
"type": 'http://cocina.sul.stanford.edu/models/fileset.jsonld',
|
|
20
|
+
structural: {
|
|
21
|
+
hasMember: files.map(&:as_json)
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
private
|
|
27
|
+
|
|
28
|
+
attr_reader :files
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -9,9 +9,9 @@ module SdrClient
|
|
|
9
9
|
def self.from_file(filename)
|
|
10
10
|
checksum = Digest::MD5.file(filename).base64digest
|
|
11
11
|
new(checksum: checksum,
|
|
12
|
-
byte_size: File.size(filename),
|
|
12
|
+
byte_size: ::File.size(filename),
|
|
13
13
|
content_type: 'text/html',
|
|
14
|
-
filename: File.basename(filename))
|
|
14
|
+
filename: ::File.basename(filename))
|
|
15
15
|
end
|
|
16
16
|
|
|
17
17
|
def as_json
|
|
@@ -37,7 +37,7 @@ module SdrClient
|
|
|
37
37
|
def check_files_exist
|
|
38
38
|
logger.info('checking to see if files exist')
|
|
39
39
|
files.each do |file_name|
|
|
40
|
-
raise Errno::ENOENT, file_name unless File.exist?(file_name)
|
|
40
|
+
raise Errno::ENOENT, file_name unless ::File.exist?(file_name)
|
|
41
41
|
end
|
|
42
42
|
end
|
|
43
43
|
|
|
@@ -78,7 +78,7 @@ module SdrClient
|
|
|
78
78
|
logger.info("Uploading `#{filename}' to #{url}")
|
|
79
79
|
|
|
80
80
|
upload_response = connection.put(url) do |req|
|
|
81
|
-
req.body = File.open(filename)
|
|
81
|
+
req.body = ::File.open(filename)
|
|
82
82
|
req.headers['Content-Type'] = content_type
|
|
83
83
|
req.headers['Content-Length'] = content_length.to_s
|
|
84
84
|
end
|
|
@@ -6,21 +6,21 @@ module SdrClient
|
|
|
6
6
|
class Request
|
|
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
|
-
# @param [Array<
|
|
9
|
+
# @param [Array<FileSet>] file_sets the file sets to attach.
|
|
10
10
|
def initialize(label: nil,
|
|
11
11
|
apo:,
|
|
12
12
|
collection:,
|
|
13
13
|
source_id:,
|
|
14
14
|
catkey: nil,
|
|
15
15
|
type: 'http://cocina.sul.stanford.edu/models/object.jsonld',
|
|
16
|
-
|
|
16
|
+
file_sets: [])
|
|
17
17
|
@label = label
|
|
18
18
|
@type = type
|
|
19
19
|
@source_id = source_id
|
|
20
20
|
@collection = collection
|
|
21
21
|
@catkey = catkey
|
|
22
22
|
@apo = apo
|
|
23
|
-
@
|
|
23
|
+
@file_sets = file_sets
|
|
24
24
|
end
|
|
25
25
|
|
|
26
26
|
def as_json
|
|
@@ -35,20 +35,28 @@ module SdrClient
|
|
|
35
35
|
end
|
|
36
36
|
end
|
|
37
37
|
|
|
38
|
+
# @param [Array<SdrClient::Deposit::Files::DirectUploadResponse>] uploads the uploaded files to attach.
|
|
38
39
|
# @return [Request] a clone of this request with the uploads added
|
|
39
40
|
def with_uploads(uploads)
|
|
41
|
+
file_sets = uploads.map { |upload| FileSet.new(uploads: [upload]) }
|
|
42
|
+
|
|
40
43
|
Request.new(label: label,
|
|
41
44
|
apo: apo,
|
|
42
45
|
collection: collection,
|
|
43
46
|
source_id: source_id,
|
|
44
47
|
catkey: catkey,
|
|
45
48
|
type: type,
|
|
46
|
-
|
|
49
|
+
file_sets: file_sets)
|
|
47
50
|
end
|
|
48
51
|
|
|
52
|
+
# In this case there is a 1-1 mapping between Files and FileSets,
|
|
53
|
+
# but this doesn't always have to be the case. We could change this in the
|
|
54
|
+
# future so that we have one FileSet that has an Image and its OCR file.
|
|
55
|
+
def add_uploads_each_as_resource(uploads); end
|
|
56
|
+
|
|
49
57
|
private
|
|
50
58
|
|
|
51
|
-
attr_reader :label, :
|
|
59
|
+
attr_reader :label, :file_sets, :source_id, :catkey, :apo, :collection, :type
|
|
52
60
|
|
|
53
61
|
def administrative
|
|
54
62
|
{
|
|
@@ -65,24 +73,9 @@ module SdrClient
|
|
|
65
73
|
def structural
|
|
66
74
|
{
|
|
67
75
|
isMemberOf: collection,
|
|
68
|
-
hasMember:
|
|
76
|
+
hasMember: file_sets.map(&:as_json)
|
|
69
77
|
}
|
|
70
78
|
end
|
|
71
|
-
|
|
72
|
-
# In this case there is a 1-1 mapping between Files and FileSets,
|
|
73
|
-
# but this doesn't always have to be the case. We could change this in the
|
|
74
|
-
# future so that we have one FileSet that has an Image and its OCR file.
|
|
75
|
-
def file_sets_as_json
|
|
76
|
-
uploads.map do |upload|
|
|
77
|
-
{
|
|
78
|
-
"type": 'http://cocina.sul.stanford.edu/models/fileset.jsonld',
|
|
79
|
-
label: upload.filename,
|
|
80
|
-
structural: {
|
|
81
|
-
hasMember: [upload.signed_id]
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
end
|
|
85
|
-
end
|
|
86
79
|
end
|
|
87
80
|
end
|
|
88
81
|
end
|
data/lib/sdr_client/login.rb
CHANGED
|
@@ -4,19 +4,22 @@ module SdrClient
|
|
|
4
4
|
# The namespace for the "login" command
|
|
5
5
|
module Login
|
|
6
6
|
LOGIN_PATH = '/v1/auth/login'
|
|
7
|
+
extend Dry::Monads[:result]
|
|
8
|
+
|
|
9
|
+
# @return [Result] the status of the call
|
|
7
10
|
def self.run(url:, login_service: LoginPrompt)
|
|
8
11
|
request_json = JSON.generate(login_service.run)
|
|
9
12
|
response = Faraday.post(url + LOGIN_PATH, request_json, 'Content-Type' => 'application/json')
|
|
10
13
|
case response.status
|
|
11
14
|
when 200
|
|
12
15
|
Credentials.write(response.body)
|
|
16
|
+
Success()
|
|
13
17
|
when 400
|
|
14
|
-
|
|
18
|
+
Failure('Email address is not a valid email')
|
|
15
19
|
when 401
|
|
16
|
-
|
|
20
|
+
Failure('Invalid username or password')
|
|
17
21
|
else
|
|
18
|
-
|
|
19
|
-
puts response.body
|
|
22
|
+
Failure("Status: #{response.status}\n#{response.body}")
|
|
20
23
|
end
|
|
21
24
|
end
|
|
22
25
|
end
|
data/lib/sdr_client/version.rb
CHANGED
data/sdr-client.gemspec
CHANGED
|
@@ -27,6 +27,7 @@ Gem::Specification.new do |spec|
|
|
|
27
27
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
|
28
28
|
spec.require_paths = ['lib']
|
|
29
29
|
|
|
30
|
+
spec.add_dependency 'dry-monads'
|
|
30
31
|
spec.add_dependency 'faraday', '>= 0.16'
|
|
31
32
|
|
|
32
33
|
spec.add_development_dependency 'bundler', '~> 2.0'
|
metadata
CHANGED
|
@@ -1,15 +1,29 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: sdr-client
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.3.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-
|
|
11
|
+
date: 2020-01-23 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: dry-monads
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
17
|
+
- - ">="
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: '0'
|
|
20
|
+
type: :runtime
|
|
21
|
+
prerelease: false
|
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
+
requirements:
|
|
24
|
+
- - ">="
|
|
25
|
+
- !ruby/object:Gem::Version
|
|
26
|
+
version: '0'
|
|
13
27
|
- !ruby/object:Gem::Dependency
|
|
14
28
|
name: faraday
|
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -148,6 +162,8 @@ files:
|
|
|
148
162
|
- lib/sdr_client/cli.rb
|
|
149
163
|
- lib/sdr_client/credentials.rb
|
|
150
164
|
- lib/sdr_client/deposit.rb
|
|
165
|
+
- lib/sdr_client/deposit/file.rb
|
|
166
|
+
- lib/sdr_client/deposit/file_set.rb
|
|
151
167
|
- lib/sdr_client/deposit/files/direct_upload_request.rb
|
|
152
168
|
- lib/sdr_client/deposit/files/direct_upload_response.rb
|
|
153
169
|
- lib/sdr_client/deposit/process.rb
|