license-validator 0.0.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) hide show
  1. checksums.yaml +4 -4
  2. data/lib/license-validator.rb +112 -0
  3. data/lib/license_validator/driver.rb +69 -0
  4. data/lib/license_validator/states.rb +14 -0
  5. data/lib/license_validator/validations/base.rb +63 -0
  6. data/lib/license_validator/validations/state_ak.rb +24 -0
  7. data/lib/license_validator/validations/state_al.rb +28 -0
  8. data/lib/license_validator/validations/state_ar.rb +20 -0
  9. data/lib/license_validator/validations/state_az.rb +32 -0
  10. data/lib/license_validator/validations/state_ca.rb +20 -0
  11. data/lib/license_validator/validations/state_co.rb +24 -0
  12. data/lib/license_validator/validations/state_ct.rb +41 -0
  13. data/lib/license_validator/validations/state_dc.rb +24 -0
  14. data/lib/license_validator/validations/state_de.rb +16 -0
  15. data/lib/license_validator/validations/state_fl.rb +16 -0
  16. data/lib/license_validator/validations/state_ga.rb +28 -0
  17. data/lib/license_validator/validations/state_hi.rb +28 -0
  18. data/lib/license_validator/validations/state_ia.rb +23 -0
  19. data/lib/license_validator/validations/state_id.rb +28 -0
  20. data/lib/license_validator/validations/state_il.rb +16 -0
  21. data/lib/license_validator/validations/state_in.rb +16 -0
  22. data/lib/license_validator/validations/state_ks.rb +26 -0
  23. data/lib/license_validator/validations/state_ky.rb +20 -0
  24. data/lib/license_validator/validations/state_la.rb +16 -0
  25. data/lib/license_validator/validations/state_ma.rb +23 -0
  26. data/lib/license_validator/validations/state_md.rb +23 -0
  27. data/lib/license_validator/validations/state_me.rb +16 -0
  28. data/lib/license_validator/validations/state_mi.rb +16 -0
  29. data/lib/license_validator/validations/state_mn.rb +16 -0
  30. data/lib/license_validator/validations/state_mo.rb +32 -0
  31. data/lib/license_validator/validations/state_ms.rb +16 -0
  32. data/lib/license_validator/validations/state_mt.rb +42 -0
  33. data/lib/license_validator/validations/state_nc.rb +24 -0
  34. data/lib/license_validator/validations/state_nd.rb +20 -0
  35. data/lib/license_validator/validations/state_ne.rb +16 -0
  36. data/lib/license_validator/validations/state_nh.rb +31 -0
  37. data/lib/license_validator/validations/state_nj.rb +16 -0
  38. data/lib/license_validator/validations/state_nm.rb +16 -0
  39. data/lib/license_validator/validations/state_nv.rb +21 -0
  40. data/lib/license_validator/validations/state_ny.rb +32 -0
  41. data/lib/license_validator/validations/state_oh.rb +20 -0
  42. data/lib/license_validator/validations/state_ok.rb +20 -0
  43. data/lib/license_validator/validations/state_or.rb +26 -0
  44. data/lib/license_validator/validations/state_pa.rb +20 -0
  45. data/lib/license_validator/validations/state_ri.rb +20 -0
  46. data/lib/license_validator/validations/state_sc.rb +16 -0
  47. data/lib/license_validator/validations/state_sd.rb +20 -0
  48. data/lib/license_validator/validations/state_tn.rb +20 -0
  49. data/lib/license_validator/validations/state_tx.rb +24 -0
  50. data/lib/license_validator/validations/state_ut.rb +16 -0
  51. data/lib/license_validator/validations/state_va.rb +16 -0
  52. data/lib/license_validator/validations/state_vt.rb +16 -0
  53. data/lib/license_validator/validations/state_wa.rb +23 -0
  54. data/lib/license_validator/validations/state_wi.rb +16 -0
  55. data/lib/license_validator/validations/state_wv.rb +27 -0
  56. data/lib/license_validator/validations/state_wy.rb +16 -0
  57. data/lib/license_validator/validators.rb +5 -0
  58. data/lib/license_validator/version.rb +1 -1
  59. metadata +85 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f87d7f82477a2235831fa7bde0b2571cc60cc497968c032025d4de7009685d87
