ruby-zstds 1.2.0 → 1.3.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,150 +1,16 @@
1
1
  # Ruby bindings for zstd library.
2
2
  # Copyright (c) 2019 AUTHORS, MIT License.
3
3
 
4
- require_relative "abstract"
4
+ require "adsp/stream/writer"
5
+
5
6
  require_relative "raw/compressor"
6
- require_relative "writer_helpers"
7
7
 
8
8
  module ZSTDS
9
9
  module Stream
10
- class Writer < Abstract
11
- include WriterHelpers
12
-
13
- def initialize(destination_io, options = {}, *args)
14
- @options = options
15
-
16
- super destination_io, *args
17
- end
18
-
19
- protected def create_raw_stream
20
- Raw::Compressor.new @options
21
- end
22
-
23
- # -- synchronous --
24
-
25
- def write(*objects)
26
- write_remaining_buffer
27
-
28
- bytes_written = 0
29
-
30
- objects.each do |object|
31
- source = transcode object.to_s
32
- bytes_written += raw_wrapper :write, source
33
- end
34
-
35
- @pos += bytes_written
36
-
37
- bytes_written
38
- end
39
-
40
- def flush
41
- finish :flush
42
-
43
- @io.flush
44
-
45
- self
46
- end
47
-
48
- def rewind
49
- finish :close
50
-
51
- super
52
- end
53
-
54
- def close
55
- finish :close
56
-
57
- super
58
- end
59
-
60
- protected def finish(method_name)
61
- write_remaining_buffer
62
-
63
- raw_wrapper method_name
64
- end
65
-
66
- protected def write_remaining_buffer
67
- return nil if @buffer.bytesize.zero?
68
-
69
- @io.write @buffer
70
-
71
- reset_buffer
72
- end
73
-
74
- protected def raw_wrapper(method_name, *args)
75
- @raw_stream.send(method_name, *args) { |portion| @io.write portion }
76
- end
77
-
78
- # -- asynchronous --
79
-
80
- # IO write nonblock can raise wait writable error.
81
- # After resolving this error user may provide same content again.
82
- # It is not possible to revert accepted content after error.
83
- # So we have to accept content after processing IO write nonblock.
84
- # It means that first write nonblock won't call IO write nonblock.
85
- def write_nonblock(object, *options)
86
- return 0 unless write_remaining_buffer_nonblock(*options)
87
-
88
- source = transcode object.to_s
89
- bytes_written = raw_nonblock_wrapper :write, source
90
- @pos += bytes_written
91
-
92
- bytes_written
93
- end
94
-
95
- def flush_nonblock(*options)
96
- return false unless finish_nonblock :flush, *options
97
-
98
- @io.flush
99
-
100
- true
101
- end
102
-
103
- def rewind_nonblock(*options)
104
- return false unless finish_nonblock :close, *options
105
-
106
- method(:rewind).super_method.call
107
-
108
- true
109
- end
110
-
111
- def close_nonblock(*options)
112
- return false unless finish_nonblock :close, *options
113
-
114
- method(:close).super_method.call
115
-
116
- true
117
- end
118
-
119
- protected def finish_nonblock(method_name, *options)
120
- return false unless write_remaining_buffer_nonblock(*options)
121
-
122
- raw_nonblock_wrapper method_name
123
-
124
- write_remaining_buffer_nonblock(*options)
125
- end
126
-
127
- protected def write_remaining_buffer_nonblock(*options)
128
- return true if @buffer.bytesize.zero?
129
-
130
- bytes_written = @io.write_nonblock @buffer, *options
131
- return false if bytes_written.zero?
132
-
133
- @buffer = @buffer.byteslice bytes_written, @buffer.bytesize - bytes_written
134
-
135
- @buffer.bytesize.zero?
136
- end
137
-
138
- protected def raw_nonblock_wrapper(method_name, *args)
139
- @raw_stream.send(method_name, *args) { |portion| @buffer << portion }
140
- end
141
-
142
- # -- common --
143
-
144
- protected def transcode(data)
145
- data = data.encode @external_encoding, **@transcode_options unless @external_encoding.nil?
146
- data
147
- end
10
+ # ZSTDS::Stream::Writer class.
11
+ class Writer < ADSP::Stream::Writer
12
+ # Current raw stream class.
13
+ RawCompressor = Raw::Compressor
148
14
  end
149
15
  end
