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 ADDED
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in yapv.gemspec
4
+ gemspec
data/README.md ADDED
@@ -0,0 +1,4 @@
1
+ yapv
2
+ ====
3
+
4
+ Yet Another PESEL validator
data/Rakefile ADDED
@@ -0,0 +1,10 @@
1
+ require "bundler/gem_tasks"
2
+ require "rake/testtask"
3
+
4
+ Rake::TestTask.new(:test) do |test|
5
+ test.libs << "lib" << "test"
6
+ test.pattern = "test/**/*_test.rb"
7
+ test.verbose = true
8
+ end
9
+
10
+ task :default => :test
data/lib/yapv.rb ADDED
@@ -0,0 +1,5 @@
1
+ require "yapv/version"
2
+
3
+ module Yapv
4
+ # Your code goes here...
5
+ end
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
@@ -0,0 +1,3 @@
1
+ module Yapv
2
+ VERSION = "0.0.1"
3
+ end
@@ -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
@@ -0,0 +1,6 @@
1
+ require "minitest/unit"
2
+ require "minitest/autorun"
3
+ require "active_model"
4
+ require "active_model/validations"
5
+ require "yapv"
6
+ require "yapv/pesel"
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