ruby-brs 1.0.1 → 1.1.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 +4 -4
- data/README.md +21 -8
- data/ext/brs_ext/buffer.c +17 -5
- data/ext/brs_ext/buffer.h +12 -0
- data/ext/brs_ext/error.c +2 -2
- data/ext/brs_ext/error.h +1 -1
- data/ext/brs_ext/io.c +45 -27
- data/ext/brs_ext/option.c +24 -17
- data/ext/brs_ext/option.h +7 -7
- data/ext/brs_ext/stream/compressor.c +5 -3
- data/ext/brs_ext/stream/decompressor.c +5 -4
- data/ext/brs_ext/string.c +26 -39
- data/ext/extconf.rb +33 -31
- data/lib/brs/file.rb +2 -0
- data/lib/brs/option.rb +14 -7
- data/lib/brs/stream/raw/compressor.rb +5 -1
- data/lib/brs/string.rb +2 -0
- data/lib/brs/version.rb +1 -1
- data/lib/brs.rb +1 -0
- metadata +26 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 76cee1124501f374a5f27ca52ecd1b632058bfb3136e2fa3c1f447ae292d9f23
|
4
|
+
data.tar.gz: 4436a321a655174132a371e8140a892f18fcd365efbd4fd3da4ee2f1683d2c19
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1b9d0d1bead338ba24ee95dad6c6387a8ab31bb1e037147d4c15955176eaf1314120b1c0ced1bc68dc6c7c498ade16b22be90f0d89b76eaf31542c48c562ac09
|
7
|
+
data.tar.gz: 470a2e6fab1f66d787d92dc352094f2c34e9c0f788545bc08a3643e3cc4faa6369804c24ec5499666894b130600630e9455b70f5c0b2c9b38148eb979111f188
|
data/README.md
CHANGED
@@ -1,13 +1,14 @@
|
|
1
1
|
# Ruby bindings for brotli library
|
2
2
|
|
3
|
-
|
4
|
-
|
3
|
+
| Travis | AppVeyor | Cirrus | Circle |
|
4
|
+
| :---: | :---: | :---: | :---: |
|
5
|
+
| [](https://travis-ci.com/andrew-aladev/ruby-brs) | [](https://ci.appveyor.com/project/andrew-aladev/ruby-brs/branch/master) | [](https://cirrus-ci.com/github/andrew-aladev/ruby-brs) | [](https://circleci.com/gh/andrew-aladev/ruby-brs/tree/master) |
|
5
6
|
|
6
7
|
See [brotli library](https://github.com/google/brotli).
|
7
8
|
|
8
9
|
## Installation
|
9
10
|
|
10
|
-
Please install brotli library first.
|
11
|
+
Please install brotli library first, use latest 1.0.0+ version.
|
11
12
|
|
12
13
|
```sh
|
13
14
|
gem install ruby-brs
|
@@ -79,25 +80,25 @@ Values: 0 - infinity, default value: 0.
|
|
79
80
|
:mode
|
80
81
|
```
|
81
82
|
|
82
|
-
Values:
|
83
|
+
Values: `BRS::Option::MODES`, default value: `:generic`.
|
83
84
|
|
84
85
|
```
|
85
86
|
:quality
|
86
87
|
```
|
87
88
|
|
88
|
-
Values:
|
89
|
+
Values: `BRS::Option::MIN_QUALITY` - `BRS::Option::MAX_QUALITY`, default value: `BRS::Option::MAX_QUALITY`.
|
89
90
|
|
90
91
|
```
|
91
92
|
:lgwin
|
92
93
|
```
|
93
94
|
|
94
|
-
Values:
|
95
|
+
Values: `BRS::Option::MIN_LGWIN` - `BRS::Option::MAX_LGWIN`, default value: `22`.
|
95
96
|
|
96
97
|
```
|
97
98
|
:lgblock
|
98
99
|
```
|
99
100
|
|
100
|
-
Values:
|
101
|
+
Values: `BRS::Option::MIN_LGBLOCK` - `BRS::Option::MAX_LGBLOCK`, default value: none.
|
101
102
|
|
102
103
|
```
|
103
104
|
:disable_literal_context_modeling
|
@@ -116,6 +117,8 @@ Values: true/false, default value: false.
|
|
116
117
|
```
|
117
118
|
|
118
119
|
Values: 0 - infinity, default value: 0.
|
120
|
+
It is reasonable to provide size of input (if known) for streaming api.
|
121
|
+
`String` and `File` will set `:size_hint` automaticaly.
|
119
122
|
|
120
123
|
```
|
121
124
|
:large_window
|
@@ -151,7 +154,7 @@ data = BRS::String.compress "sample string", :quality => 5
|
|
151
154
|
puts BRS::String.decompress(data, :disable_ring_buffer_reallocation => true)
|
152
155
|
```
|
153
156
|
|
154
|
-
|
157
|
+
HTTP encoding (`Content-Encoding: br`) using default options:
|
155
158
|
|
156
159
|
```ruby
|
157
160
|
require "brs"
|
@@ -198,6 +201,8 @@ Writer maintains destination buffer only, so it accepts `destination_buffer_leng
|
|
198
201
|
Open file path and create stream writer associated with opened file.
|
199
202
|
Data will be transcoded to `:external_encoding` using `:transcode_options` before compressing.
|
200
203
|
|
204
|
+
It may be tricky to use both `:size_hint` and `:transcode_options`. You have to provide size of transcoded input.
|
205
|
+
|
201
206
|
```
|
202
207
|
::new(destination_io, options = {}, :external_encoding => nil, :transcode_options => {})
|
203
208
|
```
|
@@ -205,6 +210,8 @@ Data will be transcoded to `:external_encoding` using `:transcode_options` befor
|
|
205
210
|
Create stream writer associated with destination io.
|
206
211
|
Data will be transcoded to `:external_encoding` using `:transcode_options` before compressing.
|
207
212
|
|
213
|
+
It may be tricky to use both `:size_hint` and `:transcode_options`. You have to provide size of transcoded input.
|
214
|
+
|
208
215
|
```
|
209
216
|
#set_encoding(external_encoding, nil, transcode_options)
|
210
217
|
```
|
@@ -334,6 +341,12 @@ See [`IO`](https://ruby-doc.org/core-2.6.1/IO.html) docs.
|
|
334
341
|
|
335
342
|
Typical helpers, see [`Zlib::GzipReader`](https://ruby-doc.org/stdlib-2.6.1/libdoc/zlib/rdoc/Zlib/GzipReader.html) docs.
|
336
343
|
|
344
|
+
## CI
|
345
|
+
|
346
|
+
Travis and Appveyor CI uses [scripts/ci_test.sh](scripts/ci_test.sh) directly.
|
347
|
+
Cirrus and Circle CI uses prebuilt [scripts/test-images](scripts/test-images).
|
348
|
+
Cirrus CI uses amd64 image, Circle CI - i686.
|
349
|
+
|
337
350
|
## License
|
338
351
|
|
339
352
|
MIT license, see LICENSE and AUTHORS.
|
data/ext/brs_ext/buffer.c
CHANGED
@@ -5,12 +5,24 @@
|
|
5
5
|
|
6
6
|
#include "ruby.h"
|
7
7
|
|
8
|
+
VALUE brs_ext_create_string_buffer(VALUE length)
|
9
|
+
{
|
10
|
+
return rb_str_new(NULL, NUM2SIZET(length));
|
11
|
+
}
|
12
|
+
|
13
|
+
VALUE brs_ext_resize_string_buffer(VALUE args)
|
14
|
+
{
|
15
|
+
VALUE buffer = rb_ary_entry(args, 0);
|
16
|
+
VALUE length = rb_ary_entry(args, 1);
|
17
|
+
return rb_str_resize(buffer, NUM2SIZET(length));
|
18
|
+
}
|
19
|
+
|
8
20
|
void brs_ext_buffer_exports(VALUE root_module)
|
9
21
|
{
|
10
|
-
VALUE
|
22
|
+
VALUE module = rb_define_module_under(root_module, "Buffer");
|
11
23
|
|
12
|
-
rb_define_const(
|
13
|
-
rb_define_const(
|
14
|
-
rb_define_const(
|
15
|
-
rb_define_const(
|
24
|
+
rb_define_const(module, "DEFAULT_SOURCE_BUFFER_LENGTH_FOR_COMPRESSOR", SIZET2NUM(BRS_DEFAULT_SOURCE_BUFFER_LENGTH_FOR_COMPRESSOR));
|
25
|
+
rb_define_const(module, "DEFAULT_DESTINATION_BUFFER_LENGTH_FOR_COMPRESSOR", SIZET2NUM(BRS_DEFAULT_DESTINATION_BUFFER_LENGTH_FOR_COMPRESSOR));
|
26
|
+
rb_define_const(module, "DEFAULT_SOURCE_BUFFER_LENGTH_FOR_DECOMPRESSOR", SIZET2NUM(BRS_DEFAULT_SOURCE_BUFFER_LENGTH_FOR_DECOMPRESSOR));
|
27
|
+
rb_define_const(module, "DEFAULT_DESTINATION_BUFFER_LENGTH_FOR_DECOMPRESSOR", SIZET2NUM(BRS_DEFAULT_DESTINATION_BUFFER_LENGTH_FOR_DECOMPRESSOR));
|
16
28
|
}
|
data/ext/brs_ext/buffer.h
CHANGED
@@ -12,6 +12,18 @@
|
|
12
12
|
#define BRS_DEFAULT_SOURCE_BUFFER_LENGTH_FOR_DECOMPRESSOR (1 << 16) // 64 KB
|
13
13
|
#define BRS_DEFAULT_DESTINATION_BUFFER_LENGTH_FOR_DECOMPRESSOR (1 << 18) // 256 KB
|
14
14
|
|
15
|
+
VALUE brs_ext_create_string_buffer(VALUE length);
|
16
|
+
|
17
|
+
#define BRS_EXT_CREATE_STRING_BUFFER(buffer, length, exception) \
|
18
|
+
VALUE buffer = rb_protect(brs_ext_create_string_buffer, SIZET2NUM(length), &exception);
|
19
|
+
|
20
|
+
VALUE brs_ext_resize_string_buffer(VALUE args);
|
21
|
+
|
22
|
+
#define BRS_EXT_RESIZE_STRING_BUFFER(buffer, length, exception) \
|
23
|
+
VALUE args = rb_ary_new_from_args(2, buffer, SIZET2NUM(length)); \
|
24
|
+
buffer = rb_protect(brs_ext_resize_string_buffer, args, &exception); \
|
25
|
+
RB_GC_GUARD(args);
|
26
|
+
|
15
27
|
void brs_ext_buffer_exports(VALUE root_module);
|
16
28
|
|
17
29
|
#endif // BRS_EXT_BUFFER_H
|
data/ext/brs_ext/error.c
CHANGED
@@ -47,9 +47,9 @@ static inline NORETURN(void raise(const char* name, const char* description))
|
|
47
47
|
rb_raise(error, "%s", description);
|
48
48
|
}
|
49
49
|
|
50
|
-
void brs_ext_raise_error(brs_ext_result_t
|
50
|
+
void brs_ext_raise_error(brs_ext_result_t ext_result)
|
51
51
|
{
|
52
|
-
switch (
|
52
|
+
switch (ext_result) {
|
53
53
|
case BRS_EXT_ERROR_ALLOCATE_FAILED:
|
54
54
|
raise("AllocateError", "allocate error");
|
55
55
|
case BRS_EXT_ERROR_VALIDATE_FAILED:
|
data/ext/brs_ext/error.h
CHANGED
@@ -29,6 +29,6 @@ enum {
|
|
29
29
|
|
30
30
|
brs_ext_result_t brs_ext_get_decompressor_error(BrotliDecoderErrorCode error_code);
|
31
31
|
|
32
|
-
NORETURN(void brs_ext_raise_error(brs_ext_result_t
|
32
|
+
NORETURN(void brs_ext_raise_error(brs_ext_result_t ext_result));
|
33
33
|
|
34
34
|
#endif // BRS_EXT_ERROR_H
|
data/ext/brs_ext/io.c
CHANGED
@@ -5,6 +5,7 @@
|
|
5
5
|
|
6
6
|
#include <brotli/decode.h>
|
7
7
|
#include <brotli/encode.h>
|
8
|
+
#include <brotli/types.h>
|
8
9
|
#include <stdint.h>
|
9
10
|
#include <stdio.h>
|
10
11
|
#include <stdlib.h>
|
@@ -116,29 +117,43 @@ static inline brs_ext_result_t read_more_source(
|
|
116
117
|
return 0;
|
117
118
|
}
|
118
119
|
|
119
|
-
#define BUFFERED_READ_SOURCE(function, ...)
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
}
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
120
|
+
#define BUFFERED_READ_SOURCE(function, ...) \
|
121
|
+
do { \
|
122
|
+
bool is_function_called = false; \
|
123
|
+
\
|
124
|
+
while (true) { \
|
125
|
+
ext_result = read_more_source( \
|
126
|
+
source_file, \
|
127
|
+
&source, &source_length, \
|
128
|
+
source_buffer, source_buffer_length); \
|
129
|
+
\
|
130
|
+
if (ext_result == BRS_EXT_FILE_READ_FINISHED) { \
|
131
|
+
if (source_length != 0) { \
|
132
|
+
/* Brotli won't provide any remainder by design. */ \
|
133
|
+
return BRS_EXT_ERROR_READ_IO; \
|
134
|
+
} \
|
135
|
+
break; \
|
136
|
+
} \
|
137
|
+
else if (ext_result != 0) { \
|
138
|
+
return ext_result; \
|
139
|
+
} \
|
140
|
+
\
|
141
|
+
ext_result = function(__VA_ARGS__); \
|
142
|
+
if (ext_result != 0) { \
|
143
|
+
return ext_result; \
|
144
|
+
} \
|
145
|
+
\
|
146
|
+
is_function_called = true; \
|
147
|
+
} \
|
148
|
+
\
|
149
|
+
if (!is_function_called) { \
|
150
|
+
/* Function should be called at least once. */ \
|
151
|
+
ext_result = function(__VA_ARGS__); \
|
152
|
+
if (ext_result != 0) { \
|
153
|
+
return ext_result; \
|
154
|
+
} \
|
155
|
+
} \
|
156
|
+
} while (false);
|
142
157
|
|
143
158
|
// Algorithm has written data into destination buffer.
|
144
159
|
// We need to write this data into file.
|
@@ -192,6 +207,7 @@ static inline brs_ext_result_t buffered_compress(
|
|
192
207
|
const uint8_t** source_ptr, size_t* source_length_ptr,
|
193
208
|
FILE* destination_file, uint8_t* destination_buffer, size_t* destination_length_ptr, size_t destination_buffer_length)
|
194
209
|
{
|
210
|
+
BROTLI_BOOL result;
|
195
211
|
brs_ext_result_t ext_result;
|
196
212
|
|
197
213
|
while (true) {
|
@@ -199,7 +215,7 @@ static inline brs_ext_result_t buffered_compress(
|
|
199
215
|
size_t remaining_destination_buffer_length = destination_buffer_length - *destination_length_ptr;
|
200
216
|
size_t prev_remaining_destination_buffer_length = remaining_destination_buffer_length;
|
201
217
|
|
202
|
-
|
218
|
+
result = BrotliEncoderCompressStream(
|
203
219
|
state_ptr,
|
204
220
|
BROTLI_OPERATION_PROCESS,
|
205
221
|
source_length_ptr, source_ptr,
|
@@ -234,6 +250,7 @@ static inline brs_ext_result_t buffered_compressor_finish(
|
|
234
250
|
BrotliEncoderState* state_ptr,
|
235
251
|
FILE* destination_file, uint8_t* destination_buffer, size_t* destination_length_ptr, size_t destination_buffer_length)
|
236
252
|
{
|
253
|
+
BROTLI_BOOL result;
|
237
254
|
brs_ext_result_t ext_result;
|
238
255
|
|
239
256
|
const uint8_t* source = NULL;
|
@@ -244,7 +261,7 @@ static inline brs_ext_result_t buffered_compressor_finish(
|
|
244
261
|
size_t remaining_destination_buffer_length = destination_buffer_length - *destination_length_ptr;
|
245
262
|
size_t prev_remaining_destination_buffer_length = remaining_destination_buffer_length;
|
246
263
|
|
247
|
-
|
264
|
+
result = BrotliEncoderCompressStream(
|
248
265
|
state_ptr,
|
249
266
|
BROTLI_OPERATION_FINISH,
|
250
267
|
&source_length, &source,
|
@@ -368,14 +385,15 @@ static inline brs_ext_result_t buffered_decompress(
|
|
368
385
|
const uint8_t** source_ptr, size_t* source_length_ptr,
|
369
386
|
FILE* destination_file, uint8_t* destination_buffer, size_t* destination_length_ptr, size_t destination_buffer_length)
|
370
387
|
{
|
371
|
-
|
388
|
+
BrotliDecoderResult result;
|
389
|
+
brs_ext_result_t ext_result;
|
372
390
|
|
373
391
|
while (true) {
|
374
392
|
uint8_t* remaining_destination_buffer = destination_buffer + *destination_length_ptr;
|
375
393
|
size_t remaining_destination_buffer_length = destination_buffer_length - *destination_length_ptr;
|
376
394
|
size_t prev_remaining_destination_buffer_length = remaining_destination_buffer_length;
|
377
395
|
|
378
|
-
|
396
|
+
result = BrotliDecoderDecompressStream(
|
379
397
|
state_ptr,
|
380
398
|
source_length_ptr, source_ptr,
|
381
399
|
&remaining_destination_buffer_length, &remaining_destination_buffer,
|
data/ext/brs_ext/option.c
CHANGED
@@ -6,12 +6,14 @@
|
|
6
6
|
#include <brotli/decode.h>
|
7
7
|
#include <brotli/encode.h>
|
8
8
|
#include <stdbool.h>
|
9
|
-
#include <
|
9
|
+
#include <stdlib.h>
|
10
10
|
|
11
11
|
#include "brs_ext/common.h"
|
12
12
|
#include "brs_ext/error.h"
|
13
13
|
#include "ruby.h"
|
14
14
|
|
15
|
+
// -- values --
|
16
|
+
|
15
17
|
static inline VALUE get_raw_option_value(VALUE options, const char* name)
|
16
18
|
{
|
17
19
|
return rb_funcall(options, rb_intern("[]"), 1, ID2SYM(rb_intern(name)));
|
@@ -27,14 +29,14 @@ static inline bool get_bool_option_value(VALUE raw_value)
|
|
27
29
|
return raw_type == T_TRUE;
|
28
30
|
}
|
29
31
|
|
30
|
-
static inline unsigned
|
32
|
+
static inline unsigned int get_uint_option_value(VALUE raw_value)
|
31
33
|
{
|
32
34
|
Check_Type(raw_value, T_FIXNUM);
|
33
35
|
|
34
36
|
return NUM2UINT(raw_value);
|
35
37
|
}
|
36
38
|
|
37
|
-
static inline
|
39
|
+
static inline BrotliEncoderMode get_mode_option_value(VALUE raw_value)
|
38
40
|
{
|
39
41
|
Check_Type(raw_value, T_SYMBOL);
|
40
42
|
|
@@ -68,8 +70,8 @@ void brs_ext_get_option(VALUE options, brs_ext_option_t* option, brs_ext_option_
|
|
68
70
|
case BRS_EXT_OPTION_TYPE_BOOL:
|
69
71
|
value = get_bool_option_value(raw_value) ? 1 : 0;
|
70
72
|
break;
|
71
|
-
case
|
72
|
-
value = (brs_ext_option_value_t)
|
73
|
+
case BRS_EXT_OPTION_TYPE_UINT:
|
74
|
+
value = (brs_ext_option_value_t)get_uint_option_value(raw_value);
|
73
75
|
break;
|
74
76
|
case BRS_EXT_OPTION_TYPE_MODE:
|
75
77
|
value = (brs_ext_option_value_t)get_mode_option_value(raw_value);
|
@@ -81,13 +83,17 @@ void brs_ext_get_option(VALUE options, brs_ext_option_t* option, brs_ext_option_
|
|
81
83
|
option->value = value;
|
82
84
|
}
|
83
85
|
|
84
|
-
|
86
|
+
size_t brs_ext_get_size_option_value(VALUE options, const char* name)
|
85
87
|
{
|
86
88
|
VALUE raw_value = get_raw_option_value(options, name);
|
87
89
|
|
88
|
-
|
90
|
+
Check_Type(raw_value, T_FIXNUM);
|
91
|
+
|
92
|
+
return NUM2SIZET(raw_value);
|
89
93
|
}
|
90
94
|
|
95
|
+
// -- set params --
|
96
|
+
|
91
97
|
#define SET_OPTION_VALUE(function, state_ptr, param, option) \
|
92
98
|
if (option.has_value && !function(state_ptr, param, option.value)) { \
|
93
99
|
return BRS_EXT_ERROR_VALIDATE_FAILED; \
|
@@ -120,24 +126,25 @@ brs_ext_result_t brs_ext_set_decompressor_options(BrotliDecoderState* state_ptr,
|
|
120
126
|
return 0;
|
121
127
|
}
|
122
128
|
|
129
|
+
// -- exports --
|
130
|
+
|
131
|
+
#define EXPORT_PARAM_BOUNDS(module, param, name) \
|
132
|
+
rb_define_const(module, "MIN_" name, UINT2NUM(BROTLI_MIN_##param)); \
|
133
|
+
rb_define_const(module, "MAX_" name, UINT2NUM(BROTLI_MAX_##param));
|
134
|
+
|
123
135
|
void brs_ext_option_exports(VALUE root_module)
|
124
136
|
{
|
125
|
-
VALUE
|
137
|
+
VALUE module = rb_define_module_under(root_module, "Option");
|
126
138
|
|
127
139
|
VALUE modes = rb_ary_new_from_args(
|
128
140
|
3,
|
129
141
|
ID2SYM(rb_intern("text")),
|
130
142
|
ID2SYM(rb_intern("font")),
|
131
143
|
ID2SYM(rb_intern("generic")));
|
132
|
-
rb_define_const(
|
144
|
+
rb_define_const(module, "MODES", modes);
|
133
145
|
RB_GC_GUARD(modes);
|
134
146
|
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
rb_define_const(option, "MIN_LGWIN", UINT2NUM(BROTLI_MIN_WINDOW_BITS));
|
139
|
-
rb_define_const(option, "MAX_LGWIN", UINT2NUM(BROTLI_MAX_WINDOW_BITS));
|
140
|
-
|
141
|
-
rb_define_const(option, "MIN_LGBLOCK", UINT2NUM(BROTLI_MIN_INPUT_BLOCK_BITS));
|
142
|
-
rb_define_const(option, "MAX_LGBLOCK", UINT2NUM(BROTLI_MAX_INPUT_BLOCK_BITS));
|
147
|
+
EXPORT_PARAM_BOUNDS(module, QUALITY, "QUALITY");
|
148
|
+
EXPORT_PARAM_BOUNDS(module, WINDOW_BITS, "LGWIN");
|
149
|
+
EXPORT_PARAM_BOUNDS(module, INPUT_BLOCK_BITS, "LGBLOCK");
|
143
150
|
}
|
data/ext/brs_ext/option.h
CHANGED
@@ -18,7 +18,7 @@
|
|
18
18
|
|
19
19
|
enum {
|
20
20
|
BRS_EXT_OPTION_TYPE_BOOL = 1,
|
21
|
-
|
21
|
+
BRS_EXT_OPTION_TYPE_UINT,
|
22
22
|
BRS_EXT_OPTION_TYPE_MODE
|
23
23
|
};
|
24
24
|
|
@@ -54,11 +54,11 @@ void brs_ext_get_option(VALUE options, brs_ext_option_t* option, brs_ext_option_
|
|
54
54
|
brs_ext_compressor_options_t compressor_options; \
|
55
55
|
\
|
56
56
|
BRS_EXT_GET_OPTION(options, compressor_options, BRS_EXT_OPTION_TYPE_MODE, mode); \
|
57
|
-
BRS_EXT_GET_OPTION(options, compressor_options,
|
58
|
-
BRS_EXT_GET_OPTION(options, compressor_options,
|
59
|
-
BRS_EXT_GET_OPTION(options, compressor_options,
|
57
|
+
BRS_EXT_GET_OPTION(options, compressor_options, BRS_EXT_OPTION_TYPE_UINT, quality); \
|
58
|
+
BRS_EXT_GET_OPTION(options, compressor_options, BRS_EXT_OPTION_TYPE_UINT, lgwin); \
|
59
|
+
BRS_EXT_GET_OPTION(options, compressor_options, BRS_EXT_OPTION_TYPE_UINT, lgblock); \
|
60
60
|
BRS_EXT_GET_OPTION(options, compressor_options, BRS_EXT_OPTION_TYPE_BOOL, disable_literal_context_modeling); \
|
61
|
-
BRS_EXT_GET_OPTION(options, compressor_options,
|
61
|
+
BRS_EXT_GET_OPTION(options, compressor_options, BRS_EXT_OPTION_TYPE_UINT, size_hint); \
|
62
62
|
BRS_EXT_GET_OPTION(options, compressor_options, BRS_EXT_OPTION_TYPE_BOOL, large_window);
|
63
63
|
|
64
64
|
#define BRS_EXT_GET_DECOMPRESSOR_OPTIONS(options) \
|
@@ -67,10 +67,10 @@ void brs_ext_get_option(VALUE options, brs_ext_option_t* option, brs_ext_option_
|
|
67
67
|
BRS_EXT_GET_OPTION(options, decompressor_options, BRS_EXT_OPTION_TYPE_BOOL, disable_ring_buffer_reallocation); \
|
68
68
|
BRS_EXT_GET_OPTION(options, decompressor_options, BRS_EXT_OPTION_TYPE_BOOL, large_window);
|
69
69
|
|
70
|
-
|
70
|
+
size_t brs_ext_get_size_option_value(VALUE options, const char* name);
|
71
71
|
|
72
72
|
#define BRS_EXT_GET_BUFFER_LENGTH_OPTION(options, name) \
|
73
|
-
size_t name =
|
73
|
+
size_t name = brs_ext_get_size_option_value(options, #name);
|
74
74
|
|
75
75
|
brs_ext_result_t brs_ext_set_compressor_options(BrotliEncoderState* state_ptr, brs_ext_compressor_options_t* options);
|
76
76
|
brs_ext_result_t brs_ext_set_decompressor_options(BrotliDecoderState* state_ptr, brs_ext_decompressor_options_t* options);
|
@@ -4,6 +4,7 @@
|
|
4
4
|
#include "brs_ext/stream/compressor.h"
|
5
5
|
|
6
6
|
#include <brotli/encode.h>
|
7
|
+
#include <brotli/types.h>
|
7
8
|
#include <stdint.h>
|
8
9
|
#include <stdlib.h>
|
9
10
|
|
@@ -116,7 +117,7 @@ VALUE brs_ext_compress(VALUE self, VALUE source_value)
|
|
116
117
|
brs_ext_raise_error(BRS_EXT_ERROR_UNEXPECTED);
|
117
118
|
}
|
118
119
|
|
119
|
-
VALUE bytes_written =
|
120
|
+
VALUE bytes_written = SIZET2NUM(source_length - remaining_source_length);
|
120
121
|
VALUE needs_more_destination = BrotliEncoderHasMoreOutput(state_ptr) ? Qtrue : Qfalse;
|
121
122
|
|
122
123
|
return rb_ary_new_from_args(2, bytes_written, needs_more_destination);
|
@@ -221,9 +222,10 @@ VALUE brs_ext_compressor_close(VALUE self)
|
|
221
222
|
|
222
223
|
void brs_ext_compressor_exports(VALUE root_module)
|
223
224
|
{
|
224
|
-
VALUE
|
225
|
+
VALUE module = rb_define_module_under(root_module, "Stream");
|
226
|
+
|
227
|
+
VALUE compressor = rb_define_class_under(module, "NativeCompressor", rb_cObject);
|
225
228
|
|
226
|
-
VALUE compressor = rb_define_class_under(stream, "NativeCompressor", rb_cObject);
|
227
229
|
rb_define_alloc_func(compressor, brs_ext_allocate_compressor);
|
228
230
|
rb_define_method(compressor, "initialize", brs_ext_initialize_compressor, 1);
|
229
231
|
rb_define_method(compressor, "write", brs_ext_compress, 1);
|
@@ -117,10 +117,10 @@ VALUE brs_ext_decompress(VALUE self, VALUE source_value)
|
|
117
117
|
brs_ext_raise_error(brs_ext_get_decompressor_error(error_code));
|
118
118
|
}
|
119
119
|
|
120
|
-
VALUE
|
120
|
+
VALUE bytes_read = SIZET2NUM(source_length - remaining_source_length);
|
121
121
|
VALUE needs_more_destination = result == BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT ? Qtrue : Qfalse;
|
122
122
|
|
123
|
-
return rb_ary_new_from_args(2,
|
123
|
+
return rb_ary_new_from_args(2, bytes_read, needs_more_destination);
|
124
124
|
}
|
125
125
|
|
126
126
|
VALUE brs_ext_decompressor_read_result(VALUE self)
|
@@ -170,9 +170,10 @@ VALUE brs_ext_decompressor_close(VALUE self)
|
|
170
170
|
|
171
171
|
void brs_ext_decompressor_exports(VALUE root_module)
|
172
172
|
{
|
173
|
-
VALUE
|
173
|
+
VALUE module = rb_define_module_under(root_module, "Stream");
|
174
|
+
|
175
|
+
VALUE decompressor = rb_define_class_under(module, "NativeDecompressor", rb_cObject);
|
174
176
|
|
175
|
-
VALUE decompressor = rb_define_class_under(stream, "NativeDecompressor", rb_cObject);
|
176
177
|
rb_define_alloc_func(decompressor, brs_ext_allocate_decompressor);
|
177
178
|
rb_define_method(decompressor, "initialize", brs_ext_initialize_decompressor, 1);
|
178
179
|
rb_define_method(decompressor, "read", brs_ext_decompress, 1);
|
data/ext/brs_ext/string.c
CHANGED
@@ -5,6 +5,7 @@
|
|
5
5
|
|
6
6
|
#include <brotli/decode.h>
|
7
7
|
#include <brotli/encode.h>
|
8
|
+
#include <brotli/types.h>
|
8
9
|
#include <stdint.h>
|
9
10
|
#include <stdlib.h>
|
10
11
|
|
@@ -17,26 +18,6 @@
|
|
17
18
|
|
18
19
|
// -- buffer --
|
19
20
|
|
20
|
-
static inline VALUE create_buffer(VALUE length)
|
21
|
-
{
|
22
|
-
return rb_str_new(NULL, NUM2UINT(length));
|
23
|
-
}
|
24
|
-
|
25
|
-
#define CREATE_BUFFER(buffer, length, exception) \
|
26
|
-
VALUE buffer = rb_protect(create_buffer, UINT2NUM(length), &exception);
|
27
|
-
|
28
|
-
static inline VALUE resize_buffer(VALUE args)
|
29
|
-
{
|
30
|
-
VALUE buffer = rb_ary_entry(args, 0);
|
31
|
-
VALUE length = rb_ary_entry(args, 1);
|
32
|
-
return rb_str_resize(buffer, NUM2UINT(length));
|
33
|
-
}
|
34
|
-
|
35
|
-
#define RESIZE_BUFFER(buffer, length, exception) \
|
36
|
-
VALUE resize_buffer_args = rb_ary_new_from_args(2, buffer, UINT2NUM(length)); \
|
37
|
-
buffer = rb_protect(resize_buffer, resize_buffer_args, &exception); \
|
38
|
-
RB_GC_GUARD(resize_buffer_args);
|
39
|
-
|
40
21
|
static inline brs_ext_result_t increase_destination_buffer(
|
41
22
|
VALUE destination_value, size_t destination_length,
|
42
23
|
size_t* remaining_destination_buffer_length_ptr, size_t destination_buffer_length)
|
@@ -48,7 +29,7 @@ static inline brs_ext_result_t increase_destination_buffer(
|
|
48
29
|
|
49
30
|
int exception;
|
50
31
|
|
51
|
-
|
32
|
+
BRS_EXT_RESIZE_STRING_BUFFER(destination_value, destination_length + destination_buffer_length, exception);
|
52
33
|
if (exception != 0) {
|
53
34
|
return BRS_EXT_ERROR_ALLOCATE_FAILED;
|
54
35
|
}
|
@@ -60,23 +41,25 @@ static inline brs_ext_result_t increase_destination_buffer(
|
|
60
41
|
|
61
42
|
// -- utils --
|
62
43
|
|
63
|
-
#define GET_SOURCE_DATA(source_value)
|
64
|
-
Check_Type(source_value, T_STRING);
|
65
|
-
|
66
|
-
const char*
|
67
|
-
size_t
|
68
|
-
const uint8_t* remaining_source = (const uint8_t*)source; \
|
69
|
-
size_t remaining_source_length = source_length;
|
44
|
+
#define GET_SOURCE_DATA(source_value) \
|
45
|
+
Check_Type(source_value, T_STRING); \
|
46
|
+
\
|
47
|
+
const char* source = RSTRING_PTR(source_value); \
|
48
|
+
size_t source_length = RSTRING_LEN(source_value);
|
70
49
|
|
71
50
|
// -- compress --
|
72
51
|
|
73
52
|
static inline brs_ext_result_t compress(
|
74
53
|
BrotliEncoderState* state_ptr,
|
75
|
-
const
|
54
|
+
const char* source, size_t source_length,
|
76
55
|
VALUE destination_value, size_t destination_buffer_length)
|
77
56
|
{
|
57
|
+
BROTLI_BOOL result;
|
78
58
|
brs_ext_result_t ext_result;
|
79
59
|
|
60
|
+
const uint8_t* remaining_source = (const uint8_t*)source;
|
61
|
+
size_t remaining_source_length = source_length;
|
62
|
+
|
80
63
|
size_t destination_length = 0;
|
81
64
|
size_t remaining_destination_buffer_length = destination_buffer_length;
|
82
65
|
|
@@ -84,7 +67,7 @@ static inline brs_ext_result_t compress(
|
|
84
67
|
uint8_t* remaining_destination_buffer = (uint8_t*)RSTRING_PTR(destination_value) + destination_length;
|
85
68
|
size_t prev_remaining_destination_buffer_length = remaining_destination_buffer_length;
|
86
69
|
|
87
|
-
|
70
|
+
result = BrotliEncoderCompressStream(
|
88
71
|
state_ptr,
|
89
72
|
BROTLI_OPERATION_FINISH,
|
90
73
|
&remaining_source_length, &remaining_source,
|
@@ -114,7 +97,7 @@ static inline brs_ext_result_t compress(
|
|
114
97
|
|
115
98
|
int exception;
|
116
99
|
|
117
|
-
|
100
|
+
BRS_EXT_RESIZE_STRING_BUFFER(destination_value, destination_length, exception);
|
118
101
|
if (exception != 0) {
|
119
102
|
return BRS_EXT_ERROR_ALLOCATE_FAILED;
|
120
103
|
}
|
@@ -146,7 +129,7 @@ VALUE brs_ext_compress_string(VALUE BRS_EXT_UNUSED(self), VALUE source_value, VA
|
|
146
129
|
|
147
130
|
int exception;
|
148
131
|
|
149
|
-
|
132
|
+
BRS_EXT_CREATE_STRING_BUFFER(destination_value, destination_buffer_length, exception);
|
150
133
|
if (exception != 0) {
|
151
134
|
BrotliEncoderDestroyInstance(state_ptr);
|
152
135
|
brs_ext_raise_error(BRS_EXT_ERROR_ALLOCATE_FAILED);
|
@@ -154,7 +137,7 @@ VALUE brs_ext_compress_string(VALUE BRS_EXT_UNUSED(self), VALUE source_value, VA
|
|
154
137
|
|
155
138
|
ext_result = compress(
|
156
139
|
state_ptr,
|
157
|
-
|
140
|
+
source, source_length,
|
158
141
|
destination_value, destination_buffer_length);
|
159
142
|
|
160
143
|
BrotliEncoderDestroyInstance(state_ptr);
|
@@ -170,10 +153,14 @@ VALUE brs_ext_compress_string(VALUE BRS_EXT_UNUSED(self), VALUE source_value, VA
|
|
170
153
|
|
171
154
|
static inline brs_ext_result_t decompress(
|
172
155
|
BrotliDecoderState* state_ptr,
|
173
|
-
const
|
156
|
+
const char* source, size_t source_length,
|
174
157
|
VALUE destination_value, size_t destination_buffer_length)
|
175
158
|
{
|
176
|
-
|
159
|
+
BrotliDecoderResult result;
|
160
|
+
brs_ext_result_t ext_result;
|
161
|
+
|
162
|
+
const uint8_t* remaining_source = (const uint8_t*)source;
|
163
|
+
size_t remaining_source_length = source_length;
|
177
164
|
|
178
165
|
size_t destination_length = 0;
|
179
166
|
size_t remaining_destination_buffer_length = destination_buffer_length;
|
@@ -182,7 +169,7 @@ static inline brs_ext_result_t decompress(
|
|
182
169
|
uint8_t* remaining_destination_buffer = (uint8_t*)RSTRING_PTR(destination_value) + destination_length;
|
183
170
|
size_t prev_remaining_destination_buffer_length = remaining_destination_buffer_length;
|
184
171
|
|
185
|
-
|
172
|
+
result = BrotliDecoderDecompressStream(
|
186
173
|
state_ptr,
|
187
174
|
&remaining_source_length, &remaining_source,
|
188
175
|
&remaining_destination_buffer_length, &remaining_destination_buffer,
|
@@ -215,7 +202,7 @@ static inline brs_ext_result_t decompress(
|
|
215
202
|
|
216
203
|
int exception;
|
217
204
|
|
218
|
-
|
205
|
+
BRS_EXT_RESIZE_STRING_BUFFER(destination_value, destination_length, exception);
|
219
206
|
if (exception != 0) {
|
220
207
|
brs_ext_raise_error(BRS_EXT_ERROR_ALLOCATE_FAILED);
|
221
208
|
}
|
@@ -247,7 +234,7 @@ VALUE brs_ext_decompress_string(VALUE BRS_EXT_UNUSED(self), VALUE source_value,
|
|
247
234
|
|
248
235
|
int exception;
|
249
236
|
|
250
|
-
|
237
|
+
BRS_EXT_CREATE_STRING_BUFFER(destination_value, destination_buffer_length, exception);
|
251
238
|
if (exception != 0) {
|
252
239
|
BrotliDecoderDestroyInstance(state_ptr);
|
253
240
|
brs_ext_raise_error(BRS_EXT_ERROR_ALLOCATE_FAILED);
|
@@ -255,7 +242,7 @@ VALUE brs_ext_decompress_string(VALUE BRS_EXT_UNUSED(self), VALUE source_value,
|
|
255
242
|
|
256
243
|
ext_result = decompress(
|
257
244
|
state_ptr,
|
258
|
-
|
245
|
+
source, source_length,
|
259
246
|
destination_value, destination_buffer_length);
|
260
247
|
|
261
248
|
BrotliDecoderDestroyInstance(state_ptr);
|
data/ext/extconf.rb
CHANGED
@@ -3,46 +3,52 @@
|
|
3
3
|
|
4
4
|
require "mkmf"
|
5
5
|
|
6
|
-
def require_header(name)
|
6
|
+
def require_header(name, types = [])
|
7
7
|
abort "Can't find #{name} header" unless find_header name
|
8
|
+
|
9
|
+
types.each do |type|
|
10
|
+
abort "Can't find #{type} type in #{name} header" unless find_type type, nil, name
|
11
|
+
end
|
8
12
|
end
|
9
13
|
|
10
|
-
require_header "brotli/
|
11
|
-
require_header "brotli/
|
14
|
+
require_header "brotli/types.h", %w[BROTLI_BOOL]
|
15
|
+
require_header "brotli/encode.h", ["BrotliEncoderState *", "BrotliEncoderMode"]
|
16
|
+
require_header "brotli/decode.h", ["BrotliDecoderState *", "BrotliDecoderResult", "BrotliDecoderErrorCode"]
|
12
17
|
|
13
18
|
def require_library(name, functions)
|
14
19
|
functions.each do |function|
|
15
|
-
abort "Can't find #{
|
20
|
+
abort "Can't find #{function} function in #{name} library" unless find_library name, function
|
16
21
|
end
|
17
22
|
end
|
18
23
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
24
|
+
require_library(
|
25
|
+
"brotlienc",
|
26
|
+
%w[
|
27
|
+
BrotliEncoderCreateInstance
|
28
|
+
BrotliEncoderSetParameter
|
29
|
+
BrotliEncoderCompressStream
|
30
|
+
BrotliEncoderHasMoreOutput
|
31
|
+
BrotliEncoderIsFinished
|
32
|
+
BrotliEncoderDestroyInstance
|
33
|
+
]
|
34
|
+
)
|
28
35
|
|
29
|
-
require_library
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
]
|
38
|
-
|
39
|
-
|
40
|
-
require_library "brotlidec", decoder_functions
|
36
|
+
require_library(
|
37
|
+
"brotlidec",
|
38
|
+
%w[
|
39
|
+
BrotliDecoderCreateInstance
|
40
|
+
BrotliDecoderSetParameter
|
41
|
+
BrotliDecoderDecompressStream
|
42
|
+
BrotliDecoderGetErrorCode
|
43
|
+
BrotliDecoderDestroyInstance
|
44
|
+
]
|
45
|
+
)
|
41
46
|
|
42
47
|
extension_name = "brs_ext".freeze
|
43
48
|
dir_config extension_name
|
44
49
|
|
45
|
-
|
50
|
+
# rubocop:disable Style/GlobalVars
|
51
|
+
$srcs = %w[
|
46
52
|
stream/compressor
|
47
53
|
stream/decompressor
|
48
54
|
buffer
|
@@ -52,13 +58,9 @@ sources = %w[
|
|
52
58
|
option
|
53
59
|
string
|
54
60
|
]
|
61
|
+
.map { |name| "src/#{extension_name}/#{name}.c" }
|
55
62
|
.freeze
|
56
63
|
|
57
|
-
# rubocop:disable Style/GlobalVars
|
58
|
-
$srcs = sources
|
59
|
-
.map { |name| "src/#{extension_name}/#{name}.c" }
|
60
|
-
.freeze
|
61
|
-
|
62
64
|
$CFLAGS << " -Wno-declaration-after-statement"
|
63
65
|
$VPATH << "$(srcdir)/#{extension_name}:$(srcdir)/#{extension_name}/stream"
|
64
66
|
# rubocop:enable Style/GlobalVars
|
data/lib/brs/file.rb
CHANGED
@@ -17,6 +17,8 @@ module BRS
|
|
17
17
|
|
18
18
|
options = Option.get_compressor_options options, BUFFER_LENGTH_NAMES
|
19
19
|
|
20
|
+
options[:size_hint] = ::File.size source
|
21
|
+
|
20
22
|
open_files(source, destination) do |source_io, destination_io|
|
21
23
|
BRS._native_compress_io source_io, destination_io, options
|
22
24
|
end
|
data/lib/brs/option.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
# Ruby bindings for brotli library.
|
2
2
|
# Copyright (c) 2019 AUTHORS, MIT License.
|
3
3
|
|
4
|
+
require "brs_ext"
|
5
|
+
|
4
6
|
require_relative "error"
|
5
7
|
require_relative "validation"
|
6
8
|
|
@@ -14,7 +16,6 @@ module BRS
|
|
14
16
|
:lgwin => nil,
|
15
17
|
:lgblock => nil,
|
16
18
|
:disable_literal_context_modeling => nil,
|
17
|
-
:size_hint => nil,
|
18
19
|
:large_window => nil
|
19
20
|
}
|
20
21
|
.freeze
|
@@ -40,20 +41,26 @@ module BRS
|
|
40
41
|
end
|
41
42
|
|
42
43
|
quality = options[:quality]
|
43
|
-
|
44
|
+
unless quality.nil?
|
45
|
+
Validation.validate_not_negative_integer quality
|
46
|
+
raise ValidateError, "invalid quality" if quality < MIN_QUALITY || quality > MAX_QUALITY
|
47
|
+
end
|
44
48
|
|
45
49
|
lgwin = options[:lgwin]
|
46
|
-
|
50
|
+
unless lgwin.nil?
|
51
|
+
Validation.validate_not_negative_integer lgwin
|
52
|
+
raise ValidateError, "invalid lgwin" if lgwin < MIN_LGWIN || lgwin > MAX_LGWIN
|
53
|
+
end
|
47
54
|
|
48
55
|
lgblock = options[:lgblock]
|
49
|
-
|
56
|
+
unless lgblock.nil?
|
57
|
+
Validation.validate_not_negative_integer lgblock
|
58
|
+
raise ValidateError, "invalid lgblock" if lgblock < MIN_LGBLOCK || lgblock > MAX_LGBLOCK
|
59
|
+
end
|
50
60
|
|
51
61
|
disable_literal_context_modeling = options[:disable_literal_context_modeling]
|
52
62
|
Validation.validate_bool disable_literal_context_modeling unless disable_literal_context_modeling.nil?
|
53
63
|
|
54
|
-
size_hint = options[:size_hint]
|
55
|
-
Validation.validate_not_negative_integer size_hint unless size_hint.nil?
|
56
|
-
|
57
64
|
large_window = options[:large_window]
|
58
65
|
Validation.validate_bool large_window unless large_window.nil?
|
59
66
|
|
@@ -15,7 +15,11 @@ module BRS
|
|
15
15
|
BUFFER_LENGTH_NAMES = %i[destination_buffer_length].freeze
|
16
16
|
|
17
17
|
def initialize(options = {})
|
18
|
-
options
|
18
|
+
options = Option.get_compressor_options options, BUFFER_LENGTH_NAMES
|
19
|
+
|
20
|
+
size_hint = options[:size_hint]
|
21
|
+
Validation.validate_not_negative_integer size_hint unless size_hint.nil?
|
22
|
+
|
19
23
|
native_stream = NativeCompressor.new options
|
20
24
|
|
21
25
|
super native_stream
|
data/lib/brs/string.rb
CHANGED
data/lib/brs/version.rb
CHANGED
data/lib/brs.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-brs
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Aladjev
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-11-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: minitar
|
@@ -16,28 +16,42 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '0.
|
19
|
+
version: '0.9'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '0.
|
26
|
+
version: '0.9'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: minitest
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '5.
|
33
|
+
version: '5.12'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '5.
|
40
|
+
version: '5.12'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: ocg
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '1.1'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '1.1'
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
56
|
name: rake-compiler
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -58,42 +72,42 @@ dependencies:
|
|
58
72
|
requirements:
|
59
73
|
- - "~>"
|
60
74
|
- !ruby/object:Gem::Version
|
61
|
-
version: '0.
|
75
|
+
version: '0.75'
|
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: '0.
|
82
|
+
version: '0.75'
|
69
83
|
- !ruby/object:Gem::Dependency
|
70
84
|
name: rubocop-performance
|
71
85
|
requirement: !ruby/object:Gem::Requirement
|
72
86
|
requirements:
|
73
87
|
- - "~>"
|
74
88
|
- !ruby/object:Gem::Version
|
75
|
-
version: '1.
|
89
|
+
version: '1.5'
|
76
90
|
type: :development
|
77
91
|
prerelease: false
|
78
92
|
version_requirements: !ruby/object:Gem::Requirement
|
79
93
|
requirements:
|
80
94
|
- - "~>"
|
81
95
|
- !ruby/object:Gem::Version
|
82
|
-
version: '1.
|
96
|
+
version: '1.5'
|
83
97
|
- !ruby/object:Gem::Dependency
|
84
98
|
name: rubocop-rails
|
85
99
|
requirement: !ruby/object:Gem::Requirement
|
86
100
|
requirements:
|
87
101
|
- - "~>"
|
88
102
|
- !ruby/object:Gem::Version
|
89
|
-
version: '2.
|
103
|
+
version: '2.3'
|
90
104
|
type: :development
|
91
105
|
prerelease: false
|
92
106
|
version_requirements: !ruby/object:Gem::Requirement
|
93
107
|
requirements:
|
94
108
|
- - "~>"
|
95
109
|
- !ruby/object:Gem::Version
|
96
|
-
version: '2.
|
110
|
+
version: '2.3'
|
97
111
|
description:
|
98
112
|
email: aladjev.andrew@gmail.com
|
99
113
|
executables: []
|