ruby-ulid 0.6.1 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +74 -106
- data/lib/ulid/crockford_base32.rb +17 -16
- data/lib/ulid/errors.rb +1 -0
- data/lib/ulid/monotonic_generator.rb +23 -16
- data/lib/ulid/utils.rb +99 -0
- data/lib/ulid/uuid.rb +62 -30
- data/lib/ulid/version.rb +1 -1
- data/lib/ulid.rb +115 -194
- data/sig/ulid.rbs +162 -117
- metadata +8 -8
- data/lib/ulid/ractor_unshareable_constants.rb +0 -12
data/sig/ulid.rbs
CHANGED
@@ -3,8 +3,6 @@ class ULID < Object
|
|
3
3
|
TIMESTAMP_ENCODED_LENGTH: 10
|
4
4
|
RANDOMNESS_ENCODED_LENGTH: 16
|
5
5
|
ENCODED_LENGTH: 26
|
6
|
-
TIMESTAMP_OCTETS_LENGTH: 6
|
7
|
-
RANDOMNESS_OCTETS_LENGTH: 10
|
8
6
|
OCTETS_LENGTH: 16
|
9
7
|
MAX_MILLISECONDS: 281474976710655
|
10
8
|
MAX_ENTROPY: 1208925819614629174706175
|
@@ -14,13 +12,12 @@ class ULID < Object
|
|
14
12
|
PATTERN_WITH_CROCKFORD_BASE32_SUBSET: Regexp
|
15
13
|
STRICT_PATTERN_WITH_CROCKFORD_BASE32_SUBSET: Regexp
|
16
14
|
SCANNING_PATTERN: Regexp
|
17
|
-
UUIDV4_PATTERN: Regexp
|
18
15
|
MIN: ULID
|
19
16
|
MAX: ULID
|
20
17
|
include Comparable
|
21
18
|
|
22
|
-
|
23
|
-
type moment = Time |
|
19
|
+
type milliseconds = Integer
|
20
|
+
type moment = Time | milliseconds
|
24
21
|
|
25
22
|
class Error < StandardError
|
26
23
|
end
|
@@ -34,84 +31,121 @@ class ULID < Object
|
|
34
31
|
class UnexpectedError < Error
|
35
32
|
end
|
36
33
|
|
37
|
-
|
38
|
-
|
34
|
+
class IrreversibleUUIDError < Error
|
35
|
+
end
|
36
|
+
|
37
|
+
module UUID
|
38
|
+
BASE_PATTERN: Regexp
|
39
|
+
V4_PATTERN: Regexp
|
40
|
+
|
41
|
+
def self.parse_any_to_int: (String) -> Integer
|
42
|
+
def self.parse_v4_to_int: (String) -> Integer
|
43
|
+
|
44
|
+
class Fields < Struct[Integer]
|
45
|
+
attr_accessor time_low: Integer
|
46
|
+
attr_accessor time_mid: Integer
|
47
|
+
attr_accessor time_hi_and_version: Integer
|
48
|
+
attr_accessor clock_seq_hi_and_res: Integer
|
49
|
+
attr_accessor clk_seq_low: Integer
|
50
|
+
attr_accessor node: Integer
|
51
|
+
def self.raw_from_octets: (octets) -> Fields
|
52
|
+
def self.forced_v4_from_octets: (octets) -> Fields
|
53
|
+
|
54
|
+
def values: -> Array[Integer]
|
55
|
+
|
56
|
+
private
|
57
|
+
|
58
|
+
def initialize: (?time_low: Integer, ?time_mid: Integer, ?time_hi_and_version: Integer, ?clock_seq_hi_and_res: Integer, ?clk_seq_low: Integer, ?node: Integer) -> void
|
39
59
|
end
|
60
|
+
end
|
61
|
+
|
62
|
+
# Private module
|
63
|
+
module Utils
|
64
|
+
def self.encode_base32hex: (milliseconds: milliseconds, entropy: Integer) -> String
|
40
65
|
|
66
|
+
def self.current_milliseconds: -> milliseconds
|
67
|
+
|
68
|
+
def self.milliseconds_from_moment: (moment moment) -> milliseconds
|
69
|
+
|
70
|
+
def self.reasonable_entropy: -> Integer
|
71
|
+
|
72
|
+
def self.milliseconds_from_time: (Time time) -> milliseconds
|
73
|
+
|
74
|
+
def self.safe_get_class_name: (untyped object) -> String
|
75
|
+
|
76
|
+
def self.make_sharable_constants: (Module) -> void
|
77
|
+
|
78
|
+
def self.ractor_can_make_shareable_time?: -> bool
|
79
|
+
end
|
80
|
+
|
81
|
+
# Private module
|
82
|
+
module CrockfordBase32
|
41
83
|
ENCODING_STRING: String
|
42
84
|
CROCKFORD_TR_PATTERN: String
|
43
|
-
|
85
|
+
BASE32HEX_TR_PATTERN: String
|
44
86
|
VARIANT_TR_PATTERN: String
|
45
87
|
NORMALIZED_TR_PATTERN: String
|
46
88
|
|
47
|
-
# A private API. Should not be used in your code.
|
48
89
|
def self.encode: (Integer integer) -> String
|
49
90
|
|
50
|
-
# A private API. Should not be used in your code.
|
51
91
|
def self.decode: (String string) -> Integer
|
52
92
|
|
53
|
-
# A private API. Should not be used in your code.
|
54
93
|
def self.normalize: (String string) -> String
|
55
94
|
|
56
|
-
|
57
|
-
def self.from_n32: (String n32encoded) -> String
|
95
|
+
def self.from_base32hex: (String base32hex) -> String
|
58
96
|
end
|
59
97
|
|
60
98
|
class MonotonicGenerator
|
61
99
|
include MonitorMixin
|
62
100
|
|
63
|
-
# Returned value is `basically not` Thread-safety
|
101
|
+
# Returned value is `basically not` Thread-safety\
|
64
102
|
# If you want to keep Thread-safety, keep to call {#generate} only in same {#synchronize} block
|
65
103
|
#
|
66
104
|
# ```ruby
|
67
105
|
# generator.synchronize do
|
68
|
-
# generator.
|
106
|
+
# generator.last
|
69
107
|
# generator.inspect
|
70
108
|
# generator.generate
|
71
109
|
# end
|
72
110
|
# ```
|
73
|
-
attr_reader
|
111
|
+
attr_reader last: ULID | nil
|
74
112
|
|
75
|
-
#
|
76
|
-
def initialize: -> void
|
77
|
-
|
78
|
-
# See [How to keep `Sortable` even if in same timestamp](https://github.com/kachick/ruby-ulid#how-to-keep-sortable-even-if-in-same-timestamp)
|
113
|
+
# See [How to keep `Sortable` even if in same timestamp](https://github.com/kachick/ruby-ulid#how-to-keep-sortable-even-if-in-same-timestamp)\
|
79
114
|
# The `Thread-safety` is implemented with [Monitor](https://bugs.ruby-lang.org/issues/16255)
|
80
115
|
def generate: (?moment: moment) -> ULID
|
81
116
|
|
82
117
|
# Just providing similar api as `ULID.generate` and `ULID.encode` relation. No performance benefit exists in monotonic generator's one.
|
83
118
|
def encode: (?moment: moment) -> String
|
84
119
|
|
85
|
-
# Returned value is `basically not` Thread-safety
|
120
|
+
# Returned value is `basically not` Thread-safety\
|
86
121
|
# If you want to keep Thread-safety, keep to call {#generate} only in same {#synchronize} block
|
87
122
|
#
|
88
123
|
# ```ruby
|
89
124
|
# generator.synchronize do
|
90
|
-
# generator.
|
125
|
+
# generator.last
|
91
126
|
# generator.inspect
|
92
127
|
# generator.generate
|
93
128
|
# end
|
94
129
|
# ```
|
95
130
|
def inspect: -> String
|
96
131
|
alias to_s inspect
|
97
|
-
|
132
|
+
|
133
|
+
private
|
134
|
+
|
135
|
+
def initialize: -> void
|
136
|
+
|
137
|
+
def last=: (ULID?) -> void
|
98
138
|
end
|
99
139
|
|
100
140
|
interface _ToULID
|
101
141
|
def to_ulid: () -> ULID
|
102
142
|
end
|
103
143
|
|
104
|
-
type
|
105
|
-
type timestamp_octets = [Integer, Integer, Integer, Integer, Integer, Integer] | Array[Integer]
|
106
|
-
type randomness_octets = [Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer] | Array[Integer]
|
144
|
+
type octets = [Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer] | Array[Integer]
|
107
145
|
type period = Range[Time] | Range[nil] | Range[ULID]
|
108
146
|
|
109
147
|
@integer: Integer
|
110
148
|
@encoded: String
|
111
|
-
@timestamp: String?
|
112
|
-
@randomness: String?
|
113
|
-
@inspect: String?
|
114
|
-
@time: Time?
|
115
149
|
|
116
150
|
# Retuns a ULID
|
117
151
|
#
|
@@ -149,17 +183,13 @@ class ULID < Object
|
|
149
183
|
#
|
150
184
|
def self.generate: (?moment: moment, ?entropy: Integer) -> ULID
|
151
185
|
|
152
|
-
# Retuns encoded and normalzied String
|
153
|
-
# It has same arguments signatures as `.generate
|
154
|
-
#
|
155
|
-
# NOTE: Difference of ULID#encode, returned String is NOT frozen.
|
186
|
+
# Retuns encoded and normalzied String.\
|
187
|
+
# It has same arguments signatures as `.generate`\
|
188
|
+
# So can be used for just ID creation usecases without needless object creation.
|
156
189
|
#
|
157
190
|
def self.encode: (?moment: moment, ?entropy: Integer) -> String
|
158
191
|
|
159
|
-
#
|
160
|
-
def self.encode_n32: (milliseconds: Integer, entropy: Integer) -> String
|
161
|
-
|
162
|
-
# Shorthand of `ULID.generate(moment: Time)`
|
192
|
+
# Shorthand of `ULID.generate(moment: Time)`\
|
163
193
|
# See also [ULID.generate](https://kachick.github.io/ruby-ulid/ULID.html#generate-class_method)
|
164
194
|
#
|
165
195
|
# ```ruby
|
@@ -173,13 +203,8 @@ class ULID < Object
|
|
173
203
|
# ```
|
174
204
|
def self.at: (Time time) -> ULID
|
175
205
|
|
176
|
-
#
|
177
|
-
|
178
|
-
|
179
|
-
# A private API. Should not be used in your code.
|
180
|
-
def self.milliseconds_from_moment: (moment moment) -> Integer
|
181
|
-
|
182
|
-
# `ULID` can be element of the `Range`. If you generated the IDs in monotonic generator, ID based filtering is easy and reliable
|
206
|
+
# `ULID` can be element of the `Range`.\
|
207
|
+
# If you generated the IDs in monotonic generator, ID based filtering is easy and reliable
|
183
208
|
#
|
184
209
|
# ```ruby
|
185
210
|
# include_end = ulid1..ulid2
|
@@ -227,16 +252,18 @@ class ULID < Object
|
|
227
252
|
# ```
|
228
253
|
def self.parse: (_ToStr string) -> ULID
|
229
254
|
|
230
|
-
|
255
|
+
type time_in = String | Integer | nil
|
256
|
+
|
257
|
+
# Return Time instance from encoded String.\
|
231
258
|
# See also `ULID.encode` for similar purpose.
|
232
259
|
#
|
233
|
-
# NOTE: Difference of ULID#to_time, returned Time is NOT frozen.
|
234
|
-
#
|
235
260
|
# ```ruby
|
236
261
|
# time = ULID.decode_time('01ARZ3NDEKTSV4RRFFQ69G5FAV')
|
237
262
|
# #=> 2016-07-30 23:54:10.259 UTC
|
263
|
+
# ULID.decode_time('01ARZ3NDEKTSV4RRFFQ69G5FAV', in: '+09:00')
|
264
|
+
# #=> 2016-07-31 08:54:10.259 +0900
|
238
265
|
# ```
|
239
|
-
def self.decode_time: (_ToStr string, ?in:
|
266
|
+
def self.decode_time: (_ToStr string, ?in: time_in) -> Time
|
240
267
|
|
241
268
|
# Get ULID instance from unnormalized String that encoded in Crockford's base32.
|
242
269
|
#
|
@@ -253,18 +280,35 @@ class ULID < Object
|
|
253
280
|
# See also [ulid/spec#57](https://github.com/ulid/spec/pull/57) and [ulid/spec#3](https://github.com/ulid/spec/issues/3)
|
254
281
|
def self.parse_variant_format: (_ToStr string) -> ULID
|
255
282
|
|
283
|
+
# Load a UUID-like string without checking version and variants.
|
284
|
+
#
|
256
285
|
# ```ruby
|
257
|
-
#
|
258
|
-
#
|
286
|
+
# ULID.from_uuidish('123e4567-e89b-12d3-a456-426614174000')
|
287
|
+
# #=> ULID(2605-08-20 10:28:29.979 UTC: 0J7S2PFT4V2B9T8NJ2CRA1EG00)
|
288
|
+
# ```
|
259
289
|
#
|
260
|
-
#
|
261
|
-
|
290
|
+
# See also [ULID.from_uuidv4]
|
291
|
+
def self.from_uuidish: (String uuidish) -> ULID
|
292
|
+
|
293
|
+
# Load a UUIDv4 string with checking version and variants.
|
294
|
+
#
|
295
|
+
# ```ruby
|
296
|
+
# ULID.from_uuidv4('0983d0a2-ff15-4d83-8f37-7dd945b5aa39')
|
262
297
|
# #=> ULID(2301-07-10 00:28:28.821 UTC: 09GF8A5ZRN9P1RYDVXV52VBAHS)
|
263
|
-
#
|
298
|
+
# ULID.from_uuidv4('123e4567-e89b-12d3-a456-426614174000')
|
299
|
+
# #=> ULID::ParserError
|
264
300
|
# ```
|
265
301
|
#
|
266
|
-
# See also [
|
302
|
+
# See also [ULID.from_uuidish]
|
267
303
|
def self.from_uuidv4: (String uuid) -> ULID
|
304
|
+
|
305
|
+
# Load integer as ULID
|
306
|
+
#
|
307
|
+
# ```ruby
|
308
|
+
# ulid = ULID.parse('01GTXYCWNDKRYH14DBZ77TRSD7')
|
309
|
+
# ULID.from_integer(ulid.to_i)
|
310
|
+
# #=> ULID(2023-03-07 11:48:07.469 UTC: 01GTXYCWNDKRYH14DBZ77TRSD7)
|
311
|
+
# ```
|
268
312
|
def self.from_integer: (Integer integer) -> ULID
|
269
313
|
|
270
314
|
# Returns termination values for ULID spec.
|
@@ -325,7 +369,8 @@ class ULID < Object
|
|
325
369
|
# # ULID(2665-03-16 14:50:22.724 UTC: 0KYFW9DWM4CEGFNTAC6YFAVVJ6)]
|
326
370
|
# ```
|
327
371
|
#
|
328
|
-
# You can specify a range object for the timestamp restriction
|
372
|
+
# You can specify a range object for the timestamp restriction.\
|
373
|
+
# See also [ULID.range](https://kachick.github.io/ruby-ulid/ULID.html#range-class_method)
|
329
374
|
#
|
330
375
|
# ```ruby
|
331
376
|
# ulid1 = ULID.parse('01F4A5Y1YAQCYAYCTC7GRMJ9AA') #=> ULID(2021-04-27 17:27:22.826 UTC: 01F4A5Y1YAQCYAYCTC7GRMJ9AA)
|
@@ -386,19 +431,6 @@ class ULID < Object
|
|
386
431
|
def self.valid_as_variant_format?: (_ToStr string) -> bool
|
387
432
|
| (untyped) -> false
|
388
433
|
|
389
|
-
# DEPRECATED Use valid_as_variant_format? instead
|
390
|
-
#
|
391
|
-
# Returns `true` if it is normalized string.
|
392
|
-
# Basically the difference of normalized? is to accept downcase or not. This returns true for downcased ULIDs.
|
393
|
-
#
|
394
|
-
# ```ruby
|
395
|
-
# ULID.valid?(ULID.generate.to_s.downcase) #=> true
|
396
|
-
# ```
|
397
|
-
#
|
398
|
-
# See also [ulid/spec#57](https://github.com/ulid/spec/pull/57) and [ulid/spec#3](https://github.com/ulid/spec/issues/3)
|
399
|
-
def self.valid?: (_ToStr string) -> bool
|
400
|
-
| (untyped) -> false
|
401
|
-
|
402
434
|
# Returns parsed ULIDs from given String for rough operations.
|
403
435
|
#
|
404
436
|
# ```ruby
|
@@ -440,7 +472,8 @@ class ULID < Object
|
|
440
472
|
# ```
|
441
473
|
def self.scan: (_ToStr string) -> Enumerator[self, singleton(ULID)]
|
442
474
|
| (_ToStr string) { (ULID ulid) -> void } -> singleton(ULID)
|
443
|
-
|
475
|
+
|
476
|
+
# Returns nil if given object is not a ULID
|
444
477
|
def self.try_convert: (_ToULID) -> ULID
|
445
478
|
| (untyped) -> nil
|
446
479
|
|
@@ -450,14 +483,16 @@ class ULID < Object
|
|
450
483
|
# ulid.milliseconds #=> 1619544442826
|
451
484
|
# ```
|
452
485
|
attr_reader milliseconds: Integer
|
486
|
+
|
453
487
|
attr_reader entropy: Integer
|
454
488
|
|
489
|
+
# Private api. (Actually defined protected visibility)
|
490
|
+
attr_reader encoded: String
|
491
|
+
|
455
492
|
# ```ruby
|
456
493
|
# ulid = ULID.generate
|
457
494
|
# #=> ULID(2021-04-27 17:27:22.826 UTC: 01F4A5Y1YAQCYAYCTC7GRMJ9AA)
|
458
495
|
# ulid.encode #=> "01F4A5Y1YAQCYAYCTC7GRMJ9AA"
|
459
|
-
# ulid.encode.frozen? #=> true
|
460
|
-
# ulid.encode.equal?(ulid.to_s) #=> true
|
461
496
|
# ```
|
462
497
|
def encode: -> String
|
463
498
|
alias to_s encode
|
@@ -480,7 +515,7 @@ class ULID < Object
|
|
480
515
|
# #=> true
|
481
516
|
# ```
|
482
517
|
#
|
483
|
-
# To be precise, this sorting unaffected with `case sensitive or not` and might handle [ulid/spec#57](https://github.com/ulid/spec/pull/57) in future
|
518
|
+
# To be precise, this sorting unaffected with `case sensitive or not` and might handle [ulid/spec#57](https://github.com/ulid/spec/pull/57) in future.\
|
484
519
|
# So preferable than `lexicographically sortable` in actual case.
|
485
520
|
#
|
486
521
|
# This returns -1 | 0 | 1 for ULIDs. However defined as returning Integer. It is caused on ruby/rbs current definition.
|
@@ -490,6 +525,8 @@ class ULID < Object
|
|
490
525
|
def <=>: (ULID other) -> Integer
|
491
526
|
| (untyped other) -> nil
|
492
527
|
|
528
|
+
# Returns human readable strings that used by Kernel.#p
|
529
|
+
#
|
493
530
|
# ```ruby
|
494
531
|
# ulid = ULID.generate
|
495
532
|
# ulid.inspect #=> "ULID(2021-04-27 17:27:22.826 UTC: 01F4A5Y1YAQCYAYCTC7GRMJ9AA)"
|
@@ -504,7 +541,7 @@ class ULID < Object
|
|
504
541
|
| (untyped other) -> false
|
505
542
|
alias == eql?
|
506
543
|
|
507
|
-
# Return `true` for same value of ULID, variant formats of strings, same Time in ULID precision(msec)
|
544
|
+
# Return `true` for same value of ULID, variant formats of strings, same Time in ULID precision(msec).\
|
508
545
|
# Do not consider integer, octets and partial strings, then returns `false`.
|
509
546
|
#
|
510
547
|
# ```ruby
|
@@ -524,12 +561,15 @@ class ULID < Object
|
|
524
561
|
| (untyped other) -> false
|
525
562
|
|
526
563
|
# ```ruby
|
527
|
-
#
|
528
|
-
# #=>
|
529
|
-
#
|
564
|
+
# ULID.parse('01F4A5Y1YAQCYAYCTC7GRMJ9AA').to_time
|
565
|
+
# #=> 2021-04-27 17:27:22.826 UTC
|
566
|
+
# ULID.parse('01F4A5Y1YAQCYAYCTC7GRMJ9AA').to_time(in: '+09:00')
|
567
|
+
# #=> 2021-04-28 02:27:22.826 +0900
|
530
568
|
# ```
|
531
|
-
def to_time: -> Time
|
569
|
+
def to_time: (?in: time_in) -> Time
|
532
570
|
|
571
|
+
# Returns timestamp(prefix) part of encoded ULID
|
572
|
+
#
|
533
573
|
# ```ruby
|
534
574
|
# ulid = ULID.generate
|
535
575
|
# #=> ULID(2021-04-27 17:27:22.826 UTC: 01F4A5Y1YAQCYAYCTC7GRMJ9AA)
|
@@ -537,6 +577,8 @@ class ULID < Object
|
|
537
577
|
# ```
|
538
578
|
def timestamp: -> String
|
539
579
|
|
580
|
+
# Returns randomness(suffix) part of encoded ULID
|
581
|
+
#
|
540
582
|
# ```ruby
|
541
583
|
# ulid = ULID.generate
|
542
584
|
# #=> ULID(2021-04-27 17:27:22.826 UTC: 01F4A5Y1YAQCYAYCTC7GRMJ9AA)
|
@@ -544,27 +586,15 @@ class ULID < Object
|
|
544
586
|
# ```
|
545
587
|
def randomness: -> String
|
546
588
|
|
547
|
-
#
|
548
|
-
# Because the returning values are not fixed.
|
549
|
-
def patterns: -> Hash[Symbol, Regexp | String]
|
550
|
-
def octets: -> full_octets
|
551
|
-
def timestamp_octets: -> timestamp_octets
|
552
|
-
def randomness_octets: -> randomness_octets
|
553
|
-
|
554
|
-
# ```ruby
|
555
|
-
# # Currently experimental feature, so needed to load the extension.
|
556
|
-
# require 'ulid/uuid'
|
589
|
+
# Returns 6 + 10 octets(bytes) represented with Array[Integer]
|
557
590
|
#
|
558
|
-
#
|
559
|
-
# ulid = ULID.
|
560
|
-
# #=>
|
561
|
-
# ulid.to_uuidv4 #=> "0983d0a2-ff15-4d83-8f37-7dd945b5aa39"
|
591
|
+
# ```ruby
|
592
|
+
# ulid = ULID.parse('01F4A5Y1YAQCYAYCTC7GRMJ9AA')
|
593
|
+
# ulid.octets #=> [1, 121, 20, 95, 7, 202, 187, 60, 175, 51, 76, 60, 49, 73, 37, 74]
|
562
594
|
# ```
|
563
|
-
|
564
|
-
# See also [Why this is experimental?](https://github.com/kachick/ruby-ulid/issues/76)
|
565
|
-
def to_uuidv4: -> String
|
595
|
+
def octets: -> octets
|
566
596
|
|
567
|
-
# Returns next(successor) ULID
|
597
|
+
# Returns next(successor) ULID.\
|
568
598
|
# Especially `ULID#succ` makes it possible `Range[ULID]#each`.
|
569
599
|
#
|
570
600
|
# NOTE: But basically `Range[ULID]#each` should not be used, incrementing 128 bits IDs are not reasonable operation in most case
|
@@ -589,38 +619,53 @@ class ULID < Object
|
|
589
619
|
#
|
590
620
|
# See also [ULID#succ](https://kachick.github.io/ruby-ulid/ULID.html#succ-instance_method)
|
591
621
|
def pred: -> ULID?
|
592
|
-
def freeze: -> self
|
593
622
|
|
594
|
-
# A private API. Should not be used in your code.
|
595
623
|
def marshal_dump: -> Integer
|
596
624
|
|
597
|
-
# A private API. Should not be used in your code.
|
598
625
|
def marshal_load: (Integer integer) -> void
|
599
626
|
|
600
627
|
# Returns `self`
|
601
628
|
def to_ulid: -> self
|
602
629
|
|
603
|
-
#
|
604
|
-
|
605
|
-
|
606
|
-
#
|
607
|
-
#
|
608
|
-
|
609
|
-
|
610
|
-
|
630
|
+
# Generate a UUID-like string that does not set the version and variants field.\
|
631
|
+
# It means wrong in UUIDv4 spec, but reversible
|
632
|
+
#
|
633
|
+
# ```ruby
|
634
|
+
# ulid = ULID.parse('01GTXYCWNDKRYH14DBZ77TRSD7')
|
635
|
+
# ulid.to_uuidish #-> '0186bbe6-72ad-9e3d-1091-abf9cfac65a7'
|
636
|
+
# ULID.from_uuidish(ulid.to_uuidish) #=> ULID(2023-03-07 11:48:07.469 UTC: 01GTXYCWNDKRYH14DBZ77TRSD7)
|
637
|
+
# ```
|
638
|
+
#
|
639
|
+
# See also [ULID.from_uuidish], [ULID#to_uuidv4], [ulid/spec#64](https://github.com/ulid/spec/issues/64)
|
640
|
+
def to_uuidish: -> String
|
611
641
|
|
612
|
-
#
|
613
|
-
|
642
|
+
# Generate a UUIDv4-like string that sets the version and variants field.\
|
643
|
+
# It may conform to the UUID specification, but it is irreversible with the source ULID and may conflict with some other ULIDs.\
|
644
|
+
# You can specify `force` keyword argument to turn off the irreversible check
|
645
|
+
#
|
646
|
+
# ```ruby
|
647
|
+
# uuid = '0983d0a2-ff15-4d83-8f37-7dd945b5aa39'
|
648
|
+
# ulid = ULID.from_uuidv4(uuid)
|
649
|
+
# ulid.to_uuidv4 #=> 0983d0a2-ff15-4d83-8f37-7dd945b5aa39
|
650
|
+
# ```
|
651
|
+
#
|
652
|
+
# ```ruby
|
653
|
+
# ulid = ULID.from_uuidish('0186bbe6-72ad-9e3d-1091-abf9cfac65a7')
|
654
|
+
# ulid.to_uuidv4 #=> ULID::IrreversibleUUIDError
|
655
|
+
# ulid.to_uuidv4(force: true) #=> '0186bbe6-72ad-4e3d-9091-abf9cfac65a7'
|
656
|
+
# ```
|
657
|
+
#
|
658
|
+
# See also [ULID.from_uuidv4], [ULID#to_uuidish], [ulid/spec#64](https://github.com/ulid/spec/issues/64)
|
659
|
+
def to_uuidv4: (?force: boolish) -> String
|
614
660
|
|
615
|
-
#
|
616
|
-
def
|
661
|
+
# Returns same ID with different Ruby object.
|
662
|
+
def dup: -> ULID
|
617
663
|
|
618
|
-
#
|
619
|
-
|
664
|
+
# Returns same ID with different Ruby object.::Array::_Pattern\
|
665
|
+
# `freeze` keyarg is just provided for standardized API with `Object#clone`, however it accepts only `true`.
|
666
|
+
def clone: (?freeze: true) -> ULID
|
620
667
|
|
621
|
-
|
622
|
-
def initialize: (milliseconds: Integer, entropy: Integer, integer: Integer, encoded: String) -> void
|
668
|
+
private
|
623
669
|
|
624
|
-
|
625
|
-
def cache_all_instance_variables: -> void
|
670
|
+
def initialize: (milliseconds: milliseconds, entropy: Integer, integer: Integer, encoded: String) -> void
|
626
671
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-ulid
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kenichi Kamiya
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-03-08 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: " generator, optional monotonicity, parser and tools for ULID (RBS
|
14
14
|
included)\n"
|
@@ -25,7 +25,7 @@ files:
|
|
25
25
|
- lib/ulid/crockford_base32.rb
|
26
26
|
- lib/ulid/errors.rb
|
27
27
|
- lib/ulid/monotonic_generator.rb
|
28
|
-
- lib/ulid/
|
28
|
+
- lib/ulid/utils.rb
|
29
29
|
- lib/ulid/uuid.rb
|
30
30
|
- lib/ulid/version.rb
|
31
31
|
- sig/ulid.rbs
|
@@ -38,7 +38,7 @@ metadata:
|
|
38
38
|
source_code_uri: https://github.com/kachick/ruby-ulid
|
39
39
|
bug_tracker_uri: https://github.com/kachick/ruby-ulid/issues
|
40
40
|
rubygems_mfa_required: 'true'
|
41
|
-
post_install_message:
|
41
|
+
post_install_message:
|
42
42
|
rdoc_options: []
|
43
43
|
require_paths:
|
44
44
|
- lib
|
@@ -46,15 +46,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
46
46
|
requirements:
|
47
47
|
- - ">="
|
48
48
|
- !ruby/object:Gem::Version
|
49
|
-
version:
|
49
|
+
version: '3.1'
|
50
50
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
55
|
requirements: []
|
56
|
-
rubygems_version: 3.
|
57
|
-
signing_key:
|
56
|
+
rubygems_version: 3.4.6
|
57
|
+
signing_key:
|
58
58
|
specification_version: 4
|
59
59
|
summary: ULID manipulation library
|
60
60
|
test_files: []
|
@@ -1,12 +0,0 @@
|
|
1
|
-
# coding: us-ascii
|
2
|
-
# frozen_string_literal: true
|
3
|
-
|
4
|
-
class ULID
|
5
|
-
min = parse('00000000000000000000000000').freeze
|
6
|
-
max = parse('7ZZZZZZZZZZZZZZZZZZZZZZZZZ').freeze
|
7
|
-
|
8
|
-
ractor_can_make_shareable_time = RUBY_VERSION >= '3.1'
|
9
|
-
|
10
|
-
MIN = ractor_can_make_shareable_time ? Ractor.make_shareable(min) : min
|
11
|
-
MAX = ractor_can_make_shareable_time ? Ractor.make_shareable(max) : max
|
12
|
-
end
|