Upgraded rubyzip to 0.5.8

This commit is contained in:
Alexey Verkhovsky 2005-04-10 16:55:44 +00:00
parent ee876a2907
commit f776807dff
37 changed files with 1513 additions and 710 deletions

View file

@ -1,3 +1,9 @@
* TODO:
BlueCloth is back (RedCloth didn't do Markdown well enough to replace it).
* SVN trunk:
Handling of line breaks in Textile is as in 0.9 (inserts <br/> tag).
Upgraded rubyzip to version 0.5.8
* 0.10.0: * 0.10.0:
Ported to ActionPack Ported to ActionPack
RedCloth 3.0.3 RedCloth 3.0.3

View file

@ -38,7 +38,7 @@ unless defined? ADDITIONAL_LOAD_PATHS
vendor/rails/actionwebservice/lib vendor/rails/actionwebservice/lib
vendor/madeleine-0.7.1/lib vendor/madeleine-0.7.1/lib
vendor/RedCloth-3.0.3/lib vendor/RedCloth-3.0.3/lib
vendor/rubyzip-0.5.6 vendor/rubyzip-0.5.8/lib
).map { |dir| "#{File.expand_path(File.join(RAILS_ROOT, dir))}" ).map { |dir| "#{File.expand_path(File.join(RAILS_ROOT, dir))}"
}.delete_if { |dir| not File.exist?(dir) } }.delete_if { |dir| not File.exist?(dir) }

View file

@ -26,7 +26,7 @@ spec = Gem::Specification.new do |s|
s.add_dependency('madeleine', '= 0.7.1') s.add_dependency('madeleine', '= 0.7.1')
s.add_dependency('RedCloth', '= 3.0.3') s.add_dependency('RedCloth', '= 3.0.3')
s.add_dependency('rubyzip', '= 0.5.5') s.add_dependency('rubyzip', '= 0.5.8')
s.add_dependency('rails', '= 0.11.1') s.add_dependency('rails', '= 0.11.1')
s.requirements << 'none' s.requirements << 'none'
s.require_path = 'lib' s.require_path = 'lib'

View file

@ -1,49 +0,0 @@
= rubyzip
rubyzip is a ruby library for reading and writing zip (pkzip format)
files, with the restriction that only uncompressed and deflated zip
entries are supported. All this library does is handling of the zip
file format. the actual compression/decompression is handled by
zlib. zlib is accessible from ruby thanks to ruby/zlib (see below)
To run the unit tests you need to have rubyunit or test::unit
installed.
= Install
ruby install.rb
= Prerequisites
This library requires ruby/zlib version 0.5.0 or newer. ruby/zlib is
included in most recent ruby distributions.
* zlib http://www.gzip.org/zlib/
* ruby-zlib: http://www.blue.sky.or.jp/atelier/ruby/
= Documentation
The samples/ directory is a good place to start to get a feel for
using the library. For details about the specific behaviour of classes
and methods refer to the test suite. Finally you can generate the rdoc
documentation or visit http://rubyzip.sourceforge.net/doc.
= License
rubyzip is distributed under the same license as ruby. See
http://www.ruby-lang.org/en/LICENSE.txt
= Project Home
http://rubyzip.sourceforge.net
= Author
Thomas Sondergaard (thomas at thomassondergaard.com)
extra-field support contributed by Tatsuki Sugiura (sugi at nemui.org)

View file

@ -1,20 +0,0 @@
$:.unshift '../lib'
require 'rubygems'
spec = Gem::Specification.new do |s|
s.name = 'rubyzip'
s.version = "0.5.5"
s.author = "Thomas Sondergaard"
s.email = "thomas(at)thomassondergaard.com"
s.homepage = "http://rubyzip.sourceforge.net/"
s.platform = Gem::Platform::RUBY
s.summary = "rubyzip is a ruby module for reading and writing zip files"
s.files = Dir.glob("{samples,zip,docs}/**/*").delete_if {|item| item.include?("CVS") || item.include?("rdoc")}
s.require_path = '.'
s.autorequire = 'zip/zip'
end
if $0==__FILE__
Gem::Builder.new(spec).build
end

487
vendor/rubyzip-0.5.6/ChangeLog → vendor/rubyzip-0.5.8/ChangeLog vendored Executable file → Normal file
View file

