creditsafe 0.6.2 → 0.6.3

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 (39) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +17 -17
  3. data/.gitignore +4 -3
  4. data/.rspec +1 -1
  5. data/.rubocop.yml +14 -11
  6. data/.ruby-version +1 -1
  7. data/CHANGELOG.md +57 -53
  8. data/Gemfile +5 -5
  9. data/LICENSE.txt +22 -22
  10. data/README.md +175 -175
  11. data/creditsafe.gemspec +34 -35
  12. data/data/creditsafe-live.xml +342 -342
  13. data/data/creditsafe-test.xml +342 -342
  14. data/lib/creditsafe.rb +4 -4
  15. data/lib/creditsafe/client.rb +165 -165
  16. data/lib/creditsafe/constants.rb +49 -49
  17. data/lib/creditsafe/errors.rb +17 -17
  18. data/lib/creditsafe/match_type.rb +115 -115
  19. data/lib/creditsafe/messages.rb +98 -98
  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 +120 -120
  23. data/lib/creditsafe/version.rb +5 -5
  24. data/spec/creditsafe/client_spec.rb +431 -431
  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 +39 -40
  39. data/Gemfile.lock +0 -129
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 574436fed3fd1ff817c3d238e48f7b995792427aad3b55aea895581e3ef5aeb0
4
- data.tar.gz: 420886b4cd88825d964645b3a4a8c820e729a15f446bf283067f540801648108
3
+ metadata.gz: e5e6b555edb6131078c45308e06860adbfb18afdf8326eccedf0e3b40bf12d32
4
+ data.tar.gz: 04e6caab6be667db17b3d2f0dea79c610b2b3e2972066cdbb0d97fdbaf65b9d4
5
5
  SHA512:
