luhn_validate 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. checksums.yaml +7 -0
  2. data/lib/luhn_validate.rb +50 -0
  3. metadata +43 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: c3e71654c289bf40da1ad883e139357757cb482335135e45fe9c034bd8b07a2b
4
+ data.tar.gz: e3c5b37cc9c16355492b482a9b4b1b3e45f048db51d8935a854ea8cc23fda734
5
+ SHA512:
6
+ metadata.gz: 1932ed330cd915211831e07d673d782dd87b5809c71578515952b1dd7b202ee34794c8397db56b02ca2ed8fefdab7405d55ca2f539e0a392826adea3a3044aa3
7
+ data.tar.gz: 1f109d5572354b58f16b5ff510ee1281351cc48f870f0edfe0451d2d2d672110facb69ba0e63fc09aa7cf3955e6f6c3d415532ae309939426d2c2b67669f5e82
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Validates card pan by Luhn algorithm
4
+ class Luhn
5
+ class CardNotPresentError < StandardError; end
6
+ class PanLengthError < StandardError; end
7
+
8
+ attr_reader :pan_array, :card_size, :valid
9
+
10
+ def initialize(pan)
11
+ @pan_array = pan.split('').map(&:to_i)
12
+ @card_size = @pan_array.size
13
+ @valid = valid?(calculate_luhn_score)
14
+ end
15
+
16
+ def self.validate(pan)
17
+ raise CardNotPresentError, 'Card not present' unless pan
18
+ raise PanLengthError, 'Wrong pan length' unless (14..19).include? pan.split('').size
19
+
20
+ new(pan)
21
+ end
22
+
23
+ private
24
+
25
+ def calculate_luhn_score
26
+ prepared_array = []
27
+ @pan_array.map.with_index do |pan_part, part_index|
28
+ prepared_array << calculate_pan_part(pan_part, part_index)
29
+ end
30
+
31
+ prepared_array
32
+ end
33
+
34
+ def pan_part_index_callback
35
+ (@pan_array.length - 1).odd? ? :odd? : :even?
36
+ end
37
+
38
+ def calculate_pan_part(pan_part, pan_part_index)
39
+ p_part = (pan_part_index + 1).send(pan_part_index_callback) ? (pan_part * 2) : pan_part
40
+ reveal_part_number(p_part)
41
+ end
42
+
43
+ def reveal_part_number(pan_part)
44
+ pan_part > 9 ? (pan_part - 9) : pan_part
45
+ end
46
+
47
+ def valid?(pan_array)
48
+ (pan_array.sum % 10).zero?
49
+ end
50
+ end
metadata ADDED
@@ -0,0 +1,43 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: luhn_validate
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - FuryCow
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2023-09-11 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: Validate Card PAN by Luhn algorithm
14
+ email: dreamweaver0408@gmail.com
15
+ executables: []
16
+ extensions: []
17
+ extra_rdoc_files: []
18
+ files:
19
+ - lib/luhn_validate.rb
20
+ homepage: https://rubygems.org/gems/luhn_validate
21
+ licenses:
22
+ - MIT
23
+ metadata: {}
24
+ post_install_message:
25
+ rdoc_options: []
26
+ require_paths:
27
+ - lib
28
+ required_ruby_version: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ required_rubygems_version: !ruby/object:Gem::Requirement
34
+ requirements:
35
+ - - ">="
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ requirements: []
39
+ rubygems_version: 3.0.1
40
+ signing_key:
41
+ specification_version: 4
42
+ summary: Luhn Validate
43
+ test_files: []