bzip2-ffi 1.1.0 → 1.1.1
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 +4 -4
- checksums.yaml.gz.sig +0 -0
- data/CHANGES.md +10 -0
- data/Gemfile +11 -1
- data/LICENSE +1 -1
- data/README.md +25 -4
- data/bzip2-ffi.gemspec +1 -1
- data/lib/bzip2/ffi/reader.rb +7 -1
- data/lib/bzip2/ffi/version.rb +1 -1
- data/lib/bzip2/ffi/writer.rb +5 -1
- data/test/reader_test.rb +19 -15
- data/test/writer_test.rb +28 -24
- data.tar.gz.sig +0 -0
- metadata +7 -6
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 25b15e037a74f589a612d955890d194519a97abfa903c993589d0096794b6459
|
4
|
+
data.tar.gz: '088c393a99b19d1d625148c951461333d2ed9ef934df6e5efaee2ea0007b9620'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 84ff7dd72ab2d08ebaf3eda64b104db414b882f90f4d05df06485bf0b5f9e6c116512d5c5183e8f921aacf660eaf58eb37d5d2fd959002b859fd97f9c8af7a8e
|
7
|
+
data.tar.gz: 59ee28b33e364ce56a453ad9abd2f6fad30e8aa623d6ddb89f50d8211b4ad77d32e3493bbac853e74b558e307af6f7db71d057aaddb72cbcc15338c332dec16b
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data/CHANGES.md
CHANGED
@@ -1,5 +1,15 @@
|
|
1
1
|
# Changes
|
2
2
|
|
3
|
+
## Version 1.1.1 - 8-Jul-2023
|
4
|
+
|
5
|
+
* Added `Bzip2::FFI::Reader#tell`, returning the number of decompressed bytes
|
6
|
+
that have been read. `Bzip2::FFI::Reader#pos` is now an alias for
|
7
|
+
`Bzip2::FFI::Reader#tell`.
|
8
|
+
* Added `Bzip2::FFI::Writer#tell`, returning the number of uncompressed bytes
|
9
|
+
that have been written. `Bzip2::FFI::Writer#pos` is now an alias for
|
10
|
+
`Bzip2::FFI::Writer#tell`.
|
11
|
+
|
12
|
+
|
3
13
|
## Version 1.1.0 - 27-Feb-2021
|
4
14
|
|
5
15
|
* `Bzip2::FFI::Reader` will now read all consecutive bzip2 compressed structures
|
data/Gemfile
CHANGED
@@ -13,7 +13,7 @@ group :test do
|
|
13
13
|
|
14
14
|
# coveralls is no longer maintained, but supports Ruby < 2.3.
|
15
15
|
# coveralls_reborn is maintained, but requires Ruby >= 2.3.
|
16
|
-
gem 'coveralls', '
|
16
|
+
gem 'coveralls', git: 'https://github.com/philr/coveralls-ruby.git', require: false if RUBY_VERSION < '2.3'
|
17
17
|
gem 'coveralls_reborn', '~> 0.13', require: false if RUBY_VERSION >= '2.3'
|
18
18
|
|
19
19
|
|
@@ -38,8 +38,18 @@ group :test do
|
|
38
38
|
# ffi 1.9.15 is declared as compatible with Ruby >= 1.8.7, but doesn't compile
|
39
39
|
# on Ruby 1.9.3 on Windows.
|
40
40
|
#
|
41
|
+
# The source version of ffi 1.15.5 is declared as compatible with Ruby >= 2.3.
|
42
|
+
# The binary version of 1.15.5 is declared as compatible with Ruby >= 2.4, so
|
43
|
+
# doesn't get used. The using the source version results in a segmentation
|
44
|
+
# fault during libffi initialization.
|
45
|
+
#
|
46
|
+
# Binaries of 15.5.0 to 15.5.4 are declared as compatible with Ruby >= 2.3,
|
47
|
+
# but don't get used with Bundler 2.3.23 and Ruby 2.3 on Windows.
|
48
|
+
#
|
41
49
|
# Limit to earlier compatible versions.
|
42
50
|
if RUBY_VERSION < '2.0' && RUBY_PLATFORM =~ /mingw/
|
43
51
|
gem 'ffi', '< 1.9.0'
|
52
|
+
elsif RUBY_VERSION < '2.4' && RUBY_PLATFORM =~ /mingw/
|
53
|
+
gem 'ffi', '< 1.15.0'
|
44
54
|
end
|
45
55
|
end
|
data/LICENSE
CHANGED
data/README.md
CHANGED
@@ -27,7 +27,7 @@ Bzip2::FFI is a pure-Ruby library that uses
|
|
27
27
|
the libbz2 dynamic library at runtime.
|
28
28
|
|
29
29
|
libbz2 is available as a package on most UNIX-based systems (for example,
|
30
|
-
`libbz2-1.0` on Debian and Ubuntu, or `bzip2-libs` on Fedora, Red Hat
|
30
|
+
`libbz2-1.0` on Debian and Ubuntu, or `bzip2-libs` on Fedora, Red Hat and
|
31
31
|
CentOS).
|
32
32
|
|
33
33
|
|
@@ -42,7 +42,7 @@ Download the DLL only package that matches your Ruby installation (x86 or x64)
|
|
42
42
|
and extract to your `ruby\bin` directory.
|
43
43
|
|
44
44
|
Builds from the bzip2-windows project depend on the Visual Studio C Runtime
|
45
|
-
Library. Links to the installer can be found on the bzip2-windows
|
45
|
+
Library. Links to the installer can be found on the bzip2-windows releases page.
|
46
46
|
|
47
47
|
|
48
48
|
## Usage
|
@@ -58,7 +58,7 @@ require 'bzip2/ffi'
|
|
58
58
|
|
59
59
|
Data can be compressed using the `Bzip2::FFI::Writer` class. For example, the
|
60
60
|
following compresses lines read from `ARGF` (either standard input, or file
|
61
|
-
names given as command-line arguments:
|
61
|
+
names given as command-line arguments):
|
62
62
|
|
63
63
|
```ruby
|
64
64
|
Bzip2::FFI::Writer.open(io_or_path) do |writer|
|
@@ -116,7 +116,8 @@ ensure
|
|
116
116
|
end
|
117
117
|
```
|
118
118
|
|
119
|
-
All the available bzipped data can be read and decompressed in a single
|
119
|
+
All the available bzipped data can also be read and decompressed in a single
|
120
|
+
step:
|
120
121
|
|
121
122
|
```ruby
|
122
123
|
uncompressed = Bzip2::FFI::Reader.read(io_or_path)
|
@@ -135,6 +136,26 @@ ASCII-8BIT (BINARY) encoding representing the raw decompressed bytes.
|
|
135
136
|
to the `#write` method (using the encoding of the `String`).
|
136
137
|
|
137
138
|
|
139
|
+
### Streaming and Memory Usage
|
140
|
+
|
141
|
+
Bzip2::FFI compresses and decompresses data as a stream, allowing large files to
|
142
|
+
be handled without requiring the complete contents to be held in memory.
|
143
|
+
|
144
|
+
When decompressing, 4 KB of compressed data is read at a time. An additional 4
|
145
|
+
KB is required to pass the data to libbz2. Decompressed data is output in blocks
|
146
|
+
dictated by the length passed to `Bzip2::FFI::Reader#read` (defaulting to 4 KB
|
147
|
+
and requiring twice the length in memory to read from libbz2).
|
148
|
+
|
149
|
+
When compressing, up to 4 KB of compressed data is written at a time, requiring
|
150
|
+
up to 8 KB of memory. An additional copy is also taken of the `String` passed to
|
151
|
+
`Bzip2::FFI::Writer#write`.
|
152
|
+
|
153
|
+
Internally, libbz2 allocates additional memory according to the bzip2 block
|
154
|
+
size. Please refer to the
|
155
|
+
[Memory Management](https://sourceware.org/bzip2/manual/manual.html#memory-management)
|
156
|
+
section of the Bzip2 documentation for details.
|
157
|
+
|
158
|
+
|
138
159
|
## Documentation
|
139
160
|
|
140
161
|
Documentation for Bzip2::FFI is available on
|
data/bzip2-ffi.gemspec
CHANGED
@@ -3,7 +3,7 @@ require File.expand_path(File.join('..', 'lib', 'bzip2', 'ffi', 'version'), __FI
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = 'bzip2-ffi'
|
5
5
|
s.version = Bzip2::FFI::VERSION
|
6
|
-
s.summary = 'Reads and writes bzip2 compressed data using FFI bindings for libbz2.'
|
6
|
+
s.summary = 'Reads and writes bzip2 compressed data as a stream using FFI bindings for libbz2.'
|
7
7
|
s.description = <<-EOF
|
8
8
|
Bzip2::FFI is a Ruby wrapper for libbz2 using FFI bindings.
|
9
9
|
|
data/lib/bzip2/ffi/reader.rb
CHANGED
@@ -51,6 +51,11 @@ module Bzip2
|
|
51
51
|
# the stream to the byte immediately following the end of the compressed
|
52
52
|
# bzip2 data. If `#seek` raises an `IOError`, it will be caught and the
|
53
53
|
# stream position will be left unchanged.
|
54
|
+
#
|
55
|
+
# {Reader} does not support seeking (it's not supported by the underlying
|
56
|
+
# libbz2 library). There are no `#seek` or `#pos=` methods. The only way to
|
57
|
+
# advance the position is to call {#read}. Discard the result if it's not
|
58
|
+
# needed.
|
54
59
|
class Reader < IO
|
55
60
|
# The number of bytes read from the compressed data stream at a time.
|
56
61
|
#
|
@@ -352,10 +357,11 @@ module Bzip2
|
|
352
357
|
#
|
353
358
|
# @return [Integer] The number of decompressed bytes that have been read.
|
354
359
|
# @raise [IOError] If the {Reader} has been closed.
|
355
|
-
def
|
360
|
+
def tell
|
356
361
|
check_closed
|
357
362
|
@out_pos
|
358
363
|
end
|
364
|
+
alias pos tell
|
359
365
|
|
360
366
|
private
|
361
367
|
|
data/lib/bzip2/ffi/version.rb
CHANGED
data/lib/bzip2/ffi/writer.rb
CHANGED
@@ -40,6 +40,9 @@ module Bzip2
|
|
40
40
|
# No character conversion is performed when writing and compressing. The
|
41
41
|
# {write} and {#write} methods compress the raw bytes from the given
|
42
42
|
# `String` (using the encoding of the `String`).
|
43
|
+
#
|
44
|
+
# {Writer} does not support seeking (it's not supported by the underlying
|
45
|
+
# libbz2 library). There are no `#seek` or `#pos=` methods.
|
43
46
|
class Writer < IO
|
44
47
|
# Size of the buffer passed to libbz2 for it to write compressed data to.
|
45
48
|
#
|
@@ -344,10 +347,11 @@ module Bzip2
|
|
344
347
|
# @return [Integer] The number of uncompressed bytes that have been
|
345
348
|
# written.
|
346
349
|
# @raise [IOError] If the {Writer} has been closed.
|
347
|
-
def
|
350
|
+
def tell
|
348
351
|
s = stream
|
349
352
|
(s[:total_in_hi32] << 32) | s[:total_in_lo32]
|
350
353
|
end
|
354
|
+
alias pos tell
|
351
355
|
|
352
356
|
private
|
353
357
|
|
data/test/reader_test.rb
CHANGED
@@ -79,6 +79,7 @@ class ReaderTest < Minitest::Test
|
|
79
79
|
decompressed = reader.read(read_size)
|
80
80
|
end
|
81
81
|
|
82
|
+
assert_equal(input.tell, reader.tell)
|
82
83
|
assert_equal(input.pos, reader.pos)
|
83
84
|
|
84
85
|
if buffer
|
@@ -104,6 +105,7 @@ class ReaderTest < Minitest::Test
|
|
104
105
|
decompressed = reader.read
|
105
106
|
end
|
106
107
|
|
108
|
+
assert_equal(buffer.bytesize, reader.tell)
|
107
109
|
assert_equal(buffer.bytesize, reader.pos)
|
108
110
|
|
109
111
|
refute_nil(decompressed)
|
@@ -569,23 +571,25 @@ class ReaderTest < Minitest::Test
|
|
569
571
|
end
|
570
572
|
end
|
571
573
|
|
572
|
-
|
573
|
-
|
574
|
-
|
575
|
-
|
576
|
-
|
577
|
-
|
578
|
-
|
579
|
-
|
580
|
-
|
574
|
+
[:tell, :pos].each do |method|
|
575
|
+
define_method("test_#{method}_returns_decompressed_position") do
|
576
|
+
Bzip2::FFI::Reader.open(fixture_path('compressed.bz2')) do |reader|
|
577
|
+
assert_equal(0, reader.public_send(method))
|
578
|
+
reader.read(17)
|
579
|
+
assert_equal(17, reader.public_send(method))
|
580
|
+
reader.read(8837)
|
581
|
+
assert_equal(8854, reader.public_send(method))
|
582
|
+
reader.read
|
583
|
+
assert_equal(65670, reader.public_send(method))
|
584
|
+
end
|
581
585
|
end
|
582
|
-
end
|
583
586
|
|
584
|
-
|
585
|
-
|
586
|
-
|
587
|
-
|
588
|
-
|
587
|
+
define_method("test_#{method}_raises_io_error_when_closed") do
|
588
|
+
File.open(fixture_path('compressed.bz2'), 'rb') do |file|
|
589
|
+
reader = Bzip2::FFI::Reader.new(file)
|
590
|
+
reader.close
|
591
|
+
assert_raises(IOError) { reader.public_send(method) }
|
592
|
+
end
|
589
593
|
end
|
590
594
|
end
|
591
595
|
|
data/test/writer_test.rb
CHANGED
@@ -48,11 +48,13 @@ class WriterTest < Minitest::Test
|
|
48
48
|
buffer = io.read(read_size)
|
49
49
|
break unless buffer
|
50
50
|
assert_equal(buffer.bytesize, writer.write(buffer))
|
51
|
+
assert_equal(io.tell, writer.tell)
|
51
52
|
assert_equal(io.pos, writer.pos)
|
52
53
|
end
|
53
54
|
else
|
54
55
|
buffer = io.read
|
55
56
|
assert_equal(buffer.bytesize, writer.write(buffer))
|
57
|
+
assert_equal(io.tell, writer.tell)
|
56
58
|
assert_equal(io.pos, writer.pos)
|
57
59
|
end
|
58
60
|
end
|
@@ -226,38 +228,40 @@ class WriterTest < Minitest::Test
|
|
226
228
|
assert_nil(writer.close)
|
227
229
|
end
|
228
230
|
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
231
|
+
[:tell, :pos].each do |method|
|
232
|
+
define_method("test_#{method}_returns_uncompressed_position") do
|
233
|
+
Bzip2::FFI::Writer.open(DummyIO.new) do |writer|
|
234
|
+
assert_equal(0, writer.public_send(method))
|
235
|
+
writer.write('Test')
|
236
|
+
assert_equal(4, writer.public_send(method))
|
237
|
+
writer.write('Complete')
|
238
|
+
assert_equal(12, writer.public_send(method))
|
239
|
+
end
|
236
240
|
end
|
237
|
-
end
|
238
241
|
|
239
|
-
|
240
|
-
|
242
|
+
define_method("test_#{method}_returns_uncompressed_64bit_position") do
|
243
|
+
skip_slow_test_unless_enabled
|
241
244
|
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
245
|
+
# The position is read from separate 32-bit low and high words.
|
246
|
+
Bzip2::FFI::Writer.open(DummyIO.new) do |writer|
|
247
|
+
buffer_bits = 12
|
248
|
+
buffer = "\0".encode(Encoding::ASCII_8BIT) * 2**buffer_bits
|
246
249
|
|
247
|
-
|
250
|
+
(2**(32 - buffer_bits)).times do |i|
|
251
|
+
writer.write(buffer)
|
252
|
+
end
|
253
|
+
|
254
|
+
assert_equal(2**32, writer.public_send(method))
|
248
255
|
writer.write(buffer)
|
256
|
+
assert_equal(2**32 + buffer.bytesize, writer.public_send(method))
|
249
257
|
end
|
250
|
-
|
251
|
-
assert_equal(2**32, writer.pos)
|
252
|
-
writer.write(buffer)
|
253
|
-
assert_equal(2**32 + buffer.bytesize, writer.pos)
|
254
258
|
end
|
255
|
-
end
|
256
259
|
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
260
|
+
define_method("test_#{method}_raises_io_error_when_closed") do
|
261
|
+
writer = Bzip2::FFI::Writer.new(DummyIO.new)
|
262
|
+
writer.close
|
263
|
+
assert_raises(IOError) { writer.public_send(method) }
|
264
|
+
end
|
261
265
|
end
|
262
266
|
|
263
267
|
def test_finalizer
|
data.tar.gz.sig
CHANGED
Binary file
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bzip2-ffi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Philip Ross
|
@@ -29,7 +29,7 @@ cert_chain:
|
|
29
29
|
J3Zn/kSTjTekiaspyGbczC3PUaeJNxr+yCvR4sk71Xmk/GaKKGOHedJ1uj/LAXrA
|
30
30
|
MR0mpl7b8zCg0PFC1J73uw==
|
31
31
|
-----END CERTIFICATE-----
|
32
|
-
date:
|
32
|
+
date: 2023-07-08 00:00:00.000000000 Z
|
33
33
|
dependencies:
|
34
34
|
- !ruby/object:Gem::Dependency
|
35
35
|
name: ffi
|
@@ -91,9 +91,9 @@ licenses:
|
|
91
91
|
metadata:
|
92
92
|
bug_tracker_uri: https://github.com/philr/bzip2-ffi/issues
|
93
93
|
changelog_uri: https://github.com/philr/bzip2-ffi/blob/master/CHANGES.md
|
94
|
-
documentation_uri: https://rubydoc.info/gems/bzip2-ffi/1.1.
|
94
|
+
documentation_uri: https://rubydoc.info/gems/bzip2-ffi/1.1.1
|
95
95
|
homepage_uri: https://github.com/philr/bzip2-ffi
|
96
|
-
source_code_uri: https://github.com/philr/bzip2-ffi/tree/v1.1.
|
96
|
+
source_code_uri: https://github.com/philr/bzip2-ffi/tree/v1.1.1
|
97
97
|
post_install_message:
|
98
98
|
rdoc_options:
|
99
99
|
- "--title"
|
@@ -116,8 +116,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
116
116
|
version: '0'
|
117
117
|
requirements:
|
118
118
|
- libbz2.(so|dll|dylib) available on the library search path
|
119
|
-
rubygems_version: 3.
|
119
|
+
rubygems_version: 3.4.9
|
120
120
|
signing_key:
|
121
121
|
specification_version: 4
|
122
|
-
summary: Reads and writes bzip2 compressed data using FFI bindings for
|
122
|
+
summary: Reads and writes bzip2 compressed data as a stream using FFI bindings for
|
123
|
+
libbz2.
|
123
124
|
test_files: []
|
metadata.gz.sig
CHANGED
Binary file
|