ghost_writer 0.4.1 → 0.4.2
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.
- checksums.yaml +4 -4
- data/README.md +1 -0
- data/lib/ghost_writer.rb +7 -5
- data/lib/ghost_writer/document.rb +35 -55
- data/lib/ghost_writer/document_index.rb +15 -22
- data/lib/ghost_writer/index_writer.rb +28 -0
- data/lib/ghost_writer/index_writer/base.rb +27 -0
- data/lib/ghost_writer/index_writer/markdown.rb +16 -0
- data/lib/ghost_writer/index_writer/rack.rb +39 -0
- data/lib/ghost_writer/index_writer/rst.rb +16 -0
- data/lib/ghost_writer/index_writer/templates/markdown.erb +7 -0
- data/lib/ghost_writer/index_writer/templates/rack.erb +36 -0
- data/lib/ghost_writer/index_writer/templates/rst.erb +8 -0
- data/lib/ghost_writer/version.rb +1 -1
- data/lib/ghost_writer/writer.rb +29 -0
- data/lib/ghost_writer/writer/base.rb +31 -0
- data/lib/ghost_writer/writer/markdown.rb +16 -0
- data/lib/ghost_writer/writer/rst.rb +16 -0
- data/lib/ghost_writer/writer/templates/markdown.erb +33 -0
- data/lib/ghost_writer/writer/templates/rst.erb +41 -0
- metadata +15 -4
- data/lib/ghost_writer/format/markdown.rb +0 -35
- data/lib/ghost_writer/format/rack.rb +0 -99
- data/lib/ghost_writer/format/rst.rb +0 -50
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7aaf1da751c9da1f4bd95426076de33da3ed4bb8
|
4
|
+
data.tar.gz: 59d7e48cdf34b773da063196e78a6215c5dab391
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1473fc739dbbc1274784edb02e52948b67591be47ca3fa30fa7930555c254877968a544fe5f695594eb75c903ab7413b30cc2c7608f0fd9f1ad2b5d8e97c3a46
|
7
|
+
data.tar.gz: 14d93f8b53bfbb364a078f5bcfe7a86de4224fdc0e761113e227cfcd0351652ebc93d3ba66ca5ba90d9aabda70ddfaba828c9b5c11e878b9e4c47b16645fd3be
|
data/README.md
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# GhostWriter
|
2
2
|
[](https://travis-ci.org/joker1007/ghost_writer)
|
3
3
|
[](http://badge.fury.io/rb/ghost_writer)
|
4
|
+
[](https://codeclimate.com/github/joker1007/ghost_writer)
|
4
5
|
|
5
6
|
Generate API examples from params and response of controller specs
|
6
7
|
|
data/lib/ghost_writer.rb
CHANGED
@@ -31,11 +31,13 @@ module GhostWriter
|
|
31
31
|
FileUtils.mkdir_p(output_path)
|
32
32
|
end
|
33
33
|
document_index = GhostWriter::DocumentIndex.new(output_path + "#{DOCUMENT_INDEX_FILENAME}", document_group, GhostWriter.output_format)
|
34
|
-
document_index.
|
34
|
+
document_index.write_file(format: output_format)
|
35
35
|
document_group.each do |output, docs|
|
36
36
|
docs.sort_by!(&:location)
|
37
|
-
docs.shift
|
38
|
-
|
37
|
+
initial = docs.shift
|
38
|
+
initial.header = true
|
39
|
+
initial.write_file(format: output_format, overwrite: true)
|
40
|
+
docs.each {|d| d.write_file(format: output_format) }
|
39
41
|
end
|
40
42
|
|
41
43
|
document_group.clear
|
@@ -68,8 +70,8 @@ module GhostWriter
|
|
68
70
|
request_method: request.env["REQUEST_METHOD"],
|
69
71
|
path_info: request.env["PATH_INFO"],
|
70
72
|
param_example: controller.params.reject {|key, val| key == "controller" || key == "action"},
|
71
|
-
|
72
|
-
|
73
|
+
status_code: response.status,
|
74
|
+
response_body: response.body,
|
73
75
|
format: GhostWriter.output_format
|
74
76
|
})
|
75
77
|
|
@@ -1,79 +1,59 @@
|
|
1
|
-
|
2
|
-
attr_reader :title, :description, :location, :request_method, :path_info, :param_example, :status_example, :response_example, :output, :relative_path
|
1
|
+
require 'ghost_writer/writer'
|
3
2
|
|
4
|
-
|
5
|
-
|
6
|
-
|
3
|
+
class GhostWriter::Document
|
4
|
+
attr_reader :basename, :relative_path, :title, :description, :location, :request_method, :path_info, :response_format, :param_example, :status_code
|
5
|
+
attr_accessor :header
|
7
6
|
|
8
|
-
|
9
|
-
@
|
7
|
+
def initialize(basename, attrs)
|
8
|
+
@basename = basename
|
9
|
+
@relative_path = Pathname.new(basename).relative_path_from(GhostWriter.output_path)
|
10
10
|
@title = attrs[:title]
|
11
11
|
@description = attrs[:description]
|
12
12
|
@location = attrs[:location]
|
13
13
|
@request_method = attrs[:request_method]
|
14
14
|
@path_info = attrs[:path_info]
|
15
|
-
@param_example = attrs[:param_example]
|
16
|
-
@status_example = attrs[:status_example]
|
17
|
-
@response_example = attrs[:response_example]
|
18
|
-
end
|
19
|
-
|
20
|
-
def write_file(overwrite = false)
|
21
|
-
unless File.exist?(File.dirname(output))
|
22
|
-
FileUtils.mkdir_p(File.dirname(output))
|
23
|
-
end
|
24
|
-
|
25
|
-
mode = overwrite ? "w" : "a"
|
26
|
-
doc = File.open("#{output}.#{extname}", mode)
|
27
15
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
doc.close
|
16
|
+
param_example = attrs[:param_example].stringify_keys
|
17
|
+
@response_format = param_example.delete("format").to_s
|
18
|
+
@param_example = param_example
|
19
|
+
@status_code = attrs[:status_code]
|
20
|
+
@response_body = attrs[:response_body]
|
35
21
|
end
|
36
22
|
|
37
|
-
def
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
EOP
|
23
|
+
def write_file(options = {})
|
24
|
+
writer = GhostWriter::Writer.new(self, options)
|
25
|
+
writer.write_file
|
42
26
|
end
|
43
27
|
|
44
|
-
def
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
#{headword("access path:", 4)}
|
49
|
-
#{quote("#{request_method} #{path_info}")}
|
50
|
-
|
51
|
-
#{headword("request params:", 4)}
|
52
|
-
#{quote(param_example.inspect, :ruby)}
|
53
|
-
|
54
|
-
#{headword("status code:", 4)}
|
55
|
-
#{quote(status_example)}
|
56
|
-
|
57
|
-
#{headword("response:", 4)}
|
58
|
-
#{quote_response(response_example)}
|
59
|
-
|
60
|
-
Generated by "#{description}\" at #{location}
|
28
|
+
def serialized_params
|
29
|
+
MultiJson.dump(param_example)
|
30
|
+
end
|
61
31
|
|
62
|
-
|
32
|
+
def response_body
|
33
|
+
arrange_json(@response_body)
|
34
|
+
end
|
63
35
|
|
64
|
-
|
36
|
+
def response_format(json_convert_to_javascript = false)
|
37
|
+
if json_convert_to_javascript && @response_format == "json"
|
38
|
+
"javascript"
|
39
|
+
else
|
40
|
+
@response_format
|
41
|
+
end
|
65
42
|
end
|
66
43
|
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
quote(arrange_json(response_example), :javascript)
|
44
|
+
def content_type
|
45
|
+
if response_format == "json"
|
46
|
+
"application/json; charset=UTF-8"
|
71
47
|
else
|
72
|
-
|
48
|
+
"text/html; charset=UTF-8"
|
73
49
|
end
|
74
50
|
end
|
75
51
|
|
52
|
+
private
|
53
|
+
|
76
54
|
def arrange_json(body)
|
55
|
+
return body unless response_format == "json"
|
56
|
+
|
77
57
|
data = ActiveSupport::JSON.decode(body)
|
78
58
|
if data.is_a?(Array) || data.is_a?(Hash)
|
79
59
|
JSON.pretty_generate(data)
|
@@ -1,34 +1,27 @@
|
|
1
|
+
require 'ghost_writer/index_writer'
|
2
|
+
require 'ghost_writer/index_writer/rack'
|
3
|
+
|
1
4
|
class GhostWriter::DocumentIndex
|
2
|
-
attr_reader :
|
5
|
+
attr_reader :basename, :document_group
|
6
|
+
|
7
|
+
def initialize(basename, document_group, format)
|
8
|
+
@basename = basename
|
9
|
+
@document_group = document_group
|
10
|
+
end
|
3
11
|
|
4
|
-
def
|
5
|
-
|
6
|
-
|
12
|
+
def write_file(options = {})
|
13
|
+
writer = GhostWriter::IndexWriter.new(self, options)
|
14
|
+
writer.write_file
|
7
15
|
|
8
|
-
|
9
|
-
|
16
|
+
rack_writer = GhostWriter::IndexWriter::Rack.new(self)
|
17
|
+
rack_writer.write_file
|
10
18
|
end
|
11
19
|
|
12
|
-
def
|
20
|
+
def base_url
|
13
21
|
if GhostWriter.github_base_url
|
14
22
|
base_url = GhostWriter.github_base_url + "/"
|
15
23
|
else
|
16
24
|
base_url = ""
|
17
25
|
end
|
18
|
-
|
19
|
-
document_list = documents.flat_map do |output, docs|
|
20
|
-
docs.map do |d|
|
21
|
-
list(
|
22
|
-
link(d.description, base_url + "#{d.relative_path}")
|
23
|
-
)
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
index_file = File.open("#{output}.#{extname}", "w")
|
28
|
-
index_file.write paragraph(<<EOP)
|
29
|
-
#{headword("API Examples")}
|
30
|
-
#{document_list.join("\n")}
|
31
|
-
EOP
|
32
|
-
index_file.close
|
33
26
|
end
|
34
27
|
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'active_support/core_ext/string'
|
2
|
+
|
3
|
+
class GhostWriter::IndexWriter
|
4
|
+
autoload "Markdown", "ghost_writer/index_writer/markdown"
|
5
|
+
autoload "Rst", "ghost_writer/index_writer/rst"
|
6
|
+
|
7
|
+
def initialize(document_index, options = {})
|
8
|
+
@document_index = document_index
|
9
|
+
@format = options.delete(:format) || :markdown
|
10
|
+
end
|
11
|
+
|
12
|
+
def write_file
|
13
|
+
format_class = lookup_format_class
|
14
|
+
format = format_class.new(@document_index)
|
15
|
+
format.write_file
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def lookup_format_class
|
21
|
+
case @format
|
22
|
+
when Class
|
23
|
+
@format
|
24
|
+
when String, Symbol
|
25
|
+
"GhostWriter::IndexWriter::#{@format.to_s.classify}".constantize
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
class GhostWriter::IndexWriter
|
2
|
+
class Base
|
3
|
+
def initialize(document_index)
|
4
|
+
@document_index = document_index
|
5
|
+
end
|
6
|
+
|
7
|
+
def write_file
|
8
|
+
unless File.exist?(File.dirname(@document_index.basename))
|
9
|
+
FileUtils.mkdir_p(File.dirname(@document_index.basename))
|
10
|
+
end
|
11
|
+
|
12
|
+
File.open("#{@document_index.basename}.#{extname}", "w") do |f|
|
13
|
+
f.write template.result(@document_index.instance_eval { binding })
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def extname
|
20
|
+
raise NotImplementedError
|
21
|
+
end
|
22
|
+
|
23
|
+
def template
|
24
|
+
raise NotImplementedError
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'ghost_writer/index_writer/base'
|
2
|
+
|
3
|
+
class GhostWriter::IndexWriter
|
4
|
+
class Markdown < Base
|
5
|
+
private
|
6
|
+
|
7
|
+
def extname
|
8
|
+
"md"
|
9
|
+
end
|
10
|
+
|
11
|
+
def template
|
12
|
+
path = File.join(File.expand_path(File.dirname(__FILE__)), "templates", "markdown.erb")
|
13
|
+
ERB.new(File.read(path), nil, "%-")
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'ghost_writer/index_writer/base'
|
2
|
+
|
3
|
+
class GhostWriter::IndexWriter
|
4
|
+
class Rack < Base
|
5
|
+
def write_file
|
6
|
+
unless File.exist?(File.dirname(@document_index.basename))
|
7
|
+
FileUtils.mkdir_p(File.dirname(@document_index.basename))
|
8
|
+
end
|
9
|
+
|
10
|
+
File.open(app_path, "w") do |f|
|
11
|
+
f.write template.result(@document_index.instance_eval { binding })
|
12
|
+
end
|
13
|
+
|
14
|
+
File.open(configru_path, "w") do |f|
|
15
|
+
f.write "require_relative 'mock_server'\n"
|
16
|
+
f.write "run MockServer.new"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def app_path
|
23
|
+
File.join(File.dirname(@document_index.basename), "mock_server.rb")
|
24
|
+
end
|
25
|
+
|
26
|
+
def configru_path
|
27
|
+
File.join(File.dirname(@document_index.basename), "config.ru")
|
28
|
+
end
|
29
|
+
|
30
|
+
def extname
|
31
|
+
"rb"
|
32
|
+
end
|
33
|
+
|
34
|
+
def template
|
35
|
+
path = File.join(File.expand_path(File.dirname(__FILE__)), "templates", "rack.erb")
|
36
|
+
ERB.new(File.read(path), nil, "%-")
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'ghost_writer/index_writer/base'
|
2
|
+
|
3
|
+
class GhostWriter::IndexWriter
|
4
|
+
class Rst < Base
|
5
|
+
private
|
6
|
+
|
7
|
+
def extname
|
8
|
+
"rst"
|
9
|
+
end
|
10
|
+
|
11
|
+
def template
|
12
|
+
path = File.join(File.expand_path(File.dirname(__FILE__)), "templates", "rst.erb")
|
13
|
+
ERB.new(File.read(path), nil, "%-")
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'rack'
|
2
|
+
|
3
|
+
class MockServer
|
4
|
+
def call(env)
|
5
|
+
request = Rack::Request.new(env)
|
6
|
+
params = recursive_to_s(request.params)
|
7
|
+
case [request.request_method, request.path_info, params]
|
8
|
+
<% document_group.each do |output, docs| -%>
|
9
|
+
<% docs.each do |d| -%>
|
10
|
+
when [<%= d.request_method.inspect %>, <%= d.path_info.inspect %>, recursive_to_s(<%= MultiJson.load(d.serialized_params).inspect %>)]
|
11
|
+
[200, {"Content-Type" => <%= d.content_type.inspect %>}, [(<<BODY)]]
|
12
|
+
<%= d.response_body %>
|
13
|
+
BODY
|
14
|
+
<% end %>
|
15
|
+
<% end -%>
|
16
|
+
else
|
17
|
+
[404, {"Content-Type" => "text/html"}, ['No match rule']]
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def recursive_to_s(params)
|
22
|
+
case params
|
23
|
+
when Hash
|
24
|
+
params.each do |k, v|
|
25
|
+
params[k] = recursive_to_s(v)
|
26
|
+
end
|
27
|
+
when Array
|
28
|
+
params.map do |v|
|
29
|
+
recursive_to_s(v)
|
30
|
+
end
|
31
|
+
else
|
32
|
+
params.to_s
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
data/lib/ghost_writer/version.rb
CHANGED
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'active_support/core_ext/string'
|
2
|
+
|
3
|
+
class GhostWriter::Writer
|
4
|
+
autoload "Markdown", "ghost_writer/writer/markdown"
|
5
|
+
autoload "Rst", "ghost_writer/writer/rst"
|
6
|
+
|
7
|
+
def initialize(document, options = {})
|
8
|
+
@document = document
|
9
|
+
@format = options.delete(:format) || :markdown
|
10
|
+
@options = options
|
11
|
+
end
|
12
|
+
|
13
|
+
def write_file
|
14
|
+
format_class = lookup_format_class
|
15
|
+
format = format_class.new(@document, @options)
|
16
|
+
format.write_file
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def lookup_format_class
|
22
|
+
case @format
|
23
|
+
when Class
|
24
|
+
@format
|
25
|
+
when String, Symbol
|
26
|
+
"GhostWriter::Writer::#{@format.to_s.classify}".constantize
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'erb'
|
2
|
+
|
3
|
+
class GhostWriter::Writer
|
4
|
+
class Base
|
5
|
+
def initialize(document, options = {})
|
6
|
+
@document = document
|
7
|
+
@overwrite = options[:overwrite] || false
|
8
|
+
end
|
9
|
+
|
10
|
+
def write_file
|
11
|
+
unless File.exist?(File.dirname(@document.basename))
|
12
|
+
FileUtils.mkdir_p(File.dirname(@document.basename))
|
13
|
+
end
|
14
|
+
|
15
|
+
mode = @overwrite ? "w" : "a"
|
16
|
+
File.open("#{@document.basename}.#{extname}", mode) do |f|
|
17
|
+
f.write template.result(@document.instance_eval { binding })
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def extname
|
24
|
+
raise NotImplementedError
|
25
|
+
end
|
26
|
+
|
27
|
+
def template
|
28
|
+
raise NotImplementedError
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'ghost_writer/writer/base'
|
2
|
+
|
3
|
+
class GhostWriter::Writer
|
4
|
+
class Markdown < Base
|
5
|
+
private
|
6
|
+
|
7
|
+
def extname
|
8
|
+
"md"
|
9
|
+
end
|
10
|
+
|
11
|
+
def template
|
12
|
+
path = File.join(File.expand_path(File.dirname(__FILE__)), "templates", "markdown.erb")
|
13
|
+
ERB.new(File.read(path))
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'ghost_writer/writer/base'
|
2
|
+
|
3
|
+
class GhostWriter::Writer
|
4
|
+
class Rst < Base
|
5
|
+
private
|
6
|
+
|
7
|
+
def extname
|
8
|
+
"rst"
|
9
|
+
end
|
10
|
+
|
11
|
+
def template
|
12
|
+
path = File.join(File.expand_path(File.dirname(__FILE__)), "templates", "rst.erb")
|
13
|
+
ERB.new(File.read(path), nil, "%-")
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
<% if header %>
|
2
|
+
## <%= title %>
|
3
|
+
<% end %>
|
4
|
+
|
5
|
+
### <%= description %>
|
6
|
+
|
7
|
+
#### access path:
|
8
|
+
|
9
|
+
```
|
10
|
+
<%= "#{request_method} #{path_info}" %>
|
11
|
+
```
|
12
|
+
|
13
|
+
#### request params:
|
14
|
+
|
15
|
+
```json
|
16
|
+
<%= serialized_params %>
|
17
|
+
```
|
18
|
+
|
19
|
+
#### status code:
|
20
|
+
|
21
|
+
```
|
22
|
+
<%= status_code %>
|
23
|
+
```
|
24
|
+
|
25
|
+
#### response:
|
26
|
+
|
27
|
+
```<%= response_format %>
|
28
|
+
<%= response_body %>
|
29
|
+
```
|
30
|
+
|
31
|
+
Generated by <%= description %> at <%= location %>
|
32
|
+
|
33
|
+
--------------------------------
|
@@ -0,0 +1,41 @@
|
|
1
|
+
<% if header -%>
|
2
|
+
<%= title %>
|
3
|
+
<%= "*" * title.length * 2 %>
|
4
|
+
<% end -%>
|
5
|
+
|
6
|
+
<%= description %>
|
7
|
+
<%= "=" * description.length * 2 %>
|
8
|
+
|
9
|
+
|
10
|
+
access path
|
11
|
+
----------------
|
12
|
+
|
13
|
+
::
|
14
|
+
<%= "#{request_method} #{path_info}" %>
|
15
|
+
|
16
|
+
|
17
|
+
request params
|
18
|
+
----------------------
|
19
|
+
|
20
|
+
.. code-block:: javascript
|
21
|
+
<%= serialized_params.each_line.map{|line| line.chomp.empty? ? line : " " + line}.join %>
|
22
|
+
|
23
|
+
|
24
|
+
status code
|
25
|
+
----------------------
|
26
|
+
|
27
|
+
::
|
28
|
+
<%= status_code %>
|
29
|
+
|
30
|
+
|
31
|
+
response
|
32
|
+
----------------------
|
33
|
+
|
34
|
+
.. code-block:: <%= response_format(true) %>
|
35
|
+
<%= response_body.each_line.map{|line| line.chomp.empty? ? line : " " + line}.join %>
|
36
|
+
|
37
|
+
|
38
|
+
Generated by <%= description %> at <%= location %>
|
39
|
+
|
40
|
+
|
41
|
+
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ghost_writer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- joker1007
|
@@ -147,10 +147,21 @@ files:
|
|
147
147
|
- lib/ghost_writer.rb
|
148
148
|
- lib/ghost_writer/document.rb
|
149
149
|
- lib/ghost_writer/document_index.rb
|
150
|
-
- lib/ghost_writer/
|
151
|
-
- lib/ghost_writer/
|
152
|
-
- lib/ghost_writer/
|
150
|
+
- lib/ghost_writer/index_writer.rb
|
151
|
+
- lib/ghost_writer/index_writer/base.rb
|
152
|
+
- lib/ghost_writer/index_writer/markdown.rb
|
153
|
+
- lib/ghost_writer/index_writer/rack.rb
|
154
|
+
- lib/ghost_writer/index_writer/rst.rb
|
155
|
+
- lib/ghost_writer/index_writer/templates/markdown.erb
|
156
|
+
- lib/ghost_writer/index_writer/templates/rack.erb
|
157
|
+
- lib/ghost_writer/index_writer/templates/rst.erb
|
153
158
|
- lib/ghost_writer/version.rb
|
159
|
+
- lib/ghost_writer/writer.rb
|
160
|
+
- lib/ghost_writer/writer/base.rb
|
161
|
+
- lib/ghost_writer/writer/markdown.rb
|
162
|
+
- lib/ghost_writer/writer/rst.rb
|
163
|
+
- lib/ghost_writer/writer/templates/markdown.erb
|
164
|
+
- lib/ghost_writer/writer/templates/rst.erb
|
154
165
|
- output_examples/anonymous_controller/index.markdown
|
155
166
|
- output_examples/anonymous_controller/show.markdown
|
156
167
|
- output_examples/document_index.markdown
|
@@ -1,35 +0,0 @@
|
|
1
|
-
module GhostWriter
|
2
|
-
module Format
|
3
|
-
module Markdown
|
4
|
-
private
|
5
|
-
|
6
|
-
def extname
|
7
|
-
"md"
|
8
|
-
end
|
9
|
-
|
10
|
-
def headword(text, level = 1)
|
11
|
-
"#{'#'*level} #{text}"
|
12
|
-
end
|
13
|
-
|
14
|
-
def paragraph(text)
|
15
|
-
text + "\n"
|
16
|
-
end
|
17
|
-
|
18
|
-
def separator(length)
|
19
|
-
"-" * length
|
20
|
-
end
|
21
|
-
|
22
|
-
def quote(text, quote_format = nil)
|
23
|
-
"```#{quote_format}\n#{text}\n```"
|
24
|
-
end
|
25
|
-
|
26
|
-
def list(text, level = 1)
|
27
|
-
"#{" " * (level - 1)}- #{text}"
|
28
|
-
end
|
29
|
-
|
30
|
-
def link(text, url)
|
31
|
-
"[#{text}](#{url})"
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
@@ -1,99 +0,0 @@
|
|
1
|
-
require 'multi_json'
|
2
|
-
|
3
|
-
module GhostWriter
|
4
|
-
module Format
|
5
|
-
module Rack
|
6
|
-
def write_index_file
|
7
|
-
rack = <<RUBY
|
8
|
-
require 'rack'
|
9
|
-
|
10
|
-
class DummyApp
|
11
|
-
def call(env)
|
12
|
-
request = Rack::Request.new(env)
|
13
|
-
case [request.request_method, request.path_info]
|
14
|
-
|
15
|
-
RUBY
|
16
|
-
documents.each do |output, docs|
|
17
|
-
docs.each do |d|
|
18
|
-
rack += <<RUBY
|
19
|
-
when [#{d.request_method.inspect}, #{d.path_info.inspect}]
|
20
|
-
if fuzzy_match(request.params, #{parameter_arranging(d.param_example.reject {|k, _| k == "format"}).inspect})
|
21
|
-
[200, {"Content-Type" => #{d.content_type.inspect}}, [(<<BODY)]]
|
22
|
-
#{d.response_example}
|
23
|
-
BODY
|
24
|
-
else
|
25
|
-
[404, {"Content-Type" => "text/html"}, ['No match rule']]
|
26
|
-
end
|
27
|
-
RUBY
|
28
|
-
end
|
29
|
-
end
|
30
|
-
rack += <<RUBY
|
31
|
-
else
|
32
|
-
[404, {"Content-Type" => "text/html"}, ['No match rule']]
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
def fuzzy_match(params, other)
|
37
|
-
params.all? do |k, v|
|
38
|
-
case v
|
39
|
-
when Hash
|
40
|
-
return false unless other[k].instance_of?(Hash)
|
41
|
-
fuzzy_match(v, other[k])
|
42
|
-
when Array
|
43
|
-
return false unless other[k].instance_of?(Array)
|
44
|
-
fuzzy_match_array(v, other[k])
|
45
|
-
else
|
46
|
-
v.to_s == other[k].to_s
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
def fuzzy_match_array(array, other)
|
52
|
-
array.each_with_index.all? do |v, i|
|
53
|
-
case v
|
54
|
-
when Hash
|
55
|
-
fuzzy_match(v, other[i])
|
56
|
-
when Array
|
57
|
-
fuzzy_match_array(v, other[i])
|
58
|
-
else
|
59
|
-
v.to_s == other[i].to_s
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
64
|
-
RUBY
|
65
|
-
File.open("#{output}.#{extname}", "w") do |f|
|
66
|
-
f.write rack
|
67
|
-
end
|
68
|
-
|
69
|
-
configru = File.join(File.dirname(output), "config.ru")
|
70
|
-
|
71
|
-
File.open(configru, "w") do |f|
|
72
|
-
f.write "require_relative '#{File.basename(output)}'\n"
|
73
|
-
f.write "run DummyApp.new"
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
def write_file(overwrite = false)
|
78
|
-
end
|
79
|
-
|
80
|
-
def content_type
|
81
|
-
if param_example["format"] == "json"
|
82
|
-
"application/json; charset=UTF-8"
|
83
|
-
else
|
84
|
-
"text/html; charset=UTF-8"
|
85
|
-
end
|
86
|
-
end
|
87
|
-
|
88
|
-
private
|
89
|
-
|
90
|
-
def extname
|
91
|
-
"rb"
|
92
|
-
end
|
93
|
-
|
94
|
-
def parameter_arranging(params)
|
95
|
-
MultiJson.load(MultiJson.dump(params))
|
96
|
-
end
|
97
|
-
end
|
98
|
-
end
|
99
|
-
end
|
@@ -1,50 +0,0 @@
|
|
1
|
-
module GhostWriter
|
2
|
-
module Format
|
3
|
-
module Rst
|
4
|
-
private
|
5
|
-
|
6
|
-
def extname
|
7
|
-
"rst"
|
8
|
-
end
|
9
|
-
|
10
|
-
def headword(text, level = 1)
|
11
|
-
char = case level
|
12
|
-
when 1
|
13
|
-
"*"
|
14
|
-
when 2
|
15
|
-
"="
|
16
|
-
when 3
|
17
|
-
"-"
|
18
|
-
when 4
|
19
|
-
"^"
|
20
|
-
end
|
21
|
-
text + "\n" + char * text.length * 2
|
22
|
-
end
|
23
|
-
|
24
|
-
def paragraph(text)
|
25
|
-
text + "\n"
|
26
|
-
end
|
27
|
-
|
28
|
-
def separator(length)
|
29
|
-
""
|
30
|
-
end
|
31
|
-
|
32
|
-
def quote(text, quote_format = nil)
|
33
|
-
if quote_format
|
34
|
-
marker = ".. code-block:: #{quote_format}" + "\n"
|
35
|
-
else
|
36
|
-
marker = "::" + "\n"
|
37
|
-
end
|
38
|
-
marker + "#{text.each_line.map{|line| line.chomp.empty? ? line : " " + line}.join}"
|
39
|
-
end
|
40
|
-
|
41
|
-
def list(text, level = 1)
|
42
|
-
"#{" " * (level - 1)}* #{text}"
|
43
|
-
end
|
44
|
-
|
45
|
-
def link(text, url)
|
46
|
-
"`#{text} #{url}`_"
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|