quickbooks-ruby 1.0.20 → 2.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 +4 -4
- data/lib/quickbooks/model/vendor_credit.rb +2 -0
- data/lib/quickbooks/service/access_token.rb +1 -1
- data/lib/quickbooks/service/base_service.rb +50 -33
- data/lib/quickbooks/service/payment.rb +6 -0
- data/lib/quickbooks/util/logging.rb +12 -0
- data/lib/quickbooks/version.rb +1 -1
- data/lib/quickbooks-ruby.rb +8 -5
- metadata +37 -10
- data/lib/quickbooks/faraday/middleware/gzip.rb +0 -74
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: cc115bc7b925447fecb75976b448e66406441c9fd56208e964ac34844fdcd37a
|
|
4
|
+
data.tar.gz: fd1ca0b526c14cdadda7a1e276c3dcedb9b8c68e7c76be0aa074df30c63e0382
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: ce9c6d1732ab2d6ffd2a9ea57c2dad7f091867bb9af828a8bb25140f79a7d739cccd4f59d9b45665ec500d50241e2fbd65c833f4f307d71ba84543cdaec71725
|
|
7
|
+
data.tar.gz: 9bd4d94b4270280b142d93c3ee9bff0b579d4009fc5afe9a217404d201df6e74ea6db8a7fc5b33e48f16e919ea6716bd77f5aeb4e362421db659d1d9f8ac0bf4
|
|
@@ -28,6 +28,8 @@ module Quickbooks
|
|
|
28
28
|
|
|
29
29
|
xml_accessor :currency_ref, :from => 'CurrencyRef', :as => BaseReference
|
|
30
30
|
xml_accessor :exchange_rate, :from => 'ExchangeRate', :as => BigDecimal, :to_xml => to_xml_big_decimal
|
|
31
|
+
|
|
32
|
+
xml_accessor :linked_transactions, :from => 'LinkedTxn', :as => [LinkedTransaction]
|
|
31
33
|
|
|
32
34
|
reference_setters
|
|
33
35
|
|
|
@@ -22,7 +22,7 @@ module Quickbooks
|
|
|
22
22
|
def disconnect
|
|
23
23
|
connection = Faraday.new(headers: { 'Content-Type' => 'application/json' }) do |f|
|
|
24
24
|
f.adapter(::Quickbooks.http_adapter)
|
|
25
|
-
f.
|
|
25
|
+
f.request(:authorization, :basic, oauth.client.id, oauth.client.secret)
|
|
26
26
|
end
|
|
27
27
|
|
|
28
28
|
url = "#{DISCONNECT_URL}?minorversion=#{Quickbooks.minorversion}"
|
|
@@ -49,12 +49,11 @@ module Quickbooks
|
|
|
49
49
|
# [OAuth2] The default Faraday connection does not have gzip or multipart support.
|
|
50
50
|
# We need to reset the existing connection and build a new one.
|
|
51
51
|
def rebuild_connection!
|
|
52
|
-
@oauth.client.connection =
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
builder.adapter ::Quickbooks.http_adapter
|
|
52
|
+
@oauth.client.connection = Faraday.new do |f|
|
|
53
|
+
f.request :multipart
|
|
54
|
+
f.request :gzip
|
|
55
|
+
f.request :url_encoded
|
|
56
|
+
f.adapter ::Quickbooks.http_adapter
|
|
58
57
|
end
|
|
59
58
|
end
|
|
60
59
|
|
|
@@ -248,11 +247,7 @@ module Quickbooks
|
|
|
248
247
|
headers['Accept-Encoding'] = HTTP_ACCEPT_ENCODING
|
|
249
248
|
end
|
|
250
249
|
|
|
251
|
-
|
|
252
|
-
log "METHOD = #{method}"
|
|
253
|
-
log "RESOURCE = #{url}"
|
|
254
|
-
log_request_body(body)
|
|
255
|
-
log "REQUEST HEADERS = #{headers.inspect}"
|
|
250
|
+
log_request(method, url, body, headers)
|
|
256
251
|
|
|
257
252
|
request_info = RequestInfo.new(url, headers, body, method)
|
|
258
253
|
before_request.call(request_info) if before_request
|
|
@@ -273,12 +268,8 @@ module Quickbooks
|
|
|
273
268
|
after_request.call(request_info, raw_response.body) if after_request
|
|
274
269
|
|
|
275
270
|
response = Quickbooks::Service::Responses::OAuthHttpResponse.wrap(raw_response)
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
log_response_body(response)
|
|
279
|
-
if response.respond_to?(:headers)
|
|
280
|
-
log "RESPONSE HEADERS = #{response.headers}"
|
|
281
|
-
end
|
|
271
|
+
log_response(response)
|
|
272
|
+
|
|
282
273
|
check_response(response, request: body)
|
|
283
274
|
end
|
|
284
275
|
|
|
@@ -354,28 +345,29 @@ module Quickbooks
|
|
|
354
345
|
end
|
|
355
346
|
end
|
|
356
347
|
|
|
357
|
-
def
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
348
|
+
def log_request(method, url, body, headers)
|
|
349
|
+
messages = []
|
|
350
|
+
messages << "------ QUICKBOOKS-RUBY REQUEST ------"
|
|
351
|
+
messages << "METHOD = #{method}"
|
|
352
|
+
messages << "RESOURCE = #{url}"
|
|
353
|
+
messages.concat(request_body_messages(body))
|
|
354
|
+
messages << "REQUEST HEADERS = #{headers.inspect}"
|
|
355
|
+
|
|
356
|
+
log_multiple(messages)
|
|
366
357
|
end
|
|
367
358
|
|
|
368
|
-
def
|
|
369
|
-
|
|
359
|
+
def request_body_messages(body)
|
|
360
|
+
messages = []
|
|
361
|
+
messages << "REQUEST BODY:"
|
|
370
362
|
if is_json?
|
|
371
|
-
|
|
363
|
+
messages << body.inspect
|
|
372
364
|
elsif is_pdf?
|
|
373
|
-
|
|
365
|
+
messages << "BODY is a PDF : not dumping"
|
|
374
366
|
else
|
|
375
367
|
#multipart request for uploads arrive here in a Hash with UploadIO vals
|
|
376
368
|
if body.is_a?(Hash)
|
|
377
369
|
body.each do |k,v|
|
|
378
|
-
|
|
370
|
+
messages << 'BODY PART:'
|
|
379
371
|
val_content = v.inspect
|
|
380
372
|
if v.is_a?(UploadIO)
|
|
381
373
|
if v.content_type == 'application/xml'
|
|
@@ -384,12 +376,37 @@ module Quickbooks
|
|
|
384
376
|
end
|
|
385
377
|
end
|
|
386
378
|
end
|
|
387
|
-
|
|
379
|
+
messages << "#{k}: #{val_content}"
|
|
388
380
|
end
|
|
389
381
|
else
|
|
390
|
-
|
|
382
|
+
messages << log_xml(body)
|
|
391
383
|
end
|
|
392
384
|
end
|
|
385
|
+
messages
|
|
386
|
+
end
|
|
387
|
+
|
|
388
|
+
def log_response(response)
|
|
389
|
+
messages = []
|
|
390
|
+
messages << "------ QUICKBOOKS-RUBY RESPONSE ------"
|
|
391
|
+
messages << "RESPONSE CODE = #{response.code}"
|
|
392
|
+
messages.concat(response_body_messages(response))
|
|
393
|
+
messages << "RESPONSE HEADERS = #{response.headers}" if response.respond_to?(:headers)
|
|
394
|
+
|
|
395
|
+
log_multiple(messages)
|
|
396
|
+
end
|
|
397
|
+
|
|
398
|
+
def response_body_messages(response)
|
|
399
|
+
messages = []
|
|
400
|
+
messages << "RESPONSE BODY:"
|
|
401
|
+
if is_json?
|
|
402
|
+
messages << ">>>>#{response.plain_body.inspect}"
|
|
403
|
+
elsif is_pdf?
|
|
404
|
+
messages << "BODY is a PDF : not dumping"
|
|
405
|
+
else
|
|
406
|
+
messages << log_xml(response.plain_body)
|
|
407
|
+
end
|
|
408
|
+
|
|
409
|
+
messages
|
|
393
410
|
end
|
|
394
411
|
|
|
395
412
|
def parse_and_raise_exception(options = {})
|
|
@@ -19,6 +19,12 @@ module Quickbooks
|
|
|
19
19
|
end
|
|
20
20
|
end
|
|
21
21
|
|
|
22
|
+
def pdf(payment)
|
|
23
|
+
url = "#{url_for_resource(model::REST_RESOURCE)}/#{payment.id}/pdf"
|
|
24
|
+
response = do_http_raw_get(url, {}, {'Accept' => 'application/pdf'})
|
|
25
|
+
response.plain_body
|
|
26
|
+
end
|
|
27
|
+
|
|
22
28
|
private
|
|
23
29
|
|
|
24
30
|
def model
|
|
@@ -5,10 +5,22 @@ module Quickbooks
|
|
|
5
5
|
::Quickbooks.log(msg)
|
|
6
6
|
end
|
|
7
7
|
|
|
8
|
+
def log_multiple(messages)
|
|
9
|
+
if condense_logs?
|
|
10
|
+
log(messages.join("\n"))
|
|
11
|
+
else
|
|
12
|
+
messages.each(&method(:log))
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
8
16
|
def log?
|
|
9
17
|
::Quickbooks.log?
|
|
10
18
|
end
|
|
11
19
|
|
|
20
|
+
def condense_logs?
|
|
21
|
+
::Quickbooks.condense_logs?
|
|
22
|
+
end
|
|
23
|
+
|
|
12
24
|
def log_xml(str)
|
|
13
25
|
if ::Quickbooks.log_xml_pretty_print? && !(str and str.empty?)
|
|
14
26
|
Nokogiri::XML(str).to_xml
|
data/lib/quickbooks/version.rb
CHANGED
data/lib/quickbooks-ruby.rb
CHANGED
|
@@ -8,12 +8,13 @@ require 'date'
|
|
|
8
8
|
require 'forwardable'
|
|
9
9
|
require 'oauth2'
|
|
10
10
|
require 'net/http/post/multipart'
|
|
11
|
+
require 'faraday/multipart'
|
|
12
|
+
require 'faraday/gzip'
|
|
11
13
|
require 'quickbooks/util/collection'
|
|
12
14
|
require 'quickbooks/util/logging'
|
|
13
15
|
require 'quickbooks/util/http_encoding_helper'
|
|
14
16
|
require 'quickbooks/util/name_entity'
|
|
15
17
|
require 'quickbooks/util/query_builder'
|
|
16
|
-
require 'quickbooks/faraday/middleware/gzip'
|
|
17
18
|
|
|
18
19
|
#== OAuth Responses
|
|
19
20
|
require 'quickbooks/service/responses/oauth_http_response'
|
|
@@ -187,9 +188,6 @@ require 'quickbooks/service/transfer'
|
|
|
187
188
|
require 'quickbooks/service/change_data_capture'
|
|
188
189
|
require 'quickbooks/service/refund_receipt_change'
|
|
189
190
|
|
|
190
|
-
# Register Faraday Middleware
|
|
191
|
-
Faraday::Middleware.register_middleware :gzip => lambda { Gzip }
|
|
192
|
-
|
|
193
191
|
module Quickbooks
|
|
194
192
|
@@sandbox_mode = false
|
|
195
193
|
@@logger = nil
|
|
@@ -230,13 +228,18 @@ module Quickbooks
|
|
|
230
228
|
end
|
|
231
229
|
|
|
232
230
|
# set logging on or off
|
|
233
|
-
attr_writer :log, :log_xml_pretty_print
|
|
231
|
+
attr_writer :log, :log_xml_pretty_print, :condense_logs
|
|
234
232
|
|
|
235
233
|
# Returns whether to log. Defaults to 'false'.
|
|
236
234
|
def log?
|
|
237
235
|
@log ||= false
|
|
238
236
|
end
|
|
239
237
|
|
|
238
|
+
# Returns whether to limit log lines
|
|
239
|
+
def condense_logs?
|
|
240
|
+
@condense_logs ||= false
|
|
241
|
+
end
|
|
242
|
+
|
|
240
243
|
# pretty printing the xml in the logs is "on" by default
|
|
241
244
|
def log_xml_pretty_print?
|
|
242
245
|
defined?(@log_xml_pretty_print) ? @log_xml_pretty_print : true
|
metadata
CHANGED
|
@@ -1,29 +1,29 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: quickbooks-ruby
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version:
|
|
4
|
+
version: '2.0'
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Cody Caughlan
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2022-
|
|
11
|
+
date: 2022-11-10 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: oauth2
|
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
|
16
16
|
requirements:
|
|
17
|
-
- - "
|
|
17
|
+
- - "<"
|
|
18
18
|
- !ruby/object:Gem::Version
|
|
19
|
-
version: '
|
|
19
|
+
version: '3.0'
|
|
20
20
|
type: :runtime
|
|
21
21
|
prerelease: false
|
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
|
23
23
|
requirements:
|
|
24
|
-
- - "
|
|
24
|
+
- - "<"
|
|
25
25
|
- !ruby/object:Gem::Version
|
|
26
|
-
version: '
|
|
26
|
+
version: '3.0'
|
|
27
27
|
- !ruby/object:Gem::Dependency
|
|
28
28
|
name: roxml
|
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -100,14 +100,42 @@ dependencies:
|
|
|
100
100
|
requirements:
|
|
101
101
|
- - "<"
|
|
102
102
|
- !ruby/object:Gem::Version
|
|
103
|
-
version: '
|
|
103
|
+
version: '3.0'
|
|
104
104
|
type: :runtime
|
|
105
105
|
prerelease: false
|
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
|
107
107
|
requirements:
|
|
108
108
|
- - "<"
|
|
109
109
|
- !ruby/object:Gem::Version
|
|
110
|
-
version: '
|
|
110
|
+
version: '3.0'
|
|
111
|
+
- !ruby/object:Gem::Dependency
|
|
112
|
+
name: faraday-multipart
|
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
|
114
|
+
requirements:
|
|
115
|
+
- - "~>"
|
|
116
|
+
- !ruby/object:Gem::Version
|
|
117
|
+
version: '1.0'
|
|
118
|
+
type: :runtime
|
|
119
|
+
prerelease: false
|
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
121
|
+
requirements:
|
|
122
|
+
- - "~>"
|
|
123
|
+
- !ruby/object:Gem::Version
|
|
124
|
+
version: '1.0'
|
|
125
|
+
- !ruby/object:Gem::Dependency
|
|
126
|
+
name: faraday-gzip
|
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
|
128
|
+
requirements:
|
|
129
|
+
- - "~>"
|
|
130
|
+
- !ruby/object:Gem::Version
|
|
131
|
+
version: '0.1'
|
|
132
|
+
type: :runtime
|
|
133
|
+
prerelease: false
|
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
135
|
+
requirements:
|
|
136
|
+
- - "~>"
|
|
137
|
+
- !ruby/object:Gem::Version
|
|
138
|
+
version: '0.1'
|
|
111
139
|
- !ruby/object:Gem::Dependency
|
|
112
140
|
name: rake
|
|
113
141
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -199,7 +227,6 @@ extensions: []
|
|
|
199
227
|
extra_rdoc_files: []
|
|
200
228
|
files:
|
|
201
229
|
- lib/quickbooks-ruby.rb
|
|
202
|
-
- lib/quickbooks/faraday/middleware/gzip.rb
|
|
203
230
|
- lib/quickbooks/model/access_token_response.rb
|
|
204
231
|
- lib/quickbooks/model/account.rb
|
|
205
232
|
- lib/quickbooks/model/account_based_expense_line_detail.rb
|
|
@@ -383,7 +410,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
383
410
|
requirements:
|
|
384
411
|
- - ">="
|
|
385
412
|
- !ruby/object:Gem::Version
|
|
386
|
-
version: '
|
|
413
|
+
version: '2.6'
|
|
387
414
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
388
415
|
requirements:
|
|
389
416
|
- - ">="
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
# https://github.com/lostisland/faraday_middleware/blob/master/lib/faraday_middleware/gzip.rb
|
|
2
|
-
|
|
3
|
-
require 'faraday'
|
|
4
|
-
|
|
5
|
-
# Middleware to automatically decompress response bodies. If the
|
|
6
|
-
# "Accept-Encoding" header wasn't set in the request, this sets it to
|
|
7
|
-
# "gzip,deflate" and appropriately handles the compressed response from the
|
|
8
|
-
# server. This resembles what Ruby 1.9+ does internally in Net::HTTP#get.
|
|
9
|
-
#
|
|
10
|
-
# This middleware is NOT necessary when these adapters are used:
|
|
11
|
-
# - net_http on Ruby 1.9+
|
|
12
|
-
# - net_http_persistent on Ruby 2.0+
|
|
13
|
-
# - em_http
|
|
14
|
-
class Gzip < Faraday::Middleware
|
|
15
|
-
dependency 'zlib'
|
|
16
|
-
|
|
17
|
-
ACCEPT_ENCODING = 'Accept-Encoding'.freeze
|
|
18
|
-
CONTENT_ENCODING = 'Content-Encoding'.freeze
|
|
19
|
-
CONTENT_LENGTH = 'Content-Length'.freeze
|
|
20
|
-
SUPPORTED_ENCODINGS = 'gzip,deflate,br'.freeze
|
|
21
|
-
RUBY_ENCODING = '1.9'.respond_to?(:force_encoding)
|
|
22
|
-
|
|
23
|
-
def call(env)
|
|
24
|
-
env[:request_headers][ACCEPT_ENCODING] ||= SUPPORTED_ENCODINGS
|
|
25
|
-
@app.call(env).on_complete do |response_env|
|
|
26
|
-
break if response_env[:response_headers].nil?
|
|
27
|
-
|
|
28
|
-
case response_env[:response_headers][CONTENT_ENCODING]
|
|
29
|
-
when 'gzip'
|
|
30
|
-
reset_body(response_env, &method(:uncompress_gzip))
|
|
31
|
-
when 'deflate'
|
|
32
|
-
reset_body(response_env, &method(:inflate))
|
|
33
|
-
when 'br'
|
|
34
|
-
reset_body(response_env, &method(:brotli_inflate))
|
|
35
|
-
end
|
|
36
|
-
end
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
def reset_body(env)
|
|
40
|
-
env[:body] = yield(env[:body])
|
|
41
|
-
env[:response_headers].delete(CONTENT_ENCODING)
|
|
42
|
-
env[:response_headers][CONTENT_LENGTH] = env[:body].length
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
def uncompress_gzip(body)
|
|
46
|
-
io = StringIO.new(body)
|
|
47
|
-
gzip_reader = if RUBY_ENCODING
|
|
48
|
-
Zlib::GzipReader.new(io, :encoding => 'ASCII-8BIT')
|
|
49
|
-
else
|
|
50
|
-
Zlib::GzipReader.new(io)
|
|
51
|
-
end
|
|
52
|
-
gzip_reader.read
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
def inflate(body)
|
|
56
|
-
# Inflate as a DEFLATE (RFC 1950+RFC 1951) stream
|
|
57
|
-
Zlib::Inflate.inflate(body)
|
|
58
|
-
rescue Zlib::DataError
|
|
59
|
-
# Fall back to inflating as a "raw" deflate stream which
|
|
60
|
-
# Microsoft servers return
|
|
61
|
-
inflate = Zlib::Inflate.new(-Zlib::MAX_WBITS)
|
|
62
|
-
begin
|
|
63
|
-
inflate.inflate(body)
|
|
64
|
-
ensure
|
|
65
|
-
inflate.close
|
|
66
|
-
end
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
def brotli_inflate(body)
|
|
70
|
-
self.class.dependency 'brotli'
|
|
71
|
-
|
|
72
|
-
Brotli.inflate(body)
|
|
73
|
-
end
|
|
74
|
-
end
|