rspec_api_documentation 2.0.0 → 3.0.0

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 (27) hide show
  1. checksums.yaml +7 -0
  2. data/lib/rspec_api_documentation.rb +3 -1
  3. data/lib/rspec_api_documentation/api_documentation.rb +2 -3
  4. data/lib/rspec_api_documentation/client_base.rb +4 -0
  5. data/lib/rspec_api_documentation/configuration.rb +3 -0
  6. data/lib/rspec_api_documentation/curl.rb +35 -10
  7. data/lib/rspec_api_documentation/dsl/resource.rb +5 -1
  8. data/lib/rspec_api_documentation/example.rb +19 -1
  9. data/lib/rspec_api_documentation/oauth2_mac_client.rb +10 -2
  10. data/lib/rspec_api_documentation/rack_test_client.rb +23 -0
  11. data/lib/rspec_api_documentation/views/html_index.rb +1 -1
  12. data/lib/rspec_api_documentation/views/markup_example.rb +9 -6
  13. data/lib/rspec_api_documentation/views/markup_index.rb +2 -2
  14. data/lib/rspec_api_documentation/views/textile_index.rb +1 -1
  15. data/lib/rspec_api_documentation/writers/append_json_writer.rb +49 -0
  16. data/lib/rspec_api_documentation/writers/combined_json_writer.rb +1 -1
  17. data/lib/rspec_api_documentation/writers/combined_text_writer.rb +1 -1
  18. data/lib/rspec_api_documentation/writers/general_markup_writer.rb +1 -13
  19. data/lib/rspec_api_documentation/writers/html_writer.rb +0 -2
  20. data/lib/rspec_api_documentation/writers/{index_writer.rb → index_helper.rb} +1 -1
  21. data/lib/rspec_api_documentation/writers/json_iodocs_writer.rb +4 -10
  22. data/lib/rspec_api_documentation/writers/json_writer.rb +24 -24
  23. data/lib/rspec_api_documentation/writers/textile_writer.rb +0 -2
  24. data/lib/rspec_api_documentation/writers/writer.rb +25 -0
  25. data/lib/tasks/docs.rake +6 -0
  26. data/templates/rspec_api_documentation/html_example.mustache +7 -2
  27. metadata +50 -76
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 7cbc2ff27b6b9f2442e946657e47fc88c2c3e6ee
4
+ data.tar.gz: a8f1639743ba2ecfed6c625231ecc3506c025d25
5
+ SHA512:
6
+ metadata.gz: f84d994ca272c1802358f4aa89d0549af42fa03f8fc8abc840e229ac1f74d828cd9758bb8d5e541b6314f75cefe6639390ad2b979ea889469178a040be70c50e
7
+ data.tar.gz: d3f198afe1676a8abbadf41dfa8de83192128bed0dd293691cfeeded33766b7a0e08fff1fa2188a164c85da86cd218924bc27591e9206048c764c4508f508100
@@ -28,12 +28,14 @@ module RspecApiDocumentation
28
28
  module Writers
29
29
  extend ActiveSupport::Autoload
30
30
 
31
+ autoload :Writer
31
32
  autoload :GeneralMarkupWriter
32
33
  autoload :HtmlWriter
33
34
  autoload :TextileWriter
34
35
  autoload :JsonWriter
36
+ autoload :AppendJsonWriter
35
37
  autoload :JsonIodocsWriter
36
- autoload :IndexWriter
38
+ autoload :IndexHelper
37
39
  autoload :CombinedTextWriter
38
40
  autoload :CombinedJsonWriter
39
41
  end
@@ -10,10 +10,9 @@ module RspecApiDocumentation
10
10
  end
11
11
 
12
12
  def clear_docs
13
- if File.exists?(docs_dir)
14
- FileUtils.rm_rf(docs_dir, :secure => true)
13
+ writers.each do |writer|
14
+ writer.clear_docs(docs_dir)
15
15
  end
16
- FileUtils.mkdir_p(docs_dir)
17
16
  end
18
17
 
19
18
  def document_example(rspec_example)
@@ -49,6 +49,10 @@ module RspecApiDocumentation
49
49
 
50
50
  request_metadata = {}
51
51
 
52
+ if request_content_type =~ /multipart\/form-data/ && respond_to?(:handle_multipart_body, true)
53
+ request_body = handle_multipart_body(request_headers, request_body)
54
+ end
55
+
52
56
  request_metadata[:request_method] = method
53
57
  request_metadata[:request_path] = path
54
58
  request_metadata[:request_body] = request_body.empty? ? nil : request_body
@@ -54,10 +54,13 @@ module RspecApiDocumentation
54
54
  end
55
55
  }
56
56
 
57
+ add_setting :curl_headers_to_filter, :default => nil
57
58
  add_setting :curl_host, :default => nil
