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.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/lib/zendesk_api/actions.rb +31 -31
  3. data/lib/zendesk_api/association.rb +8 -8
  4. data/lib/zendesk_api/associations.rb +30 -30
  5. data/lib/zendesk_api/client.rb +69 -36
  6. data/lib/zendesk_api/collection.rb +41 -40
  7. data/lib/zendesk_api/configuration.rb +11 -8
  8. data/lib/zendesk_api/core_ext/inflection.rb +2 -2
  9. data/lib/zendesk_api/delegator.rb +1 -1
  10. data/lib/zendesk_api/helpers.rb +10 -10
  11. data/lib/zendesk_api/middleware/request/api_token_impersonate.rb +29 -0
  12. data/lib/zendesk_api/middleware/request/encode_json.rb +3 -4
  13. data/lib/zendesk_api/middleware/request/etag_cache.rb +27 -4
  14. data/lib/zendesk_api/middleware/request/raise_rate_limited.rb +3 -3
  15. data/lib/zendesk_api/middleware/request/retry.rb +56 -20
  16. data/lib/zendesk_api/middleware/request/upload.rb +1 -1
  17. data/lib/zendesk_api/middleware/request/url_based_access_token.rb +2 -2
  18. data/lib/zendesk_api/middleware/response/deflate.rb +1 -1
  19. data/lib/zendesk_api/middleware/response/gzip.rb +3 -3
  20. data/lib/zendesk_api/middleware/response/logger.rb +3 -3
  21. data/lib/zendesk_api/middleware/response/parse_iso_dates.rb +1 -1
  22. data/lib/zendesk_api/middleware/response/parse_json.rb +3 -3
  23. data/lib/zendesk_api/middleware/response/raise_error.rb +1 -1
  24. data/lib/zendesk_api/middleware/response/sanitize_response.rb +1 -1
  25. data/lib/zendesk_api/middleware/response/zendesk_request_event.rb +72 -0
  26. data/lib/zendesk_api/pagination.rb +3 -3
  27. data/lib/zendesk_api/resource.rb +16 -24
  28. data/lib/zendesk_api/resources.rb +84 -80
  29. data/lib/zendesk_api/search.rb +6 -6
  30. data/lib/zendesk_api/silent_mash.rb +1 -1
  31. data/lib/zendesk_api/track_changes.rb +2 -2
  32. data/lib/zendesk_api/trackie.rb +3 -3
  33. data/lib/zendesk_api/version.rb +1 -1
  34. data/lib/zendesk_api.rb +5 -5
  35. data/util/resource_handler.rb +5 -5
  36. data/util/verb_handler.rb +1 -1
  37. 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
- alias has_more_results? more_results? # For backward compatibility with 1.33.0 and 1.34.0
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 = { size: (@options_per_page_was || DEFAULT_PAGE_SIZE) }
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
@@ -1,9 +1,9 @@
1
- require 'zendesk_api/helpers'
2
- require 'zendesk_api/trackie'
3
- require 'zendesk_api/actions'
4
- require 'zendesk_api/association'
5
- require 'zendesk_api/associations'
6
- require 'zendesk_api/verbs'
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
- alias :model_key :resource_name
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(:class => self.class)
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, &block)
81
+ def method_missing(*args, &)
90
82
  raise NoMethodError, ":save is not defined" if args.first.to_sym == :save
91
- @attributes.send(*args, &block)
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
- alias :eql :==
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
- alias :to_param :attributes
143
+ alias_method :to_param, :attributes
153
144
 
154
145
  def attributes_for_save
155
- { self.class.singular_resource_name.to_sym => attribute_changes }
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
- { self.class.resource_name.to_sym => attribute_changes }
200
+ {self.class.resource_name.to_sym => attribute_changes}
209
201
  end
210
202
  end
211
203