egn 1.3.1 → 1.3.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 +3 -3
- data/lib/egn/generator.rb +14 -12
- data/lib/egn/util.rb +5 -5
- data/lib/egn/validator.rb +1 -1
- data/lib/egn/version.rb +1 -1
- data/spec/egn/generator_spec.rb +8 -8
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6ece6e3fe8e7fc520d7833f9256610261b9e4622
|
4
|
+
data.tar.gz: 5ca30adca2f40f3731eee66d98b3a45e344025cc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 05ac63f17dc43b25e440243b54da13442795cf7a7c70303537110a0ed5ae4553c360fecc77e51ff16ecaf5a8c91514a30be0837917ddb3577755cbafbae5bcc7
|
7
|
+
data.tar.gz: 3f3180fb9357bc264e0a33f341b2316c1806a91cd99b240aa0dba99bb6d166f1c67c767d41a43c0eaf552ba5b5c15ad185b58c60b31b1f72bedb280ebb72dad7
|
data/README.md
CHANGED
@@ -57,13 +57,13 @@ Or install it yourself as:
|
|
57
57
|
egn.day
|
58
58
|
# => 10
|
59
59
|
|
60
|
-
egn.sex
|
60
|
+
egn.gender # egn.sex can also be used
|
61
61
|
# => :male
|
62
62
|
|
63
|
-
egn.
|
63
|
+
egn.gender(format: :char)
|
64
64
|
# => 'm'
|
65
65
|
|
66
|
-
egn.
|
66
|
+
egn.gender(format: :number)
|
67
67
|
# => 1
|
68
68
|
|
69
69
|
egn.valid?
|
data/lib/egn/generator.rb
CHANGED
@@ -15,10 +15,12 @@ module Egn
|
|
15
15
|
end
|
16
16
|
|
17
17
|
# The generated EGN will be completely random if no opitons are given.
|
18
|
-
# options is a hash that may have the following keys: :year, :month
|
18
|
+
# options is a hash that may have the following keys: :year, :month, :day, :gender
|
19
19
|
def generate
|
20
|
-
|
21
|
-
|
20
|
+
egn = format(options[:year]) +
|
21
|
+
format(options[:month]) +
|
22
|
+
format(options[:day]) +
|
23
|
+
format(options[:region], 3)
|
22
24
|
|
23
25
|
egn + Util.egn_checksum(egn).to_s
|
24
26
|
end
|
@@ -44,7 +46,7 @@ module Egn
|
|
44
46
|
raise ArgumentError, "Year out of bounds" if options[:year] && !(1800..2099).include?(options[:year])
|
45
47
|
raise ArgumentError, "Month out of bounds" if options[:month] && !(1..12).include?(options[:month])
|
46
48
|
raise ArgumentError, "Day out of bounds" if options[:day] && !(1..31).include?(options[:day])
|
47
|
-
raise ArgumentError, "
|
49
|
+
raise ArgumentError, "Gender should be one of #{genders}" if options[:gender] && !genders.include?(options[:gender])
|
48
50
|
end
|
49
51
|
|
50
52
|
# Random defaults
|
@@ -54,27 +56,27 @@ module Egn
|
|
54
56
|
year: date.year,
|
55
57
|
month: date.month,
|
56
58
|
day: date.day,
|
57
|
-
|
59
|
+
gender: genders.sample,
|
58
60
|
region: Random.rand(0..999)
|
59
61
|
}
|
60
62
|
end
|
61
63
|
|
62
64
|
def process!
|
63
|
-
# Get random century, region and
|
65
|
+
# Get random century, region and gender
|
64
66
|
century = determine_century(options[:year])
|
65
67
|
|
66
68
|
options[:month] += month_delta(century)
|
67
69
|
|
68
|
-
options[:region] += region_delta(options[:
|
70
|
+
options[:region] += region_delta(options[:gender], options[:region])
|
69
71
|
|
70
72
|
options[:year] = options[:year] - century
|
71
73
|
end
|
72
74
|
|
73
|
-
# Recalculate region based on
|
74
|
-
def region_delta(
|
75
|
-
if
|
75
|
+
# Recalculate region based on gender
|
76
|
+
def region_delta(gender, region)
|
77
|
+
if gender == :male && region.odd?
|
76
78
|
-1
|
77
|
-
elsif
|
79
|
+
elsif gender == :female && region.even?
|
78
80
|
1
|
79
81
|
else
|
80
82
|
0
|
@@ -95,7 +97,7 @@ module Egn
|
|
95
97
|
year - (year % 100)
|
96
98
|
end
|
97
99
|
|
98
|
-
def
|
100
|
+
def genders
|
99
101
|
[:male, :female]
|
100
102
|
end
|
101
103
|
|
data/lib/egn/util.rb
CHANGED
@@ -3,12 +3,12 @@ module Egn
|
|
3
3
|
module Util
|
4
4
|
WEIGHTS = [2,4,8,5,10,9,7,3,6]
|
5
5
|
|
6
|
-
# The EGN can have three different formats depending on the century. It can
|
6
|
+
# The EGN can have three different formats depending on the century. It can
|
7
7
|
# be determined by examining the month.
|
8
8
|
# The rules are as follows:
|
9
9
|
# * For people born in 1900..1999 the month does not change
|
10
|
-
# * For people born in 1800..1899 the month
|
11
|
-
# * For people born in 2000..2099 the month
|
10
|
+
# * For people born in 1800..1899 the month increases by 20 (e.g January is 21)
|
11
|
+
# * For people born in 2000..2099 the month increases by 40 (e.g December is 52)
|
12
12
|
def self.determine_date(year, month)
|
13
13
|
case month
|
14
14
|
when (1..12)
|
@@ -24,9 +24,9 @@ module Egn
|
|
24
24
|
[year.to_i, month]
|
25
25
|
end
|
26
26
|
|
27
|
-
#
|
27
|
+
# More information on the formula: http://www.grao.bg/esgraon.html
|
28
28
|
def self.egn_checksum(egn)
|
29
|
-
sum = egn.
|
29
|
+
sum = egn.chars.map(&:to_i).zip(WEIGHTS).map { |n| n.reduce(:*) }.reduce(:+)
|
30
30
|
|
31
31
|
rest = sum % 11
|
32
32
|
rest < 10 ? rest : 0
|
data/lib/egn/validator.rb
CHANGED
data/lib/egn/version.rb
CHANGED
data/spec/egn/generator_spec.rb
CHANGED
@@ -22,7 +22,7 @@ describe Egn::Generator do
|
|
22
22
|
|
23
23
|
context "invoked with arguments" do
|
24
24
|
it "generates a new EGN considering the given options" do
|
25
|
-
number = Egn::Generator.generate(year: 1990, month: 12, day: 30,
|
25
|
+
number = Egn::Generator.generate(year: 1990, month: 12, day: 30, gender: :male)
|
26
26
|
egn = Egn::Egn.new(number)
|
27
27
|
|
28
28
|
expect(egn).to be_valid
|
@@ -58,22 +58,22 @@ describe Egn::Generator do
|
|
58
58
|
end
|
59
59
|
|
60
60
|
it "generates female EGNs" do
|
61
|
-
number = Egn::Generator.generate(
|
61
|
+
number = Egn::Generator.generate(gender: :female)
|
62
62
|
egn = Egn::Egn.new(number)
|
63
63
|
|
64
|
-
expect(egn.
|
64
|
+
expect(egn.gender).to eq(:female)
|
65
65
|
end
|
66
66
|
|
67
67
|
it "generates male EGNs" do
|
68
|
-
number = Egn::Generator.generate(
|
68
|
+
number = Egn::Generator.generate(gender: :male)
|
69
69
|
egn = Egn::Egn.new(number)
|
70
70
|
|
71
|
-
expect(egn.
|
71
|
+
expect(egn.gender).to eq(:male)
|
72
72
|
end
|
73
73
|
|
74
74
|
it "validates the options" do
|
75
75
|
|
76
|
-
options = {year: 1960, month: 6, day: 3,
|
76
|
+
options = {year: 1960, month: 6, day: 3, gender: :male, region: 333}
|
77
77
|
|
78
78
|
Egn::Generator.any_instance.should_receive(:validate!)
|
79
79
|
|
@@ -103,9 +103,9 @@ describe Egn::Generator do
|
|
103
103
|
}.to raise_error ArgumentError
|
104
104
|
end
|
105
105
|
|
106
|
-
it "raises an exception if invalid
|
106
|
+
it "raises an exception if invalid gender is given" do
|
107
107
|
expect{
|
108
|
-
Egn::Generator.generate(
|
108
|
+
Egn::Generator.generate(gender: :none)
|
109
109
|
}.to raise_error ArgumentError
|
110
110
|
end
|
111
111
|
|