ucf 0.5.0 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Changes.rdoc +5 -0
- data/Rakefile +5 -4
- data/ReadMe.rdoc +8 -1
- data/examples/{create_ucf.rb → create-ucf} +15 -5
- data/examples/ucfinfo +2 -2
- data/examples/{verify_ucf.rb → verify-ucf} +11 -4
- data/lib/ucf.rb +0 -6
- data/lib/ucf/container.rb +22 -433
- data/lib/ucf/meta-inf.rb +9 -5
- data/test/tc_create.rb +4 -5
- data/test/tc_managed_entries.rb +20 -18
- data/test/tc_read.rb +5 -4
- data/test/tc_reserved_names.rb +31 -30
- data/test/ts_ucf.rb +1 -3
- data/ucf.gemspec +8 -14
- data/version.yml +1 -1
- metadata +11 -15
- data/lib/ucf/entries/directory.rb +0 -71
- data/lib/ucf/entries/entry.rb +0 -134
- data/lib/ucf/entries/file.rb +0 -101
- data/lib/ucf/entries/managed.rb +0 -183
- data/lib/ucf/entries/reserved.rb +0 -88
- data/lib/ucf/exceptions.rb +0 -70
data/Changes.rdoc
CHANGED
data/Rakefile
CHANGED
@@ -52,9 +52,10 @@ Jeweler::Tasks.new do |s|
|
|
52
52
|
s.platform = Gem::Platform::RUBY
|
53
53
|
s.summary = "Universal Container Format (UCF) Ruby Library"
|
54
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
|
55
|
+
"Format files - a type of EPUB document. See the "\
|
56
|
+
"{UCF specification}[https://learn.adobe.com/wiki/display/PDFNAV/Universal+Container+Format] "\
|
57
|
+
"for details. They are very similar, although not as restrictive, as the "\
|
58
|
+
"{EPUB Open Container Format (OCF)}[http://www.idpf.org/epub/30/spec/epub30-ocf.html]."
|
58
59
|
s.require_path = "lib"
|
59
60
|
s.test_file = "test/ts_ucf.rb"
|
60
61
|
s.has_rdoc = true
|
@@ -63,7 +64,7 @@ Jeweler::Tasks.new do |s|
|
|
63
64
|
s.add_development_dependency('rake', '~> 10.0.4')
|
64
65
|
s.add_development_dependency('rdoc', '~> 4.0.1')
|
65
66
|
s.add_development_dependency('jeweler', '~> 1.8.4')
|
66
|
-
s.add_runtime_dependency('
|
67
|
+
s.add_runtime_dependency('zip-container', '~> 0.9.0')
|
67
68
|
end
|
68
69
|
|
69
70
|
Rake::TestTask.new do |t|
|
data/ReadMe.rdoc
CHANGED
@@ -13,7 +13,8 @@ Copyright:: (c) 2013 The University of Manchester, UK
|
|
13
13
|
|
14
14
|
This is a Ruby library for working with UCF documents. See
|
15
15
|
{the specification}[https://learn.adobe.com/wiki/display/PDFNAV/Universal+Container+Format]
|
16
|
-
for more details.
|
16
|
+
for more details. UCF is a type of EPUB and very similar to the
|
17
|
+
{EPUB Open Container Format (OCF)}[http://www.idpf.org/epub/30/spec/epub30-ocf.html].
|
17
18
|
|
18
19
|
<b>This library is a work in progress!</b> Until we release version 1.0.0 you
|
19
20
|
can expect the API to change in incompatible ways, although we will try to
|
@@ -21,6 +22,12 @@ keep this to an absolute minimum. Once version 1.0.0 is released we will be
|
|
21
22
|
following the principles of {Semantic Versioning}[http://semver.org/] for our
|
22
23
|
version numbering scheme.
|
23
24
|
|
25
|
+
Most of this library's API is provided by the underlying
|
26
|
+
{zip-container gem}[https://rubygems.org/gems/zip-container] so you will need
|
27
|
+
to consult
|
28
|
+
{that documentation as well}[http://mygrid.github.io/ruby-zip-container/] in
|
29
|
+
addition to this.
|
30
|
+
|
24
31
|
There are some examples of how to use the library provided in the examples
|
25
32
|
directory. See the contents of the tests directory for even more.
|
26
33
|
|
@@ -1,3 +1,4 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
1
2
|
# Copyright (c) 2013 The University of Manchester, UK.
|
2
3
|
#
|
3
4
|
# All rights reserved.
|
@@ -33,13 +34,22 @@
|
|
33
34
|
require 'rubygems'
|
34
35
|
require 'ucf'
|
35
36
|
|
36
|
-
|
37
|
-
|
37
|
+
def usage
|
38
|
+
puts "Usage:\n create-ucf <ucf-file>"
|
39
|
+
exit 1
|
40
|
+
end
|
41
|
+
|
42
|
+
usage unless ARGV.length == 1
|
38
43
|
|
39
|
-
|
44
|
+
ucffile = ARGV[0]
|
45
|
+
|
46
|
+
if File.exists?(ucffile)
|
47
|
+
puts "File '#{ucffile}' already exists. Exiting."
|
48
|
+
exit 1
|
49
|
+
end
|
40
50
|
|
41
51
|
begin
|
42
|
-
UCF::Container.create(
|
52
|
+
UCF::Container.create(ucffile) do |c|
|
43
53
|
|
44
54
|
# Add a cheery greeting file from a string.
|
45
55
|
c.file.open("greeting.txt", "w") do |f|
|
@@ -55,7 +65,7 @@ begin
|
|
55
65
|
# Add a explanation of this file.
|
56
66
|
c.comment = "This is an example UCF file!"
|
57
67
|
end
|
58
|
-
rescue
|
68
|
+
rescue ZipContainer::MalformedContainerError, Zip::ZipError => err
|
59
69
|
puts err.to_s
|
60
70
|
exit 1
|
61
71
|
end
|
data/examples/ucfinfo
CHANGED
@@ -35,7 +35,7 @@ require 'rubygems'
|
|
35
35
|
require 'ucf'
|
36
36
|
|
37
37
|
def usage
|
38
|
-
puts "ucfinfo ucf-file"
|
38
|
+
puts "Usage:\n ucfinfo <ucf-file>"
|
39
39
|
exit 1
|
40
40
|
end
|
41
41
|
|
@@ -45,7 +45,7 @@ ucffile = ARGV[0]
|
|
45
45
|
|
46
46
|
begin
|
47
47
|
ucf = UCF::Container.open(ucffile)
|
48
|
-
rescue
|
48
|
+
rescue ZipContainer::MalformedContainerError, Zip::ZipError => err
|
49
49
|
puts err.to_s
|
50
50
|
exit 1
|
51
51
|
end
|
@@ -1,3 +1,4 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
1
2
|
# Copyright (c) 2013 The University of Manchester, UK.
|
2
3
|
#
|
3
4
|
# All rights reserved.
|
@@ -33,12 +34,18 @@
|
|
33
34
|
require 'rubygems'
|
34
35
|
require 'ucf'
|
35
36
|
|
36
|
-
|
37
|
-
|
37
|
+
def usage
|
38
|
+
puts "Usage:\n verify-ucf <ucf-file>"
|
39
|
+
exit 1
|
40
|
+
end
|
41
|
+
|
42
|
+
usage unless ARGV.length == 1
|
43
|
+
|
44
|
+
ucffile = ARGV[0]
|
38
45
|
|
39
46
|
begin
|
40
|
-
UCF::Container.verify!(
|
41
|
-
rescue
|
47
|
+
UCF::Container.verify!(ucffile)
|
48
|
+
rescue ZipContainer::MalformedContainerError, Zip::ZipError => err
|
42
49
|
puts err.to_s
|
43
50
|
exit 1
|
44
51
|
end
|
data/lib/ucf.rb
CHANGED
@@ -31,12 +31,6 @@
|
|
31
31
|
# Author: Robert Haines
|
32
32
|
|
33
33
|
require 'yaml'
|
34
|
-
require 'ucf/exceptions'
|
35
|
-
require 'ucf/entries/reserved'
|
36
|
-
require 'ucf/entries/managed'
|
37
|
-
require 'ucf/entries/entry'
|
38
|
-
require 'ucf/entries/file'
|
39
|
-
require 'ucf/entries/directory'
|
40
34
|
require 'ucf/meta-inf'
|
41
35
|
require 'ucf/container'
|
42
36
|
|
data/lib/ucf/container.rb
CHANGED
@@ -30,462 +30,51 @@
|
|
30
30
|
#
|
31
31
|
# Author: Robert Haines
|
32
32
|
|
33
|
-
require '
|
34
|
-
require 'zip/zipfilesystem'
|
33
|
+
require 'zip-container'
|
35
34
|
|
36
35
|
module UCF
|
37
36
|
|
38
|
-
# This class represents a UCF document
|
39
|
-
#
|
37
|
+
# This class represents a UCF document - also known as an EPUB and very
|
38
|
+
# similar to the
|
39
|
+
# {EPUB Open Container Format (OCF)}[http://www.idpf.org/epub/30/spec/epub30-ocf.html].
|
40
|
+
# See the
|
41
|
+
# {UCF specification}[https://learn.adobe.com/wiki/display/PDFNAV/Universal+Container+Format]
|
40
42
|
# for more details.
|
41
43
|
#
|
42
|
-
# This class
|
43
|
-
#
|
44
|
-
#
|
45
|
-
#
|
44
|
+
# This class is a specialization of ZipContainer so you should see the
|
45
|
+
# {ZipContainer documentation}[http://mygrid.github.io/ruby-zip-container/]
|
46
|
+
# for much more information and a list of all the other methods available in
|
47
|
+
# this class. RDoc does not list inherited methods, unfortunately.
|
46
48
|
#
|
47
49
|
# There are code examples available with the source code of this library.
|
48
|
-
class Container
|
49
|
-
include ReservedNames
|
50
|
-
include ManagedEntries
|
51
|
-
|
52
|
-
extend Forwardable
|
53
|
-
def_delegators :@zipfile, :comment, :comment=, :commit_required?, :each,
|
54
|
-
:entries, :extract, :find_entry, :get_entry, :get_input_stream, :glob,
|
55
|
-
:name, :read, :size
|
50
|
+
class Container < ZipContainer::Container
|
56
51
|
|
57
52
|
private_class_method :new
|
58
53
|
|
59
|
-
# The mime-type of this UCF document. By default this is
|
60
|
-
# "application/epub+zip".
|
61
|
-
attr_reader :mimetype
|
62
|
-
|
63
54
|
# :stopdoc:
|
64
55
|
DEFAULT_MIMETYPE = "application/epub+zip"
|
65
56
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
def initialize(document)
|
70
|
-
@zipfile = open_document(document)
|
71
|
-
check_mimetype!
|
72
|
-
|
73
|
-
@mimetype = read_mimetype
|
74
|
-
@on_disk = true
|
75
|
-
|
76
|
-
# Reserved entry names. Just the mimetype file by default.
|
77
|
-
register_reserved_name(MIMETYPE_FILE)
|
57
|
+
def initialize(filename)
|
58
|
+
super(filename)
|
78
59
|
|
79
60
|
# Initialize the managed entries and register the META-INF directory.
|
80
61
|
initialize_managed_entries(MetaInf.new)
|
81
|
-
|
82
|
-
# Here we fake up the connection to the rubyzip filesystem classes so
|
83
|
-
# that they also respect the reserved names that we define.
|
84
|
-
mapped_zip = ::Zip::ZipFileSystem::ZipFileNameMapper.new(self)
|
85
|
-
@fs_dir = ::Zip::ZipFileSystem::ZipFsDir.new(mapped_zip)
|
86
|
-
@fs_file = ::Zip::ZipFileSystem::ZipFsFile.new(mapped_zip)
|
87
|
-
@fs_dir.file = @fs_file
|
88
|
-
@fs_file.dir = @fs_dir
|
89
62
|
end
|
90
63
|
# :startdoc:
|
91
64
|
|
92
65
|
# :call-seq:
|
93
|
-
# Container.create(filename
|
94
|
-
# Container.create(filename
|
66
|
+
# Container.create(filename) -> Container
|
67
|
+
# Container.create(filename) {|container| ...}
|
95
68
|
#
|
96
|
-
# Create a new UCF document on disk
|
97
|
-
def Container.create(filename, mimetype = DEFAULT_MIMETYPE, &block)
|
98
|
-
::Zip::ZipOutputStream.open(filename) do |stream|
|
99
|
-
stream.put_next_entry(MIMETYPE_FILE, nil, nil, ::Zip::ZipEntry::STORED)
|
100
|
-
stream.write mimetype
|
101
|
-
end
|
102
|
-
|
103
|
-
# Now open the newly created container.
|
104
|
-
c = new(filename)
|
105
|
-
|
106
|
-
if block_given?
|
107
|
-
begin
|
108
|
-
yield c
|
109
|
-
ensure
|
110
|
-
c.close
|
111
|
-
end
|
112
|
-
end
|
113
|
-
|
114
|
-
c
|
115
|
-
end
|
116
|
-
|
117
|
-
# :call-seq:
|
118
|
-
# Container.each_entry -> Enumerator
|
119
|
-
# Container.each_entry {|entry| ...}
|
69
|
+
# Create a new UCF document on disk and open it for editing.
|
120
70
|
#
|
121
|
-
#
|
122
|
-
#
|
123
|
-
#
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
if block_given?
|
128
|
-
begin
|
129
|
-
c.each(&block)
|
130
|
-
ensure
|
131
|
-
c.close
|
132
|
-
end
|
133
|
-
end
|
134
|
-
|
135
|
-
c.each
|
71
|
+
# Please see the
|
72
|
+
# {ZipContainer documentation}[http://mygrid.github.io/ruby-zip-container/]
|
73
|
+
# for much more information and a list of all the other methods available
|
74
|
+
# in this class. RDoc does not list inherited methods, unfortunately.
|
75
|
+
def Container.create(filename, &block)
|
76
|
+
super(filename, DEFAULT_MIMETYPE, &block)
|
136
77
|
end
|
137
78
|
|
138
|
-
# :call-seq:
|
139
|
-
# Container.open(filename) -> document
|
140
|
-
# Container.open(filename) {|document| ...}
|
141
|
-
#
|
142
|
-
# Open an existing UCF document from disk. It will be checked for
|
143
|
-
# conformance to the UCF specification upon first access.
|
144
|
-
def Container.open(filename, &block)
|
145
|
-
c = new(filename)
|
146
|
-
|
147
|
-
if block_given?
|
148
|
-
begin
|
149
|
-
yield c
|
150
|
-
ensure
|
151
|
-
c.close
|
152
|
-
end
|
153
|
-
end
|
154
|
-
|
155
|
-
c
|
156
|
-
end
|
157
|
-
|
158
|
-
# :call-seq:
|
159
|
-
# Container.verify(filename) -> boolean
|
160
|
-
#
|
161
|
-
# Verify that the specified UCF document conforms to the UCF
|
162
|
-
# specification. This method returns +false+ if there are any problems at
|
163
|
-
# all with the file (including if it cannot be found).
|
164
|
-
def Container.verify(filename)
|
165
|
-
begin
|
166
|
-
new(filename).verify!
|
167
|
-
rescue
|
168
|
-
return false
|
169
|
-
end
|
170
|
-
|
171
|
-
true
|
172
|
-
end
|
173
|
-
|
174
|
-
# :call-seq:
|
175
|
-
# Container.verify!(filename)
|
176
|
-
#
|
177
|
-
# Verify that the specified UCF document conforms to the UCF
|
178
|
-
# specification. This method raises exceptions when errors are found or if
|
179
|
-
# there is something fundamental wrong with the file itself (e.g. it
|
180
|
-
# cannot be found).
|
181
|
-
def Container.verify!(filename)
|
182
|
-
new(filename).verify!
|
183
|
-
end
|
184
|
-
|
185
|
-
# :call-seq:
|
186
|
-
# add(entry, src_path, &continue_on_exists_proc)
|
187
|
-
#
|
188
|
-
# Convenience method for adding the contents of a file to the UCF
|
189
|
-
# document. If asked to add a file with a reserved name, such as the
|
190
|
-
# special mimetype header file, this method will raise a
|
191
|
-
# ReservedNameClashError.
|
192
|
-
#
|
193
|
-
# See the rubyzip documentation for details of the
|
194
|
-
# +continue_on_exists_proc+ parameter.
|
195
|
-
def add(entry, src_path, &continue_on_exists_proc)
|
196
|
-
if reserved_entry?(entry) || managed_directory?(entry)
|
197
|
-
raise ReservedNameClashError.new(entry.to_s)
|
198
|
-
end
|
199
|
-
|
200
|
-
@zipfile.add(entry, src_path, &continue_on_exists_proc)
|
201
|
-
end
|
202
|
-
|
203
|
-
# :call-seq:
|
204
|
-
# commit -> boolean
|
205
|
-
# close -> boolean
|
206
|
-
#
|
207
|
-
# Commits changes that have been made since the previous commit to the
|
208
|
-
# UCF document. Returns +true+ if anything was actually done, +false+
|
209
|
-
# otherwise.
|
210
|
-
def commit
|
211
|
-
return false unless commit_required?
|
212
|
-
|
213
|
-
if on_disk?
|
214
|
-
@zipfile.commit
|
215
|
-
end
|
216
|
-
end
|
217
|
-
|
218
|
-
alias :close :commit
|
219
|
-
|
220
|
-
# :call-seq:
|
221
|
-
# dir -> Zip::ZipFsDir
|
222
|
-
#
|
223
|
-
# Returns an object which can be used like ruby's built in +Dir+ (class)
|
224
|
-
# object, except that it works on the UCF document on which this method is
|
225
|
-
# invoked.
|
226
|
-
#
|
227
|
-
# See the rubyzip documentation for details.
|
228
|
-
def dir
|
229
|
-
@fs_dir
|
230
|
-
end
|
231
|
-
|
232
|
-
# :call-seq:
|
233
|
-
# file -> Zip::ZipFsFile
|
234
|
-
#
|
235
|
-
# Returns an object which can be used like ruby's built in +File+ (class)
|
236
|
-
# object, except that it works on the UCF document on which this method is
|
237
|
-
# invoked.
|
238
|
-
#
|
239
|
-
# See the rubyzip documentation for details.
|
240
|
-
def file
|
241
|
-
@fs_file
|
242
|
-
end
|
243
|
-
|
244
|
-
# :call-seq:
|
245
|
-
# get_output_stream(entry, permission = nil) -> stream
|
246
|
-
# get_output_stream(entry, permission = nil) {|stream| ...}
|
247
|
-
#
|
248
|
-
# Returns an output stream to the specified entry. If a block is passed
|
249
|
-
# the stream object is passed to the block and the stream is automatically
|
250
|
-
# closed afterwards just as with ruby's built-in +File.open+ method.
|
251
|
-
#
|
252
|
-
# See the rubyzip documentation for details of the +permission_int+
|
253
|
-
# parameter.
|
254
|
-
def get_output_stream(entry, permission = nil, &block)
|
255
|
-
if reserved_entry?(entry) || managed_directory?(entry)
|
256
|
-
raise ReservedNameClashError.new(entry.to_s)
|
257
|
-
end
|
258
|
-
|
259
|
-
@zipfile.get_output_stream(entry, permission, &block)
|
260
|
-
end
|
261
|
-
|
262
|
-
# :call-seq:
|
263
|
-
# in_memory? -> boolean
|
264
|
-
#
|
265
|
-
# Is this UCF document memory resident as opposed to stored on disk?
|
266
|
-
def in_memory?
|
267
|
-
!@on_disk
|
268
|
-
end
|
269
|
-
|
270
|
-
# :call-seq:
|
271
|
-
# mkdir(name, permission = 0755)
|
272
|
-
#
|
273
|
-
# Creates a directory in the UCF document. If asked to create a directory
|
274
|
-
# with a reserved name this method will raise a ReservedNameClashError.
|
275
|
-
#
|
276
|
-
# The new directory will be created with the supplied unix-style
|
277
|
-
# permissions. The default (+0755+) is owner read, write and list; group
|
278
|
-
# read and list; and world read and list.
|
279
|
-
def mkdir(name, permission = 0755)
|
280
|
-
if reserved_entry?(name) || managed_file?(name)
|
281
|
-
raise ReservedNameClashError.new(name)
|
282
|
-
end
|
283
|
-
|
284
|
-
@zipfile.mkdir(name, permission)
|
285
|
-
end
|
286
|
-
|
287
|
-
# :call-seq:
|
288
|
-
# on_disk? -> boolean
|
289
|
-
#
|
290
|
-
# Is this UCF document stored on disk as opposed to memory resident?
|
291
|
-
def on_disk?
|
292
|
-
@on_disk
|
293
|
-
end
|
294
|
-
|
295
|
-
# :call-seq:
|
296
|
-
# remove(entry)
|
297
|
-
#
|
298
|
-
# Removes the specified entry from the UCF document. If asked to remove
|
299
|
-
# any reserved files such as the special mimetype header file this method
|
300
|
-
# will do nothing.
|
301
|
-
def remove(entry)
|
302
|
-
return if reserved_entry?(entry)
|
303
|
-
@zipfile.remove(entry)
|
304
|
-
end
|
305
|
-
|
306
|
-
# :call-seq:
|
307
|
-
# rename(entry, new_name, &continue_on_exists_proc)
|
308
|
-
#
|
309
|
-
# Renames the specified entry in the UCF document. If asked to rename any
|
310
|
-
# reserved files such as the special mimetype header file this method will
|
311
|
-
# do nothing. If asked to rename a file _to_ one of the reserved names a
|
312
|
-
# ReservedNameClashError is raised.
|
313
|
-
#
|
314
|
-
# See the rubyzip documentation for details of the
|
315
|
-
# +continue_on_exists_proc+ parameter.
|
316
|
-
def rename(entry, new_name, &continue_on_exists_proc)
|
317
|
-
return if reserved_entry?(entry)
|
318
|
-
raise ReservedNameClashError.new(new_name) if reserved_entry?(new_name)
|
319
|
-
|
320
|
-
@zipfile.rename(entry, new_name, &continue_on_exists_proc)
|
321
|
-
end
|
322
|
-
|
323
|
-
# :call-seq:
|
324
|
-
# replace(entry, src_path)
|
325
|
-
#
|
326
|
-
# Replaces the specified entry of the UCF document with the contents of
|
327
|
-
# +src_path+ (from the file system). If asked to replace any reserved
|
328
|
-
# files such as the special mimetype header file this method will do
|
329
|
-
# nothing.
|
330
|
-
def replace(entry, src_path)
|
331
|
-
return if reserved_entry?(entry)
|
332
|
-
@zipfile.replace(entry, src_path)
|
333
|
-
end
|
334
|
-
|
335
|
-
# :call-seq:
|
336
|
-
# to_s -> String
|
337
|
-
#
|
338
|
-
# Return a textual summary of this UCF document.
|
339
|
-
def to_s
|
340
|
-
@zipfile.to_s + " - #{@mimetype}"
|
341
|
-
end
|
342
|
-
|
343
|
-
# :call-seq:
|
344
|
-
# verify!
|
345
|
-
#
|
346
|
-
# Verify the contents of this UCF document. All managed files and
|
347
|
-
# directories are checked to make sure that they exist, if required.
|
348
|
-
def verify!
|
349
|
-
verify_managed_entries!
|
350
|
-
end
|
351
|
-
|
352
|
-
private
|
353
|
-
|
354
|
-
def open_document(document)
|
355
|
-
::Zip::ZipFile.new(document)
|
356
|
-
end
|
357
|
-
|
358
|
-
def check_mimetype!
|
359
|
-
# Check mimetype file is present and correct.
|
360
|
-
entry = @zipfile.find_entry(MIMETYPE_FILE)
|
361
|
-
|
362
|
-
raise MalformedUCFError.new("'mimetype' file is missing.") if entry.nil?
|
363
|
-
if entry.localHeaderOffset != 0
|
364
|
-
raise MalformedUCFError.new("'mimetype' file is not at offset 0 in the archive.")
|
365
|
-
end
|
366
|
-
if entry.compression_method != ::Zip::ZipEntry::STORED
|
367
|
-
raise MalformedUCFError.new("'mimetype' file is compressed.")
|
368
|
-
end
|
369
|
-
|
370
|
-
true
|
371
|
-
end
|
372
|
-
|
373
|
-
def read_mimetype
|
374
|
-
@zipfile.read(MIMETYPE_FILE)
|
375
|
-
end
|
376
|
-
|
377
|
-
public
|
378
|
-
|
379
|
-
# Lots of extra docs out of the way at the end here...
|
380
|
-
|
381
|
-
##
|
382
|
-
# :method: comment
|
383
|
-
# :call-seq:
|
384
|
-
# comment -> String
|
385
|
-
#
|
386
|
-
# Returns the UCF document comment, if it has one.
|
387
|
-
|
388
|
-
##
|
389
|
-
# :method: comment=
|
390
|
-
# :call-seq:
|
391
|
-
# comment = comment
|
392
|
-
#
|
393
|
-
# Set the UCF document comment to the new value.
|
394
|
-
|
395
|
-
##
|
396
|
-
# :method: commit_required?
|
397
|
-
# :call-seq:
|
398
|
-
# commit_required? -> boolean
|
399
|
-
#
|
400
|
-
# Returns +true+ if any changes have been made to this UCF document since
|
401
|
-
# the last commit, +false+ otherwise.
|
402
|
-
|
403
|
-
##
|
404
|
-
# :method: each
|
405
|
-
# :call-seq:
|
406
|
-
# each -> Enumerator
|
407
|
-
# each {|entry| ...}
|
408
|
-
#
|
409
|
-
# Iterate over the entries in the UCF document. The entry objects returned
|
410
|
-
# by this method are Zip::ZipEntry objects. Please see the rubyzip
|
411
|
-
# documentation for details.
|
412
|
-
|
413
|
-
##
|
414
|
-
# :method:
|
415
|
-
# :call-seq:
|
416
|
-
# entries -> Enumerable
|
417
|
-
#
|
418
|
-
# Returns an Enumerable containing all the entries in the UCF Document.
|
419
|
-
# The entry objects returned by this method are Zip::ZipEntry objects.
|
420
|
-
# Please see the rubyzip documentation for details.
|
421
|
-
|
422
|
-
##
|
423
|
-
# :method: extract
|
424
|
-
# :call-seq:
|
425
|
-
# extract(entry, dest_path, &on_exists_proc)
|
426
|
-
#
|
427
|
-
# Extracts the specified entry of the UCF document to +dest_path+.
|
428
|
-
#
|
429
|
-
# See the rubyzip documentation for details of the +on_exists_proc+
|
430
|
-
# parameter.
|
431
|
-
|
432
|
-
##
|
433
|
-
# :method: find_entry
|
434
|
-
# :call-seq:
|
435
|
-
# find_entry(entry) -> Zip::ZipEntry
|
436
|
-
#
|
437
|
-
# Searches for entries within the UCF document with the specified name.
|
438
|
-
# Returns +nil+ if no entry is found. See also +get_entry+.
|
439
|
-
|
440
|
-
##
|
441
|
-
# :method: get_entry
|
442
|
-
# :call-seq:
|
443
|
-
# get_entry(entry) -> Zip::ZipEntry
|
444
|
-
#
|
445
|
-
# Searches for an entry within the UCF document in a similar manner to
|
446
|
-
# +find_entry+, but throws +Errno::ENOENT+ if no entry is found.
|
447
|
-
|
448
|
-
##
|
449
|
-
# :method: get_input_stream
|
450
|
-
# :call-seq:
|
451
|
-
# get_input_stream(entry) -> stream
|
452
|
-
# get_input_stream(entry) {|stream| ...}
|
453
|
-
#
|
454
|
-
# Returns an input stream to the specified entry. If a block is passed the
|
455
|
-
# stream object is passed to the block and the stream is automatically
|
456
|
-
# closed afterwards just as with ruby's built in +File.open+ method.
|
457
|
-
|
458
|
-
##
|
459
|
-
# :method: glob
|
460
|
-
# :call-seq:
|
461
|
-
# glob(*args) -> Array of Zip::ZipEntry
|
462
|
-
# glob(*args) {|entry| ...}
|
463
|
-
#
|
464
|
-
# Searches for entries within the UCF document that match the given glob.
|
465
|
-
#
|
466
|
-
# See the rubyzip documentation for details of the parameters that can be
|
467
|
-
# passed in.
|
468
|
-
|
469
|
-
##
|
470
|
-
# :method: name
|
471
|
-
# :call-seq:
|
472
|
-
# name -> String
|
473
|
-
#
|
474
|
-
# Returns the filename of this UCF document.
|
475
|
-
|
476
|
-
##
|
477
|
-
# :method: read
|
478
|
-
# :call-seq:
|
479
|
-
# read(entry) -> String
|
480
|
-
#
|
481
|
-
# Returns a string containing the contents of the specified entry.
|
482
|
-
|
483
|
-
##
|
484
|
-
# :method: size
|
485
|
-
# :call-seq:
|
486
|
-
# size -> int
|
487
|
-
#
|
488
|
-
# Returns the number of entries in the UCF document.
|
489
|
-
|
490
79
|
end
|
491
80
|
end
|