based_uuid 0.5.2 → 0.6.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 12b33dff554590869533e56e76997cf63cd436acd9bd0d95a86c574ea1419d63
4
- data.tar.gz: 2b98906ea6459f21d32c9ec0170cd443333a2529570f6cf8d9731d117792d529
3
+ metadata.gz: 5499342189f8b46811d3d620d6074dbd6620bc3cbc8882f39261b428a5fbcc41
4
+ data.tar.gz: 4ed71b83bf2f7271466256c5a215f217ba4c300665aeb895e6fa2da2b1308ea9
5
5
  SHA512:
6
- metadata.gz: 1592b674765c4230b53adac6071197d812cef83ea8237523e713db4e64dbc2c1d0e9f383d20c2f132bd3c64f702b4b0ad112977b44e87e8501c7c5d92febdce0
7
- data.tar.gz: a9b2f1c4d393c7c8c84b21b76f1d3b54c2df4582b237738dd9f6ecfc0339339ddf1333739d5b4ce399da01b8306411c870f4b1c9c7a6217de5777a46c9d76546
6
+ metadata.gz: edaf5ab4385cb65dff10739d12801b98c0085fb9d54d9841c480783c014ff47d2359b16acaf03b426a7a17049968f0bea1d54e0cc5063d4679105bb5813a9655
7
+ data.tar.gz: c81d9c3aa7c122516c846cb0470b45d2352f2db8bcc051a22c6da6d5d7f9a33892dab095f719677512cfd9d29d8f891f971c1d084f212cbe4283ea76425a87c5
data/.rubocop.yml CHANGED
@@ -23,3 +23,7 @@ Layout/LineLength:
23
23
 
24
24
  Naming/PredicateName:
25
25
  Enabled: false
26
+
27
+ # https://github.com/rubocop/rubocop/issues/7298
28
+ Lint/UselessAccessModifier:
29
+ Enabled: false
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # BasedUUID: double-clickable, URL-friendly UUIDs for your Rails models
1
+ # BasedUUID: URL-friendly UUIDs for Rails models
2
2
 
