pesel_parser 0.0.2

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.
@@ -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: []