luhn 0.1.1 → 1.0.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: acc7be20238719d56f27cf60436232d6933aeca2
4
+ data.tar.gz: 351bc940bea52556e369602a546c5bcebdaf1e02
5
+ SHA512:
6
+ metadata.gz: 1c25701d9c3466526efc767fee9c0c0c7c384044c8894d84e635094b687aba5be016a1b99cfda8f0c7181693c7ac89a8cdd2d664263517d2b7132d0e1614c588
7
+ data.tar.gz: 6e0cff66c776898bb10ef90cb58129af34e64dfbef5b569af2f7998a8155c755c30d5ced4fd21f538f6f03d85e5cbb3930ea046b8752982e46723743a6cfae68
data/lib/luhn.rb CHANGED
@@ -1,40 +1,59 @@
1
1
  # encoding: UTF-8
2
- require 'luhn/extensions'
2
+ require "luhn/extensions"
3
3
 
4
4
  module Luhn
5
- autoload :CivicNumber, 'luhn/civic_number'
5
+ def self.valid? value
6
+ LuhnValue.new(value).valid?
7
+ end
6
8
 
7
- class << self
8
- def valid?(value)
9
- self.checksum(value, :odd) % 10 == 0
10
- end
9
+ def self.control_digit value
10
+ LuhnValue.new(value).control_digit
11
+ end
11
12
 
12
- def control_digit(value)
13
- sum = self.checksum(value, :even)
14
- (sum % 10 != 0) ? 10 - (sum % 10) : 0
13
+ def self.generate size, options = {}
14
+ LuhnValue.generate size, options
15
+ end
16
+
17
+ class LuhnValue
18
+ attr_reader :number
19
+
20
+ def initialize number
21
+ self.number = number
15
22
  end
16
23
 
17
- def generate(size, options = {})
24
+ def self.generate size, options = {}
18
25
  generated = options[:prefix] || ''
19
26
  (size - generated.size - 1).times { |i| generated += rand(10).to_s }
20
- generated + self.control_digit(generated).to_s
27
+
28
+ generated + self.new(generated).control_digit.to_s
21
29
  end
22
30
 
23
- protected
31
+ def valid?
32
+ number != "" && checksum(:odd) % 10 == 0
33
+ end
34
+
35
+ def control_digit
36
+ sum = checksum(:even)
37
+ (sum % 10 != 0) ? 10 - (sum % 10) : 0
38
+ end
39
+
40
+ private
41
+
42
+ def number= number
43
+ @number = number.to_s.gsub(/\D/, "")
44
+ end
24
45
 
25
- def checksum(value, operation)
46
+ def checksum(operation)
26
47
  i = 0
27
- value.reverse.split(//).inject(0) do |sum, c|
48
+ compare_method = (operation == :even) ? :== : :>
49
+ self.number.reverse.split("").inject(0) do |sum, c|
28
50
  n = c.to_i
29
- calc = if operation == :even
30
- (i % 2 == 0) ? n * 2 : n
31
- else
32
- (i % 2 != 0) ? n * 2 : n
33
- end
51
+ weight = (i % 2).send(compare_method, 0) ? n * 2 : n
34
52
  i += 1
35
- sum += calc <= 9 ? calc : (calc % 10) + 1
53
+ sum += weight < 10 ? weight : weight - 9
36
54
  end
37
55
  end
38
56
  end
57
+ end
39
58
 
40
- end
59
+ require "luhn/civic_number"
@@ -40,6 +40,10 @@ module Luhn
40
40
  })
41
41
  end
42
42
 
43
+ def formatted
44
+ to_s.insert(civic_number.length - 4, "-")
45
+ end
46
+
43
47
  def to_s
44
48
  civic_number
45
49
  end
@@ -59,4 +63,4 @@ module Luhn
59
63
  end
60
64
 
61
65
  end
62
- end
66
+ end
data/lib/luhn/version.rb CHANGED
@@ -1,4 +1,3 @@
1
- # encoding: UTF-8
2
1
  module Luhn
