postcode_validation 0.0.5 → 0.0.6
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/lib/postcode_validation/domain/address.rb +12 -0
- data/lib/postcode_validation/gateway/pca_address_list.rb +44 -0
- data/lib/postcode_validation/gateway/pca_potential_address_match.rb +1 -2
- data/lib/postcode_validation/use_case/address_list.rb +39 -0
- data/lib/postcode_validation/use_case/validate_address/format_validator.rb +25 -0
- data/lib/postcode_validation/use_case/validate_address/format_validators/be_postcode_validator.rb +13 -0
- data/lib/postcode_validation/use_case/validate_address/format_validators/fr_postcode_validator.rb +13 -0
- data/lib/postcode_validation/use_case/validate_address/format_validators/gb_postcode_validator.rb +13 -0
- data/lib/postcode_validation/use_case/validate_address/format_validators/nl_postcode_validator.rb +13 -0
- data/lib/postcode_validation/use_case/validate_address/format_validators/regex_validator.rb +14 -0
- data/lib/postcode_validation/use_case/validate_address.rb +41 -13
- data/lib/postcode_validation/version.rb +1 -1
- data/lib/postcode_validation.rb +3 -0
- metadata +32 -23
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6dad524f16f594e36cfc565454b9bbdcbd33bace
|
4
|
+
data.tar.gz: f6fc74fa28e9dcf9839376cbaf2428523cc148ee
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f8a5aa14677804b36ee54081fc4afdcf2b9191aa9960977fe7234d647138170f8c2f8881df0736b9cbe00a26064a3d6b016b49014c1f9d13b53c7e6addc1a1eb
|
7
|
+
data.tar.gz: 45ec31c2c5bc4ae57e83df50f5544874fd8a4c2bddfdd1b1969db3d5171c4748436624d13410690cf3c9770f486b72c5e6ea712d57037f5c6429e0e451ef258b
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module PostcodeValidation
|
2
|
+
module Gateway
|
3
|
+
class PCAAddressList
|
4
|
+
include HTTParty
|
5
|
+
|
6
|
+
class PCARequestError < PostcodeValidation::Error::RequestError; end
|
7
|
+
|
8
|
+
KEY = ENV['POSTCODE_ANYWHERE_KEY']
|
9
|
+
base_uri 'https://services.postcodeanywhere.co.uk'
|
10
|
+
|
11
|
+
def query(search_term:, country:)
|
12
|
+
response = address_list_for_postcode(country, search_term)
|
13
|
+
|
14
|
+
response.map do |row|
|
15
|
+
raise PCARequestError, error_message(row) if row.key?('Error')
|
16
|
+
|
17
|
+
PostcodeValidation::Domain::Address.new(street_address: row['StreetAddress'],
|
18
|
+
place: row['Place'])
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def error_message(row)
|
25
|
+
"#{row['Error']} #{row['Cause']} #{row['Resolution']}"
|
26
|
+
end
|
27
|
+
|
28
|
+
def address_list_for_postcode(country, search_term)
|
29
|
+
JSON.parse(self.class.get('/PostcodeAnywhere/Interactive/Find/1.1/json.ws', lookup_parameters(country, search_term)).body)
|
30
|
+
end
|
31
|
+
|
32
|
+
def lookup_parameters(country, search_term)
|
33
|
+
{
|
34
|
+
query: {
|
35
|
+
Country: country,
|
36
|
+
Key: KEY,
|
37
|
+
SearchTerm: search_term,
|
38
|
+
Filter: 'None'
|
39
|
+
}
|
40
|
+
}
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require_relative 'validate_address/format_validator'
|
2
|
+
|
3
|
+
module PostcodeValidation
|
4
|
+
module UseCase
|
5
|
+
class AddressList
|
6
|
+
def initialize(address_list_gateway:, logger: nil)
|
7
|
+
@address_list_gateway = address_list_gateway
|
8
|
+
@logger = logger
|
9
|
+
end
|
10
|
+
|
11
|
+
def execute(postcode:, country:)
|
12
|
+
addresses = matched_addresses(postcode, country)
|
13
|
+
|
14
|
+
formatted(addresses)
|
15
|
+
rescue PostcodeValidation::Error::RequestError => e
|
16
|
+
log_error(e)
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
attr_reader :address_match_gateway, :logger
|
22
|
+
|
23
|
+
def formatted(addresses)
|
24
|
+
addresses.map do |address|
|
25
|
+
{ street_address: address.street_address, place: address.place }
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def log_error(e)
|
30
|
+
logger.error(e) unless logger.nil?
|
31
|
+
end
|
32
|
+
|
33
|
+
def matched_addresses(postcode, country)
|
34
|
+
@address_list_gateway.query(search_term: postcode,
|
35
|
+
country: country)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require_relative 'format_validators/nl_postcode_validator'
|
2
|
+
require_relative 'format_validators/be_postcode_validator'
|
3
|
+
require_relative 'format_validators/gb_postcode_validator'
|
4
|
+
require_relative 'format_validators/fr_postcode_validator'
|
5
|
+
|
6
|
+
module PostcodeValidation
|
7
|
+
module UseCase
|
8
|
+
class ValidateAddress
|
9
|
+
class FormatValidator
|
10
|
+
def for country
|
11
|
+
case country
|
12
|
+
when 'NL'
|
13
|
+
FormatValidators::NLPostcodeValidator.new
|
14
|
+
when 'GB'
|
15
|
+
FormatValidators::GBPostcodeValidator.new
|
16
|
+
when 'BE'
|
17
|
+
FormatValidators::BEPostcodeValidator.new
|
18
|
+
when 'FR'
|
19
|
+
FormatValidators::FRPostcodeValidator.new
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
data/lib/postcode_validation/use_case/validate_address/format_validators/fr_postcode_validator.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
require_relative 'regex_validator'
|
2
|
+
|
3
|
+
module PostcodeValidation
|
4
|
+
module UseCase
|
5
|
+
class ValidateAddress
|
6
|
+
module FormatValidators
|
7
|
+
class FRPostcodeValidator < RegexValidator
|
8
|
+
REGEX = /^(F-)?((2[A|B])|[0-9]{2})[0-9]{3}$/
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
data/lib/postcode_validation/use_case/validate_address/format_validators/gb_postcode_validator.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
require_relative 'regex_validator'
|
2
|
+
|
3
|
+
module PostcodeValidation
|
4
|
+
module UseCase
|
5
|
+
class ValidateAddress
|
6
|
+
module FormatValidators
|
7
|
+
class GBPostcodeValidator < RegexValidator
|
8
|
+
REGEX = /(?i)([A-Z]{1,2}[0-9]{1,2}[A-Z]?)\s*([0-9][A-Z]{2})/
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -1,39 +1,67 @@
|
|
1
|
+
require_relative 'validate_address/format_validator'
|
2
|
+
|
1
3
|
module PostcodeValidation
|
2
4
|
module UseCase
|
3
5
|
class ValidateAddress
|
4
6
|
def initialize(address_match_gateway:, logger: nil)
|
7
|
+
@format_validator = FormatValidator.new
|
5
8
|
@address_match_gateway = address_match_gateway
|
6
9
|
@logger = logger
|
10
|
+
@errors = []
|
7
11
|
end
|
8
12
|
|
9
13
|
def execute(postcode:, country:)
|
10
|
-
|
11
|
-
|
12
|
-
|
14
|
+
check_country(country)
|
15
|
+
check_postcode_format(postcode, country)
|
16
|
+
result = matched_addresses(postcode, country)
|
17
|
+
|
18
|
+
check_matched_addresses(result)
|
19
|
+
|
20
|
+
result_payload(result, postcode)
|
13
21
|
rescue PostcodeValidation::Error::RequestError => e
|
14
|
-
|
15
|
-
{ valid?: true }
|
22
|
+
gracefully_handle_error(e)
|
16
23
|
end
|
17
24
|
|
18
25
|
private
|
19
26
|
|
20
27
|
attr_reader :address_match_gateway, :logger, :postcode, :country
|
21
28
|
|
29
|
+
def result_payload(result, postcode)
|
30
|
+
return { valid?: false, reason: @errors } unless @errors.empty?
|
31
|
+
|
32
|
+
result.each do |address|
|
33
|
+
return { valid?: true, reason: ['valid_postcode'] } if address.postcode_matches? postcode
|
34
|
+
end
|
35
|
+
|
36
|
+
{ valid?: false, reason: ['no_postcode_matches_found'] }
|
37
|
+
end
|
38
|
+
|
22
39
|
def on_error(e)
|
23
40
|
logger.error(e) unless logger.nil?
|
24
41
|
end
|
25
42
|
|
26
|
-
def
|
27
|
-
|
28
|
-
|
43
|
+
def matched_addresses(postcode, country)
|
44
|
+
@address_match_gateway.query(search_term: postcode,
|
45
|
+
country: country)
|
46
|
+
end
|
47
|
+
|
48
|
+
def check_matched_addresses(result)
|
49
|
+
@errors << 'no_matches' if result.first.nil?
|
50
|
+
end
|
51
|
+
|
52
|
+
def check_country(country)
|
53
|
+
@errors << 'no_country_provided' if country.nil?
|
54
|
+
end
|
29
55
|
|
30
|
-
|
31
|
-
|
56
|
+
def check_postcode_format(postcode, country)
|
57
|
+
return if country.nil?
|
58
|
+
validator = @format_validator.for(country)
|
59
|
+
@errors << 'invalid_format' if !validator.valid?(postcode)
|
32
60
|
end
|
33
61
|
|
34
|
-
def
|
35
|
-
|
36
|
-
|
62
|
+
def gracefully_handle_error(error)
|
63
|
+
on_error(error)
|
64
|
+
{ valid?: true, reason: ['unable_to_reach_service'] }
|
37
65
|
end
|
38
66
|
end
|
39
67
|
end
|
data/lib/postcode_validation.rb
CHANGED
@@ -3,7 +3,10 @@ require 'postcode_validation/version'
|
|
3
3
|
module PostcodeValidation
|
4
4
|
require 'httparty'
|
5
5
|
require 'postcode_validation/domain/potential_address_match'
|
6
|
+
require 'postcode_validation/domain/address'
|
6
7
|
require 'postcode_validation/error/request_error'
|
7
8
|
require 'postcode_validation/gateway/pca_potential_address_match'
|
9
|
+
require 'postcode_validation/gateway/pca_address_list'
|
8
10
|
require 'postcode_validation/use_case/validate_address'
|
11
|
+
require 'postcode_validation/use_case/address_list'
|
9
12
|
end
|
metadata
CHANGED
@@ -1,111 +1,111 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: postcode_validation
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Craig J. Bass
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-05-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: httparty
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: bundler
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - ~>
|
31
|
+
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '1.13'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - ~>
|
38
|
+
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '1.13'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rake
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - ~>
|
45
|
+
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '10.0'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- - ~>
|
52
|
+
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '10.0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: rspec
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- - ~>
|
59
|
+
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '3.0'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- - ~>
|
66
|
+
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '3.0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: vcr
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- -
|
73
|
+
- - ">="
|
74
74
|
- !ruby/object:Gem::Version
|
75
75
|
version: '0'
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- -
|
80
|
+
- - ">="
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: webmock
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
|
-
- -
|
87
|
+
- - ">="
|
88
88
|
- !ruby/object:Gem::Version
|
89
89
|
version: '0'
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
|
-
- -
|
94
|
+
- - ">="
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '0'
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
name: dotenv
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
|
-
- -
|
101
|
+
- - ">="
|
102
102
|
- !ruby/object:Gem::Version
|
103
103
|
version: '0'
|
104
104
|
type: :development
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
|
-
- -
|
108
|
+
- - ">="
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '0'
|
111
111
|
description:
|
@@ -115,21 +115,30 @@ executables: []
|
|
115
115
|
extensions: []
|
116
116
|
extra_rdoc_files: []
|
117
117
|
files:
|
118
|
-
- .env
|
119
|
-
- .gitignore
|
120
|
-
- .rspec
|
121
|
-
- .travis.yml
|
118
|
+
- ".env"
|
119
|
+
- ".gitignore"
|
120
|
+
- ".rspec"
|
121
|
+
- ".travis.yml"
|
122
122
|
- Gemfile
|
123
123
|
- LICENSE.txt
|
124
124
|
- README.md
|
125
125
|
- Rakefile
|
126
126
|
- lib/postcode_validation.rb
|
127
|
+
- lib/postcode_validation/domain/address.rb
|
127
128
|
- lib/postcode_validation/domain/potential_address_match.rb
|
128
129
|
- lib/postcode_validation/error/request_error.rb
|
130
|
+
- lib/postcode_validation/gateway/pca_address_list.rb
|
129
131
|
- lib/postcode_validation/gateway/pca_potential_address_match.rb
|
130
132
|
- lib/postcode_validation/plugins/solidus.rb
|
131
133
|
- lib/postcode_validation/plugins/solidus/models/concerns/spree_order_postcode_valid.rb
|
134
|
+
- lib/postcode_validation/use_case/address_list.rb
|
132
135
|
- lib/postcode_validation/use_case/validate_address.rb
|
136
|
+
- lib/postcode_validation/use_case/validate_address/format_validator.rb
|
137
|
+
- lib/postcode_validation/use_case/validate_address/format_validators/be_postcode_validator.rb
|
138
|
+
- lib/postcode_validation/use_case/validate_address/format_validators/fr_postcode_validator.rb
|
139
|
+
- lib/postcode_validation/use_case/validate_address/format_validators/gb_postcode_validator.rb
|
140
|
+
- lib/postcode_validation/use_case/validate_address/format_validators/nl_postcode_validator.rb
|
141
|
+
- lib/postcode_validation/use_case/validate_address/format_validators/regex_validator.rb
|
133
142
|
- lib/postcode_validation/version.rb
|
134
143
|
- postcode_validation.gemspec
|
135
144
|
homepage:
|
@@ -142,17 +151,17 @@ require_paths:
|
|
142
151
|
- lib
|
143
152
|
required_ruby_version: !ruby/object:Gem::Requirement
|
144
153
|
requirements:
|
145
|
-
- -
|
154
|
+
- - ">="
|
146
155
|
- !ruby/object:Gem::Version
|
147
156
|
version: '0'
|
148
157
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
149
158
|
requirements:
|
150
|
-
- -
|
159
|
+
- - ">="
|
151
160
|
- !ruby/object:Gem::Version
|
152
161
|
version: '0'
|
153
162
|
requirements: []
|
154
163
|
rubyforge_project:
|
155
|
-
rubygems_version: 2.
|
164
|
+
rubygems_version: 2.6.8
|
156
165
|
signing_key:
|
157
166
|
specification_version: 4
|
158
167
|
summary: Provides really basic postcode validation (intended for eCommerce platforms).
|