58
59
  add_setting :keep_source_order, :default => false
59
60
  add_setting :api_name, :default => "API Documentation"
60
61
  add_setting :io_docs_protocol, :default => "http"
62
+ add_setting :request_headers_to_include, :default => nil
63
+ add_setting :response_headers_to_include, :default => nil
61
64
 
62
65
  def client_method=(new_client_method)
63
66
  RspecApiDocumentation::DSL::Resource.module_eval <<-RUBY
@@ -1,11 +1,13 @@
1
1
  require 'active_support/core_ext/object/to_query'
2
+ require 'base64'
2
3
 
3
4
  module RspecApiDocumentation
4
5
  class Curl < Struct.new(:method, :path, :data, :headers)
5
6
  attr_accessor :host
6
7
 
7
- def output(config_host)
8
+ def output(config_host, config_headers_to_filer = nil)
8
9
  self.host = config_host
10
+ @config_headers_to_filer = Array(config_headers_to_filer)
9
11
  send(method.downcase)
10
12
  end
11
13
 
@@ -17,6 +19,10 @@ module RspecApiDocumentation
17
19
  "curl \"#{url}#{get_data}\" -X GET #{headers}"
18
20
  end
19
21
 
22
+ def head
23
+ "curl \"#{url}#{get_data}\" -X HEAD #{headers}"
24
+ end
25
+
20
26
  def put
21
27
  "curl \"#{url}\" #{post_data} -X PUT #{headers}"
22
28
  end
@@ -25,10 +31,6 @@ module RspecApiDocumentation
25
31
  "curl \"#{url}\" #{post_data} -X DELETE #{headers}"
26
32
  end
27
33
 
28
- def head
29
- "curl \"#{url}#{get_data}\" -X HEAD #{headers}"
30
- end
31
-
32
34
  def patch
33
35
  "curl \"#{url}\" #{post_data} -X PATCH #{headers}"
34
36
  end
@@ -38,8 +40,12 @@ module RspecApiDocumentation
38
40
  end
39
41
 
40
42
  def headers
41
- super.map do |k, v|
42
- "\\\n\t-H \"#{format_header(k, v)}\""
43
+ filter_headers(super).map do |k, v|
44
+ if k =~ /authorization/i && v =~ /^Basic/
45
+ "\\\n\t-u #{format_auth_header(v)}"
46
+ else
47
+ "\\\n\t-H \"#{format_full_header(k, v)}\""
48
+ end
43
49
  end.join(" ")
44
50
  end
45
51
 
@@ -53,9 +59,28 @@ module RspecApiDocumentation
53
59
  end
54
60
 
55
61
  private
56
- def format_header(header, value)
57
- formatted_header = header.gsub(/^HTTP_/, '').titleize.split.join("-")
58
- "#{formatted_header}: #{value}"
62
+
63
+ def format_auth_header(value)
64
+ ::Base64.decode64(value.split(' ', 2).last || '')
65
+ end
66
+
67
+ def format_header(header)
68
+ header.gsub(/^HTTP_/, '').titleize.split.join("-")
69
+ end
70
+
71
+ def format_full_header(header, value)
72
+ formatted_value = value ? value.gsub(/"/, "\\\"") : ''
73
+ "#{format_header(header)}: #{formatted_value}"
74
+ end
75
+
76
+ def filter_headers(headers)
77
+ if !@config_headers_to_filer.empty?
78
+ headers.reject do |header|
79
+ @config_headers_to_filer.include?(format_header(header))
80
+ end
81
+ else
82
+ headers
83
+ end
59
84
  end
60
85
  end
61
86
  end
@@ -23,7 +23,11 @@ module RspecApiDocumentation::DSL
23
23
  define_action :patch
24
24
 
25
25
  def callback(*args, &block)
26
- require 'webmock'
26
+ begin
27
+ require 'webmock'
28
+ rescue LoadError
29
+ raise "Callbacks require webmock to be installed"
30
+ end
27
31
  self.send(:include, WebMock::API)
28
32
 
29
33
  options = if args.last.is_a?(Hash) then args.pop else {} end
@@ -43,7 +43,25 @@ module RspecApiDocumentation
43
43
  end
44
44
 
45
45
  def requests
46
- metadata[:requests] || []
46
+ filter_headers(metadata[:requests]) || []
47
+ end
48
+
49
+ private
50
+
51
+ def filter_headers(requests)
52
+ requests = remap_headers(requests, :request_headers, configuration.request_headers_to_include)
53
+ requests = remap_headers(requests, :response_headers, configuration.response_headers_to_include)
54
+ requests
55
+ end
56
+
57
+ def remap_headers(requests, key, headers_to_include)
58
+ return requests unless headers_to_include
59
+ requests.each.with_index do |request_hash, index|
60
+ next unless request_hash.key?(key)
61
+ headers = request_hash[key]
62
+ request_hash[key] = headers.select{ |key, _| headers_to_include.include?(key) }
63
+ requests[index] = request_hash
64
+ end
47
65
  end