3
3
  [![Build Status](https://github.com/pch/based_uuid/workflows/Tests/badge.svg)](https://github.com/pch/based_uuid/actions) [![Gem Version](https://badge.fury.io/rb/based_uuid.svg)](https://badge.fury.io/rb/based_uuid)
4
4
 
@@ -6,13 +6,13 @@
6
6
  Generate “double-clickable”, URL-friendly UUIDs with (optional) prefixes:
7
7
 
8
8
  ```
9
- user_4yoiald3wfbvpeu2sbsk7cssdi
10
- acc_ejwqg7b3gvaphiylb25xq545tm
9
+ user_763j02ryxh8dbs56mgcjqrmmgt #=> e61c802c-7bb1-4357-929a-9064af8a521a
10
+ bpo_12dm1qresn83st62reqdw7f7cv #=> 226d037c-3b35-40f3-a30b-0ebb78779d9b
11
11
  ```
12
12
 
13
- This gem works by encoding UUIDs into 26-character lowercase strings using [Crockford’s base32](https://www.crockford.com/base32.html) encoding. The optional prefix helps you identify the model it represents.
13
+ This gem encodes UUID primary keys into 26-character lowercase strings using [Crockford’s base32](https://www.crockford.com/base32.html) encoding. The optional prefix helps you identify the model it represents.
14
14
 
15
- BasedUUID doesn’t affect how your ActiveRecord primary key UUIDs are stored in the database. Prefix and base32 encoding are only used for presentation.
15
+ BasedUUID assumes that you have a [UUID primary key](https://guides.rubyonrails.org/v5.0/active_record_postgresql.html#uuid) (`id`) in your ActiveRecord model. It doesn’t affect how your primary key UUIDs are stored in the database. Prefixes and base32-encoded strings are only used for presentation.
16
16
 
17
17
  ## Installation
18
18
 
@@ -24,7 +24,7 @@ gem "based_uuid"
24
24
 
25
25
  ## Usage
26
26
 
27
- BasedUUID assumes that you have a [UUID primary key](https://guides.rubyonrails.org/v5.0/active_record_postgresql.html#uuid) in your ActiveRecord model.
27
+ Add the following line to your model class:
28
28
 
29
29
  ```ruby
30
30
  class BlogPost < ApplicationRecord
@@ -32,8 +32,8 @@ class BlogPost < ApplicationRecord
32
32
  end
33
33
 
34
34
  post = BlogPost.last
35
- post.based_uuid #=> bpo_3ah4veflijgy7de6bflk7k4ld4
36
- post.based_uuid(prefix: false) #=> 3ah4veflijgy7de6bflk7k4ld4
35
+ post.based_uuid #=> bpo_12dm1qresn83st62reqdw7f7cv
36
+ post.based_uuid(prefix: false) #=> 12dm1qresn83st62reqdw7f7cv
37
37
  ```
38
38
 
39
39
  ### Lookup
@@ -41,13 +41,13 @@ post.based_uuid(prefix: false) #=> 3ah4veflijgy7de6bflk7k4ld4
41
41
  BasedUUID includes a `find_by_based_uuid` model method to look up records:
42
42
 
43
43
  ```ruby
44
- BlogPost.find_by_based_uuid("bpo_3ah4veflijgy7de6bflk7k4ld4")
44
+ BlogPost.find_by_based_uuid("bpo_12dm1qresn83st62reqdw7f7cv")
45
45
 
46
46
  # or without the prefix:
47
- BlogPost.find_by_based_uuid("3ah4veflijgy7de6bflk7k4ld4")
47
+ BlogPost.find_by_based_uuid("12dm1qresn83st62reqdw7f7cv")
48
48
 
49
49
  # there’s also the bang version:
50
- BlogPost.find_by_based_uuid!("3ah4veflijgy7de6bflk7k4ld4")
50
+ BlogPost.find_by_based_uuid!("12dm1qresn83st62reqdw7f7cv")
51
51
  ```
52
52
 
53
53
  ### Generic lookup
@@ -55,17 +55,17 @@ BlogPost.find_by_based_uuid!("3ah4veflijgy7de6bflk7k4ld4")
55
55
  The gem provides a generic lookup method to help you find the correct model for the UUID, based on prefix:
56
56
 
57
57
  ```ruby
58
- BasedUUID.find("bpo_3ah4veflijgy7de6bflk7k4ld4")
58
+ BasedUUID.find("bpo_12dm1qresn83st62reqdw7f7cv")
59
59
  #=> #<BlogPost>
60
- BasedUUID.find("acc_ejwqg7b3gvaphiylb25xq545tm")
61
- #=> #<Account>
60
+ BasedUUID.find("user_763j02ryxh8dbs56mgcjqrmmgt")
61
+ #=> #<User>
62
62
  ```
63
63
 
64
64
  **⚠️ NOTE:** Rails lazy-loads models in the development environment, so this method won’t know about your models until you’ve referenced them at least once. If you’re using this method in a Rails console, you’ll need to run `BlogPost` (or any other model) before you can use it.
65
65
 
66
66
  ### BasedUUID as default URL identifiers
67
67
 
68
- BasedUUID aims to be unintrusive and it doesn’t affect how Rails URLs are generated, so if you want to use it as default URL param, add this to your model:
68
+ BasedUUID aims to be non-intrusive and it doesn’t affect how Rails URLs are generated, so if you want to use it as default URL param, add this to your model:
69
69
 
70
70
  ```ruby
71
71
  def to_param
@@ -73,6 +73,35 @@ def to_param
73
73
  end
74
74
  ```
75
75
 
76
+ ### Custom UUID column name
77
+
78
+ `BasedUUID` will respect the value of `Model.primary_key`, so it supports custom primary key names:
79
+
80
+ ```ruby
81
+ class Transaction < ApplicationRecord
82
+ self.primary_key = "txid"
83
+
84
+ has_based_uuid prefix: :tx
85
+ end
86
+ ```
87
+
88
+ If you want to use a different column, other than the primary key, you can pass it as an option to `has_based_uuid`:
89
+
90
+ ```ruby
91
+ class Session < ApplicationRecord
92
+ has_based_uuid prefix: :sid, uuid_column: :session_id
93
+ end
94
+ ```
95
+
96
+ ### Use outside ActiveRecord
97
+
98
+ BasedUUID can be used outside ActiveRecord, too. You can encode any UUID with it:
99
+
100
+ ```ruby
101
+ BasedUUID.encode(uuid: "226d037c-3b35-40f3-a30b-0ebb78779d9b", prefix: :bpo)
102
+ BasedUUID.decode("bpo_12dm1qresn83st62reqdw7f7cv")
103
+ ```
104
+
76
105
  * * *
77
106
 
78
107
  ## Development
@@ -89,4 +118,4 @@ Bug reports and pull requests are welcome on GitHub at https://github.com/pch/ba
89
118
 
90
119
  This gem is heavily inspired by [Stripe IDs](https://stripe.com/docs/api) and the [prefixed_ids](https://github.com/excid3/prefixed_ids/tree/master) gem by Chris Oliver.
91
120
 
92
- Parts of the base32 encoding code are borrowed from the [ulid gem](https://github.com/rafaelsales/ulid) by Rafael Sales.
121
+ Parts of the base32 encoding code are borrowed from the [ulid](https://github.com/rafaelsales/ulid) gem by Rafael Sales.
@@ -2,7 +2,6 @@ require "active_support/lazy_load_hooks"
2
2
  require "active_support/concern"
3
3
  require "active_support/core_ext/object/blank"
4
4
  require "active_support/core_ext/class/attribute"
5
- require "active_record"
6
5
 
7
6
  module BasedUUID
8
7
  module HasBasedUUID
@@ -10,13 +9,16 @@ module BasedUUID
10
9
 
11
10
  included do
12
11
  class_attribute :_based_uuid_prefix
12
+ class_attribute :_based_uuid_column
13
13
  end
14
14
 
15
15
  class_methods do
16
- def has_based_uuid(prefix: nil)
16
+ def has_based_uuid(prefix: nil, uuid_column: primary_key)
17
17
  include ModelExtensions
18
18
 
19
19
  self._based_uuid_prefix = prefix
20
+ self._based_uuid_column = uuid_column
21
+
20
22
  BasedUUID.register_model_prefix(prefix, self) if prefix
21
23
  end
22
24
  end
@@ -27,27 +29,34 @@ module BasedUUID
27
29
 
28
30
  class_methods do
29
31
  def find_by_based_uuid(token)
30
- prefix, uuid_base32 = BasedUUID.split(token)
31
- raise ArgumentError, "Invalid prefix" if prefix && prefix.to_sym != _based_uuid_prefix
32
-
33
- find_by(primary_key => Base32UUID.decode(uuid_base32))
32
+ decode_and_find_based_uuid(token:)
34
33
  end
35
34
 
36
35
  def find_by_based_uuid!(token)
37
- find_by_based_uuid(token) or raise ActiveRecord::RecordNotFound
36
+ decode_and_find_based_uuid(token:, raise_error: true)
37
+ end
38
+
39
+ private
40
+
41
+ def decode_and_find_based_uuid(token:, raise_error: false)
42
+ prefix, uuid_base32 = BasedUUID.split(token)
43
+ raise ArgumentError, "Invalid prefix" if prefix && prefix.to_sym != _based_uuid_prefix
44
+
45
+ method_name = raise_error ? :find_by! : :find_by
46
+ send(method_name, _based_uuid_column => Base32UUID.decode(uuid_base32))
38
47
  end
39
48
  end
40
49
 
41
50
  def based_uuid(prefix: true)
42
- raise ArgumentError, "UUID is empty" if _primary_key_value.blank?
51
+ raise ArgumentError, "UUID is empty" if _uuid_column_value.blank?
43
52
 
44
- BasedUUID.based_uuid(uuid: _primary_key_value, prefix: prefix ? self.class._based_uuid_prefix : nil)
53
+ BasedUUID.encode(uuid: _uuid_column_value, prefix: prefix ? self.class._based_uuid_prefix : nil)
45
54
  end
46
55
 
47
56
  private
48
57
 
49
- def _primary_key_value
50
- self[self.class.primary_key]
58
+ def _uuid_column_value
59
+ self[self.class._based_uuid_column]
51
60
  end
52
61
  end
53
62
  end
@@ -1,3 +1,3 @@
1
1
  module BasedUUID
2
- VERSION = "0.5.2".freeze
2
+ VERSION = "0.6.1".freeze
3
3
  end
data/lib/based_uuid.rb CHANGED
@@ -30,11 +30,16 @@ module BasedUUID
30
30
  [prefix.presence, uuid_base32]
31
31
  end
32
32
 
33
- def based_uuid(uuid:, prefix:)
33
+ def encode(uuid:, prefix:)
34
34
  uuid_base32 = Base32UUID.encode(uuid)
35
35
  return uuid_base32 unless prefix
36
36
 
37
37
  "#{prefix}#{delimiter}#{uuid_base32}"
38
38
  end
39
+
40
+ def decode(token)
41
+ _, uuid_base32 = split(token)
42
+ Base32UUID.decode(uuid_base32)
43
+ end
39
44
  end
40
45
  end
metadata CHANGED
@@ -1,29 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: based_uuid
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.2
4
+ version: 0.6.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Piotr Chmolowski
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-12-06 00:00:00.000000000 Z
11
+ date: 2023-12-07 00:00:00.000000000 Z
12
12
  dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: activerecord
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - ">="
18
- - !ruby/object:Gem::Version
19
- version: '7.0'
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - ">="
25
- - !ruby/object:Gem::Version
26
- version: '7.0'
27
13
  - !ruby/object:Gem::Dependency
28
14
  name: activesupport
29
15
  requirement: !ruby/object:Gem::Requirement