bankin-api-ruby 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: db78af9475eadffd4121bc1abf54c950df99b9be
4
+ data.tar.gz: 6bf8d6f6791b6361e8d2e2d76f3aacb4308ba0b1
5
+ SHA512:
6
+ metadata.gz: a41d3d670a410dde6873ccb8f348ef3dfc5c3056d0f80408360fb3b88465c3a34a810f24c413182d9aebce2959e7933467dacc2b4fc9de8ef13435e486e721b4
7
+ data.tar.gz: e51b1c9b4549c9acb978c36c2a502f2280e251cbbed02f3a2d24b5e7b0511083a886b888dbd1d1739b0ff2c62dffbcd4d23cd6e1d3c92fe9c4613ae04d5826bb
@@ -0,0 +1,40 @@
1
+ version: 2.1
2
+
3
+ executors:
4
+ gem-executor:
5
+ working_directory: ~/tmp/gem
6
+ docker:
7
+ - image: circleci/ruby:2.4.1
8
+ environment:
9
+ TZ: "Europe/Madrid"
10
+
11
+ jobs:
12
+ build-test-gem:
13
+ executor: gem-executor
14
+ steps:
15
+ - checkout
16
+
17
+ - run:
18
+ name: Update bundler
19
+ command: gem install bundler
20
+
21
+ - restore_cache:
22
+ keys:
23
+ - bankin-api-ruby-bundle-v2-{{ checksum "Gemfile.lock" }}
24
+ - bankin-api-ruby-bundle-v2-
25
+
26
+ - run: bundle install
27
+
28
+ - save_cache:
29
+ key: bankin-api-ruby-bundle-v2-{{ checksum "Gemfile.lock" }}
30
+ paths:
31
+ - vendor/bundle
32
+
33
+ - run:
34
+ name: Run rspec
35
+ command: RAILS_ENV=test bundle exec rspec spec/
36
+
37
+ workflows:
38
+ build-test-gem:
39
+ jobs:
40
+ - build-test-gem
@@ -0,0 +1,9 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /tmp/
9
+ .ruby-gemset
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
@@ -0,0 +1 @@
1
+ 2.4.1
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in bankin.gemspec
4
+ gemspec
@@ -0,0 +1,63 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ bankin-api-ruby (1.0.0)
5
+ rest-client (~> 2.0.2)
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ addressable (2.7.0)
11
+ public_suffix (>= 2.0.2, < 5.0)
12
+ crack (0.4.3)
13
+ safe_yaml (~> 1.0.0)
14
+ diff-lcs (1.3)
15
+ domain_name (0.5.20190701)
16
+ unf (>= 0.0.5, < 1.0.0)
17
+ hashdiff (1.0.0)
18
+ http-cookie (1.0.3)
19
+ domain_name (~> 0.5)
20
+ mime-types (3.3)
21
+ mime-types-data (~> 3.2015)
22
+ mime-types-data (3.2019.1009)
23
+ netrc (0.11.0)
24
+ public_suffix (4.0.1)
25
+ rake (10.5.0)
26
+ rest-client (2.0.2)
27
+ http-cookie (>= 1.0.2, < 2.0)
28
+ mime-types (>= 1.16, < 4.0)
29
+ netrc (~> 0.8)
30
+ rspec (3.9.0)
31
+ rspec-core (~> 3.9.0)
32
+ rspec-expectations (~> 3.9.0)
33
+ rspec-mocks (~> 3.9.0)
34
+ rspec-core (3.9.0)
35
+ rspec-support (~> 3.9.0)
36
+ rspec-expectations (3.9.0)
37
+ diff-lcs (>= 1.2.0, < 2.0)
38
+ rspec-support (~> 3.9.0)
39
+ rspec-mocks (3.9.0)
40
+ diff-lcs (>= 1.2.0, < 2.0)
41
+ rspec-support (~> 3.9.0)
42
+ rspec-support (3.9.0)
43
+ safe_yaml (1.0.5)
44
+ unf (0.1.4)
45
+ unf_ext
46
+ unf_ext (0.0.7.6)
47
+ webmock (2.3.2)
48
+ addressable (>= 2.3.6)
49
+ crack (>= 0.3.2)
50
+ hashdiff
51
+
52
+ PLATFORMS
53
+ ruby
54
+
55
+ DEPENDENCIES
56
+ bankin-api-ruby!
57
+ bundler
58
+ rake (~> 10.0)
59
+ rspec (~> 3.0)
60
+ webmock (~> 2.3.1)
61
+
62
+ BUNDLED WITH
63
+ 1.17.3
@@ -0,0 +1,9 @@
1
+ # Bankin
2
+
3
+ Ruby client for the Bankin' API (aka Bridge API)
4
+
5
+ Changelog
6
+ ---------
7
+
8
+ * v.1.0.0 Updated for API 2018-06-15 (with breaking changes) & added opt-in request logging
9
+ * v.0.1.2 Working Ruby wrapper for API 2018-06-15 with support for the `Account`, `Bank`, `Item`, `Transaction` and `User` resources
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
@@ -0,0 +1,28 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'bankin/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "bankin-api-ruby"
8
+ spec.version = Bankin::VERSION
9
+ spec.authors = ["Maxim Novichenko", "Albert Bellonch"]
10
+ spec.email = ["maxim@getquipu.com"]
11
+
12
+ spec.summary = "Ruby client for the Bankin' API"
13
+ spec.homepage = "https://getquipu.com"
14
+
15
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
16
+ f.match(%r{^(test|spec|features)/})
17
+ end
18
+ spec.bindir = "exe"
19
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
+ spec.require_paths = ["lib"]
21
+
22
+ spec.add_dependency "rest-client", "~> 2.0.2"
23
+
24
+ spec.add_development_dependency "bundler"
25
+ spec.add_development_dependency "rake", "~> 10.0"
26
+ spec.add_development_dependency "rspec", "~> 3.0"
27
+ spec.add_development_dependency "webmock", "~> 2.3.1"
28
+ end
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "bankin"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start
@@ -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
@@ -0,0 +1,12 @@
1
+ require 'bankin/version'
2
+ require 'bankin/configuration'
3
+ require 'bankin/base'
4
+ require 'bankin/error'
5
+ require 'bankin/resource'
6
+ require 'bankin/collection'
7
+
8
+ require 'bankin/resources/bank'
9
+ require 'bankin/resources/user'
10
+ require 'bankin/resources/item'
11
+ require 'bankin/resources/account'
12
+ require 'bankin/resources/transaction'
@@ -0,0 +1,77 @@
1
+ require 'rest-client'
2
+ require 'json'
3
+
4
+ module Bankin
5
+ BASE_URL = 'https://sync.bankin.com'
6
+ API_VERSION = '2018-06-15'
7
+ RATELIMIT_FIELDS = %w(limit remaining reset)
8
+
9
+ class << self
10
+ attr_accessor :configuration
11
+
12
+ def configuration
13
+ @configuration ||= Configuration.new
14
+ end
15
+
16
+ def rate_limits
17
+ @rate_limits ||= Hash[RATELIMIT_FIELDS.map { |f| [f, nil] }]
18
+ end
19
+
20
+ def configure
21
+ yield(configuration)
22
+ end
23
+
24
+ def api_call(method, path, params = {}, token = nil)
25
+ url = Bankin.const_get(:BASE_URL) + path
26
+
27
+ log_message("#{method.upcase} #{url}")
28
+ params.each do |k, v|
29
+ next if k =~ /password/
30
+
31
+ log_message("* #{k}: #{v}")
32
+ end
33
+
34
+ request_params = {
35
+ method: method,
36
+ url: url,
37
+ headers: {
38
+ 'Bankin-Version': Bankin.const_get(:API_VERSION),
39
+ params: {
40
+ client_id: Bankin.configuration.client_id,
41
+ client_secret: Bankin.configuration.client_secret
42
+ }.merge(params)
43
+ }
44
+ }
45
+ request_params[:headers][:Authorization] = "Bearer #{token}" if token
46
+
47
+ begin
48
+ response = RestClient::Request.execute(request_params)
49
+ set_rate_limits(response.headers)
50
+
51
+ return {} if response.empty?
52
+ data = JSON.parse(response)
53
+ return data
54
+ rescue StandardError => e
55
+ response = JSON.parse(e.response)
56
+ raise Error.new(response['type'], response['message'])
57
+ end
58
+ end
59
+
60
+ def set_rate_limits(headers)
61
+ @rate_limits ||= {}
62
+
63
+ RATELIMIT_FIELDS.each do |field|
64
+ @rate_limits[field] = headers["ratelimit_#{field}".to_sym]
65
+ end
66
+ end
67
+
68
+ def log_message(msg)
69
+ return if msg.nil? || msg.empty?
70
+
71
+ logger = Bankin.configuration.logger
72
+ return if logger.nil?
73
+
74
+ logger.info(msg)
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,54 @@
1
+ module Bankin
2
+ class Collection < Array
3
+ def initialize(response, item_class, token = nil)
4
+ @item_class = item_class
5
+ @token = token
6
+ populate!(response, item_class)
7
+ end
8
+
9
+ def next_page?
10
+ !@next_page_uri.nil?
11
+ end
12
+
13
+ def previous_page?
14
+ !@previous_page_uri.nil?
15
+ end
16
+
17
+ def next_page!
18
+ return unless next_page?
19
+
20
+ uri = URI.parse(@next_page_uri)
21
+ params = if uri.query
22
+ Hash[URI::decode_www_form(uri.query)]
23
+ else
24
+ {}
25
+ end
26
+
27
+ response = Bankin.api_call(:get, uri.path, params, @token)
28
+ populate!(response, @item_class)
29
+ self
30
+ end
31
+
32
+ def load_all!
33
+ while next_page? do
34
+ next_page!
35
+ end
36
+ self
37
+ end
38
+
39
+ private
40
+
41
+ def populate!(response, item_klass)
42
+ response['resources'].each do |item|
43
+ self << item_klass.new(item, @token)
44
+ end
45
+
46
+ set_pagination(response['pagination'])
47
+ end
48
+
49
+ def set_pagination(pagination_data)
50
+ @next_page_uri = pagination_data['next_uri']
51
+ @previous_page_uri = pagination_data['previous_uri']
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,5 @@
1
+ module Bankin
2
+ class Configuration
3
+ attr_accessor :client_id, :client_secret, :logger
4
+ end
5
+ end
@@ -0,0 +1,10 @@
1
+ module Bankin
2
+ class Error < StandardError
3
+ attr_reader :message, :type
4
+
5
+ def initialize(type, message)
6
+ @type = type
7
+ @message = message
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,101 @@
1
+ module Bankin
2
+ class Resource
3
+ def initialize(data, token = nil)
4
+ @token = token
5
+ generate_attr_readers
6
+ set_data(data)
7
+ end
8
+
9
+ def fields
10
+ self.class.fields
11
+ end
12
+
13
+ def resources
14
+ self.class.resources
15
+ end
16
+
17
+ def collections
18
+ self.class.collections
19
+ end
20
+
21
+ private
22
+
23
+ def generate_attr_readers
24
+ fields.each do |field|
25
+ define_singleton_method(field) do
26
+ load_data! if instance_variable_get("@#{field}").nil?
27
+ instance_variable_get("@#{field}")
28
+ end
29
+ end
30
+
31
+ (resources + collections).each do |resource|
32
+ define_singleton_method(resource[:name]) do
33
+ load_data! if instance_variable_get("@#{resource[:name]}").nil?
34
+ instance_variable_get("@#{resource[:name]}")
35
+ end
36
+ end
37
+ end
38
+
39
+ def set_data(data)
40
+ fields.each do |field|
41
+ next unless data.key?(field.to_s)
42
+ instance_variable_set("@#{field}", data[field.to_s])
43
+ end
44
+
45
+ resources.each do |resource|
46
+ next unless data.key?(resource[:name].to_s)
47
+ klass = Object.const_get("Bankin::#{resource[:klass]}")
48
+ instance_variable_set("@#{resource[:name]}", klass.new(data[resource[:name].to_s], @token))
49
+ end
50
+
51
+ collections.each do |collection|
52
+ next unless data[collection[:name].to_s]
53
+ klass = Object.const_get("Bankin::#{collection[:klass]}")
54
+ arr = data[collection[:name].to_s].map { |item | klass.new(item, @token) }
55
+ instance_variable_set("@#{collection[:name]}", arr)
56
+ instance_variable_set("@#{collection[:name]}_ids", arr.map(&:id))
57
+ end
58
+ end
59
+
60
+ def load_data!
61
+ return if @loaded
62
+ response = Bankin.api_call(:get, @resource_uri, {}, @token)
63
+ set_data(response)
64
+ @loaded = true
65
+ end
66
+
67
+ class << self
68
+ def fields
69
+ @fields || [:resource_type, :resource_uri]
70
+ end
71
+
72
+ def resources
73
+ @resources || []
74
+ end
75
+
76
+ def collections
77
+ @collections || []
78
+ end
79
+
80
+ def auth_delegate(name, options)
81
+ define_method(name) do |*args|
82
+ klass = Object.const_get("Bankin::#{options[:class]}")
83
+ klass.send(options[:method], self.token, *args)
84
+ end
85
+ end
86
+
87
+ def has_fields(*new_fields)
88
+ @fields = (fields + new_fields).uniq
89
+ end
90
+
91
+ def has_resource(name, klass)
92
+ @resources = resources << { name: name, klass: klass }
93
+ end
94
+
95
+ def has_collection(name, klass)
96
+ @collections = collections << { name: name, klass: klass }
97
+ attr_reader :"#{name}_ids"
98
+ end
99
+ end
100
+ end
101
+ end
@@ -0,0 +1,20 @@
1
+ module Bankin
2
+ class Account < Resource
3
+ RESOURCE_PATH = '/v2/accounts'
4
+
5
+ has_fields :id, :name, :balance, :currency_code, :status, :type, :last_refresh_date
6
+
7
+ has_resource :bank, 'Bank'
8
+ has_resource :item, 'Item'
9
+
10
+ def self.list(token, options = {})
11
+ response = Bankin.api_call(:get, RESOURCE_PATH, options, token)
12
+ Collection.new(response, self, token)
13
+ end
14
+
15
+ def self.get(token, id)
16
+ response = Bankin.api_call(:get, "#{RESOURCE_PATH}/#{id}", {}, token)
17
+ new(response, token)
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,29 @@
1
+ module Bankin
2
+ class Bank < Resource
3
+ RESOURCE_PATH = '/v2/banks'
4
+
5
+ has_fields :id, :name, :automatic_refresh, :country_code
6
+
7
+ def self.list(options = {})
8
+ response = Bankin.api_call(:get, RESOURCE_PATH, options)
9
+ Collection.new(flatten_list(response), self)
10
+ end
11
+
12
+ def self.get(id)
13
+ response = Bankin.api_call(:get, "#{RESOURCE_PATH}/#{id}")
14
+ new(response)
15
+ end
16
+
17
+ private
18
+
19
+ def self.flatten_list(response)
20
+ response["resources"] = response["resources"].map do |country_banks|
21
+ country_banks["parent_banks"].map do |entity_banks|
22
+ entity_banks["banks"]
23
+ end.flatten
24
+ end.flatten
25
+
26
+ response
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,68 @@
1
+ module Bankin
2
+ class Item < Resource
3
+ RESOURCE_PATH = '/v2/items'
4
+
5
+ has_fields :id, :status
6
+
7
+ has_resource :bank, 'Bank'
8
+ has_collection :accounts, 'Account'
9
+
10
+ def delete
11
+ Bankin.api_call(:delete, resource_uri, {}, @token)
12
+ end
13
+
14
+ def refresh
15
+ Bankin.api_call(:post, "#{resource_uri}/refresh", {}, @token)
16
+ end
17
+
18
+ def refresh_status
19
+ Bankin.api_call(:get, "#{resource_uri}/refresh/status", {}, @token)
20
+ end
21
+
22
+ def edit_url
23
+ Bankin.api_call(
24
+ :get,
25
+ "/v2/connect/items/edit/url",
26
+ { item_id: id },
27
+ @token
28
+ )['redirect_url']
29
+ end
30
+
31
+ def fill_in_otp_url
32
+ Bankin.api_call(
33
+ :get,
34
+ "/v2/connect/items/sync?item_id=#{id}",
35
+ {},
36
+ @token
37
+ )['redirect_url']
38
+ end
39
+
40
+ def self.add_url(token, redirect_url, params)
41
+ Bankin.api_call(
42
+ :get,
43
+ "/v2/connect/items/add/url",
44
+ params.merge(redirect_url: redirect_url),
45
+ token
46
+ )['redirect_url']
47
+ end
48
+
49
+ def self.pro_confirmation_url(token)
50
+ Bankin.api_call(
51
+ :get,
52
+ "/v2/connect/items/pro/confirmation/url",
53
+ {},
54
+ token
55
+ )['redirect_url']
56
+ end
57
+
58
+ def self.list(token, options = {})
59
+ response = Bankin.api_call(:get, RESOURCE_PATH, options, token)
60
+ Collection.new(response, self, token)
61
+ end
62
+
63
+ def self.get(token, id)
64
+ response = Bankin.api_call(:get, "#{RESOURCE_PATH}/#{id}", {}, token)
65
+ new(response, token)
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,25 @@
1
+ module Bankin
2
+ class Transaction < Resource
3
+ RESOURCE_PATH = '/v2/transactions'
4
+
5
+ has_fields :id, :description, :raw_description, :amount, :date,
6
+ :updated_at, :currency_code, :is_deleted
7
+
8
+ has_resource :account, 'Account'
9
+
10
+ def self.list(token, options = {})
11
+ response = Bankin.api_call(:get, RESOURCE_PATH, options, token)
12
+ Collection.new(response, self, token)
13
+ end
14
+
15
+ def self.list_updated(token, options = {})
16
+ response = Bankin.api_call(:get, "#{RESOURCE_PATH}/updated", options, token)
17
+ Collection.new(response, self, token)
18
+ end
19
+
20
+ def self.get(token, id)
21
+ response = Bankin.api_call(:get, "#{RESOURCE_PATH}/#{id}", {}, token)
22
+ new(response, token)
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,57 @@
1
+ module Bankin
2
+ class User < Resource
3
+ attr_accessor :token
4
+
5
+ RESOURCE_PATH = '/v2/users'
6
+
7
+ has_fields :uuid, :email
8
+
9
+ auth_delegate :items, class: 'Item', method: :list
10
+ auth_delegate :item, class: 'Item', method: :get
11
+ auth_delegate :accounts, class: 'Account', method: :list
12
+ auth_delegate :account, class: 'Account', method: :get
13
+ auth_delegate :updated_transactions, class: 'Transaction', method: :list_updated
14
+ auth_delegate :transactions, class: 'Transaction', method: :list
15
+ auth_delegate :transaction, class: 'Transaction', method: :get
16
+
17
+ def delete(password)
18
+ Bankin.api_call(:delete, resource_uri, { password: password })
19
+ end
20
+
21
+ def add_item_url(redirect_url = nil, params = {})
22
+ authenticate if token.nil?
23
+ Item.add_url(token, redirect_url, params)
24
+ end
25
+
26
+ def item_connect_url(bank_id, redirect_url = nil)
27
+ Item.connect_url(token, bank_id, redirect_url)
28
+ end
29
+
30
+ def pro_confirmation_url
31
+ Item.pro_confirmation_url(token)
32
+ end
33
+
34
+ def self.list(options = {})
35
+ response = Bankin.api_call(:get, RESOURCE_PATH, options)
36
+ Collection.new(response, self)
37
+ end
38
+
39
+ def self.delete_all
40
+ Bankin.api_call(:delete, RESOURCE_PATH)
41
+ end
42
+
43
+ def self.create(email, password)
44
+ response = Bankin.api_call(:post, RESOURCE_PATH,
45
+ { email: email, password: password })
46
+ new(response)
47
+ end
48
+
49
+ def self.authenticate(email, password)
50
+ response = Bankin.api_call(:post, '/v2/authenticate',
51
+ { email: email, password: password })
52
+ user = new(response['user'])
53
+ user.token = response['access_token']
54
+ user
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,3 @@
1
+ module Bankin
2
+ VERSION = "1.0.0"
3
+ end
metadata ADDED
@@ -0,0 +1,137 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: bankin-api-ruby
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Maxim Novichenko
8
+ - Albert Bellonch
9
+ autorequire:
10
+ bindir: exe
11
+ cert_chain: []
12
+ date: 2019-11-13 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rest-client
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - "~>"
19
+ - !ruby/object:Gem::Version
20
+ version: 2.0.2
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - "~>"
26
+ - !ruby/object:Gem::Version
27
+ version: 2.0.2
28
+ - !ruby/object:Gem::Dependency
29
+ name: bundler
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: '0'
35
+ type: :development
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ - !ruby/object:Gem::Dependency
43
+ name: rake
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - "~>"
47
+ - !ruby/object:Gem::Version
48
+ version: '10.0'
49
+ type: :development
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - "~>"
54
+ - !ruby/object:Gem::Version
55
+ version: '10.0'
56
+ - !ruby/object:Gem::Dependency
57
+ name: rspec
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - "~>"
61
+ - !ruby/object:Gem::Version
62
+ version: '3.0'
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: '3.0'
70
+ - !ruby/object:Gem::Dependency
71
+ name: webmock
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - "~>"
75
+ - !ruby/object:Gem::Version
76
+ version: 2.3.1
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - "~>"
82
+ - !ruby/object:Gem::Version
83
+ version: 2.3.1
84
+ description:
85
+ email:
86
+ - maxim@getquipu.com
87
+ executables: []
88
+ extensions: []
89
+ extra_rdoc_files: []
90
+ files:
91
+ - ".circleci/config.yml"
92
+ - ".gitignore"
93
+ - ".rspec"
94
+ - ".ruby-version"
95
+ - Gemfile
96
+ - Gemfile.lock
97
+ - README.md
98
+ - Rakefile
99
+ - bankin.gemspec
100
+ - bin/console
101
+ - bin/setup
102
+ - lib/bankin.rb
103
+ - lib/bankin/base.rb
104
+ - lib/bankin/collection.rb
105
+ - lib/bankin/configuration.rb
106
+ - lib/bankin/error.rb
107
+ - lib/bankin/resource.rb
108
+ - lib/bankin/resources/account.rb
109
+ - lib/bankin/resources/bank.rb
110
+ - lib/bankin/resources/item.rb
111
+ - lib/bankin/resources/transaction.rb
112
+ - lib/bankin/resources/user.rb
113
+ - lib/bankin/version.rb
114
+ homepage: https://getquipu.com
115
+ licenses: []
116
+ metadata: {}
117
+ post_install_message:
118
+ rdoc_options: []
119
+ require_paths:
120
+ - lib
121
+ required_ruby_version: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - ">="
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ required_rubygems_version: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - ">="
129
+ - !ruby/object:Gem::Version
130
+ version: '0'
131
+ requirements: []
132
+ rubyforge_project:
133
+ rubygems_version: 2.6.11
134
+ signing_key:
135
+ specification_version: 4
136
+ summary: Ruby client for the Bankin' API
137
+ test_files: []