zendesk_api 3.1.1 → 4.0.0.pre.1
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 +69 -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 +16 -24
- data/lib/zendesk_api/resources.rb +84 -80
- 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,11 @@ module ZendeskAPI
|
|
|
76
76
|
@attributes.clear_changes unless new_record?
|
|
77
77
|
end
|
|
78
78
|
|
|
79
|
-
def self.new_from_response(client, response, includes = nil)
|
|
80
|
-
new(client).tap do |resource|
|
|
81
|
-
resource.handle_response(response)
|
|
82
|
-
resource.set_includes(resource, includes, response.body) if includes
|
|
83
|
-
resource.attributes.clear_changes
|
|
84
|
-
end
|
|
85
|
-
end
|
|
86
|
-
|
|
87
79
|
# Passes the method onto the attributes hash.
|
|
88
80
|
# If the attributes are nested (e.g. { :tickets => { :id => 1 } }), passes the method onto the nested hash.
|
|
89
|
-
def method_missing(*args, &
|
|
81
|
+
def method_missing(*args, &)
|
|
90
82
|
raise NoMethodError, ":save is not defined" if args.first.to_sym == :save
|
|
91
|
-
@attributes.send(*args, &
|
|
83
|
+
@attributes.send(*args, &)
|
|
92
84
|
end
|
|
93
85
|
|
|
94
86
|
def respond_to_missing?(method, include_private = false)
|
|
@@ -127,7 +119,6 @@ module ZendeskAPI
|
|
|
127
119
|
def to_s
|
|
128
120
|
"#{self.class.singular_resource_name}: #{attributes.inspect}"
|
|
129
121
|
end
|
|
130
|
-
alias :inspect :to_s
|
|
131
122
|
|
|
132
123
|
# Compares resources by class and id. If id is nil, then by object_id
|
|
133
124
|
def ==(other)
|
|
@@ -140,19 +131,19 @@ module ZendeskAPI
|
|
|
140
131
|
return id == other if other.is_a?(Integer)
|
|
141
132
|
|
|
142
133
|
warn "Trying to compare #{other.class} to a Resource
|
|
143
|
-
from #{caller.first}"
|
|
134
|
+
from #{caller(1..1).first}"
|
|
144
135
|
end
|
|
145
|
-
|
|
136
|
+
alias_method :eql, :==
|
|
146
137
|
|
|
147
138
|
# @private
|
|
148
139
|
def inspect
|
|
149
140
|
"#<#{self.class.name} #{@attributes.to_hash.inspect}>"
|
|
150
141
|
end
|
|
151
142
|
|
|
152
|
-
|
|
143
|
+
alias_method :to_param, :attributes
|
|
153
144
|
|
|
154
145
|
def attributes_for_save
|
|
155
|
-
{
|
|
146
|
+
{self.class.singular_resource_name.to_sym => attribute_changes}
|
|
156
147
|
end
|
|
157
148
|
|
|
158
149
|
private
|
|
@@ -167,6 +158,7 @@ module ZendeskAPI
|
|
|
167
158
|
# Indexable resource
|
|
168
159
|
class DataResource < Data
|
|
169
160
|
attr_accessor :error, :error_message
|
|
161
|
+
|
|
170
162
|
extend Verbs
|
|
171
163
|
|
|
172
164
|
def self.cbp_path_regexes
|
|
@@ -205,7 +197,7 @@ module ZendeskAPI
|
|
|
205
197
|
|
|
206
198
|
class SingularResource < Resource
|
|
207
199
|
def attributes_for_save
|
|
208
|
-
{
|
|
200
|
+
{self.class.resource_name.to_sym => attribute_changes}
|
|
209
201
|
end
|
|
210
202
|
end
|
|
211
203
|
|