rubyzip 2.3.1 → 3.0.0

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.
Files changed (61) hide show
  1. checksums.yaml +4 -4
  2. data/Changelog.md +422 -0
  3. data/LICENSE.md +24 -0
  4. data/README.md +138 -41
  5. data/Rakefile +11 -7
  6. data/lib/zip/central_directory.rb +169 -123
  7. data/lib/zip/compressor.rb +3 -1
  8. data/lib/zip/constants.rb +29 -21
  9. data/lib/zip/crypto/decrypted_io.rb +4 -2
  10. data/lib/zip/crypto/encryption.rb +4 -2
  11. data/lib/zip/crypto/null_encryption.rb +6 -4
  12. data/lib/zip/crypto/traditional_encryption.rb +8 -6
  13. data/lib/zip/decompressor.rb +4 -3
  14. data/lib/zip/deflater.rb +10 -8
  15. data/lib/zip/dirtyable.rb +32 -0
  16. data/lib/zip/dos_time.rb +51 -5
  17. data/lib/zip/entry.rb +363 -222
  18. data/lib/zip/entry_set.rb +11 -9
  19. data/lib/zip/errors.rb +136 -16
  20. data/lib/zip/extra_field/generic.rb +6 -13
  21. data/lib/zip/extra_field/ntfs.rb +6 -4
  22. data/lib/zip/extra_field/old_unix.rb +3 -1
  23. data/lib/zip/extra_field/universal_time.rb +3 -1
  24. data/lib/zip/extra_field/unix.rb +5 -3
  25. data/lib/zip/extra_field/unknown.rb +33 -0
  26. data/lib/zip/extra_field/zip64.rb +12 -5
  27. data/lib/zip/extra_field.rb +16 -22
  28. data/lib/zip/file.rb +177 -223
  29. data/lib/zip/file_split.rb +91 -0
  30. data/lib/zip/filesystem/dir.rb +86 -0
  31. data/lib/zip/filesystem/directory_iterator.rb +48 -0
  32. data/lib/zip/filesystem/file.rb +262 -0
  33. data/lib/zip/filesystem/file_stat.rb +110 -0
  34. data/lib/zip/filesystem/zip_file_name_mapper.rb +81 -0
  35. data/lib/zip/filesystem.rb +27 -596
  36. data/lib/zip/inflater.rb +6 -4
  37. data/lib/zip/input_stream.rb +50 -37
  38. data/lib/zip/ioextras/abstract_input_stream.rb +15 -10
  39. data/lib/zip/ioextras/abstract_output_stream.rb +5 -3
  40. data/lib/zip/ioextras.rb +7 -7
  41. data/lib/zip/null_compressor.rb +3 -1
  42. data/lib/zip/null_decompressor.rb +3 -1
  43. data/lib/zip/null_input_stream.rb +3 -1
  44. data/lib/zip/output_stream.rb +53 -47
  45. data/lib/zip/pass_thru_compressor.rb +3 -1
  46. data/lib/zip/pass_thru_decompressor.rb +4 -2
  47. data/lib/zip/streamable_directory.rb +3 -1
  48. data/lib/zip/streamable_stream.rb +3 -0
  49. data/lib/zip/version.rb +3 -1
  50. data/lib/zip.rb +17 -23
  51. data/rubyzip.gemspec +39 -0
  52. data/samples/example.rb +8 -3
  53. data/samples/example_filesystem.rb +3 -2
  54. data/samples/example_recursive.rb +3 -1
  55. data/samples/gtk_ruby_zip.rb +4 -2
  56. data/samples/qtzip.rb +6 -5
  57. data/samples/write_simple.rb +2 -1
  58. data/samples/zipfind.rb +1 -0
  59. metadata +83 -33
  60. data/TODO +0 -15
  61. data/lib/zip/extra_field/zip64_placeholder.rb +0 -15
