creditsafe 0.5.1 → 0.5.2

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.
Files changed (38) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +17 -17
  3. data/.gitignore +2 -2
  4. data/.rspec +1 -1
  5. data/.rubocop.yml +11 -11
  6. data/.ruby-version +1 -1
  7. data/CHANGELOG.md +41 -37
  8. data/Gemfile +5 -5
  9. data/Gemfile.lock +127 -125
  10. data/LICENSE.txt +22 -22
  11. data/README.md +138 -138
  12. data/creditsafe.gemspec +35 -35
  13. data/data/creditsafe-live.xml +342 -342
  14. data/data/creditsafe-test.xml +342 -342
  15. data/lib/creditsafe.rb +4 -4
  16. data/lib/creditsafe/client.rb +158 -156
  17. data/lib/creditsafe/errors.rb +16 -14
  18. data/lib/creditsafe/match_type.rb +115 -115
  19. data/lib/creditsafe/messages.rb +97 -97
  20. data/lib/creditsafe/namespace.rb +20 -20
  21. data/lib/creditsafe/request/company_report.rb +42 -42
  22. data/lib/creditsafe/request/find_company.rb +98 -98
  23. data/lib/creditsafe/version.rb +5 -5
  24. data/spec/creditsafe/client_spec.rb +369 -372
  25. data/spec/creditsafe/messages_spec.rb +76 -76
  26. data/spec/fixtures/company-report-not-found.xml +13 -13
  27. data/spec/fixtures/company-report-request.xml +1 -1
  28. data/spec/fixtures/company-report-successful.xml +582 -582
  29. data/spec/fixtures/error-fault.xml +8 -8
  30. data/spec/fixtures/error-invalid-credentials.html +31 -31
  31. data/spec/fixtures/find-companies-error-no-text.xml +11 -11
  32. data/spec/fixtures/find-companies-error.xml +11 -11
  33. data/spec/fixtures/find-companies-none-found.xml +13 -13
  34. data/spec/fixtures/find-companies-request.xml +1 -1
  35. data/spec/fixtures/find-companies-successful-multi.xml +493 -493
  36. data/spec/fixtures/find-companies-successful.xml +29 -29
  37. data/spec/spec_helper.rb +14 -14
  38. metadata +4 -4
