sjekksum 0.0.2 → 0.0.3

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
  SHA1:
3
- metadata.gz: e6d1ff16d06db67ad288e906d6550e945c1550e4
4
- data.tar.gz: daf3d1554d22f668c7f61af87a86feb00f8e0c39
3
+ metadata.gz: ebf2decf9fa08a77d79569fc64a315cafdaf33b0
4
+ data.tar.gz: 32770f2b17ad7053f425b38a24a82ff28780ebc3
5
5
  SHA512:
6
- metadata.gz: f20e2ba3177709dd77cc43fd92b541f889b2fc192bbe9fdba0eae82492c7dac8c3f5f90fa34231efb865f0c675f68f607feef574708f8566ef5cde3b2126c721
7
- data.tar.gz: 5b13d80284d30c3afdb52161f2f90f5c532e4823bd5cfde53e51646f1be57a5b33561954c39fce7357957fa51fbc8b88c252d9b2a08b9bbc5da59e27e25d7ae9
6
+ metadata.gz: 7f4b7601494c7e8631b2203c81d9e4333212cfcd4f0d7861da62e78a8715bddef3ee255b904d7556de1c3acce5de87c9b64f851bfec5dd3917e61a6ebbe0a900
7
+ data.tar.gz: 41346fdd102f54ac079cc5e53bdff8bb8aed90feaa90be508eb9e8581e904e1111b53252a47381f0bcdd86d89bf2b6cb3176cbab7255da187e62d7cf73d484bd
data/README.md CHANGED
@@ -1,7 +1,18 @@
1
- # Sjekksum
1
+ # Sjekksum [![Gem Version](https://badge.fury.io/rb/sjekksum.png)](http://badge.fury.io/rb/sjekksum) [![Build Status](https://travis-ci.org/asaaki/sjekksum.png?branch=master)](https://travis-ci.org/asaaki/sjekksum)
2
2
 
3
3
  A gem to provide some checksum algorithms like Luhn, Damm and Verhoeff.
4
4
 