6
- metadata.gz: af65359728b85b2c837c9f91e4470a61871fca66cab038a9a08469f483edf80d2ff866d139ce4d0442007d42a9437e7969eef562599ac5df868d93af45a1d48b
7
- data.tar.gz: aacbf30d67d4e984a9dc2a30a0c4f219442ca4a2b25760f38e7d064b5032708357c21456ace8bb0c6f6c37f4d3590b97847d51b896c92c7393ebcffdd031d5d0
6
+ metadata.gz: dd71392a827914caf224daf0d4d4f7b5b99628e7f08679e93cdea57ab2d91893931cd0942b8c8fc1f5e0b2942cd375193fb80d883f41068cdc24871148e38ab0
7
+ data.tar.gz: 4f430154fc5c8d6414426f92f75b09dc340bd9506abd9899cd7711eaeda28aaf4f98ce4f5a0ace1758e11bcc024bf93c7207f97ff8a1a448d2a187af4fdcba89
@@ -1,17 +1,17 @@
1
- version: 2
2
- jobs:
3
- build:
4
- working_directory: ~/creditsafe-ruby
5
- docker:
6
- - image: ruby:2.5.0
7
- steps:
8
- - checkout
9
- - restore_cache:
10
- key: gemfile-{{ checksum "Gemfile" }}
11
- - run: bundle install --path vendor/bundle
12
- - save_cache:
13
- key: gemfile-{{ checksum "Gemfile" }}
14
- paths:
15
- - "vendor/bundle"
16
- - run: bundle exec rubocop
17
- - run: bundle exec rspec --format RspecJunitFormatter
1
+ version: 2
2
+ jobs:
3
+ build:
4
+ working_directory: ~/creditsafe-ruby
5
+ docker:
6
+ - image: ruby:2.5
7
+ steps:
8
+ - checkout
9
+ - restore_cache:
10
+ key: bundler-v1-{{ checksum "creditsafe.gemspec" }}-{{ checksum ".ruby-version" }}
11
+ - run: bundle install --path vendor/bundle
12
+ - save_cache:
13
+ key: bundler-v1-{{ checksum "creditsafe.gemspec" }}-{{ checksum ".ruby-version" }}
14
+ paths:
15
+ - "vendor/bundle"
16
+ - run: bundle exec rubocop
17
+ - run: bundle exec rspec --format RspecJunitFormatter
data/.gitignore CHANGED
@@ -1,3 +1,4 @@
1
- .bundle/
2
- bin/
3
- *.gem
1
+ .bundle/
2
+ bin/
3
+ *.gem
4
+ Gemfile.lock
data/.rspec CHANGED
@@ -1 +1 @@
1
- --color
1
+ --color
@@ -1,11 +1,14 @@
1
- inherit_gem:
2
- gc_ruboconfig: rubocop.yml
3
-
4
- RSpec/NestedGroups:
5
- Max: 5
6
-
7
- RSpec/ExampleLength:
8
- Max: 20
9
-
10
- RSpec/MultipleExpectations:
11
- Max: 2
1
+ inherit_gem:
2
+ gc_ruboconfig: rubocop.yml
3
+
4
+ RSpec/NestedGroups:
5
+ Max: 5
6
+
7
+ RSpec/ExampleLength:
8
+ Max: 20
9
+
10
+ RSpec/MultipleExpectations:
11
+ Max: 2
12
+
13
+ RSpec/ImplicitBlockExpectation:
14
+ Enabled: false
@@ -1 +1 @@
1
- 2.5.3
1
+ 2.5.6
@@ -1,53 +1,57 @@
1
- ## v0.6.2, 4 January 2019
2
-
3
- - Treat Bad Gateway (502) errors separately
4
-
5
- ## v0.6.1, 6 November 2018
6
-
7
- - Update dependencies: activesupport, nokogiri, pry, rack
8
-
9
- ## v0.6.0, 25 September 2018
10
-
11
- - Add searching by VAT number
12
-
13
- ## v0.5.2, 29 March 2018
14
-
15
- - Raise `Creditsafe::TimeoutError` when a request times out
16
-
17
- ## v0.5.1, 1 March 2018
18
-
19
- - Update allowed MatchTypes for some geos to reflect real world tests
20
-
21
- ## v0.5.0, 27 February 2018
22
-
23
- - Automatically chooses a valid MatchType when searching for companies by name
24
-
25
- ## v0.4.0, 3 April 2017
26
-
27
- - Adds support for including a postal code when searching for German companies by name
28
- (@manojapr)
29
-
30
- ## v0.3.2, 27 February 2017
31
-
32
- - Adds support for using Creditsafe's test environment, specified when instantiating the
33
- client, as well as customising the log level used by the Savon SOAP client
34
- - Adds support for finding companies in Germany by name, as well as company number
35
-
36
- ## v0.3.1, 6 January 2017
37
-
38
- - Suppress password when inspecting client
39
-
40
- ## v0.3.0, 4 August 2016
41
-
42
- - Add instrumentation to SOAP requests
43
-
44
- ## v0.2.0, 16 March 2016
45
-
46
- - Subclass `ApiError` to distinguish between different Creditsafe error types
47
- (patch by [greysteil](https://github.com/greysteil))
48
-
49
-
50
- ## v0.1.1, 15 February 2016
51
-
52
- - Allow `city` parameter in `find_company` for German company lookups
53
- (patch by [greysteil](https://github.com/greysteil))
1
+ ## v0.6.3, 18 December 2019
2
+
3
+ - Update dependencies: excon
4
+
5
+ ## v0.6.2, 4 January 2019
6
+
7
+ - Treat Bad Gateway (502) errors separately
8
+
9
+ ## v0.6.1, 6 November 2018
10
+
11
+ - Update dependencies: activesupport, nokogiri, pry, rack
12
+
13
+ ## v0.6.0, 25 September 2018
14
+
15
+ - Add searching by VAT number
16
+
17
+ ## v0.5.2, 29 March 2018
18
+
19
+ - Raise `Creditsafe::TimeoutError` when a request times out
20
+
21
+ ## v0.5.1, 1 March 2018
22
+
23
+ - Update allowed MatchTypes for some geos to reflect real world tests
24
+
25
+ ## v0.5.0, 27 February 2018
26
+
27
+ - Automatically chooses a valid MatchType when searching for companies by name
28
+
29
+ ## v0.4.0, 3 April 2017
30
+
31
+ - Adds support for including a postal code when searching for German companies by name
32
+ (@manojapr)
33
+
34
+ ## v0.3.2, 27 February 2017
35
+
36
+ - Adds support for using Creditsafe's test environment, specified when instantiating the
37
+ client, as well as customising the log level used by the Savon SOAP client
38
+ - Adds support for finding companies in Germany by name, as well as company number
39
+
40
+ ## v0.3.1, 6 January 2017
41
+
42
+ - Suppress password when inspecting client
43
+
44
+ ## v0.3.0, 4 August 2016
45
+
46
+ - Add instrumentation to SOAP requests
47
+
48
+ ## v0.2.0, 16 March 2016
49
+
50
+ - Subclass `ApiError` to distinguish between different Creditsafe error types
51
+ (patch by [greysteil](https://github.com/greysteil))
52
+
53
+
54
+ ## v0.1.1, 15 February 2016
55
+
56
+ - Allow `city` parameter in `find_company` for German company lookups
57
+ (patch by [greysteil](https://github.com/greysteil))
data/Gemfile CHANGED
@@ -1,5 +1,5 @@
1
- # frozen_string_literal: true
2
-
3
- source 'https://rubygems.org'
4
-
5
- gemspec
1
+ # frozen_string_literal: true
2
+
3
+ source 'https://rubygems.org'
4
+
5
+ gemspec
@@ -1,22 +1,22 @@
1
- Copyright (c) 2017 GoCardless Ltd
2
-
3
- MIT License
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining
6
- a copy of this software and associated documentation files (the
7
- "Software"), to deal in the Software without restriction, including
8
- without limitation the rights to use, copy, modify, merge, publish,
9
- distribute, sublicense, and/or sell copies of the Software, and to
10
- permit persons to whom the Software is furnished to do so, subject to
11
- the following conditions:
12
-
13
- The above copyright notice and this permission notice shall be
14
- included in all copies or substantial portions of the Software.
15
-
16
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
- LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
- OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
1
+ Copyright (c) 2017 GoCardless Ltd
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md CHANGED
@@ -1,175 +1,175 @@
1
- # creditsafe-ruby
2
-
3
- *Build status: [![Circle CI](https://circleci.com/gh/gocardless/creditsafe-ruby.svg?style=svg&circle-token=3f6e9b24fcc6a57abac110c59395b36032f156a5)](https://circleci.com/gh/gocardless/creditsafe-ruby)*
4
-
5
- A ruby library for interacting with the
6
- [Creditsafe](http://www.creditsafeuk.com/) API.
7
-
8
- Currently, it only partially implements the API to support finding companies by
9
- registration number (and name in Germany), and retrieving company online reports.
10
-
11
- # Installation
12
-
13
- Install the gem from RubyGems.org by adding the following to your `Gemfile`:
14
-
15
- ```ruby
16
- gem 'creditsafe', '~> 0.4.0'
17
- ```
18
-
19
- Just run `bundle install` to install the gem and its dependencies.
20
-
21
- # Usage
22
-
23
- Initialise the client with your `username` and `password`.
24
-
25
- ```ruby
26
- client = Creditsafe::Client.new(username: "foo", password: "bar")
27
-
28
- # optionally with environment (live is default) and or log level
29
- client = Creditsafe::Client.new(username: "foo", password: "bar", environment: :test, log_level: :debug)
30
- ```
31
-
32
- ### Company Search
33
-
34
- To perform a search for a company, you need to provide a valid search criteria, including
35
- the country code and a company registration number or company name:
36
-
37
- ```ruby
38
- client.find_company({ country_code: "GB", registration_number: "07495895" })
39
- => {
40
- name: "GOCARDLESS LTD",
41
- type: "Ltd",
42
- status: "Active",
43
- registration_number: "07495895",
44
- address: {
45
- simple_value: "338-346, GOSWELL, LONDON",
46
- postal_code: "EC1V7LQ"
47
- },
48
- available_report_types: { available_report_type: "Full" },
49
- available_languages: { available_language: "EN" },
50
- @date_of_latest_accounts: "2014-01-31T00:00:00Z",
51
- @online_reports: "true",
52
- @monitoring: "false",
53
- @country: "GB",
54
- @id: "GB003/0/07495895"
55
- }
56
- ```
57
-
58
- In Germany you can also perform a name search. For this you need to provide a country code
59
- and a company name, and can optionally provide a postal code or city to filter the results
60
- further:
61
-
62
- ```ruby
63
- client.find_company({ country_code: "DE", company_name: "zalando", postal_code: "10243" })
64
- => [
65
- {
66
- "name": "Zalando Logistics Süd SE & Co. KG",
67
- "type": "NonLtd",
68
- "status": "Active",
69
- "address": {
70
- "street": "Tamara-Danz-Str. 1",
71
- "city": "Berlin",
72
- "postal_code": "10243"
73
- },
74
- "available_report_types": {
75
- "available_report_type": [
76
- "Full",
77
- "Basic"
78
- ]
79
- },
80
- "available_languages": {
81
- "available_language": [
82
- "EN",
83
- "DE"
84
- ]
85
- },
86
- "@online_reports": "true",
87
- "@monitoring": "true",
88
- "@country": "DE",
89
- "@id": "DE001/1/DE20316785",
90
- "@safe_number": "DE20316785"
91
- },
92
- {
93
- "name": "Zalando Outlet Store Berlin",
94
- "type": "NonLtd",
95
- "status": "Active",
96
- "address": {
97
- "street": "Köpenicker Str. 20",
98
- "city": "Berlin",
99
- "postal_code": "10997"
100
- },
101
- "available_report_types": {
102
- "available_report_type": [
103
- "Full",
104
- "Basic"
105
- ]
106
- },
107
- "available_languages": {
108
- "available_language": [
109
- "EN",
110
- "DE"
111
- ]
112
- },
113
- "@online_reports": "true",
114
- "@monitoring": "true",
115
- "@country": "DE",
116
- "@id": "DE001/1/DE16031795",
117
- "@safe_number": "DE16031795"
118
- },
119
- ...
120
- ]
121
- ```
122
-
123
- In some countries you can also perform a VAT number search. For this, you need to provide
124
- a country code and a VAT number:
125
-
126
- ```ruby
127
- client.find_company({ country_code: "US", vat_number: "201665019" })
128
- => [
129
- {
130
- "name": "FACEBOOK, INCORPORATED",
131
- "officeType": "HeadOffice",
132
- "status": "Active",
133
- "registration_number": "0883875",
134
- "vat_number": "201665019",
135
- "address": {
136
- "simple_value": "1601 WILLOW ROAD , MENLO PARK, CA, 94025",
137
- "street": "1601 WILLOW ROAD ",
138
- "city": "MENLO PARK",
139
- "postal_code": "94025",
140
- "province": "CA"
141
- },
142
- "phone_number": "6505434800",
143
- "available_report_types": {
144
- "available_report_type": "Full"
145
- },
146
- "available_languages": {
147
- "available_language": "EN"
148
- },
149
- "@online_reports": "true",
150
- "@monitoring": "false",
151
- "@country": "US",
152
- "@id": "US023/X/US22964593",
153
- "@safe_number": "US22964593"
154
- },
155
- ...
156
- ]
157
- ```
158
-
159
- ### Company Report
160
-
161
- To download all the information available in an online company report, you will
162
- need the company's Creditsafe identifier (obtainable using
163
- [find_company](#find_company) above):
164
-
165
- ```ruby
166
- client.company_report("GB003/0/07495895")
167
- => {
168
- ...
169
- }
170
- ```
171
-
172
-
173
- ---
174
-
175
- GoCardless ♥ open source. If you do too, come [join us](https://gocardless.com/jobs#software-engineer).
1
+ # creditsafe-ruby
2
+
3
+ *Build status: [![Circle CI](https://circleci.com/gh/gocardless/creditsafe-ruby.svg?style=svg&circle-token=3f6e9b24fcc6a57abac110c59395b36032f156a5)](https://circleci.com/gh/gocardless/creditsafe-ruby)*
4
+
5
+ A ruby library for interacting with the
6
+ [Creditsafe](http://www.creditsafeuk.com/) API.
7
+
8
+ Currently, it only partially implements the API to support finding companies by
9
+ registration number (and name in Germany), and retrieving company online reports.
10
+
11
+ # Installation
12
+
13
+ Install the gem from RubyGems.org by adding the following to your `Gemfile`:
14
+
15
+ ```ruby
16
+ gem 'creditsafe', '~> 0.4.0'
17
+ ```
18
+
19
+ Just run `bundle install` to install the gem and its dependencies.
20
+
21
+ # Usage
22
+
23
+ Initialise the client with your `username` and `password`.
24
+
25
+ ```ruby
26
+ client = Creditsafe::Client.new(username: "foo", password: "bar")
27
+
28
+ # optionally with environment (live is default) and or log level
29
+ client = Creditsafe::Client.new(username: "foo", password: "bar", environment: :test, log_level: :debug)
30
+ ```
31
+
32
+ ### Company Search
33
+
34
+ To perform a search for a company, you need to provide a valid search criteria, including
35
+ the country code and a company registration number or company name:
36
+
37
+ ```ruby
38
+ client.find_company({ country_code: "GB", registration_number: "07495895" })
39
+ => {
40
+ name: "GOCARDLESS LTD",
41
+ type: "Ltd",
42
+ status: "Active",
43
+ registration_number: "07495895",
44
+ address: {
45
+ simple_value: "338-346, GOSWELL, LONDON",
46
+ postal_code: "EC1V7LQ"
47
+ },
48
+ available_report_types: { available_report_type: "Full" },
49
+ available_languages: { available_language: "EN" },
50
+ @date_of_latest_accounts: "2014-01-31T00:00:00Z",
51
+ @online_reports: "true",
52
+ @monitoring: "false",
53
+ @country: "GB",
54
+ @id: "GB003/0/07495895"
55
+ }
56
+ ```
57
+
58
+ In Germany you can also perform a name search. For this you need to provide a country code
59
+ and a company name, and can optionally provide a postal code or city to filter the results
60
+ further:
61
+
62
+ ```ruby
63
+ client.find_company({ country_code: "DE", company_name: "zalando", postal_code: "10243" })
64
+ => [
65
+ {
66
+ "name": "Zalando Logistics Süd SE & Co. KG",
67
+ "type": "NonLtd",
68
+ "status": "Active",
69
+ "address": {
70
+ "street": "Tamara-Danz-Str. 1",
71
+ "city": "Berlin",
72
+ "postal_code": "10243"
73
+ },
74
+ "available_report_types": {
75
+ "available_report_type": [
76
+ "Full",
77
+ "Basic"
78
+ ]
79
+ },
80
+ "available_languages": {
81
+ "available_language": [
82
+ "EN",
83
+ "DE"
84
+ ]
85
+ },
86
+ "@online_reports": "true",
87
+ "@monitoring": "true",
88
+ "@country": "DE",
89
+ "@id": "DE001/1/DE20316785",
90
+ "@safe_number": "DE20316785"
91
+ },
92
+ {
93
+ "name": "Zalando Outlet Store Berlin",
94
+ "type": "NonLtd",
95
+ "status": "Active",
96
+ "address": {
97
+ "street": "Köpenicker Str. 20",
98
+ "city": "Berlin",
99
+ "postal_code": "10997"
100
+ },
101
+ "available_report_types": {
102
+ "available_report_type": [
103
+ "Full",
104
+ "Basic"
105
+ ]
106
+ },
107
+ "available_languages": {
108
+ "available_language": [
109
+ "EN",
110
+ "DE"
111
+ ]
112
+ },
113
+ "@online_reports": "true",
114
+ "@monitoring": "true",
115
+ "@country": "DE",
116
+ "@id": "DE001/1/DE16031795",
117
+ "@safe_number": "DE16031795"
118
+ },
119
+ ...
120
+ ]
121
+ ```
122
+
123
+ In some countries you can also perform a VAT number search. For this, you need to provide
124
+ a country code and a VAT number:
125
+
126
+ ```ruby
127
+ client.find_company({ country_code: "US", vat_number: "201665019" })
128
+ => [
129
+ {
130
+ "name": "FACEBOOK, INCORPORATED",
131
+ "officeType": "HeadOffice",
132
+ "status": "Active",
133
+ "registration_number": "0883875",
134
+ "vat_number": "201665019",
135
+ "address": {
136
+ "simple_value": "1601 WILLOW ROAD , MENLO PARK, CA, 94025",
137
+ "street": "1601 WILLOW ROAD ",
138
+ "city": "MENLO PARK",
139
+ "postal_code": "94025",
140
+ "province": "CA"
141
+ },
142
+ "phone_number": "6505434800",
143
+ "available_report_types": {
144
+ "available_report_type": "Full"
145
+ },
146
+ "available_languages": {
147
+ "available_language": "EN"
148
+ },
149
+ "@online_reports": "true",
150
+ "@monitoring": "false",
151
+ "@country": "US",
152
+ "@id": "US023/X/US22964593",
153
+ "@safe_number": "US22964593"
154
+ },
155
+ ...
156
+ ]
157
+ ```
158
+
159
+ ### Company Report
160
+
161
+ To download all the information available in an online company report, you will
162
+ need the company's Creditsafe identifier (obtainable using
163
+ [find_company](#find_company) above):
164
+
165
+ ```ruby
166
+ client.company_report("GB003/0/07495895")
167
+ => {
168
+ ...
169
+ }
170
+ ```
171
+
172
+
173
+ ---
174
+
175
+ GoCardless ♥ open source. If you do too, come [join us](https://gocardless.com/jobs#software-engineer).