cdigits 0.1.1 → 0.2.0
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 +4 -4
- data/.rubocop.yml +4 -0
- data/README.md +10 -10
- data/cdigits.gemspec +6 -1
- data/lib/cdigits/luhn/random_table.rb +85 -0
- data/lib/cdigits/luhn/store.rb +8 -6
- data/lib/cdigits/version.rb +1 -1
- metadata +7 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ee3bdcddd0d7d2725e9744ae11f557404e1555cbbc5487940ca45854efca3a76
|
4
|
+
data.tar.gz: 87ca68f822cc714e4e2f3b38ffc94c54adf073fb11146251e1e278c59b0bd9e1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6d4fe3e3584577f942346eafcab6de214045feff760cc507cefab7eab2f39c2a2e9dc91d8ece9602d47ec6519fa143c987d07002fa7dda3b4dd0af1369c3bad4
|
7
|
+
data.tar.gz: 5280b3e582ae3376378b8d6888defed0ed03d2dc35354c331614425d486561c752ddce6331b757d13fdd80e7a6a844970e278a53ce9fa11f0d7623348542f730
|
data/.rubocop.yml
CHANGED
@@ -8,6 +8,10 @@
|
|
8
8
|
# where the inspected file is and continue its way up to the root directory.
|
9
9
|
#
|
10
10
|
# See https://github.com/rubocop-hq/rubocop/blob/master/manual/configuration.md
|
11
|
+
AllCops:
|
12
|
+
Exclude:
|
13
|
+
- 'cdigits.gemspec'
|
14
|
+
- 'vendor/**/*'
|
11
15
|
Layout/LineLength:
|
12
16
|
Max: 120
|
13
17
|
Style/Documentation:
|
data/README.md
CHANGED
@@ -16,8 +16,8 @@ Also, you can generate code in any format using placeholder.
|
|
16
16
|
example:
|
17
17
|
|
18
18
|
```rb
|
19
|
-
Cdigits::Luhn.number 'CA##-####-####-###?' # => "
|
20
|
-
Cdigits::Luhn.number '2020-01##-####-###?' # => "2020-
|
19
|
+
Cdigits::Luhn.number 'CA##-####-####-###?' # => "CA63-6485-2316-2675"
|
20
|
+
Cdigits::Luhn.number '2020-01##-####-###?' # => "2020-0173-1935-2569"
|
21
21
|
```
|
22
22
|
|
23
23
|
## Installation
|
@@ -43,21 +43,21 @@ Or install it yourself as:
|
|
43
43
|
```rb
|
44
44
|
placeholder = 'CA##-####-####-###?'
|
45
45
|
Cdigits::Luhn.number
|
46
|
-
# => "
|
46
|
+
# => "1638302982"
|
47
47
|
Cdigits::Luhn.number placeholder
|
48
|
-
# => "
|
48
|
+
# => "CA16-5930-2060-1262"
|
49
49
|
Cdigits::Luhn.hex
|
50
|
-
# => "
|
50
|
+
# => "2b69307483"
|
51
51
|
Cdigits::Luhn.hex placeholder
|
52
|
-
# => "
|
52
|
+
# => "CA1e-fe6c-1c04-9a28"
|
53
53
|
Cdigits::Luhn.alphanumeric
|
54
|
-
# => "
|
54
|
+
# => "th5h7fewjl"
|
55
55
|
Cdigits::Luhn.alphanumeric placeholder
|
56
|
-
# => "
|
56
|
+
# => "CAwf-mfkx-ncsv-odl2"
|
57
57
|
Cdigits::Luhn.easy
|
58
|
-
# => "
|
58
|
+
# => "NWK036TN1R"
|
59
59
|
Cdigits::Luhn.easy placeholder
|
60
|
-
# => "
|
60
|
+
# => "CAPY-SHHN-U55U-9PG7"
|
61
61
|
```
|
62
62
|
|
63
63
|
#### Special chars in placeholder
|
data/cdigits.gemspec
CHANGED
@@ -9,7 +9,12 @@ Gem::Specification.new do |spec|
|
|
9
9
|
spec.email = ['kengo@kengos.jp']
|
10
10
|
|
11
11
|
spec.summary = 'Generate code with Luhn mod N algorithm using placeholder.'
|
12
|
-
spec.description =
|
12
|
+
spec.description = [
|
13
|
+
'Generate code with Luhn mod N algorithm using placeholder.',
|
14
|
+
'e.g)',
|
15
|
+
"Cdigits::Luhn.number('CA##-####-####-###?') #=> 'CA63-6485-2316-2675'",
|
16
|
+
"Cdigits::Luhn.easy #=> '16TPF8RETL'"
|
17
|
+
].join("\n")
|
13
18
|
spec.homepage = 'https://github.com/kengos/cdigits'
|
14
19
|
spec.license = 'MIT'
|
15
20
|
spec.required_ruby_version = Gem::Requirement.new('>= 2.3.0')
|
@@ -0,0 +1,85 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Cdigits
|
4
|
+
module Luhn
|
5
|
+
class RandomTable
|
6
|
+
attr_accessor :previsous
|
7
|
+
|
8
|
+
def initialize(modulus:)
|
9
|
+
@modulus = modulus
|
10
|
+
@previsous = nil
|
11
|
+
end
|
12
|
+
|
13
|
+
# pick from number table exclude 0
|
14
|
+
# @return [Integer]
|
15
|
+
def pick_non_zero
|
16
|
+
pick(exclude: [0])
|
17
|
+
end
|
18
|
+
|
19
|
+
# pick from number table
|
20
|
+
# @param exclude [Array<Intger>] exclude numbers
|
21
|
+
# @return [Integer]
|
22
|
+
def pick(exclude: [])
|
23
|
+
table(exclude).sample
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def numbers
|
29
|
+
@numbers ||= (0..max).to_a.freeze
|
30
|
+
end
|
31
|
+
|
32
|
+
def max
|
33
|
+
@modulus - 1
|
34
|
+
end
|
35
|
+
|
36
|
+
# @return [Array<Integer>]
|
37
|
+
def table(exclude)
|
38
|
+
exclude << next_numbers_to_avoid[@previsous]
|
39
|
+
table = numbers - exclude.compact
|
40
|
+
table.empty? ? numbers : table
|
41
|
+
end
|
42
|
+
|
43
|
+
def next_numbers_to_avoid
|
44
|
+
@next_numbers_to_avoid ||= build_next_numbers_to_avoid
|
45
|
+
end
|
46
|
+
|
47
|
+
def build_next_numbers_to_avoid
|
48
|
+
defaults = { 0 => max, max => 0 }
|
49
|
+
return defaults unless occure_twin_error?
|
50
|
+
|
51
|
+
defaults.merge(twin_error_values)
|
52
|
+
end
|
53
|
+
|
54
|
+
# @note
|
55
|
+
# modulus = 10
|
56
|
+
# twin | doubled value
|
57
|
+
# ---- | -------------
|
58
|
+
# 00 | 0
|
59
|
+
# 11 | 3
|
60
|
+
# 22 | 6
|
61
|
+
# 33 | 9
|
62
|
+
# 44 | 12
|
63
|
+
# 55 | 6
|
64
|
+
# 66 | 9
|
65
|
+
# 77 | 12
|
66
|
+
# 88 | 15
|
67
|
+
# 99 | 18
|
68
|
+
# @example
|
69
|
+
# # when @modulus = 10
|
70
|
+
# twin_error_values # => { 2 => 2, 3 => 3, 4 => 4, 5 => 5, 6 => 6, 7 => 7 }
|
71
|
+
# @return [Hash]
|
72
|
+
def twin_error_values
|
73
|
+
size = (max / 3).to_i
|
74
|
+
start = (@modulus / 2.0).ceil - size
|
75
|
+
stop = start + size * 2 - 1
|
76
|
+
values = (start..stop).to_a
|
77
|
+
values.zip(values).to_h
|
78
|
+
end
|
79
|
+
|
80
|
+
def occure_twin_error?
|
81
|
+
(max % 3).zero?
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
data/lib/cdigits/luhn/store.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require '
|
3
|
+
require 'cdigits/luhn/random_table'
|
4
4
|
|
5
5
|
module Cdigits
|
6
6
|
module Luhn
|
@@ -34,19 +34,21 @@ module Cdigits
|
|
34
34
|
# Append random non-zero number to digits array
|
35
35
|
# @return [Integer] appended value
|
36
36
|
def append_non_zero_number
|
37
|
-
append
|
37
|
+
append table.pick_non_zero
|
38
38
|
end
|
39
39
|
|
40
40
|
# Append random number to digits array
|
41
41
|
# @return [Integer] appended value
|
42
42
|
def append_number
|
43
|
-
append
|
43
|
+
append table.pick
|
44
44
|
end
|
45
45
|
|
46
46
|
# Append passed value to digits array
|
47
|
-
# @param [Integer]
|
47
|
+
# @param value [Integer]
|
48
|
+
# @param freeze [Boolean]
|
48
49
|
# @return [Integer] appended value
|
49
50
|
def append(value)
|
51
|
+
table.previsous = value
|
50
52
|
@digits << value
|
51
53
|
value
|
52
54
|
end
|
@@ -62,8 +64,8 @@ module Cdigits
|
|
62
64
|
|
63
65
|
private
|
64
66
|
|
65
|
-
def
|
66
|
-
::
|
67
|
+
def table
|
68
|
+
@table ||= ::Cdigits::Luhn::RandomTable.new(modulus: @modulus)
|
67
69
|
end
|
68
70
|
|
69
71
|
def calculate_check_digit(value, odd)
|
data/lib/cdigits/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cdigits
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- kengos
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-01-
|
11
|
+
date: 2020-01-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -67,8 +67,10 @@ dependencies:
|
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
69
|
description: |-
|
70
|
-
|
71
|
-
|
70
|
+
Generate code with Luhn mod N algorithm using placeholder.
|
71
|
+
e.g)
|
72
|
+
Cdigits::Luhn.number('CA##-####-####-###?') #=> 'CA63-6485-2316-2675'
|
73
|
+
Cdigits::Luhn.easy #=> '16TPF8RETL'
|
72
74
|
email:
|
73
75
|
- kengo@kengos.jp
|
74
76
|
executables: []
|
@@ -90,6 +92,7 @@ files:
|
|
90
92
|
- lib/cdigits.rb
|
91
93
|
- lib/cdigits/luhn.rb
|
92
94
|
- lib/cdigits/luhn/placeholder.rb
|
95
|
+
- lib/cdigits/luhn/random_table.rb
|
93
96
|
- lib/cdigits/luhn/store.rb
|
94
97
|
- lib/cdigits/version.rb
|
95
98
|
homepage: https://github.com/kengos/cdigits
|