quickbooks-ruby 1.0.1 → 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
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