ruby-ulid 0.0.10 → 0.0.11
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 +62 -51
- data/lib/ulid.rb +14 -4
- data/lib/ulid/version.rb +1 -1
- data/sig/ulid.rbs +2 -1
- metadata +5 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 91f6d4c9dad8e12663686099c487dbbf3ec5b7995e0e4b2b210ac8a16fbcd91c
|
4
|
+
data.tar.gz: 1ca6e29d83771636b2a20aa71d90f15699d07d6a7a75f22c306094507bb51d89
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 22dcc2541f7e4fa1a1d4014f996aef3d3bfcb69b002c1cc6ca4864e17bce50a327e1ec98453b4dab0773400b678055dc024a7287342a08916ce30772aadb418d
|
7
|
+
data.tar.gz: 27c69c7319858a4c732f04f6944ff180f3dfc9a5df12bd67cd1e4cac91421a2bc00d1a79c8ff91190b425731f831fdaef1a2f5bc0c3ef4fdaff73a6ce6749e35
|
data/README.md
CHANGED
@@ -3,10 +3,8 @@
|
|
3
3
|
A handy `ULID` library
|
4
4
|
|
5
5
|
The `ULID` spec is defined on [ulid/spec](https://github.com/ulid/spec).
|
6
|
-
|
7
|
-
|
8
|
-
This gem aims to provide the generator, monotonic generator, parser and handy manipulation methods for the ID.
|
9
|
-
Also having rbs signature files.
|
6
|
+
This gem aims to provide the generator, monotonic generator, parser and handy manipulation features around the ULID.
|
7
|
+
Also providing rbs signature files.
|
10
8
|
|
11
9
|
---
|
12
10
|
|
@@ -57,13 +55,34 @@ ulid.octets #=> [1, 121, 20, 95, 7, 202, 187, 60, 175, 51, 76, 60, 49, 73, 37, 7
|
|
57
55
|
ulid.pattern #=> /(?<timestamp>01F4A5Y1YA)(?<randomness>QCYAYCTC7GRMJ9AA)/i
|
58
56
|
```
|
59
57
|
|
58
|
+
Generator can take `Time` instance
|
59
|
+
|
60
|
+
```ruby
|
61
|
+
time = Time.at(946684800, in: 'UTC') #=> 2000-01-01 00:00:00 UTC
|
62
|
+
ULID.generate(moment: time) #=> ULID(2000-01-01 00:00:00.000 UTC: 00VHNCZB00N018DCPJA4H9379P)
|
63
|
+
ULID.generate(moment: time) #=> ULID(2000-01-01 00:00:00.000 UTC: 00VHNCZB006WQT3JTMN0T14EBP)
|
64
|
+
|
65
|
+
ulids = 1000.times.map do
|
66
|
+
ULID.generate(moment: time)
|
67
|
+
end
|
68
|
+
ulids.sort == ulids #=> false
|
69
|
+
|
70
|
+
ulids = 1000.times.map do |n|
|
71
|
+
ULID.generate(moment: time + n)
|
72
|
+
end
|
73
|
+
ulids.sort == ulids #=> true
|
74
|
+
```
|
75
|
+
|
60
76
|
You can parse from exists IDs
|
61
77
|
|
78
|
+
FYI: Current parser/validator/matcher implementation aims `strict`, It might be changed in [ulid/spec#57](https://github.com/ulid/spec/pull/57) and [ruby-ulid#57](https://github.com/kachick/ruby-ulid/issues/57).
|
79
|
+
|
62
80
|
```ruby
|
63
81
|
ulid = ULID.parse('01ARZ3NDEKTSV4RRFFQ69G5FAV') #=> ULID(2016-07-30 23:54:10.259 UTC: 01ARZ3NDEKTSV4RRFFQ69G5FAV)
|
82
|
+
ulid.to_time #=> 2016-07-30 23:54:10.259 UTC
|
64
83
|
```
|
65
84
|
|
66
|
-
|
85
|
+
ULIDs are sortable when they are generated in different timestamp with milliseconds precision
|
67
86
|
|
68
87
|
```ruby
|
69
88
|
ulids = 1000.times.map do
|
@@ -74,29 +93,40 @@ ulids.sort == ulids #=> true
|
|
74
93
|
ulids.uniq(&:to_time).size #=> 1000
|
75
94
|
```
|
76
95
|
|
77
|
-
|
96
|
+
The basic generator prefers `randomness`, it does not guarantee `sortable` for same milliseconds ULIDs.
|
78
97
|
|
79
98
|
```ruby
|
80
99
|
ulids = 10000.times.map do
|
81
100
|
ULID.generate
|
82
101
|
end
|
83
|
-
ulids.uniq(&:to_time).size #=> 35 (the
|
102
|
+
ulids.uniq(&:to_time).size #=> 35 (the size is not fixed, might be changed in environment)
|
84
103
|
ulids.sort == ulids #=> false
|
104
|
+
```
|
85
105
|
|
106
|
+
If you want to prefer `sortable` rather than the `strict randomness`, Use `MonotonicGenerator` instead. It is called as [Monotonicity](https://github.com/ulid/spec/tree/d0c7170df4517939e70129b4d6462cc162f2d5bf#monotonicity) on the spec.
|
107
|
+
(Though it starts with new random value when changed the timestamp)
|
86
108
|
|
109
|
+
```ruby
|
87
110
|
monotonic_generator = ULID::MonotonicGenerator.new
|
88
111
|
monotonic_ulids = 10000.times.map do
|
89
112
|
monotonic_generator.generate
|
90
113
|
end
|
91
|
-
monotonic_ulids.uniq(&:to_time)
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
114
|
+
sample_ulids_by_the_time = monotonic_ulids.uniq(&:to_time)
|
115
|
+
sample_ulids_by_the_time.size #=> 34 (the size is not fixed, might be changed in environment)
|
116
|
+
sample_ulids_by_the_time.take(10).map(&:randomness)
|
117
|
+
#=>
|
118
|
+
["JZW56CTA8704D5AQ",
|
119
|
+
"JGEBH2A2B2EA97MW",
|
120
|
+
"0XPE4NS3MZH0NAJ4",
|
121
|
+
"E0S3ZAVADFBPW57Y",
|
122
|
+
"E5CX1T6281443THQ",
|
123
|
+
"3SK8WHSH03CVF7J2",
|
124
|
+
"DDS35BT0R20P3V49",
|
125
|
+
"60KG2W9FVEN1ZX8C",
|
126
|
+
"X59YJVXXVH7AXJJE",
|
127
|
+
"1ZBQ7SNGFKXGH1Y4"]
|
96
128
|
|
97
|
-
|
98
|
-
ULID.from_uuidv4('0983d0a2-ff15-4d83-8f37-7dd945b5aa39')
|
99
|
-
#=> ULID(2301-07-10 00:28:28.821 UTC: 09GF8A5ZRN9P1RYDVXV52VBAHS)
|
129
|
+
monotonic_ulids.sort == monotonic_ulids #=> true
|
100
130
|
```
|
101
131
|
|
102
132
|
For rough operations, `ULID.scan` might be useful.
|
@@ -150,50 +180,31 @@ ULID.min(moment: time) #=> ULID(2000-01-01 00:00:00.123 UTC: 00VHNCZB3V000000000
|
|
150
180
|
ULID.max(moment: time) #=> ULID(2000-01-01 00:00:00.123 UTC: 00VHNCZB3VZZZZZZZZZZZZZZZZ)
|
151
181
|
```
|
152
182
|
|
153
|
-
|
154
|
-
|
155
|
-
At first, you should install development dependencies
|
156
|
-
|
157
|
-
```console
|
158
|
-
$ git clone git@github.com:kachick/ruby-ulid.git
|
159
|
-
$ cd ./ruby-ulid
|
160
|
-
$ bundle install
|
161
|
-
# Executing first time might take longtime, because development mode dependent active_support via steep
|
162
|
-
```
|
163
|
-
|
164
|
-
Play with the behaviors in REPL.
|
165
|
-
|
166
|
-
```console
|
167
|
-
$ ./bin/console
|
168
|
-
# Starting up IRB with loading developing ULID library
|
169
|
-
irb(main):001:0>
|
170
|
-
```
|
183
|
+
`ULID#next` and `ULID#succ` returns next(successor) ULID
|
171
184
|
|
172
185
|
```ruby
|
173
|
-
|
174
|
-
|
175
|
-
|
186
|
+
ULID.parse('01BX5ZZKBKZZZZZZZZZZZZZZZY').next.to_s #=> "01BX5ZZKBKZZZZZZZZZZZZZZZZ"
|
187
|
+
ULID.parse('01BX5ZZKBKZZZZZZZZZZZZZZZZ').next.to_s #=> "01BX5ZZKBM0000000000000000"
|
188
|
+
ULID.parse('7ZZZZZZZZZZZZZZZZZZZZZZZZZ').next #=> nil
|
176
189
|
```
|
177
190
|
|
178
|
-
|
191
|
+
`ULID#pred` returns predecessor ULID
|
179
192
|
|
180
|
-
```
|
181
|
-
|
182
|
-
|
183
|
-
|
193
|
+
```ruby
|
194
|
+
ULID.parse('01BX5ZZKBK0000000000000001').pred.to_s #=> "01BX5ZZKBK0000000000000000"
|
195
|
+
ULID.parse('01BX5ZZKBK0000000000000000').pred.to_s #=> "01BX5ZZKBJZZZZZZZZZZZZZZZZ"
|
196
|
+
ULID.parse('00000000000000000000000000').pred #=> nil
|
184
197
|
```
|
185
198
|
|
186
|
-
|
199
|
+
UUIDv4 converter for migration use-cases. (Of course the timestamp will be useless one. Sortable benefit is lost.)
|
187
200
|
|
188
|
-
```
|
189
|
-
|
190
|
-
|
201
|
+
```ruby
|
202
|
+
ULID.from_uuidv4('0983d0a2-ff15-4d83-8f37-7dd945b5aa39')
|
203
|
+
#=> ULID(2301-07-10 00:28:28.821 UTC: 09GF8A5ZRN9P1RYDVXV52VBAHS)
|
191
204
|
```
|
192
205
|
|
193
|
-
##
|
194
|
-
|
195
|
-
- [API documents generated by YARD](https://kachick.github.io/ruby-ulid/)
|
196
|
-
|
197
|
-
## Author
|
206
|
+
## References
|
198
207
|
|
199
|
-
|
208
|
+
- [API documents](https://kachick.github.io/ruby-ulid/)
|
209
|
+
- [ulid/spec](https://github.com/ulid/spec)
|
210
|
+
- [Another choices are UUIDv6, UUIDv7, UUIDv8. But they are still in draft state](https://www.ietf.org/archive/id/draft-peabody-dispatch-new-uuid-format-01.html)
|
data/lib/ulid.rb
CHANGED
@@ -107,6 +107,7 @@ class ULID
|
|
107
107
|
# @return [ULID]
|
108
108
|
# @raise [OverflowError] if the given integer is larger than the ULID limit
|
109
109
|
# @raise [ArgumentError] if the given integer is negative number
|
110
|
+
# @todo Need optimized for performance
|
110
111
|
def self.from_integer(integer)
|
111
112
|
integer = integer.to_int
|
112
113
|
raise OverflowError, "integer overflow: given #{integer}, max: #{MAX_INTEGER}" unless integer <= MAX_INTEGER
|
@@ -292,20 +293,29 @@ class ULID
|
|
292
293
|
@strict_pattern ||= /\A#{pattern.source}\z/i.freeze
|
293
294
|
end
|
294
295
|
|
295
|
-
# @
|
296
|
-
# @return [ULID]
|
296
|
+
# @return [ULID, nil] when called on ULID as `7ZZZZZZZZZZZZZZZZZZZZZZZZZ`, returns `nil` instead of ULID
|
297
297
|
def next
|
298
|
-
|
298
|
+
next_int = to_i.next
|
299
|
+
return nil if next_int > MAX_INTEGER
|
300
|
+
@next ||= self.class.from_integer(next_int)
|
299
301
|
end
|
300
302
|
alias_method :succ, :next
|
301
303
|
|
304
|
+
# @return [ULID, nil] when called on ULID as `00000000000000000000000000`, returns `nil` instead of ULID
|
305
|
+
def pred
|
306
|
+
pre_int = to_i.pred
|
307
|
+
return nil if pre_int.negative?
|
308
|
+
@pred ||= self.class.from_integer(pre_int)
|
309
|
+
end
|
310
|
+
|
302
311
|
# @return [self]
|
303
312
|
def freeze
|
304
313
|
# Evaluate all caching
|
305
314
|
inspect
|
306
315
|
octets
|
307
|
-
succ
|
308
316
|
to_i
|
317
|
+
succ
|
318
|
+
pred
|
309
319
|
strict_pattern
|
310
320
|
super
|
311
321
|
end
|
data/lib/ulid/version.rb
CHANGED
data/sig/ulid.rbs
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-ulid
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.11
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kenichi Kamiya
|
@@ -70,11 +70,10 @@ dependencies:
|
|
70
70
|
- - "<"
|
71
71
|
- !ruby/object:Gem::Version
|
72
72
|
version: '2'
|
73
|
-
description:
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
Also having rbs signature files.
|
73
|
+
description: " ULID(Universally Unique Lexicographically Sortable Identifier) has
|
74
|
+
useful specs for applications (e.g. `Database key`). \n This gem aims to provide
|
75
|
+
the generator, monotonic generator, parser and handy manipulation features around
|
76
|
+
the ULID.\n Also providing `rbs` signature files.\n"
|
78
77
|
email:
|
79
78
|
- kachick1+ruby@gmail.com
|
80
79
|
executables: []
|