encoded_id-rails 1.0.0.beta1 → 1.0.0.beta2

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: 6279bf9520a50983edc402bdc6a94fd4888c7c77f3c50484841535962ce50cc0
4
- data.tar.gz: 4fdbddfc863dbe9acd25c4ad51551aef70c0c4972a5d18d29a134a848d73e5e7
3
+ metadata.gz: 0a92cfd619fa254d0996950214c14aa115d6c62327e4ec2a6715dc9d7d898ebf
4
+ data.tar.gz: 27b448535392de1e1e21c37b82c324e4b5aecdc5225d4c7b2757a1ce8d5d18a9
5
5
  SHA512:
6
- metadata.gz: '0784b0541785da4f291f8a303674c72598622016693efb060adc3a8cd75fd68b1299b755e381777ecf45616e3217e05f9fe9eefccf53dce2d6fb3e118bd1313e'
7
- data.tar.gz: 01fba9fb0fb764cfac1953997da5637915b55badd90e586f01c60eda9ab4182d4a2fe9be531e420fbe95172442d4e2e12346c8422e06f26c86541a9000648ab2
6
+ metadata.gz: 1ad6f6555bbdb19650f16220dedc81c733f847931a6eea27e28e69c9050f6542d28b8295a6ef3395c95bfe5480c22cc7e1ea224dc687616634ad34da58a71ddf
7
+ data.tar.gz: 53d42d543a9c86fd2ab3842bad841e7aff95cdc57059bbade5529183df3fa3ee426525d1100174d22821644c5f3915b0bef4e4c252ea56d4c08352bc662aa00f
data/CHANGELOG.md CHANGED
@@ -1,6 +1,6 @@
1
1
  ## [Unreleased]
2
2
 
3
- ## [1.0.0.beta1] - 2023-08-07
3
+ ## [1.0.0] - (in beta)
4
4
 
5
5
  ### Breaking changes
6
6
 
data/README.md CHANGED
@@ -1,8 +1,29 @@
1
1
  # EncodedId::Rails (`encoded_id-rails`)
2
2
 
