rspec_api_documentation 0.9.2 → 1.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 (41) hide show
  1. data/lib/rspec_api_documentation.rb +11 -8
  2. data/lib/rspec_api_documentation/api_documentation.rb +1 -2
  3. data/lib/rspec_api_documentation/configuration.rb +0 -2
  4. data/lib/rspec_api_documentation/curl.rb +1 -1
  5. data/lib/rspec_api_documentation/example.rb +1 -1
  6. data/lib/rspec_api_documentation/writers/combined_json_writer.rb +20 -0
  7. data/lib/rspec_api_documentation/writers/combined_text_writer.rb +106 -0
  8. data/lib/rspec_api_documentation/writers/formatter.rb +11 -0
  9. data/lib/rspec_api_documentation/writers/html_writer.rb +102 -0
  10. data/lib/rspec_api_documentation/writers/index_writer.rb +16 -0
  11. data/lib/rspec_api_documentation/writers/json_iodocs_writer.rb +111 -0
  12. data/lib/rspec_api_documentation/writers/json_writer.rb +111 -0
  13. data/templates/rspec_api_documentation/html_example.mustache +12 -41
  14. data/templates/rspec_api_documentation/html_index.mustache +9 -2
  15. metadata +10 -28
  16. data/lib/rspec_api_documentation/combined_json_writer.rb +0 -18
  17. data/lib/rspec_api_documentation/combined_text_writer.rb +0 -104
  18. data/lib/rspec_api_documentation/html_writer.rb +0 -107
  19. data/lib/rspec_api_documentation/index_writer.rb +0 -14
  20. data/lib/rspec_api_documentation/json_iodocs_writer.rb +0 -107
  21. data/lib/rspec_api_documentation/json_writer.rb +0 -111
  22. data/lib/rspec_api_documentation/wurl_writer.rb +0 -110
  23. data/templates/assets/img/glyphicons-halflings-white.png +0 -0
  24. data/templates/assets/img/glyphicons-halflings.png +0 -0
  25. data/templates/assets/javascripts/application.js +0 -250
  26. data/templates/assets/javascripts/codemirror.js +0 -3636
  27. data/templates/assets/javascripts/jquery-1-7-2.js +0 -9401
  28. data/templates/assets/javascripts/jquery-base64.js +0 -189
  29. data/templates/assets/javascripts/jquery-livequery.js +0 -226
  30. data/templates/assets/javascripts/jquery-ui-1-8-16-min.js +0 -791
  31. data/templates/assets/javascripts/mode/css/css.js +0 -124
  32. data/templates/assets/javascripts/mode/htmlmixed/htmlmixed.js +0 -85
  33. data/templates/assets/javascripts/mode/javascript/javascript.js +0 -361
  34. data/templates/assets/javascripts/mode/xml/xml.js +0 -325
  35. data/templates/assets/stylesheets/application.css +0 -68
  36. data/templates/assets/stylesheets/bootstrap.css +0 -4960
  37. data/templates/assets/stylesheets/codemirror.css +0 -230
  38. data/templates/rspec_api_documentation/example.json +0 -1
  39. data/templates/rspec_api_documentation/index.json +0 -1
  40. data/templates/rspec_api_documentation/wurl_example.mustache +0 -242
  41. data/templates/rspec_api_documentation/wurl_index.mustache +0 -27
@@ -0,0 +1,111 @@
1
+ require 'rspec_api_documentation/writers/formatter'
2
+
3
+ module RspecApiDocumentation
4
+ module Writers
5
+ class JsonWriter
6
+ attr_accessor :index, :configuration
7
+ delegate :docs_dir, :to => :configuration
8
+
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
+ def write
20
+ File.open(docs_dir.join("index.json"), "w+") do |f|
21
+ f.write Formatter.to_json(JsonIndex.new(index, configuration))
22
+ end
23
+ index.examples.each do |example|
24
+ json_example = JsonExample.new(example, configuration)
25
+ FileUtils.mkdir_p(docs_dir.join(json_example.dirname))
26
+ File.open(docs_dir.join(json_example.dirname, json_example.filename), "w+") do |f|
27
+ f.write Formatter.to_json(json_example)
28
+ end
29
+ end
30
+ end
31
+ end
32
+
33
+ class JsonIndex
34
+ def initialize(index, configuration)
35
+ @index = index
36
+ @configuration = configuration
37
+ end
38
+
39
+ def sections
40
+ IndexWriter.sections(examples, @configuration)
41
+ end
42
+
43
+ def examples
44
+ @index.examples.map { |example| JsonExample.new(example, @configuration) }
45
+ end
46
+
47
+ def as_json(opts = nil)
48
+ 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
+ )
59
+ h
60
+ end
61
+ end
62
+ end
63
+
64
+ class JsonExample
65
+ def initialize(example, configuration)
66
+ @example = example
67
+ @host = configuration.curl_host
68
+ end
69
+
70
+ def method_missing(method, *args, &block)
71
+ @example.send(method, *args, &block)
72
+ end
73
+
74
+ def respond_to?(method, include_private = false)
75
+ super || @example.respond_to?(method, include_private)
76
+ end
77
+
78
+ def dirname
79
+ resource_name.downcase.gsub(/\s+/, '_')
80
+ end
81
+
82
+ def filename
83
+ basename = description.downcase.gsub(/\s+/, '_').gsub(/[^a-z_]/, '')
84
+ "#{basename}.json"
85
+ end
86
+
87
+ def as_json(opts = nil)
88
+ {
89
+ :resource => resource_name,
90
+ :http_method => http_method,
91
+ :route => route,
92
+ :description => description,
93
+ :explanation => explanation,
94
+ :parameters => respond_to?(:parameters) ? parameters : [],
95
+ :requests => requests
96
+ }
97
+ end
98
+
99
+ def requests
100
+ super.map do |hash|
101
+ if @host
102
+ hash[:curl] = hash[:curl].output(@host) if hash[:curl].is_a? RspecApiDocumentation::Curl
103
+ else
104
+ hash[:curl] = nil
105
+ end
106
+ hash
107
+ end
108
+ end
109
+ end
110
+ end
111
+ end
@@ -3,45 +3,6 @@
3
3
  <head>
4
4
  <title>{{resource_name}} API</title>
5
5
  <meta charset="utf-8">
6
- <link rel="stylesheet" href="{{url_prefix}}/assets/stylesheets/bootstrap.css"/>
7
- <link rel="stylesheet" href="{{url_prefix}}/assets/stylesheets/codemirror.css"/>
8
- <link rel="stylesheet" href="{{url_prefix}}/assets/stylesheets/application.css"/>
9
- <script src="{{url_prefix}}/assets/javascripts/jquery-1-7-2.js"></script>
10
- <script src="{{url_prefix}}/assets/javascripts/codemirror.js"></script>
11
- <script src="{{url_prefix}}/assets/javascripts/mode/css/css.js"></script>
12
- <script src="{{url_prefix}}/assets/javascripts/mode/htmlmixed/htmlmixed.js"></script>
13
- <script src="{{url_prefix}}/assets/javascripts/mode/javascript/javascript.js"></script>
14
- <script src="{{url_prefix}}/assets/javascripts/mode/xml/xml.js"></script>
15
- <script>
16
- function mirror(textarea, contentType, options) {
17
- $textarea = $(textarea);
18
- if ($textarea.val() != '') {
19
- if(contentType.indexOf('json') >= 0) {
20
- $textarea.val(JSON.stringify(JSON.parse($textarea.val()), undefined, 2));
21
- options.json = true;
22
- options.mode = 'javascript';
23
- } else if (contentType.indexOf('javascript') >= 0) {
24
- options.mode = 'javascript';
25
- } else if (contentType.indexOf('xml') >= 0) {
26
- options.mode = 'xml';
27
- } else {
28
- options.mode = 'htmlmixed';
29
- }
30
- }
31
- return CodeMirror.fromTextArea(textarea, options);
32
- };
33
-
34
- $(function(){
35
- $(".request.body").each(function(i, el) {
36
- el = $(el);
37
- mirror(el.find("textarea")[0], el.data("content-type"), { "readOnly": true, "lineNumbers": true });
38
- });
39
- $(".response.body").each(function(i, el) {
40
- el = $(el);
41
- mirror(el.find("textarea")[0], el.data("content-type"), { "readOnly": true, "lineNumbers": true });
42
- });
43
- });
44
- </script>
45
6
  <style>
46
7
  td.required .name:after {
47
8
  float: right;
@@ -54,6 +15,16 @@
54
15
  padding: 15px;
55
16
  font-size: 130%;
56
17
  }
