apiculture 0.1.1 → 0.1.6
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 +5 -5
- data/.travis.yml +5 -7
- data/apiculture.gemspec +3 -3
- data/gemfiles/Gemfile.rack-1.x +1 -1
- data/gemfiles/Gemfile.rack-2.x +1 -1
- data/lib/apiculture.rb +1 -1
- data/lib/apiculture/app.rb +1 -1
- data/lib/apiculture/app_documentation_tpl.mustache +2 -2
- data/lib/apiculture/method_documentation.rb +10 -5
- data/lib/apiculture/version.rb +1 -1
- data/spec/apiculture/app_documentation_spec.rb +34 -26
- data/spec/apiculture/method_documentation_spec.rb +5 -5
- metadata +11 -18
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: be857ef48fe8ec836d116ed89ed39c2cf55d2d60e4a25ae81eab0ccdf2b05f36
|
4
|
+
data.tar.gz: 737058ecf04cb0af193c24438f7c3a96c16a2551079aa13f4bcfbed2afa14fe8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 39564495733b83ca4ce0e1963b470d9836e5ce549827f93689bebfe4f5f8e57fb368497a407142f1c6c78143ad6c56a6a5a4f74ba29bdf199704bce58d720885
|
7
|
+
data.tar.gz: 6c1e15fe7e3c009349d17cf59d5686b81ccc6e6c94724a89b343b404afd3c013ee8505bebe75c3228774215f7065c1faf11872589de6e6b78abafe8d462f78f7
|
data/.travis.yml
CHANGED
@@ -2,12 +2,10 @@ gemfile:
|
|
2
2
|
- gemfiles/Gemfile.rack-1.x
|
3
3
|
- gemfiles/Gemfile.rack-2.x
|
4
4
|
rvm:
|
5
|
-
- 2.3
|
6
|
-
- 2.4
|
7
|
-
- 2.5
|
8
|
-
- 2.6
|
5
|
+
- 2.3
|
6
|
+
- 2.4
|
7
|
+
- 2.5
|
8
|
+
- 2.6
|
9
|
+
- 2.7
|
9
10
|
sudo: false
|
10
11
|
cache: bundler
|
11
|
-
matrix:
|
12
|
-
allow_failures:
|
13
|
-
- rvm: 2.6.0-preview1
|
data/apiculture.gemspec
CHANGED
@@ -36,13 +36,13 @@ Gem::Specification.new do |s|
|
|
36
36
|
s.add_runtime_dependency 'mustermann', '~> 1'
|
37
37
|
s.add_runtime_dependency 'builder', '~> 3'
|
38
38
|
s.add_runtime_dependency 'rdiscount', '~> 2'
|
39
|
-
s.add_runtime_dependency 'github-markup', '~>
|
39
|
+
s.add_runtime_dependency 'github-markup', '~> 3'
|
40
40
|
s.add_runtime_dependency 'mustache', '~> 1'
|
41
41
|
|
42
42
|
s.add_development_dependency 'rack-test'
|
43
|
-
s.add_development_dependency "rspec", "~> 3
|
43
|
+
s.add_development_dependency "rspec", "~> 3"
|
44
44
|
s.add_development_dependency "rdoc", "~> 6.0"
|
45
|
-
s.add_development_dependency "rake"
|
45
|
+
s.add_development_dependency "rake"
|
46
46
|
s.add_development_dependency "bundler", "~> 1.0"
|
47
47
|
s.add_development_dependency "simplecov", ">= 0"
|
48
48
|
end
|
data/gemfiles/Gemfile.rack-1.x
CHANGED
data/gemfiles/Gemfile.rack-2.x
CHANGED
data/lib/apiculture.rb
CHANGED
@@ -8,6 +8,7 @@ module Apiculture
|
|
8
8
|
require_relative 'apiculture/action_definition'
|
9
9
|
require_relative 'apiculture/markdown_segment'
|
10
10
|
require_relative 'apiculture/timestamp_promise'
|
11
|
+
require_relative 'apiculture/app_documentation'
|
11
12
|
|
12
13
|
def self.extended(in_class)
|
13
14
|
in_class.send(:include, SinatraInstanceMethods)
|
@@ -202,7 +203,6 @@ module Apiculture
|
|
202
203
|
# MyApi.api_documentation.to_markdown #=> "..."
|
203
204
|
# MyApi.api_documentation.to_html #=> "..."
|
204
205
|
def api_documentation
|
205
|
-
require_relative 'apiculture/app_documentation'
|
206
206
|
AppDocumentation.new(self, @apiculture_mounted_at.to_s, @apiculture_actions_and_docs || [])
|
207
207
|
end
|
208
208
|
|
data/lib/apiculture/app.rb
CHANGED
@@ -102,7 +102,7 @@ class Apiculture::App
|
|
102
102
|
end
|
103
103
|
|
104
104
|
def perform_action_block(&blk)
|
105
|
-
#
|
105
|
+
# Executes the action in a Sinatra-like fashion - passing the route parameter values as
|
106
106
|
# arguments to the given block/callable. This is where in the future we should ditch
|
107
107
|
# the Sinatra calling conventions - Sinatra mandates that the action accept the route parameters
|
108
108
|
# as arguments and grab all the useful stuff from instance methods like `params` etc. whereas
|
@@ -1,4 +1,6 @@
|
|
1
1
|
require 'builder'
|
2
|
+
require 'rdiscount'
|
3
|
+
|
2
4
|
# Generates Markdown/HTML documentation about a single API action.
|
3
5
|
#
|
4
6
|
# Formats route parameters and request/QS parameters as a neat HTML
|
@@ -26,12 +28,15 @@ class Apiculture::MethodDocumentation
|
|
26
28
|
|
27
29
|
# Compose an HTML string by converting the result of +to_markdown+
|
28
30
|
def to_html_fragment
|
29
|
-
|
30
|
-
RDiscount.new(to_markdown).to_html
|
31
|
+
markdown_string_to_html(to_markdown)
|
31
32
|
end
|
32
33
|
|
33
34
|
private
|
34
35
|
|
36
|
+
def markdown_string_to_html(str)
|
37
|
+
RDiscount.new(str.to_s).to_html
|
38
|
+
end
|
39
|
+
|
35
40
|
class StringBuf #:nodoc:
|
36
41
|
def initialize; @blocks = []; end
|
37
42
|
def <<(block); @blocks << block.to_s; self; end
|
@@ -59,7 +64,7 @@ class Apiculture::MethodDocumentation
|
|
59
64
|
@definition.route_parameters.each do | param |
|
60
65
|
html.tr do
|
61
66
|
html.td { html.tt(':%s' % param.name) }
|
62
|
-
html.td(param.description)
|
67
|
+
html.td { html << markdown_string_to_html(param.description) }
|
63
68
|
end
|
64
69
|
end
|
65
70
|
end
|
@@ -98,7 +103,7 @@ class Apiculture::MethodDocumentation
|
|
98
103
|
@definition.responses.each do | resp |
|
99
104
|
html.tr do
|
100
105
|
html.td { html.b(resp.http_status_code) }
|
101
|
-
html.td resp.description
|
106
|
+
html.td { html << markdown_string_to_html(resp.description) }
|
102
107
|
html.td { html.pre { html.code(body_example(resp)) }}
|
103
108
|
end
|
104
109
|
end
|
@@ -139,7 +144,7 @@ class Apiculture::MethodDocumentation
|
|
139
144
|
html.td { html.tt(param.name.to_s) }
|
140
145
|
html.td(param.required ? 'Yes' : 'No')
|
141
146
|
html.td(param.matchable.inspect)
|
142
|
-
html.td(param.description
|
147
|
+
html.td { html << markdown_string_to_html(param.description) }
|
143
148
|
end
|
144
149
|
end
|
145
150
|
end
|
data/lib/apiculture/version.rb
CHANGED
@@ -1,28 +1,35 @@
|
|
1
1
|
require_relative '../spec_helper'
|
2
2
|
|
3
3
|
describe "Apiculture.api_documentation" do
|
4
|
-
let(:app)
|
4
|
+
let(:app) do
|
5
5
|
Class.new(Apiculture::App) do
|
6
6
|
extend Apiculture
|
7
|
-
|
7
|
+
|
8
8
|
markdown_string 'This API is very important. Because it has to do with pancakes.'
|
9
|
-
|
9
|
+
|
10
10
|
documentation_build_time!
|
11
|
-
|
11
|
+
|
12
12
|
desc 'Order a pancake'
|
13
|
-
required_param :diameter, "Diameter of the pancake", Integer
|
13
|
+
required_param :diameter, "Diameter of the pancake. The pancake will be **bold**", Integer
|
14
14
|
param :topping, 'Type of topping', String
|
15
|
-
|
15
|
+
pancake_response_info = <<~EOS
|
16
|
+
When the pancake has been baked successfully
|
17
|
+
The pancake will have the following properties:
|
18
|
+
|
19
|
+
* It is going to be round
|
20
|
+
* It is going to be delicious
|
21
|
+
EOS
|
22
|
+
responds_with 200, pancake_response_info, { id: 'abdef..c21' }
|
16
23
|
api_method :post, '/pancakes' do
|
17
24
|
end
|
18
|
-
|
25
|
+
|
19
26
|
desc 'Check the pancake status'
|
20
27
|
route_param :id, 'Pancake ID to check status on'
|
21
|
-
responds_with 200, 'When the pancake is found', {status: 'Baking'}
|
22
|
-
responds_with 404, 'When no such pancake exists', {status: 'No such pancake'}
|
28
|
+
responds_with 200, 'When the pancake is found', { status: 'Baking' }
|
29
|
+
responds_with 404, 'When no such pancake exists', { status: 'No such pancake' }
|
23
30
|
api_method :get, '/pancake/:id' do
|
24
31
|
end
|
25
|
-
|
32
|
+
|
26
33
|
desc 'Throw away the pancake'
|
27
34
|
route_param :id, 'Pancake ID to delete'
|
28
35
|
api_method :delete, '/pancake/:id' do
|
@@ -33,21 +40,21 @@ describe "Apiculture.api_documentation" do
|
|
33
40
|
api_method :get, '/pancake/with/:topping_id' do |topping_id|
|
34
41
|
end
|
35
42
|
end
|
36
|
-
|
37
|
-
|
43
|
+
end
|
44
|
+
|
38
45
|
it 'generates app documentation as HTML without the body element' do
|
39
46
|
docco = app.api_documentation
|
40
47
|
generated_html = docco.to_html_fragment
|
41
|
-
|
48
|
+
|
42
49
|
expect(generated_html).not_to include('<body')
|
43
50
|
expect(generated_html).to include('Pancake ID to check status on')
|
44
51
|
expect(generated_html).to include('Pancake ID to delete')
|
45
52
|
end
|
46
|
-
|
53
|
+
|
47
54
|
it 'generates app documentation in HTML' do
|
48
55
|
docco = app.api_documentation
|
49
56
|
generated_html = docco.to_html
|
50
|
-
|
57
|
+
|
51
58
|
if ENV['SHOW_TEST_DOC']
|
52
59
|
File.open('t.html', 'w') do |f|
|
53
60
|
f.write(generated_html)
|
@@ -55,21 +62,22 @@ describe "Apiculture.api_documentation" do
|
|
55
62
|
`open #{f.path}`
|
56
63
|
end
|
57
64
|
end
|
58
|
-
|
65
|
+
|
59
66
|
expect(generated_html).to include('<body')
|
60
67
|
expect(generated_html).to include('Pancake ID to check status on')
|
61
|
-
expect(generated_html).to include('When the pancake
|
68
|
+
expect(generated_html).to include('When the pancake has been baked successfully')
|
62
69
|
expect(generated_html).to include('"id": "abdef..c21"')
|
70
|
+
expect(generated_html).to end_with("\n")
|
63
71
|
end
|
64
|
-
|
72
|
+
|
65
73
|
it 'generates app documentation in Markdown' do
|
66
74
|
docco = app.api_documentation
|
67
75
|
generated_markdown = docco.to_markdown
|
68
|
-
|
76
|
+
|
69
77
|
expect(generated_markdown).not_to include('<body')
|
70
78
|
expect(generated_markdown).to include('## POST /pancakes')
|
71
79
|
end
|
72
|
-
|
80
|
+
|
73
81
|
it 'generates app documentation honoring the mount point' do
|
74
82
|
overridden = Class.new(Apiculture::App) do
|
75
83
|
extend Apiculture
|
@@ -77,11 +85,11 @@ describe "Apiculture.api_documentation" do
|
|
77
85
|
api_method :get, '/pancakes' do
|
78
86
|
end
|
79
87
|
end
|
80
|
-
|
88
|
+
|
81
89
|
generated_markdown = overridden.api_documentation.to_markdown
|
82
90
|
expect(generated_markdown).to include('## GET /api/v2/pancakes')
|
83
91
|
end
|
84
|
-
|
92
|
+
|
85
93
|
it 'generates app documentation injecting the inline Markdown strings' do
|
86
94
|
app_class = Class.new(Apiculture::App) do
|
87
95
|
extend Apiculture
|
@@ -91,16 +99,16 @@ describe "Apiculture.api_documentation" do
|
|
91
99
|
markdown_string '# This describes even more important stuff'
|
92
100
|
markdown_string 'This is a paragraph'
|
93
101
|
end
|
94
|
-
|
102
|
+
|
95
103
|
generated_html = app_class.api_documentation.to_html
|
96
104
|
expect(generated_html).to include('<h2>GET /pancakes</h2>')
|
97
105
|
expect(generated_html).to include('<h1>This describes even more important stuff')
|
98
106
|
expect(generated_html).to include('<h1>This describes important stuff')
|
99
107
|
expect(generated_html).to include('<p>This is a paragraph')
|
100
108
|
end
|
101
|
-
|
109
|
+
|
102
110
|
context 'with a file containing Markdown that has to be spliced into the docs' do
|
103
|
-
before(:each) { File.open('./TEST.md', 'w') {|f| f << "# This is an important header"} }
|
111
|
+
before(:each) { File.open('./TEST.md', 'w') { |f| f << "# This is an important header" } }
|
104
112
|
after(:each) { File.unlink('./TEST.md') }
|
105
113
|
it 'splices the contents of the file using markdown_file' do
|
106
114
|
app_class = Class.new(Apiculture::App) do
|
@@ -109,7 +117,7 @@ describe "Apiculture.api_documentation" do
|
|
109
117
|
api_method :get, '/pancakes' do
|
110
118
|
end
|
111
119
|
end
|
112
|
-
|
120
|
+
|
113
121
|
generated_html = app_class.api_documentation.to_html
|
114
122
|
expect(generated_html).to include('<h2>GET /pancakes</h2>')
|
115
123
|
expect(generated_html).to include('<h1>This is an important header')
|
@@ -7,7 +7,7 @@ describe Apiculture::MethodDocumentation do
|
|
7
7
|
|
8
8
|
definition.description = "This action bakes pancakes"
|
9
9
|
definition.parameters << Apiculture::Parameter.new(:name, 'Pancake name', true, String, :to_s)
|
10
|
-
definition.parameters << Apiculture::Parameter.new(:thickness, 'Pancake
|
10
|
+
definition.parameters << Apiculture::Parameter.new(:thickness, 'Pancake **thick**ness', false, Float, :to_f)
|
11
11
|
definition.parameters << Apiculture::Parameter.new(:diameter, 'Pancake diameter', false, Integer, :to_i)
|
12
12
|
|
13
13
|
definition.route_parameters << Apiculture::RouteParameter.new(:pan_id, 'ID of the pancake frying pan')
|
@@ -28,9 +28,9 @@ describe Apiculture::MethodDocumentation do
|
|
28
28
|
expect(generated_html).to include('<h3>URL parameters</h3>')
|
29
29
|
expect(generated_html).to include('ID of the pancake frying pan')
|
30
30
|
expect(generated_html).to include('<h3>Request parameters</h3>')
|
31
|
-
expect(generated_html).to include('<
|
32
|
-
expect(generated_html).to include('<
|
33
|
-
expect(generated_html).to include('<
|
31
|
+
expect(generated_html).to include('<p>Pancake name</p>')
|
32
|
+
expect(generated_html).to include('<p>Pancake has been baked</p>')
|
33
|
+
expect(generated_html).to include('<p>Frying pan too cold</p>')
|
34
34
|
end
|
35
35
|
|
36
36
|
it 'generates HTML from an ActionDefinition without route params' do
|
@@ -38,7 +38,7 @@ describe Apiculture::MethodDocumentation do
|
|
38
38
|
|
39
39
|
definition.description = "This action bakes pancakes"
|
40
40
|
definition.parameters << Apiculture::Parameter.new(:name, 'Pancake name', true, String, :to_s)
|
41
|
-
definition.parameters << Apiculture::Parameter.new(:thickness, 'Pancake
|
41
|
+
definition.parameters << Apiculture::Parameter.new(:thickness, 'Pancake **thick**ness', false, Float, :to_f)
|
42
42
|
definition.parameters << Apiculture::Parameter.new(:diameter, 'Pancake diameter', false, Integer, :to_i)
|
43
43
|
|
44
44
|
definition.http_verb = 'get'
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: apiculture
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Julik Tarkhanov
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2021-01-27 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: mustermann
|
@@ -59,14 +59,14 @@ dependencies:
|
|
59
59
|
requirements:
|
60
60
|
- - "~>"
|
61
61
|
- !ruby/object:Gem::Version
|
62
|
-
version: '
|
62
|
+
version: '3'
|
63
63
|
type: :runtime
|
64
64
|
prerelease: false
|
65
65
|
version_requirements: !ruby/object:Gem::Requirement
|
66
66
|
requirements:
|
67
67
|
- - "~>"
|
68
68
|
- !ruby/object:Gem::Version
|
69
|
-
version: '
|
69
|
+
version: '3'
|
70
70
|
- !ruby/object:Gem::Dependency
|
71
71
|
name: mustache
|
72
72
|
requirement: !ruby/object:Gem::Requirement
|
@@ -101,20 +101,14 @@ dependencies:
|
|
101
101
|
requirements:
|
102
102
|
- - "~>"
|
103
103
|
- !ruby/object:Gem::Version
|
104
|
-
version: '3
|
105
|
-
- - "<"
|
106
|
-
- !ruby/object:Gem::Version
|
107
|
-
version: '3.2'
|
104
|
+
version: '3'
|
108
105
|
type: :development
|
109
106
|
prerelease: false
|
110
107
|
version_requirements: !ruby/object:Gem::Requirement
|
111
108
|
requirements:
|
112
109
|
- - "~>"
|
113
110
|
- !ruby/object:Gem::Version
|
114
|
-
version: '3
|
115
|
-
- - "<"
|
116
|
-
- !ruby/object:Gem::Version
|
117
|
-
version: '3.2'
|
111
|
+
version: '3'
|
118
112
|
- !ruby/object:Gem::Dependency
|
119
113
|
name: rdoc
|
120
114
|
requirement: !ruby/object:Gem::Requirement
|
@@ -133,16 +127,16 @@ dependencies:
|
|
133
127
|
name: rake
|
134
128
|
requirement: !ruby/object:Gem::Requirement
|
135
129
|
requirements:
|
136
|
-
- - "
|
130
|
+
- - ">="
|
137
131
|
- !ruby/object:Gem::Version
|
138
|
-
version: '
|
132
|
+
version: '0'
|
139
133
|
type: :development
|
140
134
|
prerelease: false
|
141
135
|
version_requirements: !ruby/object:Gem::Requirement
|
142
136
|
requirements:
|
143
|
-
- - "
|
137
|
+
- - ">="
|
144
138
|
- !ruby/object:Gem::Version
|
145
|
-
version: '
|
139
|
+
version: '0'
|
146
140
|
- !ruby/object:Gem::Dependency
|
147
141
|
name: bundler
|
148
142
|
requirement: !ruby/object:Gem::Requirement
|
@@ -225,8 +219,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
225
219
|
- !ruby/object:Gem::Version
|
226
220
|
version: '0'
|
227
221
|
requirements: []
|
228
|
-
|
229
|
-
rubygems_version: 2.6.11
|
222
|
+
rubygems_version: 3.0.3
|
230
223
|
signing_key:
|
231
224
|
specification_version: 4
|
232
225
|
summary: Sweet API sauce on top of Rack
|