stash-sword 0.1.0 → 0.1.1
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/.gitignore +2 -0
- data/CHANGES.md +7 -0
- data/examples/{example.rb → create.rb} +10 -10
- data/examples/update.rb +22 -0
- data/lib/stash/sword.rb +0 -34
- data/lib/stash/sword/client.rb +9 -2
- data/lib/stash/sword/header_utils.rb +4 -2
- data/lib/stash/sword/http_helper.rb +3 -1
- data/lib/stash/sword/log_utils.rb +24 -1
- data/lib/stash/sword/module_info.rb +1 -1
- data/spec/rspec_custom_matchers.rb +1 -1
- data/spec/unit/stash/sword2/client_spec.rb +8 -3
- data/spec/unit/stash/sword2/sequence_io_spec.rb +1 -1
- metadata +5 -5
- data/spec/unit/stash/sword2/log_spec.rb +0 -23
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0037ff658b5959ae0dca3bdfed3af072d81a7755
|
4
|
+
data.tar.gz: 6677bb48ecbe7d07e25d1bf27c1737250f4c1ae9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6a0e6a7532fb0e39ae48dd242e9b20f03cae6870f43addbbb20c6d137f49cddcec1510798c9e33fbb516c8a6b71906afafc2c8c647cfdb9bc6cdd97417d28d57
|
7
|
+
data.tar.gz: 0265b3b0cfc3fd3d0ea4eac70bafd83f528632259e9bbc4943cd869b0aa5cd490e1a7e880a749bb73c13e9a400eb7f2c246fbe87a543d8092b8f1ff3517e4866
|
data/.gitignore
CHANGED
data/CHANGES.md
ADDED
@@ -4,23 +4,23 @@ require 'stash/sword'
|
|
4
4
|
|
5
5
|
include Stash::Sword
|
6
6
|
|
7
|
-
|
7
|
+
password = ARGV[0]
|
8
|
+
username = 'ucop_dash_submitter'
|
9
|
+
collection = 'dash_cdl'
|
10
|
+
collection_uri = "http://uc3-mrtsword-dev.cdlib.org:39001/mrtsword/collection/#{collection}"
|
11
|
+
zipfile = File.expand_path('../uploads/example.zip', __FILE__)
|
12
|
+
|
13
|
+
doi = "doi:10.5072/FK#{Time.now.to_i}"
|
8
14
|
|
9
15
|
client = Client.new(
|
10
16
|
username: username,
|
11
17
|
password: password,
|
12
|
-
collection_uri: URI(
|
18
|
+
collection_uri: URI(collection_uri)
|
13
19
|
)
|
14
20
|
|
15
|
-
doi = "doi:10.5072/FK#{Time.now.to_i}"
|
16
|
-
zipfile = File.expand_path('../uploads/example.zip', __FILE__)
|
17
|
-
|
18
21
|
receipt = client.create(doi: doi, zipfile: zipfile)
|
19
22
|
em_iri = receipt.em_iri
|
20
|
-
|
23
|
+
edit_iri = receipt.edit_iri
|
21
24
|
|
22
25
|
puts "em_iri: #{em_iri}"
|
23
|
-
puts "
|
24
|
-
|
25
|
-
code = client.update(se_iri: se_iri, zipfile: zipfile)
|
26
|
-
puts "update response code: #{code}"
|
26
|
+
puts "edit_iri: #{edit_iri}"
|
data/examples/update.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
#! /usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'stash/sword'
|
4
|
+
|
5
|
+
include Stash::Sword
|
6
|
+
|
7
|
+
password = ARGV[0]
|
8
|
+
username = 'ucop_dash_submitter'
|
9
|
+
collection = 'dash_cdl'
|
10
|
+
collection_uri = "http://uc3-mrtsword-dev.cdlib.org:39001/mrtsword/collection/#{collection}"
|
11
|
+
zipfile = File.expand_path('../uploads/example.zip', __FILE__)
|
12
|
+
|
13
|
+
edit_iri = 'http://sword-aws-dev.cdlib.org:39001/mrtsword/edit/dash_cdl/doi%3A10.5072%2FFK1465424720'
|
14
|
+
|
15
|
+
client = Client.new(
|
16
|
+
username: username,
|
17
|
+
password: password,
|
18
|
+
collection_uri: URI(collection_uri)
|
19
|
+
)
|
20
|
+
|
21
|
+
code = client.update(edit_iri: edit_iri, zipfile: zipfile)
|
22
|
+
puts "update response code: #{code}"
|
data/lib/stash/sword.rb
CHANGED
@@ -1,39 +1,5 @@
|
|
1
|
-
require 'uri'
|
2
|
-
require 'logger'
|
3
|
-
|
4
1
|
module Stash
|
5
|
-
|
6
|
-
# TODO: Make this configurable
|
7
|
-
LOG_LEVEL = case ENV['RAILS_ENV'].to_s.downcase
|
8
|
-
when 'test'
|
9
|
-
Logger::DEBUG
|
10
|
-
when 'development'
|
11
|
-
Logger::INFO
|
12
|
-
else
|
13
|
-
Logger::WARN
|
14
|
-
end
|
15
|
-
|
16
2
|
module Sword
|
17
|
-
|
18
3
|
Dir.glob(File.expand_path('../sword/*.rb', __FILE__)).sort.each(&method(:require))
|
19
|
-
|
20
|
-
def self.log
|
21
|
-
@log ||= new_logger(logdev: $stdout)
|
22
|
-
end
|
23
|
-
|
24
|
-
def self.log_device=(value)
|
25
|
-
@log = new_logger(logdev: value)
|
26
|
-
end
|
27
|
-
|
28
|
-
def self.new_logger(logdev:, level: Stash::LOG_LEVEL, shift_age: 10, shift_size: 1024 * 1024)
|
29
|
-
logger = Logger.new(logdev, shift_age, shift_size)
|
30
|
-
logger.level = level
|
31
|
-
logger.formatter = proc do |severity, datetime, progname, msg|
|
32
|
-
"#{datetime.to_time.utc} #{severity} -#{progname}- #{msg}\n"
|
33
|
-
end
|
34
|
-
logger
|
35
|
-
end
|
36
|
-
|
37
|
-
private_class_method :new_logger
|
38
4
|
end
|
39
5
|
end
|
data/lib/stash/sword/client.rb
CHANGED
@@ -4,6 +4,7 @@ require 'stash/sword/header_utils'
|
|
4
4
|
require 'stash/sword/log_utils'
|
5
5
|
require 'stash/sword/http_helper'
|
6
6
|
require 'stash/sword/sequence_io'
|
7
|
+
require 'logger'
|
7
8
|
|
8
9
|
module Stash
|
9
10
|
module Sword
|
@@ -24,7 +25,8 @@ module Stash
|
|
24
25
|
# @param password [String] the password
|
25
26
|
# @param on_behalf_of [String, nil] the user for whom the original sword package was deposited on behalf of.
|
26
27
|
# Defaults to `username`.
|
27
|
-
|
28
|
+
# @param logger [Logger, nil] the logger to use, or nil to use a default logger
|
29
|
+
def initialize(collection_uri:, username:, password:, on_behalf_of: nil, logger: nil, helper: nil)
|
28
30
|
raise 'no collection URI provided' unless collection_uri
|
29
31
|
raise 'no username provided' unless username
|
30
32
|
raise 'no password provided' unless password
|
@@ -32,7 +34,8 @@ module Stash
|
|
32
34
|
@username = username
|
33
35
|
@password = password
|
34
36
|
@on_behalf_of = on_behalf_of || username
|
35
|
-
@helper = helper || HTTPHelper.new(username: username, password: password, user_agent: "stash-sword #{VERSION}")
|
37
|
+
@helper = helper || HTTPHelper.new(username: username, password: password, user_agent: "stash-sword #{VERSION}", logger: logger)
|
38
|
+
@log = logger || default_logger
|
36
39
|
end
|
37
40
|
|
38
41
|
# Creates a new resource for the specified DOI with the specified zipfile
|
@@ -118,7 +121,11 @@ module Stash
|
|
118
121
|
update_mime_headers(zipfile).each { |k, v| content << "#{k}: #{v}#{EOL}" }
|
119
122
|
content << EOL
|
120
123
|
content << zipfile
|
124
|
+
content << EOL
|
121
125
|
content << "--#{boundary}--#{EOL}"
|
126
|
+
|
127
|
+
log.debug("Payload:\n\t#{content.map(&:to_s).join("\t")}")
|
128
|
+
|
122
129
|
SequenceIO.new(content).binmode
|
123
130
|
end
|
124
131
|
|
@@ -5,13 +5,15 @@ module Stash
|
|
5
5
|
SIMPLE_ZIP = 'http://purl.org/net/sword/package/SimpleZip'.freeze
|
6
6
|
APPLICATION_ZIP = 'application/zip'.freeze
|
7
7
|
MULTIPART_RELATED_ATOM_XML = 'multipart/related; type="application/atom+xml"'.freeze
|
8
|
+
# CONTENT_DISPOSITION = 'attachment'.freeze
|
9
|
+
CONTENT_DISPOSITION = 'form-data'.freeze
|
8
10
|
|
9
11
|
attr_reader :on_behalf_of
|
10
12
|
|
11
13
|
def create_request_headers(zipfile, slug)
|
12
14
|
{
|
13
15
|
'Content-Type' => APPLICATION_ZIP,
|
14
|
-
'Content-Disposition' => "
|
16
|
+
'Content-Disposition' => "#{CONTENT_DISPOSITION}; filename=#{File.basename(zipfile)}",
|
15
17
|
'Packaging' => SIMPLE_ZIP,
|
16
18
|
'Content-MD5' => Digest::MD5.file(zipfile).to_s,
|
17
19
|
'On-Behalf-Of' => on_behalf_of,
|
@@ -31,7 +33,7 @@ module Stash
|
|
31
33
|
def update_mime_headers(zipfile)
|
32
34
|
{
|
33
35
|
'Content-Type' => APPLICATION_ZIP,
|
34
|
-
'Content-Disposition' => "
|
36
|
+
'Content-Disposition' => "#{CONTENT_DISPOSITION}; name=\"payload\"; filename=\"#{File.basename(zipfile)}\"",
|
35
37
|
'Packaging' => SIMPLE_ZIP,
|
36
38
|
'Content-MD5' => Digest::MD5.file(zipfile).to_s,
|
37
39
|
'MIME-Version' => '1.0'
|
@@ -30,11 +30,13 @@ module Stash
|
|
30
30
|
# @param user_agent [String] the User-Agent string to send when making requests
|
31
31
|
# @param redirect_limit [Integer] the number of redirects to follow before erroring out
|
32
32
|
# (defaults to {DEFAULT_MAX_REDIRECTS})
|
33
|
-
|
33
|
+
# @param logger [Logger, nil] the logger to use, or nil to use a default logger
|
34
|
+
def initialize(user_agent:, username: nil, password: nil, redirect_limit: DEFAULT_MAX_REDIRECTS, logger: nil)
|
34
35
|
@user_agent = user_agent
|
35
36
|
@redirect_limit = redirect_limit
|
36
37
|
@username = username
|
37
38
|
@password = password
|
39
|
+
@log = logger || default_logger
|
38
40
|
end
|
39
41
|
|
40
42
|
# Gets the content of the specified URI as a string.
|
@@ -1,8 +1,9 @@
|
|
1
1
|
module Stash
|
2
2
|
module Sword
|
3
3
|
module LogUtils
|
4
|
+
|
4
5
|
def log
|
5
|
-
|
6
|
+
@log ||= default_logger
|
6
7
|
end
|
7
8
|
|
8
9
|
def log_error(e)
|
@@ -34,6 +35,28 @@ module Stash
|
|
34
35
|
"#{k}: #{value}"
|
35
36
|
end.join("\n")
|
36
37
|
end
|
38
|
+
|
39
|
+
def level
|
40
|
+
# TODO: make this configurable
|
41
|
+
@level ||= case ENV['RAILS_ENV'].to_s.downcase
|
42
|
+
when 'test'
|
43
|
+
Logger::DEBUG
|
44
|
+
when 'development'
|
45
|
+
Logger::INFO
|
46
|
+
else
|
47
|
+
Logger::WARN
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def default_logger
|
52
|
+
logger = Logger.new($stdout, 10, 1024 * 1024)
|
53
|
+
logger.level = level
|
54
|
+
logger.formatter = proc do |severity, datetime, progname, msg|
|
55
|
+
"#{datetime.to_time.utc} #{severity} -#{progname}- #{msg}\n"
|
56
|
+
end
|
57
|
+
logger
|
58
|
+
end
|
59
|
+
|
37
60
|
end
|
38
61
|
end
|
39
62
|
end
|
@@ -113,6 +113,6 @@ RSpec::Matchers.define :include_header do |k, v|
|
|
113
113
|
end
|
114
114
|
|
115
115
|
failure_message do |actual|
|
116
|
-
"expected #{k}
|
116
|
+
"expected #{k} to be '#{v}' but found '#{value_for(key: k, in_hash: actual) || 'nil'}'"
|
117
117
|
end
|
118
118
|
end
|
@@ -33,12 +33,14 @@ module Stash
|
|
33
33
|
actual_headers = req.headers
|
34
34
|
end).to have_been_made
|
35
35
|
|
36
|
+
expected_disposition = 'attachment'
|
37
|
+
|
36
38
|
aggregate_failures('request headers') do
|
37
39
|
{
|
38
40
|
'On-Behalf-Of' => on_behalf_of,
|
39
41
|
'Packaging' => 'http://purl.org/net/sword/package/SimpleZip',
|
40
42
|
'Slug' => doi,
|
41
|
-
'Content-Disposition' =>
|
43
|
+
'Content-Disposition' => "#{expected_disposition}; filename=example.zip",
|
42
44
|
'Content-MD5' => md5,
|
43
45
|
'Content-Length' => /[0-9]+/,
|
44
46
|
'Content-Type' => 'application/zip'
|
@@ -84,16 +86,19 @@ module Stash
|
|
84
86
|
end
|
85
87
|
end
|
86
88
|
|
89
|
+
expected_disposition = 'attachment'
|
90
|
+
|
87
91
|
mime_headers = {
|
88
92
|
'Packaging' => 'http://purl.org/net/sword/package/SimpleZip',
|
89
|
-
'Content-Disposition' =>
|
93
|
+
'Content-Disposition' => "#{expected_disposition}; name=payload; filename=\"example.zip\"",
|
90
94
|
'Content-Type' => 'application/zip',
|
91
95
|
'Content-MD5' => md5
|
92
96
|
}
|
93
97
|
|
94
98
|
aggregate_failures('MIME headers') do
|
95
99
|
mime_headers.each do |k, v|
|
96
|
-
|
100
|
+
closest_match = actual_body[/#{k}[^\n]+/m].strip
|
101
|
+
expect(actual_body).to include("#{k}: #{v}"), "expected '#{k}: #{v}'; closest match was '#{closest_match}'"
|
97
102
|
end
|
98
103
|
end
|
99
104
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: stash-sword
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Moles
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-06-
|
11
|
+
date: 2016-06-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rest-client
|
@@ -202,11 +202,13 @@ files:
|
|
202
202
|
- ".ruby-version"
|
203
203
|
- ".travis.yml"
|
204
204
|
- ".yardopts"
|
205
|
+
- CHANGES.md
|
205
206
|
- Gemfile
|
206
207
|
- LICENSE.md
|
207
208
|
- README.md
|
208
209
|
- Rakefile
|
209
|
-
- examples/
|
210
|
+
- examples/create.rb
|
211
|
+
- examples/update.rb
|
210
212
|
- examples/uploads/example.zip
|
211
213
|
- examples/uploads/example/lorem-ipsum.txt
|
212
214
|
- examples/uploads/example/mrt-datacite.xml
|
@@ -234,7 +236,6 @@ files:
|
|
234
236
|
- spec/unit/stash/sword2/http_helper_get_spec.rb
|
235
237
|
- spec/unit/stash/sword2/http_helper_post_spec.rb
|
236
238
|
- spec/unit/stash/sword2/http_helper_put_spec.rb
|
237
|
-
- spec/unit/stash/sword2/log_spec.rb
|
238
239
|
- spec/unit/stash/sword2/namespaces_spec.rb
|
239
240
|
- spec/unit/stash/sword2/sequence_io_spec.rb
|
240
241
|
- stash-sword.gemspec
|
@@ -273,7 +274,6 @@ test_files:
|
|
273
274
|
- spec/unit/stash/sword2/http_helper_get_spec.rb
|
274
275
|
- spec/unit/stash/sword2/http_helper_post_spec.rb
|
275
276
|
- spec/unit/stash/sword2/http_helper_put_spec.rb
|
276
|
-
- spec/unit/stash/sword2/log_spec.rb
|
277
277
|
- spec/unit/stash/sword2/namespaces_spec.rb
|
278
278
|
- spec/unit/stash/sword2/sequence_io_spec.rb
|
279
279
|
has_rdoc:
|
@@ -1,23 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
module Stash
|
4
|
-
module Sword
|
5
|
-
describe 'log' do
|
6
|
-
it 'logs to stdout in a timestamp-first format' do
|
7
|
-
out = StringIO.new
|
8
|
-
Sword.log_device = out
|
9
|
-
begin
|
10
|
-
msg = 'I am a log message'
|
11
|
-
Sword.log.warn(msg)
|
12
|
-
logged = out.string
|
13
|
-
expect(logged).to include(msg)
|
14
|
-
timestamp_str = logged.split[0]
|
15
|
-
timestamp = DateTime.parse(timestamp_str)
|
16
|
-
expect(timestamp.to_date).to eq(Time.now.utc.to_date)
|
17
|
-
ensure
|
18
|
-
Sword.log_device = $stdout
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|