zip-container 4.0.2 → 5.0.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2013, 2014 The University of Manchester, UK.
1
+ # Copyright (c) 2013-2024 The University of Manchester, UK.
2
2
  #
3
3
  # All rights reserved.
4
4
  #
@@ -30,10 +30,13 @@
30
30
  #
31
31
  # Author: Robert Haines
32
32
 
33
+ require_relative 'container'
34
+ require_relative 'errors'
35
+
36
+ require 'zip/filesystem'
33
37
  require 'forwardable'
34
38
 
35
39
  module ZipContainer
36
-
37
40
  # This class represents a ZipContainer file in PK Zip format. See the
38
41
  # {OCF}[http://www.idpf.org/epub/30/spec/epub30-ocf.html] and
39
42
  # {UCF}[https://learn.adobe.com/wiki/display/PDFNAV/Universal+Container+Format]
@@ -46,7 +49,6 @@ module ZipContainer
46
49
  #
47
50
  # There are code examples available with the source code of this library.
48
51
  class File < Container
49
-
50
52
  extend Forwardable
51
53
  def_delegators :@container, :comment, :comment=, :commit_required?, :each,
52
54
  :entries, :extract, :get_input_stream, :name, :read, :size
@@ -104,7 +106,7 @@ module ZipContainer
104
106
  def self.each_entry(filename, &block)
105
107
  c = new(filename)
106
108
 
107
- if block_given?
109
+ if block
108
110
  begin
109
111
  c.each(&block)
110
112
  ensure
@@ -138,12 +140,14 @@ module ZipContainer
138
140
  # close -> boolean
139
141
  #
140
142
  # Commits changes that have been made since the previous commit to the
141
- # ZipContainer file. Returns +true+ if anything was actually done, +false+
143
+ # ZipContainer file. Returns +false+ if no commit was required, +true+
142
144
  # otherwise.
143
145
  def commit
144
146
  return false unless commit_required?
145
147
 
146
148
  @container.commit if on_disk?
149
+
150
+ true
147
151
  end
148
152
 
149
153
  alias close commit
@@ -182,9 +186,7 @@ module ZipContainer
182
186
  def find_entry(entry_name, options = {})
183
187
  options = { include_hidden: false }.merge(options)
184
188
 
185
- unless options[:include_hidden]
186
- return if hidden_entry?(entry_name)
187
- end
189
+ return if !options[:include_hidden] && hidden_entry?(entry_name)
188
190
 
189
191
  @container.find_entry(entry_name)
190
192
  end
@@ -199,9 +201,7 @@ module ZipContainer
199
201
  def get_entry(entry, options = {})
200
202
  options = { include_hidden: false }.merge(options)
201
203
 
202
- unless options[:include_hidden]
203
- raise Errno::ENOENT, entry if hidden_entry?(entry)
204
- end
204
+ raise Errno::ENOENT, entry if !options[:include_hidden] && hidden_entry?(entry)
205
205
 
206
206
  @container.get_entry(entry)
207
207
  end
@@ -238,7 +238,7 @@ module ZipContainer
238
238
  # <tt>::File::FNM_PATHNAME | ::File::FNM_DOTMATCH</tt>
239
239
  # * +options+ - <tt>:include_hidden => true</tt> will include hidden
240
240
  # entries in the search.
241
- def glob(pattern, *params)
241
+ def glob(pattern, *params) # rubocop:disable Metrics/CyclomaticComplexity
242
242
  flags = ::File::FNM_PATHNAME | ::File::FNM_DOTMATCH
243
243
  options = { include_hidden: false }
244
244
 
@@ -251,13 +251,13 @@ module ZipContainer
251
251
  end
252
252
  end
253
253
 
254
- entries.map do |entry|
254
+ entries.filter_map do |entry|
255
255
  next if !options[:include_hidden] && hidden_entry?(entry)
256
256
  next unless ::File.fnmatch(pattern, entry.name.chomp('/'), flags)
257
257
 
258
258
  yield(entry) if block_given?
259
259
  entry
260
- end.compact
260
+ end
261
261
  end
262
262
 
263
263
  # :call-seq:
@@ -279,9 +279,7 @@ module ZipContainer
279
279
  # permissions. The default (+0755+) is owner read, write and list; group
280
280
  # read and list; and world read and list.
281
281
  def mkdir(name, permission = 0o0755)
282
- if reserved_entry?(name) || managed_file?(name)
283
- raise ReservedNameClashError, name
284
- end
282
+ raise ReservedNameClashError, name if reserved_entry?(name) || managed_file?(name)
285
283
 
286
284
  @container.mkdir(name, permission)
287
285
  end
@@ -353,13 +351,12 @@ module ZipContainer
353
351
  def verify_mimetype
354
352
  # Check mimetype file is present and correct.
355
353
  entry = @container.find_entry(MIMETYPE_FILE)
356
-
357
354
  return "'mimetype' file is missing." if entry.nil?
355
+
358
356
  if entry.local_header_offset != 0
359
- return "'mimetype' file is not at offset 0 in the archive."
360
- end
361
- if entry.compression_method != ::Zip::Entry::STORED
362
- return "'mimetype' file is compressed."
357
+ "'mimetype' file is not at offset 0 in the archive."
358
+ elsif entry.compression_method != ::Zip::Entry::STORED
359
+ "'mimetype' file is compressed."
363
360
  end
364
361
  end
365
362
 
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2013-2015 The University of Manchester, UK.
1
+ # Copyright (c) 2013-2024 The University of Manchester, UK.
2
2
  #
3
3
  # All rights reserved.
4
4
  #
@@ -30,9 +30,12 @@
30
30
  #
31
31
  # Author: Robert Haines
32
32
 
33
+ require_relative 'managed_entries'
34
+ require_relative 'managed_entry'
35
+ require_relative 'reserved_names'
36
+
33
37
  ##
34
38
  module ZipContainer
35
-
36
39
  # A ManagedDirectory acts as the interface to a set of (possibly) managed
37
40
  # files within it and also reserves the directory name in the Container
38
41
  # namespace.
@@ -40,7 +43,6 @@ module ZipContainer
40
43
  # Once a ManagedDirectory is registered in a Container then only it can be
41
44
  # used to write to its contents.
42
45
  class ManagedDirectory < ManagedEntry
43
-
44
46
  include ReservedNames
45
47
  include ManagedEntries
46
48
 
@@ -77,7 +79,7 @@ module ZipContainer
77
79
  def verify
78
80
  messages = super
79
81
 
80
- @files.values.each { |f| messages += f.verify }
82
+ @files.each_value { |f| messages += f.verify }
81
83
 
82
84
  messages
83
85
  end
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2013, 2014 The University of Manchester, UK.
1
+ # Copyright (c) 2013-2024 The University of Manchester, UK.
2
2
  #
3
3
  # All rights reserved.
4
4
  #
@@ -30,23 +30,25 @@
30
30
  #
31
31
  # Author: Robert Haines
32
32
 
33
+ require_relative 'errors'
34
+ require_relative 'managed_entry'
35
+ require_relative 'managed_file'
36
+ require_relative 'util'
37
+
33
38
  ##
34
39
  module ZipContainer
35
-
36
40
  # This module provides support for managed file and directory entries.
37
41
  #
38
42
  # <b>Note!</b> If you mix this module in you *must* call
39
43
  # +initialize_managed_entries+ in your constructor to ensure that the
40
44
  # internal lists of managed entries are correctly assigned.
41
45
  module ManagedEntries
42
- include Util
43
-
44
46
  # :call-seq:
45
47
  # managed_directories -> Array
46
48
  #
47
49
  # Return the list of managed directories.
48
50
  def managed_directories
49
- return @managed_directories if @managed_directories
51
+ return @managed_directories if defined?(@managed_directories)
50
52
 
51
53
  dirs = @directories.values
52
54
  @managed_directories = dirs + dirs.map(&:managed_directories).flatten
@@ -89,7 +91,7 @@ module ZipContainer
89
91
  #
