ucf 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/Changes.rdoc ADDED
@@ -0,0 +1,7 @@
1
+ = Changes log for the UCF Ruby Gem
2
+
3
+ == About this Changes file
4
+
5
+ This file is, at least in part, generated by the following command:
6
+
7
+ $ git log --pretty=format:"* %s" --reverse --no-merges <commit-hash>..
data/Licence.rdoc ADDED
@@ -0,0 +1,29 @@
1
+ Copyright (c) 2013 The University of Manchester, UK.
2
+
3
+ All rights reserved.
4
+
5
+ Redistribution and use in source and binary forms, with or without
6
+ modification, are permitted provided that the following conditions are met:
7
+
8
+ * Redistributions of source code must retain the above copyright notice,
9
+ this list of conditions and the following disclaimer.
10
+
11
+ * Redistributions in binary form must reproduce the above copyright notice,
12
+ this list of conditions and the following disclaimer in the documentation
13
+ and/or other materials provided with the distribution.
14
+
15
+ * Neither the names of The University of Manchester nor the names of its
16
+ contributors may be used to endorse or promote products derived from this
17
+ software without specific prior written permission.
18
+
19
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
23
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29
+ POSSIBILITY OF SUCH DAMAGE.
data/Rakefile ADDED
@@ -0,0 +1,83 @@
1
+ # Copyright (c) 2013 The University of Manchester, UK.
2
+ #
3
+ # All rights reserved.
4
+ #
5
+ # Redistribution and use in source and binary forms, with or without
6
+ # modification, are permitted provided that the following conditions are met:
7
+ #
8
+ # * Redistributions of source code must retain the above copyright notice,
9
+ # this list of conditions and the following disclaimer.
10
+ #
11
+ # * Redistributions in binary form must reproduce the above copyright notice,
12
+ # this list of conditions and the following disclaimer in the documentation
13
+ # and/or other materials provided with the distribution.
14
+ #
15
+ # * Neither the names of The University of Manchester nor the names of its
16
+ # contributors may be used to endorse or promote products derived from this
17
+ # software without specific prior written permission.
18
+ #
19
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21
+ # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22
+ # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
23
+ # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24
+ # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25
+ # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26
+ # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27
+ # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28
+ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29
+ # POSSIBILITY OF SUCH DAMAGE.
30
+ #
31
+ # Author: Robert Haines
32
+
33
+ require 'rubygems'
34
+ require 'rake'
35
+ require 'rake/clean'
36
+ require 'rake/testtask'
37
+ require 'rdoc/task'
38
+ require 'jeweler'
39
+
40
+ # we need to add lib to the path because we're not installed yet!
41
+ $LOAD_PATH.unshift File.join(File.dirname(__FILE__), "lib")
42
+ require 'ucf'
43
+
44
+ task :default => [:test]
45
+
46
+ Jeweler::Tasks.new do |s|
47
+ s.name = "ucf"
48
+ s.version = UCF::Version::STRING
49
+ s.authors = ["Robert Haines"]
50
+ s.email = ["support@mygrid.org.uk"]
51
+ s.homepage = "http://www.taverna.org.uk/"
52
+ s.platform = Gem::Platform::RUBY
53
+ s.summary = "Universal Container Format (UCF) Ruby Library"
54
+ s.description = "A Ruby library for working with Universal Container "\
55
+ "Format files. See "\
56
+ "https://learn.adobe.com/wiki/display/PDFNAV/Universal+Container+Format "\
57
+ "for the specification."
58
+ s.require_path = "lib"
59
+ s.test_file = "test/ts_ucf.rb"
60
+ s.has_rdoc = true
61
+ s.extra_rdoc_files = ["ReadMe.rdoc", "Licence.rdoc", "Changes.rdoc"]
62
+ s.rdoc_options = ["-N", "--tab-width=2", "--main=ReadMe.rdoc"]
63
+ s.add_development_dependency('rake', '~> 10.0.4')
64
+ s.add_development_dependency('rdoc', '~> 4.0.1')
65
+ s.add_development_dependency('jeweler', '~> 1.8.4')
66
+ s.add_runtime_dependency('rubyzip', '~> 0.9.9')
67
+ end
68
+
69
+ Rake::TestTask.new do |t|
70
+ t.libs << "test"
71
+ t.test_files = FileList['test/ts_ucf.rb']
72
+ t.verbose = true
73
+ end
74
+
75
+ RDoc::Task.new do |r|
76
+ r.main = "ReadMe.rdoc"
77
+ lib = Dir.glob("lib/**/*.rb")
78
+ r.rdoc_files.include("ReadMe.rdoc", "Licence.rdoc", "Changes.rdoc", lib)
79
+ r.options << "-t Universal Container Format Ruby Library version " +
80
+ "#{UCF::Version::STRING}"
81
+ r.options << "-N"
82
+ r.options << "--tab-width=2"
83
+ end
data/ReadMe.rdoc ADDED
@@ -0,0 +1,36 @@
1
+ = Universal Container Format (UCF) Ruby Library
2
+
3
+ Authors:: Robert Haines
4
+ Contact:: mailto:support@mygrid.org.uk
5
+ URL:: http://www.taverna.org.uk/
6
+ Licence:: BSD (See Licence file or http://www.opensource.org/licenses/bsd-license.php)
7
+ Copyright:: (c) 2013 The University of Manchester, UK
8
+
9
+
10
+ == Synopsis
11
+
12
+ This is a Ruby library for working with UCF files.
13
+
14
+ See https://learn.adobe.com/wiki/display/PDFNAV/Universal+Container+Format
15
+
16
+ This library is a work in progress!
17
+
18
+ Examples are provided in the examples directory.
19
+
20
+ == What this library can not do yet
21
+
22
+ The basic requirements of a UCF file are all implemented but there are a
23
+ number of optional features that are not yet provided.
24
+
25
+ * In memory operation. Presently all operations are performed on files that
26
+ are resident on disk.
27
+ * META-INF directory support. Everything within the META-INF directory is
28
+ optional but will supported in a near future version.
29
+ * Changing the mimetype. It is not certain that this is a sensible operation
30
+ but is being considered for a future version.
31
+ * Digital signatures (this feature has been deferred until a future revision
32
+ of the UCF specification. It will be supported by this gem when it is added
33
+ to the specification).
34
+ * Encryption (this feature has been deferred until a future revision of the
35
+ UCF specification. It will be supported by this gem when it is added to the
36
+ specification).
@@ -0,0 +1,58 @@
1
+ # Copyright (c) 2013 The University of Manchester, UK.
2
+ #
3
+ # All rights reserved.
4
+ #
5
+ # Redistribution and use in source and binary forms, with or without
6
+ # modification, are permitted provided that the following conditions are met:
7
+ #
8
+ # * Redistributions of source code must retain the above copyright notice,
9
+ # this list of conditions and the following disclaimer.
10
+ #
11
+ # * Redistributions in binary form must reproduce the above copyright notice,
12
+ # this list of conditions and the following disclaimer in the documentation
13
+ # and/or other materials provided with the distribution.
14
+ #
15
+ # * Neither the names of The University of Manchester nor the names of its
16
+ # contributors may be used to endorse or promote products derived from this
17
+ # software without specific prior written permission.
18
+ #
19
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21
+ # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22
+ # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
23
+ # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24
+ # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25
+ # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26
+ # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27
+ # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28
+ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29
+ # POSSIBILITY OF SUCH DAMAGE.
30
+ #
31
+ # Author: Robert Haines
32
+
33
+ require 'rubygems'
34
+ require 'ucf'
35
+
36
+ ZIP_FILE = "example.zip"
37
+ file = ARGV.length > 0 ? ARGV[0] : ZIP_FILE
38
+
39
+ File.delete(file) if File.exists?(file)
40
+
41
+ begin
42
+ UCF::Container.create(file) do |c|
43
+
44
+ # Add a cheery greeting file from a string.
45
+ c.file.open("greeting.txt", "w") do |f|
46
+ f.puts "Hello, World!"
47
+ end
48
+
49
+ # Create a subdirectory.
50
+ c.dir.mkdir("dir")
51
+
52
+ # Copy this example code in straight from a file.
53
+ c.add("dir/code.rb", __FILE__)
54
+ end
55
+ rescue UCF::MalformedUCFError, Zip::ZipError => err
56
+ puts err.to_s
57
+ exit 1
58
+ end
@@ -0,0 +1,44 @@
1
+ # Copyright (c) 2013 The University of Manchester, UK.
2
+ #
3
+ # All rights reserved.
4
+ #
5
+ # Redistribution and use in source and binary forms, with or without
6
+ # modification, are permitted provided that the following conditions are met:
7
+ #
8
+ # * Redistributions of source code must retain the above copyright notice,
9
+ # this list of conditions and the following disclaimer.
10
+ #
11
+ # * Redistributions in binary form must reproduce the above copyright notice,
12
+ # this list of conditions and the following disclaimer in the documentation
13
+ # and/or other materials provided with the distribution.
14
+ #
15
+ # * Neither the names of The University of Manchester nor the names of its
16
+ # contributors may be used to endorse or promote products derived from this
17
+ # software without specific prior written permission.
18
+ #
19
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21
+ # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22
+ # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
23
+ # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24
+ # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25
+ # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26
+ # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27
+ # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28
+ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29
+ # POSSIBILITY OF SUCH DAMAGE.
30
+ #
31
+ # Author: Robert Haines
32
+
33
+ require 'rubygems'
34
+ require 'ucf'
35
+
36
+ ZIP_FILE = "example.zip"
37
+ file = ARGV.length > 0 ? ARGV[0] : ZIP_FILE
38
+
39
+ begin
40
+ UCF::Container.verify!(file)
41
+ rescue UCF::MalformedUCFError, Zip::ZipError => err
42
+ puts err.to_s
43
+ exit 1
44
+ end
@@ -0,0 +1,344 @@
1
+ # Copyright (c) 2013 The University of Manchester, UK.
2
+ #
3
+ # All rights reserved.
4
+ #
5
+ # Redistribution and use in source and binary forms, with or without
6
+ # modification, are permitted provided that the following conditions are met:
7
+ #
8
+ # * Redistributions of source code must retain the above copyright notice,
9
+ # this list of conditions and the following disclaimer.
10
+ #
11
+ # * Redistributions in binary form must reproduce the above copyright notice,
12
+ # this list of conditions and the following disclaimer in the documentation
13
+ # and/or other materials provided with the distribution.
14
+ #
15
+ # * Neither the names of The University of Manchester nor the names of its
16
+ # contributors may be used to endorse or promote products derived from this
17
+ # software without specific prior written permission.
18
+ #
19
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21
+ # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22
+ # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
23
+ # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24
+ # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25
+ # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26
+ # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27
+ # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28
+ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29
+ # POSSIBILITY OF SUCH DAMAGE.
30
+ #
31
+ # Author: Robert Haines
32
+
33
+ require 'forwardable'
34
+ require 'zip/zipfilesystem'
35
+
36
+ module UCF
37
+
38
+ # This class represents a UCF file in PK Zip format. See
39
+ # https://learn.adobe.com/wiki/display/PDFNAV/Universal+Container+Format
40
+ # for more details.
41
+ #
42
+ # This class mostly provides all the facilities of the <tt>Zip::ZipFile</tt>
43
+ # class in the rubyzip gem. Please also consult the rubyzip documentation:
44
+ # http://rubydoc.info/gems/rubyzip/0.9.9/frames
45
+ #
46
+ # There are code examples available with the source code of this library.
47
+ class Container
48
+
49
+ extend Forwardable
50
+ def_delegators :@zipfile, :add, :close, :comment, :commit, :dir, :extract,
51
+ :file, :find_entry, :get_entry, :get_input_stream, :get_output_stream,
52
+ :glob, :mkdir, :name, :read
53
+
54
+ private_class_method :new
55
+
56
+ # The mime-type of this UCF file. By default this is
57
+ # "application/epub+zip".
58
+ attr_reader :mimetype
59
+
60
+ # :stopdoc:
61
+ DEFAULT_MIMETYPE = "application/epub+zip"
62
+ MIMETYPE_FILE = "mimetype"
63
+
64
+ ERR_MT_NONE = "Not a UCF file. 'mimetype' file is missing."
65
+ ERR_MT_BAD_OFF = "Not a UCF file. 'mimetype' file is not at offset 0."
66
+ ERR_MT_BAD_COMP = "Not a UCF file. 'mimetype' file is compressed."
67
+
68
+ def initialize(filename)
69
+ @zipfile = open_and_check_ucf(filename)
70
+
71
+ @mimetype = read_mimetype
72
+ end
73
+ # :startdoc:
74
+
75
+ # :call-seq:
76
+ # Container.create(filename, mimetype = "application/epub+zip") -> container
77
+ # Container.create(filename, mimetype = "application/epub+zip") {|container| ...}
78
+ #
79
+ # Create a new UCF file on disk with the specified mimetype.
80
+ def Container.create(filename, mimetype = DEFAULT_MIMETYPE, &block)
81
+ ::Zip::ZipOutputStream.open(filename) do |stream|
82
+ stream.put_next_entry(MIMETYPE_FILE, nil, nil, ::Zip::ZipEntry::STORED)
83
+ stream.write mimetype
84
+ end
85
+
86
+ Container.open(filename, &block)
87
+ end
88
+
89
+ # :call-seq:
90
+ # Container.open(filename) -> container
91
+ # Container.open(filename) {|container| ...}
92
+ #
93
+ # Open an existing UCF file from disk. It will be checked for conformance
94
+ # to the UCF specification upon first access.
95
+ def Container.open(filename, &block)
96
+ c = new(filename)
97
+
98
+ if block_given?
99
+ begin
100
+ yield c
101
+ ensure
102
+ c.close
103
+ end
104
+ end
105
+
106
+ c
107
+ end
108
+
109
+ # :call-seq:
110
+ # Container.verify(filename) -> boolean
111
+ #
112
+ # Verify that the specified UCF file conforms to the UCF specification.
113
+ # This method returns +false+ if there are any problems at all with the
114
+ # file (including if it can't be found) or +true+ if it conforms.
115
+ def Container.verify(filename)
116
+ begin
117
+ Container.verify!(filename)
118
+ rescue
119
+ return false
120
+ end
121
+
122
+ true
123
+ end
124
+
125
+ # :call-seq:
126
+ # Container.verify!(filename)
127
+ #
128
+ # Verify that the specified UCF file conforms to the UCF specification.
129
+ # This method raises exceptions when errors are found or if there is
130
+ # something fundamental wrong with the file itself (e.g. not found).
131
+ def Container.verify!(filename)
132
+ new(filename)
133
+ nil
134
+ end
135
+
136
+ # :call-seq:
137
+ # remove(entry)
138
+ #
139
+ # Removes the specified entry. If asked to remove the special mimetype
140
+ # header file this method will do nothing.
141
+ def remove(entry)
142
+ return if mimetype_entry?(entry)
143
+ @zipfile.remove(entry)
144
+ end
145
+
146
+ # :call-seq:
147
+ # rename(entry, new_name, &continueOnExistsProc)
148
+ #
149
+ # Renames the specified entry. If asked to rename the special mimetype
150
+ # header file this method will do nothing. See the rubyzip documentation
151
+ # for details of the +continue_on_exists_proc+ parameter.
152
+ def rename(entry, new_name, &continue_on_exists_proc)
153
+ return if mimetype_entry?(entry)
154
+ @zipfile.rename(entry, new_name, continue_on_exists_proc)
155
+ end
156
+
157
+ # :call-seq:
158
+ # replace(entry, src_path)
159
+ #
160
+ # Replaces the specified entry with the contents of +src_path+ (from the
161
+ # file system). If asked to replace the special mimetype header file this
162
+ # method will do nothing.
163
+ def replace(entry, src_path)
164
+ return if mimetype_entry?(entry)
165
+ @zipfile.replace(entry, src_path)
166
+ end
167
+
168
+ # :call-seq:
169
+ # to_s -> String
170
+ #
171
+ # Return a String representation of this UCF file.
172
+ def to_s
173
+ @zipfile.to_s + " - #{@mimetype}"
174
+ end
175
+
176
+ private
177
+
178
+ def open_and_check_ucf(filename)
179
+ file = ::Zip::ZipFile.new(filename)
180
+
181
+ # Check mimetype file is present and correct.
182
+ entry = file.find_entry(MIMETYPE_FILE)
183
+ raise MalformedUCFError.new(ERR_MT_NONE) if entry.nil?
184
+ raise MalformedUCFError.new(ERR_MT_BAD_OFF) if entry.localHeaderOffset != 0
185
+ if entry.compression_method != ::Zip::ZipEntry::STORED
186
+ raise MalformedUCFError.new(ERR_MT_BAD_COMP)
187
+ end
188
+
189
+ file
190
+ end
191
+
192
+ def read_mimetype
193
+ @zipfile.read(MIMETYPE_FILE)
194
+ end
195
+
196
+ def mimetype_entry?(entry)
197
+ name = entry.kind_of?(ZipEntry) ? entry.name : entry
198
+ name == MIMETYPE_FILE
199
+ end
200
+
201
+ public
202
+
203
+ # Lots of extra docs out of the way at the end here...
204
+
205
+ ##
206
+ # :method: add
207
+ # :call-seq:
208
+ # add(entry, src_path, &continue_on_exists_proc)
209
+ #
210
+ # Convenience method for adding the contents of a file to the UCF file.
211
+ #
212
+ # See the rubyzip documentation for details of the
213
+ # +continue_on_exists_proc+ parameter.
214
+
215
+ ##
216
+ # :method: close
217
+ # :call-seq:
218
+ # close
219
+ #
220
+ # Closes the UCF file committing any changes that have been made.
221
+
222
+ ##
223
+ # :method: comment
224
+ # :call-seq:
225
+ # comment -> String
226
+ #
227
+ # Returns the UCF file comment, if it has one.
228
+
229
+ ##
230
+ # :method: commit
231
+ # :call-seq:
232
+ # commit
233
+ #
234
+ # Commits changes that have been made since the previous commit to the
235
+ # UCF file.
236
+
237
+ ##
238
+ # :method: dir
239
+ # :call-seq:
240
+ # dir -> Zip::ZipFsDir
241
+ #
242
+ # Returns an object which can be used like ruby's built in +Dir+ (class)
243
+ # object, except that it works on the UCF file on which this method is
244
+ # invoked.
245
+ #
246
+ # See the rubyzip documentation for details.
247
+
248
+ ##
249
+ # :method: extract
250
+ # :call-seq:
251
+ # extract(entry, dest_path, &on_exists_proc)
252
+ #
253
+ # Extracts the specified entry to +dest_path+.
254
+ #
255
+ # See the rubyzip documentation for details of the +on_exists_proc+
256
+ # parameter.
257
+
258
+ ##
259
+ # :method: file
260
+ # :call-seq:
261
+ # dir -> Zip::ZipFsFile
262
+ #
263
+ # Returns an object which can be used like ruby's built in +File+ (class)
264
+ # object, except that it works on the UCF file on which this method is
265
+ # invoked.
266
+ #
267
+ # See the rubyzip documentation for details.
268
+
269
+ ##
270
+ # :method: find_entry
271
+ # :call-seq:
272
+ # find_entry(entry) -> Zip::ZipEntry
273
+ #
274
+ # Searches for entries with the specified name. Returns +nil+ if no entry
275
+ # is found. See also +get_entry+.
276
+
277
+ ##
278
+ # :method: get_entry
279
+ # :call-seq:
280
+ # get_entry(entry) -> Zip::ZipEntry
281
+ #
282
+ # Searches for an entry like +find_entry+, but throws +Errno::ENOENT+ if
283
+ # no entry is found.
284
+
285
+ ##
286
+ # :method: get_input_stream
287
+ # :call-seq:
288
+ # get_input_stream(entry) -> stream
289
+ # get_input_stream(entry) {|stream| ...}
290
+ #
291
+ # Returns an input stream to the specified entry. If a block is passed the
292
+ # stream object is passed to the block and the stream is automatically
293
+ # closed afterwards just as with ruby's built in +File.open+ method.
294
+
295
+ ##
296
+ # :method: get_output_stream
297
+ # :call-seq:
298
+ # get_output_stream(entry, permission_int = nil) -> stream
299
+ # get_output_stream(entry, permission_int = nil) {|stream| ...}
300
+ #
301
+ # Returns an output stream to the specified entry. If a block is passed
302
+ # the stream object is passed to the block and the stream is automatically
303
+ # closed afterwards just as with ruby's built-in +File.open+ method.
304
+ #
305
+ # See the rubyzip documentation for details of the +permission_int+
306
+ # parameter.
307
+
308
+ ##
309
+ # :method: glob
310
+ # :call-seq:
311
+ # glob(*args) -> Array of Zip::ZipEntry
312
+ # glob(*args) {|entry| ...}
313
+ #
314
+ # Searches for entries given a glob.
315
+ #
316
+ # See the rubyzip documentation for details of the parameters that can be
317
+ # passed in.
318
+
319
+ ##
320
+ # :method: mkdir
321
+ # :call-seq:
322
+ # mkdir(entryName, permission_int = 0755)
323
+ #
324
+ # Creates a directory.
325
+ #
326
+ # See the rubyzip documentation for details of the +permission_int+
327
+ # parameter.
328
+
329
+ ##
330
+ # :method: name
331
+ # :call-seq:
332
+ # name -> String
333
+ #
334
+ # Returns the filename of this UCF file.
335
+
336
+ ##
337
+ # :method: read
338
+ # :call-seq:
339
+ # read(entry) -> String
340
+ #
341
+ # Returns a string containing the contents of the specified entry.
342
+
343
+ end
344
+ end
data/lib/ucf.rb ADDED
@@ -0,0 +1,61 @@
1
+ # Copyright (c) 2013 The University of Manchester, UK.
2
+ #
3
+ # All rights reserved.
4
+ #
5
+ # Redistribution and use in source and binary forms, with or without
6
+ # modification, are permitted provided that the following conditions are met:
7
+ #
8
+ # * Redistributions of source code must retain the above copyright notice,
9
+ # this list of conditions and the following disclaimer.
10
+ #
11
+ # * Redistributions in binary form must reproduce the above copyright notice,
12
+ # this list of conditions and the following disclaimer in the documentation
13
+ # and/or other materials provided with the distribution.
14
+ #
15
+ # * Neither the names of The University of Manchester nor the names of its
16
+ # contributors may be used to endorse or promote products derived from this
17
+ # software without specific prior written permission.
18
+ #
19
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21
+ # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22
+ # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
23
+ # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24
+ # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25
+ # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26
+ # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27
+ # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28
+ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29
+ # POSSIBILITY OF SUCH DAMAGE.
30
+ #
31
+ # Author: Robert Haines
32
+
33
+ require 'yaml'
34
+ require 'ucf/container'
35
+
36
+ # This is a ruby library to read and write UCF files in PK Zip format. See the
37
+ # UCF::Container class for more information.
38
+ #
39
+ # See https://learn.adobe.com/wiki/display/PDFNAV/Universal+Container+Format
40
+ # for more details on the UCF.
41
+ module UCF
42
+
43
+ # Library version information.
44
+ module Version
45
+ # Version information in a Hash
46
+ INFO = YAML.load_file(File.join(File.dirname(__FILE__), "..",
47
+ "version.yml"))
48
+
49
+ # Version number as a String
50
+ STRING = [:major, :minor, :patch].map {|d| INFO[d]}.compact.join('.')
51
+ end
52
+
53
+ # Exception raised when a bad UCF is detected.
54
+ class MalformedUCFError < RuntimeError
55
+ # :stopdoc:
56
+ def initialize(message = "")
57
+ super(message)
58
+ end
59
+ # :startdoc:
60
+ end
61
+ end
Binary file
Binary file
Binary file
Binary file
File without changes
data/test/tc_create.rb ADDED
@@ -0,0 +1,104 @@
1
+ # Copyright (c) 2013 The University of Manchester, UK.
2
+ #
3
+ # All rights reserved.
4
+ #
5
+ # Redistribution and use in source and binary forms, with or without
6
+ # modification, are permitted provided that the following conditions are met:
7
+ #
8
+ # * Redistributions of source code must retain the above copyright notice,
9
+ # this list of conditions and the following disclaimer.
10
+ #
11
+ # * Redistributions in binary form must reproduce the above copyright notice,
12
+ # this list of conditions and the following disclaimer in the documentation
13
+ # and/or other materials provided with the distribution.
14
+ #
15
+ # * Neither the names of The University of Manchester nor the names of its
16
+ # contributors may be used to endorse or promote products derived from this
17
+ # software without specific prior written permission.
18
+ #
19
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21
+ # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22
+ # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
23
+ # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24
+ # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25
+ # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26
+ # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27
+ # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28
+ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29
+ # POSSIBILITY OF SUCH DAMAGE.
30
+ #
31
+ # Author: Robert Haines
32
+
33
+ require 'tmpdir'
34
+ require 'ucf'
35
+
36
+ class TestCreation < Test::Unit::TestCase
37
+
38
+ # Check creation of standard empty ucf files.
39
+ def test_create_standard_file
40
+ Dir.mktmpdir do |dir|
41
+ filename = File.join(dir, "test.ucf")
42
+
43
+ assert_nothing_raised do
44
+ UCF::Container.create(filename) do |c|
45
+ assert(c.find_entry("mimetype").localHeaderOffset == 0)
46
+ end
47
+ end
48
+
49
+ assert_nothing_raised(UCF::MalformedUCFError, Zip::ZipError) do
50
+ UCF::Container.verify!(filename)
51
+ end
52
+ end
53
+ end
54
+
55
+ # Check creation of empty ucf files with a different mimetype.
56
+ def test_create_mimetype_file
57
+ mimetype = "application/x-something-really-odd"
58
+
59
+ Dir.mktmpdir do |dir|
60
+ filename = File.join(dir, "test.ucf")
61
+
62
+ assert_nothing_raised do
63
+ UCF::Container.create(filename) do |c|
64
+ assert(c.find_entry("mimetype").localHeaderOffset == 0)
65
+ end
66
+ end
67
+
68
+ assert_nothing_raised(UCF::MalformedUCFError, Zip::ZipError) do
69
+ UCF::Container.verify!(filename)
70
+ end
71
+ end
72
+ end
73
+
74
+ # Check creation of stuff in ucf files.
75
+ def test_create_contents_file
76
+ Dir.mktmpdir do |dir|
77
+ filename = File.join(dir, "test.ucf")
78
+
79
+ assert_nothing_raised do
80
+ UCF::Container.create(filename) do |ucf|
81
+ ucf.file.open("test.txt", "w") do |f|
82
+ f.print "testing"
83
+ end
84
+
85
+ ucf.dir.mkdir("dir1")
86
+ ucf.mkdir("dir2")
87
+ end
88
+ end
89
+
90
+ assert_nothing_raised(UCF::MalformedUCFError, Zip::ZipError) do
91
+ UCF::Container.open(filename) do |ucf|
92
+ assert(ucf.file.exists?("test.txt"))
93
+ assert(ucf.file.exists?("dir1"))
94
+ assert(ucf.file.exists?("dir2"))
95
+ assert(!ucf.file.exists?("dir3"))
96
+
97
+ text = ucf.file.read("test.txt")
98
+ assert_equal("testing", text)
99
+ end
100
+ end
101
+ end
102
+ end
103
+
104
+ end
data/test/tc_read.rb ADDED
@@ -0,0 +1,99 @@
1
+ # Copyright (c) 2013 The University of Manchester, UK.
2
+ #
3
+ # All rights reserved.
4
+ #
5
+ # Redistribution and use in source and binary forms, with or without
6
+ # modification, are permitted provided that the following conditions are met:
7
+ #
8
+ # * Redistributions of source code must retain the above copyright notice,
9
+ # this list of conditions and the following disclaimer.
10
+ #
11
+ # * Redistributions in binary form must reproduce the above copyright notice,
12
+ # this list of conditions and the following disclaimer in the documentation
13
+ # and/or other materials provided with the distribution.
14
+ #
15
+ # * Neither the names of The University of Manchester nor the names of its
16
+ # contributors may be used to endorse or promote products derived from this
17
+ # software without specific prior written permission.
18
+ #
19
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21
+ # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22
+ # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
23
+ # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24
+ # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25
+ # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26
+ # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27
+ # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28
+ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29
+ # POSSIBILITY OF SUCH DAMAGE.
30
+ #
31
+ # Author: Robert Haines
32
+
33
+ require 'ucf'
34
+
35
+ class TestRead < Test::Unit::TestCase
36
+
37
+ # Check that the null file does not verify.
38
+ def test_verify_null_file
39
+ assert_raise(Zip::ZipError) do
40
+ UCF::Container.verify!($file_null)
41
+ end
42
+
43
+ assert(!UCF::Container.verify($file_null))
44
+ end
45
+
46
+ # Check that the empty ucf file does verify.
47
+ def test_verify_empty_ucf
48
+ assert_nothing_raised(UCF::MalformedUCFError, Zip::ZipError) do
49
+ UCF::Container.verify!($ucf_empty)
50
+ end
51
+
52
+ assert(UCF::Container.verify($ucf_empty))
53
+ end
54
+
55
+ # Check that the empty zip file does not verify.
56
+ def test_verify_empty_zip
57
+ assert_raise(UCF::MalformedUCFError) do
58
+ UCF::Container.verify!($zip_empty)
59
+ end
60
+
61
+ assert(!UCF::Container.verify($zip_empty))
62
+ end
63
+
64
+ # Check that a compressed mimetype file is detected.
65
+ def test_verify_compressed_mimetype
66
+ assert_raise(UCF::MalformedUCFError) do
67
+ UCF::Container.verify!($ucf_compressed_mimetype)
68
+ end
69
+
70
+ assert(!UCF::Container.verify($ucf_compressed_mimetype))
71
+ end
72
+
73
+ # Check the raw mimetype bytes
74
+ def test_raw_mimetypes
75
+ empty_ucf = File.read($ucf_empty)
76
+ assert_equal("application/epub+zip", empty_ucf[38..57])
77
+
78
+ compressed_mimetype = File.read($ucf_compressed_mimetype)
79
+ assert_not_equal("application/epub+zip", compressed_mimetype[38..57])
80
+ end
81
+
82
+ # Check reading files out of a ucf file.
83
+ def test_read_files_from_ucf
84
+ assert_nothing_raised(UCF::MalformedUCFError, Zip::ZipError) do
85
+ UCF::Container.open($ucf_example) do |ucf|
86
+ assert(ucf.file.exists?("greeting.txt"))
87
+
88
+ greeting = ucf.file.read("greeting.txt")
89
+ assert_equal("Hello, World!\n", greeting)
90
+
91
+ assert(ucf.file.exists?("dir"))
92
+ assert(ucf.file.directory?("dir"))
93
+
94
+ assert(ucf.file.exists?("dir/code.rb"))
95
+ end
96
+ end
97
+ end
98
+
99
+ end
data/test/ts_ucf.rb ADDED
@@ -0,0 +1,44 @@
1
+ # Copyright (c) 2013 The University of Manchester, UK.
2
+ #
3
+ # All rights reserved.
4
+ #
5
+ # Redistribution and use in source and binary forms, with or without
6
+ # modification, are permitted provided that the following conditions are met:
7
+ #
8
+ # * Redistributions of source code must retain the above copyright notice,
9
+ # this list of conditions and the following disclaimer.
10
+ #
11
+ # * Redistributions in binary form must reproduce the above copyright notice,
12
+ # this list of conditions and the following disclaimer in the documentation
13
+ # and/or other materials provided with the distribution.
14
+ #
15
+ # * Neither the names of The University of Manchester nor the names of its
16
+ # contributors may be used to endorse or promote products derived from this
17
+ # software without specific prior written permission.
18
+ #
19
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21
+ # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22
+ # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
23
+ # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24
+ # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25
+ # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26
+ # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27
+ # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28
+ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29
+ # POSSIBILITY OF SUCH DAMAGE.
30
+ #
31
+ # Author: Robert Haines
32
+
33
+ require 'test/unit'
34
+ require 'ucf'
35
+
36
+ $file_null = "test/data/null.file"
37
+ $ucf_empty = "test/data/empty.ucf"
38
+ $zip_empty = "test/data/empty.zip"
39
+ $ucf_compressed_mimetype = "test/data/compressed_mimetype.ucf"
40
+ $ucf_example = "test/data/example.ucf"
41
+
42
+ # Run test cases.
43
+ require 'tc_create'
44
+ require 'tc_read'
data/ucf.gemspec ADDED
@@ -0,0 +1,68 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = "ucf"
8
+ s.version = "0.0.1"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Robert Haines"]
12
+ s.date = "2013-05-24"
13
+ s.description = "A Ruby library for working with Universal Container Format files. See https://learn.adobe.com/wiki/display/PDFNAV/Universal+Container+Format for the specification."
14
+ s.email = ["support@mygrid.org.uk"]
15
+ s.extra_rdoc_files = [
16
+ "Changes.rdoc",
17
+ "Licence.rdoc",
18
+ "ReadMe.rdoc"
19
+ ]
20
+ s.files = [
21
+ "Changes.rdoc",
22
+ "Licence.rdoc",
23
+ "Rakefile",
24
+ "ReadMe.rdoc",
25
+ "examples/create_ucf.rb",
26
+ "examples/verify_ucf.rb",
27
+ "lib/ucf.rb",
28
+ "lib/ucf/container.rb",
29
+ "test/data/compressed_mimetype.ucf",
30
+ "test/data/empty.ucf",
31
+ "test/data/empty.zip",
32
+ "test/data/example.ucf",
33
+ "test/data/null.file",
34
+ "test/tc_create.rb",
35
+ "test/tc_read.rb",
36
+ "test/ts_ucf.rb",
37
+ "ucf.gemspec",
38
+ "version.yml"
39
+ ]
40
+ s.homepage = "http://www.taverna.org.uk/"
41
+ s.rdoc_options = ["-N", "--tab-width=2", "--main=ReadMe.rdoc"]
42
+ s.require_paths = ["lib"]
43
+ s.rubygems_version = "1.8.21"
44
+ s.summary = "Universal Container Format (UCF) Ruby Library"
45
+ s.test_files = ["test/ts_ucf.rb"]
46
+
47
+ if s.respond_to? :specification_version then
48
+ s.specification_version = 3
49
+
50
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
51
+ s.add_development_dependency(%q<rake>, ["~> 10.0.4"])
52
+ s.add_development_dependency(%q<rdoc>, ["~> 4.0.1"])
53
+ s.add_development_dependency(%q<jeweler>, ["~> 1.8.4"])
54
+ s.add_runtime_dependency(%q<rubyzip>, ["~> 0.9.9"])
55
+ else
56
+ s.add_dependency(%q<rake>, ["~> 10.0.4"])
57
+ s.add_dependency(%q<rdoc>, ["~> 4.0.1"])
58
+ s.add_dependency(%q<jeweler>, ["~> 1.8.4"])
59
+ s.add_dependency(%q<rubyzip>, ["~> 0.9.9"])
60
+ end
61
+ else
62
+ s.add_dependency(%q<rake>, ["~> 10.0.4"])
63
+ s.add_dependency(%q<rdoc>, ["~> 4.0.1"])
64
+ s.add_dependency(%q<jeweler>, ["~> 1.8.4"])
65
+ s.add_dependency(%q<rubyzip>, ["~> 0.9.9"])
66
+ end
67
+ end
68
+
data/version.yml ADDED
@@ -0,0 +1,4 @@
1
+ ---
2
+ :major: 0
3
+ :minor: 0
4
+ :patch: 1
metadata ADDED
@@ -0,0 +1,135 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ucf
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Robert Haines
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-05-24 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rake
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: 10.0.4
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: 10.0.4
30
+ - !ruby/object:Gem::Dependency
31
+ name: rdoc
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: 4.0.1
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: 4.0.1
46
+ - !ruby/object:Gem::Dependency
47
+ name: jeweler
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ~>
52
+ - !ruby/object:Gem::Version
53
+ version: 1.8.4
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: 1.8.4
62
+ - !ruby/object:Gem::Dependency
63
+ name: rubyzip
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ~>
68
+ - !ruby/object:Gem::Version
69
+ version: 0.9.9
70
+ type: :runtime
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: 0.9.9
78
+ description: A Ruby library for working with Universal Container Format files. See
79
+ https://learn.adobe.com/wiki/display/PDFNAV/Universal+Container+Format for the specification.
80
+ email:
81
+ - support@mygrid.org.uk
82
+ executables: []
83
+ extensions: []
84
+ extra_rdoc_files:
85
+ - Changes.rdoc
86
+ - Licence.rdoc
87
+ - ReadMe.rdoc
88
+ files:
89
+ - Changes.rdoc
90
+ - Licence.rdoc
91
+ - Rakefile
92
+ - ReadMe.rdoc
93
+ - examples/create_ucf.rb
94
+ - examples/verify_ucf.rb
95
+ - lib/ucf.rb
96
+ - lib/ucf/container.rb
97
+ - test/data/compressed_mimetype.ucf
98
+ - test/data/empty.ucf
99
+ - test/data/empty.zip
100
+ - test/data/example.ucf
101
+ - test/data/null.file
102
+ - test/tc_create.rb
103
+ - test/tc_read.rb
104
+ - test/ts_ucf.rb
105
+ - ucf.gemspec
106
+ - version.yml
107
+ homepage: http://www.taverna.org.uk/
108
+ licenses: []
109
+ post_install_message:
110
+ rdoc_options:
111
+ - -N
112
+ - --tab-width=2
113
+ - --main=ReadMe.rdoc
114
+ require_paths:
115
+ - lib
116
+ required_ruby_version: !ruby/object:Gem::Requirement
117
+ none: false
118
+ requirements:
119
+ - - ! '>='
120
+ - !ruby/object:Gem::Version
121
+ version: '0'
122
+ required_rubygems_version: !ruby/object:Gem::Requirement
123
+ none: false
124
+ requirements:
125
+ - - ! '>='
126
+ - !ruby/object:Gem::Version
127
+ version: '0'
128
+ requirements: []
129
+ rubyforge_project:
130
+ rubygems_version: 1.8.21
131
+ signing_key:
132
+ specification_version: 3
133
+ summary: Universal Container Format (UCF) Ruby Library
134
+ test_files:
135
+ - test/ts_ucf.rb