quickbooks-ruby 1.0.1 → 1.0.2

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: b68c87332554f06f7289cb0a36ab956223eebd6867f0c0696106d9ab0c2b3236
4
- data.tar.gz: 523006400f30928bc0a7e8702300ed544e9da7128d9586eb84902164877393cb
3
+ metadata.gz: feb87ae00b9c17019bf64bc3ff8dd6bda994365b1d036a4cdca5ea5a31a8b44e
4
+ data.tar.gz: 40ddda6954c1a88faa24c496eec92d7f535ae8ef70a4911990417f657dda24de
5
5
  SHA512:
6
- metadata.gz: 36d97d0f30ab9feda23278718dba10bf57cfe9a56eb35f9e7cb2860cca71244454b5a24fae1ec625ac9008a0fe12f8d547b49520f713b57b46cf59df4464048b
7
- data.tar.gz: c2614aeec251e6580e89472fafcec0ea1b12b91a6c2ac10fc0b811fa13f4fc8b2a2fbb2578f5cf12a1e47574a7b4f7e9859316d783a735e960bf05abcf6153c8
6
+ metadata.gz: 550937bea11b0743baf7ebb1cbbb30bf198754459f97ec0e71585da2014b293c310492f977477d24491adefa794f9265f0068560c54a1fad811169aa259776cb
7
+ data.tar.gz: 4fc10dcd803293bd761a48e6ee560f87006f7563040d1496b7ac4a96fc8b639b136928ab4d4e6207c5a4147371a2cd31172efd96cce7b25e846f0b0e773a855d
@@ -6,7 +6,6 @@ require 'cgi'
6
6
  require 'uri'
7
7
  require 'date'
8
8
  require 'forwardable'
9
- require 'oauth'
10
9
  require 'oauth2'
11
10
  require 'net/http/post/multipart'
12
11
  require 'quickbooks/util/collection'
@@ -19,7 +18,6 @@ require 'quickbooks/faraday/middleware/gzip'
19
18
  #== OAuth Responses
20
19
  require 'quickbooks/service/responses/oauth_http_response'
21
20
  require 'quickbooks/service/responses/methods'
22
- require 'quickbooks/service/responses/oauth1_http_response'
23
21
  require 'quickbooks/service/responses/oauth2_http_response'
24
22
 
25
23
  #== Models
@@ -231,7 +229,16 @@ module Quickbooks
231
229
 
232
230
  class Error < StandardError; end
233
231
  class InvalidModelException < Error; end
234
- class AuthorizationFailure < Error; end
232
+ class AuthorizationFailure < Error
233
+ attr_accessor :code, :detail, :type
234
+
235
+ def initialize(error_hash = {})
236
+ @code = error_hash[:code]
237
+ @detail = error_hash[:detail]
238
+ @type = error_hash[:type]
239
+ super(error_hash[:message])
240
+ end
241
+ end
235
242
  class Forbidden < Error; end
236
243
  class NotFound < Error; end
237
244
  class RequestTooLarge < Error; end
@@ -241,7 +248,7 @@ module Quickbooks
241
248
  class MissingRealmError < Error; end
242
249
 
243
250
  class IntuitRequestException < Error
244
- attr_accessor :message, :code, :detail, :type, :request_xml, :request_json
251
+ attr_accessor :message, :code, :detail, :type, :intuit_tid, :request_xml, :request_json
245
252
 
246
253
  def initialize(msg)
247
254
  self.message = msg
@@ -249,10 +256,4 @@ module Quickbooks
249
256
  end
250
257
  end
251
258
 
252
- class InvalidOauthAccessTokenObject < StandardError
253
- def initialize(access_token)
254
- super("Expected access token to be an instance of OAuth::AccessToken or OAuth2::AccessToken, got #{access_token.class}.")
255
- end
256
- end
257
-
258
259
  end
@@ -4,7 +4,7 @@ module Quickbooks
4
4
  XML_COLLECTION_NODE = "Preferences"
5
5
  XML_NODE = "Preferences"