90
92
  # Is the supplied entry/name a managed entry?
91
93
  def managed_entry?(entry, list = managed_entry_names)
92
- name = entry_name(entry)
94
+ name = Util.entry_name(entry)
93
95
  list.map(&:downcase).include? name.downcase
94
96
  end
95
97
 
@@ -106,7 +108,7 @@ module ZipContainer
106
108
  #
107
109
  # Is the supplied entry/name a hidden directory?
108
110
  def hidden_directory?(entry)
109
- name = entry_name(entry)
111
+ name = Util.entry_name(entry)
110
112
  managed_directory?(name) ? all_managed_entries[name].hidden? : false
111
113
  end
112
114
 
@@ -115,7 +117,7 @@ module ZipContainer
115
117
  #
116
118
  # Is the supplied entry/name a hidden file?
117
119
  def hidden_file?(entry)
118
- name = entry_name(entry)
120
+ name = Util.entry_name(entry)
119
121
  managed_file?(name) ? all_managed_entries[name].hidden? : false
120
122
  end
121
123
 
@@ -204,25 +206,28 @@ module ZipContainer
204
206
  # the container namespace and act as an interface to the (possibly)
205
207
  # managed files within it.
206
208
  def register_managed_entry(entry)
207
- unless entry.is_a?(ManagedDirectory) || entry.is_a?(ManagedFile)
208
- raise ArgumentError, 'The supplied entry must be of type '\
209
- 'ManagedDirectory or ManagedFile or a subclass of either.'
209
+ unless entry.is_a?(ManagedEntry)
210
+ raise ArgumentError,
211
+ 'The supplied entry must be of type ' \
212
+ 'ManagedDirectory or ManagedFile or a subclass of either.'
210
213
  end
211
214
 
212
215
  entry.parent = self
213
- @directories[entry.name] = entry if entry.is_a? ManagedDirectory
214
- @files[entry.name] = entry if entry.is_a? ManagedFile
216
+ if entry.is_a?(ManagedFile)
217
+ @files[entry.name] = entry
218
+ else
219
+ @directories[entry.name] = entry
220
+ end
215
221
  end
216
222
 
217
- # :stopdoc:
223
+ private
224
+
218
225
  def all_managed_entries
219
- return @entries unless @entries.nil?
226
+ return @entries if defined?(@entries) && !@entries.nil?
220
227
 
221
228
  all = {}
222
229
  managed_entries.each { |e| all[e.full_name] = e }
223
230
  @entries = all
224
231
  end
225
- # :startdoc:
226
-
227
232
  end
228
233
  end
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2013 The University of Manchester, UK.
1
+ # Copyright (c) 2013-2024 The University of Manchester, UK.
2
2
  #
3
3
  # All rights reserved.
4
4
  #
@@ -32,13 +32,9 @@
32
32
 
33
33
  ##
34
34
  module ZipContainer
35
-
36
35
  # ManagedEntry is the superclass of ManagedDirectory and ManagedFile. It
37
36
  # should not be used directly but may be subclassed if necessary.
38
37
  class ManagedEntry
39
-
40
- include Util
41
-
42
38
  # The name of the ManagedEntry. For the full path name of this entry use
43
39
  # full_name.
44
40
  attr_reader :name
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2013-2015 The University of Manchester, UK.
1
+ # Copyright (c) 2013-2024 The University of Manchester, UK.
2
2
  #
3
3
  # All rights reserved.
4
4
  #
@@ -30,12 +30,12 @@
30
30
  #
31
31
  # Author: Robert Haines
32
32
 
33
+ require_relative 'managed_entry'
34
+
33
35
  ##
34
36
  module ZipContainer
35
-
36
37
  # A ManagedFile is used to reserve a filename in a Container namespace.
37
38
  class ManagedFile < ManagedEntry
38
-
39
39
  # :call-seq:
40
40
  # new(name, required = false, validation_proc = nil) -> ManagedFile
41
41
  #
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2013, 2014 The University of Manchester, UK.
1
+ # Copyright (c) 2013-2024 The University of Manchester, UK.
2
2
  #
