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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 134634ca7135fe231b5317f490e79e3257d831d8dc5fa00f4f9e16b9f5c8fdc7
4
- data.tar.gz: b5261d22f3a7361b91bef98f9a00c4c09b9537bd291154904bb29590da33c840
3
+ metadata.gz: b5f37248d6d0c731cfece926768123b9a96f521cb34cf2f76fcb04fb4efcf99a
4
+ data.tar.gz: 1c7b08b0947629ddeaba409668aa5da5762635686dcb4b6a88b98e4783056125
5
5
  SHA512:
6
- metadata.gz: e3e8c529a0f80b61653e82a1166de3376c62b5ff055c39c5a62db44a47ee3b7f2feb46a3cab375726b16a7db35aaa87d8aa87c93b16496d7d524cec5558be215
7
- data.tar.gz: df3eb9252f3c0cbed434381d2c986ea7b1e2a98b8809646144d13baff4b65b38f866c9ee154abe0b35c79f1bbc3842039ce6a2fba516e6bfedb51ad9c8fc5600
6
+ metadata.gz: f8bf4a8baab41a56e9700fe8c527f5af2035eb9ad153dd8de04519717c3ab3c44edc18d53da24b6f7a48b4c9ad4a6e2c0b6167b4c651dec90ea8fef2c412b65b
7
+ data.tar.gz: 982e99cb3380b8de9ede487dea40cd33d6199df1e777bc7e49d5c5da011176241622c195c4724d3f9d8440ed028c5062868c6d599e9481ef214b0af41ee58e4d
@@ -22,7 +22,7 @@ jobs:
22
22
  ruby-version: ['2.6', '2.7', '3.0']
23
23
 
24
24
  steps:
25
- - uses: actions/checkout@v2
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
- * => [IdPack.range(start: 1 length: 3), IdPack.range(start: 6 length: 3)]
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 = new IdPack.range(numbers[0], 1);
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 = new IdPack.range(numbers[i], 1);
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
- * [IdPack.range(start: 1 length: 3), IdPack.range(start: 6 length: 3)]
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.2.19"
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
@@ -1,3 +1,3 @@
1
1
  module IdPack
2
- VERSION = "1.0.2".freeze
2
+ VERSION = "1.0.3".freeze
3
3
  end
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.2
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: 2021-06-08 00:00:00.000000000 Z
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.2.19
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.2.19
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.1.4
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.