150
16
  end
data/lib/zstds/string.rb CHANGED
@@ -1,15 +1,22 @@
1
1
  # Ruby bindings for zstd library.
2
2
  # Copyright (c) 2019 AUTHORS, MIT License.
3
3
 
4
+ require "adsp/string"
4
5
  require "zstds_ext"
5
6
 
6
7
  require_relative "option"
7
8
  require_relative "validation"
8
9
 
9
10
  module ZSTDS
10
- module String
11
- BUFFER_LENGTH_NAMES = %i[destination_buffer_length].freeze
12
-
11
+ # ZSTDS::String class.
12
+ class String < ADSP::String
13
+ # Current option class.
14
+ Option = ZSTDS::Option
15
+
16
+ # Compresses +source+ string using +options+.
17
+ # Option: +:destination_buffer_length+ destination buffer length.
18
+ # Option: +:pledged_size+ source bytesize.
19
+ # Returns compressed string.
13
20
  def self.compress(source, options = {})
14
21
  Validation.validate_string source
15
22
 
@@ -17,15 +24,17 @@ module ZSTDS
17
24
 
18
25
  options[:pledged_size] = source.bytesize
19
26
 
20
- ZSTDS._native_compress_string source, options
27
+ super source, options
21
28
  end
22
29
 
23
- def self.decompress(source, options = {})
24
- Validation.validate_string source
25
-
26
- options = Option.get_decompressor_options options, BUFFER_LENGTH_NAMES
30
+ # Bypasses native compress.
31
+ def self.native_compress_string(*args)
32
+ ZSTDS._native_compress_string(*args)
33
+ end
27
34
 
28
- ZSTDS._native_decompress_string source, options
35
+ # Bypasses native decompress.
36
+ def self.native_decompress_string(*args)
37
+ ZSTDS._native_decompress_string(*args)
29
38
  end
30
39
  end
31
40
  end
@@ -1,63 +1,19 @@
1
1
  # Ruby bindings for zstd library.
2
2
  # Copyright (c) 2019 AUTHORS, MIT License.
3
3
 
4
- require_relative "error"
4
+ require "adsp/validation"
5
5
 
6
6
  module ZSTDS
7
- module Validation
8
- IO_METHODS = %i[
9
- read
10
- write
11
- readpartial
12
- read_nonblock
13
- write_nonblock
14
- eof?
15
- flush
16
- close
17
- closed?
18
- ]
19
- .freeze
20
-
7
+ # ZSTDS::Validation class.
8
+ class Validation < ADSP::Validation
9
+ # Raises error when +value+ is not boolean.
21
10
  def self.validate_bool(value)
22
11
  raise ValidateError, "invalid bool" unless value.is_a?(::TrueClass) || value.is_a?(::FalseClass)
23
12
  end
24
13
 
14
+ # Raises error when +value+ is not integer.
25
15
  def self.validate_integer(value)
26
16
  raise ValidateError, "invalid integer" unless value.is_a? ::Integer
27
17
  end
28
-
29
- def self.validate_positive_integer(value)
30
- raise ValidateError, "invalid positive integer" unless value.is_a?(::Integer) && value.positive?
31
- end
32
-
33
- def self.validate_not_negative_integer(value)
34
- raise ValidateError, "invalid not negative integer" unless value.is_a?(::Integer) && value >= 0
35
- end
36
-
37
- def self.validate_string(value)
38
- raise ValidateError, "invalid string" unless value.is_a? ::String
39
- end
40
-
41
- def self.validate_symbol(value)
42
- raise ValidateError, "invalid symbol" unless value.is_a? ::Symbol
43
- end
44
-
45
- def self.validate_io(value)
46
- raise ValidateError, "invalid io" unless IO_METHODS.all? { |method| value.respond_to? method }
47
- end
48
-
49
- def self.validate_array(value)
50
- raise ValidateError, "invalid array" unless value.is_a? ::Array
51
- end
52
-
53
- def self.validate_hash(value)
54
- raise ValidateError, "invalid hash" unless value.is_a? ::Hash
55
- end
56
-
57
- def self.validate_proc(value)
58
- unless value.is_a?(::Proc) || value.is_a?(::Method) || value.is_a?(::UnboundMethod)
59
- raise ValidateError, "invalid proc"
60
- end
61
- end
62
18
  end
63
19
  end
