verified 1.1.0 → 1.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.
Files changed (4) hide show
  1. checksums.yaml +5 -13
  2. data/lib/verified/check.rb +82 -82
  3. data/lib/verified.rb +22 -22
  4. metadata +7 -7
checksums.yaml CHANGED
@@ -1,15 +1,7 @@
1
1
  ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- MzBjMjE3ZmI1ODJiODQzMzA5MzJmNjNlOWE0Yzg0NDNiNTU4NTgzZQ==
5
- data.tar.gz: !binary |-
6
- ZjgyMDg3YzQ2YmFlZjQzYmQzMmQzNWMyNDBmOTU1MTI3M2ExMmFjMQ==
2
+ SHA1:
3
+ metadata.gz: a8371a4df479325c78b7ccda1b0831166c768648
4
+ data.tar.gz: c9283c35875c14cbbb2fbc73e3128e13016e248c
7
5
  SHA512:
8
- metadata.gz: !binary |-
9
- OWZlZWRmNWJlN2I2NWI0YzJhODlhYThmNjU5ZTFiNTY3OGIzNDQ0NzY5NjEz
10
- YzdmYTY4Y2VkMzU0MTVjY2VmMjRlYjU3MTg3ODgxOTA2ZTJlZDdlNzhhMDE2
11
- MmRhOTNlNjFlNmQ2MWZkZWQxMjNhOTczMDMyYjgyYThkMTBmYzc=
12
- data.tar.gz: !binary |-
13
- NDQxMjVkNWFkNmM2NDUwMjliYTg3ZjkwYWRlNGYxYzlmNzMxMTFiZDczNGI0
14
- MWE0ZDczOGUxODQ4NjNlNmVhMGRiODFlMzk4NGYxYTQ3ODJlY2JlYTE2MDZh
15
- Zjk3MDk5ZDE1NGU0NjU2YzE0MzVmZDRjYWY5MTA3YjMxNjVhYjQ=
6
+ metadata.gz: b5a41333437f598396ef93988acb6a8d9aa47d0abb5395a7d152a62cea86788900b6e90b09102330bc9a3ca9bd443539e66c49a43d3e4af3f6cb993684e60455
7
+ data.tar.gz: 3a76b4ac8e15741fb8cdfdc6e20d4ff28623f08ee4b67a9057c5759ffd628ee7c1c06f6baec74de633aa196844b441c732cd9fdfac89acd21244ec3686d4cf30
@@ -1,82 +1,82 @@
1
- class Check
2
- def check(mrz_line_1, mrz_line_2)
3
- #make a new digit checker
4
- @@digit_checker = CheckDigit.new
5
- @@date_converter = YYDate.new
6
- #string manipulation to simply reading the first line
7
- split = mrz_line_1.split(/<+/)
8
- #get data unformatted from passport
9
- doc_data = Hash.new(9)
10
- #first line of MRZ
11
- doc_data["IssuingState"] = mrz_line_1[2...5].sub(/<+/, '')
12
- doc_data["LastName"] = split[1][3..-1]
13
- doc_data["FirstNames"] = split[2..-1]
14
-
15
- #second line of MRZ
16
- doc_data["Number"] = mrz_line_2[0...9]
17
- doc_data["Nationality"] = mrz_line_2[10...13].sub(/<+/, '')
18
- doc_data["DateOfBirth"] = @@date_converter.convert_to_date(mrz_line_2[13...19])
19
- doc_data["Gender"] = mrz_line_2[20].sub(/<+/, '')
20
- doc_data["ExpiryDate"] = @@date_converter.convert_to_date(mrz_line_2[21...27])
21
- doc_data["PersonalNumber"] = mrz_line_2[28...42].sub(/<+/, '')
22
-
23
- #mrz given check digits
24
- doc_check = Array.new
25
- doc_check[0] = mrz_line_2[9].to_s
26
- doc_check[1] = mrz_line_2[19].to_s
27
- doc_check[2] = mrz_line_2[27].to_s
28
- doc_check[3] = mrz_line_2[42].to_s
29
- doc_check[4] = mrz_line_2[43].to_s
30
-
31
- #calculate our own check digits
32
- our_check = Array.new
33
- our_check[0] = @@digit_checker.check_calc(mrz_line_2[0...9])
34
- our_check[1] = @@digit_checker.check_calc(mrz_line_2[13...19])
35
- our_check[2] = @@digit_checker.check_calc(mrz_line_2[21...27])
36
- our_check[3] = @@digit_checker.check_calc(mrz_line_2[28...42])
37
- our_check[4] = @@digit_checker.check_calc(mrz_line_2[0...10]+mrz_line_2[13...20]+mrz_line_2[21...43])
38
-
39
- #the 4th check digit can be either > or 0, we always return 0 from our CheckDigit calc.
40
- #this basically changes our check to > so the true return can pass
41
- if our_check[3] == "0" && doc_check[3] == "<"
42
- our_check[3] = "<"
43
- end
44
-
45
- return doc_data if doc_check.uniq.sort == our_check.uniq.sort
46
- return false
47
- end
48
- end
49
-
50
- class Check::CheckDigit
51
- def check_calc(str)
52
- str = str.strip.upcase
53
- values = str.chars.map do |char|
54
- case char
55
- when '<'
56
- 0
57
- when 'A'..'Z'
58
- char.ord - 65 + 10
59
- when '0'..'9'
60
- char.ord - 48
61
- else
62
- raise "Unexpected character '#{char}'"
63
- end
64
- end
65
- return (values.zip([7,3,1].cycle).map{|(v,w)| v * w}.reduce(:+) % 10).to_s
66
- end
67
- end
68
-
69
- class Check::YYDate
70
- def convert_to_date(input_date)
71
- #yymmdd has the flaw of not knowing which century
72
- #uses current year as a cut off to make an accurate prediction
73
- current_year_yy = (Date.today.strftime("%Y"))[2..4]
74
- input_year_yy = input_date[0..1]
75
- input_month = input_date[2..3]
76
- input_day = input_date[4..5]
77
- return Date.parse(input_day+"-"+input_month+"-"+"19"+input_year_yy) if input_year_yy >= current_year_yy
78
- return Date.parse(input_day+"-"+input_month+"-"+"20"+input_year_yy)
79
- end
80
- end
81
-
82
- require 'date'
1
+ require 'date'
2
+
3
+ class Check
4
+ def check(mrz_line_1, mrz_line_2)
5
+ #make a new digit checker
6
+ @@digit_checker = CheckDigit.new
7
+ @@date_converter = YYDate.new
8
+ #string manipulation to simply reading the first line
9
+ split = mrz_line_1.split(/<+/)
10
+ #get data unformatted from passport
11
+ doc_data = Hash.new(9)
12
+ #first line of MRZ
13
+ doc_data["IssuingState"] = mrz_line_1[2...5].sub(/<+/, '')
14
+ doc_data["LastName"] = split[1][3..-1]
15
+ doc_data["FirstNames"] = split[2..-1]
16
+
17
+ #second line of MRZ
18
+ doc_data["Number"] = mrz_line_2[0...9]
19
+ doc_data["Nationality"] = mrz_line_2[10...13].sub(/<+/, '')
20
+ doc_data["DateOfBirth"] = @@date_converter.convert_to_date(mrz_line_2[13...19])
21
+ doc_data["Gender"] = mrz_line_2[20].sub(/<+/, '')
22
+ doc_data["ExpiryDate"] = @@date_converter.convert_to_date(mrz_line_2[21...27])
23
+ doc_data["PersonalNumber"] = mrz_line_2[28...42].sub(/<+/, '')
24
+
25
+ #mrz given check digits
26
+ doc_check = Array.new
27
+ doc_check[0] = mrz_line_2[9].to_s
28
+ doc_check[1] = mrz_line_2[19].to_s
29
+ doc_check[2] = mrz_line_2[27].to_s
30
+ doc_check[3] = mrz_line_2[42].to_s
31
+ doc_check[4] = mrz_line_2[43].to_s
32
+
33
+ #calculate our own check digits
34
+ our_check = Array.new
35
+ our_check[0] = @@digit_checker.check_calc(mrz_line_2[0...9])
36
+ our_check[1] = @@digit_checker.check_calc(mrz_line_2[13...19])
37
+ our_check[2] = @@digit_checker.check_calc(mrz_line_2[21...27])
38
+ our_check[3] = @@digit_checker.check_calc(mrz_line_2[28...42])
39
+ our_check[4] = @@digit_checker.check_calc(mrz_line_2[0...10]+mrz_line_2[13...20]+mrz_line_2[21...43])
40
+
41
+ #the 4th check digit can be either > or 0, we always return 0 from our CheckDigit calc.
42
+ #this basically changes our check to > so the true return can pass
43
+ if our_check[3] == "0" && doc_check[3] == "<"
44
+ our_check[3] = "<"
45
+ end
46
+
47
+ return doc_data if doc_check.uniq.sort == our_check.uniq.sort
48
+ return false
49
+ end
50
+ end
51
+
52
+ class Check::CheckDigit
53
+ def check_calc(str)
54
+ str = str.strip.upcase
55
+ values = str.chars.map do |char|
56
+ case char
57
+ when '<'
58
+ 0
59
+ when 'A'..'Z'
60
+ char.ord - 65 + 10
61
+ when '0'..'9'
62
+ char.ord - 48
63
+ else
64
+ raise "Unexpected character '#{char}'"
65
+ end
66
+ end
67
+ return (values.zip([7,3,1].cycle).map{|(v,w)| v * w}.reduce(:+) % 10).to_s
68
+ end
69
+ end
70
+
71
+ class Check::YYDate
72
+ def convert_to_date(input_date)
73
+ #yymmdd has the flaw of not knowing which century
74
+ #uses current year as a cut off to make an accurate prediction
75
+ current_year_yy = (Date.today.strftime("%Y"))[2..4]
76
+ input_year_yy = input_date[0..1]
77
+ input_month = input_date[2..3]
78
+ input_day = input_date[4..5]
79
+ return Date.parse(input_day+"-"+input_month+"-"+"19"+input_year_yy) if input_year_yy >= current_year_yy
80
+ return Date.parse(input_day+"-"+input_month+"-"+"20"+input_year_yy)
81
+ end
82
+ end
data/lib/verified.rb CHANGED
@@ -1,22 +1,22 @@
1
- Verified = Class.new
2
- class Verified::Passport
3
- def initialize(mrz_line_1, mrz_line_2)
4
- checker = Check.new
5
- @data = checker.check(mrz_line_1, mrz_line_2)
6
- end
7
-
8
- def verified?
9
- return false if @data == false
10
- return true
11
- end
12
-
13
- def method_missing(name, *args, &blk)
14
- if args.empty? && blk.nil? && @data.has_key?(name.to_s)
15
- @data[name.to_s]
16
- else
17
- super
18
- end
19
- end
20
- end
21
-
22
- require "verified/check"
1
+ require 'verified/check'
2
+
3
+ Verified = Class.new
4
+ class Verified::Passport
5
+ def initialize(mrz_line_1, mrz_line_2)
6
+ checker = Check.new
7
+ @data = checker.check(mrz_line_1, mrz_line_2)
8
+ end
9
+
10
+ def verified?
11
+ return false if @data == false
12
+ return true
13
+ end
14
+
15
+ def method_missing(name, *args, &blk)
16
+ if args.empty? && blk.nil? && @data.has_key?(name.to_s)
17
+ @data[name.to_s]
18
+ else
19
+ super
20
+ end
21
+ end
22
+ end
metadata CHANGED
@@ -1,25 +1,25 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: verified
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ruby
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-08-26 00:00:00.000000000 Z
11
+ date: 2015-05-23 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: A simple gem to verify and parse MRZ codes on passports. Useful if you
14
14
  need to comply with KYC or Money Laundering ID checks.
15
- email: ruby@mewmew.io
15
+ email: hi@ruby.sh
16
16
  executables: []
17
17
  extensions: []
18
18
  extra_rdoc_files: []
19
19
  files:
20
20
  - lib/verified.rb
21
21
  - lib/verified/check.rb
22
- homepage: http://github.com/rubyisilluminati/verified
22
+ homepage: http://github.com/rubymeow/verified
23
23
  licenses:
24
24
  - MIT
25
25
  metadata: {}
@@ -29,17 +29,17 @@ require_paths:
29
29
  - lib
30
30
  required_ruby_version: !ruby/object:Gem::Requirement
31
31
  requirements:
32
- - - ! '>='
32
+ - - ">="
33
33
  - !ruby/object:Gem::Version
34
34
  version: '0'
35
35
  required_rubygems_version: !ruby/object:Gem::Requirement
36
36
  requirements:
37
- - - ! '>='
37
+ - - ">="
38
38
  - !ruby/object:Gem::Version
39
39
  version: '0'
40
40
  requirements: []
41
41
  rubyforge_project:
42
- rubygems_version: 2.4.1
42
+ rubygems_version: 2.4.5
43
43
  signing_key:
44
44
  specification_version: 4
45
45
  summary: Really simple passport parsing and verification.