sdr-client 0.1.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 97ae47ce6b50c4fd12228990d25dc3fb63432ba1a1e0fff9a1e614dece546c69
4
- data.tar.gz: f64a044b2373cda941ec7fe593d2eacc1602a6178963cf80c0637415ecded9f4
3
+ metadata.gz: b1d76c1422877b6b5f25f0a1cb46641e32771496771576f8f7c8fd2697c14b0e
4
+ data.tar.gz: eb116e73a114a3966254a0996c5d843fc960e1454146214ca68fae11eff89bda
5
5
  SHA512:
6
- metadata.gz: c573233fcff72bb1c1402d170d048b03182ac7dd45c81a7531dd02529869f2354c9d73bd8522cbb1ba463c52bb933cf692a67e3b7932c77f3746bf2276253913
7
- data.tar.gz: '0848314bb1fd0b02ca2add9e09c92185fbcf8d9db642d683fcb116dae2cbd7ca6df97d5e9e3464f4b2ab71fa1027eda3d67d07723b50bf3ffc6f08274590f649'
6
+ metadata.gz: acf219c807f4f22f87437f779cf4d3ab2bb8091bc810a616146a302a9e2bab4b5be99685c91ea072056344a59b5b0f37e9ed5008105d836078d1b70032720c75
7
+ data.tar.gz: b6ec07336e2014a6fbf02470c08649c426384a51c40ee32a164f29c96ab75cd2057615ee5ee8081f7a70f406f794fed6c100fb93aba7848d629e8933fa91f589
@@ -1,22 +1,21 @@
1
1
  # This configuration was generated by
2
2
  # `rubocop --auto-gen-config`
3
- # on 2020-01-07 23:33:21 -0800 using RuboCop version 0.79.0.
3
+ # on 2020-01-10 17:16:01 -0600 using RuboCop version 0.79.0.
4
4
  # The point is for the user to remove these configuration records
5
5
  # one by one as the offenses are removed from the code base.
6
6
  # Note that changes in the inspected code, or installation of new
7
7
  # versions of RuboCop, may require this file to be generated again.
8
8
 
9
9
  # Offense count: 1
10
- # Cop supports --auto-correct.
11
- # Configuration parameters: AllowForAlignment, AllowBeforeTrailingComments, ForceEqualSignAlignment.
12
- Layout/ExtraSpacing:
13
- Exclude:
14
- - 'sdr-client.gemspec'
10
+ Metrics/AbcSize:
11
+ Max: 16
15
12
 
16
13
  # Offense count: 1
17
- # Cop supports --auto-correct.
18
- # Configuration parameters: AllowForAlignment, EnforcedStyleForExponentOperator.
19
- # SupportedStylesForExponentOperator: space, no_space
20
- Layout/SpaceAroundOperators:
21
- Exclude:
22
- - 'sdr-client.gemspec'
14
+ # Configuration parameters: CountComments, ExcludedMethods.
15
+ Metrics/MethodLength:
16
+ Max: 13
17
+
18
+ # Offense count: 2
19
+ # Configuration parameters: CountKeywordArgs.
20
+ Metrics/ParameterLists:
21
+ Max: 8
@@ -13,5 +13,8 @@ before_script:
13
13
  after_script:
14
14
  - ./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT
15
15
 
16
+ env:
17
+ global:
18
+ - CC_TEST_REPORTER_ID=859fcfe88b00c026d15dce30e838e2299face8088b49fe62bc3a02d1507ce3d5
16
19
  notifications:
17
20
  email: false
data/README.md CHANGED
@@ -8,9 +8,22 @@
8
8
  This is a CLI for interacting with the Stanford Digital Repository API.
9
9
  The code for the SDR API server is at https://github.com/sul-dlss/sdr-api
10
10
 
11
+ ## Install
12
+
13
+ `gem install sdr-client`
14
+
11
15
  ## Usage
12
16
 
17
+ Log in:
18
+ ```
19
+ sdr --service-url http://sdr-api-server:3000 login
20
+ ```
21
+
22
+
13
23
  Deposit a new object:
14
24
  ```
15
- sdr --service-url http://sdr-api-server:3000 deposit --label 'hey there' file1.png file2.png
25
+ sdr --service-url https://sdr-api-server:3000 deposit --label 'hey there' \
26
+ --admin-policy 'druid:bk123gh4567' \
27
+ --collection 'druid:gh456kw9876' \
28
+ --source-id 'googlebooks:stanford_12345' file1.png file2.png
16
29
  ```
