yext-api 0.1.1 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (54) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +3 -1
  3. data/Gemfile.lock +16 -8
  4. data/PULL_REQUEST_TEMPLATE.md +11 -0
  5. data/README.md +25 -7
  6. data/app/controllers/yext/api/agreements/add_request_controller.rb +78 -0
  7. data/app/controllers/yext/api/application_controller.rb +1 -3
  8. data/config/initializers/memoist.rb +3 -0
  9. data/config/routes.rb +3 -0
  10. data/lib/config/api.yml +95 -230
  11. data/lib/yext/api/administrative_api/account.rb +37 -27
  12. data/lib/yext/api/administrative_api/add_request.rb +87 -3
  13. data/lib/yext/api/administrative_api/service.rb +26 -4
  14. data/lib/yext/api/concerns/account_child.rb +37 -8
  15. data/lib/yext/api/concerns/account_relations.rb +16 -1
  16. data/lib/yext/api/concerns/default_scopes.rb +8 -2
  17. data/lib/yext/api/concerns/faraday_connection.rb +21 -7
  18. data/lib/yext/api/concerns/rate_limits.rb +8 -1
  19. data/lib/yext/api/enumerations/add_request_status.rb +19 -0
  20. data/lib/yext/api/enumerations/location_type.rb +18 -0
  21. data/lib/yext/api/knowledge_api/account_settings/account.rb +0 -2
  22. data/lib/yext/api/knowledge_api/account_settings/role.rb +24 -0
  23. data/lib/yext/api/knowledge_api/account_settings/user.rb +81 -0
  24. data/lib/yext/api/knowledge_api/health_check/health.rb +0 -1
  25. data/lib/yext/api/knowledge_api/knowledge_manager/category.rb +0 -1
  26. data/lib/yext/api/knowledge_api/knowledge_manager/location.rb +18 -6
  27. data/lib/yext/api/live_api/location.rb +0 -4
  28. data/lib/yext/api/utils/api_base.rb +8 -0
  29. data/lib/yext/api/utils/api_finder.rb +100 -0
  30. data/lib/yext/api/utils/configuration.rb +93 -0
  31. data/lib/yext/api/utils/middleware/api_rate_limits.rb +35 -0
  32. data/lib/yext/api/utils/middleware/default_parameters.rb +138 -0
  33. data/lib/yext/api/utils/middleware/response_parser.rb +111 -0
  34. data/lib/yext/api/utils/middleware/uri_cleanup.rb +48 -0
  35. data/lib/yext/api/utils/params.rb +69 -0
  36. data/lib/yext/api/version.rb +1 -1
  37. data/yext-api.gemspec +6 -7
  38. metadata +56 -31
  39. data/.travis.yml +0 -5
  40. data/app/assets/config/yext_api_manifest.js +0 -2
  41. data/app/assets/images/yext/api/.keep +0 -0
  42. data/app/assets/javascripts/yext/api/application.js +0 -13
  43. data/app/assets/stylesheets/yext/api/application.css +0 -15
  44. data/app/docs/notes.txt +0 -45
  45. data/app/helpers/yext/api/application_helper.rb +0 -11
  46. data/app/jobs/yext/api/application_job.rb +0 -8
  47. data/app/mailers/yext/api/application_mailer.rb +0 -11
  48. data/app/models/yext/api/application_record.rb +0 -10
  49. data/app/views/layouts/yext/api/application.html.erb +0 -14
  50. data/lib/tasks/yext/api_tasks.rake +0 -6
  51. data/lib/yext/api/concerns/api_finder.rb +0 -61
  52. data/lib/yext/api/utils/api_rate_limits.rb +0 -36
  53. data/lib/yext/api/utils/default_parameters.rb +0 -57
  54. data/lib/yext/api/utils/response_parser.rb +0 -84
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Yext
4
+ module Api
5
+ module Utils
6
+ module Middleware
7
+ # Faraday Middleware for extracting API limits from call responses.
8
+ class ApiRateLimits < Faraday::Response::Middleware
9
+ def call(env)
10
+ @app.call(env).on_complete do |environment|
11
+ save_rates(environment, Yext::Api::Utils::ApiFinder.new(env[:url], env[:method]).find_api)
12
+
13
+ env.response
14
+ end
15
+ end
16
+
17
+ private
18
+
19
+ def save_rates(environment, api_module)
20
+ return if api_module.blank?
21
+
22
+ response_headers = environment[:response_headers]
23
+
24
+ return unless response_headers.key?("rate-limit-remaining")
25
+
26
+ api_module.send(:update_rates,
27
+ remaining: response_headers["rate-limit-remaining"].to_i,
28
+ limit: response_headers["rate-limit-limit"].to_i,
29
+ reset_at: Time.at(response_headers["rate-limit-reset"].to_i))
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,138 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Yext
4
+ module Api
5
+ module Utils
6
+ module Middleware
7
+ # Faraday Middleware for adding Configuration default values to API calls as needed.
8
+ #
9
+ # Most options can be set via scopes and the soped values will be kept if they are used.
10
+ # i.e. the existing query string values will be kept if they exist.
11
+ #
12
+ # Because Spyke puts `where` options into the body OR the query depending on the type of
13
+ # request being made, we have to move the Yext query options out of the body into the query
14
+ # if there is a body.
15
+ #
16
+ # The following configuration options are defaulted:
17
+ # validation_level: Added to query parameters if not already there and is not nil
18
+ # api_key: Added to query parameters if not already there
19
+ # api_version: Added to qeury parameters if not already there
20
+ # account_id: Inserted into the path if the path includes the Account default URI and no
21
+ # account_id was specified.
22
+ #
23
+ # The following values will be moved out of the body into the query string if they are found:
24
+ # account_id * Not used if in body. If set it will already be in the path.
25
+ # v
26
+ # api_key
27
+ # validation
28
+ # yext_username
29
+ # yext_user_id
30
+ class DefaultParameters < Faraday::Response::Middleware
31
+ extend Memoist
32
+
33
+ attr_reader :configuration,
34
+ :url,
35
+ :params,
36
+ :body_json,
37
+ :request_env
38
+
39
+ def call(call_env)
40
+ get_attribute_values(call_env)
41
+
42
+ body_json.delete(:account_id)
43
+ add_username_headers
44
+ add_default_query_params
45
+ save_query_params
46
+ save_body
47
+
48
+ @app.call(request_env)
49
+ end
50
+
51
+ private
52
+
53
+ def get_attribute_values(call_env)
54
+ @request_env = call_env
55
+ @configuration = Yext::Api.configuration
56
+ @url = request_env[:url]
57
+ @params = Rack::Utils.parse_nested_query(url.query).with_indifferent_access
58
+ @body_json = parse_body
59
+ end
60
+
61
+ def parse_body
62
+ if request_env.body.present?
63
+ JSON.parse(request_env.body, symbolize_names: true)
64
+ else
65
+ {}
66
+ end
67
+ end
68
+
69
+ def add_default_query_params
70
+ params.reverse_merge!(api_key: api_key, v: version)
71
+
72
+ params[:validation] ||= validation if validation.present?
73
+ end
74
+
75
+ def validation
76
+ return body_json.delete(:validation) if body_json.key?(:validation)
77
+
78
+ configuration.validation_level if configuration.validation_level.present?
79
+ end
80
+
81
+ def version
82
+ body_json.delete(:v) || configuration.api_version || "20161012"
83
+ end
84
+
85
+ def api_key
86
+ body_json.delete(:api_key) || configuration.api_key
87
+ end
88
+
89
+ def save_query_params
90
+ url.query = params.to_query
91
+ end
92
+
93
+ def save_body
94
+ extract_rooted_body
95
+
96
+ return if request_env.body.blank?
97
+
98
+ body_json[:id] = body_json.delete(:create_id) if body_json.key?(:create_id)
99
+
100
+ request_env.body = body_json.to_json
101
+ end
102
+
103
+ def extract_rooted_body
104
+ return unless body_json.keys.length == 1
105
+
106
+ sub_json = body_json[body_json.keys.first]
107
+ @body_json = sub_json if sub_json.is_a?(Hash)
108
+ end
109
+
110
+ def add_username_headers
111
+ user_id, username = extract_header_values
112
+
113
+ return unless %w[put post patch delete].include?(request_env[:method].to_s)
114
+
115
+ request_headers = request_env[:request_headers]
116
+ request_headers["Yext-Username"] = username if username.present?
117
+ request_headers["Yext-User-Id"] = user_id if user_id.present?
118
+ end
119
+
120
+ def extract_header_values
121
+ username = extract_defaulted_value(:yext_username, configuration.yext_username)
122
+ user_id = extract_defaulted_value(:yext_user_id, configuration.yext_user_id)
123
+
124
+ [user_id, username]
125
+ end
126
+
127
+ def extract_defaulted_value(param_name, default_value)
128
+ params.delete(param_name) || body_json.delete(param_name) || default_value
129
+ end
130
+
131
+ memoize :validation,
132
+ :version,
133
+ :api_key
134
+ end
135
+ end
136
+ end
137
+ end
138
+ end
@@ -0,0 +1,111 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Yext
4
+ module Api
5
+ module Utils
6
+ module Middleware
7
+ # The default response parser for Faraday to get the results from Yext into the structure
8
+ # that is needed by Spyke.
9
+ class ResponseParser < Faraday::Response::Middleware
10
+ def call(env)
11
+ @parse_env = env
12
+
13
+ @app.call(env).on_complete do |environment|
14
+ @response_env = environment
15
+ on_complete(environment)
16
+ end
17
+ end
18
+
19
+ def parse(body)
20
+ # Yext Response:
21
+ # http://developer.yext.com/docs/api-reference/#section/Policies-and-Conventions
22
+ #
23
+ # Example response format:
24
+ # {
25
+ # "meta": {
26
+ # "uuid": "bb0c7e19-4dc3-4891-bfa5-8593b1f124ad",
27
+ # "errors": [
28
+ # {
29
+ # "code": ...error code...,
30
+ # "type": ...error, fatal error, non fatal error, or warning...,
31
+ # "message": ...explanation of the issue...
32
+ # }
33
+ # ]
34
+ # },
35
+ # "response": {
36
+ # ...results...
37
+ # }
38
+ # }
39
+ #
40
+ # Spyke Expected Response Format:
41
+ # https://github.com/balvig/spyke#configuration
42
+ #
43
+ # { data: { id: 1, name: 'Bob' }, metadata: {}, errors: {} }
44
+ #
45
+ # Errors:
46
+ # https://github.com/balvig/spyke#api-side-validations
47
+ #
48
+ # { title: [{ error: 'blank'}, { error: 'too_short', count: 10 }]}
49
+
50
+ if body.starts_with?("<html")
51
+ save_meta_data(parse_env, {}, response_env[:status], body: body)
52
+
53
+ return {}
54
+ end
55
+
56
+ @yext_response_json = {}
57
+
58
+ data = data_value(body)
59
+ meta_data = meta_data_value
60
+
61
+ save_meta_data(parse_env, meta_data, response_env[:status], data)
62
+
63
+ { data: data, metadata: meta_data, errors: {} }
64
+ end
65
+
66
+ private
67
+
68
+ def data_value(body)
69
+ return [{ response_string: body }] unless body.starts_with?("{")
70
+
71
+ @yext_response_json = JSON.parse(body, symbolize_names: true)
72
+
73
+ extract_data_value
74
+ end
75
+
76
+ def meta_data_value
77
+ yext_response_json[:meta]
78
+ end
79
+
80
+ def extract_data_value
81
+ data = yext_response_json[:response]
82
+
83
+ if data.is_a?(Hash) && (data.key?(:count) || data.length <= 2)
84
+ array_data = data[(data.keys - [:count]).first]
85
+ if array_data.is_a?(Array)
86
+ data = array_data
87
+ elsif data.blank?
88
+ data = nil
89
+ end
90
+ end
91
+
92
+ data
93
+ end
94
+
95
+ attr_reader :parse_env,
96
+ :yext_response_json,
97
+ :response_env
98
+
99
+ def save_meta_data(environment, metadata, status, data)
100
+ api_module = Yext::Api::Utils::ApiFinder.new(environment[:url], environment[:method]).find_api
101
+ return if api_module.blank?
102
+
103
+ api_module.send(:last_data=, data)
104
+ api_module.send(:last_status=, status)
105
+ api_module.send(:last_meta=, metadata)
106
+ end
107
+ end
108
+ end
109
+ end
110
+ end
111
+ end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Yext
4
+ module Api
5
+ module Utils
6
+ module Middleware
7
+ # Faraday Middleware for cleaning up after Spyke.
8
+ #
9
+ # I consider this a primary failing of Spyke. The use of a global "current_scope" and
10
+ # associations being stored in instance variables that are re-used in every single use
11
+ # of the association creates the potential and reality of leaks between calls because
12
+ # scopes don't represent a filter as much as they represent the class itself.
13
+ #
14
+ # Because of this and because there aren't normal hooks on the models, I had to figure out
15
+ # a way to cleanup and reset associations between calls in a reliable manner.
16
+ #
17
+ # Because we're using Faraday, I am using Faraday middleware to hook into the API call
18
+ # and after we get a response, making a call on the class associated with the call that was
19
+ # made and telling that class to clean itself up.
20
+ class UriCleanup < Faraday::Response::Middleware
21
+ def call(env)
22
+ @app.call(env).on_complete do |_environment|
23
+ reset_class_uri(env)
24
+
25
+ env.response
26
+ end
27
+ end
28
+
29
+ private
30
+
31
+ def reset_class_uri(env)
32
+ klass = Yext::Api::Utils::ApiFinder.new(env[:url], env[:method]).find_class_name
33
+
34
+ return unless klass.present?
35
+
36
+ klass = klass.constantize
37
+
38
+ klass.reset_uri if klass.respond_to?(:reset_uri)
39
+ rescue StandardError => error
40
+ return unless Object.const_defined?("Rails")
41
+
42
+ Rails.logger.error error
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,69 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Yext
4
+ module Api
5
+ module Utils
6
+ # A utility class for performing normal modifications to webhooks to convert/normalize data
7
+ # before passing it along so that the receiver doesn't have to worry/thnk about it.
8
+ class Params
9
+ attr_reader :params
10
+
11
+ def initialize(params)
12
+ @params = params
13
+ end
14
+
15
+ # Converts an integer epoch date value into a Time.
16
+ #
17
+ # The param_names is a list of nodes which ends with a leaf node that is the epoch value
18
+ # to be converted to a Time.
19
+ #
20
+ # If any node along the way cannot be found, the function exits without errors or changing any values.
21
+ def convert_epoch(*param_names)
22
+ return unless param_names.present?
23
+
24
+ param_name = param_names[-1]
25
+ param_level = find_value(*param_names)
26
+
27
+ return unless param_level.present?
28
+
29
+ param_level[param_name] = Time.at(param_level[param_name].to_i / 1_000.0)
30
+ end
31
+
32
+ # Converts time string into a Time.
33
+ #
34
+ # The param_names is a list of nodes which ends with a leaf node that is the time string
35
+ # to be converted to a Time.
36
+ #
37
+ # If any node along the way cannot be found, the function exits without errors or changing any values.
38
+ def convert_time(*param_names)
39
+ return unless param_names.present?
40
+
41
+ param_name = param_names[-1]
42
+ param_level = find_value(*param_names)
43
+
44
+ return unless param_level.present?
45
+
46
+ param_level[param_name] = param_level[param_name].to_time(:utc)
47
+ end
48
+
49
+ private
50
+
51
+ def find_value(*param_names)
52
+ param_level = params
53
+ found_param = param_names[0..-2].each do |param_name|
54
+ break unless param_level.key?(param_name)
55
+
56
+ param_level = param_level[param_name]
57
+ end
58
+
59
+ return if found_param.nil?
60
+
61
+ param_name = param_names[-1]
62
+ return unless param_level.key?(param_name) && param_level[param_name].present?
63
+
64
+ param_level
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Yext
4
4
  module Api
