lib/egn.rb in egn-0.1.1 vs lib/egn.rb in egn-0.2.0
- old
+ new
@@ -1,109 +1,22 @@
-require "egn/version"
require "date"
+require "egn/generator"
+require "egn/parser"
+require "egn/validator"
+require "egn/version"
+
module Egn
- PARITY_WEIGHTS = [2,4,8,5,10,9,7,3,6]
- module Generator
- def self.egn
- date = time_rand
- year = date.year
- mon = date.month
- day = date.day
-
- cent = year - (year % 100)
- sex = Random.rand(1..2)
-
- if cent == 1800
- mon += 20
- elsif cent == 2000
- mon += 40
- end
-
- region = Random.rand(0..999)
-
- if sex == 1 && (region %2 != 0)
- region -= 1
- elsif sex == 2 && (region % 2 == 0)
- region += 1
- end
-
- final_year = year - cent
- 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')
-
- return egn + egn_checksum(egn).to_s
- end
-
- def self.egn_checksum(egn)
- sum = egn.split('').map(&:to_i).zip(PARITY_WEIGHTS).map { |n| n.reduce(:*) }.reduce(:+)
-
- rest = sum % 11
- rest < 10 ? rest : 0
- end
-
- def self.time_rand(from = 0.0, to = Time.now)
- Time.at(from + rand * (to.to_f - from.to_f))
- end
-
+ def self.generate
+ Generator.egn
end
- module Validator
- def self.egn(egn)
- return false unless egn.length == 10
-
- year, month, day = egn.scan(/.{1,2}/)
- month = month.to_i
- day = day.to_i
-
- case month
- when (1..12)
- year = "19#{year}"
- when (21..32)
- month -= 20
- year = "20#{year}"
- when (41..52)
- month -= 40
- year = "18#{year}"
- end
- year = year.to_i
-
- return false unless Date.valid_date? year, month, day
-
- checksum = Generator.egn_checksum egn[0,9]
-
- checksum == egn[9].to_i
- end
-
+ def self.validate(egn)
+ Validator.egn(egn)
end
- class Parser
-
- def initialize(egn)
- return false unless egn.length == 10
-
- @year, @month, @day = egn.scan(/.{1,2}/)
- @month = @month.to_i
- @day = @day.to_i
-
- case @month
- when (1..12)
- @year = "19#{@year}"
- when (21..32)
- @month -= 20
- @year = "20#{@year}"
- when (41..52)
- @month -= 40
- @year = "18#{@year}"
- end
- @year = @year.to_i
-
- raise ArgumentError, "invalid date" unless Date.valid_date? @year, @month, @day
- end
-
- def birth_date
- Date.parse("#{@year}-#{@month}-#{@day}")
- end
-
+ def self.parse(egn)
+ Parser.new(egn)
end
end