seven_zip_ruby 1.1.0-x86-mswin32-100 → 1.2.0-x86-mswin32-100
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 +4 -4
- data/.gitignore +1 -0
- data/.travis.yml +9 -0
- data/README.md +11 -4
- data/Rakefile +13 -1
- data/lib/seven_zip_ruby.rb +21 -10
- data/lib/seven_zip_ruby/entry_info.rb +3 -2
- data/lib/seven_zip_ruby/seven_zip_reader.rb +78 -6
- data/lib/seven_zip_ruby/seven_zip_writer.rb +108 -11
- data/lib/seven_zip_ruby/version.rb +1 -1
- data/spec/seven_zip_ruby_spec.rb +138 -63
- data/spec/seven_zip_ruby_spec_helper.rb +11 -4
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c5f76d2c9638a3a822cf5857fd882751e10b08fb
|
4
|
+
data.tar.gz: df3d399ba030d7877763bba565c53ee3601408e5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f703eb23188d2097dc2ea3c63bacb8487e86e611076d80a3465d7e45e92ad4834fc073b2301d98d3dcbb796e91aff0045831a0d65137000f795474af9b03c1e3
|
7
|
+
data.tar.gz: 93a2e680ea29f54d5f169725f66ed22c49cb69459677bc3a4ff3d2a1a1d99c7c66af1a179a8577e76ac95fdf2513b161eef95835f2495c61f4b46e3c2f6d455a
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
# SevenZipRuby 
|
2
2
|
|
3
|
-
[](https://travis-ci.org/masamitsu-murase/seven_zip_ruby)
|
3
|
+
[](https://travis-ci.org/masamitsu-murase/seven_zip_ruby) [](http://badge.fury.io/rb/seven_zip_ruby)
|
4
4
|
|
5
|
-
This is a Ruby gem library to
|
5
|
+
This is a Ruby gem library to extract/compress [7-Zip](http://www.7-zip.org) archives.
|
6
6
|
|
7
7
|
This extension calls the native library, 7z.dll or 7z.so, internally and it is included in this gem.
|
8
8
|
|
@@ -86,12 +86,19 @@ File.open("filename.7z", "wb") do |file|
|
|
86
86
|
end
|
87
87
|
```
|
88
88
|
|
89
|
-
## Supported
|
89
|
+
## Supported environment
|
90
|
+
|
91
|
+
SevenZipRuby supports the following platforms.
|
90
92
|
|
91
93
|
* Windows
|
92
94
|
* Linux
|
93
95
|
* Mac OSX
|
94
96
|
|
97
|
+
SevenZipRuby supports the following Ruby engines on each platform.
|
98
|
+
|
99
|
+
* MRI 2.0.0 and later
|
100
|
+
* Rubinius 2.2.1 and later
|
101
|
+
|
95
102
|
## More examples
|
96
103
|
|
97
104
|
### Extract partially
|
@@ -180,7 +187,7 @@ LGPL and unRAR license. Please refer to LICENSE.txt.
|
|
180
187
|
|
181
188
|
## Releases
|
182
189
|
|
183
|
-
* 1.1.0
|
190
|
+
* 1.1.0
|
184
191
|
Raise error when wrong password is specified.
|
185
192
|
* 1.0.0
|
186
193
|
Initial release.
|
data/Rakefile
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require "fileutils"
|
2
|
+
require "tempfile"
|
2
3
|
require "bundler/gem_tasks"
|
3
4
|
|
4
5
|
BINARY_FILES = [ "seven_zip_archive.so", "seven_zip_archive.bundle" ]
|
@@ -32,7 +33,18 @@ end
|
|
32
33
|
task :build_binary do
|
33
34
|
Dir.chdir "ext/seven_zip_ruby" do
|
34
35
|
FileUtils.rmtree BINARY_FILES
|
35
|
-
|
36
|
+
|
37
|
+
Tempfile.open([ "site", ".rb" ], Dir.pwd) do |temp|
|
38
|
+
temp.puts <<"EOS"
|
39
|
+
require('rbconfig')
|
40
|
+
RbConfig::CONFIG['sitearchdir'] = "../../lib"
|
41
|
+
EOS
|
42
|
+
temp.flush
|
43
|
+
|
44
|
+
sh "ruby -r#{File.expand_path(temp.path)} extconf.rb"
|
45
|
+
temp.unlink
|
46
|
+
end
|
47
|
+
|
36
48
|
sh "#{MAKE}"
|
37
49
|
end
|
38
50
|
end
|
data/lib/seven_zip_ruby.rb
CHANGED
@@ -1,16 +1,27 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
|
3
|
-
|
3
|
+
require("seven_zip_ruby/version")
|
4
4
|
|
5
|
-
|
5
|
+
external_lib = (RUBY_PLATFORM.downcase.match(/mswin|mingw/) ? "7z.dll" : "7z.so")
|
6
|
+
dir = $:.find do |i|
|
7
|
+
next File.file?(File.join(i, "seven_zip_ruby", external_lib))
|
8
|
+
end
|
9
|
+
raise "Failed to find 7z.dll or 7z.so" unless (dir)
|
10
|
+
|
11
|
+
Dir.chdir(File.join(dir, "seven_zip_ruby"))do
|
12
|
+
begin
|
13
|
+
version = RUBY_VERSION.match(/\d+\.\d+/)
|
14
|
+
require("seven_zip_ruby/#{version}/seven_zip_archive")
|
15
|
+
rescue LoadError
|
16
|
+
require("seven_zip_ruby/seven_zip_archive")
|
17
|
+
end
|
18
|
+
end
|
6
19
|
raise "Failed to initialize SevenZipRuby" unless (defined?(SevenZipRuby::SevenZipReader))
|
7
20
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
21
|
+
require("seven_zip_ruby/seven_zip_reader")
|
22
|
+
require("seven_zip_ruby/seven_zip_writer")
|
23
|
+
require("seven_zip_ruby/archive_info")
|
24
|
+
require("seven_zip_ruby/update_info")
|
25
|
+
require("seven_zip_ruby/entry_info")
|
26
|
+
require("seven_zip_ruby/exception")
|
14
27
|
|
15
|
-
module SevenZipRuby
|
16
|
-
end
|
@@ -4,11 +4,12 @@ module SevenZipRuby
|
|
4
4
|
class EntryInfo
|
5
5
|
def initialize(index, path, method, dir, encrypted, anti, size, pack_size, ctime, atime, mtime, attrib, crc)
|
6
6
|
@index, @path, @method, @dir, @encrypted, @anti, @size, @pack_size, @ctime, @atime, @mtime, @attrib, @crc =
|
7
|
-
index, Pathname(path.to_s.force_encoding(Encoding::UTF_8)).cleanpath, method, dir, encrypted, anti, size, pack_size, ctime, atime, mtime, attrib, crc
|
7
|
+
index, Pathname(path.to_s.force_encoding(Encoding::UTF_8)).cleanpath.to_s, method, dir, encrypted, anti, size, pack_size, ctime, atime, mtime, attrib, crc
|
8
8
|
end
|
9
9
|
|
10
10
|
attr_reader :index, :path, :method, :size, :pack_size, :ctime, :atime, :mtime, :attrib, :crc
|
11
11
|
alias to_i index
|
12
|
+
alias crc32 crc
|
12
13
|
|
13
14
|
def directory?
|
14
15
|
return @dir
|
@@ -38,7 +39,7 @@ module SevenZipRuby
|
|
38
39
|
else
|
39
40
|
type = "file"
|
40
41
|
end
|
41
|
-
str = path.
|
42
|
+
str = path.encode(Encoding::ASCII, invalid: :replace, undef: :replace, replace: "?")
|
42
43
|
return "#<EntryInfo: #{index}, #{type}, #{str}>"
|
43
44
|
end
|
44
45
|
end
|
@@ -28,6 +28,11 @@ module SevenZipRuby
|
|
28
28
|
# end
|
29
29
|
# end
|
30
30
|
#
|
31
|
+
# # Extract archive 2
|
32
|
+
# SevenZipRuby::Reader.open_file("filename.7z") do |szr|
|
33
|
+
# szr.extract(:all, "path_to_dir")
|
34
|
+
# end
|
35
|
+
#
|
31
36
|
# # Extract encrypted archive
|
32
37
|
# File.open("filename.7z", "rb") do |file|
|
33
38
|
# SevenZipRuby::Reader.open(file, password: "Password String") do |szr|
|
@@ -103,6 +108,40 @@ module SevenZipRuby
|
|
103
108
|
end
|
104
109
|
end
|
105
110
|
|
111
|
+
|
112
|
+
# Open 7zip archive to read.
|
113
|
+
#
|
114
|
+
# ==== Args
|
115
|
+
# +filename+ :: Filename of 7zip archive.
|
116
|
+
# +param+ :: Optional hash parameter. <tt>:password</tt> key represents password of this archive.
|
117
|
+
#
|
118
|
+
# ==== Examples
|
119
|
+
# # Open archive
|
120
|
+
# SevenZipRuby::SevenZipReader.open_file("filename.7z") do |szr|
|
121
|
+
# # Read and extract archive.
|
122
|
+
# end
|
123
|
+
#
|
124
|
+
# # Open encrypted archive
|
125
|
+
# SevenZipRuby::SevenZipReader.open_file("filename.7z", password: "PasswordOfArchive") do |szr|
|
126
|
+
# # Read and extract archive.
|
127
|
+
# end
|
128
|
+
#
|
129
|
+
# # Open without block.
|
130
|
+
# szr = SevenZipRuby::SevenZipReader.open_file("filename.7z")
|
131
|
+
# # Read and extract archive.
|
132
|
+
# szr.close
|
133
|
+
def open_file(filename, param = {}, &block) # :yield: szr
|
134
|
+
szr = self.new
|
135
|
+
szr.open_file(filename, param)
|
136
|
+
if (block)
|
137
|
+
block.call(szr)
|
138
|
+
szr.close
|
139
|
+
else
|
140
|
+
szr
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
|
106
145
|
# Open and extract 7zip archive.
|
107
146
|
#
|
108
147
|
# ==== Args
|
@@ -167,6 +206,8 @@ module SevenZipRuby
|
|
167
206
|
end
|
168
207
|
end
|
169
208
|
|
209
|
+
undef initialize_copy, clone, dup
|
210
|
+
|
170
211
|
# Open 7zip archive.
|
171
212
|
#
|
172
213
|
# ==== Args
|
@@ -187,6 +228,31 @@ module SevenZipRuby
|
|
187
228
|
return self
|
188
229
|
end
|
189
230
|
|
231
|
+
# Open 7zip archive file.
|
232
|
+
#
|
233
|
+
# ==== Args
|
234
|
+
# +filename+ :: Filename of 7zip archive.
|
235
|
+
# +param+ :: Optional hash parameter. <tt>:password</tt> key represents password of this archive.
|
236
|
+
#
|
237
|
+
# ==== Examples
|
238
|
+
# szr = SevenZipRuby::SevenZipReader.new
|
239
|
+
# szr.open_file("filename.7z")
|
240
|
+
# # ...
|
241
|
+
# szr.close
|
242
|
+
def open_file(filename, param = {})
|
243
|
+
@stream = File.open(filename, "rb")
|
244
|
+
self.open(@stream, param)
|
245
|
+
return self
|
246
|
+
end
|
247
|
+
|
248
|
+
def close
|
249
|
+
close_impl
|
250
|
+
if (@stream)
|
251
|
+
@stream.close
|
252
|
+
@stream = nil
|
253
|
+
end
|
254
|
+
end
|
255
|
+
|
190
256
|
# Verify 7zip archive.
|
191
257
|
#
|
192
258
|
# ==== Args
|
@@ -252,9 +318,11 @@ module SevenZipRuby
|
|
252
318
|
when Symbol
|
253
319
|
raise SevenZipError.new("Argument error") unless (index == :all)
|
254
320
|
return extract_all(path)
|
255
|
-
when
|
321
|
+
when Enumerable
|
256
322
|
index_list = index.map(&:to_i).sort.uniq
|
257
323
|
extract_files_impl(index_list, file_proc(path))
|
324
|
+
when nil
|
325
|
+
raise ArgumentError.new("Invalid parameter index")
|
258
326
|
else
|
259
327
|
extract_impl(index.to_i, file_proc(path))
|
260
328
|
end
|
@@ -328,7 +396,7 @@ module SevenZipRuby
|
|
328
396
|
extract_all_impl(data_proc(ret, idx_prj))
|
329
397
|
return ret
|
330
398
|
|
331
|
-
when
|
399
|
+
when Enumerable
|
332
400
|
index_list = index.map(&:to_i)
|
333
401
|
idx_prj = Hash[*(index_list.each_with_index.map{ |idx, i| [ idx, i ] }.flatten)]
|
334
402
|
|
@@ -336,6 +404,9 @@ module SevenZipRuby
|
|
336
404
|
extract_files_impl(index_list, data_proc(ret, idx_prj))
|
337
405
|
return ret
|
338
406
|
|
407
|
+
when nil
|
408
|
+
raise ArgumentError.new("Invalid parameter index")
|
409
|
+
|
339
410
|
else
|
340
411
|
index = index.to_i
|
341
412
|
item = entry(index)
|
@@ -360,14 +431,15 @@ module SevenZipRuby
|
|
360
431
|
case(type)
|
361
432
|
when :stream
|
362
433
|
ret = nil
|
434
|
+
arg_path = Pathname(arg.path)
|
363
435
|
if (arg.anti?)
|
364
|
-
|
436
|
+
arg_path.rmtree if (arg_path.exist?)
|
365
437
|
elsif (arg.file?)
|
366
|
-
path =
|
438
|
+
path = arg_path.expand_path(base_dir)
|
367
439
|
path.parent.mkpath
|
368
440
|
ret = File.open(path, "wb")
|
369
441
|
else
|
370
|
-
path =
|
442
|
+
path = arg_path.expand_path(base_dir)
|
371
443
|
path.mkpath
|
372
444
|
set_file_attribute(path.to_s, arg.attrib) if (arg.attrib)
|
373
445
|
path.utime(arg.atime || path.atime, arg.mtime || path.mtime)
|
@@ -379,7 +451,7 @@ module SevenZipRuby
|
|
379
451
|
raise InvalidArchive.new("Corrupted archive or invalid password") unless (arg[:success])
|
380
452
|
|
381
453
|
unless (arg[:info].anti?)
|
382
|
-
path = arg[:info].path.expand_path(base_dir)
|
454
|
+
path = Pathname(arg[:info].path).expand_path(base_dir)
|
383
455
|
set_file_attribute(path.to_s, arg[:info].attrib) if (arg[:info].attrib)
|
384
456
|
path.utime(arg[:info].atime || path.atime, arg[:info].mtime || path.mtime)
|
385
457
|
end
|
@@ -22,6 +22,14 @@ module SevenZipRuby
|
|
22
22
|
# end
|
23
23
|
# end
|
24
24
|
#
|
25
|
+
# # Compress files 2
|
26
|
+
# SevenZipRuby::SevenZipWriter.open_file("filename.7z") do |szw|
|
27
|
+
# szw.add_directory("test_dir")
|
28
|
+
# Dir.chdir("parent_dir_of_test.txt") do
|
29
|
+
# szw.add_file("test.txt")
|
30
|
+
# end
|
31
|
+
# end
|
32
|
+
#
|
25
33
|
# stream = StringIO.new("")
|
26
34
|
# SevenZipRuby::SevenZipWriter.open(stream) do |szw|
|
27
35
|
# szw.add_file("test.txt")
|
@@ -46,7 +54,11 @@ module SevenZipRuby
|
|
46
54
|
# Encoding used for path string in 7zip archive.
|
47
55
|
PATH_ENCODING = Encoding::UTF_8
|
48
56
|
|
57
|
+
@use_native_input_file_stream = true
|
58
|
+
|
49
59
|
class << self
|
60
|
+
attr_accessor :use_native_input_file_stream
|
61
|
+
|
50
62
|
# Open 7zip archive to write.
|
51
63
|
#
|
52
64
|
# ==== Args
|
@@ -75,9 +87,49 @@ module SevenZipRuby
|
|
75
87
|
szw = self.new
|
76
88
|
szw.open(stream, param)
|
77
89
|
if (block)
|
78
|
-
|
79
|
-
|
80
|
-
|
90
|
+
begin
|
91
|
+
block.call(szw)
|
92
|
+
szw.compress
|
93
|
+
szw.close
|
94
|
+
ensure
|
95
|
+
szw.close_file
|
96
|
+
end
|
97
|
+
else
|
98
|
+
szw
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
# Open 7zip archive file.
|
103
|
+
#
|
104
|
+
# ==== Args
|
105
|
+
# +filename+ :: 7zip archive filename.
|
106
|
+
# +param+ :: Optional hash parameter. <tt>:password</tt> key represents password of this archive.
|
107
|
+
#
|
108
|
+
# ==== Examples
|
109
|
+
# # Open archive
|
110
|
+
# SevenZipRuby::SevenZipWriter.open_file("filename.7z") do |szw|
|
111
|
+
# # Create archive.
|
112
|
+
# # ...
|
113
|
+
# # You don't have to call szw.compress. Of cource, you may call it.
|
114
|
+
# # szw.compress
|
115
|
+
# end
|
116
|
+
#
|
117
|
+
# # Open without block.
|
118
|
+
# szw = SevenZipRuby::SevenZipWriter.open_file("filename.7z")
|
119
|
+
# # Create archive.
|
120
|
+
# szw.compress # Compress must be called in this case.
|
121
|
+
# szw.close
|
122
|
+
def open_file(filename, param = {}, &block) # :yield: szw
|
123
|
+
szw = self.new
|
124
|
+
szw.open_file(filename, param)
|
125
|
+
if (block)
|
126
|
+
begin
|
127
|
+
block.call(szw)
|
128
|
+
szw.compress
|
129
|
+
szw.close
|
130
|
+
ensure
|
131
|
+
szw.close_file
|
132
|
+
end
|
81
133
|
else
|
82
134
|
szw
|
83
135
|
end
|
@@ -96,8 +148,10 @@ module SevenZipRuby
|
|
96
148
|
# SevenZipRuby::SevenZipWriter.add_directory(file, 'dir')
|
97
149
|
# end
|
98
150
|
def add_directory(stream, dir, param = {})
|
99
|
-
|
100
|
-
|
151
|
+
open_param = {
|
152
|
+
password: param.delete(:password)
|
153
|
+
}
|
154
|
+
self.open(stream, open_param) do |szw|
|
101
155
|
szw.add_directory(dir, param)
|
102
156
|
end
|
103
157
|
end
|
@@ -116,13 +170,17 @@ module SevenZipRuby
|
|
116
170
|
# SevenZipRuby::SevenZipWriter.add_file(file, 'file.txt')
|
117
171
|
# end
|
118
172
|
def add_file(stream, filename, param = {})
|
119
|
-
|
120
|
-
|
173
|
+
open_param = {
|
174
|
+
password: param.delete(:password)
|
175
|
+
}
|
176
|
+
self.open(stream, open_param) do |szw|
|
121
177
|
szw.add_file(filename, param)
|
122
178
|
end
|
123
179
|
end
|
124
180
|
end
|
125
181
|
|
182
|
+
undef initialize_copy, clone, dup
|
183
|
+
|
126
184
|
# Open 7zip archive to create.
|
127
185
|
#
|
128
186
|
# ==== Args
|
@@ -131,7 +189,8 @@ module SevenZipRuby
|
|
131
189
|
#
|
132
190
|
# ==== Examples
|
133
191
|
# File.open("filename.7z", "wb") do |file|
|
134
|
-
# szw = SevenZipRuby::SevenZipWriter.
|
192
|
+
# szw = SevenZipRuby::SevenZipWriter.new
|
193
|
+
# szw.open(file)
|
135
194
|
# # ...
|
136
195
|
# szw.compress
|
137
196
|
# szw.close
|
@@ -142,6 +201,36 @@ module SevenZipRuby
|
|
142
201
|
return self
|
143
202
|
end
|
144
203
|
|
204
|
+
# Open 7zip archive file to create.
|
205
|
+
#
|
206
|
+
# ==== Args
|
207
|
+
# +filename+ :: 7zip archive filename.
|
208
|
+
# +param+ :: Optional hash parameter. <tt>:password</tt> key represents password of this archive.
|
209
|
+
#
|
210
|
+
# ==== Examples
|
211
|
+
# szw = SevenZipRuby::SevenZipWriter.new
|
212
|
+
# szw.open_file("filename.7z")
|
213
|
+
# # ...
|
214
|
+
# szw.compress
|
215
|
+
# szw.close
|
216
|
+
def open_file(filename, param = {})
|
217
|
+
@stream = File.open(filename, "wb")
|
218
|
+
self.open(@stream, param)
|
219
|
+
return self
|
220
|
+
end
|
221
|
+
|
222
|
+
def close
|
223
|
+
close_impl
|
224
|
+
close_file
|
225
|
+
end
|
226
|
+
|
227
|
+
def close_file # :nodoc:
|
228
|
+
if (@stream)
|
229
|
+
@stream.close rescue nil
|
230
|
+
@stream = nil
|
231
|
+
end
|
232
|
+
end
|
233
|
+
|
145
234
|
# Compress and output data to archive file.
|
146
235
|
# You don't have to call this method when you use block-style SevenZipWriter.open.
|
147
236
|
#
|
@@ -261,7 +350,10 @@ module SevenZipRuby
|
|
261
350
|
mkdir(directory, { ctime: directory.ctime, atime: directory.atime, mtime: directory.mtime })
|
262
351
|
end
|
263
352
|
|
264
|
-
Pathname.glob(directory.join("**", "*").to_s) do |entry|
|
353
|
+
Pathname.glob(directory.join("**", "*").to_s, File::FNM_DOTMATCH) do |entry|
|
354
|
+
basename = entry.basename.to_s
|
355
|
+
next if (basename == "." || basename == "..")
|
356
|
+
|
265
357
|
name = (base_dir + entry.relative_path_from(directory)).cleanpath if (base_dir)
|
266
358
|
|
267
359
|
if (entry.file?)
|
@@ -312,9 +404,14 @@ module SevenZipRuby
|
|
312
404
|
case(type)
|
313
405
|
when :stream
|
314
406
|
if (info.buffer?)
|
315
|
-
|
407
|
+
# type(filename/io), data
|
408
|
+
next [ false, StringIO.new(info.data) ]
|
316
409
|
elsif (info.file?)
|
317
|
-
|
410
|
+
if (SevenZipWriter.use_native_input_file_stream)
|
411
|
+
next [ true, info.data ]
|
412
|
+
else
|
413
|
+
next [ false, File.open(info.data, "rb") ]
|
414
|
+
end
|
318
415
|
else
|
319
416
|
next nil
|
320
417
|
end
|
data/spec/seven_zip_ruby_spec.rb
CHANGED
@@ -13,11 +13,13 @@ describe SevenZipRuby do
|
|
13
13
|
end
|
14
14
|
|
15
15
|
before(:each) do
|
16
|
+
@use_native_input_file_stream = SevenZipRuby::SevenZipWriter.use_native_input_file_stream
|
16
17
|
SevenZipRubySpecHelper.prepare_each
|
17
18
|
end
|
18
19
|
|
19
20
|
after(:each) do
|
20
21
|
SevenZipRubySpecHelper.cleanup_each
|
22
|
+
SevenZipRuby::SevenZipWriter.use_native_input_file_stream = @use_native_input_file_stream
|
21
23
|
end
|
22
24
|
|
23
25
|
|
@@ -32,7 +34,7 @@ describe SevenZipRuby do
|
|
32
34
|
expect(entries.size).to be SevenZipRubySpecHelper::SAMPLE_DATA.size
|
33
35
|
|
34
36
|
SevenZipRubySpecHelper::SAMPLE_DATA.each do |sample|
|
35
|
-
entry = entries.select{ |i| i.path == Pathname(sample[:name]).cleanpath }
|
37
|
+
entry = entries.select{ |i| i.path == Pathname(sample[:name]).cleanpath.to_s }
|
36
38
|
expect(entry.size).to be 1
|
37
39
|
|
38
40
|
entry = entry[0]
|
@@ -58,14 +60,12 @@ describe SevenZipRuby do
|
|
58
60
|
end
|
59
61
|
|
60
62
|
example "extract data directly from archive" do
|
61
|
-
|
62
|
-
|
63
|
-
entries = szr.entries
|
63
|
+
SevenZipRuby::SevenZipReader.open_file(SevenZipRubySpecHelper::SEVEN_ZIP_FILE) do |szr|
|
64
|
+
entries = szr.entries
|
64
65
|
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
end
|
66
|
+
SevenZipRubySpecHelper::SAMPLE_DATA.each do |sample|
|
67
|
+
entry = entries.find{ |i| i.path == Pathname(sample[:name]).cleanpath.to_s }
|
68
|
+
expect(szr.extract_data(entry.index)).to eq sample[:data]
|
69
69
|
end
|
70
70
|
end
|
71
71
|
end
|
@@ -105,7 +105,7 @@ describe SevenZipRuby do
|
|
105
105
|
th = Thread.new do
|
106
106
|
szr = SevenZipRuby::SevenZipReader.open(file)
|
107
107
|
sample = SevenZipRubySpecHelper::SAMPLE_DATA.sample
|
108
|
-
entry = szr.entries.find{ |i| i.path == Pathname(sample[:name]).cleanpath }
|
108
|
+
entry = szr.entries.find{ |i| i.path == Pathname(sample[:name]).cleanpath.to_s }
|
109
109
|
end
|
110
110
|
th.join
|
111
111
|
|
@@ -122,9 +122,10 @@ describe SevenZipRuby do
|
|
122
122
|
expect(SevenZipRuby::SevenZipReader.verify(StringIO.new(data))).to eq true
|
123
123
|
|
124
124
|
data[0x27] = 0xEB.chr # This highly dependes on the current test binary.
|
125
|
+
expected = [ :DataError, :DataError, :DataError, :DataError, :DataError, :DataError, :DataError, true, true, true, true, true ]
|
125
126
|
SevenZipRuby::SevenZipReader.open(StringIO.new(data)) do |szr|
|
126
127
|
expect(szr.test).to eq false
|
127
|
-
expect(szr.verify_detail).to eq
|
128
|
+
expect(szr.verify_detail).to eq expected
|
128
129
|
end
|
129
130
|
|
130
131
|
|
@@ -137,8 +138,9 @@ describe SevenZipRuby do
|
|
137
138
|
expect(szr.verify).to eq false
|
138
139
|
end
|
139
140
|
|
141
|
+
expected = [ :DataError, :DataError, :DataError, :DataError, :DataError, :DataError, :DataError, true, true, true, true, true ]
|
140
142
|
SevenZipRuby::SevenZipReader.open(StringIO.new(data), { password: "wrong password" }) do |szr|
|
141
|
-
expect(szr.verify_detail).to eq
|
143
|
+
expect(szr.verify_detail).to eq expected
|
142
144
|
end
|
143
145
|
end
|
144
146
|
|
@@ -158,6 +160,22 @@ describe SevenZipRuby do
|
|
158
160
|
end
|
159
161
|
end
|
160
162
|
|
163
|
+
example "invalid index" do
|
164
|
+
File.open(SevenZipRubySpecHelper::SEVEN_ZIP_FILE, "rb") do |file|
|
165
|
+
SevenZipRuby::SevenZipReader.open(file) do |szr|
|
166
|
+
expect{ szr.extract_data(nil) }.to raise_error (ArgumentError)
|
167
|
+
end
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
example "invalid index for entry" do
|
172
|
+
File.open(SevenZipRubySpecHelper::SEVEN_ZIP_FILE, "rb") do |file|
|
173
|
+
SevenZipRuby::SevenZipReader.open(file) do |szr|
|
174
|
+
expect{ szr.entry("a") }.to raise_error
|
175
|
+
end
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
161
179
|
example "invalid password" do
|
162
180
|
File.open(SevenZipRubySpecHelper::SEVEN_ZIP_PASSWORD_FILE, "rb") do |file|
|
163
181
|
expect{ SevenZipRuby::Reader.open(file){ |szr| szr.extract_data(1) } }.to raise_error
|
@@ -235,19 +253,11 @@ describe SevenZipRuby do
|
|
235
253
|
|
236
254
|
sleep 1
|
237
255
|
expect{ th.kill }.not_to raise_error # Thread can be killed.
|
256
|
+
end
|
238
257
|
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
szw.method = "BZIP2"
|
243
|
-
szw.level = 9
|
244
|
-
szw.multi_thread = false
|
245
|
-
szw.add_data(SevenZipRubySpecHelper::SAMPLE_LARGE_RANDOM_DATA * 2, "hoge.txt")
|
246
|
-
end
|
247
|
-
end
|
248
|
-
|
249
|
-
sleep 0.1 # Highly dependes on CPU speed...
|
250
|
-
expect{ th.kill }.not_to raise_error # Thread can be killed.
|
258
|
+
example "clone and dup cannot be called." do
|
259
|
+
expect{ SevenZipRuby::SevenZipReader.new.clone }.to raise_error
|
260
|
+
expect{ SevenZipRuby::SevenZipReader.new.dup }.to raise_error
|
251
261
|
end
|
252
262
|
|
253
263
|
end
|
@@ -266,7 +276,9 @@ describe SevenZipRuby do
|
|
266
276
|
szw.mkdir("hoge/hoge/hoge")
|
267
277
|
szw.compress
|
268
278
|
szw.close
|
269
|
-
|
279
|
+
|
280
|
+
output.rewind
|
281
|
+
expect(SevenZipRuby::SevenZipReader.verify(output)).to eq true
|
270
282
|
end
|
271
283
|
|
272
284
|
example "compress" do
|
@@ -277,6 +289,24 @@ describe SevenZipRuby do
|
|
277
289
|
szw.mkdir("hoge/hoge/hoge")
|
278
290
|
szw.compress
|
279
291
|
end
|
292
|
+
|
293
|
+
output.rewind
|
294
|
+
expect(SevenZipRuby::SevenZipReader.verify(output)).to eq true
|
295
|
+
end
|
296
|
+
|
297
|
+
example "open_file" do
|
298
|
+
FileUtils.mkpath(SevenZipRubySpecHelper::EXTRACT_DIR)
|
299
|
+
Dir.chdir(SevenZipRubySpecHelper::EXTRACT_DIR) do
|
300
|
+
filename = "hoge.7z"
|
301
|
+
|
302
|
+
SevenZipRuby::SevenZipWriter.open_file(filename) do |szw|
|
303
|
+
szw.add_data("This is a sample.", "hoge.txt")
|
304
|
+
end
|
305
|
+
|
306
|
+
File.open(filename, "rb") do |f|
|
307
|
+
expect(SevenZipRuby::SevenZipReader.verify(f)).to eq true
|
308
|
+
end
|
309
|
+
end
|
280
310
|
end
|
281
311
|
|
282
312
|
example "compress local file" do
|
@@ -296,53 +326,62 @@ describe SevenZipRuby do
|
|
296
326
|
end
|
297
327
|
end
|
298
328
|
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
329
|
+
[ true, false ].each do |use_native_input_file_stream|
|
330
|
+
example "add_directory: use_native_input_file_stream=#{use_native_input_file_stream}" do
|
331
|
+
SevenZipRuby::SevenZipWriter.use_native_input_file_stream = use_native_input_file_stream
|
332
|
+
|
333
|
+
Dir.chdir(SevenZipRubySpecHelper::SAMPLE_FILE_DIR) do
|
334
|
+
output = StringIO.new("")
|
335
|
+
SevenZipRuby::SevenZipWriter.open(output) do |szw|
|
336
|
+
Pathname.glob("*", File::FNM_DOTMATCH) do |path|
|
337
|
+
basename = path.basename.to_s
|
338
|
+
next if (basename == "." || basename == "..")
|
339
|
+
|
340
|
+
if (path.file?)
|
341
|
+
szw.add_file(path)
|
342
|
+
else
|
343
|
+
szw.add_directory(path)
|
344
|
+
end
|
308
345
|
end
|
309
346
|
end
|
310
|
-
end
|
311
347
|
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
348
|
+
output.rewind
|
349
|
+
SevenZipRuby::SevenZipReader.open(output) do |szr|
|
350
|
+
entries = szr.entries
|
351
|
+
expect(entries.size).to eq SevenZipRubySpecHelper::SAMPLE_DATA.size
|
352
|
+
|
353
|
+
entries.each do |entry|
|
354
|
+
entry_in_sample = SevenZipRubySpecHelper::SAMPLE_DATA.find{ |i| i[:name] == entry.path.to_s }
|
355
|
+
local_entry = Pathname(File.join(SevenZipRubySpecHelper::SAMPLE_FILE_DIR, entry_in_sample[:name]))
|
356
|
+
if (entry_in_sample[:directory])
|
357
|
+
expect(entry.directory?).to eq true
|
358
|
+
else
|
359
|
+
expect(szr.extract_data(entry)).to eq File.open(entry_in_sample[:name], "rb", &:read)
|
360
|
+
end
|
361
|
+
expect(entry.mtime.to_i).to eq local_entry.mtime.to_i
|
324
362
|
end
|
325
|
-
expect(entry.mtime.to_i).to eq local_entry.mtime.to_i
|
326
363
|
end
|
327
364
|
end
|
328
365
|
end
|
329
|
-
end
|
330
366
|
|
331
|
-
|
332
|
-
|
333
|
-
dirname = File.basename(SevenZipRubySpecHelper::SAMPLE_FILE_DIR)
|
334
|
-
Dir.chdir(dir) do
|
335
|
-
output = StringIO.new("")
|
336
|
-
SevenZipRuby::SevenZipWriter.add_directory(output, dirname)
|
367
|
+
example "add_directory singleton version: use_native_input_file_stream=#{use_native_input_file_stream}" do
|
368
|
+
SevenZipRuby::SevenZipWriter.use_native_input_file_stream = use_native_input_file_stream
|
337
369
|
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
370
|
+
dir = File.join(SevenZipRubySpecHelper::SAMPLE_FILE_DIR, "..")
|
371
|
+
dirname = File.basename(SevenZipRubySpecHelper::SAMPLE_FILE_DIR)
|
372
|
+
Dir.chdir(dir) do
|
373
|
+
output = StringIO.new("")
|
374
|
+
SevenZipRuby::SevenZipWriter.add_directory(output, dirname)
|
375
|
+
|
376
|
+
output2 = StringIO.new("")
|
377
|
+
SevenZipRuby::SevenZipWriter.open(output2) do |szr|
|
378
|
+
szr.add_directory(dirname)
|
379
|
+
end
|
342
380
|
|
343
|
-
|
381
|
+
expect(output.string).to eq output2.string
|
382
|
+
end
|
344
383
|
end
|
345
|
-
end
|
384
|
+
end # use_native_input_file_stream
|
346
385
|
|
347
386
|
example "use as option" do
|
348
387
|
output = StringIO.new("")
|
@@ -354,15 +393,16 @@ describe SevenZipRuby do
|
|
354
393
|
SevenZipRuby::SevenZipReader.open(output) do |szr|
|
355
394
|
base_dir = Pathname(SevenZipRubySpecHelper::SAMPLE_FILE_DIR)
|
356
395
|
entries = szr.entries
|
357
|
-
files = Pathname.glob(base_dir.to_s + "/**/*") +[ base_dir ]
|
396
|
+
files = Pathname.glob(base_dir.to_s + "/**/*", File::FNM_DOTMATCH) + [ base_dir ]
|
397
|
+
files = files.select{ |i| i.basename.to_s != "." && i.basename.to_s != ".." }
|
358
398
|
|
359
399
|
expect(entries.size).to eq files.size
|
360
400
|
|
361
|
-
expect(entries.all?{ |i| i.path.
|
401
|
+
expect(entries.all?{ |i| i.path.start_with?("test/dir") }).to eq true
|
362
402
|
|
363
403
|
entries.each do |entry|
|
364
404
|
file = files.find do |i|
|
365
|
-
i.relative_path_from(base_dir) == entry.path.relative_path_from(Pathname("test/dir"))
|
405
|
+
i.relative_path_from(base_dir) == Pathname(entry.path).relative_path_from(Pathname("test/dir"))
|
366
406
|
end
|
367
407
|
expect(file.directory?).to eq entry.directory?
|
368
408
|
end
|
@@ -493,6 +533,41 @@ describe SevenZipRuby do
|
|
493
533
|
expect{ szw.add_data("This is hoge.txt content.", "hoge.txt") }.to raise_error(SevenZipRuby::InvalidOperation)
|
494
534
|
end
|
495
535
|
|
536
|
+
example "clone and dup cannot be called." do
|
537
|
+
expect{ SevenZipRuby::SevenZipWriter.new.clone }.to raise_error
|
538
|
+
expect{ SevenZipRuby::SevenZipWriter.new.dup }.to raise_error
|
539
|
+
end
|
540
|
+
|
541
|
+
if (false && RUBY_ENGINE == "ruby")
|
542
|
+
# It seems that Rubinius has the different way to handle error.
|
543
|
+
# Therefore, it sometimes fails to kill SevenZipRuby thread.
|
544
|
+
example "kill thread" do
|
545
|
+
[ "LZMA", "PPMd", "BZIP2" ].each do |method|
|
546
|
+
prc = lambda do
|
547
|
+
output = StringIO.new("")
|
548
|
+
SevenZipRuby::SevenZipWriter.open(output) do |szw|
|
549
|
+
szw.method = method
|
550
|
+
szw.level = 9
|
551
|
+
szw.multi_thread = true
|
552
|
+
szw.add_data(SevenZipRubySpecHelper::SAMPLE_LARGE_RANDOM_DATA * 3, "hoge.txt")
|
553
|
+
end
|
554
|
+
end
|
555
|
+
|
556
|
+
start = Time.now
|
557
|
+
th = Thread.start{ prc.call }
|
558
|
+
th.join
|
559
|
+
diff = Time.now - start
|
560
|
+
|
561
|
+
10.times do
|
562
|
+
th = Thread.start{ prc.call }
|
563
|
+
sleep(rand * diff)
|
564
|
+
expect{ th.kill }.not_to raise_error # Thread can be killed.
|
565
|
+
sleep diff*2 # Workaround. When some threads of SZR are running and killed, SEGV sometimes occurs...
|
566
|
+
end
|
567
|
+
end
|
568
|
+
end
|
569
|
+
end
|
570
|
+
|
496
571
|
end
|
497
572
|
|
498
573
|
end
|
@@ -6,8 +6,8 @@ require("rbconfig")
|
|
6
6
|
module SevenZipRubySpecHelper
|
7
7
|
DETAIL_CHECK = true
|
8
8
|
|
9
|
-
BASE_DIR =
|
10
|
-
TEMP_DIR = File.expand_path("
|
9
|
+
BASE_DIR = File.expand_path("..", __FILE__)
|
10
|
+
TEMP_DIR = File.expand_path("../../tmp", __FILE__)
|
11
11
|
|
12
12
|
SAMPLE_FILE_DIR_RELATIVE = "sample_file"
|
13
13
|
SAMPLE_FILE_DIR = File.expand_path(SAMPLE_FILE_DIR_RELATIVE, TEMP_DIR)
|
@@ -21,6 +21,12 @@ module SevenZipRubySpecHelper
|
|
21
21
|
{ name: "directory", directory: true },
|
22
22
|
{ name: "directory/utf8_file.txt", data: "日本語のファイル".force_encoding("ASCII-8BIT"), directory: false },
|
23
23
|
{ name: "directory/utf8_name®.txt", data: "日本語のファイル".force_encoding("ASCII-8BIT"), directory: false },
|
24
|
+
{ name: "directory/.dot.txt", data: "Dot text".force_encoding("ASCII-8BIT"), directory: false },
|
25
|
+
{ name: "directory/.dot_dir", directory: true },
|
26
|
+
{ name: "directory/.dot_dir/normal.txt", data: "Dot text".force_encoding("ASCII-8BIT"), directory: false },
|
27
|
+
{ name: ".dot_dir", directory: true },
|
28
|
+
{ name: ".dot_dir/normal.txt", data: "Normal text".force_encoding("ASCII-8BIT"), directory: false },
|
29
|
+
{ name: ".dot_dir/.dot.txt", data: "Dot text".force_encoding("ASCII-8BIT"), directory: false },
|
24
30
|
{ name: "empty_directory", directory: true }
|
25
31
|
]
|
26
32
|
|
@@ -70,8 +76,9 @@ module SevenZipRubySpecHelper
|
|
70
76
|
|
71
77
|
def prepare_seven_zip_file
|
72
78
|
Dir.chdir(SAMPLE_FILE_DIR) do
|
73
|
-
|
74
|
-
my_system("7z a -bd \"
|
79
|
+
files = (Dir.glob("*", File::FNM_DOTMATCH).to_a - [ ".", ".." ]).join(" ")
|
80
|
+
my_system("7z a -bd \"#{SEVEN_ZIP_FILE}\" #{files}")
|
81
|
+
my_system("7z a -bd \"-p#{SEVEN_ZIP_PASSWORD}\" \"#{SEVEN_ZIP_PASSWORD_FILE}\" #{files}")
|
75
82
|
end
|
76
83
|
end
|
77
84
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: seven_zip_ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: x86-mswin32-100
|
6
6
|
authors:
|
7
7
|
- Masamitsu MURASE
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2014-01-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -79,7 +79,8 @@ files:
|
|
79
79
|
- seven_zip_ruby.gemspec
|
80
80
|
- spec/seven_zip_ruby_spec.rb
|
81
81
|
- spec/seven_zip_ruby_spec_helper.rb
|
82
|
-
- lib/seven_zip_ruby/seven_zip_archive.so
|
82
|
+
- lib/seven_zip_ruby/2.0/seven_zip_archive.so
|
83
|
+
- lib/seven_zip_ruby/2.1/seven_zip_archive.so
|
83
84
|
homepage: https://github.com/masamitsu-murase/seven_zip_ruby
|
84
85
|
licenses:
|
85
86
|
- LGPL + unRAR
|