data/lib/zstds/version.rb CHANGED
@@ -2,5 +2,5 @@
2
2
  # Copyright (c) 2019 AUTHORS, MIT License.
3
3
 
4
4
  module ZSTDS
5
- VERSION = "1.2.0".freeze
5
+ VERSION = "1.3.1".freeze
6
6
  end
metadata CHANGED
@@ -1,15 +1,31 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-zstds
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Aladjev
8
+ - Ivan Takarlikov
9
+ - Jenner La Fave
8
10
  autorequire:
9
11
  bindir: bin
10
12
  cert_chain: []
11
- date: 2021-09-30 00:00:00.000000000 Z
13
+ date: 2022-07-06 00:00:00.000000000 Z
12
14
  dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: adsp
17
+ requirement: !ruby/object:Gem::Requirement
18
+ requirements:
19
+ - - "~>"
20
+ - !ruby/object:Gem::Version
21
+ version: '1.0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ requirements:
26
+ - - "~>"
27
+ - !ruby/object:Gem::Version
28
+ version: '1.0'
13
29
  - !ruby/object:Gem::Dependency
14
30
  name: codecov
15
31
  requirement: !ruby/object:Gem::Requirement
@@ -58,14 +74,14 @@ dependencies:
58
74
  requirements:
59
75
  - - "~>"
60
76
  - !ruby/object:Gem::Version
61
- version: '5.14'
77
+ version: '5.16'
62
78
  type: :development
63
79
  prerelease: false
64
80
  version_requirements: !ruby/object:Gem::Requirement
65
81
  requirements:
66
82
  - - "~>"
67
83
  - !ruby/object:Gem::Version
68
- version: '5.14'
84
+ version: '5.16'
69
85
  - !ruby/object:Gem::Dependency
70
86
  name: ocg
71
87
  requirement: !ruby/object:Gem::Requirement
@@ -122,48 +138,62 @@ dependencies:
122
138
  - - ">="
123
139
  - !ruby/object:Gem::Version
124
140
  version: '0'
141
+ - !ruby/object:Gem::Dependency
142
+ name: rdoc
143
+ requirement: !ruby/object:Gem::Requirement
144
+ requirements:
145
+ - - ">="
146
+ - !ruby/object:Gem::Version
147
+ version: '0'
148
+ type: :development
149
+ prerelease: false
150
+ version_requirements: !ruby/object:Gem::Requirement
151
+ requirements:
152
+ - - ">="
153
+ - !ruby/object:Gem::Version
154
+ version: '0'
125
155
  - !ruby/object:Gem::Dependency
126
156
  name: rubocop
127
157
  requirement: !ruby/object:Gem::Requirement
128
158
  requirements:
129
159
  - - "~>"
130
160
  - !ruby/object:Gem::Version
131
- version: '1.22'
161
+ version: '1.31'
132
162
  type: :development
133
163
  prerelease: false
134
164
  version_requirements: !ruby/object:Gem::Requirement
135
165
  requirements:
136
166
  - - "~>"
137
167
  - !ruby/object:Gem::Version
138
- version: '1.22'
168
+ version: '1.31'
139
169
  - !ruby/object:Gem::Dependency
140
170
  name: rubocop-minitest
141
171
  requirement: !ruby/object:Gem::Requirement
142
172
  requirements:
143
173
  - - "~>"
144
174
  - !ruby/object:Gem::Version
145
- version: '0.15'
175
+ version: '0.20'
146
176
  type: :development
147
177
  prerelease: false
148
178
  version_requirements: !ruby/object:Gem::Requirement
149
179
  requirements:
150
180
  - - "~>"
151
181
  - !ruby/object:Gem::Version
152
- version: '0.15'
182
+ version: '0.20'
153
183
  - !ruby/object:Gem::Dependency
154
184
  name: rubocop-performance
155
185
  requirement: !ruby/object:Gem::Requirement
156
186
  requirements:
157
187
  - - "~>"
158
188
  - !ruby/object:Gem::Version
159
- version: '1.11'
189
+ version: '1.14'
160
190
  type: :development
161
191
  prerelease: false
162
192
  version_requirements: !ruby/object:Gem::Requirement
163
193
  requirements:
164
194
  - - "~>"
165
195
  - !ruby/object:Gem::Version
166
- version: '1.11'
196
+ version: '1.14'
167
197
  - !ruby/object:Gem::Dependency