@@ -1,97 +1,97 @@
1
- # frozen_string_literal: true
2
-
3
- require "creditsafe/errors"
4
-
5
- module Creditsafe
6
- module Messages
7
- class Message
8
- attr_reader :code, :message, :error
9
-
10
- def initialize(code: nil, message: nil, error: false)
11
- raise ArgumentError, "Parameters 'code' and 'message' are mandatory" \
12
- unless code && message
13
- @code = code
14
- @message = message
15
- @error = error
16
- end
17
-
18
- alias_method :error?, :error
19
-
20
- def error_class
21
- return unless error?
22
-
23
- case code[1].to_i
24
- when 1 then Creditsafe::DataError
25
- when 2 then Creditsafe::AccountError
26
- when 3 then Creditsafe::RequestError
27
- when 4 then Creditsafe::ProcessingError
28
- else Creditsafe::UnknownApiError
29
- end
30
- end
31
- end
32
-
33
- # rubocop:disable Metrics/LineLength
34
- NO_RESULTS = Message.new(code: "010101", message: "No results")
35
- TOO_MANY_RESULTS = Message.new(code: "010102", message: "Too many results")
36
- REPORT_UNAVAILABLE = Message.new(code: "010103", message: "Report unavailable", error: true)
37
- REPORT_UNAVAILABLE_LEGAL = Message.new(code: "010104", message: "Report unavailable due to legal causes", error: true)
38
- REPORT_UNAVAILABLE_ONLINE = Message.new(code: "010105", message: "Report unavailable online", error: true)
39
- LEGAL_NOTICE = Message.new(code: "010106", message: "Legal notice")
40
- INVALID_CREDENTIALS = Message.new(code: "020101", message: "Invalid credentials", error: true)
41
- ACCESS_RESTRICTED = Message.new(code: "020102", message: "Access restricted", error: true)
42
- ACCESS_LIMITS_NEARING = Message.new(code: "020103", message: "Access limits nearing")
43
- REPORTBOX_ALMOST_FULL = Message.new(code: "020201", message: "Reportbox almost full", error: true)
44
- REPORTBOX_FULL = Message.new(code: "020202", message: "Reportbox full", error: true)
45
- INVALID_REQUEST_XML = Message.new(code: "030101", message: "Invalid request XML", error: true)
46
- INVALID_OPERATION_PARAMS = Message.new(code: "030102", message: "Invalid operation parameters", error: true)
47
- OPERATION_NOT_SUPPORTED = Message.new(code: "030103", message: "Operation not supported", error: true)
48
- INVALID_CUSTOM_DATA_SPECIFIED = Message.new(code: "030104", message: "Invalid custom data specified", error: true)
49
- CHANGE_NOTIFICATION = Message.new(code: "030201", message: "Change notification")
50
- TEMPORARY_SYSTEM_PROBLEM = Message.new(code: "030202", message: "Temporary system problem", error: true)
51
- ENDPOINT_SHUTDOWN = Message.new(code: "030203", message: "Endpoint shutdown", error: true)
52
- UNEXPECTED_INTERNAL_ERROR = Message.new(code: "040101", message: "Unexpected internal error", error: true)
53
- OTHER_ERROR = Message.new(code: "040102", message: "Other", error: true)
54
- DATA_SERVICE_PROBLEMS = Message.new(code: "040103", message: "Data service access problems", error: true)
55
- DATA_SERVICE_INVALID_RESPONSE = Message.new(code: "040104", message: "Data service invalid response", error: true)
56
- # rubocop:enable Metrics/LineLength
57
-
58
- ALL = [
59
- NO_RESULTS,
60
- TOO_MANY_RESULTS,
61
- REPORT_UNAVAILABLE,
62
- REPORT_UNAVAILABLE_LEGAL,
63
- REPORT_UNAVAILABLE_ONLINE,
64
- LEGAL_NOTICE,
65
- INVALID_CREDENTIALS,
66
- ACCESS_RESTRICTED,
67
- ACCESS_LIMITS_NEARING,
68
- REPORTBOX_ALMOST_FULL,
69
- REPORTBOX_FULL,
70
- INVALID_REQUEST_XML,
71
- INVALID_OPERATION_PARAMS,
72
- OPERATION_NOT_SUPPORTED,
73
- INVALID_CUSTOM_DATA_SPECIFIED,
74
- CHANGE_NOTIFICATION,
75
- TEMPORARY_SYSTEM_PROBLEM,
76
- ENDPOINT_SHUTDOWN,
77
- UNEXPECTED_INTERNAL_ERROR,
78
- OTHER_ERROR,
79
- DATA_SERVICE_PROBLEMS,
80
- DATA_SERVICE_INVALID_RESPONSE,
81
- ].freeze
82
-
83
- # Creditsafe documentation shows a 6 digit error code, however their API
84
- # strips the leading 0. To comply with the docs, we pad the API code here to
85
- # ensure we find the right match
86
- def self.for_code(code)
87
- padded_code = code.rjust(6, "0")
88
- message = ALL.find { |msg| msg.code == padded_code }
89
-
90
- if message.nil?
91
- message = Message.new(code: code, message: "Unknown error", error: true)
92
- end
93
-
94
- message
95
- end
96
- end
97
- end
1
+ # frozen_string_literal: true
2
+
3
+ require "creditsafe/errors"
4
+
5
+ module Creditsafe
6
+ module Messages
7
+ class Message
8
+ attr_reader :code, :message, :error
9
+
10
+ def initialize(code: nil, message: nil, error: false)
11
+ raise ArgumentError, "Parameters 'code' and 'message' are mandatory" \
12
+ unless code && message
13
+ @code = code
14
+ @message = message
15
+ @error = error
16
+ end
17
+
18
+ alias_method :error?, :error
19
+
20
+ def error_class
21
+ return unless error?
22
+
23
+ case code[1].to_i
24
+ when 1 then Creditsafe::DataError
25
+ when 2 then Creditsafe::AccountError
26
+ when 3 then Creditsafe::RequestError
27
+ when 4 then Creditsafe::ProcessingError
28
+ else Creditsafe::UnknownApiError
29
+ end
30
+ end
31
+ end
32
+
33
+ # rubocop:disable Metrics/LineLength
34
+ NO_RESULTS = Message.new(code: "010101", message: "No results")
35
+ TOO_MANY_RESULTS = Message.new(code: "010102", message: "Too many results")
36
+ REPORT_UNAVAILABLE = Message.new(code: "010103", message: "Report unavailable", error: true)
37
+ REPORT_UNAVAILABLE_LEGAL = Message.new(code: "010104", message: "Report unavailable due to legal causes", error: true)
38
+ REPORT_UNAVAILABLE_ONLINE = Message.new(code: "010105", message: "Report unavailable online", error: true)
39
+ LEGAL_NOTICE = Message.new(code: "010106", message: "Legal notice")
40
+ INVALID_CREDENTIALS = Message.new(code: "020101", message: "Invalid credentials", error: true)
41
+ ACCESS_RESTRICTED = Message.new(code: "020102", message: "Access restricted", error: true)
42
+ ACCESS_LIMITS_NEARING = Message.new(code: "020103", message: "Access limits nearing")
43
+ REPORTBOX_ALMOST_FULL = Message.new(code: "020201", message: "Reportbox almost full", error: true)
44
+ REPORTBOX_FULL = Message.new(code: "020202", message: "Reportbox full", error: true)
45
+ INVALID_REQUEST_XML = Message.new(code: "030101", message: "Invalid request XML", error: true)
46
+ INVALID_OPERATION_PARAMS = Message.new(code: "030102", message: "Invalid operation parameters", error: true)
47
+ OPERATION_NOT_SUPPORTED = Message.new(code: "030103", message: "Operation not supported", error: true)
48
+ INVALID_CUSTOM_DATA_SPECIFIED = Message.new(code: "030104", message: "Invalid custom data specified", error: true)
49
+ CHANGE_NOTIFICATION = Message.new(code: "030201", message: "Change notification")
50
+ TEMPORARY_SYSTEM_PROBLEM = Message.new(code: "030202", message: "Temporary system problem", error: true)
51
+ ENDPOINT_SHUTDOWN = Message.new(code: "030203", message: "Endpoint shutdown", error: true)
52
+ UNEXPECTED_INTERNAL_ERROR = Message.new(code: "040101", message: "Unexpected internal error", error: true)
53
+ OTHER_ERROR = Message.new(code: "040102", message: "Other", error: true)
54
+ DATA_SERVICE_PROBLEMS = Message.new(code: "040103", message: "Data service access problems", error: true)
55
+ DATA_SERVICE_INVALID_RESPONSE = Message.new(code: "040104", message: "Data service invalid response", error: true)
56
+ # rubocop:enable Metrics/LineLength
57
+
58
+ ALL = [
59
+ NO_RESULTS,
60
+ TOO_MANY_RESULTS,
61
+ REPORT_UNAVAILABLE,
62
+ REPORT_UNAVAILABLE_LEGAL,
63
+ REPORT_UNAVAILABLE_ONLINE,
64
+ LEGAL_NOTICE,
65
+ INVALID_CREDENTIALS,
66
+ ACCESS_RESTRICTED,
67
+ ACCESS_LIMITS_NEARING,
68
+ REPORTBOX_ALMOST_FULL,
69
+ REPORTBOX_FULL,
70
+ INVALID_REQUEST_XML,
71
+ INVALID_OPERATION_PARAMS,
72
+ OPERATION_NOT_SUPPORTED,
73
+ INVALID_CUSTOM_DATA_SPECIFIED,
74
+ CHANGE_NOTIFICATION,
75
+ TEMPORARY_SYSTEM_PROBLEM,
76
+ ENDPOINT_SHUTDOWN,
77
+ UNEXPECTED_INTERNAL_ERROR,
78
+ OTHER_ERROR,
79
+ DATA_SERVICE_PROBLEMS,
80
+ DATA_SERVICE_INVALID_RESPONSE,
81
+ ].freeze
82
+
83
+ # Creditsafe documentation shows a 6 digit error code, however their API
84
+ # strips the leading 0. To comply with the docs, we pad the API code here to
85
+ # ensure we find the right match
86
+ def self.for_code(code)
87
+ padded_code = code.rjust(6, "0")
88
+ message = ALL.find { |msg| msg.code == padded_code }
89
+
90
+ if message.nil?
91
+ message = Message.new(code: code, message: "Unknown error", error: true)
92
+ end
93
+
94
+ message
95
+ end
96
+ end
97
+ end
@@ -1,20 +1,20 @@
1
- # frozen_string_literal: true
2
-
3
- module Creditsafe
4
- module Namespace
5
- OPER = "oper"
6
- OPER_VAL = "http://www.creditsafe.com/globaldata/operations"
7
-
8
- DAT = "dat"
9
- DAT_VAL = "http://www.creditsafe.com/globaldata/datatypes"
10
-
11
- CRED = "cred"
12
- CRED_VAL = "http://schemas.datacontract.org/2004/07/Creditsafe.GlobalData"
13
-
14
- ALL = {
15
- "xmlns:#{Creditsafe::Namespace::OPER}" => Creditsafe::Namespace::OPER_VAL,
16
- "xmlns:#{Creditsafe::Namespace::DAT}" => Creditsafe::Namespace::DAT_VAL,
17
- "xmlns:#{Creditsafe::Namespace::CRED}" => Creditsafe::Namespace::CRED_VAL,
18
- }.freeze
19
- end
20
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Creditsafe
4
+ module Namespace
5
+ OPER = "oper"
6
+ OPER_VAL = "http://www.creditsafe.com/globaldata/operations"
7
+
8
+ DAT = "dat"
9
+ DAT_VAL = "http://www.creditsafe.com/globaldata/datatypes"
10
+
11
+ CRED = "cred"
12
+ CRED_VAL = "http://schemas.datacontract.org/2004/07/Creditsafe.GlobalData"
13
+
14
+ ALL = {
15
+ "xmlns:#{Creditsafe::Namespace::OPER}" => Creditsafe::Namespace::OPER_VAL,
16
+ "xmlns:#{Creditsafe::Namespace::DAT}" => Creditsafe::Namespace::DAT_VAL,
17
+ "xmlns:#{Creditsafe::Namespace::CRED}" => Creditsafe::Namespace::CRED_VAL,
18
+ }.freeze
19
+ end
20
+ end
@@ -1,42 +1,42 @@
1
- # frozen_string_literal: true
2
-
3
- require "creditsafe/namespace"
4
-
5
- module Creditsafe
6
- module Request
7
- class CompanyReport
8
- def initialize(company_id, custom_data)
9
- @company_id = company_id
10
- @custom_data = custom_data
11
- end
12
-
13
- # rubocop:disable Metrics/MethodLength
14
- def message
15
- message = {
16
- "#{Creditsafe::Namespace::OPER}:companyId" => company_id.to_s,
17
- "#{Creditsafe::Namespace::OPER}:reportType" => "Full",
18
- "#{Creditsafe::Namespace::OPER}:language" => "EN",
19
- }
20
-
21
- unless custom_data.nil?
22
- message["#{Creditsafe::Namespace::OPER}:customData"] = {
23
- "#{Creditsafe::Namespace::DAT}:Entries" => {
24
- "#{Creditsafe::Namespace::DAT}:Entry" => custom_data_entries,
25
- },
26
- }
27
- end
28
-
29
- message
30
- end
31
- # rubocop:enable Metrics/MethodLength
32
-
33
- private
34
-
35
- def custom_data_entries
36
- custom_data.map { |key, value| { :@key => key, :content! => value } }
37
- end
38
-
39
- attr_reader :company_id, :custom_data
40
- end
41
- end
42
- end
1
+ # frozen_string_literal: true
2
+
3
+ require "creditsafe/namespace"
4
+
5
+ module Creditsafe
6
+ module Request
7
+ class CompanyReport
8
+ def initialize(company_id, custom_data)
9
+ @company_id = company_id
10
+ @custom_data = custom_data
11
+ end
12
+
13
+ # rubocop:disable Metrics/MethodLength
14
+ def message
15
+ message = {
16
+ "#{Creditsafe::Namespace::OPER}:companyId" => company_id.to_s,
17
+ "#{Creditsafe::Namespace::OPER}:reportType" => "Full",
18
+ "#{Creditsafe::Namespace::OPER}:language" => "EN",
19
+ }
20
+
21
+ unless custom_data.nil?
22
+ message["#{Creditsafe::Namespace::OPER}:customData"] = {
23
+ "#{Creditsafe::Namespace::DAT}:Entries" => {
24
+ "#{Creditsafe::Namespace::DAT}:Entry" => custom_data_entries,
25
+ },
26
+ }
27
+ end
28
+
29
+ message
30
+ end
31
+ # rubocop:enable Metrics/MethodLength
32
+
33
+ private
34
+
35
+ def custom_data_entries
36
+ custom_data.map { |key, value| { :@key => key, :content! => value } }
37
+ end
38
+
39
+ attr_reader :company_id, :custom_data
40
+ end
41
+ end
42
+ end
@@ -1,98 +1,98 @@
1
- # frozen_string_literal: true
2
-
3
- require "creditsafe/match_type"
4
- require "creditsafe/namespace"
5
-
6
- module Creditsafe
7
- module Request
8
- class FindCompany
9
- def initialize(search_criteria)
10
- check_search_criteria(search_criteria)
11
- @country_code = search_criteria[:country_code]
12
- @registration_number = search_criteria[:registration_number]
13
- @company_name = search_criteria[:company_name]
14
- @city = search_criteria[:city]
15
- @postal_code = search_criteria[:postal_code]
16
- end
17
-
18
- # rubocop:disable Metrics/MethodLength
19
- # rubocop:disable Metrics/AbcSize
20
- def message
21
- search_criteria = {}
22
-
23
- unless company_name.nil?
24
- search_criteria["#{Creditsafe::Namespace::DAT}:Name"] = {
25
- "@MatchType" => match_type,
26
- :content! => company_name,
27
- }
28
- end
29
-
30
- unless registration_number.nil?
31
- search_criteria["#{Creditsafe::Namespace::DAT}:RegistrationNumber"] =
32
- registration_number
33
- end
34
-
35
- unless city.nil?
36
- search_criteria["#{Creditsafe::Namespace::DAT}:Address"] = {
37
- "#{Creditsafe::Namespace::DAT}:City" => city,
38
- }
39
- end
40
-
41
- unless postal_code.nil?
42
- search_criteria["#{Creditsafe::Namespace::DAT}:Address"] = {
43
- "#{Creditsafe::Namespace::DAT}:PostalCode" => postal_code,
44
- }
45
- end
46
-
47
- build_message(search_criteria)
48
- end
49
- # rubocop:enable Metrics/AbcSize
50
- # rubocop:enable Metrics/MethodLength
51
-
52
- private
53
-
54
- attr_reader :country_code, :registration_number, :city, :company_name, :postal_code
55
-
56
- def match_type
57
- Creditsafe::MatchType::ALLOWED[country_code.upcase.to_sym]&.first ||
58
- Creditsafe::MatchType::MATCH_BLOCK
59
- end
60
-
61
- def build_message(search_criteria)
62
- {
63
- "#{Creditsafe::Namespace::OPER}:countries" => {
64
- "#{Creditsafe::Namespace::CRED}:CountryCode" => country_code,
65
- },
66
- "#{Creditsafe::Namespace::OPER}:searchCriteria" => search_criteria,
67
- }
68
- end
69
-
70
- # rubocop:disable Metrics/CyclomaticComplexity
71
- # rubocop:disable Metrics/MethodLength
72
- def check_search_criteria(search_criteria)
73
- if search_criteria[:country_code].nil?
74
- raise ArgumentError, "country_code is a required search criteria"
75
- end
76
-
77
- unless only_registration_number_or_company_name_provided?(search_criteria)
78
- raise ArgumentError, "registration_number or company_name (not both) are " \
79
- "required search criteria"
80
- end
81
-
82
- if search_criteria[:city] && search_criteria[:country_code] != "DE"
83
- raise ArgumentError, "city is only supported for German searches"
84
- end
85
-
86
- if search_criteria[:postal_code] && search_criteria[:country_code] != "DE"
87
- raise ArgumentError, "Postal code is only supported for German searches"
88
- end
89
- end
90
- # rubocop:enable Metrics/MethodLength
91
- # rubocop:enable Metrics/CyclomaticComplexity
92
-
93
- def only_registration_number_or_company_name_provided?(search_criteria)
94
- search_criteria[:registration_number].nil? ^ search_criteria[:company_name].nil?
95
- end
96
- end
97
- end
98
- end
1
+ # frozen_string_literal: true
2
+
3
+ require "creditsafe/match_type"
4
+ require "creditsafe/namespace"
5
+
6
+ module Creditsafe
7
+ module Request
8
+ class FindCompany
9
+ def initialize(search_criteria)
10
+ check_search_criteria(search_criteria)
11
+ @country_code = search_criteria[:country_code]
12
+ @registration_number = search_criteria[:registration_number]
13
+ @company_name = search_criteria[:company_name]
14
+ @city = search_criteria[:city]
15
+ @postal_code = search_criteria[:postal_code]
16
+ end
17
+
18
+ # rubocop:disable Metrics/MethodLength
19
+ # rubocop:disable Metrics/AbcSize
20
+ def message
21
+ search_criteria = {}
22
+
23
+ unless company_name.nil?
24
+ search_criteria["#{Creditsafe::Namespace::DAT}:Name"] = {
25
+ "@MatchType" => match_type,
26
+ :content! => company_name,
27
+ }
28
+ end
29
+
30
+ unless registration_number.nil?
31
+ search_criteria["#{Creditsafe::Namespace::DAT}:RegistrationNumber"] =
32
+ registration_number
33
+ end
34
+
35
+ unless city.nil?
36
+ search_criteria["#{Creditsafe::Namespace::DAT}:Address"] = {
37
+ "#{Creditsafe::Namespace::DAT}:City" => city,
38
+ }
39
+ end
40
+
41
+ unless postal_code.nil?
42
+ search_criteria["#{Creditsafe::Namespace::DAT}:Address"] = {
43
+ "#{Creditsafe::Namespace::DAT}:PostalCode" => postal_code,
44
+ }
45
+ end
46
+
47
+ build_message(search_criteria)
48
+ end
49
+ # rubocop:enable Metrics/AbcSize
50
+ # rubocop:enable Metrics/MethodLength
51
+
52
+ private
53
+
54
+ attr_reader :country_code, :registration_number, :city, :company_name, :postal_code
55
+
56
+ def match_type
57
+ Creditsafe::MatchType::ALLOWED[country_code.upcase.to_sym]&.first ||
58
+ Creditsafe::MatchType::MATCH_BLOCK
59
+ end
60
+
61
+ def build_message(search_criteria)
62
+ {
63
+ "#{Creditsafe::Namespace::OPER}:countries" => {
64
+ "#{Creditsafe::Namespace::CRED}:CountryCode" => country_code,
65
+ },
66
+ "#{Creditsafe::Namespace::OPER}:searchCriteria" => search_criteria,
67
+ }
68
+ end
69
+
70
+ # rubocop:disable Metrics/CyclomaticComplexity
71
+ # rubocop:disable Metrics/MethodLength
72
+ def check_search_criteria(search_criteria)
73
+ if search_criteria[:country_code].nil?
74
+ raise ArgumentError, "country_code is a required search criteria"
75
+ end
76
+
77
+ unless only_registration_number_or_company_name_provided?(search_criteria)
78
+ raise ArgumentError, "registration_number or company_name (not both) are " \
79
+ "required search criteria"
80
+ end
81
+
82
+ if search_criteria[:city] && search_criteria[:country_code] != "DE"
83
+ raise ArgumentError, "city is only supported for German searches"
84
+ end
85
+
86
+ if search_criteria[:postal_code] && search_criteria[:country_code] != "DE"
87
+ raise ArgumentError, "Postal code is only supported for German searches"
88
+ end
89
+ end
90
+ # rubocop:enable Metrics/MethodLength
91
+ # rubocop:enable Metrics/CyclomaticComplexity
92
+
93
+ def only_registration_number_or_company_name_provided?(search_criteria)
94
+ search_criteria[:registration_number].nil? ^ search_criteria[:company_name].nil?
95
+ end
96
+ end
97
+ end
98
+ end