data/rubyzip.gemspec ADDED
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'lib/zip/version'
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = 'rubyzip'
7
+ s.version = Zip::VERSION
8
+ s.authors = ['Robert Haines', 'John Lees-Miller', 'Alexander Simonov']
9
+ s.email = [
10
+ 'hainesr@gmail.com', 'jdleesmiller@gmail.com', 'alex@simonov.me'
11
+ ]
12
+ s.homepage = 'http://github.com/rubyzip/rubyzip'
13
+ s.platform = Gem::Platform::RUBY
14
+ s.summary = 'rubyzip is a ruby module for reading and writing zip files'
15
+ s.files = Dir.glob('{samples,lib}/**/*.rb') +
16
+ %w[LICENSE.md README.md Changelog.md Rakefile rubyzip.gemspec]
17
+ s.require_paths = ['lib']
18
+ s.license = 'BSD-2-Clause'
19
+
20
+ s.metadata = {
21
+ 'bug_tracker_uri' => 'https://github.com/rubyzip/rubyzip/issues',
22
+ 'changelog_uri' => "https://github.com/rubyzip/rubyzip/blob/v#{s.version}/Changelog.md",
23
+ 'documentation_uri' => "https://www.rubydoc.info/gems/rubyzip/#{s.version}",
24
+ 'source_code_uri' => "https://github.com/rubyzip/rubyzip/tree/v#{s.version}",
25
+ 'wiki_uri' => 'https://github.com/rubyzip/rubyzip/wiki',
26
+ 'rubygems_mfa_required' => 'true'
27
+ }
28
+
29
+ s.required_ruby_version = '>= 3.0'
30
+
31
+ s.add_development_dependency 'minitest', '~> 5.25'
32
+ s.add_development_dependency 'rake', '~> 13.2'
33
+ s.add_development_dependency 'rdoc', '~> 6.11'
34
+ s.add_development_dependency 'rubocop', '~> 1.61.0'
35
+ s.add_development_dependency 'rubocop-performance', '~> 1.20.0'
36
+ s.add_development_dependency 'rubocop-rake', '~> 0.6.0'
37
+ s.add_development_dependency 'simplecov', '~> 0.22.0'
38
+ s.add_development_dependency 'simplecov-lcov', '~> 0.8'
39
+ end
data/samples/example.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
4
  $LOAD_PATH << '../lib'
4
5
  system('zip example.zip example.rb gtk_ruby_zip.rb')
@@ -20,7 +21,8 @@ end
20
21
 
21
22
  zf = Zip::File.new('example.zip')
22
23
  zf.each_with_index do |entry, index|
23
- puts "entry #{index} is #{entry.name}, size = #{entry.size}, compressed size = #{entry.compressed_size}"
24
+ puts "entry #{index} is #{entry.name}, size = #{entry.size}, " \
25
+ "compressed size = #{entry.compressed_size}"
24
26
  # use zf.get_input_stream(entry) to get a ZipInputStream for the entry
25
27
  # entry can be the ZipEntry object or any object which has a to_s method that
26
28
  # returns the name of the entry.
@@ -70,8 +72,11 @@ part_zips_count = Zip::File.split('large_zip_file.zip', 2_097_152, false)
70
72
  puts "Zip file splitted in #{part_zips_count} parts"
71
73
 
72
74
  # Track splitting an archive
73
- Zip::File.split('large_zip_file.zip', 1_048_576, true, 'part_zip_file') do |part_count, part_index, chunk_bytes, segment_bytes|
74
- puts "#{part_index} of #{part_count} part splitting: #{(chunk_bytes.to_f / segment_bytes * 100).to_i}%"
75
+ Zip::File.split(
76
+ 'large_zip_file.zip', 1_048_576, true, 'part_zip_file'
77
+ ) do |part_count, part_index, chunk_bytes, segment_bytes|
78
+ puts "#{part_index} of #{part_count} part splitting: " \
79
+ "#{(chunk_bytes.to_f / segment_bytes * 100).to_i}%"
75
80
  end
76
81
 
77
82
  # For other examples, look at zip.rb and ziptest.rb
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
4
  $LOAD_PATH << '../lib'
4
5
 
@@ -6,9 +7,9 @@ require 'zip/filesystem'
6
7
 
7
8
  EXAMPLE_ZIP = 'filesystem.zip'
8
9
 
9
- File.delete(EXAMPLE_ZIP) if File.exist?(EXAMPLE_ZIP)
10
+ FileUtils.rm_f(EXAMPLE_ZIP)
10
11
 
11
- Zip::File.open(EXAMPLE_ZIP, Zip::File::CREATE) do |zf|
12
+ Zip::File.open(EXAMPLE_ZIP, create: true) do |zf|
12
13
  zf.file.open('file1.txt', 'w') { |os| os.write 'first file1.txt' }
13
14
  zf.dir.mkdir('dir1')
14
15
  zf.dir.chdir('dir1')
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'zip'
2
4
 
3
5
  # This is a simple example which uses rubyzip to
@@ -21,7 +23,7 @@ class ZipFileGenerator
21
23
  def write
22
24
  entries = Dir.entries(@input_dir) - %w[. ..]
23
25
 
