egn 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/egn.gemspec CHANGED
@@ -20,4 +20,5 @@ Gem::Specification.new do |spec|
20
20
 
21
21
  spec.add_development_dependency "bundler", "~> 1.3"
22
22
  spec.add_development_dependency "rake"
23
+ spec.add_development_dependency "rspec", "~> 2.6"
23
24
  end
@@ -0,0 +1,46 @@
1
+ module Egn
2
+ module Generator
3
+
4
+ PARITY_WEIGHTS = [2,4,8,5,10,9,7,3,6]
5
+
6
+ def self.egn
7
+ date = time_rand
8
+ year = date.year
9
+ mon = date.month
10
+ day = date.day
11
+
12
+ cent = year - (year % 100)
13
+ sex = Random.rand(1..2)
14
+
15
+ if cent == 1800
16
+ mon += 20
17
+ elsif cent == 2000
18
+ mon += 40
19
+ end
20
+
21
+ region = Random.rand(0..999)
22
+
23
+ if sex == 1 && (region %2 != 0)
24
+ region -= 1
25
+ elsif sex == 2 && (region % 2 == 0)
26
+ region += 1
27
+ end
28
+
29
+ final_year = year - cent
30
+ egn = final_year.to_s.rjust(2, '0') + mon.to_s.rjust(2, '0') + day.to_s.rjust(2,'0') + region.to_s.rjust(3,'0')
31
+
32
+ return egn + egn_checksum(egn).to_s
33
+ end
34
+
35
+ def self.egn_checksum(egn)
36
+ sum = egn.split('').map(&:to_i).zip(PARITY_WEIGHTS).map { |n| n.reduce(:*) }.reduce(:+)
37
+
38
+ rest = sum % 11
39
+ rest < 10 ? rest : 0
40
+ end
41
+
42
+ def self.time_rand(from = 0.0, to = Time.now)
43
+ Time.at(from + rand * (to.to_f - from.to_f))
44
+ end
45
+ end
46
+ end
data/lib/egn/parser.rb ADDED
@@ -0,0 +1,35 @@
1
+ module Egn
2
+ class Parser
3
+
4
+ def initialize(egn)
5
+ return ArgumentError, 'invalid length (should == 10)' unless egn.length == 10
6
+
7
+ @year, @month, @day = egn.scan(/.{1,2}/)
8
+ @month = @month.to_i
9
+ @day = @day.to_i
10
+
11
+ case @month
12
+ when (1..12)
13
+ @year = "19#{@year}"
14
+ when (21..32)
15
+ @month -= 20
16
+ @year = "18#{@year}"
17
+ when (41..52)
18
+ @month -= 40
19
+ @year = "20#{@year}"
20
+ end
21
+ @year = @year.to_i
22
+
23
+ raise ArgumentError, "invalid date" unless Date.valid_date? @year, @month, @day
24
+ end
25
+
26
+ def birth_date
27
+ Date.parse("#{@year}-#{@month}-#{@day}")
28
+ end
29
+
30
+ def gender
31
+
32
+ end
33
+
34
+ end
35
+ end
@@ -0,0 +1,31 @@
1
+ module Egn
2
+ module Validator
3
+
4
+ def self.egn(egn)
5
+ return false unless egn.length == 10
6
+
7
+ year, month, day = egn.scan(/.{1,2}/)
8
+ month = month.to_i
9
+ day = day.to_i
10
+
11
+ case month
12
+ when (1..12)
13
+ year = "19#{year}"
14
+ when (21..32)
15
+ month -= 20
16
+ year = "18#{year}"
17
+ when (41..52)
18
+ month -= 40
19
+ year = "20#{year}"
20
+ end
21
+ year = year.to_i
22
+
23
+ return false unless Date.valid_date? year, month, day
24
+
25
+ checksum = Generator.egn_checksum egn[0,9]
26
+
27
+ checksum == egn[9].to_i
28
+ end
29
+
30
+ end
31
+ end
data/lib/egn/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Egn
2
- VERSION = "0.1.1"
2
+ VERSION = "0.2.0"
3
3
  end
data/lib/egn.rb CHANGED
@@ -1,109 +1,22 @@
1
- require "egn/version"
2
1
  require "date"
3
2
 
