lyber-core 0.9.6.2
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.
- data/LICENSE +20 -0
- data/README.rdoc +58 -0
- data/lib/dlss_service.rb +82 -0
- data/lib/dor/base.rb +18 -0
- data/lib/dor/suri_service.rb +28 -0
- data/lib/dor/workflow_service.rb +111 -0
- data/lib/dor_service.rb +535 -0
- data/lib/lyber_core.rb +14 -0
- data/lib/lyber_core/connection.rb +97 -0
- data/lib/lyber_core/destroyer.rb +74 -0
- data/lib/lyber_core/exceptions/empty_queue.rb +9 -0
- data/lib/lyber_core/log.rb +105 -0
- data/lib/lyber_core/rake/dlss_release.rb +126 -0
- data/lib/lyber_core/robots/robot.rb +214 -0
- data/lib/lyber_core/robots/work_item.rb +103 -0
- data/lib/lyber_core/robots/work_queue.rb +154 -0
- data/lib/lyber_core/robots/workflow.rb +104 -0
- data/lib/lyber_core/robots/workspace.rb +77 -0
- data/lib/lyber_core/utils.rb +4 -0
- data/lib/lyber_core/utils/bagit_bag.rb +100 -0
- data/lib/lyber_core/utils/checksum_validate.rb +65 -0
- data/lib/lyber_core/utils/file_utilities.rb +168 -0
- data/lib/roxml_models/identity_metadata/dublin_core.rb +46 -0
- data/lib/roxml_models/identity_metadata/identity_metadata.rb +118 -0
- data/lib/tasks/rdoc.rake +32 -0
- metadata +371 -0
@@ -0,0 +1,65 @@
|
|
1
|
+
require 'nokogiri'
|
2
|
+
require 'active_support'
|
3
|
+
|
4
|
+
module LyberCore
|
5
|
+
module Utils
|
6
|
+
class ChecksumValidate
|
7
|
+
#Code here
|
8
|
+
|
9
|
+
def self.compare_hashes(hash1, hash2)
|
10
|
+
return (hash1 == hash2)
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.get_hash_differences(hash1, hash2)
|
14
|
+
return hash1.diff(hash2)
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.md5_hash_from_md5sum(md5sum)
|
18
|
+
checksum_hash = {}
|
19
|
+
md5sum.each do |line|
|
20
|
+
line.chomp!
|
21
|
+
digest,filename = line.split(/[ *]{2}/)
|
22
|
+
checksum_hash[filename] = digest.downcase
|
23
|
+
end
|
24
|
+
return checksum_hash
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.md5_hash_from_mets(mets)
|
28
|
+
mets_checksum_hash = {}
|
29
|
+
doc = Nokogiri::XML(mets)
|
30
|
+
doc.xpath('/mets:mets/mets:fileSec//mets:file', {'mets' => 'http://www.loc.gov/METS/'}).each do |filenode|
|
31
|
+
digest = filenode.attribute('CHECKSUM')
|
32
|
+
if (digest)
|
33
|
+
flocat = filenode.xpath('mets:FLocat', {'mets' => 'http://www.loc.gov/METS/'}).first
|
34
|
+
if (flocat)
|
35
|
+
filename = flocat.attribute_with_ns('href', 'http://www.w3.org/1999/xlink')
|
36
|
+
if (filename)
|
37
|
+
mets_checksum_hash[filename.text] = digest.text.downcase
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
return mets_checksum_hash
|
43
|
+
end
|
44
|
+
|
45
|
+
def self.md5_hash_from_content_metadata(content_md)
|
46
|
+
content_md_checksum_hash = {}
|
47
|
+
doc = Nokogiri::XML(content_md)
|
48
|
+
doc.xpath('/contentMetadata/resource/file').each do |filenode|
|
49
|
+
filename = filenode.attribute('id')
|
50
|
+
if (filename)
|
51
|
+
md5_element = filenode.xpath('checksum[@type="MD5"]').first
|
52
|
+
if (md5_element)
|
53
|
+
digest = md5_element.text
|
54
|
+
if (digest)
|
55
|
+
content_md_checksum_hash[filename.text] = digest.downcase
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
return content_md_checksum_hash
|
61
|
+
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,168 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
require 'systemu'
|
3
|
+
|
4
|
+
# File Utilities for use in transferring filesystem objects,
|
5
|
+
# decrypting a file, unpacking a targz archive, and validating checksums
|
6
|
+
# Author:: rnanders@stanford.edu
|
7
|
+
module LyberCore
|
8
|
+
module Utils
|
9
|
+
class FileUtilities
|
10
|
+
|
11
|
+
|
12
|
+
# Executes a system command in a subprocess
|
13
|
+
#
|
14
|
+
# = Inputs:
|
15
|
+
# * command = the command to be executed
|
16
|
+
#
|
17
|
+
# = Return value:
|
18
|
+
# * The method will return stdout from the command if execution was successful.
|
19
|
+
# * The method will raise an exception if if execution fails
|
20
|
+
# The exception's message will contain the explaination of the failure.
|
21
|
+
def FileUtilities.execute(command)
|
22
|
+
status, stdout, stderr = systemu(command)
|
23
|
+
if (status.exitstatus != 0)
|
24
|
+
raise stderr
|
25
|
+
end
|
26
|
+
return stdout
|
27
|
+
rescue
|
28
|
+
raise "Command failed to execute: #{command}"
|
29
|
+
end
|
30
|
+
|
31
|
+
# Generates a dirname for storing or retrieving a file in
|
32
|
+
# "pair tree" hierachical structure, where the path is derived
|
33
|
+
# from segments of a barcode string
|
34
|
+
#
|
35
|
+
# = Input:
|
36
|
+
# * barcode = barcode string
|
37
|
+
#
|
38
|
+
# = Return value:
|
39
|
+
# * A string containing a slash-delimited dirname derived from the barcode
|
40
|
+
def FileUtilities.pair_tree_from_barcode(barcode)
|
41
|
+
if (barcode.class != String)
|
42
|
+
raise "Barcode must be a String"
|
43
|
+
end
|
44
|
+
# figure out if this is a SUL barcode or from coordinate library
|
45
|
+
library_prefix=barcode[0..4]
|
46
|
+
if ( library_prefix == '36105' )
|
47
|
+
pair_tree=barcode[5..10].gsub(/(..)/, '\1/')
|
48
|
+
else
|
49
|
+
library_prefix=barcode[0..2]
|
50
|
+
pair_tree=barcode[3..8].gsub(/(..)/, '\1/')
|
51
|
+
end
|
52
|
+
return "#{library_prefix}/#{pair_tree}"
|
53
|
+
end
|
54
|
+
|
55
|
+
# Transfers a filesystem object (file or directory)
|
56
|
+
# from a source to a target location. Uses rsync in "archive" mode
|
57
|
+
# over an ssh connection.
|
58
|
+
#
|
59
|
+
# = Inputs:
|
60
|
+
# * filename = basename of the filesystem object to be transferred
|
61
|
+
# * source_dir = dirname of the source location from which the object is read
|
62
|
+
# * dest_dir = dirname of the target location to which the object is written
|
63
|
+
# If one of the locations is on a remote server, then the dirname should be
|
64
|
+
# prefixed with user@hosthame:
|
65
|
+
#
|
66
|
+
# = Return value:
|
67
|
+
# * The method will return true if the transfer is successful.
|
68
|
+
# * The method will raise an exception if either the rsync command fails,
|
69
|
+
# or a test for the existence of the transferred object fails.
|
70
|
+
# The exception's message will contain the explaination of the failure
|
71
|
+
#
|
72
|
+
# Network transfers will only succeed if the appropriate public key
|
73
|
+
# authentication has been previously set up.
|
74
|
+
def FileUtilities.transfer_object(filename, source_dir, dest_dir)
|
75
|
+
source_path=File.join(source_dir, filename)
|
76
|
+
rsync='rsync -a -e ssh '
|
77
|
+
rsync_cmd = rsync + "'" + source_path + "' " + dest_dir
|
78
|
+
LyberCore::Log.debug("rsync command is: #{rsync_cmd}")
|
79
|
+
self.execute(rsync_cmd)
|
80
|
+
if not File.exists?(File.join(dest_dir, filename))
|
81
|
+
raise "#{filename} is not found in #{dest_dir}"
|
82
|
+
end
|
83
|
+
return true
|
84
|
+
end
|
85
|
+
|
86
|
+
# Decrypts a GPG encrypted file using the "gpg" command
|
87
|
+
#
|
88
|
+
# = Inputs:
|
89
|
+
# * workspace_dir = dirname containing the file
|
90
|
+
# * targzgpg = the filename of the GPG encrypted file
|
91
|
+
# * targz = the filename of the unencrypted file
|
92
|
+
# * passphrase = the string used to decrypt the file
|
93
|
+
#
|
94
|
+
# = Return value:
|
95
|
+
# * The method will return true if the decryption is successful.
|
96
|
+
# * The method will raise an exception if either the decryption command fails,
|
97
|
+
# or a test for the existence of the decrypted file fails.
|
98
|
+
# The exception's message will contain the explaination of the failure
|
99
|
+
def FileUtilities.gpgdecrypt(workspace_dir, targzgpg, targz, passphrase)
|
100
|
+
LyberCore::Log.debug("decrypting #{targzgpg}")
|
101
|
+
gpg_cmd="/usr/bin/gpg --passphrase '#{passphrase}' " +
|
102
|
+
"--batch --no-mdc-warning --no-secmem-warning " +
|
103
|
+
" --output " + File.join(workspace_dir, targz) +
|
104
|
+
" --decrypt " + File.join(workspace_dir, targzgpg)
|
105
|
+
self.execute(gpg_cmd)
|
106
|
+
if not File.exists?(File.join(workspace_dir, targz))
|
107
|
+
raise "#{targz} was not created in #{workspace_dir}"
|
108
|
+
end
|
109
|
+
return true
|
110
|
+
end
|
111
|
+
|
112
|
+
# Unpacks a TAR-ed, GZipped archive using a "tar -xzf" command
|
113
|
+
#
|
114
|
+
# = Inputs:
|
115
|
+
# * original_dir = dirname containing the archive file
|
116
|
+
# * targz = the filename of the archive file
|
117
|
+
# * destination_dir = the target directory into which the contents are written
|
118
|
+
#
|
119
|
+
# = Return value:
|
120
|
+
# * The method will return true if the unpacking is successful.
|
121
|
+
# * The method will raise an exception if either the unpack command fails,
|
122
|
+
# or a test for the existence of files in the target directory fails.
|
123
|
+
# The exception's message will contain the explaination of the failure.
|
124
|
+
def FileUtilities.unpack(original_dir, targz, destination_dir)
|
125
|
+
LyberCore::Log.debug("unpacking #{targz}")
|
126
|
+
FileUtils.mkdir_p(destination_dir)
|
127
|
+
dir_save = Dir.pwd
|
128
|
+
Dir.chdir(destination_dir)
|
129
|
+
unpack_cmd="tar -xzf " + File.join(original_dir, targz)
|
130
|
+
self.execute(unpack_cmd)
|
131
|
+
if not (Dir.entries(destination_dir).length > 0)
|
132
|
+
raise "#{destination_dir} is empty"
|
133
|
+
end
|
134
|
+
return true
|
135
|
+
ensure
|
136
|
+
Dir.chdir(dir_save)
|
137
|
+
end
|
138
|
+
|
139
|
+
# Verifies MD5 checksums for the files in a directory
|
140
|
+
# against the checksum values in the supplied file
|
141
|
+
# (Uses md5sum command)
|
142
|
+
#
|
143
|
+
# = Inputs:
|
144
|
+
# * directory = dirname containing the file to be checked
|
145
|
+
# * checksum_file = the name of the file containing the expected checksums
|
146
|
+
#
|
147
|
+
# = Return value:
|
148
|
+
# * The method will return true if the verification is successful.
|
149
|
+
# * The method will raise an exception if either the md5sum command fails,
|
150
|
+
# or a test of the md5sum output indicates a checksum mismatch.
|
151
|
+
# The exception's message will contain the explaination of the failure.
|
152
|
+
def FileUtilities.verify_checksums(directory, checksum_file)
|
153
|
+
LyberCore::Log.debug("verifying checksums in #{directory}")
|
154
|
+
dir_save = Dir.pwd
|
155
|
+
Dir.chdir(directory)
|
156
|
+
checksum_cmd = 'md5sum -c ' + checksum_file + ' | grep -v OK | wc -l'
|
157
|
+
badcount = self.execute(checksum_cmd).to_i
|
158
|
+
if not (badcount==0)
|
159
|
+
raise "#{badcount} files had bad checksums"
|
160
|
+
end
|
161
|
+
return true
|
162
|
+
ensure
|
163
|
+
Dir.chdir(dir_save)
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
end
|
168
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'roxml'
|
3
|
+
|
4
|
+
#<oai_dc:dc xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:oai_dc="http://www.openarchives.org/OAI/2.0/oai_dc/"
|
5
|
+
#xmlns:srw_dc="info:srw/schema/1/dc-schema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
6
|
+
#xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/oai_dc/ http://cosimo.stanford.edu/standards/oai_dc/v2/oai_dc.xsd">
|
7
|
+
# <dc:title>Life of Abraham Lincoln, sixteenth president of the United States: Containing his early
|
8
|
+
#history and political career; together with the speeches, messages, proclamations and other official
|
9
|
+
#documents illus. of his eventful administration</dc:title>
|
10
|
+
# <dc:creator>Crosby, Frank.</dc:creator>
|
11
|
+
# <dc:format>text</dc:format>
|
12
|
+
# <dc:language>eng</dc:language>
|
13
|
+
# <dc:subject>E457 .C94</dc:subject>
|
14
|
+
# <dc:identifier>lccn:11030686</dc:identifier>
|
15
|
+
# <dc:identifier>callseq:1</dc:identifier>
|
16
|
+
# <dc:identifier>shelfseq:973.7111 .L731CR</dc:identifier>
|
17
|
+
# <dc:identifier>catkey:1206382</dc:identifier>
|
18
|
+
# <dc:identifier>barcode:36105005459602</dc:identifier>
|
19
|
+
# <dc:identifier>uuid:ddcf5f1a-0331-4345-beca-e66f7db276eb</dc:identifier>
|
20
|
+
# <dc:identifier>google:STANFORD_36105005459602</dc:identifier>
|
21
|
+
# <dc:identifier>druid:ng786kn0371</dc:identifier>
|
22
|
+
#</oai_dc:dc>
|
23
|
+
|
24
|
+
class DublinCore
|
25
|
+
include ROXML
|
26
|
+
xml_namespaces \
|
27
|
+
:oai_dc => "http://www.openarchives.org/OAI/2.0/oai_dc/",
|
28
|
+
:dc => "http://purl.org/dc/elements/1.1/"
|
29
|
+
|
30
|
+
xml_name :root => 'oai_dc:dc'
|
31
|
+
xml_reader :title, :as => [], :from => 'dc:title'
|
32
|
+
xml_reader :creator, :as => [], :from => 'dc:creator'
|
33
|
+
xml_reader :subject, :as => [], :from => 'dc:subject'
|
34
|
+
xml_reader :description, :as => [], :from => 'dc:description'
|
35
|
+
xml_reader :publisher, :as => [], :from => 'dc:publisher'
|
36
|
+
xml_reader :contributor, :as => [], :from => 'dc:contributor'
|
37
|
+
xml_reader :date, :as => [], :from => 'dc:date'
|
38
|
+
xml_reader :type, :as => [], :from => 'dc:type'
|
39
|
+
xml_reader :format, :as => [], :from => 'dc:format'
|
40
|
+
xml_reader :identifier, :as => [], :from => 'dc:identifier'
|
41
|
+
xml_reader :source, :as => [], :from => 'dc:source'
|
42
|
+
xml_reader :language, :as => [], :from => 'dc:language'
|
43
|
+
xml_reader :relation, :as => [], :from => 'dc:relation'
|
44
|
+
xml_reader :coverage, :as => [], :from => 'dc:coverage'
|
45
|
+
xml_reader :rights, :as => [], :from => 'dc:rights'
|
46
|
+
end
|
@@ -0,0 +1,118 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'roxml'
|
3
|
+
|
4
|
+
#<identityMetadata>
|
5
|
+
# <objectId>druid:rt923jk342</objectId>
|
6
|
+
# <objectType>item</objectType>
|
7
|
+
# <objectLabel>google download barcode 36105049267078</objectLabel>
|
8
|
+
# <objectCreator>DOR</objectCreator>
|
9
|
+
# <citationTitle>Squirrels of North America</citationTitle>
|
10
|
+
# <citationCreator>Eder, Tamara, 1974-</citationCreator>
|
11
|
+
# <sourceId source="google">STANFORD_342837261527</sourceId>
|
12
|
+
# <otherId name="barcode">342837261527</otherId>
|
13
|
+
# <otherId name="catkey">129483625</otherId>
|
14
|
+
# <otherId name="uuid">7f3da130-7b02-11de-8a39-0800200c9a66</otherId>
|
15
|
+
# <agreementId>druid:yh72ms9133</agreementId>
|
16
|
+
# <tag>Google Books : Phase 1</tag>
|
17
|
+
# <tag>Google Books : Scan source STANFORD</tag>
|
18
|
+
#</identityMetadata>
|
19
|
+
|
20
|
+
class SourceId
|
21
|
+
include ROXML
|
22
|
+
|
23
|
+
xml_name :sourceId
|
24
|
+
xml_accessor :source, :from => '@source'
|
25
|
+
xml_accessor :value, :from => :content
|
26
|
+
end
|
27
|
+
|
28
|
+
class OtherId
|
29
|
+
include ROXML
|
30
|
+
|
31
|
+
xml_name :otherId
|
32
|
+
xml_accessor :name, :from => '@name'
|
33
|
+
xml_accessor :value, :from => :content
|
34
|
+
end
|
35
|
+
|
36
|
+
class Tag
|
37
|
+
include ROXML
|
38
|
+
xml_name :tag
|
39
|
+
xml_accessor :value, :from => :content
|
40
|
+
end
|
41
|
+
|
42
|
+
class IdentityMetadata
|
43
|
+
include ROXML
|
44
|
+
|
45
|
+
xml_name :identityMetadata
|
46
|
+
xml_accessor :objectId
|
47
|
+
xml_accessor :objectType
|
48
|
+
xml_accessor :objectAdminClass
|
49
|
+
xml_accessor :objectLabel
|
50
|
+
xml_accessor :objectCreator
|
51
|
+
xml_accessor :citationTitle
|
52
|
+
xml_accessor :citationCreator
|
53
|
+
xml_accessor :sourceId, :as => SourceId
|
54
|
+
xml_accessor :otherIds, :as => [OtherId]
|
55
|
+
xml_accessor :agreementId
|
56
|
+
xml_accessor :tags, :as => [Tag]
|
57
|
+
|
58
|
+
# Add a new tag to the IdentityMetadata instance
|
59
|
+
def add_tag(new_tag_value)
|
60
|
+
# Make sure tag is not already present
|
61
|
+
for tag in @tags do
|
62
|
+
if (tag.value == new_tag_value )
|
63
|
+
return
|
64
|
+
end
|
65
|
+
end
|
66
|
+
tag = Tag.new
|
67
|
+
tag.value = new_tag_value
|
68
|
+
@tags << tag
|
69
|
+
end
|
70
|
+
|
71
|
+
# Return the OtherId object for the specified identier name
|
72
|
+
def get_other_id(key)
|
73
|
+
if (@otherIds != nil)
|
74
|
+
for other_id in @otherIds do
|
75
|
+
return other_id if (other_id.name == key)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
return nil
|
79
|
+
end
|
80
|
+
|
81
|
+
# Return the identifier value for the specified identier name
|
82
|
+
def get_identifier_value(key)
|
83
|
+
other_id = self.get_other_id(key)
|
84
|
+
if (other_id != nil)
|
85
|
+
return other_id.value
|
86
|
+
end
|
87
|
+
raise "No #{key} indentifier found for druid #{@objectId}"
|
88
|
+
end
|
89
|
+
|
90
|
+
# Add a new name,value pair to the set of identifiers
|
91
|
+
def add_identifier(key, value)
|
92
|
+
other_id = self.get_other_id(key)
|
93
|
+
if (other_id != nil)
|
94
|
+
other_id.value = value
|
95
|
+
else
|
96
|
+
other_id = OtherId.new
|
97
|
+
other_id.name = key
|
98
|
+
other_id.value = value
|
99
|
+
if (@otherIds == nil)
|
100
|
+
@otherIds = [other_id]
|
101
|
+
else
|
102
|
+
@otherIds << other_id
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
# Return an array of strings where each entry consists of name:value
|
108
|
+
def get_id_pairs
|
109
|
+
pairs=Array.new
|
110
|
+
if (@otherIds != nil)
|
111
|
+
@otherIds.each do |other_id|
|
112
|
+
pairs << "#{other_id.name}:#{other_id.value}"
|
113
|
+
end
|
114
|
+
end
|
115
|
+
return pairs
|
116
|
+
end
|
117
|
+
|
118
|
+
end
|
data/lib/tasks/rdoc.rake
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
desc "Generate RDoc"
|
2
|
+
task :doc => ['doc:generate']
|
3
|
+
|
4
|
+
namespace :doc do
|
5
|
+
project_root = File.expand_path(File.join(File.dirname(__FILE__), '..', '..'))
|
6
|
+
doc_destination = File.join(project_root, 'rdoc')
|
7
|
+
|
8
|
+
begin
|
9
|
+
require 'yard'
|
10
|
+
require 'yard/rake/yardoc_task'
|
11
|
+
|
12
|
+
YARD::Rake::YardocTask.new(:generate) do |yt|
|
13
|
+
yt.files = Dir.glob(File.join(project_root, 'lib', '*.rb')) +
|
14
|
+
Dir.glob(File.join(project_root, 'lib', '**', '*.rb')) +
|
15
|
+
[ File.join(project_root, 'README.rdoc') ] +
|
16
|
+
[ File.join(project_root, 'LICENSE') ]
|
17
|
+
|
18
|
+
yt.options = ['--output-dir', doc_destination, '--readme', 'README.rdoc']
|
19
|
+
end
|
20
|
+
rescue LoadError
|
21
|
+
desc "Generate YARD Documentation"
|
22
|
+
task :generate do
|
23
|
+
abort "Please install the YARD gem to generate rdoc."
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
desc "Remove generated documenation"
|
28
|
+
task :clean do
|
29
|
+
rm_r doc_destination if File.exists?(doc_destination)
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
metadata
ADDED
@@ -0,0 +1,371 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: lyber-core
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 27
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 9
|
9
|
+
- 6
|
10
|
+
- 2
|
11
|
+
version: 0.9.6.2
|
12
|
+
platform: ruby
|
13
|
+
authors:
|
14
|
+
- Alpana Pande
|
15
|
+
- Bess Sadler
|
16
|
+
- Chris Fitzpatrick
|
17
|
+
- Douglas Kim
|
18
|
+
- Richard Anderson
|
19
|
+
- Willy Mene
|
20
|
+
autorequire:
|
21
|
+
bindir: bin
|
22
|
+
cert_chain: []
|
23
|
+
|
24
|
+
date: 2010-12-14 00:00:00 -08:00
|
25
|
+
default_executable:
|
26
|
+
dependencies:
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
29
|
+
none: false
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
hash: 3
|
34
|
+
segments:
|
35
|
+
- 0
|
36
|
+
version: "0"
|
37
|
+
type: :runtime
|
38
|
+
name: actionpack
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: *id001
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
43
|
+
none: false
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
hash: 19
|
48
|
+
segments:
|
49
|
+
- 1
|
50
|
+
- 2
|
51
|
+
- 6
|
52
|
+
version: 1.2.6
|
53
|
+
type: :runtime
|
54
|
+
name: active-fedora
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: *id002
|
57
|
+
- !ruby/object:Gem::Dependency
|
58
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
59
|
+
none: false
|
60
|
+
requirements:
|
61
|
+
- - ">="
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
hash: 27
|
64
|
+
segments:
|
65
|
+
- 0
|
66
|
+
- 1
|
67
|
+
- 0
|
68
|
+
version: 0.1.0
|
69
|
+
type: :runtime
|
70
|
+
name: bagit
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: *id003
|
73
|
+
- !ruby/object:Gem::Dependency
|
74
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
75
|
+
none: false
|
76
|
+
requirements:
|
77
|
+
- - "="
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
hash: 113
|
80
|
+
segments:
|
81
|
+
- 1
|
82
|
+
- 4
|
83
|
+
- 3
|
84
|
+
- 1
|
85
|
+
version: 1.4.3.1
|
86
|
+
type: :runtime
|
87
|
+
name: nokogiri
|
88
|
+
prerelease: false
|
89
|
+
version_requirements: *id004
|
90
|
+
- !ruby/object:Gem::Dependency
|
91
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
92
|
+
none: false
|
93
|
+
requirements:
|
94
|
+
- - <=
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
hash: 9
|
97
|
+
segments:
|
98
|
+
- 3
|
99
|
+
- 1
|
100
|
+
- 5
|
101
|
+
version: 3.1.5
|
102
|
+
type: :runtime
|
103
|
+
name: roxml
|
104
|
+
prerelease: false
|
105
|
+
version_requirements: *id005
|
106
|
+
- !ruby/object:Gem::Dependency
|
107
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
108
|
+
none: false
|
109
|
+
requirements:
|
110
|
+
- - ">="
|
111
|
+
- !ruby/object:Gem::Version
|
112
|
+
hash: 15
|
113
|
+
segments:
|
114
|
+
- 0
|
115
|
+
- 0
|
116
|
+
- 8
|
117
|
+
version: 0.0.8
|
118
|
+
type: :runtime
|
119
|
+
name: solr-ruby
|
120
|
+
prerelease: false
|
121
|
+
version_requirements: *id006
|
122
|
+
- !ruby/object:Gem::Dependency
|
123
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
124
|
+
none: false
|
125
|
+
requirements:
|
126
|
+
- - ">="
|
127
|
+
- !ruby/object:Gem::Version
|
128
|
+
hash: 17
|
129
|
+
segments:
|
130
|
+
- 0
|
131
|
+
- 3
|
132
|
+
- 1
|
133
|
+
version: 0.3.1
|
134
|
+
type: :runtime
|
135
|
+
name: solrizer
|
136
|
+
prerelease: false
|
137
|
+
version_requirements: *id007
|
138
|
+
- !ruby/object:Gem::Dependency
|
139
|
+
requirement: &id008 !ruby/object:Gem::Requirement
|
140
|
+
none: false
|
141
|
+
requirements:
|
142
|
+
- - ">="
|
143
|
+
- !ruby/object:Gem::Version
|
144
|
+
hash: 31
|
145
|
+
segments:
|
146
|
+
- 1
|
147
|
+
- 2
|
148
|
+
- 0
|
149
|
+
version: 1.2.0
|
150
|
+
type: :runtime
|
151
|
+
name: systemu
|
152
|
+
prerelease: false
|
153
|
+
version_requirements: *id008
|
154
|
+
- !ruby/object:Gem::Dependency
|
155
|
+
requirement: &id009 !ruby/object:Gem::Requirement
|
156
|
+
none: false
|
157
|
+
requirements:
|
158
|
+
- - ">="
|
159
|
+
- !ruby/object:Gem::Version
|
160
|
+
hash: 3
|
161
|
+
segments:
|
162
|
+
- 0
|
163
|
+
version: "0"
|
164
|
+
type: :runtime
|
165
|
+
name: validatable
|
166
|
+
prerelease: false
|
167
|
+
version_requirements: *id009
|
168
|
+
- !ruby/object:Gem::Dependency
|
169
|
+
requirement: &id010 !ruby/object:Gem::Requirement
|
170
|
+
none: false
|
171
|
+
requirements:
|
172
|
+
- - ">="
|
173
|
+
- !ruby/object:Gem::Version
|
174
|
+
hash: 3
|
175
|
+
segments:
|
176
|
+
- 0
|
177
|
+
version: "0"
|
178
|
+
type: :development
|
179
|
+
name: fakeweb
|
180
|
+
prerelease: false
|
181
|
+
version_requirements: *id010
|
182
|
+
- !ruby/object:Gem::Dependency
|
183
|
+
requirement: &id011 !ruby/object:Gem::Requirement
|
184
|
+
none: false
|
185
|
+
requirements:
|
186
|
+
- - ">="
|
187
|
+
- !ruby/object:Gem::Version
|
188
|
+
hash: 3
|
189
|
+
segments:
|
190
|
+
- 0
|
191
|
+
version: "0"
|
192
|
+
type: :development
|
193
|
+
name: haml
|
194
|
+
prerelease: false
|
195
|
+
version_requirements: *id011
|
196
|
+
- !ruby/object:Gem::Dependency
|
197
|
+
requirement: &id012 !ruby/object:Gem::Requirement
|
198
|
+
none: false
|
199
|
+
requirements:
|
200
|
+
- - ">="
|
201
|
+
- !ruby/object:Gem::Version
|
202
|
+
hash: 3
|
203
|
+
segments:
|
204
|
+
- 0
|
205
|
+
version: "0"
|
206
|
+
type: :development
|
207
|
+
name: pony
|
208
|
+
prerelease: false
|
209
|
+
version_requirements: *id012
|
210
|
+
- !ruby/object:Gem::Dependency
|
211
|
+
requirement: &id013 !ruby/object:Gem::Requirement
|
212
|
+
none: false
|
213
|
+
requirements:
|
214
|
+
- - ">="
|
215
|
+
- !ruby/object:Gem::Version
|
216
|
+
hash: 49
|
217
|
+
segments:
|
218
|
+
- 0
|
219
|
+
- 8
|
220
|
+
- 7
|
221
|
+
version: 0.8.7
|
222
|
+
type: :development
|
223
|
+
name: rake
|
224
|
+
prerelease: false
|
225
|
+
version_requirements: *id013
|
226
|
+
- !ruby/object:Gem::Dependency
|
227
|
+
requirement: &id014 !ruby/object:Gem::Requirement
|
228
|
+
none: false
|
229
|
+
requirements:
|
230
|
+
- - ">="
|
231
|
+
- !ruby/object:Gem::Version
|
232
|
+
hash: 3
|
233
|
+
segments:
|
234
|
+
- 0
|
235
|
+
version: "0"
|
236
|
+
type: :development
|
237
|
+
name: rcov
|
238
|
+
prerelease: false
|
239
|
+
version_requirements: *id014
|
240
|
+
- !ruby/object:Gem::Dependency
|
241
|
+
requirement: &id015 !ruby/object:Gem::Requirement
|
242
|
+
none: false
|
243
|
+
requirements:
|
244
|
+
- - ">="
|
245
|
+
- !ruby/object:Gem::Version
|
246
|
+
hash: 3
|
247
|
+
segments:
|
248
|
+
- 0
|
249
|
+
version: "0"
|
250
|
+
type: :development
|
251
|
+
name: rdoc
|
252
|
+
prerelease: false
|
253
|
+
version_requirements: *id015
|
254
|
+
- !ruby/object:Gem::Dependency
|
255
|
+
requirement: &id016 !ruby/object:Gem::Requirement
|
256
|
+
none: false
|
257
|
+
requirements:
|
258
|
+
- - <
|
259
|
+
- !ruby/object:Gem::Version
|
260
|
+
hash: 3
|
261
|
+
segments:
|
262
|
+
- 2
|
263
|
+
- 0
|
264
|
+
version: "2.0"
|
265
|
+
type: :development
|
266
|
+
name: rspec
|
267
|
+
prerelease: false
|
268
|
+
version_requirements: *id016
|
269
|
+
- !ruby/object:Gem::Dependency
|
270
|
+
requirement: &id017 !ruby/object:Gem::Requirement
|
271
|
+
none: false
|
272
|
+
requirements:
|
273
|
+
- - ">="
|
274
|
+
- !ruby/object:Gem::Version
|
275
|
+
hash: 3
|
276
|
+
segments:
|
277
|
+
- 0
|
278
|
+
version: "0"
|
279
|
+
type: :development
|
280
|
+
name: ruby-debug
|
281
|
+
prerelease: false
|
282
|
+
version_requirements: *id017
|
283
|
+
- !ruby/object:Gem::Dependency
|
284
|
+
requirement: &id018 !ruby/object:Gem::Requirement
|
285
|
+
none: false
|
286
|
+
requirements:
|
287
|
+
- - ">="
|
288
|
+
- !ruby/object:Gem::Version
|
289
|
+
hash: 3
|
290
|
+
segments:
|
291
|
+
- 0
|
292
|
+
version: "0"
|
293
|
+
type: :development
|
294
|
+
name: yard
|
295
|
+
prerelease: false
|
296
|
+
version_requirements: *id018
|
297
|
+
description: |-
|
298
|
+
Contains classes to make http connections with a client-cert, use Jhove, and call Suri
|
299
|
+
Also contains core classes to build robots
|
300
|
+
email:
|
301
|
+
- wmene@stanford.edu
|
302
|
+
executables: []
|
303
|
+
|
304
|
+
extensions: []
|
305
|
+
|
306
|
+
extra_rdoc_files: []
|
307
|
+
|
308
|
+
files:
|
309
|
+
- lib/dlss_service.rb
|
310
|
+
- lib/dor/base.rb
|
311
|
+
- lib/dor/suri_service.rb
|
312
|
+
- lib/dor/workflow_service.rb
|
313
|
+
- lib/dor_service.rb
|
314
|
+
- lib/lyber_core/connection.rb
|
315
|
+
- lib/lyber_core/destroyer.rb
|
316
|
+
- lib/lyber_core/exceptions/empty_queue.rb
|
317
|
+
- lib/lyber_core/log.rb
|
318
|
+
- lib/lyber_core/rake/dlss_release.rb
|
319
|
+
- lib/lyber_core/robots/robot.rb
|
320
|
+
- lib/lyber_core/robots/work_item.rb
|
321
|
+
- lib/lyber_core/robots/work_queue.rb
|
322
|
+
- lib/lyber_core/robots/workflow.rb
|
323
|
+
- lib/lyber_core/robots/workspace.rb
|
324
|
+
- lib/lyber_core/utils/bagit_bag.rb
|
325
|
+
- lib/lyber_core/utils/checksum_validate.rb
|
326
|
+
- lib/lyber_core/utils/file_utilities.rb
|
327
|
+
- lib/lyber_core/utils.rb
|
328
|
+
- lib/lyber_core.rb
|
329
|
+
- lib/roxml_models/identity_metadata/dublin_core.rb
|
330
|
+
- lib/roxml_models/identity_metadata/identity_metadata.rb
|
331
|
+
- lib/tasks/rdoc.rake
|
332
|
+
- LICENSE
|
333
|
+
- README.rdoc
|
334
|
+
has_rdoc: true
|
335
|
+
homepage: http://github.com/wmene/lyber-core
|
336
|
+
licenses: []
|
337
|
+
|
338
|
+
post_install_message:
|
339
|
+
rdoc_options: []
|
340
|
+
|
341
|
+
require_paths:
|
342
|
+
- lib
|
343
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
344
|
+
none: false
|
345
|
+
requirements:
|
346
|
+
- - ">="
|
347
|
+
- !ruby/object:Gem::Version
|
348
|
+
hash: 3
|
349
|
+
segments:
|
350
|
+
- 0
|
351
|
+
version: "0"
|
352
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
353
|
+
none: false
|
354
|
+
requirements:
|
355
|
+
- - ">="
|
356
|
+
- !ruby/object:Gem::Version
|
357
|
+
hash: 23
|
358
|
+
segments:
|
359
|
+
- 1
|
360
|
+
- 3
|
361
|
+
- 6
|
362
|
+
version: 1.3.6
|
363
|
+
requirements: []
|
364
|
+
|
365
|
+
rubyforge_project:
|
366
|
+
rubygems_version: 1.3.7
|
367
|
+
signing_key:
|
368
|
+
specification_version: 3
|
369
|
+
summary: Core services used by the SULAIR Digital Library
|
370
|
+
test_files: []
|
371
|
+
|