ruby-lzws 1.4.2 → 1.4.3

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.
@@ -1,174 +1,16 @@
1
1
  # Ruby bindings for lzws 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 LZWS
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
- validate_write
27
-
28
- write_remaining_buffer
29
-
30
- bytes_written = 0
31
-
32
- objects.each do |object|
33
- source = transcode object.to_s
34
- bytes_written += raw_wrapper :write, source
35
- end
36
-
37
- @pos += bytes_written
38
-
39
- bytes_written
40
- end
41
-
42
- def flush
43
- validate_write
44
-
45
- finish :flush
46
-
47
- @io.flush if @io.respond_to? :flush
48
-
49
- self
50
- end
51
-
52
- def rewind
53
- validate_write
54
-
55
- finish :close
56
-
57
- super
58
- end
59
-
60
- def close
61
- validate_write
62
-
63
- finish :close
64
-
65
- super
66
- end
67
-
68
- protected def finish(method_name)
69
- write_remaining_buffer
70
-
71
- raw_wrapper method_name
72
- end
73
-
74
- protected def write_remaining_buffer
75
- return nil if @buffer.bytesize.zero?
76
-
77
- @io.write @buffer
78
-
79
- reset_buffer
80
- end
81
-
82
- protected def raw_wrapper(method_name, *args)
83
- @raw_stream.send(method_name, *args) { |portion| @io.write portion }
84
- end
85
-
86
- def validate_write
87
- raise ValidateError, "io should be responsible to write" unless @io.respond_to? :write
88
- end
89
-
90
- # -- asynchronous --
91
-
92
- # IO write nonblock can raise wait writable error.
93
- # After resolving this error user may provide same content again.
94
- # It is not possible to revert accepted content after error.
95
- # So we have to accept content after processing IO write nonblock.
96
- # It means that first write nonblock won't call IO write nonblock.
97
- def write_nonblock(object, *options)
98
- validate_write_nonblock
99
-
100
- return 0 unless write_remaining_buffer_nonblock(*options)
101
-
102
- source = transcode object.to_s
103
- bytes_written = raw_nonblock_wrapper :write, source
104
- @pos += bytes_written
105
-
106
- bytes_written
107
- end
108
-
109
- def flush_nonblock(*options)
110
- validate_write_nonblock
111
-
112
- return false unless finish_nonblock :flush, *options
113
-
114
- @io.flush if @io.respond_to? :flush
115
-
116
- true
117
- end
118
-
119
- def rewind_nonblock(*options)
120
- validate_write_nonblock
121
-
122
- return false unless finish_nonblock :close, *options
123
-
124
- method(:rewind).super_method.call
125
-
126
- true
127
- end
128
-
129
- def close_nonblock(*options)
130
- validate_write_nonblock
131
-
132
- return false unless finish_nonblock :close, *options
133
-
134
- method(:close).super_method.call
135
-
136
- true
137
- end
138
-
139
- protected def finish_nonblock(method_name, *options)
140
- return false unless write_remaining_buffer_nonblock(*options)
141
-
142
- raw_nonblock_wrapper method_name
143
-
144
- write_remaining_buffer_nonblock(*options)
145
- end
146
-
147
- protected def write_remaining_buffer_nonblock(*options)
148
- return true if @buffer.bytesize.zero?
149
-
150
- bytes_written = @io.write_nonblock @buffer, *options
151
- return false if bytes_written.zero?
152
-
153
- @buffer = @buffer.byteslice bytes_written, @buffer.bytesize - bytes_written
154
-
155
- @buffer.bytesize.zero?
156
- end
157
-
158
- protected def raw_nonblock_wrapper(method_name, *args)
159
- @raw_stream.send(method_name, *args) { |portion| @buffer << portion }
160
- end
161
-
162
- def validate_write_nonblock
163
- raise ValidateError, "io should be responsible to write nonblock" unless @io.respond_to? :write_nonblock
164
- end
165
-
166
- # -- common --
167
-
168
- protected def transcode(data)
169
- data = data.encode @external_encoding, **@transcode_options unless @external_encoding.nil?
170
- data
171
- end
10
+ # LZWS::Stream::Writer class.
11
+ class Writer < ADSP::Stream::Writer
12
+ # Current raw stream class.
13
+ RawCompressor = Raw::Compressor
172
14
  end