48
66
  end
49
67
  end
@@ -3,8 +3,16 @@ begin
3
3
  rescue LoadError
4
4
  # ActiveSupport::SecureRandom not provided in activesupport >= 3.2
5
5
  end
6
- require "webmock"
7
- require "rack/oauth2"
6
+ begin
7
+ require "webmock"
8
+ rescue LoadError
9
+ raise "Webmock needs to be installed before using the OAuth2MACClient"
10
+ end
11
+ begin
12
+ require "rack/oauth2"
13
+ rescue LoadError
14
+ raise "Rack OAuth2 needs to be installed before using the OAuth2MACClient"
15
+ end
8
16
 
9
17
  module RspecApiDocumentation
10
18
  class OAuth2MACClient < ClientBase
@@ -42,8 +42,31 @@ module RspecApiDocumentation
42
42
  headers_to_env(super)
43
43
  end
44
44
 
45
+ def handle_multipart_body(request_headers, request_body)
46
+ parsed_parameters = Rack::Request.new({
47
+ "CONTENT_TYPE" => request_headers["Content-Type"],
48
+ "rack.input" => StringIO.new(request_body)
49
+ }).params
50
+
51
+ clean_out_uploaded_data(parsed_parameters,request_body)
52
+ end
53
+
45
54
  private
46
55
 
56
+ def clean_out_uploaded_data(params,request_body)
57
+ params.each do |_, value|
58
+ if value.is_a?(Hash)
59
+ if value.has_key?(:tempfile)
60
+ data = value[:tempfile].read
61
+ request_body = request_body.gsub(data, "[uploaded data]")
62
+ else
63
+ request_body = clean_out_uploaded_data(value,request_body)
64
+ end
65
+ end
66
+ end
67
+ request_body
68
+ end
69
+
47
70
  def rack_test_session
48
71
  @rack_test_session ||= Struct.new(:app) do
49
72
  begin
@@ -5,7 +5,7 @@ module RspecApiDocumentation
5
5
  super
6
6
  self.template_name = "rspec_api_documentation/html_index"
7
7
  end
8
-
8
+
9
9
  def examples
10
10
  @index.examples.map { |example| HtmlExample.new(example, @configuration) }
11
11
  end
@@ -6,9 +6,10 @@ module RspecApiDocumentation
6
6
  def initialize(example, configuration)
7
7
  @example = example
8
8
  @host = configuration.curl_host
9
+ @filter_headers = configuration.curl_headers_to_filter
9
10
  self.template_path = configuration.template_path
10
11
  end
11
-
12
+
12
13
  def method_missing(method, *args, &block)
13
14
  @example.send(method, *args, &block)
14
15
  end
@@ -18,29 +19,31 @@ module RspecApiDocumentation
18
19
  end
19
20
 
20
21
  def dirname
21
- resource_name.downcase.gsub(/\s+/, '_')
22
+ resource_name.downcase.gsub(/[^0-9a-z.\-]+/, '_')
22
23
  end
23
-
24
+
24
25
  def filename
25
26
  basename = description.downcase.gsub(/\s+/, '_').gsub(/[^a-z_]/, '')
26
27
  basename = Digest::MD5.new.update(description).to_s if basename.blank?
27
28
  "#{basename}.#{extension}"
28
29
  end
29
-
30
+
30
31
  def requests
31
32
  super.map do |hash|
32
33
  hash[:request_headers_text] = format_hash(hash[:request_headers])
33
34
  hash[:request_query_parameters_text] = format_hash(hash[:request_query_parameters])
34
35
  hash[:response_headers_text] = format_hash(hash[:response_headers])
35
36
  if @host
36
- hash[:curl] = hash[:curl].output(@host) if hash[:curl].is_a? RspecApiDocumentation::Curl
37
+ if hash[:curl].is_a? RspecApiDocumentation::Curl
38
+ hash[:curl] = hash[:curl].output(@host, @filter_headers)
39
+ end
37
40
  else
38
41
  hash[:curl] = nil
39
42
  end
40
43
  hash
41
44
  end
42
45
  end
43
-
46
+
44
47
  def extension
45
48
  raise 'Parent class. This method should not be called.'
46
49
  end
@@ -8,13 +8,13 @@ module RspecApiDocumentation
8
8
  @configuration = configuration
9
9
  self.template_path = configuration.template_path
10
10
  end
11
-
11
+
12
12
  def api_name
13
13
  @configuration.api_name