data/exe/sdr CHANGED
@@ -10,7 +10,28 @@ global = OptionParser.new do |opts|
10
10
  options[:url] = url
11
11
  end
12
12
  opts.on('-h', '--help', 'Display this screen') do
13
- puts opts
13
+ puts <<~HELP
14
+ DESCRIPTION:
15
+ The SDR Command Line Interface is a tool to interact with the Stanford Digital Repository.
16
+
17
+ SYNOPSIS:
18
+ sdr [options] <command>
19
+
20
+ OPTIONS:
21
+ --service-url (string)
22
+ Override the command's default URL with the given URL.
23
+
24
+ -h, --help
25
+ Displays this screen
26
+
27
+ COMMANDS
28
+ deposit
29
+ deposit files to the SDR
30
+
31
+ login
32
+ Will prompt for email & password and exchange it for an login token, which it saves in ~/.sdr/token
33
+
34
+ HELP
14
35
  exit
15
36
  end
16
37
  end
@@ -23,11 +44,28 @@ subcommands = {
23
44
  opts.on('--label LABEL', 'The object label') do |label|
24
45
  options[:label] = label
25
46
  end
47
+
48
+ opts.on('--admin-policy ADMIN_POLICY', 'The druid identifier of the admin policy object') do |apo|
49
+ options[:apo] = apo
50
+ end
51
+ opts.on('--collection COLLECTION', 'The druid identifier of the collection object') do |collection|
52
+ options[:collection] = collection
53
+ end
54
+
55
+ opts.on('--catkey CATKEY', 'The catkey for this item') do |catkey|
56
+ options[:catkey] = catkey
57
+ end
58
+
59
+ opts.on('--source-id SOURCE_ID', 'The source id for this object') do |source_id|
60
+ options[:source_id] = source_id
61
+ end
62
+
26
63
  opts.on('-h', '--help', 'Display this screen') do
27
64
  puts opts
28
65
  exit
29
66
  end
30
- end
67
+ end,
68
+ 'login' => OptionParser.new
31
69
  }
32
70
 
33
71
  unless subcommands.key?(command)
@@ -1,9 +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'
8
+ require 'sdr_client/credentials'
9
+ require 'sdr_client/login'
10
+ require 'sdr_client/login_prompt'
5
11
  require 'sdr_client/cli'
6
- require 'faraday'
7
12
 
8
13
  module SdrClient
9
14
  class Error < StandardError; end
@@ -7,6 +7,11 @@ module SdrClient
7
7
  case command
8
8
  when 'deposit'
9
9
  SdrClient::Deposit.run(options)
10
+ when 'login'
11
+ status = SdrClient::Login.run(options)
12
+ puts status.value if status.failure?
13
+ else
14
+ raise "Unknown command #{command}"
10
15
  end
11
16
  end
12
17
  end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SdrClient
4
+ # The stored credentials
5
+ class Credentials
6
+ # @param [String] a json string that contains a field 'token'
7
+ def self.write(body)
8
+ json = JSON.parse(body)
9
+ Dir.mkdir(credentials_path, 0o700) unless Dir.exist?(credentials_path)
10
+ File.open(credentials_file, 'w', 0o600) do |file|
11
+ file.write(json.fetch('token'))
12
+ end
13
+ puts 'Signed in.'
14
+ end
15
+
16
+ def self.read
17
+ return IO.readlines(credentials_file, chomp: true).first if ::File.exist?(credentials_file)
18
+
19
+ puts 'Log in first'
20
+ exit(1)
21
+ end
22
+
23
+ def self.credentials_path
24
+ @credentials_path ||= File.join(Dir.home, '.sdr')
25
+ end
26
+
27
+ def self.credentials_file
28
+ File.join(credentials_path, 'credentials')
29
+ end
30
+ end
31
+ end
@@ -3,15 +3,30 @@
3
3
  module SdrClient
4
4
  # The namespace for the "deposit" command
5
5
  module Deposit