173
15
  end
174
16
  end
data/lib/lzws/string.rb CHANGED
@@ -1,29 +1,25 @@
1
1
  # Ruby bindings for lzws library.
2
2
  # Copyright (c) 2019 AUTHORS, MIT License.
3
3
 
4
+ require "adsp/string"
4
5
  require "lzws_ext"
5
6
 
6
7
  require_relative "option"
7
- require_relative "validation"
8
8
 
9
9
  module LZWS
10
- module String
11
- BUFFER_LENGTH_NAMES = %i[destination_buffer_length].freeze
12
-
13
- def self.compress(source, options = {})
14
- Validation.validate_string source
15
-
16
- options = Option.get_compressor_options options, BUFFER_LENGTH_NAMES
17
-
18
- LZWS._native_compress_string source, options
10
+ # LZWS::String class.
11
+ class String < ADSP::String
12
+ # Current option class.
13
+ Option = LZWS::Option
14
+
15
+ # Bypasses native compress.
16
+ def self.native_compress_string(*args)
17
+ LZWS._native_compress_string(*args)
19
18
  end
20
19
 
21
- def self.decompress(source, options = {})
22
- Validation.validate_string source
23
-
24
- options = Option.get_decompressor_options options, BUFFER_LENGTH_NAMES
25
-
26
- LZWS._native_decompress_string source, options
20
+ # Bypasses native decompress.
21
+ def self.native_decompress_string(*args)
22
+ LZWS._native_decompress_string(*args)
27
23
  end
28
24
  end
29
25
  end
@@ -1,34 +1,14 @@
1
1
  # Ruby bindings for lzws library.
2
2
  # Copyright (c) 2019 AUTHORS, MIT License.
3
3
 
4
- require_relative "error"
4
+ require "adsp/validation"
5
5
 
6
6
  module LZWS
7
- module Validation
7
+ # LZWS::Validation class.
8
+ class Validation < ADSP::Validation
9
+ # Raises error when +value+ is not boolean.
8
10
  def self.validate_bool(value)
9
11
  raise ValidateError, "invalid bool" unless value.is_a?(::TrueClass) || value.is_a?(::FalseClass)
10
12
  end
11
-
12
- def self.validate_hash(value)
13
- raise ValidateError, "invalid hash" unless value.is_a? ::Hash
14
- end
15
-
16
- def self.validate_not_negative_integer(value)
17
- raise ValidateError, "invalid not negative integer" unless value.is_a?(::Integer) && value >= 0
18
- end
19
-
20
- def self.validate_positive_integer(value)
21
- raise ValidateError, "invalid positive integer" unless value.is_a?(::Integer) && value.positive?
22
- end
23
-
24
- def self.validate_proc(value)
25
- unless value.is_a?(::Proc) || value.is_a?(::Method) || value.is_a?(::UnboundMethod)
26
- raise ValidateError, "invalid proc"
27
- end
28
- end
29
-
30
- def self.validate_string(value)
31
- raise ValidateError, "invalid string" unless value.is_a? ::String
32
- end
33
13
  end
34
14
  end
data/lib/lzws/version.rb CHANGED
@@ -2,5 +2,5 @@
2
2
  # Copyright (c) 2019 AUTHORS, MIT License.
3
3
 
4
4
  module LZWS
5
- VERSION = "1.4.2".freeze
5
+ VERSION = "1.4.3".freeze
6
6
  end
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-lzws
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.2
4
+ version: 1.4.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Aladjev
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-03-18 00:00:00.000000000 Z
11
+ date: 2022-07-06 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: adsp
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.0'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: codecov
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -58,14 +72,14 @@ dependencies:
58
72
  requirements:
59
73
  - - "~>"
60
74
  - !ruby/object:Gem::Version
61
- version: '5.15'
75
+ version: '5.16'
62
76
  type: :development
63
77
  prerelease: false
64
78
  version_requirements: !ruby/object:Gem::Requirement
65
79
  requirements:
66
80
  - - "~>"
67
81
  - !ruby/object:Gem::Version
68
- version: '5.15'
82
+ version: '5.16'
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: ocg
71
85
  requirement: !ruby/object:Gem::Requirement
@@ -122,48 +136,62 @@ dependencies:
122
136
  - - ">="