168
198
  name: rubocop-rake
169
199
  requirement: !ruby/object:Gem::Requirement
@@ -228,23 +258,18 @@ files:
228
258
  - lib/zstds/error.rb
229
259
  - lib/zstds/file.rb
230
260
  - lib/zstds/option.rb
231
- - lib/zstds/stream/abstract.rb
232
- - lib/zstds/stream/delegates.rb
233
- - lib/zstds/stream/raw/abstract.rb
234
261
  - lib/zstds/stream/raw/compressor.rb
235
262
  - lib/zstds/stream/raw/decompressor.rb
236
263
  - lib/zstds/stream/reader.rb
237
- - lib/zstds/stream/reader_helpers.rb
238
- - lib/zstds/stream/stat.rb
239
264
  - lib/zstds/stream/writer.rb
240
- - lib/zstds/stream/writer_helpers.rb
241
265
  - lib/zstds/string.rb
242
266
  - lib/zstds/validation.rb
243
267
  - lib/zstds/version.rb
244
268
  homepage: https://github.com/andrew-aladev/ruby-zstds
245
269
  licenses:
246
270
  - MIT
247
- metadata: {}
271
+ metadata:
272
+ rubygems_mfa_required: 'true'
248
273
  post_install_message:
249
274
  rdoc_options: []
250
275
  require_paths:
@@ -253,14 +278,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
253
278
  requirements:
254
279
  - - ">="
255
280
  - !ruby/object:Gem::Version
256
- version: '2.5'
281
+ version: '2.6'
257
282
  required_rubygems_version: !ruby/object:Gem::Requirement
258
283
  requirements:
259
284
  - - ">="
260
285
  - !ruby/object:Gem::Version
261
286
  version: '0'
262
287
  requirements: []
263
- rubygems_version: 3.2.22
288
+ rubygems_version: 3.3.7
264
289
  signing_key:
265
290
  specification_version: 4
266
291
  summary: Ruby bindings for zstd library.
