Class: RSpec::Apidoc
- Inherits:
- 
      Core::Formatters::BaseFormatter
      
        - Object
- Core::Formatters::BaseFormatter
- RSpec::Apidoc
 
- Includes:
- ERB::Util
- Defined in:
- lib/rspec/apidoc.rb
Overview
Our formatter class.
We’re using the formatter as the hooks do not allow to report when the test runner is done.
Class Method Summary collapse
- 
  
    
      .add(spec, example)  ⇒ Hash 
    
    
  
  
  
  
  
  
  
  
  
    Parses and stores relevant to our docs data in the example metadata. 
- 
  
    
      .auth_header(headers)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    Returns the API authentication header callback result. 
- 
  
    
      .parse_json_safely(obj)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    Returns a parsed JSON object. 
Instance Method Summary collapse
- 
  
    
      #close(_notification)  ⇒ Integer 
    
    
  
  
  
  
  
  
  
  
  
    Formatter callback, generates the HTML from the metadata we stored. 
- 
  
    
      #description  ⇒ String 
    
    
  
  
  
  
  
  
  
  
  
    Returns the description for our docs. 
- 
  
    
      #example_passed(notification)  ⇒ Hash 
    
    
  
  
  
  
  
  
  
  
  
    Formatter callback, stores the example metadata for later to be used. 
- 
  
    
      #examples  ⇒ Array 
    
    
  
  
  
  
  
  
  
  
  
    Returns the collected examples, sorted. 
- 
  
    
      #host  ⇒ String 
    
    
  
  
  
  
  
  
  
  
  
    Returns the API host used to generate the ‘curl` commands. 
- 
  
    
      #output_filename  ⇒ String 
    
    
  
  
  
  
  
  
  
  
  
    Returns the final document path for our docs. 
- 
  
    
      #template_path  ⇒ String 
    
    
  
  
  
  
  
  
  
  
  
    Returns the template path used to render our docs. 
- 
  
    
      #title  ⇒ String 
    
    
  
  
  
  
  
  
  
  
  
    Returns the title for our docs. 
Class Method Details
.add(spec, example) ⇒ Hash
Parses and stores relevant to our docs data in the example metadata
rubocop:disable Metrics/AbcSize,Metrics/MethodLength
| 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 | # File 'lib/rspec/apidoc.rb', line 89 def self.add(spec, example) request_body = parse_json_safely(spec.request.body.string) response_body = parse_json_safely(spec.response.body) if spec.request.controller_instance action_name = spec.request.controller_instance.action_name action_method = spec.request.controller_instance.method(action_name) # Remove any `@param` or `@return` lines action_comment = action_method.comment .gsub(/^#(\s+)?$/, "\n").gsub(/^#(\s+)?/, '').gsub(/^@.*$/, '') controller_class = spec.request.controller_class controller_comment = nil if action_method.respond_to?(:class_comment) controller_comment = action_method.class_comment.gsub( /.*frozen_string_literal:.*/, '' ).gsub(/^#(\s+)?$/, "\n").gsub(/^#(\s+)?/, '').gsub(/^@.*$/, '') end else action_comment = nil controller_comment = nil controller_class = spec.request.path action_name = spec.request.method end example.[:apidoc_data] = { description: example.[:full_description], controller_class: controller_class, controller_comment: controller_comment, action_name: action_name, action_comment: action_comment, content_type: spec.request.content_type, auth_header: auth_header(spec.request.headers), method: spec.request.method, path: spec.request.path, query: spec.request.query_parameters.to_param, request_body: request_body, status: spec.response.status, response_content_type: spec.response.content_type, response_body: response_body } end | 
.auth_header(headers) ⇒ Object
Returns the API authentication header callback result
| 73 74 75 | # File 'lib/rspec/apidoc.rb', line 73 def self.auth_header(headers) RSpec.configuration.apidoc_auth_header.call(headers) end | 
.parse_json_safely(obj) ⇒ Object
Returns a parsed JSON object
| 140 141 142 143 144 | # File 'lib/rspec/apidoc.rb', line 140 def self.parse_json_safely(obj) JSON.parse(obj) rescue StandardError obj.to_s end | 
Instance Method Details
#close(_notification) ⇒ Integer
Formatter callback, generates the HTML from the metadata we stored
| 163 164 165 166 167 168 | # File 'lib/rspec/apidoc.rb', line 163 def close(_notification) return if examples.empty? erb = ERB.new(File.read(template_path), trim_mode: '-') File.write(output_filename, erb.result(self.binding)) end | 
#description ⇒ String
Returns the description for our docs
| 44 45 46 | # File 'lib/rspec/apidoc.rb', line 44 def description RSpec.configuration.apidoc_description end | 
#example_passed(notification) ⇒ Hash
Formatter callback, stores the example metadata for later to be used
| 149 150 151 152 153 154 155 156 157 158 | # File 'lib/rspec/apidoc.rb', line 149 def example_passed(notification) apidoc_data = notification.example.[:apidoc_data] return if apidoc_data.nil? controller_name = apidoc_data[:controller_class].to_s controller_examples = examples[controller_name] ||= {} controller_examples[apidoc_data[:action_name]] ||= [] controller_examples[apidoc_data[:action_name]].append(apidoc_data) end | 
#examples ⇒ Array
Returns the collected examples, sorted
| 80 81 82 83 | # File 'lib/rspec/apidoc.rb', line 80 def examples @examples ||= {} @examples = @examples.sort.to_h end | 
#host ⇒ String
Returns the API host used to generate the ‘curl` commands
| 65 66 67 | # File 'lib/rspec/apidoc.rb', line 65 def host RSpec.configuration.apidoc_host end | 
#output_filename ⇒ String
Returns the final document path for our docs
| 58 59 60 | # File 'lib/rspec/apidoc.rb', line 58 def output_filename RSpec.configuration.apidoc_output_filename end | 
#template_path ⇒ String
Returns the template path used to render our docs
| 51 52 53 | # File 'lib/rspec/apidoc.rb', line 51 def template_path RSpec.configuration.apidoc_template_path end | 
#title ⇒ String
Returns the title for our docs
| 37 38 39 | # File 'lib/rspec/apidoc.rb', line 37 def title RSpec.configuration.apidoc_title end |