6
- def self.run(label:,
6
+ def self.run(label: nil,
7
7
  type: 'http://cocina.sul.stanford.edu/models/book.jsonld',
8
+ apo:,
9
+ collection:,
10
+ catkey: nil,
11
+ source_id:,
8
12
  url:, files: [])
9
- Process.new(label: label, type: type, url: url, files: files).run
13
+ token = Credentials.read
14
+
15
+ metadata = Request.new(label: label,
16
+ type: type,
17
+ apo: apo,
18
+ collection: collection,
19
+ source_id: source_id,
20
+ catkey: catkey)
21
+ Process.new(metadata: metadata, url: url, token: token, files: files).run
10
22
  end
11
23
  end
12
24
  end
13
25
  require 'json'
26
+ require 'sdr_client/deposit/default_file_set_builder'
14
27
  require 'sdr_client/deposit/files/direct_upload_request'
15
28
  require 'sdr_client/deposit/files/direct_upload_response'
29
+ require 'sdr_client/deposit/file'
30
+ require 'sdr_client/deposit/file_set'
16
31
  require 'sdr_client/deposit/request'
17
32
  require 'sdr_client/deposit/process'
@@ -0,0 +1,18 @@
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
@@ -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,33 @@
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: [], label:)
8
+ @label = label
9
+ @files = if !uploads.empty?
10
+ uploads.map do |upload|
11
+ File.new(external_identifier: upload.signed_id, label: upload.filename, filename: upload.filename)
12
+ end
13
+ else
14
+ files
15
+ end
16
+ end
17
+
18
+ def as_json
19
+ {
20
+ "type": 'http://cocina.sul.stanford.edu/models/fileset.jsonld',
21
+ "label": label,
22
+ structural: {
23
+ hasMember: files.map(&:as_json)
24
+ }
25
+ }
26
+ end
27
+
28
+ private
29
+
30
+ attr_reader :files, :label
31
+ end
32
+ end
33
+ 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
@@ -6,14 +6,22 @@ module SdrClient
6
6
  module Deposit
7
7
  # The process for doing a deposit
8
8
  class Process
9
- BLOB_PATH = '/rails/active_storage/direct_uploads'
9
+ BLOB_PATH = '/v1/direct_uploads'
10
10
  DRO_PATH = '/v1/resources'
11
- def initialize(label:, type:, url:, files: [], logger: Logger.new(STDOUT))
12
- @label = label
13
- @type = type
11
+ # @param [Request] metadata information about the object
12
+ # @param [#build] file_set_builder a strategy for constructing FileSets
13
+ # @param [String] url the server to send to
14
+ # @param [String] token the bearer auth token for the server
15
+ # @param [Array<String>] files a list of file names to upload
16
+ # @param [Logger] logger the logger to use
17
+ def initialize(metadata:, file_set_builder: DefaultFileSetBuilder, url:,
18
+ token:, files: [], logger: Logger.new(STDOUT))
14
19
  @files = files
15
20
  @url = url
21
+ @token = token
22
+ @metadata = metadata
16
23
  @logger = logger
24
+ @file_set_builder = file_set_builder
17
25
  end
18
26
 
19
27
  def run
@@ -21,20 +29,18 @@ module SdrClient
21
29
  file_metadata = collect_file_metadata
22
30
  upload_responses = upload_file_metadata(file_metadata)
23
31
  upload_files(upload_responses)
24
- metadata = Request.new(label: label,
25
- type: type,
26
- uploads: upload_responses.values)
27
- upload_metadata(metadata.as_json)
32
+ request = file_set_builder.run(request: metadata, uploads: upload_responses.values)
33
+ upload_metadata(request.as_json)
28
34
  end
29
35
 
30
36
  private
31
37
 
32
- attr_reader :label, :type, :files, :url, :logger
38
+ attr_reader :metadata, :files, :url, :token, :logger, :file_set_builder
33
39
 
34
40
  def check_files_exist
35
41
  logger.info('checking to see if files exist')
36
42
  files.each do |file_name|
37
- raise Errno::ENOENT, file_name unless File.exist?(file_name)
43
+ raise Errno::ENOENT, file_name unless ::File.exist?(file_name)
38
44
  end
39
45
  end
40
46
 
@@ -51,7 +57,7 @@ module SdrClient
51
57
 
52
58
  def direct_upload(metadata_json)
53
59
  logger.info("Starting an upload request: #{metadata_json}")
54
- response = Faraday.post(url + BLOB_PATH, metadata_json, 'Content-Type' => 'application/json')
60
+ response = connection.post(BLOB_PATH, metadata_json, 'Content-Type' => 'application/json')
55
61
  raise "unexpected response: #{response.inspect}" unless response.status == 200
56
62
 
57
63
  logger.info("Response from server: #{response.body}")
@@ -73,11 +79,9 @@ module SdrClient
73
79
 
74
80
  def upload_file(filename:, url:, content_type:, content_length:)
75
81
  logger.info("Uploading `#{filename}' to #{url}")
76
- conn = Faraday.new(url) do |builder|
77
- builder.adapter :net_http
78
- end
79
- upload_response = conn.put(url) do |req|
80
- req.body = File.open(filename)
82
+
83
+ upload_response = connection.put(url) do |req|
84
+ req.body = ::File.open(filename)
81
85
  req.headers['Content-Type'] = content_type
82
86
  req.headers['Content-Length'] = content_length.to_s
83
87
  end
@@ -85,15 +89,30 @@ module SdrClient
85
89
  raise "unexpected response: #{upload_response.inspect}" unless upload_response.status == 204
86
90
  end
87
91
 
92
+ # @return [Hash<Symbol,String>] the result of the metadata call
88
93
  def upload_metadata(metadata)
89
94
  logger.info("Starting upload metadata: #{metadata}")
90
95
  request_json = JSON.generate(metadata)
91
- response = Faraday.post(url + DRO_PATH, request_json, 'Content-Type' => 'application/json')
92
- raise "unexpected response: #{response.inspect}" unless response.status == 200
96
+ response = connection.post(DRO_PATH, request_json, 'Content-Type' => 'application/json')
97
+ unexpected_response(response) unless response.status == 201
93
98
 
94
99
  logger.info("Response from server: #{response.body}")
95
100
 
96
- JSON.parse(response.body)
101
+ { druid: JSON.parse(response.body)['druid'], background_job: response.headers['Location'] }
102
+ end
103
+
104
+ def unexpected_response(response)
105
+ raise "unexpected response: #{response.inspect}" unless response.status == 400
106
+
107
+ puts "\nThere was an error with your request: #{response.body}"
108
+ exit(1)
109
+ end
110
+
111
+ def connection
112
+ @connection ||= Faraday.new(url: url) do |conn|
113
+ conn.authorization :Bearer, token
114
+ conn.adapter :net_http
115
+ end
97
116
  end
98
117
  end
99
118
  end
@@ -4,49 +4,70 @@ module SdrClient
4
4
  module Deposit
5
5
  # This represents the metadata that we send to the server for doing a deposit
6
6
  class Request
7
- CONTEXT = 'http://cocina.sul.stanford.edu/contexts/cocina-base.jsonld'
8
-
9
7
  # @param [String] label the required object label
10
8
  # @param [String] type (http://cocina.sul.stanford.edu/models/object.jsonld) the required object type.
11
- # @param [Array<SdrClient::Deposit::Files::DirectUploadResponse>] uploads the uploaded files to attach.
12
- def initialize(label:,
9
+ # @param [Array<FileSet>] file_sets the file sets to attach.
10
+ def initialize(label: nil,
11
+ apo:,
12
+ collection:,
13
+ source_id:,
14
+ catkey: nil,
13
15
  type: 'http://cocina.sul.stanford.edu/models/object.jsonld',
14
- uploads: [])
16
+ file_sets: [])
15
17
  @label = label
16
18
  @type = type
17
- @uploads = uploads
19
+ @source_id = source_id
20
+ @collection = collection
21
+ @catkey = catkey
22
+ @apo = apo
23
+ @file_sets = file_sets
18
24
  end
19
25
 
20
26
  def as_json
21
27
  {
22
- "@context": CONTEXT,
23
- "@type": type,
24
- label: label,
25
- structural: {
26
- hasMember: file_sets_as_json
27
- }
28
- }
28
+ access: {},
29
+ type: type,
30
+ administrative: administrative,
31
+ identification: identification,
32
+ structural: structural
33
+ }.tap do |json|
34
+ json[:label] = label if label
35
+ end
36
+ end
37
+
38
+ # @return [Request] a clone of this request with the file_sets added
39
+ def with_file_sets(file_sets)
40
+ Request.new(label: label,
41
+ apo: apo,
42
+ collection: collection,
43
+ source_id: source_id,
44
+ catkey: catkey,
45
+ type: type,
46
+ file_sets: file_sets)
29
47
  end
30
48
 
31
49
  private
32
50
 
33
- attr_reader :label, :uploads, :type
34
-
35
- # In this case there is a 1-1 mapping between Files and FileSets,
36
- # but this doesn't always have to be the case. We could change this in the
37
- # future so that we have one FileSet that has an Image and its OCR file.
38
- def file_sets_as_json
39
- uploads.map do |upload|
40
- {
41
- "@context": CONTEXT,
42
- "@type": 'http://cocina.sul.stanford.edu/models/fileset.jsonld',
43
- label: upload.filename,
44
- structural: {
45
- hasMember: [upload.signed_id]
46
- }
47
- }
51
+ attr_reader :label, :file_sets, :source_id, :catkey, :apo, :collection, :type
52
+
53
+ def administrative
54
+ {
55
+ hasAdminPolicy: apo
56
+ }
57
+ end
58
+
59
+ def identification
60
+ { sourceId: source_id }.tap do |json|
61
+ json[:catkey] = catkey if catkey
48
62
  end
49
63
  end
64
+
65
+ def structural
66
+ {
67
+ isMemberOf: collection,
68
+ hasMember: file_sets.map(&:as_json)
69
+ }
70
+ end
50
71
  end
51
72
  end
52
73
  end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SdrClient
4
+ # The namespace for the "login" command
5
+ module Login
6
+ LOGIN_PATH = '/v1/auth/login'
7
+ extend Dry::Monads[:result]
8
+
9
+ # @return [Result] the status of the call
10
+ def self.run(url:, login_service: LoginPrompt)
11
+ request_json = JSON.generate(login_service.run)
12
+ response = Faraday.post(url + LOGIN_PATH, request_json, 'Content-Type' => 'application/json')
13
+ case response.status
14
+ when 200
15
+ Credentials.write(response.body)
16
+ Success()
17
+ when 400
18
+ Failure('Email address is not a valid email')
19
+ when 401
20
+ Failure('Invalid username or password')
21
+ else
22
+ Failure("Status: #{response.status}\n#{response.body}")
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'io/console'
4
+
5
+ module SdrClient
6
+ # The namespace for the "login" command
7
+ module LoginPrompt
8
+ def self.run
9
+ print 'Email: '
10
+ email = gets
11
+ email.strip!
12
+ print 'Password: '
13
+ password = $stdin.noecho(&:gets)
14
+ password.strip!
15
+ puts
16
+ { email: email, password: password }
17
+ end
18
+ end
19
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SdrClient
4
- VERSION = '0.1.0'
4
+ VERSION = '0.4.0'
5
5
  end
@@ -27,7 +27,8 @@ 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 'faraday', '~> 0.17.0'
30
+ spec.add_dependency 'dry-monads'
31
+ spec.add_dependency 'faraday', '>= 0.16'
31
32
 
32
33
  spec.add_development_dependency 'bundler', '~> 2.0'
33
34
  spec.add_development_dependency 'rake', '~> 13.0'
metadata CHANGED
@@ -1,29 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sdr-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.4.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-09 00:00:00.000000000 Z
11
+ date: 2020-01-24 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
16
30
  requirements:
17
- - - "~>"
31
+ - - ">="
18
32
  - !ruby/object:Gem::Version
19
- version: 0.17.0
33
+ version: '0.16'
20
34
  type: :runtime
21
35
  prerelease: false
22
36
  version_requirements: !ruby/object:Gem::Requirement
23
37
  requirements:
24
- - - "~>"
38
+ - - ">="
25
39
  - !ruby/object:Gem::Version
26
- version: 0.17.0
40
+ version: '0.16'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: bundler
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -146,11 +160,17 @@ files:
146
160
  - exe/sdr
147
161
  - lib/sdr_client.rb
148
162
  - lib/sdr_client/cli.rb
163
+ - lib/sdr_client/credentials.rb
149
164
  - lib/sdr_client/deposit.rb
165
+ - lib/sdr_client/deposit/default_file_set_builder.rb
166
+ - lib/sdr_client/deposit/file.rb
167
+ - lib/sdr_client/deposit/file_set.rb
150
168
  - lib/sdr_client/deposit/files/direct_upload_request.rb
151
169
  - lib/sdr_client/deposit/files/direct_upload_response.rb
152
170
  - lib/sdr_client/deposit/process.rb
153
171
  - lib/sdr_client/deposit/request.rb
172
+ - lib/sdr_client/login.rb
173
+ - lib/sdr_client/login_prompt.rb
154
174
  - lib/sdr_client/version.rb
155
175
  - sdr-client.gemspec
156
176
  homepage: https://github.com/sul-dlss/sdr-client
@@ -174,7 +194,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
174
194
  - !ruby/object:Gem::Version
175
195
  version: '0'
176
196
  requirements: []
177
- rubygems_version: 3.0.6
197
+ rubygems_version: 3.0.3
178
198
  signing_key:
179
199
  specification_version: 4
180
200
  summary: The CLI for https://github.com/sul-dlss/sdr-api