24
- ::Zip::File.open(@output_file, ::Zip::File::CREATE) do |zipfile|
26
+ ::Zip::File.open(@output_file, create: true) do |zipfile|
25
27
  write_entries entries, '', zipfile
26
28
  end
27
29
  end
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
4
  $LOAD_PATH << '../lib'
4
5
 
@@ -42,7 +43,8 @@ class MainApp < Gtk::Window
42
43
  end
43
44
 
44
45
  class ButtonPanel < Gtk::HButtonBox
45
- attr_reader :open_button, :extract_button
46
+ attr_reader :extract_button, :open_button
47
+
46
48
  def initialize
47
49
  super
48
50
  set_layout(Gtk::BUTTONBOX_START)
@@ -72,7 +74,7 @@ class MainApp < Gtk::Window
72
74
  @zipfile.each do |entry|
73
75
  @clist.append([entry.name,
74
76
  entry.size.to_s,
75
- (100.0 * entry.compressedSize / entry.size).to_s + '%'])
77
+ "#{100.0 * entry.compressedSize / entry.size}%"])
76
78
  end
77
79
  end
78
80
  end
data/samples/qtzip.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
4
  $VERBOSE = true
4
5
 
@@ -6,7 +7,7 @@ $LOAD_PATH << '../lib'
6
7
 
7
8
  require 'Qt'
8
9
  system('rbuic -o zipdialogui.rb zipdialogui.ui')
9
- require 'zipdialogui.rb'
10
+ require 'zipdialogui'
10
11
  require 'zip'
11
12
 
12
13
  a = Qt::Application.new(ARGV)
@@ -65,14 +66,14 @@ class ZipDialog < ZipDialogUI
65
66
  end
66
67
  puts "selected_items.size = #{selected_items.size}"
67
68
  puts "unselected_items.size = #{unselected_items.size}"
68
- items = !selected_items.empty? ? selected_items : unselected_items
69
+ items = selected_items.empty? ? unselected_items : selected_items
69
70
  puts "items.size = #{items.size}"
70
71
 
71
72
  d = Qt::FileDialog.get_existing_directory(nil, self)
72
- if !d
73
- puts 'No directory chosen'
74
- else
73
+ if d
75
74
  zipfile { |zf| items.each { |e| zf.extract(e, File.join(d, e)) } }
75
+ else
76
+ puts 'No directory chosen'
76
77
  end
77
78
  end
78
79
 
@@ -1,10 +1,11 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
4
  $LOAD_PATH << '../lib'
4
5
 
5
6
  require 'zip'
6
7
 
7
- ::Zip::OutputStream.open('simple.zip') do |zos|
8
+ Zip::OutputStream.open('simple.zip') do |zos|
8
9
  zos.put_next_entry 'entry.txt'
9
10
  zos.puts 'Hello world'
10
11
  end
data/samples/zipfind.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
4
  $VERBOSE = true
4
5
 
metadata CHANGED
@@ -1,101 +1,142 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubyzip
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.1
4
+ version: 3.0.0
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: 2021-07-03 00:00:00.000000000 Z
13
+ date: 2025-07-28 00:00:00.000000000 Z
12
14
  dependencies:
13
15
  - !ruby/object:Gem::Dependency
14
- name: coveralls
16
+ name: minitest
15
17
  requirement: !ruby/object:Gem::Requirement
16
18
  requirements:
17
19
  - - "~>"
18
20
  - !ruby/object:Gem::Version
19
- version: '0.7'
21
+ version: '5.25'
20
22
  type: :development
21
23
  prerelease: false
22
24
  version_requirements: !ruby/object:Gem::Requirement
23
25
  requirements:
24
26
  - - "~>"
25
27
  - !ruby/object:Gem::Version
26
- version: '0.7'
28
+ version: '5.25'
27
29
  - !ruby/object:Gem::Dependency
28
- name: minitest
30
+ name: rake
29
31
  requirement: !ruby/object:Gem::Requirement
30
32
  requirements:
31
33
  - - "~>"
32
34
  - !ruby/object:Gem::Version
33
- version: '5.4'
35
+ version: '13.2'
34
36
  type: :development
35
37
  prerelease: false
36
38
  version_requirements: !ruby/object:Gem::Requirement
37
39
  requirements:
38
40
  - - "~>"
39
41
  - !ruby/object:Gem::Version
40
- version: '5.4'
42
+ version: '13.2'
41
43
  - !ruby/object:Gem::Dependency
42
- name: pry
44
+ name: rdoc
43
45
  requirement: !ruby/object:Gem::Requirement
44
46
  requirements:
