repository-client 0.1.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 +7 -0
- data/.github/pull_request_template.md +5 -0
- data/.gitignore +14 -0
- data/.rspec +3 -0
- data/.rubocop.yml +15 -0
- data/.rubocop_todo.yml +22 -0
- data/.travis.yml +17 -0
- data/Gemfile +8 -0
- data/LICENSE +14 -0
- data/README.md +16 -0
- data/Rakefile +11 -0
- data/bin/console +15 -0
- data/bin/setup +8 -0
- data/exe/sdr +42 -0
- data/lib/repository_client.rb +11 -0
- data/lib/repository_client/cli.rb +13 -0
- data/lib/repository_client/deposit.rb +17 -0
- data/lib/repository_client/deposit/files/direct_upload_request.rb +29 -0
- data/lib/repository_client/deposit/files/direct_upload_response.rb +11 -0
- data/lib/repository_client/deposit/process.rb +100 -0
- data/lib/repository_client/deposit/request.rb +52 -0
- data/lib/repository_client/version.rb +5 -0
- data/repository-client.gemspec +39 -0
- metadata +181 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 31d238ba3b91a260a3c264166b7a255a2fed4f3677ce417a869ab6ed90337075
|
4
|
+
data.tar.gz: 1e137b46b387cb03441105c76c208aa03ca990bbdeca733af1b818c869ff976f
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: ddbdfb49476f0fe282d5016148298b225a052ffec82ac85add3ae78674e2c113448d32a568c480cbdc61a0ea69b418282e46a4b06191417b6549bdd661d74721
|
7
|
+
data.tar.gz: b7cd55cb9a734db1926a4efacc518c332ec133b078f94bcb8d994052361b4951053c8514cb0627a44c934eb5cf0c5d077b8285aaf5383fbad468a8da5864a890
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/.rubocop.yml
ADDED
data/.rubocop_todo.yml
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
# This configuration was generated by
|
2
|
+
# `rubocop --auto-gen-config`
|
3
|
+
# on 2020-01-07 23:33:21 -0800 using RuboCop version 0.79.0.
|
4
|
+
# The point is for the user to remove these configuration records
|
5
|
+
# one by one as the offenses are removed from the code base.
|
6
|
+
# Note that changes in the inspected code, or installation of new
|
7
|
+
# versions of RuboCop, may require this file to be generated again.
|
8
|
+
|
9
|
+
# Offense count: 1
|
10
|
+
# Cop supports --auto-correct.
|
11
|
+
# Configuration parameters: AllowForAlignment, AllowBeforeTrailingComments, ForceEqualSignAlignment.
|
12
|
+
Layout/ExtraSpacing:
|
13
|
+
Exclude:
|
14
|
+
- 'repository-client.gemspec'
|
15
|
+
|
16
|
+
# Offense count: 1
|
17
|
+
# Cop supports --auto-correct.
|
18
|
+
# Configuration parameters: AllowForAlignment, EnforcedStyleForExponentOperator.
|
19
|
+
# SupportedStylesForExponentOperator: space, no_space
|
20
|
+
Layout/SpaceAroundOperators:
|
21
|
+
Exclude:
|
22
|
+
- 'repository-client.gemspec'
|
data/.travis.yml
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
---
|
2
|
+
sudo: false
|
3
|
+
language: ruby
|
4
|
+
cache: bundler
|
5
|
+
rvm:
|
6
|
+
- 2.6.4
|
7
|
+
before_install: gem install bundler -v 2.1.2
|
8
|
+
|
9
|
+
before_script:
|
10
|
+
- curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
|
11
|
+
- chmod +x ./cc-test-reporter
|
12
|
+
- ./cc-test-reporter before-build
|
13
|
+
after_script:
|
14
|
+
- ./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT
|
15
|
+
|
16
|
+
notifications:
|
17
|
+
email: false
|
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
Copyright (c) 2020 by The Board of Trustees of the Leland Stanford
|
2
|
+
Junior University. All rights reserved.
|
3
|
+
|
4
|
+
Licensed under the Apache License, Version 2.0 (the "License"); you
|
5
|
+
may not use this file except in compliance with the License. You
|
6
|
+
may obtain a copy of the License at
|
7
|
+
|
8
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
|
10
|
+
Unless required by applicable law or agreed to in writing, software
|
11
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
13
|
+
implied. See the License for the specific language governing
|
14
|
+
permissions and limitations under the License.
|
data/README.md
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
[](https://travis-ci.org/sul-dlss/repository-client)
|
2
|
+
[](https://codeclimate.com/github/sul-dlss/repository-client/maintainability)
|
3
|
+
[](https://codeclimate.com/github/sul-dlss/repository-client/test_coverage)
|
4
|
+
(TODO: gem version badge here)
|
5
|
+
|
6
|
+
# Repository::Client
|
7
|
+
|
8
|
+
This is a CLI for interacting with the Stanford digital repository API.
|
9
|
+
The code for the repository API server is at https://github.com/sul-dlss/repository-api
|
10
|
+
|
11
|
+
## Usage
|
12
|
+
|
13
|
+
Deposit a new object:
|
14
|
+
```
|
15
|
+
sdr --service-url http://repository-api-server:3000 deposit --label 'hey there' file1.png file2.png
|
16
|
+
```
|
data/Rakefile
ADDED
data/bin/console
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require 'bundler/setup'
|
5
|
+
require 'repository/client'
|
6
|
+
|
7
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
8
|
+
# with your gem easier. You can also use a different console, if you like.
|
9
|
+
|
10
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
11
|
+
# require "pry"
|
12
|
+
# Pry.start
|
13
|
+
|
14
|
+
require 'irb'
|
15
|
+
IRB.start(__FILE__)
|
data/bin/setup
ADDED
data/exe/sdr
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
$LOAD_PATH.unshift 'lib'
|
5
|
+
require 'optparse'
|
6
|
+
|
7
|
+
options = {}
|
8
|
+
global = OptionParser.new do |opts|
|
9
|
+
opts.on('--service-url URL', 'Connect to the host at this URL') do |url|
|
10
|
+
options[:url] = url
|
11
|
+
end
|
12
|
+
opts.on('-h', '--help', 'Display this screen') do
|
13
|
+
puts opts
|
14
|
+
exit
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
global.order!
|
19
|
+
command = ARGV.shift
|
20
|
+
|
21
|
+
subcommands = {
|
22
|
+
'deposit' => OptionParser.new do |opts|
|
23
|
+
opts.on('--label LABEL', 'The object label') do |label|
|
24
|
+
options[:label] = label
|
25
|
+
end
|
26
|
+
opts.on('-h', '--help', 'Display this screen') do
|
27
|
+
puts opts
|
28
|
+
exit
|
29
|
+
end
|
30
|
+
end
|
31
|
+
}
|
32
|
+
|
33
|
+
unless subcommands.key?(command)
|
34
|
+
puts "unknown command '#{command}'"
|
35
|
+
exit
|
36
|
+
end
|
37
|
+
|
38
|
+
subcommands[command].order!
|
39
|
+
|
40
|
+
require 'repository_client'
|
41
|
+
options[:files] = ARGV unless ARGV.empty?
|
42
|
+
RepositoryClient::CLI.start(command, options)
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'repository_client/version'
|
4
|
+
require 'repository_client/deposit'
|
5
|
+
require 'repository_client/cli'
|
6
|
+
require 'faraday'
|
7
|
+
|
8
|
+
module RepositoryClient
|
9
|
+
class Error < StandardError; end
|
10
|
+
# Your code goes here...
|
11
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RepositoryClient
|
4
|
+
# The namespace for the "deposit" command
|
5
|
+
module Deposit
|
6
|
+
def self.run(label:,
|
7
|
+
type: 'http://cocina.sul.stanford.edu/models/book.jsonld',
|
8
|
+
url:, files: [])
|
9
|
+
Process.new(label: label, type: type, url: url, files: files).run
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
require 'json'
|
14
|
+
require 'repository_client/deposit/files/direct_upload_request'
|
15
|
+
require 'repository_client/deposit/files/direct_upload_response'
|
16
|
+
require 'repository_client/deposit/request'
|
17
|
+
require 'repository_client/deposit/process'
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'digest'
|
4
|
+
|
5
|
+
module RepositoryClient
|
6
|
+
module Deposit
|
7
|
+
module Files
|
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
|
11
|
+
new(checksum: checksum,
|
12
|
+
byte_size: File.size(filename),
|
13
|
+
content_type: 'text/html',
|
14
|
+
filename: File.basename(filename))
|
15
|
+
end
|
16
|
+
|
17
|
+
def as_json
|
18
|
+
{
|
19
|
+
blob: { filename: filename, byte_size: byte_size, checksum: checksum, content_type: content_type }
|
20
|
+
}
|
21
|
+
end
|
22
|
+
|
23
|
+
def to_json(*_args)
|
24
|
+
JSON.generate(as_json)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RepositoryClient
|
4
|
+
module Deposit
|
5
|
+
module Files
|
6
|
+
DirectUploadResponse = Struct.new(:id, :key, :checksum, :byte_size, :content_type,
|
7
|
+
:filename, :metadata, :created_at, :direct_upload,
|
8
|
+
:signed_id, keyword_init: true)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,100 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'logger'
|
4
|
+
|
5
|
+
module RepositoryClient
|
6
|
+
module Deposit
|
7
|
+
# The process for doing a deposit
|
8
|
+
class Process
|
9
|
+
BLOB_PATH = '/rails/active_storage/direct_uploads'
|
10
|
+
DRO_PATH = '/v1/resources'
|
11
|
+
def initialize(label:, type:, url:, files: [], logger: Logger.new(STDOUT))
|
12
|
+
@label = label
|
13
|
+
@type = type
|
14
|
+
@files = files
|
15
|
+
@url = url
|
16
|
+
@logger = logger
|
17
|
+
end
|
18
|
+
|
19
|
+
def run
|
20
|
+
check_files_exist
|
21
|
+
file_metadata = collect_file_metadata
|
22
|
+
upload_responses = upload_file_metadata(file_metadata)
|
23
|
+
upload_files(upload_responses)
|
24
|
+
metadata = Request.new(label: label,
|
25
|
+
type: type,
|
26
|
+
uploads: upload_responses.values)
|
27
|
+
upload_metadata(metadata.as_json)
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
attr_reader :label, :type, :files, :url, :logger
|
33
|
+
|
34
|
+
def check_files_exist
|
35
|
+
logger.info('checking to see if files exist')
|
36
|
+
files.each do |file_name|
|
37
|
+
raise Errno::ENOENT, file_name unless File.exist?(file_name)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def collect_file_metadata
|
42
|
+
files.each_with_object({}) do |filename, obj|
|
43
|
+
obj[filename] = Files::DirectUploadRequest.from_file(filename)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
# @param [Hash<String,Files::DirectUploadRequest>] file_metadata the filenames and their upload request
|
48
|
+
def upload_file_metadata(file_metadata)
|
49
|
+
Hash[file_metadata.map { |filename, metadata| [filename, direct_upload(metadata.to_json)] }]
|
50
|
+
end
|
51
|
+
|
52
|
+
def direct_upload(metadata_json)
|
53
|
+
logger.info("Starting an upload request: #{metadata_json}")
|
54
|
+
response = Faraday.post(url + BLOB_PATH, metadata_json, 'Content-Type' => 'application/json')
|
55
|
+
raise "unexpected response: #{response.inspect}" unless response.status == 200
|
56
|
+
|
57
|
+
logger.info("Response from server: #{response.body}")
|
58
|
+
|
59
|
+
Files::DirectUploadResponse.new(JSON.parse(response.body))
|
60
|
+
end
|
61
|
+
|
62
|
+
# @param [Hash<String,Files::DirectUploadResponse>] upload_responses the filenames and their upload response
|
63
|
+
def upload_files(upload_responses)
|
64
|
+
upload_responses.each do |filename, response|
|
65
|
+
upload_file(filename: filename,
|
66
|
+
url: response.direct_upload.fetch('url'),
|
67
|
+
content_type: response.content_type,
|
68
|
+
content_length: response.byte_size)
|
69
|
+
|
70
|
+
logger.info('Upload complete')
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def upload_file(filename:, url:, content_type:, content_length:)
|
75
|
+
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)
|
81
|
+
req.headers['Content-Type'] = content_type
|
82
|
+
req.headers['Content-Length'] = content_length.to_s
|
83
|
+
end
|
84
|
+
|
85
|
+
raise "unexpected response: #{upload_response.inspect}" unless upload_response.status == 204
|
86
|
+
end
|
87
|
+
|
88
|
+
def upload_metadata(metadata)
|
89
|
+
logger.info("Starting upload metadata: #{metadata}")
|
90
|
+
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
|
93
|
+
|
94
|
+
logger.info("Response from server: #{response.body}")
|
95
|
+
|
96
|
+
JSON.parse(response.body)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RepositoryClient
|
4
|
+
module Deposit
|
5
|
+
# This represents the metadata that we send to the server for doing a deposit
|
6
|
+
class Request
|
7
|
+
CONTEXT = 'http://cocina.sul.stanford.edu/contexts/cocina-base.jsonld'
|
8
|
+
|
9
|
+
# @param [String] label the required object label
|
10
|
+
# @param [String] type (http://cocina.sul.stanford.edu/models/object.jsonld) the required object type.
|
11
|
+
# @param [Array<RepositoryClient::Deposit::Files::DirectUploadResponse>] uploads the uploaded files to attach.
|
12
|
+
def initialize(label:,
|
13
|
+
type: 'http://cocina.sul.stanford.edu/models/object.jsonld',
|
14
|
+
uploads: [])
|
15
|
+
@label = label
|
16
|
+
@type = type
|
17
|
+
@uploads = uploads
|
18
|
+
end
|
19
|
+
|
20
|
+
def as_json
|
21
|
+
{
|
22
|
+
"@context": CONTEXT,
|
23
|
+
"@type": type,
|
24
|
+
label: label,
|
25
|
+
structural: {
|
26
|
+
hasMember: file_sets_as_json
|
27
|
+
}
|
28
|
+
}
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
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
|
+
}
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
lib = File.expand_path('lib', __dir__)
|
4
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
5
|
+
require 'repository_client/version'
|
6
|
+
|
7
|
+
Gem::Specification.new do |spec|
|
8
|
+
spec.name = 'repository-client'
|
9
|
+
spec.version = RepositoryClient::VERSION
|
10
|
+
spec.authors = ['Justin Coyne']
|
11
|
+
spec.email = ['jcoyne@justincoyne.com']
|
12
|
+
|
13
|
+
spec.summary = 'The CLI for https://github.com/sul-dlss/repository-api'
|
14
|
+
spec.description = 'This provides a way to deposit repository objects into the Stanford Digital Repository'
|
15
|
+
spec.homepage = 'https://github.com/sul-dlss/repository-client'
|
16
|
+
|
17
|
+
spec.metadata['homepage_uri'] = spec.homepage
|
18
|
+
spec.metadata['source_code_uri'] = 'https://github.com/sul-dlss/repository-client'
|
19
|
+
spec.metadata['changelog_uri'] = 'https://github.com/sul-dlss/repository-client/releases'
|
20
|
+
|
21
|
+
# Specify which files should be added to the gem when it is released.
|
22
|
+
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
23
|
+
spec.files = Dir.chdir(File.expand_path(__dir__)) do
|
24
|
+
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
25
|
+
end
|
26
|
+
spec.bindir = 'exe'
|
27
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
28
|
+
spec.require_paths = ['lib']
|
29
|
+
|
30
|
+
spec.add_dependency 'faraday', '~> 0.17.0'
|
31
|
+
|
32
|
+
spec.add_development_dependency 'bundler', '~> 2.0'
|
33
|
+
spec.add_development_dependency 'rake', '~> 13.0'
|
34
|
+
spec.add_development_dependency 'rspec', '~> 3.0'
|
35
|
+
spec.add_development_dependency 'rubocop', '~> 0.79.0'
|
36
|
+
spec.add_development_dependency 'rubocop-rspec', '~> 1.37.1'
|
37
|
+
spec.add_development_dependency 'simplecov'
|
38
|
+
spec.add_development_dependency 'webmock', '~> 3.7'
|
39
|
+
end
|
metadata
ADDED
@@ -0,0 +1,181 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: repository-client
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Justin Coyne
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2020-01-09 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: faraday
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 0.17.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.17.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: bundler
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '2.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '2.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rake
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '13.0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '13.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rspec
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '3.0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '3.0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rubocop
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 0.79.0
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 0.79.0
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rubocop-rspec
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 1.37.1
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 1.37.1
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: simplecov
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: webmock
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '3.7'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '3.7'
|
125
|
+
description: This provides a way to deposit repository objects into the Stanford Digital
|
126
|
+
Repository
|
127
|
+
email:
|
128
|
+
- jcoyne@justincoyne.com
|
129
|
+
executables:
|
130
|
+
- sdr
|
131
|
+
extensions: []
|
132
|
+
extra_rdoc_files: []
|
133
|
+
files:
|
134
|
+
- ".github/pull_request_template.md"
|
135
|
+
- ".gitignore"
|
136
|
+
- ".rspec"
|
137
|
+
- ".rubocop.yml"
|
138
|
+
- ".rubocop_todo.yml"
|
139
|
+
- ".travis.yml"
|
140
|
+
- Gemfile
|
141
|
+
- LICENSE
|
142
|
+
- README.md
|
143
|
+
- Rakefile
|
144
|
+
- bin/console
|
145
|
+
- bin/setup
|
146
|
+
- exe/sdr
|
147
|
+
- lib/repository_client.rb
|
148
|
+
- lib/repository_client/cli.rb
|
149
|
+
- lib/repository_client/deposit.rb
|
150
|
+
- lib/repository_client/deposit/files/direct_upload_request.rb
|
151
|
+
- lib/repository_client/deposit/files/direct_upload_response.rb
|
152
|
+
- lib/repository_client/deposit/process.rb
|
153
|
+
- lib/repository_client/deposit/request.rb
|
154
|
+
- lib/repository_client/version.rb
|
155
|
+
- repository-client.gemspec
|
156
|
+
homepage: https://github.com/sul-dlss/repository-client
|
157
|
+
licenses: []
|
158
|
+
metadata:
|
159
|
+
homepage_uri: https://github.com/sul-dlss/repository-client
|
160
|
+
source_code_uri: https://github.com/sul-dlss/repository-client
|
161
|
+
changelog_uri: https://github.com/sul-dlss/repository-client/releases
|
162
|
+
post_install_message:
|
163
|
+
rdoc_options: []
|
164
|
+
require_paths:
|
165
|
+
- lib
|
166
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
167
|
+
requirements:
|
168
|
+
- - ">="
|
169
|
+
- !ruby/object:Gem::Version
|
170
|
+
version: '0'
|
171
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
172
|
+
requirements:
|
173
|
+
- - ">="
|
174
|
+
- !ruby/object:Gem::Version
|
175
|
+
version: '0'
|
176
|
+
requirements: []
|
177
|
+
rubygems_version: 3.1.2
|
178
|
+
signing_key:
|
179
|
+
specification_version: 4
|
180
|
+
summary: The CLI for https://github.com/sul-dlss/repository-api
|
181
|
+
test_files: []
|