zendesk_api 3.1.1 → 3.1.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 +4 -4
- data/lib/zendesk_api/actions.rb +31 -31
- data/lib/zendesk_api/association.rb +8 -8
- data/lib/zendesk_api/associations.rb +30 -30
- data/lib/zendesk_api/client.rb +77 -36
- data/lib/zendesk_api/collection.rb +41 -40
- data/lib/zendesk_api/configuration.rb +11 -8
- data/lib/zendesk_api/core_ext/inflection.rb +2 -2
- data/lib/zendesk_api/delegator.rb +1 -1
- data/lib/zendesk_api/helpers.rb +10 -10
- data/lib/zendesk_api/middleware/request/api_token_impersonate.rb +29 -0
- data/lib/zendesk_api/middleware/request/encode_json.rb +3 -4
- data/lib/zendesk_api/middleware/request/etag_cache.rb +27 -4
- data/lib/zendesk_api/middleware/request/raise_rate_limited.rb +3 -3
- data/lib/zendesk_api/middleware/request/retry.rb +56 -20
- data/lib/zendesk_api/middleware/request/upload.rb +1 -1
- data/lib/zendesk_api/middleware/request/url_based_access_token.rb +2 -2
- data/lib/zendesk_api/middleware/response/deflate.rb +1 -1
- data/lib/zendesk_api/middleware/response/gzip.rb +3 -3
- data/lib/zendesk_api/middleware/response/logger.rb +3 -3
- data/lib/zendesk_api/middleware/response/parse_iso_dates.rb +1 -1
- data/lib/zendesk_api/middleware/response/parse_json.rb +3 -3
- data/lib/zendesk_api/middleware/response/raise_error.rb +1 -1
- data/lib/zendesk_api/middleware/response/sanitize_response.rb +1 -1
- data/lib/zendesk_api/middleware/response/zendesk_request_event.rb +72 -0
- data/lib/zendesk_api/pagination.rb +3 -3
- data/lib/zendesk_api/resource.rb +22 -22
- data/lib/zendesk_api/resources.rb +127 -82
- data/lib/zendesk_api/search.rb +6 -6
- data/lib/zendesk_api/silent_mash.rb +1 -1
- data/lib/zendesk_api/track_changes.rb +2 -2
- data/lib/zendesk_api/trackie.rb +3 -3
- data/lib/zendesk_api/version.rb +1 -1
- data/lib/zendesk_api.rb +5 -5
- data/util/resource_handler.rb +5 -5
- data/util/verb_handler.rb +1 -1
- metadata +27 -16
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
require "faraday/response"
|
|
2
|
+
|
|
3
|
+
module ZendeskAPI
|
|
4
|
+
module Middleware
|
|
5
|
+
module Response
|
|
6
|
+
# @private
|
|
7
|
+
class ZendeskRequestEvent < Faraday::Middleware
|
|
8
|
+
def initialize(app, options = {})
|
|
9
|
+
super(app)
|
|
10
|
+
@instrumentation = options[:instrumentation]
|
|
11
|
+
@logger = options[:logger]
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def call(env)
|
|
15
|
+
return @app.call(env) unless instrumentation
|
|
16
|
+
|
|
17
|
+
start_time = Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
|
18
|
+
@app.call(env).on_complete do |response_env|
|
|
19
|
+
stop_time = Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
|
20
|
+
|
|
21
|
+
begin
|
|
22
|
+
instrument_request(response_env, start_time, stop_time)
|
|
23
|
+
instrument_rate_limit(response_env)
|
|
24
|
+
rescue => e
|
|
25
|
+
logger&.debug("Instrumentation failed: #{e.message}")
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
private
|
|
31
|
+
|
|
32
|
+
attr_reader :instrumentation, :logger
|
|
33
|
+
|
|
34
|
+
def instrument_request(response_env, start_time, stop_time)
|
|
35
|
+
duration_ms = (stop_time - start_time) * 1000.0
|
|
36
|
+
|
|
37
|
+
payload = {
|
|
38
|
+
duration: duration_ms,
|
|
39
|
+
endpoint: response_env[:url]&.path,
|
|
40
|
+
method: response_env[:method],
|
|
41
|
+
status: response_env[:status]
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
instrumentation.instrument("zendesk.request", payload)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def instrument_rate_limit(response_env)
|
|
48
|
+
status = response_env[:status]
|
|
49
|
+
return unless status && status < 500
|
|
50
|
+
|
|
51
|
+
headers = response_env[:response_headers]
|
|
52
|
+
remaining, limit, reset = headers&.values_at(
|
|
53
|
+
"X-Rate-Limit-Remaining",
|
|
54
|
+
"X-Rate-Limit",
|
|
55
|
+
"X-Rate-Limit-Reset"
|
|
56
|
+
)
|
|
57
|
+
return if [remaining, limit, reset].all?(&:nil?)
|
|
58
|
+
|
|
59
|
+
payload = {
|
|
60
|
+
endpoint: response_env[:url]&.path,
|
|
61
|
+
status: status,
|
|
62
|
+
remaining: remaining,
|
|
63
|
+
limit: limit,
|
|
64
|
+
reset: reset
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
instrumentation.instrument("zendesk.rate_limit", payload)
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|
|
@@ -6,7 +6,7 @@ module ZendeskAPI
|
|
|
6
6
|
def more_results?(response)
|
|
7
7
|
Helpers.present?(response["meta"]) && response["meta"]["has_more"]
|
|
8
8
|
end
|
|
9
|
-
|
|
9
|
+
alias_method :has_more_results?, :more_results? # For backward compatibility with 1.33.0 and 1.34.0
|
|
10
10
|
|
|
11
11
|
# Changes the per_page option. Returns self, so it can be chained. No execution.
|
|
12
12
|
# @return [Collection] self
|
|
@@ -49,7 +49,7 @@ module ZendeskAPI
|
|
|
49
49
|
def set_cbp_options
|
|
50
50
|
@options_per_page_was = @options.delete("per_page")
|
|
51
51
|
# Default to CBP by using the page param as a map
|
|
52
|
-
@options.page = {
|
|
52
|
+
@options.page = {size: @options_per_page_was || DEFAULT_PAGE_SIZE}
|
|
53
53
|
end
|
|
54
54
|
|
|
55
55
|
# CBP requests look like: `/resources?page[size]=100`
|
|
@@ -92,7 +92,7 @@ module ZendeskAPI
|
|
|
92
92
|
@options.page.merge!(
|
|
93
93
|
before: body["meta"]["before_cursor"],
|
|
94
94
|
after: body["meta"]["after_cursor"]
|
|
95
|
-
|
|
95
|
+
)
|
|
96
96
|
end
|
|
97
97
|
end
|
|
98
98
|
end
|
data/lib/zendesk_api/resource.rb
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
require_relative "helpers"
|
|
2
|
+
require_relative "trackie"
|
|
3
|
+
require_relative "actions"
|
|
4
|
+
require_relative "association"
|
|
5
|
+
require_relative "associations"
|
|
6
|
+
require_relative "verbs"
|
|
7
7
|
|
|
8
8
|
# See docs: https://developer.zendesk.com/api-reference/
|
|
9
9
|
module ZendeskAPI
|
|
@@ -34,7 +34,7 @@ module ZendeskAPI
|
|
|
34
34
|
[@namespace, resource_name].compact.join("/")
|
|
35
35
|
end
|
|
36
36
|
|
|
37
|
-
|
|
37
|
+
alias_method :model_key, :resource_name
|
|
38
38
|
|
|
39
39
|
def namespace(namespace)
|
|
40
40
|
@namespace = namespace
|
|
@@ -64,7 +64,7 @@ module ZendeskAPI
|
|
|
64
64
|
def initialize(client, attributes = {})
|
|
65
65
|
raise "Expected a Hash for attributes, got #{attributes.inspect}" unless attributes.is_a?(Hash)
|
|
66
66
|
|
|
67
|
-
@association = attributes.delete(:association) || Association.new(:
|
|
67
|
+
@association = attributes.delete(:association) || Association.new(class: self.class)
|
|
68
68
|
@global_params = attributes.delete(:global) || {}
|
|
69
69
|
@client = client
|
|
70
70
|
@attributes = ZendeskAPI::Trackie.new(attributes)
|
|
@@ -76,19 +76,19 @@ module ZendeskAPI
|
|
|
76
76
|
@attributes.clear_changes unless new_record?
|
|
77
77
|
end
|
|
78
78
|
|
|
79
|
-
def
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
79
|
+
def account_data
|
|
80
|
+
@client.account_data
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def refresh_custom_fields_metadata
|
|
84
|
+
@client.refresh_custom_fields_metadata
|
|
85
85
|
end
|
|
86
86
|
|
|
87
87
|
# Passes the method onto the attributes hash.
|
|
88
88
|
# If the attributes are nested (e.g. { :tickets => { :id => 1 } }), passes the method onto the nested hash.
|
|
89
|
-
def method_missing(*args, &
|
|
89
|
+
def method_missing(*args, &)
|
|
90
90
|
raise NoMethodError, ":save is not defined" if args.first.to_sym == :save
|
|
91
|
-
@attributes.send(*args, &
|
|
91
|
+
@attributes.send(*args, &)
|
|
92
92
|
end
|
|
93
93
|
|
|
94
94
|
def respond_to_missing?(method, include_private = false)
|
|
@@ -127,7 +127,6 @@ module ZendeskAPI
|
|
|
127
127
|
def to_s
|
|
128
128
|
"#{self.class.singular_resource_name}: #{attributes.inspect}"
|
|
129
129
|
end
|
|
130
|
-
alias :inspect :to_s
|
|
131
130
|
|
|
132
131
|
# Compares resources by class and id. If id is nil, then by object_id
|
|
133
132
|
def ==(other)
|
|
@@ -140,19 +139,19 @@ module ZendeskAPI
|
|
|
140
139
|
return id == other if other.is_a?(Integer)
|
|
141
140
|
|
|
142
141
|
warn "Trying to compare #{other.class} to a Resource
|
|
143
|
-
from #{caller.first}"
|
|
142
|
+
from #{caller(1..1).first}"
|
|
144
143
|
end
|
|
145
|
-
|
|
144
|
+
alias_method :eql, :==
|
|
146
145
|
|
|
147
146
|
# @private
|
|
148
147
|
def inspect
|
|
149
148
|
"#<#{self.class.name} #{@attributes.to_hash.inspect}>"
|
|
150
149
|
end
|
|
151
150
|
|
|
152
|
-
|
|
151
|
+
alias_method :to_param, :attributes
|
|
153
152
|
|
|
154
153
|
def attributes_for_save
|
|
155
|
-
{
|
|
154
|
+
{self.class.singular_resource_name.to_sym => attribute_changes}
|
|
156
155
|
end
|
|
157
156
|
|
|
158
157
|
private
|
|
@@ -167,6 +166,7 @@ module ZendeskAPI
|
|
|
167
166
|
# Indexable resource
|
|
168
167
|
class DataResource < Data
|
|
169
168
|
attr_accessor :error, :error_message
|
|
169
|
+
|
|
170
170
|
extend Verbs
|
|
171
171
|
|
|
172
172
|
def self.cbp_path_regexes
|
|
@@ -205,7 +205,7 @@ module ZendeskAPI
|
|
|
205
205
|
|
|
206
206
|
class SingularResource < Resource
|
|
207
207
|
def attributes_for_save
|
|
208
|
-
{
|
|
208
|
+
{self.class.resource_name.to_sym => attribute_changes}
|
|
209
209
|
end
|
|
210
210
|
end
|
|
211
211
|
|