14
14
  end
15
15
 
16
16
  def sections
17
- RspecApiDocumentation::Writers::IndexWriter.sections(examples, @configuration)
17
+ RspecApiDocumentation::Writers::IndexHelper.sections(examples, @configuration)
18
18
  end
19
19
  end
20
20
  end
@@ -5,7 +5,7 @@ module RspecApiDocumentation
5
5
  super
6
6
  self.template_name = "rspec_api_documentation/textile_index"
7
7
  end
8
-
8
+
9
9
  def examples
10
10
  @index.examples.map { |example| TextileExample.new(example, @configuration) }
11
11
  end
@@ -0,0 +1,49 @@
1
+ require 'rspec_api_documentation/writers/formatter'
2
+
3
+ module RspecApiDocumentation
4
+ module Writers
5
+ class AppendJsonWriter < JsonWriter
6
+ def write
7
+ index_file = docs_dir.join("index.json")
8
+ if File.exists?(index_file) && (output = File.read(index_file)).length >= 2
9
+ existing_index_hash = JSON.parse(output)
10
+ end
11
+ File.open(index_file, "w+") do |f|
12
+ f.write Formatter.to_json(AppendJsonIndex.new(index, configuration, existing_index_hash))
13
+ end
14
+ write_examples
15
+ end
16
+
17
+ def self.clear_docs(docs_dir)
18
+ nil #noop
19
+ end
20
+ end
21
+
22
+ class AppendJsonIndex < JsonIndex
23
+ def initialize(index, configuration, existing_index_hash = nil)
24
+ @index = index
25
+ @configuration = configuration
26
+ @existing_index_hash = clean_index_hash(existing_index_hash)
27
+ end
28
+
29
+ def as_json(opts = nil)
30
+ sections.inject(@existing_index_hash) do |h, section|
31
+ h[:resources].push(section_hash(section))
32
+ h
33
+ end
34
+ end
35
+
36
+ def clean_index_hash(existing_index_hash)
37
+ unless existing_index_hash.is_a?(Hash) && existing_index_hash["resources"].is_a?(Array) #check format
38
+ existing_index_hash = {:resources => []}
39
+ end
40
+ existing_index_hash = existing_index_hash.deep_symbolize_keys
41
+ existing_index_hash[:resources].map!(&:deep_symbolize_keys).reject! do |resource|
42
+ resource_names = sections.map{|s| s[:resource_name]}
43
+ resource_names.include? resource[:name]
44
+ end
45
+ existing_index_hash
46
+ end
47
+ end
48
+ end
49
+ end
@@ -2,7 +2,7 @@ require 'rspec_api_documentation/writers/json_writer'
2
2
 
3
3
  module RspecApiDocumentation
4
4
  module Writers
5
- class CombinedJsonWriter
5
+ class CombinedJsonWriter < Writer
6
6
  def self.write(index, configuration)
7
7
  File.open(configuration.docs_dir.join("combined.json"), "w+") do |f|
8
8
  examples = []
@@ -1,6 +1,6 @@
1
1
  module RspecApiDocumentation
2
2
  module Writers
3
- class CombinedTextWriter
3
+ class CombinedTextWriter < Writer
4
4
  def self.write(index, configuration)
5
5
  index.examples.each do |rspec_example|
6
6
  example = CombinedTextExample.new(rspec_example)
@@ -1,20 +1,8 @@
1
1
  module RspecApiDocumentation
2
2
  module Writers
3
- class GeneralMarkupWriter
4
- attr_accessor :index, :configuration
5
-
3
+ class GeneralMarkupWriter < Writer
6
4
  INDEX_FILE_NAME = 'index'
7
-
8
- def initialize(index, configuration)
9
- self.index = index
10
- self.configuration = configuration
11
- end
12
5
 
13
- def self.write(index, configuration)
14
- writer = new(index, configuration)
15
- writer.write
16
- end
17
-
18
6
  def write
19
7
  File.open(configuration.docs_dir.join(index_file_name + '.' + extension), "w+") do |f|
20
8
  f.write markup_index_class.new(index, configuration).render
@@ -1,8 +1,6 @@
1
1
  module RspecApiDocumentation
2
2
  module Writers
3
3
  class HtmlWriter < GeneralMarkupWriter
4
- attr_accessor :index, :configuration
5
-
6
4
  EXTENSION = 'html'
7
5
 
8
6
  def markup_index_class
@@ -2,7 +2,7 @@ require "active_support/core_ext/enumerable"
2
2
 
3
3
  module RspecApiDocumentation
4
4
  module Writers
5
- module IndexWriter
5
+ module IndexHelper
6
6
  def sections(examples, configuration)
7
7
  resources = examples.group_by(&:resource_name).inject([]) do |arr, (resource_name, examples)|