5
+ ----
6
+
7
+ All used algorithms for generating and validating checksums must calculate a single check digit only.
8
+
9
+ More extensive checksum algorithms like Adler-32, CRC, BSD checksum, SYSV checksum, all hash algorithms and friends are not part of this project.
10
+ Also no advanced algorithms like IBAN and credit card number calculation can be found here due to their nature in these cases more transformations and steps have to be taken.
11
+ Furthermore this gem does not allow any other input type than integers or strings of integer digits to simplify transformations here (so all extended algorithms allowing characters are not included as well).
12
+ For the string inputs all non-integer bytes are thrown away (e. g. `"01-234.567 89" => "0123456789" => [0,1,2,3,4,5,6,7,8,9]`).
13
+
14
+ Shortly: This gem tries to follow the [UNIX philosophy](http://en.wikipedia.org/wiki/Unix_philosophy) in parts: »Write programs that do one thing and do it well.«
15
+
5
16
 
6
17
 
7
18
  ## Installation
@@ -22,7 +33,33 @@ Or install it yourself as:
22
33
 
23
34
  ## Usage
24
35
 
25
- __(TODO)__
36
+ ```ruby
37
+ require "sjekksum"
38
+
39
+ Sjekksum.damm(572) #=> 4
40
+ Sjekksum.damm!(572) #=> 5724
41
+ Sjekksum.damm?(5724) #=> true
42
+
43
+ Sjekksum.luhn(7992739871) #=> 3
44
+ Sjekksum.luhn!(7992739871) #=> 79927398713
45
+ Sjekksum.luhn?(79927398713) #=> true
46
+
47
+ Sjekksum.upc("03600024145") #=> 7
48
+ Sjekksum.upc!("03600024145") #=> "036000241457"
49
+ Sjekksum.upc?("03600024145") #=> true
50
+
51
+ Sjekksum.verhoeff(142857) #=> 0
52
+ Sjekksum.verhoeff?(1428570) #=> true
53
+ Sjekksum.verhoeff!(142857) #=> 1428570
54
+
55
+ Sjekksum.primitive(232323) #=> 6
56
+ Sjekksum.primitive?(2323236) #=> true
57
+ Sjekksum.primitive!(232323) #=> 2323236
58
+
59
+ Sjekksum.primitive97(23569) #=> 0
60
+ Sjekksum.primitive97?(235695) #=> true
61
+ Sjekksum.primitive97!(23569) #=> 235695
62
+ ```
26
63
 
27
64
 
28
65
 
data/lib/sjekksum/damm.rb CHANGED
@@ -11,16 +11,16 @@ module Sjekksum
11
11
  # The totally anti-symmetric quasigroup
12
12
  # @see http://archiv.ub.uni-marburg.de/diss/z2004/0516/pdf/dhmd.pdf [PDF] Damm, H. Michael (2004). Total anti-symmetrische Quasigruppen (Dr. rer. nat.). Philipps-Universität Marburg.
13
13
  QUASIGROUP = [
14
- [0, 3, 1, 7, 5, 9, 8, 6, 4, 2],
15
- [7, 0, 9, 2, 1, 5, 4, 8, 6, 3],
16
- [4, 2, 0, 6, 8, 7, 1, 3, 5, 9],
17
- [1, 7, 5, 0, 9, 8, 3, 4, 2, 6],
18
- [6, 1, 2, 3, 0, 4, 5, 9, 7, 8],
19
- [3, 6, 7, 4, 2, 0, 9, 5, 8, 1],
20
- [5, 8, 6, 9, 7, 2, 0, 1, 3, 4],
21
- [8, 9, 4, 5, 3, 6, 2, 0, 1, 7],
22
- [9, 4, 3, 8, 6, 1, 7, 2, 0, 5],
23
- [2, 5, 8, 1, 4, 3, 6, 7, 9, 0]
14
+ [ 0, 3, 1, 7, 5, 9, 8, 6, 4, 2 ],
15
+ [ 7, 0, 9, 2, 1, 5, 4, 8, 6, 3 ],
16
+ [ 4, 2, 0, 6, 8, 7, 1, 3, 5, 9 ],
17
+ [ 1, 7, 5, 0, 9, 8, 3, 4, 2, 6 ],
18
+ [ 6, 1, 2, 3, 0, 4, 5, 9, 7, 8 ],
19
+ [ 3, 6, 7, 4, 2, 0, 9, 5, 8, 1 ],
20
+ [ 5, 8, 6, 9, 7, 2, 0, 1, 3, 4 ],
21
+ [ 8, 9, 4, 5, 3, 6, 2, 0, 1, 7 ],
22
+ [ 9, 4, 3, 8, 6, 1, 7, 2, 0, 5 ],
23
+ [ 2, 5, 8, 1, 4, 3, 6, 7, 9, 0 ]
24
24
  ].freeze
25
25
 
26
26
  #
@@ -29,13 +29,13 @@ module Sjekksum
29
29
  # @example
30
30
  # Sjekksum::Damm.of(572) #=> 4
31
31
  #
32
- # @param number [Integer] number for which the checksum should be calculated
32
+ # @param number [Integer, String] number for which the checksum should be calculated
33
33
  #
34
34
  # @return [Integer] calculated checksum
35
35
  def of number
36
36
  raise_on_type_mismatch number
37
- digits = number.to_s.chars.map(&:to_i)
38
- digits.reduce(0){|check, digit| QUASIGROUP[check][digit] }
37
+ digits = convert_number_to_digits(number)
38
+ digits.reduce(0){ |check, digit| QUASIGROUP[check][digit] }
39
39
  end
40
40
  alias_method :checksum, :of
41
41
 
@@ -45,7 +45,7 @@ module Sjekksum
45
45
  # @example
46
46
  # Sjekksum::Damm.valid?(5724) #=> true
47
47
  #
48
- # @param number [Integer] number with included checksum
48
+ # @param number [Integer, String] number with included checksum
49
49
  #
50
50
  # @return [Boolean]
51
51
  def valid? number
@@ -60,12 +60,12 @@ module Sjekksum
60
60
  # @example
61
61
  # Sjekksum::Damm.convert(572) #=> 5724
62
62
  #
63
- # @param number [Integer] number without a checksum
63
+ # @param number [Integer, String] number without a checksum
64
64
  #
65
- # @return [Integer] final number including the checksum
65
+ # @return [Integer, String] final number including the checksum
66
66
  def convert number
67
67
  raise_on_type_mismatch number
68
- (number * 10) + self.of(number)
68
+ typed_conversion number
69
69
  end
70
70
  alias_method :transform, :convert
71
71
 
data/lib/sjekksum/luhn.rb CHANGED
@@ -14,15 +14,15 @@ module Sjekksum
14
14
  # @example
15
15
  # Sjekksum::Luhn.of(7992739871) #=> 3
16
16
  #
17
- # @param number [Integer] number for which the checksum should be calculated
17
+ # @param number [Integer, String] number for which the checksum should be calculated
18
18
  #
19
19
  # @return [Integer] calculated checksum
20
20
  def of number
21
21
  raise_on_type_mismatch number
22
- digits = number.to_s.chars.map(&:to_i)
22
+ digits = convert_number_to_digits(number)
23
23
  sum = digits.reverse.map.with_index do |digit, idx|
24
24
  idx.even? ? (digit * 2).divmod(10).reduce(&:+) : digit
25
- end.reverse.reduce(&:+)
25
+ end.reduce(&:+)
26
26
 
27
27
  (10 - sum % 10) % 10
28
28
  end
@@ -34,12 +34,13 @@ module Sjekksum
34
34
  # @example
35
35
  # Sjekksum::Luhn.valid?(79927398713) #=> true
36
36
  #
37
- # @param number [Integer] number with included checksum
37
+ # @param number [Integer, String] number with included checksum
38
38
  #
39
39
  # @return [Boolean]
40
40
  def valid? number
41
41
  raise_on_type_mismatch number
42
- self.of(number.div(10)) == (number % 10)
42
+ num, check = split_number(number)
43
+ self.of(num) == check
43
44
  end
44
45
  alias_method :is_valid?, :valid?
45
46
 
@@ -49,12 +50,12 @@ module Sjekksum
49
50
  # @example
50
51
  # Sjekksum::Luhn.convert(7992739871) #=> 79927398713
51
52
  #
52
- # @param number [Integer] number without a checksum
53
+ # @param number [Integer, String] number without a checksum
53
54
  #
54
- # @return [Integer] final number including the checksum
55
+ # @return [Integer, String] final number including the checksum
55
56
  def convert number
56
57
  raise_on_type_mismatch number
57
- (number * 10) + self.of(number)
58
+ typed_conversion number
58
59
  end
59
60
  alias_method :transform, :convert
60
61
 
@@ -0,0 +1,58 @@
1
+ module Sjekksum
2
+ #
3
+ # Module for calculation and validation of Primitive checksums
4
+ #
5
+ # The primitive checksum is just a reduced digit sum (modulo 9).
6
+ #
7
+ module Primitive
8
+ extend self
9
+ extend Shared
10
+
11
+ #
12
+ # Calculates Primitive checksum
13
+ #
14
+ # @example
15
+ # Sjekksum::Primitive.of(232323) #=> 6
16
+ #
17
+ # @param number [Integer, String] number for which the checksum should be calculated
18
+ #
19
+ # @return [Integer] calculated checksum
20
+ def of number
21
+ raise_on_type_mismatch number
22
+ convert_to_int(number) % 9
23
+ end
24
+ alias_method :checksum, :of
25
+
26
+ #
27
+ # Primitive validation of provided number
28
+ #
29
+ # @example
30
+ # Sjekksum::Primitive.valid?(232323) #=> true
31
+ #
32
+ # @param number [Integer, String] number with included checksum
33
+ #
34
+ # @return [Boolean]
35
+ def valid? number
36
+ raise_on_type_mismatch number
37
+ num, check = split_number(number)
38
+ self.of(num) == check
39
+ end
40
+ alias_method :is_valid?, :valid?
41
+
42
+ #
43
+ # Transforms a number by appending the Primitive checksum digit
44
+ #
45
+ # @example
46
+ # Sjekksum::Primitive.convert(232323) #=> 2323236
47
+ #
48
+ # @param number [Integer, String] number without a checksum
49
+ #
50
+ # @return [Integer, String] final number including the checksum
51
+ def convert number
52
+ raise_on_type_mismatch number
53
+ typed_conversion number
54
+ end
55
+ alias_method :transform, :convert
56
+
57
+ end
58
+ end
@@ -0,0 +1,58 @@
1
+ module Sjekksum
2
+ #
3
+ # Module for calculation and validation of Primitive97 checksums
4
+ #
5
+ # This primitive checksum is based on the modulo 97 (calculation of check digits) and modulo 9 (reduction to a single digit).
6
+ #
7
+ module Primitive97
8
+ extend self
9
+ extend Shared
10
+
11
+ #
12
+ # Calculates Primitive97 checksum
13
+ #
14
+ # @example
15
+ # Sjekksum::Primitive97.of(23569) #=> 5
16
+ #
17
+ # @param number [Integer, String] number for which the checksum should be calculated
18
+ #
19
+ # @return [Integer] calculated checksum
20
+ def of number
21
+ raise_on_type_mismatch number
22
+ (convert_to_int(number) % 97) % 9
23
+ end
24
+ alias_method :checksum, :of
25
+
26
+ #
27
+ # Primitive97 validation of provided number
28
+ #
29
+ # @example
30
+ # Sjekksum::Primitive97.valid?(235695) #=> true
31
+ #
32
+ # @param number [Integer, String] number with included checksum
33
+ #
34
+ # @return [Boolean]
35
+ def valid? number
36
+ raise_on_type_mismatch number
37
+ num, check = split_number(number)
38
+ self.of(num) == check
39
+ end
40
+ alias_method :is_valid?, :valid?
41
+
42
+ #
43
+ # Transforms a number by appending the Primitive97 checksum digit
44
+ #
45
+ # @example
46
+ # Sjekksum::Primitive97.convert(23569) #=> 235695
47
+ #
48
+ # @param number [Integer, String] number without a checksum
49
+ #
50
+ # @return [Integer, String] final number including the checksum
51
+ def convert number
52
+ raise_on_type_mismatch number
53
+ typed_conversion number
54
+ end
55
+ alias_method :transform, :convert
56
+
57
+ end
58
+ end
@@ -10,7 +10,31 @@ module Sjekksum
10
10
  # Checks input type and raises if requirement is not met (currently the value has to be an integer)
11
11
  # @param number [Object]
12
12
  def raise_on_type_mismatch number
13
- raise ArgumentError unless number.is_a?(Integer)
13
+ raise ArgumentError unless number.is_a?(Integer) or number.is_a?(String)
14
+ end
15
+
16
+ def convert_number_to_digits number
17
+ number.to_s.scan(/\d/).map{ |b| b.chr.to_i }
18
+ end
19
+
20
+ def convert_to_int number
21
+ convert_number_to_digits(number).join.to_i
22
+ end
23
+
24
+ def split_number number
25
+ if number.is_a?(String)
26
+ [ number[0..-2], number[-1].to_i ]
27
+ else
28
+ number.divmod(10)
29
+ end
30
+ end
31
+
32
+ def typed_conversion number
33
+ if number.is_a?(String)
34
+ number << self.of(number).to_s
35
+ else
36
+ convert_to_int(number) * 10 + self.of(number)
37
+ end
14
38
  end
15
39
 
16
40
  end
@@ -0,0 +1,68 @@
1
+ module Sjekksum
2
+ #
3
+ # Module for calculation and validation of UPC (Universal Product Code) checksums
4
+ #
5
+ # @see http://en.wikipedia.org/wiki/Universal_Product_Code#Check_digits Universal Product Code
6
+ #
7
+ # It's like Luhn but multiplies by 3 instead of 2.
8
+ # Also it must allow validation of numbers with leading zeros.
9
+ #
10
+ module UPC
11
+ extend self
12
+ extend Shared
13
+
14
+ #
15
+ # Calculates UPC checksum
16
+ #
17
+ # @example
18
+ # Sjekksum::UPC.of("03600024145") #=> 7
19
+ #
20
+ # @param number [Integer, String] number for which the checksum should be calculated
21
+ #
22
+ # @return [Integer] calculated checksum
23
+ def of number
24
+ raise_on_type_mismatch number
25
+ digits = convert_number_to_digits(number)
26
+ sum = digits.map.with_index do |digit, idx|
27
+ idx.even? ? (digit * 3) : digit
28
+ end.reduce(&:+)
29
+
30
+ (10 - sum % 10) % 10
31
+ end
32
+ alias_method :checksum, :of
33
+
34
+ #
35
+ # UPC validation of provided number
36
+ #
37
+ # @example
38
+ # Sjekksum::UPC.valid?("036000241457") #=> true
39
+ #
40
+ # @param number [Integer, String] number with included checksum
41
+ #
42
+ # @return [Boolean]
43
+ def valid? number
44
+ raise_on_type_mismatch number
45
+ num, check = split_number(number)
46
+ self.of(num) == check
47
+ end
48
+ alias_method :is_valid?, :valid?
49
+
50
+ #
51
+ # Transforms a number by appending the UPC checksum digit
52
+ #
53
+ # It will preserve type (Integer/String) and therefore leading zeros.
54
+ #
55
+ # @example
56
+ # Sjekksum::UPC.convert("03600024145") #=> "036000241457"
57
+ #
58
+ # @param number [Integer, String] number without a checksum
59
+ #
60
+ # @return [Integer, String] final number including the checksum
61
+ def convert number
62
+ raise_on_type_mismatch number
63
+ typed_conversion number
64
+ end
65
+ alias_method :transform, :convert
66
+
67
+ end
68
+ end
@@ -43,12 +43,12 @@ module Sjekksum
43
43
  # @example
44
44
  # Sjekksum::Verhoeff.of(142857) #=> 0
45
45
  #
46
- # @param number [Integer] number for which the checksum should be calculated
46
+ # @param number [Integer, String] number for which the checksum should be calculated
47
47
  #
48
48
  # @return [Integer] calculated checksum
49
49
  def of number
50
50
  raise_on_type_mismatch number
51
- digits = number.to_s.chars.map(&:to_i)
51
+ digits = convert_number_to_digits(number)
52
52
  INVERSE[digits.reverse_each.with_index.reduce(0) { |check, (digit, idx)|
53
53
  d_row = DIHEDRAL_GROUP_D5[check]
54
54
  d_row[ PERMUTATION[idx.next % 8][digit] ]
@@ -62,12 +62,13 @@ module Sjekksum
62
62
  # @example
63
63
  # Sjekksum::Verhoeff.valid?(1428570) #=> true
64
64
  #
65
- # @param number [Integer] number with included checksum
65
+ # @param number [Integer, String] number with included checksum
66
66
  #
67
67
  # @return [Boolean]
68
68
  def valid? number
69
69
  raise_on_type_mismatch number
70
- self.of(number.div(10)) == (number % 10)
70
+ num, check = split_number(number)
71
+ self.of(num) == check
71
72
  end
72
73
  alias_method :is_valid?, :valid?
73
74
 
@@ -77,12 +78,12 @@ module Sjekksum
77
78
  # @example
78
79
  # Sjekksum::Verhoeff.convert(142857) #=> 1428570
79
80
  #
80
- # @param number [Integer] number without a checksum
81
+ # @param number [Integer, String] number without a checksum
81
82
  #
82
- # @return [Integer] final number including the checksum
83
+ # @return [Integer, String] final number including the checksum
83
84
  def convert number
84
85
  raise_on_type_mismatch number
85
- (number * 10) + self.of(number)
86
+ typed_conversion number
86
87
  end
87
88
  alias_method :transform, :convert
88
89
 
@@ -1,4 +1,4 @@
1
1
  module Sjekksum
2
2
  # Version constant
3
- VERSION = "0.0.2"
3
+ VERSION = "0.0.3"
4
4
  end
data/lib/sjekksum.rb CHANGED
@@ -2,7 +2,10 @@ require "sjekksum/version"
2
2
  require "sjekksum/shared"
3
3
  require "sjekksum/damm"
4
4
  require "sjekksum/luhn"
5
+ require "sjekksum/upc"
5
6
  require "sjekksum/verhoeff"
7
+ require "sjekksum/primitive"
8
+ require "sjekksum/primitive97"
6
9
 
7
10
  #
8
11
  # Base module with convenient shortcuts
@@ -18,7 +21,7 @@ module Sjekksum
18
21
  #
19
22
  # @see Sjekksum::Damm#of
20
23
  #
21
- # @param number [Integer] number for which the checksum should be calculated
24
+ # @param number [Integer, String] number for which the checksum should be calculated
22
25
  #
23
26
  # @return [Integer] calculated checksum
24
27
  def damm_of number
@@ -34,7 +37,7 @@ module Sjekksum
34
37
  #
35
38
  # @see Sjekksum::Luhn#of
36
39
  #
37
- # @param number [Integer] number for which the checksum should be calculated
40
+ # @param number [Integer, String] number for which the checksum should be calculated
38
41
  #
39
42
  # @return [Integer] calculated checksum
40
43
  def luhn_of number
@@ -42,6 +45,22 @@ module Sjekksum
42
45
  end
43
46
  alias_method :luhn, :luhn_of
44
47
 
48
+ #
49
+ # Calculates UPC checksum
50
+ #
51
+ # @example
52
+ # Sjekksum.upc("03600024145") #=> 7
53
+ #
54
+ # @see Sjekksum::UPC#of
55
+ #
56
+ # @param number [Integer, String] number for which the checksum should be calculated
57
+ #
58
+ # @return [Integer] calculated checksum
59
+ def upc_of number
60
+ UPC.of number
61
+ end
62
+ alias_method :upc, :upc_of
63
+
45
64
  #
46
65
  # Calculates Verhoeff checksum
47
66
  #
@@ -50,7 +69,7 @@ module Sjekksum
50
69
  #
51
70
  # @see Sjekksum::Verhoeff#of
52
71
  #
53
- # @param number [Integer] number for which the checksum should be calculated
72
+ # @param number [Integer, String] number for which the checksum should be calculated
54
73
  #
55
74
  # @return [Integer] calculated checksum
56
75
  def verhoeff_of number
@@ -58,6 +77,38 @@ module Sjekksum
58
77
  end
59
78
  alias_method :verhoeff, :verhoeff_of
60
79
 
80
+ #
81
+ # Calculates Primitive checksum
82
+ #
83
+ # @example
84
+ # Sjekksum.primitive(232323) #=> 6
85
+ #
86
+ # @see Sjekksum::Primitive#of
87
+ #
88
+ # @param number [Integer, String] number for which the checksum should be calculated
89
+ #
90
+ # @return [Integer] calculated checksum
91
+ def primitive_of number
92
+ Primitive.of number
93
+ end
94
+ alias_method :primitive, :primitive_of
95
+
96
+ #
97
+ # Calculates Primitive97 checksum
98
+ #
99
+ # @example
100
+ # Sjekksum.primitive97(232323) #=> 6
101
+ #
102
+ # @see Sjekksum::Primitive97#of
103
+ #
104
+ # @param number [Integer, String] number for which the checksum should be calculated
105
+ #
106
+ # @return [Integer] calculated checksum
107
+ def primitive97_of number
108
+ Primitive97.of number
109
+ end
110
+ alias_method :primitive97, :primitive97_of
111
+
61
112
  #
62
113
  # Damm validation of provided number
63
114
  #
@@ -66,7 +117,7 @@ module Sjekksum
66
117
  #
67
118
  # @see Sjekksum::Damm#valid?
68
119
  #
69
- # @param number [Integer] number with included checksum
120
+ # @param number [Integer, String] number with included checksum
70
121
  #
71
122
  # @return [Boolean]
72
123
  def valid_damm? number
@@ -82,7 +133,7 @@ module Sjekksum
82
133
  #
83
134
  # @see Sjekksum::Luhn#valid?
84
135
  #
85
- # @param number [Integer] number with included checksum
136
+ # @param number [Integer, String] number with included checksum
86
137
  #
87
138
  # @return [Boolean]
88
139
  def valid_luhn? number
@@ -90,6 +141,22 @@ module Sjekksum
90
141
  end
91
142
  alias_method :luhn?, :valid_luhn?
92
143
 
144
+ #
145
+ # UPC validation of provided number
146
+ #
147
+ # @example
148
+ # Sjekksum.upc?("036000241457") #=> true
149
+ #
150
+ # @see Sjekksum::UPC#valid?
151
+ #
152
+ # @param number [Integer, String] number with included checksum
153
+ #
154
+ # @return [Boolean]
155
+ def valid_upc? number
156
+ UPC.valid? number
157
+ end
158
+ alias_method :upc?, :valid_upc?
159
+
93
160
  #
94
161
  # Verhoeff validation of provided number
95
162
  #
@@ -98,7 +165,7 @@ module Sjekksum
98
165
  #
99
166
  # @see Sjekksum::Verhoeff#valid?
100
167
  #
101
- # @param number [Integer] number with included checksum
168
+ # @param number [Integer, String] number with included checksum
102
169
  #
103
170
  # @return [Boolean]
104
171
  def valid_verhoeff? number
@@ -106,6 +173,38 @@ module Sjekksum
106
173
  end
107
174
  alias_method :verhoeff?, :valid_verhoeff?
108
175
 
176
+ #
177
+ # Primitive validation of provided number
178
+ #
179
+ # @example
180
+ # Sjekksum.primitive?(2323236) #=> true
181
+ #
182
+ # @see Sjekksum::Primitive#valid?
183
+ #
184
+ # @param number [Integer, String] number with included checksum
185
+ #
186
+ # @return [Boolean]
187
+ def valid_primitive? number
188
+ Primitive.valid? number
189
+ end
190
+ alias_method :primitive?, :valid_primitive?
191
+
192
+ #
193
+ # Primitive97 validation of provided number
194
+ #
195
+ # @example
196
+ # Sjekksum.primitive97?(2323235) #=> true
197
+ #
198
+ # @see Sjekksum::Primitive97#valid?
199
+ #
200
+ # @param number [Integer, String] number with included checksum
201
+ #
202
+ # @return [Boolean]
203
+ def valid_primitive97? number
204
+ Primitive97.valid? number
205
+ end
206
+ alias_method :primitive97?, :valid_primitive97?
207
+
109
208
  #
110
209
  # Transforms a number by appending the Damm checksum digit
111
210
  #
@@ -114,9 +213,9 @@ module Sjekksum
114
213
  #
115
214
  # @see Sjekksum::Damm#convert
116
215
  #
117
- # @param number [Integer] number without a checksum
216
+ # @param number [Integer, String] number without a checksum
118
217
  #
119
- # @return [Integer] final number including the checksum
218
+ # @return [Integer, String] final number including the checksum
120
219
  def make_damm number
121
220
  Damm.convert number
122
221
  end
@@ -130,14 +229,30 @@ module Sjekksum
130
229
  #
131
230
  # @see Sjekksum::Luhn#convert
132
231
  #
133
- # @param number [Integer] number without a checksum
232
+ # @param number [Integer, String] number without a checksum
134
233
  #
135
- # @return [Integer] final number including the checksum
234
+ # @return [Integer, String] final number including the checksum
136
235
  def make_luhn number
137
236
  Luhn.convert number
138
237
  end
139
238
  alias_method :luhn!, :make_luhn
140
239
 
240
+ #
241
+ # Transforms a number by appending the UPC checksum digit
242
+ #
243
+ # @example
244
+ # Sjekksum.upc!("03600024145") #=> "03600024147"
245
+ #
246
+ # @see Sjekksum::UPC#convert
247
+ #
248
+ # @param number [Integer, String] number without a checksum
249
+ #
250
+ # @return [Integer, String] final number including the checksum
251
+ def make_upc number
252
+ UPC.convert number
253
+ end
254
+ alias_method :upc!, :make_upc
255
+
141
256
  #
142
257
  # Transforms a number by appending the Verhoeff checksum digit
143
258
  #
@@ -146,12 +261,44 @@ module Sjekksum
146
261
  #
147
262
  # @see Sjekksum::Verhoeff#convert
148
263
  #
149
- # @param number [Integer] number without a checksum
264
+ # @param number [Integer, String] number without a checksum
150
265
  #
151
- # @return [Integer] final number including the checksum
266
+ # @return [Integer, String] final number including the checksum
152
267
  def make_verhoeff number
153
268
  Verhoeff.convert number
154
269
  end
155
270
  alias_method :verhoeff!, :make_verhoeff
156
271
 
272
+ #
273
+ # Transforms a number by appending the Primitive checksum digit
274
+ #
275
+ # @example
276
+ # Sjekksum.primitive!(232323) #=> 2323236
277
+ #
278
+ # @see Sjekksum::Primitive#convert
279
+ #
280
+ # @param number [Integer, String] number without a checksum
281
+ #
282
+ # @return [Integer, String] final number including the checksum
283
+ def make_primitive number
284
+ Primitive.convert number
285
+ end
286
+ alias_method :primitive!, :make_primitive
287
+
288
+ #
289
+ # Transforms a number by appending the Primitive97 checksum digit
290
+ #
291
+ # @example
292
+ # Sjekksum.primitive97!(232323) #=> 2323235
293
+ #
294
+ # @see Sjekksum::Primitive97#convert
295
+ #
296
+ # @param number [Integer, String] number without a checksum
297
+ #
298
+ # @return [Integer, String] final number including the checksum
299
+ def make_primitive97 number
300
+ Primitive97.convert number
301
+ end
302
+ alias_method :primitive97!, :make_primitive97
303
+
157
304
  end
@@ -16,14 +16,14 @@ shared_examples "a checksum implementation:" do |success_spec_matrix, fail_spec_
16
16
 
17
17
  describe :valid? do
18
18
  success_spec_matrix.each do |spec_item|
19
- spec_value = spec_item[0] * 10 + spec_item[1]
19
+ spec_value = transform_spec_value(spec_item[0],spec_item[1])
20
20
  it "returns true for #{spec_value}" do
21
21
  expect(described_class.valid?(spec_value)).to be_true
22
22
  end
23
23
  end
24
24
 
25
25
  fail_spec_matrix.each do |spec_item|
26
- spec_value = spec_item[0] * 10 + spec_item[1]
26
+ spec_value = transform_spec_value(spec_item[0],spec_item[1])
27
27
  it "does not return true for #{spec_value}" do
28
28
  expect(described_class.valid?(spec_value)).to_not be_true
29
29
  end
@@ -32,14 +32,14 @@ shared_examples "a checksum implementation:" do |success_spec_matrix, fail_spec_
32
32
 
33
33
  describe :convert do
34
34
  success_spec_matrix.each do |spec_item|
35
- spec_value = spec_item[0] * 10 + spec_item[1]
35
+ spec_value = transform_spec_value(spec_item[0],spec_item[1])
36
36
  it "transforms #{spec_item[0]} to #{spec_value}" do
37
37
  expect(described_class.convert(spec_item[0])).to eq(spec_value)
38
38
  end
39
39
  end
40
40
 
41
41
  fail_spec_matrix.each do |spec_item|
42
- spec_value = spec_item[0] * 10 + spec_item[1]
42
+ spec_value = transform_spec_value(spec_item[0],spec_item[1])
43
43
  it "does not transform #{spec_item[0]} to #{spec_value}" do
44
44
  expect(described_class.convert(spec_item[0])).to_not eq(spec_value)
45
45
  end
@@ -47,7 +47,7 @@ shared_examples "a checksum implementation:" do |success_spec_matrix, fail_spec_
47
47
  end
48
48
 
49
49
  context "invalid input" do
50
- ["1234", 12.34, true, false, nil, {}, [], Proc.new{}, Class.new, Module.new].each do |invalid_input|
50
+ [12.34, true, false, nil, {}, [], Proc.new{}, Class.new, Module.new].each do |invalid_input|
51
51
  it "#of raises an ArgumentError for #{invalid_input.inspect} (type: #{invalid_input.class})" do
52
52
  expect{ described_class.of(invalid_input) }.to raise_error(ArgumentError)
53
53
  end
@@ -4,18 +4,22 @@ require "shared_implementation"
4
4
  describe Sjekksum::Damm do
5
5
 
6
6
  success_spec_matrix = [
7
- [ 1, 3 ],
8
- [ 20, 7 ],
9
- [ 300, 9 ],
10
- [ 4000, 7 ],
11
- [ 55555, 5 ],
12
- [ 424242, 0 ],
13
- [ 572, 4 ],
7
+ [ 1, 3 ],
8
+ [ 20, 7 ],
9
+ [ 300, 9 ],
10
+ [ 4000, 7 ],
11
+ [ 55555, 5 ],
12
+ [ 424242, 0 ],
13
+ [ 572, 4 ],
14
+ [ "572", 4 ],
15
+ [ "5.7-2", 4 ]
14
16
  ]
15
17
 
16
18
  fail_spec_matrix = [
17
- [ 1, 1 ],
18
- [ 572, 9 ]
19
+ [ 1, 1 ],
20
+ [ 572, 9 ],
21
+ [ "572", 9 ],
22
+ [ "5.7-2", 9 ]
19
23
  ]
20
24
 
21
25
  it_behaves_like "a checksum implementation:", success_spec_matrix, fail_spec_matrix
@@ -4,18 +4,22 @@ require "shared_implementation"
4
4
  describe Sjekksum::Luhn do
5
5
 
6
6
  success_spec_matrix = [
7
- [ 1, 8 ],
8
- [ 20, 8 ],
9
- [ 300, 4 ],
10
- [ 4000, 6 ],
11
- [ 55555, 7 ],
12
- [ 424242, 6 ],
13
- [ 7992739871, 3 ],
7
+ [ 1, 8 ],
8
+ [ 20, 8 ],
9
+ [ 300, 4 ],
10
+ [ 4000, 6 ],
11
+ [ 55555, 7 ],
12
+ [ 424242, 6 ],
13
+ [ 7992739871, 3 ],
14
+ [ "7992739871", 3 ],
15
+ [ "799.273-98 71", 3 ]
14
16
  ]
15
17
 
16
18
  fail_spec_matrix = [
17
- [ 1, 1 ],
18
- [ 7992739871, 9 ]
19
+ [ 1, 1 ],
20
+ [ 7992739871, 9 ],
21
+ [ "7992739871", 9 ],
22
+ [ "799.273-98 71", 9 ]
19
23
  ]
20
24
 
21
25
  it_behaves_like "a checksum implementation:", success_spec_matrix, fail_spec_matrix
@@ -0,0 +1,27 @@
1
+ require "spec_helper"
2
+ require "shared_implementation"
3
+
4
+ describe Sjekksum::Primitive97 do
5
+
6
+ success_spec_matrix = [
7
+ [ 1, 1 ],
8
+ [ 20, 2 ],
9
+ [ 300, 0 ],
10
+ [ 4000, 5 ],
11
+ [ 55555, 8 ],
12
+ [ 424242, 7 ],
13
+ [ 23569, 5 ],
14
+ [ "23569", 5 ],
15
+ [ "23.5-69", 5 ]
16
+ ]
17
+
18
+ fail_spec_matrix = [
19
+ [ 1, 7 ],
20
+ [ 23569, 9 ],
21
+ [ "23569", 9 ],
22
+ [ "23.5-69", 9 ]
23
+ ]
24
+
25
+ it_behaves_like "a checksum implementation:", success_spec_matrix, fail_spec_matrix
26
+
27
+ end
@@ -0,0 +1,27 @@
1
+ require "spec_helper"
2
+ require "shared_implementation"
3
+
4
+ describe Sjekksum::Primitive do
5
+
6
+ success_spec_matrix = [
7
+ [ 1, 1 ],
8
+ [ 20, 2 ],
9
+ [ 300, 3 ],
10
+ [ 4000, 4 ],
11
+ [ 55555, 7 ],
12
+ [ 424242, 0 ],
13
+ [ 232323, 6 ],
14
+ [ "232323", 6 ],
15
+ [ "23.23-23", 6 ]
16
+ ]
17
+
18
+ fail_spec_matrix = [
19
+ [ 1, 7 ],
20
+ [ 232323, 9 ],
21
+ [ "232323", 9 ],
22
+ [ "23.23-23", 9 ]
23
+ ]
24
+
25
+ it_behaves_like "a checksum implementation:", success_spec_matrix, fail_spec_matrix
26
+
27
+ end
@@ -0,0 +1,27 @@
1
+ require "spec_helper"
2
+ require "shared_implementation"
3
+
4
+ describe Sjekksum::UPC do
5
+
6
+ success_spec_matrix = [
7
+ [ 1, 7 ],
8
+ [ 20, 4 ],
9
+ [ 300, 1 ],
10
+ [ 4000, 8 ],
11
+ [ 55555, 5 ],
12
+ [ 424242, 8 ],
13
+ [ 3600024145, 3 ],
14
+ [ "03600024145", 7 ],
15
+ [ "036 000-241.45", 7 ]
16
+ ]
17
+
18
+ fail_spec_matrix = [
19
+ [ 1, 1 ],
20
+ [ 3600024145, 7 ],
21
+ [ "03600024145", 9 ],
22
+ [ "036 000-241.45", 9 ]
23
+ ]
24
+
25
+ it_behaves_like "a checksum implementation:", success_spec_matrix, fail_spec_matrix
26
+
27
+ end
@@ -4,18 +4,22 @@ require "shared_implementation"
4
4
  describe Sjekksum::Verhoeff do
5
5
 
6
6
  success_spec_matrix = [
7
- [ 1, 5 ],
8
- [ 20, 4 ],
9
- [ 300, 0 ],
10
- [ 4000, 1 ],
11
- [ 55555, 7 ],
12
- [ 424242, 3 ],
13
- [ 142857, 0 ]
7
+ [ 1, 5 ],
8
+ [ 20, 4 ],
9
+ [ 300, 0 ],
10
+ [ 4000, 1 ],
11
+ [ 55555, 7 ],
12
+ [ 424242, 3 ],
13
+ [ 142857, 0 ],
14
+ [ "142857", 0 ],
15
+ [ "14.28-57", 0 ]
14
16
  ]
15
17
 
16
18
  fail_spec_matrix = [
17
- [ 1, 1 ],
18
- [ 142857, 9 ]
19
+ [ 1, 1 ],
20
+ [ 142857, 9 ],
21
+ [ "142857", 9 ],
22
+ [ "14.28-57", 9 ]
19
23
  ]
20
24
 
21
25
  it_behaves_like "a checksum implementation:", success_spec_matrix, fail_spec_matrix
@@ -3,10 +3,13 @@ require "spec_helper"
3
3
  describe Sjekksum do
4
4
 
5
5
  spec_values = {
6
- input: 12345,
7
- damm: 9,
8
- luhn: 5,
9
- verhoeff: 1
6
+ input: 12345,
7
+ damm: 9,
8
+ luhn: 5,
9
+ upc: 7,
10
+ verhoeff: 1,
11
+ primitive: 6,
12
+ primitive97: 8
10
13
  }
11
14
 
12
15
  specify { expect(described_class).to be_a(Module) }
@@ -41,6 +44,21 @@ describe Sjekksum do
41
44
  expect(described_class.luhn!(spec_values[:input])).to eq(expected)
42
45
  end
43
46
 
47
+ it "#upc" do
48
+ expected = spec_values[:input] * 10 + spec_values[:upc]
49
+ expect(described_class.upc(spec_values[:input])).to eq(spec_values[:upc])
50
+ end
51
+
52
+ it "#upc?" do
53
+ value = spec_values[:input] * 10 + spec_values[:upc]
54
+ expect(described_class.upc?(value)).to be_true
55
+ end
56
+
57
+ it "#upc!" do
58
+ expected = spec_values[:input] * 10 + spec_values[:upc]
59
+ expect(described_class.upc!(spec_values[:input])).to eq(expected)
60
+ end
61
+
44
62
  it "#verhoeff" do
45
63
  expected = spec_values[:input] * 10 + spec_values[:verhoeff]
46
64
  expect(described_class.verhoeff(spec_values[:input])).to eq(spec_values[:verhoeff])
@@ -56,4 +74,34 @@ describe Sjekksum do
56
74
  expect(described_class.verhoeff!(spec_values[:input])).to eq(expected)
57
75
  end
58
76
 
77
+ it "#primitive" do
78
+ expected = spec_values[:input] * 10 + spec_values[:primitive]
79
+ expect(described_class.primitive(spec_values[:input])).to eq(spec_values[:primitive])
80
+ end
81
+
82
+ it "#primitive?" do
83
+ value = spec_values[:input] * 10 + spec_values[:primitive]
84
+ expect(described_class.primitive?(value)).to be_true
85
+ end
86
+
87
+ it "#primitive!" do
88
+ expected = spec_values[:input] * 10 + spec_values[:primitive]
89
+ expect(described_class.primitive!(spec_values[:input])).to eq(expected)
90
+ end
91
+
92
+ it "#primitive97" do
93
+ expected = spec_values[:input] * 10 + spec_values[:primitive97]
94
+ expect(described_class.primitive97(spec_values[:input])).to eq(spec_values[:primitive97])
95
+ end
96
+
97
+ it "#primitive97?" do
98
+ value = spec_values[:input] * 10 + spec_values[:primitive97]
99
+ expect(described_class.primitive97?(value)).to be_true
100
+ end
101
+
102
+ it "#primitive97!" do
103
+ expected = spec_values[:input] * 10 + spec_values[:primitive97]
104
+ expect(described_class.primitive97!(spec_values[:input])).to eq(expected)
105
+ end
106
+
59
107
  end
data/spec/spec_helper.rb CHANGED
@@ -1,6 +1,16 @@
1
1
  # coding: utf-8
2
2
  require "sjekksum"
3
3
 
4
+ module SjekksumRSpecHelpers
5
+ def transform_spec_value origin_value, check_digit
6
+ if origin_value.is_a?(String)
7
+ "#{origin_value}#{check_digit}"
8
+ else
9
+ origin_value * 10 + check_digit
10
+ end
11
+ end
12
+ end
13
+
4
14
  RSpec.configure do |config|
5
15
  config.expect_with :rspec do |c|
6
16
  c.syntax = :expect
@@ -8,4 +18,6 @@ RSpec.configure do |config|
8
18
  config.mock_with :rspec do |c|
9
19
  c.syntax = :expect
10
20
  end
21
+ config.include SjekksumRSpecHelpers
22
+ config.extend SjekksumRSpecHelpers
11
23
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sjekksum
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Christoph Grabo
@@ -111,13 +111,19 @@ files:
111
111
  - lib/sjekksum.rb
112
112
  - lib/sjekksum/damm.rb
113
113
  - lib/sjekksum/luhn.rb
114
+ - lib/sjekksum/primitive.rb
115
+ - lib/sjekksum/primitive97.rb
114
116
  - lib/sjekksum/shared.rb
117
+ - lib/sjekksum/upc.rb
115
118
  - lib/sjekksum/verhoeff.rb
116
119
  - lib/sjekksum/version.rb
117
120
  - sjekksum.gemspec
118
121
  - spec/shared_implementation.rb
119
122
  - spec/sjekksum/damm_spec.rb
120
123
  - spec/sjekksum/luhn_spec.rb
124
+ - spec/sjekksum/primitive97_spec.rb
125
+ - spec/sjekksum/primitive_spec.rb
126
+ - spec/sjekksum/upc_spec.rb
121
127
  - spec/sjekksum/verhoeff_spec.rb
122
128
  - spec/sjekksum_spec.rb
123
129
  - spec/spec_helper.rb
@@ -149,6 +155,9 @@ test_files:
149
155
  - spec/shared_implementation.rb
150
156
  - spec/sjekksum/damm_spec.rb
151
157
  - spec/sjekksum/luhn_spec.rb
158
+ - spec/sjekksum/primitive97_spec.rb
159
+ - spec/sjekksum/primitive_spec.rb
160
+ - spec/sjekksum/upc_spec.rb
152
161
  - spec/sjekksum/verhoeff_spec.rb
153
162
  - spec/sjekksum_spec.rb
154
163
  - spec/spec_helper.rb