grape-doc 0.5.1 → 0.6.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.
- checksums.yaml +4 -4
- data/VERSION +1 -1
- data/grape-doc.gemspec +1 -1
- data/lib/grape/doc/doc_class/header.rb +26 -18
- data/lib/grape/doc/doc_class.rb +10 -0
- data/lib/grape/doc/generator.rb +79 -63
- metadata +6 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2663f1be3ceff0b795fab8fd8b6b7ade751ae9b9
|
4
|
+
data.tar.gz: 0a3c33f2094b71b751ab3b7e6b03a42cbcfeb92a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4ac309e0dca87872ad31477a9bd2c9009c7b556165a99b9d07911f334b7594fc146b78b895460a23fcb260f07f3e1794ba88f8069945dad0796dbb21811cb6e8
|
7
|
+
data.tar.gz: 7b2d9c0e55d506ba5101b58f601da249895265ae450c672e5370d5b8c1bedbd53d5d5d3b885ce309136c13be71fe0745a7ec1c0eca8d05e0b8d8b40b96b88afa
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.6.0
|
data/grape-doc.gemspec
CHANGED
@@ -1,25 +1,34 @@
|
|
1
1
|
module GrapeDoc
|
2
2
|
class ApiDocParts
|
3
3
|
|
4
|
-
|
5
|
-
class << self
|
6
|
-
|
7
|
-
def add_header(header_obj)
|
8
|
-
if [H1,H2].include? header_obj.class
|
9
|
-
(@headers ||= []).push(header_obj)
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
def create_toc
|
14
|
-
@headers.map { |header_obj|
|
15
|
-
[
|
16
|
-
'*' * header_obj.markdown.scan(/\d+$/)[0].to_i,
|
17
|
-
" \"#{header_obj.to_s}\":##{header_obj.instance_variable_get(:@opts)['id']}"
|
18
|
-
].join
|
19
|
-
}.join("\n") + "\n\n"
|
20
|
-
end
|
4
|
+
class TOC
|
21
5
|
|
6
|
+
def headers
|
7
|
+
@headers ||= []
|
22
8
|
end
|
9
|
+
|
10
|
+
def initialize(*args)
|
11
|
+
headers.push(*args)
|
12
|
+
end
|
13
|
+
|
14
|
+
def add_header(header_obj)
|
15
|
+
headers.push(header_obj)
|
16
|
+
end
|
17
|
+
|
18
|
+
def to_textile
|
19
|
+
headers.map { |header_obj|
|
20
|
+
[
|
21
|
+
'*' * header_obj.markdown.scan(/\d+$/)[0].to_i,
|
22
|
+
" \"#{header_obj.to_s}\":##{header_obj.instance_variable_get(:@opts)['id']}"
|
23
|
+
].join
|
24
|
+
}.join("\n") + "\n\n"
|
25
|
+
end
|
26
|
+
|
27
|
+
def clear
|
28
|
+
headers.clear
|
29
|
+
end
|
30
|
+
|
31
|
+
|
23
32
|
end
|
24
33
|
|
25
34
|
class H1 < StringObject
|
@@ -27,7 +36,6 @@ module GrapeDoc
|
|
27
36
|
def initialize(*args)
|
28
37
|
super
|
29
38
|
@opts['id']= SecureRandom.uuid
|
30
|
-
TOC.add_header(self)
|
31
39
|
end
|
32
40
|
|
33
41
|
end
|
data/lib/grape/doc/doc_class.rb
CHANGED
@@ -11,6 +11,16 @@ module GrapeDoc
|
|
11
11
|
self.push(create(type,*args))
|
12
12
|
end
|
13
13
|
|
14
|
+
def add_toc(*args)
|
15
|
+
@toc_added ||= ->{
|
16
|
+
|
17
|
+
args.map!{|e| Helpers.constantize("GrapeDoc::ApiDocParts::#{Helpers.camelize(e)}") }
|
18
|
+
self.insert(1,ApiDocParts::TOC.new(*self.select{|e| args.any?{|klass| e.class == klass }}))
|
19
|
+
true
|
20
|
+
|
21
|
+
}.call
|
22
|
+
end
|
23
|
+
|
14
24
|
def to_textile
|
15
25
|
require 'RedCloth'
|
16
26
|
RedCloth.new(self.map{|e| e.respond_to?(:to_textile) ? e.to_textile : e.to_s }.join("\n\n"))
|
data/lib/grape/doc/generator.rb
CHANGED
@@ -4,11 +4,11 @@ module GrapeDoc
|
|
4
4
|
|
5
5
|
attr_reader :options
|
6
6
|
def initialize(opts={})
|
7
|
-
|
7
|
+
|
8
8
|
raise(ArgumentError,'invalid options given') unless opts.class <= Hash
|
9
9
|
@options = {
|
10
|
-
|
11
|
-
|
10
|
+
'format' => 'html',
|
11
|
+
'path' => File.join(Helpers.doc_folder_path,'api_doc')
|
12
12
|
}.merge(opts.reduce({}){|m,o| m.merge!(o[0].to_s => o[1]) ;m})
|
13
13
|
self.options['path'] = self.options['path'].to_s.sub(/\..*$/,'')
|
14
14
|
|
@@ -18,10 +18,6 @@ module GrapeDoc
|
|
18
18
|
|
19
19
|
end
|
20
20
|
|
21
|
-
def document
|
22
|
-
@api_doc ||= ApiDocumentation.new
|
23
|
-
end
|
24
|
-
|
25
21
|
def save
|
26
22
|
|
27
23
|
case @options['format'].to_s.downcase
|
@@ -42,103 +38,123 @@ module GrapeDoc
|
|
42
38
|
|
43
39
|
private
|
44
40
|
|
41
|
+
def document
|
42
|
+
@api_doc ||= ApiDocumentation.new
|
43
|
+
end
|
44
|
+
|
45
45
|
def process_head
|
46
46
|
document.add :h1, "Rest Api Documentation (#{RackTestPoc.root.split(File::Separator)[-1]})"
|
47
47
|
end
|
48
48
|
|
49
49
|
def process_table_of_content
|
50
|
-
|
51
|
-
document.insert 1, ApiDocParts::TOC.create_toc
|
50
|
+
document.add_toc :h1,:h2
|
52
51
|
end
|
53
52
|
|
54
53
|
def process_endpoints
|
55
54
|
|
55
|
+
routes_var = []
|
56
|
+
|
56
57
|
# Iterates over all subclasses (direct and indirect)
|
57
58
|
Helpers.each_grape_class do |rest_api_model|
|
58
59
|
rest_api_model.routes.each do |route|
|
59
|
-
|
60
60
|
next if route.route_path =~ /\(\.:format\)\(\.:format\)$/
|
61
|
+
routes_var.push(route)
|
62
|
+
end
|
63
|
+
end
|
61
64
|
|
62
|
-
|
63
|
-
document.add :h3, 'Request'
|
64
|
-
document.add :h4, 'description'
|
65
|
-
var = case route.route_description
|
65
|
+
routes_var.uniq.each do |route|
|
66
66
|
|
67
|
-
|
68
|
-
|
67
|
+
document.add :h2, "#{route.route_method.to_s.upcase}: #{route.route_path}"
|
68
|
+
document.add :h3, 'Request'
|
69
|
+
document.add :h4, 'description'
|
70
|
+
var = case route.route_description
|
69
71
|
|
70
|
-
|
71
|
-
|
72
|
+
when Hash
|
73
|
+
(route.route_description.find{ |k,v| k == 'desc' || k == :desc } || [])[1] || ''
|
72
74
|
|
73
|
-
|
74
|
-
|
75
|
+
when Array
|
76
|
+
route.route_description
|
75
77
|
|
76
|
-
|
78
|
+
else
|
79
|
+
route.route_description.to_s
|
77
80
|
|
78
|
-
|
81
|
+
end
|
79
82
|
|
80
|
-
|
81
|
-
document.add :h4, 'params'
|
83
|
+
document.add :list,[*var]
|
82
84
|
|
83
|
-
|
84
|
-
|
85
|
-
document.create(:text,key.to_s,:bold),
|
86
|
-
document.create(:list,value.map{ |k,v| "#{k}: #{v}" })
|
87
|
-
]
|
85
|
+
if route.route_params.length > 0
|
86
|
+
document.add :h4, 'params'
|
88
87
|
|
89
|
-
|
88
|
+
route.route_params.each do |key,value|
|
89
|
+
document.add :list,[
|
90
|
+
document.create(:text,key.to_s,:bold),
|
91
|
+
document.create(:list,value.map{ |k,v| "#{k}: #{v}" })
|
92
|
+
]
|
90
93
|
|
91
94
|
end
|
92
95
|
|
93
|
-
|
94
|
-
@poc_data ||= Helpers.poc_data
|
95
|
-
if @poc_data && @poc_data.find{|k,v| k =~ /^#{route_path_var}/ }
|
96
|
-
route_method_var = route.route_method.to_s.upcase
|
96
|
+
end
|
97
97
|
|
98
|
-
|
99
|
-
|
100
|
-
|
98
|
+
route_path_var = route.route_path.to_s.sub(/\(\.:format\)$/,'')
|
99
|
+
@poc_data ||= Helpers.poc_data
|
100
|
+
if @poc_data && @poc_data.find{|k,v| k =~ /^#{route_path_var}/ }
|
101
|
+
route_method_var = route.route_method.to_s.upcase
|
101
102
|
|
102
|
-
|
103
|
-
|
103
|
+
poc_cases = @poc_data.select{|k,v|
|
104
|
+
k =~ /^#{route_path_var}\.?/ && v.keys.include?(route_method_var)
|
105
|
+
}
|
104
106
|
|
105
|
-
|
106
|
-
|
107
|
+
document.add :h3,'Response'
|
108
|
+
document.add :h4,'Example(s)'
|
107
109
|
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
"#{poc_path}?","#{poc_opts['request']['query']['raw']}\" ",
|
114
|
-
poc_opts['request']['headers'].map{|k,v| "-H \"#{k}: #{v}\"" }.join(' ')
|
115
|
-
].join
|
110
|
+
poc_cases.each do |poc_path,poc_data|
|
111
|
+
poc_examples = poc_data[route_method_var] || next
|
112
|
+
poc_examples.each_with_index do |poc_opts,i|
|
113
|
+
i = i + 1
|
114
|
+
begin
|
116
115
|
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
116
|
+
document.add :h5,"#{i}. curl sample"
|
117
|
+
document.add :raw,[
|
118
|
+
"$ curl ",
|
119
|
+
"-X #{route_method_var} ",
|
120
|
+
"\"http://#{ -> { poc_opts['response']['headers']['HTTP_HOST'] rescue 'example.org' }.call}",
|
121
|
+
"#{poc_path}?","#{poc_opts['request']['query']['raw']}\" ",
|
122
|
+
poc_opts['request']['headers'].map{|k,v| "-H \"#{k}: #{v}\"" }.join(' ')
|
123
|
+
].join
|
121
124
|
|
122
|
-
|
123
|
-
|
125
|
+
document.add :list,[
|
126
|
+
"status code: #{poc_opts['response']['status']}",
|
127
|
+
"format type: #{poc_opts['response']['format']}"
|
128
|
+
]
|
124
129
|
|
125
|
-
|
130
|
+
document.add :h5,'Response Body'
|
126
131
|
|
127
|
-
document.add
|
128
|
-
|
129
|
-
Parser.typer(poc_opts['response']['body'])
|
130
|
-
) rescue Parser.typer(poc_opts['response']['body'])
|
132
|
+
document.add(:h6,'Raw version')
|
133
|
+
document.add(:raw,poc_opts['response']['body']['raw'])
|
131
134
|
|
132
|
-
|
135
|
+
if JSON.respond_to?(:pretty_generate)
|
133
136
|
|
137
|
+
document.add(:h6,'json formatted body with Class types')
|
138
|
+
pretty_object = JSON.pretty_generate(
|
139
|
+
Parser.typer(poc_opts['response']['body']['object'])
|
140
|
+
) rescue Parser.typer(poc_opts['response']['body']['object'])
|
134
141
|
|
135
|
-
|
142
|
+
document.add(:raw,pretty_object)
|
143
|
+
|
144
|
+
end
|
136
145
|
|
146
|
+
if poc_opts['response']['body']['description']
|
147
|
+
document.add(:h6,'Yaml formatted body with descriptions')
|
148
|
+
document.add(:raw,poc_opts['response']['body']['description'].to_yaml)
|
149
|
+
end
|
137
150
|
|
151
|
+
rescue
|
152
|
+
end
|
138
153
|
end
|
139
|
-
|
140
154
|
end
|
155
|
+
|
141
156
|
end
|
157
|
+
|
142
158
|
end
|
143
159
|
|
144
160
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: grape-doc
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Adam Luzsi
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-11-
|
11
|
+
date: 2014-11-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -98,16 +98,16 @@ dependencies:
|
|
98
98
|
name: rack-test-poc
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
|
-
- -
|
101
|
+
- - ">="
|
102
102
|
- !ruby/object:Gem::Version
|
103
|
-
version:
|
103
|
+
version: 3.0.0
|
104
104
|
type: :runtime
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
|
-
- -
|
108
|
+
- - ">="
|
109
109
|
- !ruby/object:Gem::Version
|
110
|
-
version:
|
110
|
+
version: 3.0.0
|
111
111
|
description: " Documentation generator for Grape module compatible with Redmine/textile
|
112
112
|
and Html formats "
|
113
113
|
email:
|