8
8
  ordered_examples = configuration.keep_source_order ? examples : examples.sort_by(&:description)
@@ -2,21 +2,15 @@ require 'rspec_api_documentation/writers/formatter'
2
2
 
3
3
  module RspecApiDocumentation
4
4
  module Writers
5
- class JsonIodocsWriter
6
- attr_accessor :index, :configuration, :api_key
5
+ class JsonIodocsWriter < Writer
6
+ attr_accessor :api_key
7
7
  delegate :docs_dir, :to => :configuration
8
8
 
9
9
  def initialize(index, configuration)
10
- self.index = index
11
- self.configuration = configuration
10
+ super
12
11
  self.api_key = configuration.api_name.parameterize
13
12
  end
14
13
 
15
- def self.write(index, configuration)
16
- writer = new(index, configuration)
17
- writer.write
18
- end
19
-
20
14
  def write
21
15
  File.open(docs_dir.join("apiconfig.json"), "w+") do |file|
22
16
  file.write Formatter.to_json(ApiConfig.new(configuration))
@@ -34,7 +28,7 @@ module RspecApiDocumentation
34
28
  end
35
29
 
36
30
  def sections
37
- IndexWriter.sections(examples, @configuration)
31
+ IndexHelper.sections(examples, @configuration)
38
32
  end
39
33
 
40
34
  def examples
@@ -2,24 +2,17 @@ require 'rspec_api_documentation/writers/formatter'
2
2
 
3
3
  module RspecApiDocumentation
4
4
  module Writers
5
- class JsonWriter
6
- attr_accessor :index, :configuration
5
+ class JsonWriter < Writer
7
6
  delegate :docs_dir, :to => :configuration
8
7
 
9
- def initialize(index, configuration)
10
- self.index = index
11
- self.configuration = configuration
12
- end
13
-
14
- def self.write(index, configuration)
15
- writer = new(index, configuration)
16
- writer.write
17
- end
18
-
19
8
  def write
20
9
  File.open(docs_dir.join("index.json"), "w+") do |f|
21
10
  f.write Formatter.to_json(JsonIndex.new(index, configuration))
22
11
  end
12
+ write_examples
13
+ end
14
+
15
+ def write_examples
23
16
  index.examples.each do |example|
24
17
  json_example = JsonExample.new(example, configuration)
25
18
  FileUtils.mkdir_p(docs_dir.join(json_example.dirname))
@@ -37,7 +30,7 @@ module RspecApiDocumentation
37
30
  end
38
31
 
39
32
  def sections
40
- IndexWriter.sections(examples, @configuration)
33
+ IndexHelper.sections(examples, @configuration)
41
34
  end
42
35
 
43
36
  def examples
@@ -46,25 +39,30 @@ module RspecApiDocumentation
46
39
 
47
40
  def as_json(opts = nil)
48
41
  sections.inject({:resources => []}) do |h, section|
49
- h[:resources].push(
50
- :name => section[:resource_name],
51
- :examples => section[:examples].map { |example|
52
- {
53
- :description => example.description,
54
- :link => "#{example.dirname}/#{example.filename}",
55
- :groups => example.metadata[:document]
56
- }
57
- }
58
- )
42
+ h[:resources].push(section_hash(section))
59
43
  h
60
44
  end
61
45
  end
46
+
47
+ def section_hash(section)
48
+ {
49
+ :name => section[:resource_name],
50
+ :examples => section[:examples].map { |example|
51
+ {
52
+ :description => example.description,
53
+ :link => "#{example.dirname}/#{example.filename}",
54
+ :groups => example.metadata[:document]
55
+ }
56
+ }
57
+ }
58
+ end
62
59
  end
63
60
 
64
61
  class JsonExample
65
62
  def initialize(example, configuration)
66
63
  @example = example
67
64
  @host = configuration.curl_host
65
+ @filter_headers = configuration.curl_headers_to_filter
68
66
  end
69
67
 
70
68
  def method_missing(method, *args, &block)
@@ -99,7 +97,9 @@ module RspecApiDocumentation
99
97
  def requests
100
98
  super.map do |hash|
101
99
  if @host
102
- hash[:curl] = hash[:curl].output(@host) if hash[:curl].is_a? RspecApiDocumentation::Curl
100
+ if hash[:curl].is_a? RspecApiDocumentation::Curl
101
+ hash[:curl] = hash[:curl].output(@host, @filter_headers)
102
+ end
103
103
  else
104
104
  hash[:curl] = nil
105
105
  end
@@ -1,8 +1,6 @@
1
1
  module RspecApiDocumentation
2
2
  module Writers
3
3
  class TextileWriter < GeneralMarkupWriter
4
- attr_accessor :index, :configuration
5
-
6
4
  EXTENSION = 'textile'
