seven_zip_ruby 1.2.4 → 1.2.5
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/.travis.yml +21 -5
- data/README.md +11 -0
- data/Rakefile +9 -1
- data/ext/seven_zip_ruby/extconf.rb +18 -4
- data/ext/seven_zip_ruby/seven_zip_archive.cpp +8 -5
- data/ext/seven_zip_ruby/seven_zip_archive.h +7 -1
- data/lib/seven_zip_ruby/7z.sfx +0 -0
- data/lib/seven_zip_ruby/7zCon.sfx +0 -0
- data/lib/seven_zip_ruby/seven_zip_reader.rb +1 -0
- data/lib/seven_zip_ruby/seven_zip_writer.rb +71 -13
- data/lib/seven_zip_ruby/version.rb +1 -1
- data/spec/seven_zip_ruby_spec.rb +78 -10
- metadata +15 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 24d424d3f87e77974e436f6c044a54e5783baf95
|
4
|
+
data.tar.gz: f5280318feffbdc6e25222916fb1168969bd3a73
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2db16fba18dfa60a526bd4b03317da8a512c541e1fefb55633f785493086047ce8334b47e839a72d470e1210a51546433d1ee6e67513c5649c3d45bc7b99676b
|
7
|
+
data.tar.gz: ccaa6fec52258413febf2db20388945fe30a19d48839e7f8287a4498fbe323893250fdfb5c54c788aa8a9ea51fee2438974f1296a2453e287c8276b4a3bcb1f9
|
data/.travis.yml
CHANGED
@@ -1,19 +1,35 @@
|
|
1
1
|
language: ruby
|
2
2
|
rvm:
|
3
|
-
- "2.0
|
4
|
-
- "2.1
|
5
|
-
- "
|
3
|
+
- "2.0"
|
4
|
+
- "2.1"
|
5
|
+
- "2.2"
|
6
|
+
- "2.3.0"
|
7
|
+
- "2.3"
|
8
|
+
- "rbx-2.2.7"
|
6
9
|
- "ruby-head"
|
7
10
|
matrix:
|
8
11
|
allow_failures:
|
9
|
-
- rvm: "rbx-2"
|
12
|
+
- rvm: "rbx-2.2.7"
|
10
13
|
- rvm: "ruby-head"
|
14
|
+
include:
|
15
|
+
- rvm: 2.3.1
|
16
|
+
os: osx
|
17
|
+
osx_image: xcode7.3
|
11
18
|
notifications:
|
12
19
|
email: false
|
13
20
|
cache:
|
14
21
|
- apt
|
15
22
|
before_install:
|
23
|
+
- gem update bundler
|
16
24
|
- bundle install --path=vendor/bundle
|
17
|
-
-
|
25
|
+
- case $TRAVIS_OS_NAME in
|
26
|
+
linux)
|
27
|
+
sudo apt-get install p7zip-full
|
28
|
+
;;
|
29
|
+
osx)
|
30
|
+
brew update && brew tap wk8/p7zip9.20 && brew install p7zip920
|
31
|
+
;;
|
32
|
+
esac
|
33
|
+
|
18
34
|
install: bundle exec rake build_local
|
19
35
|
script: bundle exec rspec spec/seven_zip_ruby_spec.rb
|
data/README.md
CHANGED
@@ -148,6 +148,17 @@ File.open("filename.7z", "rb") do |file|
|
|
148
148
|
end
|
149
149
|
```
|
150
150
|
|
151
|
+
You can also create a self extracting archive for Windows.
|
152
|
+
|
153
|
+
```ruby
|
154
|
+
File.open("filename.exe", "rb") do |file|
|
155
|
+
# :gui and :console can be specified as :sfx parameter.
|
156
|
+
SevenZipRuby::Writer.open(file, sfx: :gui) do |szr|
|
157
|
+
szr.add_data "file content", "file.txt"
|
158
|
+
end
|
159
|
+
end
|
160
|
+
```
|
161
|
+
|
151
162
|
### Set compression mode
|
152
163
|
|
153
164
|
7zip supports LZMA, LZMA2, PPMD, BZIP2, DEFLATE and COPY.
|
data/Rakefile
CHANGED
@@ -9,7 +9,15 @@ task :build_platform => [ :pre_platform, :build, :post_platform ]
|
|
9
9
|
|
10
10
|
task :pre_platform do
|
11
11
|
FileUtils.mv("seven_zip_ruby.gemspec", "seven_zip_ruby.gemspec.bak")
|
12
|
-
|
12
|
+
|
13
|
+
versions = Dir.glob("lib/seven_zip_ruby/*").select{ |i| File.directory?(i) }.map{ |i| i.split("/").last }.sort_by{ |i| i.split(".").map(&:to_i) }
|
14
|
+
min_version = versions.first + ".0"
|
15
|
+
max_version = versions.last.split(".").first + "." + (versions.last.split(".").last.to_i + 1).to_s + ".0"
|
16
|
+
gemspec = File.open("resources/seven_zip_ruby.gemspec.platform", "r", &:read)
|
17
|
+
.gsub("SPEC_REQUIRED_RUBY_VERSION"){ "spec.required_ruby_version = [ '>= #{min_version}', '< #{max_version}' ]" }
|
18
|
+
File.open("seven_zip_ruby.gemspec", "w") do |f|
|
19
|
+
f.write(gemspec)
|
20
|
+
end
|
13
21
|
end
|
14
22
|
|
15
23
|
task :post_platform do
|
@@ -59,6 +59,7 @@ def sample_cpp_source
|
|
59
59
|
# - lambda
|
60
60
|
# - std::function
|
61
61
|
# - std::array
|
62
|
+
# - memset_s defined, on Darwin and BSD
|
62
63
|
return <<'EOS'
|
63
64
|
#include <functional>
|
64
65
|
#include <algorithm>
|
@@ -67,6 +68,11 @@ def sample_cpp_source
|
|
67
68
|
|
68
69
|
#include <ruby.h>
|
69
70
|
|
71
|
+
// see the test on memset_s below, which is a purely BSD thing
|
72
|
+
#if defined(__APPLE__) || defined(BSD)
|
73
|
+
#include <string.h>
|
74
|
+
#endif
|
75
|
+
|
70
76
|
void test()
|
71
77
|
{
|
72
78
|
int array[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
|
@@ -84,6 +90,11 @@ void test()
|
|
84
90
|
});
|
85
91
|
|
86
92
|
std::for_each(var_list.begin(), var_list.end(), [](int num){ std::cout << num << std::endl; });
|
93
|
+
|
94
|
+
#if defined(__APPLE__) || defined(BSD)
|
95
|
+
char str[] = "imareallycoolstringright";
|
96
|
+
memset_s(str, sizeof str, 'b', 5);
|
97
|
+
#endif
|
87
98
|
}
|
88
99
|
EOS
|
89
100
|
end
|
@@ -135,8 +146,8 @@ def main
|
|
135
146
|
# MinGW
|
136
147
|
$LIBS = "-loleaut32 -static-libgcc -static-libstdc++"
|
137
148
|
|
138
|
-
cpp0x_flag = [ "", "-std=
|
139
|
-
|
149
|
+
cpp0x_flag = [ "", "-std=gnu++11", "-std=c++11", "-std=gnu++0x", "-std=c++0x" ].find do |opt|
|
150
|
+
try_compile(sample_cpp_source, "#{opt} -x c++ ")
|
140
151
|
end
|
141
152
|
raise "C++11 is not supported by the compiler." unless (cpp0x_flag)
|
142
153
|
|
@@ -150,8 +161,11 @@ def main
|
|
150
161
|
end
|
151
162
|
end
|
152
163
|
|
153
|
-
|
154
|
-
|
164
|
+
possible_cpp0x_flags = [ "", "-std=gnu++11", "-std=c++11", "-std=gnu++0x", "-std=c++0x" ].map do |opt|
|
165
|
+
["#{opt} -x c++ ", "#{opt} "]
|
166
|
+
end.flatten
|
167
|
+
cpp0x_flag = possible_cpp0x_flags.find do |opt|
|
168
|
+
try_compile(sample_cpp_source, opt)
|
155
169
|
end
|
156
170
|
raise "C++11 is not supported by the compiler." unless (cpp0x_flag)
|
157
171
|
|
@@ -13,6 +13,10 @@
|
|
13
13
|
|
14
14
|
#define INTERN(const_str) rb_intern2(const_str, sizeof(const_str) - 1)
|
15
15
|
|
16
|
+
// For https://bugs.ruby-lang.org/issues/11962
|
17
|
+
#ifndef RARRAY_CONST_PTR
|
18
|
+
#define RARRAY_CONST_PTR(index_list) RARRAY_PTR(index_list)
|
19
|
+
#endif
|
16
20
|
|
17
21
|
////////////////////////////////////////////////////////////////
|
18
22
|
namespace SevenZip
|
@@ -505,7 +509,7 @@ VALUE ArchiveReader::extractFiles(VALUE index_list, VALUE callback_proc)
|
|
505
509
|
fillEntryInfo();
|
506
510
|
|
507
511
|
std::vector<UInt32> list(RARRAY_LEN(index_list));
|
508
|
-
std::transform(
|
512
|
+
std::transform(RARRAY_CONST_PTR(index_list), RARRAY_CONST_PTR(index_list) + RARRAY_LEN(index_list),
|
509
513
|
list.begin(), [](VALUE num){ return NUM2ULONG(num); });
|
510
514
|
|
511
515
|
HRESULT ret;
|
@@ -1220,14 +1224,13 @@ STDMETHODIMP ArchiveExtractCallback::GetStream(UInt32 index, ISequentialOutStrea
|
|
1220
1224
|
bool ret = m_archive->runRubyAction([&](){
|
1221
1225
|
rb_stream = rb_funcall(proc, INTERN("call"), 2,
|
1222
1226
|
ID2SYM(INTERN("stream")), m_archive->entryInfo(index));
|
1227
|
+
m_archive->setProcessingStream(rb_stream, index, askExtractMode);
|
1223
1228
|
});
|
1224
1229
|
if (!ret){
|
1225
1230
|
m_archive->clearProcessingStream();
|
1226
1231
|
return E_FAIL;
|
1227
1232
|
}
|
1228
1233
|
|
1229
|
-
m_archive->setProcessingStream(rb_stream, index, askExtractMode);
|
1230
|
-
|
1231
1234
|
OutStream *stream = new OutStream(rb_stream, m_archive);
|
1232
1235
|
CMyComPtr<OutStream> ptr(stream);
|
1233
1236
|
*outStream = ptr.Detach();
|
@@ -1434,14 +1437,14 @@ STDMETHODIMP ArchiveUpdateCallback::GetStream(UInt32 index, ISequentialInStream
|
|
1434
1437
|
}else{
|
1435
1438
|
rb_stream = rb_ary_entry(ret_array, 1);
|
1436
1439
|
}
|
1440
|
+
|
1441
|
+
m_archive->setProcessingStream(rb_stream, index);
|
1437
1442
|
});
|
1438
1443
|
if (!ret){
|
1439
1444
|
m_archive->clearProcessingStream();
|
1440
1445
|
return E_FAIL;
|
1441
1446
|
}
|
1442
1447
|
|
1443
|
-
m_archive->setProcessingStream(rb_stream, index);
|
1444
|
-
|
1445
1448
|
if (NIL_P(rb_stream) && !(filepath.empty())){
|
1446
1449
|
FileInStream *stream = new FileInStream(filepath, m_archive);
|
1447
1450
|
CMyComPtr<FileInStream> ptr(stream);
|
@@ -385,6 +385,7 @@ class ArchiveOpenCallback : public IArchiveOpenCallback, public ICryptoGetTextPa
|
|
385
385
|
public:
|
386
386
|
ArchiveOpenCallback(ArchiveReader *archive);
|
387
387
|
ArchiveOpenCallback(ArchiveReader *archive, const std::string &password);
|
388
|
+
virtual ~ArchiveOpenCallback() {}
|
388
389
|
|
389
390
|
MY_UNKNOWN_IMP2(IArchiveOpenCallback, ICryptoGetTextPassword)
|
390
391
|
|
@@ -408,6 +409,7 @@ class ArchiveExtractCallback : public IArchiveExtractCallback, public ICryptoGet
|
|
408
409
|
public:
|
409
410
|
ArchiveExtractCallback(ArchiveReader *archive);
|
410
411
|
ArchiveExtractCallback(ArchiveReader *archive, const std::string &password);
|
412
|
+
virtual ~ArchiveExtractCallback() {}
|
411
413
|
|
412
414
|
MY_UNKNOWN_IMP2(IArchiveExtractCallback, ICryptoGetTextPassword)
|
413
415
|
|
@@ -436,6 +438,7 @@ class ArchiveUpdateCallback : public IArchiveUpdateCallback, public ICryptoGetTe
|
|
436
438
|
public:
|
437
439
|
ArchiveUpdateCallback(ArchiveWriter *archive);
|
438
440
|
ArchiveUpdateCallback(ArchiveWriter *archive, const std::string &password);
|
441
|
+
virtual ~ArchiveUpdateCallback() {}
|
439
442
|
|
440
443
|
MY_UNKNOWN_IMP2(IArchiveUpdateCallback, ICryptoGetTextPassword2)
|
441
444
|
|
@@ -466,6 +469,7 @@ class InStream : public IInStream, public CMyUnknownImp
|
|
466
469
|
{
|
467
470
|
public:
|
468
471
|
InStream(VALUE stream, ArchiveBase *archive);
|
472
|
+
virtual ~InStream() {}
|
469
473
|
|
470
474
|
MY_UNKNOWN_IMP1(IInStream)
|
471
475
|
|
@@ -481,7 +485,7 @@ class FileInStream : public IInStream, public CMyUnknownImp
|
|
481
485
|
{
|
482
486
|
public:
|
483
487
|
FileInStream(const std::string &filename, ArchiveBase *archive);
|
484
|
-
~FileInStream();
|
488
|
+
virtual ~FileInStream();
|
485
489
|
|
486
490
|
MY_UNKNOWN_IMP1(IInStream)
|
487
491
|
|
@@ -502,6 +506,7 @@ class OutStream : public IOutStream, public CMyUnknownImp
|
|
502
506
|
{
|
503
507
|
public:
|
504
508
|
OutStream(VALUE stream, ArchiveBase *archive);
|
509
|
+
virtual ~OutStream() {}
|
505
510
|
|
506
511
|
MY_UNKNOWN_IMP1(IOutStream)
|
507
512
|
|
@@ -520,6 +525,7 @@ class FileOutStream : public IOutStream, public CMyUnknownImp
|
|
520
525
|
{
|
521
526
|
public:
|
522
527
|
FileOutStream(const std::string &filename, ArchiveBase *archive);
|
528
|
+
virtual ~FileOutStream() {}
|
523
529
|
|
524
530
|
MY_UNKNOWN_IMP1(IOutStream)
|
525
531
|
|
Binary file
|
Binary file
|
@@ -51,10 +51,26 @@ module SevenZipRuby
|
|
51
51
|
# szw.add_directory("test_dir")
|
52
52
|
# end
|
53
53
|
# end
|
54
|
+
#
|
55
|
+
# === Create a sfx, a self extracting archive for Windows executable binary.
|
56
|
+
# File.open("filename.exe", "wb") do |file|
|
57
|
+
# SevenZipRuby::SevenZipWriter.open(file, sfx: true) do |szw|
|
58
|
+
# szw.add_directory("test_dir")
|
59
|
+
# end
|
60
|
+
# end
|
54
61
|
class SevenZipWriter
|
55
62
|
# Encoding used for path string in 7zip archive.
|
56
63
|
PATH_ENCODING = Encoding::UTF_8
|
57
64
|
|
65
|
+
# Files for self extraction.
|
66
|
+
SFX_FILE_LIST = {
|
67
|
+
default: File.expand_path("../7z.sfx", __FILE__),
|
68
|
+
gui: File.expand_path("../7z.sfx", __FILE__),
|
69
|
+
console: File.expand_path("../7zCon.sfx", __FILE__)
|
70
|
+
} # :nodoc:
|
71
|
+
|
72
|
+
OPEN_PARAM_LIST = [ :password, :sfx ] # :nodoc:
|
73
|
+
|
58
74
|
@use_native_input_file_stream = true
|
59
75
|
|
60
76
|
class << self
|
@@ -64,10 +80,12 @@ module SevenZipRuby
|
|
64
80
|
#
|
65
81
|
# ==== Args
|
66
82
|
# +stream+ :: Output stream to write 7zip archive. <tt>stream.write</tt> is needed.
|
67
|
-
# +param+ :: Optional hash parameter.
|
83
|
+
# +param+ :: Optional hash parameter.
|
84
|
+
# <tt>:password</tt> key specifies password of this archive.
|
85
|
+
# <tt>:sfx</tt> key specifies Self Extracting mode. <tt>:gui</tt> and <tt>:console</tt> can be used. <tt>true</tt> is same as <tt>:gui</tt>.
|
68
86
|
#
|
69
87
|
# ==== Examples
|
70
|
-
# # Open archive
|
88
|
+
# # Open an archive
|
71
89
|
# File.open("filename.7z", "wb") do |file|
|
72
90
|
# SevenZipRuby::SevenZipWriter.open(file) do |szw|
|
73
91
|
# # Create archive.
|
@@ -84,6 +102,14 @@ module SevenZipRuby
|
|
84
102
|
# szw.compress # Compress must be called in this case.
|
85
103
|
# szw.close
|
86
104
|
# end
|
105
|
+
#
|
106
|
+
# # Create a self extracting archive. <tt>:gui</tt> and <tt>:console</tt> can be used.
|
107
|
+
# File.open("filename.7z", "wb") do |file|
|
108
|
+
# szw = SevenZipRuby::SevenZipWriter.open(file, sfx: :gui)
|
109
|
+
# # Create archive.
|
110
|
+
# szw.compress # Compress must be called in this case.
|
111
|
+
# szw.close
|
112
|
+
# end
|
87
113
|
def open(stream, param = {}, &block) # :yield: szw
|
88
114
|
szw = self.new
|
89
115
|
szw.open(stream, param)
|
@@ -104,7 +130,9 @@ module SevenZipRuby
|
|
104
130
|
#
|
105
131
|
# ==== Args
|
106
132
|
# +filename+ :: 7zip archive filename.
|
107
|
-
# +param+ :: Optional hash parameter.
|
133
|
+
# +param+ :: Optional hash parameter.
|
134
|
+
# <tt>:password</tt> key specifies password of this archive.
|
135
|
+
# <tt>:sfx</tt> key specifies Self Extracting mode. <tt>:gui</tt> and <tt>:console</tt> can be used. <tt>true</tt> is same as <tt>:gui</tt>.
|
108
136
|
#
|
109
137
|
# ==== Examples
|
110
138
|
# # Open archive
|
@@ -141,7 +169,9 @@ module SevenZipRuby
|
|
141
169
|
# ==== Args
|
142
170
|
# +stream+ :: Output stream to write 7zip archive. <tt>stream.write</tt> is needed.
|
143
171
|
# +dir+ :: Directory to be added to the 7zip archive. <b><tt>dir</tt></b> must be a <b>relative path</b>.
|
144
|
-
# +param+ :: Optional hash parameter.
|
172
|
+
# +param+ :: Optional hash parameter.
|
173
|
+
# <tt>:password</tt> key specifies password of this archive.
|
174
|
+
# <tt>:sfx</tt> key specifies Self Extracting mode. <tt>:gui</tt> and <tt>:console</tt> can be used. <tt>true</tt> is same as <tt>:gui</tt>.
|
145
175
|
#
|
146
176
|
# ==== Examples
|
147
177
|
# # Create 7zip archive which includes 'dir'.
|
@@ -149,9 +179,11 @@ module SevenZipRuby
|
|
149
179
|
# SevenZipRuby::SevenZipWriter.add_directory(file, 'dir')
|
150
180
|
# end
|
151
181
|
def add_directory(stream, dir, param = {})
|
152
|
-
|
153
|
-
|
154
|
-
|
182
|
+
param = param.clone
|
183
|
+
open_param = {}
|
184
|
+
OPEN_PARAM_LIST.each do |key|
|
185
|
+
open_param[key] = param.delete(key) if param.key?(key)
|
186
|
+
end
|
155
187
|
self.open(stream, open_param) do |szw|
|
156
188
|
szw.add_directory(dir, param)
|
157
189
|
end
|
@@ -163,7 +195,9 @@ module SevenZipRuby
|
|
163
195
|
# ==== Args
|
164
196
|
# +stream+ :: Output stream to write 7zip archive. <tt>stream.write</tt> is needed.
|
165
197
|
# +file+ :: File to be added to the 7zip archive. <b><tt>file</tt></b> must be a <b>relative path</b>.
|
166
|
-
# +param+ :: Optional hash parameter.
|
198
|
+
# +param+ :: Optional hash parameter.
|
199
|
+
# <tt>:password</tt> key specifies password of this archive.
|
200
|
+
# <tt>:sfx</tt> key specifies Self Extracting mode. <tt>:gui</tt> and <tt>:console</tt> can be used. <tt>true</tt> is same as <tt>:gui</tt>.
|
167
201
|
#
|
168
202
|
# ==== Examples
|
169
203
|
# # Create 7zip archive which includes 'file.txt'.
|
@@ -171,9 +205,11 @@ module SevenZipRuby
|
|
171
205
|
# SevenZipRuby::SevenZipWriter.add_file(file, 'file.txt')
|
172
206
|
# end
|
173
207
|
def add_file(stream, filename, param = {})
|
174
|
-
|
175
|
-
|
176
|
-
|
208
|
+
param = param.clone
|
209
|
+
open_param = {}
|
210
|
+
OPEN_PARAM_LIST.each do |key|
|
211
|
+
open_param[key] = param.delete(key) if param.key?(key)
|
212
|
+
end
|
177
213
|
self.open(stream, open_param) do |szw|
|
178
214
|
szw.add_file(filename, param)
|
179
215
|
end
|
@@ -186,7 +222,9 @@ module SevenZipRuby
|
|
186
222
|
#
|
187
223
|
# ==== Args
|
188
224
|
# +stream+ :: Output stream to write 7zip archive. <tt>stream.write</tt> is needed.
|
189
|
-
# +param+ :: Optional hash parameter.
|
225
|
+
# +param+ :: Optional hash parameter.
|
226
|
+
# <tt>:password</tt> key specifies password of this archive.
|
227
|
+
# <tt>:sfx</tt> key specifies Self Extracting mode. <tt>:gui</tt> and <tt>:console</tt> can be used. <tt>true</tt> is same as <tt>:gui</tt>.
|
190
228
|
#
|
191
229
|
# ==== Examples
|
192
230
|
# File.open("filename.7z", "wb") do |file|
|
@@ -197,16 +235,25 @@ module SevenZipRuby
|
|
197
235
|
# szw.close
|
198
236
|
# end
|
199
237
|
def open(stream, param = {})
|
238
|
+
param = param.clone
|
239
|
+
param[:password] = param[:password].to_s if (param[:password])
|
200
240
|
stream.set_encoding(Encoding::ASCII_8BIT)
|
241
|
+
|
242
|
+
add_sfx(stream, param[:sfx]) if param[:sfx]
|
243
|
+
|
201
244
|
open_impl(stream, param)
|
202
245
|
return self
|
203
246
|
end
|
204
247
|
|
205
248
|
# Open 7zip archive file to create.
|
206
249
|
#
|
250
|
+
# <tt>close</tt> method must be called later.
|
251
|
+
#
|
207
252
|
# ==== Args
|
208
253
|
# +filename+ :: 7zip archive filename.
|
209
|
-
# +param+ :: Optional hash parameter.
|
254
|
+
# +param+ :: Optional hash parameter.
|
255
|
+
# <tt>:password</tt> key specifies password of this archive.
|
256
|
+
# <tt>:sfx</tt> key specifies Self Extracting mode. <tt>:gui</tt> and <tt>:console</tt> can be used. <tt>true</tt> is same as <tt>:gui</tt>.
|
210
257
|
#
|
211
258
|
# ==== Examples
|
212
259
|
# szw = SevenZipRuby::SevenZipWriter.new
|
@@ -425,6 +472,17 @@ module SevenZipRuby
|
|
425
472
|
end
|
426
473
|
private :compress_proc
|
427
474
|
|
475
|
+
def add_sfx(stream, sfx)
|
476
|
+
sfx = :default if sfx == true
|
477
|
+
sfx_file = SFX_FILE_LIST[sfx]
|
478
|
+
raise ArgumentError.new("invalid option: :sfx") unless sfx_file
|
479
|
+
|
480
|
+
File.open(sfx_file, "rb") do |input|
|
481
|
+
IO.copy_stream(input, stream)
|
482
|
+
end
|
483
|
+
end
|
484
|
+
private :add_sfx
|
485
|
+
|
428
486
|
COMPRESS_GUARD = Mutex.new # :nodoc:
|
429
487
|
def synchronize # :nodoc:
|
430
488
|
if (COMPRESS_GUARD)
|
data/spec/seven_zip_ruby_spec.rb
CHANGED
@@ -206,7 +206,7 @@ describe SevenZipRuby do
|
|
206
206
|
example "invalid index" do
|
207
207
|
File.open(SevenZipRubySpecHelper::SEVEN_ZIP_FILE, "rb") do |file|
|
208
208
|
SevenZipRuby::SevenZipReader.open(file) do |szr|
|
209
|
-
expect{ szr.extract_data(nil) }.to raise_error
|
209
|
+
expect{ szr.extract_data(nil) }.to raise_error(ArgumentError)
|
210
210
|
end
|
211
211
|
end
|
212
212
|
end
|
@@ -214,18 +214,22 @@ describe SevenZipRuby do
|
|
214
214
|
example "invalid index for entry" do
|
215
215
|
File.open(SevenZipRubySpecHelper::SEVEN_ZIP_FILE, "rb") do |file|
|
216
216
|
SevenZipRuby::SevenZipReader.open(file) do |szr|
|
217
|
-
expect{ szr.entry("a") }.to raise_error
|
217
|
+
expect{ szr.entry("a") }.to raise_error(TypeError)
|
218
218
|
end
|
219
219
|
end
|
220
220
|
end
|
221
221
|
|
222
222
|
example "invalid password" do
|
223
223
|
File.open(SevenZipRubySpecHelper::SEVEN_ZIP_PASSWORD_FILE, "rb") do |file|
|
224
|
-
expect{ SevenZipRuby::Reader.open(file){ |szr| szr.extract_data(1) } }.to raise_error
|
224
|
+
expect{ SevenZipRuby::Reader.open(file){ |szr| szr.extract_data(1) } }.to raise_error(StandardError)
|
225
225
|
end
|
226
226
|
|
227
227
|
File.open(SevenZipRubySpecHelper::SEVEN_ZIP_PASSWORD_FILE, "rb") do |file|
|
228
|
-
expect{ SevenZipRuby::Reader.open(file, password: "a"){ |szr| szr.extract_data(1) } }.to raise_error
|
228
|
+
expect{ SevenZipRuby::Reader.open(file, password: "a"){ |szr| szr.extract_data(1) } }.to raise_error(SevenZipRuby::InvalidArchive)
|
229
|
+
end
|
230
|
+
|
231
|
+
File.open(SevenZipRubySpecHelper::SEVEN_ZIP_PASSWORD_FILE, "rb") do |file|
|
232
|
+
expect{ SevenZipRuby::Reader.open(file, password: :InvalidType){ |szr| szr.extract_data(1) } }.to raise_error(SevenZipRuby::InvalidArchive)
|
229
233
|
end
|
230
234
|
end
|
231
235
|
|
@@ -299,8 +303,8 @@ describe SevenZipRuby do
|
|
299
303
|
end
|
300
304
|
|
301
305
|
example "clone and dup cannot be called." do
|
302
|
-
expect{ SevenZipRuby::SevenZipReader.new.clone }.to raise_error
|
303
|
-
expect{ SevenZipRuby::SevenZipReader.new.dup }.to raise_error
|
306
|
+
expect{ SevenZipRuby::SevenZipReader.new.clone }.to raise_error(NoMethodError)
|
307
|
+
expect{ SevenZipRuby::SevenZipReader.new.dup }.to raise_error(NoMethodError)
|
304
308
|
end
|
305
309
|
|
306
310
|
end
|
@@ -369,6 +373,70 @@ describe SevenZipRuby do
|
|
369
373
|
end
|
370
374
|
end
|
371
375
|
|
376
|
+
example "set password" do
|
377
|
+
sample_data = "Sample Data"
|
378
|
+
sample_password = "sample password"
|
379
|
+
|
380
|
+
output = StringIO.new("")
|
381
|
+
SevenZipRuby::SevenZipWriter.open(output, { password: sample_password }) do |szw|
|
382
|
+
szw.add_data(sample_data, "hoge.txt")
|
383
|
+
end
|
384
|
+
|
385
|
+
output.rewind
|
386
|
+
SevenZipRuby::SevenZipReader.open(output, { password: sample_password }) do |szr|
|
387
|
+
expect(szr.extract_data(0)).to eq sample_data
|
388
|
+
end
|
389
|
+
|
390
|
+
output.rewind
|
391
|
+
expect{
|
392
|
+
SevenZipRuby::SevenZipReader.open(output, { password: "invalid password" }) do |szr|
|
393
|
+
szr.extract_data(0)
|
394
|
+
end
|
395
|
+
}.to raise_error(SevenZipRuby::InvalidArchive)
|
396
|
+
|
397
|
+
|
398
|
+
output = StringIO.new("")
|
399
|
+
SevenZipRuby::SevenZipWriter.open(output, { password: sample_password.to_sym }) do |szw|
|
400
|
+
szw.add_data(sample_data, "hoge.txt")
|
401
|
+
end
|
402
|
+
|
403
|
+
output.rewind
|
404
|
+
SevenZipRuby::SevenZipReader.open(output, { password: sample_password }) do |szr|
|
405
|
+
expect(szr.extract_data(0)).to eq sample_data
|
406
|
+
end
|
407
|
+
end
|
408
|
+
|
409
|
+
example "create a sfx archive" do
|
410
|
+
time = Time.now
|
411
|
+
|
412
|
+
output = StringIO.new("")
|
413
|
+
SevenZipRuby::SevenZipWriter.open(output) do |szw|
|
414
|
+
szw.add_data("hogehoge", "hoge.txt", ctime: time, atime: time, mtime: time)
|
415
|
+
end
|
416
|
+
|
417
|
+
output1 = StringIO.new("")
|
418
|
+
SevenZipRuby::SevenZipWriter.open(output1, sfx: true) do |szw|
|
419
|
+
szw.add_data("hogehoge", "hoge.txt", ctime: time, atime: time, mtime: time)
|
420
|
+
end
|
421
|
+
|
422
|
+
output2 = StringIO.new("")
|
423
|
+
SevenZipRuby::SevenZipWriter.open(output2, sfx: :gui) do |szw|
|
424
|
+
szw.add_data("hogehoge", "hoge.txt", ctime: time, atime: time, mtime: time)
|
425
|
+
end
|
426
|
+
|
427
|
+
output3 = StringIO.new("")
|
428
|
+
SevenZipRuby::SevenZipWriter.open(output3, sfx: :console) do |szw|
|
429
|
+
szw.add_data("hogehoge", "hoge.txt", ctime: time, atime: time, mtime: time)
|
430
|
+
end
|
431
|
+
|
432
|
+
gui = File.open(SevenZipRuby::SevenZipWriter::SFX_FILE_LIST[:gui], "rb", &:read)
|
433
|
+
console = File.open(SevenZipRuby::SevenZipWriter::SFX_FILE_LIST[:console], "rb", &:read)
|
434
|
+
|
435
|
+
expect(output1.string).to eq gui + output.string
|
436
|
+
expect(output2.string).to eq gui + output.string
|
437
|
+
expect(output3.string).to eq console + output.string
|
438
|
+
end
|
439
|
+
|
372
440
|
[ true, false ].each do |use_native_input_file_stream|
|
373
441
|
example "add_directory: use_native_input_file_stream=#{use_native_input_file_stream}" do
|
374
442
|
SevenZipRuby::SevenZipWriter.use_native_input_file_stream = use_native_input_file_stream
|
@@ -562,11 +630,11 @@ describe SevenZipRuby do
|
|
562
630
|
end
|
563
631
|
|
564
632
|
example "invalid method" do
|
565
|
-
expect{ SevenZipRuby::SevenZipWriter.open(StringIO.new("")).method = "Unknown" }.to raise_error
|
633
|
+
expect{ SevenZipRuby::SevenZipWriter.open(StringIO.new("")).method = "Unknown" }.to raise_error(ArgumentError)
|
566
634
|
end
|
567
635
|
|
568
636
|
example "invalid level" do
|
569
|
-
expect{ SevenZipRuby::SevenZipWriter.open(StringIO.new("")).level = 2 }.to raise_error
|
637
|
+
expect{ SevenZipRuby::SevenZipWriter.open(StringIO.new("")).level = 2 }.to raise_error(ArgumentError)
|
570
638
|
end
|
571
639
|
|
572
640
|
example "add_data/mkdir/compress/close before open" do
|
@@ -592,8 +660,8 @@ describe SevenZipRuby do
|
|
592
660
|
end
|
593
661
|
|
594
662
|
example "clone and dup cannot be called." do
|
595
|
-
expect{ SevenZipRuby::SevenZipWriter.new.clone }.to raise_error
|
596
|
-
expect{ SevenZipRuby::SevenZipWriter.new.dup }.to raise_error
|
663
|
+
expect{ SevenZipRuby::SevenZipWriter.new.clone }.to raise_error(NoMethodError)
|
664
|
+
expect{ SevenZipRuby::SevenZipWriter.new.dup }.to raise_error(NoMethodError)
|
597
665
|
end
|
598
666
|
|
599
667
|
if (false && RUBY_ENGINE == "ruby")
|
metadata
CHANGED
@@ -1,55 +1,55 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: seven_zip_ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2.
|
4
|
+
version: 1.2.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Masamitsu MURASE
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-11-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - ~>
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '1.3'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - ~>
|
24
|
+
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '1.3'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rspec
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '0'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
55
|
description: SevenZipRuby (seven_zip_ruby) is a ruby gem library to read and write
|
@@ -61,8 +61,8 @@ extensions:
|
|
61
61
|
- ext/seven_zip_ruby/extconf.rb
|
62
62
|
extra_rdoc_files: []
|
63
63
|
files:
|
64
|
-
- .gitignore
|
65
|
-
- .travis.yml
|
64
|
+
- ".gitignore"
|
65
|
+
- ".travis.yml"
|
66
66
|
- Gemfile
|
67
67
|
- LICENSE.txt
|
68
68
|
- README.md
|
@@ -780,7 +780,9 @@ files:
|
|
780
780
|
- ext/seven_zip_ruby/win32/mutex.h
|
781
781
|
- lib/seven_zip_ruby.rb
|
782
782
|
- lib/seven_zip_ruby/7z.dll
|
783
|
+
- lib/seven_zip_ruby/7z.sfx
|
783
784
|
- lib/seven_zip_ruby/7z64.dll
|
785
|
+
- lib/seven_zip_ruby/7zCon.sfx
|
784
786
|
- lib/seven_zip_ruby/archive_info.rb
|
785
787
|
- lib/seven_zip_ruby/entry_info.rb
|
786
788
|
- lib/seven_zip_ruby/exception.rb
|
@@ -801,17 +803,17 @@ require_paths:
|
|
801
803
|
- lib
|
802
804
|
required_ruby_version: !ruby/object:Gem::Requirement
|
803
805
|
requirements:
|
804
|
-
- -
|
806
|
+
- - ">="
|
805
807
|
- !ruby/object:Gem::Version
|
806
808
|
version: 2.0.0
|
807
809
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
808
810
|
requirements:
|
809
|
-
- -
|
811
|
+
- - ">="
|
810
812
|
- !ruby/object:Gem::Version
|
811
813
|
version: '0'
|
812
814
|
requirements: []
|
813
815
|
rubyforge_project:
|
814
|
-
rubygems_version: 2.
|
816
|
+
rubygems_version: 2.6.8
|
815
817
|
signing_key:
|
816
818
|
specification_version: 4
|
817
819
|
summary: This is a ruby gem library to read and write 7zip files.
|