multi_zip 0.1.3 → 0.1.4

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: 1e4e927a532bd99e7fc59c1a6f84da9bb8369694
4
- data.tar.gz: 753a83ee20f222d33b04e29f4edd131062976ada
3
+ metadata.gz: b4d9becd80958a0eb07dab22a0207dfcb91ebe00
4
+ data.tar.gz: eb1092f782ab4fc2e6933eb5a36b84036bf9cfca
5
5
  SHA512:
6
- metadata.gz: 11ba062b2125374d543c50f05c48045d51e5b62fc01ed0f8348a26a1b65159b9f40fa2702ad61600a07e3a75fab5fdbaf11815b4cf595edaf87984ab7dd8ee2b
7
- data.tar.gz: 3a261d116078bc97320ff789ef2eeb7052dfe1d407c911036a462069535fb9a713420b65bb148c75c4f9644d0d0a66ff394360d066b2e102590c10f5255a5f78
6
+ metadata.gz: 9a6eca1072c53f5266e9e8afdee331b7df518df68ebceb5a10b9120fc9041e3710552fdcd557eba80ed51ec95692864b2724cf11f64afa0f5986fc1883412e7d
7
+ data.tar.gz: e90c64a98a10a98dcedda42f190d1551a507f83166d3ea5612f0996e6a47e8d7b9a8d087998caeee975d8b146c3984bdf3e2f848fe5d9723549bf5ca2e43c7f2
data/.gitignore CHANGED
@@ -14,3 +14,4 @@
14
14
  mkmf.log
15
15
  .ruby-*
16
16
  *.gem
17
+ test_in_all_rubies.sh
data/.travis.yml CHANGED
@@ -1,12 +1,12 @@
1
1
  language: ruby
2
2
  rvm:
3
- - ruby-head
4
3
  - ree
5
4
  - 1.8.7
6
5
  - 1.9.3
7
6
  - 2.0.0
8
- - 2.1.5
9
- - 2.2.1
7
+ - 2.1.8
8
+ - 2.2.4
9
+ - 2.3.0
10
10
  - jruby-18mode
11
11
  - jruby-19mode
12
12
  - rbx-2
@@ -15,3 +15,4 @@ matrix:
15
15
  - rvm:
16
16
  - ruby-head
17
17
  - rbx-2
18
+ sudo: false
data/Gemfile CHANGED
@@ -4,8 +4,7 @@ gemspec
4
4
 
5
5
  # can't use pry on old rubies or on rubinius
6
6
  if RUBY_VERSION.to_f >= 2.0 && RUBY_ENGINE == 'ruby'
7
- gem 'pry', :require => false
8
- gem 'pry-byebug', :require => false
7
+ gem 'byebug', :require => false
9
8
  gem 'guard-rspec', :require => false
10
9
  end
11
10
 
data/Guardfile CHANGED
@@ -1,43 +1,7 @@
1
- # A sample Guardfile
2
- # More info at https://github.com/guard/guard#readme
3
-
4
- ## Uncomment and set this to only include directories you want to watch
5
- # directories %w(app lib config test spec features)
6
-
7
- ## Uncomment to clear the screen before every task
8
- # clearing :on
9
-
10
- ## Guard internally checks for changes in the Guardfile and exits.
11
- ## If you want Guard to automatically start up again, run guard in a
12
- ## shell loop, e.g.:
13
- ##
14
- ## $ while bundle exec guard; do echo "Restarting Guard..."; done
15
- ##
16
- ## Note: if you are using the `directories` clause above and you are not
17
- ## watching the project directory ('.'), then you will want to move
18
- ## the Guardfile to a watched dir and symlink it back, e.g.
19
- #
20
- # $ mkdir config
21
- # $ mv Guardfile config/
22
- # $ ln -s config/Guardfile .
23
- #
24
- # and, you'll have to watch "config/Guardfile" instead of "Guardfile"
25
-
26
- # Note: The cmd option is now required due to the increasing number of ways
27
- # rspec may be run, below are examples of the most common uses.
28
- # * bundler: 'bundle exec rspec'
29
- # * bundler binstubs: 'bin/rspec'
30
- # * spring: 'bin/rspec' (This will use spring if running and you have
31
- # installed the spring binstubs per the docs)
32
- # * zeus: 'zeus rspec' (requires the server to be started separately)
33
- # * 'just' rspec: 'rspec'
34
-
35
1
  guard :rspec, cmd: "bundle exec rspec" do
36
2
  require "guard/rspec/dsl"
37
3
  dsl = Guard::RSpec::Dsl.new(self)
38
4
 
39
- # Feel free to open issues for suggestions and improvements
40
-
41
5
  # RSpec files
42
6
  rspec = dsl.rspec
43
7
  watch(rspec.spec_helper) { rspec.spec_dir }
@@ -47,31 +11,4 @@ guard :rspec, cmd: "bundle exec rspec" do
47
11
  # Ruby files
48
12
  ruby = dsl.ruby
49
13
  dsl.watch_spec_files_for(ruby.lib_files)
50
-
51
- # Rails files
52
- rails = dsl.rails(view_extensions: %w(erb haml slim))
53
- dsl.watch_spec_files_for(rails.app_files)
54
- dsl.watch_spec_files_for(rails.views)
55
-
56
- watch(rails.controllers) do |m|
57
- [
58
- rspec.spec.("routing/#{m[1]}_routing"),
59
- rspec.spec.("controllers/#{m[1]}_controller"),
60
- rspec.spec.("acceptance/#{m[1]}")
61
- ]
62
- end
63
-
64
- # Rails config changes
65
- watch(rails.spec_helper) { rspec.spec_dir }
66
- watch(rails.routes) { "#{rspec.spec_dir}/routing" }
67
- watch(rails.app_controller) { "#{rspec.spec_dir}/controllers" }
68
-
69
- # Capybara features specs
70
- watch(rails.view_dirs) { |m| rspec.spec.("features/#{m[1]}") }
71
-
72
- # Turnip features and steps
73
- watch(%r{^spec/acceptance/(.+)\.feature$})
74
- watch(%r{^spec/acceptance/steps/(.+)_steps\.rb$}) do |m|
75
- Dir[File.join("**/#{m[1]}.feature")][0] || "spec/acceptance"
76
- end
77
14
  end
data/README.md CHANGED
@@ -12,8 +12,8 @@ It currently supports `.zip` archives only. See TODO for info on others.
12
12
  MultiZip provides a very small and focused set of functions:
13
13
 
14
14
  * Create a new zip archive or open existing one.
15
- * Add files to a archive from using content from a variable.
16
- * Read files from a archive in to a variable.
15
+ * Add files to an archive from a file a variable.
16
+ * Read files from an archive in to a variable.
17
17
  * Extract files from an archive to a local file.
18
18
  * List files contained in an archive.
19
19
  * Delete files from an archive.
@@ -43,7 +43,8 @@ Do the standard dance: Either add `gem 'multi_zip'` to your Gemfile or run
43
43
  `gem install multi_zip`.
44
44
 
45
45
  __IMPORTANT NEXT STEP:__ You will also need a zip backend gem installed and
46
- required. See `Supported Backends` for of which ones can be used.
46
+ required. See [Supported Backend Gems](#supported-backend-gems) for a list of
47
+ which ones can be used.
47
48
 
48
49
  ## Getting started
49
50
 
@@ -81,13 +82,13 @@ You can also check which of these supported backends is currently available:
81
82
 
82
83
  ```ruby
83
84
  > MultiZip.available_backends
84
- => []
85
+ => []
85
86
  > require 'archive/zip'
86
- => true
87
+ => true
87
88
  > MultiZip.available_backends
88
- => [:archive_zip]
89
+ => [:archive_zip]
89
90
  > require 'zip'
90
- => true
91
+ => true
91
92
  > MultiZip.available_backends
92
93
  => [:rubyzip, :archive_zip]
93
94
  ```
@@ -162,7 +163,7 @@ file = zip.remove_members([
162
163
  # => true
163
164
  ```
164
165
 
165
- #### Creating a new instance and passing a block
166
+ #### Creating a new instance and passing a block
166
167
 
167
168
  `.new` can accept a block:
168
169
 
@@ -212,7 +213,7 @@ This behaviour is likely to change in future versions; see the below section
212
213
  that talks about the `#close` method for more information.
213
214
 
214
215
  #### `#close` method is currently a non-op
215
-
216
+
216
217
  You'll notice that there is a `#close` method, but you may not know that it
217
218
  doesn't yet do anything since the underlying archive is not kept open between
218
219
  method calls.
@@ -220,69 +221,16 @@ method calls.
220
221
  However, you should still use `#close` where appropriate since this
221
222
  behaviour is likely to change in the future.
222
223
 
223
- #### Support for other Rubies
224
-
225
- Supporting MRI, Jruby and Rubinius covers 95% of the production-ruby market.
226
- However, In the future I plan on **trying** to support:
227
-
228
- * maglev
229
- * ironruby
230
- * macruby
231
-
232
- The current travis-ci configuration only tests on Linux. Adding macruby
233
- support also means testing on OS X. I would like to one-day test with MRI, Ironruby and Jruby on Windows.
224
+ #### Backend support on platforms
234
225
 
235
226
  MultiZip is written in pure ruby and so it should be able to run on any
236
227
  runtime that is compatible with MRI 1.8.7; however, the backend gems it uses
237
228
  may or may not work on every platform -- which is one of the reasons this
238
- gem exists in the first place! One day I would like to support backend gems
239
- that are specific to Jruby/Java and Windows.
240
-
229
+ gem exists in the first place!
230
+
241
231
  ## TODO
242
232
 
243
- Most important things, in order of importance:
244
-
245
- * #add_member: add file to archive from filesystem (new method).
246
- * Document exceptions raised, what they mean and how to use them.
247
- * Add inline docs for methods.
248
- * support *nix zip(1L)/unzip(1L) without needing backend gem (with warning).
249
-
250
- Other things that need to be done, in no particular order:
251
-
252
- * Add support for more backends.
253
- * Support for backend gems to process other formats (gzip, bzip2, 7zip, tar, etc).
254
- * Keep the backend archive open between method calls.
255
- * Add soak tests for memory usage once archived are kept open.
256
- * Ensure #close is executed when MultiZip instance goes out of scope.
257
- * Option to overwrite and existing archive instead of adding to it.
258
- * #extract_member: extract file to path using original member name.
259
- * #write_member: support for reading from IO streams.
260
- * test with different majour versions of current supported backends.
261
- * Standardize Exception classes and when to raise them.
262
- * #read_*, #extract_* and #write_* methods should accept a block.
263
- * #extract_members: extract multiple files with one command (new method).
264
- * #write_member: add entire directory (recursively or not) to archive.
265
- * #write_members: add multiple files by wildcard (new method).
266
- * #add_members: add multiple files to archive from filesystem (new method).
267
- * #remove_members: remove multiple member files from the archive (new_method).
268
- * #read_members: read multiple files wildcard.
269
- * #read_members: read multiple files via prefix as #list_members does.
270
- * #extract_members: extract multiple files via prefix as #list_members does (new method).
271
- * #extract_members: extract multiple files wildcard (new method).
272
- * #member_info: return information (name, size, etc) about member (new method).
273
- * #read_member_stream: return member as IO Stream to keeping large amounts of data in memory (new method).
274
- * Write guide to show others how they can add their own backends gems.
275
- * #member_type: return the type of the member (new method).
276
- * #member_exists?: accept an argument to specify the file type (file, dir, symlink, etc).
277
- * Soak-test each backend to find memory leaks.
278
-
279
- Things that I'd **like** to do, but that are probably not realistic because
280
- they cannot be sufficiently abstracted across all backend gems:
281
-
282
- * Ability to set location and compression format and level of archive.
283
- * Ability to set compression format and level of individual members (for Epub compatibility).
284
- * Ability to set archive location of individual members (for Epub compatibility).
285
- * Support creating, reading from and writing to password-protected or encrypted archives.
233
+ See [TODO.md](TODO.md).
286
234
 
287
235
  ## Contributing
288
236
 
data/TODO.md ADDED
@@ -0,0 +1,49 @@
1
+ ## MultiZip TODO
2
+
3
+ #### Most important things, in order of importance:
4
+
5
+ * #add_member: add file to archive from filesystem (new method).
6
+ * Document exceptions raised, what they mean and how to use them.
7
+ * Add inline docs for methods.
8
+ * support *nix zip(1L)/unzip(1L) without needing backend gem (with warning).
9
+
10
+ #### Other things that need to be done, in no particular order:
11
+
12
+ * Add support for more backends.
13
+ * Support for backend gems to process other formats (gzip, bzip2, 7zip, tar, etc).
14
+ * Keep the backend archive open between method calls.
15
+ * Add soak tests for memory usage once archived are kept open.
16
+ * Ensure #close is executed when MultiZip instance goes out of scope.
17
+ * Option to overwrite and existing archive instead of adding to it.
18
+ * #extract_member: extract file to path using original member name.
19
+ * #write_member: support for reading from IO streams.
20
+ * test with different majour versions of current supported backends.
21
+ * Standardize Exception classes and when to raise them.
22
+ * #read_*, #extract_* and #write_* methods should accept a block.
23
+ * #extract_members: extract multiple files with one command (new method).
24
+ * #write_member: add entire directory (recursively or not) to archive.
25
+ * #write_members: add multiple files by wildcard (new method).
26
+ * #add_members: add multiple files to archive from filesystem (new method).
27
+ * #remove_members: remove multiple member files from the archive (new_method).
28
+ * #read_members: read multiple files wildcard.
29
+ * #read_members: read multiple files via prefix as #list_members does.
30
+ * #extract_members: extract multiple files via prefix as #list_members does (new method).
31
+ * #extract_members: extract multiple files wildcard (new method).
32
+ * #member_info: return information (name, size, etc) about member (new method).
33
+ * #read_member_stream: return member as IO Stream to keeping large amounts of data in memory (new method).
34
+ * Write guide to show others how they can add their own backends gems.
35
+ * #member_type: return the type of the member (new method).
36
+ * #member_exists?: accept an argument to specify the file type (file, dir, symlink, etc).
37
+ * Soak-test each backend to find memory leaks.
38
+
39
+ #### Things that I'd **like** to do, but won't.
40
+
41
+ These are thinks that would be really nice to have but that are probably not
42
+ realistic because they cannot be abstracted across all backend gems:
43
+
44
+ * Ability to set location and compression format and level of archive.
45
+ * Ability to set compression format and level of individual members (for Epub compatibility).
46
+ * Ability to set archive location of individual members (for Epub compatibility).
47
+ * Support creating, reading from and writing to password-protected or encrypted archives.
48
+ * Support MagLev, IronRuby and MacRuby.
49
+ * Support Windows.
@@ -1,7 +1,29 @@
1
1
  class MultiZip
2
- class BaseError < RuntimeError; end
3
-
4
- class NoSupportedBackendError < BaseError; end
2
+ class BaseError < RuntimeError;
3
+ def to_s
4
+ if respond_to?(:message)
5
+ message
6
+ else
7
+ super
8
+ end
9
+ end
10
+ end
11
+
12
+ class NoSupportedBackendError < BaseError;
13
+ def message
14
+ "No supported backend found. Supported backends are #{MultiZip::BACKENDS.map(&:first).map(&:to_s).sort.join(', ')}"
15
+ end
16
+ end
17
+
18
+ class InvalidBackendError < BaseError;
19
+ attr_reader :requested_backend
20
+ def initialize(requested_backend)
21
+ @requested_backend = requested_backend
22
+ end
23
+ def message
24
+ "The requested backend \"#{@requested_backend}\" was not found. Supported backends are #{MultiZip::BACKENDS.map(&:first).map(&:to_s).sort.join(', ')}"
25
+ end
26
+ end
5
27
 
6
28
  class ArchiveError < BaseError
7
29
  attr_reader :archive_filename, :original_exception
@@ -26,10 +48,11 @@ class MultiZip
26
48
  def initialize(member_path)
27
49
  @member_path = member_path
28
50
  end
51
+ end
52
+
53
+ class MemberNotFoundError < MemberError
29
54
  def message
30
55
  "Member \"#{@member_path}\" not found."
31
56
  end
32
57
  end
33
-
34
- class MemberNotFoundError < MemberError; end
35
- end
58
+ end
@@ -1,3 +1,3 @@
1
1
  class MultiZip
2
- VERSION = "0.1.3"
2
+ VERSION = "0.1.4"
3
3
  end
data/lib/multi_zip.rb CHANGED
@@ -53,7 +53,7 @@ class MultiZip
53
53
  extend BACKENDS[@backend][:constant].call
54
54
  return @backend
55
55
  else
56
- raise NoSupportedBackendError, "Not a supported backend. Supported backends are #{BACKENDS.map(&:first).map(&:to_s).sort.join(', ')}"
56
+ raise InvalidBackendError.new(backend_name)
57
57
  end
58
58
  end
59
59
 
@@ -187,7 +187,7 @@ private
187
187
  return name
188
188
  end
189
189
  end
190
- raise NoSupportedBackendError, "No supported backend found: #{BACKEND_PREFERENCE.join(', ')}"
190
+ raise NoSupportedBackendError
191
191
  end
192
192
  end
193
193
 
data/multi_zip.gemspec CHANGED
@@ -19,6 +19,14 @@ Gem::Specification.new do |spec|
19
19
  spec.require_paths = ["lib"]
20
20
 
21
21
  spec.add_development_dependency "bundler"
22
- spec.add_development_dependency "rake"
23
- spec.add_development_dependency "rspec", "~> 3.1.0"
22
+ if RUBY_VERSION < '1.9'
23
+ # ruby 1.8.7 or ree
24
+ spec.add_development_dependency "rake", '10.1.1'
25
+ elsif RUBY_VERSION >= '1.9' && RUBY_VERSION < '2.0'
26
+ # 1.9.x
27
+ spec.add_development_dependency "rake", '11.1.2'
28
+ else
29
+ spec.add_development_dependency "rake"
30
+ end
31
+ spec.add_development_dependency "rspec", "~> 3.4.0"
24
32
  end
@@ -1,15 +1,15 @@
1
1
  shared_examples 'zip backend' do |backend_name|
2
- let(:filename) { archive_fixture_filename }
3
- subject { MultiZip.new(filename, :backend => backend_name) }
2
+ context "backend: #{backend_name}" do
3
+ let(:filename) { archive_fixture_filename }
4
+ subject { MultiZip.new(filename, :backend => backend_name) }
4
5
 
5
- before do
6
- apply_constants(backend_name)
7
- # subject.backend = backend_name
8
- end
9
- after { stash_constants(backend_name) }
6
+ before do
7
+ apply_constants(backend_name)
8
+ # subject.backend = backend_name
9
+ end
10
+ after { stash_constants(backend_name) }
10
11
 
11
- describe '#read_member' do
12
- context "backend: #{backend_name}" do
12
+ describe '#read_member' do
13
13
  context 'member found' do
14
14
  archive_member_files.each do |member_file|
15
15
  it "returns '#{member_file}' as a string" do
@@ -30,13 +30,9 @@ shared_examples 'zip backend' do |backend_name|
30
30
  it_behaves_like 'raises MemberNotFoundError', :read_member, archive_member_directories.first
31
31
  end
32
32
 
33
- context 'archive not found' do
34
- it_behaves_like 'raises ArchiveNotFoundError', :read_member, archive_member_files.first
35
- end
33
+ it_behaves_like 'archive not found, raises ArchiveNotFoundError', :read_member, archive_member_files.first
36
34
 
37
- context 'archive is not a file' do
38
- it 'raises ArchiveNotFoundError'
39
- end
35
+ it_behaves_like 'archive is not a file, raises ArchiveNotFoundError', :read_member, archive_member_files.first
40
36
 
41
37
  context 'archive cannot be accessed due to permissions' do
42
38
  it 'raises ArchiveNotAccessibleError'
@@ -46,10 +42,8 @@ shared_examples 'zip backend' do |backend_name|
46
42
  it_behaves_like 'raises InvalidArchiveError', :read_member, archive_member_files.first
47
43
  end
48
44
  end
49
- end
50
45
 
51
- describe '#read_members' do
52
- context "backend: #{backend_name}" do
46
+ describe '#read_members' do
53
47
  context 'all members found' do
54
48
  it 'returns the member content as an array a string in order of args' do
55
49
  extracted_files = subject.read_members(archive_member_files)
@@ -70,13 +64,9 @@ shared_examples 'zip backend' do |backend_name|
70
64
  [ archive_member_files.first, 'doesnt_exist' ]
71
65
  end
72
66
 
73
- context 'archive not found' do
74
- it_behaves_like 'raises ArchiveNotFoundError', :read_members, archive_member_files
75
- end
67
+ it_behaves_like 'archive not found, raises ArchiveNotFoundError', :read_members, archive_member_files
76
68
 
77
- context 'archive is not a file' do
78
- it 'raises ArchiveNotFoundError'
79
- end
69
+ it_behaves_like 'archive is not a file, raises ArchiveNotFoundError', :read_members, archive_member_files
80
70
 
81
71
  context 'archive cannot be accessed due to permissions' do
82
72
  it 'raises ArchiveNotAccessibleError'
@@ -87,10 +77,8 @@ shared_examples 'zip backend' do |backend_name|
87
77
  [ archive_member_files.first, archive_member_directories.first ]
88
78
  end
89
79
  end
90
- end
91
80
 
92
- describe '#extract_member' do
93
- context "backend: #{backend_name}" do
81
+ describe '#extract_member' do
94
82
  let(:tempfile) { Tempfile.new('multi_zip_test') }
95
83
 
96
84
  context 'member found' do
@@ -121,13 +109,9 @@ shared_examples 'zip backend' do |backend_name|
121
109
  end
122
110
  end
123
111
 
124
- context 'archive not found' do
125
- it_behaves_like 'raises ArchiveNotFoundError', :extract_member, archive_member_files.first, 'destination'
126
- end
112
+ it_behaves_like 'archive not found, raises ArchiveNotFoundError', :extract_member, archive_member_files.first, 'destination'
127
113
 
128
- context 'archive is not a file' do
129
- it 'raises ArchiveNotFoundError'
130
- end
114
+ it_behaves_like 'archive is not a file, raises ArchiveNotFoundError', :extract_member, archive_member_files.first, 'destination'
131
115
 
132
116
  context 'archive cannot be accessed due to permissions' do
133
117
  it 'raises ArchiveNotAccessibleError'
@@ -142,10 +126,8 @@ shared_examples 'zip backend' do |backend_name|
142
126
  end
143
127
  end
144
128
  end
145
- end
146
129
 
147
- describe '#list_members' do
148
- context "backend: #{backend_name}" do
130
+ describe '#list_members' do
149
131
  context 'file contains members' do
150
132
  it 'returns array member file names' do
151
133
  expect(subject.list_members).to eq(archive_member_names)
@@ -169,16 +151,15 @@ shared_examples 'zip backend' do |backend_name|
169
151
  end
170
152
 
171
153
  context 'contains no members, is empty archive' do
172
- it 'returns empty array'
154
+ let(:filename) { empty_archive_fixture_filename }
155
+ it 'returns empty array' do
156
+ expect(subject.list_members).to eq( [ ] )
157
+ end
173
158
  end
174
159
 
175
- context 'archive not found' do
176
- it_behaves_like 'raises ArchiveNotFoundError', :list_members
177
- end
160
+ it_behaves_like 'archive not found, raises ArchiveNotFoundError', :list_members
178
161
 
179
- context 'archive is not a file' do
180
- it 'raises ArchiveNotFoundError'
181
- end
162
+ it_behaves_like 'archive is not a file, raises ArchiveNotFoundError', :list_members
182
163
 
183
164
  context 'archive cannot be accessed due to permissions' do
184
165
  it 'raises ArchiveNotAccessibleError'
@@ -188,10 +169,8 @@ shared_examples 'zip backend' do |backend_name|
188
169
  it_behaves_like 'raises InvalidArchiveError', :list_members
189
170
  end
190
171
  end
191
- end
192
172
 
193
- describe '#member_exists?' do
194
- context "backend: #{backend_name}" do
173
+ describe '#member_exists?' do
195
174
  context 'member is a file' do
196
175
  it 'returns true if member exists' do
197
176
  expect(subject.member_exists?(archive_member_files.first)).to be_truthy
@@ -208,13 +187,9 @@ shared_examples 'zip backend' do |backend_name|
208
187
  expect(subject.member_exists?('does_not_exist')).to be_falsey
209
188
  end
210
189
 
211
- context 'archive not found' do
212
- it_behaves_like 'raises ArchiveNotFoundError', :member_exists?, archive_member_files.first
213
- end
190
+ it_behaves_like 'archive not found, raises ArchiveNotFoundError', :member_exists?, archive_member_files.first
214
191
 
215
- context 'archive is not a file' do
216
- it 'raises ArchiveNotFoundError'
217
- end
192
+ it_behaves_like 'archive is not a file, raises ArchiveNotFoundError', :member_exists?, archive_member_files.first
218
193
 
219
194
  context 'archive cannot be accessed due to permissions' do
220
195
  it 'raises ArchiveNotAccessibleError'
@@ -224,10 +199,8 @@ shared_examples 'zip backend' do |backend_name|
224
199
  it_behaves_like 'raises InvalidArchiveError', :member_exists?, archive_member_files.first
225
200
  end
226
201
  end
227
- end
228
202
 
229
- describe '#write_member' do
230
- context "backend: #{backend_name}" do
203
+ describe '#write_member' do
231
204
  after { FileUtils.rm(filename) if File.exists?(filename) }
232
205
 
233
206
  let(:filename) { "/tmp/multizip_test.zip" }
@@ -236,7 +209,7 @@ shared_examples 'zip backend' do |backend_name|
236
209
 
237
210
  context 'archive did not exist' do
238
211
  before { expect(File.exists?(filename)).to be_falsey }
239
-
212
+
240
213
  let!(:result) do
241
214
  subject.write_member(member_file_name, member_file_contents)
242
215
  end
@@ -331,10 +304,8 @@ shared_examples 'zip backend' do |backend_name|
331
304
  it 'raises ArchiveInvalidError'
332
305
  end
333
306
  end
334
- end
335
307
 
336
- describe '#remove_member' do
337
- context "backend: #{backend_name}" do
308
+ describe '#remove_member' do
338
309
  subject { MultiZip.new(temp_filename, :backend => backend_name) }
339
310
 
340
311
  let(:temp_filename) { "/tmp/multizip_test.zip" }
@@ -351,7 +322,7 @@ shared_examples 'zip backend' do |backend_name|
351
322
  MultiZip.new(temp_filename).member_exists?(member_file_name)
352
323
  ).to be_truthy
353
324
  end
354
-
325
+
355
326
  let!(:result) do
356
327
  subject.remove_member(member_file_name)
357
328
  end
@@ -379,9 +350,7 @@ shared_examples 'zip backend' do |backend_name|
379
350
  end
380
351
  end
381
352
 
382
- context 'archive not found' do
383
- it_behaves_like 'raises ArchiveNotFoundError', :remove_member, archive_member_files.first
384
- end
353
+ it_behaves_like 'archive not found, raises ArchiveNotFoundError', :remove_member, archive_member_files.first
385
354
 
386
355
  context 'archive is not a file' do
387
356
  it 'raises ArchiveNotFoundError'
@@ -395,10 +364,8 @@ shared_examples 'zip backend' do |backend_name|
395
364
  it 'raises ArchiveInvalidError'
396
365
  end
397
366
  end
398
- end
399
367
 
400
- describe '#remove_members' do
401
- context "backend: #{backend_name}" do
368
+ describe '#remove_members' do
402
369
  subject { MultiZip.new(temp_filename, :backend => backend_name) }
403
370
 
404
371
  let(:temp_filename) { "/tmp/multizip_test.zip" }
@@ -417,7 +384,7 @@ shared_examples 'zip backend' do |backend_name|
417
384
  ).to be_truthy
418
385
  end
419
386
  end
420
-
387
+
421
388
  let!(:result) do
422
389
  subject.remove_members(member_file_names)
423
390
  end
@@ -447,9 +414,7 @@ shared_examples 'zip backend' do |backend_name|
447
414
  end
448
415
  end
449
416
 
450
- context 'archive not found' do
451
- it_behaves_like 'raises ArchiveNotFoundError', :remove_members, archive_member_files
452
- end
417
+ it_behaves_like 'archive not found, raises ArchiveNotFoundError', :remove_members, archive_member_files
453
418
 
454
419
  context 'archive is not a file' do
455
420
  it 'raises ArchiveNotFoundError'
@@ -463,7 +428,7 @@ shared_examples 'zip backend' do |backend_name|
463
428
  it 'raises ArchiveInvalidError'
464
429
  end
465
430
  end
466
- end
431
+ end
467
432
  end
468
433
 
469
434
  shared_examples 'raises MemberNotFoundError' do |*args|
@@ -480,8 +445,22 @@ shared_examples 'raises InvalidArchiveError' do |*args|
480
445
  end
481
446
 
482
447
  shared_examples 'raises ArchiveNotFoundError' do |*args|
483
- let(:filename) { 'doesnt_exist' }
484
448
  it 'raises ArchiveNotFoundError' do
485
449
  expect(lambda{ subject.send(args.shift, *args) }).to raise_error(MultiZip::ArchiveNotFoundError)
486
450
  end
487
451
  end
452
+
453
+ shared_examples 'archive not found, raises ArchiveNotFoundError' do |*args|
454
+ context 'archive not found' do
455
+ let(:filename) { 'doesnt_exist' }
456
+ it_behaves_like 'raises ArchiveNotFoundError', *args
457
+ end
458
+ end
459
+
460
+ shared_examples 'archive is not a file, raises ArchiveNotFoundError' do |*args|
461
+ context 'archive is not a file' do
462
+ let(:filename) { not_an_archive_fixture_filename }
463
+ it_behaves_like 'raises ArchiveNotFoundError', *args
464
+ end
465
+ end
466
+
Binary file
File without changes
data/spec/spec_helper.rb CHANGED
@@ -2,8 +2,7 @@ require 'multi_zip'
2
2
 
3
3
  # can't use pry on old rubies or on rubinius
4
4
  if RUBY_VERSION.to_f >= 2.0 && RUBY_ENGINE == 'ruby'
5
- require 'pry'
6
- require 'pry-byebug'
5
+ require 'byebug'
7
6
  end
8
7
 
9
8
  RSpec.configure do |config|
@@ -29,12 +28,24 @@ RSpec.configure do |config|
29
28
  Kernel.srand config.seed
30
29
  end
31
30
 
31
+ def fixture_path(file)
32
+ ['spec/fixtures/', file].join
33
+ end
34
+
32
35
  def invalid_archive_fixture_filename
33
- 'spec/fixtures/invalid.zip'
36
+ fixture_path('invalid.zip')
34
37
  end
35
38
 
36
39
  def archive_fixture_filename
37
- 'spec/fixtures/test.zip'
40
+ fixture_path('test.zip')
41
+ end
42
+
43
+ def not_an_archive_fixture_filename
44
+ fixture_path('test')
45
+ end
46
+
47
+ def empty_archive_fixture_filename
48
+ fixture_path('empty.zip')
38
49
  end
39
50
 
40
51
  def archive_members
@@ -72,7 +83,7 @@ def test_with_rubyzip?
72
83
  end
73
84
  false
74
85
  rescue Gem::LoadError
75
- false
86
+ false
76
87
  end
77
88
 
78
89
  def test_with_zipruby?
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: multi_zip
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matthew Nielsen
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-04-27 00:00:00.000000000 Z
11
+ date: 2016-04-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -44,14 +44,14 @@ dependencies:
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: 3.1.0
47
+ version: 3.4.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
- version: 3.1.0
54
+ version: 3.4.0
55
55
  description: Abstracts zipping and unzipping using whatever gems are installed using
56
56
  one consistent API. Provides swappable zipping/unzipping backends so you're not
57
57
  tied to just one gem. Supports rubyzip, archive-zip, zipruby and others.
@@ -70,6 +70,7 @@ files:
70
70
  - LICENSE.txt
71
71
  - README.md
72
72
  - Rakefile
73
+ - TODO.md
73
74
  - lib/multi_zip.rb
74
75
  - lib/multi_zip/backend/archive_zip.rb
75
76
  - lib/multi_zip/backend/rubyzip.rb
@@ -78,8 +79,10 @@ files:
78
79
  - lib/multi_zip/version.rb
79
80
  - multi_zip.gemspec
80
81
  - spec/backend_shared_example.rb
82
+ - spec/fixtures/empty.zip
81
83
  - spec/fixtures/invalid.zip
82
84
  - spec/fixtures/test.zip
85
+ - spec/fixtures/test/.gitkeep
83
86
  - spec/lib/multi_zip/backend/archive_zip_spec.rb
84
87
  - spec/lib/multi_zip/backend/rubyzip_spec.rb
85
88
  - spec/lib/multi_zip/backend/zipruby_spec.rb
@@ -111,8 +114,10 @@ specification_version: 4
111
114
  summary: Abstracts zipping and unzipping using whatever gems are installed, automatically.
112
115
  test_files:
113
116
  - spec/backend_shared_example.rb
117
+ - spec/fixtures/empty.zip
114
118
  - spec/fixtures/invalid.zip
115
119
  - spec/fixtures/test.zip
120
+ - spec/fixtures/test/.gitkeep
116
121
  - spec/lib/multi_zip/backend/archive_zip_spec.rb
117
122
  - spec/lib/multi_zip/backend/rubyzip_spec.rb
118
123
  - spec/lib/multi_zip/backend/zipruby_spec.rb