123
137
  - !ruby/object:Gem::Version
124
138
  version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: rdoc
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
125
153
  - !ruby/object:Gem::Dependency
126
154
  name: rubocop
127
155
  requirement: !ruby/object:Gem::Requirement
128
156
  requirements:
129
157
  - - "~>"
130
158
  - !ruby/object:Gem::Version
131
- version: '1.26'
159
+ version: '1.31'
132
160
  type: :development
133
161
  prerelease: false
134
162
  version_requirements: !ruby/object:Gem::Requirement
135
163
  requirements:
136
164
  - - "~>"
137
165
  - !ruby/object:Gem::Version
138
- version: '1.26'
166
+ version: '1.31'
139
167
  - !ruby/object:Gem::Dependency
140
168
  name: rubocop-minitest
141
169
  requirement: !ruby/object:Gem::Requirement
142
170
  requirements:
143
171
  - - "~>"
144
172
  - !ruby/object:Gem::Version
145
- version: '0.17'
173
+ version: '0.20'
146
174
  type: :development
147
175
  prerelease: false
148
176
  version_requirements: !ruby/object:Gem::Requirement
149
177
  requirements:
150
178
  - - "~>"
151
179
  - !ruby/object:Gem::Version
152
- version: '0.17'
180
+ version: '0.20'
153
181
  - !ruby/object:Gem::Dependency
154
182
  name: rubocop-performance
155
183
  requirement: !ruby/object:Gem::Requirement
156
184
  requirements:
157
185
  - - "~>"
158
186
  - !ruby/object:Gem::Version
159
- version: '1.13'
187
+ version: '1.14'
160
188
  type: :development
161
189
  prerelease: false
162
190
  version_requirements: !ruby/object:Gem::Requirement
163
191
  requirements:
164
192
  - - "~>"
165
193
  - !ruby/object:Gem::Version
166
- version: '1.13'
194
+ version: '1.14'
167
195
  - !ruby/object:Gem::Dependency
168
196
  name: rubocop-rake
169
197
  requirement: !ruby/object:Gem::Requirement
@@ -225,16 +253,10 @@ files:
225
253
  - lib/lzws/error.rb
226
254
  - lib/lzws/file.rb
227
255
  - lib/lzws/option.rb
228
- - lib/lzws/stream/abstract.rb
229
- - lib/lzws/stream/delegates.rb
230
- - lib/lzws/stream/raw/abstract.rb
231
256
  - lib/lzws/stream/raw/compressor.rb
232
257
  - lib/lzws/stream/raw/decompressor.rb
233
258
  - lib/lzws/stream/reader.rb
234
- - lib/lzws/stream/reader_helpers.rb
235
- - lib/lzws/stream/stat.rb
236
259
  - lib/lzws/stream/writer.rb
237
- - lib/lzws/stream/writer_helpers.rb
238
260
  - lib/lzws/string.rb
239
261
  - lib/lzws/validation.rb
240
262
  - lib/lzws/version.rb
@@ -251,7 +273,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
251
273
  requirements:
252
274
  - - ">="
253
275
  - !ruby/object:Gem::Version
254
- version: '2.5'
276
+ version: '2.6'
255
277
  required_rubygems_version: !ruby/object:Gem::Requirement
256
278
  requirements:
257
279
  - - ">="
