seven_zip_ruby 1.2.1 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: fc520a330afc1504a227c21446eaa410dc2b130c
4
- data.tar.gz: faa164047f17bec951a944433a6c9d7276a9fa92
2
+ SHA256:
3
+ metadata.gz: 5825d6fc6003666a0e46c7f7d04b02166df43dedfcce9c1321c585bdb572aa83
4
+ data.tar.gz: a1c55155547c4f190d5265adb38306d433b620c15b7dfd503e995577560b3708
5
5
  SHA512:
6
- metadata.gz: 5bb85502e25cc0146b8e0238bdf853549a3b62ce1b8a2e9d7ac4485ad2fbd1a900fe66fd2a116cc1b6192194f067b73dc1cfb3be36af5971c92ed75fc2c7167c
7
- data.tar.gz: b32b40db99b37c8fcf39beca6f47ffb363f2fcab3a5bdd8f8aa6ccedd13b6f1c7abbf22d3bf55aec30ae68877579095cf9790618d46ec99df33ec21afbac781d
6
+ metadata.gz: 143dfc6e36e05dc5697b90129f135beb67752425564fa761d973d4635b10c62ec2719ad2daab5076afc85301dd365c0c0e8ed5b35e9fa4934d3bc8672816ba14
7
+ data.tar.gz: 164fb272a9179e26ac2d0ee1f56c189047254ccd85e93ffc6bd1f4f6e56b399611f8dd3d655d6e816a35fd09615803354b54f4dbffee3bdd6bf58dc3f841727f
@@ -1,19 +1,35 @@
1
1
  language: ruby
2
2
  rvm:
3
- - "2.0.0"
4
- - "2.1.0"
5
- - "rbx"
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"
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
- - sudo apt-get install p7zip-full
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
@@ -4,15 +4,18 @@
4
4
 
5
5
  This is a Ruby gem library to extract/compress [7-Zip](http://www.7-zip.org) archives.
6
6
 
7
- This extension calls the native library, 7z.dll or 7z.so, internally and it is included in this gem.
7
+ This extension calls the native library, 7z.dll or 7z.so, internally and these libraries are included in this gem.
8
8
 
9
9
  ## Features
10
- * Use official DLL, 7z.dll, internally.
11
- * Support extracting data into memory.
10
+ * Uses official DLL, 7z.dll, internally.
11
+ * Supports extracting data into memory.
12
+
13
+ ## Document
14
+ [RDoc](http://rubydoc.info/gems/seven_zip_ruby/frames) shows you the details.
12
15
 
13
16
  ## Examples
14
17
 
15
- ### Extract archive
18
+ ### Extract archives
16
19
 
17
20
  ```ruby
18
21
  File.open("filename.7z", "rb") do |file|
@@ -22,7 +25,7 @@ File.open("filename.7z", "rb") do |file|
22
25
  end
23
26
  ```
24
27
 
25
- You can also use handy method.
28
+ You can also use simpler method.
26
29
 
27
30
  ```ruby
28
31
  File.open("filename.7z", "rb") do |file|
@@ -30,7 +33,7 @@ File.open("filename.7z", "rb") do |file|
30
33
  end
31
34
  ```
32
35
 
33
- ### Show entries in archive
36
+ ### Show the entries in the archive
34
37
 
35
38
  ```ruby
36
39
  File.open("filename.7z", "rb") do |file|
@@ -42,7 +45,7 @@ File.open("filename.7z", "rb") do |file|
42
45
  end
43
46
  ```
44
47
 
45
- ### Extract encrypted archive
48
+ ### Extract encrypted archives
46
49
 
47
50
  ```ruby
48
51
  File.open("filename.7z", "rb") do |file|
@@ -60,7 +63,7 @@ end
60
63
  ```
61
64
 
62
65
 
63
- ### Verify archive
66
+ ### Verify archives
64
67
 
65
68
  ```ruby
66
69
  File.open("filename.7z", "rb") do |file|
@@ -114,7 +117,7 @@ File.open("filename.7z", "rb") do |file|
114
117
  end
115
118
  ```
116
119
 
117
- ### Get data from archive
120
+ ### Get data from archives
118
121
 
119
122
  Extract data into memory.
120
123
 
@@ -130,7 +133,7 @@ p data
130
133
  # => File content is shown.
131
134
  ```
132
135
 
133
- ### Create archive manually
136
+ ### Create an archive manually
134
137
 
135
138
  ```ruby
136
139
  File.open("filename.7z", "rb") do |file|
@@ -145,6 +148,17 @@ File.open("filename.7z", "rb") do |file|
145
148
  end
146
149
  ```
147
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
+
148
162
  ### Set compression mode
149
163
 
150
164
  7zip supports LZMA, LZMA2, PPMD, BZIP2, DEFLATE and COPY.
@@ -178,8 +192,8 @@ p(Time.now - start)
178
192
  ## TODO
179
193
 
180
194
  * Support file attributes on Linux and Mac OSX.
181
- * Support updating archive.
182
- * Support extracting rar archive.
195
+ * Support update of an archive.
196
+ * Support extract of a rar archive.
183
197
 
184
198
 
185
199
  ## License
@@ -187,8 +201,10 @@ LGPL and unRAR license. Please refer to LICENSE.txt.
187
201
 
188
202
  ## Releases
189
203
 
204
+ * 1.2.*
205
+ - Fixed cosmetic bugs.
190
206
  * 1.1.0
191
- Raise error when wrong password is specified.
207
+ - Fixed a bug. Raises an exception when wrong password is specified.
192
208
  * 1.0.0
193
- Initial release.
209
+ - Initial release.
194
210
 
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
- FileUtils.cp("resources/seven_zip_ruby.gemspec.platform", "seven_zip_ruby.gemspec")
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
@@ -130,24 +141,35 @@ def main
130
141
  if (RUBY_PLATFORM.include?("mswin"))
131
142
  # mswin32
132
143
  $LIBS = "oleaut32.lib"
133
- $CPPFLAGS = "/I.. /EHsc /DNDEBUG /DUSE_WIN32_FILE_API #{base_flag} "
144
+ $CPPFLAGS = "/I.. /EHsc /DNDEBUG /DUSE_WIN32_FILE_API #{base_flag} #{$CPPFLAGS} "
134
145
  elsif (RUBY_PLATFORM.include?("mingw"))
135
146
  # MinGW
136
147
  $LIBS = "-loleaut32 -static-libgcc -static-libstdc++"
137
148
 
138
- cpp0x_flag = [ "", "-std=c++11", "-std=gnu++11", "-std=c++0x", "-std=gnu++0x" ].find do |opt|
139
- next try_compile(sample_cpp_source, "#{opt} -x c++ ")
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
 
143
- $CPPFLAGS = "-I.. #{cpp0x_flag} -DNDEBUG -DUSE_WIN32_FILE_API #{base_flag} "
154
+ $CPPFLAGS = "-I.. #{cpp0x_flag} -DNDEBUG -DUSE_WIN32_FILE_API #{base_flag} #{$CPPFLAGS} "
144
155
  else
145
- cpp0x_flag = [ "", "-std=c++11", "-std=gnu++11", "-std=c++0x", "-std=gnu++0x" ].find do |opt|
146
- next (try_compile(sample_cpp_source, "#{opt} -x c++ ") || try_compile(sample_cpp_source, "#{opt} "))
156
+ removed_flags = [ /\-mmacosx\-version\-min=[.0-9]+\b/ ]
157
+ removed_flags.each do |flag|
158
+ begin
159
+ $CFLAGS[flag] = ""
160
+ rescue
161
+ end
162
+ end
163
+
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)
147
169
  end
148
170
  raise "C++11 is not supported by the compiler." unless (cpp0x_flag)
149
171
 
150
- $CPPFLAGS = "-I.. -I../CPP/include_windows -I../CPP #{cpp0x_flag} -DNDEBUG #{base_flag} "
172
+ $CPPFLAGS = "-I.. -I../CPP/include_windows -I../CPP #{cpp0x_flag} -DNDEBUG #{base_flag} #{$CPPFLAGS} "
151
173
 
152
174
 
153
175
  ostype = check_ostype
@@ -2,6 +2,7 @@
2
2
  #include <array>
3
3
  #include <vector>
4
4
  #include <cassert>
5
+ #include <string>
5
6
 
6
7
  #ifndef _WIN32
7
8
  #include <dlfcn.h>
@@ -13,6 +14,10 @@
13
14
 
14
15
  #define INTERN(const_str) rb_intern2(const_str, sizeof(const_str) - 1)
15
16
 
17
+ // For https://bugs.ruby-lang.org/issues/11962
18
+ #ifndef RARRAY_CONST_PTR
19
+ #define RARRAY_CONST_PTR(index_list) RARRAY_PTR(index_list)
20
+ #endif
16
21
 
17
22
  ////////////////////////////////////////////////////////////////
18
23
  namespace SevenZip
@@ -505,7 +510,7 @@ VALUE ArchiveReader::extractFiles(VALUE index_list, VALUE callback_proc)
505
510
  fillEntryInfo();
506
511
 
507
512
  std::vector<UInt32> list(RARRAY_LEN(index_list));
508
- std::transform(RARRAY_PTR(index_list), RARRAY_PTR(index_list) + RARRAY_LEN(index_list),
513
+ std::transform(RARRAY_CONST_PTR(index_list), RARRAY_CONST_PTR(index_list) + RARRAY_LEN(index_list),
509
514
  list.begin(), [](VALUE num){ return NUM2ULONG(num); });
510
515
 
511
516
  HRESULT ret;
@@ -1220,14 +1225,13 @@ STDMETHODIMP ArchiveExtractCallback::GetStream(UInt32 index, ISequentialOutStrea
1220
1225
  bool ret = m_archive->runRubyAction([&](){
1221
1226
  rb_stream = rb_funcall(proc, INTERN("call"), 2,
1222
1227
  ID2SYM(INTERN("stream")), m_archive->entryInfo(index));
1228
+ m_archive->setProcessingStream(rb_stream, index, askExtractMode);
1223
1229
  });
1224
1230
  if (!ret){
1225
1231
  m_archive->clearProcessingStream();
1226
1232
  return E_FAIL;
1227
1233
  }
1228
1234
 
1229
- m_archive->setProcessingStream(rb_stream, index, askExtractMode);
1230
-
1231
1235
  OutStream *stream = new OutStream(rb_stream, m_archive);
1232
1236
  CMyComPtr<OutStream> ptr(stream);
1233
1237
  *outStream = ptr.Detach();
@@ -1434,14 +1438,14 @@ STDMETHODIMP ArchiveUpdateCallback::GetStream(UInt32 index, ISequentialInStream
1434
1438
  }else{
1435
1439
  rb_stream = rb_ary_entry(ret_array, 1);
1436
1440
  }
1441
+
1442
+ m_archive->setProcessingStream(rb_stream, index);
1437
1443
  });
1438
1444
  if (!ret){
1439
1445
  m_archive->clearProcessingStream();
1440
1446
  return E_FAIL;
1441
1447
  }
1442
1448
 
1443
- m_archive->setProcessingStream(rb_stream, index);
1444
-
1445
1449
  if (NIL_P(rb_stream) && !(filepath.empty())){
1446
1450
  FileInStream *stream = new FileInStream(filepath, m_archive);
1447
1451
  CMyComPtr<FileInStream> ptr(stream);
@@ -1533,7 +1537,7 @@ STDMETHODIMP InStream::Read(void *data, UInt32 size, UInt32 *processedSize)
1533
1537
  bool ret = m_archive->runRubyAction([&](){
1534
1538
  VALUE str = rb_funcall(m_stream, INTERN("read"), 1, ULONG2NUM(size));
1535
1539
  if (!NIL_P(str) && data){
1536
- std::memcpy(data, RSTRING_PTR(str), RSTRING_LEN(str));
1540
+ memcpy(data, RSTRING_PTR(str), RSTRING_LEN(str));
1537
1541
  }
1538
1542
 
1539
1543
  if (processedSize){
@@ -1763,13 +1767,33 @@ extern "C" void Init_seven_zip_archive(void)
1763
1767
  using namespace SevenZip;
1764
1768
  using namespace RubyCppUtil;
1765
1769
 
1770
+ VALUE mod = rb_define_module("SevenZipRuby");
1771
+ gSevenZipModule = mod;
1772
+
1773
+ VALUE external_lib_dir = rb_const_get(mod, INTERN("EXTERNAL_LIB_DIR"));
1774
+ std::string external_lib_dir_str(RSTRING_PTR(external_lib_dir), RSTRING_LEN(external_lib_dir));
1775
+
1766
1776
  #ifdef _WIN32
1767
- gSevenZipHandle = LoadLibrary("./7z.dll");
1777
+ const int len = MultiByteToWideChar(CP_UTF8, 0, external_lib_dir_str.c_str(), external_lib_dir_str.length(),
1778
+ NULL, 0);
1779
+ if (len == 0) {
1780
+ rb_warning("MultiByteToWideChar error.");
1781
+ return;
1782
+ }
1783
+ std::vector<wchar_t> external_lib_dir_vec(len);
1784
+ MultiByteToWideChar(CP_UTF8, 0, external_lib_dir_str.c_str(), external_lib_dir_str.length(),
1785
+ &external_lib_dir_vec[0], external_lib_dir_vec.size());
1786
+ const std::wstring external_lib_dir_wstr(&external_lib_dir_vec[0], len);
1787
+
1788
+ const std::wstring dll_path = external_lib_dir_wstr + L"/7z.dll";
1789
+ gSevenZipHandle = LoadLibraryW(dll_path.c_str());
1768
1790
  if (!gSevenZipHandle){
1769
- gSevenZipHandle = LoadLibrary("./7z64.dll");
1791
+ const std::wstring dll_path2 = external_lib_dir_wstr + L"/7z64.dll";
1792
+ gSevenZipHandle = LoadLibraryW(dll_path2.c_str());
1770
1793
  }
1771
1794
  #else
1772
- gSevenZipHandle = dlopen("./7z.so", RTLD_NOW);
1795
+ std::string dll_path = external_lib_dir_str + "/7z.so";
1796
+ gSevenZipHandle = dlopen(dll_path.c_str(), RTLD_NOW);
1773
1797
  #endif
1774
1798
  if (!gSevenZipHandle){
1775
1799
  rb_warning("7z library is not found.");
@@ -1787,9 +1811,6 @@ extern "C" void Init_seven_zip_archive(void)
1787
1811
  }
1788
1812
 
1789
1813
 
1790
- VALUE mod = rb_define_module("SevenZipRuby");
1791
- gSevenZipModule = mod;
1792
-
1793
1814
  VALUE cls;
1794
1815
 
1795
1816
  // arg_count is needed by MSVC 2010...
@@ -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
 
@@ -2,19 +2,26 @@
2
2
 
3
3
  require("seven_zip_ruby/version")
4
4
 
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)
5
+ module SevenZipRuby
6
+ def self.find_external_lib_dir
7
+ external_lib = (RUBY_PLATFORM.downcase.match(/mswin|mingw/) ? "7z.dll" : "7z.so")
8
+ dir = $LOAD_PATH.find do |i|
9
+ path = File.expand_path(File.join(i, "seven_zip_ruby", external_lib))
10
+ next File.file?(path)
11
+ end
12
+ raise "Failed to find 7z.dll or 7z.so" unless dir
10
13
 
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")
14
+ return File.join(dir, "seven_zip_ruby")
17
15
  end
16
+
17
+ EXTERNAL_LIB_DIR = self.find_external_lib_dir.encode(Encoding::UTF_8)
18
+ end
19
+
20
+ begin
21
+ version = RUBY_VERSION.match(/\d+\.\d+/)
22
+ require("seven_zip_ruby/#{version}/seven_zip_archive")
23
+ rescue LoadError
24
+ require("seven_zip_ruby/seven_zip_archive")
18
25
  end
19
26
  raise "Failed to initialize SevenZipRuby" unless (defined?(SevenZipRuby::SevenZipReader))
20
27
 
Binary file
@@ -102,8 +102,12 @@ module SevenZipRuby
102
102
  szr = self.new
103
103
  szr.open(stream, param)
104
104
  if (block)
105
- block.call(szr)
106
- szr.close
105
+ begin
106
+ block.call(szr)
107
+ szr.close
108
+ ensure
109
+ szr.close_file
110
+ end
107
111
  else
108
112
  szr
109
113
  end
@@ -135,8 +139,12 @@ module SevenZipRuby
135
139
  szr = self.new
136
140
  szr.open_file(filename, param)
137
141
  if (block)
138
- block.call(szr)
139
- szr.close
142
+ begin
143
+ block.call(szr)
144
+ szr.close
145
+ ensure
146
+ szr.close_file
147
+ end
140
148
  else
141
149
  szr
142
150
  end
@@ -200,9 +208,14 @@ module SevenZipRuby
200
208
  # # => true/false
201
209
  # end
202
210
  def verify(stream, opt = {})
203
- szr = self.open(stream, opt)
204
- ret = szr.verify
205
- szr.close
211
+ ret = false
212
+ begin
213
+ self.open(stream, opt) do |szr|
214
+ ret = szr.verify
215
+ end
216
+ rescue
217
+ ret = false
218
+ end
206
219
  return ret
207
220
  end
208
221
  end
@@ -223,6 +236,7 @@ module SevenZipRuby
223
236
  # szr.close
224
237
  # end
225
238
  def open(stream, param = {})
239
+ param = param.clone
226
240
  param[:password] = param[:password].to_s if (param[:password])
227
241
  stream.set_encoding(Encoding::ASCII_8BIT)
228
242
  open_impl(stream, param)
@@ -248,8 +262,12 @@ module SevenZipRuby
248
262
 
249
263
  def close
250
264
  close_impl
265
+ close_file
266
+ end
267
+
268
+ def close_file # :nodoc:
251
269
  if (@stream)
252
- @stream.close
270
+ @stream.close rescue nil
253
271
  @stream = nil
254
272
  end
255
273
  end
@@ -459,7 +477,7 @@ module SevenZipRuby
459
477
  path = arg_path.expand_path(base_dir)
460
478
  path.mkpath
461
479
  set_file_attribute(path.to_s, arg.attrib) if (arg.attrib)
462
- path.utime(arg.atime || path.atime, arg.mtime || path.mtime)
480
+ path.utime(arg.atime || path.atime, arg.mtime || path.mtime) rescue nil
463
481
  end
464
482
  next ret
465
483
 
@@ -470,7 +488,7 @@ module SevenZipRuby
470
488
  unless (arg[:info].anti?)
471
489
  path = Pathname(arg[:info].path).expand_path(base_dir)
472
490
  set_file_attribute(path.to_s, arg[:info].attrib) if (arg[:info].attrib)
473
- path.utime(arg[:info].atime || path.atime, arg[:info].mtime || path.mtime)
491
+ path.utime(arg[:info].atime || path.atime, arg[:info].mtime || path.mtime) rescue nil
474
492
  end
475
493
  end
476
494
  end
@@ -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. <tt>:password</tt> key represents password of this archive.
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. <tt>:password</tt> key represents password of this archive.
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. <tt>:password</tt> key represents password of this archive.
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
- open_param = {
153
- password: param.delete(:password)
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. <tt>:password</tt> key represents password of this archive.
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
- open_param = {
175
- password: param.delete(:password)
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. <tt>:password</tt> key represents password of this archive.
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. <tt>:password</tt> key represents password of this archive.
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)
@@ -1,3 +1,3 @@
1
1
  module SevenZipRuby
2
- VERSION = "1.2.1"
2
+ VERSION = "1.3.0"
3
3
  end
@@ -8,8 +8,8 @@ Gem::Specification.new do |spec|
8
8
  spec.version = SevenZipRuby::VERSION
9
9
  spec.authors = ["Masamitsu MURASE"]
10
10
  spec.email = ["masamitsu.murase@gmail.com"]
11
- spec.description = %q{SevenZipRuby is a gem library to read and write 7zip archives. This gem library calls official 7z.dll internally.}
12
- spec.summary = %q{This is a gem library to read and write 7-Zip files.}
11
+ spec.description = %q{SevenZipRuby (seven_zip_ruby) is a ruby gem library to read and write 7zip archives. This gem library calls official 7z.dll internally.}
12
+ spec.summary = %q{This is a ruby gem library to read and write 7zip files.}
13
13
  spec.homepage = "https://github.com/masamitsu-murase/seven_zip_ruby"
14
14
  spec.license = "LGPL + unRAR"
15
15
 
@@ -20,7 +20,7 @@ Gem::Specification.new do |spec|
20
20
 
21
21
  spec.required_ruby_version = '>= 2.0.0'
22
22
 
23
- spec.add_development_dependency "bundler", "~> 1.3"
23
+ spec.add_development_dependency "bundler"
24
24
  spec.add_development_dependency "rake"
25
25
  spec.add_development_dependency "rspec"
26
26
  if (RUBY_ENGINE == "rbx")
@@ -54,7 +54,7 @@ describe SevenZipRuby do
54
54
  expect(info.header_size).to be < file.size
55
55
  expect(info.method).to eq "LZMA"
56
56
  expect(info.phy_size).to be file.size
57
- expect(info.solid?).to be_true
57
+ expect(info.solid?).to be true
58
58
  end
59
59
  end
60
60
  end
@@ -139,6 +139,11 @@ describe SevenZipRuby do
139
139
 
140
140
  expect(SevenZipRuby::SevenZipReader.verify(StringIO.new(data))).to eq true
141
141
 
142
+ data_org = data[-1]
143
+ data[-1] = 0x01.chr # This highly dependes on the current test binary.
144
+ expect(SevenZipRuby::SevenZipReader.verify(StringIO.new(data))).to eq false
145
+ data[-1] = data_org
146
+
142
147
  data[0x27] = 0xEB.chr # This highly dependes on the current test binary.
143
148
  expected = [ :DataError, :DataError, :DataError, :DataError, :DataError, :DataError, :DataError, true, true, true, true, true ]
144
149
  SevenZipRuby::SevenZipReader.open(StringIO.new(data)) do |szr|
@@ -179,9 +184,7 @@ describe SevenZipRuby do
179
184
  end
180
185
  th_list.push(th)
181
186
  end
182
- th_list.each do |t|
183
- t.join
184
- end
187
+ th_list.each(&:join)
185
188
  end
186
189
 
187
190
 
@@ -203,7 +206,7 @@ describe SevenZipRuby do
203
206
  example "invalid index" do
204
207
  File.open(SevenZipRubySpecHelper::SEVEN_ZIP_FILE, "rb") do |file|
205
208
  SevenZipRuby::SevenZipReader.open(file) do |szr|
206
- expect{ szr.extract_data(nil) }.to raise_error (ArgumentError)
209
+ expect{ szr.extract_data(nil) }.to raise_error(ArgumentError)
207
210
  end
208
211
  end
209
212
  end
@@ -211,18 +214,22 @@ describe SevenZipRuby do
211
214
  example "invalid index for entry" do
212
215
  File.open(SevenZipRubySpecHelper::SEVEN_ZIP_FILE, "rb") do |file|
213
216
  SevenZipRuby::SevenZipReader.open(file) do |szr|
214
- expect{ szr.entry("a") }.to raise_error
217
+ expect{ szr.entry("a") }.to raise_error(TypeError)
215
218
  end
216
219
  end
217
220
  end
218
221
 
219
222
  example "invalid password" do
220
223
  File.open(SevenZipRubySpecHelper::SEVEN_ZIP_PASSWORD_FILE, "rb") do |file|
221
- 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
+ end
226
+
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(SevenZipRuby::InvalidArchive)
222
229
  end
223
230
 
224
231
  File.open(SevenZipRubySpecHelper::SEVEN_ZIP_PASSWORD_FILE, "rb") do |file|
225
- expect{ SevenZipRuby::Reader.open(file, password: "a"){ |szr| szr.extract_data(1) } }.to raise_error
232
+ expect{ SevenZipRuby::Reader.open(file, password: :InvalidType){ |szr| szr.extract_data(1) } }.to raise_error(SevenZipRuby::InvalidArchive)
226
233
  end
227
234
  end
228
235
 
@@ -296,8 +303,8 @@ describe SevenZipRuby do
296
303
  end
297
304
 
298
305
  example "clone and dup cannot be called." do
299
- expect{ SevenZipRuby::SevenZipReader.new.clone }.to raise_error
300
- 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)
301
308
  end
302
309
 
303
310
  end
@@ -366,6 +373,70 @@ describe SevenZipRuby do
366
373
  end
367
374
  end
368
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
+
369
440
  [ true, false ].each do |use_native_input_file_stream|
370
441
  example "add_directory: use_native_input_file_stream=#{use_native_input_file_stream}" do
371
442
  SevenZipRuby::SevenZipWriter.use_native_input_file_stream = use_native_input_file_stream
@@ -512,7 +583,6 @@ describe SevenZipRuby do
512
583
 
513
584
  example "run in multi threads" do
514
585
  th_list = []
515
- mutex = Mutex.new
516
586
  100.times do
517
587
  th = Thread.new do
518
588
  stream = StringIO.new
@@ -523,9 +593,7 @@ describe SevenZipRuby do
523
593
  end
524
594
  th_list.push(th)
525
595
  end
526
- th_list.each do |t|
527
- t.join
528
- end
596
+ th_list.each(&:join)
529
597
  end
530
598
 
531
599
  if (SevenZipRubySpecHelper.processor_count && SevenZipRubySpecHelper.processor_count > 1)
@@ -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")
@@ -616,11 +684,11 @@ describe SevenZipRuby do
616
684
  th.join
617
685
  diff = Time.now - start
618
686
 
619
- 10.times do
687
+ 20.times do
688
+ kill_time = rand * diff
620
689
  th = Thread.start{ prc.call }
621
- sleep(rand * diff)
690
+ sleep(kill_time)
622
691
  expect{ th.kill }.not_to raise_error # Thread can be killed.
623
- sleep diff*2 # Workaround. When some threads of SZR are running and killed, SEGV sometimes occurs...
624
692
  end
625
693
  end
626
694
  end
metadata CHANGED
@@ -1,59 +1,59 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: seven_zip_ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.1
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Masamitsu MURASE
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-02-25 00:00:00.000000000 Z
11
+ date: 2020-08-11 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
- version: '1.3'
19
+ version: '0'
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
- version: '1.3'
26
+ version: '0'
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
- description: SevenZipRuby is a gem library to read and write 7zip archives. This gem
56
- library calls official 7z.dll internally.
55
+ description: SevenZipRuby (seven_zip_ruby) is a ruby gem library to read and write
56
+ 7zip archives. This gem library calls official 7z.dll internally.
57
57
  email:
58
58
  - masamitsu.murase@gmail.com
59
59
  executables: []
@@ -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,20 +803,19 @@ 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
- rubyforge_project:
814
- rubygems_version: 2.0.2
815
+ rubygems_version: 3.1.2
815
816
  signing_key:
816
817
  specification_version: 4
817
- summary: This is a gem library to read and write 7-Zip files.
818
+ summary: This is a ruby gem library to read and write 7zip files.
818
819
  test_files:
819
820
  - spec/seven_zip_ruby_spec.rb
820
821
  - spec/seven_zip_ruby_spec_helper.rb