@@ -1,152 +0,0 @@
1
- # Ruby bindings for zstd library.
2
- # Copyright (c) 2019 AUTHORS, MIT License.
3
-
4
- require_relative "delegates"
5
- require_relative "stat"
6
- require_relative "../error"
7
- require_relative "../validation"
8
-
9
- module ZSTDS
10
- module Stream
11
- class Abstract
12
- # Native stream is not seekable by design.
13
- # Related methods like "seek" and "pos=" can't be implemented.
14
-
15
- # It is not possible to maintain correspondance between bytes
16
- # consumed from source and bytes written to destination by design.
17
- # We will consume all source bytes and maintain buffer with remaining destination data.
18
-
19
- include Delegates
20
-
21
- attr_reader :io, :stat, :external_encoding, :internal_encoding, :transcode_options, :pos
22
-
23
- alias tell pos
24
-
25
- def initialize(io, options = {})
26
- @raw_stream = create_raw_stream
27
-
28
- Validation.validate_io io
29
- @io = io
30
-
31
- @stat = Stat.new @io.stat if @io.respond_to? :stat
32
-
33
- set_encoding options[:external_encoding], options[:internal_encoding], options[:transcode_options]
34
- reset_buffer
35
- reset_io_advise
36
-
37
- @pos = 0
38
- end
39
-
40
- # -- buffer --
41
-
42
- protected def reset_buffer
43
- @buffer = ::String.new :encoding => ::Encoding::BINARY
44
- end
45
-
46
- # -- advise --
47
-
48
- protected def reset_io_advise
49
- # Both compressor and decompressor need sequential io access.
50
- @io.advise :sequential if @io.respond_to? :advise
51
- rescue ::Errno::ESPIPE
52
- # ok
53
- end
54
-
55
- def advise
56
- # Noop
57
- nil
58
- end
59
-
60
- # -- encoding --
61
-
62
- def set_encoding(*args)
63
- external_encoding, internal_encoding, transcode_options = process_set_encoding_arguments(*args)
64
-
65
- set_target_encoding :@external_encoding, external_encoding
66
- set_target_encoding :@internal_encoding, internal_encoding
67
- @transcode_options = transcode_options
68
-
69
- self
70
- end
71
-
72
- protected def process_set_encoding_arguments(*args)
73
- external_encoding = args[0]
74
-
75
- unless external_encoding.nil? || external_encoding.is_a?(::Encoding)
76
- Validation.validate_string external_encoding
77
-
78
- # First argument can be "external_encoding:internal_encoding".
79
- match = %r{(.+?):(.+)}.match external_encoding
80
-
81
- unless match.nil?
82
- external_encoding = match[0]
83
- internal_encoding = match[1]
84
-
85
- transcode_options = args[1]
86
- Validation.validate_hash transcode_options unless transcode_options.nil?
87
-
88
- return [external_encoding, internal_encoding, transcode_options]
89
- end
90
- end
91
-
92
- internal_encoding = args[1]
93
- unless internal_encoding.nil? || internal_encoding.is_a?(::Encoding)
94
- Validation.validate_string internal_encoding
95
- end
96
-
97
- transcode_options = args[2]
98
- Validation.validate_hash transcode_options unless transcode_options.nil?
99
-
100
- [external_encoding, internal_encoding, transcode_options]
101
- end
102
-
103
- protected def set_target_encoding(name, value)
104
- unless value.nil? || value.is_a?(::Encoding)
105
- begin
106
- value = ::Encoding.find value
107
- rescue ::ArgumentError
108
- raise ValidateError, "invalid #{name} encoding"
109
- end
110
- end
111
-
112
- instance_variable_set name, value
113
- end
114
-
115
- protected def target_encoding
116
- return @internal_encoding unless @internal_encoding.nil?
117
- return @external_encoding unless @external_encoding.nil?
118
-
119
- ::Encoding::BINARY
120
- end
121
-
122
- # -- etc --
123
-
124
- def rewind
125
- @raw_stream = create_raw_stream
126
-
127
- @io.rewind if @io.respond_to? :rewind
128
-
129
- reset_buffer
130
- reset_io_advise
131
-
132
- @pos = 0
133
-
134
- 0
135
- end
136
-
137
- def close
138
- @io.close
139
-
140
- nil
141
- end
142
-
143
- def closed?
144
- @raw_stream.closed? && @io.closed?
145
- end
146
-
147
- def to_io
148
- self
149
- end
150
- end
151
- end
152
- end
@@ -1,36 +0,0 @@
1
- # Ruby bindings for zstd library.
2
- # Copyright (c) 2019 AUTHORS, MIT License.
3
-
4
- require "forwardable"
5
-
6
- module ZSTDS
7
- module Stream
8
- module Delegates
9
- DELEGATES = %i[
10
- autoclose=
11
- autoclose?
12
- binmode
13
- binmode?
14
- close_on_exec=
15
- close_on_exec?
16
- fcntl
17
- fdatasync
18
- fileno
19
- fsync
20
- ioctl
21
- isatty
22
- pid
23
- sync
24
- sync=
25
- to_i
26
- tty?
27
- ]
28
- .freeze
29
-
30
- def self.included(klass)
31
- klass.extend ::Forwardable
32
- klass.def_delegators :@io, *DELEGATES
33
- end
34
- end
35
- end
36
- end
@@ -1,59 +0,0 @@
1
- # Ruby bindings for zstd library.
2
- # Copyright (c) 2019 AUTHORS, MIT License.
3
-
4
- require "zstds_ext"
5
-
6
- require_relative "../../error"
7
- require_relative "../../validation"
8
-
9
- module ZSTDS
10
- module Stream
11
- module Raw
12
- class Abstract
13
- def initialize(native_stream)
14
- @native_stream = native_stream
15
- @is_closed = false
16
- end
17
-
18
- # -- write --
19
-
20
- def flush(&writer)
21
- write_result(&writer)
22
-
23
- nil
24
- end
25
-
26
- protected def more_destination(&writer)
27
- result_bytesize = write_result(&writer)
28
- raise NotEnoughDestinationError, "not enough destination" if result_bytesize.zero?
29
- end
30
-
31
- protected def write_result(&_writer)
32
- result = @native_stream.read_result
33
- yield result
34
-
35
- result.bytesize
36
- end
37
-
38
- # -- close --
39
-
40
- protected def do_not_use_after_close
41
- raise UsedAfterCloseError, "used after close" if closed?
42
- end
43
-
44
- def close(&writer)
45
- write_result(&writer)
46
-
47
- @native_stream.close
48
- @is_closed = true
49
-
50
- nil
51
- end
52
-
53
- def closed?
54
- @is_closed
55
- end
56
- end
57
- end
58
- end
59
- end