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