zuora_api 1.7.44 → 1.7.45
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/zuora_api/exceptions.rb +2 -0
- data/lib/zuora_api/login.rb +112 -55
- data/lib/zuora_api/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e353ae18d8ad1c0601b8bb92a40804f88781ba32be2a5196870f125869dc8eb1
|
4
|
+
data.tar.gz: f087799a2134d2c9f33e8970f5c60c0faea80e788d9549100103ffdcd0d297b9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4f948a1d0f0b04cbd14dcaff50f7c699c3195c8710ecb70a22802f4e4298bd6769b674ad2302e279fce1b2894ffe1b7ca8b7c6522ccc6ddc31735a3d27342ac0
|
7
|
+
data.tar.gz: 6d10f65bb4f49332d96d296c9167748e79129ac61a9f086ac1834a7671c32ecd7c089e1c38bf7678ee4211a6721e0f5c1e68a5199bfdcba37582beae1e9add3f
|
data/lib/zuora_api/exceptions.rb
CHANGED
@@ -51,6 +51,8 @@ module ZuoraAPI
|
|
51
51
|
@message = "Adjustment cannot be created for invoice with a zero balance."
|
52
52
|
when /The balance of all the invoice items and tax items is 0. No write-off is needed for the invoice .*./
|
53
53
|
@message = "The balance of all the invoice items and tax items is 0. No write-off is needed for the invoice."
|
54
|
+
when /Json input does not match schema. Error(s): string ".*" is too long .*/
|
55
|
+
@message = "Json input does not match schema. Error(s): String is too long."
|
54
56
|
else
|
55
57
|
@message = message
|
56
58
|
end
|
data/lib/zuora_api/login.rb
CHANGED
@@ -16,7 +16,8 @@ module ZuoraAPI
|
|
16
16
|
Errno::ECONNREFUSED,
|
17
17
|
SocketError,
|
18
18
|
Errno::EHOSTUNREACH,
|
19
|
-
Errno::EADDRNOTAVAIL
|
19
|
+
Errno::EADDRNOTAVAIL,
|
20
|
+
Errno::ETIMEDOUT,
|
20
21
|
].freeze
|
21
22
|
|
22
23
|
CONNECTION_READ_EXCEPTIONS = [
|
@@ -385,7 +386,7 @@ module ZuoraAPI
|
|
385
386
|
end
|
386
387
|
|
387
388
|
def rest_domain
|
388
|
-
return URI(self.rest_endpoint).host
|
389
|
+
return URI(self.rest_endpoint).host
|
389
390
|
end
|
390
391
|
|
391
392
|
def fileURL(url="")
|
@@ -429,13 +430,26 @@ module ZuoraAPI
|
|
429
430
|
else
|
430
431
|
raise ZuoraAPI::Exceptions::ZuoraAPIAuthenticationTypeError.new("Unknown Login, does not support Authentication of Type: #{auth_type}")
|
431
432
|
end
|
432
|
-
|
433
|
+
|
433
434
|
raise ZuoraAPI::Exceptions::ZuoraAPISessionError.new(self.current_error) if self.status != 'Active'
|
434
435
|
return prefix ? "Bearer #{self.bearer_token}" : self.bearer_token.to_s
|
435
436
|
end
|
436
437
|
end
|
437
438
|
|
438
|
-
def soap_call(
|
439
|
+
def soap_call(
|
440
|
+
ns1: 'ns1',
|
441
|
+
ns2: 'ns2',
|
442
|
+
batch_size: nil,
|
443
|
+
single_transaction: false,
|
444
|
+
debug: false,
|
445
|
+
zuora_track_id: nil,
|
446
|
+
errors: [ZuoraAPI::Exceptions::ZuoraAPISessionError].concat(ZUORA_API_ERRORS),
|
447
|
+
soft_errors: [],
|
448
|
+
z_session: true,
|
449
|
+
timeout_retry: false,
|
450
|
+
timeout: 120,
|
451
|
+
output_exception_messages: true,
|
452
|
+
**keyword_args)
|
439
453
|
tries ||= 2
|
440
454
|
xml = Nokogiri::XML::Builder.new do |xml|
|
441
455
|
xml['SOAP-ENV'].Envelope('xmlns:SOAP-ENV' => "http://schemas.xmlsoap.org/soap/envelope/",
|
@@ -480,7 +494,7 @@ module ZuoraAPI
|
|
480
494
|
output_xml = Nokogiri::XML(response.body)
|
481
495
|
Rails.logger.debug("Response SOAP XML: #{output_xml.to_xml(:save_with => XML_SAVE_OPTIONS).strip}") if debug
|
482
496
|
|
483
|
-
raise_errors(type: :SOAP, body: output_xml, response: response)
|
497
|
+
raise_errors(type: :SOAP, body: output_xml, response: response, soft_errors: soft_errors)
|
484
498
|
rescue ZuoraAPI::Exceptions::ZuoraAPISessionError => ex
|
485
499
|
if !tries.zero? && z_session
|
486
500
|
tries -= 1
|
@@ -509,7 +523,13 @@ module ZuoraAPI
|
|
509
523
|
end
|
510
524
|
rescue *CONNECTION_EXCEPTIONS => ex
|
511
525
|
if tries.zero?
|
512
|
-
|
526
|
+
if output_exception_messages
|
527
|
+
if Rails.logger.class.to_s == "Ougai::Logger"
|
528
|
+
Rails.logger.error("SOAP Call - Timed out will retry after #{self.timeout_sleep} seconds", ex)
|
529
|
+
else
|
530
|
+
Rails.logger.error("SOAP Call - #{ex.class} Timed out will retry after #{self.timeout_sleep} seconds")
|
531
|
+
end
|
532
|
+
end
|
513
533
|
raise ex
|
514
534
|
end
|
515
535
|
|
@@ -518,7 +538,13 @@ module ZuoraAPI
|
|
518
538
|
retry
|
519
539
|
rescue *CONNECTION_READ_EXCEPTIONS => ex
|
520
540
|
if tries.zero?
|
521
|
-
|
541
|
+
if output_exception_messages
|
542
|
+
if Rails.logger.class.to_s == "Ougai::Logger"
|
543
|
+
Rails.logger.error("SOAP Call - Timed out will retry after #{self.timeout_sleep} seconds", ex)
|
544
|
+
else
|
545
|
+
Rails.logger.error("SOAP Call - #{ex.class} Timed out will retry after #{self.timeout_sleep} seconds")
|
546
|
+
end
|
547
|
+
end
|
522
548
|
raise ex
|
523
549
|
end
|
524
550
|
|
@@ -530,7 +556,13 @@ module ZuoraAPI
|
|
530
556
|
sleep(self.timeout_sleep)
|
531
557
|
retry
|
532
558
|
else
|
533
|
-
|
559
|
+
if output_exception_messages
|
560
|
+
if Rails.logger.class.to_s == "Ougai::Logger"
|
561
|
+
Rails.logger.error("SOAP Call - Timed out will retry after #{self.timeout_sleep} seconds", ex)
|
562
|
+
else
|
563
|
+
Rails.logger.error("SOAP Call - #{ex.class} Timed out will retry after #{self.timeout_sleep} seconds")
|
564
|
+
end
|
565
|
+
end
|
534
566
|
raise ex
|
535
567
|
end
|
536
568
|
rescue => ex
|
@@ -539,7 +571,7 @@ module ZuoraAPI
|
|
539
571
|
return output_xml, input_xml, response
|
540
572
|
end
|
541
573
|
|
542
|
-
def raise_errors(type: :SOAP, body: nil, response: nil)
|
574
|
+
def raise_errors(type: :SOAP, body: nil, response: nil, soft_errors: [])
|
543
575
|
if [502,503].include?(response.code)
|
544
576
|
raise ZuoraAPI::Exceptions::ZuoraAPIConnectionTimeout.new("Received #{response.code} from #{response.request.uri}", response)
|
545
577
|
end
|
@@ -556,21 +588,45 @@ module ZuoraAPI
|
|
556
588
|
when :SOAP
|
557
589
|
error, success, message = get_soap_error_and_message(body)
|
558
590
|
|
591
|
+
if body.xpath('//ns1:queryResponse', 'ns1' => 'http://api.zuora.com/').present? &&
|
592
|
+
body.xpath(
|
593
|
+
'//ns1:records[@xsi:type="ns2:Export"]',
|
594
|
+
'ns1' => 'http://api.zuora.com/', 'xsi' => 'http://www.w3.org/2001/XMLSchema-instance'
|
595
|
+
).present?
|
596
|
+
if body.xpath('//ns1:size', 'ns1' => 'http://api.zuora.com/').text.to_i < 1 && soft_errors.include?(:export_size_0)
|
597
|
+
error = 'UNEXPECTED_ERROR'
|
598
|
+
message = 'No export found.'
|
599
|
+
end
|
600
|
+
|
601
|
+
result = body.xpath('//ns2:Status', 'ns2' => 'http://object.api.zuora.com/').text
|
602
|
+
if result == 'Failed'
|
603
|
+
reason = body.xpath('//ns2:StatusReason', 'ns2' => 'http://object.api.zuora.com/').text
|
604
|
+
if reason.present?
|
605
|
+
message = body.xpath('//ns2:StatusReason', 'ns2' => 'http://object.api.zuora.com/').text
|
606
|
+
error = message.include?('Unexpected error') ? 'UNEXPECTED_ERROR' : 'FAIL_ERROR'
|
607
|
+
else
|
608
|
+
error = 'UNEXPECTED_ERROR'
|
609
|
+
message = 'Export failed due to unknown reason. Consult api logs.'
|
610
|
+
end
|
611
|
+
end
|
612
|
+
end
|
613
|
+
|
559
614
|
#By default response if not passed in for SOAP as all SOAP is 200
|
560
615
|
if error.present?
|
561
616
|
if error.class == String
|
562
|
-
raise_errors_helper(error, message, response)
|
617
|
+
raise_errors_helper(error: error, message: message, response: response)
|
563
618
|
elsif error.class == Array
|
564
619
|
if error.uniq.size == 1
|
565
620
|
err, msg = error[0].split('::')
|
566
|
-
raise_errors_helper(err, msg, response, error, success)
|
621
|
+
raise_errors_helper(error: err, message: msg, response: response, errors: error, success: success)
|
567
622
|
else
|
568
623
|
raise ZuoraAPI::Exceptions::ZuoraAPIError.new(error.group_by {|v| v}.map {|k,v| "(#{v.size}x) - #{k == "::" ? 'UNKNOWN::No error provided' : k}"}.join(', '), response, error, success)
|
569
624
|
end
|
570
625
|
end
|
571
|
-
|
572
|
-
|
573
|
-
|
626
|
+
end
|
627
|
+
|
628
|
+
if response.code == 500 || (response.code == 400 && response.headers.fetch('content-type', []).include?('text/html'))
|
629
|
+
raise ZuoraAPI::Exceptions::ZuoraAPIInternalServerError.new(response.body, response)
|
574
630
|
end
|
575
631
|
|
576
632
|
when :JSON
|
@@ -636,7 +692,7 @@ module ZuoraAPI
|
|
636
692
|
#Locking contention
|
637
693
|
if codes_array.map{|code| code.to_s.slice(6,7).to_i}.include?(50)
|
638
694
|
raise ZuoraAPI::Exceptions::ZuoraAPILockCompetition.new("#{messages_array.join(', ')}", response)
|
639
|
-
end
|
695
|
+
end
|
640
696
|
|
641
697
|
#All Errors catch
|
642
698
|
if codes_array.size > 0
|
@@ -645,22 +701,7 @@ module ZuoraAPI
|
|
645
701
|
|
646
702
|
#Zuora REST Query Errors
|
647
703
|
if body["faultcode"].present?
|
648
|
-
|
649
|
-
when "fns:MALFORMED_QUERY"
|
650
|
-
raise ZuoraAPI::Exceptions::ZuoraAPIError.new(body["faultstring"], response)
|
651
|
-
when "fns:REQUEST_EXCEEDED_LIMIT"
|
652
|
-
raise ZuoraAPI::Exceptions::ZuoraAPIRequestLimit.new(body["faultstring"], response)
|
653
|
-
when "fns:LOCK_COMPETITION"
|
654
|
-
raise ZuoraAPI::Exceptions::ZuoraAPILockCompetition.new(body["faultstring"], response)
|
655
|
-
when "INVALID_SESSION"
|
656
|
-
raise ZuoraAPI::Exceptions::ZuoraAPISessionError.new(body["faultstring"], response)
|
657
|
-
when /fns:INVALID_TYPE/
|
658
|
-
raise ZuoraAPI::Exceptions::ZuoraAPIError.new(body["faultstring"], response)
|
659
|
-
when /.*soapenv:Server.*/
|
660
|
-
raise ZuoraAPI::Exceptions::ZuoraAPIInternalServerError.new(body["faultstring"], response)
|
661
|
-
else
|
662
|
-
raise ZuoraAPI::Exceptions::ZuoraAPIError.new("Z:#{body["faultcode"]}::#{body["faultstring"]}", response)
|
663
|
-
end
|
704
|
+
raise_errors_helper(error: body["faultcode"], message: body["faultstring"], response: response)
|
664
705
|
end
|
665
706
|
|
666
707
|
if body["Errors"].present? || body["errors"].present?
|
@@ -686,7 +727,7 @@ module ZuoraAPI
|
|
686
727
|
raise ZuoraAPI::Exceptions::ZuoraAPILockCompetition.new("Retry Lock Competition", response)
|
687
728
|
elsif error_messages.first.include?("data integrity violation")
|
688
729
|
raise ZuoraAPI::Exceptions::ZuoraDataIntegrity.new("Data Integrity Violation", response)
|
689
|
-
end
|
730
|
+
end
|
690
731
|
end
|
691
732
|
end
|
692
733
|
|
@@ -746,7 +787,7 @@ module ZuoraAPI
|
|
746
787
|
return error, success, message
|
747
788
|
end
|
748
789
|
|
749
|
-
def raise_errors_helper(error, message, response, errors
|
790
|
+
def raise_errors_helper(error: nil, message: nil, response: nil, errors: [], success: [])
|
750
791
|
case error
|
751
792
|
when /.*INVALID_SESSION/
|
752
793
|
raise ZuoraAPI::Exceptions::ZuoraAPISessionError.new(message, response, errors, success)
|
@@ -759,40 +800,31 @@ module ZuoraAPI
|
|
759
800
|
raise ZuoraAPI::Exceptions::ZuoraAPILockCompetition.new(message, response, errors, success)
|
760
801
|
elsif message.include?("org.hibernate.exception.ConstraintViolationException")
|
761
802
|
raise ZuoraAPI::Exceptions::ZuoraAPIInternalServerError.new(message, response, errors, success)
|
762
|
-
else
|
763
|
-
raise ZuoraAPI::Exceptions::ZuoraAPIError.new(message, response, errors, success)
|
764
803
|
end
|
804
|
+
raise ZuoraAPI::Exceptions::ZuoraAPIError.new(message, response, errors, success)
|
765
805
|
when /.*TEMPORARY_ERROR/
|
766
806
|
raise ZuoraAPI::Exceptions::ZuoraAPITemporaryError.new(message, response, errors, success)
|
767
807
|
when /.*INVALID_VALUE/
|
768
808
|
if message.include?("data integrity violation")
|
769
809
|
raise ZuoraAPI::Exceptions::ZuoraDataIntegrity.new("Data Integrity Violation", response, errors), success
|
770
|
-
else
|
771
|
-
raise ZuoraAPI::Exceptions::ZuoraAPIError.new(message, response, errors, success)
|
772
810
|
end
|
811
|
+
raise ZuoraAPI::Exceptions::ZuoraAPIError.new(message, response, errors, success)
|
773
812
|
when /.*UNKNOWN_ERROR/
|
774
813
|
if /payment\/refund|Credit Balance Adjustment|Payment Gateway|ARSettlement permission/.match(message).nil?
|
775
814
|
raise ZuoraAPI::Exceptions::ZuoraAPIUnkownError.new(message, response, errors, success)
|
776
|
-
else
|
777
|
-
raise ZuoraAPI::Exceptions::ZuoraAPIError.new(message, response, errors, success)
|
778
815
|
end
|
816
|
+
raise ZuoraAPI::Exceptions::ZuoraAPIError.new(message, response, errors, success)
|
779
817
|
when /INVALID_ID/, /MAX_RECORDS_EXCEEDED/, /INVALID_FIELD/, /MALFORMED_QUERY/, /NO_PERMISSION/, /PDF_QUERY_ERROR/, /MISSING_REQUIRED_VALUE/, /INVALID_TYPE/, /TRANSACTION_FAILED/, /API_DISABLED/, /CANNOT_DELETE/, /ACCOUNTING_PERIOD_CLOSED/
|
780
818
|
raise ZuoraAPI::Exceptions::ZuoraAPIError.new(message, response, errors, success)
|
819
|
+
when /.*UNEXPECTED_ERROR/
|
820
|
+
raise ZuoraAPI::Exceptions::ZuoraUnexpectedError.new(message.to_s, response, errors, success)
|
781
821
|
when /.*soapenv:Server.*/
|
782
822
|
if /Invalid value.*for type|Id is invalid/.match(message).present?
|
783
823
|
raise ZuoraAPI::Exceptions::ZuoraAPIError.new(message, response, errors, success)
|
784
824
|
end
|
785
825
|
raise ZuoraAPI::Exceptions::ZuoraAPIInternalServerError.new(message, response, errors, success)
|
786
|
-
|
787
|
-
|
788
|
-
if response.code == 500
|
789
|
-
if message.present?
|
790
|
-
raise ZuoraAPI::Exceptions::ZuoraAPIError.new("Z:#{error}::#{message}", response, errors, success)
|
791
|
-
else
|
792
|
-
raise ZuoraAPI::Exceptions::ZuoraAPIInternalServerError.new(response.body, response, errors, success)
|
793
|
-
end
|
794
|
-
else
|
795
|
-
raise ZuoraAPI::Exceptions::ZuoraAPIError.new("Z:#{error}::#{message}", response, errors, success) if error.present?
|
826
|
+
else
|
827
|
+
raise ZuoraAPI::Exceptions::ZuoraAPIInternalServerError.new("Z:#{error}::#{message}", response, errors, success)
|
796
828
|
end
|
797
829
|
end
|
798
830
|
|
@@ -875,7 +907,13 @@ module ZuoraAPI
|
|
875
907
|
end
|
876
908
|
rescue *(CONNECTION_EXCEPTIONS + CONNECTION_READ_EXCEPTIONS) => ex
|
877
909
|
if tries.zero?
|
878
|
-
|
910
|
+
if log_errors
|
911
|
+
if Rails.logger.class.to_s == "Ougai::Logger"
|
912
|
+
Rails.logger.error("Describe - Timed out will retry after #{self.timeout_sleep} seconds", ex)
|
913
|
+
else
|
914
|
+
Rails.logger.error("Describe - #{ex.class} Timed out will retry after #{self.timeout_sleep} seconds")
|
915
|
+
end
|
916
|
+
end
|
879
917
|
raise ex
|
880
918
|
end
|
881
919
|
|
@@ -911,6 +949,7 @@ module ZuoraAPI
|
|
911
949
|
timeout: 120,
|
912
950
|
multipart: false,
|
913
951
|
stream_body: false,
|
952
|
+
output_exception_messages: true,
|
914
953
|
**keyword_args,
|
915
954
|
&block
|
916
955
|
)
|
@@ -988,7 +1027,13 @@ module ZuoraAPI
|
|
988
1027
|
raise ex
|
989
1028
|
rescue *CONNECTION_EXCEPTIONS => ex
|
990
1029
|
if tries.zero?
|
991
|
-
|
1030
|
+
if output_exception_messages
|
1031
|
+
if Rails.logger.class.to_s == "Ougai::Logger"
|
1032
|
+
Rails.logger.error("Rest Call - Timed out will retry after #{self.timeout_sleep} seconds", ex)
|
1033
|
+
else
|
1034
|
+
Rails.logger.error("Rest Call - #{ex.class} Timed out will retry after #{self.timeout_sleep} seconds")
|
1035
|
+
end
|
1036
|
+
end
|
992
1037
|
raise ex
|
993
1038
|
end
|
994
1039
|
|
@@ -997,7 +1042,13 @@ module ZuoraAPI
|
|
997
1042
|
retry
|
998
1043
|
rescue *CONNECTION_READ_EXCEPTIONS => ex
|
999
1044
|
if tries.zero?
|
1000
|
-
|
1045
|
+
if output_exception_messages
|
1046
|
+
if Rails.logger.class.to_s == "Ougai::Logger"
|
1047
|
+
Rails.logger.error("Rest Call - Timed out will retry after #{self.timeout_sleep} seconds", ex)
|
1048
|
+
else
|
1049
|
+
Rails.logger.error("Rest Call - #{ex.class} Timed out will retry after #{self.timeout_sleep} seconds")
|
1050
|
+
end
|
1051
|
+
end
|
1001
1052
|
raise ex
|
1002
1053
|
end
|
1003
1054
|
|
@@ -1009,7 +1060,13 @@ module ZuoraAPI
|
|
1009
1060
|
sleep(self.timeout_sleep)
|
1010
1061
|
retry
|
1011
1062
|
else
|
1012
|
-
|
1063
|
+
if output_exception_messages
|
1064
|
+
if Rails.logger.class.to_s == "Ougai::Logger"
|
1065
|
+
Rails.logger.error("Rest Call - Timed out will retry after #{self.timeout_sleep} seconds", ex)
|
1066
|
+
else
|
1067
|
+
Rails.logger.error("Rest Call - #{ex.class} Timed out will retry after #{self.timeout_sleep} seconds")
|
1068
|
+
end
|
1069
|
+
end
|
1013
1070
|
raise ex
|
1014
1071
|
end
|
1015
1072
|
rescue => ex
|
@@ -1181,8 +1238,8 @@ module ZuoraAPI
|
|
1181
1238
|
raise ZuoraAPI::Exceptions::FileDownloadError.new("File Download Failed #{response.class}")
|
1182
1239
|
end
|
1183
1240
|
end
|
1184
|
-
|
1185
|
-
rescue => ex
|
1241
|
+
|
1242
|
+
rescue => ex
|
1186
1243
|
sleep(5)
|
1187
1244
|
if (retry_count -= 1) >= 0
|
1188
1245
|
retry
|
data/lib/zuora_api/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: zuora_api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.7.
|
4
|
+
version: 1.7.45
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Zuora Strategic Solutions Group
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-02-
|
11
|
+
date: 2020-02-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|