6
6
  REST_RESOURCE = 'preferences'
7
- MINORVERSION = 21
7
+ MINORVERSION = 32
8
8
 
9
9
  xml_name XML_NODE
10
10
 
@@ -28,9 +28,28 @@ module Quickbooks
28
28
  }
29
29
 
30
30
  xml_reader :sales_forms, :from => "SalesFormsPrefs", :as => create_preference_class(*%w(
31
- CustomTxnNumbers? AllowDeposit? AllowDiscount? DefaultDiscountAccount? AllowEstimates? EstimateMessage?
32
- ETransactionEnabledStatus? ETransactionAttachPDF? ETransactionPaymentEnabled? IPNSupportEnabled?
33
- AllowServiceDate? AllowShipping? DefaultShippingAccount? DefaultTerms DefaultCustomerMessage
31
+ AllowDeposit?
32
+ AllowDiscount?
33
+ AllowEstimates?
34
+ AllowServiceDate?
35
+ AllowShipping?
36
+ AutoApplyCredit?
37
+ CustomField?
38
+ CustomTxnNumbers?
39
+ DefaultCustomerMessage
40
+ DefaultDiscountAccount?
41
+ DefaultShippingAccount?
42
+ DefaultTerms
43
+ EmailCopyToCompany?
44
+ EstimateMessage
45
+ ETransactionAttachPDF?
46
+ ETransactionEnabledStatus
47
+ ETransactionPaymentEnabled?
48
+ IPNSupportEnabled?
49
+ SalesEmailBcc
50
+ SalesEmailCc
51
+ UsingPriceLevels?
52
+ UsingProgressInvoicing?
34
53
  )) {
35
54
  xml_reader :custom_fields, :as => [CustomField], :from => 'CustomField', in: 'CustomField'
36
55
  }
@@ -7,8 +7,8 @@ module Quickbooks
7
7
  attr_accessor :company_id
8
8
  attr_accessor :oauth
9
9
  attr_reader :base_uri
10
- attr_reader :last_response_body
11
10
  attr_reader :last_response_xml
11
+ attr_reader :last_response_intuit_tid
12
12
 
13
13
  XML_NS = %{xmlns="http://schema.intuit.com/finance/v3"}
14
14
  HTTP_CONTENT_TYPE = 'application/xml'
@@ -37,18 +37,13 @@ module Quickbooks
37
37
  @company_id = company_id
38
38
  end
39
39
 
40
- def oauth_v1?
41
- @oauth.is_a? OAuth::AccessToken
42
- end
43
-
44
- def oauth_v2?
45
- @oauth.is_a? OAuth2::AccessToken
46
- end
40
+ # def oauth_v2?
41
+ # @oauth.is_a? OAuth2::AccessToken
42
+ # end
47
43
 
48
44
  # [OAuth2] The default Faraday connection does not have gzip or multipart support.
49
45
  # We need to reset the existing connection and build a new one.
50
46
  def rebuild_connection!
51
- return unless oauth_v2?
52
47
  @oauth.client.connection = nil
53
48
  @oauth.client.connection.build do |builder|
54
49
  builder.use :gzip
@@ -264,37 +259,25 @@ module Quickbooks
264
259
  end
265
260
 
266
261
  response = Quickbooks::Service::Responses::OAuthHttpResponse.wrap(raw_response)
262
+ log "------ QUICKBOOKS-RUBY RESPONSE ------"
263
+ log "RESPONSE CODE = #{response.code}"
264
+ log_response_body(response)
265
+ if response.respond_to?(:headers)
266
+ log "RESPONSE HEADERS = #{response.headers}"
267
+ end
267
268
  check_response(response, request: body)
268
269
  end
269
270
 
270
271
  def oauth_get(url, headers)
271
- if oauth_v1?
272
- @oauth.get(url, headers)
273
- elsif oauth_v2?
274
- @oauth.get(url, headers: headers, raise_errors: false)
275
- else
276
- raise InvalidOauthAccessTokenObject.new(@oauth)
277
- end
272
+ @oauth.get(url, headers: headers, raise_errors: false)
278
273
  end
