ruby-ulid 0.1.4 → 0.1.5
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/{LICENSE → LICENSE.txt} +0 -0
- data/README.md +3 -3
- data/lib/ulid.rb +35 -19
- data/lib/ulid/crockford_base32.rb +11 -4
- data/lib/ulid/monotonic_generator.rb +15 -10
- data/lib/ulid/uuid.rb +2 -1
- data/lib/ulid/version.rb +1 -1
- data/sig/ulid.rbs +15 -9
- metadata +43 -18
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 01dca4f18f5bb3168b135847b6a1171d00a6ceb03b1d2ef68b6df212975cafc1
|
4
|
+
data.tar.gz: e1b0cb033ded88591d4817395507f517f46b7d3dd3d3a72021a216dcfef09d12
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c9c1a60687c05cfa99ce37f4e692938bff96dd15afa6b0adce40de5b897303b6e57301f069299c06d726bdd7a425e1ed581b7b60e15efc88d69abc417c577005
|
7
|
+
data.tar.gz: 71f333e7a6d6169f346b0e8fba65c9413fa24c32ce6799623e11b789544fb057fa0f67f83ed94a896cbac9df123ee4f9c9598735953217bd6fec332df659ee9f
|
data/{LICENSE → LICENSE.txt}
RENAMED
File without changes
|
data/README.md
CHANGED
@@ -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.5', '< 0.2.0'
|
53
53
|
```
|
54
54
|
|
55
55
|
### Generator and Parser
|
@@ -192,7 +192,7 @@ ULID.floor(time) #=> 2000-01-01 00:00:00.123 UTC
|
|
192
192
|
For rough operations, `ULID.scan` might be useful.
|
193
193
|
|
194
194
|
```ruby
|
195
|
-
json
|
195
|
+
json = <<'JSON'
|
196
196
|
{
|
197
197
|
"id": "01F4GNAV5ZR6FJQ5SFQC7WDSY3",
|
198
198
|
"author": {
|
@@ -217,7 +217,7 @@ json =<<'EOD'
|
|
217
217
|
}
|
218
218
|
]
|
219
219
|
}
|
220
|
-
|
220
|
+
JSON
|
221
221
|
|
222
222
|
ULID.scan(json).to_a
|
223
223
|
#=>
|
data/lib/ulid.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
# coding: us-ascii
|
2
2
|
# frozen_string_literal: true
|
3
|
+
|
3
4
|
# Copyright (C) 2021 Kenichi Kamiya
|
4
5
|
|
5
6
|
require 'securerandom'
|
@@ -60,6 +61,7 @@ class ULID
|
|
60
61
|
# @return [ULID]
|
61
62
|
def self.at(time)
|
62
63
|
raise ArgumentError, 'ULID.at takes only `Time` instance' unless Time === time
|
64
|
+
|
63
65
|
from_milliseconds_and_entropy(milliseconds: milliseconds_from_time(time), entropy: reasonable_entropy)
|
64
66
|
end
|
65
67
|
|
@@ -91,19 +93,21 @@ class ULID
|
|
91
93
|
# * Do not take random generator for the arguments
|
92
94
|
# * Raising error instead of truncating elements for the given number
|
93
95
|
def self.sample(*args, period: nil)
|
94
|
-
int_generator =
|
95
|
-
|
96
|
-
|
96
|
+
int_generator = (
|
97
|
+
if period
|
98
|
+
ulid_range = range(period)
|
99
|
+
min, max, exclude_end = ulid_range.begin.to_i, ulid_range.end.to_i, ulid_range.exclude_end?
|
97
100
|
|
98
|
-
|
99
|
-
|
101
|
+
possibilities = (max - min) + (exclude_end ? 0 : 1)
|
102
|
+
raise ArgumentError, "given range `#{ulid_range.inspect}` does not have possibilities" unless possibilities.positive?
|
100
103
|
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
104
|
+
-> {
|
105
|
+
SecureRandom.random_number(possibilities) + min
|
106
|
+
}
|
107
|
+
else
|
108
|
+
RANDOM_INTEGER_GENERATOR
|
109
|
+
end
|
110
|
+
)
|
107
111
|
|
108
112
|
case args.size
|
109
113
|
when 0
|
@@ -134,6 +138,7 @@ class ULID
|
|
134
138
|
string = String.try_convert(string)
|
135
139
|
raise ArgumentError, 'ULID.scan takes only strings' unless string
|
136
140
|
return to_enum(__callee__, string) unless block_given?
|
141
|
+
|
137
142
|
string.scan(SCANNING_PATTERN) do |matched|
|
138
143
|
yield parse(matched)
|
139
144
|
end
|
@@ -156,7 +161,7 @@ class ULID
|
|
156
161
|
milliseconds = n32encoded_timestamp.to_i(32)
|
157
162
|
entropy = n32encoded_randomness.to_i(32)
|
158
163
|
|
159
|
-
new
|
164
|
+
new(milliseconds: milliseconds, entropy: entropy, integer: integer)
|
160
165
|
end
|
161
166
|
|
162
167
|
# @param [Range<Time>, Range<nil>, Range[ULID]] period
|
@@ -164,6 +169,7 @@ class ULID
|
|
164
169
|
# @raise [ArgumentError] if the given period is not a `Range[Time]`, `Range[nil]` or `Range[ULID]`
|
165
170
|
def self.range(period)
|
166
171
|
raise ArgumentError, 'ULID.range takes only `Range[Time]`, `Range[nil]` or `Range[ULID]`' unless Range === period
|
172
|
+
|
167
173
|
begin_element, end_element, exclude_end = period.begin, period.end, period.exclude_end?
|
168
174
|
return period if self === begin_element && self === end_element
|
169
175
|
|
@@ -180,11 +186,7 @@ class ULID
|
|
180
186
|
|
181
187
|
case end_element
|
182
188
|
when Time
|
183
|
-
|
184
|
-
end_ulid = min(end_element)
|
185
|
-
else
|
186
|
-
end_ulid = max(end_element)
|
187
|
-
end
|
189
|
+
end_ulid = exclude_end ? min(end_element) : max(end_element)
|
188
190
|
when nil
|
189
191
|
# The end should be max and include end, because nil end means to cover endless ULIDs until the limit
|
190
192
|
end_ulid = MAX
|
@@ -335,7 +337,7 @@ class ULID
|
|
335
337
|
n32encoded_randomness = entropy.to_s(32).rjust(RANDOMNESS_ENCODED_LENGTH, '0')
|
336
338
|
integer = (n32encoded_timestamp + n32encoded_randomness).to_i(32)
|
337
339
|
|
338
|
-
new
|
340
|
+
new(milliseconds: milliseconds, entropy: entropy, integer: integer)
|
339
341
|
end
|
340
342
|
|
341
343
|
attr_reader :milliseconds, :entropy
|
@@ -406,7 +408,7 @@ class ULID
|
|
406
408
|
def octets
|
407
409
|
digits = @integer.digits(256)
|
408
410
|
(OCTETS_LENGTH - digits.size).times do
|
409
|
-
digits.push
|
411
|
+
digits.push(0)
|
410
412
|
end
|
411
413
|
digits.reverse!
|
412
414
|
end
|
@@ -477,6 +479,20 @@ class ULID
|
|
477
479
|
super
|
478
480
|
end
|
479
481
|
|
482
|
+
# @api private
|
483
|
+
# @return [Integer]
|
484
|
+
def marshal_dump
|
485
|
+
@integer
|
486
|
+
end
|
487
|
+
|
488
|
+
# @api private
|
489
|
+
# @param [Integer] integer
|
490
|
+
# @return [void]
|
491
|
+
def marshal_load(integer)
|
492
|
+
unmarshaled = ULID.from_integer(integer)
|
493
|
+
initialize(integer: unmarshaled.to_i, milliseconds: unmarshaled.milliseconds, entropy: unmarshaled.entropy)
|
494
|
+
end
|
495
|
+
|
480
496
|
# @return [self]
|
481
497
|
def to_ulid
|
482
498
|
self
|
@@ -1,9 +1,12 @@
|
|
1
1
|
# coding: us-ascii
|
2
2
|
# frozen_string_literal: true
|
3
|
+
|
3
4
|
# Copyright (C) 2021 Kenichi Kamiya
|
4
5
|
|
5
6
|
class ULID
|
6
|
-
#
|
7
|
+
# @see https://www.crockford.com/base32.html
|
8
|
+
#
|
9
|
+
# This module supporting only `subset of original crockford for actual use-case` in ULID context.
|
7
10
|
# Original decoding spec allows other characters.
|
8
11
|
# But I think ULID should allow `subset` of Crockford's Base32.
|
9
12
|
# See below
|
@@ -46,18 +49,22 @@ class ULID
|
|
46
49
|
end
|
47
50
|
end.freeze
|
48
51
|
raise SetupError, 'obvious bug exists in the mapping algorithm' unless N32_CHAR_BY_CROCKFORD_BASE32_CHAR.keys == crockford_base32_mappings.keys
|
52
|
+
|
49
53
|
CROCKFORD_BASE32_CHAR_PATTERN = /[#{N32_CHAR_BY_CROCKFORD_BASE32_CHAR.keys.join}]/.freeze
|
50
54
|
|
51
55
|
CROCKFORD_BASE32_CHAR_BY_N32_CHAR = N32_CHAR_BY_CROCKFORD_BASE32_CHAR.invert.freeze
|
52
56
|
N32_CHAR_PATTERN = /[#{CROCKFORD_BASE32_CHAR_BY_N32_CHAR.keys.join}]/.freeze
|
53
57
|
|
54
|
-
|
58
|
+
STANDARD_BY_VARIANT = {
|
55
59
|
'L' => '1',
|
60
|
+
'l' => '1',
|
56
61
|
'I' => '1',
|
62
|
+
'i' => '1',
|
57
63
|
'O' => '0',
|
64
|
+
'o' => '0',
|
58
65
|
'-' => ''
|
59
66
|
}.freeze
|
60
|
-
VARIANT_PATTERN = /[#{
|
67
|
+
VARIANT_PATTERN = /[#{STANDARD_BY_VARIANT.keys.join}]/.freeze
|
61
68
|
|
62
69
|
# @api private
|
63
70
|
# @param [String] string
|
@@ -79,7 +86,7 @@ class ULID
|
|
79
86
|
# @param [String] string
|
80
87
|
# @return [String]
|
81
88
|
def self.normalize(string)
|
82
|
-
string.
|
89
|
+
string.gsub(VARIANT_PATTERN, STANDARD_BY_VARIANT)
|
83
90
|
end
|
84
91
|
end
|
85
92
|
end
|
@@ -1,5 +1,6 @@
|
|
1
1
|
# coding: us-ascii
|
2
2
|
# frozen_string_literal: true
|
3
|
+
|
3
4
|
# Copyright (C) 2021 Kenichi Kamiya
|
4
5
|
|
5
6
|
class ULID
|
@@ -36,19 +37,23 @@ class ULID
|
|
36
37
|
|
37
38
|
milliseconds = ULID.milliseconds_from_moment(moment)
|
38
39
|
|
39
|
-
ulid =
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
40
|
+
ulid = (
|
41
|
+
if @prev.milliseconds < milliseconds
|
42
|
+
ULID.generate(moment: milliseconds)
|
43
|
+
else
|
44
|
+
ULID.from_milliseconds_and_entropy(milliseconds: @prev.milliseconds, entropy: @prev.entropy.succ)
|
45
|
+
end
|
46
|
+
)
|
44
47
|
|
45
48
|
unless ulid > @prev
|
46
49
|
base_message = "monotonicity broken from unexpected reasons # generated: #{ulid.inspect}, prev: #{@prev.inspect}"
|
47
|
-
additional_information =
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
50
|
+
additional_information = (
|
51
|
+
if Thread.list == [Thread.main]
|
52
|
+
'# NOTE: looks single thread only exist'
|
53
|
+
else
|
54
|
+
'# NOTE: ran on multi threads, so this might from concurrency issue'
|
55
|
+
end
|
56
|
+
)
|
52
57
|
|
53
58
|
raise UnexpectedError, base_message + additional_information
|
54
59
|
end
|
data/lib/ulid/uuid.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
# coding: us-ascii
|
2
2
|
# frozen_string_literal: true
|
3
|
+
|
3
4
|
# Copyright (C) 2021 Kenichi Kamiya
|
4
5
|
|
5
6
|
# Extracted features around UUID from some reasons
|
@@ -8,7 +9,7 @@
|
|
8
9
|
# * https://github.com/kachick/ruby-ulid/issues/76
|
9
10
|
class ULID
|
10
11
|
# Imported from https://stackoverflow.com/a/38191104/1212807, thank you!
|
11
|
-
UUIDV4_PATTERN = /\A[0-9A-F]{8}-[0-9A-F]{4}-
|
12
|
+
UUIDV4_PATTERN = /\A[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}\z/i.freeze
|
12
13
|
private_constant :UUIDV4_PATTERN
|
13
14
|
|
14
15
|
# @param [String, #to_str] uuid
|
data/lib/ulid/version.rb
CHANGED
data/sig/ulid.rbs
CHANGED
@@ -43,7 +43,7 @@ class ULID < Object
|
|
43
43
|
CROCKFORD_BASE32_CHAR_PATTERN: Regexp
|
44
44
|
CROCKFORD_BASE32_CHAR_BY_N32_CHAR: Hash[String, String]
|
45
45
|
N32_CHAR_PATTERN: Regexp
|
46
|
-
|
46
|
+
STANDARD_BY_VARIANT: Hash[String, String]
|
47
47
|
VARIANT_PATTERN: Regexp
|
48
48
|
|
49
49
|
# A pribate API. Should not be used in your code.
|
@@ -143,7 +143,7 @@ class ULID < Object
|
|
143
143
|
#
|
144
144
|
# 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)
|
145
145
|
#
|
146
|
-
def self.generate: (?moment: moment, ?entropy: Integer) ->
|
146
|
+
def self.generate: (?moment: moment, ?entropy: Integer) -> ULID
|
147
147
|
|
148
148
|
# Shorthand of `ULID.generate(moment: Time)`
|
149
149
|
# See also [ULID.generate](https://kachick.github.io/ruby-ulid/ULID.html#generate-class_method)
|
@@ -157,7 +157,7 @@ class ULID < Object
|
|
157
157
|
# end
|
158
158
|
# ulids.sort == ulids #=> true
|
159
159
|
# ```
|
160
|
-
def self.at: (Time time) ->
|
160
|
+
def self.at: (Time time) -> ULID
|
161
161
|
|
162
162
|
# A pribate API. Should not be used in your code.
|
163
163
|
def self.current_milliseconds: -> Integer
|
@@ -212,7 +212,7 @@ class ULID < Object
|
|
212
212
|
# ulid = ULID.parse('01ARZ3NDEKTSV4RRFFQ69G5FAV')
|
213
213
|
# #=> ULID(2016-07-30 23:54:10.259 UTC: 01ARZ3NDEKTSV4RRFFQ69G5FAV)
|
214
214
|
# ```
|
215
|
-
def self.parse: (_ToStr string) ->
|
215
|
+
def self.parse: (_ToStr string) -> ULID
|
216
216
|
|
217
217
|
# ```ruby
|
218
218
|
# # Currently experimental feature, so needed to load the extension.
|
@@ -226,7 +226,7 @@ class ULID < Object
|
|
226
226
|
#
|
227
227
|
# See also [Why this is experimental?](https://github.com/kachick/ruby-ulid/issues/76)
|
228
228
|
def self.from_uuidv4: (String uuid) -> ULID
|
229
|
-
def self.from_integer: (Integer integer) ->
|
229
|
+
def self.from_integer: (Integer integer) -> ULID
|
230
230
|
|
231
231
|
# Returns termination values for ULID spec.
|
232
232
|
#
|
@@ -318,8 +318,8 @@ class ULID < Object
|
|
318
318
|
# # ULID(2021-04-28 16:49:06.484 UTC: 01F4CP4PDM214Q6H3KJP7DYJRR),
|
319
319
|
# # ULID(2021-04-28 15:05:06.808 UTC: 01F4CG68ZRST94T056KRZ5K9S4)]
|
320
320
|
# ```
|
321
|
-
def self.sample: (?period: period) ->
|
322
|
-
| (Integer number, ?period: period) -> Array[
|
321
|
+
def self.sample: (?period: period) -> ULID
|
322
|
+
| (Integer number, ?period: period) -> Array[ULID]
|
323
323
|
def self.valid?: (untyped) -> bool
|
324
324
|
|
325
325
|
# Returns normalized string
|
@@ -384,8 +384,8 @@ class ULID < Object
|
|
384
384
|
# # ULID(2021-04-30 05:53:12.478 UTC: 01F4GND4RYYSKNAADHQ9BNXAWJ)]
|
385
385
|
# ```
|
386
386
|
def self.scan: (_ToStr string) -> Enumerator[self, singleton(ULID)]
|
387
|
-
| (_ToStr string) { (
|
388
|
-
def self.from_milliseconds_and_entropy: (milliseconds: Integer, entropy: Integer) ->
|
387
|
+
| (_ToStr string) { (ULID ulid) -> void } -> singleton(ULID)
|
388
|
+
def self.from_milliseconds_and_entropy: (milliseconds: Integer, entropy: Integer) -> ULID
|
389
389
|
def self.try_convert: (_ToULID) -> ULID
|
390
390
|
| (untyped) -> nil
|
391
391
|
|
@@ -507,6 +507,12 @@ class ULID < Object
|
|
507
507
|
def pred: -> ULID?
|
508
508
|
def freeze: -> self
|
509
509
|
|
510
|
+
# A pribate API. Should not be used in your code.
|
511
|
+
def marshal_dump: -> Integer
|
512
|
+
|
513
|
+
# A pribate API. Should not be used in your code.
|
514
|
+
def marshal_load: (Integer integer) -> void
|
515
|
+
|
510
516
|
# Returns `self`
|
511
517
|
def to_ulid: -> self
|
512
518
|
|
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.1.
|
4
|
+
version: 0.1.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kenichi Kamiya
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-05-
|
11
|
+
date: 2021-05-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: test-unit
|
@@ -130,7 +130,7 @@ dependencies:
|
|
130
130
|
requirements:
|
131
131
|
- - ">="
|
132
132
|
- !ruby/object:Gem::Version
|
133
|
-
version: 2.
|
133
|
+
version: 2.9.1
|
134
134
|
- - "<"
|
135
135
|
- !ruby/object:Gem::Version
|
136
136
|
version: '3'
|
@@ -140,7 +140,7 @@ dependencies:
|
|
140
140
|
requirements:
|
141
141
|
- - ">="
|
142
142
|
- !ruby/object:Gem::Version
|
143
|
-
version: 2.
|
143
|
+
version: 2.9.1
|
144
144
|
- - "<"
|
145
145
|
- !ruby/object:Gem::Version
|
146
146
|
version: '3'
|
@@ -190,76 +190,100 @@ dependencies:
|
|
190
190
|
requirements:
|
191
191
|
- - ">="
|
192
192
|
- !ruby/object:Gem::Version
|
193
|
-
version: 1.
|
193
|
+
version: 1.15.0
|
194
194
|
- - "<"
|
195
195
|
- !ruby/object:Gem::Version
|
196
|
-
version: 1.
|
196
|
+
version: 1.16.0
|
197
197
|
type: :development
|
198
198
|
prerelease: false
|
199
199
|
version_requirements: !ruby/object:Gem::Requirement
|
200
200
|
requirements:
|
201
201
|
- - ">="
|
202
202
|
- !ruby/object:Gem::Version
|
203
|
-
version: 1.
|
203
|
+
version: 1.15.0
|
204
204
|
- - "<"
|
205
205
|
- !ruby/object:Gem::Version
|
206
|
-
version: 1.
|
206
|
+
version: 1.16.0
|
207
207
|
- !ruby/object:Gem::Dependency
|
208
208
|
name: rubocop-rake
|
209
209
|
requirement: !ruby/object:Gem::Requirement
|
210
210
|
requirements:
|
211
211
|
- - ">="
|
212
212
|
- !ruby/object:Gem::Version
|
213
|
-
version:
|
213
|
+
version: 0.5.1
|
214
|
+
- - "<"
|
215
|
+
- !ruby/object:Gem::Version
|
216
|
+
version: 0.6.0
|
214
217
|
type: :development
|
215
218
|
prerelease: false
|
216
219
|
version_requirements: !ruby/object:Gem::Requirement
|
217
220
|
requirements:
|
218
221
|
- - ">="
|
219
222
|
- !ruby/object:Gem::Version
|
220
|
-
version:
|
223
|
+
version: 0.5.1
|
224
|
+
- - "<"
|
225
|
+
- !ruby/object:Gem::Version
|
226
|
+
version: 0.6.0
|
221
227
|
- !ruby/object:Gem::Dependency
|
222
228
|
name: rubocop-performance
|
223
229
|
requirement: !ruby/object:Gem::Requirement
|
224
230
|
requirements:
|
225
231
|
- - ">="
|
226
232
|
- !ruby/object:Gem::Version
|
227
|
-
version:
|
233
|
+
version: 1.11.3
|
234
|
+
- - "<"
|
235
|
+
- !ruby/object:Gem::Version
|
236
|
+
version: 1.12.0
|
228
237
|
type: :development
|
229
238
|
prerelease: false
|
230
239
|
version_requirements: !ruby/object:Gem::Requirement
|
231
240
|
requirements:
|
232
241
|
- - ">="
|
233
242
|
- !ruby/object:Gem::Version
|
234
|
-
version:
|
243
|
+
version: 1.11.3
|
244
|
+
- - "<"
|
245
|
+
- !ruby/object:Gem::Version
|
246
|
+
version: 1.12.0
|
235
247
|
- !ruby/object:Gem::Dependency
|
236
248
|
name: rubocop-rubycw
|
237
249
|
requirement: !ruby/object:Gem::Requirement
|
238
250
|
requirements:
|
239
251
|
- - ">="
|
240
252
|
- !ruby/object:Gem::Version
|
241
|
-
version:
|
253
|
+
version: 0.1.6
|
254
|
+
- - "<"
|
255
|
+
- !ruby/object:Gem::Version
|
256
|
+
version: 0.2.0
|
242
257
|
type: :development
|
243
258
|
prerelease: false
|
244
259
|
version_requirements: !ruby/object:Gem::Requirement
|
245
260
|
requirements:
|
246
261
|
- - ">="
|
247
262
|
- !ruby/object:Gem::Version
|
248
|
-
version:
|
263
|
+
version: 0.1.6
|
264
|
+
- - "<"
|
265
|
+
- !ruby/object:Gem::Version
|
266
|
+
version: 0.2.0
|
249
267
|
- !ruby/object:Gem::Dependency
|
250
268
|
name: rubocop-md
|
251
269
|
requirement: !ruby/object:Gem::Requirement
|
252
270
|
requirements:
|
253
271
|
- - ">="
|
254
272
|
- !ruby/object:Gem::Version
|
255
|
-
version:
|
273
|
+
version: 1.0.1
|
274
|
+
- - "<"
|
275
|
+
- !ruby/object:Gem::Version
|
276
|
+
version: 2.0.0
|
256
277
|
type: :development
|
257
278
|
prerelease: false
|
258
279
|
version_requirements: !ruby/object:Gem::Requirement
|
259
280
|
requirements:
|
260
281
|
- - ">="
|
261
282
|
- !ruby/object:Gem::Version
|
262
|
-
version:
|
283
|
+
version: 1.0.1
|
284
|
+
- - "<"
|
285
|
+
- !ruby/object:Gem::Version
|
286
|
+
version: 2.0.0
|
263
287
|
description: |2
|
264
288
|
The ULID(Universally Unique Lexicographically Sortable Identifier) has useful specs for applications (e.g. `Database key`), especially possess all `uniqueness`, `randomness`, `extractable timestamps` and `sortable` features.
|
265
289
|
This gem aims to provide the generator, monotonic generator, parser and handy manipulation features around the ULID.
|
@@ -270,7 +294,7 @@ executables: []
|
|
270
294
|
extensions: []
|
271
295
|
extra_rdoc_files: []
|
272
296
|
files:
|
273
|
-
- LICENSE
|
297
|
+
- LICENSE.txt
|
274
298
|
- README.md
|
275
299
|
- lib/ulid.rb
|
276
300
|
- lib/ulid/crockford_base32.rb
|
@@ -285,6 +309,7 @@ metadata:
|
|
285
309
|
documentation_uri: https://kachick.github.io/ruby-ulid/
|
286
310
|
homepage_uri: https://github.com/kachick/ruby-ulid
|
287
311
|
source_code_uri: https://github.com/kachick/ruby-ulid
|
312
|
+
bug_tracker_uri: https://github.com/kachick/ruby-ulid/issues
|
288
313
|
post_install_message:
|
289
314
|
rdoc_options: []
|
290
315
|
require_paths:
|
@@ -303,5 +328,5 @@ requirements: []
|
|
303
328
|
rubygems_version: 3.2.15
|
304
329
|
signing_key:
|
305
330
|
specification_version: 4
|
306
|
-
summary:
|
331
|
+
summary: Useful ULID library
|
307
332
|
test_files: []
|