yapv 0.0.1
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.
- data/.gitignore +4 -0
- data/Gemfile +4 -0
- data/README.md +4 -0
- data/Rakefile +10 -0
- data/lib/yapv.rb +5 -0
- data/lib/yapv/pesel.rb +71 -0
- data/lib/yapv/version.rb +3 -0
- data/test/pesel_test.rb +94 -0
- data/test/test_helper.rb +6 -0
- data/yapv.gemspec +24 -0
- metadata +68 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
data/Rakefile
ADDED
data/lib/yapv.rb
ADDED
data/lib/yapv/pesel.rb
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
module Yapv
|
2
|
+
class Pesel
|
3
|
+
include ActiveModel::Validations
|
4
|
+
attr_accessor :value
|
5
|
+
|
6
|
+
validates :value, :presence => true, :length => {:is => 11}, :numericality => true
|
7
|
+
validate :pesel_format
|
8
|
+
|
9
|
+
def initialize(value)
|
10
|
+
self.value = value
|
11
|
+
end
|
12
|
+
|
13
|
+
def pesel_format
|
14
|
+
mask = [1, 3, 7, 9, 1, 3, 7, 9, 1, 3]
|
15
|
+
val = value.split("").map(&:to_i)
|
16
|
+
|
17
|
+
modulo = mask.inject(0){|sum, num| sum + (num * val.shift)} % 10
|
18
|
+
errors.add(:value) unless 10 - modulo == val.shift
|
19
|
+
end
|
20
|
+
|
21
|
+
def gender
|
22
|
+
return unless valid?
|
23
|
+
value[-2].to_i % 2 == 0 ? :female : :male
|
24
|
+
end
|
25
|
+
|
26
|
+
def gender!
|
27
|
+
raise ArgumentError.new("PESEL is invalid") unless gender
|
28
|
+
gender
|
29
|
+
end
|
30
|
+
|
31
|
+
def male?
|
32
|
+
raise ArgumentError.new("PESEL is invalid") unless valid?
|
33
|
+
gender == :male
|
34
|
+
end
|
35
|
+
|
36
|
+
def female?
|
37
|
+
raise ArgumentError.new("PESEL is invalid") unless valid?
|
38
|
+
gender == :female
|
39
|
+
end
|
40
|
+
|
41
|
+
def birth_date
|
42
|
+
return unless valid?
|
43
|
+
case value[2].to_i
|
44
|
+
when 0..1
|
45
|
+
century = "19"
|
46
|
+
offset = 0
|
47
|
+
when 2..3
|
48
|
+
century = "20"
|
49
|
+
offset = 20
|
50
|
+
when 4..5
|
51
|
+
century = "21"
|
52
|
+
offset = 40
|
53
|
+
when 6..7
|
54
|
+
century = "22"
|
55
|
+
offset = 60
|
56
|
+
when 8..9
|
57
|
+
century = "18"
|
58
|
+
offset = 80
|
59
|
+
end
|
60
|
+
|
61
|
+
year, month, day = value[0,6].scan(/\d\d/)
|
62
|
+
month = month.to_i - offset
|
63
|
+
Date.parse("#{century}#{year}-#{month}-#{day}")
|
64
|
+
end
|
65
|
+
|
66
|
+
def birth_date!
|
67
|
+
raise ArgumentError.new("PESEL is invalid") unless birth_date
|
68
|
+
birth_date
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
data/lib/yapv/version.rb
ADDED
data/test/pesel_test.rb
ADDED
@@ -0,0 +1,94 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
require "date"
|
3
|
+
class PeselTest < MiniTest::Unit::TestCase
|
4
|
+
def test_pesel_shorter_than_11_digits_is_invalid
|
5
|
+
@pesel = Yapv::Pesel.new("1" * 10)
|
6
|
+
assert !@pesel.valid?
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_pesel_lenghten_than_11_digits_is_invalid
|
10
|
+
@pesel = Yapv::Pesel.new("1" * 12)
|
11
|
+
assert !@pesel.valid?
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_pesel_with_non_digit_characters_is_invalid
|
15
|
+
@pesel = Yapv::Pesel.new("1234567890a")
|
16
|
+
assert !@pesel.valid?
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_incorrect_pesel_is_invalid
|
20
|
+
["75120804350"].each do |pesel|
|
21
|
+
@pesel = Yapv::Pesel.new(pesel)
|
22
|
+
assert !@pesel.valid?, "Pesel: #{pesel} should be invalid"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_correct_pesel_is_valid
|
27
|
+
["74021834018", "02221407563"].each do |pesel|
|
28
|
+
@pesel = Yapv::Pesel.new(pesel)
|
29
|
+
assert @pesel.valid?, "Pesel #{pesel} should be valid"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_birth_date_returns_correct_date
|
34
|
+
[["74082610668", "1974-08-26"], ["02221407563", "2002-02-14"]].each do |row|
|
35
|
+
pesel, expected_date = row
|
36
|
+
@pesel = Yapv::Pesel.new(pesel)
|
37
|
+
assert_equal Date.parse(expected_date), @pesel.birth_date
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_birth_date_with_bang_raises_error_with_incorrect_pesel
|
42
|
+
@pesel = Yapv::Pesel.new("74082610618")
|
43
|
+
assert_raises ArgumentError do
|
44
|
+
@pesel.birth_date!
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_birth_date_returns_nil_if_pesel_is_incorrect
|
49
|
+
["74082610618", "02221407513"].each do |pesel|
|
50
|
+
@pesel = Yapv::Pesel.new(pesel)
|
51
|
+
assert_equal nil, @pesel.birth_date
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def test_gender_method_returns_male_for_male_pesel
|
56
|
+
@pesel = Yapv::Pesel.new("74021834018")
|
57
|
+
assert @pesel.male?
|
58
|
+
assert @pesel.gender == :male
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_gender_method_returns_female_for_female_pesel
|
62
|
+
@pesel = Yapv::Pesel.new("02221407563")
|
63
|
+
assert @pesel.female?
|
64
|
+
assert @pesel.gender == :female
|
65
|
+
end
|
66
|
+
|
67
|
+
def test_gender_returns_nil_if_pesel_is_incorrect
|
68
|
+
@pesel = Yapv::Pesel.new("74082610618")
|
69
|
+
assert_equal nil, @pesel.gender
|
70
|
+
end
|
71
|
+
|
72
|
+
def test_gender_with_bang_raises_error_with_incorrect_pesel
|
73
|
+
@pesel = Yapv::Pesel.new("74082610618")
|
74
|
+
assert_raises ArgumentError do
|
75
|
+
@pesel.gender!
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def test_male_and_female_inquirer_raises_error_if_pesel_is_incorrect
|
80
|
+
@pesel = Yapv::Pesel.new("74082610618")
|
81
|
+
assert_raises ArgumentError, "male? method should raise ArgumentError" do
|
82
|
+
@pesel.male?
|
83
|
+
end
|
84
|
+
|
85
|
+
assert_raises ArgumentError, "female? method should raise ArgumentError" do
|
86
|
+
@pesel.female?
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def test_dupa
|
91
|
+
@pesel = Yapv::Pesel.new("44051401359")
|
92
|
+
raise @pesel.birth_date.inspect
|
93
|
+
end
|
94
|
+
end
|
data/test/test_helper.rb
ADDED
data/yapv.gemspec
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "yapv/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "yapv"
|
7
|
+
s.version = Yapv::VERSION
|
8
|
+
s.authors = ["Michal Krzyzanowski"]
|
9
|
+
s.email = ["michal.krzyzanowski+github@gmail.com"]
|
10
|
+
s.homepage = "http://github.com/krzyzak/yapv"
|
11
|
+
s.summary = %q{yapv: Yet Another PESEL validator}
|
12
|
+
s.description = %q{}
|
13
|
+
|
14
|
+
s.rubyforge_project = "yapv"
|
15
|
+
|
16
|
+
s.files = `git ls-files`.split("\n")
|
17
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
|
+
s.require_paths = ["lib"]
|
20
|
+
|
21
|
+
# specify any dependencies here; for example:
|
22
|
+
# s.add_development_dependency "rspec"
|
23
|
+
s.add_runtime_dependency "activemodel"
|
24
|
+
end
|
metadata
ADDED
@@ -0,0 +1,68 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: yapv
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Michal Krzyzanowski
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-05-10 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: activemodel
|
16
|
+
requirement: &70228462292640 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *70228462292640
|
25
|
+
description: ''
|
26
|
+
email:
|
27
|
+
- michal.krzyzanowski+github@gmail.com
|
28
|
+
executables: []
|
29
|
+
extensions: []
|
30
|
+
extra_rdoc_files: []
|
31
|
+
files:
|
32
|
+
- .gitignore
|
33
|
+
- Gemfile
|
34
|
+
- README.md
|
35
|
+
- Rakefile
|
36
|
+
- lib/yapv.rb
|
37
|
+
- lib/yapv/pesel.rb
|
38
|
+
- lib/yapv/version.rb
|
39
|
+
- test/pesel_test.rb
|
40
|
+
- test/test_helper.rb
|
41
|
+
- yapv.gemspec
|
42
|
+
homepage: http://github.com/krzyzak/yapv
|
43
|
+
licenses: []
|
44
|
+
post_install_message:
|
45
|
+
rdoc_options: []
|
46
|
+
require_paths:
|
47
|
+
- lib
|
48
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
55
|
+
none: false
|
56
|
+
requirements:
|
57
|
+
- - ! '>='
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: '0'
|
60
|
+
requirements: []
|
61
|
+
rubyforge_project: yapv
|
62
|
+
rubygems_version: 1.8.15
|
63
|
+
signing_key:
|
64
|
+
specification_version: 3
|
65
|
+
summary: ! 'yapv: Yet Another PESEL validator'
|
66
|
+
test_files:
|
67
|
+
- test/pesel_test.rb
|
68
|
+
- test/test_helper.rb
|