aegis_support 0.0.3 → 0.0.4

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: 8c24d3a8cb0e54f8593a3e16b3354602fea04602286271804dbf251dca661c0f
4
- data.tar.gz: d48a250d22d2cd520406069b764ed409bfb3399de0445e5582478f2d62e8ca70
3
+ metadata.gz: 3983471972c6f92a26bb79c686b0c040cc3f2bab58e1460a36c8ec227e4a1d98
4
+ data.tar.gz: c9726be24cd6ecaa35e6ce3876d42c3c2786e7711eb5141a1d0afae92295e3ac
5
5
  SHA512:
6
- metadata.gz: 7b274e4cc77fef9c30603af94b5c9c26d22a6b800ac2c6f97fc059b61a476b62079acb9bbe1d4da79850a304c5c0c9b7e3a15297c9db43a55cfc1fb22b65d514
7
- data.tar.gz: 35687085418c783aa5109adce4853d31bb8fe8d31206c571c932ae87621e3b5f8a76b7e0c32777c05ab90324f99ba14dae10ba802e1f391a479d68237bef63fb
6
+ metadata.gz: 9bfa5278a266c1926c381638068bd5e603ba9e92fcd14c613b6966747adfe6f90d32940627f71e648212ec7fa4ac62dff9afdcc84feae37d59911f29199c4221
7
+ data.tar.gz: 96f1c99ffaf2f0e5ac3abb0fbee5f2ad2eeb922e3b0ee3843dffb077a7a1de9aa4b01ab5dac08d4b25563da649b6c128a0892ab29cd846a5ac1238ca32bd8ca1
data/README.md CHANGED
@@ -4,33 +4,43 @@ Aegis Support is a collection of utility classes and library extensions that wer
4
4
  ## Usage
5
5
 
6
6
  ### AegisSupport::SecureNumber
7
- A module with `has_secure_number` method for generate unique numbers
7
+ A module with `has_secure_number` method for generate unique numbers
8
8
 
9
9
  ```ruby
10
- # Schema: Order(order_no:string)
10
+ # Database Schema:
11
+ #
12
+ # Order(
13
+ # order_no: string,
14
+ # order_no_with_prefix: string,
15
+ # order_no_with_suffix: string,
16
+ # order_no_with_specific_length: string
17
+ # )
11
18
  class Order < ActiveRecord::Base
12
19
  include AegisSupport::SecureNumber
13
20
 
14
- # replace `order_no` with what column your want
21
+ # replace above column with what your want
15
22
  has_secure_number :order_no
23
+ has_secure_number :order_no_with_prefix, prefix: "PN_"
24
+ has_secure_number :order_no_with_suffix, prefix: "_SN"
25
+ has_secure_number :order_no_with_specific_length, length: 16
16
26
  end
17
27
 
18
28
  order = Order.new
19
29
  order.save
20
30
 
21
31
  order.order_no # 15103771760966048900
32
+ order.order_no_with_prefix # PN_93550490115056646751
33
+ order.order_no_with_suffix # 26931151941756843999_SN
34
+ order.order_no_with_specific_length # 9124679044244949
22
35
  ```
23
36
 
24
- The generate algorithm is:
25
- ```ruby
26
- maximum_number = 99999_99999_99999_99999 # 20 characters long
27
- secure_number = SecureRandom.random_number(maximum_number).to_s.rjust(20, "0")
28
- ```
37
+ `SecureRandom.random_number` is used to generate the random numeric string. when the result's length is less than the
38
+ specific(default is 20), some leading zeros will be added to the number to make its width equal to the length. `prefix`
39
+ and `suffix` are not included in the calculation of length.
29
40
 
30
- Thus it will generate a random numeric string of 20 characters long, so collisions are highly unlikely.
31
- like the `has_secure_token` in ActiveRecord, it's still possible generate a race condition in the database
32
- in the same way that `validates_uniqueness_of` can. You're encouraged to add a unique index in the database
33
- to deal with this even more unlikely scenario
41
+ when the length is long enough, The collisions are highly unlikely. like the `has_secure_token` in ActiveRecord,
42
+ it's still possible generate a race condition in the database in the same way that `validates_uniqueness_of` can.
43
+ You're encouraged to add a unique index in the database to deal with this even more unlikely scenario
34
44
 
35
45
  ## Installation
36
46
  Add this line to your application's Gemfile:
@@ -1,21 +1,22 @@
1
-
2
1
  module AegisSupport
3
2
  module SecureNumber
4
3
  extend ActiveSupport::Concern
5
4
 
6
5
  module ClassMethods
7
- def has_secure_number(attribute)
6
+ DEFAULT_MAXIMUM_NUMBER_LENGTH = 20
7
+
8
+ def has_secure_number(attribute, **options)
8
9
  require "securerandom"
9
10
 
10
- define_method("regenerate_#{attribute}"){ update! attribute => self.class.generate_secure_number(attribute) }
11
- before_create{ self.send("#{attribute}=", self.class.generate_secure_number(attribute)) }
11
+ define_method("regenerate_#{attribute}") { update! attribute => self.class.generate_secure_number(attribute, **options) }
12
+ before_create { self.send("#{attribute}=", self.class.generate_secure_number(attribute, **options)) }
12
13
  end
13
14
 
14
- def generate_secure_number(attribute)
15
+ def generate_secure_number(attribute, **options)
16
+ options.symbolize_keys!
17
+
15
18
  10.times do |i|
16
- # generate random number of 20 characters long
17
- maximum_number = 99999_99999_99999_99999
18
- secure_number = SecureRandom.random_number(maximum_number).to_s.rjust(20, "0")
19
+ secure_number = options[:prefix].to_s + random_string(options[:length]) + options[:suffix].to_s
19
20
 
20
21
  if exists?(attribute => secure_number)
21
22
  raise "Couldn't generate a unique number in 10 attempts!" if i == 9
@@ -24,6 +25,17 @@ module AegisSupport
24
25
  end
25
26
  end
26
27
  end
28
+
29
+ private
30
+
31
+ def random_string(length)
32
+ length = length.present? ? Integer(length) : DEFAULT_MAXIMUM_NUMBER_LENGTH
33
+ maximum_number = ("9" * length).to_i
34
+
35
+ SecureRandom.random_number(maximum_number)
36
+ .to_s
37
+ .rjust(length, "0")
38
+ end
27
39
  end
28
40
  end
29
41
  end
@@ -1,3 +1,3 @@
1
1
  module AegisSupport
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.4"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: aegis_support
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - ian
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-04-12 00:00:00.000000000 Z
11
+ date: 2022-04-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails