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.
@@ -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
@@ -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
+