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
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 138f1dab58b3b37d450c4b1dd9200b1c878944b19571f53888b2c4d17a307276
4
- data.tar.gz: 24459eda2e613e21be9924ad6bb571e53861f949d6be291f2bec3516cd1e9ad2
3
+ metadata.gz: 4804fd37b3a0cca8014505335c2f5ab6177a678a1dd429b56cb012804f65ea31
4
+ data.tar.gz: d7db1542be1bf6913dfe2340c3d6a1b4742386e9571f91a249a5e1edb44e8edc
5
5
  SHA512:
6
- metadata.gz: 55f26e4b66e457d5e9e634eefa44fc8b50da170ab2d5a5f97d2460daa423da04d7c607bfa626b1ecd7ce56117a1ee410e7213df6717d84a8e4a109392e1611a5
7
- data.tar.gz: 0bab4d20e8989a0e1a4f8be708f76ccd462fddec1b880fb360591f9f048d74c5bbd17d20b678290fb6891dcb0fa6755139e5165fb7c7ea28055643abe583efbb
6
+ metadata.gz: 10372ee1b741eab42e07127dd81c355d5b2e3707627b2e6d8aa86f9cd01c2c100860d1467935b37d202ee3bd9df98bef8379b6312c770fc736180bc96e25d085
7
+ data.tar.gz: 4190bc1b3a8e798302df52f5544da095e3f758783b6a9ebf0191ef2fe44a019939746a29b9200208bf1664aee57816a30cd93d1e2b11903bec2112146e4a1415
@@ -43,8 +43,8 @@ module ZendeskAPI
43
43
  end
44
44
 
45
45
  # Saves, returning false if it fails and attaching the errors
46
- def save(options = {}, &block)
47
- save!(options, &block)
46
+ def save(options = {}, &)
47
+ save!(options, &)
48
48
  rescue ZendeskAPI::Error::RecordInvalid => e
49
49
  @errors = e.errors
50
50
  false
@@ -66,7 +66,7 @@ module ZendeskAPI
66
66
  self.class.associations.each do |association_data|
67
67
  association_name = association_data[:name]
68
68
 
69
- next unless send("#{association_name}_used?") && association = send(association_name)
69
+ next unless send("#{association_name}_used?") && (association = send(association_name))
70
70
 
71
71
  inline_creation = association_data[:inline] == :create && new_record?
72
72
  changed = association.is_a?(Collection) || association.changed?
@@ -110,7 +110,7 @@ module ZendeskAPI
110
110
  @client = client # so we can use client.logger in rescue
111
111
 
112
112
  raise ArgumentError, "No :id given" unless options[:id] || options["id"] || ancestors.include?(SingularResource)
113
- association = options.delete(:association) || Association.new(:class => self)
113
+ association = options.delete(:association) || Association.new(class: self)
114
114
 
115
115
  includes = Array(options[:include])
116
116
  options[:include] = includes.join(",") if includes.any?
@@ -127,8 +127,8 @@ module ZendeskAPI
127
127
  # Finds, returning nil if it fails
128
128
  # @param [Client] client The {Client} object to be used
129
129
  # @param [Hash] options Any additional GET parameters to be added
130
- def find(client, options = {}, &block)
131
- find!(client, options, &block)
130
+ def find(client, options = {}, &)
131
+ find!(client, options, &)
132
132
  rescue ZendeskAPI::Error::ClientError
133
133
  nil
134
134
  end
@@ -157,8 +157,8 @@ module ZendeskAPI
157
157
  # Creates, returning nil if it fails
158
158
  # @param [Client] client The {Client} object to be used
159
159
  # @param [Hash] options Any additional GET parameters to be added
160
- def create(client, attributes = {}, &block)
161
- create!(client, attributes, &block)
160
+ def create(client, attributes = {}, &)
161
+ create!(client, attributes, &)
162
162
  rescue ZendeskAPI::Error::ClientError
163
163
  nil
164
164
  end
