mrt-ingest 0.0.4 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.gitignore +5 -1
- data/.idea/.rakeTasks +7 -0
- data/.idea/encodings.xml +4 -0
- data/.idea/inspectionProfiles/Project_Default.xml +18 -0
- data/.idea/misc.xml +32 -0
- data/.idea/modules.xml +8 -0
- data/.idea/vcs.xml +6 -0
- data/.rubocop.yml +87 -0
- data/.ruby-version +2 -0
- data/CHANGES.md +25 -0
- data/Gemfile +1 -4
- data/README.md +56 -0
- data/Rakefile +36 -17
- data/lib/mrt/ingest.rb +1 -16
- data/lib/mrt/ingest/client.rb +11 -10
- data/lib/mrt/ingest/component.rb +78 -0
- data/lib/mrt/ingest/ingest_exception.rb +6 -0
- data/lib/mrt/ingest/iobject.rb +36 -93
- data/lib/mrt/ingest/message_digest.rb +8 -10
- data/lib/mrt/ingest/one_time_server.rb +34 -44
- data/lib/mrt/ingest/request.rb +67 -41
- data/lib/mrt/ingest/response.rb +6 -6
- data/mrt-ingest-ruby.iml +65 -0
- data/mrt-ingest.gemspec +22 -20
- data/spec/.rubocop.yml +16 -0
- data/spec/spec_helper.rb +36 -0
- data/spec/unit/data/file.txt +1 -0
- data/spec/unit/mrt/ingest/client_spec.rb +31 -0
- data/spec/unit/mrt/ingest/component_spec.rb +12 -0
- data/spec/unit/mrt/ingest/iobject_spec.rb +248 -0
- data/spec/unit/mrt/ingest/message_digest_spec.rb +38 -0
- data/spec/unit/mrt/ingest/one_time_server_spec.rb +113 -0
- data/spec/unit/mrt/ingest/request_spec.rb +25 -0
- data/spec/unit/mrt/ingest/response_spec.rb +56 -0
- metadata +95 -15
- data/README +0 -29
- data/test/test_client.rb +0 -40
- data/test/test_iobject.rb +0 -174
- data/test/test_request.rb +0 -37
- data/test/test_response.rb +0 -63
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 564379d9be6c8e4625b31c7960d31927edf00d8c
|
4
|
+
data.tar.gz: 9329f69b68d2235082bc6e030d7d44529080094c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '0801ccf1a414ffdbb70882036771d4e63b2138274658873e65b3df68b8b3d8e26e2ebc004d18aed3042158300ef8a0cfc21d40b10302eb4138c7f80e96fa40f6'
|
7
|
+
data.tar.gz: d0e324c585de1f785c8d3c54bb0217ceedb0bece034fe6694b966b72cd0cc87d57fe231c71446d9f70eef4dcffff37ac4f3e7d71393270576a858a322ebe99cb
|
data/.gitignore
CHANGED
@@ -4,6 +4,9 @@
|
|
4
4
|
# Gemfile.lock should be checked in for apps, but not for libraries
|
5
5
|
Gemfile.lock
|
6
6
|
|
7
|
+
# github-markdown-preview previews
|
8
|
+
*.md.html
|
9
|
+
|
7
10
|
###########################
|
8
11
|
#### Generated ignores ####
|
9
12
|
|
@@ -69,7 +72,8 @@ build-iPhoneSimulator/
|
|
69
72
|
.LSOverride
|
70
73
|
|
71
74
|
# Icon must end with two \r
|
72
|
-
Icon
|
75
|
+
Icon
|
76
|
+
|
73
77
|
|
74
78
|
# Thumbnails
|
75
79
|
._*
|
data/.idea/.rakeTasks
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<Settings><!--This file was automatically generated by Ruby plugin.
|
3
|
+
You are allowed to:
|
4
|
+
1. Remove rake task
|
5
|
+
2. Add existing rake tasks
|
6
|
+
To add existing rake tasks automatically delete this file and reload the project.
|
7
|
+
--><RakeGroup description="" fullCmd="" taksId="rake"><RakeTask description="Build mrt-ingest-0.0.5.gem into the pkg directory" fullCmd="build" taksId="build" /><RakeTask description="Remove RDoc HTML files" fullCmd="clobber_rdoc" taksId="clobber_rdoc" /><RakeTask description="Build and install mrt-ingest-0.0.5.gem into system gems" fullCmd="install" taksId="install" /><RakeGroup description="" fullCmd="" taksId="install"><RakeTask description="Build and install mrt-ingest-0.0.5.gem into system gems without network access" fullCmd="install:local" taksId="local" /></RakeGroup><RakeTask description="Build RDoc HTML files" fullCmd="rdoc" taksId="rdoc" /><RakeTask description="Create tag v0.0.5 and build and push mrt-ingest-0.0.5.gem to rubygems.org" fullCmd="release[remote]" taksId="release[remote]" /><RakeTask description="Rebuild RDoc HTML files" fullCmd="rerdoc" taksId="rerdoc" /><RakeTask description="Run tests" fullCmd="test" taksId="test" /><RakeTask description="" fullCmd="clobber" taksId="clobber" /><RakeTask description="" fullCmd="default" taksId="default" /><RakeTask description="" fullCmd="html" taksId="html" /><RakeTask description="" fullCmd="html/created.rid" taksId="html/created.rid" /><RakeTask description="" fullCmd="release" taksId="release" /><RakeGroup description="" fullCmd="" taksId="release"><RakeTask description="" fullCmd="release:guard_clean" taksId="guard_clean" /><RakeTask description="" fullCmd="release:rubygem_push" taksId="rubygem_push" /><RakeTask description="" fullCmd="release:source_control_push" taksId="source_control_push" /></RakeGroup></RakeGroup></Settings>
|
data/.idea/encodings.xml
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
<component name="InspectionProjectProfileManager">
|
2
|
+
<profile version="1.0">
|
3
|
+
<option name="myName" value="Project Default" />
|
4
|
+
<inspection_tool class="ConvertOneChainedExprToSafeNavigation" enabled="true" level="INFORMATION" enabled_by_default="true" />
|
5
|
+
<inspection_tool class="GoNameStartsWithPackageName" enabled="false" level="WEAK WARNING" enabled_by_default="false" />
|
6
|
+
<inspection_tool class="GoSnakeCaseUsage" enabled="false" level="WEAK WARNING" enabled_by_default="false" />
|
7
|
+
<inspection_tool class="GoUnusedGlobalVariable" enabled="false" level="WEAK WARNING" enabled_by_default="false" />
|
8
|
+
<inspection_tool class="GoUnusedVariable" enabled="true" level="WARNING" enabled_by_default="true" />
|
9
|
+
<inspection_tool class="Rubocop" enabled="false" level="WARNING" enabled_by_default="false" />
|
10
|
+
<inspection_tool class="RubyStringKeysInHashInspection" enabled="false" level="WARNING" enabled_by_default="false" />
|
11
|
+
<inspection_tool class="RubyTooManyInstanceVariablesInspection" enabled="false" level="WARNING" enabled_by_default="false" />
|
12
|
+
<inspection_tool class="SpellCheckingInspection" enabled="false" level="TYPO" enabled_by_default="false">
|
13
|
+
<option name="processCode" value="true" />
|
14
|
+
<option name="processLiterals" value="true" />
|
15
|
+
<option name="processComments" value="true" />
|
16
|
+
</inspection_tool>
|
17
|
+
</profile>
|
18
|
+
</component>
|
data/.idea/misc.xml
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<project version="4">
|
3
|
+
<component name="GoImports">
|
4
|
+
<option name="optimizeImportsOnTheFly" value="false" />
|
5
|
+
</component>
|
6
|
+
<component name="NodePackageJsonFileManager">
|
7
|
+
<packageJsonPaths />
|
8
|
+
</component>
|
9
|
+
<component name="ProjectInspectionProfilesVisibleTreeState">
|
10
|
+
<entry key="Project Default">
|
11
|
+
<profile-state>
|
12
|
+
<expanded-state>
|
13
|
+
<State />
|
14
|
+
<State>
|
15
|
+
<id>Declaration redundancyGo</id>
|
16
|
+
</State>
|
17
|
+
<State>
|
18
|
+
<id>Go</id>
|
19
|
+
</State>
|
20
|
+
</expanded-state>
|
21
|
+
<selected-state>
|
22
|
+
<State>
|
23
|
+
<id>GoUnusedLabel</id>
|
24
|
+
</State>
|
25
|
+
</selected-state>
|
26
|
+
</profile-state>
|
27
|
+
</entry>
|
28
|
+
</component>
|
29
|
+
<component name="ProjectRootManager" version="2" languageLevel="JDK_11" default="false" project-jdk-name="RVM: ruby-2.4.4" project-jdk-type="RUBY_SDK">
|
30
|
+
<output url="file://$PROJECT_DIR$/out" />
|
31
|
+
</component>
|
32
|
+
</project>
|
data/.idea/modules.xml
ADDED
@@ -0,0 +1,8 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<project version="4">
|
3
|
+
<component name="ProjectModuleManager">
|
4
|
+
<modules>
|
5
|
+
<module fileurl="file://$PROJECT_DIR$/mrt-ingest-ruby.iml" filepath="$PROJECT_DIR$/mrt-ingest-ruby.iml" />
|
6
|
+
</modules>
|
7
|
+
</component>
|
8
|
+
</project>
|
data/.idea/vcs.xml
ADDED
data/.rubocop.yml
ADDED
@@ -0,0 +1,87 @@
|
|
1
|
+
AllCops:
|
2
|
+
# Suppress complaints about post-2.0 syntax
|
3
|
+
TargetRubyVersion: 2.4
|
4
|
+
# Exclude IDEA coverage output
|
5
|
+
Exclude:
|
6
|
+
- 'out/**/*'
|
7
|
+
|
8
|
+
# Allow one line around block body (Layout/EmptyLines will still disallow two or more)
|
9
|
+
Layout/EmptyLinesAroundBlockBody:
|
10
|
+
Enabled: false
|
11
|
+
|
12
|
+
# Allow one line around class body (Layout/EmptyLines will still disallow two or more)
|
13
|
+
Layout/EmptyLinesAroundClassBody:
|
14
|
+
Enabled: false
|
15
|
+
|
16
|
+
# Allow one line around module body (Layout/EmptyLines will still disallow two or more)
|
17
|
+
Layout/EmptyLinesAroundModuleBody:
|
18
|
+
Enabled: false
|
19
|
+
|
20
|
+
# Make indents consistent regardless of the lengths of variables and method names and whatnot
|
21
|
+
Layout/MultilineMethodCallIndentation:
|
22
|
+
EnforcedStyle: indented
|
23
|
+
|
24
|
+
# Produces monsters
|
25
|
+
Layout/MultilineOperationIndentation:
|
26
|
+
Enabled: false
|
27
|
+
|
28
|
+
# Reasonable line-length check; it's too easy for the cure to be worse than the disease
|
29
|
+
Metrics/LineLength:
|
30
|
+
Max: 150
|
31
|
+
|
32
|
+
# Confusing and weird
|
33
|
+
Naming/VariableNumber:
|
34
|
+
Enabled: False
|
35
|
+
|
36
|
+
# We meant to do that
|
37
|
+
Naming/MemoizedInstanceVariableName:
|
38
|
+
Enabled: False
|
39
|
+
|
40
|
+
# It works in context, trust us
|
41
|
+
Naming/UncommunicativeMethodParamName:
|
42
|
+
Enabled: False
|
43
|
+
|
44
|
+
# Do what's readable in the context you're in
|
45
|
+
Style/AccessModifierDeclarations:
|
46
|
+
Enabled: false
|
47
|
+
|
48
|
+
# 👎 to cultural imperialism
|
49
|
+
Style/AsciiComments:
|
50
|
+
Enabled: false
|
51
|
+
|
52
|
+
# Sometimes we want to distinguish hash parameters from keyword arguments
|
53
|
+
Style/BracesAroundHashParameters:
|
54
|
+
Enabled: False
|
55
|
+
|
56
|
+
# Seriously?
|
57
|
+
Style/CommentedKeyword:
|
58
|
+
Enabled: False
|
59
|
+
|
60
|
+
# Disable problematic module documentation check (see https://github.com/bbatsov/rubocop/issues/947)
|
61
|
+
Style/Documentation:
|
62
|
+
Enabled: false
|
63
|
+
|
64
|
+
# Adding more line noise to format strings will not improve them
|
65
|
+
Style/FormatStringToken:
|
66
|
+
Enabled: false
|
67
|
+
|
68
|
+
# Putting '# frozen_string_literal: true' everywhere does not make the world a better place
|
69
|
+
Style/FrozenStringLiteralComment:
|
70
|
+
Enabled: false
|
71
|
+
|
72
|
+
# `foo.positive?` is cute, but it's not actually more readable than `foo > 0`
|
73
|
+
Style/NumericPredicate:
|
74
|
+
Enabled: false
|
75
|
+
|
76
|
+
# The semantics of `foo&.bar` are a lot less interchangeable with `foo && foo.bar` than RuboCop thinks
|
77
|
+
Style/SafeNavigation:
|
78
|
+
Enabled: false
|
79
|
+
|
80
|
+
# Requiring the lambda() method just makes wordy calls wordier
|
81
|
+
Style/Lambda:
|
82
|
+
EnforcedStyle: literal
|
83
|
+
|
84
|
+
# Unclear why it's a good idea to give parameters semantically meaningless names
|
85
|
+
Style/SingleLineBlockParams:
|
86
|
+
Enabled: false
|
87
|
+
|
data/.ruby-version
ADDED
data/CHANGES.md
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
## 0.0.5 (2019-05-17)
|
2
|
+
|
3
|
+
- Invalid arguments (nil required parameters, string URLs where `URI` objects are expected, etc.)
|
4
|
+
now raise `ArgumentError` instead of `IngestException`.
|
5
|
+
- Removes prefetch option from 0.0.3, which we weren't using, and which added complexity.
|
6
|
+
|
7
|
+
### Developer notes
|
8
|
+
|
9
|
+
- Updates code for Ruby 2.4
|
10
|
+
- Adds RuboCop style checks
|
11
|
+
- Replaces Test::Unit with RSpec
|
12
|
+
|
13
|
+
## 0.0.4 (2018-10-23)
|
14
|
+
|
15
|
+
- Updates `json` gem from `~> 1.5` to `~> 2.0`
|
16
|
+
- Updates `rest-client` gem from `~> 1.6` to `~> 2.0`
|
17
|
+
|
18
|
+
## 0.0.3 (2018-10-23)
|
19
|
+
|
20
|
+
- Adds prefetch option for remote URLs
|
21
|
+
- Ensures one-time server is only started once
|
22
|
+
|
23
|
+
## 0.0.2 (2011-12-19)
|
24
|
+
|
25
|
+
- First public release
|
data/Gemfile
CHANGED
@@ -1,7 +1,4 @@
|
|
1
|
-
source
|
1
|
+
source 'http://rubygems.org'
|
2
2
|
|
3
3
|
# Specify your gem's dependencies in mrt-ingest.gemspec
|
4
4
|
gemspec
|
5
|
-
|
6
|
-
# TODO: remove this (in favor of gemspec) once there's a 2.4-compatible release
|
7
|
-
gem 'fakeweb', git: 'https://github.com/chrisk/fakeweb.git', ref: '2b08c1f'
|
data/README.md
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
# mrt-ingest (ruby)
|
2
|
+
|
3
|
+
[![Build Status](https://travis-ci.org/CDLUC3/mrt-ingest-ruby.svg?branch=master)](https://travis-ci.org/CDLUC3/mrt-ingest-ruby)
|
4
|
+
|
5
|
+
## What?
|
6
|
+
|
7
|
+
A Ruby ingest client for [Merritt](https://merritt.cdlib.org/).
|
8
|
+
|
9
|
+
## Install
|
10
|
+
|
11
|
+
```
|
12
|
+
$ gem build mrt-ingest.gemspec
|
13
|
+
$ sudo gem install mrt-ingest-0.0.1.gem
|
14
|
+
```
|
15
|
+
|
16
|
+
## Usage
|
17
|
+
|
18
|
+
The code below creates a new Merritt object with content consisting of two local files
|
19
|
+
and one remote URL. The object is submitted to Merritt as a manifest, with the manifest,
|
20
|
+
local files, and `mrt-erc.txt` made available to Ingest by an
|
21
|
+
[Mrt::Ingest::OneTimeServer](lib/mrt/ingest/one_time_server.rb)
|
22
|
+
-- a simple WEBrick-based server that finds itself an open port, serves each file from
|
23
|
+
a temporary directory, and when all files have been served, shuts down.
|
24
|
+
|
25
|
+
```ruby
|
26
|
+
require 'mrt/ingest'
|
27
|
+
|
28
|
+
client = Mrt::Ingest::Client.new(
|
29
|
+
"http://merritt.cdlib.org/object/ingest",
|
30
|
+
USERNAME,
|
31
|
+
PASSWORD
|
32
|
+
)
|
33
|
+
ingest_profile = "demo_merritt_content"
|
34
|
+
user_agent = "me/My Name"
|
35
|
+
|
36
|
+
obj = Mrt::Ingest::IObject.new(
|
37
|
+
erc: {
|
38
|
+
"who" => "Doe, John",
|
39
|
+
"what" => "Hello, world",
|
40
|
+
"when/created" => "2011"
|
41
|
+
}
|
42
|
+
)
|
43
|
+
obj.add_component(File.new("/tmp/helloworld_a"))
|
44
|
+
obj.add_component(File.new("/tmp/helloworld_b"))
|
45
|
+
obj.add_component(
|
46
|
+
URI.parse("http://example.org/xxx"),
|
47
|
+
name: "helloworld_c",
|
48
|
+
digest: Mrt::Ingest::MessageDigest::MD5.new("6f5902ac237024bdd0c176cb93063dc4")
|
49
|
+
)
|
50
|
+
|
51
|
+
obj.start_ingest(client, ingest_profile, user_agent)
|
52
|
+
obj.finish_ingest # waits for all files to be served, then shuts down
|
53
|
+
```
|
54
|
+
|
55
|
+
For a more detailed example, see the [Merritt::Atom](https://github.com/CDLUC3/mrt-dashboard/tree/master/lib/merritt/atom)
|
56
|
+
module of the Merritt dashboard.
|
data/Rakefile
CHANGED
@@ -1,21 +1,40 @@
|
|
1
|
-
#
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
require '
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
1
|
+
# ------------------------------------------------------------
|
2
|
+
# RSpec
|
3
|
+
|
4
|
+
require 'rspec/core'
|
5
|
+
require 'rspec/core/rake_task'
|
6
|
+
|
7
|
+
namespace :spec do
|
8
|
+
|
9
|
+
desc 'Run all unit tests'
|
10
|
+
RSpec::Core::RakeTask.new(:unit) do |task|
|
11
|
+
task.rspec_opts = %w[--color --format documentation --order default]
|
12
|
+
task.pattern = 'unit/**/*_spec.rb'
|
13
|
+
end
|
14
|
+
|
15
|
+
task all: [:unit]
|
14
16
|
end
|
15
17
|
|
16
|
-
|
17
|
-
|
18
|
-
|
18
|
+
desc 'Run all tests'
|
19
|
+
task spec: 'spec:all'
|
20
|
+
|
21
|
+
# ------------------------------------------------------------
|
22
|
+
# Coverage
|
19
23
|
|
20
|
-
|
24
|
+
desc 'Run all unit tests with coverage'
|
25
|
+
task :coverage do
|
26
|
+
ENV['COVERAGE'] = 'true'
|
27
|
+
Rake::Task['spec:unit'].execute
|
21
28
|
end
|
29
|
+
|
30
|
+
# ------------------------------------------------------------
|
31
|
+
# RuboCop
|
32
|
+
|
33
|
+
require 'rubocop/rake_task'
|
34
|
+
RuboCop::RakeTask.new
|
35
|
+
|
36
|
+
# ------------------------------------------------------------
|
37
|
+
# Defaults
|
38
|
+
|
39
|
+
desc 'Run unit tests, check test coverage, run acceptance tests, check code style'
|
40
|
+
task default: %i[coverage rubocop]
|
data/lib/mrt/ingest.rb
CHANGED
@@ -1,16 +1 @@
|
|
1
|
-
|
2
|
-
# Copyright:: Copyright (c) 2011, Regents of the University of California
|
3
|
-
|
4
|
-
module Mrt
|
5
|
-
module Ingest
|
6
|
-
autoload :Client, "mrt/ingest/client"
|
7
|
-
autoload :IObject, "mrt/ingest/iobject"
|
8
|
-
autoload :MessageDigest, "mrt/ingest/message_digest"
|
9
|
-
autoload :OneTimeServer, "mrt/ingest/one_time_server"
|
10
|
-
autoload :Request, "mrt/ingest/request"
|
11
|
-
autoload :Response, "mrt/ingest/response"
|
12
|
-
|
13
|
-
class IngestException < Exception
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
1
|
+
Dir.glob(File.expand_path('ingest/*.rb', __dir__)).sort.each(&method(:require))
|
data/lib/mrt/ingest/client.rb
CHANGED
@@ -10,7 +10,7 @@ module Mrt
|
|
10
10
|
|
11
11
|
# A client for ingesting objects into a Merritt.
|
12
12
|
class Client
|
13
|
-
def initialize(base_uri, username=nil, password=nil)
|
13
|
+
def initialize(base_uri, username = nil, password = nil)
|
14
14
|
@base_uri = base_uri
|
15
15
|
@username = username
|
16
16
|
@password = password
|
@@ -18,19 +18,20 @@ module Mrt
|
|
18
18
|
|
19
19
|
# Send a request to the client.
|
20
20
|
def ingest(ingest_req)
|
21
|
-
|
21
|
+
Response.new(mk_rest_request(ingest_req).execute)
|
22
22
|
end
|
23
23
|
|
24
24
|
# :nodoc:
|
25
25
|
def mk_rest_request(ingest_req)
|
26
|
-
args = {
|
27
|
-
:
|
28
|
-
:
|
29
|
-
:
|
30
|
-
:
|
31
|
-
:
|
32
|
-
:
|
33
|
-
|
26
|
+
args = {
|
27
|
+
method: :post,
|
28
|
+
url: @base_uri,
|
29
|
+
user: @username,
|
30
|
+
password: @password,
|
31
|
+
payload: ingest_req.mk_args,
|
32
|
+
headers: { multipart: true }
|
33
|
+
}.delete_if { |_k, v| (v.nil? || v == '') }
|
34
|
+
RestClient::Request.new(args)
|
34
35
|
end
|
35
36
|
|
36
37
|
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
require 'digest/md5'
|
2
|
+
|
3
|
+
module Mrt
|
4
|
+
module Ingest
|
5
|
+
# Represents a component of an object to ingest. Either a #URI or a
|
6
|
+
# #File.
|
7
|
+
class Component # :nodoc:
|
8
|
+
|
9
|
+
attr_reader :server, :uri
|
10
|
+
|
11
|
+
def initialize(server, location, options)
|
12
|
+
@server = server
|
13
|
+
@name = options[:name]
|
14
|
+
@digest = options[:digest]
|
15
|
+
@mime_type = options[:mime_type]
|
16
|
+
@size = options[:size]
|
17
|
+
|
18
|
+
init_uri(location)
|
19
|
+
end
|
20
|
+
|
21
|
+
class << self
|
22
|
+
def from_erc(server, erc)
|
23
|
+
return Component.new(server, erc, name: 'mrt-erc.txt') if erc.is_a?(URI) || erc.is_a?(File)
|
24
|
+
return from_hash(server, erc) if erc.is_a?(Hash)
|
25
|
+
|
26
|
+
raise ArgumentError, 'Bad ERC supplied: must be a URI, File, or Hash'
|
27
|
+
end
|
28
|
+
|
29
|
+
def from_hash(server, erc_h)
|
30
|
+
uri_str, path = server.add_file do |f|
|
31
|
+
f.write("erc:\n")
|
32
|
+
erc_h.each_pair { |k, v| f.write("#{k}: #{v}\n") }
|
33
|
+
end
|
34
|
+
|
35
|
+
digest = Mrt::Ingest::MessageDigest::MD5.from_file(File.new(path))
|
36
|
+
Component.new(server, URI.parse(uri_str), name: 'mrt-erc.txt', digest: digest)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def to_manifest_entry
|
41
|
+
"#{@uri} | #{digest_type} | #{digest_value} | #{@size} | | #{@name} | #{@mime_type}\n"
|
42
|
+
end
|
43
|
+
|
44
|
+
def digest_type
|
45
|
+
@digest && @digest.type
|
46
|
+
end
|
47
|
+
|
48
|
+
def digest_value
|
49
|
+
@digest && @digest.value
|
50
|
+
end
|
51
|
+
|
52
|
+
private
|
53
|
+
|
54
|
+
def file_like?(location)
|
55
|
+
[File, Tempfile].any? { |c| location.is_a?(c) }
|
56
|
+
end
|
57
|
+
|
58
|
+
def init_uri(location)
|
59
|
+
return init_from_file(location) if file_like?(location)
|
60
|
+
return init_from_uri(location) if location.is_a?(URI)
|
61
|
+
|
62
|
+
raise ArgumentError, "Trying to add a component that is not a File or URI: #{location}"
|
63
|
+
end
|
64
|
+
|
65
|
+
def init_from_file(file)
|
66
|
+
@name = File.basename(file.path) if @name.nil?
|
67
|
+
@uri = server.add_file(file)[0]
|
68
|
+
@digest = Mrt::Ingest::MessageDigest::MD5.from_file(file) if @digest.nil?
|
69
|
+
@size = File.size(file.path) if @size.nil?
|
70
|
+
end
|
71
|
+
|
72
|
+
def init_from_uri(uri)
|
73
|
+
@name = File.basename(uri.to_s) if @name.nil?
|
74
|
+
@uri = uri
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|