callcredit 0.3.5 → 0.3.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: fa5511f62db44e4945ee93b3f8be5bdc295ee064
4
- data.tar.gz: 4cee4c1eaca735897d678190311dc9ff62383aab
3
+ metadata.gz: a0b7b4efd89e1305129eb3d2ddd8647df7287f2b
4
+ data.tar.gz: d259558cc18200f91398fcdf91d569a08d0e84c7
5
5
  SHA512:
6
- metadata.gz: 3b63ca88889c45fba9f6369c647e54168b266563c47f237230563992fe3e348b0e2d60dc0f5cada2d6b0e8e887e960ed560a2fd5f15ea0ce4df261258e25dab8
7
- data.tar.gz: e4e06bc0571ce0f04c5277843330184e73f70333024253007e32c06ea8533a22470ef011b7e417d8d172717047ad9debdbe1d11f557fb3f2166cc7a0d2efaf91
6
+ metadata.gz: c9c8638f029f7ec78207d9b4039cf6abe97efa32cd050604de97263a1c64910162a01f2f5f72a6a3c47754b82edccc011478a823734878fcca725731e26fc3c6
7
+ data.tar.gz: 59f925b4e118bf737f787974c2098668163e5b5093fff3868f747bb92c3a0f79a02d531c4882ddf0b26acaed6acd92964ea1616385a039d19be6687f1928dd6d
@@ -1,3 +1,7 @@
1
+ ## 0.3.6 - April 22, 2014
2
+
3
+ - Catch Faraday errors without a response
4
+
1
5
  ## 0.3.5 - February 24, 2014
2
6
 
3
7
  - Remove insistence on inclusion of date_of_birth, postcode and names
@@ -5,10 +5,10 @@ Gem::Specification.new do |gem|
5
5
  gem.add_runtime_dependency 'faraday_middleware', '>= 0.8.2'
6
6
  gem.add_runtime_dependency 'multi_xml', '~> 0.5.1'
7
7
  gem.add_runtime_dependency 'nokogiri', '~> 1.4'
8
- gem.add_runtime_dependency 'unidecoder', '~> 1.1.2'
8
+ gem.add_runtime_dependency 'unicode_utils', '~> 1.4.0'
9
9
 
10
- gem.add_development_dependency 'rspec'
11
- gem.add_development_dependency 'webmock'
10
+ gem.add_development_dependency 'rspec', '~> 2.14.1'
11
+ gem.add_development_dependency 'webmock', '~> 1.17.2'
12
12
 
13
13
  gem.authors = ['Grey Baker']
