zip-container 1.1.0 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/.travis.yml +6 -0
- data/Changes.rdoc +23 -0
- data/ReadMe.rdoc +12 -1
- data/examples/create-zip-container +1 -1
- data/examples/verify-zip-container +1 -1
- data/examples/zip-container-info +1 -1
- data/lib/zip-container.rb +2 -1
- data/lib/zip-container/entries/directory.rb +17 -7
- data/lib/zip-container/entries/entry.rb +16 -4
- data/lib/zip-container/entries/file.rb +21 -10
- data/lib/zip-container/entries/managed.rb +47 -13
- data/lib/zip-container/entries/reserved.rb +3 -3
- data/lib/zip-container/exceptions.rb +11 -5
- data/lib/zip-container/{container.rb → file.rb} +85 -17
- data/lib/zip-container/util.rb +59 -0
- data/test/data/subclassed.container +0 -0
- data/test/helpers/entry_lists.rb +35 -0
- data/test/tc_create.rb +10 -10
- data/test/tc_exceptions.rb +56 -0
- data/test/tc_managed_entries.rb +127 -12
- data/test/tc_read.rb +13 -13
- data/test/tc_reserved_names.rb +11 -11
- data/test/tc_util.rb +67 -0
- data/test/ts_container.rb +4 -1
- data/version.yml +2 -2
- data/zip-container.gemspec +2 -1
- metadata +15 -6
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (c) 2013 The University of Manchester, UK.
|
1
|
+
# Copyright (c) 2013, 2014 The University of Manchester, UK.
|
2
2
|
#
|
3
3
|
# All rights reserved.
|
4
4
|
#
|
@@ -45,14 +45,13 @@ module ZipContainer
|
|
45
45
|
# alongside these pages.
|
46
46
|
#
|
47
47
|
# There are code examples available with the source code of this library.
|
48
|
-
class
|
48
|
+
class File
|
49
49
|
include ReservedNames
|
50
50
|
include ManagedEntries
|
51
51
|
|
52
52
|
extend Forwardable
|
53
53
|
def_delegators :@zipfile, :comment, :comment=, :commit_required?, :each,
|
54
|
-
:entries, :extract, :
|
55
|
-
:name, :read, :size
|
54
|
+
:entries, :extract, :get_input_stream, :name, :read, :size
|
56
55
|
|
57
56
|
private_class_method :new
|
58
57
|
|
@@ -87,11 +86,11 @@ module ZipContainer
|
|
87
86
|
# :startdoc:
|
88
87
|
|
89
88
|
# :call-seq:
|
90
|
-
#
|
91
|
-
#
|
89
|
+
# File.create(filename, mimetype) -> document
|
90
|
+
# File.create(filename, mimetype) {|document| ...}
|
92
91
|
#
|
93
92
|
# Create a new ZipContainer file on disk with the specified mimetype.
|
94
|
-
def
|
93
|
+
def self.create(filename, mimetype, &block)
|
95
94
|
::Zip::OutputStream.open(filename) do |stream|
|
96
95
|
stream.put_next_entry(MIMETYPE_FILE, nil, nil, ::Zip::Entry::STORED)
|
97
96
|
stream.write mimetype
|
@@ -112,13 +111,13 @@ module ZipContainer
|
|
112
111
|
end
|
113
112
|
|
114
113
|
# :call-seq:
|
115
|
-
#
|
116
|
-
#
|
114
|
+
# File.each_entry -> Enumerator
|
115
|
+
# File.each_entry {|entry| ...}
|
117
116
|
#
|
118
117
|
# Iterate over the entries in the ZipContainer file. The entry objects
|
119
118
|
# returned by this method are Zip::Entry objects. Please see the
|
120
119
|
# rubyzip documentation for details.
|
121
|
-
def
|
120
|
+
def self.each_entry(filename, &block)
|
122
121
|
c = new(filename)
|
123
122
|
|
124
123
|
if block_given?
|
@@ -133,12 +132,12 @@ module ZipContainer
|
|
133
132
|
end
|
134
133
|
|
135
134
|
# :call-seq:
|
136
|
-
#
|
137
|
-
#
|
135
|
+
# File.open(filename) -> document
|
136
|
+
# File.open(filename) {|document| ...}
|
138
137
|
#
|
139
138
|
# Open an existing ZipContainer file from disk. It will be checked for
|
140
139
|
# conformance upon first access.
|
141
|
-
def
|
140
|
+
def self.open(filename, &block)
|
142
141
|
c = new(filename)
|
143
142
|
|
144
143
|
if block_given?
|
@@ -153,12 +152,12 @@ module ZipContainer
|
|
153
152
|
end
|
154
153
|
|
155
154
|
# :call-seq:
|
156
|
-
#
|
155
|
+
# File.verify(filename) -> boolean
|
157
156
|
#
|
158
157
|
# Verify that the specified ZipContainer file conforms to the
|
159
158
|
# specification. This method returns +false+ if there are any problems at
|
160
159
|
# all with the file (including if it cannot be found).
|
161
|
-
def
|
160
|
+
def self.verify(filename)
|
162
161
|
begin
|
163
162
|
new(filename).verify!
|
164
163
|
rescue
|
@@ -169,13 +168,13 @@ module ZipContainer
|
|
169
168
|
end
|
170
169
|
|
171
170
|
# :call-seq:
|
172
|
-
#
|
171
|
+
# File.verify!(filename)
|
173
172
|
#
|
174
173
|
# Verify that the specified ZipContainer file conforms to the
|
175
174
|
# specification. This method raises exceptions when errors are found or if
|
176
175
|
# there is something fundamental wrong with the file itself (e.g. it
|
177
176
|
# cannot be found).
|
178
|
-
def
|
177
|
+
def self.verify!(filename)
|
179
178
|
new(filename).verify!
|
180
179
|
end
|
181
180
|
|
@@ -238,6 +237,40 @@ module ZipContainer
|
|
238
237
|
@fs_file
|
239
238
|
end
|
240
239
|
|
240
|
+
# :call-seq:
|
241
|
+
# find_entry(entry_name, options = {}) -> Zip::Entry or nil
|
242
|
+
#
|
243
|
+
# Searches for the entry with the specified name. Returns +nil+ if no
|
244
|
+
# entry is found or if the specified entry is hidden for normal use. You
|
245
|
+
# can specify <tt>:include_hidden => true</tt> to include hidden entries
|
246
|
+
# in the search.
|
247
|
+
def find_entry(entry_name, options = {})
|
248
|
+
options = {:include_hidden => false}.merge(options)
|
249
|
+
|
250
|
+
unless options[:include_hidden]
|
251
|
+
return if hidden_entry?(entry_name)
|
252
|
+
end
|
253
|
+
|
254
|
+
@zipfile.find_entry(entry_name)
|
255
|
+
end
|
256
|
+
|
257
|
+
# :call-seq:
|
258
|
+
# get_entry(entry, options = {}) -> Zip::Entry or nil
|
259
|
+
#
|
260
|
+
# Searches for an entry like find_entry, but throws Errno::ENOENT if no
|
261
|
+
# entry is found or if the specified entry is hidden for normal use. You
|
262
|
+
# can specify <tt>:include_hidden => true</tt> to include hidden entries
|
263
|
+
# in the search.
|
264
|
+
def get_entry(entry, options = {})
|
265
|
+
options = {:include_hidden => false}.merge(options)
|
266
|
+
|
267
|
+
unless options[:include_hidden]
|
268
|
+
raise Errno::ENOENT, entry if hidden_entry?(entry)
|
269
|
+
end
|
270
|
+
|
271
|
+
@zipfile.get_entry(entry)
|
272
|
+
end
|
273
|
+
|
241
274
|
# :call-seq:
|
242
275
|
# get_output_stream(entry, permission = nil) -> stream
|
243
276
|
# get_output_stream(entry, permission = nil) {|stream| ...}
|
@@ -256,6 +289,41 @@ module ZipContainer
|
|
256
289
|
@zipfile.get_output_stream(entry, permission, &block)
|
257
290
|
end
|
258
291
|
|
292
|
+
# :call-seq:
|
293
|
+
# glob(pattern) -> Array
|
294
|
+
# glob(pattern) { |entry| ... }
|
295
|
+
# glob(pattern, *parameters) -> Array
|
296
|
+
# glob(pattern, *parameters) { |entry| ... }
|
297
|
+
#
|
298
|
+
# Searches for entries given a glob. Hidden files are ignored by default.
|
299
|
+
#
|
300
|
+
# The parameters that can be supplied are:
|
301
|
+
# * +flags+ - A bitwise OR of the <tt>FNM_xxx</tt> parameters defined in
|
302
|
+
# File::Constants. The default value is
|
303
|
+
# <tt>::File::FNM_PATHNAME | ::File::FNM_DOTMATCH</tt>
|
304
|
+
# * +options+ - <tt>:include_hidden => true</tt> will include hidden
|
305
|
+
# entries in the search.
|
306
|
+
def glob(pattern, *params, &block)
|
307
|
+
flags = ::File::FNM_PATHNAME | ::File::FNM_DOTMATCH
|
308
|
+
options = { :include_hidden => false }
|
309
|
+
|
310
|
+
params.each do |param|
|
311
|
+
case param
|
312
|
+
when Hash
|
313
|
+
options = options.merge(param)
|
314
|
+
else
|
315
|
+
flags = param
|
316
|
+
end
|
317
|
+
end
|
318
|
+
|
319
|
+
entries.map do |entry|
|
320
|
+
next if !options[:include_hidden] && hidden_entry?(entry)
|
321
|
+
next unless ::File.fnmatch(pattern, entry.name.chomp('/'), flags)
|
322
|
+
yield(entry) if block_given?
|
323
|
+
entry
|
324
|
+
end.compact
|
325
|
+
end
|
326
|
+
|
259
327
|
# :call-seq:
|
260
328
|
# in_memory? -> boolean
|
261
329
|
#
|
@@ -0,0 +1,59 @@
|
|
1
|
+
# Copyright (c) 2014 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
|
+
#
|
34
|
+
module ZipContainer
|
35
|
+
|
36
|
+
# Utility methods useful throughout the rest of the ZipContainer library.
|
37
|
+
module Util
|
38
|
+
|
39
|
+
# :call-seq:
|
40
|
+
# entry_name(entry) -> String
|
41
|
+
#
|
42
|
+
# A lot of methods can take either a String or a Zip::Entry object to
|
43
|
+
# represent an item in a Zip file so this method normalizes these
|
44
|
+
# parameters.
|
45
|
+
#
|
46
|
+
# In common with rubyzip this method also removes a trailing slash (/)
|
47
|
+
# from a name if it can.
|
48
|
+
def entry_name(entry)
|
49
|
+
name = entry.kind_of?(::Zip::Entry) ? entry.name : entry
|
50
|
+
|
51
|
+
if name.respond_to?(:end_with?) && name.respond_to?(:chop!)
|
52
|
+
name.chop! if name.end_with?("/")
|
53
|
+
end
|
54
|
+
|
55
|
+
name
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
end
|
Binary file
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# Copyright (c) 2014 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
|
+
def entry_list_names(entries)
|
34
|
+
entries.map { |entry| entry.name }
|
35
|
+
end
|
data/test/tc_create.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (c) 2013 The University of Manchester, UK.
|
1
|
+
# Copyright (c) 2013, 2014 The University of Manchester, UK.
|
2
2
|
#
|
3
3
|
# All rights reserved.
|
4
4
|
#
|
@@ -42,7 +42,7 @@ class TestCreation < Test::Unit::TestCase
|
|
42
42
|
filename = File.join(dir, "test.container")
|
43
43
|
|
44
44
|
assert_nothing_raised do
|
45
|
-
ZipContainer::
|
45
|
+
ZipContainer::File.create(filename, $mimetype) do |c|
|
46
46
|
assert(c.on_disk?)
|
47
47
|
refute(c.in_memory?)
|
48
48
|
|
@@ -50,8 +50,8 @@ class TestCreation < Test::Unit::TestCase
|
|
50
50
|
end
|
51
51
|
end
|
52
52
|
|
53
|
-
assert_nothing_raised(ZipContainer::MalformedContainerError,
|
54
|
-
ZipContainer::
|
53
|
+
assert_nothing_raised(ZipContainer::MalformedContainerError, ZipContainer::ZipError) do
|
54
|
+
ZipContainer::File.verify!(filename)
|
55
55
|
end
|
56
56
|
end
|
57
57
|
end
|
@@ -64,7 +64,7 @@ class TestCreation < Test::Unit::TestCase
|
|
64
64
|
filename = File.join(dir, "test.container")
|
65
65
|
|
66
66
|
assert_nothing_raised do
|
67
|
-
ZipContainer::
|
67
|
+
ZipContainer::File.create(filename, mimetype) do |c|
|
68
68
|
assert(c.on_disk?)
|
69
69
|
refute(c.in_memory?)
|
70
70
|
|
@@ -72,8 +72,8 @@ class TestCreation < Test::Unit::TestCase
|
|
72
72
|
end
|
73
73
|
end
|
74
74
|
|
75
|
-
assert_nothing_raised(ZipContainer::MalformedContainerError,
|
76
|
-
ZipContainer::
|
75
|
+
assert_nothing_raised(ZipContainer::MalformedContainerError, ZipContainer::ZipError) do
|
76
|
+
ZipContainer::File.verify!(filename)
|
77
77
|
end
|
78
78
|
end
|
79
79
|
end
|
@@ -85,7 +85,7 @@ class TestCreation < Test::Unit::TestCase
|
|
85
85
|
filename = File.join(dir, "test.container")
|
86
86
|
|
87
87
|
assert_nothing_raised do
|
88
|
-
ZipContainer::
|
88
|
+
ZipContainer::File.create(filename, $mimetype) do |c|
|
89
89
|
assert(c.on_disk?)
|
90
90
|
refute(c.in_memory?)
|
91
91
|
|
@@ -115,8 +115,8 @@ class TestCreation < Test::Unit::TestCase
|
|
115
115
|
end
|
116
116
|
end
|
117
117
|
|
118
|
-
assert_nothing_raised(ZipContainer::MalformedContainerError,
|
119
|
-
ZipContainer::
|
118
|
+
assert_nothing_raised(ZipContainer::MalformedContainerError, ZipContainer::ZipError) do
|
119
|
+
ZipContainer::File.open(filename) do |c|
|
120
120
|
assert(c.on_disk?)
|
121
121
|
refute(c.in_memory?)
|
122
122
|
|
@@ -0,0 +1,56 @@
|
|
1
|
+
# Copyright (c) 2014 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 'zip-container'
|
35
|
+
|
36
|
+
class TestExceptions < Test::Unit::TestCase
|
37
|
+
|
38
|
+
def test_rescue_container_errors
|
39
|
+
assert_raise(ZipContainer::ContainerError) do
|
40
|
+
raise ZipContainer::ZipError.new
|
41
|
+
end
|
42
|
+
|
43
|
+
assert_raise(ZipContainer::ContainerError) do
|
44
|
+
raise ZipContainer::MalformedContainerError.new
|
45
|
+
end
|
46
|
+
|
47
|
+
assert_raise(ZipContainer::ContainerError) do
|
48
|
+
raise ZipContainer::ReservedNameClashError.new("test")
|
49
|
+
end
|
50
|
+
|
51
|
+
assert_raise(ZipContainer::ContainerError) do
|
52
|
+
raise Zip::ZipError.new
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
data/test/tc_managed_entries.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (c) 2013 The University of Manchester, UK.
|
1
|
+
# Copyright (c) 2013, 2014 The University of Manchester, UK.
|
2
2
|
#
|
3
3
|
# All rights reserved.
|
4
4
|
#
|
@@ -33,35 +33,41 @@
|
|
33
33
|
require 'test/unit'
|
34
34
|
require 'tmpdir'
|
35
35
|
require 'zip-container'
|
36
|
+
require 'helpers/entry_lists'
|
36
37
|
|
37
38
|
# Classes to test managed entries.
|
38
|
-
class ManagedZipContainer < ZipContainer::
|
39
|
+
class ManagedZipContainer < ZipContainer::File
|
39
40
|
|
40
41
|
private_class_method :new
|
41
42
|
|
42
43
|
def initialize(filename)
|
43
44
|
super(filename)
|
44
|
-
|
45
|
-
|
45
|
+
test_file = ZipContainer::ManagedFile.new("test.txt")
|
46
|
+
deep_file = ZipContainer::ManagedFile.new("deep.txt")
|
47
|
+
deep_dir = ZipContainer::ManagedDirectory.new("deep",
|
48
|
+
:entries => [deep_file])
|
49
|
+
register_managed_entry(ZipContainer::ManagedDirectory.new("src", :required => true))
|
50
|
+
register_managed_entry(ZipContainer::ManagedDirectory.new("test",
|
51
|
+
:hidden => true, :entries => [deep_dir, test_file]))
|
46
52
|
register_managed_entry(ZipContainer::ManagedDirectory.new("lib"))
|
47
|
-
register_managed_entry(ZipContainer::ManagedFile.new("index.html", true))
|
53
|
+
register_managed_entry(ZipContainer::ManagedFile.new("index.html", :required => true))
|
48
54
|
end
|
49
55
|
|
50
56
|
end
|
51
57
|
|
52
|
-
class ExampleZipContainer < ZipContainer::
|
58
|
+
class ExampleZipContainer < ZipContainer::File
|
53
59
|
|
54
60
|
private_class_method :new
|
55
61
|
|
56
62
|
def initialize(filename)
|
57
63
|
super(filename)
|
58
|
-
register_managed_entry(ZipContainer::ManagedDirectory.new("dir", true))
|
59
|
-
register_managed_entry(ZipContainer::ManagedFile.new("greeting.txt", true))
|
64
|
+
register_managed_entry(ZipContainer::ManagedDirectory.new("dir", :required => true))
|
65
|
+
register_managed_entry(ZipContainer::ManagedFile.new("greeting.txt", :required => true))
|
60
66
|
end
|
61
67
|
|
62
68
|
end
|
63
69
|
|
64
|
-
class ExampleZipContainer2 < ZipContainer::
|
70
|
+
class ExampleZipContainer2 < ZipContainer::File
|
65
71
|
|
66
72
|
private_class_method :new
|
67
73
|
|
@@ -70,7 +76,7 @@ class ExampleZipContainer2 < ZipContainer::Container
|
|
70
76
|
|
71
77
|
valid = Proc.new { |contents| contents.match(/[Hh]ello/) }
|
72
78
|
register_managed_entry(ZipContainer::ManagedFile.new("greeting.txt",
|
73
|
-
true, valid))
|
79
|
+
:required => true, :validation_proc => valid))
|
74
80
|
end
|
75
81
|
|
76
82
|
def ExampleZipContainer2.create(filename, &block)
|
@@ -117,7 +123,7 @@ class TestManagedEntries < Test::Unit::TestCase
|
|
117
123
|
filename = File.join(dir, "test.container")
|
118
124
|
|
119
125
|
assert_nothing_raised do
|
120
|
-
ZipContainer::
|
126
|
+
ZipContainer::File.create(filename, $mimetype) do |c|
|
121
127
|
c.mkdir("META-INF")
|
122
128
|
assert(c.file.exists?("META-INF"))
|
123
129
|
|
@@ -129,7 +135,7 @@ class TestManagedEntries < Test::Unit::TestCase
|
|
129
135
|
end
|
130
136
|
|
131
137
|
assert_nothing_raised(ZipContainer::MalformedContainerError) do
|
132
|
-
ZipContainer::
|
138
|
+
ZipContainer::File.verify!(filename)
|
133
139
|
end
|
134
140
|
end
|
135
141
|
end
|
@@ -167,6 +173,26 @@ class TestManagedEntries < Test::Unit::TestCase
|
|
167
173
|
c.file.open("index.html", "w") do |f|
|
168
174
|
f.puts "<html />"
|
169
175
|
end
|
176
|
+
|
177
|
+
# Test hidden entries before and after creation.
|
178
|
+
assert_nil(c.find_entry("test", :include_hidden => true))
|
179
|
+
assert_nil(c.find_entry("test/test.txt", :include_hidden => true))
|
180
|
+
c.dir.mkdir("test")
|
181
|
+
c.file.open("test/test.txt", "w") do |f|
|
182
|
+
f.puts "A test!"
|
183
|
+
end
|
184
|
+
assert_not_nil(c.find_entry("test", :include_hidden => true))
|
185
|
+
assert_not_nil(c.find_entry("test/test.txt", :include_hidden => true))
|
186
|
+
|
187
|
+
# Test deep hidden entries before and after creation.
|
188
|
+
assert_nil(c.find_entry("test/deep", :include_hidden => true))
|
189
|
+
assert_nil(c.find_entry("test/deep/deep.txt", :include_hidden => true))
|
190
|
+
c.dir.mkdir("test/deep")
|
191
|
+
c.file.open("test/deep/deep.txt", "w") do |f|
|
192
|
+
f.puts "A deep test!"
|
193
|
+
end
|
194
|
+
assert_not_nil(c.find_entry("test/deep", :include_hidden => true))
|
195
|
+
assert_not_nil(c.find_entry("test/deep/deep.txt", :include_hidden => true))
|
170
196
|
end
|
171
197
|
end
|
172
198
|
|
@@ -177,6 +203,95 @@ class TestManagedEntries < Test::Unit::TestCase
|
|
177
203
|
end
|
178
204
|
end
|
179
205
|
|
206
|
+
def test_hidden_entries
|
207
|
+
assert_nothing_raised do
|
208
|
+
ManagedZipContainer.open($subclass) do |c|
|
209
|
+
refute(c.hidden_entry?("src"))
|
210
|
+
refute(c.hidden_file?("src"))
|
211
|
+
refute(c.hidden_directory?("src"))
|
212
|
+
|
213
|
+
assert(c.hidden_entry?("test"))
|
214
|
+
assert(c.hidden_directory?("test"))
|
215
|
+
assert(c.hidden_entry?("test/"))
|
216
|
+
assert(c.hidden_directory?("test/"))
|
217
|
+
refute(c.hidden_file?("test"))
|
218
|
+
|
219
|
+
assert(c.hidden_entry?("test/deep"))
|
220
|
+
assert(c.hidden_directory?("test/deep"))
|
221
|
+
assert(c.hidden_entry?("test/deep/deep.txt"))
|
222
|
+
assert(c.hidden_file?("test/deep/deep.txt"))
|
223
|
+
end
|
224
|
+
end
|
225
|
+
end
|
226
|
+
|
227
|
+
def test_find_entry
|
228
|
+
assert_nothing_raised do
|
229
|
+
ManagedZipContainer.open($subclass) do |c|
|
230
|
+
assert_not_nil(c.find_entry("src"))
|
231
|
+
assert_not_nil(c.find_entry("src", :include_hidden => true))
|
232
|
+
|
233
|
+
assert_nil(c.find_entry("test"))
|
234
|
+
assert_nil(c.find_entry("test/test.txt"))
|
235
|
+
assert_not_nil(c.find_entry("test", :include_hidden => true))
|
236
|
+
assert_not_nil(c.find_entry("test/test.txt", :include_hidden => true))
|
237
|
+
|
238
|
+
assert_nil(c.find_entry("test/deep"))
|
239
|
+
assert_nil(c.find_entry("test/deep/deep.txt"))
|
240
|
+
assert_not_nil(c.find_entry("test/deep", :include_hidden => true))
|
241
|
+
assert_not_nil(c.find_entry("test/deep/deep.txt", :include_hidden => true))
|
242
|
+
end
|
243
|
+
end
|
244
|
+
end
|
245
|
+
|
246
|
+
def test_get_entry
|
247
|
+
ManagedZipContainer.open($subclass) do |c|
|
248
|
+
assert_nothing_raised(Errno::ENOENT) do
|
249
|
+
c.get_entry("src")
|
250
|
+
end
|
251
|
+
assert_nothing_raised(Errno::ENOENT) do
|
252
|
+
c.get_entry("src", :include_hidden => true)
|
253
|
+
end
|
254
|
+
|
255
|
+
assert_raise(Errno::ENOENT) do
|
256
|
+
c.get_entry("test")
|
257
|
+
end
|
258
|
+
assert_raise(Errno::ENOENT) do
|
259
|
+
c.get_entry("test/test.txt")
|
260
|
+
end
|
261
|
+
assert_nothing_raised(Errno::ENOENT) do
|
262
|
+
c.get_entry("test", :include_hidden => true)
|
263
|
+
end
|
264
|
+
assert_nothing_raised(Errno::ENOENT) do
|
265
|
+
c.get_entry("test/test.txt", :include_hidden => true)
|
266
|
+
end
|
267
|
+
|
268
|
+
assert_raise(Errno::ENOENT) do
|
269
|
+
c.get_entry("test/deep")
|
270
|
+
end
|
271
|
+
assert_raise(Errno::ENOENT) do
|
272
|
+
c.get_entry("test/deep/deep.txt")
|
273
|
+
end
|
274
|
+
assert_nothing_raised(Errno::ENOENT) do
|
275
|
+
c.get_entry("test/deep", :include_hidden => true)
|
276
|
+
end
|
277
|
+
assert_nothing_raised(Errno::ENOENT) do
|
278
|
+
c.get_entry("test/deep/deep.txt", :include_hidden => true)
|
279
|
+
end
|
280
|
+
end
|
281
|
+
end
|
282
|
+
|
283
|
+
def test_glob
|
284
|
+
ManagedZipContainer.open($subclass) do |c|
|
285
|
+
assert_equal(["index.html"], entry_list_names(c.glob("in*")))
|
286
|
+
assert_equal([], c.glob("test/**/*"))
|
287
|
+
assert_equal(["test/test.txt", "test/deep", "test/deep/deep.txt"],
|
288
|
+
entry_list_names(c.glob("test/**/*", :include_hidden => true)))
|
289
|
+
assert_equal(["test/test.txt", "test/deep/deep.txt"],
|
290
|
+
entry_list_names(c.glob("**/*.TXT", ::File::FNM_CASEFOLD,
|
291
|
+
:include_hidden => true)))
|
292
|
+
end
|
293
|
+
end
|
294
|
+
|
180
295
|
def test_create_subclassed_mimetype
|
181
296
|
Dir.mktmpdir do |dir|
|
182
297
|
filename = File.join(dir, "test.container")
|