@ -1,7 +1,132 @@
2005-03-17 18:11 thomas
* NEWS, README, lib/zip/zip.rb: [no log message]
2005-03-17 18:04 thomas
* install.rb: Fixed install.rb
2005-03-03 18:38 thomas
* Rakefile: [no log message]
2005-02-27 16:23 thomas
* lib/zip/ziprequire.rb: Added documentation to ziprequire
2005-02-27 16:17 thomas
* README, TODO, lib/zip/ziprequire.rb: Added documentation to
ziprequire
2005-02-27 15:02 thomas
* Rakefile, test/ziptest.rb: [no log message]
2005-02-19 21:30 thomas
* lib/zip/ioextras.rb, lib/zip/stdrubyext.rb,
lib/zip/tempfile_bugfixed.rb, lib/zip/zip.rb,
lib/zip/ziprequire.rb, test/ioextrastest.rb,
test/stdrubyexttest.rb, test/zipfilesystemtest.rb,
test/ziprequiretest.rb, test/ziptest.rb: Added more rdoc and
changed the remaining tests to Test::Unit
2005-02-19 20:28 thomas
* lib/zip/: ioextras.rb, zip.rb: Added documentation to
ZipInputStream and ZipOutputStream
2005-02-18 10:27 thomas
* README: [no log message]
2005-02-17 23:21 thomas
* README, Rakefile: Added ppackage (publish package) task to
Rakefile
2005-02-17 22:49 thomas
* README, Rakefile, TODO: Added pdoc (publish doc) task to Rakefile
2005-02-17 21:27 thomas
* README, Rakefile, TODO, lib/zip/stdrubyext.rb, lib/zip/zip.rb,
lib/zip/zipfilesystem.rb: Added a bunch of documentation
2005-02-17 09:47 thomas
* test/ziptest.rb: [no log message]
2005-02-16 20:04 thomas
* NEWS, README, Rakefile: Improved documentation and added rdoc
task to Rakefile
2005-02-16 19:01 thomas
* NEWS, Rakefile, lib/zip/zip.rb: [no log message]
2005-02-16 18:47 thomas
* Rakefile, samples/example.rb, samples/example_filesystem.rb,
samples/gtkRubyzip.rb, samples/write_simple.rb,
samples/zipfind.rb, test/.cvsignore, test/gentestfiles.rb:
Improvements to Rakefile
2005-02-15 23:35 thomas
* NEWS, TODO: [no log message]
2005-02-15 23:26 thomas
* Rakefile, rubyzip.gemspec: Now uses Rake to build gem
2005-02-15 22:52 thomas
* Rakefile: [no log message]
2005-02-15 22:39 thomas
* lib/zip/zip.rb, test/.cvsignore, test/ziptest.rb, NEWS: Fixed
compatibility issue with ruby 1.8.2. Migrated test suite to
Test::Unit
2005-02-15 22:10 thomas
* NEWS, lib/zip/ioextras.rb, lib/zip/stdrubyext.rb,
lib/zip/tempfile_bugfixed.rb, lib/zip/zip.rb,
lib/zip/zipfilesystem.rb, lib/zip/ziprequire.rb, test/.cvsignore,
test/file1.txt, test/file1.txt.deflatedData, test/file2.txt,
test/gentestfiles.rb, test/ioextrastest.rb,
test/notzippedruby.rb, test/rubycode.zip, test/rubycode2.zip,
test/stdrubyexttest.rb, test/testDirectory.bin,
test/zipWithDirs.zip, test/zipfilesystemtest.rb,
test/ziprequiretest.rb, test/ziptest.rb, test/data/.cvsignore,
test/data/file1.txt, test/data/file1.txt.deflatedData,
test/data/file2.txt, test/data/notzippedruby.rb,
test/data/rubycode.zip, test/data/rubycode2.zip,
test/data/testDirectory.bin, test/data/zipWithDirs.zip: Changed
directory structure
2005-02-13 22:44 thomas
* Rakefile, TODO: [no log message]
2005-02-13 22:38 thomas
* rubyzip.gemspec: [no log message]
2005-02-13 21:53 thomas
* install.rb: Made install.rb independent of the current path
(fixes bug reported by Drew Robinson)
2004-12-12 11:22 thomas 2004-12-12 11:22 thomas
* NEWS, TODO, samples/write_simple.rb, zip/zip.rb: Fixed 'version * NEWS, TODO, samples/write_simple.rb: Fixed 'version needed to
needed to extract'-field wrong in local headers extract'-field wrong in local headers
2004-05-02 15:17 thomas 2004-05-02 15:17 thomas
@ -9,68 +134,65 @@
2004-04-02 07:25 thomas 2004-04-02 07:25 thomas
* NEWS, zip/zip.rb: Fix for FreeBSD 4.9 * NEWS: Fix for FreeBSD 4.9
2004-03-28 15:23 thomas 2004-03-29 00:28 thomas
* zip/zip.rb: Use RUBY_VERSION not VERSION constant * NEWS: [no log message]
2004-03-28 14:51 thomas 2004-03-28 17:59 thomas
* zip/zip.rb: Only use bugfixed Tempfile implementation if the ruby * NEWS: [no log message]
version hasnt been fixed (contributed by Nobu Nakada)
2004-03-28 14:46 thomas
* zip/tempfile_bugfixed.rb: Compatibility with DelegateClass in
ruby version 1.8.1 and newer
2004-03-27 16:09 thomas 2004-03-27 16:09 thomas
* test/stdrubyexttest.rb, zip/stdrubyext.rb: Patch for * test/stdrubyexttest.rb: Patch for stdrubyext.rb from Nobu Nakada
stdrubyext.rb from Nobu Nakada
2004-03-27 15:30 thomas 2004-03-27 15:30 thomas
* test/ioextrastest.rb, test/stdrubyexttest.rb, zip/ioextras.rb: * test/: ioextrastest.rb, stdrubyexttest.rb: converted some files
converted some files to unix line-endings to unix line-endings
2004-03-25 16:34 thomas 2004-03-25 16:34 thomas
* NEWS, install.rb, zip/tempfile_bugfixed.rb, zip/zip.rb: * NEWS, install.rb: Significantly reduced memory footprint when
Significantly reduced memory footprint when modifying zip files modifying zip files
2004-03-16 18:20 thomas 2004-03-16 18:20 thomas
* install.rb, test/alltests.rb, test/ioextrastest.rb, * install.rb, test/alltests.rb, test/ioextrastest.rb,
test/stdrubyexttest.rb, test/ziptest.rb, zip/ioextras.rb, test/stdrubyexttest.rb, test/ziptest.rb: IO utility classes moved
zip/zip.rb: IO utility classes moved to new file ioextras.rb. to new file ioextras.rb. Tests moved to new file ioextrastest.rb
Tests moved to new file ioextrastest.rb
2004-02-27 13:21 thomas 2004-02-27 13:21 thomas
* NEWS, zip/zip.rb: Optimization to avoid decompression and * NEWS: Optimization to avoid decompression and recompression
recompression
2004-01-30 16:17 thomas
* NEWS: [no log message]
2004-01-30 16:07 thomas 2004-01-30 16:07 thomas
* README, test/zipfilesystemtest.rb, test/ziptest.rb, * README, test/zipfilesystemtest.rb, test/ziptest.rb: Applied
zip/stdrubyext.rb, zip/zip.rb, zip/zipfilesystem.rb: Applied
extra-field patch extra-field patch
2003-12-13 16:57 thomas
* TODO: [no log message]
2003-12-10 00:25 thomas 2003-12-10 00:25 thomas
* test/ziptest.rb: (Temporary) fix to bug reported by Takashi Sano * test/ziptest.rb: (Temporary) fix to bug reported by Takashi Sano
2003-10-03 11:05 thomas
* zip/: stdrubyext.rb, zip.rb: Thanks to Clifford Heath for
noticing that Time.to_binary_dos_date and time were reversed
2003-08-23 09:42 thomas 2003-08-23 09:42 thomas
* test/ziptest.rb, zip/zip.rb, NEWS: Fixed ZipFile.get_ouput_stream * test/ziptest.rb, NEWS: Fixed ZipFile.get_ouput_stream bug - data
bug - data was never written to zip was never written to zip
2003-08-21 16:05 thomas
* install.rb: [no log message]
2003-08-21 16:01 thomas 2003-08-21 16:01 thomas
@ -86,10 +208,12 @@
zipfilesystem.rb, zipfilesystemtest.rb, ziprequire.rb, zipfilesystem.rb, zipfilesystemtest.rb, ziprequire.rb,
ziprequiretest.rb, ziptest.rb, samples/example.rb, ziprequiretest.rb, ziptest.rb, samples/example.rb,
samples/example_filesystem.rb, samples/gtkRubyzip.rb, samples/example_filesystem.rb, samples/gtkRubyzip.rb,
samples/zipfind.rb, zip/stdrubyext.rb, zip/zip.rb, samples/zipfind.rb: Moved all production source files to zip/ so
zip/zipfilesystem.rb, zip/ziprequire.rb: Moved all production they are in the same dir as when they are installed
source files to zip/ so they are in the same dir as when they are
installed 2003-08-21 15:31 thomas
* NEWS, TODO, alltests.rb: [no log message]
2003-08-21 15:26 thomas 2003-08-21 15:26 thomas
@ -108,6 +232,10 @@
* zip.rb, ziptest.rb: Fixed mkdir bug. ZipFile.mkdir didn't work if * zip.rb, ziptest.rb: Fixed mkdir bug. ZipFile.mkdir didn't work if
the zipfile doesn't exist already the zipfile doesn't exist already
2003-08-21 15:05 thomas
* ziptest.rb: [no log message]
2003-08-21 14:53 thomas 2003-08-21 14:53 thomas
* TODO, zipfilesystemtest.rb: Globbing test placeholder commented * TODO, zipfilesystemtest.rb: Globbing test placeholder commented
@ -123,12 +251,28 @@
* zipfilesystem.rb, zipfilesystemtest.rb: Implemented DirFsIterator * zipfilesystem.rb, zipfilesystemtest.rb: Implemented DirFsIterator
and tests and tests
2003-08-20 22:50 thomas
* NEWS, TODO: [no log message]
2003-08-20 22:45 thomas
* zipfilesystemtest.rb: [no log message]
2003-08-20 22:44 thomas 2003-08-20 22:44 thomas
* zipfilesystem.rb, zipfilesystemtest.rb: Implemented * zipfilesystem.rb, zipfilesystemtest.rb: Implemented
ZipFsDir.foreach, ZipFsDir.entries now reimplemented in terms of ZipFsDir.foreach, ZipFsDir.entries now reimplemented in terms of
it it
2003-08-20 22:25 thomas
* README: [no log message]
2003-08-20 18:08 thomas
* zipfilesystem.rb, zipfilesystemtest.rb: [no log message]
2003-08-20 17:30 thomas 2003-08-20 17:30 thomas
* zipfilesystem.rb: All access from ZipFsFile and ZipFsDir to * zipfilesystem.rb: All access from ZipFsFile and ZipFsDir to
@ -205,6 +349,10 @@
* simpledist.rb: Moved simpledist to a separate repository called * simpledist.rb: Moved simpledist to a separate repository called
'misc' 'misc'
2003-08-13 16:31 thomas
* NEWS: [no log message]
2003-08-13 16:29 thomas 2003-08-13 16:29 thomas
* stdrubyext.rb, zip.rb, zipfilesystem.rb, zipfilesystemtest.rb, * stdrubyext.rb, zip.rb, zipfilesystem.rb, zipfilesystemtest.rb,
@ -274,6 +422,22 @@
* NEWS, zip.rb: ruby-zlib 0.6.0 compatibility fix * NEWS, zip.rb: ruby-zlib 0.6.0 compatibility fix
2002-12-22 20:12 thomas
* zip.rb: [no log message]
2002-09-16 22:11 thomas
* NEWS: [no log message]
2002-09-15 17:16 thomas
* samples/zipfind.rb: [no log message]
2002-09-15 00:02 thomas
* samples/zipfind.rb: [no log message]
2002-09-14 22:59 thomas 2002-09-14 22:59 thomas
* samples/zipfind.rb: Added simple zipfind script * samples/zipfind.rb: Added simple zipfind script
@ -296,11 +460,19 @@
* zipfilesystemtest.rb: Improved ZipFsFile.delete/unlink test * zipfilesystemtest.rb: Improved ZipFsFile.delete/unlink test
2002-09-12 00:12 thomas
* test/.cvsignore: [no log message]
2002-09-12 00:10 thomas 2002-09-12 00:10 thomas
* zipfilesystem.rb, zipfilesystemtest.rb: Implemented * zipfilesystem.rb, zipfilesystemtest.rb: Implemented
ZipFsFile.delete/unlink ZipFsFile.delete/unlink
2002-09-11 22:22 thomas
* alltests.rb: [no log message]
2002-09-11 22:18 thomas 2002-09-11 22:18 thomas
* NEWS, zip.rb, zipfilesystem.rb, zipfilesystemtest.rb: Fixed * NEWS, zip.rb, zipfilesystem.rb, zipfilesystemtest.rb: Fixed
@ -317,12 +489,20 @@
* NEWS: Updated NEWS file * NEWS: Updated NEWS file
2002-09-10 23:26 thomas
* zip.rb: [no log message]
2002-09-10 22:39 thomas 2002-09-10 22:39 thomas
* NEWS, zip.rb, ziptest.rb: Fix bug: rewind should reset lineno. * NEWS, zip.rb, ziptest.rb: Fix bug: rewind should reset lineno.
Fix bug: Deflater.read uses separate buffer from produceInput Fix bug: Deflater.read uses separate buffer from produceInput
(feeding gets/readline etc) (feeding gets/readline etc)
2002-09-09 23:48 thomas
* .cvsignore: [no log message]
2002-09-09 22:55 uid26649 2002-09-09 22:55 uid26649
* zip.rb, ziptest.rb: Implemented ZipInputStream.rewind and * zip.rb, ziptest.rb: Implemented ZipInputStream.rewind and
@ -334,6 +514,10 @@
AbstractInputStream and AbstractOutputStream now lie about being AbstractInputStream and AbstractOutputStream now lie about being
kind_of?(IO) kind_of?(IO)
2002-09-08 16:38 thomas
* zipfilesystemtest.rb: [no log message]
2002-09-08 16:07 thomas 2002-09-08 16:07 thomas
* filearchive.rb, filearchivetest.rb, zip.rb, ziptest.rb: Moved * filearchive.rb, filearchivetest.rb, zip.rb, ziptest.rb: Moved
@ -451,6 +635,10 @@
zipfilesystem.rb, zipfilesystemtest.rb, ziprequire.rb, zipfilesystem.rb, zipfilesystemtest.rb, ziprequire.rb,
ziptest.rb: Implemented ZipFileSystem::ZipFsFile.size ziptest.rb: Implemented ZipFileSystem::ZipFsFile.size
2002-07-26 16:41 thomas
* zipfilesystem.rb, zipfilesystemtest.rb: [no log message]
2002-07-26 16:40 thomas 2002-07-26 16:40 thomas
* test/zipWithDirs.zip: Changed zipWithDirs.zip so all the entries * test/zipWithDirs.zip: Changed zipWithDirs.zip so all the entries
@ -466,6 +654,18 @@
* test/zipWithDirs.zip: Added a zip file for testing with a * test/zipWithDirs.zip: Added a zip file for testing with a
directory structure directory structure
2002-07-22 21:40 thomas
* TODO: [no log message]
2002-07-22 17:49 thomas
* TODO: [no log message]
2002-07-21 18:20 thomas
* NEWS: [no log message]
2002-07-21 18:12 thomas 2002-07-21 18:12 thomas
* TODO: Updated TODO with a refactoring idea for FileArchive * TODO: Updated TODO with a refactoring idea for FileArchive
@ -493,10 +693,22 @@
code for creating test files for FileArchive.add tests. Added code for creating test files for FileArchive.add tests. Added
fileutils.rb, which is borrowed from ruby 1.7.2 fileutils.rb, which is borrowed from ruby 1.7.2
2002-07-20 16:07 thomas
* filearchive.rb, filearchivetest.rb: [no log message]
2002-07-20 16:05 thomas 2002-07-20 16:05 thomas
* filearchivetest.rb: Added tests for String extensions * filearchivetest.rb: Added tests for String extensions
2002-07-20 02:20 thomas
* alltests.rb, ziprequiretest.rb, ziptest.rb: [no log message]
2002-07-20 00:42 thomas
* install.rb: [no log message]
2002-07-20 00:42 thomas 2002-07-20 00:42 thomas
* TODO: Updated TODO * TODO: Updated TODO
@ -506,10 +718,43 @@
* filearchive.rb, filearchivetest.rb: All FileArchive.extract tests * filearchive.rb, filearchivetest.rb: All FileArchive.extract tests
run run
2002-07-19 23:11 thomas
* filearchive.rb, filearchivetest.rb: [no log message]
2002-07-19 19:41 thomas
* filearchivetest.rb: [no log message]
2002-07-19 19:06 thomas
* filearchive.rb, filearchivetest.rb: [no log message]
2002-07-19 18:48 thomas
* filearchive.rb, filearchivetest.rb, zip.rb: [no log message]
2002-07-08 13:41 thomas
* TODO: [no log message]
2002-06-11 19:47 thomas
* filearchive.rb, filearchivetest.rb, zip.rb, ziptest.rb: [no log
message]
2002-05-25 00:41 thomas 2002-05-25 00:41 thomas
* simpledist.rb: Added hackish script for creating dist files * simpledist.rb: Added hackish script for creating dist files
2002-04-30 21:22 thomas
* TODO: [no log message]
2002-04-30 21:16 thomas
* filearchive.rb, filearchivetest.rb: [no log message]
2002-04-30 20:40 thomas 2002-04-30 20:40 thomas
* filearchive.rb, filearchivetest.rb: Improved testing and wrote * filearchive.rb, filearchivetest.rb: Improved testing and wrote
@ -564,6 +809,10 @@
a 'glob pattern' given a list of files - Next step is to use this a 'glob pattern' given a list of files - Next step is to use this
module in ZipFile module in ZipFile
2002-04-01 22:55 thomas
* NEWS: [no log message]
2002-04-01 21:16 thomas 2002-04-01 21:16 thomas
* TODO, zip.rb, ziprequire.rb: Added ziprequire.rb which contains a * TODO, zip.rb, ziprequire.rb: Added ziprequire.rb which contains a
@ -571,17 +820,33 @@
can load ruby modules from a zip file. Needs unit tests and can load ruby modules from a zip file. Needs unit tests and
polish. polish.
2002-03-31 01:13 thomas
* README: [no log message]
2002-03-30 16:14 thomas
* TODO: [no log message]
2002-03-30 01:52 thomas 2002-03-30 01:52 thomas
* .cvsignore, README, zip.rb: Added rdoc markup (only #:nodoc:all * .cvsignore, README, zip.rb: Added rdoc markup (only #:nodoc:all
modifiers) to zip.rb. Made README 'RDoc compliant' modifiers) to zip.rb. Made README 'RDoc compliant'
2002-03-29 23:29 thomas
* TODO: [no log message]
2002-03-29 23:26 thomas 2002-03-29 23:26 thomas
* example.rb, samples/.cvsignore, samples/example.rb, * example.rb, samples/.cvsignore, samples/example.rb,
samples/gtkRubyzip.rb: Moved example.rb to samples/. Added samples/gtkRubyzip.rb: Moved example.rb to samples/. Added
another sample gtkRubyzip.rb another sample gtkRubyzip.rb
2002-03-29 20:12 thomas
* NEWS, TODO: [no log message]
2002-03-29 20:06 thomas 2002-03-29 20:06 thomas
* .cvsignore, file1.txt, file1.txt.deflatedData, testDirectory.bin, * .cvsignore, file1.txt, file1.txt.deflatedData, testDirectory.bin,
@ -591,6 +856,10 @@
manually created test data files into it. Changed ziptest.rb so manually created test data files into it. Changed ziptest.rb so
it runs in test/ directory it runs in test/ directory
2002-03-29 19:43 thomas
* TODO: [no log message]
2002-03-29 18:15 thomas 2002-03-29 18:15 thomas
* NEWS, zip.rb, ziptest.rb: Don't decompress and recompress zip * NEWS, zip.rb, ziptest.rb: Don't decompress and recompress zip
@ -601,6 +870,22 @@
* zip.rb: Performance optimization: Only write new ZipFile, if it * zip.rb: Performance optimization: Only write new ZipFile, if it
has been changed. The test suite runs in half the time now. has been changed. The test suite runs in half the time now.
2002-03-28 22:12 thomas
* TODO: [no log message]
2002-03-23 17:31 thomas
* TODO: [no log message]
2002-03-22 22:47 thomas
* NEWS: [no log message]
2002-03-22 22:25 thomas
* NEWS, TODO: [no log message]
2002-03-22 22:18 thomas 2002-03-22 22:18 thomas
* ziptest.rb: Found the tests that didn't use blocks to make sure * ziptest.rb: Found the tests that didn't use blocks to make sure
@ -627,10 +912,22 @@
the remainder of the line including the pipe character and the the remainder of the line including the pipe character and the
following zip -z 4 entry.zip command following zip -z 4 entry.zip command
2002-03-21 22:18 thomas
* NEWS: [no log message]
2002-03-21 22:12 thomas 2002-03-21 22:12 thomas
* NEWS, README, TODO, install.rb: Added install.rb * NEWS, README, TODO, install.rb: Added install.rb
2002-03-21 21:45 thomas
* ziptest.rb: [no log message]
2002-03-21 20:54 thomas
* NEWS, TODO: [no log message]
2002-03-21 20:34 thomas 2002-03-21 20:34 thomas
* .cvsignore, TODO, zip.rb, ziptest.rb: Added * .cvsignore, TODO, zip.rb, ziptest.rb: Added
@ -641,6 +938,10 @@
* zip.rb, ziptest.rb: Extraction of directory entries is now * zip.rb, ziptest.rb: Extraction of directory entries is now
supported supported
2002-03-20 21:59 thomas
* NEWS: [no log message]
2002-03-20 21:24 thomas 2002-03-20 21:24 thomas
* COPYING, README, README.txt: Removed COPYING, renamed README.txt * COPYING, README, README.txt: Removed COPYING, renamed README.txt
@ -651,6 +952,10 @@
* example.rb: Fixed example.rb added example that shows zip file * example.rb: Fixed example.rb added example that shows zip file
manipulation with Zip::ZipFile manipulation with Zip::ZipFile
2002-03-20 21:00 thomas
* .cvsignore: [no log message]
2002-03-20 20:56 thomas 2002-03-20 20:56 thomas
* TODO, zip.rb, ziptest.rb: Directories can now be added (not * TODO, zip.rb, ziptest.rb: Directories can now be added (not
@ -669,6 +974,10 @@
* zip.rb, ziptest.rb: ZipError is now a subclass of StandardError * zip.rb, ziptest.rb: ZipError is now a subclass of StandardError
instead of RuntimeError. ZipError now has several subclasses. instead of RuntimeError. ZipError now has several subclasses.
2002-03-19 22:26 thomas
* TODO: [no log message]
2002-03-19 22:19 thomas 2002-03-19 22:19 thomas
* TODO, ziptest.rb: Unit test ZipFile.getInputStream with block * TODO, ziptest.rb: Unit test ZipFile.getInputStream with block
@ -683,11 +992,19 @@
* TODO, zip.rb, ziptest.rb: Added unit tests for rename to existing * TODO, zip.rb, ziptest.rb: Added unit tests for rename to existing
entry entry
2002-03-19 20:42 thomas
* TODO: [no log message]
2002-03-19 20:40 thomas 2002-03-19 20:40 thomas
* TODO, zip.rb, ziptest.rb: Unit test calling ZipFile.extract with * TODO, zip.rb, ziptest.rb: Unit test calling ZipFile.extract with
block block
2002-03-18 21:06 thomas
* TODO: [no log message]
2002-03-18 21:05 thomas 2002-03-18 21:05 thomas
* zip.rb, ziptest.rb: ZipFile#commit now reinitializes ZipFile. * zip.rb, ziptest.rb: ZipFile#commit now reinitializes ZipFile.
@ -704,6 +1021,10 @@
* zip.rb: Removed method that was never called * zip.rb: Removed method that was never called
2002-03-17 22:33 thomas
* TODO: [no log message]
2002-03-17 22:25 thomas 2002-03-17 22:25 thomas
* ziptest.rb: Run tests with =true as default * ziptest.rb: Run tests with =true as default
@ -713,25 +1034,69 @@
* NEWS, TODO, zip.rb, ziptest.rb: Now runs with -w switch without * NEWS, TODO, zip.rb, ziptest.rb: Now runs with -w switch without
warnings warnings
2002-03-17 21:10 thomas
* .cvsignore: [no log message]
2002-03-17 21:04 thomas 2002-03-17 21:04 thomas
* zip.rb, ziptest.rb: Down to one failing test * zip.rb, ziptest.rb: Down to one failing test
2002-03-17 20:36 thomas
* zip.rb, ziptest.rb: [no log message]
2002-03-17 17:22 thomas
* TODO, zip.rb, ziptest.rb: [no log message]
2002-02-25 19:42 thomas 2002-02-25 19:42 thomas
* TODO: Added more todos * TODO: Added more todos
2002-02-23 15:51 thomas
* zip.rb: [no log message]
2002-02-23 15:30 thomas
* zip.rb, ziptest.rb: [no log message]
2002-02-23 14:16 thomas
* zip.rb, ziptest.rb: [no log message]
2002-02-03 18:47 thomas
* ziptest.rb: [no log message]
2002-02-02 15:58 thomas
* example.rb, zip.rb, ziptest.rb: [no log message]
2002-02-02 00:16 thomas
* .cvsignore: [no log message]
2002-02-02 00:14 thomas 2002-02-02 00:14 thomas
* example.rb, zip.rb, ziptest.rb: Renamed SimpleZipFile to * example.rb, zip.rb, ziptest.rb: Renamed SimpleZipFile to
BasicZipFile BasicZipFile
2002-02-02 00:09 thomas
* TODO: [no log message]
2002-02-02 00:01 thomas 2002-02-02 00:01 thomas
* ziptest.rb: More test cases - all of them failing, so now there * ziptest.rb: More test cases - all of them failing, so now there
are 18 failing test cases. Three more test cases to implement, are 18 failing test cases. Three more test cases to implement,
then it is time for the production code then it is time for the production code
2002-02-01 21:49 thomas
* ziptest.rb: [no log message]
2002-02-01 21:34 thomas 2002-02-01 21:34 thomas
* ziptest.rb: Also run SimpleZipFile tests for ZipFile. * ziptest.rb: Also run SimpleZipFile tests for ZipFile.
@ -742,6 +1107,14 @@
The new ZipFile will have many more methods that are useful for The new ZipFile will have many more methods that are useful for
managing archives. managing archives.
2002-01-29 20:30 thomas
* TODO: [no log message]
2002-01-26 00:18 thomas
* NEWS: [no log message]
2002-01-26 00:14 thomas 2002-01-26 00:14 thomas
* ziptest.rb: In unit test: work around ruby/cygwin weirdness. You * ziptest.rb: In unit test: work around ruby/cygwin weirdness. You
@ -753,20 +1126,44 @@
* ziptest.rb: Fixed test that failed on windows because of CRLF * ziptest.rb: Fixed test that failed on windows because of CRLF
line ending line ending
2002-01-25 23:58 thomas
* ziptest.rb: [no log message]
2002-01-25 23:29 thomas 2002-01-25 23:29 thomas
* .cvsignore, example.rb, zip.rb: Fixed bug reading from empty * .cvsignore, example.rb, zip.rb: Fixed bug reading from empty
deflated entry in zip file deflated entry in zip file
2002-01-25 23:01 thomas
* .cvsignore: [no log message]
2002-01-25 22:56 thomas
* ziptest.rb: [no log message]
2002-01-25 22:51 thomas 2002-01-25 22:51 thomas
* NEWS, README.txt, zip.rb, ziptest.rb: Zip write support is now * NEWS, README.txt, zip.rb, ziptest.rb: Zip write support is now
fully functional in the form of ZipOutputStream. fully functional in the form of ZipOutputStream.
2002-01-25 21:12 thomas
* zip.rb, ziptest.rb: [no log message]
2002-01-25 20:37 thomas
* zip.rb, ziptest.rb: [no log message]
2002-01-20 16:00 thomas 2002-01-20 16:00 thomas
* zip.rb, ziptest.rb: Added Deflater and DeflaterTest. * zip.rb, ziptest.rb: Added Deflater and DeflaterTest.
2002-01-20 00:39 thomas
* .cvsignore: [no log message]
2002-01-20 00:23 thomas 2002-01-20 00:23 thomas
* .cvsignore: Added .cvsignore file * .cvsignore: Added .cvsignore file
@ -797,6 +1194,10 @@
* README.txt: License now same as rubys, not just GPL * README.txt: License now same as rubys, not just GPL
2002-01-06 00:19 thomas
* README.txt: [no log message]
2002-01-05 23:09 thomas 2002-01-05 23:09 thomas
* NEWS, README.txt: Updated NEWS file * NEWS, README.txt: Updated NEWS file
@ -818,6 +1219,18 @@
* zip.rb: Changed references to Inflate to Zlib::inflate for * zip.rb: Changed references to Inflate to Zlib::inflate for
compatibility with ruby-zlib-0.5 compatibility with ruby-zlib-0.5
2002-01-05 19:28 thomas
* README.txt, zip.rb, ziptest.rb: [no log message]
2002-01-05 01:52 thomas
* example.rb, NEWS: [no log message]
2002-01-05 01:37 thomas
* COPYING, README.txt: [no log message]
2002-01-05 01:31 thomas 2002-01-05 01:31 thomas
* ziptest.rb: Fixed problem with test file creation * ziptest.rb: Fixed problem with test file creation

41
vendor/rubyzip-0.5.6/NEWS → vendor/rubyzip-0.5.8/NEWS vendored Executable file → Normal file
View file

@ -1,32 +1,43 @@
= Version 0.5.6 = = Version 0.5.8
Fixed install script.
= Version 0.5.7
install.rb no longer assumes it is being run from the toplevel source
dir. Directory structure changed to reflect common ruby library
project structure. Migrated from RubyUnit to Test::Unit format. Now
uses Rake to build source packages and gems and run unit tests.
= Version 0.5.6
Fix for FreeBSD 4.9 which returns Errno::EFBIG instead of Fix for FreeBSD 4.9 which returns Errno::EFBIG instead of
Errno::EINVAL for some invalid seeks. Fixed 'version needed to Errno::EINVAL for some invalid seeks. Fixed 'version needed to
extract'-field incorrect in local headers. extract'-field incorrect in local headers.
= Version 0.5.5 = = Version 0.5.5
Fix for a problem with writing zip files that concerns only ruby 1.8.1. Fix for a problem with writing zip files that concerns only ruby 1.8.1.
= Version 0.5.4 = = Version 0.5.4
Significantly reduced memory footprint when modifying zip files. Significantly reduced memory footprint when modifying zip files.
= Version 0.5.3 = = Version 0.5.3
Added optimization to avoid decompressing and recompressing individual Added optimization to avoid decompressing and recompressing individual
entries when modifying a zip archive. entries when modifying a zip archive.
= Version 0.5.2 = = Version 0.5.2
Fixed ZipFile corruption bug in ZipFile class. Added basic unix Fixed ZipFile corruption bug in ZipFile class. Added basic unix
extra-field support. extra-field support.
= Version 0.5.1 = = Version 0.5.1
Fixed ZipFile.get_output_stream bug. Fixed ZipFile.get_output_stream bug.
= Version 0.5.0 = = Version 0.5.0
List of changes: List of changes:
* Ruby 1.8.0 and ruby-zlib 0.6.0 compatibility * Ruby 1.8.0 and ruby-zlib 0.6.0 compatibility
@ -42,7 +53,7 @@ Bug fixes:
* AbstractInputStream.each_line with non-default separator * AbstractInputStream.each_line with non-default separator
= Version 0.5.0a = = Version 0.5.0a
Source reorganized. Added ziprequire, which can be used to load ruby Source reorganized. Added ziprequire, which can be used to load ruby
modules from a zip file, in a fashion similar to jar files in modules from a zip file, in a fashion similar to jar files in
@ -55,15 +66,15 @@ Bug fixes:
* Fixed read() using separate buffer, causing mix of gets/readline/read to * Fixed read() using separate buffer, causing mix of gets/readline/read to
cause problems. cause problems.
= Version 0.4.2 = = Version 0.4.2
Performance optimizations. Test suite runs in half the time. Performance optimizations. Test suite runs in half the time.
= Version 0.4.1 = = Version 0.4.1
Windows compatibility fixes. Windows compatibility fixes.
= Version 0.4.0 = = Version 0.4.0
Zip::ZipFile is now mutable and provides a more convenient way of Zip::ZipFile is now mutable and provides a more convenient way of
modifying zip archives than Zip::ZipOutputStream. Operations for modifying zip archives than Zip::ZipOutputStream. Operations for
@ -75,18 +86,18 @@ Runs without warnings with -w switch.
Install script install.rb added. Install script install.rb added.
= Version 0.3.1 = = Version 0.3.1
Rudimentary support for writing zip archives. Rudimentary support for writing zip archives.
= Version 0.2.2 = = Version 0.2.2
Fixed and extended unit test suite. Updated to work with ruby/zlib Fixed and extended unit test suite. Updated to work with ruby/zlib
0.5. It doesn't work with earlier versions of ruby/zlib. 0.5. It doesn't work with earlier versions of ruby/zlib.
= Version 0.2.0 = = Version 0.2.0
Class ZipFile added. Where ZipInputStream is used to read the Class ZipFile added. Where ZipInputStream is used to read the
individual entries in a zip file, ZipFile reads the central directory individual entries in a zip file, ZipFile reads the central directory
@ -94,6 +105,6 @@ in the zip archive, so you can get to any entry in the zip archive
without having to skipping through all the preceeding entries. without having to skipping through all the preceeding entries.
= Version 0.1.0 = = Version 0.1.0
First working version of ZipInputStream. First working version of ZipInputStream.

70
vendor/rubyzip-0.5.8/README vendored Normal file
View file

@ -0,0 +1,70 @@
= rubyzip
rubyzip is a ruby library for reading and writing zip files.
= Install
If you have rubygems you can install rubyzip directly from the gem
repository
gem install rubyzip
Otherwise obtain the source (see below) and run
ruby install.rb
To run the unit tests you need to have test::unit installed
rake test
= Documentation
There is more than one way to access or create a zip archive with
rubyzip. The basic API is modeled after the classes in
java.util.zip from the Java SDK. This means there are classes such
as Zip::ZipInputStream, Zip::ZipOutputStream and
Zip::ZipFile. Zip::ZipInputStream provides a basic interface for
iterating through the entries in a zip archive and reading from the
entries in the same way as from a regular File or IO
object. ZipOutputStream is the corresponding basic output
facility. Zip::ZipFile provides a mean for accessing the archives
central directory and provides means for accessing any entry without
having to iterate through the archive. Unlike Java's
java.util.zip.ZipFile rubyzip's Zip::ZipFile is mutable, which means
it can be used to change zip files as well.
Another way to access a zip archive with rubyzip is to use rubyzip's
Zip::ZipFileSystem API. Using this API files can be read from and
written to the archive in much the same manner as ruby's builtin
classes allows files to be read from and written to the file system.
rubyzip also features the
zip/ziprequire.rb[link:files/lib/zip/ziprequire_rb.html] module which
allows ruby to load ruby modules from zip archives.
For details about the specific behaviour of classes and methods refer
to the test suite. Finally you can generate the rdoc documentation or
visit http://rubyzip.sourceforge.net.
= License
rubyzip is distributed under the same license as ruby. See
http://www.ruby-lang.org/en/LICENSE.txt
= Website and Project Home
http://rubyzip.sourceforge.net
http://sourceforge.net/projects/rubyzip
== Download (tarballs and gems)
http://sourceforge.net/project/showfiles.php?group_id=43107&package_id=35377
= Authors
Thomas Sondergaard (thomas at sondergaard.cc)
extra-field support contributed by Tatsuki Sugiura (sugi at nemui.org)

110
vendor/rubyzip-0.5.8/Rakefile vendored Normal file
View file

@ -0,0 +1,110 @@
# Rakefile for RubyGems -*- ruby -*-
require 'rubygems'
require 'rake/clean'
require 'rake/testtask'
require 'rake/packagetask'
require 'rake/gempackagetask'
require 'rake/rdoctask'
require 'rake/contrib/sshpublisher'
require 'net/ftp'
PKG_NAME = 'rubyzip'
PKG_VERSION = File.read('lib/zip/zip.rb').match(/\s+VERSION\s*=\s*'(.*)'/)[1]
PKG_FILES = FileList.new
PKG_FILES.add %w{ README NEWS TODO ChangeLog install.rb Rakefile }
PKG_FILES.add %w{ samples/*.rb }
PKG_FILES.add %w{ test/*.rb }
PKG_FILES.add %w{ test/data/* }
PKG_FILES.exclude "test/data/generated"
PKG_FILES.add %w{ lib/**/*.rb }
def clobberFromCvsIgnore(path)
CLOBBER.add File.readlines(path+'/.cvsignore').map {
|f| File.join(path, f.chomp)
}
end
clobberFromCvsIgnore '.'
clobberFromCvsIgnore 'samples'
clobberFromCvsIgnore 'test'
clobberFromCvsIgnore 'test/data'
task :default => [:test]
desc "Run unit tests"
task :test do
ruby %{-C test alltests.rb}
end
# Shortcuts for test targets
task :ut => [:test]
spec = Gem::Specification.new do |s|
s.name = PKG_NAME
s.version = PKG_VERSION
s.author = "Thomas Sondergaard"
s.email = "thomas(at)sondergaard.cc"
s.homepage = "http://rubyzip.sourceforge.net/"
s.platform = Gem::Platform::RUBY
s.summary = "rubyzip is a ruby module for reading and writing zip files"
s.files = PKG_FILES.to_a #Dir.glob("{samples,lib,test,docs}/**/*").delete_if {|item| item.include?("CVS") || item.include?("rdoc") || item =~ /~$/ }
s.require_path = 'lib'
s.autorequire = 'zip/zip'
end
Rake::GemPackageTask.new(spec) do |pkg|
pkg.need_zip = true
pkg.need_tar = true
end
Rake::RDocTask.new do |rd|
rd.main = "README"
rd.rdoc_files.add %W{ lib/zip/*.rb README NEWS TODO ChangeLog }
rd.options << "--title 'rubyzip documentation' --webcvs http://cvs.sourceforge.net/viewcvs.py/rubyzip/rubyzip/"
# rd.options << "--all"
end
desc "Publish documentation"
task :pdoc => [:rdoc] do
Rake::SshFreshDirPublisher.
new("thomas@rubyzip.sourceforge.net", "rubyzip/htdocs", "html").upload
end
desc "Publish package"
task :ppackage => [:package] do
Net::FTP.open("upload.sourceforge.net",
"ftp",
ENV['USER']+"@"+ENV['HOSTNAME']) {
|ftpclient|
ftpclient.chdir "incoming"
Dir['pkg/*.{tgz,zip,gem}'].each {
|e|
ftpclient.putbinaryfile(e, File.basename(e))
}
}
end
desc "Generate the ChangeLog file"
task :ChangeLog do
puts "Updating ChangeLog"
system %{cvs2cl}
end
desc "Make a release"
task :release => [:tag_release, :pdoc, :ppackage] do
end
desc "Make a release tag"
task :tag_release do
tag = "release-#{PKG_VERSION.gsub('.','-')}"
puts "Checking for tag '#{tag}'"
if (Regexp.new("^\\s+#{tag}") =~ `cvs log README`)
abort "Tag '#{tag}' already exists"
end
puts "Tagging module with '#{tag}'"
system("cvs tag #{tag}")
end

5
vendor/rubyzip-0.5.6/TODO → vendor/rubyzip-0.5.8/TODO vendored Executable file → Normal file
View file

@ -1,10 +1,9 @@
* Fix problem with mixing AbstractInputStream::gets and AbstractInputStream::red
* Fix problem with mixing AbstractInputStream::gets and AbstractInputStream::read
* Implement ZipFsDir.glob * Implement ZipFsDir.glob
* ZipFile.checkIntegrity method * ZipFile.checkIntegrity method
* non-MSDOS permission attributes * non-MSDOS permission attributes
** See mail from Ned Konz to ruby-talk subj. "Re: SV: [ANN] Archive 0.2" ** See mail from Ned Konz to ruby-talk subj. "Re: SV: [ANN] Archive 0.2"
* Packager version, required unpacker version in zip headers * Packager version, required unpacker version in zip headers
** See mail from Ned Konz to ruby-talk subj. "Re: SV: [ANN] Archive 0.2" ** See mail from Ned Konz to ruby-talk subj. "Re: SV: [ANN] Archive 0.2"
* implement small gui app on top, to exercise library and to discover
what features should be added to rubyzip next.
* implement storing attributes and ownership information * implement storing attributes and ownership information

7
vendor/rubyzip-0.5.6/install.rb → vendor/rubyzip-0.5.8/install.rb vendored Executable file → Normal file
View file

@ -12,10 +12,11 @@ files = %w{ stdrubyext.rb ioextras.rb zip.rb zipfilesystem.rb ziprequire.rb temp
INSTALL_DIR = File.join(CONFIG["sitelibdir"], "zip") INSTALL_DIR = File.join(CONFIG["sitelibdir"], "zip")
File.makedirs(INSTALL_DIR) File.makedirs(INSTALL_DIR)
Dir.chdir "zip"
SOURCE_DIR = File.join(File.dirname($0), "lib/zip")
files.each { files.each {
|filename| |filename|
installPath = File.join(INSTALL_DIR, filename) installPath = File.join(INSTALL_DIR, filename)
File::install(filename, installPath, 0644, true) File::install(File.join(SOURCE_DIR, filename), installPath, 0644, true)
} }
Dir.chdir ".."

View file

@ -1,4 +1,6 @@
module IOExtras module IOExtras #:nodoc:
# Implements kind_of? in order to pretend to be an IO object
module FakeIO module FakeIO
def kind_of?(object) def kind_of?(object)
object == IO || super object == IO || super
@ -66,7 +68,8 @@ module IOExtras
end end
#relies on << # Implements many of the output convenience methods of IO.
# relies on <<
module AbstractOutputStream module AbstractOutputStream
include FakeIO include FakeIO

View file

@ -16,7 +16,7 @@ module Enumerable #:nodoc:all
end end
unless Object.method_defined?(:object_id) unless Object.method_defined?(:object_id)
class Object class Object #:nodoc:all
# Using object_id which is the new thing, so we need # Using object_id which is the new thing, so we need
# to make that work in versions prior to 1.8.0 # to make that work in versions prior to 1.8.0
alias object_id id alias object_id id
@ -24,7 +24,7 @@ unless Object.method_defined?(:object_id)
end end
unless File.respond_to?(:read) unless File.respond_to?(:read)
class File class File # :nodoc:all
# singleton method read does not exist in 1.6.x # singleton method read does not exist in 1.6.x
def self.read(fileName) def self.read(fileName)
open(fileName) { |f| f.read } open(fileName) { |f| f.read }
@ -32,7 +32,7 @@ unless File.respond_to?(:read)
end end
end end
class String class String #:nodoc:all
def starts_with(aString) def starts_with(aString)
rindex(aString, 0) == 0 rindex(aString, 0) == 0
end end
@ -50,7 +50,7 @@ class String
end end
end end
class Time class Time #:nodoc:all
#MS-DOS File Date and Time format as used in Interrupt 21H Function 57H: #MS-DOS File Date and Time format as used in Interrupt 21H Function 57H:
# #
@ -95,7 +95,7 @@ class Time
end end
end end
class Module class Module #:nodoc:all
def forward_message(forwarder, *messagesToForward) def forward_message(forwarder, *messagesToForward)
methodDefs = messagesToForward.map { methodDefs = messagesToForward.map {
|msg| |msg|

View file

@ -1,13 +1,13 @@
# #
# tempfile - manipulates temporary files # tempfile - manipulates temporary files
# #
# $Id: tempfile_bugfixed.rb,v 1.1 2005/01/07 23:08:02 alexeyv Exp $ # $Id: tempfile_bugfixed.rb,v 1.2 2005/02/19 20:30:33 thomas Exp $
# #
require 'delegate' require 'delegate'
require 'tmpdir' require 'tmpdir'
module BugFix module BugFix #:nodoc:all
# A class for managing temporary files. This library is written to be # A class for managing temporary files. This library is written to be
# thread safe. # thread safe.

View file

@ -11,7 +11,7 @@ if Tempfile.superclass == SimpleDelegator
Tempfile = BugFix::Tempfile Tempfile = BugFix::Tempfile
end end
module Zlib module Zlib #:nodoc:all
if ! const_defined? :MAX_WBITS if ! const_defined? :MAX_WBITS
MAX_WBITS = Zlib::Deflate.MAX_WBITS MAX_WBITS = Zlib::Deflate.MAX_WBITS
end end
@ -19,6 +19,8 @@ end
module Zip module Zip
VERSION = '0.5.8'
RUBY_MINOR_VERSION = RUBY_VERSION.split(".")[1].to_i RUBY_MINOR_VERSION = RUBY_VERSION.split(".")[1].to_i
# Ruby 1.7.x compatibility # Ruby 1.7.x compatibility
@ -27,9 +29,53 @@ module Zip
# not so in 1.7.x # not so in 1.7.x
EMPTY_FILE_RETURNS_EMPTY_STRING_FIRST = RUBY_MINOR_VERSION != 7 EMPTY_FILE_RETURNS_EMPTY_STRING_FIRST = RUBY_MINOR_VERSION != 7
# ZipInputStream is the basic class for reading zip entries in a
# zip file. It is possible to create a ZipInputStream object directly,
# passing the zip file name to the constructor, but more often than not
# the ZipInputStream will be obtained from a ZipFile (perhaps using the
# ZipFileSystem interface) object for a particular entry in the zip
# archive.
#
# A ZipInputStream inherits IOExtras::AbstractInputStream in order
# to provide an IO-like interface for reading from a single zip
# entry. Beyond methods for mimicking an IO-object it contains
# the method get_next_entry for iterating through the entries of
# an archive. get_next_entry returns a ZipEntry object that describes
# the zip entry the ZipInputStream is currently reading from.
#
# Example that creates a zip archive with ZipOutputStream and reads it
# back again with a ZipInputStream.
#
# require 'zip/zip'
#
# Zip::ZipOutputStream::open("my.zip") {
# |io|
#
# io.put_next_entry("first_entry.txt")
# io.write "Hello world!"
#
# io.put_next_entry("adir/first_entry.txt")
# io.write "Hello again!"
# }
#
#
# Zip::ZipInputStream::open("my.zip") {
# |io|
#
# while (entry = io.get_next_entry)
# puts "Contents of #{entry.name}: '#{io.read}'"
# end
# }
#
# java.util.zip.ZipInputStream is the original inspiration for this
# class.
class ZipInputStream class ZipInputStream
include IOExtras::AbstractInputStream include IOExtras::AbstractInputStream
# Opens the indicated zip file. An exception is thrown
# if the specified offset in the specified filename is
# not a local zip entry header.
def initialize(filename, offset = 0) def initialize(filename, offset = 0)
super() super()
@archiveIO = File.open(filename, "rb") @archiveIO = File.open(filename, "rb")
@ -42,6 +88,9 @@ module Zip
@archiveIO.close @archiveIO.close
end end
# Same as #initialize but if a block is passed the opened
# stream is passed to the block and closed when the block
# returns.
def ZipInputStream.open(filename) def ZipInputStream.open(filename)
return new(filename) unless block_given? return new(filename) unless block_given?
@ -51,12 +100,17 @@ module Zip
zio.close if zio zio.close if zio
end end
# Returns a ZipEntry object. It is necessary to call this
# method on a newly created ZipInputStream before reading from
# the first entry in the archive. Returns nil when there are
# no more entries.
def get_next_entry def get_next_entry
@archiveIO.seek(@currentEntry.next_header_offset, @archiveIO.seek(@currentEntry.next_header_offset,
IO::SEEK_SET) if @currentEntry IO::SEEK_SET) if @currentEntry
open_entry open_entry
end end
# Rewinds the stream to the beginning of the current entry
def rewind def rewind
return if @currentEntry.nil? return if @currentEntry.nil?
@lineno = 0 @lineno = 0
@ -65,6 +119,13 @@ module Zip
open_entry open_entry
end end
# Modeled after IO.read
def read(numberOfBytes = nil)
@decompressor.read(numberOfBytes)
end
protected
def open_entry def open_entry
@currentEntry = ZipEntry.read_local_entry(@archiveIO) @currentEntry = ZipEntry.read_local_entry(@archiveIO)
if (@currentEntry == nil) if (@currentEntry == nil)
@ -82,10 +143,6 @@ module Zip
return @currentEntry return @currentEntry
end end
def read(numberOfBytes = nil)
@decompressor.read(numberOfBytes)
end
protected
def produce_input def produce_input
@decompressor.produce_input @decompressor.produce_input
end end
@ -505,11 +562,31 @@ module Zip
end end
# ZipOutputStream is the basic class for writing zip files. It is
# possible to create a ZipOutputStream object directly, passing
# the zip file name to the constructor, but more often than not
# the ZipOutputStream will be obtained from a ZipFile (perhaps using the
# ZipFileSystem interface) object for a particular entry in the zip
# archive.
#
# A ZipOutputStream inherits IOExtras::AbstractOutputStream in order
# to provide an IO-like interface for writing to a single zip
# entry. Beyond methods for mimicking an IO-object it contains
# the method put_next_entry that closes the current entry
# and creates a new.
#
# Please refer to ZipInputStream for example code.
#
# java.util.zip.ZipOutputStream is the original inspiration for this
# class.
class ZipOutputStream class ZipOutputStream
include IOExtras::AbstractOutputStream include IOExtras::AbstractOutputStream
attr_accessor :comment attr_accessor :comment
# Opens the indicated zip file. If a file with that name already
# exists it will be overwritten.
def initialize(fileName) def initialize(fileName)
super() super()
@fileName = fileName @fileName = fileName
@ -521,6 +598,9 @@ module Zip
@comment = nil @comment = nil
end end
# Same as #initialize but if a block is passed the opened
# stream is passed to the block and closed when the block
# returns.
def ZipOutputStream.open(fileName) def ZipOutputStream.open(fileName)
return new(fileName) unless block_given? return new(fileName) unless block_given?
zos = new(fileName) zos = new(fileName)
@ -529,6 +609,7 @@ module Zip
zos.close if zos zos.close if zos
end end
# Closes the stream and writes the central directory to the zip file
def close def close
return if @closed return if @closed
finalize_current_entry finalize_current_entry
@ -538,6 +619,8 @@ module Zip
@closed = true @closed = true
end end
# Closes the current entry and opens a new for writing.
# +entry+ can be a ZipEntry object or a string.
def put_next_entry(entry, level = Zlib::DEFAULT_COMPRESSION) def put_next_entry(entry, level = Zlib::DEFAULT_COMPRESSION)
raise ZipError, "zip stream is closed" if @closed raise ZipError, "zip stream is closed" if @closed
newEntry = entry.kind_of?(ZipEntry) ? entry : ZipEntry.new(@fileName, entry.to_s) newEntry = entry.kind_of?(ZipEntry) ? entry : ZipEntry.new(@fileName, entry.to_s)
@ -613,6 +696,7 @@ module Zip
end end
public public
# Modeled after IO.<<
def << (data) def << (data)
@compressor << data @compressor << data
end end
@ -678,7 +762,7 @@ module Zip
end end
class ZipEntrySet class ZipEntrySet #:nodoc:all
include Enumerable include Enumerable
def initialize(anEnumerable = []) def initialize(anEnumerable = [])
@ -733,7 +817,7 @@ module Zip
end end
class ZipCentralDirectory #:nodoc:all class ZipCentralDirectory
include Enumerable include Enumerable
END_OF_CENTRAL_DIRECTORY_SIGNATURE = 0x06054b50 END_OF_CENTRAL_DIRECTORY_SIGNATURE = 0x06054b50
@ -742,23 +826,24 @@ module Zip
attr_reader :comment attr_reader :comment
# Returns an Enumerable containing the entries.
def entries def entries
@entrySet.entries @entrySet.entries
end end
def initialize(entries = ZipEntrySet.new, comment = "") def initialize(entries = ZipEntrySet.new, comment = "") #:nodoc:
super() super()
@entrySet = entries.kind_of?(ZipEntrySet) ? entries : ZipEntrySet.new(entries) @entrySet = entries.kind_of?(ZipEntrySet) ? entries : ZipEntrySet.new(entries)
@comment = comment @comment = comment
end end
def write_to_stream(io) def write_to_stream(io) #:nodoc:
offset = io.tell offset = io.tell
@entrySet.each { |entry| entry.write_c_dir_entry(io) } @entrySet.each { |entry| entry.write_c_dir_entry(io) }
write_e_o_c_d(io, offset) write_e_o_c_d(io, offset)
end end
def write_e_o_c_d(io, offset) def write_e_o_c_d(io, offset) #:nodoc:
io << io <<
[END_OF_CENTRAL_DIRECTORY_SIGNATURE, [END_OF_CENTRAL_DIRECTORY_SIGNATURE,
0 , # @numberOfThisDisk 0 , # @numberOfThisDisk
@ -772,13 +857,13 @@ module Zip
end end
private :write_e_o_c_d private :write_e_o_c_d
def cdir_size def cdir_size #:nodoc:
# does not include eocd # does not include eocd
@entrySet.inject(0) { |value, entry| entry.cdir_header_size + value } @entrySet.inject(0) { |value, entry| entry.cdir_header_size + value }
end end
private :cdir_size private :cdir_size
def read_e_o_c_d(io) def read_e_o_c_d(io) #:nodoc:
buf = get_e_o_c_d(io) buf = get_e_o_c_d(io)
@numberOfThisDisk = ZipEntry::read_zip_short(buf) @numberOfThisDisk = ZipEntry::read_zip_short(buf)
@numberOfDiskWithStartOfCDir = ZipEntry::read_zip_short(buf) @numberOfDiskWithStartOfCDir = ZipEntry::read_zip_short(buf)
@ -791,7 +876,7 @@ module Zip
raise ZipError, "Zip consistency problem while reading eocd structure" unless buf.size == 0 raise ZipError, "Zip consistency problem while reading eocd structure" unless buf.size == 0
end end
def read_central_directory_entries(io) def read_central_directory_entries(io) #:nodoc:
begin begin
io.seek(@cdirOffset, IO::SEEK_SET) io.seek(@cdirOffset, IO::SEEK_SET)
rescue Errno::EINVAL rescue Errno::EINVAL
@ -803,12 +888,12 @@ module Zip
} }
end end
def read_from_stream(io) def read_from_stream(io) #:nodoc:
read_e_o_c_d(io) read_e_o_c_d(io)
read_central_directory_entries(io) read_central_directory_entries(io)
end end
def get_e_o_c_d(io) def get_e_o_c_d(io) #:nodoc:
begin begin
io.seek(-MAX_END_OF_CENTRAL_DIRECTORY_STRUCTURE_SIZE, IO::SEEK_END) io.seek(-MAX_END_OF_CENTRAL_DIRECTORY_STRUCTURE_SIZE, IO::SEEK_END)
rescue Errno::EINVAL rescue Errno::EINVAL
@ -826,15 +911,18 @@ module Zip
return buf return buf
end end
# For iterating over the entries.
def each(&proc) def each(&proc)
@entrySet.each(&proc) @entrySet.each(&proc)
end end
# Returns the number of entries in the central directory (and
# consequently in the zip archive).
def size def size
@entrySet.size @entrySet.size
end end
def ZipCentralDirectory.read_from_stream(io) def ZipCentralDirectory.read_from_stream(io) #:nodoc:
cdir = new cdir = new
cdir.read_from_stream(io) cdir.read_from_stream(io)
return cdir return cdir
@ -842,7 +930,7 @@ module Zip
return nil return nil
end end
def == (other) def == (other) #:nodoc:
return false unless other.kind_of?(ZipCentralDirectory) return false unless other.kind_of?(ZipCentralDirectory)
@entrySet.entries.sort == other.entries.sort && comment == other.comment @entrySet.entries.sort == other.entries.sort && comment == other.comment
end end
@ -856,19 +944,64 @@ module Zip
class ZipCompressionMethodError < ZipError; end class ZipCompressionMethodError < ZipError; end
class ZipEntryNameError < ZipError; end class ZipEntryNameError < ZipError; end
# ZipFile is modeled after java.util.zip.ZipFile from the Java SDK.
# The most important methods are those inherited from
# ZipCentralDirectory for accessing information about the entries in
# the archive and methods such as get_input_stream and
# get_output_stream for reading from and writing entries to the
# archive. The class includes a few convenience methods such as
# #extract for extracting entries to the filesystem, and #remove,
# #replace, #rename and #mkdir for making simple modifications to
# the archive.
#
# Modifications to a zip archive are not committed until #commit or
# #close is called. The method #open accepts a block following
# the pattern from File.open offering a simple way to
# automatically close the archive when the block returns.
#
# The following example opens zip archive <code>my.zip</code>
# (creating it if it doesn't exist) and adds an entry
# <code>first.txt</code> and a directory entry <code>a_dir</code>
# to it.
#
# require 'zip/zip'
#
# Zip::ZipFile.open("my.zip", Zip::ZipFile::CREATE) {
# |zipfile|
# zipfile.get_output_stream("first.txt") { |f| f.puts "Hello from ZipFile" }
# zipfile.mkdir("a_dir")
# }
#
# The next example reopens <code>my.zip</code> writes the contents of
# <code>first.txt</code> to standard out and deletes the entry from
# the archive.
#
# require 'zip/zip'
#
# Zip::ZipFile.open("my.zip", Zip::ZipFile::CREATE) {
# |zipfile|
# puts zipfile.read("first.txt")
# zipfile.remove("first.txt")
# }
#
# ZipFileSystem offers an alternative API that emulates ruby's
# interface for accessing the filesystem, ie. the File and Dir classes.
class ZipFile < ZipCentralDirectory class ZipFile < ZipCentralDirectory
CREATE = 1 CREATE = 1
attr_reader :name attr_reader :name
# Opens a zip archive. Pass true as the second parameter to create
# a new archive if it doesn't exist already.
def initialize(fileName, create = nil) def initialize(fileName, create = nil)
super() super()
@name = fileName @name = fileName
@comment = "" @comment = ""
if (File.exists?(fileName)) if (File.exists?(fileName))
File.open(name, "rb") { |f| read_from_stream(f) } File.open(name, "rb") { |f| read_from_stream(f) }
elsif (create == ZipFile::CREATE) elsif (create)
@entrySet = ZipEntrySet.new @entrySet = ZipEntrySet.new
else else
raise ZipError, "File #{fileName} not found" raise ZipError, "File #{fileName} not found"
@ -877,6 +1010,9 @@ module Zip
@storedEntries = @entrySet.dup @storedEntries = @entrySet.dup
end end
# Same as #new. If a block is passed the ZipFile object is passed
# to the block and is automatically closed afterwards just as with
# ruby's builtin File.open method.
def ZipFile.open(fileName, create = nil) def ZipFile.open(fileName, create = nil)
zf = ZipFile.new(fileName, create) zf = ZipFile.new(fileName, create)
if block_given? if block_given?
@ -890,8 +1026,15 @@ module Zip
end end
end end
# Returns the zip files comment, if it has one
attr_accessor :comment attr_accessor :comment
# Iterates over the contents of the ZipFile. This is more efficient
# than using a ZipInputStream since this methods simply iterates
# through the entries in the central directory structure in the archive
# whereas ZipInputStream jumps through the entire archive accessing the
# local entry headers (which contain the same information as the
# central directory).
def ZipFile.foreach(aZipFileName, &block) def ZipFile.foreach(aZipFileName, &block)
ZipFile.open(aZipFileName) { ZipFile.open(aZipFileName) {
|zipFile| |zipFile|
@ -899,10 +1042,16 @@ module Zip
} }
end end
# Returns an input stream to the specified entry. If a block is passed
# the stream object is passed to the block and the stream is automatically
# closed afterwards just as with ruby's builtin File.open method.
def get_input_stream(entry, &aProc) def get_input_stream(entry, &aProc)
get_entry(entry).get_input_stream(&aProc) get_entry(entry).get_input_stream(&aProc)
end end
# Returns an output stream to the specified entry. If a block is passed
# the stream object is passed to the block and the stream is automatically
# closed afterwards just as with ruby's builtin File.open method.
def get_output_stream(entry, &aProc) def get_output_stream(entry, &aProc)
newEntry = entry.kind_of?(ZipEntry) ? entry : ZipEntry.new(@name, entry.to_s) newEntry = entry.kind_of?(ZipEntry) ? entry : ZipEntry.new(@name, entry.to_s)
if newEntry.directory? if newEntry.directory?
@ -914,14 +1063,17 @@ module Zip
zipStreamableEntry.get_output_stream(&aProc) zipStreamableEntry.get_output_stream(&aProc)
end end
# Returns the name of the zip archive
def to_s def to_s
@name @name
end end
# Returns a string containing the contents of the specified entry
def read(entry) def read(entry)
get_input_stream(entry) { |is| is.read } get_input_stream(entry) { |is| is.read }
end end
# Convenience method for adding the contents of a file to the archive
def add(entry, srcPath, &continueOnExistsProc) def add(entry, srcPath, &continueOnExistsProc)
continueOnExistsProc ||= proc { false } continueOnExistsProc ||= proc { false }
check_entry_exists(entry, continueOnExistsProc, "add") check_entry_exists(entry, continueOnExistsProc, "add")
@ -933,21 +1085,26 @@ module Zip
end end
end end
# Removes the specified entry.
def remove(entry) def remove(entry)
@entrySet.delete(get_entry(entry)) @entrySet.delete(get_entry(entry))
end end
# Renames the specified entry.
def rename(entry, newName, &continueOnExistsProc) def rename(entry, newName, &continueOnExistsProc)
foundEntry = get_entry(entry) foundEntry = get_entry(entry)
check_entry_exists(newName, continueOnExistsProc, "rename") check_entry_exists(newName, continueOnExistsProc, "rename")
foundEntry.name=newName foundEntry.name=newName
end end
# Replaces the specified entry with the contents of srcPath (from
# the file system).
def replace(entry, srcPath) def replace(entry, srcPath)
check_file(srcPath) check_file(srcPath)
add(remove(entry), srcPath) add(remove(entry), srcPath)
end end
# Extracts entry to file destPath.
def extract(entry, destPath, &onExistsProc) def extract(entry, destPath, &onExistsProc)
onExistsProc ||= proc { false } onExistsProc ||= proc { false }
foundEntry = get_entry(entry) foundEntry = get_entry(entry)
@ -958,6 +1115,8 @@ module Zip
end end
end end
# Commits changes that has been made since the previous commit to
# the zip archive.
def commit def commit
return if ! commit_required? return if ! commit_required?
on_success_replace(name) { on_success_replace(name) {
@ -973,14 +1132,19 @@ module Zip
initialize(name) initialize(name)
end end
# Closes the zip file committing any changes that has been made.
def close def close
commit commit
end end
# Returns true if any changes has been made to this archive since
# the previous commit
def commit_required? def commit_required?
return @entrySet != @storedEntries || @create == ZipFile::CREATE return @entrySet != @storedEntries || @create == ZipFile::CREATE
end end
# Searches for entry with the specified name. Returns nil if
# no entry is found. See also get_entry
def find_entry(entry) def find_entry(entry)
@entrySet.detect { @entrySet.detect {
|e| |e|
@ -988,6 +1152,8 @@ module Zip
} }
end end
# Searches for an entry just as find_entry, but throws Errno::ENOENT
# if no entry is found.
def get_entry(entry) def get_entry(entry)
selectedEntry = find_entry(entry) selectedEntry = find_entry(entry)
unless selectedEntry unless selectedEntry
@ -996,6 +1162,7 @@ module Zip
return selectedEntry return selectedEntry
end end
# Creates a directory
def mkdir(entryName, permissionInt = 0) #permissionInt ignored def mkdir(entryName, permissionInt = 0) #permissionInt ignored
if find_entry(entryName) if find_entry(entryName)
raise Errno::EEXIST, "File exists - #{entryName}" raise Errno::EEXIST, "File exists - #{entryName}"
@ -1256,8 +1423,8 @@ module Zip
register_map register_map
def initialize(binstr = nil) def initialize(binstr = nil)
@uid = nil @uid = 0
@gid = nil @gid = 0
binstr and merge(binstr) binstr and merge(binstr)
end end
attr_accessor :uid, :gid attr_accessor :uid, :gid

View file

@ -1,9 +1,42 @@
require 'zip/zip' require 'zip/zip'
module Zip module Zip
# The ZipFileSystem API provides an API for accessing entries in
# a zip archive that is similar to ruby's builtin File and Dir
# classes.
#
# Requiring 'zip/zipfilesystem' includes this module in ZipFile
# making the methods in this module available on ZipFile objects.
#
# Using this API the following example creates a new zip file
# <code>my.zip</code> containing a normal entry with the name
# <code>first.txt</code>, a directory entry named <code>mydir</code>
# and finally another normal entry named <code>second.txt</code>
#
# require 'zip/zipfilesystem'
#
# Zip::ZipFile.open("my.zip", Zip::ZipFile::CREATE) {
# |zipfile|
# zipfile.file.open("first.txt", "w") { |f| f.puts "Hello world" }
# zipfile.dir.mkdir("mydir")
# zipfile.file.open("mydir/second.txt", "w") { |f| f.puts "Hello again" }
# }
#
# Reading is as easy as writing, as the following example shows. The
# example writes the contents of <code>first.txt</code> from zip archive
# <code>my.zip</code> to standard out.
#
# require 'zip/zipfilesystem'
#
# Zip::ZipFile.open("my.zip") {
# |zipfile|
# puts zipfile.file.read("first.txt")
# }
module ZipFileSystem module ZipFileSystem
def initialize def initialize # :nodoc:
mappedZip = ZipFileNameMapper.new(self) mappedZip = ZipFileNameMapper.new(self)
@zipFsDir = ZipFsDir.new(mappedZip) @zipFsDir = ZipFsDir.new(mappedZip)
@zipFsFile = ZipFsFile.new(mappedZip) @zipFsFile = ZipFsFile.new(mappedZip)
@ -11,14 +44,26 @@ module Zip
@zipFsFile.dir = @zipFsDir @zipFsFile.dir = @zipFsDir
end end
# Returns a ZipFsDir which is much like ruby's builtin Dir (class)
# object, except it works on the ZipFile on which this method is
# invoked
def dir def dir
@zipFsDir @zipFsDir
end end
# Returns a ZipFsFile which is much like ruby's builtin File (class)
# object, except it works on the ZipFile on which this method is
# invoked
def file def file
@zipFsFile @zipFsFile
end end
# Instances of this class are normally accessed via the accessor
# ZipFile::file. An instance of ZipFsFile behaves like ruby's
# builtin File (class) object, except it works on ZipFile entries.
#
# The individual methods are not documented due to their
# similarity with the methods in File
class ZipFsFile class ZipFsFile
attr_writer :dir attr_writer :dir
@ -198,7 +243,7 @@ module Zip
@mappedZip.get_entry(fileName).size @mappedZip.get_entry(fileName).size
end end
# nil for not found and nil for directories # Returns nil for not found and nil for directories
def size?(fileName) def size?(fileName)
entry = @mappedZip.find_entry(fileName) entry = @mappedZip.find_entry(fileName)
return (entry == nil || entry.directory?) ? nil : entry.size return (entry == nil || entry.directory?) ? nil : entry.size
@ -367,6 +412,12 @@ module Zip
end end
end end
# Instances of this class are normally accessed via the accessor
# ZipFile::dir. An instance of ZipFsDir behaves like ruby's
# builtin Dir (class) object, except it works on ZipFile entries.
#
# The individual methods are not documented due to their
# similarity with the methods in Dir
class ZipFsDir class ZipFsDir
def initialize(mappedZip) def initialize(mappedZip)
@ -441,7 +492,7 @@ module Zip
end end
class ZipFsDirIterator class ZipFsDirIterator # :nodoc:all
include Enumerable include Enumerable
def initialize(arrayOfFileNames) def initialize(arrayOfFileNames)
@ -481,7 +532,7 @@ module Zip
# All access to ZipFile from ZipFsFile and ZipFsDir goes through a # All access to ZipFile from ZipFsFile and ZipFsDir goes through a
# ZipFileNameMapper, which has one responsibility: ensure # ZipFileNameMapper, which has one responsibility: ensure
class ZipFileNameMapper class ZipFileNameMapper # :nodoc:all
include Enumerable include Enumerable
def initialize(zipFile) def initialize(zipFile)

View file

@ -1,6 +1,35 @@
# With ziprequire you can load ruby modules from a zip file. This means
# ruby's module include path can include zip-files.
#
# The following example creates a zip file with a single entry
# <code>log/simplelog.rb</code> that contains a single function
# <code>simpleLog</code>:
#
# require 'zip/zipfilesystem'
#
# Zip::ZipFile.open("my.zip", true) {
# |zf|
# zf.file.open("log/simplelog.rb", "w") {
# |f|
# f.puts "def simpleLog(v)"
# f.puts ' Kernel.puts "INFO: #{v}"'
# f.puts "end"
# }
# }
#
# To use the ruby module stored in the zip archive simply require
# <code>zip/ziprequire</code> and include the <code>my.zip</code> zip
# file in the module search path. The following command shows one
# way to do this:
#
# ruby -rzip/ziprequire -Imy.zip -e " require 'log/simplelog'; simpleLog 'Hello world' "
#$: << 'data/rubycode.zip' << 'data/rubycode2.zip'
require 'zip/zip' require 'zip/zip'
class ZipList class ZipList #:nodoc:all
def initialize(zipFileList) def initialize(zipFileList)
@zipFileList = zipFileList @zipFileList = zipFileList
end end
@ -23,7 +52,7 @@ class ZipList
end end
module Kernel module Kernel #:nodoc:all
alias :oldRequire :require alias :oldRequire :require
def require(moduleName) def require(moduleName)

View file

@ -1,6 +1,6 @@
#!/usr/bin/env ruby #!/usr/bin/env ruby
$: << ".." $: << "../lib"
system("zip example.zip example.rb gtkRubyzip.rb") system("zip example.zip example.rb gtkRubyzip.rb")
require 'zip/zip' require 'zip/zip'

View file

@ -1,6 +1,6 @@
#!/usr/bin/env ruby #!/usr/bin/env ruby
$: << ".." $: << "../lib"
require 'zip/zipfilesystem' require 'zip/zipfilesystem'
require 'ftools' require 'ftools'

View file

@ -1,6 +1,6 @@
#!/usr/bin/env ruby #!/usr/bin/env ruby
$: << ".." $: << "../lib"
$VERBOSE = true $VERBOSE = true

View file

@ -1,6 +1,6 @@
#!/usr/bin/env ruby #!/usr/bin/env ruby
$: << ".." $: << "../lib"
require 'zip/zip' require 'zip/zip'

View file

@ -2,7 +2,7 @@
$VERBOSE = true $VERBOSE = true
$: << ".." $: << "../lib"
require 'zip/zip' require 'zip/zip'
require 'find' require 'find'

View file

View file

View file

View file

@ -0,0 +1,155 @@
#!/usr/bin/env ruby
$VERBOSE = true
class TestFiles
RANDOM_ASCII_FILE1 = "data/generated/randomAscii1.txt"
RANDOM_ASCII_FILE2 = "data/generated/randomAscii2.txt"
RANDOM_ASCII_FILE3 = "data/generated/randomAscii3.txt"
RANDOM_BINARY_FILE1 = "data/generated/randomBinary1.bin"
RANDOM_BINARY_FILE2 = "data/generated/randomBinary2.bin"
EMPTY_TEST_DIR = "data/generated/emptytestdir"
ASCII_TEST_FILES = [ RANDOM_ASCII_FILE1, RANDOM_ASCII_FILE2, RANDOM_ASCII_FILE3 ]
BINARY_TEST_FILES = [ RANDOM_BINARY_FILE1, RANDOM_BINARY_FILE2 ]
TEST_DIRECTORIES = [ EMPTY_TEST_DIR ]
TEST_FILES = [ ASCII_TEST_FILES, BINARY_TEST_FILES, EMPTY_TEST_DIR ].flatten!
def TestFiles.create_test_files(recreate)
if (recreate ||
! (TEST_FILES.inject(true) { |accum, element| accum && File.exists?(element) }))
Dir.mkdir "data/generated" rescue Errno::EEXIST
ASCII_TEST_FILES.each_with_index {
|filename, index|
create_random_ascii(filename, 1E4 * (index+1))
}
BINARY_TEST_FILES.each_with_index {
|filename, index|
create_random_binary(filename, 1E4 * (index+1))
}
ensure_dir(EMPTY_TEST_DIR)
end
end
private
def TestFiles.create_random_ascii(filename, size)
File.open(filename, "wb") {
|file|
while (file.tell < size)
file << rand
end
}
end
def TestFiles.create_random_binary(filename, size)
File.open(filename, "wb") {
|file|
while (file.tell < size)
file << [rand].pack("V")
end
}
end
def TestFiles.ensure_dir(name)
if File.exists?(name)
return if File.stat(name).directory?
File.delete(name)
end
Dir.mkdir(name)
end
end
# For representation and creation of
# test data
class TestZipFile
attr_accessor :zip_name, :entry_names, :comment
def initialize(zip_name, entry_names, comment = "")
@zip_name=zip_name
@entry_names=entry_names
@comment = comment
end
def TestZipFile.create_test_zips(recreate)
files = Dir.entries("data/generated")
if (recreate ||
! (files.index(File.basename(TEST_ZIP1.zip_name)) &&
files.index(File.basename(TEST_ZIP2.zip_name)) &&
files.index(File.basename(TEST_ZIP3.zip_name)) &&
files.index(File.basename(TEST_ZIP4.zip_name)) &&
files.index("empty.txt") &&
files.index("short.txt") &&
files.index("longAscii.txt") &&
files.index("longBinary.bin") ))
raise "failed to create test zip '#{TEST_ZIP1.zip_name}'" unless
system("zip #{TEST_ZIP1.zip_name} data/file2.txt")
raise "failed to remove entry from '#{TEST_ZIP1.zip_name}'" unless
system("zip #{TEST_ZIP1.zip_name} -d data/file2.txt")
File.open("data/generated/empty.txt", "w") {}
File.open("data/generated/short.txt", "w") { |file| file << "ABCDEF" }
ziptestTxt=""
File.open("data/file2.txt") { |file| ziptestTxt=file.read }
File.open("data/generated/longAscii.txt", "w") {
|file|
while (file.tell < 1E5)
file << ziptestTxt
end
}
testBinaryPattern=""
File.open("data/generated/empty.zip") { |file| testBinaryPattern=file.read }
testBinaryPattern *= 4
File.open("data/generated/longBinary.bin", "wb") {
|file|
while (file.tell < 3E5)
file << testBinaryPattern << rand
end
}
raise "failed to create test zip '#{TEST_ZIP2.zip_name}'" unless
system("zip #{TEST_ZIP2.zip_name} #{TEST_ZIP2.entry_names.join(' ')}")
# without bash system interprets everything after echo as parameters to
# echo including | zip -z ...
raise "failed to add comment to test zip '#{TEST_ZIP2.zip_name}'" unless
system("bash -c \"echo #{TEST_ZIP2.comment} | zip -z #{TEST_ZIP2.zip_name}\"")
raise "failed to create test zip '#{TEST_ZIP3.zip_name}'" unless
system("zip #{TEST_ZIP3.zip_name} #{TEST_ZIP3.entry_names.join(' ')}")
raise "failed to create test zip '#{TEST_ZIP4.zip_name}'" unless
system("zip #{TEST_ZIP4.zip_name} #{TEST_ZIP4.entry_names.join(' ')}")
end
rescue
raise $!.to_s +
"\n\nziptest.rb requires the Info-ZIP program 'zip' in the path\n" +
"to create test data. If you don't have it you can download\n" +
"the necessary test files at http://sf.net/projects/rubyzip."
end
TEST_ZIP1 = TestZipFile.new("data/generated/empty.zip", [])
TEST_ZIP2 = TestZipFile.new("data/generated/4entry.zip", %w{ data/generated/longAscii.txt data/generated/empty.txt data/generated/short.txt data/generated/longBinary.bin},
"my zip comment")
TEST_ZIP3 = TestZipFile.new("data/generated/test1.zip", %w{ data/file1.txt })
TEST_ZIP4 = TestZipFile.new("data/generated/zipWithDir.zip", [ "data/file1.txt",
TestFiles::EMPTY_TEST_DIR])
end
END {
TestFiles::create_test_files(ARGV.index("recreate") != nil ||
ARGV.index("recreateonly") != nil)
TestZipFile::create_test_zips(ARGV.index("recreate") != nil ||
ARGV.index("recreateonly") != nil)
exit if ARGV.index("recreateonly") != nil
}

View file

@ -2,14 +2,14 @@
$VERBOSE = true $VERBOSE = true
$: << ".." $: << "../lib"
require 'rubyunit' require 'test/unit'
require 'zip/ioextras' require 'zip/ioextras'
include IOExtras include IOExtras
class FakeIOTest < RUNIT::TestCase class FakeIOTest < Test::Unit::TestCase
class FakeIOUsingClass class FakeIOUsingClass
include FakeIO include FakeIO
end end
@ -25,7 +25,7 @@ class FakeIOTest < RUNIT::TestCase
end end
end end
class AbstractInputStreamTest < RUNIT::TestCase class AbstractInputStreamTest < Test::Unit::TestCase
# AbstractInputStream subclass that provides a read method # AbstractInputStream subclass that provides a read method
TEST_LINES = [ "Hello world#{$/}", TEST_LINES = [ "Hello world#{$/}",
@ -60,32 +60,32 @@ class AbstractInputStreamTest < RUNIT::TestCase
end end
def test_gets def test_gets
assert_equals(TEST_LINES[0], @io.gets) assert_equal(TEST_LINES[0], @io.gets)
assert_equals(1, @io.lineno) assert_equal(1, @io.lineno)
assert_equals(TEST_LINES[1], @io.gets) assert_equal(TEST_LINES[1], @io.gets)
assert_equals(2, @io.lineno) assert_equal(2, @io.lineno)
assert_equals(TEST_LINES[2], @io.gets) assert_equal(TEST_LINES[2], @io.gets)
assert_equals(3, @io.lineno) assert_equal(3, @io.lineno)
assert_equals(nil, @io.gets) assert_equal(nil, @io.gets)
assert_equals(4, @io.lineno) assert_equal(4, @io.lineno)
end end
def test_getsMultiCharSeperator def test_getsMultiCharSeperator
assert_equals("Hell", @io.gets("ll")) assert_equal("Hell", @io.gets("ll"))
assert_equals("o world#{$/}this is the second l", @io.gets("d l")) assert_equal("o world#{$/}this is the second l", @io.gets("d l"))
end end
def test_each_line def test_each_line
lineNumber=0 lineNumber=0
@io.each_line { @io.each_line {
|line| |line|
assert_equals(TEST_LINES[lineNumber], line) assert_equal(TEST_LINES[lineNumber], line)
lineNumber+=1 lineNumber+=1
} }
end end
def test_readlines def test_readlines
assert_equals(TEST_LINES, @io.readlines) assert_equal(TEST_LINES, @io.readlines)
end end
def test_readline def test_readline
@ -98,7 +98,7 @@ class AbstractInputStreamTest < RUNIT::TestCase
end end
end end
class AbstractOutputStreamTest < RUNIT::TestCase class AbstractOutputStreamTest < Test::Unit::TestCase
class TestOutputStream class TestOutputStream
include AbstractOutputStream include AbstractOutputStream
@ -128,77 +128,77 @@ class AbstractOutputStreamTest < RUNIT::TestCase
def test_write def test_write
count = @outputStream.write("a little string") count = @outputStream.write("a little string")
assert_equals("a little string", @outputStream.buffer) assert_equal("a little string", @outputStream.buffer)
assert_equals("a little string".length, count) assert_equal("a little string".length, count)
count = @outputStream.write(". a little more") count = @outputStream.write(". a little more")
assert_equals("a little string. a little more", @outputStream.buffer) assert_equal("a little string. a little more", @outputStream.buffer)
assert_equals(". a little more".length, count) assert_equal(". a little more".length, count)
end end
def test_print def test_print
$\ = nil # record separator set to nil $\ = nil # record separator set to nil
@outputStream.print("hello") @outputStream.print("hello")
assert_equals("hello", @outputStream.buffer) assert_equal("hello", @outputStream.buffer)
@outputStream.print(" world.") @outputStream.print(" world.")
assert_equals("hello world.", @outputStream.buffer) assert_equal("hello world.", @outputStream.buffer)
@outputStream.print(" You ok ", "out ", "there?") @outputStream.print(" You ok ", "out ", "there?")
assert_equals("hello world. You ok out there?", @outputStream.buffer) assert_equal("hello world. You ok out there?", @outputStream.buffer)
$\ = "\n" $\ = "\n"
@outputStream.print @outputStream.print
assert_equals("hello world. You ok out there?\n", @outputStream.buffer) assert_equal("hello world. You ok out there?\n", @outputStream.buffer)
@outputStream.print("I sure hope so!") @outputStream.print("I sure hope so!")
assert_equals("hello world. You ok out there?\nI sure hope so!\n", @outputStream.buffer) assert_equal("hello world. You ok out there?\nI sure hope so!\n", @outputStream.buffer)
$, = "X" $, = "X"
@outputStream.buffer = "" @outputStream.buffer = ""
@outputStream.print("monkey", "duck", "zebra") @outputStream.print("monkey", "duck", "zebra")
assert_equals("monkeyXduckXzebra\n", @outputStream.buffer) assert_equal("monkeyXduckXzebra\n", @outputStream.buffer)
$\ = nil $\ = nil
@outputStream.buffer = "" @outputStream.buffer = ""
@outputStream.print(20) @outputStream.print(20)
assert_equals("20", @outputStream.buffer) assert_equal("20", @outputStream.buffer)
end end
def test_printf def test_printf
@outputStream.printf("%d %04x", 123, 123) @outputStream.printf("%d %04x", 123, 123)
assert_equals("123 007b", @outputStream.buffer) assert_equal("123 007b", @outputStream.buffer)
end end
def test_putc def test_putc
@outputStream.putc("A") @outputStream.putc("A")
assert_equals("A", @outputStream.buffer) assert_equal("A", @outputStream.buffer)
@outputStream.putc(65) @outputStream.putc(65)
assert_equals("AA", @outputStream.buffer) assert_equal("AA", @outputStream.buffer)
end end
def test_puts def test_puts
@outputStream.puts @outputStream.puts
assert_equals("\n", @outputStream.buffer) assert_equal("\n", @outputStream.buffer)
@outputStream.puts("hello", "world") @outputStream.puts("hello", "world")
assert_equals("\nhello\nworld\n", @outputStream.buffer) assert_equal("\nhello\nworld\n", @outputStream.buffer)
@outputStream.buffer = "" @outputStream.buffer = ""
@outputStream.puts("hello\n", "world\n") @outputStream.puts("hello\n", "world\n")
assert_equals("hello\nworld\n", @outputStream.buffer) assert_equal("hello\nworld\n", @outputStream.buffer)
@outputStream.buffer = "" @outputStream.buffer = ""
@outputStream.puts(["hello\n", "world\n"]) @outputStream.puts(["hello\n", "world\n"])
assert_equals("hello\nworld\n", @outputStream.buffer) assert_equal("hello\nworld\n", @outputStream.buffer)
@outputStream.buffer = "" @outputStream.buffer = ""
@outputStream.puts(["hello\n", "world\n"], "bingo") @outputStream.puts(["hello\n", "world\n"], "bingo")
assert_equals("hello\nworld\nbingo\n", @outputStream.buffer) assert_equal("hello\nworld\nbingo\n", @outputStream.buffer)
@outputStream.buffer = "" @outputStream.buffer = ""
@outputStream.puts(16, 20, 50, "hello") @outputStream.puts(16, 20, 50, "hello")
assert_equals("16\n20\n50\nhello\n", @outputStream.buffer) assert_equal("16\n20\n50\nhello\n", @outputStream.buffer)
end end
end end

View file

@ -2,20 +2,20 @@
$VERBOSE = true $VERBOSE = true
$: << ".." $: << "../lib"
require 'rubyunit' require 'test/unit'
require 'zip/stdrubyext' require 'zip/stdrubyext'
class ModuleTest < RUNIT::TestCase class ModuleTest < Test::Unit::TestCase
def test_select_map def test_select_map
assert_equals([2, 4, 8, 10], [1, 2, 3, 4, 5].select_map { |e| e == 3 ? nil : 2*e }) assert_equal([2, 4, 8, 10], [1, 2, 3, 4, 5].select_map { |e| e == 3 ? nil : 2*e })
end end
end end
class StringExtensionsTest < RUNIT::TestCase class StringExtensionsTest < Test::Unit::TestCase
def test_starts_with def test_starts_with
assert("hello".starts_with("")) assert("hello".starts_with(""))
@ -24,7 +24,7 @@ class StringExtensionsTest < RUNIT::TestCase
assert(! "hello".starts_with("hello there")) assert(! "hello".starts_with("hello there"))
assert(! "hello".starts_with(" he")) assert(! "hello".starts_with(" he"))
assert_exception(TypeError, "type mismatch: NilClass given") { assert_raise(TypeError, "type mismatch: NilClass given") {
"hello".starts_with(nil) "hello".starts_with(nil)
} }
end end
@ -40,10 +40,10 @@ class StringExtensionsTest < RUNIT::TestCase
end end
def test_ensure_end def test_ensure_end
assert_equals("hello!", "hello!".ensure_end("!")) assert_equal("hello!", "hello!".ensure_end("!"))
assert_equals("hello!", "hello!".ensure_end("o!")) assert_equal("hello!", "hello!".ensure_end("o!"))
assert_equals("hello!", "hello".ensure_end("!")) assert_equal("hello!", "hello".ensure_end("!"))
assert_equals("hello!", "hel".ensure_end("lo!")) assert_equal("hello!", "hel".ensure_end("lo!"))
end end
end end

View file

@ -2,10 +2,10 @@
$VERBOSE = true $VERBOSE = true
$: << ".." $: << "../lib"
require 'zip/zipfilesystem' require 'zip/zipfilesystem'
require 'rubyunit' require 'test/unit'
module ExtraAssertions module ExtraAssertions
@ -20,8 +20,8 @@ module ExtraAssertions
end end
end_eval end_eval
assert_equals(retVal, yield) # Invoke test assert_equal(retVal, yield) # Invoke test
assert_equals(expectedArgs, callArgs) assert_equal(expectedArgs, callArgs)
ensure ensure
anObject.instance_eval "alias #{method} #{method}_org" anObject.instance_eval "alias #{method} #{method}_org"
end end
@ -30,9 +30,9 @@ end
include Zip include Zip
class ZipFsFileNonmutatingTest < RUNIT::TestCase class ZipFsFileNonmutatingTest < Test::Unit::TestCase
def setup def setup
@zipFile = ZipFile.new("zipWithDirs.zip") @zipFile = ZipFile.new("data/zipWithDirs.zip")
end end
def teardown def teardown
@ -40,7 +40,7 @@ class ZipFsFileNonmutatingTest < RUNIT::TestCase
end end
def test_umask def test_umask
assert_equals(File.umask, @zipFile.file.umask) assert_equal(File.umask, @zipFile.file.umask)
@zipFile.file.umask(0006) @zipFile.file.umask(0006)
end end
@ -62,7 +62,7 @@ class ZipFsFileNonmutatingTest < RUNIT::TestCase
@zipFile.file.open("file1", "r") { @zipFile.file.open("file1", "r") {
|f| |f|
blockCalled = true blockCalled = true
assert_equals("this is the entry 'file1' in my test archive!", assert_equal("this is the entry 'file1' in my test archive!",
f.readline.chomp) f.readline.chomp)
} }
assert(blockCalled) assert(blockCalled)
@ -72,19 +72,19 @@ class ZipFsFileNonmutatingTest < RUNIT::TestCase
@zipFile.file.open("file21", "r") { @zipFile.file.open("file21", "r") {
|f| |f|
blockCalled = true blockCalled = true
assert_equals("this is the entry 'dir2/file21' in my test archive!", assert_equal("this is the entry 'dir2/file21' in my test archive!",
f.readline.chomp) f.readline.chomp)
} }
assert(blockCalled) assert(blockCalled)
@zipFile.dir.chdir "/" @zipFile.dir.chdir "/"
assert_exception(Errno::ENOENT) { assert_raise(Errno::ENOENT) {
@zipFile.file.open("noSuchEntry") @zipFile.file.open("noSuchEntry")
} }
begin begin
is = @zipFile.file.open("file1") is = @zipFile.file.open("file1")
assert_equals("this is the entry 'file1' in my test archive!", assert_equal("this is the entry 'file1' in my test archive!",
is.readline.chomp) is.readline.chomp)
ensure ensure
is.close if is is.close if is
@ -94,7 +94,7 @@ class ZipFsFileNonmutatingTest < RUNIT::TestCase
def test_new def test_new
begin begin
is = @zipFile.file.new("file1") is = @zipFile.file.new("file1")
assert_equals("this is the entry 'file1' in my test archive!", assert_equal("this is the entry 'file1' in my test archive!",
is.readline.chomp) is.readline.chomp)
ensure ensure
is.close if is is.close if is
@ -109,27 +109,27 @@ class ZipFsFileNonmutatingTest < RUNIT::TestCase
end end
def test_symlink def test_symlink
assert_exception(NotImplementedError) { assert_raise(NotImplementedError) {
@zipFile.file.symlink("file1", "aSymlink") @zipFile.file.symlink("file1", "aSymlink")
} }
end end
def test_size def test_size
assert_exception(Errno::ENOENT) { @zipFile.file.size("notAFile") } assert_raise(Errno::ENOENT) { @zipFile.file.size("notAFile") }
assert_equals(72, @zipFile.file.size("file1")) assert_equal(72, @zipFile.file.size("file1"))
assert_equals(0, @zipFile.file.size("dir2/dir21")) assert_equal(0, @zipFile.file.size("dir2/dir21"))
assert_equals(72, @zipFile.file.stat("file1").size) assert_equal(72, @zipFile.file.stat("file1").size)
assert_equals(0, @zipFile.file.stat("dir2/dir21").size) assert_equal(0, @zipFile.file.stat("dir2/dir21").size)
end end
def test_size? def test_size?
assert_equals(nil, @zipFile.file.size?("notAFile")) assert_equal(nil, @zipFile.file.size?("notAFile"))
assert_equals(72, @zipFile.file.size?("file1")) assert_equal(72, @zipFile.file.size?("file1"))
assert_equals(nil, @zipFile.file.size?("dir2/dir21")) assert_equal(nil, @zipFile.file.size?("dir2/dir21"))
assert_equals(72, @zipFile.file.stat("file1").size?) assert_equal(72, @zipFile.file.stat("file1").size?)
assert_equals(nil, @zipFile.file.stat("dir2/dir21").size?) assert_equal(nil, @zipFile.file.stat("dir2/dir21").size?)
end end
@ -166,19 +166,19 @@ class ZipFsFileNonmutatingTest < RUNIT::TestCase
end end
def test_join def test_join
assert_equals("a/b/c", @zipFile.file.join("a/b", "c")) assert_equal("a/b/c", @zipFile.file.join("a/b", "c"))
assert_equals("a/b/c/d", @zipFile.file.join("a/b", "c/d")) assert_equal("a/b/c/d", @zipFile.file.join("a/b", "c/d"))
assert_equals("/c/d", @zipFile.file.join("", "c/d")) assert_equal("/c/d", @zipFile.file.join("", "c/d"))
assert_equals("a/b/c/d", @zipFile.file.join("a", "b", "c", "d")) assert_equal("a/b/c/d", @zipFile.file.join("a", "b", "c", "d"))
end end
def test_utime def test_utime
t_now = Time.now t_now = Time.now
t_bak = @zipFile.file.mtime("file1") t_bak = @zipFile.file.mtime("file1")
@zipFile.file.utime(t_now, "file1") @zipFile.file.utime(t_now, "file1")
assert_equals(t_now, @zipFile.file.mtime("file1")) assert_equal(t_now, @zipFile.file.mtime("file1"))
@zipFile.file.utime(t_bak, "file1") @zipFile.file.utime(t_bak, "file1")
assert_equals(t_bak, @zipFile.file.mtime("file1")) assert_equal(t_bak, @zipFile.file.mtime("file1"))
end end
@ -219,26 +219,26 @@ class ZipFsFileNonmutatingTest < RUNIT::TestCase
end end
def test_truncate def test_truncate
assert_exception(StandardError, "truncate not supported") { assert_raise(StandardError, "truncate not supported") {
@zipFile.file.truncate("file1", 100) @zipFile.file.truncate("file1", 100)
} }
end end
def assert_e_n_o_e_n_t(operation, args = ["NoSuchFile"]) def assert_e_n_o_e_n_t(operation, args = ["NoSuchFile"])
assert_exception(Errno::ENOENT) { assert_raise(Errno::ENOENT) {
@zipFile.file.send(operation, *args) @zipFile.file.send(operation, *args)
} }
end end
def test_ftype def test_ftype
assert_e_n_o_e_n_t(:ftype) assert_e_n_o_e_n_t(:ftype)
assert_equals("file", @zipFile.file.ftype("file1")) assert_equal("file", @zipFile.file.ftype("file1"))
assert_equals("directory", @zipFile.file.ftype("dir1/dir11")) assert_equal("directory", @zipFile.file.ftype("dir1/dir11"))
assert_equals("directory", @zipFile.file.ftype("dir1/dir11/")) assert_equal("directory", @zipFile.file.ftype("dir1/dir11/"))
end end
def test_link def test_link
assert_exception(NotImplementedError) { assert_raise(NotImplementedError) {
@zipFile.file.link("file1", "someOtherString") @zipFile.file.link("file1", "someOtherString")
} }
end end
@ -259,10 +259,10 @@ class ZipFsFileNonmutatingTest < RUNIT::TestCase
end end
def test_chown def test_chown
assert_equals(2, @zipFile.file.chown(1,2, "dir1", "file1")) assert_equal(2, @zipFile.file.chown(1,2, "dir1", "file1"))
assert_equals(1, @zipFile.file.stat("dir1").uid) assert_equal(1, @zipFile.file.stat("dir1").uid)
assert_equals(2, @zipFile.file.stat("dir1").gid) assert_equal(2, @zipFile.file.stat("dir1").gid)
assert_equals(2, @zipFile.file.chown(nil, nil, "dir1", "file1")) assert_equal(2, @zipFile.file.chown(nil, nil, "dir1", "file1"))
end end
def test_zero? def test_zero?
@ -270,48 +270,48 @@ class ZipFsFileNonmutatingTest < RUNIT::TestCase
assert(! @zipFile.file.zero?("file1")) assert(! @zipFile.file.zero?("file1"))
assert(@zipFile.file.zero?("dir1")) assert(@zipFile.file.zero?("dir1"))
blockCalled = false blockCalled = false
ZipFile.open("4entry.zip") { ZipFile.open("data/generated/4entry.zip") {
|zf| |zf|
blockCalled = true blockCalled = true
assert(zf.file.zero?("empty.txt")) assert(zf.file.zero?("data/generated/empty.txt"))
} }
assert(blockCalled) assert(blockCalled)
assert(! @zipFile.file.stat("file1").zero?) assert(! @zipFile.file.stat("file1").zero?)
assert(@zipFile.file.stat("dir1").zero?) assert(@zipFile.file.stat("dir1").zero?)
blockCalled = false blockCalled = false
ZipFile.open("4entry.zip") { ZipFile.open("data/generated/4entry.zip") {
|zf| |zf|
blockCalled = true blockCalled = true
assert(zf.file.stat("empty.txt").zero?) assert(zf.file.stat("data/generated/empty.txt").zero?)
} }
assert(blockCalled) assert(blockCalled)
end end
def test_expand_path def test_expand_path
ZipFile.open("zipWithDirs.zip") { ZipFile.open("data/zipWithDirs.zip") {
|zf| |zf|
assert_equals("/", zf.file.expand_path(".")) assert_equal("/", zf.file.expand_path("."))
zf.dir.chdir "dir1" zf.dir.chdir "dir1"
assert_equals("/dir1", zf.file.expand_path(".")) assert_equal("/dir1", zf.file.expand_path("."))
assert_equals("/dir1/file12", zf.file.expand_path("file12")) assert_equal("/dir1/file12", zf.file.expand_path("file12"))
assert_equals("/", zf.file.expand_path("..")) assert_equal("/", zf.file.expand_path(".."))
assert_equals("/dir2/dir21", zf.file.expand_path("../dir2/dir21")) assert_equal("/dir2/dir21", zf.file.expand_path("../dir2/dir21"))
} }
end end
def test_mtime def test_mtime
assert_equals(Time.at(1027694306), assert_equal(Time.at(1027694306),
@zipFile.file.mtime("dir2/file21")) @zipFile.file.mtime("dir2/file21"))
assert_equals(Time.at(1027690863), assert_equal(Time.at(1027690863),
@zipFile.file.mtime("dir2/dir21")) @zipFile.file.mtime("dir2/dir21"))
assert_exception(Errno::ENOENT) { assert_raise(Errno::ENOENT) {
@zipFile.file.mtime("noSuchEntry") @zipFile.file.mtime("noSuchEntry")
} }
assert_equals(Time.at(1027694306), assert_equal(Time.at(1027694306),
@zipFile.file.stat("dir2/file21").mtime) @zipFile.file.stat("dir2/file21").mtime)
assert_equals(Time.at(1027690863), assert_equal(Time.at(1027690863),
@zipFile.file.stat("dir2/dir21").mtime) @zipFile.file.stat("dir2/dir21").mtime)
end end
@ -394,7 +394,7 @@ class ZipFsFileNonmutatingTest < RUNIT::TestCase
end end
def test_readlink def test_readlink
assert_exception(NotImplementedError) { assert_raise(NotImplementedError) {
@zipFile.file.readlink("someString") @zipFile.file.readlink("someString")
} }
end end
@ -402,7 +402,7 @@ class ZipFsFileNonmutatingTest < RUNIT::TestCase
def test_stat def test_stat
s = @zipFile.file.stat("file1") s = @zipFile.file.stat("file1")
assert(s.kind_of?(File::Stat)) # It pretends assert(s.kind_of?(File::Stat)) # It pretends
assert_exception(Errno::ENOENT, "No such file or directory - noSuchFile") { assert_raise(Errno::ENOENT, "No such file or directory - noSuchFile") {
@zipFile.file.stat("noSuchFile") @zipFile.file.stat("noSuchFile")
} }
end end
@ -413,50 +413,50 @@ class ZipFsFileNonmutatingTest < RUNIT::TestCase
def test_chmod def test_chmod
assert_exception(Errno::ENOENT, "No such file or directory - noSuchFile") { assert_raise(Errno::ENOENT, "No such file or directory - noSuchFile") {
@zipFile.file.chmod(0644, "file1", "NoSuchFile") @zipFile.file.chmod(0644, "file1", "NoSuchFile")
} }
assert_equals(2, @zipFile.file.chmod(0644, "file1", "dir1")) assert_equal(2, @zipFile.file.chmod(0644, "file1", "dir1"))
end end
def test_pipe def test_pipe
assert_exception(NotImplementedError) { assert_raise(NotImplementedError) {
@zipFile.file.pipe @zipFile.file.pipe
} }
end end
def test_foreach def test_foreach
ZipFile.open("zipWithDir.zip") { ZipFile.open("data/generated/zipWithDir.zip") {
|zf| |zf|
ref = [] ref = []
File.foreach("file1.txt") { |e| ref << e } File.foreach("data/file1.txt") { |e| ref << e }
index = 0 index = 0
zf.file.foreach("file1.txt") { zf.file.foreach("data/file1.txt") {
|l| |l|
assert_equals(ref[index], l) assert_equal(ref[index], l)
index = index.next index = index.next
} }
assert_equals(ref.size, index) assert_equal(ref.size, index)
} }
ZipFile.open("zipWithDir.zip") { ZipFile.open("data/generated/zipWithDir.zip") {
|zf| |zf|
ref = [] ref = []
File.foreach("file1.txt", " ") { |e| ref << e } File.foreach("data/file1.txt", " ") { |e| ref << e }
index = 0 index = 0
zf.file.foreach("file1.txt", " ") { zf.file.foreach("data/file1.txt", " ") {
|l| |l|
assert_equals(ref[index], l) assert_equal(ref[index], l)
index = index.next index = index.next
} }
assert_equals(ref.size, index) assert_equal(ref.size, index)
} }
end end
def test_popen def test_popen
assert_equals(File.popen("ls") { |f| f.read }, assert_equal(File.popen("ls") { |f| f.read },
@zipFile.file.popen("ls") { |f| f.read }) @zipFile.file.popen("ls") { |f| f.read })
end end
@ -466,27 +466,27 @@ class ZipFsFileNonmutatingTest < RUNIT::TestCase
# end # end
def test_readlines def test_readlines
ZipFile.open("zipWithDir.zip") { ZipFile.open("data/generated/zipWithDir.zip") {
|zf| |zf|
assert_equals(File.readlines("file1.txt"), assert_equal(File.readlines("data/file1.txt"),
zf.file.readlines("file1.txt")) zf.file.readlines("data/file1.txt"))
} }
end end
def test_read def test_read
ZipFile.open("zipWithDir.zip") { ZipFile.open("data/generated/zipWithDir.zip") {
|zf| |zf|
assert_equals(File.read("file1.txt"), assert_equal(File.read("data/file1.txt"),
zf.file.read("file1.txt")) zf.file.read("data/file1.txt"))
} }
end end
end end
class ZipFsFileStatTest < RUNIT::TestCase class ZipFsFileStatTest < Test::Unit::TestCase
def setup def setup
@zipFile = ZipFile.new("zipWithDirs.zip") @zipFile = ZipFile.new("data/zipWithDirs.zip")
end end
def teardown def teardown
@ -494,51 +494,51 @@ class ZipFsFileStatTest < RUNIT::TestCase
end end
def test_blocks def test_blocks
assert_equals(nil, @zipFile.file.stat("file1").blocks) assert_equal(nil, @zipFile.file.stat("file1").blocks)
end end
def test_ino def test_ino
assert_equals(0, @zipFile.file.stat("file1").ino) assert_equal(0, @zipFile.file.stat("file1").ino)
end end
def test_uid def test_uid
assert_equals(0, @zipFile.file.stat("file1").uid) assert_equal(0, @zipFile.file.stat("file1").uid)
end end
def test_gid def test_gid
assert_equals(0, @zipFile.file.stat("file1").gid) assert_equal(0, @zipFile.file.stat("file1").gid)
end end
def test_ftype def test_ftype
assert_equals("file", @zipFile.file.stat("file1").ftype) assert_equal("file", @zipFile.file.stat("file1").ftype)
assert_equals("directory", @zipFile.file.stat("dir1").ftype) assert_equal("directory", @zipFile.file.stat("dir1").ftype)
end end
def test_mode def test_mode
assert_equals(0600, @zipFile.file.stat("file1").mode & 0777) assert_equal(0600, @zipFile.file.stat("file1").mode & 0777)
assert_equals(0600, @zipFile.file.stat("file1").mode & 0777) assert_equal(0600, @zipFile.file.stat("file1").mode & 0777)
assert_equals(0755, @zipFile.file.stat("dir1").mode & 0777) assert_equal(0755, @zipFile.file.stat("dir1").mode & 0777)
assert_equals(0755, @zipFile.file.stat("dir1").mode & 0777) assert_equal(0755, @zipFile.file.stat("dir1").mode & 0777)
end end
def test_dev def test_dev
assert_equals(0, @zipFile.file.stat("file1").dev) assert_equal(0, @zipFile.file.stat("file1").dev)
end end
def test_rdev def test_rdev
assert_equals(0, @zipFile.file.stat("file1").rdev) assert_equal(0, @zipFile.file.stat("file1").rdev)
end end
def test_rdev_major def test_rdev_major
assert_equals(0, @zipFile.file.stat("file1").rdev_major) assert_equal(0, @zipFile.file.stat("file1").rdev_major)
end end
def test_rdev_minor def test_rdev_minor
assert_equals(0, @zipFile.file.stat("file1").rdev_minor) assert_equal(0, @zipFile.file.stat("file1").rdev_minor)
end end
def test_nlink def test_nlink
assert_equals(1, @zipFile.file.stat("file1").nlink) assert_equal(1, @zipFile.file.stat("file1").nlink)
end end
def test_blksize def test_blksize
@ -547,10 +547,10 @@ class ZipFsFileStatTest < RUNIT::TestCase
end end
class ZipFsFileMutatingTest < RUNIT::TestCase class ZipFsFileMutatingTest < Test::Unit::TestCase
TEST_ZIP = "zipWithDirs_copy.zip" TEST_ZIP = "zipWithDirs_copy.zip"
def setup def setup
File.copy("zipWithDirs.zip", TEST_ZIP) File.copy("data/zipWithDirs.zip", TEST_ZIP)
end end
def teardown def teardown
@ -573,7 +573,7 @@ class ZipFsFileMutatingTest < RUNIT::TestCase
blockCalled = true blockCalled = true
f.write "This is what I'm writing" f.write "This is what I'm writing"
} }
assert_equals("This is what I'm writing", assert_equal("This is what I'm writing",
zf.file.read("test_open_write_entry")) zf.file.read("test_open_write_entry"))
# Test with existing entry # Test with existing entry
@ -582,7 +582,7 @@ class ZipFsFileMutatingTest < RUNIT::TestCase
blockCalled = true blockCalled = true
f.write "This is what I'm writing too" f.write "This is what I'm writing too"
} }
assert_equals("This is what I'm writing too", assert_equal("This is what I'm writing too",
zf.file.read("file1")) zf.file.read("file1"))
} }
end end
@ -590,7 +590,7 @@ class ZipFsFileMutatingTest < RUNIT::TestCase
def test_rename def test_rename
ZipFile.open(TEST_ZIP) { ZipFile.open(TEST_ZIP) {
|zf| |zf|
assert_exception(Errno::ENOENT, "") { assert_raise(Errno::ENOENT, "") {
zf.file.rename("NoSuchFile", "bimse") zf.file.rename("NoSuchFile", "bimse")
} }
zf.file.rename("file1", "newNameForFile1") zf.file.rename("file1", "newNameForFile1")
@ -616,9 +616,9 @@ class ZipFsFileMutatingTest < RUNIT::TestCase
assert(! zf.file.exists?("dir1/file11")) assert(! zf.file.exists?("dir1/file11"))
assert(! zf.file.exists?("dir1/file12")) assert(! zf.file.exists?("dir1/file12"))
assert_exception(Errno::ENOENT) { zf.file.send(symbol, "noSuchFile") } assert_raise(Errno::ENOENT) { zf.file.send(symbol, "noSuchFile") }
assert_exception(Errno::EISDIR) { zf.file.send(symbol, "dir1/dir11") } assert_raise(Errno::EISDIR) { zf.file.send(symbol, "dir1/dir11") }
assert_exception(Errno::EISDIR) { zf.file.send(symbol, "dir1/dir11/") } assert_raise(Errno::EISDIR) { zf.file.send(symbol, "dir1/dir11/") }
} }
ZipFile.open(TEST_ZIP) { ZipFile.open(TEST_ZIP) {
@ -634,20 +634,20 @@ class ZipFsFileMutatingTest < RUNIT::TestCase
end end
class ZipFsDirectoryTest < RUNIT::TestCase class ZipFsDirectoryTest < Test::Unit::TestCase
TEST_ZIP = "zipWithDirs_copy.zip" TEST_ZIP = "zipWithDirs_copy.zip"
def setup def setup
File.copy("zipWithDirs.zip", TEST_ZIP) File.copy("data/zipWithDirs.zip", TEST_ZIP)
end end
def test_delete def test_delete
ZipFile.open(TEST_ZIP) { ZipFile.open(TEST_ZIP) {
|zf| |zf|
assert_exception(Errno::ENOENT, "No such file or directory - NoSuchFile.txt") { assert_raise(Errno::ENOENT, "No such file or directory - NoSuchFile.txt") {
zf.dir.delete("NoSuchFile.txt") zf.dir.delete("NoSuchFile.txt")
} }
assert_exception(Errno::EINVAL, "Invalid argument - file1") { assert_raise(Errno::EINVAL, "Invalid argument - file1") {
zf.dir.delete("file1") zf.dir.delete("file1")
} }
assert(zf.file.exists?("dir1")) assert(zf.file.exists?("dir1"))
@ -659,10 +659,10 @@ class ZipFsDirectoryTest < RUNIT::TestCase
def test_mkdir def test_mkdir
ZipFile.open(TEST_ZIP) { ZipFile.open(TEST_ZIP) {
|zf| |zf|
assert_exception(Errno::EEXIST, "File exists - dir1") { assert_raise(Errno::EEXIST, "File exists - dir1") {
zf.dir.mkdir("file1") zf.dir.mkdir("file1")
} }
assert_exception(Errno::EEXIST, "File exists - dir1") { assert_raise(Errno::EEXIST, "File exists - dir1") {
zf.dir.mkdir("dir1") zf.dir.mkdir("dir1")
} }
assert(!zf.file.exists?("newDir")) assert(!zf.file.exists?("newDir"))
@ -677,24 +677,24 @@ class ZipFsDirectoryTest < RUNIT::TestCase
def test_pwd_chdir_entries def test_pwd_chdir_entries
ZipFile.open(TEST_ZIP) { ZipFile.open(TEST_ZIP) {
|zf| |zf|
assert_equals("/", zf.dir.pwd) assert_equal("/", zf.dir.pwd)
assert_exception(Errno::ENOENT, "No such file or directory - no such dir") { assert_raise(Errno::ENOENT, "No such file or directory - no such dir") {
zf.dir.chdir "no such dir" zf.dir.chdir "no such dir"
} }
assert_exception(Errno::EINVAL, "Invalid argument - file1") { assert_raise(Errno::EINVAL, "Invalid argument - file1") {
zf.dir.chdir "file1" zf.dir.chdir "file1"
} }
assert_equals(["dir1", "dir2", "file1"].sort, zf.dir.entries(".").sort) assert_equal(["dir1", "dir2", "file1"].sort, zf.dir.entries(".").sort)
zf.dir.chdir "dir1" zf.dir.chdir "dir1"
assert_equals("/dir1", zf.dir.pwd) assert_equal("/dir1", zf.dir.pwd)
assert_equals(["dir11", "file11", "file12"], zf.dir.entries(".").sort) assert_equal(["dir11", "file11", "file12"], zf.dir.entries(".").sort)
zf.dir.chdir "../dir2/dir21" zf.dir.chdir "../dir2/dir21"
assert_equals("/dir2/dir21", zf.dir.pwd) assert_equal("/dir2/dir21", zf.dir.pwd)
assert_equals(["dir221"].sort, zf.dir.entries(".").sort) assert_equal(["dir221"].sort, zf.dir.entries(".").sort)
} }
end end
@ -703,30 +703,30 @@ class ZipFsDirectoryTest < RUNIT::TestCase
|zf| |zf|
blockCalled = false blockCalled = false
assert_exception(Errno::ENOENT, "No such file or directory - noSuchDir") { assert_raise(Errno::ENOENT, "No such file or directory - noSuchDir") {
zf.dir.foreach("noSuchDir") { |e| blockCalled = true } zf.dir.foreach("noSuchDir") { |e| blockCalled = true }
} }
assert(! blockCalled) assert(! blockCalled)
assert_exception(Errno::ENOTDIR, "Not a directory - file1") { assert_raise(Errno::ENOTDIR, "Not a directory - file1") {
zf.dir.foreach("file1") { |e| blockCalled = true } zf.dir.foreach("file1") { |e| blockCalled = true }
} }
assert(! blockCalled) assert(! blockCalled)
entries = [] entries = []
zf.dir.foreach(".") { |e| entries << e } zf.dir.foreach(".") { |e| entries << e }
assert_equals(["dir1", "dir2", "file1"].sort, entries.sort) assert_equal(["dir1", "dir2", "file1"].sort, entries.sort)
entries = [] entries = []
zf.dir.foreach("dir1") { |e| entries << e } zf.dir.foreach("dir1") { |e| entries << e }
assert_equals(["dir11", "file11", "file12"], entries.sort) assert_equal(["dir11", "file11", "file12"], entries.sort)
} }
end end
def test_chroot def test_chroot
ZipFile.open(TEST_ZIP) { ZipFile.open(TEST_ZIP) {
|zf| |zf|
assert_exception(NotImplementedError) { assert_raise(NotImplementedError) {
zf.dir.chroot zf.dir.chroot
} }
} }
@ -742,28 +742,28 @@ class ZipFsDirectoryTest < RUNIT::TestCase
ZipFile.open(TEST_ZIP) { ZipFile.open(TEST_ZIP) {
|zf| |zf|
assert_exception(Errno::ENOTDIR, "Not a directory - file1") { assert_raise(Errno::ENOTDIR, "Not a directory - file1") {
zf.dir.new("file1") zf.dir.new("file1")
} }
assert_exception(Errno::ENOENT, "No such file or directory - noSuchFile") { assert_raise(Errno::ENOENT, "No such file or directory - noSuchFile") {
zf.dir.new("noSuchFile") zf.dir.new("noSuchFile")
} }
d = zf.dir.new(".") d = zf.dir.new(".")
assert_equals(["file1", "dir1", "dir2"].sort, d.entries.sort) assert_equal(["file1", "dir1", "dir2"].sort, d.entries.sort)
d.close d.close
zf.dir.open("dir1") { zf.dir.open("dir1") {
|d| |d|
assert_equals(["dir11", "file11", "file12"].sort, d.entries.sort) assert_equal(["dir11", "file11", "file12"].sort, d.entries.sort)
} }
} }
end end
end end
class ZipFsDirIteratorTest < RUNIT::TestCase class ZipFsDirIteratorTest < Test::Unit::TestCase
FILENAME_ARRAY = [ "f1", "f2", "f3", "f4", "f5", "f6" ] FILENAME_ARRAY = [ "f1", "f2", "f3", "f4", "f5", "f6" ]
@ -773,19 +773,19 @@ class ZipFsDirIteratorTest < RUNIT::TestCase
def test_close def test_close
@dirIt.close @dirIt.close
assert_exception(IOError, "closed directory") { assert_raise(IOError, "closed directory") {
@dirIt.each { |e| p e } @dirIt.each { |e| p e }
} }
assert_exception(IOError, "closed directory") { assert_raise(IOError, "closed directory") {
@dirIt.read @dirIt.read
} }
assert_exception(IOError, "closed directory") { assert_raise(IOError, "closed directory") {
@dirIt.rewind @dirIt.rewind
} }
assert_exception(IOError, "closed directory") { assert_raise(IOError, "closed directory") {
@dirIt.seek(0) @dirIt.seek(0)
} }
assert_exception(IOError, "closed directory") { assert_raise(IOError, "closed directory") {
@dirIt.tell @dirIt.tell
} }
@ -793,22 +793,22 @@ class ZipFsDirIteratorTest < RUNIT::TestCase
def test_each def test_each
# Tested through Enumerable.entries # Tested through Enumerable.entries
assert_equals(FILENAME_ARRAY, @dirIt.entries) assert_equal(FILENAME_ARRAY, @dirIt.entries)
end end
def test_read def test_read
FILENAME_ARRAY.size.times { FILENAME_ARRAY.size.times {
|i| |i|
assert_equals(FILENAME_ARRAY[i], @dirIt.read) assert_equal(FILENAME_ARRAY[i], @dirIt.read)
} }
end end
def test_rewind def test_rewind
@dirIt.read @dirIt.read
@dirIt.read @dirIt.read
assert_equals(FILENAME_ARRAY[2], @dirIt.read) assert_equal(FILENAME_ARRAY[2], @dirIt.read)
@dirIt.rewind @dirIt.rewind
assert_equals(FILENAME_ARRAY[0], @dirIt.read) assert_equal(FILENAME_ARRAY[0], @dirIt.read)
end end
def test_tell_seek def test_tell_seek
@ -818,7 +818,7 @@ class ZipFsDirIteratorTest < RUNIT::TestCase
valAtPos = @dirIt.read valAtPos = @dirIt.read
@dirIt.read @dirIt.read
@dirIt.seek(pos) @dirIt.seek(pos)
assert_equals(valAtPos, @dirIt.read) assert_equal(valAtPos, @dirIt.read)
end end
end end

View file

@ -2,17 +2,17 @@
$VERBOSE = true $VERBOSE = true
$: << ".." $: << "../lib"
require 'rubyunit' require 'test/unit'
require 'zip/ziprequire' require 'zip/ziprequire'
$: << 'rubycode.zip' << 'rubycode2.zip' $: << 'data/rubycode.zip' << 'data/rubycode2.zip'
class ZipRequireTest < RUNIT::TestCase class ZipRequireTest < Test::Unit::TestCase
def test_require def test_require
assert(require('notzippedruby')) assert(require('data/notzippedruby'))
assert(!require('notzippedruby')) assert(!require('data/notzippedruby'))
assert(require('zippedruby1')) assert(require('zippedruby1'))
assert(!require('zippedruby1')) assert(!require('zippedruby1'))
@ -27,13 +27,13 @@ class ZipRequireTest < RUNIT::TestCase
assert(c1.returnTrue) assert(c1.returnTrue)
assert(ZippedRuby1.returnTrue) assert(ZippedRuby1.returnTrue)
assert(!ZippedRuby2.returnFalse) assert(!ZippedRuby2.returnFalse)
assert_equals(4, ZippedRuby3.multiplyValues(2, 2)) assert_equal(4, ZippedRuby3.multiplyValues(2, 2))
end end
def test_get_resource def test_get_resource
get_resource("aResource.txt") { get_resource("aResource.txt") {
|f| |f|
assert_equals("Nothing exciting in this file!", f.read) assert_equal("Nothing exciting in this file!", f.read)
} }
end end
end end

File diff suppressed because it is too large Load diff