279
274
 
280
275
  def oauth_post(url, body, headers)
281
- if oauth_v1?
282
- @oauth.post(url, body, headers)
283
- elsif oauth_v2?
284
- @oauth.post(url, headers: headers, body: body, raise_errors: false)
285
- else
286
- raise InvalidOauthAccessTokenObject.new(@oauth)
287
- end
276
+ @oauth.post(url, headers: headers, body: body, raise_errors: false)
288
277
  end
289
278
 
290
279
  def oauth_post_with_multipart(url, body, headers)
291
- if oauth_v1?
292
- @oauth.post_with_multipart(url, body, headers)
293
- elsif oauth_v2?
294
- @oauth.post_with_multipart(url, headers: headers, body: body, raise_errors: false)
295
- else
296
- raise InvalidOauthAccessTokenObject.new(@oauth)
297
- end
280
+ @oauth.post_with_multipart(url, headers: headers, body: body, raise_errors: false)
298
281
  end
299
282
 
300
283
  def add_query_string_to_url(url, params)
@@ -308,12 +291,18 @@ module Quickbooks
308
291
  end
309
292
 
310
293
  def check_response(response, options = {})
311
- log "------ QUICKBOOKS-RUBY RESPONSE ------"
312
- log "RESPONSE CODE = #{response.code}"
313
- if response.respond_to?(:headers)
314
- log "RESPONSE HEADERS = #{response.headers}"
294
+ if is_json?
295
+ parse_json(response.plain_body)
296
+ elsif !is_pdf?
297
+ parse_xml(response.plain_body)
315
298
  end
316
- log_response_body(response)
299
+
300
+ @last_response_intuit_tid = if response.respond_to?(:headers) && response.headers
301
+ response.headers['intuit_tid']
302
+ else
303
+ nil
304
+ end
305
+
317
306
  status = response.code.to_i
318
307
  case status
319
308
  when 200
@@ -326,7 +315,7 @@ module Quickbooks
326
315
  when 302
327
316
  raise "Unhandled HTTP Redirect"
328
317
  when 401
329
- raise Quickbooks::AuthorizationFailure
318
+ raise Quickbooks::AuthorizationFailure, parse_intuit_error
330
319
  when 403
331
320
  message = parse_intuit_error[:message]
332
321
  if message.include?('ThrottleExceeded')
@@ -353,12 +342,10 @@ module Quickbooks
353
342
  log "RESPONSE BODY:"
354
343
  if is_json?
355
344
  log ">>>>#{response.plain_body.inspect}"
356
- parse_json(response.plain_body)
357
345
  elsif is_pdf?
358
346
  log("BODY is a PDF : not dumping")
359
347
  else
360
348
  log(log_xml(response.plain_body))
361
- parse_xml(response.plain_body)
362
349
  end
363
350
  end
364
351
 
@@ -400,6 +387,7 @@ module Quickbooks
400
387
  else
401
388
  ex.request_xml = options[:request]
402
389
  end
390
+ ex.intuit_tid = err[:intuit_tid]
403
391
  raise ex
404
392
  end
405
393
 
@@ -414,7 +402,7 @@ module Quickbooks
414
402
  end
415
403
 
416
404
  def parse_intuit_error
417
- error = {:message => "", :detail => "", :type => nil, :code => 0}
405
+ error = {:message => "", :detail => "", :type => nil, :code => 0, :intuit_tid => @last_response_intuit_tid}
418
406
  fault = @last_response_xml.xpath("//xmlns:IntuitResponse/xmlns:Fault")[0]
419
407
  if fault
420
408
  error[:type] = fault.attributes['type'].value
@@ -426,7 +414,7 @@ module Quickbooks
426
414
  error[:code] = code_attr.value
427
415
  end
428
416
  element_attr = error_element.attributes['element']
429
- if code_attr
417
+ if element_attr
430
418
  error[:element] = code_attr.value
431
419
  end
432
420
  error[:message] = error_element.xpath("//xmlns:Message").text
