uk_validators 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -1,8 +1,9 @@
1
1
  # UK Validators
2
2
 
3
- This library contains validators for the following UK-centric data:
3
+ This library contains Rails 3 custom validators for the following UK-centric data:
4
4
 
5
5
  * National Insurance Number
6
+ * Post Code
6
7
 
7
8
 
8
9
  ## Installation
@@ -13,15 +14,73 @@ Add this line to your application's Gemfile:
13
14
 
14
15
  And then execute:
15
16
 
16
- $ bundle
17
+ $ bundle install
17
18
 
18
- ## Usage
19
19
 
20
- ### National Insurance Number (Nino)
20
+ ## National Insurance Number (Nino)
21
+ Validates the format of a UK National Insurance Number.
22
+
23
+ References: [HMRC](http://www.hmrc.gov.uk/manuals/nimmanual/nim39110.htm), [uk-osint.net](http://www.uk-osint.net/usefulbits.html#Understanding%20UK%20National%20Insurance%20Numbers), [Wikipedia](http://en.wikipedia.org/wiki/National_Insurance_number)
24
+
25
+ ### Usage
26
+
27
+ ```ruby
28
+ class User < ActiveRecord::Base
29
+ validates :ni_number, nino: true
30
+ end
31
+ ```
32
+
33
+ ### I18n
34
+
35
+ The default error message is `is not a valid National Insurance No.`
36
+
37
+ This can be translated in the same was as any other Rails validation message using the key **:nino**.
38
+
39
+ For the example User model above, the customised en.yml would be:
40
+
41
+ en:
42
+ activerecord:
43
+ errors:
44
+ models:
45
+ user:
46
+ attributes:
47
+ ni_number:
48
+ nino: "is not valid"
49
+
50
+
51
+
52
+ ## Post Code
53
+
54
+ Validates the format of a UK postal code. This does not check whether the post code actually exists as this would require a lookup against approx. 1.8 million postal codes.
55
+
56
+ References: [Royal Mail PAF Document](http://www.poweredbypaf.com/wp-content/themes/amu/paf_downloads/programmers_guide.pdf), [Wikipedia](http://en.wikipedia.org/wiki/Postcodes_in_the_United_Kingdom)
57
+
58
+ ### Usage
59
+
60
+ ```ruby
61
+ class Address < ActiveRecord::Base
62
+ validates :postal_code, postcode: true
63
+ end
64
+ ```
65
+
66
+ ### I18n
67
+
68
+ The default error message is `is not a valid postcode`
69
+
70
+ This can be translated in the same was as any other Rails validation message using the key **:postcode**.
71
+
72
+ For the example Address model above, the customised en.yml would be:
73
+
74
+ en:
75
+ activerecord:
76
+ errors:
77
+ models:
78
+ address:
79
+ attributes:
80
+ postal_code:
81
+ postcode: "is not valid"
21
82
 
22
- Simply add the following to your model
23
83
 
24
- validates :my_nino_attribute, nino: true
25
84
 
26
85
 
27
86
  ## Contributing
@@ -0,0 +1,19 @@
1
+ class PostcodeValidator < ActiveModel::EachValidator
2
+
3
+ def validate_each(record, attribute, value)
4
+ record.errors.add(attribute, invalid_message(record, attribute)) unless valid_postcode?(value)
5
+ end
6
+
7
+ private
8
+
9
+ def valid_postcode?(value)
10
+ value =~ /^([A-PR-UWYZ]([0-9]{1,2}|([A-HK-Y][0-9]|[A-HK-Y][0-9]([0-9]|[ABEHMNPRV-Y]))|[0-9][A-HJKS-UW])\s?[0-9][ABD-HJLNP-UW-Z]{2}|(GIR\s?0AA)|(AI-2640)|(SAN\s?TA1)|(BFPO\s?(C\/O\s)?[0-9]{1,4})|((ASCN|BBND|[BFS]IQQ|PCRN|STHL|TDCU|TKCA)\s?1ZZ))$/i
11
+ end
12
+
13
+ def invalid_message(record, attribute)
14
+ I18n.t :postcode,
15
+ scope: "#{record.class.i18n_scope}.errors.models.#{record.class.model_name.i18n_key}.attributes.#{attribute}",
16
+ default: "is not a valid postcode."
17
+ end
18
+
19
+ end
@@ -1,3 +1,3 @@
1
1
  module UkValidators
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
data/lib/uk_validators.rb CHANGED
@@ -1,5 +1,3 @@
1
1
  require "uk_validators/version"
2
2
  require "uk_validators/nino_validator"
3
-
4
- module UkValidators
5
- end
3
+ require "uk_validators/postcode_validator"
data/test/nino_test.rb CHANGED
@@ -6,11 +6,11 @@ class TestNinoValidator < MiniTest::Unit::TestCase
6
6
  end
7
7
 
8
8
  def test_valid_ninos
9
- valid_ninos.each { |nino| assert User.new(ni_number: nino).valid?, "Bad nino #{nino}" }
9
+ valid_ninos.each { |nino| assert User.new(ni_number: nino).valid?, "Nino should be valid: #{nino}" }
10
10
  end
11
11
 
12
12
  def test_invalid_ninos
13
- invalid_ninos.each { |nino| assert User.new(ni_number: nino).invalid? }
13
+ invalid_ninos.each { |nino| assert User.new(ni_number: nino).invalid?, "Nino should be invalid: #{nino}" }
14
14
  end
15
15
 
16
16
  private
@@ -21,7 +21,7 @@ private
21
21
  'bb940321b',
22
22
  'cc987654c',
23
23
  'ee903221d',
24
- 'gg849302 ', # apparently space is valid for the final character
24
+ 'gg849302 ', # space is valid for the final character if it is not known
25
25
  'hh123849a',
26
26
  'jj123849b',
27
27
  'kk123849c',
@@ -0,0 +1,118 @@
1
+ require_relative 'test_helper'
2
+
3
+ class TestPostcodeValidator < MiniTest::Unit::TestCase
4
+ class User < TestModel
5
+ validates :postcode, postcode: true
6
+ end
7
+
8
+ def test_valid_postcodes
9
+ valid_postcodes.each { |postcode| assert User.new(postcode: postcode).valid?, "Postcode should be valid: #{postcode}" }
10
+ end
11
+
12
+ def test_invalid_postcodes
13
+ invalid_postcodes.each { |postcode| assert User.new(postcode: postcode).invalid?, "Postcode should be invalid: #{postcode}" }
14
+ end
15
+
16
+ private
17
+
18
+ def valid_postcodes
19
+ [
20
+ 'EC2N 2DB', # AA9A 9AA format
21
+ 'EC1A1BB',
22
+ 'W1A 1HQ', # A9A 9AA format
23
+ 'N1C1AA',
24
+ 'S2 4SU', # A9 9AA format
25
+ 'M11AA',
26
+ 'B33 8TH', # A99 9AA format
27
+ 'G109WW',
28
+ 'CR2 6XH', # AA9 9AA format
29
+ 'BS13PE',
30
+ 'RG12 1WA', # AA99 9AA format
31
+ 'EH991SP',
32
+ 'AI-2640', # Anguilla
33
+ 'ASCN 1ZZ', # Ascension Island
34
+ 'ASCN1ZZ',
35
+ 'STHL 1ZZ', # St. Helena
36
+ 'STHL1ZZ',
37
+ 'TDCU 1ZZ', # Tristanda Cunha
38
+ 'TDCU1ZZ',
39
+ 'BBND 1ZZ', # British Indian Ocean Territory
40
+ 'BBND1ZZ',
41
+ 'BIQQ 1ZZ', # British Antarctic Territory
42
+ 'BIQQ1ZZ',
43
+ 'FIQQ 1ZZ', # Falkland Islands
44
+ 'FIQQ1ZZ',
45
+ 'GX11 1AA', # Gibraltar
46
+ 'GX111ZZ',
47
+ 'PCRN 1ZZ', # Pitcairn Islands
48
+ 'PCRN1ZZ',
49
+ 'SIQQ 1ZZ', # South Georgia and South Sandwich Islands
50
+ 'SIQQ1ZZ',
51
+ 'TKCA 1ZZ', # Turks and Caicos Islands
52
+ 'TKCA1ZZ',
53
+ 'GIR 0AA', # Girobank / Santander
54
+ 'GIR0AA',
55
+ ]
56
+ end
57
+
58
+ def invalid_postcodes
59
+ [
60
+ # invalid 1st pos characters - Q,V,X
61
+ 'QB1 1AA',
62
+ 'V2 4SU',
63
+ 'XA12 2AB',
64
+
65
+ # invalid 2nd pos characters - I,J,Z
66
+ 'BI9 1AA',
67
+ 'CJ12 2SA',
68
+ 'AZ9 9WC',
69
+
70
+ # invalid 3rd pos characters - I,L,M,N,O,Q,R,V,X,Y,Z
71
+ 'W1I 1ST',
72
+ 'W1L 1ST',
73
+ 'W1M 1ST',
74
+ 'W1N 1ST',
75
+ 'W1O 1ST',
76
+ 'W1Q 1ST',
77
+ 'W1R 1ST',
78
+ 'W1V 1ST',
79
+ 'W1X 1ST',
80
+ 'W1Y 1ST',
81
+ 'W1Z 1ST',
82
+
83
+ # invalid 4th pos characters - C,D,F,G,I,J,K,L,O,Q,S,T,U,Z
84
+ 'EC1C 2WA',
85
+ 'EC1D 2WA',
86
+ 'EC1F 2WA',
87
+ 'EC1G 2WA',
88
+ 'EC1I 2WA',
89
+ 'EC1J 2WA',
90
+ 'EC1K 2WA',
91
+ 'EC1L 2WA',
92
+ 'EC1O 2WA',
93
+ 'EC1Q 2WA',
94
+ 'EC1S 2WA',
95
+ 'EC1T 2WA',
96
+ 'EC1U 2WA',
97
+ 'EC1Z 2WA',
98
+
99
+ # invalid final 2 letters, C,I,K,M,O,V
100
+ 'BS15 3CE',
101
+ 'BS15 3IE',
102
+ 'BS15 3KE',
103
+ 'BS15 3ME',
104
+ 'BS15 3OE',
105
+ 'BS15 3VE',
106
+ 'BS15 3PC',
107
+ 'BS15 3PI',
108
+ 'BS15 3PK',
109
+ 'BS15 3PM',
110
+ 'BS15 3PO',
111
+ 'BS15 3PV',
112
+
113
+ '',
114
+ ' ',
115
+ '1w23 12e'
116
+ ]
117
+ end
118
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: uk_validators
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
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-11-04 00:00:00.000000000 Z
12
+ date: 2013-11-06 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -89,8 +89,10 @@ files:
89
89
  - Rakefile
90
90
  - lib/uk_validators.rb
91
91
  - lib/uk_validators/nino_validator.rb
92
+ - lib/uk_validators/postcode_validator.rb
92
93
  - lib/uk_validators/version.rb
93
94
  - test/nino_test.rb
95
+ - test/postcode_test.rb
94
96
  - test/test_helper.rb
95
97
  - uk_validators.gemspec
96
98
  homepage: https://github.com/tonyheadford/uk_validators
@@ -108,7 +110,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
108
110
  version: '0'
109
111
  segments:
110
112
  - 0
111
- hash: 1782607928652499814
113
+ hash: 4864723644629626
112
114
  required_rubygems_version: !ruby/object:Gem::Requirement
113
115
  none: false
114
116
  requirements:
@@ -117,7 +119,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
117
119
  version: '0'
118
120
  segments:
119
121
  - 0
120
- hash: 1782607928652499814
122
+ hash: 4864723644629626
121
123
  requirements: []
122
124
  rubyforge_project:
123
125
  rubygems_version: 1.8.25
@@ -126,4 +128,5 @@ specification_version: 3
126
128
  summary: Rails validations for UK data
127
129
  test_files:
128
130
  - test/nino_test.rb
131
+ - test/postcode_test.rb
129
132
  - test/test_helper.rb