callcredit 0.3.5 → 0.3.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: 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