class Workarea::Api::DocumentationTest
Constants
- IGNORED_HEADERS
Public Class Methods
build_index(engine)
click to toggle source
# File lib/workarea/api/documentation_test.rb, line 76 def build_index(engine) results = { 'resources' => [] } root = docs_root.join(engine) FileUtils.mkdir_p(root) begin FileUtils.rm(root.join('index.json')) rescue nil end Dir.glob(root.join('**/*.json')) do |file| example = JSON.parse(File.read(file)) existing_resource = results['resources'].detect do |resource| resource['name'] == example['resource'] end index_example = { 'description' => example['description'], 'link' => file.to_s.gsub("#{docs_root}/", ''), 'groups' => 'all', 'route' => example['route'], 'method' => example['http_method'] } if existing_resource.present? existing_resource['examples'] << index_example else results['resources'] << { 'name' => example['resource'], 'examples' => [index_example] } end end results['resources'].sort_by! { |r| r['name'] } results['resources'].each { |r| r['examples'].sort_by! { |e| e['description'] } } File.open(root.join('index.json'), 'w') do |file| file.write(JSON.pretty_generate(results)) end end
docs_dir()
click to toggle source
# File lib/workarea/api/documentation_test.rb, line 68 def docs_dir docs_root.join(engine, resource.systemize) end
docs_root()
click to toggle source
# File lib/workarea/api/documentation_test.rb, line 56 def docs_root @docs_root ||= if running_in_gem? Workarea::Api.root.join('doc', 'api') else Rails.root.join('doc', 'api') end end
engine()
click to toggle source
# File lib/workarea/api/documentation_test.rb, line 72 def engine name.split('::')[-2].downcase end
resource(val = nil)
click to toggle source
# File lib/workarea/api/documentation_test.rb, line 52 def resource(val = nil) @resource = val || @resource end
running_in_gem?()
click to toggle source
# File lib/workarea/api/documentation_test.rb, line 64 def running_in_gem? Rails.root.to_s.include?('test/dummy') end
Public Instance Methods
method_missing(method_name, *args, &block)
click to toggle source
Calls superclass method
# File lib/workarea/api/documentation_test.rb, line 128 def method_missing(method_name, *args, &block) if @example.respond_to?("#{method_name}=") @example.send("#{method_name}=", *args) else super end end
parameter(name, description)
click to toggle source
# File lib/workarea/api/documentation_test.rb, line 124 def parameter(name, description) @example.parameters << { name: name, description: description } end
record_request() { || ... }
click to toggle source
# File lib/workarea/api/documentation_test.rb, line 140 def record_request yield @example.http_method = request.method.upcase if @example.http_method.blank? headers = env_to_headers(request.env) request_body = read_request_body doc_request = Request.new doc_request.request_method = request.method doc_request.request_path = request.fullpath doc_request.request_body = request_body.empty? ? nil : request_body.force_encoding('UTF-8') doc_request.request_headers = headers doc_request.request_query_parameters = request.query_parameters doc_request.request_content_type = headers['Content-Type'] doc_request.response_status = response.status doc_request.response_status_text = response.message doc_request.response_body = formatted_response_body doc_request.response_headers = filtered_response_headers doc_request.response_content_type = response.content_type curl = Curl.new(request.method, request.fullpath, request_body, headers) doc_request.curl = curl.output("https://#{Workarea.config.host}") @example.requests << doc_request end
respond_to?(method_name, include_private = false)
click to toggle source
Calls superclass method
# File lib/workarea/api/documentation_test.rb, line 136 def respond_to?(method_name, include_private = false) @example.respond_to?("#{method_name}=") || super end
Private Instance Methods
env_to_headers(env)
click to toggle source
# File lib/workarea/api/documentation_test.rb, line 204 def env_to_headers(env) headers = {} env.each do |key, value| if key =~ /^(HTTP_|CONTENT_TYPE)/ header = key.gsub(/^HTTP_/, '').split('_').map { |s| s.titleize }.join('-') if value.present? && !IGNORED_HEADERS.include?(header) headers[header] = value end end end headers end
filtered_response_headers()
click to toggle source
# File lib/workarea/api/documentation_test.rb, line 200 def filtered_response_headers response.headers.except(*Workarea.config.suppress_api_response_headers) end
formatted_response_body()
click to toggle source
# File lib/workarea/api/documentation_test.rb, line 188 def formatted_response_body return nil if response.body.empty? if response.body.encoding == Encoding::ASCII_8BIT '[binary data]' elsif response.content_type =~ %r{application/json} JSON.pretty_generate(JSON.parse(response.body)) else response.body end end
read_request_body()
click to toggle source
# File lib/workarea/api/documentation_test.rb, line 182 def read_request_body input = request.env['rack.input'] input.rewind input.read end
save_example()
click to toggle source
# File lib/workarea/api/documentation_test.rb, line 173 def save_example if passed? && ENV['GENERATE_API_DOCS'] FileUtils.mkdir_p(self.class.docs_dir) File.open(self.class.docs_dir.join(@example.file_name), 'w') do |file| file.write(JSON.pretty_generate(JSON.parse(@example.to_json))) end end end
setup_example()
click to toggle source
# File lib/workarea/api/documentation_test.rb, line 168 def setup_example @example = Example.new @example.resource = self.class.resource end