45
47
  - - "~>"
46
48
  - !ruby/object:Gem::Version
47
- version: '0.10'
49
+ version: '6.11'
48
50
  type: :development
49
51
  prerelease: false
50
52
  version_requirements: !ruby/object:Gem::Requirement
51
53
  requirements:
52
54
  - - "~>"
53
55
  - !ruby/object:Gem::Version
54
- version: '0.10'
56
+ version: '6.11'
55
57
  - !ruby/object:Gem::Dependency
56
- name: rake
58
+ name: rubocop
57
59
  requirement: !ruby/object:Gem::Requirement
58
60
  requirements:
59
61
  - - "~>"
60
62
  - !ruby/object:Gem::Version
61
- version: '12.3'
62
- - - ">="
63
+ version: 1.61.0
64
+ type: :development
65
+ prerelease: false
66
+ version_requirements: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - "~>"
63
69
  - !ruby/object:Gem::Version
64
- version: 12.3.3
70
+ version: 1.61.0
71
+ - !ruby/object:Gem::Dependency
72
+ name: rubocop-performance
73
+ requirement: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - "~>"
76
+ - !ruby/object:Gem::Version
77
+ version: 1.20.0
65
78
  type: :development
66
79
  prerelease: false
67
80
  version_requirements: !ruby/object:Gem::Requirement
68
81
  requirements:
69
82
  - - "~>"
70
83
  - !ruby/object:Gem::Version
71
- version: '12.3'
72
- - - ">="
84
+ version: 1.20.0
85
+ - !ruby/object:Gem::Dependency
86
+ name: rubocop-rake
87
+ requirement: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - "~>"
73
90
  - !ruby/object:Gem::Version
74
- version: 12.3.3
91
+ version: 0.6.0
92
+ type: :development
93
+ prerelease: false
94
+ version_requirements: !ruby/object:Gem::Requirement
95
+ requirements:
96
+ - - "~>"
97
+ - !ruby/object:Gem::Version
98
+ version: 0.6.0
75
99
  - !ruby/object:Gem::Dependency
76
- name: rubocop
100
+ name: simplecov
101
+ requirement: !ruby/object:Gem::Requirement
102
+ requirements:
103
+ - - "~>"
104
+ - !ruby/object:Gem::Version
105
+ version: 0.22.0
106
+ type: :development
107
+ prerelease: false
108
+ version_requirements: !ruby/object:Gem::Requirement
109
+ requirements:
110
+ - - "~>"
111
+ - !ruby/object:Gem::Version
112
+ version: 0.22.0
113
+ - !ruby/object:Gem::Dependency
114
+ name: simplecov-lcov
77
115
  requirement: !ruby/object:Gem::Requirement
78
116
  requirements:
79
117
  - - "~>"
80
118
  - !ruby/object:Gem::Version
81
- version: '0.79'
119
+ version: '0.8'
82
120
  type: :development
83
121
  prerelease: false
84
122
  version_requirements: !ruby/object:Gem::Requirement
85
123
  requirements:
86
124
  - - "~>"
87
125
  - !ruby/object:Gem::Version
88
- version: '0.79'
89
- description:
126
+ version: '0.8'
127
+ description:
90
128
  email:
129
+ - hainesr@gmail.com
130
+ - jdleesmiller@gmail.com
91
131
  - alex@simonov.me
92
132
  executables: []
93
133
  extensions: []
94
134
  extra_rdoc_files: []
95
135
  files:
136
+ - Changelog.md
137
+ - LICENSE.md
96
138
  - README.md
97
139
  - Rakefile
98
- - TODO
99
140
  - lib/zip.rb
100
141
  - lib/zip/central_directory.rb
101
142
  - lib/zip/compressor.rb
@@ -106,6 +147,7 @@ files:
106
147
  - lib/zip/crypto/traditional_encryption.rb
107
148
  - lib/zip/decompressor.rb
108
149
  - lib/zip/deflater.rb
150
+ - lib/zip/dirtyable.rb
109
151
  - lib/zip/dos_time.rb
110
152
  - lib/zip/entry.rb
111
153
  - lib/zip/entry_set.rb
@@ -116,10 +158,16 @@ files:
116
158
  - lib/zip/extra_field/old_unix.rb
117
159
  - lib/zip/extra_field/universal_time.rb
118
160
  - lib/zip/extra_field/unix.rb
161
+ - lib/zip/extra_field/unknown.rb
119
162
  - lib/zip/extra_field/zip64.rb
120
- - lib/zip/extra_field/zip64_placeholder.rb
121
163
  - lib/zip/file.rb
