pesel_parser 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 11565a2fd6eb60c34f7c87331fbe5058ccdf03d6
4
+ data.tar.gz: f1c093097fefc55dde129c40833652eff5bea684
5
+ SHA512:
6
+ metadata.gz: 5b3079659f917b14811ac88b267cf170a1265e76a2ebe921cd3afe67ee0769243d00449067e9a67cfe93ff5c59efe168b41371ee45106be4b9ec327d5aae0140
7
+ data.tar.gz: baed499188d0a6f02433c4b3240772021000e7eff280b0c4797bd316a6a155b16bfa63cdbe1a5acf355f2219eb0f342a39350ba78130b6c27368b4ef2926ced6
@@ -0,0 +1,5 @@
1
+ require_relative 'p_parser'
2
+ # monkey patch
3
+ class Fixnum
4
+ include ::PParser
5
+ end
@@ -0,0 +1,6 @@
1
+ # common monkey patch
2
+ module PParser
3
+ def inspect_pesel
4
+ PeselInspector.new(self)
5
+ end
6
+ end
@@ -0,0 +1,59 @@
1
+ # frozen_string_literal: true
2
+ # Fetch birth date, sex and series number from PESEL number
3
+ class PeselInspector
4
+ require 'date'
5
+
6
+ PeselError = Class.new(StandardError)
7
+
8
+ ERROR_MESSAGE = 'Invalid PESEL'.freeze
9
+ PESEL_LENGTH = 11
10
+ CENTURIES = { '8' => '18', '9' => '18',
11
+ '0' => '19', '1' => '19',
12
+ '2' => '20', '3' => '20',
13
+ '4' => '21', '5' => '21',
14
+ '6' => '22', '7' => '22' }.freeze
15
+
16
+ attr_reader :pesel, :birth_date, :sex, :series_number
17
+
18
+ def initialize(pes)
19
+ pesel = pes.to_s
20
+ validate(pesel)
21
+ @pesel = pesel
22
+ @birth_date = parse_birth_date
23
+ @sex = pesel[9].to_i.even? ? 'female' : 'male'
24
+ @series_number = pesel[6..9]
25
+ end
26
+
27
+ private
28
+
29
+ def parse_birth_date
30
+ begin
31
+ date = Date.parse [day, month, year].join('/')
32
+ rescue ArgumentError
33
+ raise PeselError, ERROR_MESSAGE
34
+ end
35
+ date
36
+ end
37
+
38
+ def year
39
+ CENTURIES[pesel[2]] + pesel[0..1]
40
+ end
41
+
42
+ def day
43
+ pesel[4..5]
44
+ end
45
+
46
+ def month
47
+ pesel[2..3].to_i % 20
48
+ end
49
+
50
+ # rubocop:disable AbcSize
51
+ def validate(p)
52
+ raise PeselError, ERROR_MESSAGE unless p.size == PESEL_LENGTH
53
+ p = p.split('').map(&:to_i)
54
+ primo = p[0] + 3 * p[1] + 7 * p[2] + 9 * p[3]
55
+ secondo = p[4] + 3 * p[5] + 7 * p[6] + 9 * p[7] + p[8] + 3 * p[9] + p[10]
56
+ raise PeselError, ERROR_MESSAGE unless (primo + secondo) % 10 == 0
57
+ end
58
+ # rubocop:enable AbcSize
59
+ end
@@ -0,0 +1,10 @@
1
+ require_relative 'pesel_inspector'
2
+ require_relative 'string'
3
+ require_relative 'fixnum'
4
+ require_relative 'p_parser'
5
+ # Core file
6
+ module PeselParser
7
+ def self.root
8
+ File.dirname __dir__
9
+ end
10
+ end
@@ -0,0 +1,5 @@
1
+ require_relative 'p_parser'
2
+ # monkey patch
3
+ class String
4
+ include ::PParser
5
+ end
metadata ADDED
@@ -0,0 +1,91 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: pesel_parser
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ platform: ruby
6
+ authors:
7
+ - Maciej Kempin
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-02-05 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.8'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.8'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rubocop
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 0.37.0
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 0.37.0
55
+ description:
56
+ email:
57
+ executables: []
58
+ extensions: []
59
+ extra_rdoc_files: []
60
+ files:
61
+ - lib/fixnum.rb
62
+ - lib/p_parser.rb
63
+ - lib/pesel_inspector.rb
64
+ - lib/pesel_parser.rb
65
+ - lib/string.rb
66
+ homepage:
67
+ licenses:
68
+ - MIT
69
+ metadata: {}
70
+ post_install_message:
71
+ rdoc_options: []
72
+ require_paths:
73
+ - lib
74
+ required_ruby_version: !ruby/object:Gem::Requirement
75
+ requirements:
76
+ - - ">="
77
+ - !ruby/object:Gem::Version
78
+ version: '0'
79
+ required_rubygems_version: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
84
+ requirements: []
85
+ rubyforge_project:
86
+ rubygems_version: 2.5.1
87
+ signing_key:
88
+ specification_version: 4
89
+ summary: Parses PESEL number. Validates PESEL, fetches birth date, sex and series
90
+ number
91
+ test_files: []