lyber-core 0.9.6.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
+