postcode_validation 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b1b7365d65c023287b34e28abfc3cfe8b1db68f1
4
- data.tar.gz: 9d6173ff64a453177a2785b00268ef0e05174377
3
+ metadata.gz: 6dad524f16f594e36cfc565454b9bbdcbd33bace
4
+ data.tar.gz: f6fc74fa28e9dcf9839376cbaf2428523cc148ee
5
5
  SHA512:
6
- metadata.gz: d9a0615d997a863c470ed6a9730d90f677be4dc45a10bd9c6b46e1c9532f962976007477ea23a1fdf2ce2878c7ce9f20964c3ae5e1aa53fc2cb0ec76a9640bb7
7
- data.tar.gz: c3746ff38a800745b7a355155598132bf6bac61e8c46f6c2114ffa9acedeeae8bea91e9f3af45357745323a3ba1740652f91d8ac0c7449e5ac22c2aa1e5a8fc6
6
+ metadata.gz: f8a5aa14677804b36ee54081fc4afdcf2b9191aa9960977fe7234d647138170f8c2f8881df0736b9cbe00a26064a3d6b016b49014c1f9d13b53c7e6addc1a1eb
7
+ data.tar.gz: 45ec31c2c5bc4ae57e83df50f5544874fd8a4c2bddfdd1b1969db3d5171c4748436624d13410690cf3c9770f486b72c5e6ea712d57037f5c6429e0e451ef258b
@@ -0,0 +1,12 @@
1
+ module PostcodeValidation
2
+ module Domain
3
+ class Address
4
+ def initialize(street_address:, place:)
5
+ @street_address = street_address
6
+ @place = place
7
+ end
8
+
9
+ attr_reader :street_address, :place
10
+ end
11
+ end
12
+ end
@@ -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
@@ -34,8 +34,7 @@ module PostcodeValidation
34
34
  query: {
35
35
  Key: KEY,
36
36
  Countries: country,
37
- Text: search_term,
38
- Filter: 'PostCode'
37
+ Text: search_term
39
38
  }
40
39
  }
41
40
  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
@@ -0,0 +1,13 @@
1
+ require_relative 'regex_validator'
2
+
3
+ module PostcodeValidation
4
+ module UseCase
5
+ class ValidateAddress
6
+ module FormatValidators
7
+ class BEPostcodeValidator < RegexValidator
8
+ REGEX = /^[1-9]{1}[0-9]{3}$/
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -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
@@ -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
@@ -0,0 +1,13 @@
1
+ require_relative 'regex_validator'
2
+
3
+ module PostcodeValidation
4
+ module UseCase
5
+ class ValidateAddress
6
+ module FormatValidators
7
+ class NLPostcodeValidator < RegexValidator
8
+ REGEX = /(NL-)?(\d{4})\s*([A-Z]{2})/
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,14 @@
1
+ module PostcodeValidation
2
+ module UseCase
3
+ class ValidateAddress
4
+ module FormatValidators
5
+ class RegexValidator
6
+ def valid? postcode
7
+ validation = self.class::REGEX =~ postcode
8
+ !validation.nil?
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
14
+ 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
- @postcode = postcode
11
- @country = country
12
- { valid?: valid_postcode? }
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
- on_error(e)
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 valid_postcode?
27
- matches = potential_address_matches
28
- return false if matches.first.nil?
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
- matches.each { |address| return true if address.postcode_matches? postcode }
31
- false
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 potential_address_matches
35
- @address_match_gateway.query(search_term: postcode,
36
- country: country)
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
@@ -1,3 +1,3 @@
1
1
  module PostcodeValidation
2
- VERSION = '0.0.5'
2
+ VERSION = '0.0.6'
3
3
  end
@@ -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.5
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-02-06 00:00:00.000000000 Z
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.0.14.1
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).