4
- module Egn
5
- PARITY_WEIGHTS = [2,4,8,5,10,9,7,3,6]
6
-
7
- module Generator
8
- def self.egn
9
- date = time_rand
10
- year = date.year
11
- mon = date.month
12
- day = date.day
13
-
14
- cent = year - (year % 100)
15
- sex = Random.rand(1..2)
16
-
17
- if cent == 1800
18
- mon += 20
19
- elsif cent == 2000
20
- mon += 40
21
- end
22
-
23
- region = Random.rand(0..999)
24
-
25
- if sex == 1 && (region %2 != 0)
26
- region -= 1
27
- elsif sex == 2 && (region % 2 == 0)
28
- region += 1
29
- end
30
-
31
- final_year = year - cent
32
- egn = final_year.to_s.rjust(2, '0') + mon.to_s.rjust(2, '0') + day.to_s.rjust(2,'0') + region.to_s.rjust(3,'0')
33
-
34
- return egn + egn_checksum(egn).to_s
35
- end
36
-
37
- def self.egn_checksum(egn)
38
- sum = egn.split('').map(&:to_i).zip(PARITY_WEIGHTS).map { |n| n.reduce(:*) }.reduce(:+)
39
-
40
- rest = sum % 11
41
- rest < 10 ? rest : 0
42
- end
3
+ require "egn/generator"
4
+ require "egn/parser"
5
+ require "egn/validator"
6
+ require "egn/version"
43
7
 
44
- def self.time_rand(from = 0.0, to = Time.now)
45
- Time.at(from + rand * (to.to_f - from.to_f))
46
- end
8
+ module Egn
47
9
 
10
+ def self.generate
11
+ Generator.egn
48
12
  end
49
13
 
50
- module Validator
51
- def self.egn(egn)
52
- return false unless egn.length == 10
53
-
54
- year, month, day = egn.scan(/.{1,2}/)
55
- month = month.to_i
56
- day = day.to_i
57
-
58
- case month
59
- when (1..12)
60
- year = "19#{year}"
61
- when (21..32)
62
- month -= 20
63
- year = "20#{year}"
64
- when (41..52)
65
- month -= 40
66
- year = "18#{year}"
67
- end
68
- year = year.to_i
69
-
70
- return false unless Date.valid_date? year, month, day
71
-
72
- checksum = Generator.egn_checksum egn[0,9]
73
-
74
- checksum == egn[9].to_i
75
- end
76
-
14
+ def self.validate(egn)
15
+ Validator.egn(egn)
77
16
  end
78
17
 
79
- class Parser
80
-
81
- def initialize(egn)
82
- return false unless egn.length == 10
83
-
84
- @year, @month, @day = egn.scan(/.{1,2}/)
85
- @month = @month.to_i
86
- @day = @day.to_i
87
-
88
- case @month
89
- when (1..12)
90
- @year = "19#{@year}"
91
- when (21..32)
92
- @month -= 20
93
- @year = "20#{@year}"
94
- when (41..52)
95
- @month -= 40
96
- @year = "18#{@year}"
97
- end
98
- @year = @year.to_i
99
-
100
- raise ArgumentError, "invalid date" unless Date.valid_date? @year, @month, @day
101
- end
102
-
103
- def birth_date
104
- Date.parse("#{@year}-#{@month}-#{@day}")
105
- end
106
-
18
+ def self.parse(egn)
19
+ Parser.new(egn)
107
20
  end
108
21
 
109
22
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: egn
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-10-25 00:00:00.000000000 Z
12
+ date: 2014-03-19 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -43,6 +43,22 @@ dependencies:
43
43
  - - ! '>='
44
44
  - !ruby/object:Gem::Version
45
45
  version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: rspec
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ~>
52
+ - !ruby/object:Gem::Version
53
+ version: '2.6'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: '2.6'
46
62
  description: Generator, validator and info parser for EGN/EIK numbers
47
63
  email:
48
64
  - gvmitrev@gmail.com
@@ -58,6 +74,9 @@ files:
58
74
  - Rakefile
59
75
  - egn.gemspec
60
76
  - lib/egn.rb
77
+ - lib/egn/generator.rb
78
+ - lib/egn/parser.rb
79
+ - lib/egn/validator.rb
61
80
  - lib/egn/version.rb
62
81
  homepage: https://github.com/gmitrev/egn
63
82
  licenses: