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.
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 +77 -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 +22 -22
  28. data/lib/zendesk_api/resources.rb +127 -82
  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,19 @@ 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
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, &block)
89
+ def method_missing(*args, &)
90
90
  raise NoMethodError, ":save is not defined" if args.first.to_sym == :save
91
- @attributes.send(*args, &block)
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
- alias :eql :==
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
- alias :to_param :attributes
151
+ alias_method :to_param, :attributes
153
152
 
154
153
  def attributes_for_save
155
- { self.class.singular_resource_name.to_sym => attribute_changes }
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
- { self.class.resource_name.to_sym => attribute_changes }
208
+ {self.class.resource_name.to_sym => attribute_changes}
209
209
  end
210
210
  end
211
211