identitycode 0.2.1 → 0.2.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.
- checksums.yaml +4 -4
- data/README.md +4 -0
- data/identitycode.gemspec +3 -3
- data/lib/identity_code/pl.rb +155 -0
- data/lib/identity_code/version.rb +1 -1
- data/lib/identity_code.rb +13 -12
- metadata +9 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 93fd0fa7df0107fcf135937b1a2f13a82f521510
|
4
|
+
data.tar.gz: c53c1a7b1be7d91ce4337f2280312881ca04f54d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 506c9cbbd3619f091711ed47d94a222bba5049a2880ccc301aecdc56c82ecb1d43aaee8b076603d427f351d0014cf803aea6a3a3a0c3ccac80c1e88dc64bf836
|
7
|
+
data.tar.gz: c1089c3c1e5c9bb5594043f9716a1766e315cf78eed6fa2e90445dfc5d6c49ed3c5f8a692e6218c6ae7e1714460175941030e14086f12970f94619f8942d3a9b
|
data/README.md
CHANGED
@@ -31,6 +31,8 @@ This gem supports Estonian and Latvian identity codes. Just specify `EE` or `LV`
|
|
31
31
|
=> true
|
32
32
|
> IdentityCode::LV.valid?('20128315289')
|
33
33
|
=> true
|
34
|
+
> IdentityCode.valid?(country: :lv, code: '20128315289')
|
35
|
+
=> true
|
34
36
|
> code.sex
|
35
37
|
=> 'M'
|
36
38
|
> code.birth_date.to_s
|
@@ -38,6 +40,8 @@ This gem supports Estonian and Latvian identity codes. Just specify `EE` or `LV`
|
|
38
40
|
> code.age
|
39
41
|
=> 31
|
40
42
|
# Generate random valid identity code
|
43
|
+
> IdentityCode.generate(country: :ee)
|
44
|
+
=> '37504163700'
|
41
45
|
> IdentityCode::EE.generate
|
42
46
|
=> '37504163700'
|
43
47
|
> IdentityCode::EE.generate(sex: 'M', year: 1983, month: 12, day: 20)
|
data/identitycode.gemspec
CHANGED
@@ -9,8 +9,8 @@ Gem::Specification.new do |spec|
|
|
9
9
|
spec.authors = ['Artem Pakk']
|
10
10
|
spec.email = ['apakk@me.com']
|
11
11
|
|
12
|
-
spec.summary = %q{Ruby gem to generate and validate Estonian and
|
13
|
-
spec.description = %q{Ruby gem to generate and validate Estonian and
|
12
|
+
spec.summary = %q{Ruby gem to generate and validate Estonian, Latvian, and Polish identity codes}
|
13
|
+
spec.description = %q{Ruby gem to generate and validate Estonian, Latvian, and Polish identity codes}
|
14
14
|
spec.homepage = 'https://github.com/defeed/identitycode'
|
15
15
|
spec.license = "MIT"
|
16
16
|
|
@@ -19,6 +19,6 @@ Gem::Specification.new do |spec|
|
|
19
19
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
20
20
|
spec.require_paths = ['lib']
|
21
21
|
|
22
|
-
spec.add_development_dependency 'bundler', '~> 1.
|
22
|
+
spec.add_development_dependency 'bundler', '~> 1.11'
|
23
23
|
spec.add_development_dependency 'rake', "~> 10.0"
|
24
24
|
end
|
@@ -0,0 +1,155 @@
|
|
1
|
+
require 'date'
|
2
|
+
|
3
|
+
module IdentityCode
|
4
|
+
class PL
|
5
|
+
def self.generate(opts = {})
|
6
|
+
sex = opts[:sex] || (rand.round == 0 ? :M : :F)
|
7
|
+
year = opts[:year] || rand(Date.today.year - 90..Date.today.year - 1)
|
8
|
+
year = rand(Date.today.year - 50..Date.today.year - 19) if opts[:safe_age]
|
9
|
+
month = opts[:month] || rand(1..12)
|
10
|
+
calc_month = begin
|
11
|
+
offset = case year.to_s[0..1]
|
12
|
+
when '18' then 80
|
13
|
+
when '19' then 0
|
14
|
+
when '20' then 20
|
15
|
+
end
|
16
|
+
month + offset
|
17
|
+
end
|
18
|
+
day = opts[:day] || rand(1..NUM_DAYS[month])
|
19
|
+
|
20
|
+
sex_digit = [0, 2, 4, 6, 8].sample
|
21
|
+
sex_digit += 1 if sex.upcase.to_sym == :M
|
22
|
+
|
23
|
+
result = "%02d" % year.to_s[2..3].to_i
|
24
|
+
result += "%02d" % calc_month
|
25
|
+
result += "%02d" % day
|
26
|
+
result += "%03d" % rand(1..999)
|
27
|
+
result += sex_digit.to_s
|
28
|
+
result += new(result).control_code.to_s
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.valid?(code)
|
32
|
+
new(code).valid?
|
33
|
+
end
|
34
|
+
|
35
|
+
def initialize(code)
|
36
|
+
@code = code.to_s
|
37
|
+
end
|
38
|
+
|
39
|
+
def valid?
|
40
|
+
@code.length == 11 &&
|
41
|
+
@code[10].chr.to_i == control_code
|
42
|
+
end
|
43
|
+
|
44
|
+
def birth_date
|
45
|
+
return unless valid?
|
46
|
+
year = century + @code[0..1].to_i
|
47
|
+
day = @code[4..5].to_i
|
48
|
+
return unless Date.valid_date?(year, month, day)
|
49
|
+
Date.new(year, month, day)
|
50
|
+
end
|
51
|
+
|
52
|
+
def month
|
53
|
+
raw_num = @code[2..3].to_i
|
54
|
+
|
55
|
+
case raw_num
|
56
|
+
when 81..92 then raw_num - 80
|
57
|
+
when 1..12 then raw_num
|
58
|
+
when 21..32 then raw_num - 20
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def age
|
63
|
+
return unless valid?
|
64
|
+
now = Time.now.utc.to_date
|
65
|
+
now.year - (birth_date.year + IdentityCode::age_correction(birth_date))
|
66
|
+
end
|
67
|
+
|
68
|
+
def sex
|
69
|
+
return unless valid?
|
70
|
+
@code[9].to_i.odd? ? :M : :F
|
71
|
+
end
|
72
|
+
|
73
|
+
def control_code
|
74
|
+
multipliers = [9, 7, 3, 1, 9, 7, 3, 1, 9, 7]
|
75
|
+
id_ary = @code.split(//).map(&:to_i)
|
76
|
+
sum = 0
|
77
|
+
|
78
|
+
(0...multipliers.count).each { |i| sum += id_ary[i] * multipliers[i] }
|
79
|
+
|
80
|
+
sum % 10
|
81
|
+
end
|
82
|
+
|
83
|
+
private
|
84
|
+
|
85
|
+
def century
|
86
|
+
c = @code[2..3].to_i
|
87
|
+
|
88
|
+
case c
|
89
|
+
when 81..92 then 1800
|
90
|
+
when 1..12 then 1900
|
91
|
+
when 21..32 then 2000
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
# CONTROL_SUM = [9, 7, 3, 1, 9, 7, 3, 1, 9, 7]
|
98
|
+
#
|
99
|
+
# def length_valid?
|
100
|
+
# identity_code && identity_code.length == 11
|
101
|
+
# end
|
102
|
+
#
|
103
|
+
# def checksum_valid?
|
104
|
+
# id_ary = identity_code.split(//).map(&:to_i)
|
105
|
+
# sum = 0
|
106
|
+
#
|
107
|
+
# (0...CONTROL_SUM.count).each { |i| sum += id_ary[i] * CONTROL_SUM[i] }
|
108
|
+
#
|
109
|
+
# sum % 10 == id_ary[10]
|
110
|
+
# end
|
111
|
+
#
|
112
|
+
# def calculate_birthday
|
113
|
+
# @birthday = Date.new(year, month, day)
|
114
|
+
# rescue
|
115
|
+
# @birthday = nil
|
116
|
+
# end
|
117
|
+
# alias_method :birthday_valid?, :calculate_birthday
|
118
|
+
#
|
119
|
+
# def century
|
120
|
+
# c = identity_code[2..3].to_i
|
121
|
+
#
|
122
|
+
# case c
|
123
|
+
# when 81..92
|
124
|
+
# '18'
|
125
|
+
# when 1..12
|
126
|
+
# '19'
|
127
|
+
# when 21..32
|
128
|
+
# '20'
|
129
|
+
# end
|
130
|
+
# end
|
131
|
+
#
|
132
|
+
# def year
|
133
|
+
# (century + identity_code[0..1]).to_i
|
134
|
+
# end
|
135
|
+
#
|
136
|
+
# def month
|
137
|
+
# raw_num = identity_code[2..3].to_i
|
138
|
+
#
|
139
|
+
# case raw_num
|
140
|
+
# when 81..92
|
141
|
+
# raw_num - 80
|
142
|
+
# when 1..12
|
143
|
+
# raw_num
|
144
|
+
# when 21..32
|
145
|
+
# raw_num - 20
|
146
|
+
# end
|
147
|
+
# end
|
148
|
+
#
|
149
|
+
# def day
|
150
|
+
# identity_code[4..5].to_i
|
151
|
+
# end
|
152
|
+
#
|
153
|
+
# def available_gender
|
154
|
+
# identity_code[9].to_i.even? ? :F : :M
|
155
|
+
# end
|
data/lib/identity_code.rb
CHANGED
@@ -1,28 +1,29 @@
|
|
1
1
|
require 'identity_code/version'
|
2
2
|
require 'identity_code/ee'
|
3
3
|
require 'identity_code/lv'
|
4
|
+
require 'identity_code/pl'
|
4
5
|
|
5
6
|
module IdentityCode
|
6
7
|
NUM_DAYS = {
|
7
|
-
1
|
8
|
-
2
|
9
|
-
3
|
10
|
-
4
|
11
|
-
5
|
12
|
-
6
|
13
|
-
7
|
14
|
-
8
|
15
|
-
9
|
8
|
+
1 => 31,
|
9
|
+
2 => 28,
|
10
|
+
3 => 31,
|
11
|
+
4 => 30,
|
12
|
+
5 => 31,
|
13
|
+
6 => 30,
|
14
|
+
7 => 31,
|
15
|
+
8 => 31,
|
16
|
+
9 => 30,
|
16
17
|
10 => 31,
|
17
18
|
11 => 30,
|
18
19
|
12 => 31
|
19
20
|
}.freeze
|
20
21
|
|
21
|
-
SUPPORTED_COUNTRY_CODES = %i(ee lv).freeze
|
22
|
+
SUPPORTED_COUNTRY_CODES = %i(ee lv pl).freeze
|
22
23
|
|
23
24
|
def self.generate(opts = {})
|
24
25
|
country_code = opts[:country]
|
25
|
-
raise 'Country param is missing or invalid (ee
|
26
|
+
raise 'Country param is missing or invalid (ee | lv | pl)' unless begin
|
26
27
|
country_code &&
|
27
28
|
SUPPORTED_COUNTRY_CODES.include?(country_code.downcase.to_sym)
|
28
29
|
end
|
@@ -32,7 +33,7 @@ module IdentityCode
|
|
32
33
|
|
33
34
|
def self.valid?(opts = {})
|
34
35
|
country_code = opts.delete(:country)
|
35
|
-
raise 'Country param is missing or invalid (ee
|
36
|
+
raise 'Country param is missing or invalid (ee | lv | pl)' unless begin
|
36
37
|
country_code &&
|
37
38
|
SUPPORTED_COUNTRY_CODES.include?(country_code.downcase.to_sym)
|
38
39
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: identitycode
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Artem Pakk
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-03-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '1.
|
19
|
+
version: '1.11'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '1.
|
26
|
+
version: '1.11'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -38,7 +38,8 @@ dependencies:
|
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '10.0'
|
41
|
-
description: Ruby gem to generate and validate Estonian and
|
41
|
+
description: Ruby gem to generate and validate Estonian, Latvian, and Polish identity
|
42
|
+
codes
|
42
43
|
email:
|
43
44
|
- apakk@me.com
|
44
45
|
executables: []
|
@@ -57,6 +58,7 @@ files:
|
|
57
58
|
- lib/identity_code.rb
|
58
59
|
- lib/identity_code/ee.rb
|
59
60
|
- lib/identity_code/lv.rb
|
61
|
+
- lib/identity_code/pl.rb
|
60
62
|
- lib/identity_code/version.rb
|
61
63
|
homepage: https://github.com/defeed/identitycode
|
62
64
|
licenses:
|
@@ -81,5 +83,6 @@ rubyforge_project:
|
|
81
83
|
rubygems_version: 2.5.1
|
82
84
|
signing_key:
|
83
85
|
specification_version: 4
|
84
|
-
summary: Ruby gem to generate and validate Estonian and
|
86
|
+
summary: Ruby gem to generate and validate Estonian, Latvian, and Polish identity
|
87
|
+
codes
|
85
88
|
test_files: []
|