id_pack 1.0.2 → 1.0.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.
- checksums.yaml +4 -4
- data/.github/workflows/tests.yml +1 -1
- data/app/assets/javascripts/lib/id-packer.js +299 -4
- data/id_pack.gemspec +1 -1
- data/lib/id_pack/version.rb +1 -1
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b5f37248d6d0c731cfece926768123b9a96f521cb34cf2f76fcb04fb4efcf99a
|
4
|
+
data.tar.gz: 1c7b08b0947629ddeaba409668aa5da5762635686dcb4b6a88b98e4783056125
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f8bf4a8baab41a56e9700fe8c527f5af2035eb9ad153dd8de04519717c3ab3c44edc18d53da24b6f7a48b4c9ad4a6e2c0b6167b4c651dec90ea8fef2c412b65b
|
7
|
+
data.tar.gz: 982e99cb3380b8de9ede487dea40cd33d6199df1e777bc7e49d5c5da011176241622c195c4724d3f9d8440ed028c5062868c6d599e9481ef214b0af41ee58e4d
|
data/.github/workflows/tests.yml
CHANGED
@@ -22,7 +22,7 @@ jobs:
|
|
22
22
|
ruby-version: ['2.6', '2.7', '3.0']
|
23
23
|
|
24
24
|
steps:
|
25
|
-
- uses: actions/checkout@
|
25
|
+
- uses: actions/checkout@v3
|
26
26
|
- name: Set up Ruby
|
27
27
|
# To automatically get bug fixes and new Ruby versions for ruby/setup-ruby,
|
28
28
|
# change this to (see https://github.com/ruby/setup-ruby#versioning):
|
@@ -99,20 +99,315 @@
|
|
99
99
|
isExcludeNull: true,
|
100
100
|
outputCharset: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-",
|
101
101
|
|
102
|
+
range: function(start, length) {
|
103
|
+
|
104
|
+
/** convert arguments to numbers */
|
105
|
+
if (typeof start != 'number') {
|
106
|
+
start = parseInt(start, 10);
|
107
|
+
}
|
108
|
+
if (typeof length != 'number') {
|
109
|
+
length = parseInt(length, 10);
|
110
|
+
}
|
111
|
+
this.start = !$.isNumeric(start) ? 0 : start;
|
112
|
+
this.length = !$.isNumeric(length) ? 0 : length;
|
113
|
+
|
114
|
+
// range functions
|
115
|
+
|
116
|
+
/**
|
117
|
+
* var range = IdPacker.range(0, 5);
|
118
|
+
* range.clone();
|
119
|
+
* => IdPacker.range(0, 5)
|
120
|
+
*/
|
121
|
+
this.clone = function() {
|
122
|
+
return IdPacker.range(this.start, this.length);
|
123
|
+
};
|
124
|
+
|
125
|
+
/**
|
126
|
+
* var range = IdPacker.range(0, 5);
|
127
|
+
* range.end();
|
128
|
+
* => 4
|
129
|
+
*/
|
130
|
+
this.end = function() {
|
131
|
+
return this.start + this.length - 1;
|
132
|
+
};
|
133
|
+
|
134
|
+
/**
|
135
|
+
* var range = IdPacker.range(3, 5);
|
136
|
+
* range.roundToWindow(5);
|
137
|
+
* => IdPacker.range(0, 10)
|
138
|
+
*
|
139
|
+
* range.roundToWindow(2);
|
140
|
+
* => IdPacker.range(2, 6)
|
141
|
+
*/
|
142
|
+
this.roundToWindow = function(window_size) {
|
143
|
+
var start = Math.floor(this.start / window_size) * window_size;
|
144
|
+
var length = Math.ceil((this.start + this.length - start) / window_size) * window_size;
|
145
|
+
return IdPacker.range(start, length);
|
146
|
+
};
|
147
|
+
|
148
|
+
/**
|
149
|
+
* var range = IdPacker.range(0, 5);
|
150
|
+
* range.contain(3);
|
151
|
+
* => true
|
152
|
+
*
|
153
|
+
* range.contain(8);
|
154
|
+
* => false
|
155
|
+
*/
|
156
|
+
this.contain = function(n) {
|
157
|
+
return n >= this.start && n <= this.end();
|
158
|
+
};
|
159
|
+
|
160
|
+
// range-to-range functions
|
161
|
+
|
162
|
+
/**
|
163
|
+
* var range1 = IdPacker.range(0, 2);
|
164
|
+
* var range2 = IdPacker.range(2, 2);
|
165
|
+
* var range3 = IdPacker.range(3, 2);
|
166
|
+
* range1.touch(range2);
|
167
|
+
* => true
|
168
|
+
*
|
169
|
+
* range1.touch(range3);
|
170
|
+
* => false
|
171
|
+
*
|
172
|
+
* range2.touch(range3);
|
173
|
+
* => true
|
174
|
+
*/
|
175
|
+
this.touch = function(range) {
|
176
|
+
var start = Math.max(this.start, range.start);
|
177
|
+
var end = Math.min(this.end(), range.end());
|
178
|
+
var length = end - start + 1;
|
179
|
+
return length >= 0;
|
180
|
+
};
|
181
|
+
|
182
|
+
/**
|
183
|
+
* var range1 = IdPacker.range(2, 2);
|
184
|
+
* var range2 = IdPacker.range(3, 2);
|
185
|
+
* range1.intersect(range2);
|
186
|
+
* => IdPacker.range(3, 1)
|
187
|
+
*/
|
188
|
+
this.intersect = function(range) {
|
189
|
+
var start = Math.max(this.start, range.start);
|
190
|
+
var end = Math.min(this.end(), range.end());
|
191
|
+
var length = end - start + 1;
|
192
|
+
return (length > 0) ? IdPacker.range(start, length) : null;
|
193
|
+
};
|
194
|
+
|
195
|
+
/**
|
196
|
+
* var range1 = IdPacker.range(2, 2);
|
197
|
+
* var range2 = IdPacker.range(2, 5);
|
198
|
+
* var range3 = IdPacker.range(0, 5);
|
199
|
+
* range1.isSubsetOf(range3);
|
200
|
+
* => true
|
201
|
+
*
|
202
|
+
* range2.isSubsetOf(range3);
|
203
|
+
* => false
|
204
|
+
*/
|
205
|
+
this.isSubsetOf = function(range) {
|
206
|
+
return range.contain(this.start) && range.contain(this.end());
|
207
|
+
};
|
208
|
+
|
209
|
+
/**
|
210
|
+
* var range1 = IdPacker.range(0, 5);
|
211
|
+
* var range2 = IdPacker.range(2, 5);
|
212
|
+
* range1.union(range2);
|
213
|
+
* => IdPacker.range(0, 7)
|
214
|
+
*/
|
215
|
+
this.union = function(range) {
|
216
|
+
var start = Math.min(this.start, range.start);
|
217
|
+
var end = Math.max(this.end(), range.end());
|
218
|
+
var length = end - start + 1;
|
219
|
+
return IdPacker.range(start, length);
|
220
|
+
};
|
221
|
+
|
222
|
+
/**
|
223
|
+
* var range1 = IdPacker.range(0, 5);
|
224
|
+
* var range2 = IdPacker.range(2, 5);
|
225
|
+
* range1.minus(range2);
|
226
|
+
* => IdPacker.range(0, 2)
|
227
|
+
*/
|
228
|
+
this.minus = function(range) {
|
229
|
+
var intersectedRange = this.intersect(range);
|
230
|
+
if (this.equal(intersectedRange)) {
|
231
|
+
return [];
|
232
|
+
} else if (this.start < intersectedRange.start && this.end() > intersectedRange.end()) {
|
233
|
+
return [(IdPacker.range(this.start, intersectedRange.start - this.start)),
|
234
|
+
(IdPacker.range(intersectedRange.end() + 1, this.end() - intersectedRange.end()))];
|
235
|
+
} else if (this.start < intersectedRange.start) {
|
236
|
+
return [IdPacker.range(this.start, intersectedRange.start - this.start)];
|
237
|
+
} else {
|
238
|
+
return [IdPacker.range(intersectedRange.end() + 1, this.end() - intersectedRange.end())];
|
239
|
+
}
|
240
|
+
};
|
241
|
+
|
242
|
+
/**
|
243
|
+
* var range1 = IdPacker.range(0, 2);
|
244
|
+
* var range2 = IdPacker.range(0, 2);
|
245
|
+
* var range3 = IdPacker.range(2, 2);
|
246
|
+
* range1.equal(range2);
|
247
|
+
* => true
|
248
|
+
*
|
249
|
+
* range1.equal(range3);
|
250
|
+
* => false
|
251
|
+
*/
|
252
|
+
this.equal = function (range) {
|
253
|
+
return this.start == range.start && this.length == range.length;
|
254
|
+
};
|
255
|
+
|
256
|
+
// range-to-ranges functions
|
257
|
+
|
258
|
+
/**
|
259
|
+
* var range1 = IdPacker.range(0, 2);
|
260
|
+
* var range2 = IdPacker.range(2, 2);
|
261
|
+
* var ranges = [IdPacker.range(0, 3), IdPacker.range(5, 3)];
|
262
|
+
* range1.hasFullRange(ranges);
|
263
|
+
* => true
|
264
|
+
*
|
265
|
+
* range2.hasFullRange(ranges);
|
266
|
+
* => false
|
267
|
+
*/
|
268
|
+
this.hasFullRange = function(ranges) {
|
269
|
+
for(var i = 0, l = ranges.length; i < l; i++) {
|
270
|
+
if (this.isSubsetOf(ranges[i])) {
|
271
|
+
return true;
|
272
|
+
}
|
273
|
+
}
|
274
|
+
return false;
|
275
|
+
};
|
276
|
+
|
277
|
+
/**
|
278
|
+
* var range = IdPacker.range(2, 5);
|
279
|
+
* var ranges = [IdPacker.range(0, 3), IdPacker.range(5, 3)];
|
280
|
+
* range.getOverlapRanges(ranges);
|
281
|
+
* => [IdPacker.range(2, 1), IdPacker.range(5, 2)]
|
282
|
+
*/
|
283
|
+
this.getOverlapRanges = function(ranges) {
|
284
|
+
var overlapRanges = [];
|
285
|
+
for(var i = 0, l = ranges.length; i < l; i++) {
|
286
|
+
var intersectedRange = this.intersect(ranges[i]);
|
287
|
+
if (intersectedRange !== null) {
|
288
|
+
overlapRanges.push(intersectedRange);
|
289
|
+
}
|
290
|
+
}
|
291
|
+
return overlapRanges;
|
292
|
+
};
|
293
|
+
|
294
|
+
/**
|
295
|
+
* var range = IdPacker.range(2, 5);
|
296
|
+
* var ranges = [IdPacker.range(0, 3), IdPacker.range(5, 3)];
|
297
|
+
* range.getMissingRanges(ranges);
|
298
|
+
* => [IdPacker.range(3, 2)]
|
299
|
+
*/
|
300
|
+
this.getMissingRanges = function(ranges) {
|
301
|
+
var overlapRanges = this.getOverlapRanges(ranges);
|
302
|
+
var missingRanges = [];
|
303
|
+
var missingRange = this;
|
304
|
+
|
305
|
+
for(var i = 0, ol = overlapRanges.length; i < ol; i++) {
|
306
|
+
var currentMissingRanges = missingRange.minus(overlapRanges[i]);
|
307
|
+
for (var j = 0, cl = currentMissingRanges.length-1; j < cl; j++) {
|
308
|
+
missingRanges.push(currentMissingRanges[j]);
|
309
|
+
}
|
310
|
+
missingRange = currentMissingRanges[currentMissingRanges.length-1];
|
311
|
+
}
|
312
|
+
|
313
|
+
if (missingRange) {
|
314
|
+
missingRanges.push(missingRange);
|
315
|
+
}
|
316
|
+
return missingRanges;
|
317
|
+
};
|
318
|
+
|
319
|
+
/**
|
320
|
+
* var range = IdPacker.range(2, 5);
|
321
|
+
* var ranges = [IdPacker.range(0, 3), IdPacker.range(5, 3)];
|
322
|
+
* range.addToRanges(ranges);
|
323
|
+
* => [IdPacker.range(0, 8)]
|
324
|
+
*/
|
325
|
+
this.addToRanges = function(ranges){
|
326
|
+
if (! ranges.length) {
|
327
|
+
ranges.push(this);
|
328
|
+
return ranges;
|
329
|
+
}
|
330
|
+
var i, l;
|
331
|
+
var overlapRanges = [];
|
332
|
+
var accumulate;
|
333
|
+
|
334
|
+
for (i = 0, l = ranges.length; i < l; i++) {
|
335
|
+
if (this.touch(ranges[i])) {
|
336
|
+
overlapRanges.push(i);
|
337
|
+
}
|
338
|
+
}
|
339
|
+
if (overlapRanges.length === 0) {
|
340
|
+
for (i = 0, l = ranges.length; i < l; i++) {
|
341
|
+
if (this.start < ranges[i].start) {
|
342
|
+
Array.prototype.splice.apply(ranges, [i, 0].concat(this));
|
343
|
+
return ranges;
|
344
|
+
}
|
345
|
+
}
|
346
|
+
ranges.push(this);
|
347
|
+
return ranges;
|
348
|
+
}
|
349
|
+
|
350
|
+
accumulate = this;
|
351
|
+
for (i = 0, l = overlapRanges.length; i < l; i++) {
|
352
|
+
accumulate = accumulate.union(ranges[overlapRanges[i]]);
|
353
|
+
}
|
354
|
+
|
355
|
+
Array.prototype.splice.apply(
|
356
|
+
ranges, [overlapRanges[0], overlapRanges.length].concat(accumulate)
|
357
|
+
);
|
358
|
+
return ranges;
|
359
|
+
};
|
360
|
+
|
361
|
+
/**
|
362
|
+
* var range = IdPacker.range(2, 5);
|
363
|
+
* var ranges = [IdPacker.range(0, 3), IdPacker.range(5, 3)];
|
364
|
+
* range.deleteFromRanges(ranges);
|
365
|
+
* => [IdPacker.range(0, 2), IdPacker.range(7, 1)]
|
366
|
+
*
|
367
|
+
* @param {Array(Range)} ranges
|
368
|
+
* @return {Array(Range)}
|
369
|
+
*/
|
370
|
+
this.deleteFromRanges = function(ranges) {
|
371
|
+
var i, l;
|
372
|
+
var overlapRanges = [];
|
373
|
+
var accumulate = [];
|
374
|
+
|
375
|
+
for (i = 0, l = ranges.length; i < l; i++) {
|
376
|
+
if (this.intersect(ranges[i]) !== null) {
|
377
|
+
overlapRanges.push(i);
|
378
|
+
}
|
379
|
+
}
|
380
|
+
if (overlapRanges.length === 0) {
|
381
|
+
return ranges;
|
382
|
+
}
|
383
|
+
|
384
|
+
accumulate = [];
|
385
|
+
|
386
|
+
for (i = 0, l = overlapRanges.length; i < l; i++) {
|
387
|
+
accumulate = accumulate.concat(ranges[overlapRanges[i]].minus(this));
|
388
|
+
}
|
389
|
+
|
390
|
+
Array.prototype.splice.apply(
|
391
|
+
ranges, [overlapRanges[0], overlapRanges.length].concat(accumulate)
|
392
|
+
);
|
393
|
+
return ranges;
|
394
|
+
};
|
395
|
+
},
|
396
|
+
|
102
397
|
/**
|
103
398
|
* [1,2,3,6,7,8]
|
104
|
-
* => [
|
399
|
+
* => [IdPacker.range(start: 1 length: 3), IdPacker.range(start: 6 length: 3)]
|
105
400
|
*/
|
106
401
|
convertNumbersToRanges: function (numbers) {
|
107
402
|
var ranges = [];
|
108
403
|
if (numbers.length > 0) {
|
109
|
-
var range =
|
404
|
+
var range = IdPacker.range(numbers[0], 1);
|
110
405
|
for (var i = 1; i < numbers.length; i++) {
|
111
406
|
if (numbers[i] == numbers[i-1]+1) {
|
112
407
|
range.length = range.length + 1;
|
113
408
|
} else {
|
114
409
|
ranges.push(range);
|
115
|
-
range =
|
410
|
+
range = IdPacker.range(numbers[i], 1);
|
116
411
|
}
|
117
412
|
}
|
118
413
|
ranges.push(range);
|
@@ -121,7 +416,7 @@
|
|
121
416
|
},
|
122
417
|
|
123
418
|
/**
|
124
|
-
* [
|
419
|
+
* [IdPacker.range(start: 1 length: 3), IdPacker.range(start: 6 length: 3)]
|
125
420
|
* => "11100111"
|
126
421
|
*/
|
127
422
|
convertRangesToBinaryNumber: function (ranges) {
|
data/id_pack.gemspec
CHANGED
@@ -33,7 +33,7 @@ Gem::Specification.new do |spec|
|
|
33
33
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
34
34
|
spec.require_paths = ["lib"]
|
35
35
|
|
36
|
-
spec.add_development_dependency "bundler", "~> 2.
|
36
|
+
spec.add_development_dependency "bundler", "~> 2.3.0"
|
37
37
|
spec.add_development_dependency "rake", "~> 13.0"
|
38
38
|
spec.add_development_dependency "rspec", "~> 3.10"
|
39
39
|
end
|
data/lib/id_pack/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: id_pack
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ribose Inc.
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-06-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 2.
|
19
|
+
version: 2.3.0
|
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: 2.
|
26
|
+
version: 2.3.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -102,7 +102,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
102
102
|
- !ruby/object:Gem::Version
|
103
103
|
version: '0'
|
104
104
|
requirements: []
|
105
|
-
rubygems_version: 3.
|
105
|
+
rubygems_version: 3.2.22
|
106
106
|
signing_key:
|
107
107
|
specification_version: 4
|
108
108
|
summary: Compression and packing methods for singular and collection IDs and UUIDs.
|