@@ -170,9 +170,9 @@ module ZendeskAPI
170
170
  # @param [Client] client The {Client} object to be used
171
171
  # @param [Array] attributes_array An array of resources to be created.
172
172
  # @return [JobStatus] the {JobStatus} instance for this create job
173
- def create_many!(client, attributes_array, association = Association.new(:class => self))
173
+ def create_many!(client, attributes_array, association = Association.new(class: self))
174
174
  response = client.connection.post("#{association.generate_path}/create_many") do |req|
175
- req.body = { resource_name => attributes_array }
175
+ req.body = {resource_name => attributes_array}
176
176
 
177
177
  yield req if block_given?
178
178
  end
@@ -185,9 +185,9 @@ module ZendeskAPI
185
185
  # Creates or updates resource using the create_or_update endpoint.
186
186
  # @param [Client] client The {Client} object to be used
187
187
  # @param [Hash] attributes The attributes to create.
188
- def create_or_update!(client, attributes, association = Association.new(:class => self))
188
+ def create_or_update!(client, attributes, association = Association.new(class: self))
189
189
  response = client.connection.post("#{association.generate_path}/create_or_update") do |req|
190
- req.body = { singular_resource_name => attributes }
190
+ req.body = {singular_resource_name => attributes}
191
191
 
192
192
  yield req if block_given?
193
193
  end
@@ -204,10 +204,10 @@ module ZendeskAPI
204
204
  #
205
205
  # @return [JobStatus] the {JobStatus} instance for this destroy job
206
206
  def create_or_update_many!(client, attributes)
207
- association = Association.new(:class => self)
207
+ association = Association.new(class: self)
208
208
 
209
209
  response = client.connection.post("#{association.generate_path}/create_or_update_many") do |req|
210
- req.body = { resource_name => attributes }
210
+ req.body = {resource_name => attributes}
211
211
 
212
212
  yield req if block_given?
213
213
  end
@@ -239,8 +239,8 @@ module ZendeskAPI
239
239
  end
240
240
 
241
241
  # Destroys, returning false on error.
242
- def destroy(&block)
243
- destroy!(&block)
242
+ def destroy(&)
243
+ destroy!(&)
244
244
  rescue ZendeskAPI::Error::ClientError
245
245
  false
246
246
  end
@@ -249,15 +249,15 @@ module ZendeskAPI
249
249
  # Deletes a resource given the id passed in.
250
250
  # @param [Client] client The {Client} object to be used
251
251
  # @param [Hash] opts The optional parameters to pass. Defaults to {}
252
- def destroy!(client, opts = {}, &block)
253
- new(client, opts).destroy!(&block)
252
+ def destroy!(client, opts = {}, &)
253
+ new(client, opts).destroy!(&)
254
254
 
255
255
  true
256
256
  end
257
257
 
258
258
  # Destroys, returning false on error.
259
- def destroy(client, attributes = {}, &block)
260
- destroy!(client, attributes, &block)
259
+ def destroy(client, attributes = {}, &)
260
+ destroy!(client, attributes, &)
261
261
  rescue ZendeskAPI::Error::ClientError
262
262
  false
263
263
  end
@@ -269,9 +269,9 @@ module ZendeskAPI
269
269
  # @param [Client] client The {Client} object to be used
270
270
  # @param [Array] ids An array of ids to destroy
271
271
  # @return [JobStatus] the {JobStatus} instance for this destroy job
272
- def destroy_many!(client, ids, association = Association.new(:class => self))
272
+ def destroy_many!(client, ids, association = Association.new(class: self))
273
273
  response = client.connection.delete("#{association.generate_path}/destroy_many") do |req|
274
- req.params = { :ids => ids.join(',') }
274
+ req.params = {ids: ids.join(",")}
275
275
 
276
276
  yield req if block_given?
277
277
  end
@@ -289,8 +289,8 @@ module ZendeskAPI
289
289
 
290
290
  module ClassMethod
291
291
  # Updates, returning false on error.
292
- def update(client, attributes = {}, &block)
293
- update!(client, attributes, &block)
292
+ def update(client, attributes = {}, &)
293
+ update!(client, attributes, &)
294
294
  rescue ZendeskAPI::Error::ClientError
295
295
  false
296
296
  end
@@ -298,11 +298,11 @@ module ZendeskAPI
298
298
  # Updates a resource given the id passed in.
299
299
  # @param [Client] client The {Client} object to be used
300
300
  # @param [Hash] attributes The attributes to update. Default to {
301
- def update!(client, attributes = {}, &block)
301
+ def update!(client, attributes = {}, &)
302
302
  ZendeskAPI::Client.check_deprecated_namespace_usage attributes, singular_resource_name
303
- resource = new(client, :id => attributes.delete(:id), :global => attributes.delete(:global), :association => attributes.delete(:association))
303
+ resource = new(client, id: attributes.delete(:id), global: attributes.delete(:global), association: attributes.delete(:association))
304
304
  resource.attributes.merge!(attributes)
305
- resource.save!(:force_update => resource.is_a?(SingularResource), &block)
305
+ resource.save!(force_update: resource.is_a?(SingularResource), &)
306
306
  resource
307
307
  end
308
308
  end
@@ -315,14 +315,14 @@ module ZendeskAPI
315
315
  # @param [Hash] attributes The attributes to update resources with
316
316
  # @return [JobStatus] the {JobStatus} instance for this destroy job
317
317
  def update_many!(client, ids_or_attributes, attributes = {})
318
- association = attributes.delete(:association) || Association.new(:class => self)
318
+ association = attributes.delete(:association) || Association.new(class: self)
319
319
 
320
320
  response = client.connection.put("#{association.generate_path}/update_many") do |req|
321
321
  if attributes == {}
322
- req.body = { resource_name => ids_or_attributes }
322
+ req.body = {resource_name => ids_or_attributes}
323
323
  else
324
- req.params = { :ids => ids_or_attributes.join(',') }
325
- req.body = { singular_resource_name => attributes }
324
+ req.params = {ids: ids_or_attributes.join(",")}
325
+ req.body = {singular_resource_name => attributes}
326
326
  end
327
327
 
328
328
  yield req if block_given?
@@ -1,4 +1,4 @@
1
- require 'zendesk_api/helpers'
1
+ require_relative "helpers"
2
2
 
3
3
  module ZendeskAPI
4
4
  # Represents an association between two resources
@@ -43,7 +43,7 @@ module ZendeskAPI
43
43
  # * with_parent - Include the parent path (false by default)
44
44
  # * with_id - Include the instance id, if possible (true)
45
45
  def generate_path(*args)
46
- options = SilentMash.new(:with_id => true)
46
+ options = SilentMash.new(with_id: true)
47
47
  if args.last.is_a?(Hash)
48
48
  original_options = args.pop
49
49
  options.merge!(original_options)
@@ -66,7 +66,7 @@ module ZendeskAPI
66
66
  namespace[0] = @options.path || @options[:class].resource_path
67
67
  end
68
68
 
69
- if id = extract_id(instance, options, original_options)
69
+ if (id = extract_id(instance, options, original_options))
70
70
  namespace << id
71
71
  end
72
72
 
@@ -93,7 +93,7 @@ module ZendeskAPI
93
93
 
94
94
  # @return [Array<String>] ['ZendeskAPI', 'Voice', etc.. ]
95
95
  def ignorable_namespace_strings
96
- ZendeskAPI::DataNamespace.descendants.map { |klass| klass.to_s.split('::') }.flatten.uniq
96
+ ZendeskAPI::DataNamespace.descendants.map { |klass| klass.to_s.split("::") }.flatten.uniq
97
97
  end
98
98
 
99
99
  def _side_load(resource, side_loads)
@@ -106,10 +106,10 @@ module ZendeskAPI
106
106
  end
107
107
  end
108
108
 
109
- def side_load_from_parent_id(resource, side_loads, key)
109
+ def side_load_from_parent_id(resource, side_loads, _key)
110
110
  key = "#{resource.class.singular_resource_name}_id"
111
111
 
112
- resource.send("#{options.name}=", _side_load(resource, side_loads.select {|side_load|
112
+ resource.send("#{options.name}=", _side_load(resource, side_loads.select { |side_load|
113
113
  side_load[key] == resource.id
114
114
  }))
115
115
  end
@@ -117,7 +117,7 @@ module ZendeskAPI
117
117
  def side_load_from_child_ids(resource, side_loads, plural_key)
118
118
  ids = resource.send(plural_key)
119
119
 
120
- resource.send("#{options.name}=", _side_load(resource, side_loads.select {|side_load|
120
+ resource.send("#{options.name}=", _side_load(resource, side_loads.select { |side_load|
121
121
  ids.include?(side_load[options.include_key])
122
122
  }))
123
123
  end
@@ -178,7 +178,7 @@ module ZendeskAPI
178
178
 
179
179
  def extract_id(instance, options, original_options)
180
180
  if options[:with_id] && !@options[:class].ancestors.include?(SingularResource)
181
- if instance && instance.id
181
+ if instance&.id
182
182
  instance.id
183
183
  elsif options[:id]
184
184
  original_options.delete(:id) || original_options.delete("id")
@@ -1,4 +1,4 @@
1
- require 'zendesk_api/helpers'
1
+ require_relative "helpers"
2
2
 
3
3
  module ZendeskAPI
4
4
  # This module holds association method for resources.
@@ -14,14 +14,14 @@ module ZendeskAPI
14
14
  end
15
15
 
16
16
  def wrap_resource(resource, class_level_association, options = {})
17
- instance_association = Association.new(class_level_association.merge(:parent => self))
17
+ instance_association = Association.new(class_level_association.merge(parent: self))
18
18
  klass = class_level_association[:class]
19
19
 
20
20
  case resource
21
21
  when Hash
22
- klass.new(@client, resource.merge(:association => instance_association))
22
+ klass.new(@client, resource.merge(association: instance_association))
23
23
  when String, Integer
24
- klass.new(@client, (options[:include_key] || :id) => resource, :association => instance_association)
24
+ klass.new(@client, options[:include_key] || :id => resource, :association => instance_association)
25
25
  else
26
26
  resource.association = instance_association
27
27
  resource
@@ -40,12 +40,10 @@ module ZendeskAPI
40
40
  end
41
41
 
42
42
  def associated_with(name)
43
- associations.inject([]) do |associated_with, association|
43
+ associations.each_with_object([]) do |association, associated_with|
44
44
  if association[:include] == name.to_s
45
45
  associated_with.push(Association.new(association))
46
46
  end
47
-
48
- associated_with
49
47
  end
50
48
  end
51
49
 
@@ -53,14 +51,14 @@ module ZendeskAPI
53
51
 
54
52
  def build_association(klass, resource_name, options)
55
53
  {
56
- :class => klass,
57
- :name => resource_name,
58
- :inline => options.delete(:inline),
59
- :path => options.delete(:path),
60
- :include => (options.delete(:include) || klass.resource_name).to_s,
61
- :include_key => (options.delete(:include_key) || :id).to_s,
62
- :singular => options.delete(:singular),
63
- :extensions => Array(options.delete(:extend))
54
+ class: klass,
55
+ name: resource_name,
56
+ inline: options.delete(:inline),
57
+ path: options.delete(:path),
58
+ include: (options.delete(:include) || klass.resource_name).to_s,
59
+ include_key: (options.delete(:include_key) || :id).to_s,
60
+ singular: options.delete(:singular),
61
+ extensions: Array(options.delete(:extend))
64
62
  }
65
63
  end
66
64
 
@@ -75,7 +73,7 @@ module ZendeskAPI
75
73
  # @param [Symbol] resource_name_or_class The underlying resource name or a class to get it from
76
74
  # @param [Hash] class_level_options The options to pass to the method definition.
77
75
  def has(resource_name_or_class, class_level_options = {})
78
- if klass = class_level_options.delete(:class)
76
+ if (klass = class_level_options.delete(:class))
79
77
  resource_name = resource_name_or_class
80
78
  else
81
79
  klass = resource_name_or_class
@@ -83,7 +81,8 @@ module ZendeskAPI
83
81
  end
84
82
 
85
83
  class_level_association = build_association(klass, resource_name, class_level_options)
86
- class_level_association.merge!(:singular => true, :id_column => "#{resource_name}_id")
84
+ class_level_association[:singular] = true
85
+ class_level_association[:id_column] = "#{resource_name}_id"
87
86
 
88
87
  associations << class_level_association
89
88
 
@@ -105,14 +104,14 @@ module ZendeskAPI
105
104
  return cached if cached && !instance_options[:reload]
106
105
 
107
106
  # find and cache association
108
- instance_association = Association.new(association.merge(:parent => self))
109
- resource = if klass.respond_to?(:find) && resource_id = method_missing(association[:id_column])
110
- klass.find(@client, :id => resource_id, :association => instance_association)
111
- elsif found = method_missing(association[:name].to_sym)
112
- wrap_resource(found, association, :include_key => association[:include_key])
107
+ instance_association = Association.new(association.merge(parent: self))
108
+ resource = if klass.respond_to?(:find) && (resource_id = method_missing(association[:id_column]))
109
+ klass.find(@client, id: resource_id, association: instance_association)
110
+ elsif (found = method_missing(association[:name].to_sym))
111
+ wrap_resource(found, association, include_key: association[:include_key])
113
112
  elsif klass.superclass == DataResource && !association[:inline]
114
- response = @client.connection.get(instance_association.generate_path(:with_parent => true))
115
- klass.new(@client, response.body[klass.singular_resource_name].merge(:association => instance_association))
113
+ response = @client.connection.get(instance_association.generate_path(with_parent: true))
114
+ klass.new(@client, response.body[klass.singular_resource_name].merge(association: instance_association))
116
115
  end
117
116
 
118
117
  send("#{association[:id_column]}=", resource.id) if resource && has_key?(association[:id_column])
@@ -134,7 +133,7 @@ module ZendeskAPI
134
133
  # @param [Symbol] resource_name_or_class The underlying resource name or class to get it from
135
134
  # @param [Hash] class_level_options The options to pass to the method definition.
136
135
  def has_many(resource_name_or_class, class_level_options = {})
137
- if klass = class_level_options.delete(:class)
136
+ if (klass = class_level_options.delete(:class))
138
137
  resource_name = resource_name_or_class
139
138
  else
140
139
  klass = resource_name_or_class
@@ -142,7 +141,8 @@ module ZendeskAPI
142
141
  end
143
142
 
144
143
  class_level_association = build_association(klass, resource_name, class_level_options)
145
- class_level_association.merge!(:singular => false, :id_column => "#{resource_name}_ids")
144
+ class_level_association[:singular] = false
145
+ class_level_association[:id_column] = "#{resource_name}_ids"
146
146
 
147
147
  associations << class_level_association
148
148
 
@@ -164,12 +164,12 @@ module ZendeskAPI
164
164
  return cached if cached && !instance_opts[:reload]
165
165
 
166
166
  # find and cache association
167
- instance_association = Association.new(association.merge(:parent => self))
167
+ instance_association = Association.new(association.merge(parent: self))
168
168
  singular_resource_name = Inflection.singular(association[:name].to_s)
169
169
 
170
170
  resources = if (ids = method_missing("#{singular_resource_name}_ids")) && ids.any?
171
171
  ids.map do |id|
172
- klass.find(@client, :id => id, :association => instance_association)
172
+ klass.find(@client, id: id, association: instance_association)
173
173
  end.compact
174
174
  elsif (resources = method_missing(association[:name].to_sym)) && resources.any?
175
175
  resources.map { |res| wrap_resource(res, association) }
@@ -177,7 +177,7 @@ module ZendeskAPI
177
177
  []
178
178
  end
179
179
 
180
- collection = ZendeskAPI::Collection.new(@client, klass, instance_opts.merge(:association => instance_association))
180
+ collection = ZendeskAPI::Collection.new(@client, klass, instance_opts.merge(association: instance_association))
181
181
 
182
182
  if association[:extensions].any?
183
183
  collection.extend(*association[:extensions])
@@ -198,7 +198,7 @@ module ZendeskAPI
198
198
  wrapped = resources.map { |attr| wrap_resource(attr, association) }
199
199
  send(association[:name]).replace(wrapped)
200
200
  else
201
- resources.association = Association.new(association.merge(:parent => self))
201
+ resources.association = Association.new(association.merge(parent: self))
202
202
  instance_variable_set("@#{association[:name]}", resources)
203
203
  end
204
204
 
@@ -1,24 +1,26 @@
1
- require 'zendesk_api/version'
2
- require 'zendesk_api/sideloading'
3
- require 'zendesk_api/configuration'
4
- require 'zendesk_api/collection'
5
- require 'zendesk_api/lru_cache'
6
- require 'zendesk_api/silent_mash'
7
- require 'zendesk_api/middleware/request/etag_cache'
8
- require 'zendesk_api/middleware/request/retry'
9
- require 'zendesk_api/middleware/request/raise_rate_limited'
10
- require 'zendesk_api/middleware/request/upload'
11
- require 'zendesk_api/middleware/request/encode_json'
12
- require 'zendesk_api/middleware/request/url_based_access_token'
13
- require 'zendesk_api/middleware/response/callback'
14
- require 'zendesk_api/middleware/response/deflate'
15
- require 'zendesk_api/middleware/response/gzip'
16
- require 'zendesk_api/middleware/response/sanitize_response'
17
- require 'zendesk_api/middleware/response/parse_iso_dates'
18
- require 'zendesk_api/middleware/response/parse_json'
19
- require 'zendesk_api/middleware/response/raise_error'
20
- require 'zendesk_api/middleware/response/logger'
21
- require 'zendesk_api/delegator'
1
+ require_relative "version"
2
+ require_relative "sideloading"
3
+ require_relative "configuration"
4
+ require_relative "collection"
5
+ require_relative "lru_cache"
6
+ require_relative "silent_mash"
7
+ require_relative "middleware/request/etag_cache"
8
+ require_relative "middleware/request/retry"
9
+ require_relative "middleware/request/raise_rate_limited"
10
+ require_relative "middleware/request/upload"
11
+ require_relative "middleware/request/encode_json"
12
+ require_relative "middleware/request/api_token_impersonate"
13
+ require_relative "middleware/request/url_based_access_token"
14
+ require_relative "middleware/response/callback"
15
+ require_relative "middleware/response/deflate"
16
+ require_relative "middleware/response/gzip"
17
+ require_relative "middleware/response/sanitize_response"
18
+ require_relative "middleware/response/parse_iso_dates"
19
+ require_relative "middleware/response/parse_json"
20
+ require_relative "middleware/response/raise_error"
21
+ require_relative "middleware/response/logger"
22
+ require_relative "middleware/response/zendesk_request_event"
23
+ require_relative "delegator"
22
24
 
23
25
  module ZendeskAPI
24
26
  # The top-level class that handles configuration and connection to the Zendesk API.
@@ -30,11 +32,13 @@ module ZendeskAPI
30
32
  attr_reader :config
31
33
  # @return [Array] Custom response callbacks
32
34
  attr_reader :callbacks
35
+ # @return [Hash] Memoized account data
36
+ attr_reader :account_data
33
37
 
34
38
  # Handles resources such as 'tickets'. Any options are passed to the underlying collection, except reload which disregards
35
39
  # memoization and creates a new Collection instance.
36
40
  # @return [Collection] Collection instance for resource
37
- def method_missing(method, *args, &block)
41
+ def method_missing(method, *args, &)
38
42
  method = method.to_s
39
43
  options = args.last.is_a?(Hash) ? args.pop : {}
40
44
  unless config.use_resource_cache
@@ -43,7 +47,7 @@ module ZendeskAPI
43
47
  return ZendeskAPI::Collection.new(self, resource_class, options)
44
48
  end
45
49
 
46
- @resource_cache[method] ||= { :class => nil, :cache => ZendeskAPI::LRUCache.new }
50
+ @resource_cache[method] ||= {class: nil, cache: ZendeskAPI::LRUCache.new}
47
51
  if !options.delete(:reload) && (cached = @resource_cache[method][:cache].read(options.hash))
48
52
  cached
49
53
  else
@@ -62,21 +66,21 @@ module ZendeskAPI
62
66
  # @return [ZendeskAPI::User] Current user or nil
63
67
  def current_user(reload = false)
64
68
  return @current_user if @current_user && !reload
65
- @current_user = users.find(:id => 'me')
69
+ @current_user = users.find(id: "me")
66
70
  end
67
71
 
68
72
  # Returns the current account
69
73
  # @return [Hash] The attributes of the current account or nil
70
74
  def current_account(reload = false)
71
75
  return @current_account if @current_account && !reload
72
- @current_account = SilentMash.new(connection.get('account/resolve').body)
76
+ @current_account = SilentMash.new(connection.get("account/resolve").body)
73
77
  end
74
78
 
75
79
  # Returns the current locale
76
80
  # @return [ZendeskAPI::Locale] Current locale or nil
77
81
  def current_locale(reload = false)
78
82
  return @locale if @locale && !reload
79
- @locale = locales.find(:id => 'current')
83
+ @locale = locales.find(id: "current")
80
84
  end
81
85
 
82
86
  # Creates a new {Client} instance and yields {#config}.
@@ -93,8 +97,10 @@ module ZendeskAPI
93
97
 
94
98
  @callbacks = []
95
99
  @resource_cache = {}
100
+ @account_data = {}
96
101
 
97
102
  check_url
103
+ check_instrumentation
98
104
 
99
105
  config.retry = !!config.retry # nil -> false
100
106
 
@@ -104,6 +110,25 @@ module ZendeskAPI
104
110
  add_warning_callback
105
111
  end
106
112
 
113
+ # token impersonation for the scope of the block
114
+ # @param [String] username The username (email) of the user to impersonate
115
+ # @yield The block to run while impersonating the user
116
+ # @example
117
+ # client.api_token_impersonate("otheruser@yourcompany.com") do
118
+ # client.tickets.create(:subject => "Help!")
119
+ # end
120
+ #
121
+ # # creates a ticket on behalf of otheruser
122
+ # @return
123
+ # yielded value
124
+ def api_token_impersonate(username)
125
+ avant = Thread.current[:zendesk_thread_local_username]
126
+ Thread.current[:zendesk_thread_local_username] = username
127
+ yield
128
+ ensure
129
+ Thread.current[:zendesk_thread_local_username] = avant
130
+ end
131
+
107
132
  # Creates a connection if there is none, otherwise returns the existing connection.
108
133
  #
109
134
  # @return [Faraday::Connection] Faraday connection for the client
@@ -131,6 +156,11 @@ module ZendeskAPI
131
156
  end
132
157
  end
133
158
 
159
+ def refresh_custom_fields_metadata
160
+ account_data[:custom_fields] ||= {}
161
+ ticket_fields.each { |field| account_data[:custom_fields][field.title] = field.id }
162
+ end
163
+
134
164
  protected
135
165
 
136
166
  # Called by {#connection} to build a connection. Can be overwritten in a
@@ -146,6 +176,7 @@ module ZendeskAPI
146
176
  Faraday.new(config.options) do |builder|
147
177
  # response
148
178
  builder.use ZendeskAPI::Middleware::Response::RaiseError
179
+ builder.use ZendeskAPI::Middleware::Response::ZendeskRequestEvent, instrumentation: config.instrumentation, logger: config.logger if config.instrumentation
149
180
  builder.use ZendeskAPI::Middleware::Response::Callback, self
150
181
  builder.use ZendeskAPI::Middleware::Response::Logger, config.logger if config.logger
151
182
  builder.use ZendeskAPI::Middleware::Response::ParseIsoDates
@@ -161,7 +192,7 @@ module ZendeskAPI
161
192
  set_authentication(builder, config)
162
193
 
163
194
  if config.cache
164
- builder.use ZendeskAPI::Middleware::Request::EtagCache, :cache => config.cache
195
+ builder.use ZendeskAPI::Middleware::Request::EtagCache, cache: config.cache, instrumentation: config.instrumentation
165
196
  end
166
197
 
167
198
  builder.use ZendeskAPI::Middleware::Request::Upload
@@ -171,31 +202,41 @@ module ZendeskAPI
171
202
  # Should always be first in the stack
172
203
  if config.retry
173
204
  builder.use ZendeskAPI::Middleware::Request::Retry,
174
- :logger => config.logger,
175
- :retry_codes => config.retry_codes,
176
- :retry_on_exception => config.retry_on_exception
205
+ logger: config.logger,
206
+ retry_codes: config.retry_codes,
207
+ retry_on_exception: config.retry_on_exception,
208
+ instrumentation: config.instrumentation
177
209
  end
178
210
  if config.raise_error_when_rate_limited
179
- builder.use ZendeskAPI::Middleware::Request::RaiseRateLimited, :logger => config.logger
211
+ builder.use ZendeskAPI::Middleware::Request::RaiseRateLimited, logger: config.logger
180
212
  end
181
213
 
182
214
  builder.adapter(*adapter, &config.adapter_proc)
215
+ builder.use ZendeskAPI::Middleware::Request::ApiTokenImpersonate
183
216
  end
184
217
  end
185
218
 
186
219
  private
187
220
 
188
221
  def resource_class_for(method)
189
- resource_name = ZendeskAPI::Helpers.modulize_string(Inflection.singular(method.to_s.gsub(/\W/, '')))
222
+ resource_name = ZendeskAPI::Helpers.modulize_string(Inflection.singular(method.to_s.gsub(/\W/, "")))
190
223
  ZendeskAPI::Association.class_from_namespace(resource_name)
191
224
  end
192
225
 
193
226
  def check_url
194
- if !config.allow_http && !config.url.start_with?('https://')
227
+ if !config.allow_http && !config.url.start_with?("https://")
195
228
  raise ArgumentError, "zendesk_api is ssl only; url must begin with https://"
196
229
  end
197
230
  end
198
231
 
232
+ def check_instrumentation
233
+ return unless config.instrumentation
234
+
235
+ unless config.instrumentation.respond_to?(:instrument)
236
+ raise ArgumentError, "instrumentation must respond to #instrument"
237
+ end
238
+ end
239
+
199
240
  def set_raise_error_when_rated_limited
200
241
  config.raise_error_when_rate_limited = if config.retry
201
242
  false
@@ -217,17 +258,17 @@ module ZendeskAPI
217
258
 
218
259
  def set_default_logger
219
260
  if config.logger.nil? || config.logger == true
220
- require 'logger'
261
+ require "logger"
221
262
  config.logger = Logger.new($stderr)
222
263
  config.logger.level = Logger::WARN
223
264
  end
224
265
  end
225
266
 
226
267
  def add_warning_callback
227
- return unless logger = config.logger
268
+ return unless (logger = config.logger)
228
269
 
229
270
  insert_callback do |env|
230
- if warning = env[:response_headers]["X-Zendesk-API-Warn"]
271
+ if (warning = env[:response_headers]["X-Zendesk-API-Warn"])
231
272
  logger.warn "WARNING: #{warning}"
232
273
  end
233
274
  end