compress-bsc 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- checksums.yaml.gz.sig +0 -0
- data/CHANGELOG.md +2 -0
- data/Gemfile +8 -0
- data/LICENSE +192 -0
- data/README.md +279 -0
- data/Rakefile +96 -0
- data/bin/rbsc +306 -0
- data/certs/djberg96_pub.pem +26 -0
- data/compress-bsc.gemspec +45 -0
- data/coverage/assets/0.13.2/DataTables-1.10.20/images/sort_asc.png +0 -0
- data/coverage/assets/0.13.2/DataTables-1.10.20/images/sort_asc_disabled.png +0 -0
- data/coverage/assets/0.13.2/DataTables-1.10.20/images/sort_both.png +0 -0
- data/coverage/assets/0.13.2/DataTables-1.10.20/images/sort_desc.png +0 -0
- data/coverage/assets/0.13.2/DataTables-1.10.20/images/sort_desc_disabled.png +0 -0
- data/coverage/assets/0.13.2/application.css +1 -0
- data/coverage/assets/0.13.2/application.js +7 -0
- data/coverage/assets/0.13.2/colorbox/border.png +0 -0
- data/coverage/assets/0.13.2/colorbox/controls.png +0 -0
- data/coverage/assets/0.13.2/colorbox/loading.gif +0 -0
- data/coverage/assets/0.13.2/colorbox/loading_background.png +0 -0
- data/coverage/assets/0.13.2/favicon_green.png +0 -0
- data/coverage/assets/0.13.2/favicon_red.png +0 -0
- data/coverage/assets/0.13.2/favicon_yellow.png +0 -0
- data/coverage/assets/0.13.2/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
- data/coverage/assets/0.13.2/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
- data/coverage/assets/0.13.2/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
- data/coverage/assets/0.13.2/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
- data/coverage/assets/0.13.2/images/ui-bg_glass_75_dadada_1x400.png +0 -0
- data/coverage/assets/0.13.2/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
- data/coverage/assets/0.13.2/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
- data/coverage/assets/0.13.2/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
- data/coverage/assets/0.13.2/images/ui-icons_222222_256x240.png +0 -0
- data/coverage/assets/0.13.2/images/ui-icons_2e83ff_256x240.png +0 -0
- data/coverage/assets/0.13.2/images/ui-icons_454545_256x240.png +0 -0
- data/coverage/assets/0.13.2/images/ui-icons_888888_256x240.png +0 -0
- data/coverage/assets/0.13.2/images/ui-icons_cd0a0a_256x240.png +0 -0
- data/coverage/assets/0.13.2/loading.gif +0 -0
- data/coverage/assets/0.13.2/magnify.png +0 -0
- data/coverage/index.html +4779 -0
- data/examples/usage_example.rb +215 -0
- data/lib/compress/bsc/compressor.rb +81 -0
- data/lib/compress/bsc/decompressor.rb +159 -0
- data/lib/compress/bsc/error.rb +18 -0
- data/lib/compress/bsc/library.rb +100 -0
- data/lib/compress/bsc/version.rb +5 -0
- data/lib/compress/bsc.rb +26 -0
- data/lib/compress-bsc.rb +5 -0
- data/spec/compressor_spec.rb +124 -0
- data/spec/decompressor_spec.rb +135 -0
- data/spec/error_spec.rb +63 -0
- data/spec/examples.txt +60 -0
- data/spec/ffi_bsc_spec.rb +101 -0
- data/spec/library_spec.rb +97 -0
- data/spec/spec_helper.rb +53 -0
- data.tar.gz.sig +0 -0
- metadata +232 -0
- metadata.gz.sig +0 -0
data/bin/rbsc
ADDED
@@ -0,0 +1,306 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require_relative '../lib/compress/bsc'
|
4
|
+
require 'optparse'
|
5
|
+
|
6
|
+
class BSCCli
|
7
|
+
def initialize
|
8
|
+
@options = {
|
9
|
+
action: nil,
|
10
|
+
input: nil,
|
11
|
+
output: nil,
|
12
|
+
block_sorter: Compress::BSC::Library::LIBBSC_DEFAULT_BLOCKSORTER,
|
13
|
+
coder: Compress::BSC::Library::LIBBSC_DEFAULT_CODER,
|
14
|
+
lzp_hash_size: 0,
|
15
|
+
lzp_min_len: 0,
|
16
|
+
features: Compress::BSC::Library::LIBBSC_DEFAULT_FEATURES,
|
17
|
+
verbose: false
|
18
|
+
}
|
19
|
+
end
|
20
|
+
|
21
|
+
def run(args)
|
22
|
+
parse_options(args)
|
23
|
+
validate_options
|
24
|
+
|
25
|
+
@bsc = Compress::BSC.new
|
26
|
+
|
27
|
+
case @options[:action]
|
28
|
+
when :compress
|
29
|
+
compress_file
|
30
|
+
when :decompress
|
31
|
+
decompress_file
|
32
|
+
when :info
|
33
|
+
show_info
|
34
|
+
else
|
35
|
+
puts "Error: No action specified"
|
36
|
+
exit 1
|
37
|
+
end
|
38
|
+
rescue Compress::BSC::Error => e
|
39
|
+
puts "BSC Error: #{e.error_name} (#{e.code})"
|
40
|
+
puts e.message
|
41
|
+
exit 1
|
42
|
+
rescue => e
|
43
|
+
puts "Error: #{e.message}"
|
44
|
+
exit 1
|
45
|
+
end
|
46
|
+
|
47
|
+
private
|
48
|
+
|
49
|
+
def parse_options(args)
|
50
|
+
OptionParser.new do |opts|
|
51
|
+
opts.banner = "Usage: #{$0} [options]"
|
52
|
+
opts.separator ""
|
53
|
+
opts.separator "Actions:"
|
54
|
+
|
55
|
+
opts.on("-c", "--compress", "Compress input file") do
|
56
|
+
@options[:action] = :compress
|
57
|
+
end
|
58
|
+
|
59
|
+
opts.on("-d", "--decompress", "Decompress input file") do
|
60
|
+
@options[:action] = :decompress
|
61
|
+
end
|
62
|
+
|
63
|
+
opts.on("-i", "--info", "Show information about compressed file") do
|
64
|
+
@options[:action] = :info
|
65
|
+
end
|
66
|
+
|
67
|
+
opts.separator ""
|
68
|
+
opts.separator "Files:"
|
69
|
+
|
70
|
+
opts.on("-f", "--input FILE", "Input file") do |file|
|
71
|
+
@options[:input] = file
|
72
|
+
end
|
73
|
+
|
74
|
+
opts.on("-o", "--output FILE", "Output file") do |file|
|
75
|
+
@options[:output] = file
|
76
|
+
end
|
77
|
+
|
78
|
+
opts.separator ""
|
79
|
+
opts.separator "Compression options:"
|
80
|
+
|
81
|
+
opts.on("-b", "--block-sorter SORTER", Integer, "Block sorter (0=BWT, 3-8=ST)") do |sorter|
|
82
|
+
@options[:block_sorter] = sorter
|
83
|
+
end
|
84
|
+
|
85
|
+
opts.on("--coder CODER", Integer, "Coder (1=Static, 2=Adaptive, 3=Fast)") do |coder|
|
86
|
+
@options[:coder] = coder
|
87
|
+
end
|
88
|
+
|
89
|
+
opts.on("--lzp-hash SIZE", Integer, "LZP hash size (10-28, 0=disable)") do |size|
|
90
|
+
@options[:lzp_hash_size] = size
|
91
|
+
end
|
92
|
+
|
93
|
+
opts.on("--lzp-min LEN", Integer, "LZP minimum length (4-255, 0=disable)") do |len|
|
94
|
+
@options[:lzp_min_len] = len
|
95
|
+
end
|
96
|
+
|
97
|
+
opts.on("--[no-]fast", "Enable fast mode") do |fast|
|
98
|
+
if fast
|
99
|
+
@options[:features] |= Compress::BSC::Library::LIBBSC_FEATURE_FASTMODE
|
100
|
+
else
|
101
|
+
@options[:features] &= ~Compress::BSC::Library::LIBBSC_FEATURE_FASTMODE
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
opts.on("--[no-]threads", "Enable multi-threading") do |threads|
|
106
|
+
if threads
|
107
|
+
@options[:features] |= Compress::BSC::Library::LIBBSC_FEATURE_MULTITHREADING
|
108
|
+
else
|
109
|
+
@options[:features] &= ~Compress::BSC::Library::LIBBSC_FEATURE_MULTITHREADING
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
opts.separator ""
|
114
|
+
opts.separator "Other options:"
|
115
|
+
|
116
|
+
opts.on("-v", "--verbose", "Verbose output") do
|
117
|
+
@options[:verbose] = true
|
118
|
+
end
|
119
|
+
|
120
|
+
opts.on("-h", "--help", "Show this help") do
|
121
|
+
puts opts
|
122
|
+
exit
|
123
|
+
end
|
124
|
+
|
125
|
+
opts.separator ""
|
126
|
+
opts.separator "Examples:"
|
127
|
+
opts.separator " #{$0} -c -f input.txt -o output.bsc"
|
128
|
+
opts.separator " #{$0} -d -f output.bsc -o restored.txt"
|
129
|
+
opts.separator " #{$0} -i -f output.bsc"
|
130
|
+
opts.separator " #{$0} -c -f large.txt -o large.bsc --lzp-hash 16 --lzp-min 64"
|
131
|
+
end.parse!(args)
|
132
|
+
end
|
133
|
+
|
134
|
+
def validate_options
|
135
|
+
unless @options[:action]
|
136
|
+
puts "Error: Must specify an action (-c, -d, or -i)"
|
137
|
+
exit 1
|
138
|
+
end
|
139
|
+
|
140
|
+
unless @options[:input]
|
141
|
+
puts "Error: Must specify input file (-f)"
|
142
|
+
exit 1
|
143
|
+
end
|
144
|
+
|
145
|
+
unless File.exist?(@options[:input])
|
146
|
+
puts "Error: Input file '#{@options[:input]}' does not exist"
|
147
|
+
exit 1
|
148
|
+
end
|
149
|
+
|
150
|
+
if @options[:action] != :info && !@options[:output]
|
151
|
+
puts "Error: Must specify output file (-o) for compress/decompress actions"
|
152
|
+
exit 1
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
def compress_file
|
157
|
+
puts "Compressing #{@options[:input]}..." if @options[:verbose]
|
158
|
+
|
159
|
+
compressor = Compress::BSC::Compressor.new(
|
160
|
+
lzp_hash_size: @options[:lzp_hash_size],
|
161
|
+
lzp_min_len: @options[:lzp_min_len],
|
162
|
+
block_sorter: @options[:block_sorter],
|
163
|
+
coder: @options[:coder],
|
164
|
+
features: @options[:features]
|
165
|
+
)
|
166
|
+
|
167
|
+
start_time = Time.now
|
168
|
+
input_size = File.size(@options[:input])
|
169
|
+
|
170
|
+
compressed_size = compressor.compress_file(@options[:input], @options[:output])
|
171
|
+
|
172
|
+
end_time = Time.now
|
173
|
+
duration = end_time - start_time
|
174
|
+
|
175
|
+
ratio = input_size.to_f / compressed_size
|
176
|
+
speed = input_size / duration / 1024 / 1024 # MB/s
|
177
|
+
|
178
|
+
puts "Compression completed:"
|
179
|
+
puts " Input size: #{format_bytes(input_size)}"
|
180
|
+
puts " Output size: #{format_bytes(compressed_size)}"
|
181
|
+
puts " Ratio: #{ratio.round(2)}:1 (#{((1 - compressed_size.to_f / input_size) * 100).round(1)}% savings)"
|
182
|
+
puts " Time: #{duration.round(2)}s"
|
183
|
+
puts " Speed: #{speed.round(2)} MB/s"
|
184
|
+
|
185
|
+
if @options[:verbose]
|
186
|
+
puts " Block sorter: #{block_sorter_name(@options[:block_sorter])}"
|
187
|
+
puts " Coder: #{coder_name(@options[:coder])}"
|
188
|
+
puts " LZP: #{@options[:lzp_hash_size] > 0 ? "enabled (#{@options[:lzp_hash_size]}/#{@options[:lzp_min_len]})" : "disabled"}"
|
189
|
+
puts " Features: #{feature_names(@options[:features]).join(', ')}"
|
190
|
+
end
|
191
|
+
end
|
192
|
+
|
193
|
+
def decompress_file
|
194
|
+
puts "Decompressing #{@options[:input]}..." if @options[:verbose]
|
195
|
+
|
196
|
+
# Get block info first
|
197
|
+
compressed_data = File.binread(@options[:input])
|
198
|
+
info = Compress::BSC::Decompressor.block_info(compressed_data)
|
199
|
+
|
200
|
+
decompressor = Compress::BSC::Decompressor.new(features: @options[:features])
|
201
|
+
|
202
|
+
start_time = Time.now
|
203
|
+
input_size = File.size(@options[:input])
|
204
|
+
|
205
|
+
decompressed_size = decompressor.decompress_file(@options[:input], @options[:output])
|
206
|
+
|
207
|
+
end_time = Time.now
|
208
|
+
duration = end_time - start_time
|
209
|
+
|
210
|
+
speed = decompressed_size / duration / 1024 / 1024 # MB/s
|
211
|
+
|
212
|
+
puts "Decompression completed:"
|
213
|
+
puts " Input size: #{format_bytes(input_size)}"
|
214
|
+
puts " Output size: #{format_bytes(decompressed_size)}"
|
215
|
+
puts " Time: #{duration.round(2)}s"
|
216
|
+
puts " Speed: #{speed.round(2)} MB/s"
|
217
|
+
|
218
|
+
if @options[:verbose]
|
219
|
+
puts " Block size: #{format_bytes(info[:block_size])}"
|
220
|
+
puts " Data size: #{format_bytes(info[:data_size])}"
|
221
|
+
end
|
222
|
+
end
|
223
|
+
|
224
|
+
def show_info
|
225
|
+
puts "Analyzing #{@options[:input]}..."
|
226
|
+
|
227
|
+
compressed_data = File.binread(@options[:input])
|
228
|
+
info = Compress::BSC::Decompressor.block_info(compressed_data)
|
229
|
+
|
230
|
+
file_size = File.size(@options[:input])
|
231
|
+
ratio = info[:data_size].to_f / file_size
|
232
|
+
|
233
|
+
puts "File information:"
|
234
|
+
puts " File size: #{format_bytes(file_size)}"
|
235
|
+
puts " Block size: #{format_bytes(info[:block_size])}"
|
236
|
+
puts " Original size: #{format_bytes(info[:data_size])}"
|
237
|
+
puts " Compression ratio: #{ratio.round(2)}:1"
|
238
|
+
puts " Space savings: #{((1 - file_size.to_f / info[:data_size]) * 100).round(1)}%"
|
239
|
+
puts " Header overhead: #{format_bytes(info[:block_size] - info[:data_size])}"
|
240
|
+
end
|
241
|
+
|
242
|
+
def format_bytes(bytes)
|
243
|
+
units = %w[B KB MB GB TB]
|
244
|
+
size = bytes.to_f
|
245
|
+
unit_index = 0
|
246
|
+
|
247
|
+
while size >= 1024 && unit_index < units.length - 1
|
248
|
+
size /= 1024
|
249
|
+
unit_index += 1
|
250
|
+
end
|
251
|
+
|
252
|
+
if size == size.to_i
|
253
|
+
"#{size.to_i} #{units[unit_index]}"
|
254
|
+
else
|
255
|
+
"#{size.round(1)} #{units[unit_index]}"
|
256
|
+
end
|
257
|
+
end
|
258
|
+
|
259
|
+
def block_sorter_name(sorter)
|
260
|
+
case sorter
|
261
|
+
when Compress::BSC::Library::LIBBSC_BLOCKSORTER_BWT
|
262
|
+
"BWT"
|
263
|
+
when Compress::BSC::Library::LIBBSC_BLOCKSORTER_ST3
|
264
|
+
"ST3"
|
265
|
+
when Compress::BSC::Library::LIBBSC_BLOCKSORTER_ST4
|
266
|
+
"ST4"
|
267
|
+
when Compress::BSC::Library::LIBBSC_BLOCKSORTER_ST5
|
268
|
+
"ST5"
|
269
|
+
when Compress::BSC::Library::LIBBSC_BLOCKSORTER_ST6
|
270
|
+
"ST6"
|
271
|
+
when Compress::BSC::Library::LIBBSC_BLOCKSORTER_ST7
|
272
|
+
"ST7"
|
273
|
+
when Compress::BSC::Library::LIBBSC_BLOCKSORTER_ST8
|
274
|
+
"ST8"
|
275
|
+
else
|
276
|
+
"Unknown (#{sorter})"
|
277
|
+
end
|
278
|
+
end
|
279
|
+
|
280
|
+
def coder_name(coder)
|
281
|
+
case coder
|
282
|
+
when Compress::BSC::Library::LIBBSC_CODER_QLFC_STATIC
|
283
|
+
"QLFC Static"
|
284
|
+
when Compress::BSC::Library::LIBBSC_CODER_QLFC_ADAPTIVE
|
285
|
+
"QLFC Adaptive"
|
286
|
+
when Compress::BSC::Library::LIBBSC_CODER_QLFC_FAST
|
287
|
+
"QLFC Fast"
|
288
|
+
else
|
289
|
+
"Unknown (#{coder})"
|
290
|
+
end
|
291
|
+
end
|
292
|
+
|
293
|
+
def feature_names(features)
|
294
|
+
names = []
|
295
|
+
names << "Fast Mode" if (features & Compress::BSC::Library::LIBBSC_FEATURE_FASTMODE) != 0
|
296
|
+
names << "Multi-threading" if (features & Compress::BSC::Library::LIBBSC_FEATURE_MULTITHREADING) != 0
|
297
|
+
names << "Large Pages" if (features & Compress::BSC::Library::LIBBSC_FEATURE_LARGEPAGES) != 0
|
298
|
+
names << "CUDA" if (features & Compress::BSC::Library::LIBBSC_FEATURE_CUDA) != 0
|
299
|
+
names.empty? ? ["None"] : names
|
300
|
+
end
|
301
|
+
end
|
302
|
+
|
303
|
+
if __FILE__ == $0
|
304
|
+
cli = BSCCli.new
|
305
|
+
cli.run(ARGV)
|
306
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
-----BEGIN CERTIFICATE-----
|
2
|
+
MIIEcDCCAtigAwIBAgIBATANBgkqhkiG9w0BAQsFADA/MREwDwYDVQQDDAhkamJl
|
3
|
+
cmc5NjEVMBMGCgmSJomT8ixkARkWBWdtYWlsMRMwEQYKCZImiZPyLGQBGRYDY29t
|
4
|
+
MB4XDTE4MDMxODE1MjIwN1oXDTI4MDMxNTE1MjIwN1owPzERMA8GA1UEAwwIZGpi
|
5
|
+
ZXJnOTYxFTATBgoJkiaJk/IsZAEZFgVnbWFpbDETMBEGCgmSJomT8ixkARkWA2Nv
|
6
|
+
bTCCAaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBALgfaroVM6CI06cxr0/h
|
7
|
+
A+j+pc8fgpRgBVmHFaFunq28GPC3IvW7Nvc3Y8SnAW7pP1EQIbhlwRIaQzJ93/yj
|
8
|
+
u95KpkP7tA9erypnV7dpzBkzNlX14ACaFD/6pHoXoe2ltBxk3CCyyzx70mTqJpph
|
9
|
+
75IB03ni9a8yqn8pmse+s83bFJOAqddSj009sGPcQO+QOWiNxqYv1n5EHcvj2ebO
|
10
|
+
6hN7YTmhx7aSia4qL/quc4DlIaGMWoAhvML7u1fmo53CYxkKskfN8MOecq2vfEmL
|
11
|
+
iLu+SsVVEAufMDDFMXMJlvDsviolUSGMSNRTujkyCcJoXKYYxZSNtIiyd9etI0X3
|
12
|
+
ctu0uhrFyrMZXCedutvXNjUolD5r9KGBFSWH1R9u2I3n3SAyFF2yzv/7idQHLJJq
|
13
|
+
74BMnx0FIq6fCpu5slAipvxZ3ZkZpEXZFr3cIBtO1gFvQWW7E/Y3ijliWJS1GQFq
|
14
|
+
058qERadHGu1yu1dojmFRo6W2KZvY9al2yIlbkpDrD5MYQIDAQABo3cwdTAJBgNV
|
15
|
+
HRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUFZsMapgzJimzsbaBG2Tm8j5e
|
16
|
+
AzgwHQYDVR0RBBYwFIESZGpiZXJnOTZAZ21haWwuY29tMB0GA1UdEgQWMBSBEmRq
|
17
|
+
YmVyZzk2QGdtYWlsLmNvbTANBgkqhkiG9w0BAQsFAAOCAYEAW2tnYixXQtKxgGXq
|
18
|
+
/3iSWG2bLwvxS4go3srO+aRXZHrFUMlJ5W0mCxl03aazxxKTsVVpZD8QZxvK91OQ
|
19
|
+
h9zr9JBYqCLcCVbr8SkmYCi/laxIZxsNE5YI8cC8vvlLI7AMgSfPSnn/Epq1GjGY
|
20
|
+
6L1iRcEDtanGCIvjqlCXO9+BmsnCfEVehqZkQHeYczA03tpOWb6pon2wzvMKSsKH
|
21
|
+
ks0ApVdstSLz1kzzAqem/uHdG9FyXdbTAwH1G4ZPv69sQAFAOCgAqYmdnzedsQtE
|
22
|
+
1LQfaQrx0twO+CZJPcRLEESjq8ScQxWRRkfuh2VeR7cEU7L7KqT10mtUwrvw7APf
|
23
|
+
DYoeCY9KyjIBjQXfbj2ke5u1hZj94Fsq9FfbEQg8ygCgwThnmkTrrKEiMSs3alYR
|
24
|
+
ORVCZpRuCPpmC8qmqxUnARDArzucjaclkxjLWvCVHeFa9UP7K3Nl9oTjJNv+7/jM
|
25
|
+
WZs4eecIcUc4tKdHxcAJ0MO/Dkqq7hGaiHpwKY76wQ1+8xAh
|
26
|
+
-----END CERTIFICATE-----
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require_relative 'lib/compress/bsc/version'
|
2
|
+
|
3
|
+
Gem::Specification.new do |spec|
|
4
|
+
spec.name = 'compress-bsc'
|
5
|
+
spec.version = Compress::BSC::VERSION
|
6
|
+
spec.author = 'Daniel Beger'
|
7
|
+
spec.email = 'djberg96@gmail.com'
|
8
|
+
|
9
|
+
spec.summary = 'Ruby FFI bindings for libbsc (Block Sorting Compression Library)'
|
10
|
+
spec.homepage = 'https://github.com/djberg96/compress-bsc'
|
11
|
+
spec.license = 'Apache-2.0'
|
12
|
+
|
13
|
+
spec.files = Dir['**/*'].reject{ |f| f.include?('git') }
|
14
|
+
spec.bindir = 'bin'
|
15
|
+
spec.executables = ['rbsc']
|
16
|
+
spec.cert_chain = ['certs/djberg96_pub.pem']
|
17
|
+
|
18
|
+
spec.required_ruby_version = '>= 2.7.0'
|
19
|
+
|
20
|
+
spec.add_dependency 'ffi', '~> 1.15'
|
21
|
+
|
22
|
+
spec.add_development_dependency 'rspec', '~> 3.12'
|
23
|
+
spec.add_development_dependency 'rake', '~> 13.0'
|
24
|
+
spec.add_development_dependency 'bundler', '~> 2.0'
|
25
|
+
spec.add_development_dependency 'simplecov', '~> 0.22'
|
26
|
+
spec.add_development_dependency 'rubocop', '~> 1.50'
|
27
|
+
spec.add_development_dependency 'yard', '~> 0.9'
|
28
|
+
|
29
|
+
spec.metadata = {
|
30
|
+
'homepage_uri' => 'https://github.com/djberg96/compress-bsc',
|
31
|
+
'bug_tracker_uri' => 'https://github.com/djberg96/compress-bsc/issues',
|
32
|
+
'changelog_uri' => 'https://github.com/djberg96/compress-bsc/blob/main/CHANGES.md',
|
33
|
+
'documentation_uri' => 'https://github.com/djberg96/compress-bsc/wiki',
|
34
|
+
'source_code_uri' => 'https://github.com/djberg96/compress-bsc',
|
35
|
+
'wiki_uri' => 'https://github.com/djberg96/compress-bsc/wiki',
|
36
|
+
'rubygems_mfa_required' => 'true',
|
37
|
+
'github_repo' => 'https://github.com/djberg96/compress-bsc',
|
38
|
+
'funding_uri' => 'https://github.com/sponsors/djberg96'
|
39
|
+
}
|
40
|
+
|
41
|
+
spec.description = <<-EOF
|
42
|
+
A Ruby interface to the libbsc high-performance block-sorting compression library
|
43
|
+
from Ilya Grebnov using FFI.
|
44
|
+
EOF
|
45
|
+
end
|
Binary file
|
Binary file
|
Binary file
|