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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ce2bb6c517e9fee4f758577e57d2c5eddfd16db9ee3c0d17ad41db8d9f1de383
4
- data.tar.gz: 1cfb027a652e2035445483bdff2511c2837441e2e664286d60682fec6769cd17
3
+ metadata.gz: 91f6d4c9dad8e12663686099c487dbbf3ec5b7995e0e4b2b210ac8a16fbcd91c
4
+ data.tar.gz: 1ca6e29d83771636b2a20aa71d90f15699d07d6a7a75f22c306094507bb51d89
5
5
  SHA512:
6
- metadata.gz: ea00703256bc218a1e022dd732da22b37b9caeec30bdbdb4df945f9f185d408f0b746c36b36377dba2d4acaae5d2cf0b4db8b574ecc9da0e6e4b9b0af5c2404f
7
- data.tar.gz: 6cd088ae1d539d8cb1d2690eb4248be413e527a87db7eb67b3c1adfc167c285cf2b90bb5701e82208586996649d56d1ef6c7c30396d1fbf0fc68220487711a54
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
- Formal name is `Universally Unique Lexicographically Sortable Identifier`.
7
- It has useful specs for actual applications.
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
- ULID is sortable when they are generated different timestamp in milliseconds precision
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
- Providing monotonic generator for same milliseconds use-cases. It is called as [Monotonicity](https://github.com/ulid/spec/tree/d0c7170df4517939e70129b4d6462cc162f2d5bf#monotonicity) on the spec.
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 number will be changed by every creation)
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).size #=> 34 (the number will be changed by every creation)
92
- monotonic_ulids.sort == monotonic_ulids #=> true
93
- ```
94
-
95
- Providing converter for UUIDv4. (Of course the timestamp will be useless one.)
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
- ```ruby
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
- ## Development
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
- # On IRB, you can check behaviors even if it is undocumented
174
- ulid = ULID.generate #=> ULID(2021-04-27 17:27:22.826 UTC: 01F4A5Y1YAQCYAYCTC7GRMJ9AA)
175
- ls ULID
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
- If you try to add/change/fix features, please update tests and ensure they are not broken.
191
+ `ULID#pred` returns predecessor ULID
179
192
 
180
- ```console
181
- $ bundle exec rake test
182
- $ echo $?
183
- 0
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
- If you try to improve any performance issue, please add benchmarking and check the result of before and after.
199
+ UUIDv4 converter for migration use-cases. (Of course the timestamp will be useless one. Sortable benefit is lost.)
187
200
 
188
- ```console
189
- $ bundle exec ruby benchmark/the_added_file.rb
190
- # Showing the results
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
- ## Documents
194
-
195
- - [API documents generated by YARD](https://kachick.github.io/ruby-ulid/)
196
-
197
- ## Author
206
+ ## References
198
207
 
199
- Kenichi Kamiya - [@kachick](https://github.com/kachick)
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
- # @raise [OverflowError] if the next entropy part is larger than the ULID limit
296
- # @return [ULID]
296
+ # @return [ULID, nil] when called on ULID as `7ZZZZZZZZZZZZZZZZZZZZZZZZZ`, returns `nil` instead of ULID
297
297
  def next
298
- @next ||= self.class.new(milliseconds: @milliseconds, entropy: @entropy + 1)
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
@@ -2,5 +2,5 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  class ULID
5
- VERSION = '0.0.10'
5
+ VERSION = '0.0.11'
6
6
  end
data/sig/ulid.rbs CHANGED
@@ -93,8 +93,9 @@ class ULID
93
93
  def octets: -> octets
94
94
  def timestamp_octets: -> timestamp_octets
95
95
  def randomness_octets: -> randomness_octets
96
- def next: -> ULID
96
+ def next: -> ULID?
97
97
  alias succ next
98
+ def pred: -> ULID?
98
99
  def freeze: -> self
99
100
 
100
101
  private
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.10
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: |2
74
- ULID(Universally Unique Lexicographically Sortable Identifier) is defined on https://github.com/ulid/spec.
75
- It has useful specs for actual applications.
76
- This gem aims to provide the generator, monotonic generator, parser and handy manipulation methods for the ID.
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: []