ruby-ulid 0.1.1 → 0.1.2
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 +8 -78
- data/lib/ulid.rb +2 -3
- data/lib/ulid/crockford_base32.rb +2 -0
- data/lib/ulid/uuid.rb +1 -1
- data/lib/ulid/version.rb +1 -1
- data/sig/ulid.rbs +370 -12
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 04b50bb9543b78d03a0e1676b988060b3e34348c0785979fde52c46e414be1d8
|
4
|
+
data.tar.gz: bf070ba0522e8ce743c67bcfa225bf5b49009ae4ecd6532eef19484d51eb14ce
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4ad79f68c4903f775750417085676a98e810cae71b635b0b0e3e5547dd8b652a6bd89b01cb452510054f400a9bfef7ae26e308456d46a7571be10cb7ef1f334f
|
7
|
+
data.tar.gz: 88769b682521bb83b3775784e808b4e08636313d2055c7afe1f6b3a966e211237c597e0c354e0a6a6a26e227246c96845671f24cd7ebb8bf9d93014d043147f0
|
data/README.md
CHANGED
@@ -10,7 +10,7 @@ Also providing [ruby/rbs](https://github.com/ruby/rbs) signature files.
|
|
10
10
|
|
11
11
|

|
12
12
|
|
13
|
-

|
14
14
|
[](http://badge.fury.io/rb/ruby-ulid)
|
15
15
|
|
16
16
|
## Universally Unique Lexicographically Sortable Identifier
|
@@ -49,7 +49,7 @@ Should be installed!
|
|
49
49
|
Add this line to your application/library's `Gemfile` is needed in basic use-case
|
50
50
|
|
51
51
|
```ruby
|
52
|
-
gem 'ruby-ulid', '>= 0.1.
|
52
|
+
gem 'ruby-ulid', '>= 0.1.2', '< 0.2.0'
|
53
53
|
```
|
54
54
|
|
55
55
|
### Generator and Parser
|
@@ -170,7 +170,7 @@ exclude_end = ULID.range(time1...time2) #=> The end of `Range[ULID]` will be the
|
|
170
170
|
|
171
171
|
# Below patterns are acceptable
|
172
172
|
pinpointing = ULID.range(time1..time1) #=> This will match only for all IDs in `time1`
|
173
|
-
until_the_end = ULID.range(..time1) #=> This will match only for all IDs upto `time1` (The `nil` starting `Range` can be used since Ruby 2.7)
|
173
|
+
# until_the_end = ULID.range(..time1) #=> This will match only for all IDs upto `time1` (The `nil` starting `Range` can be used since Ruby 2.7)
|
174
174
|
until_the_end = ULID.range(ULID.min.to_time..time1) #=> This is same as above for Ruby 2.6
|
175
175
|
until_the_ulid_limit = ULID.range(time1..) # This will match only for all IDs from `time1` to max value of the ULID limit
|
176
176
|
|
@@ -313,7 +313,7 @@ ulids.take(10)
|
|
313
313
|
# ULID(2021-04-29 03:18:24.152 UTC: 01F4DT4Z4RA0QV8WFQGRAG63EH),
|
314
314
|
# ULID(2021-05-02 13:27:16.394 UTC: 01F4PM605ABF5SDVMEHBH8JJ9R)]
|
315
315
|
ULID.sample(10, period: ulid1.to_time..ulid2.to_time)
|
316
|
-
#=>
|
316
|
+
#=>
|
317
317
|
# [ULID(2021-04-29 06:44:41.513 UTC: 01F4E5YPD9XQ3MYXWK8ZJKY8SW),
|
318
318
|
# ULID(2021-05-01 00:35:06.629 UTC: 01F4JNKD85SVK1EAEYSJGF53A2),
|
319
319
|
# ULID(2021-05-02 12:45:28.408 UTC: 01F4PHSEYRG9BWBEWMRW1XE6WW),
|
@@ -335,7 +335,7 @@ The imported timestamp is meaningless. So ULID's benefit will lost.
|
|
335
335
|
# Currently experimental feature, so needed to load the extension.
|
336
336
|
require 'ulid/uuid'
|
337
337
|
|
338
|
-
# Basically reversible
|
338
|
+
# Basically reversible
|
339
339
|
ulid = ULID.from_uuidv4('0983d0a2-ff15-4d83-8f37-7dd945b5aa39') #=> ULID(2301-07-10 00:28:28.821 UTC: 09GF8A5ZRN9P1RYDVXV52VBAHS)
|
340
340
|
ulid.to_uuidv4 #=> "0983d0a2-ff15-4d83-8f37-7dd945b5aa39"
|
341
341
|
|
@@ -403,81 +403,11 @@ NOTE: It is still having precision issue similar as `ulid gem` in the both gener
|
|
403
403
|
1. [Fix to handle timestamp precision in parser](https://github.com/abachman/ulid-ruby/pull/5)
|
404
404
|
1. [Fix to handle timestamp precision in generator](https://github.com/abachman/ulid-ruby/pull/4)
|
405
405
|
|
406
|
-
###
|
407
|
-
|
408
|
-
This runs rough benchmarks
|
409
|
-
|
410
|
-
```console
|
411
|
-
$ rake benchmark_with_other_gems
|
412
|
-
(Do not use `bundle exec`!)
|
413
|
-
```
|
414
|
-
|
415
|
-
<details>
|
416
|
-
<summary>One of the result at 2021/05/10 on my machine</summary>
|
417
|
-
|
418
|
-
```plaintext
|
419
|
-
#### rafaelsales - ulid
|
420
|
-
cd ./benchmark/compare_with_othergems/rafaelsales && bundle install --quiet && bundle exec ruby -v ./generate.rb
|
421
|
-
ruby 3.0.1p64 (2021-04-05 revision 0fb782ee38) [x86_64-darwin20]
|
422
|
-
Warming up --------------------------------------
|
423
|
-
ULID.generate 5.560k i/100ms
|
424
|
-
Calculating -------------------------------------
|
425
|
-
ULID.generate 52.655k (±11.0%) i/s - 261.320k in 5.029719s
|
426
|
-
"`ulid gem - 1.3.0` generated products: 371927 - sample: [\"01F59Y97807D2S67KE6X7ATK7Z\", \"01F59Y9AVRQJFAT5M2N7Z72BVF\", \"01F59Y95Z1042X4Z1K9729BSE3\", \"01F59Y95ZMVDFKD63Y8TT145GQ\", \"01F59Y94YQEZ3PH5STZ8PS1JPG\"]"
|
427
|
-
------------------------------------------------------------------------
|
428
|
-
#### abachman - ulid-ruby
|
429
|
-
cd ./benchmark/compare_with_othergems/abachman && bundle install --quiet && bundle exec ruby -v ./generate.rb
|
430
|
-
ruby 3.0.1p64 (2021-04-05 revision 0fb782ee38) [x86_64-darwin20]
|
431
|
-
Warming up --------------------------------------
|
432
|
-
ULID.generate 3.862k i/100ms
|
433
|
-
Calculating -------------------------------------
|
434
|
-
ULID.generate 38.415k (±13.1%) i/s - 189.238k in 5.025788s
|
435
|
-
"`ulid-ruby gem - 1.0.0` generated products: 260625 - sample: [\"01F59Y9H9V17EPXTYNZDCXB9EZ\", \"01F59Y9J4S4XZ68MF5DJDWHTAC\", \"01F59Y9J8887VC8E850QSBDCDX\", \"01F59Y9JEJPD088EYXVHB86W3N\", \"01F59Y9GGAZFXGCB92EQD695CZ\"]"
|
436
|
-
------------------------------------------------------------------------
|
437
|
-
#### kachick - ruby-ulid(This one)
|
438
|
-
cd ./benchmark/compare_with_othergems/kachick && bundle install --quiet && bundle exec ruby -v ./generate.rb
|
439
|
-
ruby 3.0.1p64 (2021-04-05 revision 0fb782ee38) [x86_64-darwin20]
|
440
|
-
Warming up --------------------------------------
|
441
|
-
ULID.generate.to_s 3.185k i/100ms
|
442
|
-
Calculating -------------------------------------
|
443
|
-
ULID.generate.to_s 31.934k (± 9.1%) i/s - 159.250k in 5.030707s
|
444
|
-
"`ruby-ulid gem (this one) - 0.1.0` generated products: 223867 - sample: [\"01F59Y9SPZHM6JCTYP50CHGVAX\", \"01F59Y9VB7X0SX32MMKF78KJR3\", \"01F59Y9W0C83RYCNYVH84R4JG3\", \"01F59Y9V218Q3D4YP3W74ET3EW\", \"01F59Y9X6DD8NX99WBGCR7RNXF\"]"
|
445
|
-
```
|
406
|
+
### Compare performance with them
|
446
407
|
|
447
|
-
|
448
|
-
|
449
|
-
```plaintext
|
450
|
-
#### rafaelsales - ulid
|
451
|
-
cd ./benchmark/compare_with_othergems/rafaelsales && bundle install --quiet && bundle exec ruby -v ./generate.rb
|
452
|
-
ruby 3.0.1p64 (2021-04-05 revision 0fb782ee38) [x86_64-darwin20]
|
453
|
-
Warming up --------------------------------------
|
454
|
-
ULID.generate 2.473k i/100ms
|
455
|
-
Calculating -------------------------------------
|
456
|
-
ULID.generate 24.101k (±15.9%) i/s - 118.704k in 5.066190s
|
457
|
-
"`ulid gem - 1.3.0` generated products: 164763 - sample: [\"01F59YEGPFMXXZWC1YQ49TSK8Y\", \"01F59YEFF7VX5WAW91VTCSE2N9\", \"01F59YEEZ5P9428SDYEDYW8D27\", \"01F59YEHVK56DZBJSNSQK6V1W6\", \"01F59YEHE07M98PVV97ABBAKHM\"]"
|
458
|
-
------------------------------------------------------------------------
|
459
|
-
#### abachman - ulid-ruby
|
460
|
-
cd ./benchmark/compare_with_othergems/abachman && bundle install --quiet && bundle exec ruby -v ./generate.rb
|
461
|
-
ruby 3.0.1p64 (2021-04-05 revision 0fb782ee38) [x86_64-darwin20]
|
462
|
-
Warming up --------------------------------------
|
463
|
-
ULID.generate 2.620k i/100ms
|
464
|
-
Calculating -------------------------------------
|
465
|
-
ULID.generate 27.571k (±14.2%) i/s - 136.240k in 5.056272s
|
466
|
-
"`ulid-ruby gem - 1.0.0` generated products: 186683 - sample: [\"01F59YEVX6GC9TC0RCZ74RC6Z3\", \"01F59YESJXWYGZ61TXHKRVKS97\", \"01F59YEVQ4QQKBED5T49RTV1MA\", \"01F59YEPJ6MMZY1N63DNW7C4SN\", \"01F59YEQK52K8TKTP1ESC6VC5X\"]"
|
467
|
-
------------------------------------------------------------------------
|
468
|
-
#### kachick - ruby-ulid(This one)
|
469
|
-
cd ./benchmark/compare_with_othergems/kachick && bundle install --quiet && bundle exec ruby -v ./generate.rb
|
470
|
-
ruby 3.0.1p64 (2021-04-05 revision 0fb782ee38) [x86_64-darwin20]
|
471
|
-
Warming up --------------------------------------
|
472
|
-
ULID.generate.to_s 3.014k i/100ms
|
473
|
-
Calculating -------------------------------------
|
474
|
-
ULID.generate.to_s 31.612k (±10.1%) i/s - 156.728k in 5.013432s
|
475
|
-
"`ruby-ulid gem (this one) - 0.1.0` generated products: 212293 - sample: [\"01F59YF1WP49TT4GQPDN3E9JTJ\", \"01F59YF1MW1ZDQW93NX4J6RG4G\", \"01F59YF0KRX2CZKHDQQSN5HXHW\", \"01F59YEZVNH8YHP4ZHDK2ZRWSR\", \"01F59YF1J0FV3CVV099SHA2Q9A\"]"
|
476
|
-
```
|
408
|
+
See [Benchmark](https://github.com/kachick/ruby-ulid/wiki/Benchmark).
|
477
409
|
|
478
|
-
|
479
|
-
So I think the results are acceptable.
|
480
|
-
</details>
|
410
|
+
The results are not something to be proud of.
|
481
411
|
|
482
412
|
## References
|
483
413
|
|
data/lib/ulid.rb
CHANGED
@@ -259,10 +259,9 @@ class ULID
|
|
259
259
|
from_integer(CrockfordBase32.decode(string))
|
260
260
|
end
|
261
261
|
|
262
|
-
# @param [String, #to_str] string
|
263
262
|
# @return [Boolean]
|
264
|
-
def self.valid?(
|
265
|
-
string = String.try_convert(
|
263
|
+
def self.valid?(object)
|
264
|
+
string = String.try_convert(object)
|
266
265
|
string ? STRICT_PATTERN_WITH_CROCKFORD_BASE32_SUBSET.match?(string) : false
|
267
266
|
end
|
268
267
|
|
@@ -51,6 +51,7 @@ class ULID
|
|
51
51
|
CROCKFORD_BASE32_CHAR_BY_N32_CHAR = N32_CHAR_BY_CROCKFORD_BASE32_CHAR.invert.freeze
|
52
52
|
N32_CHAR_PATTERN = /[#{CROCKFORD_BASE32_CHAR_BY_N32_CHAR.keys.join}]/.freeze
|
53
53
|
|
54
|
+
# @api private
|
54
55
|
# @param [String] string
|
55
56
|
# @return [Integer]
|
56
57
|
def self.decode(string)
|
@@ -58,6 +59,7 @@ class ULID
|
|
58
59
|
n32encoded.to_i(32)
|
59
60
|
end
|
60
61
|
|
62
|
+
# @api private
|
61
63
|
# @param [Integer] integer
|
62
64
|
# @return [String]
|
63
65
|
def self.encode(integer)
|
data/lib/ulid/uuid.rb
CHANGED
@@ -18,7 +18,7 @@ class ULID
|
|
18
18
|
uuid = String.try_convert(uuid)
|
19
19
|
raise ArgumentError, 'ULID.from_uuidv4 takes only strings' unless uuid
|
20
20
|
|
21
|
-
prefix_trimmed = uuid.
|
21
|
+
prefix_trimmed = uuid.delete_prefix('urn:uuid:')
|
22
22
|
unless UUIDV4_PATTERN.match?(prefix_trimmed)
|
23
23
|
raise ParserError, "given `#{uuid}` does not match to `#{UUIDV4_PATTERN.inspect}`"
|
24
24
|
end
|
data/lib/ulid/version.rb
CHANGED
data/sig/ulid.rbs
CHANGED
@@ -1,5 +1,4 @@
|
|
1
|
-
|
2
|
-
class ULID
|
1
|
+
class ULID < Object
|
3
2
|
VERSION: String
|
4
3
|
CROCKFORD_BASE32_ENCODING_STRING: String
|
5
4
|
TIMESTAMP_ENCODED_LENGTH: 10
|
@@ -45,21 +44,28 @@ class ULID
|
|
45
44
|
CROCKFORD_BASE32_CHAR_BY_N32_CHAR: Hash[String, String]
|
46
45
|
N32_CHAR_PATTERN: Regexp
|
47
46
|
|
47
|
+
# A pribate API. Should not be used in your code.
|
48
48
|
def self.encode: (Integer integer) -> String
|
49
|
+
|
50
|
+
# A pribate API. Should not be used in your code.
|
49
51
|
def self.decode: (String string) -> Integer
|
50
52
|
end
|
51
53
|
|
52
54
|
class MonotonicGenerator
|
53
55
|
@mutex: Thread::Mutex
|
54
56
|
attr_reader prev: ULID | nil
|
57
|
+
|
58
|
+
# A pribate API. Should not be used in your code.
|
55
59
|
def initialize: -> void
|
60
|
+
|
61
|
+
# 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)
|
56
62
|
def generate: (?moment: moment) -> ULID
|
57
63
|
def inspect: -> String
|
58
64
|
alias to_s inspect
|
59
65
|
def freeze: -> void
|
60
66
|
end
|
61
67
|
|
62
|
-
interface
|
68
|
+
interface _ToULID
|
63
69
|
def to_ulid: () -> ULID
|
64
70
|
end
|
65
71
|
|
@@ -75,57 +81,409 @@ class ULID
|
|
75
81
|
@inspect: String?
|
76
82
|
@time: Time?
|
77
83
|
|
84
|
+
# Retuns a ULID
|
85
|
+
#
|
86
|
+
# They are sortable when generated in different timestamp with milliseconds precision
|
87
|
+
#
|
88
|
+
# ```ruby
|
89
|
+
# ulids = 1000.times.map do
|
90
|
+
# sleep(0.001)
|
91
|
+
# ULID.generate
|
92
|
+
# end
|
93
|
+
# ulids.uniq(&:to_time).size #=> 1000
|
94
|
+
# ulids.sort == ulids #=> true
|
95
|
+
# ```
|
96
|
+
#
|
97
|
+
# `ULID.generate` can take fixed `Time` instance.
|
98
|
+
# See also the short hand [ULID.at](https://kachick.github.io/ruby-ulid/ULID.html#at-class_method)
|
99
|
+
#
|
100
|
+
# ```ruby
|
101
|
+
# time = Time.at(946684800).utc #=> 2000-01-01 00:00:00 UTC
|
102
|
+
# ULID.generate(moment: time) #=> ULID(2000-01-01 00:00:00.000 UTC: 00VHNCZB00N018DCPJA4H9379P)
|
103
|
+
# ULID.generate(moment: time) #=> ULID(2000-01-01 00:00:00.000 UTC: 00VHNCZB006WQT3JTMN0T14EBP)
|
104
|
+
# ```
|
105
|
+
#
|
106
|
+
# The basic generator prefers `randomness`, it does not guarantee `sortable` for same milliseconds ULIDs.
|
107
|
+
#
|
108
|
+
# ```ruby
|
109
|
+
# ulids = 10000.times.map do
|
110
|
+
# ULID.generate
|
111
|
+
# end
|
112
|
+
# ulids.uniq(&:to_time).size #=> 35 (the size is not fixed, might be changed in environment)
|
113
|
+
# ulids.sort == ulids #=> false
|
114
|
+
# ```
|
115
|
+
#
|
116
|
+
# If you want to keep sortable even if in same timestamp, See also [ULID::MonotonicGenerator](https://github.com/kachick/ruby-ulid#how-to-keep-sortable-even-if-in-same-timestamp)
|
117
|
+
#
|
78
118
|
def self.generate: (?moment: moment, ?entropy: Integer) -> self
|
119
|
+
|
120
|
+
# Shorthand of `ULID.generate(moment: Time)`
|
121
|
+
# See also [ULID.generate](https://kachick.github.io/ruby-ulid/ULID.html#generate-class_method)
|
122
|
+
#
|
123
|
+
# ```ruby
|
124
|
+
# time = Time.at(946684800).utc #=> 2000-01-01 00:00:00 UTC
|
125
|
+
# ULID.at(time) #=> ULID(2000-01-01 00:00:00.000 UTC: 00VHNCZB002W5BGWWKN76N22H6)
|
126
|
+
#
|
127
|
+
# ulids = 1000.times.map do |n|
|
128
|
+
# ULID.at(time + n)
|
129
|
+
# end
|
130
|
+
# ulids.sort == ulids #=> true
|
131
|
+
# ```
|
79
132
|
def self.at: (Time time) -> self
|
133
|
+
|
134
|
+
# A pribate API. Should not be used in your code.
|
80
135
|
def self.current_milliseconds: -> Integer
|
136
|
+
|
137
|
+
# A pribate API. Should not be used in your code.
|
81
138
|
def self.milliseconds_from_moment: (moment moment) -> Integer
|
139
|
+
|
140
|
+
# `ULID` can be element of the `Range`. If you generated the IDs in monotonic generator, ID based filtering is easy and reliable
|
141
|
+
#
|
142
|
+
# ```ruby
|
143
|
+
# include_end = ulid1..ulid2
|
144
|
+
# exclude_end = ulid1...ulid2
|
145
|
+
#
|
146
|
+
# ulids.grep(one_of_the_above)
|
147
|
+
# ulids.grep_v(one_of_the_above)
|
148
|
+
# ```
|
149
|
+
#
|
150
|
+
# When want to filter ULIDs with `Time`, we should consider to handle the precision.
|
151
|
+
# So this gem provides `ULID.range` to generate reasonable `Range[ULID]` from `Range[Time]`
|
152
|
+
#
|
153
|
+
# ```ruby
|
154
|
+
# # Both of below, The begin of `Range[ULID]` will be the minimum in the floored milliseconds of the time1
|
155
|
+
# include_end = ULID.range(time1..time2) #=> The end of `Range[ULID]` will be the maximum in the floored milliseconds of the time2
|
156
|
+
# exclude_end = ULID.range(time1...time2) #=> The end of `Range[ULID]` will be the minimum in the floored milliseconds of the time2
|
157
|
+
#
|
158
|
+
# # Below patterns are acceptable
|
159
|
+
# pinpointing = ULID.range(time1..time1) #=> This will match only for all IDs in `time1`
|
160
|
+
# until_the_end = ULID.range(..time1) #=> This will match only for all IDs upto `time1` (The `nil` starting `Range` can be used since Ruby 2.7)
|
161
|
+
# until_the_end = ULID.range(ULID.min.to_time..time1) #=> This is same as above for Ruby 2.6
|
162
|
+
# until_the_ulid_limit = ULID.range(time1..) # This will match only for all IDs from `time1` to max value of the ULID limit
|
163
|
+
#
|
164
|
+
# # So you can use the generated range objects as below
|
165
|
+
# ulids.grep(one_of_the_above)
|
166
|
+
# ulids.grep_v(one_of_the_above)
|
167
|
+
# #=> I hope the results should be actually you want!
|
168
|
+
# ```
|
169
|
+
#
|
82
170
|
def self.range: (period period) -> Range[ULID]
|
171
|
+
|
172
|
+
# Returns new `Time` with truncating excess precisions in ULID spec.
|
173
|
+
#
|
174
|
+
# ```ruby
|
175
|
+
# time = Time.at(946684800, Rational('123456.789')).utc
|
176
|
+
# #=> 2000-01-01 00:00:00.123456789 UTC
|
177
|
+
# ULID.floor(time) #=> 2000-01-01 00:00:00.123 UTC
|
178
|
+
# ```
|
83
179
|
def self.floor: (Time time) -> Time
|
84
|
-
|
180
|
+
|
181
|
+
# Get ULID instance from encoded String.
|
182
|
+
#
|
183
|
+
# ```ruby
|
184
|
+
# ulid = ULID.parse('01ARZ3NDEKTSV4RRFFQ69G5FAV')
|
185
|
+
# #=> ULID(2016-07-30 23:54:10.259 UTC: 01ARZ3NDEKTSV4RRFFQ69G5FAV)
|
186
|
+
# ```
|
187
|
+
def self.parse: (_ToStr string) -> self
|
188
|
+
|
189
|
+
# ```ruby
|
190
|
+
# # Currently experimental feature, so needed to load the extension.
|
191
|
+
# require 'ulid/uuid'
|
192
|
+
#
|
193
|
+
# # Basically reversible
|
194
|
+
# ulid = ULID.from_uuidv4('0983d0a2-ff15-4d83-8f37-7dd945b5aa39')
|
195
|
+
# #=> ULID(2301-07-10 00:28:28.821 UTC: 09GF8A5ZRN9P1RYDVXV52VBAHS)
|
196
|
+
# ulid.to_uuidv4 #=> "0983d0a2-ff15-4d83-8f37-7dd945b5aa39"
|
197
|
+
# ```
|
198
|
+
#
|
199
|
+
# See also [Why this is experimental?](https://github.com/kachick/ruby-ulid/issues/76)
|
85
200
|
def self.from_uuidv4: (String uuid) -> ULID
|
86
201
|
def self.from_integer: (Integer integer) -> self
|
202
|
+
|
203
|
+
# Returns termination values for ULID spec.
|
204
|
+
#
|
205
|
+
# ```ruby
|
206
|
+
# ULID.min
|
207
|
+
# #=> ULID(1970-01-01 00:00:00.000 UTC: 00000000000000000000000000)
|
208
|
+
# ```
|
209
|
+
#
|
210
|
+
# It can take `Time` instance as an optional argument.
|
211
|
+
# Then returns ULID that has minimum value of randomness part in the timestamp.
|
212
|
+
#
|
213
|
+
# ```ruby
|
214
|
+
# time = Time.at(946684800, Rational('123456.789')).utc
|
215
|
+
# #=> 2000-01-01 00:00:00.123456789 UTC
|
216
|
+
# ULID.min(time)
|
217
|
+
# #=> ULID(2000-01-01 00:00:00.123 UTC: 00VHNCZB3V0000000000000000)
|
218
|
+
# ```
|
219
|
+
#
|
220
|
+
# See also [ULID.max](https://kachick.github.io/ruby-ulid/ULID.html#max-class_method)
|
87
221
|
def self.min: (?moment moment) -> ULID
|
222
|
+
|
223
|
+
# Returns termination values for ULID spec.
|
224
|
+
#
|
225
|
+
# ```ruby
|
226
|
+
# ULID.max
|
227
|
+
# #=> ULID(10889-08-02 05:31:50.655 UTC: 7ZZZZZZZZZZZZZZZZZZZZZZZZZ)
|
228
|
+
# ```
|
229
|
+
#
|
230
|
+
# It can take `Time` instance as an optional argument.
|
231
|
+
# Then returns ULID that has maximum value of randomness part in the timestamp.
|
232
|
+
#
|
233
|
+
# ```ruby
|
234
|
+
# time = Time.at(946684800, Rational('123456.789')).utc
|
235
|
+
# #=> 2000-01-01 00:00:00.123456789 UTC
|
236
|
+
# ULID.max(time)
|
237
|
+
# #=> ULID(2000-01-01 00:00:00.123 UTC: 00VHNCZB3VZZZZZZZZZZZZZZZZ)
|
238
|
+
# ```
|
239
|
+
#
|
240
|
+
# See also [ULID.min](https://kachick.github.io/ruby-ulid/ULID.html#min-class_method)
|
88
241
|
def self.max: (?moment moment) -> ULID
|
242
|
+
|
243
|
+
# Returns random ULIDs.
|
244
|
+
#
|
245
|
+
# Basically ignores generating time.
|
246
|
+
#
|
247
|
+
# ```ruby
|
248
|
+
# ULID.sample #=> ULID(2545-07-26 06:51:20.085 UTC: 0GGKQ45GMNMZR6N8A8GFG0ZXST)
|
249
|
+
# ULID.sample #=> ULID(5098-07-26 21:31:06.946 UTC: 2SSBNGGYA272J7BMDCG4Z6EEM5)
|
250
|
+
# ULID.sample(0) #=> []
|
251
|
+
# ULID.sample(1) #=> [ULID(2241-04-16 03:31:18.440 UTC: 07S52YWZ98AZ8T565MD9VRYMQH)]
|
252
|
+
# ULID.sample(5)
|
253
|
+
# #=>
|
254
|
+
# #[ULID(5701-04-29 12:41:19.647 UTC: 3B2YH2DV0ZYDDATGTYSKMM1CMT),
|
255
|
+
# # ULID(2816-08-01 01:21:46.612 UTC: 0R9GT6RZKMK3RG02Q2HAFVKEY2),
|
256
|
+
# # ULID(10408-10-05 17:06:27.848 UTC: 7J6CPTEEC86Y24EQ4F1Y93YYN0),
|
257
|
+
# # ULID(2741-09-02 16:24:18.803 UTC: 0P4Q4V34KKAJW46QW47WQB5463),
|
258
|
+
# # ULID(2665-03-16 14:50:22.724 UTC: 0KYFW9DWM4CEGFNTAC6YFAVVJ6)]
|
259
|
+
# ```
|
260
|
+
#
|
261
|
+
# You can specify a range object for the timestamp restriction, See also [ULID.range](https://kachick.github.io/ruby-ulid/ULID.html#range-class_method).
|
262
|
+
#
|
263
|
+
# ```ruby
|
264
|
+
# ulid1 = ULID.parse('01F4A5Y1YAQCYAYCTC7GRMJ9AA') #=> ULID(2021-04-27 17:27:22.826 UTC: 01F4A5Y1YAQCYAYCTC7GRMJ9AA)
|
265
|
+
# ulid2 = ULID.parse('01F4PTVCSN9ZPFKYTY2DDJVRK4') #=> ULID(2021-05-02 15:23:48.917 UTC: 01F4PTVCSN9ZPFKYTY2DDJVRK4)
|
266
|
+
# ulids = ULID.sample(1000, period: ulid1..ulid2)
|
267
|
+
# ulids.uniq.size #=> 1000
|
268
|
+
# ulids.take(10)
|
269
|
+
# #=>
|
270
|
+
# #[ULID(2021-05-02 06:57:19.954 UTC: 01F4NXW02JNB8H0J0TK48JD39X),
|
271
|
+
# # ULID(2021-05-02 07:06:07.458 UTC: 01F4NYC372GVP7NS0YAYQGT4VZ),
|
272
|
+
# # ULID(2021-05-01 06:16:35.791 UTC: 01F4K94P6F6P68K0H64WRDSFKW),
|
273
|
+
# # ULID(2021-04-27 22:17:37.844 UTC: 01F4APHGSMFJZQTGXKZBFFBPJP),
|
274
|
+
# # ULID(2021-04-28 20:17:55.357 UTC: 01F4D231MXQJXAR8G2JZHEJNH3),
|
275
|
+
# # ULID(2021-04-30 07:18:54.307 UTC: 01F4GTA2332AS2VPHC4FMKC7R5),
|
276
|
+
# # ULID(2021-05-02 12:26:03.480 UTC: 01F4PGNXARG554Y3HYVBDW4T9S),
|
277
|
+
# # ULID(2021-04-29 09:52:15.107 UTC: 01F4EGP483ZX2747FQPWQNPPMW),
|
278
|
+
# # ULID(2021-04-29 03:18:24.152 UTC: 01F4DT4Z4RA0QV8WFQGRAG63EH),
|
279
|
+
# # ULID(2021-05-02 13:27:16.394 UTC: 01F4PM605ABF5SDVMEHBH8JJ9R)]
|
280
|
+
# ULID.sample(10, period: ulid1.to_time..ulid2.to_time)
|
281
|
+
# #=>
|
282
|
+
# # [ULID(2021-04-29 06:44:41.513 UTC: 01F4E5YPD9XQ3MYXWK8ZJKY8SW),
|
283
|
+
# # ULID(2021-05-01 00:35:06.629 UTC: 01F4JNKD85SVK1EAEYSJGF53A2),
|
284
|
+
# # ULID(2021-05-02 12:45:28.408 UTC: 01F4PHSEYRG9BWBEWMRW1XE6WW),
|
285
|
+
# # ULID(2021-05-01 03:06:09.130 UTC: 01F4JY7ZBABCBMX16XH2Q4JW4W),
|
286
|
+
# # ULID(2021-04-29 21:38:58.109 UTC: 01F4FS45DX4049JEQK4W6TER6G),
|
287
|
+
# # ULID(2021-04-29 17:14:14.116 UTC: 01F4F9ZDQ449BE8BBZFEHYQWG2),
|
288
|
+
# # ULID(2021-04-30 16:18:08.205 UTC: 01F4HS5DPD1HWDVJNJ6YKJXKSK),
|
289
|
+
# # ULID(2021-04-30 10:31:33.602 UTC: 01F4H5ATF2A1CSQF0XV5NKZ288),
|
290
|
+
# # ULID(2021-04-28 16:49:06.484 UTC: 01F4CP4PDM214Q6H3KJP7DYJRR),
|
291
|
+
# # ULID(2021-04-28 15:05:06.808 UTC: 01F4CG68ZRST94T056KRZ5K9S4)]
|
292
|
+
# ```
|
89
293
|
def self.sample: (?period: period) -> self
|
90
294
|
| (Integer number, ?period: period) -> Array[self]
|
91
|
-
def self.valid?: (untyped
|
92
|
-
|
93
|
-
|
295
|
+
def self.valid?: (untyped) -> bool
|
296
|
+
|
297
|
+
# Returns parsed ULIDs from given String for rough operations.
|
298
|
+
#
|
299
|
+
# ```ruby
|
300
|
+
# json =<<'EOD'
|
301
|
+
# {
|
302
|
+
# "id": "01F4GNAV5ZR6FJQ5SFQC7WDSY3",
|
303
|
+
# "author": {
|
304
|
+
# "id": "01F4GNBXW1AM2KWW52PVT3ZY9X",
|
305
|
+
# "name": "kachick"
|
306
|
+
# },
|
307
|
+
# "title": "My awesome blog post",
|
308
|
+
# "comments": [
|
309
|
+
# {
|
310
|
+
# "id": "01F4GNCNC3CH0BCRZBPPDEKBKS",
|
311
|
+
# "commenter": {
|
312
|
+
# "id": "01F4GNBXW1AM2KWW52PVT3ZY9X",
|
313
|
+
# "name": "kachick"
|
314
|
+
# }
|
315
|
+
# },
|
316
|
+
# {
|
317
|
+
# "id": "01F4GNCXAMXQ1SGBH5XCR6ZH0M",
|
318
|
+
# "commenter": {
|
319
|
+
# "id": "01F4GND4RYYSKNAADHQ9BNXAWJ",
|
320
|
+
# "name": "pankona"
|
321
|
+
# }
|
322
|
+
# }
|
323
|
+
# ]
|
324
|
+
# }
|
325
|
+
# EOD
|
326
|
+
#
|
327
|
+
# ULID.scan(json).to_a
|
328
|
+
# #=>
|
329
|
+
# # [ULID(2021-04-30 05:51:57.119 UTC: 01F4GNAV5ZR6FJQ5SFQC7WDSY3),
|
330
|
+
# # ULID(2021-04-30 05:52:32.641 UTC: 01F4GNBXW1AM2KWW52PVT3ZY9X),
|
331
|
+
# # ULID(2021-04-30 05:52:56.707 UTC: 01F4GNCNC3CH0BCRZBPPDEKBKS),
|
332
|
+
# # ULID(2021-04-30 05:52:32.641 UTC: 01F4GNBXW1AM2KWW52PVT3ZY9X),
|
333
|
+
# # ULID(2021-04-30 05:53:04.852 UTC: 01F4GNCXAMXQ1SGBH5XCR6ZH0M),
|
334
|
+
# # ULID(2021-04-30 05:53:12.478 UTC: 01F4GND4RYYSKNAADHQ9BNXAWJ)]
|
335
|
+
# ```
|
336
|
+
def self.scan: (_ToStr string) -> Enumerator[self, singleton(ULID)]
|
337
|
+
| (_ToStr string) { (self ulid) -> void } -> singleton(ULID)
|
94
338
|
def self.from_milliseconds_and_entropy: (milliseconds: Integer, entropy: Integer) -> self
|
95
|
-
def self.try_convert: (
|
339
|
+
def self.try_convert: (_ToULID) -> ULID
|
96
340
|
| (untyped) -> nil
|
341
|
+
|
342
|
+
# ```ruby
|
343
|
+
# ulid = ULID.generate
|
344
|
+
# #=> ULID(2021-04-27 17:27:22.826 UTC: 01F4A5Y1YAQCYAYCTC7GRMJ9AA)
|
345
|
+
# ulid.milliseconds #=> 1619544442826
|
346
|
+
# ```
|
97
347
|
attr_reader milliseconds: Integer
|
98
348
|
attr_reader entropy: Integer
|
99
|
-
|
349
|
+
|
350
|
+
# ```ruby
|
351
|
+
# ulid = ULID.generate
|
352
|
+
# #=> ULID(2021-04-27 17:27:22.826 UTC: 01F4A5Y1YAQCYAYCTC7GRMJ9AA)
|
353
|
+
# ulid.to_s #=> "01F4A5Y1YAQCYAYCTC7GRMJ9AA"
|
354
|
+
# ```
|
100
355
|
def to_s: -> String
|
356
|
+
|
357
|
+
# ```ruby
|
358
|
+
# ulid = ULID.generate
|
359
|
+
# #=> ULID(2021-04-27 17:27:22.826 UTC: 01F4A5Y1YAQCYAYCTC7GRMJ9AA)
|
360
|
+
# ulid.to_i #=> 1957909092946624190749577070267409738
|
361
|
+
# ```
|
101
362
|
def to_i: -> Integer
|
102
363
|
alias hash to_i
|
364
|
+
|
365
|
+
# Basically same as String based sort.
|
366
|
+
#
|
367
|
+
# ```ruby
|
368
|
+
# ulids = ULID.sample(10000); nil
|
369
|
+
# ulids.map(&:to_s).sort == ulids.sort.map(&:to_s)
|
370
|
+
# #=> true
|
371
|
+
# ```
|
372
|
+
#
|
373
|
+
# 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. So preferable than `lexicographically sortable` in actual case.
|
374
|
+
#
|
103
375
|
def <=>: (ULID other) -> Integer
|
104
376
|
| (untyped other) -> nil
|
377
|
+
|
378
|
+
# ```ruby
|
379
|
+
# ulid = ULID.generate
|
380
|
+
# ulid.inspect #=> "ULID(2021-04-27 17:27:22.826 UTC: 01F4A5Y1YAQCYAYCTC7GRMJ9AA)"
|
381
|
+
# ```
|
105
382
|
def inspect: -> String
|
383
|
+
|
384
|
+
# ```ruby
|
385
|
+
# ULID.parse('4NNB20D9C1ME2NGMTX51ERZJX0') == ULID.parse('4nnb20d9c1me2ngmtx51erzjx0')
|
386
|
+
# #=> true
|
387
|
+
# ```
|
106
388
|
def eql?: (untyped other) -> bool
|
107
389
|
alias == eql?
|
108
390
|
def ===: (untyped other) -> bool
|
391
|
+
|
392
|
+
# ```ruby
|
393
|
+
# ulid = ULID.generate
|
394
|
+
# #=> ULID(2021-04-27 17:27:22.826 UTC: 01F4A5Y1YAQCYAYCTC7GRMJ9AA)
|
395
|
+
# ulid.to_time #=> 2021-04-27 17:27:22.826 UTC
|
396
|
+
# ```
|
109
397
|
def to_time: -> Time
|
398
|
+
|
399
|
+
# ```ruby
|
400
|
+
# ulid = ULID.generate
|
401
|
+
# #=> ULID(2021-04-27 17:27:22.826 UTC: 01F4A5Y1YAQCYAYCTC7GRMJ9AA)
|
402
|
+
# ulid.timestamp #=> "01F4A5Y1YA"
|
403
|
+
# ```
|
110
404
|
def timestamp: -> String
|
405
|
+
|
406
|
+
# ```ruby
|
407
|
+
# ulid = ULID.generate
|
408
|
+
# #=> ULID(2021-04-27 17:27:22.826 UTC: 01F4A5Y1YAQCYAYCTC7GRMJ9AA)
|
409
|
+
# ulid.randomness #=> "QCYAYCTC7GRMJ9AA"
|
410
|
+
# ```
|
111
411
|
def randomness: -> String
|
412
|
+
|
413
|
+
# Intentionally avoiding to use `Record type` ref: https://github.com/ruby/rbs/blob/4fb4c33b2325d1a73d79ff7aaeb49f21cec1e0e5/docs/syntax.md#record-type
|
414
|
+
# Because the returning values are not fixed.
|
112
415
|
def patterns: -> Hash[Symbol, Regexp | String]
|
113
416
|
def octets: -> octets
|
114
417
|
def timestamp_octets: -> timestamp_octets
|
115
418
|
def randomness_octets: -> randomness_octets
|
419
|
+
|
420
|
+
# ```ruby
|
421
|
+
# # Currently experimental feature, so needed to load the extension.
|
422
|
+
# require 'ulid/uuid'
|
423
|
+
#
|
424
|
+
# # Basically reversible
|
425
|
+
# ulid = ULID.from_uuidv4('0983d0a2-ff15-4d83-8f37-7dd945b5aa39')
|
426
|
+
# #=> ULID(2301-07-10 00:28:28.821 UTC: 09GF8A5ZRN9P1RYDVXV52VBAHS)
|
427
|
+
# ulid.to_uuidv4 #=> "0983d0a2-ff15-4d83-8f37-7dd945b5aa39"
|
428
|
+
# ```
|
429
|
+
#
|
430
|
+
# See also [Why this is experimental?](https://github.com/kachick/ruby-ulid/issues/76)
|
116
431
|
def to_uuidv4: -> String
|
117
|
-
|
118
|
-
|
432
|
+
|
433
|
+
# Returns next(successor) ULID.
|
434
|
+
# Especially `ULID#succ` makes it possible `Range[ULID]#each`.
|
435
|
+
#
|
436
|
+
# NOTE: But basically `Range[ULID]#each` should not be used, incrementing 128 bits IDs are not reasonable operation in most case
|
437
|
+
#
|
438
|
+
# ```ruby
|
439
|
+
# ULID.parse('01BX5ZZKBKZZZZZZZZZZZZZZZY').next.to_s #=> "01BX5ZZKBKZZZZZZZZZZZZZZZZ"
|
440
|
+
# ULID.parse('01BX5ZZKBKZZZZZZZZZZZZZZZZ').next.to_s #=> "01BX5ZZKBM0000000000000000"
|
441
|
+
# ULID.parse('7ZZZZZZZZZZZZZZZZZZZZZZZZZ').next #=> nil
|
442
|
+
# ```
|
443
|
+
#
|
444
|
+
# See also [ULID#pred](https://kachick.github.io/ruby-ulid/ULID.html#pred-instance_method)
|
445
|
+
def succ: -> ULID?
|
446
|
+
alias next succ
|
447
|
+
|
448
|
+
# Returns predecessor ULID.
|
449
|
+
#
|
450
|
+
# ```ruby
|
451
|
+
# ULID.parse('01BX5ZZKBK0000000000000001').pred.to_s #=> "01BX5ZZKBK0000000000000000"
|
452
|
+
# ULID.parse('01BX5ZZKBK0000000000000000').pred.to_s #=> "01BX5ZZKBJZZZZZZZZZZZZZZZZ"
|
453
|
+
# ULID.parse('00000000000000000000000000').pred #=> nil
|
454
|
+
# ```
|
455
|
+
#
|
456
|
+
# See also [ULID#succ](https://kachick.github.io/ruby-ulid/ULID.html#succ-instance_method)
|
119
457
|
def pred: -> ULID?
|
120
458
|
def freeze: -> self
|
459
|
+
|
460
|
+
# Returns `self`
|
121
461
|
def to_ulid: -> self
|
462
|
+
|
463
|
+
# Returns `self`. Not a new instance.
|
122
464
|
def dup: -> self
|
123
|
-
|
465
|
+
|
466
|
+
# Same API as [Object#clone](https://github.com/ruby/rbs/blob/4fb4c33b2325d1a73d79ff7aaeb49f21cec1e0e5/core/object.rbs#L79)
|
467
|
+
# But actually returns `self`. Not a new instance.
|
124
468
|
def clone: (?freeze: bool) -> self
|
125
469
|
|
126
470
|
private
|
471
|
+
|
472
|
+
# A pribate API. Should not be used in your code.
|
473
|
+
def self.new: (milliseconds: Integer, entropy: Integer, integer: Integer) -> self
|
474
|
+
|
475
|
+
# A pribate API. Should not be used in your code.
|
127
476
|
def self.reasonable_entropy: -> Integer
|
477
|
+
|
478
|
+
# A pribate API. Should not be used in your code.
|
128
479
|
def self.milliseconds_from_time: (Time time) -> Integer
|
480
|
+
|
481
|
+
# A pribate API. Should not be used in your code.
|
129
482
|
def self.safe_get_class_name: (untyped object) -> String
|
483
|
+
|
484
|
+
# A pribate API. Should not be used in your code.
|
485
|
+
def initialize: (milliseconds: Integer, entropy: Integer, integer: Integer) -> void
|
486
|
+
|
487
|
+
# A pribate API. Should not be used in your code.
|
130
488
|
def cache_all_instance_variables: -> void
|
131
489
|
end
|