164
+ - lib/zip/file_split.rb
122
165
  - lib/zip/filesystem.rb
166
+ - lib/zip/filesystem/dir.rb
167
+ - lib/zip/filesystem/directory_iterator.rb
168
+ - lib/zip/filesystem/file.rb
169
+ - lib/zip/filesystem/file_stat.rb
170
+ - lib/zip/filesystem/zip_file_name_mapper.rb
123
171
  - lib/zip/inflater.rb
124
172
  - lib/zip/input_stream.rb
125
173
  - lib/zip/ioextras.rb
@@ -134,6 +182,7 @@ files:
134
182
  - lib/zip/streamable_directory.rb
135
183
  - lib/zip/streamable_stream.rb
136
184
  - lib/zip/version.rb
185
+ - rubyzip.gemspec
137
186
  - samples/example.rb
138
187
  - samples/example_filesystem.rb
139
188
  - samples/example_recursive.rb
@@ -143,14 +192,15 @@ files:
143
192
  - samples/zipfind.rb
144
193
  homepage: http://github.com/rubyzip/rubyzip
145
194
  licenses:
146
- - BSD 2-Clause
195
+ - BSD-2-Clause
147
196
  metadata:
148
197
  bug_tracker_uri: https://github.com/rubyzip/rubyzip/issues
149
- changelog_uri: https://github.com/rubyzip/rubyzip/blob/v2.3.1/Changelog.md
150
- documentation_uri: https://www.rubydoc.info/gems/rubyzip/2.3.1
151
- source_code_uri: https://github.com/rubyzip/rubyzip/tree/v2.3.1
198
+ changelog_uri: https://github.com/rubyzip/rubyzip/blob/v3.0.0/Changelog.md
199
+ documentation_uri: https://www.rubydoc.info/gems/rubyzip/3.0.0
200
+ source_code_uri: https://github.com/rubyzip/rubyzip/tree/v3.0.0
152
201
  wiki_uri: https://github.com/rubyzip/rubyzip/wiki
153
- post_install_message:
202
+ rubygems_mfa_required: 'true'
203
+ post_install_message:
154
204
  rdoc_options: []
155
205
  require_paths:
156
206
  - lib
@@ -158,15 +208,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
158
208
  requirements:
159
209
  - - ">="
160
210
  - !ruby/object:Gem::Version
161
- version: '2.4'
211
+ version: '3.0'
162
212
  required_rubygems_version: !ruby/object:Gem::Requirement
163
213
  requirements:
164
214
  - - ">="
165
215
  - !ruby/object:Gem::Version
166
216
  version: '0'
167
217
  requirements: []
168
- rubygems_version: 3.1.4
169
- signing_key:
218
+ rubygems_version: 3.4.1
219
+ signing_key:
170
220
  specification_version: 4
171
221
  summary: rubyzip is a ruby module for reading and writing zip files
172
222
  test_files: []
data/TODO DELETED
@@ -1,15 +0,0 @@
1
-
2
- * ZipInputStream: Support zip-files with trailing data descriptors
3
- * Adjust rdoc stylesheet to advertise inherited methods if possible
4
- * Suggestion: Add ZipFile/ZipInputStream example that demonstrates extracting all entries.
5
- * Suggestion: ZipFile#extract destination should default to "."
6
- * Suggestion: ZipEntry should have extract(), get_input_stream() methods etc
7
- * (is buffering used anywhere with write?)
8
- * Inflater.sysread should pass the buffer to produce_input.
9
- * Implement ZipFsDir.glob
10
- * ZipFile.checkIntegrity method
11
- * non-MSDOS permission attributes
12
- ** See mail from Ned Konz to ruby-talk subj. "Re: SV: [ANN] Archive 0.2"
13
- * Packager version, required unpacker version in zip headers
14
- ** See mail from Ned Konz to ruby-talk subj. "Re: SV: [ANN] Archive 0.2"
15
- * implement storing attributes and ownership information
@@ -1,15 +0,0 @@
1
- module Zip
2
- # placeholder to reserve space for a Zip64 extra information record, for the
3
- # local file header only, that we won't know if we'll need until after
4
- # we write the file data
5
- class ExtraField::Zip64Placeholder < ExtraField::Generic
6
- HEADER_ID = ['9999'].pack('H*') # this ID is used by other libraries such as .NET's Ionic.zip
7
- register_map
8
-
9
- def initialize(_binstr = nil); end
10
-
11
- def pack_for_local
12
- "\x00" * 16
13
- end
14
- end
15
- end