3
- [EncodedId](https://github.com/stevegeek/encoded_id) for Rails and `ActiveRecord` models.
3
+ `EncodedId::Rails` lets you turn numeric or hex **IDs into reversible and human friendly obfuscated strings**. The gem brings [EncodedId](https://github.com/stevegeek/encoded_id) to Rails and `ActiveRecord` models.
4
4
 
5
- EncodedID lets you turn numeric or hex IDs into reversible and human friendly obfuscated strings.
5
+ You can use it in routes for example, to go from something like `/users/725` to `/users/bob-smith--usr_p5w9-z27j` with miminal effort.
6
+
7
+ ## Features
8
+
9
+ Under the hood it uses hashIds, but it offers more features.
10
+
11
+ - 🔄 encoded IDs are reversible (see [`encoded_id`](https://github.com/stevegeek/encoded_id))
12
+ - 💅 supports slugged IDs (eg `my-cool-product-name--p5w9-z27j`) that are URL friendly (assuming your alphabet is too)
13
+ - 🔖 supports annotated IDs to help identify the model the encoded ID belongs to (eg for a `User` the encoded ID might be `user_p5w9-z27j`)
14
+ - 👓 encoded string can be split into groups of letters to improve human-readability (eg `abcd-efgh`)
15
+ - 👥 supports multiple IDs encoded in one encoded string (eg imagine the encoded ID `7aq60zqw` might decode to two IDs `[78, 45]`)
16
+ - 🔡 supports custom alphabets for the encoded string (at least 16 characters needed)
17
+ - by default uses a variation of the Crockford reduced character set (https://www.crockford.com/base32.html)
18
+ - easily confused characters (eg i and j, 0 and O, 1 and I etc) are mapped to counterpart characters, to
19
+ help avoid common readability mistakes when reading/sharing
20
+ - build in profanity limitation
21
+
22
+ The gem provides:
23
+
24
+ - methods to mixin to ActiveRecord models which will allow you to encode and decode IDs, and find
25
+ or query by encoded IDs
26
+ - sensible defaults to allow you to get started out of the box
6
27
 
7
28
  ```ruby
8
29
  class User < ApplicationRecord
@@ -34,43 +55,25 @@ user == User.find_by_encoded_id("bob-smith--usr_p5w9-z27j") # => true
34
55
  users = User.find_all_by_encoded_id("7aq60zqw") # => [#<User id: 78>, #<User id: 45>]
35
56
  ```
36
57
 
37
- # Features
38
-
39
- - encoded IDs are reversible (see [`encoded_id`](https://github.com/stevegeek/encoded_id))
40
- - supports slugged IDs (eg `my-cool-product-name--p5w9-z27j`) that are URL friendly (assuming your alphabet is too)
41
- - supports annotated IDs to help identify the model the encoded ID belongs to (eg for a `User` the encoded ID might be `user_p5w9-z27j`)
42
- - encoded string can be split into groups of letters to improve human-readability (eg `abcd-efgh`)
43
- - supports multiple IDs encoded in one encoded string (eg imagine the encoded ID `7aq60zqw` might decode to two IDs `[78, 45]`)
44
- - supports custom alphabets for the encoded string (at least 16 characters needed)
45
- - by default uses a variation of the Crockford reduced character set (https://www.crockford.com/base32.html)
46
- - easily confused characters (eg i and j, 0 and O, 1 and I etc) are mapped to counterpart characters, to
47
- help avoid common readability mistakes when reading/sharing
48
- - build in profanity limitation
49
-
50
- The gem provides:
51
-
52
- - methods to mixin to ActiveRecord models which will allow you to encode and decode IDs, and find
53
- or query by encoded IDs
54
- - sensible defaults to allow you to get started out of the box
55
-
56
- ### Coming in future (?)
57
-
58
- - support for UUIDs for IDs (which will be encoded as an array of integers)
59
-
60
- # Why this gem?
58
+ ## Why this gem?
61
59
 
62
60
  With this gem you can easily obfuscate your IDs in your URLs, and still be able to find records by using
63
61
  the encoded IDs. The encoded IDs are meant to be somewhat human friendly, to make communication easier
64
62
  when sharing encoded IDs with other people.
65
63
 
66
64
  * Hashids are reversible, no need to persist the generated Id
67
- * we don't override any AR methods. `encoded_id`s are intentionally not interchangeable with normal record `id`s
65
+ * we don't override any AR methods. `encoded_id`s are intentionally **not interchangeable** with normal record `id`s
68
66
  (ie you can't use `.find` to find by encoded ID or record ID, you must be explicit)
69
67
  * we support slugged IDs (eg `my-amazing-product--p5w9-z27j`)
70
68
  * we support multiple model IDs encoded in one `EncodedId` (eg `7aq6-0zqw` might decode to `[78, 45]`)
71
69
  * the gem is configurable
72
70
  * encoded IDs can be stable across environments, or not (you can set the salt to different values per environment)
73
71
 
72
+
73
+ ## Coming in future (?)
74
+
75
+ - support for UUIDs for IDs (which will be encoded as an array of integers)
76
+
74
77
  ## Installation
75
78
 
76
79
  Install the gem and add to the application's Gemfile by executing:
@@ -360,6 +363,34 @@ end
360
363
 
361
364
  However, I recommend you only use it on the models that need it.
362
365
 
366
+ ## Example usage for a route and controller
367
+
368
+ ```ruby
369
+ # Route
370
+ resources :users, param: :encoded_id, only: [:show]
371
+ ```
372
+
373
+ ```ruby
374
+ # Model
375
+ class User < ApplicationRecord
376
+ include EncodedId::Model
377
+ include EncodedId::PathParam
378
+ end
379
+ ```
380
+
381
+ ```ruby
382
+ # Controller
383
+ class UsersController < ApplicationController
384
+ def show
385
+ @user = User.find_by_encoded_id!(params[:encoded_id])
386
+ end
387
+ end
388
+ ```
389
+
390
+ ```erb
391
+ <%= link_to "User", user_path %>
392
+ ```
393
+
363
394
  ## Development
364
395
 
365
396
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
@@ -4,15 +4,9 @@ module EncodedId
4
4
  module Rails
5
5
  # Configuration class for initializer
6
6
  class Configuration
7
- attr_accessor :salt,
8
- :character_group_size,
9
- :group_separator,
10
- :alphabet,
11
- :id_length,
12
- :slug_value_method_name,
13
- :slugged_id_separator,
14
- :annotation_method_name, # Set to nil to disable annotated IDs
15
- :annotated_id_separator
7
+ attr_accessor :salt, :character_group_size, :alphabet, :id_length
8
+ attr_accessor :slug_value_method_name, :annotation_method_name
9
+ attr_reader :group_separator, :slugged_id_separator, :annotated_id_separator
16
10
 
17
11
  def initialize
18
12
  @character_group_size = 4
@@ -24,6 +18,33 @@ module EncodedId
24
18
  @annotation_method_name = :annotation_for_encoded_id
25
19
  @annotated_id_separator = "_"
26
20
  end
21
+
22
+ # Perform validation vs alphabet on these assignments
23
+
24
+ def group_separator=(value)
25
+ unless valid_separator?(value, alphabet)
26
+ raise ArgumentError, "Group separator characters must not be part of the alphabet"
27
+ end
28
+ @group_separator = value
29
+ end
30
+
31
+ def slugged_id_separator=(value)
32
+ if value.blank? || value == group_separator || !valid_separator?(value, alphabet)
33
+ raise ArgumentError, "Slugged ID separator characters must not be part of the alphabet or the same as the group separator"
34
+ end
35
+ @slugged_id_separator = value
36
+ end
37
+
38
+ def annotated_id_separator=(value)
39
+ if value.blank? || value == group_separator || !valid_separator?(value, alphabet)
40
+ raise ArgumentError, "Annotated ID separator characters must not be part of the alphabet or the same as the group separator"
41
+ end
42
+ @annotated_id_separator = value
43
+ end
44
+
45
+ def valid_separator?(separator, characters)
46
+ separator.chars.none? { |v| characters.include?(v) }
47
+ end
27
48
  end
28
49
  end
29
50
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module EncodedId
4
4
  module Rails
5
- VERSION = "1.0.0.beta1"
5
+ VERSION = "1.0.0.beta2"
6
6
  end
7
7
  end
@@ -41,4 +41,30 @@ EncodedId::Rails.configure do |config|
41
41
  # Default: 8
42
42
  #
43
43
  # config.id_length = 8
44
+
45
+ # The name of the method that returns the value to be used in the slug.
46
+ #
47
+ # Default: :name_for_encoded_id_slug
48
+ #
49
+ # config.slug_value_method_name = :name_for_encoded_id_slug
50
+
51
+ # The separator used between the slug and the encoded ID.
52
+ # `nil` disables grouping.
53
+ #
54
+ # Default: "--"
55
+ #
56
+ # config.slugged_id_separator = "--"
57
+
58
+ # The name of the method that returns the annotation to be used in the annotated ID.
59
+ #
60
+ # Default: :annotation_for_encoded_id
61
+ #
62
+ # config.annotation_method_name = :annotation_for_encoded_id
63
+
64
+ # The separator used between the annotation and the encoded ID.
65
+ # `nil` disables annotation.
66
+ #
67
+ # Default: "_"
68
+ #
69
+ # config.annotated_id_separator = "_"
44
70
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: encoded_id-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.beta1
4
+ version: 1.0.0.beta2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stephen Ierodiaconou
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-08-07 00:00:00.000000000 Z
11
+ date: 2023-10-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -56,14 +56,14 @@ dependencies:
56
56
  requirements:
57
57
  - - "~>"
58
58
  - !ruby/object:Gem::Version
59
- version: 1.0.0.rc1
59
+ version: 1.0.0.rc3
60
60
  type: :runtime
61
61
  prerelease: false
62
62
  version_requirements: !ruby/object:Gem::Requirement
63
63
  requirements:
64
64
  - - "~>"
65
65
  - !ruby/object:Gem::Version
66
- version: 1.0.0.rc1
66
+ version: 1.0.0.rc3
67
67
  description: ActiveRecord concern to use EncodedID to turn IDs into reversible and
68
68
  human friendly obfuscated strings.
69
69
  email:
@@ -123,7 +123,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
123
123
  - !ruby/object:Gem::Version
124
124
  version: 1.3.1
125
125
  requirements: []
126
- rubygems_version: 3.4.10
126
+ rubygems_version: 3.4.20
127
127
  signing_key:
128
128
  specification_version: 4
129
129
  summary: Use `encoded_id` with ActiveRecord models