scrapy_rocket_lz_string 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: a95b8862aed6ff437dac452d62a46561131c23c76da700e66fa48d2525006f13
4
+ data.tar.gz: 43d2b1b63d77d521d0b2ff7b648ea59adaa8ece5b095bec08ff083d9e48953ff
5
+ SHA512:
6
+ metadata.gz: 658bc68aecc7e4569d0c3fb3a431059d76c9d07065b4041c3e7b717fbfed5fb01000bd6f2366182b359d563b77440682fa5523fb9faa956166d3dc3a8be42aec
7
+ data.tar.gz: 7ffdf7dd01b2b7eb0d65706a9fc3e1ca36cb18e2d2b13794913dd383e4d23d080cd0c29ad2fd4a83b3751cd830c766f210ee4b804b4d7a8c151e42c2e410ab92
data/README.md ADDED
@@ -0,0 +1,67 @@
1
+ # lz-string
2
+ Ruby implementation of [LZ-String](https://github.com/pieroxy/lz-string) compression algorithm.
3
+
4
+ Supports:
5
+ * Raw compression
6
+ * UTF-16 compression
7
+ * Base64 compression
8
+
9
+ ### Installation
10
+
11
+ Install the latest release:
12
+
13
+ ```
14
+ $ gem install lz_string
15
+ ```
16
+
17
+ In Rails, add it to your Gemfile:
18
+
19
+ ```ruby
20
+ gem 'lz_string'
21
+ ```
22
+
23
+ ### How to use
24
+
25
+ #### Normal Compression and Decompression:
26
+
27
+ ``` ruby
28
+ # Compress
29
+ compressed = LZString.compress("Hello world!")
30
+ => "҅〶惶@✰Ӏ葀"
31
+
32
+ # Decompress
33
+ LZString.decompress(compressed)
34
+ => "Hello world!"
35
+ ```
36
+
37
+ #### UTF-16 Compression and Decompression:
38
+
39
+ ``` ruby
40
+ some_string = '{"some": "json", "foo": [{"bar": "؋", "key": "؄"}], "ঞᕠ": "൱ඵቜ"}'
41
+
42
+ # Compress
43
+ compressed = LZString::UTF16.compress(some_string)
44
+ => "ᯡࡓ䈌\u0B80匰ᜠр\u0AF2Ǹ䀺㈦イ\u0530්C¦¼䒨ᨬිnj〩痐࠸С㸢璑Ч䲤U⋴ҕ䈥㛢ĉ႙ "
45
+
46
+ # Decompress
47
+ LZString::UTF16.decompress(compressed)
48
+ => "{\"some\": \"json\", \"foo\": [{\"bar\": \"؋\", \"key\": \"؄\"}], \"ঞᕠ\": \"൱ඵቜ\"}"
49
+ ```
50
+
51
+ #### Base64 Compression and Decompression:
52
+
53
+ ``` ruby
54
+ # Compress
55
+ compressed = LZString::Base64.compress("Hello world!")
56
+ => "BIUwNmD2AEDukCcwBMCEQ==="
57
+
58
+ # Decompress
59
+ LZString::Base64.decompress(compressed)
60
+ => "Hello world!"
61
+ ```
62
+
63
+ ### Tests
64
+
65
+ ``` bash
66
+ $ rake
67
+ ```
@@ -0,0 +1,397 @@
1
+ module LZString
2
+ # Base compression class.
3
+ class Base
4
+ # @param uncompressed [String]
5
+ # @param bits_per_char [Integer]
6
+ # @param get_char_from_int [Integer]
7
+ def self.compress(uncompressed, bits_per_char, get_char_from_int)
8
+ return "" if uncompressed.nil?
9
+
10
+ i, value, ii = nil
11
+ context_dictionary = {}
12
+ context_dictionary_to_create = {}
13
+ context_c = ""
14
+ context_wc = ""
15
+ context_w = ""
16
+ # Compensate for the first entry which should not count
17
+ context_enlarge_in = 2
18
+ context_dict_size = 3
19
+ context_num_bits = 2
20
+ context_data = []
21
+ context_data_val = 0
22
+ context_data_position = 0
23
+
24
+ for ii in 0...uncompressed.length do
25
+ context_c = uncompressed[ii]
26
+
27
+ if (!context_dictionary.has_key?(context_c))
28
+ context_dictionary[context_c] = context_dict_size
29
+ context_dictionary_to_create[context_c] = true
30
+ context_dict_size += 1
31
+ end
32
+
33
+ context_wc = context_w + context_c
34
+ if (context_dictionary.has_key?(context_wc))
35
+ context_w = context_wc
36
+ else
37
+ if (context_dictionary_to_create.has_key?(context_w))
38
+ if (context_w[0].ord < 256)
39
+ for i in 0...context_num_bits do
40
+ context_data_val = (context_data_val << 1)
41
+ if (context_data_position == bits_per_char - 1)
42
+ context_data_position = 0
43
+ context_data.push(get_char_from_int[context_data_val])
44
+ context_data_val = 0
45
+ else
46
+ context_data_position += 1
47
+ end
48
+ end
49
+
50
+ value = context_w[0].ord
51
+ for i in 0...8 do
52
+ context_data_val = (context_data_val << 1) | (value & 1)
53
+ if (context_data_position == bits_per_char - 1)
54
+ context_data_position = 0
55
+ context_data.push(get_char_from_int[context_data_val])
56
+ context_data_val = 0
57
+ else
58
+ context_data_position += 1
59
+ end
60
+ value = value >> 1
61
+ end
62
+ else
63
+ value = 1
64
+ for i in 0...context_num_bits do
65
+ context_data_val = (context_data_val << 1) | value
66
+ if (context_data_position == bits_per_char-1)
67
+ context_data_position = 0
68
+ context_data.push(get_char_from_int[context_data_val])
69
+ context_data_val = 0
70
+ else
71
+ context_data_position += 1
72
+ end
73
+ value = 0
74
+ end
75
+ value = context_w[0].ord
76
+ for i in 0...16 do
77
+ context_data_val = (context_data_val << 1) | (value & 1)
78
+ if (context_data_position == bits_per_char - 1)
79
+ context_data_position = 0
80
+ context_data.push(get_char_from_int[context_data_val])
81
+ context_data_val = 0
82
+ else
83
+ context_data_position += 1
84
+ end
85
+ value = value >> 1
86
+ end
87
+ end
88
+ context_enlarge_in -= 1
89
+ if (context_enlarge_in == 0)
90
+ context_enlarge_in = 2**context_num_bits
91
+ context_num_bits += 1
92
+ end
93
+ context_dictionary_to_create.delete(context_w)
94
+ else
95
+ value = context_dictionary[context_w]
96
+ for i in 0...context_num_bits do
97
+ context_data_val = (context_data_val << 1) | (value & 1)
98
+ if (context_data_position == bits_per_char - 1)
99
+ context_data_position = 0
100
+ context_data.push(get_char_from_int[context_data_val])
101
+ context_data_val = 0
102
+ else
103
+ context_data_position += 1
104
+ end
105
+ value = value >> 1
106
+ end
107
+ end
108
+
109
+ context_enlarge_in -= 1
110
+
111
+ if (context_enlarge_in == 0)
112
+ context_enlarge_in = 2**context_num_bits
113
+ context_num_bits += 1
114
+ end
115
+
116
+ # Add wc to the dictionary.
117
+ context_dictionary[context_wc] = context_dict_size
118
+ context_dict_size += 1
119
+ context_w = context_c.to_s
120
+ end
121
+ end
122
+
123
+ # Output the code for w.
124
+ if (context_w != "")
125
+ if (context_dictionary_to_create.has_key?(context_w))
126
+ if (context_w[0].ord < 256)
127
+ for i in 0...context_num_bits do
128
+ context_data_val = (context_data_val << 1)
129
+ if (context_data_position == bits_per_char-1)
130
+ context_data_position = 0
131
+ context_data.push(get_char_from_int[context_data_val])
132
+ context_data_val = 0
133
+ else
134
+ context_data_position += 1
135
+ end
136
+ end
137
+ value = context_w[0].ord
138
+ for i in 0...8 do
139
+ context_data_val = (context_data_val << 1) | (value & 1)
140
+ if (context_data_position == bits_per_char-1)
141
+ context_data_position = 0
142
+ context_data.push(get_char_from_int[context_data_val])
143
+ context_data_val = 0
144
+ else
145
+ context_data_position += 1
146
+ end
147
+ value = value >> 1
148
+ end
149
+ else
150
+ value = 1
151
+ for i in 0...context_num_bits do
152
+ context_data_val = (context_data_val << 1) | value
153
+ if (context_data_position == bits_per_char-1)
154
+ context_data_position = 0
155
+ context_data.push(get_char_from_int[context_data_val])
156
+ context_data_val = 0
157
+ else
158
+ context_data_position += 1
159
+ end
160
+ value = 0
161
+ end
162
+ value = context_w[0].ord
163
+ for i in 0...16 do
164
+ context_data_val = (context_data_val << 1) | (value & 1)
165
+ if (context_data_position == bits_per_char-1)
166
+ context_data_position = 0
167
+ context_data.push(get_char_from_int[context_data_val])
168
+ context_data_val = 0
169
+ else
170
+ context_data_position += 1
171
+ end
172
+ value = value >> 1
173
+ end
174
+ end
175
+ context_enlarge_in -= 1
176
+ if (context_enlarge_in == 0)
177
+ context_enlarge_in = 2**context_num_bits
178
+ context_num_bits += 1
179
+ end
180
+ context_dictionary_to_create.delete(context_w)
181
+ else
182
+ value = context_dictionary[context_w]
183
+ for i in 0...context_num_bits
184
+ context_data_val = (context_data_val << 1) | (value & 1)
185
+ if (context_data_position == bits_per_char-1)
186
+ context_data_position = 0
187
+ context_data.push(get_char_from_int[context_data_val])
188
+ context_data_val = 0
189
+ else
190
+ context_data_position += 1
191
+ end
192
+ value = value >> 1
193
+ end
194
+ end
195
+
196
+ context_enlarge_in -= 1
197
+ if (context_enlarge_in == 0)
198
+ context_enlarge_in = 2**context_num_bits
199
+ context_num_bits += 1
200
+ end
201
+ end
202
+
203
+ # Mark the end of the stream
204
+ value = 2
205
+ for i in 0...context_num_bits do
206
+ context_data_val = (context_data_val << 1) | (value & 1)
207
+ if (context_data_position == bits_per_char - 1)
208
+ context_data_position = 0
209
+ context_data.push(get_char_from_int[context_data_val])
210
+ context_data_val = 0
211
+ else
212
+ context_data_position += 1
213
+ end
214
+ value = value >> 1
215
+ end
216
+
217
+ # Flush the last char
218
+ while (true)
219
+ context_data_val = (context_data_val << 1)
220
+ if (context_data_position == bits_per_char-1)
221
+ context_data.push(get_char_from_int[context_data_val])
222
+ break
223
+ else
224
+ context_data_position += 1
225
+ end
226
+ end
227
+
228
+ return context_data.join("")
229
+ end
230
+
231
+ # @param length [Integer]
232
+ # @param reset_value [Integer]
233
+ # @param get_next_value [Proc]
234
+ def self.decompress(length, reset_value, get_next_value, encoding = "ASCII-8BIT")
235
+ dictionary = [0, 1, 2]
236
+ enlarge_in = 4
237
+ dict_size = 4
238
+ num_bits = 3
239
+ entry = ""
240
+ result = []
241
+ data = {
242
+ val: get_next_value[(0)],
243
+ position: reset_value,
244
+ index: 1
245
+ }
246
+ bits = 0
247
+ maxpower = 2**2
248
+ power = 1
249
+ i, w, resb, c = nil
250
+
251
+ while (power != maxpower)
252
+ resb = data[:val] & data[:position]
253
+ data[:position] >>= 1
254
+ if (data[:position] == 0)
255
+ data[:position] = reset_value
256
+ data[:val] = get_next_value[data[:index]]
257
+ data[:index] += 1
258
+ end
259
+ bits |= (resb > 0 ? 1 : 0) * power
260
+ power <<= 1
261
+ end
262
+
263
+ case(n = bits)
264
+ when 0
265
+ bits = 0
266
+ maxpower = 2**8
267
+ power = 1
268
+ while power != maxpower
269
+ resb = data[:val] & data[:position]
270
+ data[:position] >>= 1
271
+ if (data[:position] == 0)
272
+ data[:position] = reset_value
273
+ data[:val] = get_next_value[data[:index]]
274
+ data[:index] += 1
275
+ end
276
+ bits |= (resb > 0 ? 1 : 0) * power
277
+ power <<= 1
278
+ end
279
+ c = bits.chr(encoding)
280
+ when 1
281
+ bits = 0
282
+ maxpower = 2*16
283
+ power = 1
284
+ while (power != maxpower)
285
+ resb = data[:val] & data[:position]
286
+ data[:position] >>= 1
287
+ if (data[:position] == 0)
288
+ data[:position] = reset_value
289
+ data[:val] = get_next_value[data[:index]]
290
+ data[:index] += 1
291
+ end
292
+ bits |= (resb > 0 ? 1 : 0) * power
293
+ power <<= 1
294
+ end
295
+ c = bits.chr(encoding)
296
+ when 2
297
+ ""
298
+ end
299
+
300
+ dictionary[3] = c
301
+ w = c
302
+ result << c
303
+
304
+ while(true)
305
+ return "" if (data[:index] > length)
306
+
307
+ bits = 0
308
+ maxpower = 2**num_bits
309
+ power = 1
310
+ while (power != maxpower)
311
+ resb = data[:val] & data[:position]
312
+ data[:position] >>= 1
313
+ if (data[:position] == 0)
314
+ data[:position] = reset_value
315
+ data[:val] = get_next_value[data[:index]]
316
+ data[:index] += 1
317
+ end
318
+ bits |= (resb > 0 ? 1 : 0) * power
319
+ power <<= 1
320
+ end
321
+
322
+ case(c = bits)
323
+ when 0
324
+ bits = 0
325
+ maxpower = 2**8
326
+ power = 1
327
+ while (power != maxpower)
328
+ resb = data[:val] & data[:position]
329
+ data[:position] >>= 1
330
+ if (data[:position] == 0)
331
+ data[:position] = reset_value
332
+ data[:val] = get_next_value[data[:index]]
333
+ data[:index] += 1
334
+ end
335
+ bits |= (resb > 0 ? 1 : 0) * power
336
+ power <<= 1
337
+ end
338
+
339
+ dictionary[dict_size] = bits.chr(encoding)
340
+ dict_size += 1
341
+ c = dict_size - 1
342
+ enlarge_in -= 1
343
+ when 1
344
+ bits = 0
345
+ maxpower = 2**16
346
+ power = 1
347
+ while (power != maxpower)
348
+ resb = data[:val] & data[:position]
349
+ data[:position] >>= 1
350
+ if (data[:position] == 0)
351
+ data[:position] = reset_value
352
+ data[:val] = get_next_value[data[:index]]
353
+ data[:index] += 1
354
+ end
355
+ bits |= (resb > 0 ? 1 : 0) * power
356
+ power <<= 1
357
+ end
358
+ dictionary[dict_size] = bits.chr(encoding)
359
+ dict_size += 1
360
+ c = dict_size - 1
361
+ enlarge_in -= 1
362
+ when 2
363
+ return result.join("")
364
+ end
365
+
366
+ if (enlarge_in == 0)
367
+ enlarge_in = 2**num_bits
368
+ num_bits += 1
369
+ end
370
+
371
+ if (dictionary[c])
372
+ entry = dictionary[c]
373
+ else
374
+ if (c === dict_size)
375
+ entry = w + w[0]
376
+ else
377
+ return nil
378
+ end
379
+ end
380
+
381
+ result << entry
382
+
383
+ # Add w+entry[0] to the dictionary.
384
+ dictionary[dict_size] = w + entry[0]
385
+ dict_size += 1
386
+ enlarge_in -= 1
387
+
388
+ w = entry
389
+
390
+ if (enlarge_in == 0)
391
+ enlarge_in = 2**num_bits
392
+ num_bits += 1
393
+ end
394
+ end
395
+ end
396
+ end
397
+ end
@@ -0,0 +1,51 @@
1
+ module LZString
2
+ # Base64 compressing algorithm.
3
+ class Base64
4
+ # Base64 alphabet.
5
+ KEY_STR_BASE64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
6
+
7
+ # @param input [String]
8
+ def self.compress(input)
9
+ return "" if input.nil?
10
+
11
+ res = LZString::Base.compress(input, 6, lambda { |a| KEY_STR_BASE64[a] })
12
+
13
+ # To produce valid Base64
14
+ case (res.length % 4)
15
+ when 0 then res
16
+ when 1 then res + "==="
17
+ when 2 then res + "=="
18
+ when 3 then res + "="
19
+ end
20
+ end
21
+
22
+ # @param compressed [String]
23
+ def self.decompress(compressed)
24
+ return "" if compressed.nil?
25
+ return nil if compressed == ""
26
+
27
+ LZString::Base.decompress(
28
+ compressed.length,
29
+ 32,
30
+ lambda { |index| get_base_value(KEY_STR_BASE64, compressed[index]) }
31
+ )
32
+ end
33
+
34
+ # @param alphabet [String]
35
+ # @param character [String]
36
+ def self.get_base_value(alphabet, character)
37
+ base_reverse_dic = {}
38
+
39
+ if (!base_reverse_dic[alphabet])
40
+ base_reverse_dic[alphabet] = {}
41
+ for i in 0...alphabet.length do
42
+ base_reverse_dic[alphabet][alphabet[i]] = i
43
+ end
44
+ end
45
+
46
+ base_reverse_dic[alphabet][character]
47
+ end
48
+
49
+ private_class_method :get_base_value
50
+ end
51
+ end
@@ -0,0 +1,42 @@
1
+ module LZString
2
+ class UriSafe
3
+ # Base64 alphabet.
4
+ KEY_STR_URISAFE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-$"
5
+
6
+ # @param input [String]
7
+ def self.compress(input)
8
+ return "" if input.nil?
9
+
10
+ LZString::Base.compress(input, 6, lambda { |a| KEY_STR_URISAFE[a] })
11
+ end
12
+
13
+ # @param compressed [String]
14
+ def self.decompress(compressed)
15
+ return "" if compressed.nil?
16
+ return nil if compressed == ""
17
+ compressed.gsub!(" ","+")
18
+ LZString::Base.decompress(
19
+ compressed.length,
20
+ 32,
21
+ lambda { |index| get_base_value(KEY_STR_URISAFE, compressed[index]) }
22
+ )
23
+ end
24
+
25
+ # @param alphabet [String]
26
+ # @param character [String]
27
+ def self.get_base_value(alphabet, character)
28
+ base_reverse_dic = {}
29
+
30
+ if (!base_reverse_dic[alphabet])
31
+ base_reverse_dic[alphabet] = {}
32
+ for i in 0...alphabet.length do
33
+ base_reverse_dic[alphabet][alphabet[i]] = i
34
+ end
35
+ end
36
+
37
+ base_reverse_dic[alphabet][character]
38
+ end
39
+
40
+ private_class_method :get_base_value
41
+ end
42
+ end
@@ -0,0 +1,24 @@
1
+ module LZString
2
+ # UTF16 compressing algorithm.
3
+ class UTF16
4
+ # @param input [String]
5
+ def self.compress(input)
6
+ return "" if (input == nil)
7
+
8
+ LZString::Base.compress(input, 15, lambda { |a| (a + 32).chr("UTF-8") }) + " "
9
+ end
10
+
11
+ # @param compressed [String]
12
+ def self.decompress(compressed)
13
+ return "" if (compressed == nil)
14
+ return nil if (compressed == "")
15
+
16
+ LZString::Base.decompress(
17
+ compressed.length,
18
+ 16384,
19
+ lambda { |index| compressed[index].ord - 32 },
20
+ "UTF-8"
21
+ )
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,4 @@
1
+ module LZString
2
+ # :nodoc:
3
+ VERSION = "0.1.2"
4
+ end
data/lib/lz_string.rb ADDED
@@ -0,0 +1,23 @@
1
+ require "lz_string/base"
2
+ require "lz_string/base64"
3
+ require "lz_string/utf16"
4
+ require "lz_string/urisafe"
5
+ require "lz_string/version"
6
+
7
+ # LZ-based compression algorithm.
8
+ module LZString
9
+ # @param input [String]
10
+ def self.compress(input)
11
+ return "" if input.nil?
12
+
13
+ LZString::Base.compress(input, 16, lambda { |a| a.chr("UTF-8") })
14
+ end
15
+
16
+ # @param compressed [String]
17
+ def self.decompress(compressed)
18
+ return "" if compressed.nil?
19
+ return nil if compressed == ""
20
+
21
+ LZString::Base.decompress(compressed.length, 32768, lambda { |index| compressed[index].ord })
22
+ end
23
+ end
metadata ADDED
@@ -0,0 +1,162 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: scrapy_rocket_lz_string
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.2
5
+ platform: ruby
6
+ authors:
7
+ - Altivi
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2021-12-11 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rake
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: yard
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec_junit_formatter
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: pry
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: colorize
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: simplecov
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: simplecov-rcov-text
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ description: Ruby implementation of LZ-String compression algorithm
126
+ email:
127
+ - thepoddubstep@gmail.com
128
+ executables: []
129
+ extensions: []
130
+ extra_rdoc_files: []
131
+ files:
132
+ - README.md
133
+ - lib/lz_string.rb
134
+ - lib/lz_string/base.rb
135
+ - lib/lz_string/base64.rb
136
+ - lib/lz_string/urisafe.rb
137
+ - lib/lz_string/utf16.rb
138
+ - lib/lz_string/version.rb
139
+ homepage: https://github.com/Altivi/lz-string
140
+ licenses:
141
+ - MIT
142
+ metadata: {}
143
+ post_install_message:
144
+ rdoc_options: []
145
+ require_paths:
146
+ - lib
147
+ required_ruby_version: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - ">="
150
+ - !ruby/object:Gem::Version
151
+ version: '0'
152
+ required_rubygems_version: !ruby/object:Gem::Requirement
153
+ requirements:
154
+ - - ">="
155
+ - !ruby/object:Gem::Version
156
+ version: '0'
157
+ requirements: []
158
+ rubygems_version: 3.1.4
159
+ signing_key:
160
+ specification_version: 4
161
+ summary: Ruby implementation of LZ-String compression algorithm
162
+ test_files: []