rubyzip 1.0.0 → 2.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +6 -14
- data/README.md +231 -46
- data/Rakefile +13 -5
- data/TODO +0 -1
- data/lib/zip/central_directory.rb +64 -29
- data/lib/zip/compressor.rb +1 -2
- data/lib/zip/constants.rb +59 -5
- data/lib/zip/crypto/decrypted_io.rb +40 -0
- data/lib/zip/crypto/encryption.rb +11 -0
- data/lib/zip/crypto/null_encryption.rb +43 -0
- data/lib/zip/crypto/traditional_encryption.rb +99 -0
- data/lib/zip/decompressor.rb +22 -4
- data/lib/zip/deflater.rb +11 -6
- data/lib/zip/dos_time.rb +27 -16
- data/lib/zip/entry.rb +299 -163
- data/lib/zip/entry_set.rb +22 -20
- data/lib/zip/errors.rb +17 -6
- data/lib/zip/extra_field/generic.rb +15 -14
- data/lib/zip/extra_field/ntfs.rb +94 -0
- data/lib/zip/extra_field/old_unix.rb +46 -0
- data/lib/zip/extra_field/universal_time.rb +46 -16
- data/lib/zip/extra_field/unix.rb +10 -9
- data/lib/zip/extra_field/zip64.rb +46 -6
- data/lib/zip/extra_field/zip64_placeholder.rb +15 -0
- data/lib/zip/extra_field.rb +32 -18
- data/lib/zip/file.rb +260 -160
- data/lib/zip/filesystem.rb +297 -276
- data/lib/zip/inflater.rb +23 -34
- data/lib/zip/input_stream.rb +130 -82
- data/lib/zip/ioextras/abstract_input_stream.rb +36 -22
- data/lib/zip/ioextras/abstract_output_stream.rb +4 -6
- data/lib/zip/ioextras.rb +4 -6
- data/lib/zip/null_compressor.rb +2 -2
- data/lib/zip/null_decompressor.rb +4 -12
- data/lib/zip/null_input_stream.rb +2 -1
- data/lib/zip/output_stream.rb +75 -45
- data/lib/zip/pass_thru_compressor.rb +6 -6
- data/lib/zip/pass_thru_decompressor.rb +14 -24
- data/lib/zip/streamable_directory.rb +3 -3
- data/lib/zip/streamable_stream.rb +21 -16
- data/lib/zip/version.rb +1 -1
- data/lib/zip.rb +42 -3
- data/samples/example.rb +30 -40
- data/samples/example_filesystem.rb +16 -18
- data/samples/example_recursive.rb +33 -28
- data/samples/gtk_ruby_zip.rb +84 -0
- data/samples/qtzip.rb +25 -34
- data/samples/write_simple.rb +10 -13
- data/samples/zipfind.rb +38 -45
- metadata +129 -28
- data/NEWS +0 -182
- data/samples/gtkRubyzip.rb +0 -86
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
require 'zip
|
|
1
|
+
require 'zip'
|
|
2
2
|
|
|
3
3
|
# This is a simple example which uses rubyzip to
|
|
4
4
|
# recursively generate a zip file from the contents of
|
|
@@ -6,44 +6,49 @@ require 'zip/zip'
|
|
|
6
6
|
# included in the archive, rather just its contents.
|
|
7
7
|
#
|
|
8
8
|
# Usage:
|
|
9
|
-
#
|
|
10
|
-
#
|
|
11
|
-
# zf = ZipFileGenerator.new(
|
|
9
|
+
# directory_to_zip = "/tmp/input"
|
|
10
|
+
# output_file = "/tmp/out.zip"
|
|
11
|
+
# zf = ZipFileGenerator.new(directory_to_zip, output_file)
|
|
12
12
|
# zf.write()
|
|
13
13
|
class ZipFileGenerator
|
|
14
|
-
|
|
15
14
|
# Initialize with the directory to zip and the location of the output archive.
|
|
16
|
-
def initialize(
|
|
17
|
-
@
|
|
18
|
-
@
|
|
15
|
+
def initialize(input_dir, output_file)
|
|
16
|
+
@input_dir = input_dir
|
|
17
|
+
@output_file = output_file
|
|
19
18
|
end
|
|
20
19
|
|
|
21
20
|
# Zip the input directory.
|
|
22
|
-
def write
|
|
23
|
-
entries = Dir.entries(@
|
|
24
|
-
io = Zip::File.open(@outputFile, Zip::File::CREATE);
|
|
21
|
+
def write
|
|
22
|
+
entries = Dir.entries(@input_dir) - %w[. ..]
|
|
25
23
|
|
|
26
|
-
|
|
27
|
-
|
|
24
|
+
::Zip::File.open(@output_file, ::Zip::File::CREATE) do |zipfile|
|
|
25
|
+
write_entries entries, '', zipfile
|
|
26
|
+
end
|
|
28
27
|
end
|
|
29
28
|
|
|
30
|
-
# A helper method to make the recursion work.
|
|
31
29
|
private
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
writeEntries(subdir, zipFilePath, io)
|
|
30
|
+
|
|
31
|
+
# A helper method to make the recursion work.
|
|
32
|
+
def write_entries(entries, path, zipfile)
|
|
33
|
+
entries.each do |e|
|
|
34
|
+
zipfile_path = path == '' ? e : File.join(path, e)
|
|
35
|
+
disk_file_path = File.join(@input_dir, zipfile_path)
|
|
36
|
+
|
|
37
|
+
if File.directory? disk_file_path
|
|
38
|
+
recursively_deflate_directory(disk_file_path, zipfile, zipfile_path)
|
|
42
39
|
else
|
|
43
|
-
|
|
40
|
+
put_into_archive(disk_file_path, zipfile, zipfile_path)
|
|
44
41
|
end
|
|
45
|
-
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def recursively_deflate_directory(disk_file_path, zipfile, zipfile_path)
|
|
46
|
+
zipfile.mkdir zipfile_path
|
|
47
|
+
subdir = Dir.entries(disk_file_path) - %w[. ..]
|
|
48
|
+
write_entries subdir, zipfile_path, zipfile
|
|
46
49
|
end
|
|
47
|
-
|
|
48
|
-
end
|
|
49
50
|
|
|
51
|
+
def put_into_archive(disk_file_path, zipfile, zipfile_path)
|
|
52
|
+
zipfile.add(zipfile_path, disk_file_path)
|
|
53
|
+
end
|
|
54
|
+
end
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
$LOAD_PATH << '../lib'
|
|
4
|
+
|
|
5
|
+
$VERBOSE = true
|
|
6
|
+
|
|
7
|
+
require 'gtk'
|
|
8
|
+
require 'zip'
|
|
9
|
+
|
|
10
|
+
class MainApp < Gtk::Window
|
|
11
|
+
def initialize
|
|
12
|
+
super()
|
|
13
|
+
set_usize(400, 256)
|
|
14
|
+
set_title('rubyzip')
|
|
15
|
+
signal_connect(Gtk::Window::SIGNAL_DESTROY) { Gtk.main_quit }
|
|
16
|
+
|
|
17
|
+
box = Gtk::VBox.new(false, 0)
|
|
18
|
+
add(box)
|
|
19
|
+
|
|
20
|
+
@zipfile = nil
|
|
21
|
+
@button_panel = ButtonPanel.new
|
|
22
|
+
@button_panel.open_button.signal_connect(Gtk::Button::SIGNAL_CLICKED) do
|
|
23
|
+
show_file_selector
|
|
24
|
+
end
|
|
25
|
+
@button_panel.extract_button.signal_connect(Gtk::Button::SIGNAL_CLICKED) do
|
|
26
|
+
puts 'Not implemented!'
|
|
27
|
+
end
|
|
28
|
+
box.pack_start(@button_panel, false, false, 0)
|
|
29
|
+
|
|
30
|
+
sw = Gtk::ScrolledWindow.new
|
|
31
|
+
sw.set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC)
|
|
32
|
+
box.pack_start(sw, true, true, 0)
|
|
33
|
+
|
|
34
|
+
@clist = Gtk::CList.new(%w[Name Size Compression])
|
|
35
|
+
@clist.set_selection_mode(Gtk::SELECTION_BROWSE)
|
|
36
|
+
@clist.set_column_width(0, 120)
|
|
37
|
+
@clist.set_column_width(1, 120)
|
|
38
|
+
@clist.signal_connect(Gtk::CList::SIGNAL_SELECT_ROW) do |_w, row, _column, _event|
|
|
39
|
+
@selected_row = row
|
|
40
|
+
end
|
|
41
|
+
sw.add(@clist)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
class ButtonPanel < Gtk::HButtonBox
|
|
45
|
+
attr_reader :open_button, :extract_button
|
|
46
|
+
def initialize
|
|
47
|
+
super
|
|
48
|
+
set_layout(Gtk::BUTTONBOX_START)
|
|
49
|
+
set_spacing(0)
|
|
50
|
+
@open_button = Gtk::Button.new('Open archive')
|
|
51
|
+
@extract_button = Gtk::Button.new('Extract entry')
|
|
52
|
+
pack_start(@open_button)
|
|
53
|
+
pack_start(@extract_button)
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def show_file_selector
|
|
58
|
+
@file_selector = Gtk::FileSelection.new('Open zip file')
|
|
59
|
+
@file_selector.show
|
|
60
|
+
@file_selector.ok_button.signal_connect(Gtk::Button::SIGNAL_CLICKED) do
|
|
61
|
+
open_zip(@file_selector.filename)
|
|
62
|
+
@file_selector.destroy
|
|
63
|
+
end
|
|
64
|
+
@file_selector.cancel_button.signal_connect(Gtk::Button::SIGNAL_CLICKED) do
|
|
65
|
+
@file_selector.destroy
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def open_zip(filename)
|
|
70
|
+
@zipfile = Zip::File.open(filename)
|
|
71
|
+
@clist.clear
|
|
72
|
+
@zipfile.each do |entry|
|
|
73
|
+
@clist.append([entry.name,
|
|
74
|
+
entry.size.to_s,
|
|
75
|
+
(100.0 * entry.compressedSize / entry.size).to_s + '%'])
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
main_app = MainApp.new
|
|
81
|
+
|
|
82
|
+
main_app.show_all
|
|
83
|
+
|
|
84
|
+
Gtk.main
|
data/samples/qtzip.rb
CHANGED
|
@@ -1,22 +1,18 @@
|
|
|
1
1
|
#!/usr/bin/env ruby
|
|
2
2
|
|
|
3
|
-
$VERBOSE=true
|
|
3
|
+
$VERBOSE = true
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
$LOAD_PATH << '../lib'
|
|
6
6
|
|
|
7
7
|
require 'Qt'
|
|
8
8
|
system('rbuic -o zipdialogui.rb zipdialogui.ui')
|
|
9
9
|
require 'zipdialogui.rb'
|
|
10
|
-
require 'zip
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
require 'zip'
|
|
13
11
|
|
|
14
12
|
a = Qt::Application.new(ARGV)
|
|
15
13
|
|
|
16
14
|
class ZipDialog < ZipDialogUI
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
def initialize()
|
|
15
|
+
def initialize
|
|
20
16
|
super()
|
|
21
17
|
connect(child('add_button'), SIGNAL('clicked()'),
|
|
22
18
|
self, SLOT('add_files()'))
|
|
@@ -24,24 +20,22 @@ class ZipDialog < ZipDialogUI
|
|
|
24
20
|
self, SLOT('extract_files()'))
|
|
25
21
|
end
|
|
26
22
|
|
|
27
|
-
def zipfile(&
|
|
28
|
-
Zip::File.open(@zip_filename, &
|
|
23
|
+
def zipfile(&a_proc)
|
|
24
|
+
Zip::File.open(@zip_filename, &a_proc)
|
|
29
25
|
end
|
|
30
26
|
|
|
31
|
-
def each(&
|
|
32
|
-
Zip::File.foreach(@zip_filename, &
|
|
27
|
+
def each(&a_proc)
|
|
28
|
+
Zip::File.foreach(@zip_filename, &a_proc)
|
|
33
29
|
end
|
|
34
|
-
|
|
35
|
-
def refresh
|
|
36
|
-
lv = child(
|
|
30
|
+
|
|
31
|
+
def refresh
|
|
32
|
+
lv = child('entry_list_view')
|
|
37
33
|
lv.clear
|
|
38
|
-
each
|
|
39
|
-
|e|
|
|
34
|
+
each do |e|
|
|
40
35
|
lv.insert_item(Qt::ListViewItem.new(lv, e.name, e.size.to_s))
|
|
41
|
-
|
|
36
|
+
end
|
|
42
37
|
end
|
|
43
38
|
|
|
44
|
-
|
|
45
39
|
def load(zipfile)
|
|
46
40
|
@zip_filename = zipfile
|
|
47
41
|
refresh
|
|
@@ -49,13 +43,11 @@ class ZipDialog < ZipDialogUI
|
|
|
49
43
|
|
|
50
44
|
def add_files
|
|
51
45
|
l = Qt::FileDialog.getOpenFileNames(nil, nil, self)
|
|
52
|
-
zipfile
|
|
53
|
-
|
|
|
54
|
-
l.each {
|
|
55
|
-
|path|
|
|
46
|
+
zipfile do |zf|
|
|
47
|
+
l.each do |path|
|
|
56
48
|
zf.add(File.basename(path), path)
|
|
57
|
-
|
|
58
|
-
|
|
49
|
+
end
|
|
50
|
+
end
|
|
59
51
|
refresh
|
|
60
52
|
end
|
|
61
53
|
|
|
@@ -63,7 +55,7 @@ class ZipDialog < ZipDialogUI
|
|
|
63
55
|
selected_items = []
|
|
64
56
|
unselected_items = []
|
|
65
57
|
lv_item = entry_list_view.first_child
|
|
66
|
-
while
|
|
58
|
+
while lv_item
|
|
67
59
|
if entry_list_view.is_selected(lv_item)
|
|
68
60
|
selected_items << lv_item.text(0)
|
|
69
61
|
else
|
|
@@ -73,23 +65,22 @@ class ZipDialog < ZipDialogUI
|
|
|
73
65
|
end
|
|
74
66
|
puts "selected_items.size = #{selected_items.size}"
|
|
75
67
|
puts "unselected_items.size = #{unselected_items.size}"
|
|
76
|
-
items = selected_items.
|
|
68
|
+
items = !selected_items.empty? ? selected_items : unselected_items
|
|
77
69
|
puts "items.size = #{items.size}"
|
|
78
70
|
|
|
79
71
|
d = Qt::FileDialog.get_existing_directory(nil, self)
|
|
80
|
-
if
|
|
81
|
-
puts
|
|
72
|
+
if !d
|
|
73
|
+
puts 'No directory chosen'
|
|
82
74
|
else
|
|
83
75
|
zipfile { |zf| items.each { |e| zf.extract(e, File.join(d, e)) } }
|
|
84
76
|
end
|
|
85
|
-
|
|
86
77
|
end
|
|
87
78
|
|
|
88
79
|
slots 'add_files()', 'extract_files()'
|
|
89
80
|
end
|
|
90
81
|
|
|
91
|
-
|
|
92
|
-
puts "usage: #{$
|
|
82
|
+
unless ARGV[0]
|
|
83
|
+
puts "usage: #{$PROGRAM_NAME} zipname"
|
|
93
84
|
exit
|
|
94
85
|
end
|
|
95
86
|
|
|
@@ -97,5 +88,5 @@ zd = ZipDialog.new
|
|
|
97
88
|
zd.load(ARGV[0])
|
|
98
89
|
|
|
99
90
|
a.mainWidget = zd
|
|
100
|
-
zd.show
|
|
101
|
-
a.exec
|
|
91
|
+
zd.show
|
|
92
|
+
a.exec
|
data/samples/write_simple.rb
CHANGED
|
@@ -1,13 +1,10 @@
|
|
|
1
|
-
#!/usr/bin/env ruby
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
require 'zip
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
ze = zos.put_next_entry 'entry.txt'
|
|
12
|
-
zos.puts "Hello world"
|
|
13
|
-
}
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
$LOAD_PATH << '../lib'
|
|
4
|
+
|
|
5
|
+
require 'zip'
|
|
6
|
+
|
|
7
|
+
::Zip::OutputStream.open('simple.zip') do |zos|
|
|
8
|
+
zos.put_next_entry 'entry.txt'
|
|
9
|
+
zos.puts 'Hello world'
|
|
10
|
+
end
|
data/samples/zipfind.rb
CHANGED
|
@@ -2,72 +2,65 @@
|
|
|
2
2
|
|
|
3
3
|
$VERBOSE = true
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
$LOAD_PATH << '../lib'
|
|
6
6
|
|
|
7
|
-
require 'zip
|
|
7
|
+
require 'zip'
|
|
8
8
|
require 'find'
|
|
9
9
|
|
|
10
10
|
module Zip
|
|
11
11
|
module ZipFind
|
|
12
|
-
def self.find(path,
|
|
13
|
-
Find.find(path)
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
if zipFilePattern.match(fileName) && File.file?(fileName)
|
|
17
|
-
begin
|
|
18
|
-
Zip::File.foreach(fileName) {
|
|
19
|
-
|zipEntry|
|
|
20
|
-
yield(fileName + File::SEPARATOR + zipEntry.to_s)
|
|
21
|
-
}
|
|
22
|
-
rescue Errno::EACCES => ex
|
|
23
|
-
puts ex
|
|
24
|
-
end
|
|
25
|
-
end
|
|
26
|
-
}
|
|
27
|
-
end
|
|
12
|
+
def self.find(path, zip_file_pattern = /\.zip$/i)
|
|
13
|
+
Find.find(path) do |filename|
|
|
14
|
+
yield(filename)
|
|
15
|
+
next unless zip_file_pattern.match(filename) && File.file?(filename)
|
|
28
16
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
17
|
+
begin
|
|
18
|
+
Zip::File.foreach(filename) do |entry|
|
|
19
|
+
yield(filename + File::SEPARATOR + entry.to_s)
|
|
20
|
+
end
|
|
21
|
+
rescue Errno::EACCES => e
|
|
22
|
+
puts e
|
|
23
|
+
end
|
|
24
|
+
end
|
|
34
25
|
end
|
|
35
26
|
|
|
27
|
+
def self.find_file(path, filename_pattern, zip_file_pattern = /\.zip$/i)
|
|
28
|
+
find(path, zip_file_pattern) do |filename|
|
|
29
|
+
yield(filename) if filename_pattern.match(filename)
|
|
30
|
+
end
|
|
31
|
+
end
|
|
36
32
|
end
|
|
37
33
|
end
|
|
38
34
|
|
|
39
|
-
if
|
|
35
|
+
if $PROGRAM_NAME == __FILE__
|
|
40
36
|
module ZipFindConsoleRunner
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
37
|
+
PATH_ARG_INDEX = 0
|
|
38
|
+
FILENAME_PATTERN_ARG_INDEX = 1
|
|
39
|
+
ZIPFILE_PATTERN_ARG_INDEX = 2
|
|
40
|
+
|
|
46
41
|
def self.run(args)
|
|
47
42
|
check_args(args)
|
|
48
|
-
Zip::ZipFind.find_file(args[PATH_ARG_INDEX],
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
}
|
|
43
|
+
Zip::ZipFind.find_file(args[PATH_ARG_INDEX],
|
|
44
|
+
args[FILENAME_PATTERN_ARG_INDEX],
|
|
45
|
+
args[ZIPFILE_PATTERN_ARG_INDEX]) do |filename|
|
|
46
|
+
report_entry_found filename
|
|
47
|
+
end
|
|
54
48
|
end
|
|
55
|
-
|
|
49
|
+
|
|
56
50
|
def self.check_args(args)
|
|
57
|
-
if
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
51
|
+
return if args.size == 3
|
|
52
|
+
|
|
53
|
+
usage
|
|
54
|
+
exit
|
|
61
55
|
end
|
|
62
56
|
|
|
63
57
|
def self.usage
|
|
64
|
-
puts "Usage: #{$
|
|
58
|
+
puts "Usage: #{$PROGRAM_NAME} PATH ZIPFILENAME_PATTERN FILNAME_PATTERN"
|
|
65
59
|
end
|
|
66
|
-
|
|
67
|
-
def self.report_entry_found(
|
|
68
|
-
puts
|
|
60
|
+
|
|
61
|
+
def self.report_entry_found(filename)
|
|
62
|
+
puts filename
|
|
69
63
|
end
|
|
70
|
-
|
|
71
64
|
end
|
|
72
65
|
|
|
73
66
|
ZipFindConsoleRunner.run(ARGV)
|
metadata
CHANGED
|
@@ -1,50 +1,120 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: rubyzip
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version:
|
|
4
|
+
version: 2.4.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
|
+
- Robert Haines
|
|
8
|
+
- John Lees-Miller
|
|
7
9
|
- Alexander Simonov
|
|
8
|
-
autorequire:
|
|
10
|
+
autorequire:
|
|
9
11
|
bindir: bin
|
|
10
12
|
cert_chain: []
|
|
11
|
-
date:
|
|
12
|
-
dependencies:
|
|
13
|
-
|
|
13
|
+
date: 2025-01-05 00:00:00.000000000 Z
|
|
14
|
+
dependencies:
|
|
15
|
+
- !ruby/object:Gem::Dependency
|
|
16
|
+
name: minitest
|
|
17
|
+
requirement: !ruby/object:Gem::Requirement
|
|
18
|
+
requirements:
|
|
19
|
+
- - "~>"
|
|
20
|
+
- !ruby/object:Gem::Version
|
|
21
|
+
version: '5.4'
|
|
22
|
+
type: :development
|
|
23
|
+
prerelease: false
|
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
25
|
+
requirements:
|
|
26
|
+
- - "~>"
|
|
27
|
+
- !ruby/object:Gem::Version
|
|
28
|
+
version: '5.4'
|
|
29
|
+
- !ruby/object:Gem::Dependency
|
|
30
|
+
name: pry
|
|
31
|
+
requirement: !ruby/object:Gem::Requirement
|
|
32
|
+
requirements:
|
|
33
|
+
- - "~>"
|
|
34
|
+
- !ruby/object:Gem::Version
|
|
35
|
+
version: '0.10'
|
|
36
|
+
type: :development
|
|
37
|
+
prerelease: false
|
|
38
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
39
|
+
requirements:
|
|
40
|
+
- - "~>"
|
|
41
|
+
- !ruby/object:Gem::Version
|
|
42
|
+
version: '0.10'
|
|
43
|
+
- !ruby/object:Gem::Dependency
|
|
44
|
+
name: rake
|
|
45
|
+
requirement: !ruby/object:Gem::Requirement
|
|
46
|
+
requirements:
|
|
47
|
+
- - "~>"
|
|
48
|
+
- !ruby/object:Gem::Version
|
|
49
|
+
version: '12.3'
|
|
50
|
+
- - ">="
|
|
51
|
+
- !ruby/object:Gem::Version
|
|
52
|
+
version: 12.3.3
|
|
53
|
+
type: :development
|
|
54
|
+
prerelease: false
|
|
55
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
56
|
+
requirements:
|
|
57
|
+
- - "~>"
|
|
58
|
+
- !ruby/object:Gem::Version
|
|
59
|
+
version: '12.3'
|
|
60
|
+
- - ">="
|
|
61
|
+
- !ruby/object:Gem::Version
|
|
62
|
+
version: 12.3.3
|
|
63
|
+
- !ruby/object:Gem::Dependency
|
|
64
|
+
name: rubocop
|
|
65
|
+
requirement: !ruby/object:Gem::Requirement
|
|
66
|
+
requirements:
|
|
67
|
+
- - "~>"
|
|
68
|
+
- !ruby/object:Gem::Version
|
|
69
|
+
version: '0.79'
|
|
70
|
+
type: :development
|
|
71
|
+
prerelease: false
|
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
73
|
+
requirements:
|
|
74
|
+
- - "~>"
|
|
75
|
+
- !ruby/object:Gem::Version
|
|
76
|
+
version: '0.79'
|
|
77
|
+
description:
|
|
14
78
|
email:
|
|
79
|
+
- hainesr@gmail.com
|
|
80
|
+
- jdleesmiller@gmail.com
|
|
15
81
|
- alex@simonov.me
|
|
16
82
|
executables: []
|
|
17
83
|
extensions: []
|
|
18
84
|
extra_rdoc_files: []
|
|
19
85
|
files:
|
|
20
|
-
-
|
|
21
|
-
-
|
|
22
|
-
-
|
|
23
|
-
-
|
|
24
|
-
- samples/qtzip.rb
|
|
25
|
-
- samples/write_simple.rb
|
|
26
|
-
- samples/zipfind.rb
|
|
86
|
+
- README.md
|
|
87
|
+
- Rakefile
|
|
88
|
+
- TODO
|
|
89
|
+
- lib/zip.rb
|
|
27
90
|
- lib/zip/central_directory.rb
|
|
28
91
|
- lib/zip/compressor.rb
|
|
29
92
|
- lib/zip/constants.rb
|
|
93
|
+
- lib/zip/crypto/decrypted_io.rb
|
|
94
|
+
- lib/zip/crypto/encryption.rb
|
|
95
|
+
- lib/zip/crypto/null_encryption.rb
|
|
96
|
+
- lib/zip/crypto/traditional_encryption.rb
|
|
30
97
|
- lib/zip/decompressor.rb
|
|
31
98
|
- lib/zip/deflater.rb
|
|
32
99
|
- lib/zip/dos_time.rb
|
|
33
100
|
- lib/zip/entry.rb
|
|
34
101
|
- lib/zip/entry_set.rb
|
|
35
102
|
- lib/zip/errors.rb
|
|
103
|
+
- lib/zip/extra_field.rb
|
|
36
104
|
- lib/zip/extra_field/generic.rb
|
|
105
|
+
- lib/zip/extra_field/ntfs.rb
|
|
106
|
+
- lib/zip/extra_field/old_unix.rb
|
|
37
107
|
- lib/zip/extra_field/universal_time.rb
|
|
38
108
|
- lib/zip/extra_field/unix.rb
|
|
39
109
|
- lib/zip/extra_field/zip64.rb
|
|
40
|
-
- lib/zip/extra_field.rb
|
|
110
|
+
- lib/zip/extra_field/zip64_placeholder.rb
|
|
41
111
|
- lib/zip/file.rb
|
|
42
112
|
- lib/zip/filesystem.rb
|
|
43
113
|
- lib/zip/inflater.rb
|
|
44
114
|
- lib/zip/input_stream.rb
|
|
115
|
+
- lib/zip/ioextras.rb
|
|
45
116
|
- lib/zip/ioextras/abstract_input_stream.rb
|
|
46
117
|
- lib/zip/ioextras/abstract_output_stream.rb
|
|
47
|
-
- lib/zip/ioextras.rb
|
|
48
118
|
- lib/zip/null_compressor.rb
|
|
49
119
|
- lib/zip/null_decompressor.rb
|
|
50
120
|
- lib/zip/null_input_stream.rb
|
|
@@ -54,32 +124,63 @@ files:
|
|
|
54
124
|
- lib/zip/streamable_directory.rb
|
|
55
125
|
- lib/zip/streamable_stream.rb
|
|
56
126
|
- lib/zip/version.rb
|
|
57
|
-
-
|
|
58
|
-
-
|
|
59
|
-
-
|
|
60
|
-
-
|
|
61
|
-
-
|
|
127
|
+
- samples/example.rb
|
|
128
|
+
- samples/example_filesystem.rb
|
|
129
|
+
- samples/example_recursive.rb
|
|
130
|
+
- samples/gtk_ruby_zip.rb
|
|
131
|
+
- samples/qtzip.rb
|
|
132
|
+
- samples/write_simple.rb
|
|
133
|
+
- samples/zipfind.rb
|
|
62
134
|
homepage: http://github.com/rubyzip/rubyzip
|
|
63
|
-
licenses:
|
|
64
|
-
|
|
65
|
-
|
|
135
|
+
licenses:
|
|
136
|
+
- BSD 2-Clause
|
|
137
|
+
metadata:
|
|
138
|
+
bug_tracker_uri: https://github.com/rubyzip/rubyzip/issues
|
|
139
|
+
changelog_uri: https://github.com/rubyzip/rubyzip/blob/v2.4.1/Changelog.md
|
|
140
|
+
documentation_uri: https://www.rubydoc.info/gems/rubyzip/2.4.1
|
|
141
|
+
source_code_uri: https://github.com/rubyzip/rubyzip/tree/v2.4.1
|
|
142
|
+
wiki_uri: https://github.com/rubyzip/rubyzip/wiki
|
|
143
|
+
rubygems_mfa_required: 'true'
|
|
144
|
+
post_install_message: |
|
|
145
|
+
RubyZip 3.0 is coming!
|
|
146
|
+
**********************
|
|
147
|
+
|
|
148
|
+
The public API of some Rubyzip classes has been modernized to use named
|
|
149
|
+
parameters for optional arguments. Please check your usage of the
|
|
150
|
+
following classes:
|
|
151
|
+
* `Zip::File`
|
|
152
|
+
* `Zip::Entry`
|
|
153
|
+
* `Zip::InputStream`
|
|
154
|
+
* `Zip::OutputStream`
|
|
155
|
+
* `Zip::DOSTime`
|
|
156
|
+
|
|
157
|
+
Run your test suite with the `RUBYZIP_V3_API_WARN` environment
|
|
158
|
+
variable set to see warnings about usage of the old API. This will
|
|
159
|
+
help you to identify any changes that you need to make to your code.
|
|
160
|
+
See https://github.com/rubyzip/rubyzip/wiki/Updating-to-version-3.x for
|
|
161
|
+
more information.
|
|
162
|
+
|
|
163
|
+
Please ensure that your Gemfiles and .gemspecs are suitably restrictive
|
|
164
|
+
to avoid an unexpected breakage when 3.0 is released (e.g. ~> 2.3.0).
|
|
165
|
+
See https://github.com/rubyzip/rubyzip for details. The Changelog also
|
|
166
|
+
lists other enhancements and bugfixes that have been implemented since
|
|
167
|
+
version 2.3.0.
|
|
66
168
|
rdoc_options: []
|
|
67
169
|
require_paths:
|
|
68
170
|
- lib
|
|
69
171
|
required_ruby_version: !ruby/object:Gem::Requirement
|
|
70
172
|
requirements:
|
|
71
|
-
- -
|
|
173
|
+
- - ">="
|
|
72
174
|
- !ruby/object:Gem::Version
|
|
73
|
-
version:
|
|
175
|
+
version: '2.4'
|
|
74
176
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
75
177
|
requirements:
|
|
76
|
-
- -
|
|
178
|
+
- - ">="
|
|
77
179
|
- !ruby/object:Gem::Version
|
|
78
180
|
version: '0'
|
|
79
181
|
requirements: []
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
signing_key:
|
|
182
|
+
rubygems_version: 3.1.6
|
|
183
|
+
signing_key:
|
|
83
184
|
specification_version: 4
|
|
84
185
|
summary: rubyzip is a ruby module for reading and writing zip files
|
|
85
186
|
test_files: []
|