14
14
  gem.description = %q{Ruby wrapper for Callcredit's CallValidate API}
@@ -1,5 +1,6 @@
1
1
  require 'faraday_middleware'
2
2
  require 'nokogiri'
3
+ require 'unicode_utils'
3
4
 
4
5
  require 'callcredit/version'
5
6
  require 'callcredit/util'
@@ -15,8 +16,8 @@ require 'callcredit/middleware/check_response'
15
16
  # Errors
16
17
  require 'callcredit/errors/callcredit_error'
17
18
  require 'callcredit/errors/api_error'
18
- require 'callcredit/errors/authentication_error'
19
19
  require 'callcredit/errors/invalid_request_error'
20
+ require 'callcredit/errors/invalid_response_error'
20
21
 
21
22
  module Callcredit
22
23
  def self.configure(&block)
@@ -38,7 +39,7 @@ module Callcredit
38
39
  else
39
40
  msg = "No config found. Use Callcredit.configure to set username, " +
40
41
  "password, company and application name. See " +
41
- "https://github.com/gocardless/callcredit for details."
42
+ "https://github.com/gocardless/callcredit-ruby for details."
42
43
  raise CallcreditError.new(msg)
43
44
  end
44
45
  end
@@ -0,0 +1,4 @@
1
+ module Callcredit
2
+ class InvalidResponseError < CallcreditError
3
+ end
4
+ end
@@ -4,7 +4,8 @@ module Callcredit
4
4
  def call(env)
5
5
  @app.call(env).on_complete do |env|
6
6
  unless results = env[:body]["Results"]
7
- raise APIError.new("Received unexpected XML (Results tag missing)")
7
+ raise InvalidResponseError.new(
8
+ "Invalid response", env[:status], env)
8
9
  end
9
10
 
10
11
  if results["Errors"]
@@ -14,7 +14,11 @@ module Callcredit
14
14
  end
15
15
  @config[:raw] ? response : response.body
16
16
  rescue Faraday::Error::ClientError => e
17
- raise APIError.new(e.response[:body], e.response[:status], e.response)
17
+ if e.response.nil?
18
+ raise APIError.new
19
+ else
20
+ raise APIError.new(e.response[:body], e.response[:status], e.response)
21
+ end
18
22
  end
19
23
 
20
24
  # Compile the complete XML request to send to Callcredit
@@ -76,7 +80,8 @@ module Callcredit
76
80
  end
77
81
  xml.AddressDetails do
78
82
  Constants::ADDRESS_DETAILS.each do |param, element_name|
79
- xml.send(element_name, data[param]) if data[param]
83
+ value = Validations.clean_param(param, data[param])
84
+ xml.send(element_name, value) if value
80
85
  end
81
86
  end
82
87
  end
@@ -1,15 +1,15 @@
1
- require 'unidecoder'
2
-
3
1
  module Callcredit
4
2
  module Validations
5
3
 
6
4
  VALIDATIONS = {
7
5
  date_of_birth: ->(value) { clean_date_of_birth(value) },
8
6
  title: ->(value) { value || "Unknown" },
9
- first_name: ->(value) { clean_first_name(value) },
10
- last_name: ->(value) { clean_last_name(value) },
11
- middle_names: ->(value) { clean_middle_names(value) },
12
- postcode: ->(value) { clean_postcode(value) }
7
+ first_name: ->(value) { clean_name(value, :first_name) },
8
+ last_name: ->(value) { clean_name(value, :last_name) },
9
+ middle_names: ->(value) { clean_name(value, :middle_names) },
10
+ postcode: ->(value) { clean_postcode(value, :postcode) },
11
+ previous_postcode: ->(value) { clean_postcode(value, :previous_postcode) },
12
+ delivery_postcode: ->(value) { clean_postcode(value, :delivery_postcode) }
13
13
  }
14
14
 
15
15
  def self.clean_param(key, value)
@@ -25,31 +25,18 @@ module Callcredit
25
25
  input_error(:date_of_birth, date_of_birth)
26
26
  end
27
27
 
28
- def self.clean_first_name(name)
29
- return unless name
30
- name = name.to_ascii
31
- input_error(:first_name, name) unless name =~ /\A[a-z A-Z'-]{1,30}\z/
32
- name
33
- end
34
-
35
- def self.clean_last_name(name)
36
- return unless name
37
- name = name.to_ascii
38
- input_error(:last_name, name) unless name =~ /\A[a-z A-Z'-]{1,30}\z/
39
- name
40
- end
41
-
42
- def self.clean_middle_names(name)
28
+ def self.clean_name(name, param)
43
29
  return unless name
44
- name = name.to_ascii
45
- input_error(:middle_names, name) unless name =~ /\A[a-z A-Z'-]{1,30}\z/
30
+ # Convert name to ASCII characters only
31
+ name = UnicodeUtils.nfkd(name).gsub(/(\p{Letter})\p{Mark}+/,'\\1')
32
+ input_error(param, name) unless name =~ /\A[a-z A-Z'-]{1,30}\z/
46
33
  name
47
34
  end
48
35
 
49
- def self.clean_postcode(postcode)
36
+ def self.clean_postcode(postcode, param)
50
37
  return unless postcode
51
38
  postcode = postcode.upcase.strip
52
- input_error(:postcode, postcode) unless postcode =~ /\A[A-Z 0-9]{5,8}\z/
39
+ input_error(param, postcode) unless postcode =~ /\A[A-Z 0-9]{5,8}\z/
53
40
  postcode
54
41
  end
55
42
 
@@ -1,3 +1,3 @@
1
1
  module Callcredit
2
- VERSION = '0.3.5'.freeze
2
+ VERSION = '0.3.6'.freeze
3
3
  end
@@ -109,7 +109,8 @@ describe Callcredit::Request do
109
109
  let(:body) { "<TopLevel></TopLevel>" }
110
110
 
111
111
  it "wraps the error" do
112
- expect { perform_check }.to raise_error Callcredit::APIError
112
+ expect { perform_check }.
113
+ to raise_error Callcredit::InvalidResponseError
113
114
  end
114
115
  end
115
116
  end
@@ -1,18 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Callcredit::Validations do
4
- let(:check_data) do
5
- { personal_data: {
6
- first_name: "Grey",
7
- last_name: "Baker",
8
- date_of_birth: date_of_birth,
9
- postcode: "EC2A 1DX",
10
- building_number: "22-25"
11
- }
12
- }
13
- end
14
- let(:date_of_birth) { "01/01/2000" }
15
-
16
4
  describe '#clean_date_of_birth' do
17
5
  subject { Callcredit::Validations.clean_date_of_birth(date_of_birth) }
18
6
 
@@ -39,62 +27,53 @@ describe Callcredit::Validations do
39
27
  end
40
28
  end
41
29
 
42
- describe '#clean_first_name' do
43
- subject { Callcredit::Validations.clean_first_name(first_name) }
30
+ describe '#clean_name' do
31
+ subject { Callcredit::Validations.clean_name(name, :first_name) }
44
32
 
45
- context "without a first name" do
46
- let(:first_name) { nil }
33
+ context "without a name" do
34
+ let(:name) { nil }
47
35
  it { should == nil }
48
36
  end
49
37
 
50
- context "with a simple first name" do
51
- let(:first_name) { "Grey" }
52
- it { should == first_name }
38
+ context "with a simple name" do
39
+ let(:name) { "Grey" }
40
+ it { should == name }
53
41
  end
54
42
 
55
- context "with a first name with non-ASCII characters" do
56
- let(:first_name) { "Gréy" }
43
+ context "with a name with non-ASCII characters" do
44
+ let(:name) { "Gréy" }
57
45
  it { should == "Grey" }
58
46
  end
59
47
 
60
- context "with a very long first name" do
61
- let(:first_name) { "A" * 31 }
48
+ context "with a very long name" do
49
+ let(:name) { "A" * 31 }
62
50
  it "raises an error" do
63
51
  expect { subject }.to raise_error Callcredit::InvalidRequestError
64
52
  end
65
53
  end
66
54
 
67
- context "with a first name with numbers in it" do
68
- let(:first_name) { "David the 3rd" }
55
+ context "with a name with numbers in it" do
56
+ let(:name) { "David the 3rd" }
69
57
  it "raises an error" do
70
58
  expect { subject }.to raise_error Callcredit::InvalidRequestError
71
59
  end
72
60
  end
73
61
  end
74
62
 
75
- describe '#clean_middle_names' do
76
- subject { Callcredit::Validations.clean_middle_names(name) }
77
-
78
- context "without a middle name" do
79
- let(:name) { nil }
80
- it { should == nil }
81
- end
82
- end
83
-
84
63
  describe '#clean_postcode' do
85
- subject { Callcredit::Validations.clean_postcode(postcode) }
64
+ subject { Callcredit::Validations.clean_postcode(postcode, :postcode) }
86
65
 
87
- context "without a post code" do
66
+ context "without a postcode" do
88
67
  let(:postcode) { nil }
89
68
  it { should == nil }
90
69
  end
91
70
 
92
- context "with a correct post code" do
71
+ context "with a correct postcode" do
93
72
  let(:postcode) { "EC2A 1DX" }
94
73
  it { should == postcode }
95
74
  end
96
75
 
97
- context "with a padded post code" do
76
+ context "with a padded postcode" do
98
77
  let(:postcode) { "EC2A 1DX " }
99
78
  it { should == "EC2A 1DX" }
100
79
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: callcredit
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.5
4
+ version: 0.3.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Grey Baker
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-02-24 00:00:00.000000000 Z
11
+ date: 2014-04-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -67,47 +67,47 @@ dependencies:
67
67
  - !ruby/object:Gem::Version
68
68
  version: '1.4'
69
69
  - !ruby/object:Gem::Dependency
70
- name: unidecoder
70
+ name: unicode_utils
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - ~>
74
74
  - !ruby/object:Gem::Version
75
- version: 1.1.2
75
+ version: 1.4.0
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - ~>
81
81
  - !ruby/object:Gem::Version
82
- version: 1.1.2
82
+ version: 1.4.0
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: rspec
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - '>='
87
+ - - ~>
88
88
  - !ruby/object:Gem::Version
89
- version: '0'
89
+ version: 2.14.1
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
- version: '0'
96
+ version: 2.14.1
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: webmock
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
- - - '>='
101
+ - - ~>
102
102
  - !ruby/object:Gem::Version
103
- version: '0'
103
+ version: 1.17.2
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
- version: '0'
110
+ version: 1.17.2
111
111
  description: Ruby wrapper for Callcredit's CallValidate API
112
112
  email:
113
113
  - grey@gocardless.com
@@ -127,9 +127,9 @@ files:
127
127
  - lib/callcredit/config.rb
128
128
  - lib/callcredit/constants.rb
129
129
  - lib/callcredit/errors/api_error.rb
130
- - lib/callcredit/errors/authentication_error.rb
131
130
  - lib/callcredit/errors/callcredit_error.rb
132
131
  - lib/callcredit/errors/invalid_request_error.rb
132
+ - lib/callcredit/errors/invalid_response_error.rb
133
133
  - lib/callcredit/middleware/check_response.rb
134
134
  - lib/callcredit/request.rb
135
135
  - lib/callcredit/response.rb
@@ -1,4 +0,0 @@
1
- module Callcredit
2
- class AuthenticationError < CallcreditError
3
- end
4
- end