5
- VERSION = "0.1.1"
5
+ VERSION = "0.1.3"
6
6
  end
7
7
  end
@@ -28,19 +28,18 @@ Gem::Specification.new do |spec|
28
28
  end
29
29
 
30
30
  spec.bindir = "exe"
31
- spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
32
31
  spec.require_paths = ["lib"]
33
32
 
34
- spec.add_dependency "rails", "~> 5.1.2"
33
+ spec.add_dependency "memoist", "~> 0"
34
+ spec.add_dependency "rails", "> 4"
35
35
  spec.add_dependency "spyke", "~> 5"
36
36
 
37
- spec.add_development_dependency "bundler", "~> 1.16"
37
+ spec.add_development_dependency "bundler"
38
+ spec.add_development_dependency "codecov"
38
39
  spec.add_development_dependency "cornucopia"
39
- # spec.add_development_dependency "dotenv", "~> 2.0"
40
- # spec.add_development_dependency "dotenv-rails"
41
40
  spec.add_development_dependency "hashie"
42
- spec.add_development_dependency "rake", "~> 10.0"
43
- spec.add_development_dependency "rspec", "~> 3.0"
41
+ spec.add_development_dependency "rake", "~> 10"
42
+ spec.add_development_dependency "rspec"
44
43
  spec.add_development_dependency "rspec-rails"
45
44
  spec.add_development_dependency "simplecov"
46
45
  spec.add_development_dependency "simplecov-rcov"
metadata CHANGED
@@ -1,29 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: yext-api
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - CardTapp
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-01-24 00:00:00.000000000 Z
11
+ date: 2018-02-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: rails
14
+ name: memoist
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 5.1.2
19
+ version: '0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 5.1.2
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rails
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">"
32
+ - !ruby/object:Gem::Version
33
+ version: '4'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">"
39
+ - !ruby/object:Gem::Version
40
+ version: '4'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: spyke
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -42,16 +56,30 @@ dependencies:
42
56
  name: bundler
43
57
  requirement: !ruby/object:Gem::Requirement
44
58
  requirements:
45
- - - "~>"
59
+ - - ">="
46
60
  - !ruby/object:Gem::Version
47
- version: '1.16'
61
+ version: '0'
48
62
  type: :development
49
63
  prerelease: false
50
64
  version_requirements: !ruby/object:Gem::Requirement
51
65
  requirements:
52
- - - "~>"
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: codecov
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
53
74
  - !ruby/object:Gem::Version
54
- version: '1.16'
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
55
83
  - !ruby/object:Gem::Dependency
56
84
  name: cornucopia
57
85
  requirement: !ruby/object:Gem::Requirement
@@ -86,28 +114,28 @@ dependencies:
86
114
  requirements:
87
115
  - - "~>"
88
116
  - !ruby/object:Gem::Version
89
- version: '10.0'
117
+ version: '10'
90
118
  type: :development
91
119
  prerelease: false
92
120
  version_requirements: !ruby/object:Gem::Requirement
93
121
  requirements:
94
122
  - - "~>"
95
123
  - !ruby/object:Gem::Version
96
- version: '10.0'
124
+ version: '10'
97
125
  - !ruby/object:Gem::Dependency
98
126
  name: rspec
99
127
  requirement: !ruby/object:Gem::Requirement
100
128
  requirements:
101
- - - "~>"
129
+ - - ">="
102
130
  - !ruby/object:Gem::Version
103
- version: '3.0'
131
+ version: '0'
104
132
  type: :development
105
133
  prerelease: false
106
134
  version_requirements: !ruby/object:Gem::Requirement
107
135
  requirements:
108
- - - "~>"
136
+ - - ">="
109
137
  - !ruby/object:Gem::Version
110
- version: '3.0'
138
+ version: '0'
111
139
  - !ruby/object:Gem::Dependency
112
140
  name: rspec-rails
113
141
  requirement: !ruby/object:Gem::Requirement
@@ -189,31 +217,22 @@ files:
189
217
  - ".rspec"
190
218
  - ".rubocop.yml"
191
219
  - ".ruby-version"
192
- - ".travis.yml"
193
220
  - CODE_OF_CONDUCT.md
194
221
  - Gemfile
195
222
  - Gemfile.lock
196
223
  - LICENSE.txt
224
+ - PULL_REQUEST_TEMPLATE.md
197
225
  - README.md
198
226
  - Rakefile
199
- - app/assets/config/yext_api_manifest.js
200
- - app/assets/images/yext/api/.keep
201
- - app/assets/javascripts/yext/api/application.js
202
- - app/assets/stylesheets/yext/api/application.css
227
+ - app/controllers/yext/api/agreements/add_request_controller.rb
203
228
  - app/controllers/yext/api/application_controller.rb
204
- - app/docs/notes.txt
205
- - app/helpers/yext/api/application_helper.rb
206
- - app/jobs/yext/api/application_job.rb
207
- - app/mailers/yext/api/application_mailer.rb
208
- - app/models/yext/api/application_record.rb
209
- - app/views/layouts/yext/api/application.html.erb
210
229
  - bin/console
211
230
  - bin/rails
212
231
  - bin/setup
232
+ - config/initializers/memoist.rb
213
233
  - config/initializers/spyke.rb
214
234
  - config/routes.rb
215
235
  - lib/config/api.yml
216
- - lib/tasks/yext/api_tasks.rake
217
236
  - lib/yext/api.rb
218
237
  - lib/yext/api/administrative_api.rb
219
238
  - lib/yext/api/administrative_api/account.rb
@@ -221,25 +240,31 @@ files:
221
240
  - lib/yext/api/administrative_api/service.rb
222
241
  - lib/yext/api/concerns/account_child.rb
223
242
  - lib/yext/api/concerns/account_relations.rb
224
- - lib/yext/api/concerns/api_finder.rb
225
243
  - lib/yext/api/concerns/default_scopes.rb
226
244
  - lib/yext/api/concerns/enum_all.rb
227
245
  - lib/yext/api/concerns/faraday_connection.rb
228
246
  - lib/yext/api/concerns/rate_limits.rb
229
247
  - lib/yext/api/engine.rb
248
+ - lib/yext/api/enumerations/add_request_status.rb
249
+ - lib/yext/api/enumerations/location_type.rb
230
250
  - lib/yext/api/enumerations/validation.rb
231
251
  - lib/yext/api/knowledge_api.rb
232
252
  - lib/yext/api/knowledge_api/account_settings/account.rb
253
+ - lib/yext/api/knowledge_api/account_settings/role.rb
254
+ - lib/yext/api/knowledge_api/account_settings/user.rb
233
255
  - lib/yext/api/knowledge_api/health_check/health.rb
234
256
  - lib/yext/api/knowledge_api/knowledge_manager/category.rb
235
257
  - lib/yext/api/knowledge_api/knowledge_manager/location.rb
236
258
  - lib/yext/api/live_api.rb
237
259
  - lib/yext/api/live_api/location.rb
238
260
  - lib/yext/api/utils/api_base.rb
239
- - lib/yext/api/utils/api_rate_limits.rb
261
+ - lib/yext/api/utils/api_finder.rb
240
262
  - lib/yext/api/utils/configuration.rb
241
- - lib/yext/api/utils/default_parameters.rb
242
- - lib/yext/api/utils/response_parser.rb
263
+ - lib/yext/api/utils/middleware/api_rate_limits.rb
264
+ - lib/yext/api/utils/middleware/default_parameters.rb
265
+ - lib/yext/api/utils/middleware/response_parser.rb
266
+ - lib/yext/api/utils/middleware/uri_cleanup.rb
267
+ - lib/yext/api/utils/params.rb
243
268
  - lib/yext/api/version.rb
244
269
  - lib/yext/include_rails.rb
245
270
  - yext-api.gemspec