3
3
  # All rights reserved.
4
4
  #
@@ -30,13 +30,12 @@
30
30
  #
31
31
  # Author: Robert Haines
32
32
 
33
+ require_relative 'util'
34
+
33
35
  ##
34
36
  module ZipContainer
35
-
36
37
  # This module provides support for reserved names.
37
38
  module ReservedNames
38
- include Util
39
-
40
39
  # :call-seq:
41
40
  # reserved_names -> Array
42
41
  #
@@ -69,7 +68,7 @@ module ZipContainer
69
68
  # Is the given entry in the reserved list of names? A String or a
70
69
  # Zip::Entry object can be passed in here.
71
70
  def reserved_entry?(entry)
72
- name = entry_name(entry)
71
+ name = Util.entry_name(entry)
73
72
  reserved_names.map(&:downcase).include? name.downcase
74
73
  end
75
74
 
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2014 The University of Manchester, UK.
1
+ # Copyright (c) 2014-2024 The University of Manchester, UK.
2
2
  #
3
3
  # All rights reserved.
4
4
  #
@@ -30,11 +30,14 @@
30
30
  #
31
31
  # Author: Robert Haines
32
32
 
33
+ require 'zip' # Remove this when we update to rubyzip 3.x.
34
+ require 'zip/entry'
35
+
33
36
  ##
34
37
  module ZipContainer
35
-
36
38
  # Utility methods useful throughout the rest of the ZipContainer library.
37
39
  module Util
40
+ module_function
38
41
 
39
42
  # :call-seq:
40
43
  # entry_name(entry) -> String
@@ -48,12 +51,9 @@ module ZipContainer
48
51
  def entry_name(entry)
49
52
  name = entry.is_a?(::Zip::Entry) ? entry.name : entry
50
53
 
51
- if name.respond_to?(:end_with?) && name.respond_to?(:chop!)
52
- name.chop! if name.end_with?('/')
53
- end
54
+ name.chomp!('/') if name.respond_to?(:chomp!)
54
55
 
55
56
  name
56
57
  end
57
-
58
58
  end
59
59
  end
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2014 The University of Manchester, UK.
1
+ # Copyright (c) 2014-2025 The University of Manchester, UK.
2
2
  #
3
3
  # All rights reserved.
4
4
  #
@@ -30,18 +30,6 @@
30
30
  #
31
31
  # Author: Robert Haines
32
32
 
33
- require 'yaml'
34
-
35
33
  module ZipContainer
36
-
37
- # Library version information.
38
- module Version
39
- # Version information in a Hash
40
- INFO = YAML.load_file(
41
- File.join(File.dirname(__FILE__), '..', '..', 'version.yml')
42
- )
43
-
44
- # Version number as a String
45
- STRING = %i[major minor patch].map { |d| INFO[d] }.compact.join('.')
46
- end
34
+ VERSION = '5.0.0.rc1' # :nodoc:
47
35
  end
data/lib/zip-container.rb CHANGED
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2013, 2014 The University of Manchester, UK.
1
+ # Copyright (c) 2013-2024 The University of Manchester, UK.
2
2
  #
3
3
  # All rights reserved.
4
4
  #
@@ -30,20 +30,6 @@
30
30
  #
31
31
  # Author: Robert Haines
32
32
 
33
- require 'rubygems'
34
- require 'bundler/setup'
35
-
36
- require 'zip/filesystem'
37
-
38
- require 'zip-container/util'
39
- require 'zip-container/version'
40
- require 'zip-container/exceptions'
41
- require 'zip-container/entries/reserved'
42
- require 'zip-container/entries/managed'
43
- require 'zip-container/entries/entry'
44
- require 'zip-container/entries/file'
45
- require 'zip-container/entries/directory'
46
- require 'zip-container/container'
47
33
  require 'zip-container/file'
48
34
  require 'zip-container/dir'
49
35
 
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2013, 2014, 2018 The University of Manchester, UK.
1
+ # Copyright (c) 2013-2025 The University of Manchester, UK.
2
2
  #