4
- data.tar.gz: 49b4763e53ae8eb56ced5a57835e45f879d687fffd5be4ed9740ecbca8f34aaf
3
+ metadata.gz: 765d257c1c164253fc920091c417c0b23315ddee7e4d1be7cf2b53d0afa31e53
4
+ data.tar.gz: 9cdb4da632bdacc45fdeec2b0532e9b747f0b92f60646cf3f2779af52f6520a8
5
5
  SHA512:
6
- metadata.gz: 5c114aa2a168430f45c70f9fac41885a989b15800d6bea4cc20c91b9ed99ce185f6454fbf410ae06affe540347fad02150327e3c91ed62db96acc41567b59528
7
- data.tar.gz: d24b0a625aadc735460faadee07e3b086706bef76a4ffaa074e7a3cc6288b3bf4e49ac81e85786345c5065a555c262d38fc0275a475a1d05b318f833d7436f36
6
+ metadata.gz: 8397c4a34805f88648398cf4a2e9787255b803413f88e13c37d4d2aa81d99df5b4b9c5544bb5b6f938d7d5afc51515d891d232f5a4d300af8b858856f91449f1
7
+ data.tar.gz: 273c364371d31a1810e29446786c46326b1385438a58cad2448ec61ecf170564f71e2b34da9e7467b0bd01ea98d837cda73d330408df39292cdf6072b0916f72
@@ -1,6 +1,118 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'active_model'
4
+
5
+ require_relative 'license_validator/states'
6
+
7
+ require_relative 'license_validator/driver'
8
+ require_relative 'license_validator/validators'
3
9
  require_relative 'license_validator/version'
4
10
 
5
11
  module LicenseValidator