@@ -7,11 +7,7 @@ module Quickbooks
7
7
  class OAuthHttpResponse
8
8
 
9
9
  def self.wrap(response)
10
- if response.is_a?(OAuth2::Response)
11
- Quickbooks::Service::Responses::OAuth2HttpResponse.new(response)
12
- else
13
- Quickbooks::Service::Responses::OAuth1HttpResponse.new(response)
14
- end
10
+ Quickbooks::Service::Responses::OAuth2HttpResponse.new(response)
15
11
  end
16
12
 
17
13
  end
@@ -1,78 +1,6 @@
1
1
  module OauthMultipart
2
2
  end
3
3
 
4
- require "oauth"
5
-
6
- OAuth::Consumer.class_eval do
7
- def create_http_request(http_method, path, *arguments)
8
- http_method = http_method.to_sym
9
-
10
- if [:post, :put].include?(http_method)
11
- data = arguments.shift
12
- end
13
-
14
- # if the base site contains a path, add it now
15
- uri = URI.parse(site)
16
- path = uri.path + path if uri.path
17
-
18
- headers = arguments.first.is_a?(Hash) ? arguments.shift : {}
19
-
20
- case http_method
21
- when :post
22
- request = Net::HTTP::Post.new(path,headers)
23
- request["Content-Length"] = '0' # Default to 0
24
- when :put
25
- request = Net::HTTP::Put.new(path,headers)
26
- request["Content-Length"] = '0' # Default to 0
27
- when :get
28
- request = Net::HTTP::Get.new(path,headers)
29
- when :delete
30
- request = Net::HTTP::Delete.new(path,headers)
31
-
32
- when :head
33
- request = Net::HTTP::Head.new(path,headers)
34
- when :multipart_post
35
- request = Net::HTTP::Post::Multipart.new(path, headers)
36
- else
37
- raise ArgumentError, "Don't know how to handle http_method: :#{http_method.to_s}"
38
- end
39
-
40
- if data.is_a?(Hash)
41
- form_data = {}
42
- data.each {|k,v| form_data[k.to_s] = v if !v.nil?}
43
- request.set_form_data(form_data)
44
- elsif data
45
- if data.respond_to?(:read)
46
- request.body_stream = data
47
- if data.respond_to?(:length)
48
- request["Content-Length"] = data.length.to_s
49
- elsif data.respond_to?(:stat) && data.stat.respond_to?(:size)
50
- request["Content-Length"] = data.stat.size.to_s
51
- else
52
- raise ArgumentError, "Don't know how to send a body_stream that doesn't respond to .length or .stat.size"
53
- end
54
- else
55
- request.body = data.to_s
56
- request["Content-Length"] = request.body.length.to_s
57
- end
58
- end
59
-
60
- request
61
-
62
- end
63
- end
64
-
65
- OAuth::AccessToken.class_eval do
66
-
67
- def post_with_multipart(*args)
68
- multipart_post *args
69
- end
70
-
71
- def multipart_post(*args)
72
- request(:multipart_post, *args)
73
- end
74
- end
75
-
76
4
  OAuth2::AccessToken.class_eval do
77
5
 
78
6
  def post_with_multipart(*args)
@@ -1,5 +1,5 @@
1
1
  module Quickbooks
2
2
 
3
- VERSION = "1.0.1"
3
+ VERSION = "1.0.2"
4
4
 
5
5
  end
metadata CHANGED
@@ -1,29 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: quickbooks-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Cody Caughlan
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-11-05 00:00:00.000000000 Z
11
+ date: 2019-12-19 00:00:00.000000000 Z
12
12
  dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: oauth
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - "~>"
18
- - !ruby/object:Gem::Version
19
- version: 0.4.7
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - "~>"
25
- - !ruby/object:Gem::Version
26
- version: 0.4.7
27
13
  - !ruby/object:Gem::Dependency
28
14
  name: oauth2
29
15
  requirement: !ruby/object:Gem::Requirement
@@ -53,21 +39,21 @@ dependencies:
53
39
  - !ruby/object:Gem::Version
54
40
  version: 4.0.0
55
41
  - !ruby/object:Gem::Dependency
56
- name: nokogiri
42
+ name: activemodel
57
43
  requirement: !ruby/object:Gem::Requirement
58
44
  requirements:
59
- - - ">="
45
+ - - ">"
60
46
  - !ruby/object:Gem::Version
61
- version: '0'
47
+ version: '4.0'
62
48
  type: :runtime
63
49
  prerelease: false
64
50
  version_requirements: !ruby/object:Gem::Requirement
65
51
  requirements:
66
- - - ">="
52
+ - - ">"
67
53
  - !ruby/object:Gem::Version
68
- version: '0'
54
+ version: '4.0'
69
55
  - !ruby/object:Gem::Dependency
70
- name: activemodel
56
+ name: nokogiri
71
57
  requirement: !ruby/object:Gem::Requirement
72
58
  requirements:
73
59
  - - ">="
@@ -98,16 +84,16 @@ dependencies:
98
84
  name: rake
99
85
  requirement: !ruby/object:Gem::Requirement
100
86
  requirements:
101
- - - '='
87
+ - - ">="
102
88
  - !ruby/object:Gem::Version
103
- version: 10.1.0
89
+ version: '0'
104
90
  type: :development
105
91
  prerelease: false
106
92
  version_requirements: !ruby/object:Gem::Requirement
107
93
  requirements:
108
- - - '='
94
+ - - ">="
109
95
  - !ruby/object:Gem::Version
110
- version: 10.1.0
96
+ version: '0'
111
97
  - !ruby/object:Gem::Dependency
112
98
  name: simplecov
113
99
  requirement: !ruby/object:Gem::Requirement
@@ -140,16 +126,30 @@ dependencies:
140
126
  name: rspec
141
127
  requirement: !ruby/object:Gem::Requirement
142
128
  requirements:
143
- - - '='
129
+ - - "~>"
144
130
  - !ruby/object:Gem::Version
145
- version: 2.14.1
131
+ version: '3.9'
146
132
  type: :development
147
133
  prerelease: false
148
134
  version_requirements: !ruby/object:Gem::Requirement
149
135
  requirements:
150
- - - '='
136
+ - - "~>"
151
137
  - !ruby/object:Gem::Version
152
- version: 2.14.1
138
+ version: '3.9'
139
+ - !ruby/object:Gem::Dependency
140
+ name: rspec-its
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
153
  - !ruby/object:Gem::Dependency
154
154
  name: webmock
155
155
  requirement: !ruby/object:Gem::Requirement
@@ -329,7 +329,6 @@ files:
329
329
  - lib/quickbooks/service/refund_receipt_change.rb
330
330
  - lib/quickbooks/service/reports.rb
331
331
  - lib/quickbooks/service/responses/methods.rb
332
- - lib/quickbooks/service/responses/oauth1_http_response.rb
333
332
  - lib/quickbooks/service/responses/oauth2_http_response.rb
334
333
  - lib/quickbooks/service/responses/oauth_http_response.rb
335
334
  - lib/quickbooks/service/sales_receipt.rb
@@ -1,42 +0,0 @@
1
- module Quickbooks
2
- module Service
3
- module Responses
4
-
5
- class OAuth1HttpResponse < OAuthHttpResponse
6
-
7
- attr_accessor :real_response
8
-
9
- # net/http response
10
- def initialize(response)
11
- @real_response = response
12
- end
13
-
14
- def version
15
- 1
16
- end
17
-
18
- def code
19
- @real_response.code.to_i
20
- end
21
-
22
- def plain_body
23
- if @real_response.respond_to?(:plain_body)
24
- @real_response.plain_body
25
- else
26
- nil
27
- end
28
- end
29
-
30
- def headers
31
- if @real_response.respond_to?(:headers)
32
- @real_response.headers
33
- else
34
- nil
35
- end
36
- end
37
-
38
- end
39
-
40
- end
41
- end
42
- end