seven_zip_ruby 1.0.0 → 1.1.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
2
  SHA1:
3
- metadata.gz: 6cddf8386211bb8c27016b7bc9adc3e01397485c
4
- data.tar.gz: 62bea191d4575a3788562ce06ac4354c71ac6d19
3
+ metadata.gz: ee5048a454954a7610658f10e463febaa31ecb93
4
+ data.tar.gz: 70cf302be7166790d2af569eb6b4a109d78934bc
5
5
  SHA512:
6
- metadata.gz: 242528879f0d204d9f36542361ac2bac674ef5d1973ccd829fd8a1f8500b96fa4d896dbd0e21a9eb352d9f7e7a0d3edc1bd0b0a75f0ca1d2420584faf6570fc3
7
- data.tar.gz: e65d5c645b9e7960e8268fa44d1e02e0cb0487caa6f29c6fd6d12bb73e1acc7fa1646073ecb4faa4fe3917cf09f7a04950ac769ee9a97186eda302371b6284c5
6
+ metadata.gz: 3d94b6a533f37ddae5ca51d8882289884494b7ed783dee966cf3b5e060d0f7c404096bfd2212dc0d29a32125075acfc4e7a11af82aca33eaf65d178b47b25300
7
+ data.tar.gz: 96635e6baac1b98fed6f7321b4cb039abeddc81f2dada7fcdfc6dd053be9c0a3125fe3d47852a4347fda0dee38b303132b81b9083b0b0b9f6ca27f1f417caa78
data/README.md CHANGED
@@ -12,12 +12,8 @@ This extension calls the native library, 7z.dll or 7z.so, internally and it is i
12
12
 
13
13
  ## Examples
14
14
 
15
- **This is a beta version.**
16
- The interfaces may be changed.
17
-
18
- If you have any comments about interface API, let me know please.
19
-
20
15
  ### Extract archive
16
+
21
17
  ```ruby
22
18
  File.open("filename.7z", "rb") do |file|
23
19
  SevenZipRuby::Reader.open(file) do |szr|
@@ -27,6 +23,7 @@ end
27
23
  ```
28
24
 
29
25
  You can also use handy method.
26
+
30
27
  ```ruby
31
28
  File.open("filename.7z", "rb") do |file|
32
29
  SevenZipRuby::Reader.extract_all(file, "path_to_dir")
@@ -34,6 +31,7 @@ end
34
31
  ```
35
32
 
36
33
  ### Show entries in archive
34
+
37
35
  ```ruby
38
36
  File.open("filename.7z", "rb") do |file|
39
37
  SevenZipRuby::Reader.open(file) do |szr|
@@ -45,6 +43,7 @@ end
45
43
  ```
46
44
 
47
45
  ### Extract encrypted archive
46
+
48
47
  ```ruby
49
48
  File.open("filename.7z", "rb") do |file|
50
49
  SevenZipRuby::Reader.open(file, { password: "Password String" }) do |szr|
@@ -53,6 +52,7 @@ File.open("filename.7z", "rb") do |file|
53
52
  end
54
53
  ```
55
54
  or
55
+
56
56
  ```ruby
57
57
  File.open("filename.7z", "rb") do |file|
58
58
  SevenZipRuby::Reader.extract_all(file, "path_to_dir", { password: "Password String" })
@@ -61,6 +61,7 @@ end
61
61
 
62
62
 
63
63
  ### Verify archive
64
+
64
65
  ```ruby
65
66
  File.open("filename.7z", "rb") do |file|
66
67
  SevenZipRuby::Reader.verify(file)
@@ -69,6 +70,7 @@ end
69
70
  ```
70
71
 
71
72
  ### Compress files
73
+
72
74
  ```ruby
73
75
  File.open("filename.7z", "wb") do |file|
74
76
  SevenZipRuby::Writer.open(file) do |szr|
@@ -77,6 +79,7 @@ File.open("filename.7z", "wb") do |file|
77
79
  end
78
80
  ```
79
81
  or
82
+
80
83
  ```ruby
81
84
  File.open("filename.7z", "wb") do |file|
82
85
  SevenZipRuby::Writer.add_directory(file, "dir")
@@ -118,10 +121,11 @@ File.open("filename.7z", "rb") do |file|
118
121
  end
119
122
  p data
120
123
  # => File content is shown.
124
+ ```
121
125
 
122
126
  ### Create archive manually
123
127
 
124
- ```
128
+ ```ruby
125
129
  File.open("filename.7z", "rb") do |file|
126
130
  SevenZipRuby::Writer.open(file) do |szr|
127
131
  szr.add_file "entry1.txt"
@@ -174,3 +178,10 @@ p(Time.now - start)
174
178
  ## License
175
179
  LGPL and unRAR license. Please refer to LICENSE.txt.
176
180
 
181
+ ## Releases
182
+
183
+ * 1.1.0
184
+ Raise error when wrong password is specified.
185
+ * 1.0.0
186
+ Initial release.
187
+
@@ -756,6 +756,10 @@ VALUE ArchiveWriter::addItem(VALUE item)
756
756
 
757
757
  VALUE ArchiveWriter::compress(VALUE callback_proc)
758
758
  {
759
+ if (m_state == STATE_COMPRESSED){
760
+ return Qnil;
761
+ }
762
+
759
763
  checkStateToBeginOperation(STATE_OPENED);
760
764
  prepareAction();
761
765
  EventLoopThreadExecuter te(this);
@@ -1598,14 +1602,19 @@ extern "C" void Init_seven_zip_archive(void)
1598
1602
  rb_define_method_ext(cls, "level", WRITER_FUNC2(level, 0));
1599
1603
  rb_define_method_ext(cls, "solid=", WRITER_FUNC2(setSolid, 1));
1600
1604
  rb_define_method_ext(cls, "solid", WRITER_FUNC2(solid, 0));
1605
+ rb_define_method_ext(cls, "solid?", WRITER_FUNC2(solid, 0));
1601
1606
  rb_define_method_ext(cls, "header_compression=", WRITER_FUNC2(setHeaderCompression, 1));
1602
1607
  rb_define_method_ext(cls, "header_compression", WRITER_FUNC2(headerCompression, 0));
1608
+ rb_define_method_ext(cls, "header_compression?", WRITER_FUNC2(headerCompression, 0));
1603
1609
  rb_define_method_ext(cls, "header_encryption=", WRITER_FUNC2(setHeaderEncryption, 1));
1604
1610
  rb_define_method_ext(cls, "header_encryption", WRITER_FUNC2(headerEncryption, 0));
1611
+ rb_define_method_ext(cls, "header_encryption?", WRITER_FUNC2(headerEncryption, 0));
1605
1612
  rb_define_method_ext(cls, "multi_threading=", WRITER_FUNC2(setMultiThreading, 1));
1606
1613
  rb_define_method_ext(cls, "multi_thread=", WRITER_FUNC2(setMultiThreading, 1));
1607
1614
  rb_define_method_ext(cls, "multi_threading", WRITER_FUNC2(multiThreading, 0));
1615
+ rb_define_method_ext(cls, "multi_threading?", WRITER_FUNC2(multiThreading, 0));
1608
1616
  rb_define_method_ext(cls, "multi_thread", WRITER_FUNC2(multiThreading, 0));
1617
+ rb_define_method_ext(cls, "multi_thread?", WRITER_FUNC2(multiThreading, 0));
1609
1618
 
1610
1619
  #undef WRITER_FUNC2
1611
1620
  #undef WRITER_FUNC
@@ -3,5 +3,8 @@
3
3
  module SevenZipRuby
4
4
  class InvalidOperation < StandardError
5
5
  end
6
+
7
+ class InvalidArchive < StandardError
8
+ end
6
9
  end
7
10
 
@@ -1,11 +1,100 @@
1
1
  require("stringio")
2
2
 
3
3
  module SevenZipRuby
4
+
5
+ # SevenZipReader reads 7zip archive and extract it.
6
+ #
7
+ # == Examples
8
+ # === Get archive information
9
+ # # Archive property
10
+ # File.open("filename.7z", "rb") do |file|
11
+ # SevenZipRuby::Reader.open(file) do |szr|
12
+ # info = szr.archive_property # Return ArchiveInfo instance.
13
+ # end
14
+ # end
15
+ #
16
+ # # Entry information
17
+ # File.open("filename.7z", "rb") do |file|
18
+ # SevenZipRuby::Reader.open(file) do |szr|
19
+ # entries = szr.entries
20
+ # end
21
+ # end
22
+ #
23
+ # === Extract 7zip archive.
24
+ # # Extract archive
25
+ # File.open("filename.7z", "rb") do |file|
26
+ # SevenZipRuby::Reader.open(file) do |szr|
27
+ # szr.extract(:all, "path_to_dir")
28
+ # end
29
+ # end
30
+ #
31
+ # # Extract encrypted archive
32
+ # File.open("filename.7z", "rb") do |file|
33
+ # SevenZipRuby::Reader.open(file, password: "Password String") do |szr|
34
+ # szr.extract(:all, "path_to_dir")
35
+ # end
36
+ # end
37
+ #
38
+ # # Extract only small files
39
+ # File.open("filename.7z", "rb") do |file|
40
+ # SevenZipRuby::Reader.open(file) do |szr|
41
+ # small_files = szr.entries.select{ |i| i.file? && i.size < 1024 }
42
+ # szr.extract(small_files, "path_to_dir")
43
+ # end
44
+ # end
45
+ #
46
+ # # Extract archive on memory
47
+ # archive_data = "....."
48
+ # stream = StringIO.new(archive_data)
49
+ # SevenZipRuby::Reader.open(stream) do |szr|
50
+ # entry_data = szr.extract_data(:all)
51
+ # # => [ "data", ... ]
52
+ # end
53
+ #
54
+ # === Verify archive
55
+ # File.open("filename.7z", "rb") do |file|
56
+ # SevenZipRuby::Reader.verify(file)
57
+ # # => true/false
58
+ # end
4
59
  class SevenZipReader
5
60
  class << self
6
- def open(*args, &block)
61
+ # Open 7zip archive to read.
62
+ #
63
+ # ==== Args
64
+ # +stream+ :: Input stream to read 7zip archive. <tt>stream.seek</tt> and <tt>stream.read</tt> are needed.
65
+ # +param+ :: Optional hash parameter. <tt>:password</tt> key represents password of this archive.
66
+ #
67
+ # ==== Examples
68
+ # # Open archive
69
+ # File.open("filename.7z", "rb") do |file|
70
+ # SevenZipRuby::SevenZipReader.open(file) do |szr|
71
+ # # Read and extract archive.
72
+ # end
73
+ # end
74
+ #
75
+ # # Open encrypted archive
76
+ # File.open("filename.7z", "rb") do |file|
77
+ # SevenZipRuby::SevenZipReader.open(file, password: "PasswordOfArchive") do |szr|
78
+ # # Read and extract archive.
79
+ # end
80
+ # end
81
+ #
82
+ # # Open without block.
83
+ # File.open("filename.7z", "rb") do |file|
84
+ # szr = SevenZipRuby::SevenZipReader.open(file)
85
+ # # Read and extract archive.
86
+ # szr.close
87
+ # end
88
+ #
89
+ # # Open archive on memory.
90
+ # archive_data = "....."
91
+ # stream = StringIO.new(archive_data)
92
+ # SevenZipRuby::Reader.open(stream) do |szr|
93
+ # szr.extract(:all, "path_to_dir")
94
+ # end
95
+ def open(stream, param = {}, &block) # :yield: szr
7
96
  szr = self.new
8
- szr.open(*args)
97
+ szr.open(stream, param)
9
98
  if (block)
10
99
  block.call(szr)
11
100
  szr.close
@@ -14,6 +103,26 @@ module SevenZipRuby
14
103
  end
15
104
  end
16
105
 
106
+ # Open and extract 7zip archive.
107
+ #
108
+ # ==== Args
109
+ # +stream+ :: Input stream to read 7zip archive. <tt>stream.seek</tt> and <tt>stream.read</tt> are needed, such as <tt>File</tt> and <tt>StringIO</tt>.
110
+ # +index+ :: Index of the entry to extract. Integer or Array of Integer can be specified.
111
+ # +dir+ :: Directory to extract the archive to.
112
+ # +param+ :: Optional hash parameter. <tt>:password</tt> key represents password of this archive.
113
+ #
114
+ # ==== Examples
115
+ # File.open("filename.7z", "rb") do |file|
116
+ # SevenZipRuby::SevenZipReader.extract(file, 1, "path_to_dir")
117
+ # end
118
+ #
119
+ # File.open("filename.7z", "rb") do |file|
120
+ # SevenZipRuby::SevenZipReader.extract(file, [1, 2, 4], "path_to_dir", password: "PasswordOfArchive")
121
+ # end
122
+ #
123
+ # File.open("filename.7z", "rb") do |file|
124
+ # SevenZipRuby::SevenZipReader.extract(file, :all, "path_to_dir")
125
+ # end
17
126
  def extract(stream, index, dir = ".", param = {})
18
127
  password = { password: param.delete(:password) }
19
128
  self.open(stream, password) do |szr|
@@ -21,6 +130,17 @@ module SevenZipRuby
21
130
  end
22
131
  end
23
132
 
133
+ # Open and extract 7zip archive.
134
+ #
135
+ # ==== Args
136
+ # +stream+ :: Input stream to read 7zip archive. <tt>stream.seek</tt> and <tt>stream.read</tt> are needed.
137
+ # +dir+ :: Directory to extract the archive to.
138
+ # +param+ :: Optional hash parameter. <tt>:password</tt> key represents password of this archive.
139
+ #
140
+ # ==== Examples
141
+ # File.open("filename.7z", "rb") do |file|
142
+ # SevenZipRuby::SevenZipReader.extract_all(file, "path_to_dir")
143
+ # end
24
144
  def extract_all(stream, dir = ".", param = {})
25
145
  password = { password: param.delete(:password) }
26
146
  self.open(stream, password) do |szr|
@@ -28,14 +148,38 @@ module SevenZipRuby
28
148
  end
29
149
  end
30
150
 
31
- def verify(*args)
32
- szr = self.open(*args)
151
+ # Open and verify 7zip archive.
152
+ #
153
+ # ==== Args
154
+ # +stream+ :: Input stream to read 7zip archive. <tt>stream.seek</tt> and <tt>stream.read</tt> are needed.
155
+ # +opt+ :: Optional hash parameter. <tt>:password</tt> key represents password of this archive.
156
+ #
157
+ # ==== Examples
158
+ # File.open("filename.7z", "rb") do |file|
159
+ # ret = SevenZipRuby::SevenZipReader.verify(file)
160
+ # # => true/false
161
+ # end
162
+ def verify(stream, opt = {})
163
+ szr = self.open(stream, opt)
33
164
  ret = szr.verify
34
165
  szr.close
35
166
  return ret
36
167
  end
37
168
  end
38
169
 
170
+ # Open 7zip archive.
171
+ #
172
+ # ==== Args
173
+ # +stream+ :: Input stream to read 7zip archive. <tt>stream.seek</tt> and <tt>stream.read</tt> are needed.
174
+ # +param+ :: Optional hash parameter. <tt>:password</tt> key represents password of this archive.
175
+ #
176
+ # ==== Examples
177
+ # File.open("filename.7z", "rb") do |file|
178
+ # szr = SevenZipRuby::SevenZipReader.new
179
+ # szr.open(file)
180
+ # # ...
181
+ # szr.close
182
+ # end
39
183
  def open(stream, param = {})
40
184
  param[:password] = param[:password].to_s if (param[:password])
41
185
  stream.set_encoding(Encoding::ASCII_8BIT)
@@ -43,61 +187,18 @@ module SevenZipRuby
43
187
  return self
44
188
  end
45
189
 
46
-
47
- def file_proc(base_dir)
48
- base_dir = base_dir.to_s
49
- return Proc.new do |type, arg|
50
- case(type)
51
- when :stream
52
- ret = nil
53
- if (arg.anti?)
54
- arg.path.rmtree if (arg.path.exist?)
55
- elsif (arg.file?)
56
- path = arg.path.expand_path(base_dir)
57
- path.parent.mkpath
58
- ret = File.open(path, "wb")
59
- else
60
- path = arg.path.expand_path(base_dir)
61
- path.mkpath
62
- set_file_attribute(path.to_s, arg.attrib) if (arg.attrib)
63
- path.utime(arg.atime || path.atime, arg.mtime || path.mtime)
64
- end
65
- next ret
66
-
67
- when :result
68
- arg[:stream].close
69
- unless (arg[:info].anti?)
70
- path = arg[:info].path.expand_path(base_dir)
71
- set_file_attribute(path.to_s, arg[:info].attrib) if (arg[:info].attrib)
72
- path.utime(arg[:info].atime || path.atime, arg[:info].mtime || path.mtime)
73
- end
74
- end
75
- end
76
- end
77
- private :file_proc
78
-
79
- def data_proc(output, idx_prj)
80
- return Proc.new do |type, arg|
81
- case(type)
82
- when :stream
83
- ret = (arg.has_data? ? StringIO.new("".b) : nil)
84
- unless (arg.has_data?)
85
- output[idx_prj[arg.index]] = nil
86
- end
87
- next ret
88
-
89
- when :result
90
- arg[:stream].close
91
- if (arg[:info].has_data?)
92
- output[idx_prj[arg[:info].index]] = arg[:stream].string
93
- end
94
-
95
- end
96
- end
97
- end
98
- private :data_proc
99
-
100
-
190
+ # Verify 7zip archive.
191
+ #
192
+ # ==== Args
193
+ # none
194
+ #
195
+ # ==== Examples
196
+ # File.open("filename.7z", "rb") do |file|
197
+ # SevenZipRuby::SevenZipReader.open(file) do |szr|
198
+ # ret = szr.verify
199
+ # # => true/false
200
+ # end
201
+ # end
101
202
  def test
102
203
  begin
103
204
  return test_all_impl(nil)
@@ -107,6 +208,18 @@ module SevenZipRuby
107
208
  end
108
209
  alias verify test
109
210
 
211
+ # Verify 7zip archive and return the result of each entry.
212
+ #
213
+ # ==== Args
214
+ # none
215
+ #
216
+ # ==== Examples
217
+ # File.open("filename.7z", "rb") do |file|
218
+ # SevenZipRuby::SevenZipReader.open(file) do |szr|
219
+ # ret = szr.verify_detail
220
+ # # => [ true, :DataError, :DataError, ... ]
221
+ # end
222
+ # end
110
223
  def verify_detail
111
224
  begin
112
225
  return test_all_impl(true)
@@ -115,6 +228,24 @@ module SevenZipRuby
115
228
  end
116
229
  end
117
230
 
231
+ # Extract some entries of 7zip archive to local directory.
232
+ #
233
+ # ==== Args
234
+ # +index+ :: Index of the entry to extract. Integer or Array of Integer can be specified.
235
+ # +dir+ :: Directory to extract the archive to.
236
+ #
237
+ # ==== Examples
238
+ # File.open("filename.7z", "rb") do |file|
239
+ # SevenZipRuby::SevenZipReader.open(file) do |szr|
240
+ # szr.extract([ 1, 2, 4 ], "path_to_dir")
241
+ # end
242
+ # end
243
+ #
244
+ # File.open("filename.7z", "rb") do |file|
245
+ # SevenZipRuby::SevenZipReader.open(file) do |szr|
246
+ # szr.extract(:all, "path_to_dir")
247
+ # end
248
+ # end
118
249
  def extract(index, dir = ".")
119
250
  path = File.expand_path(dir)
120
251
  case(index)
@@ -129,14 +260,62 @@ module SevenZipRuby
129
260
  end
130
261
  end
131
262
 
263
+ # Extract all entries of 7zip archive to local directory.
264
+ #
265
+ # ==== Args
266
+ # +dir+ :: Directory to extract the archive to.
267
+ #
268
+ # ==== Examples
269
+ # File.open("filename.7z", "rb") do |file|
270
+ # SevenZipRuby::SevenZipReader.open(file) do |szr|
271
+ # szr.extract_all("path_to_dir")
272
+ # end
273
+ # end
132
274
  def extract_all(dir = ".")
133
275
  extract_all_impl(file_proc(File.expand_path(dir)))
134
276
  end
135
277
 
136
- def extract_if(dir = ".", &block)
278
+ # Extract entires of 7zip archive to local directory based on the block return value.
279
+ #
280
+ # ==== Args
281
+ # +dir+ :: Directory to extract the archive to.
282
+ #
283
+ # ==== Examples
284
+ # # Extract files whose size is less than 1024.
285
+ # File.open("filename.7z", "rb") do |file|
286
+ # SevenZipRuby::SevenZipReader.open(file) do |szr|
287
+ # szr.extract_if("path_to_dir") do |entry|
288
+ # next entry.size < 1024
289
+ # end
290
+ # end
291
+ # end
292
+ def extract_if(dir = ".", &block) # :yield: entry_info
137
293
  extract(entries.select(&block).map(&:index), dir)
138
294
  end
139
295
 
296
+ # Extract some entries of 7zip archive and return the extracted data.
297
+ #
298
+ # ==== Args
299
+ # +index+ :: Index of the entry to extract. :all, Integer or Array of Integer can be specified.
300
+ #
301
+ # ==== Examples
302
+ # File.open("filename.7z", "rb") do |file|
303
+ # SevenZipRuby::SevenZipReader.open(file) do |szr|
304
+ # small_entries = szr.entries.select{ |i| i.size < 1024 }
305
+ #
306
+ # data_list = szr.extract_data(small_entries)
307
+ # # => [ "file contents1", "file contents2", ... ]
308
+ # end
309
+ # end
310
+ #
311
+ # File.open("filename.7z", "rb") do |file|
312
+ # SevenZipRuby::SevenZipReader.open(file) do |szr|
313
+ # largest_entry = szr.entries.max_by{ |i| i.file? ? i.size : 0 }
314
+ #
315
+ # data_list = szr.extract_data(largest_entry)
316
+ # # => "file contents..."
317
+ # end
318
+ # end
140
319
  def extract_data(index)
141
320
  case(index)
142
321
  when :all
@@ -173,8 +352,67 @@ module SevenZipRuby
173
352
 
174
353
  end
175
354
  end
355
+
356
+
357
+ def file_proc(base_dir) # :nodoc:
358
+ base_dir = base_dir.to_s
359
+ return Proc.new do |type, arg|
360
+ case(type)
361
+ when :stream
362
+ ret = nil
363
+ if (arg.anti?)
364
+ arg.path.rmtree if (arg.path.exist?)
365
+ elsif (arg.file?)
366
+ path = arg.path.expand_path(base_dir)
367
+ path.parent.mkpath
368
+ ret = File.open(path, "wb")
369
+ else
370
+ path = arg.path.expand_path(base_dir)
371
+ path.mkpath
372
+ set_file_attribute(path.to_s, arg.attrib) if (arg.attrib)
373
+ path.utime(arg.atime || path.atime, arg.mtime || path.mtime)
374
+ end
375
+ next ret
376
+
377
+ when :result
378
+ arg[:stream].close
379
+ raise InvalidArchive.new("Corrupted archive or invalid password") unless (arg[:success])
380
+
381
+ unless (arg[:info].anti?)
382
+ path = arg[:info].path.expand_path(base_dir)
383
+ set_file_attribute(path.to_s, arg[:info].attrib) if (arg[:info].attrib)
384
+ path.utime(arg[:info].atime || path.atime, arg[:info].mtime || path.mtime)
385
+ end
386
+ end
387
+ end
388
+ end
389
+ private :file_proc
390
+
391
+ def data_proc(output, idx_prj) # :nodoc:
392
+ return Proc.new do |type, arg|
393
+ case(type)
394
+ when :stream
395
+ ret = (arg.has_data? ? StringIO.new("".b) : nil)
396
+ unless (arg.has_data?)
397
+ output[idx_prj[arg.index]] = nil
398
+ end
399
+ next ret
400
+
401
+ when :result
402
+ arg[:stream].close
403
+ raise InvalidArchive.new("Corrupted archive or invalid password") unless (arg[:success])
404
+
405
+ if (arg[:info].has_data?)
406
+ output[idx_prj[arg[:info].index]] = arg[:stream].string
407
+ end
408
+
409
+ end
410
+ end
411
+ end
412
+ private :data_proc
176
413
  end
177
414
 
178
415
 
416
+ # +Reader+ is an alias of +SevenZipReader+.
179
417
  Reader = SevenZipReader
180
418
  end
@@ -1,11 +1,77 @@
1
1
  require("stringio")
2
2
 
3
3
  module SevenZipRuby
4
+
5
+ # SevenZipWriter creates 7zip archive.
6
+ #
7
+ # == Properties
8
+ # +method+ :: Compression method. "LZMA", "LZMA2", "PPMd", "BZIP2", "DEFLATE" or "COPY". Default value is "LZMA".
9
+ # +level+ :: Compression level. 0, 1, 3, 5, 7 or 9. Default value is 5.
10
+ # +solid+ :: Solid compression. <tt>true</tt> or <tt>false</tt>. Default value is <tt>true</tt>.
11
+ # +header_compression+ :: Header compression. <tt>true</tt> or <tt>false</tt>. Default value is <tt>true</tt>.
12
+ # +header_encryption+ :: Header encryption. <tt>true</tt> or <tt>false</tt>. Default value is <tt>false</tt>.
13
+ # +multi_threading+ :: Multi threading. <tt>true</tt> or <tt>false</tt>. Default value is <tt>true</tt>.
14
+ #
15
+ # == Examples
16
+ # === Compress files
17
+ # # Compress files
18
+ # File.open("filename.7z", "wb") do |file|
19
+ # SevenZipRuby::SevenZipWriter.open(file) do |szw|
20
+ # szw.add_directory("test_dir")
21
+ # szw.add_file("test.txt")
22
+ # end
23
+ # end
24
+ #
25
+ # stream = StringIO.new("")
26
+ # SevenZipRuby::SevenZipWriter.open(stream) do |szw|
27
+ # szw.add_file("test.txt")
28
+ # szw.add_data(data, "test.bin")
29
+ # end
30
+ # # p stream.string
31
+ #
32
+ # === Set various properties
33
+ # File.open("filename.7z", "wb") do |file|
34
+ # SevenZipRuby::SevenZipWriter.open(file, password: "Password") do |szw|
35
+ # szw.method = "LZMA"
36
+ # szw.level = 9
37
+ # szw.solid = false
38
+ # szw.header_compression = false
39
+ # szw.header_encryption = true
40
+ # szw.multi_threading = false
41
+ #
42
+ # szw.add_directory("test_dir")
43
+ # end
44
+ # end
4
45
  class SevenZipWriter
46
+ # Encoding used for path string in 7zip archive.
5
47
  PATH_ENCODING = Encoding::UTF_8
6
48
 
7
49
  class << self
8
- def open(stream, param = {}, &block)
50
+ # Open 7zip archive to write.
51
+ #
52
+ # ==== Args
53
+ # +stream+ :: Output stream to write 7zip archive. <tt>stream.write</tt> is needed.
54
+ # +param+ :: Optional hash parameter. <tt>:password</tt> key represents password of this archive.
55
+ #
56
+ # ==== Examples
57
+ # # Open archive
58
+ # File.open("filename.7z", "wb") do |file|
59
+ # SevenZipRuby::SevenZipWriter.open(file) do |szw|
60
+ # # Create archive.
61
+ # # ...
62
+ # # You don't have to call szw.compress. Of cource, you may call it.
63
+ # # szw.compress
64
+ # end
65
+ # end
66
+ #
67
+ # # Open without block.
68
+ # File.open("filename.7z", "wb") do |file|
69
+ # szw = SevenZipRuby::SevenZipWriter.open(file)
70
+ # # Create archive.
71
+ # szw.compress # Compress must be called in this case.
72
+ # szw.close
73
+ # end
74
+ def open(stream, param = {}, &block) # :yield: szw
9
75
  szw = self.new
10
76
  szw.open(stream, param)
11
77
  if (block)
@@ -17,14 +83,38 @@ module SevenZipRuby
17
83
  end
18
84
  end
19
85
 
86
+ # Create 7zip archive which includes the specified directory recursively.
87
+ #
88
+ # ==== Args
89
+ # +stream+ :: Output stream to write 7zip archive. <tt>stream.write</tt> is needed.
90
+ # +dir+ :: Directory to be added to the 7zip archive. <b><tt>dir</tt></b> must be a <b>relative path</b>.
91
+ # +param+ :: Optional hash parameter. <tt>:password</tt> key represents password of this archive.
92
+ #
93
+ # ==== Examples
94
+ # # Create 7zip archive which includes 'dir'.
95
+ # File.open("filename.7z", "wb") do |file|
96
+ # SevenZipRuby::SevenZipWriter.add_directory(file, 'dir')
97
+ # end
20
98
  def add_directory(stream, dir, param = {})
21
99
  password = { password: param.delete(:password) }
22
100
  self.open(stream, password) do |szw|
23
101
  szw.add_directory(dir, param)
24
102
  end
25
103
  end
26
- alias add_dir add_directory
104
+ alias add_dir add_directory # +add_dir+ is an alias of +add_directory+.
27
105
 
106
+ # Create 7zip archive which includes the specified file recursively.
107
+ #
108
+ # ==== Args
109
+ # +stream+ :: Output stream to write 7zip archive. <tt>stream.write</tt> is needed.
110
+ # +file+ :: File to be added to the 7zip archive. <b><tt>file</tt></b> must be a <b>relative path</b>.
111
+ # +param+ :: Optional hash parameter. <tt>:password</tt> key represents password of this archive.
112
+ #
113
+ # ==== Examples
114
+ # # Create 7zip archive which includes 'file.txt'.
115
+ # File.open("filename.7z", "wb") do |file|
116
+ # SevenZipRuby::SevenZipWriter.add_file(file, 'file.txt')
117
+ # end
28
118
  def add_file(stream, filename, param = {})
29
119
  password = { password: param.delete(:password) }
30
120
  self.open(stream, password) do |szw|
@@ -33,17 +123,69 @@ module SevenZipRuby
33
123
  end
34
124
  end
35
125
 
126
+ # Open 7zip archive to create.
127
+ #
128
+ # ==== Args
129
+ # +stream+ :: Output stream to write 7zip archive. <tt>stream.write</tt> is needed.
130
+ # +param+ :: Optional hash parameter. <tt>:password</tt> key represents password of this archive.
131
+ #
132
+ # ==== Examples
133
+ # File.open("filename.7z", "wb") do |file|
134
+ # szw = SevenZipRuby::SevenZipWriter.open(file)
135
+ # # ...
136
+ # szw.compress
137
+ # szw.close
138
+ # end
36
139
  def open(stream, param = {})
37
140
  stream.set_encoding(Encoding::ASCII_8BIT)
38
141
  open_impl(stream, param)
39
142
  return self
40
143
  end
41
144
 
145
+ # Compress and output data to archive file.
146
+ # You don't have to call this method when you use block-style SevenZipWriter.open.
147
+ #
148
+ # ==== Examples
149
+ # # Open archive
150
+ # File.open("filename.7z", "wb") do |file|
151
+ # SevenZipRuby::SevenZipWriter.open(file) do |szw|
152
+ # # Create archive.
153
+ # # ...
154
+ # # You don't have to call szw.compress. Of cource, you may call it.
155
+ # # szw.compress
156
+ # end
157
+ # end
158
+ #
159
+ # # Open without block.
160
+ # File.open("filename.7z", "wb") do |file|
161
+ # szw = SevenZipRuby::SevenZipWriter.open(file)
162
+ # # Create archive.
163
+ # szw.compress # Compress must be called in this case.
164
+ # szw.close
165
+ # end
42
166
  def compress
43
167
  compress_impl(compress_proc)
44
168
  return self
45
169
  end
46
170
 
171
+ # Add file entry to 7zip archive.
172
+ #
173
+ # ==== Args
174
+ # +filename+ :: File to be added to the 7zip archive. <tt>file</tt> must be a <b>relative path</b> if <tt>:as</tt> option is not specified.
175
+ # +opt+ :: Optional hash parameter. <tt>:as</tt> key represents filename used in this archive.
176
+ #
177
+ # ==== Examples
178
+ # File.open("filename.7z", "wb") do |file|
179
+ # SevenZipRuby::SevenZipWriter.open(file) do |szw|
180
+ # # Add file entry 'test.txt' in 7zip archive.
181
+ # # This entry has the contents of the local file 'test.txt'.
182
+ # szw.add_file("test.txt")
183
+ #
184
+ # # Add file entry 'desk/test.txt' in 7zip archive.
185
+ # # This entry has the contents of the local file 'C:/Users/test/Desktop/test2.txt'.
186
+ # szw.add_file("C:/Users/test/Desktop/test2.txt", as: "desk/test.txt")
187
+ # end
188
+ # end
47
189
  def add_file(filename, opt={})
48
190
  path = Pathname(filename)
49
191
  check_option(opt, [ :as ])
@@ -60,6 +202,23 @@ module SevenZipRuby
60
202
  return self
61
203
  end
62
204
 
205
+ # Add file entry to 7zip archive.
206
+ #
207
+ # ==== Args
208
+ # +data+ :: Data to be added to the 7zip archive.
209
+ # +filename+ :: File name of the entry to be added to the 7zip archive. <tt>filename</tt> must be a <b>relative path</b>.
210
+ # +opt+ :: Optional hash parameter. <tt>:ctime</tt>, <tt>:atime</tt> and <tt>:mtime</tt> keys can be specified as timestamp.
211
+ #
212
+ # ==== Examples
213
+ # File.open("filename.7z", "wb") do |file|
214
+ # SevenZipRuby::SevenZipWriter.open(file) do |szw|
215
+ # data = "1234567890"
216
+ #
217
+ # # Add file entry 'data.bin' in 7zip archive.
218
+ # # This entry has the contents "1234567890".
219
+ # szw.add_data(data, "data.bin")
220
+ # end
221
+ # end
63
222
  def add_data(data, filename, opt={})
64
223
  path = Pathname(filename)
65
224
  raise ArgumentError.new("filename should be relative") if (path.absolute?)
@@ -70,6 +229,22 @@ module SevenZipRuby
70
229
  return self
71
230
  end
72
231
 
232
+ # Add directory and files recursively to 7zip archive.
233
+ #
234
+ # ==== Args
235
+ # +directory+ :: Directory to be added to the 7zip archive. <tt>directory</tt> must be a <b>relative path</b> if <tt>:as</tt> option is not specified.
236
+ # +opt+ :: Optional hash parameter. <tt>:as</tt> key represents directory name used in this archive.
237
+ #
238
+ # ==== Examples
239
+ # File.open("filename.7z", "wb") do |file|
240
+ # SevenZipRuby::SevenZipWriter.open(file) do |szw|
241
+ # # Add "dir1" and entries under "dir" recursively.
242
+ # szw.add_directory("dir1")
243
+ #
244
+ # # Add "C:/Users/test/Desktop/dir" and entries under it recursively.
245
+ # szw.add_directory("C:/Users/test/Desktop/dir", as: "test/dir")
246
+ # end
247
+ # end
73
248
  def add_directory(directory, opt={})
74
249
  directory = Pathname(directory).cleanpath
75
250
  check_option(opt, [ :as ])
@@ -100,8 +275,21 @@ module SevenZipRuby
100
275
 
101
276
  return self
102
277
  end
103
- alias add_dir add_directory
278
+ alias add_dir add_directory # +add_dir+ is an alias of +add_directory+.
104
279
 
280
+ # Add an entry of empty directory to 7zip archive.
281
+ #
282
+ # ==== Args
283
+ # +directory_name+ :: Directory name to be added to 7z archive.
284
+ # +opt+ :: Optional hash parameter. <tt>:ctime</tt>, <tt>:atime</tt> and <tt>:mtime</tt> keys can be specified as timestamp.
285
+ #
286
+ # ==== Examples
287
+ # File.open("filename.7z", "wb") do |file|
288
+ # SevenZipRuby::SevenZipWriter.open(file) do |szw|
289
+ # # Add an empty directory "dir1".
290
+ # szw.mkdir("dir1")
291
+ # end
292
+ # end
105
293
  def mkdir(directory_name, opt={})
106
294
  path = Pathname(directory_name)
107
295
  raise ArgumentError.new("directory_name should be relative") if (path.absolute?)
@@ -113,13 +301,13 @@ module SevenZipRuby
113
301
  end
114
302
 
115
303
 
116
- def check_option(opt, keys)
304
+ def check_option(opt, keys) # :nodoc:
117
305
  invalid_keys = opt.keys - keys
118
306
  raise ArgumentError.new("invalid option: " + invalid_keys.join(", ")) unless (invalid_keys.empty?)
119
307
  end
308
+ private :check_option
120
309
 
121
-
122
- def compress_proc
310
+ def compress_proc # :nodoc:
123
311
  return Proc.new do |type, info|
124
312
  case(type)
125
313
  when :stream
@@ -139,5 +327,6 @@ module SevenZipRuby
139
327
  end
140
328
 
141
329
 
330
+ # +Writer+ is an alias of +SevenZipWriter+.
142
331
  Writer = SevenZipWriter
143
332
  end
@@ -1,3 +1,3 @@
1
1
  module SevenZipRuby
2
- VERSION = "1.0.0"
2
+ VERSION = "1.1.0"
3
3
  end
@@ -158,6 +158,16 @@ describe SevenZipRuby do
158
158
  end
159
159
  end
160
160
 
161
+ example "invalid password" do
162
+ File.open(SevenZipRubySpecHelper::SEVEN_ZIP_PASSWORD_FILE, "rb") do |file|
163
+ expect{ SevenZipRuby::Reader.open(file){ |szr| szr.extract_data(1) } }.to raise_error
164
+ end
165
+
166
+ File.open(SevenZipRubySpecHelper::SEVEN_ZIP_PASSWORD_FILE, "rb") do |file|
167
+ expect{ SevenZipRuby::Reader.open(file, password: "a"){ |szr| szr.extract_data(1) } }.to raise_error
168
+ end
169
+ end
170
+
161
171
  example "raise error in open" do
162
172
  error = StandardError.new
163
173
 
@@ -265,6 +275,7 @@ describe SevenZipRuby do
265
275
  szw.add_data("This is hoge.txt content.", "hoge.txt")
266
276
  szw.add_data("This is hoge2.txt content.", "hoge2.txt")
267
277
  szw.mkdir("hoge/hoge/hoge")
278
+ szw.compress
268
279
  end
269
280
  end
270
281
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: seven_zip_ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.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: 2013-11-30 00:00:00.000000000 Z
11
+ date: 2013-12-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -811,7 +811,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
811
811
  version: '0'
812
812
  requirements: []
813
813
  rubyforge_project:
814
- rubygems_version: 2.0.2
814
+ rubygems_version: 2.0.3
815
815
  signing_key:
816
816
  specification_version: 4
817
817
  summary: This is a gem library to read and write 7-Zip files.