rain-doc 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/bin/raindoc +12 -0
- data/lib/doc.rb +154 -0
- data/lib/doc_part.rb +138 -0
- data/lib/parser.rb +158 -0
- data/lib/rain.rb +83 -0
- data/templates/doc.erb +45 -0
- data/templates/layout.erb +15 -0
- metadata +101 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 2b22db23b6df6052719672b4f3e162ad0f38cd9b
|
4
|
+
data.tar.gz: 54b6d0d5844aece4dacebf9c72a94bad783287b4
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: eb235ac38baa2fd3e2f916f0760a4417cecebecfab38f85ea5b17d85bcb382c07dd18df08de0f0af04dc3e77bf3867c1f3541537e1620440578f1ec1b7fd530a
|
7
|
+
data.tar.gz: a9adc8daec64d905ced4275e71294b8332d47a669c2e50cdeb4911fc49291581683fa4a4bd1bc4c958d81212a56a14799e18f8faa19794d8f7aa91464830cf10
|
data/bin/raindoc
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
path = __FILE__
|
4
|
+
while File.symlink?(path)
|
5
|
+
path = File.expand_path(File.readlink(path), File.dirname(path))
|
6
|
+
end
|
7
|
+
$:.unshift(File.join(File.dirname(File.expand_path(path)), '..', 'lib'))
|
8
|
+
|
9
|
+
require 'doc'
|
10
|
+
require 'rain'
|
11
|
+
|
12
|
+
Rain::CLI.start(ARGV)
|
data/lib/doc.rb
ADDED
@@ -0,0 +1,154 @@
|
|
1
|
+
require_relative 'parser'
|
2
|
+
require_relative 'doc_part'
|
3
|
+
require 'logger'
|
4
|
+
|
5
|
+
module Rain
|
6
|
+
|
7
|
+
# used each time a file needs to be parsed.
|
8
|
+
# contains all documentation parts in the file
|
9
|
+
# as well as functionality to read through file
|
10
|
+
# contents line-by-line.
|
11
|
+
class Doc
|
12
|
+
attr_accessor :parser, :type, :parts, :current_part, :lines, :title,
|
13
|
+
:file_name, :file_contents, :file_ext
|
14
|
+
|
15
|
+
@@open_response = nil
|
16
|
+
@@open_response_id = nil
|
17
|
+
@@open_param = nil
|
18
|
+
@@open_param_type = nil
|
19
|
+
@@open_param_default = nil
|
20
|
+
@@log_lines = false
|
21
|
+
|
22
|
+
# sets up the doc using the file name and contents
|
23
|
+
# as a basis.
|
24
|
+
def initialize(file_name, file_contents, log_lines = false)
|
25
|
+
|
26
|
+
# set up basic options and defaults
|
27
|
+
self.file_name = file_name
|
28
|
+
self.file_contents = file_contents
|
29
|
+
self.file_ext = File.extname(file_name)
|
30
|
+
self.parts = []
|
31
|
+
self.lines = 0
|
32
|
+
@@log_lines = log_lines
|
33
|
+
|
34
|
+
# set the doc type based on extension
|
35
|
+
case self.file_ext
|
36
|
+
when '.rb'
|
37
|
+
self.type = :RUBY
|
38
|
+
when '.md', '.txt', '.markdown', '.mdown'
|
39
|
+
self.type = :MARKDOWN
|
40
|
+
end
|
41
|
+
|
42
|
+
# set parser with file type
|
43
|
+
self.parser = Rain::Parser.new(self.type)
|
44
|
+
|
45
|
+
# set the default title to the proper-case file name
|
46
|
+
# without the extension and underscores/dashes
|
47
|
+
self.title = self.file_name.sub(self.file_ext, '')
|
48
|
+
self.title.gsub!(/_|-/, ' ')
|
49
|
+
|
50
|
+
# very simple proper-caser
|
51
|
+
self.title.gsub!(/\w+/) { |word| word.capitalize }
|
52
|
+
end
|
53
|
+
|
54
|
+
# adds the current part to the parts array
|
55
|
+
# then sets a new current part up. a part is just
|
56
|
+
# a completed DocPart from a section of comments.
|
57
|
+
# for markdown files there will only be one doc part.
|
58
|
+
def new_part
|
59
|
+
self.parts << self.current_part if !self.current_part.nil?
|
60
|
+
self.current_part = Rain::DocPart.new
|
61
|
+
end
|
62
|
+
|
63
|
+
# parses the file by looping through all of the lines.
|
64
|
+
# defers to parser functionality to figure out if the
|
65
|
+
# current line is a tag and needs to be parsed into
|
66
|
+
# the docpart.
|
67
|
+
def parse
|
68
|
+
self.new_part
|
69
|
+
self.file_contents.each_line do |line|
|
70
|
+
|
71
|
+
# parse the current line
|
72
|
+
result = self.parser.parse(line)
|
73
|
+
|
74
|
+
# if there is no documentation for the result,
|
75
|
+
# create a new part and then set the current part to nil.
|
76
|
+
if result.nil?
|
77
|
+
self.new_part
|
78
|
+
self.current_part = nil
|
79
|
+
next
|
80
|
+
else
|
81
|
+
|
82
|
+
# if new doc block is found with the current part == nil,
|
83
|
+
# create a new part
|
84
|
+
self.new_part if self.current_part.nil?
|
85
|
+
end
|
86
|
+
|
87
|
+
# log the result if the logger is enabled
|
88
|
+
Logger.new(STDOUT).info(result) if @@log_lines
|
89
|
+
|
90
|
+
# figure out what to do based on the result type
|
91
|
+
case result[:tag]
|
92
|
+
when :title
|
93
|
+
self.title = result[:title]
|
94
|
+
when :route
|
95
|
+
self.current_part.set_route(result[:route])
|
96
|
+
when :method
|
97
|
+
self.current_part.set_method(result[:method])
|
98
|
+
when :response
|
99
|
+
|
100
|
+
# open the current response tag using the code as a key
|
101
|
+
if result[:open]
|
102
|
+
@@open_response = result[:code]
|
103
|
+
@@open_response_id = result[:id]
|
104
|
+
else
|
105
|
+
@@open_response = nil
|
106
|
+
end
|
107
|
+
when :param
|
108
|
+
|
109
|
+
# open the current param tag using the name as the key
|
110
|
+
if result[:open]
|
111
|
+
@@open_param = result[:name]
|
112
|
+
@@open_param_type = result[:type]
|
113
|
+
@@open_param_default = result[:default]
|
114
|
+
else
|
115
|
+
@@open_param = nil
|
116
|
+
end
|
117
|
+
when :doc
|
118
|
+
|
119
|
+
# figure out if the doc needs to be added to an
|
120
|
+
# open response or param tag
|
121
|
+
if !@@open_response.nil?
|
122
|
+
self.current_part.append_response(@@open_response.to_i, @@open_response_id, result[:text])
|
123
|
+
elsif !@@open_param.nil?
|
124
|
+
self.current_part.append_param(@@open_param, result[:text], @@open_param_type, @@open_param_default)
|
125
|
+
else
|
126
|
+
self.current_part.append_doc(result[:text])
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
self.lines += 1
|
131
|
+
end
|
132
|
+
|
133
|
+
# add the part and create a new one
|
134
|
+
self.new_part
|
135
|
+
|
136
|
+
# remove any empty parts (for ruby docs)
|
137
|
+
if self.type == :RUBY
|
138
|
+
self.parts = self.parts.select{ |part| part.route != "//" }
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
def to_hash
|
143
|
+
return {
|
144
|
+
file_name: self.file_name,
|
145
|
+
file_contents: self.file_contents,
|
146
|
+
file_ext: self.file_ext,
|
147
|
+
title: self.title,
|
148
|
+
lines: self.lines,
|
149
|
+
parts: self.parts.map { |part| part.to_hash },
|
150
|
+
type: self.type.to_s
|
151
|
+
}
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
data/lib/doc_part.rb
ADDED
@@ -0,0 +1,138 @@
|
|
1
|
+
module Rain
|
2
|
+
class DocPart
|
3
|
+
attr_accessor :http_method, :responses, :route, :doc, :params, :headers
|
4
|
+
|
5
|
+
def initialize
|
6
|
+
self.responses = []
|
7
|
+
self.doc = []
|
8
|
+
self.route = '//'
|
9
|
+
self.params = []
|
10
|
+
self.headers = []
|
11
|
+
end
|
12
|
+
|
13
|
+
# add or append a response with the specified code
|
14
|
+
# and the line of text passed in
|
15
|
+
def append_response(code, id, text)
|
16
|
+
|
17
|
+
# check that the response code is a number
|
18
|
+
begin
|
19
|
+
code.to_i
|
20
|
+
rescue Exception => e
|
21
|
+
raise ArgumentError, 'You can only use integer codes for HTTP response examples.'
|
22
|
+
end
|
23
|
+
|
24
|
+
# try and find the current response and id in the array
|
25
|
+
current_response = self.responses.select { |resp| resp[:code] == code && resp[:id] == id }.first
|
26
|
+
|
27
|
+
# add to array if nil
|
28
|
+
if current_response.nil?
|
29
|
+
self.responses << {
|
30
|
+
code: code,
|
31
|
+
id: id,
|
32
|
+
text: [text]
|
33
|
+
}
|
34
|
+
else
|
35
|
+
|
36
|
+
# otherwise append to the current response
|
37
|
+
self.responses.each do |resp|
|
38
|
+
if resp[:code] == code && resp[:id] == id
|
39
|
+
resp[:text] << text
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
# gets a response part by code and id and
|
46
|
+
# joins the parts of the text
|
47
|
+
def get_response(code, id)
|
48
|
+
response = self.responses.select { |resp| resp[:code] == code && resp[:id] == id }.first
|
49
|
+
|
50
|
+
raise 'Response code and id reference does not exist.' if response.nil?
|
51
|
+
|
52
|
+
response[:text].join
|
53
|
+
end
|
54
|
+
|
55
|
+
# sets the http method for the
|
56
|
+
# documentation part
|
57
|
+
def set_method(method)
|
58
|
+
|
59
|
+
# capitalize and convert to a symbol if not already a symbol
|
60
|
+
method.upcase! if !method.kind_of? Symbol
|
61
|
+
|
62
|
+
# check if the http method is valid
|
63
|
+
valid_methods = [:GET, :PUT, :POST, :PATCH, :DELETE]
|
64
|
+
if !valid_methods.include?(method.to_sym)
|
65
|
+
raise ArgumentError, "HTTP method must be valid (#{valid_methods.join(', ')})"
|
66
|
+
end
|
67
|
+
|
68
|
+
self.http_method = method
|
69
|
+
end
|
70
|
+
|
71
|
+
# appends the text to the current documentation for the part
|
72
|
+
def append_doc(text)
|
73
|
+
self.doc << text
|
74
|
+
end
|
75
|
+
|
76
|
+
# joins all of the text in the doc property of
|
77
|
+
# the part with spaces
|
78
|
+
def get_doc
|
79
|
+
self.doc.join(' ')
|
80
|
+
end
|
81
|
+
|
82
|
+
# sets the current route for the doc part
|
83
|
+
def set_route(path)
|
84
|
+
self.route = path
|
85
|
+
end
|
86
|
+
|
87
|
+
# gets the current route for the doc part
|
88
|
+
def get_route
|
89
|
+
self.route
|
90
|
+
end
|
91
|
+
|
92
|
+
# adds a parameter with the specified type. also sets a
|
93
|
+
# default value if specified
|
94
|
+
def append_param(name, description, type, default = nil)
|
95
|
+
self.params << {
|
96
|
+
name: name,
|
97
|
+
text: description,
|
98
|
+
type: type,
|
99
|
+
default: default
|
100
|
+
}
|
101
|
+
end
|
102
|
+
|
103
|
+
# gets a parameter by name. will return nil if
|
104
|
+
# the parameter does not exist
|
105
|
+
def get_param(name)
|
106
|
+
self.params.select { |param| param[:name] == name }.first
|
107
|
+
end
|
108
|
+
|
109
|
+
# adds a http header with name and
|
110
|
+
# description of the header
|
111
|
+
def append_header(name, description)
|
112
|
+
self.headers << {
|
113
|
+
name: name,
|
114
|
+
text: description
|
115
|
+
}
|
116
|
+
end
|
117
|
+
|
118
|
+
# gets a header's description from the store
|
119
|
+
def get_header(name)
|
120
|
+
header = self.headers.select { |h| h[:name] == name }.first
|
121
|
+
|
122
|
+
return nil if header.nil?
|
123
|
+
|
124
|
+
return header[:text]
|
125
|
+
end
|
126
|
+
|
127
|
+
def to_hash
|
128
|
+
return {
|
129
|
+
route: self.route,
|
130
|
+
params: self.params,
|
131
|
+
headers: self.headers,
|
132
|
+
doc: self.doc,
|
133
|
+
responses: self.responses,
|
134
|
+
http_method: self.http_method
|
135
|
+
}
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
data/lib/parser.rb
ADDED
@@ -0,0 +1,158 @@
|
|
1
|
+
module Rain
|
2
|
+
class Parser
|
3
|
+
attr_accessor :type, :current_line
|
4
|
+
|
5
|
+
@@title_regex = /{title (.*?)}/m
|
6
|
+
@@route_regex = /{route (.*?)}/m
|
7
|
+
@@response_regex = /{response (.*?) (.*?)}/m
|
8
|
+
@@param_regex = /{param (.*?) (.*?)}/m
|
9
|
+
@@param_regex_default = /{param (.*?) (.*?) (.*?)}/m
|
10
|
+
@@method_regex = /(GET|PUT|POST|DELETE|PATCH|HEAD)/
|
11
|
+
|
12
|
+
def initialize(type)
|
13
|
+
self.type = type
|
14
|
+
end
|
15
|
+
|
16
|
+
# parses the current line, determining which tag
|
17
|
+
# the line contains and returning the result
|
18
|
+
# accordingly in a hash with the tag type
|
19
|
+
def parse(line)
|
20
|
+
# return nil if there is no # on the line for ruby.
|
21
|
+
return nil if self.type == :RUBY && !line.strip().start_with?('#')
|
22
|
+
|
23
|
+
# strip blanks and # from the current line
|
24
|
+
line = strip_current_line(line)
|
25
|
+
|
26
|
+
# convert blank lines to new lines
|
27
|
+
if line == ""
|
28
|
+
line = "\n"
|
29
|
+
end
|
30
|
+
|
31
|
+
# title tag
|
32
|
+
if is_title?(line)
|
33
|
+
return {
|
34
|
+
tag: :title,
|
35
|
+
title: extract_title(line)
|
36
|
+
}
|
37
|
+
end
|
38
|
+
|
39
|
+
# method tag
|
40
|
+
if is_method?(line)
|
41
|
+
return {
|
42
|
+
tag: :method,
|
43
|
+
method: extract_method(line)
|
44
|
+
}
|
45
|
+
end
|
46
|
+
|
47
|
+
# route tag
|
48
|
+
if is_route?(line)
|
49
|
+
return {
|
50
|
+
tag: :route,
|
51
|
+
route: extract_route(line)
|
52
|
+
}
|
53
|
+
end
|
54
|
+
|
55
|
+
# response tag. must determine whether to open the tag
|
56
|
+
# for extra docs or close it
|
57
|
+
if is_response?(line)
|
58
|
+
open = line.start_with?('{/response') ? false : true
|
59
|
+
return {
|
60
|
+
tag: :response,
|
61
|
+
code: extract_response_code(line),
|
62
|
+
open: open,
|
63
|
+
id: extract_response_id(line)
|
64
|
+
}
|
65
|
+
end
|
66
|
+
|
67
|
+
# param tag. must determine whether to open the tag
|
68
|
+
# for extra docs or close it
|
69
|
+
if is_param?(line)
|
70
|
+
open = line.start_with?('{/param') ? false : true
|
71
|
+
return {
|
72
|
+
tag: :param,
|
73
|
+
name: extract_param_name(line),
|
74
|
+
type: extract_param_type(line),
|
75
|
+
default: extract_param_default(line),
|
76
|
+
open: open
|
77
|
+
}
|
78
|
+
end
|
79
|
+
|
80
|
+
# return simple doc line if no tags fit
|
81
|
+
return {
|
82
|
+
tag: :doc,
|
83
|
+
text: line
|
84
|
+
}
|
85
|
+
end
|
86
|
+
|
87
|
+
# remove any extra spaces from the current line
|
88
|
+
# and remove the comma # at the start of the
|
89
|
+
# line if the parser is for a ruby file
|
90
|
+
def strip_current_line(line)
|
91
|
+
line.strip!
|
92
|
+
|
93
|
+
# check the current type and if ruby, remove the #
|
94
|
+
if self.type == :RUBY
|
95
|
+
line.sub!('#', '')
|
96
|
+
line.strip!
|
97
|
+
end
|
98
|
+
|
99
|
+
return line
|
100
|
+
end
|
101
|
+
|
102
|
+
def is_title?(line)
|
103
|
+
line.start_with? '{title'
|
104
|
+
end
|
105
|
+
|
106
|
+
def extract_title(line)
|
107
|
+
line[@@title_regex, 1]
|
108
|
+
end
|
109
|
+
|
110
|
+
def is_method?(line)
|
111
|
+
line.start_with? '{method'
|
112
|
+
end
|
113
|
+
|
114
|
+
def extract_method(line)
|
115
|
+
line[@@method_regex, 1]
|
116
|
+
end
|
117
|
+
|
118
|
+
def is_route?(line)
|
119
|
+
line.start_with? '{route'
|
120
|
+
end
|
121
|
+
|
122
|
+
def extract_route(line)
|
123
|
+
line[@@route_regex, 1]
|
124
|
+
end
|
125
|
+
|
126
|
+
def is_response?(line)
|
127
|
+
line.start_with?('{response') || line.start_with?('{/response')
|
128
|
+
end
|
129
|
+
|
130
|
+
def extract_response_code(line)
|
131
|
+
line[@@response_regex, 1]
|
132
|
+
end
|
133
|
+
|
134
|
+
def extract_response_id(line)
|
135
|
+
line[@@response_regex, 2]
|
136
|
+
end
|
137
|
+
|
138
|
+
def is_param?(line)
|
139
|
+
line.start_with?('{param') || line.start_with?('{/param')
|
140
|
+
end
|
141
|
+
|
142
|
+
def extract_param_name(line)
|
143
|
+
line[@@param_regex, 1]
|
144
|
+
end
|
145
|
+
|
146
|
+
def extract_param_type(line)
|
147
|
+
if line[@@param_regex_default, 2].nil?
|
148
|
+
return line[@@param_regex, 2]
|
149
|
+
end
|
150
|
+
|
151
|
+
return line[@@param_regex_default, 2]
|
152
|
+
end
|
153
|
+
|
154
|
+
def extract_param_default(line)
|
155
|
+
line[@@param_regex_default, 3]
|
156
|
+
end
|
157
|
+
end
|
158
|
+
end
|
data/lib/rain.rb
ADDED
@@ -0,0 +1,83 @@
|
|
1
|
+
require 'thor'
|
2
|
+
require 'erb'
|
3
|
+
require 'ostruct'
|
4
|
+
require 'fileutils'
|
5
|
+
|
6
|
+
class Rain::CLI < Thor
|
7
|
+
@@docs = []
|
8
|
+
|
9
|
+
desc "generate [file/sources/**]", "Generates the rain documentation"
|
10
|
+
method_option :log_parse, aliases: "--lp", desc: "Show the output of each line parse"
|
11
|
+
def generate(*sources)
|
12
|
+
print "Rain is parsing files in the directories #{sources} \n"
|
13
|
+
|
14
|
+
# loop through all of the file sources and generate docs
|
15
|
+
sources.each do |source|
|
16
|
+
print "Parsing #{source} \n"
|
17
|
+
@doc = Rain::Doc.new(source, File.read(Dir.pwd + "/#{source}"), options[:log_parse])
|
18
|
+
@doc.parse
|
19
|
+
|
20
|
+
@@docs << @doc
|
21
|
+
end
|
22
|
+
|
23
|
+
print "\nBuilding html output... \n"
|
24
|
+
build_html
|
25
|
+
end
|
26
|
+
|
27
|
+
# define the ascii art for the help command
|
28
|
+
desc "help", "Shows rain help documentation"
|
29
|
+
def help
|
30
|
+
print " _ \n"
|
31
|
+
print " _( )_ \n"
|
32
|
+
print " _( )_ \n"
|
33
|
+
print " (_________) \n"
|
34
|
+
print " \\ \\ \\ \\ \n"
|
35
|
+
print " \\ \\ \\ \\ \n"
|
36
|
+
print " \n"
|
37
|
+
print "---- RAIN ----\n"
|
38
|
+
print " \n"
|
39
|
+
print "basic usage:\n"
|
40
|
+
print " rain generate file/**/*.rb\n"
|
41
|
+
end
|
42
|
+
|
43
|
+
no_commands do
|
44
|
+
def build_html
|
45
|
+
|
46
|
+
# delete the old output files and create the dir
|
47
|
+
FileUtils.rm_rf('./rain_out')
|
48
|
+
Dir.mkdir('./rain_out')
|
49
|
+
Dir.mkdir('./rain_out/css')
|
50
|
+
|
51
|
+
# copy the template css to the output dir
|
52
|
+
FileUtils.cp_r './templates/css/.', './rain_out/css'
|
53
|
+
|
54
|
+
# load the templates
|
55
|
+
layout_template = File.read('./templates/layout.erb')
|
56
|
+
doc_template = File.read('./templates/doc.erb')
|
57
|
+
|
58
|
+
# load the doc properties and parts into the doc template
|
59
|
+
@@docs.each do |doc|
|
60
|
+
|
61
|
+
# create an openstruct from the current doc and render into the template
|
62
|
+
doc_os = OpenStruct.new(doc.to_hash)
|
63
|
+
|
64
|
+
doc_rendered = ERB.new(doc_template).result(doc_os.instance_eval {binding})
|
65
|
+
|
66
|
+
# create a struct with the rendered doc output then render into the layout
|
67
|
+
layout_os = OpenStruct.new({ doc_output: doc_rendered, title: doc_os.title })
|
68
|
+
html = ERB.new(layout_template).result(layout_os.instance_eval {binding})
|
69
|
+
|
70
|
+
# write the html to a file
|
71
|
+
output_html(doc, html)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def output_html(doc, html)
|
76
|
+
# replace file_name extenstions with .html
|
77
|
+
file_name = File.basename(doc.file_name, doc.file_ext) + '.html'
|
78
|
+
|
79
|
+
# write the output to the file
|
80
|
+
File.open("./rain_out/#{file_name}", 'w') { |file| file.write(html) }
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
data/templates/doc.erb
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
<!-- loop through all of the doc parts for the doc and render output -->
|
2
|
+
<% parts.each do |part| %>
|
3
|
+
|
4
|
+
<!-- HTTP method and route (if both specified) -->
|
5
|
+
<% if !part[:route].nil? && !part[:http_method].nil? %>
|
6
|
+
<p><strong><%= part[:http_method] %></strong> <%= part[:route] %></p>
|
7
|
+
<% end %>
|
8
|
+
|
9
|
+
<!-- display all of the docs together for the part -->
|
10
|
+
<% part[:doc].each do |doc| %>
|
11
|
+
<p><%= doc %></p>
|
12
|
+
<% end %>
|
13
|
+
|
14
|
+
<!-- show all of the params in a table -->
|
15
|
+
<% if part[:params].length > 0 %>
|
16
|
+
<h4>Parameters</h4>
|
17
|
+
<table class="u-full-width">
|
18
|
+
<thead>
|
19
|
+
<tr>
|
20
|
+
<th>Name</th>
|
21
|
+
<th>Type</th>
|
22
|
+
<th>Default</th>
|
23
|
+
<th>Description</th>
|
24
|
+
</tr>
|
25
|
+
</thead>
|
26
|
+
<% part[:params].each do |param| %>
|
27
|
+
<tr>
|
28
|
+
<td><%= param[:name] %></td>
|
29
|
+
<td><%= param[:type] %></td>
|
30
|
+
<td><%= param[:default].nil? ? 'N/A' : param[:default] %></td>
|
31
|
+
<td><%= param[:text] %></td>
|
32
|
+
</tr>
|
33
|
+
<% end %>
|
34
|
+
</table>
|
35
|
+
<% end %>
|
36
|
+
|
37
|
+
<!-- show all of the responses with examples -->
|
38
|
+
<% if part[:responses].length > 0 %>
|
39
|
+
<h4>Response Examples</h4>
|
40
|
+
<% part[:responses].each do |response| %>
|
41
|
+
<p><strong><%= response[:code] %></strong> <%= response[:id].upcase %></p>
|
42
|
+
<pre><code><%= response[:text].join("\n") %></code></pre>
|
43
|
+
<% end %>
|
44
|
+
<% end %>
|
45
|
+
<% end %>
|
@@ -0,0 +1,15 @@
|
|
1
|
+
<html>
|
2
|
+
<head>
|
3
|
+
<title>Rain | <%= title %></title>
|
4
|
+
<link rel="stylesheet" type="text/css" href="css/normalize.css" />
|
5
|
+
<link rel="stylesheet" type="text/css" href="css/skeleton.css" />
|
6
|
+
</head>
|
7
|
+
<body>
|
8
|
+
<div class="container">
|
9
|
+
<div class="twelve columns" style="padding: 20px 0">
|
10
|
+
<h2><%= title %></h2>
|
11
|
+
<%= doc_output %>
|
12
|
+
</div>
|
13
|
+
</div>
|
14
|
+
</body>
|
15
|
+
</html>
|
metadata
ADDED
@@ -0,0 +1,101 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rain-doc
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Martin Brennan
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-12-17 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rspec
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 3.1.0
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 3.1.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: guard-rspec
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 4.5.0
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 4.5.0
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: thor
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 0.19.1
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 0.19.1
|
55
|
+
description: "The aim of rain is to generate beautiful API documentation from a ruby
|
56
|
+
comment syntax with markdown mixed in. \n The documentation can
|
57
|
+
be inline in .rb files, or separate .md or .txt files for overall architecture documentation.
|
58
|
+
\ Rain also allows a large amount of customization when it comes
|
59
|
+
to templating and appearance of the API documentation. Branding
|
60
|
+
and unity of documentation appearance is important and rain offers a simple ebr-based
|
61
|
+
template system."
|
62
|
+
email: mjrbrennan@gmail.com
|
63
|
+
executables:
|
64
|
+
- raindoc
|
65
|
+
extensions: []
|
66
|
+
extra_rdoc_files: []
|
67
|
+
files:
|
68
|
+
- bin/raindoc
|
69
|
+
- lib/doc.rb
|
70
|
+
- lib/doc_part.rb
|
71
|
+
- lib/parser.rb
|
72
|
+
- lib/rain.rb
|
73
|
+
- templates/doc.erb
|
74
|
+
- templates/layout.erb
|
75
|
+
homepage: http://martin-brennan.github.io/rain/
|
76
|
+
licenses:
|
77
|
+
- MIT
|
78
|
+
metadata: {}
|
79
|
+
post_install_message: Rain installed successfully! Run rain generate file/paths/*.rb
|
80
|
+
to get started.
|
81
|
+
rdoc_options: []
|
82
|
+
require_paths:
|
83
|
+
- lib
|
84
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - ">="
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: '0'
|
89
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
90
|
+
requirements:
|
91
|
+
- - ">="
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
94
|
+
requirements: []
|
95
|
+
rubyforge_project:
|
96
|
+
rubygems_version: 2.4.2
|
97
|
+
signing_key:
|
98
|
+
specification_version: 4
|
99
|
+
summary: Rain is a gem to generate beautiful and customizable API documentation, inspired
|
100
|
+
by yard and rdoc.
|
101
|
+
test_files: []
|