3
3
  # All rights reserved.
4
4
  #
@@ -30,22 +30,21 @@
30
30
  #
31
31
  # Author: Robert Haines
32
32
 
33
- lib = File.expand_path('lib', __dir__)
34
- $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
35
- require 'zip-container/version'
33
+ require_relative 'lib/zip-container/version'
36
34
 
37
35
  Gem::Specification.new do |s|
38
36
  s.name = 'zip-container'
39
- s.version = ZipContainer::Version::STRING
37
+ s.version = ZipContainer::VERSION
40
38
  s.authors = ['Robert Haines', 'Finn Bacall']
41
- s.email = ['support@mygrid.org.uk']
39
+ s.email = ['robert.haines@manchester.ac.uk']
42
40
 
43
- s.homepage = 'http://mygrid.github.io/ruby-zip-container/'
41
+ s.homepage = 'https://github.com/hainesr/ruby-zip-container'
44
42
  s.summary = 'A ZIP Container for use by OCF and UCF implementations'
45
- s.description = 'A Ruby library for working with ZIP Container '\
46
- 'Format files. See http://www.idpf.org/epub/30/spec/epub30-ocf.html for '\
47
- 'the OCF specification and '\
48
- 'https://learn.adobe.com/wiki/display/PDFNAV/Universal+Container+Format '\
43
+ s.description =
44
+ 'A Ruby library for working with ZIP Container ' \
45
+ 'Format files. See http://www.idpf.org/epub/30/spec/epub30-ocf.html for ' \
46
+ 'the OCF specification and ' \
47
+ 'https://learn.adobe.com/wiki/display/PDFNAV/Universal+Container+Format ' \
49
48
  'for the UCF specification.'
50
49
  s.license = 'BSD'
51
50
 
@@ -54,14 +53,26 @@ Gem::Specification.new do |s|
54
53
  f.match(%r{^((test|spec|features)/|\.)})
55
54
  end
56
55
 
57
- s.required_ruby_version = '>= 2.2.0'
56
+ s.metadata = {
57
+ 'bug_tracker_uri' => 'https://github.com/hainesr/ruby-zip-container/issues',
58
+ 'changelog_uri' => "https://github.com/hainesr/ruby-zip-container/blob/v#{s.version}/CHANGES.md",
59
+ 'documentation_uri' => 'https://hainesr.github.io/ruby-zip-container',
60
+ 'source_code_uri' => "https://github.com/hainesr/ruby-zip-container/tree/v#{s.version}",
61
+ 'rubygems_mfa_required' => 'true'
62
+ }
58
63
 
59
- s.add_runtime_dependency 'rubyzip', '~> 2.0.0'
64
+ s.required_ruby_version = '>= 2.7'
60
65
 
61
- s.add_development_dependency 'bundler'
62
- s.add_development_dependency 'coveralls', '~> 0.8'
63
- s.add_development_dependency 'rake', '~> 10.1'
64
- s.add_development_dependency 'rdoc', '~> 4.1'
65
- s.add_development_dependency 'rubocop', '~> 0.59'
66
- s.add_development_dependency 'test-unit', '~> 3.0'
66
+ s.add_runtime_dependency 'rubyzip', '~> 2.4'
67
+
68
+ s.add_development_dependency 'minitest', '~> 5.25'
69
+ s.add_development_dependency 'os', '~> 1.1.4'
70
+ s.add_development_dependency 'rake', '~> 13.2'
71
+ s.add_development_dependency 'rdoc', '~> 6.11'
72
+ s.add_development_dependency 'rubocop', '~> 1.50.0'
73
+ s.add_development_dependency 'rubocop-minitest', '~> 0.30.0'
74
+ s.add_development_dependency 'rubocop-performance', '~> 1.17.0'
75
+ s.add_development_dependency 'rubocop-rake', '~> 0.6.0'
76
+ s.add_development_dependency 'simplecov', '0.22.0'
77
+ s.add_development_dependency 'simplecov-lcov', '~> 0.8'
67
78
  end