3
- Version = '0.1.1'
4
- end
2
+ Version = "1.0.0"
3
+ end
@@ -46,8 +46,14 @@ describe Luhn::CivicNumber do
46
46
  civic_number.birth_date.day.must_equal 1
47
47
  end
48
48
 
49
+ it "formats the civic number" do
50
+ civic_number = Luhn::CivicNumber.new('3001018194')
51
+
52
+ civic_number.formatted.must_equal "300101-8194"
53
+ end
54
+
49
55
  it 'generates a valid random civic number' do
50
56
  civic_number = Luhn::CivicNumber.generate
51
57
  Luhn::CivicNumber.new(civic_number).valid?.must_equal true
52
58
  end
53
- end
59
+ end
data/spec/spec_luhn.rb CHANGED
@@ -9,6 +9,10 @@ describe Luhn do
9
9
  Luhn.valid?('1111111111').must_equal false
10
10
  end
11
11
 
12
+ it 'requires numbers' do
13
+ Luhn.valid?('frefre').must_equal false
14
+ end
15
+
12
16
  it 'generates a number string that satisfies luhn' do
13
17
  luhn_string = Luhn.generate(rand(32)+1)
14
18
  Luhn.valid?(luhn_string).must_equal true
@@ -28,4 +32,4 @@ describe Luhn do
28
32
  it 'calculates the control digit' do
29
33
  Luhn.control_digit('111111111').must_equal 6
30
34
  end
31
- end
35
+ end
metadata CHANGED
@@ -1,38 +1,36 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: luhn
3
- version: !ruby/object:Gem::Version
4
- prerelease:
5
- version: 0.1.1
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
6
5
  platform: ruby
7
- authors:
8
- - "Joel Junstr\xC3\xB6m"
6
+ authors:
7
+ - Joel Junström
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
-
13
- date: 2011-09-26 00:00:00 Z
14
- dependencies:
15
- - !ruby/object:Gem::Dependency
11
+ date: 2015-09-19 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
16
14
  name: minitest
17
- prerelease: false
18
- requirement: &id001 !ruby/object:Gem::Requirement
19
- none: false
20
- requirements:
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
21
17
  - - ~>
22
- - !ruby/object:Gem::Version
18
+ - !ruby/object:Gem::Version
23
19
  version: 2.6.0
24
20
  type: :development
25
- version_requirements: *id001
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: 2.6.0
26
27
  description:
27
- email:
28
+ email:
28
29
  - joel.junstrom@gmail.com
29
30
  executables: []
30
-
31
31
  extensions: []
32
-
33
32
  extra_rdoc_files: []
34
-
35
- files:
33
+ files:
36
34
  - lib/luhn/civic_number.rb
37
35
  - lib/luhn/extensions/numeric.rb
38
36
  - lib/luhn/extensions/string.rb
@@ -47,30 +45,25 @@ files:
47
45
  - README.rdoc
48
46
  homepage: http://github.com/joeljunstrom/ruby_luhn
49
47
  licenses: []
50
-
48
+ metadata: {}
51
49
  post_install_message:
52
50
  rdoc_options: []
53
-
54
- require_paths:
51
+ require_paths:
55
52
  - lib
56
- required_ruby_version: !ruby/object:Gem::Requirement
57
- none: false
58
- requirements:
59
- - - ">="
60
- - !ruby/object:Gem::Version
61
- version: "0"
62
- required_rubygems_version: !ruby/object:Gem::Requirement
63
- none: false
64
- requirements:
65
- - - ">="
66
- - !ruby/object:Gem::Version
67
- version: "0"
53
+ required_ruby_version: !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - '>='
56
+ - !ruby/object:Gem::Version
57
+ version: '0'
58
+ required_rubygems_version: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - '>='
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
68
63
  requirements: []
69
-
70
64
  rubyforge_project:
71
- rubygems_version: 1.8.8
65
+ rubygems_version: 2.0.14
72
66
  signing_key:
73
- specification_version: 3
67
+ specification_version: 4
74
68
  summary: A small implementation of the Luhn algorithm.
75
69
  test_files: []
76
-