aegis_support 0.0.1 → 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: c77e86a53ff5e0811169153c2d9d7657c1cc5725ffc5c50fbc887efd30fe97be
4
- data.tar.gz: bf6c63c92af362cbdb4ff8b8da154e4501665150669f316cb644b03ca9315fa0
3
+ metadata.gz: 3983471972c6f92a26bb79c686b0c040cc3f2bab58e1460a36c8ec227e4a1d98
4
+ data.tar.gz: c9726be24cd6ecaa35e6ce3876d42c3c2786e7711eb5141a1d0afae92295e3ac
5
5
  SHA512:
6
- metadata.gz: 3d565663fbe59685bec2616bbed2616a285cc225ffc2a82242364b41b5407f5f280d0a3f4dde5299c8c86463c064e4c807d7d2a277af2e52af2bb1f7bc4fa7e2
7
- data.tar.gz: bc4244243aff667b9de0841fb1b7bca66c676214622edb1f6c58d8066ead7abc62875d77a3c628751b28c1248fcc7e15f1e93402756654ee19c743de68cdac4e
6
+ metadata.gz: 9bfa5278a266c1926c381638068bd5e603ba9e92fcd14c613b6966747adfe6f90d32940627f71e648212ec7fa4ac62dff9afdcc84feae37d59911f29199c4221
7
+ data.tar.gz: 96f1c99ffaf2f0e5ac3abb0fbee5f2ad2eeb922e3b0ee3843dffb077a7a1de9aa4b01ab5dac08d4b25563da649b6c128a0892ab29cd846a5ac1238ca32bd8ca1
data/README.md CHANGED
@@ -1,8 +1,46 @@
1
- # Aeg*i*sSupport
2
- Short description and motivation.
1
+ # AegisSupport
2
+ Aegis Support is a collection of utility classes and library extensions that were found useful for the Rails framework
3
3
 
4
4
  ## Usage
5
- How to use my plugin.
5
+
6
+ ### AegisSupport::SecureNumber
7
+ A module with `has_secure_number` method for generate unique numbers
8
+
9
+ ```ruby
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
+ # )
18
+ class Order < ActiveRecord::Base
19
+ include AegisSupport::SecureNumber
20
+
21
+ # replace above column with what your want
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
26
+ end
27
+
28
+ order = Order.new
29
+ order.save
30
+
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
35
+ ```
36
+
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.
40
+
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
6
44
 
7
45
  ## Installation
8
46
  Add this line to your application's Gemfile:
@@ -0,0 +1,41 @@
1
+ module AegisSupport
2
+ module SecureNumber
3
+ extend ActiveSupport::Concern
4
+
5
+ module ClassMethods
6
+ DEFAULT_MAXIMUM_NUMBER_LENGTH = 20
7
+
8
+ def has_secure_number(attribute, **options)
9
+ require "securerandom"
10
+
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)) }
13
+ end
14
+
15
+ def generate_secure_number(attribute, **options)
16
+ options.symbolize_keys!
17
+
18
+ 10.times do |i|
19
+ secure_number = options[:prefix].to_s + random_string(options[:length]) + options[:suffix].to_s
20
+
21
+ if exists?(attribute => secure_number)
22
+ raise "Couldn't generate a unique number in 10 attempts!" if i == 9
23
+ else
24
+ break secure_number
25
+ end
26
+ end
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
39
+ end
40
+ end
41
+ end
@@ -1,3 +1,3 @@
1
1
  module AegisSupport
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.4"
3
3
  end
data/lib/aegis_support.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  require "aegis_support/version"
2
2
  require "aegis_support/railtie"
3
+ require "aegis_support/secure_number"
3
4
 
4
5
  module AegisSupport
5
6
  # Your code goes here...
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.1
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
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: 7.0.2.3
27
+ - !ruby/object:Gem::Dependency
28
+ name: mocha
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 1.13.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 1.13.0
27
41
  description: A helpful collection of utitility for rails application
28
42
  email:
29
43
  - ianlynxk@gmail.com
@@ -36,6 +50,7 @@ files:
36
50
  - Rakefile
37
51
  - lib/aegis_support.rb
38
52
  - lib/aegis_support/railtie.rb
53
+ - lib/aegis_support/secure_number.rb
39
54
  - lib/aegis_support/version.rb
40
55
  - lib/tasks/aegis_support_tasks.rake
41
56
  homepage: https://github.com/otorain/aegis_support