seven_zip_ruby 1.2.1 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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