@@ -1,156 +0,0 @@
1
- # Ruby bindings for lzws 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 LZWS
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
- @io = io
28
-
29
- @stat = Stat.new @io.stat if @io.respond_to? :stat
30
-
31
- set_encoding options[:external_encoding], options[:internal_encoding], options[:transcode_options]
32
- reset_buffer
33
- reset_io_advise
34
-
35
- @pos = 0
36
- end
37
-
38
- # -- buffer --
39
-
40
- protected def reset_buffer
41
- @buffer = ::String.new :encoding => ::Encoding::BINARY
42
- end
43
-
44
- # -- advise --
45
-
46
- protected def reset_io_advise
47
- # Both compressor and decompressor need sequential io access.
48
- @io.advise :sequential if @io.respond_to? :advise
49
- rescue ::Errno::ESPIPE
50
- # ok
51
- end
52
-
53
- def advise
54
- # Noop
55
- nil
56
- end
57
-
58
- # -- encoding --
59
-
60
- def set_encoding(*args)
61
- external_encoding, internal_encoding, transcode_options = process_set_encoding_arguments(*args)
62
-
63
- set_target_encoding :@external_encoding, external_encoding
64
- set_target_encoding :@internal_encoding, internal_encoding
65
- @transcode_options = transcode_options
66
-
67
- self
68
- end
69
-
70
- protected def process_set_encoding_arguments(*args)
71
- external_encoding = args[0]
72
-
73
- unless external_encoding.nil? || external_encoding.is_a?(::Encoding)
74
- Validation.validate_string external_encoding
75
-
76
- # First argument can be "external_encoding:internal_encoding".
77
- match = %r{(.+?):(.+)}.match external_encoding
78
-
79
- unless match.nil?
80
- external_encoding = match[0]
81
- internal_encoding = match[1]
82
-
83
- transcode_options = args[1]
84
- Validation.validate_hash transcode_options unless transcode_options.nil?
85
-
86
- return [external_encoding, internal_encoding, transcode_options]
87
- end
88
- end
89
-
90
- internal_encoding = args[1]
91
- unless internal_encoding.nil? || internal_encoding.is_a?(::Encoding)
92
- Validation.validate_string internal_encoding
93
- end
94
-
95
- transcode_options = args[2]
96
- Validation.validate_hash transcode_options unless transcode_options.nil?
97
-
98
- [external_encoding, internal_encoding, transcode_options]
99
- end
100
-
101
- protected def set_target_encoding(name, value)
102
- unless value.nil? || value.is_a?(::Encoding)
103
- begin
104
- value = ::Encoding.find value
105
- rescue ::ArgumentError
106
- raise ValidateError, "invalid #{name} encoding"
107
- end
108
- end
109
-
110
- instance_variable_set name, value
111
- end
112
-
113
- protected def target_encoding
114
- return @internal_encoding unless @internal_encoding.nil?
115
- return @external_encoding unless @external_encoding.nil?
116
-
117
- ::Encoding::BINARY
118
- end
119
-
120
- # -- etc --
121
-
122
- def rewind
123
- @raw_stream = create_raw_stream
124
-
125
- @io.rewind if @io.respond_to? :rewind
126
-
127
- reset_buffer
128
- reset_io_advise
129
-
130
- @pos = 0
131
-
132
- 0
133
- end
134
-
135
- def close
136
- @io.close if @io.respond_to? :close
137
-
138
- nil
139
- end
140
-
141
- def closed?
142
- return false unless @raw_stream.closed?
143
-
144
- if @io.respond_to? :closed
145
- @io.closed?
146
- else
147
- true
148
- end
149
- end
150
-
151
- def to_io
152
- self
153
- end
154
- end
155
- end
156
- end
@@ -1,36 +0,0 @@
1
- # Ruby bindings for lzws library.
2
- # Copyright (c) 2019 AUTHORS, MIT License.
3
-
4
- require "forwardable"
5
-
6
- module LZWS
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,63 +0,0 @@
1
- # Ruby bindings for lzws library.
2
- # Copyright (c) 2019 AUTHORS, MIT License.
3
-
4
- require "lzws_ext"
5
-
6
- require_relative "../../error"
7
- require_relative "../../validation"
8
-
9
- module LZWS
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
- do_not_use_after_close
22
-
23
- Validation.validate_proc writer
24
-
25
- write_result(&writer)
26
-
27
- nil
28
- end
29
-
30
- protected def more_destination(&writer)
31
- result_bytesize = write_result(&writer)
32
- raise NotEnoughDestinationError, "not enough destination" if result_bytesize.zero?
33
- end
34
-
35
- protected def write_result(&_writer)
36
- result = @native_stream.read_result
37
- yield result
38
-
39
- result.bytesize
40
- end
41
-
42
- # -- close --
43
-
44
- protected def do_not_use_after_close
45
- raise UsedAfterCloseError, "used after close" if closed?
46
- end
47
-
48
- def close(&writer)
49
- write_result(&writer)
50
-
51
- @native_stream.close
52
- @is_closed = true
53
-
54
- nil
55
- end
56
-
57
- def closed?
58
- @is_closed
59
- end
60
- end
61
- end
62
- end
63
- end