ibancom 0.0.1

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.
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
data/ibancom.gemspec ADDED
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "lib/ibancom/version"
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "ibancom"
7
+ spec.version = Ibancom::VERSION
8
+ spec.authors = ["Aitor García Rey"]
9
+ spec.email = ["aitor@devengo.com"]
10
+
11
+ spec.summary = "Ruby client for iban.com APIs"
12
+ spec.description = "Ruby client for iban.com APIs"
13
+ spec.homepage = "https://github.com/devengo/ibancom-ruby"
14
+ spec.license = "MIT"
15
+
16
+ spec.metadata["homepage_uri"] = spec.homepage
17
+ spec.metadata["source_code_uri"] = "https://github.com/devengo/ibancom-ruby"
18
+ spec.metadata["rubygems_mfa_required"] = "true"
19
+
20
+ # Specify which files should be added to the gem when it is released.
21
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
22
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
23
+ `git ls-files -z`.split("\x0").reject do |f|
24
+ (f == __FILE__) || f.match(%r{\A(?:(?:test|spec|features)/|\.(?:git|travis|circleci)|appveyor)})
25
+ end
26
+ end
27
+
28
+ spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
29
+ spec.require_paths = ["lib"]
30
+
31
+ spec.required_ruby_version = ">= 2.6.0"
32
+ spec.add_dependency "faraday", ">= 0.15"
33
+
34
+ spec.add_development_dependency "guard", "~> 2.0"
35
+ spec.add_development_dependency "guard-rspec", "~> 4.0"
36
+ spec.add_development_dependency "rake", "~> 12.0"
37
+ spec.add_development_dependency "rspec", "~> 3.0"
38
+ spec.add_development_dependency "rubocop", "~> 1.2"
39
+ spec.add_development_dependency "rubocop-performance", "~> 1.0"
40
+ spec.add_development_dependency "rubocop-rake", "~> 0.6"
41
+ spec.add_development_dependency "rubocop-rspec", "~> 2.0"
42
+ spec.add_development_dependency "test-prof", "~> 1.0"
43
+ spec.add_development_dependency "webmock", "~> 3.0"
44
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Ibancom
4
+ module API
5
+ class Service
6
+ attr_reader :client
7
+
8
+ def initialize(client)
9
+ @client = client
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "service"
4
+ require_relative "validation_service"
5
+
6
+ module Ibancom
7
+ module API
8
+ module Services
9
+ def validations
10
+ @services[:validation] ||= API::ValidationService.new(self)
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Ibancom
4
+ module API
5
+ class ValidationService < Service
6
+ def validate(iban)
7
+ response = client.post("/v4/iban/", { iban: iban, sci: 1 })
8
+ Resources::IBAN::Validation.new(response, response.body)
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,121 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "faraday"
4
+ require "securerandom"
5
+
6
+ # require "faraday_middleware"
7
+ require_relative "api/services"
8
+ require_relative "resources/base"
9
+
10
+ module Ibancom
11
+ class Client
12
+ include Ibancom::API::Services
13
+
14
+ BASE_URL = "https://api.iban.com/clients/api"
15
+
16
+ attr_reader :base_url, :user_agent, :proxy, :apikey, :logger_enabled
17
+
18
+ def initialize(options = {})
19
+ @base_url = options[:base_url] || BASE_URL
20
+ @user_agent = options[:user_agent] || default_user_agent
21
+ @proxy = options[:proxy]
22
+ @apikey = options[:apikey] || ENV["IBANCOM_APIKEY"]
23
+ @logger_enabled = options[:logger_enabled].nil? ? true : options[:logger_enabled]
24
+ @services = {}
25
+ end
26
+
27
+ def connection
28
+ @connection ||= Faraday.new do |builder|
29
+ builder.request :url_encoded
30
+ builder.use Faraday::Response::RaiseError
31
+ builder.response :json,
32
+ content_type: /\bjson$/,
33
+ preserve_raw: true,
34
+ parser_options: { symbolize_names: true }
35
+ builder.proxy = @proxy if proxy
36
+ if @logger_enabled
37
+ builder.response :logger, nil, { headers: true, bodies: true } do |logger|
38
+ logger.filter(/("password":)"(\w+)"/, '\1[FILTERED]')
39
+ end
40
+ end
41
+ builder.adapter :net_http
42
+ end
43
+ end
44
+
45
+ def resources
46
+ @resources ||= {}
47
+ end
48
+
49
+ def default_user_agent
50
+ "Ibancom/#{Ibancom::VERSION} Ruby Client (Faraday/#{Faraday::VERSION})"
51
+ end
52
+
53
+ def get(path, options = {})
54
+ execute :get, path, nil, options
55
+ end
56
+
57
+ def post(path, data = nil, options = {})
58
+ execute :post, path, data, options
59
+ end
60
+
61
+ def patch(path, data = nil, options = {})
62
+ execute :patch, path, data, options
63
+ end
64
+
65
+ def execute(method, path, data = nil, options = {})
66
+ request(method, path, data, options)
67
+ end
68
+
69
+ def request(method, path, data = nil, options = {})
70
+ request_options = request_options(method, path, data, options)
71
+ uri = "#{base_url}#{path}"
72
+
73
+ begin
74
+ connection.run_request(method, uri, request_options[:body], request_options[:headers])
75
+ rescue StandardError => e
76
+ handle_request_error(e)
77
+ end
78
+ end
79
+
80
+ def request_options(_method, _path, data, _options)
81
+ default_options.tap do |defaults|
82
+ defaults[:body] = defaults[:body].merge(data)
83
+ end
84
+ end
85
+
86
+ def handle_request_error(error)
87
+ case error
88
+ when Faraday::ClientError
89
+ if error.response
90
+ handle_error_response(error)
91
+ else
92
+ handle_network_error(error)
93
+ end
94
+ else
95
+ raise error
96
+ end
97
+ end
98
+
99
+ def handle_error_response(error)
100
+ puts "ERROR #{error.response}"
101
+ raise error
102
+ end
103
+
104
+ def handle_network_error(error)
105
+ raise error
106
+ end
107
+
108
+ private def default_options
109
+ {
110
+ url: base_url,
111
+ headers: {
112
+ "User-Agent": default_user_agent,
113
+ },
114
+ body: {
115
+ format: "json",
116
+ api_key: apikey,
117
+ },
118
+ }
119
+ end
120
+ end
121
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Ibancom
4
+ module Resources
5
+ class Base
6
+ attr_reader :response
7
+
8
+ def initialize(response, attributes = {})
9
+ @response = response
10
+ attributes.each do |key, value|
11
+ m = "#{key}=".to_sym
12
+ send(m, value) if respond_to?(m)
13
+ end
14
+ end
15
+
16
+ def self.map(original_attribute, mapped_attributes)
17
+ class_eval { attr_writer original_attribute.to_sym }
18
+ mapped_attributes = [mapped_attributes].flatten
19
+ mapped_attributes.each do |mapped_attribute|
20
+ define_method(mapped_attribute) { instance_variable_get("@#{original_attribute}") }
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+
27
+ require_relative "collection"
28
+ require_relative "iban/validation"
29
+ require_relative "iban/bank"
30
+ require_relative "iban/checks"
31
+ require_relative "iban/check"
32
+ require_relative "iban/schemes"
33
+ require_relative "iban/scheme"
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Ibancom
4
+ module Resources
5
+ class Collection
6
+ include Enumerable
7
+ attr_reader :response
8
+
9
+ def initialize(response, item_klass, attributes_collection = [])
10
+ @response = response
11
+ @attributes_collection = attributes_collection
12
+ @items = attributes_collection.map { |attributes_item| item_klass.new(nil, attributes_item) }
13
+ end
14
+
15
+ def each(&block)
16
+ @items.each(&block)
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Ibancom
4
+ module Resources
5
+ module IBAN
6
+ class Bank < Base
7
+ attr_accessor :bic,
8
+ :branch,
9
+ :bank,
10
+ :address,
11
+ :city,
12
+ :state,
13
+ :zip,
14
+ :phone,
15
+ :fax,
16
+ :www,
17
+ :email,
18
+ :country,
19
+ :country_iso,
20
+ :account,
21
+ :bank_code,
22
+ :branch_code
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Ibancom
4
+ module Resources
5
+ module IBAN
6
+ class Check < Base
7
+ PASSED_MESSAGES = {
8
+ "001" => "IBAN Check digit is correct",
9
+ "002" => "Account Number check digit is correct",
10
+ "003" => "IBAN Length is correct",
11
+ "005" => "IBAN structure is correct",
12
+ "006" => "IBAN does not contain illegal characters",
13
+ "007" => "Country supports IBAN standard",
14
+ }.freeze
15
+
16
+ attr_accessor :type,
17
+ :code,
18
+ :message
19
+
20
+ def passed?
21
+ PASSED_MESSAGES[code] == message
22
+ end
23
+
24
+ def failed?
25
+ !passed?
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Ibancom
4
+ module Resources
5
+ module IBAN
6
+ class Checks < Collection
7
+ def initialize(response, attributes_collection)
8
+ parsed = attributes_collection.map do |check_attributes|
9
+ {
10
+ type: check_attributes[0],
11
+ code: check_attributes[1][:code],
12
+ message: check_attributes[1][:message],
13
+ }
14
+ end
15
+ super(response, Check, parsed)
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Ibancom
4
+ module Resources
5
+ module IBAN
6
+ class Scheme < Base
7
+ attr_accessor :code,
8
+ :supported
9
+
10
+ def supported?
11
+ supported == "YES"
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Ibancom
4
+ module Resources
5
+ module IBAN
6
+ class Schemes < Collection
7
+ def initialize(response, attributes_collection)
8
+ parsed = attributes_collection.map do |attributes|
9
+ {
10
+ code: attributes[0],
11
+ supported: attributes[1],
12
+ }
13
+ end
14
+ super(response, Scheme, parsed)
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Ibancom
4
+ module Resources
5
+ module IBAN
6
+ class Validation < Base
7
+ attr_reader :bank,
8
+ :checks,
9
+ :schemes
10
+
11
+ def initialize(response, attributes = {})
12
+ super(response, attributes)
13
+ @bank = Bank.new(response, attributes[:bank_data])
14
+ @checks = Checks.new(response, attributes[:validations])
15
+ @schemes = Schemes.new(response, attributes[:sepa_data])
16
+ end
17
+
18
+ def valid?
19
+ checks.all?(&:passed?)
20
+ end
21
+
22
+ def failed_checks
23
+ checks.select(&:failed?)
24
+ end
25
+
26
+ def supported_schemes
27
+ schemes.select(&:supported?)
28
+ end
29
+
30
+ def supported_scheme?(code)
31
+ scheme = supported_schemes.find { |supported| supported.code == code }
32
+ scheme&.supported?
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Ibancom
4
+ VERSION = "0.0.1"
5
+ end
data/lib/ibancom.rb ADDED
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "ibancom/version"
4
+ require_relative "ibancom/client"
5
+
6
+ module Ibancom
7
+ end
data/sig/ibancom.rbs ADDED
@@ -0,0 +1,4 @@
1
+ module Ibancom
2
+ VERSION: String
3
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
4
+ end
metadata ADDED
@@ -0,0 +1,228 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ibancom
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Aitor García Rey
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2022-08-25 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: faraday
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0.15'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0.15'
27
+ - !ruby/object:Gem::Dependency
28
+ name: guard
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '2.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '2.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: guard-rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '4.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '4.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '12.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '12.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '3.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '3.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rubocop
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '1.2'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '1.2'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rubocop-performance
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '1.0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '1.0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rubocop-rake
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '0.6'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '0.6'
125
+ - !ruby/object:Gem::Dependency
126
+ name: rubocop-rspec
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '2.0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '2.0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: test-prof
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: '1.0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: '1.0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: webmock
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - "~>"
158
+ - !ruby/object:Gem::Version
159
+ version: '3.0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - "~>"
165
+ - !ruby/object:Gem::Version
166
+ version: '3.0'
167
+ description: Ruby client for iban.com APIs
168
+ email:
169
+ - aitor@devengo.com
170
+ executables: []
171
+ extensions: []
172
+ extra_rdoc_files: []
173
+ files:
174
+ - ".markdownlint.yaml"
175
+ - ".rspec"
176
+ - ".rubocop.yml"
177
+ - ".rubocop_devengo.yml"
178
+ - CODE_OF_CONDUCT.md
179
+ - Gemfile
180
+ - Gemfile.lock
181
+ - LICENSE.txt
182
+ - README.md
183
+ - Rakefile
184
+ - bin/console
185
+ - bin/setup
186
+ - ibancom.gemspec
187
+ - lib/ibancom.rb
188
+ - lib/ibancom/api/service.rb
189
+ - lib/ibancom/api/services.rb
190
+ - lib/ibancom/api/validation_service.rb
191
+ - lib/ibancom/client.rb
192
+ - lib/ibancom/resources/base.rb
193
+ - lib/ibancom/resources/collection.rb
194
+ - lib/ibancom/resources/iban/bank.rb
195
+ - lib/ibancom/resources/iban/check.rb
196
+ - lib/ibancom/resources/iban/checks.rb
197
+ - lib/ibancom/resources/iban/scheme.rb
198
+ - lib/ibancom/resources/iban/schemes.rb
199
+ - lib/ibancom/resources/iban/validation.rb
200
+ - lib/ibancom/version.rb
201
+ - sig/ibancom.rbs
202
+ homepage: https://github.com/devengo/ibancom-ruby
203
+ licenses:
204
+ - MIT
205
+ metadata:
206
+ homepage_uri: https://github.com/devengo/ibancom-ruby
207
+ source_code_uri: https://github.com/devengo/ibancom-ruby
208
+ rubygems_mfa_required: 'true'
209
+ post_install_message:
210
+ rdoc_options: []
211
+ require_paths:
212
+ - lib
213
+ required_ruby_version: !ruby/object:Gem::Requirement
214
+ requirements:
215
+ - - ">="
216
+ - !ruby/object:Gem::Version
217
+ version: 2.6.0
218
+ required_rubygems_version: !ruby/object:Gem::Requirement
219
+ requirements:
220
+ - - ">="
221
+ - !ruby/object:Gem::Version
222
+ version: '0'
223
+ requirements: []
224
+ rubygems_version: 3.3.7
225
+ signing_key:
226
+ specification_version: 4
227
+ summary: Ruby client for iban.com APIs
228
+ test_files: []