7
5
 
8
6
  def markup_index_class
@@ -0,0 +1,25 @@
1
+ module RspecApiDocumentation
2
+ module Writers
3
+ class Writer
4
+ attr_accessor :index, :configuration
5
+
6
+ def initialize(index, configuration)
7
+ self.index = index
8
+ self.configuration = configuration
9
+ end
10
+
11
+ def self.write(index, configuration)
12
+ writer = new(index, configuration)
13
+ writer.write
14
+ end
15
+
16
+ def self.clear_docs(docs_dir)
17
+ if File.exists?(docs_dir)
18
+ FileUtils.rm_rf(docs_dir, :secure => true)
19
+ end
20
+ FileUtils.mkdir_p(docs_dir)
21
+ end
22
+ end
23
+ end
24
+ end
25
+
data/lib/tasks/docs.rake CHANGED
@@ -5,3 +5,9 @@ RSpec::Core::RakeTask.new('docs:generate') do |t|
5
5
  t.pattern = 'spec/acceptance/**/*_spec.rb'
6
6
  t.rspec_opts = ["--format RspecApiDocumentation::ApiFormatter"]
7
7
  end
8
+
9
+ desc 'Generate API request documentation from API specs (ordered)'
10
+ RSpec::Core::RakeTask.new('docs:generate:ordered') do |t|
11
+ t.pattern = 'spec/acceptance/**/*_spec.rb'
12
+ t.rspec_opts = ["--format RspecApiDocumentation::ApiFormatter", "--order default"]
13
+ end
@@ -53,7 +53,12 @@
53
53
  {{# parameters }}
54
54
  <tr>
55
55
  <td{{# required }} class="required"{{/ required }}>
56
- <span class="name">{{ name }}</span>
56
+ {{# scope }}
57
+ <span class="name">{{ scope }}[{{ name }}]</span>
58
+ {{/ scope }}
59
+ {{^ scope }}
60
+ <span class="name">{{ name }}</span>
61
+ {{/ scope }}
57
62
  </td>
58
63
  <td>
59
64
  <span class="description">{{ description }}</span>
@@ -85,7 +90,7 @@
85
90
 
86
91
  {{# curl }}
87
92
  <h4>cURL</h4>
88
- <pre class="request">{{ curl }}</pre>
93
+ <pre class="request curl">{{ curl }}</pre>
89
94
  {{/ curl }}
90
95
 
91
96
  {{# response_status }}
metadata CHANGED
@@ -1,8 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rspec_api_documentation
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
5
- prerelease:
4
+ version: 3.0.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Chris Cahoon
@@ -11,216 +10,190 @@ authors:
11
10
  autorequire:
12
11
  bindir: bin
13
12
  cert_chain: []
14
- date: 2013-10-14 00:00:00.000000000 Z
13
+ date: 2014-04-15 00:00:00.000000000 Z
15
14
  dependencies:
16
15
  - !ruby/object:Gem::Dependency
17
16
  name: rspec
18
17
  requirement: !ruby/object:Gem::Requirement
19
- none: false
20
18
  requirements:
21
- - - ! '>='
19
+ - - '>='
22
20
  - !ruby/object:Gem::Version
23
21
  version: 2.14.0
24
22
  type: :runtime
25
23
  prerelease: false
26
24
  version_requirements: !ruby/object:Gem::Requirement
27
- none: false
28
25
  requirements:
29
- - - ! '>='
26
+ - - '>='
30
27
  - !ruby/object:Gem::Version
31
28
  version: 2.14.0
32
29
  - !ruby/object:Gem::Dependency
33
30
  name: activesupport
34
31
  requirement: !ruby/object:Gem::Requirement
35
- none: false
36
32
  requirements:
37
- - - ! '>='
33
+ - - '>='
38
34
  - !ruby/object:Gem::Version
39
35
  version: 3.0.0
40
36
  type: :runtime
41
37
  prerelease: false
42
38
  version_requirements: !ruby/object:Gem::Requirement
43
- none: false
44
39
  requirements:
45
- - - ! '>='
40
+ - - '>='
46
41
  - !ruby/object:Gem::Version
47
42
  version: 3.0.0
48
43
  - !ruby/object:Gem::Dependency
49
44
  name: i18n
50
45
  requirement: !ruby/object:Gem::Requirement
51
- none: false
52
46
  requirements:
53
- - - ! '>='
47
+ - - '>='
54
48
  - !ruby/object:Gem::Version
55
49
  version: 0.1.0
56
50
  type: :runtime
57
51
  prerelease: false
58
52
  version_requirements: !ruby/object:Gem::Requirement
59
- none: false
60
53
  requirements:
61
- - - ! '>='
54
+ - - '>='
62
55
  - !ruby/object:Gem::Version
63
56
  version: 0.1.0
64
57
  - !ruby/object:Gem::Dependency
65
58
  name: mustache
66
59
  requirement: !ruby/object:Gem::Requirement
67
- none: false
68
60
  requirements:
69
- - - ! '>='
61
+ - - '>='
70
62
  - !ruby/object:Gem::Version
71
63
  version: 0.99.4
72
64
  type: :runtime
73
65
  prerelease: false
74
66
  version_requirements: !ruby/object:Gem::Requirement
75
- none: false
76
67
  requirements:
77
- - - ! '>='
68
+ - - '>='
78
69
  - !ruby/object:Gem::Version
79
70
  version: 0.99.4
80
- - !ruby/object:Gem::Dependency
81
- name: webmock
82
- requirement: !ruby/object:Gem::Requirement
83
- none: false
84
- requirements:
85
- - - ! '>='
86
- - !ruby/object:Gem::Version
87
- version: 1.7.0
88
- type: :runtime
89
- prerelease: false
90
- version_requirements: !ruby/object:Gem::Requirement
91
- none: false
92
- requirements:
93
- - - ! '>='
94
- - !ruby/object:Gem::Version
95
- version: 1.7.0
96
71
  - !ruby/object:Gem::Dependency
97
72
  name: json
98
73
  requirement: !ruby/object:Gem::Requirement
99
- none: false
100
74
  requirements:
101
- - - ! '>='
75
+ - - '>='
102
76
  - !ruby/object:Gem::Version
103
77
  version: 1.4.6
104
78
  type: :runtime
105
79
  prerelease: false
106
80
  version_requirements: !ruby/object:Gem::Requirement
107
- none: false
108
81
  requirements:
109
- - - ! '>='
82
+ - - '>='
110
83
  - !ruby/object:Gem::Version
111
84
  version: 1.4.6
112
85
  - !ruby/object:Gem::Dependency
113
86
  name: fakefs
114
87
  requirement: !ruby/object:Gem::Requirement
115
- none: false
116
88
  requirements:
117
- - - ! '>='
89
+ - - '>='
118
90
  - !ruby/object:Gem::Version
119
91
  version: '0'
120
92
  type: :development
121
93
  prerelease: false
122
94
  version_requirements: !ruby/object:Gem::Requirement
123
- none: false
124
95
  requirements:
125
- - - ! '>='
96
+ - - '>='
126
97
  - !ruby/object:Gem::Version
127
98
  version: '0'
128
99
  - !ruby/object:Gem::Dependency
129
100
  name: sinatra
130
101
  requirement: !ruby/object:Gem::Requirement
131
- none: false
132
102
  requirements:
133
- - - ! '>='
103
+ - - '>='
134
104
  - !ruby/object:Gem::Version
135
105
  version: '0'
136
106
  type: :development
137
107
  prerelease: false
138
108
  version_requirements: !ruby/object:Gem::Requirement
139
- none: false
140
109
  requirements:
141
- - - ! '>='
110
+ - - '>='
142
111
  - !ruby/object:Gem::Version
143
112
  version: '0'
144
113
  - !ruby/object:Gem::Dependency
145
114
  name: aruba
146
115
  requirement: !ruby/object:Gem::Requirement
147
- none: false
148
116
  requirements:
149
- - - ! '>='
117
+ - - '>='
150
118
  - !ruby/object:Gem::Version
151
119
  version: '0'
152
120
  type: :development
153
121
  prerelease: false
154
122
  version_requirements: !ruby/object:Gem::Requirement
155
- none: false
156
123
  requirements:
157
- - - ! '>='
124
+ - - '>='
158
125
  - !ruby/object:Gem::Version
159
126
  version: '0'
160
127
  - !ruby/object:Gem::Dependency
161
128
  name: capybara
162
129
  requirement: !ruby/object:Gem::Requirement
163
- none: false
164
130
  requirements:
165
- - - ! '>='
131
+ - - '>='
166
132
  - !ruby/object:Gem::Version
167
133
  version: '0'
168
134
  type: :development
169
135
  prerelease: false
170
136
  version_requirements: !ruby/object:Gem::Requirement
171
- none: false
172
137
  requirements:
173
- - - ! '>='
138
+ - - '>='
174
139
  - !ruby/object:Gem::Version
175
140
  version: '0'
176
141
  - !ruby/object:Gem::Dependency
177
142
  name: rake
178
143
  requirement: !ruby/object:Gem::Requirement
179
- none: false
180
144
  requirements:
181
- - - ! '>='
145
+ - - '>='
182
146
  - !ruby/object:Gem::Version
183
147
  version: '0'
184
148
  type: :development
185
149
  prerelease: false
186
150
  version_requirements: !ruby/object:Gem::Requirement
187
- none: false
188
151
  requirements:
189
- - - ! '>='
152
+ - - '>='
190
153
  - !ruby/object:Gem::Version
191
154
  version: '0'
192
155
  - !ruby/object:Gem::Dependency
193
156
  name: rack-test
194
157
  requirement: !ruby/object:Gem::Requirement
195
- none: false
196
158
  requirements:
197
- - - ! '>='
159
+ - - '>='
198
160
  - !ruby/object:Gem::Version
199
161
  version: 0.6.2
200
162
  type: :development
201
163
  prerelease: false
202
164
  version_requirements: !ruby/object:Gem::Requirement
203
- none: false
204
165
  requirements:
205
- - - ! '>='
166
+ - - '>='
206
167
  - !ruby/object:Gem::Version
207
168
  version: 0.6.2
208
169
  - !ruby/object:Gem::Dependency
209
170
  name: rack-oauth2
210
171
  requirement: !ruby/object:Gem::Requirement
211
- none: false
212
172
  requirements:
213
- - - ! '>='
173
+ - - '>='
214
174
  - !ruby/object:Gem::Version
215
175
  version: 0.14.4
216
176
  type: :development
217
177
  prerelease: false
218
178
  version_requirements: !ruby/object:Gem::Requirement
219
- none: false
220
179
  requirements:
221
- - - ! '>='
180
+ - - '>='
222
181
  - !ruby/object:Gem::Version
223
182
  version: 0.14.4
183
+ - !ruby/object:Gem::Dependency
184
+ name: webmock
185
+ requirement: !ruby/object:Gem::Requirement
186
+ requirements:
187
+ - - '>='
188
+ - !ruby/object:Gem::Version
189
+ version: 1.7.0
190
+ type: :development
191
+ prerelease: false
192
+ version_requirements: !ruby/object:Gem::Requirement
193
+ requirements:
194
+ - - '>='
195
+ - !ruby/object:Gem::Version
196
+ version: 1.7.0
224
197
  description: Generate API docs from your test suite
225
198
  email:
226
199
  - chris@smartlogicsolutions.com
@@ -248,14 +221,16 @@ files:
248
221
  - lib/rspec_api_documentation/views/textile_index.rb
249
222
  - lib/rspec_api_documentation/views/markup_index.rb
250
223
  - lib/rspec_api_documentation/views/markup_example.rb
224
+ - lib/rspec_api_documentation/writers/append_json_writer.rb
251
225
  - lib/rspec_api_documentation/writers/textile_writer.rb
252
226
  - lib/rspec_api_documentation/writers/general_markup_writer.rb
253
227
  - lib/rspec_api_documentation/writers/html_writer.rb
254
228
  - lib/rspec_api_documentation/writers/json_iodocs_writer.rb
229
+ - lib/rspec_api_documentation/writers/index_helper.rb
255
230
  - lib/rspec_api_documentation/writers/json_writer.rb
231
+ - lib/rspec_api_documentation/writers/writer.rb
256
232
  - lib/rspec_api_documentation/writers/combined_json_writer.rb
257
233
  - lib/rspec_api_documentation/writers/formatter.rb
258
- - lib/rspec_api_documentation/writers/index_writer.rb
259
234
  - lib/rspec_api_documentation/writers/combined_text_writer.rb
260
235
  - lib/rspec_api_documentation/configuration.rb
261
236
  - lib/rspec_api_documentation/example.rb
@@ -268,28 +243,27 @@ files:
268
243
  - templates/rspec_api_documentation/textile_index.mustache
269
244
  - templates/rspec_api_documentation/html_example.mustache
270
245
  homepage: http://smartlogicsolutions.com
271
- licenses: []
246
+ licenses:
247
+ - MIT
248
+ metadata: {}
272
249
  post_install_message:
273
250
  rdoc_options: []
274
251
  require_paths:
275
252
  - lib
276
253
  required_ruby_version: !ruby/object:Gem::Requirement
277
- none: false
278
254
  requirements:
279
- - - ! '>='
255
+ - - '>='
280
256
  - !ruby/object:Gem::Version
281
257
  version: '0'
282
258
  required_rubygems_version: !ruby/object:Gem::Requirement
283
- none: false
284
259
  requirements:
285
- - - ! '>='
260
+ - - '>='
286
261
  - !ruby/object:Gem::Version
287
262
  version: 1.3.6
288
263
  requirements: []
289
264
  rubyforge_project:
290
- rubygems_version: 1.8.23
265
+ rubygems_version: 2.0.14
291
266
  signing_key:
292
- specification_version: 3
267
+ specification_version: 4
293
268
  summary: A double black belt for your docs
294
269
  test_files: []
295
- has_rdoc: