pushmi_pullyu 1.0.2 → 2.0.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 +5 -5
- data/.github/CODEOWNERS +2 -0
- data/.github/PULL_REQUEST_TEMPLATE +11 -0
- data/.github/workflows/ruby.yml +31 -0
- data/.rubocop.yml +20 -1
- data/.travis.yml +2 -2
- data/CHANGELOG.md +16 -0
- data/Dangerfile +7 -3
- data/README.md +4 -5
- data/examples/pushmi_pullyu.yml +7 -10
- data/lib/pushmi_pullyu.rb +10 -17
- data/lib/pushmi_pullyu/aip.rb +9 -6
- data/lib/pushmi_pullyu/aip/downloader.rb +133 -180
- data/lib/pushmi_pullyu/cli.rb +34 -16
- data/lib/pushmi_pullyu/logging.rb +1 -1
- data/lib/pushmi_pullyu/preservation_queue.rb +1 -0
- data/lib/pushmi_pullyu/swift_depositer.rb +1 -1
- data/lib/pushmi_pullyu/version.rb +1 -1
- data/pushmi_pullyu.gemspec +15 -14
- metadata +82 -49
- data/lib/pushmi_pullyu/aip/fedora_fetcher.rb +0 -65
- data/lib/pushmi_pullyu/aip/file_list_creator.rb +0 -118
- data/lib/pushmi_pullyu/aip/owner_email_editor.rb +0 -62
- data/lib/pushmi_pullyu/aip/user.rb +0 -2
data/lib/pushmi_pullyu/cli.rb
CHANGED
@@ -4,6 +4,7 @@ require 'optparse'
|
|
4
4
|
require 'rollbar'
|
5
5
|
require 'singleton'
|
6
6
|
require 'yaml'
|
7
|
+
require 'json'
|
7
8
|
|
8
9
|
# CLI runner
|
9
10
|
class PushmiPullyu::CLI
|
@@ -59,6 +60,19 @@ class PushmiPullyu::CLI
|
|
59
60
|
Rollbar.configure do |config|
|
60
61
|
config.enabled = false unless options[:rollbar][:token].present?
|
61
62
|
config.access_token = options[:rollbar][:token]
|
63
|
+
config.use_exception_level_filters_default = true
|
64
|
+
config.exception_level_filters['IOError'] = 'ignore'
|
65
|
+
# add a filter after Rollbar has built the error payload but before it is delivered to the API,
|
66
|
+
# in order to strip sensitive information out of certain error messages
|
67
|
+
exception_message_transformer = proc do |payload|
|
68
|
+
clean_message = payload[:exception][:message].sub(/http:\/\/.+:.+@(.+)\/aip\/v1\/(.*)/,
|
69
|
+
"http://\1/aip/v1/\2")
|
70
|
+
payload[:exception][:message] = clean_message
|
71
|
+
payload[:message] = clean_message
|
72
|
+
end
|
73
|
+
|
74
|
+
config.transform << exception_message_transformer
|
75
|
+
|
62
76
|
if options[:rollbar][:proxy_host].present?
|
63
77
|
config.proxy = {}
|
64
78
|
config.proxy[:host] = options[:rollbar][:proxy_host]
|
@@ -168,25 +182,29 @@ class PushmiPullyu::CLI
|
|
168
182
|
end
|
169
183
|
|
170
184
|
def run_preservation_cycle
|
171
|
-
|
185
|
+
entity_json = JSON.parse(queue.wait_next_item)
|
186
|
+
entity = {
|
187
|
+
type: entity_json['type'],
|
188
|
+
uuid: entity_json['uuid']
|
189
|
+
}
|
190
|
+
return unless entity[:type].present? && entity[:uuid].present?
|
172
191
|
|
173
192
|
# add additional information about the error context to errors that occur while processing this item.
|
174
|
-
Rollbar.scoped(
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
end
|
183
|
-
# rubocop:disable Lint/RescueException
|
184
|
-
rescue Exception => e
|
185
|
-
Rollbar.error(e)
|
186
|
-
logger.error(e)
|
187
|
-
# TODO: we could re-raise here and let the daemon die on any preservation error, or just log the issue and
|
188
|
-
# move on to the next item.
|
193
|
+
Rollbar.scoped(entity_uuid: entity[:uuid]) do
|
194
|
+
# Download AIP from Jupiter, bag and tar AIP directory and cleanup after
|
195
|
+
# block code
|
196
|
+
PushmiPullyu::AIP.create(entity) do |aip_filename, aip_directory|
|
197
|
+
# Push tarred AIP to swift API
|
198
|
+
deposited_file = swift.deposit_file(aip_filename, options[:swift][:container])
|
199
|
+
# Log successful preservation event to the log files
|
200
|
+
PushmiPullyu::Logging.log_preservation_event(deposited_file, aip_directory)
|
189
201
|
end
|
202
|
+
# rubocop:disable Lint/RescueException
|
203
|
+
rescue Exception => e
|
204
|
+
Rollbar.error(e)
|
205
|
+
logger.error(e)
|
206
|
+
# TODO: we could re-raise here and let the daemon die on any preservation error, or just log the issue and
|
207
|
+
# move on to the next item.
|
190
208
|
# rubocop:enable Lint/RescueException
|
191
209
|
end
|
192
210
|
end
|
@@ -48,7 +48,7 @@ module PushmiPullyu::Logging
|
|
48
48
|
|
49
49
|
message = "#{deposited_file.name} was successfully deposited into Swift Storage!\n"\
|
50
50
|
"Here are the details of this preservation event:\n"\
|
51
|
-
"\
|
51
|
+
"\tUUID: '#{deposited_file.name}'\n"\
|
52
52
|
"\tTimestamp of Completion: '#{deposited_file.last_modified}'\n"\
|
53
53
|
"\tAIP Checksum: '#{deposited_file.etag}'\n"\
|
54
54
|
"\tMetadata: #{deposited_file.metadata}\n"\
|
@@ -50,7 +50,7 @@ class PushmiPullyu::SwiftDepositer
|
|
50
50
|
else
|
51
51
|
# for creating new: construct hash with symbols as keys, add metadata as a hash within the header hash
|
52
52
|
headers = { etag: checksum,
|
53
|
-
content_type:
|
53
|
+
content_type: 'application/x-tar',
|
54
54
|
metadata: metadata }
|
55
55
|
deposited_file = era_container.create_object(file_base_name, headers, File.open(file_name))
|
56
56
|
end
|
data/pushmi_pullyu.gemspec
CHANGED
@@ -5,10 +5,10 @@ require 'pushmi_pullyu/version'
|
|
5
5
|
Gem::Specification.new do |spec|
|
6
6
|
spec.name = 'pushmi_pullyu'
|
7
7
|
spec.version = PushmiPullyu::VERSION
|
8
|
-
spec.authors = ['Shane Murnaghan']
|
9
|
-
spec.email = ['murnagha@ualberta.ca']
|
8
|
+
spec.authors = ['Shane Murnaghan', 'Omar Rodriguez-Arenas']
|
9
|
+
spec.email = ['murnagha@ualberta.ca', 'orodrigu@ualberta.ca']
|
10
10
|
|
11
|
-
spec.summary = 'Ruby application to manage flow of content from
|
11
|
+
spec.summary = 'Ruby application to manage flow of content from Jupiter into Swift for preservation'
|
12
12
|
spec.homepage = 'https://github.com/ualbertalib/pushmi_pullyu'
|
13
13
|
spec.license = 'MIT'
|
14
14
|
|
@@ -19,31 +19,32 @@ Gem::Specification.new do |spec|
|
|
19
19
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
20
20
|
spec.require_paths = ['lib']
|
21
21
|
|
22
|
-
spec.required_ruby_version = '>= 2.
|
22
|
+
spec.required_ruby_version = '>= 2.5'
|
23
23
|
|
24
|
-
spec.add_runtime_dependency '
|
25
|
-
spec.add_runtime_dependency 'activesupport', '~> 5.0'
|
24
|
+
spec.add_runtime_dependency 'activesupport', '>= 5', '< 7'
|
26
25
|
spec.add_runtime_dependency 'bagit', '~> 0.4'
|
27
26
|
spec.add_runtime_dependency 'connection_pool', '~> 2.2'
|
28
27
|
spec.add_runtime_dependency 'daemons', '~> 1.2', '>= 1.2.4'
|
29
|
-
spec.add_runtime_dependency 'minitar', '~> 0.
|
28
|
+
spec.add_runtime_dependency 'minitar', '~> 0.7'
|
30
29
|
spec.add_runtime_dependency 'openstack', '~> 3.3', '>= 3.3.10'
|
31
|
-
spec.add_runtime_dependency 'pg', '
|
30
|
+
spec.add_runtime_dependency 'pg', '>= 1.0', '< 1.2'
|
32
31
|
spec.add_runtime_dependency 'rdf', '>= 1.99', '< 4.0'
|
33
32
|
spec.add_runtime_dependency 'rdf-n3', '>= 1.99', '< 4.0'
|
34
33
|
spec.add_runtime_dependency 'redis', '>= 3.3', '< 5.0'
|
35
|
-
spec.add_runtime_dependency 'rest-client', '
|
36
|
-
spec.add_runtime_dependency 'rollbar', '
|
34
|
+
spec.add_runtime_dependency 'rest-client', '>= 1.8', '< 3.0'
|
35
|
+
spec.add_runtime_dependency 'rollbar', '>= 2.18', '< 4.0'
|
37
36
|
|
38
|
-
spec.add_development_dependency 'bundler', '~>
|
37
|
+
spec.add_development_dependency 'bundler', '~> 2.0'
|
39
38
|
spec.add_development_dependency 'coveralls', '~> 0.8'
|
40
|
-
spec.add_development_dependency 'danger', '~>
|
39
|
+
spec.add_development_dependency 'danger', '~> 8.0'
|
41
40
|
spec.add_development_dependency 'pry', '~> 0.10', '>= 0.10.4'
|
42
|
-
spec.add_development_dependency '
|
41
|
+
spec.add_development_dependency 'pry-byebug', '~> 3.6'
|
42
|
+
spec.add_development_dependency 'rake', '~> 13.0'
|
43
43
|
spec.add_development_dependency 'rspec', '~> 3.0'
|
44
44
|
spec.add_development_dependency 'rubocop', '~> 0.51'
|
45
45
|
spec.add_development_dependency 'rubocop-rspec', '~> 1.10'
|
46
46
|
spec.add_development_dependency 'timecop', '~> 0.8'
|
47
|
-
spec.add_development_dependency '
|
47
|
+
spec.add_development_dependency 'uuid', '~> 2.3.9'
|
48
|
+
spec.add_development_dependency 'vcr', '~> 5.0'
|
48
49
|
spec.add_development_dependency 'webmock', '~> 3.3'
|
49
50
|
end
|
metadata
CHANGED
@@ -1,49 +1,36 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pushmi_pullyu
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shane Murnaghan
|
8
|
+
- Omar Rodriguez-Arenas
|
8
9
|
autorequire:
|
9
10
|
bindir: exe
|
10
11
|
cert_chain: []
|
11
|
-
date:
|
12
|
+
date: 2021-01-29 00:00:00.000000000 Z
|
12
13
|
dependencies:
|
13
14
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
15
|
+
name: activesupport
|
15
16
|
requirement: !ruby/object:Gem::Requirement
|
16
17
|
requirements:
|
17
18
|
- - ">="
|
18
19
|
- !ruby/object:Gem::Version
|
19
|
-
version: 5
|
20
|
+
version: '5'
|
20
21
|
- - "<"
|
21
22
|
- !ruby/object:Gem::Version
|
22
|
-
version:
|
23
|
+
version: '7'
|
23
24
|
type: :runtime
|
24
25
|
prerelease: false
|
25
26
|
version_requirements: !ruby/object:Gem::Requirement
|
26
27
|
requirements:
|
27
28
|
- - ">="
|
28
29
|
- !ruby/object:Gem::Version
|
29
|
-
version: 5
|
30
|
+
version: '5'
|
30
31
|
- - "<"
|
31
32
|
- !ruby/object:Gem::Version
|
32
|
-
version:
|
33
|
-
- !ruby/object:Gem::Dependency
|
34
|
-
name: activesupport
|
35
|
-
requirement: !ruby/object:Gem::Requirement
|
36
|
-
requirements:
|
37
|
-
- - "~>"
|
38
|
-
- !ruby/object:Gem::Version
|
39
|
-
version: '5.0'
|
40
|
-
type: :runtime
|
41
|
-
prerelease: false
|
42
|
-
version_requirements: !ruby/object:Gem::Requirement
|
43
|
-
requirements:
|
44
|
-
- - "~>"
|
45
|
-
- !ruby/object:Gem::Version
|
46
|
-
version: '5.0'
|
33
|
+
version: '7'
|
47
34
|
- !ruby/object:Gem::Dependency
|
48
35
|
name: bagit
|
49
36
|
requirement: !ruby/object:Gem::Requirement
|
@@ -98,14 +85,14 @@ dependencies:
|
|
98
85
|
requirements:
|
99
86
|
- - "~>"
|
100
87
|
- !ruby/object:Gem::Version
|
101
|
-
version: '0.
|
88
|
+
version: '0.7'
|
102
89
|
type: :runtime
|
103
90
|
prerelease: false
|
104
91
|
version_requirements: !ruby/object:Gem::Requirement
|
105
92
|
requirements:
|
106
93
|
- - "~>"
|
107
94
|
- !ruby/object:Gem::Version
|
108
|
-
version: '0.
|
95
|
+
version: '0.7'
|
109
96
|
- !ruby/object:Gem::Dependency
|
110
97
|
name: openstack
|
111
98
|
requirement: !ruby/object:Gem::Requirement
|
@@ -130,16 +117,22 @@ dependencies:
|
|
130
117
|
name: pg
|
131
118
|
requirement: !ruby/object:Gem::Requirement
|
132
119
|
requirements:
|
133
|
-
- - "
|
120
|
+
- - ">="
|
121
|
+
- !ruby/object:Gem::Version
|
122
|
+
version: '1.0'
|
123
|
+
- - "<"
|
134
124
|
- !ruby/object:Gem::Version
|
135
|
-
version: 1.
|
125
|
+
version: '1.2'
|
136
126
|
type: :runtime
|
137
127
|
prerelease: false
|
138
128
|
version_requirements: !ruby/object:Gem::Requirement
|
139
129
|
requirements:
|
140
|
-
- - "
|
130
|
+
- - ">="
|
141
131
|
- !ruby/object:Gem::Version
|
142
|
-
version: 1.0
|
132
|
+
version: '1.0'
|
133
|
+
- - "<"
|
134
|
+
- !ruby/object:Gem::Version
|
135
|
+
version: '1.2'
|
143
136
|
- !ruby/object:Gem::Dependency
|
144
137
|
name: rdf
|
145
138
|
requirement: !ruby/object:Gem::Requirement
|
@@ -204,44 +197,56 @@ dependencies:
|
|
204
197
|
name: rest-client
|
205
198
|
requirement: !ruby/object:Gem::Requirement
|
206
199
|
requirements:
|
207
|
-
- - "
|
200
|
+
- - ">="
|
208
201
|
- !ruby/object:Gem::Version
|
209
202
|
version: '1.8'
|
203
|
+
- - "<"
|
204
|
+
- !ruby/object:Gem::Version
|
205
|
+
version: '3.0'
|
210
206
|
type: :runtime
|
211
207
|
prerelease: false
|
212
208
|
version_requirements: !ruby/object:Gem::Requirement
|
213
209
|
requirements:
|
214
|
-
- - "
|
210
|
+
- - ">="
|
215
211
|
- !ruby/object:Gem::Version
|
216
212
|
version: '1.8'
|
213
|
+
- - "<"
|
214
|
+
- !ruby/object:Gem::Version
|
215
|
+
version: '3.0'
|
217
216
|
- !ruby/object:Gem::Dependency
|
218
217
|
name: rollbar
|
219
218
|
requirement: !ruby/object:Gem::Requirement
|
220
219
|
requirements:
|
221
|
-
- - "
|
220
|
+
- - ">="
|
221
|
+
- !ruby/object:Gem::Version
|
222
|
+
version: '2.18'
|
223
|
+
- - "<"
|
222
224
|
- !ruby/object:Gem::Version
|
223
|
-
version: '
|
225
|
+
version: '4.0'
|
224
226
|
type: :runtime
|
225
227
|
prerelease: false
|
226
228
|
version_requirements: !ruby/object:Gem::Requirement
|
227
229
|
requirements:
|
228
|
-
- - "
|
230
|
+
- - ">="
|
231
|
+
- !ruby/object:Gem::Version
|
232
|
+
version: '2.18'
|
233
|
+
- - "<"
|
229
234
|
- !ruby/object:Gem::Version
|
230
|
-
version: '
|
235
|
+
version: '4.0'
|
231
236
|
- !ruby/object:Gem::Dependency
|
232
237
|
name: bundler
|
233
238
|
requirement: !ruby/object:Gem::Requirement
|
234
239
|
requirements:
|
235
240
|
- - "~>"
|
236
241
|
- !ruby/object:Gem::Version
|
237
|
-
version: '
|
242
|
+
version: '2.0'
|
238
243
|
type: :development
|
239
244
|
prerelease: false
|
240
245
|
version_requirements: !ruby/object:Gem::Requirement
|
241
246
|
requirements:
|
242
247
|
- - "~>"
|
243
248
|
- !ruby/object:Gem::Version
|
244
|
-
version: '
|
249
|
+
version: '2.0'
|
245
250
|
- !ruby/object:Gem::Dependency
|
246
251
|
name: coveralls
|
247
252
|
requirement: !ruby/object:Gem::Requirement
|
@@ -262,14 +267,14 @@ dependencies:
|
|
262
267
|
requirements:
|
263
268
|
- - "~>"
|
264
269
|
- !ruby/object:Gem::Version
|
265
|
-
version: '
|
270
|
+
version: '8.0'
|
266
271
|
type: :development
|
267
272
|
prerelease: false
|
268
273
|
version_requirements: !ruby/object:Gem::Requirement
|
269
274
|
requirements:
|
270
275
|
- - "~>"
|
271
276
|
- !ruby/object:Gem::Version
|
272
|
-
version: '
|
277
|
+
version: '8.0'
|
273
278
|
- !ruby/object:Gem::Dependency
|
274
279
|
name: pry
|
275
280
|
requirement: !ruby/object:Gem::Requirement
|
@@ -290,20 +295,34 @@ dependencies:
|
|
290
295
|
- - ">="
|
291
296
|
- !ruby/object:Gem::Version
|
292
297
|
version: 0.10.4
|
298
|
+
- !ruby/object:Gem::Dependency
|
299
|
+
name: pry-byebug
|
300
|
+
requirement: !ruby/object:Gem::Requirement
|
301
|
+
requirements:
|
302
|
+
- - "~>"
|
303
|
+
- !ruby/object:Gem::Version
|
304
|
+
version: '3.6'
|
305
|
+
type: :development
|
306
|
+
prerelease: false
|
307
|
+
version_requirements: !ruby/object:Gem::Requirement
|
308
|
+
requirements:
|
309
|
+
- - "~>"
|
310
|
+
- !ruby/object:Gem::Version
|
311
|
+
version: '3.6'
|
293
312
|
- !ruby/object:Gem::Dependency
|
294
313
|
name: rake
|
295
314
|
requirement: !ruby/object:Gem::Requirement
|
296
315
|
requirements:
|
297
316
|
- - "~>"
|
298
317
|
- !ruby/object:Gem::Version
|
299
|
-
version: '
|
318
|
+
version: '13.0'
|
300
319
|
type: :development
|
301
320
|
prerelease: false
|
302
321
|
version_requirements: !ruby/object:Gem::Requirement
|
303
322
|
requirements:
|
304
323
|
- - "~>"
|
305
324
|
- !ruby/object:Gem::Version
|
306
|
-
version: '
|
325
|
+
version: '13.0'
|
307
326
|
- !ruby/object:Gem::Dependency
|
308
327
|
name: rspec
|
309
328
|
requirement: !ruby/object:Gem::Requirement
|
@@ -360,20 +379,34 @@ dependencies:
|
|
360
379
|
- - "~>"
|
361
380
|
- !ruby/object:Gem::Version
|
362
381
|
version: '0.8'
|
382
|
+
- !ruby/object:Gem::Dependency
|
383
|
+
name: uuid
|
384
|
+
requirement: !ruby/object:Gem::Requirement
|
385
|
+
requirements:
|
386
|
+
- - "~>"
|
387
|
+
- !ruby/object:Gem::Version
|
388
|
+
version: 2.3.9
|
389
|
+
type: :development
|
390
|
+
prerelease: false
|
391
|
+
version_requirements: !ruby/object:Gem::Requirement
|
392
|
+
requirements:
|
393
|
+
- - "~>"
|
394
|
+
- !ruby/object:Gem::Version
|
395
|
+
version: 2.3.9
|
363
396
|
- !ruby/object:Gem::Dependency
|
364
397
|
name: vcr
|
365
398
|
requirement: !ruby/object:Gem::Requirement
|
366
399
|
requirements:
|
367
400
|
- - "~>"
|
368
401
|
- !ruby/object:Gem::Version
|
369
|
-
version: '
|
402
|
+
version: '5.0'
|
370
403
|
type: :development
|
371
404
|
prerelease: false
|
372
405
|
version_requirements: !ruby/object:Gem::Requirement
|
373
406
|
requirements:
|
374
407
|
- - "~>"
|
375
408
|
- !ruby/object:Gem::Version
|
376
|
-
version: '
|
409
|
+
version: '5.0'
|
377
410
|
- !ruby/object:Gem::Dependency
|
378
411
|
name: webmock
|
379
412
|
requirement: !ruby/object:Gem::Requirement
|
@@ -391,6 +424,7 @@ dependencies:
|
|
391
424
|
description:
|
392
425
|
email:
|
393
426
|
- murnagha@ualberta.ca
|
427
|
+
- orodrigu@ualberta.ca
|
394
428
|
executables:
|
395
429
|
- pushmi_pullyu
|
396
430
|
extensions: []
|
@@ -398,11 +432,15 @@ extra_rdoc_files: []
|
|
398
432
|
files:
|
399
433
|
- ".coveralls.yml"
|
400
434
|
- ".editorconfig"
|
435
|
+
- ".github/CODEOWNERS"
|
436
|
+
- ".github/PULL_REQUEST_TEMPLATE"
|
437
|
+
- ".github/workflows/ruby.yml"
|
401
438
|
- ".gitignore"
|
402
439
|
- ".hound.yml"
|
403
440
|
- ".rspec"
|
404
441
|
- ".rubocop.yml"
|
405
442
|
- ".travis.yml"
|
443
|
+
- CHANGELOG.md
|
406
444
|
- Dangerfile
|
407
445
|
- Gemfile
|
408
446
|
- LICENSE.txt
|
@@ -419,10 +457,6 @@ files:
|
|
419
457
|
- lib/pushmi_pullyu/aip.rb
|
420
458
|
- lib/pushmi_pullyu/aip/creator.rb
|
421
459
|
- lib/pushmi_pullyu/aip/downloader.rb
|
422
|
-
- lib/pushmi_pullyu/aip/fedora_fetcher.rb
|
423
|
-
- lib/pushmi_pullyu/aip/file_list_creator.rb
|
424
|
-
- lib/pushmi_pullyu/aip/owner_email_editor.rb
|
425
|
-
- lib/pushmi_pullyu/aip/user.rb
|
426
460
|
- lib/pushmi_pullyu/cli.rb
|
427
461
|
- lib/pushmi_pullyu/logging.rb
|
428
462
|
- lib/pushmi_pullyu/preservation_queue.rb
|
@@ -444,16 +478,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
444
478
|
requirements:
|
445
479
|
- - ">="
|
446
480
|
- !ruby/object:Gem::Version
|
447
|
-
version: 2.
|
481
|
+
version: '2.5'
|
448
482
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
449
483
|
requirements:
|
450
484
|
- - ">="
|
451
485
|
- !ruby/object:Gem::Version
|
452
486
|
version: '0'
|
453
487
|
requirements: []
|
454
|
-
|
455
|
-
rubygems_version: 2.6.11
|
488
|
+
rubygems_version: 3.0.3
|
456
489
|
signing_key:
|
457
490
|
specification_version: 4
|
458
|
-
summary: Ruby application to manage flow of content from
|
491
|
+
summary: Ruby application to manage flow of content from Jupiter into Swift for preservation
|
459
492
|
test_files: []
|