qbo_api 2.1.0 → 3.0.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: bdae2e1e7049a7b71c286a5e3b36056a100c89c8fad4a85690b174457f9b1072
4
- data.tar.gz: 36baaf4f27090e11b630a620c0b08fe2f531ccd25436a7ea4d5f4156f2d53c12
3
+ metadata.gz: ccab347179fd3c5d7ec6ae6ab5099be4c7732418f220f30f6dd593e2b670b3e8
4
+ data.tar.gz: 461041430eaaf924ce437df17173137fe3975cd6849cac73caf7270a66e84885
5
5
  SHA512:
6
- metadata.gz: c7402792bd0691b386469c65543c729799a5aedd150a4a06e726c50d382cd7342a4215676cbb13b20898f93f1501525c03ea8481627003fd311d6332d828c03a
7
- data.tar.gz: f3d4d4ba01db6d69dfccb22c5f4225d0b68e91c5e591384516971154b837aa06b370f822a8dc20f5c859ace71fe4c033bec002b44224505773c208459f44a1f4
6
+ metadata.gz: 7c78fdb98214a4a0c0eaee625ee7fb2215396bc296cabf2788414716b15137bf2aef79fd213328ddd9e9dfb249aa38ab04c962737126c9667d2ed4cbfcc1c82f
7
+ data.tar.gz: 4a9bc0e915eff633eeaa89d6fea2ea45c979ad162e8188ebb0458380e9b146668b74af24dc0cbcd44e72b203794c87e82e2116761d9e3919015a5aa6481f2ac1
data/README.md CHANGED
@@ -372,8 +372,8 @@ for how to install ngrok and what it is.
372
372
  Add the token to your .env as QBO_API_VERIFIER_TOKEN
373
373
 
374
374
  - In another tab, create a customer via the API:
375
- `bundle exec ruby -rqbo_api -rdotenv -e 'Dotenv.load; p QboApi.new(access_token: ENV.fetch("QBO_API_OAUTH2_ACCESS_TOKEN"), realm_id: ENV.fetch("QBO_API_COMPANY_ID")).create(:customer, payload: { DisplayName: "TestCustomer" })'`
376
- (You'll also need to have added the QBO_API_COMPANY_ID and QBO_API_OAUTH2_ACCESS_TOKEN to your .env)
375
+ `bundle exec ruby -rqbo_api -rdotenv -e 'Dotenv.load; p QboApi.new(access_token: ENV.fetch("QBO_API_ACCESS_TOKEN"), realm_id: ENV.fetch("QBO_API_COMPANY_ID")).create(:customer, payload: { DisplayName: "TestCustomer" })'`
376
+ (You'll also need to have added the QBO_API_COMPANY_ID and QBO_API_ACCESS_TOKEN to your .env)
377
377
 
378
378
  There could be a delay of up to a minute before the webhook fires.
379
379
 
@@ -391,8 +391,8 @@ for how to install ngrok and what it is.
391
391
  connection = build_connection('https://oauth.platform.intuit.com', headers: { 'Accept' => 'application/json' }) do |conn|
392
392
  conn.basic_auth(client_id, client_secret)
393
393
  conn.request :url_encoded # application/x-www-form-urlencoded
394
- conn.use FaradayMiddleware::ParseJson, parser_options: { symbolize_names: true }
395
- conn.use Faraday::Response::RaiseError
394
+ conn.response :json
395
+ conn.use QboApi::RaiseHttpException
396
396
  end
397
397
 
398
398
  raw_response = connection.post do |req|
data/example/base.rb CHANGED
@@ -3,6 +3,7 @@ BASE_GEMS = proc do
3
3
  # This app
4
4
  gem 'sinatra'
5
5
  gem 'sinatra-contrib'
6
+ gem 'puma'
6
7
 
7
8
  # Creds from ../.env
8
9
  gem 'dotenv'
@@ -58,6 +58,14 @@ class QboApi
58
58
  request(:post, entity: entity, path: entity_path(entity), payload: payload)
59
59
  end
60
60
 
61
+ def void(entity, id:)
62
+ err_msg = "Void is only for voidable transaction entities. Use .delete or .deactivate instead"
63
+ raise QboApi::NotImplementedError.new, err_msg unless is_voidable_transaction_entity?(entity)
64
+ path = add_params_to_path(path: entity_path(entity), params: { operation: :void })
65
+ payload = set_update(entity, id)
66
+ request(:post, entity: entity, path: path, payload: payload)
67
+ end
68
+
61
69
  private
62
70
 
63
71
  def get_query_str(entity, query_filter_args)
@@ -1,6 +1,8 @@
1
1
  require 'faraday'
2
- require 'faraday_middleware'
2
+ require 'faraday/response/json'
3
+ require 'qbo_api/raise_http_exception'
3
4
  require 'faraday/detailed_logger'
5
+ require 'faraday/multipart'
4
6
 
5
7
  class QboApi
6
8
  module Connection
@@ -9,9 +11,10 @@ class QboApi
9
11
  headers['Accept'] ||= 'application/json'
10
12
  headers['Content-Type'] ||= 'application/json;charset=UTF-8'
11
13
  build_connection(url, headers: headers) do |conn|
14
+ conn.response :json
12
15
  add_authorization_middleware(conn)
13
- add_exception_middleware(conn)
14
16
  conn.request :url_encoded
17
+ add_exception_middleware(conn)
15
18
  add_connection_adapter(conn)
16
19
  end
17
20
  end
@@ -22,6 +25,7 @@ class QboApi
22
25
  'Accept' => 'application/json'
23
26
  }
24
27
  build_connection(url, headers: headers) do |conn|
28
+ conn.response :json
25
29
  add_authorization_middleware(conn)
26
30
  add_exception_middleware(conn)
27
31
  conn.request :multipart
@@ -60,21 +64,13 @@ class QboApi
60
64
  end
61
65
 
62
66
  def response(resp, entity: nil)
63
- data = parse_response_body(resp)
67
+ data = resp.body
64
68
  entity ? entity_response(data, entity) : data
65
69
  rescue => e
66
70
  QboApi.logger.debug { "#{LOG_TAG} response parsing error: entity=#{entity.inspect} body=#{resp.body.inspect} exception=#{e.inspect}" }
67
71
  data
68
72
  end
69
73
 
70
- def parse_response_body(resp)
71
- body = resp.body
72
- case resp.headers['Content-Type']
73
- when /json/ then JSON.parse(body)
74
- else body
75
- end
76
- end
77
-
78
74
  private
79
75
 
80
76
  def entity_response(data, entity)
@@ -101,11 +97,14 @@ class QboApi
101
97
  end
102
98
 
103
99
  def add_exception_middleware(conn)
104
- conn.use FaradayMiddleware::RaiseHttpException
100
+ conn.use QboApi::RaiseHttpException
105
101
  end
106
102
 
103
+ # Faraday 2 deprecated the FaradayMiddleware gem. Middleware is
104
+ # now part of Faraday itself, and :authorization can be used to pass
105
+ # the Bearer token.
107
106
  def add_authorization_middleware(conn)
108
- conn.request :oauth2, access_token, token_type: 'bearer'
107
+ conn.request :authorization, access_token, token_type: 'bearer'
109
108
  end
110
109
 
111
110
  def entity_name(entity)
@@ -20,6 +20,19 @@ class QboApi
20
20
  sym.to_s.split('_').collect(&:capitalize).join
21
21
  end
22
22
 
23
+ def is_voidable_transaction_entity?(entity)
24
+ voidable_transaction_entities.include?(singular(entity))
25
+ end
26
+
27
+ def voidable_transaction_entities
28
+ %w{
29
+ BillPayment
30
+ Invoice
31
+ Payment
32
+ SalesReceipt
33
+ }
34
+ end
35
+
23
36
  def is_transaction_entity?(entity)
24
37
  transaction_entities.include?(singular(entity))
25
38
  end
@@ -1,32 +1,44 @@
1
1
  require 'faraday'
2
+ require 'faraday/response'
2
3
  require 'nokogiri'
3
4
  # @private
4
- module FaradayMiddleware
5
+ class QboApi
5
6
  # @private
6
- class RaiseHttpException < Faraday::Middleware
7
- def call(env)
8
- @app.call(env).on_complete do |response|
9
- case response.status
10
- when 200
11
- when 400
12
- raise QboApi::BadRequest.new(error_message(response))
13
- when 401
14
- raise QboApi::Unauthorized.new(error_message(response))
15
- when 403
16
- raise QboApi::Forbidden.new(error_message(response))
17
- when 404
18
- raise QboApi::NotFound.new(error_message(response))
19
- when 429
20
- raise QboApi::TooManyRequests.new(error_message(response))
21
- when 500
22
- raise QboApi::InternalServerError.new(error_message(response))
23
- when 502
24
- raise QboApi::BadGateway.new({ error_body: response.reason_phrase })
25
- when 503
26
- raise QboApi::ServiceUnavailable.new(error_message(response))
27
- when 504
28
- raise QboApi::GatewayTimeout.new(error_message(response))
29
- end
7
+ class RaiseHttpException < Faraday::Response::RaiseError
8
+ def on_complete(env)
9
+ case env[:status]
10
+ when 400
11
+ raise QboApi::BadRequest.new(error_message(env))
12
+ when 401
13
+ raise QboApi::Unauthorized.new(error_message(env))
14
+ when 403
15
+ raise QboApi::Forbidden.new(error_message(env))
16
+ when 404
17
+ raise QboApi::NotFound.new(error_message(env))
18
+ when 407
19
+ # mimic the behavior that we get with proxy requests with HTTPS
20
+ msg = %(407 "Proxy Authentication Required")
21
+ raise Faraday::ProxyAuthError.new(msg, response_values(env))
22
+ when 409
23
+ raise Faraday::ConflictError, response_values(env)
24
+ when 422
25
+ raise Faraday::UnprocessableEntityError, response_values(env)
26
+ when 429
27
+ raise QboApi::TooManyRequests.new(error_message(env))
28
+ when 500
29
+ raise QboApi::InternalServerError.new(error_message(env))
30
+ when 502
31
+ raise QboApi::BadGateway.new({ error_body: env.reason_phrase })
32
+ when 503
33
+ raise QboApi::ServiceUnavailable.new(error_message(env))
34
+ when 504
35
+ raise QboApi::GatewayTimeout.new(error_message(env))
36
+ when ClientErrorStatuses
37
+ raise Faraday::ClientError, response_values(env)
38
+ when ServerErrorStatuses
39
+ raise Faraday::ServerError, response_values(env)
40
+ when nil
41
+ raise Faraday::NilStatusError, response_values(env)
30
42
  end
31
43
  end
32
44
 
@@ -36,13 +48,13 @@ module FaradayMiddleware
36
48
 
37
49
  private
38
50
 
39
- def error_message(response)
51
+ def error_message(env)
40
52
  {
41
- method: response.method,
42
- url: response.url,
43
- status: response.status,
44
- error_body: error_body(response.body),
45
- intuit_tid: response[:response_headers]['intuit_tid']
53
+ method: env.method,
54
+ url: env.url,
55
+ status: env.status,
56
+ error_body: error_body(env.body),
57
+ intuit_tid: env[:response_headers]['intuit_tid']
46
58
  }
47
59
  end
48
60
 
@@ -1,3 +1,3 @@
1
1
  class QboApi
2
- VERSION = "2.1.0"
2
+ VERSION = "3.0.0"
3
3
  end
data/qbo_api.gemspec CHANGED
@@ -25,8 +25,8 @@ Gem::Specification.new do |spec|
25
25
  spec.add_development_dependency 'dotenv'
26
26
  spec.add_development_dependency 'vcr'
27
27
  spec.add_development_dependency 'amazing_print'
28
- spec.add_runtime_dependency 'faraday', '~> 1.10.0'
29
- spec.add_runtime_dependency 'faraday_middleware'
28
+ spec.add_runtime_dependency 'faraday', '>= 1.10.0'
30
29
  spec.add_runtime_dependency 'faraday-detailed_logger'
30
+ spec.add_runtime_dependency 'faraday-multipart'
31
31
  spec.add_runtime_dependency 'nokogiri'
32
32
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: qbo_api
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.0
4
+ version: 3.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Christian Pelczarski
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-07-12 00:00:00.000000000 Z
11
+ date: 2023-01-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -112,18 +112,18 @@ dependencies:
112
112
  name: faraday
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
- - - "~>"
115
+ - - ">="
116
116
  - !ruby/object:Gem::Version
117
117
  version: 1.10.0
118
118
  type: :runtime
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
- - - "~>"
122
+ - - ">="
123
123
  - !ruby/object:Gem::Version
124
124
  version: 1.10.0
125
125
  - !ruby/object:Gem::Dependency
126
- name: faraday_middleware
126
+ name: faraday-detailed_logger
127
127
  requirement: !ruby/object:Gem::Requirement
128
128
  requirements:
129
129
  - - ">="
@@ -137,7 +137,7 @@ dependencies:
137
137
  - !ruby/object:Gem::Version
138
138
  version: '0'
139
139
  - !ruby/object:Gem::Dependency
140
- name: faraday-detailed_logger
140
+ name: faraday-multipart
141
141
  requirement: !ruby/object:Gem::Requirement
142
142
  requirements:
143
143
  - - ">="