12
+ # Validates the provided driver's DL#
13
+ #
14
+ # @raise [ActiveModel::ValidationError] if driver is invalid
15
+ #
16
+ # @see LicenseValidator::Driver#new params
17
+ #
18
+ # @return [Hash]
19
+ #
20
+ def validate!(**kwargs)
21
+ driver = LicenseValidator::Driver.new(**kwargs)
22
+
23
+ validator =
24
+ LicenseValidator::Validations
25
+ .const_get("LicenseValidator::Validations::State#{driver.state.capitalize}")
26
+ .new(driver)
27
+
28
+ validator.validate
29
+
30
+ return validator.validation_results
31
+ end
32
+
33
+ module_function :validate!
34
+
35
+ private
36
+
37
+ # Only for development
38
+ def generate_state_files
39
+ LicenseValidator::States::ABVS.each do |abv|
40
+ ruby = <<~RUBY
41
+ # frozen_string_literal: true
42
+
43
+ module LicenseValidator
44
+ module Validations
45
+ class State#{abv.capitalize} < LicenseValidator::Validations::Base
46
+ def initialize(driver)
47
+ super(driver)
48
+ end
49
+
50
+ # @see super
51
+ def validate
52
+ super
53
+ end
54
+ end
55
+ end
56
+ end
57
+ RUBY
58
+
59
+ File.write("lib/license_validator/validations/state_#{abv.downcase}.rb", ruby)
60
+ end
61
+ end
62
+
63
+ module_function :generate_state_files
64
+
65
+ # Only for development
66
+ def generate_test_files
67
+ LicenseValidator::States::ABVS.each do |abv|
68
+ test = <<~SPEC
69
+ # frozen_string_literal: true
70
+
71
+ state_klass = LicenseValidator::Validations::State#{abv.capitalize}
72
+
73
+ module ValidAttributes
74
+ module State#{abv.capitalize}
75
+ # @see super
76
+ def valid_attributes
77
+ super.map do |valid_attrs|
78
+ valid_attrs
79
+ end
80
+ end
81
+
82
+ # @see super
83
+ def invalid_attributes
84
+ super.map do |invalid_attrs|
85
+ invalid_attrs
86
+ end
87
+ end
88
+
89
+ private
90
+
91
+ # @see super
92
+ def valid_license_nums
93
+ %w[AB123456]
94
+ end
95
+
96
+ # @see super
97
+ def invalid_license_nums
98
+ %w[AB]
99
+ end
100
+
101
+ # @see super
102
+ def state
103
+ '#{abv}'
104
+ end
105
+ end
106
+ end
107
+
108
+ state_klass.extend(ValidAttributes::State#{abv.capitalize})
109
+
110
+ test_klass(state_klass)
111
+ SPEC
112
+
113
+ File.write("spec/license_validator/validations/state_#{abv.downcase}_spec.rb", test)
114
+ end
115
+ end
116
+
117
+ module_function :generate_test_files
6
118
  end
@@ -0,0 +1,69 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LicenseValidator
4
+ class Driver
5
+ include ActiveModel::Model
6
+
7
+ validates :age, numericality: { greater_than_or_equal_to: 0 }, if: -> (d) { d.dob.present? }
8
+ validates :cdl_class, inclusion: { in: ['A', 'B', 'No CDL'], message: 'is invalid' }
9
+ validates :license_num, presence: true
10
+ validates :state, inclusion: { in: LicenseValidator::States::ABVS, message: 'is invalid' }
11
+ validates :years_exp, numericality: { greater_than_or_equal_to: 0 }
12
+
13
+ # @return [Integer]
14
+ attr_accessor :age
15
+ # @return [Boolean]
16
+ attr_accessor :bad
17
+ # @return [String]
18
+ attr_accessor :cdl_class
19
+ # @return [Date]
20
+ attr_accessor :dob
21
+ # @return [String]
22
+ attr_accessor :first_name
23
+ # @return [String]
24
+ attr_accessor :last_name
25
+ # @return [String]
26
+ attr_accessor :license_num
27
+ # @return [String] abv
28
+ attr_accessor :state
29
+ # @return [Integer]
30
+ attr_accessor :years_exp
31
+
32
+ # @see super
33
+ def self.human_attribute_name(attr, options = {})
34
+ return 'CDL Class' if attr == 'cdl_class'
35
+
36
+ return 'License #' if attr == 'license_num'
37
+
38
+ super
39
+ end
40
+
41
+ # @param attributes [Hash]
42
+ def initialize(attributes = {})
43
+ super
44
+
45
+ if dob.blank? && !dob.is_a?(Date)
46
+ @dob = nil
47
+ end
48
+
49
+ @license_num = license_num.to_s
50
+
51
+ validate!
52
+ end
53
+
54
+ # @return [Hash]
55
+ def attributes
56
+ {
57
+ state: state,
58
+ years_exp: years_exp,
59
+ dob: dob,
60
+ age: age,
61
+ cdl_class: cdl_class,
62
+ license_num: license_num,
63
+ first_name: first_name,
64
+ last_name: last_name,
65
+ bad: bad
66
+ }
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LicenseValidator
4
+ module States
5
+ ABVS = %w[
6
+ AK AL AR AZ CA CO CT DE FL GA
7
+ HI IA ID IL IN KS KY LA MA MD
8
+ ME MI MN MO MS MT NC ND NE NH
9
+ NJ NM NV NY OH OK OR PA RI SC
10
+ SD TN TX UT VA VT WA WI WV WY
11
+ DC
12
+ ].freeze
13
+ end
14
+ end
@@ -0,0 +1,63 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LicenseValidator
4
+ module Validations
5
+ class Base
6
+ # @return [LicenseValidator::Driver]
7
+ attr_accessor :driver
8
+ # @return [ActiveModel::Errors]
9
+ attr_accessor :errors
10
+ # @return [ActiveModel::Errors]
11
+ attr_accessor :infos
12
+ # @return [ActiveModel::Errors]
13
+ attr_accessor :warnings
14
+
15
+ # @param driver [LicenseValidator::Driver]
16
+ def initialize(driver)
17
+ @errors = ActiveModel::Errors.new(self)
18
+ @warnings = ActiveModel::Errors.new(self)
19
+ @infos = ActiveModel::Errors.new(self)
20
+
21
+ @driver = driver
22
+ end
23
+
24
+ # Common validations
25
+ def validate
26
+ return if driver.dob.nil?
27
+
28
+ age = driver.age
29
+
30
+ if age < 21
31
+ warnings.add(:dob, 'Drivers under 21 do not qualify for an interstate CDL.')
32
+ elsif age < 23
33
+ warnings.add(
34
+ :dob,
35
+ 'Drivers under 23 are underage for all markets unless underwriters have specifically approved.'
36
+ )
37
+ elsif age > 65
38
+ warnings.add(
39
+ :dob,
40
+ [
41
+ 'Drivers is older than 65, check underwriting guidelines to determine if they should be submitted',
42
+ 'for approval.'
43
+ ].join(' ')
44
+ )
45
+ end
46
+
47
+ return unless driver.bad
48
+
49
+ warnings.add(:bad, 'Driver is on the bad drivers list.')
50
+ end
51
+
52
+ # @return [Hash]
53
+ def validation_results
54
+ {
55
+ errors: errors,
56
+ warnings: warnings,
57
+ infos: infos,
58
+ validated_with: driver.attributes
59
+ }
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LicenseValidator
4
+ module Validations
5
+ class StateAk < LicenseValidator::Validations::Base
6
+ # @see super
7
+ def validate
8
+ super
9
+
10
+ unless driver.license_num.match?(/\A\d{7}\z/i)
11
+ errors.add(:license_num, 'License number requires 7 numeric digits for AK.')
12
+ end
13
+
14
+ if driver.last_name.blank?
15
+ errors.add(:last_name, 'Last name required for AK.')
16
+ end
17
+
18
+ return if driver.dob.present?
19
+
20
+ errors.add(:dob, 'D.O.B. required for AK.')
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LicenseValidator
4
+ module Validations
5
+ class StateAl < LicenseValidator::Validations::Base
6
+ # @see super
7
+ def validate
8
+ super
9
+
10
+ lic_num = driver.license_num
11
+
12
+ return if lic_num.match?(/\A\d{7,8}\z/i)
13
+
14
+ return if lic_num.match?(/\A[a-z]\d{6,8}\z/i)
15
+
16
+ return if lic_num.match?(/\AID\d{5,6}\z/i)
17
+
18
+ errors.add(
19
+ :license_num,
20
+ [
21
+ 'License number requires 7-8 Numeric or "I", 6-8 Numeric or "ID", 5-6 Numeric or 1 Alphabetic, 6-8 Numeric',
22
+ 'for AL'
23
+ ].join(' ')
24
+ )
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LicenseValidator
4
+ module Validations
5
+ class StateAr < LicenseValidator::Validations::Base
6
+ # @see super
7
+ def validate
8
+ super
9
+
10
+ unless driver.license_num.match?(/\A\d{9}\z/i)
11
+ errors.add(:license_num, 'License number requires 9 numeric digits for AR.')
12
+ end
13
+
14
+ return if driver.dob.present?
15
+
16
+ errors.add(:dob, 'D.O.B. is required for AR.')
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LicenseValidator
4
+ module Validations
5
+ class StateAz < LicenseValidator::Validations::Base
6
+ # @see super
7
+ def validate
8
+ super
9
+
10
+ if driver.last_name.blank?
11
+ errors.add(:last_name, 'Last name required for AZ.')
12
+ end
13
+
14
+ if driver.first_name.blank?
15
+ errors.add(:first_name, 'First name required for AZ.')
16
+ end
17
+
18
+ if driver.dob.blank?
19
+ errors.add(:dob, 'D.O.B. required for AZ.')
20
+ end
21
+
22
+ lic_num = driver.license_num
23
+
24
+ return if lic_num.match?(/\A[a-z]\d{8}\z/i)
25
+
26
+ return if lic_num.match?(/\A\d{9}\z/i)
27
+
28
+ errors.add(:license_num, 'License number requires 1 Alphabetic, 8 Numeric or 9 Numeric for AZ.')
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LicenseValidator
4
+ module Validations
5
+ class StateCa < LicenseValidator::Validations::Base
6
+ # @see super
7
+ def validate
8
+ super
9
+
10
+ unless driver.license_num.match?(/\A[a-z]\d{7}\z/i)
11
+ errors.add(:license_num, 'License number requires 1 Alphabetic, 7 Numeric for CA.')
12
+ end
13
+
14
+ return if driver.last_name.present?
15
+
16
+ errors.add(:last_name, 'Last name required for CA.')
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LicenseValidator
4
+ module Validations
5
+ class StateCo < LicenseValidator::Validations::Base
6
+ # @see super
7
+ def validate
8
+ super
9
+
10
+ if driver.dob.blank?
11
+ errors.add(:dob, 'D.O.B. is required for CO.')
12
+ end
13
+
14
+ lic_num = driver.license_num
15
+
16
+ return if lic_num.match?(/\A\d{9}\z/i)
17
+
18
+ return if lic_num.match?(/\A[a-z]\d{3,6}\z/i)
19
+
20
+ errors.add(:license_num, 'License number requires 9 numeric or 1 alphabetic, 3-6 numeric for CO.')
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LicenseValidator
4
+ module Validations
5
+ class StateCt < LicenseValidator::Validations::Base
6
+ # @see super
7
+ def validate
8
+ super
9
+
10
+ if driver.last_name.blank?
11
+ errors.add(:last_name, 'Last name required for CT.')
12
+ end
13
+
14
+ # 9 Numeric, 1st two positions are month of birth in odd or
15
+ # even year. 01-12 Jan-Dec odd years, 13 - 24 Jan-Dec even years, 99 unknown
16
+
17
+ if driver.dob.blank?
18
+ errors.add(:dob, 'D.O.B. is required for CT.')
19
+
20
+ return
21
+ end
22
+
23
+ year = driver.dob.year
24
+ month = driver.dob.month
25
+
26
+ month += 12 if year.even?
27
+
28
+ month = "#{0 if month < 10}#{month}"
29
+
30
+ regex = Regexp.new("\\A#{month}\\d{7}\\z", 'i')
31
+
32
+ return if driver.license_num.match?(regex)
33
+
34
+ errors.add(
35
+ :license_num,
36
+ "License number requires 9 numeric for CT. For DOB in #{year}, license number must start with #{month}"
37
+ )
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LicenseValidator
4
+ module Validations
5
+ class StateDc < LicenseValidator::Validations::Base
6
+ # @see super
7
+ def validate
8
+ super
9
+
10
+ unless driver.license_num.match?(/\A[a-z0-9]{7,9}\z/i)
11
+ errors.add(:license_num, 'License number requires 7-9 alphanumeric for DC.')
12
+ end
13
+
14
+ if driver.last_name.blank?
15
+ errors.add(:last_name, 'Last name required for DC.')
16
+ end
17
+
18
+ return if driver.dob.present?
19
+
20
+ errors.add(:dob, 'D.O.B. required for DC.')
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LicenseValidator
4
+ module Validations
5
+ class StateDe < LicenseValidator::Validations::Base
6
+ # @see super
7
+ def validate
8
+ super
9
+
10
+ return if driver.license_num.match?(/\A\d{1,7}\z/i)
11
+
12
+ errors.add(:license_num, 'License requires 1-7 numeric for DE.')
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LicenseValidator
4
+ module Validations
5
+ class StateFl < LicenseValidator::Validations::Base
6
+ # @see super
7
+ def validate
8
+ super
9
+
10
+ return if driver.license_num.match?(/\A[a-zA-Z]\d{12}\z/i)
11
+
12
+ errors.add(:license_num, 'License number requires 1 alphabetic and 12 numeric for FL.')
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LicenseValidator
4
+ module Validations
5
+ class StateGa < LicenseValidator::Validations::Base
6
+ # @see super
7
+ def validate
8
+ super
9
+
10
+ unless driver.license_num.match?(/\A\d{9}\z/i)
11
+ errors.add(:license_num, 'License number requires 9 numeric digits for GA.')
12
+ end
13
+
14
+ if driver.first_name.blank?
15
+ errors.add(:first_name, 'First name required for GA.')
16
+ end
17
+
18
+ if driver.last_name.blank?
19
+ errors.add(:last_name, 'Last name required for GA.')
20
+ end
21
+
22
+ return if driver.dob.present?
23
+
24
+ errors.add(:dob, 'D.O.B. required for GA.')
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LicenseValidator
4
+ module Validations
5
+ class StateHi < LicenseValidator::Validations::Base
6
+ # @see super
7
+ def validate
8
+ super
9
+
10
+ if driver.last_name.blank?
11
+ errors.add(:last_name, 'Last name required for HI.')
12
+ end
13
+
14
+ if driver.dob.blank?
15
+ errors.add(:dob, 'D.O.B. required for HI.')
16
+ end
17
+
18
+ lic_num = driver.license_num
19
+
20
+ return if lic_num.match?(/\A\d{9}\z/i)
21
+
22
+ return if lic_num.match?(/\AH\d{8}\z/i)
23
+
24
+ errors.add(:license_num, 'License number needs 9 numeric or "H", 8 numeric for HI.')
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LicenseValidator
4
+ module Validations
5
+ class StateIa < LicenseValidator::Validations::Base
6
+ # @see super
7
+ def validate
8
+ super
9
+
10
+ lic_num = driver.license_num
11
+
12
+ return if lic_num.match?(/\A\d{3}[a-z]{2}\d{4}\z/i)
13
+
14
+ return if lic_num.match?(/\A\d{9}\z/i)
15
+
16
+ errors.add(
17
+ :license_num,
18
+ 'License number requires 3 Numeric and 2 Alphabetic and 4 Numeric, or 9 numeric for IA.'
19
+ )
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LicenseValidator
4
+ module Validations
5
+ class StateId < LicenseValidator::Validations::Base
6
+ # @see super
7
+ def validate
8
+ super
9
+
10
+ if driver.last_name.blank?
11
+ errors.add(:last_name, 'Last name required for ID.')
12
+ end
13
+
14
+ if driver.dob.blank?
15
+ errors.add(:dob, 'D.O.B. required for ID.')
16
+ end
17
+
18
+ lic_num = driver.license_num
19
+
20
+ return if lic_num.match?(/\A[a-z]{2}\d{6}[a-z]\z/i)
21
+
22
+ return if lic_num.match?(/\A\d{9}\z/i)
23
+
24
+ errors.add(:license_num, 'License number requires 2 Alphabetic, 6 Numeric, 1 Alphabetic or 9 Numeric for ID.')
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LicenseValidator
4
+ module Validations
5
+ class StateIl < LicenseValidator::Validations::Base
6
+ # @see super
7
+ def validate
8
+ super
9
+
10
+ return if driver.license_num.match?(/\A[a-z]\d{11}\z/i)
11
+
12
+ errors.add(:license_num, 'License number requires 1 alphabetic and 11 numeric for IL.')
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LicenseValidator
4
+ module Validations
5
+ class StateIn < LicenseValidator::Validations::Base
6
+ # @see super
7
+ def validate
8
+ super
9
+
10
+ return if driver.license_num.match?(/\A\d{10}\z/i)
11
+
12
+ errors.add(:license_num, 'License number requires 10 numeric digits for IN.')
13
+ end
14
+ end
15
+ end
16
+ end