18
+
19
+ pre {
20
+ white-space: pre-wrap;
21
+ }
22
+
23
+ body {
24
+ margin-left: auto;
25
+ margin-right: auto;
26
+ width: 900px;
27
+ }
57
28
  </style>
58
29
  </head>
59
30
  <body>
@@ -109,7 +80,7 @@
109
80
 
110
81
  {{# request_body }}
111
82
  <h4>Body</h4>
112
- <div class="request body" data-content-type="{{ request_content_type }}"><textarea>{{{ request_body }}}</textarea></div>
83
+ <pre class="request body">{{{ request_body }}}</pre>
113
84
  {{/ request_body }}
114
85
 
115
86
  {{# curl }}
@@ -125,7 +96,7 @@
125
96
  <pre class="response status">{{ response_status }} {{ response_status_text}}</pre>
126
97
  {{# response_body }}
127
98
  <h4>Body</h4>
128
- <div class="response body" data-content-type="{{ response_content_type }}"><textarea>{{{ response_body }}}</textarea></div>
99
+ <pre class="response body">{{{ response_body }}}</pre>
129
100
  {{/ response_body }}
130
101
  {{/ response_status }}
131
102
  {{/ requests }}
@@ -3,7 +3,14 @@
3
3
  <head>
4
4
  <title>{{ api_name }}</title>
5
5
  <meta charset="utf-8">
6
- <link rel="stylesheet" href="{{ url_prefix }}/assets/stylesheets/bootstrap.css"/>
6
+
7
+ <style>
8
+ body {
9
+ margin-left: auto;
10
+ margin-right: auto;
11
+ width: 900px;
12
+ }
13
+ </style>
7
14
  </head>
8
15
  <body>
9
16
  <div class="container">
@@ -16,7 +23,7 @@
16
23
  <ul>
17
24
  {{# examples }}
18
25
  <li>
19
- <a href="{{ url_prefix }}/{{ dirname }}/{{ filename }}">{{ description }}</a>
26
+ <a href="{{ dirname }}/{{ filename }}">{{ description }}</a>
20
27
  </li>
21
28
  {{/ examples }}
22
29
  </ul>
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rspec_api_documentation
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.2
4
+ version: 1.0.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2013-04-23 00:00:00.000000000 Z
14
+ date: 2013-06-24 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: rspec
@@ -234,48 +234,29 @@ files:
234
234
  - lib/tasks/docs.rake
235
235
  - lib/rspec_api_documentation/rack_test_client.rb
236
236
  - lib/rspec_api_documentation/api_formatter.rb
237
- - lib/rspec_api_documentation/html_writer.rb
238
237
  - lib/rspec_api_documentation/curl.rb
239
- - lib/rspec_api_documentation/json_iodocs_writer.rb
240
238
  - lib/rspec_api_documentation/index.rb
241
239
  - lib/rspec_api_documentation/headers.rb
242
- - lib/rspec_api_documentation/wurl_writer.rb
243
240
  - lib/rspec_api_documentation/oauth2_mac_client.rb
244
241
  - lib/rspec_api_documentation/dsl/callback.rb
245
242
  - lib/rspec_api_documentation/dsl/endpoint.rb
246
243
  - lib/rspec_api_documentation/dsl/resource.rb
247
- - lib/rspec_api_documentation/json_writer.rb
248
244
  - lib/rspec_api_documentation/dsl.rb
245
+ - lib/rspec_api_documentation/writers/html_writer.rb
246
+ - lib/rspec_api_documentation/writers/json_iodocs_writer.rb
247
+ - lib/rspec_api_documentation/writers/json_writer.rb
248
+ - lib/rspec_api_documentation/writers/combined_json_writer.rb
249
+ - lib/rspec_api_documentation/writers/formatter.rb
250
+ - lib/rspec_api_documentation/writers/index_writer.rb
251
+ - lib/rspec_api_documentation/writers/combined_text_writer.rb
249
252
  - lib/rspec_api_documentation/configuration.rb
250
- - lib/rspec_api_documentation/combined_json_writer.rb
251
253
  - lib/rspec_api_documentation/example.rb
252
254
  - lib/rspec_api_documentation/api_documentation.rb
253
255
  - lib/rspec_api_documentation/test_server.rb
254
256
  - lib/rspec_api_documentation/railtie.rb
255
- - lib/rspec_api_documentation/index_writer.rb
256
- - lib/rspec_api_documentation/combined_text_writer.rb
257
257
  - lib/rspec_api_documentation/client_base.rb
258
- - templates/assets/javascripts/jquery-1-7-2.js
259
- - templates/assets/javascripts/codemirror.js
260
- - templates/assets/javascripts/jquery-base64.js
261
- - templates/assets/javascripts/jquery-ui-1-8-16-min.js
262
- - templates/assets/javascripts/mode/javascript/javascript.js
263
- - templates/assets/javascripts/mode/css/css.js
264
- - templates/assets/javascripts/mode/xml/xml.js
265
- - templates/assets/javascripts/mode/htmlmixed/htmlmixed.js
266
- - templates/assets/javascripts/jquery-livequery.js
267
- - templates/assets/javascripts/application.js
268
- - templates/assets/img/glyphicons-halflings-white.png
269
- - templates/assets/img/glyphicons-halflings.png
270
- - templates/assets/stylesheets/application.css
271
- - templates/assets/stylesheets/codemirror.css
272
- - templates/assets/stylesheets/bootstrap.css
273
258
  - templates/rspec_api_documentation/html_index.mustache
274
- - templates/rspec_api_documentation/index.json
275
- - templates/rspec_api_documentation/wurl_example.mustache
276
259
  - templates/rspec_api_documentation/html_example.mustache
277
- - templates/rspec_api_documentation/example.json
278
- - templates/rspec_api_documentation/wurl_index.mustache
279
260
  homepage: http://smartlogicsolutions.com
280
261
  licenses: []
281
262
  post_install_message:
@@ -301,3 +282,4 @@ signing_key:
301
282
  specification_version: 3
302
283
  summary: A double black belt for your docs
303
284
  test_files: []
285
+ has_rdoc:
@@ -1,18 +0,0 @@
1
- require 'rspec_api_documentation/json_writer'
2
-
3
- module RspecApiDocumentation
4
- class CombinedJsonWriter
5
- def self.write(index, configuration)
6
- File.open(configuration.docs_dir.join("combined.json"), "w+") do |f|
7
- examples = []
8
- index.examples.each do |rspec_example|
9
- examples << JsonExample.new(rspec_example, configuration).to_json
10
- end
11
-
12
- f.write "["
13
- f.write examples.join(",")
14
- f.write "]"
15
- end
16
- end
17
- end
18
- end
@@ -1,104 +0,0 @@
1
- module RspecApiDocumentation
2
- class CombinedTextWriter
3
- def self.write(index, configuration)
4
- index.examples.each do |rspec_example|
5
- example = CombinedTextExample.new(rspec_example)
6
- FileUtils.mkdir_p(configuration.docs_dir.join(example.resource_name))
7
- File.open(configuration.docs_dir.join(example.resource_name, "index.txt"), "a+") do |f|
8
- f.print example.description
9
- f.print example.parameters
10
-
11
- example.requests.each_with_index do |(request, response), i|
12
- f.puts "Request:"
13
- f.puts request
14
- f.puts
15
- f.puts "Response:"
16
- f.puts response
17
-
18
- if i + 1 < example.requests.count
19
- f.puts
20
- end
21
- end
22
-
23
- unless rspec_example == index.examples.last
24
- f.puts
25
- f.puts
26
- end
27
- end
28
- end
29
- end
30
-
31
- def self.format_hash(hash, separator="=")
32
- hash.sort_by { |k, v| k }.inject("") do |out, (k, v)|
33
- out << " #{k}#{separator}#{v}\n"
34
- end
35
- end
36
- end
37
-
38
- class CombinedTextExample
39
- attr_reader :example
40
-
41
- def initialize(example)
42
- @example = example
43
- end
44
-
45
- def resource_name
46
- example.resource_name.downcase.gsub(/\s+/, '_')
47
- end
48
-
49
- def description
50
- example.description + "\n" + "-" * example.description.length + "\n\n"
51
- end
52
-
53
- def parameters
54
- return "" unless example.metadata[:parameters]
55
- "Parameters:\n" + example.metadata[:parameters].inject("") do |out, parameter|
56
- out << " * #{parameter[:name]} - #{parameter[:description]}\n"
57
- end + "\n"
58
- end
59
-
60
- def requests
61
- return [] unless example.metadata[:requests]
62
- example.metadata[:requests].map do |request|
63
- [format_request(request), format_response(request)]
64
- end
65
- end
66
-
67
- private
68
- def format_request(request)
69
- [
70
- [
71
- " #{request[:request_method]} #{request[:request_path]}",
72
- format_hash(request[:request_headers], ": ")
73
- ],
74
- [
75
- format_string(request[:request_body]) || format_hash(request[:request_query_parameters])
76
- ]
77
- ].map { |x| x.compact.join("\n") }.reject(&:blank?).join("\n\n") + "\n"
78
- end
79
-
80
- def format_response(request)
81
- [
82
- [
83
- " Status: #{request[:response_status]} #{request[:response_status_text]}",
84
- format_hash(request[:response_headers], ": ")
85
- ],
86
- [
87
- format_string(request[:response_body])
88
- ]
89
- ].map { |x| x.compact.join("\n") }.reject(&:blank?).join("\n\n") + "\n"
90
- end
91
-
92
- def format_string(string)
93
- return unless string
94
- string.split("\n").map { |line| " #{line}" }.join("\n")
95
- end
96
-
97
- def format_hash(hash, separator="=")
98
- return unless hash
99
- hash.sort_by { |k, v| k }.map do |k, v|
100
- " #{k}#{separator}#{v}"
101
- end.join("\n")
102
- end
103
- end
104
- end
@@ -1,107 +0,0 @@
1
- require 'mustache'
2
-
3
- module RspecApiDocumentation
4
- class HtmlWriter
5
- attr_accessor :index, :configuration
6
-
7
- def initialize(index, configuration)
8
- warn "[NOTICE] Assets will be gone from the next release. Please use Raddocs for nicer looking docs"
9
- self.index = index
10
- self.configuration = configuration
11
- end
12
-
13
- def self.write(index, configuration)
14
- writer = new(index, configuration)
15
- writer.write
16
- end
17
-
18
- def write
19
- File.open(configuration.docs_dir.join("index.html"), "w+") do |f|
20
- f.write HtmlIndex.new(index, configuration).render
21
- end
22
- index.examples.each do |example|
23
- html_example = HtmlExample.new(example, configuration)
24
- FileUtils.mkdir_p(configuration.docs_dir.join(html_example.dirname))
25
- File.open(configuration.docs_dir.join(html_example.dirname, html_example.filename), "w+") do |f|
26
- f.write html_example.render
27
- end
28
- end
29
- end
30
- end
31
-
32
- class HtmlIndex < Mustache
33
- def initialize(index, configuration)
34
- @index = index
35
- @configuration = configuration
36
- self.template_path = configuration.template_path
37
- end
38
-
39
- def api_name
40
- @configuration.api_name
41
- end
42
-
43
- def sections
44
- IndexWriter.sections(examples, @configuration)
45
- end
46
-
47
- def url_prefix
48
- @configuration.url_prefix
49
- end
50
-
51
- def examples
52
- @index.examples.map { |example| HtmlExample.new(example, @configuration) }
53
- end
54
- end
55
-
56
- class HtmlExample < Mustache
57
- def initialize(example, configuration)
58
- @example = example
59
- @host = configuration.curl_host
60
- self.template_path = configuration.template_path
61
- end
62
-
63
- def method_missing(method, *args, &block)
64
- @example.send(method, *args, &block)
65
- end
66
-
67
- def respond_to?(method, include_private = false)
68
- super || @example.respond_to?(method, include_private)
69
- end
70
-
71
- def dirname
72
- resource_name.downcase.gsub(/\s+/, '_')
73
- end
74
-
75
- def filename
76
- basename = description.downcase.gsub(/\s+/, '_').gsub(/[^a-z_]/, '')
77
- basename = Digest::MD5.new.update(description).to_s if basename.blank?
78
- "#{basename}.html"
79
- end
80
-
81
- def requests
82
- super.map do |hash|
83
- hash[:request_headers_text] = format_hash(hash[:request_headers])
84
- hash[:request_query_parameters_text] = format_hash(hash[:request_query_parameters])
85
- hash[:response_headers_text] = format_hash(hash[:response_headers])
86
- if @host
87
- hash[:curl] = hash[:curl].output(@host) if hash[:curl].is_a? RspecApiDocumentation::Curl
88
- else
89
- hash[:curl] = nil
90
- end
91
- hash
92
- end
93
- end
94
-
95
- def url_prefix
96
- configuration.url_prefix
97
- end
98
-
99
- private
100
- def format_hash(hash = {})
101
- return nil unless hash.present?
102
- hash.collect do |k, v|
103
- "#{k}: #{v}"
104
- end.join("\n")
105
- end
106
- end
107
- end