yext-api 0.1.1 → 0.1.3

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 (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