archive-zip 0.1.1 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/MANIFEST +7 -6
- data/NEWS +17 -7
- data/README +22 -1
- data/lib/archive/zip.rb +105 -36
- data/lib/archive/zip/codec.rb +35 -14
- data/lib/archive/zip/codec/deflate.rb +34 -32
- data/lib/archive/zip/codec/null_encryption.rb +176 -0
- data/lib/archive/zip/codec/store.rb +46 -40
- data/lib/archive/zip/codec/traditional_encryption.rb +308 -0
- data/lib/archive/zip/{datadescriptor.rb → data_descriptor.rb} +8 -6
- data/lib/archive/zip/entry.rb +290 -135
- data/lib/archive/zip/{extrafield.rb → extra_field.rb} +3 -3
- data/lib/archive/zip/{extrafield/extendedtimestamp.rb → extra_field/extended_timestamp.rb} +0 -0
- data/lib/archive/zip/{extrafield → extra_field}/raw.rb +0 -0
- data/lib/archive/zip/{extrafield → extra_field}/unix.rb +0 -0
- metadata +9 -8
- data/test/test_archive.rb +0 -8
data/MANIFEST
CHANGED
@@ -15,12 +15,13 @@ lib/archive/support/zlib.rb
|
|
15
15
|
lib/archive/zip.rb
|
16
16
|
lib/archive/zip/codec.rb
|
17
17
|
lib/archive/zip/codec/deflate.rb
|
18
|
+
lib/archive/zip/codec/null_encryption.rb
|
18
19
|
lib/archive/zip/codec/store.rb
|
20
|
+
lib/archive/zip/codec/traditional_encryption.rb
|
21
|
+
lib/archive/zip/data_descriptor.rb
|
19
22
|
lib/archive/zip/entry.rb
|
20
|
-
lib/archive/zip/datadescriptor.rb
|
21
|
-
lib/archive/zip/extrafield.rb
|
22
|
-
lib/archive/zip/extrafield/extendedtimestamp.rb
|
23
|
-
lib/archive/zip/extrafield/raw.rb
|
24
|
-
lib/archive/zip/extrafield/unix.rb
|
25
23
|
lib/archive/zip/error.rb
|
26
|
-
|
24
|
+
lib/archive/zip/extra_field.rb
|
25
|
+
lib/archive/zip/extra_field/extended_timestamp.rb
|
26
|
+
lib/archive/zip/extra_field/raw.rb
|
27
|
+
lib/archive/zip/extra_field/unix.rb
|
data/NEWS
CHANGED
@@ -6,6 +6,16 @@ detailed information is available in the rest of the documentation.
|
|
6
6
|
<b>NOTE:</b> Date stamps in the following entries are in YYYY/MM/DD format.
|
7
7
|
|
8
8
|
|
9
|
+
== v0.2.0 (2008/08/06)
|
10
|
+
|
11
|
+
* Traditional (weak) encryption is now supported.
|
12
|
+
* Adding new encryption methods should be easier now.
|
13
|
+
* Fixed a bug where the compression codec for an entry loaded from an archive
|
14
|
+
was not being recorded.
|
15
|
+
* The _compression_codec_ attribute for Entry instances is now used instead of
|
16
|
+
the _codec_ attribute to access the compression codec of the entry.
|
17
|
+
|
18
|
+
|
9
19
|
== v0.1.1 (2008/07/11)
|
10
20
|
|
11
21
|
* Archive files are now closed when the Archive::Zip object is closed even when
|
@@ -15,15 +25,15 @@ detailed information is available in the rest of the documentation.
|
|
15
25
|
|
16
26
|
== v0.1.0 (2008/07/10)
|
17
27
|
|
18
|
-
* Initial release
|
19
|
-
* Archive creation and extraction is supported with only a few lines of code
|
28
|
+
* Initial release.
|
29
|
+
* Archive creation and extraction is supported with only a few lines of code.
|
20
30
|
(See README)
|
21
|
-
* Archives can be updated "in place" or dumped out to other files or pipes
|
22
|
-
* Files, symlinks, and directories are supported within archives
|
23
|
-
* Unix permission/mode bits are supported
|
31
|
+
* Archives can be updated "in place" or dumped out to other files or pipes.
|
32
|
+
* Files, symlinks, and directories are supported within archives.
|
33
|
+
* Unix permission/mode bits are supported.
|
24
34
|
* Unix user and group ownerships are supported.
|
25
35
|
* Unix last accessed and last modified times are supported.
|
26
36
|
* Entry extension (AKA extra field) implementations can be added on the fly.
|
27
37
|
* Unknown entry extension types are preserved during archive processing.
|
28
|
-
* Deflate and Store compression codecs supported out of the box
|
29
|
-
* More compression codecs can be added on the fly
|
38
|
+
* Deflate and Store compression codecs are supported out of the box.
|
39
|
+
* More compression codecs can be added on the fly.
|
data/README
CHANGED
@@ -56,6 +56,23 @@ Create a few archives:
|
|
56
56
|
:path_prefix => 'a/b/c'
|
57
57
|
)
|
58
58
|
|
59
|
+
# Add the contents of a_directory to example5.zip and encrypt Ruby source
|
60
|
+
# files.
|
61
|
+
require 'archive/zip/codec/null_encryption'
|
62
|
+
require 'archive/zip/codec/traditional_encryption'
|
63
|
+
Archive::Zip.archive(
|
64
|
+
'example5.zip',
|
65
|
+
'a_directory/.',
|
66
|
+
:encryption_codec => lambda do |entry|
|
67
|
+
if entry.file? and entry.zip_path =~ /\.rb$/ then
|
68
|
+
Archive::Zip::Codec::TraditionalEncryption
|
69
|
+
else
|
70
|
+
Archive::Zip::Codec::NullEncryption
|
71
|
+
end
|
72
|
+
end,
|
73
|
+
:password => 'seakrit'
|
74
|
+
)
|
75
|
+
|
59
76
|
# Create a new archive which will be written to a pipe.
|
60
77
|
# Assume $stdout is the write end a pipe.
|
61
78
|
# (ruby example.rb | cat >example.zip)
|
@@ -93,6 +110,9 @@ Now extract those archives:
|
|
93
110
|
:overwrite => :older
|
94
111
|
)
|
95
112
|
|
113
|
+
# Extract example5.zip to a_destination, decrypting the contents.
|
114
|
+
Archive::Zip.extract('example5.zip', 'a_destination', :password => 'seakrit')
|
115
|
+
|
96
116
|
|
97
117
|
== Features
|
98
118
|
|
@@ -107,6 +127,7 @@ Now extract those archives:
|
|
107
127
|
9. Unknown entry extension types are preserved during archive processing.
|
108
128
|
10. The Deflate and Store compression codecs are supported out of the box.
|
109
129
|
11. More compression codecs can be added on the fly.
|
130
|
+
12. Traditional (weak) encryption is supported out of the box.
|
110
131
|
|
111
132
|
|
112
133
|
== Known Bugs/Limitations
|
@@ -119,7 +140,7 @@ Now extract those archives:
|
|
119
140
|
4. Reading archives from non-seekable IO, such as pipes and sockets, is not
|
120
141
|
supported.
|
121
142
|
5. MSDOS permission attributes are not supported.
|
122
|
-
6.
|
143
|
+
6. Strong encryption is not supported.
|
123
144
|
7. Zip64 is not supported.
|
124
145
|
8. Digital signatures are not supported.
|
125
146
|
|
data/lib/archive/zip.rb
CHANGED
@@ -19,12 +19,12 @@ module Archive # :nodoc:
|
|
19
19
|
# entries, directory entries, file entries, and symlink entries. File and
|
20
20
|
# directory accessed and modified times, POSIX permissions, and ownerships can
|
21
21
|
# be archived and restored as well depending on platform support for such
|
22
|
-
# metadata.
|
22
|
+
# metadata. Traditional (weak) encryption is also supported.
|
23
23
|
#
|
24
|
-
# Zip64, digital signatures, and encryption are not supported. ZIP
|
25
|
-
# can only be read from seekable kinds of IO, such as files; reading
|
26
|
-
# from pipes or any other non-seekable kind of IO is not supported.
|
27
|
-
# writing to such IO objects <b><em>IS</em></b> supported.
|
24
|
+
# Zip64, digital signatures, and strong encryption are not supported. ZIP
|
25
|
+
# archives can only be read from seekable kinds of IO, such as files; reading
|
26
|
+
# archives from pipes or any other non-seekable kind of IO is not supported.
|
27
|
+
# However, writing to such IO objects <b><em>IS</em></b> supported.
|
28
28
|
class Zip
|
29
29
|
include Enumerable
|
30
30
|
|
@@ -251,15 +251,24 @@ module Archive # :nodoc:
|
|
251
251
|
# from the archive and +false+ if it should be included. <b>NOTE:</b> If
|
252
252
|
# a directory is excluded in this way, the <b>:recursion</b> option has no
|
253
253
|
# effect for it.
|
254
|
-
# <b>:
|
255
|
-
#
|
256
|
-
#
|
257
|
-
#
|
254
|
+
# <b>:password</b>::
|
255
|
+
# Specifies a proc, lambda, or a String. If a proc or lambda is used, it
|
256
|
+
# must take a single argument containing a zip entry and return a String
|
257
|
+
# to be used as an encryption key for the entry. If a String is used, it
|
258
|
+
# will be used as an encryption key for all encrypted entries.
|
259
|
+
# <b>:on_error</b>::
|
260
|
+
# Specifies a proc or lambda which is called when an exception is raised
|
261
|
+
# during the archival of an entry. It takes two arguments, a file path
|
262
|
+
# and an exception object generated while attempting to archive the entry.
|
263
|
+
# If <tt>:retry</tt> is returned, archival of the entry is attempted
|
264
|
+
# again. If <tt>:skip</tt> is returned, the entry is skipped. Otherwise,
|
265
|
+
# the exception is raised.
|
258
266
|
# Any other options which are supported by Archive::Zip::Entry.from_file are
|
259
267
|
# also supported.
|
260
268
|
#
|
261
269
|
# Raises Archive::Zip::IOError if called after #close. Raises
|
262
|
-
# Archive::Zip::EntryError if the <b>:
|
270
|
+
# Archive::Zip::EntryError if the <b>:on_error</b> option is either unset or
|
271
|
+
# indicates that the error should be raised and
|
263
272
|
# Archive::Zip::Entry.from_file raises an error.
|
264
273
|
#
|
265
274
|
# == Example
|
@@ -333,7 +342,6 @@ module Archive # :nodoc:
|
|
333
342
|
options[:directories] = true unless options.has_key?(:directories)
|
334
343
|
options[:symlinks] = false unless options.has_key?(:symlinks)
|
335
344
|
options[:flatten] = false unless options.has_key?(:flatten)
|
336
|
-
options[:ignore_error] = false unless options.has_key?(:ignore_error)
|
337
345
|
|
338
346
|
# Flattening the directory structure implies that directories are skipped
|
339
347
|
# and that the path prefix should be ignored.
|
@@ -364,10 +372,16 @@ module Archive # :nodoc:
|
|
364
372
|
! options[:symlinks]
|
365
373
|
)
|
366
374
|
)
|
367
|
-
rescue
|
368
|
-
|
369
|
-
|
370
|
-
|
375
|
+
rescue StandardError => error
|
376
|
+
unless options[:on_error].nil? then
|
377
|
+
case options[:on_error][path, error]
|
378
|
+
when :retry
|
379
|
+
retry
|
380
|
+
when :skip
|
381
|
+
next
|
382
|
+
else
|
383
|
+
raise
|
384
|
+
end
|
371
385
|
else
|
372
386
|
raise
|
373
387
|
end
|
@@ -375,16 +389,22 @@ module Archive # :nodoc:
|
|
375
389
|
|
376
390
|
# Skip this entry if so directed.
|
377
391
|
if (zip_entry.symlink? && ! options[:symlinks]) ||
|
378
|
-
(! options[:exclude].nil? && options[:exclude]
|
392
|
+
(! options[:exclude].nil? && options[:exclude][zip_entry]) then
|
379
393
|
next
|
380
394
|
end
|
381
395
|
|
396
|
+
# Set the encryption key for the entry.
|
397
|
+
if options[:password].kind_of?(String) then
|
398
|
+
zip_entry.password = options[:password]
|
399
|
+
elsif ! options[:password].nil? then
|
400
|
+
zip_entry.password = options[:password][zip_entry]
|
401
|
+
end
|
402
|
+
|
382
403
|
# Add entries for directories (if requested) and files/symlinks.
|
383
404
|
if (! zip_entry.directory? || options[:directories]) then
|
384
405
|
add_entry(zip_entry)
|
385
406
|
end
|
386
407
|
|
387
|
-
|
388
408
|
# Recurse into subdirectories (if requested).
|
389
409
|
if zip_entry.directory? && options[:recursion] then
|
390
410
|
archive(
|
@@ -436,6 +456,18 @@ module Archive # :nodoc:
|
|
436
456
|
# Specifies a proc or lambda which takes a single argument containing a
|
437
457
|
# zip entry and returns +true+ if the entry should be skipped during
|
438
458
|
# extraction and +false+ if it should be extracted.
|
459
|
+
# <b>:password</b>::
|
460
|
+
# Specifies a proc, lambda, or a String. If a proc or lambda is used, it
|
461
|
+
# must take a single argument containing a zip entry and return a String
|
462
|
+
# to be used as a decryption key for the entry. If a String is used, it
|
463
|
+
# will be used as a decryption key for all encrypted entries.
|
464
|
+
# <b>:on_error</b>::
|
465
|
+
# Specifies a proc or lambda which is called when an exception is raised
|
466
|
+
# during the extraction of an entry. It takes two arguments, a zip entry
|
467
|
+
# and an exception object generated while attempting to extract the entry.
|
468
|
+
# If <tt>:retry</tt> is returned, extraction of the entry is attempted
|
469
|
+
# again. If <tt>:skip</tt> is returned, the entry is skipped. Otherwise,
|
470
|
+
# the exception is raised.
|
439
471
|
# Any other options which are supported by Archive::Zip::Entry#extract are
|
440
472
|
# also supported.
|
441
473
|
#
|
@@ -522,23 +554,44 @@ module Archive # :nodoc:
|
|
522
554
|
file_exists = File.exist?(file_path)
|
523
555
|
file_mtime = File.mtime(file_path) if file_exists
|
524
556
|
|
525
|
-
|
526
|
-
|
527
|
-
|
528
|
-
|
529
|
-
|
530
|
-
|
531
|
-
|
532
|
-
|
557
|
+
begin
|
558
|
+
# Skip this entry if so directed.
|
559
|
+
if (! file_exists && ! options[:create]) ||
|
560
|
+
(file_exists &&
|
561
|
+
(options[:overwrite] == :never ||
|
562
|
+
options[:overwrite] == :older && entry.mtime <= file_mtime)) ||
|
563
|
+
(! options[:exclude].nil? && options[:exclude][entry]) then
|
564
|
+
next
|
565
|
+
end
|
533
566
|
|
534
|
-
|
535
|
-
|
536
|
-
|
537
|
-
|
538
|
-
|
539
|
-
|
540
|
-
|
541
|
-
|
567
|
+
# Set the decryption key for the entry.
|
568
|
+
if options[:password].kind_of?(String) then
|
569
|
+
entry.password = options[:password]
|
570
|
+
elsif ! options[:password].nil? then
|
571
|
+
entry.password = options[:password][entry]
|
572
|
+
end
|
573
|
+
|
574
|
+
if entry.directory? then
|
575
|
+
# Record the directories as they are encountered.
|
576
|
+
directories << entry
|
577
|
+
elsif entry.file? || (entry.symlink? && options[:symlinks]) then
|
578
|
+
# Extract files and symlinks.
|
579
|
+
entry.extract(
|
580
|
+
options.merge(:file_path => file_path)
|
581
|
+
)
|
582
|
+
end
|
583
|
+
rescue StandardError => error
|
584
|
+
unless options[:on_error].nil? then
|
585
|
+
case options[:on_error][entry, error]
|
586
|
+
when :retry
|
587
|
+
retry
|
588
|
+
when :skip
|
589
|
+
else
|
590
|
+
raise
|
591
|
+
end
|
592
|
+
else
|
593
|
+
raise
|
594
|
+
end
|
542
595
|
end
|
543
596
|
end
|
544
597
|
|
@@ -546,9 +599,25 @@ module Archive # :nodoc:
|
|
546
599
|
# Then extract the directory entries in depth first order so that time
|
547
600
|
# stamps, ownerships, and permissions can be properly restored.
|
548
601
|
directories.sort { |a, b| b.zip_path <=> a.zip_path }.each do |entry|
|
549
|
-
|
550
|
-
|
551
|
-
|
602
|
+
begin
|
603
|
+
entry.extract(
|
604
|
+
options.merge(
|
605
|
+
:file_path => File.join(destination, entry.zip_path)
|
606
|
+
)
|
607
|
+
)
|
608
|
+
rescue StandardError => error
|
609
|
+
unless options[:on_error].nil? then
|
610
|
+
case options[:on_error][entry, error]
|
611
|
+
when :retry
|
612
|
+
retry
|
613
|
+
when :skip
|
614
|
+
else
|
615
|
+
raise
|
616
|
+
end
|
617
|
+
else
|
618
|
+
raise
|
619
|
+
end
|
620
|
+
end
|
552
621
|
end
|
553
622
|
end
|
554
623
|
|
data/lib/archive/zip/codec.rb
CHANGED
@@ -7,24 +7,45 @@ module Archive; class Zip
|
|
7
7
|
# of Archive::Zip::Codec::Deflate and Archive::Zip::Codec::Store for details
|
8
8
|
# on implementing custom codecs.
|
9
9
|
module Codec
|
10
|
-
# A Hash mapping compression methods to codec implementations.
|
11
|
-
# must add a mapping here when defined in order to be
|
12
|
-
|
10
|
+
# A Hash mapping compression methods to compression codec implementations.
|
11
|
+
# New compression codecs must add a mapping here when defined in order to be
|
12
|
+
# used.
|
13
|
+
COMPRESSION_CODECS = {}
|
13
14
|
|
14
|
-
#
|
15
|
+
# A Hash mapping encryption methods to encryption codec implementations.
|
16
|
+
# New encryption codecs must add a mapping here when defined in order to be
|
17
|
+
# used.
|
18
|
+
ENCRYPTION_CODECS = {}
|
19
|
+
|
20
|
+
# Returns a new compression codec instance based on _compression_method_ and
|
15
21
|
# _general_purpose_flags_.
|
16
|
-
def self.
|
17
|
-
|
22
|
+
def self.create_compression_codec(compression_method, general_purpose_flags)
|
23
|
+
# Load the standard compression codecs.
|
24
|
+
require 'archive/zip/codec/deflate'
|
25
|
+
require 'archive/zip/codec/store'
|
26
|
+
|
27
|
+
codec = COMPRESSION_CODECS[compression_method].new(general_purpose_flags)
|
28
|
+
raise Zip::Error, 'unsupported compression codec' if codec.nil?
|
29
|
+
codec
|
18
30
|
end
|
19
31
|
|
20
|
-
# Returns
|
21
|
-
#
|
22
|
-
|
23
|
-
|
32
|
+
# Returns a new encryption codec instance based on _general_purpose_flags_.
|
33
|
+
#
|
34
|
+
# <b>NOTE:</b> The signature of this method will have to change in order to
|
35
|
+
# support the strong encryption codecs. This is intended to be an internal
|
36
|
+
# method anyway, so this fact should not cause major issues for users of
|
37
|
+
# this library.
|
38
|
+
def self.create_encryption_codec(general_purpose_flags)
|
39
|
+
general_purpose_flags &= 0b0000000001000001
|
40
|
+
if general_purpose_flags == 0b0000000000000000 then
|
41
|
+
require 'archive/zip/codec/null_encryption'
|
42
|
+
codec = NullEncryption.new
|
43
|
+
elsif general_purpose_flags == 0b0000000000000001 then
|
44
|
+
require 'archive/zip/codec/traditional_encryption'
|
45
|
+
codec = TraditionalEncryption.new
|
46
|
+
end
|
47
|
+
raise Zip::Error, 'unsupported encryption codec' if codec.nil?
|
48
|
+
codec
|
24
49
|
end
|
25
50
|
end
|
26
51
|
end; end
|
27
|
-
|
28
|
-
# Load the standard codecs.
|
29
|
-
require 'archive/zip/codec/deflate'
|
30
|
-
require 'archive/zip/codec/store'
|
@@ -1,21 +1,21 @@
|
|
1
1
|
require 'archive/support/zlib'
|
2
2
|
require 'archive/zip/codec'
|
3
|
-
require 'archive/zip/
|
3
|
+
require 'archive/zip/data_descriptor'
|
4
4
|
|
5
5
|
module Archive; class Zip; module Codec
|
6
|
-
# Archive::Zip::Codec::Deflate is a handle for the deflate-inflate codec
|
7
|
-
# defined in Zlib which provides convenient interfaces for writing and
|
8
|
-
# deflated streams.
|
6
|
+
# Archive::Zip::Codec::Deflate is a handle for the deflate-inflate codec
|
7
|
+
# as defined in Zlib which provides convenient interfaces for writing and
|
8
|
+
# reading deflated streams.
|
9
9
|
class Deflate
|
10
|
-
# Archive::Zip::Codec::Deflate::
|
10
|
+
# Archive::Zip::Codec::Deflate::Compress extends Zlib::ZWriter in order to
|
11
11
|
# specify the standard Zlib options required by ZIP archives and to provide
|
12
|
-
# a close method which can optionally close the delegate IO-like object.
|
13
|
-
# addition a convenience method is provided for generating DataDescriptor
|
12
|
+
# a close method which can optionally close the delegate IO-like object.
|
13
|
+
# In addition a convenience method is provided for generating DataDescriptor
|
14
14
|
# objects based on the data which is passed through this object.
|
15
15
|
#
|
16
16
|
# Instances of this class should only be accessed via the
|
17
17
|
# Archive::Zip::Codec::Deflate#compressor method.
|
18
|
-
class
|
18
|
+
class Compress < Zlib::ZWriter
|
19
19
|
# Creates a new instance of this class with the given arguments using #new
|
20
20
|
# and then passes the instance to the given block. The #close method is
|
21
21
|
# guaranteed to be called after the block completes.
|
@@ -61,15 +61,15 @@ module Archive; class Zip; module Codec
|
|
61
61
|
end
|
62
62
|
end
|
63
63
|
|
64
|
-
# Archive::Zip::Codec::Deflate::
|
64
|
+
# Archive::Zip::Codec::Deflate::Decompress extends Zlib::ZReader in order to
|
65
65
|
# specify the standard Zlib options required by ZIP archives and to provide
|
66
|
-
# a close method which can optionally close the delegate IO-like object.
|
67
|
-
# addition a convenience method is provided for generating DataDescriptor
|
66
|
+
# a close method which can optionally close the delegate IO-like object.
|
67
|
+
# In addition a convenience method is provided for generating DataDescriptor
|
68
68
|
# objects based on the data which is passed through this object.
|
69
69
|
#
|
70
70
|
# Instances of this class should only be accessed via the
|
71
71
|
# Archive::Zip::Codec::Deflate#decompressor method.
|
72
|
-
class
|
72
|
+
class Decompress < Zlib::ZReader
|
73
73
|
# Creates a new instance of this class with the given arguments using #new
|
74
74
|
# and then passes the instance to the given block. The #close method is
|
75
75
|
# guaranteed to be called after the block completes.
|
@@ -112,11 +112,12 @@ module Archive; class Zip; module Codec
|
|
112
112
|
end
|
113
113
|
end
|
114
114
|
|
115
|
-
# The numeric identifier assigned to this codec by the ZIP
|
115
|
+
# The numeric identifier assigned to this compression codec by the ZIP
|
116
|
+
# specification.
|
116
117
|
ID = 8
|
117
118
|
|
118
|
-
# Register this codec.
|
119
|
-
|
119
|
+
# Register this compression codec.
|
120
|
+
COMPRESSION_CODECS[ID] = self
|
120
121
|
|
121
122
|
# A bit mask used to denote that Zlib's default compression level should be
|
122
123
|
# used.
|
@@ -131,7 +132,7 @@ module Archive; class Zip; module Codec
|
|
131
132
|
SUPER_FAST = 0b110
|
132
133
|
|
133
134
|
# This method signature is part of the interface contract expected by
|
134
|
-
# Archive::Zip::Entry for codec objects.
|
135
|
+
# Archive::Zip::Entry for compression codec objects.
|
135
136
|
#
|
136
137
|
# Creates a new instance of this class using bits 1 and 2 of
|
137
138
|
# _general_purpose_flags_ to select a compression level to be used by
|
@@ -155,45 +156,46 @@ module Archive; class Zip; module Codec
|
|
155
156
|
end
|
156
157
|
|
157
158
|
# This method signature is part of the interface contract expected by
|
158
|
-
# Archive::Zip::Entry for codec objects.
|
159
|
+
# Archive::Zip::Entry for compression codec objects.
|
159
160
|
#
|
160
|
-
# A convenience method for creating an
|
161
|
-
# object using that class' open
|
162
|
-
# method
|
163
|
-
# new.
|
161
|
+
# A convenience method for creating an
|
162
|
+
# Archive::Zip::Codec::Deflate::Compress object using that class' open
|
163
|
+
# method. The compression level for the open method is pulled from the
|
164
|
+
# value of the _general_purpose_flags_ argument of new.
|
164
165
|
def compressor(io, &b)
|
165
|
-
|
166
|
+
Compress.open(io, @zlib_compression_level, &b)
|
166
167
|
end
|
167
168
|
|
168
169
|
# This method signature is part of the interface contract expected by
|
169
|
-
# Archive::Zip::Entry for codec objects.
|
170
|
+
# Archive::Zip::Entry for compression codec objects.
|
170
171
|
#
|
171
|
-
# A convenience method for creating an
|
172
|
-
# object using that class' open
|
172
|
+
# A convenience method for creating an
|
173
|
+
# Archive::Zip::Codec::Deflate::Decompress object using that class' open
|
174
|
+
# method.
|
173
175
|
def decompressor(io, &b)
|
174
|
-
|
176
|
+
Decompress.open(io, &b)
|
175
177
|
end
|
176
178
|
|
177
179
|
# This method signature is part of the interface contract expected by
|
178
|
-
# Archive::Zip::Entry for codec objects.
|
180
|
+
# Archive::Zip::Entry for compression codec objects.
|
179
181
|
#
|
180
182
|
# Returns an integer which indicates the version of the official ZIP
|
181
|
-
# specification which introduced support for this codec.
|
183
|
+
# specification which introduced support for this compression codec.
|
182
184
|
def version_needed_to_extract
|
183
185
|
0x0014
|
184
186
|
end
|
185
187
|
|
186
188
|
# This method signature is part of the interface contract expected by
|
187
|
-
# Archive::Zip::Entry for codec objects.
|
189
|
+
# Archive::Zip::Entry for compression codec objects.
|
188
190
|
#
|
189
|
-
# Returns an integer used to flag that this codec is used for a
|
190
|
-
# ZIP archive entry.
|
191
|
+
# Returns an integer used to flag that this compression codec is used for a
|
192
|
+
# particular ZIP archive entry.
|
191
193
|
def compression_method
|
192
194
|
ID
|
193
195
|
end
|
194
196
|
|
195
197
|
# This method signature is part of the interface contract expected by
|
196
|
-
# Archive::Zip::Entry for codec objects.
|
198
|
+
# Archive::Zip::Entry for compression codec objects.
|
197
199
|
#
|
198
200
|
# Returns an integer representing the general purpose flags of a ZIP archive
|
199
201
|
# entry where bits 1 and 2 are set according to the compression level
|