easy_api_doc 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.rdoc +58 -0
- data/Rakefile +40 -0
- data/app/assets/images/easy_api_doc/favicon.ico +0 -0
- data/app/assets/images/easy_api_doc/glyphicons-halflings-white.png +0 -0
- data/app/assets/images/easy_api_doc/glyphicons-halflings.png +0 -0
- data/app/assets/images/easy_api_doc/loading.gif +0 -0
- data/app/assets/javascripts/easy_api_doc/api.js +2 -0
- data/app/assets/javascripts/easy_api_doc/application.js +15 -0
- data/app/assets/javascripts/easy_api_doc/base64.js +65 -0
- data/app/assets/javascripts/easy_api_doc/bootstrap.js +1999 -0
- data/app/assets/javascripts/easy_api_doc/documentation.js +223 -0
- data/app/assets/javascripts/easy_api_doc/status_codes.js +61 -0
- data/app/assets/stylesheets/easy_api_doc/api.css +4 -0
- data/app/assets/stylesheets/easy_api_doc/application.css +13 -0
- data/app/assets/stylesheets/easy_api_doc/bootstrap.css +6805 -0
- data/app/assets/stylesheets/easy_api_doc/documentation.css +47 -0
- data/app/controllers/easy_api_doc/api_controller.rb +13 -0
- data/app/controllers/easy_api_doc/application_controller.rb +17 -0
- data/app/controllers/easy_api_doc/documentation_controller.rb +42 -0
- data/app/helpers/easy_api_doc/application_helper.rb +71 -0
- data/app/helpers/easy_api_doc/documentation_helper.rb +5 -0
- data/app/models/easy_api_doc/action.rb +59 -0
- data/app/models/easy_api_doc/api_version.rb +18 -0
- data/app/models/easy_api_doc/namespace.rb +14 -0
- data/app/models/easy_api_doc/parameter.rb +49 -0
- data/app/models/easy_api_doc/resource.rb +18 -0
- data/app/views/easy_api_doc/api/index.html.erb +5 -0
- data/app/views/easy_api_doc/documentation/_parameter.html.erb +29 -0
- data/app/views/easy_api_doc/documentation/_resource_index.html.erb +16 -0
- data/app/views/easy_api_doc/documentation/api_action.html.erb +105 -0
- data/app/views/easy_api_doc/documentation/namespace.html.erb +13 -0
- data/app/views/easy_api_doc/documentation/resource.html.erb +18 -0
- data/app/views/layouts/easy_api_doc/_header.html.erb +23 -0
- data/app/views/layouts/easy_api_doc/application.html.erb +34 -0
- data/app/views/shared/_versions_index.html.erb +10 -0
- data/config/routes.rb +9 -0
- data/lib/configurable.rb +92 -0
- data/lib/configuration.rb +31 -0
- data/lib/easy_api_doc/engine.rb +5 -0
- data/lib/easy_api_doc/version.rb +3 -0
- data/lib/easy_api_doc.rb +6 -0
- data/test/dummy/README.rdoc +261 -0
- data/test/dummy/Rakefile +7 -0
- data/test/dummy/app/assets/javascripts/application.js +15 -0
- data/test/dummy/app/assets/stylesheets/application.css +13 -0
- data/test/dummy/app/controllers/application_controller.rb +3 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/app/views/layouts/application.html.erb +14 -0
- data/test/dummy/config/application.rb +59 -0
- data/test/dummy/config/boot.rb +10 -0
- data/test/dummy/config/database.yml +25 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +36 -0
- data/test/dummy/config/environments/production.rb +67 -0
- data/test/dummy/config/environments/test.rb +39 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/inflections.rb +15 -0
- data/test/dummy/config/initializers/mime_types.rb +5 -0
- data/test/dummy/config/initializers/secret_token.rb +7 -0
- data/test/dummy/config/initializers/session_store.rb +8 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/test/dummy/config/locales/en.yml +5 -0
- data/test/dummy/config/routes.rb +3 -0
- data/test/dummy/config.ru +4 -0
- data/test/dummy/doc/api_doc.yml +104 -0
- data/test/dummy/log/development.log +742 -0
- data/test/dummy/public/404.html +26 -0
- data/test/dummy/public/422.html +26 -0
- data/test/dummy/public/500.html +25 -0
- data/test/dummy/public/favicon.ico +0 -0
- data/test/dummy/script/rails +6 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/04965396c9cfe69081b5dd98c3212fae +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/16d88b38a506ba01a817e258ad8fb263 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/203aa633656e7d9c927c57c46e470c83 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/2f062b493cefffdbc012a973e9a105d5 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/2f0ed6020953bd16ba9b363edbf7cda0 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/30465ccaba36954861158b4242883bd6 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/36351f369d6eaf233c5e86e07555c170 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/405c9c78a785fb067d1c67657cfc62ef +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/4abfd2becb22be944eb58bcf7107c873 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/4c371d51ee36edfddc4b8428b18dd632 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/4e7b4f8fde8fe12c9c12da639bed576e +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/543e8b4a615c1577865f6ef73059d40f +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/593636db3cefe193ebf65f5b58f57c9a +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/67409083f86d1b03662b495d04418132 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/6afb7fed89c6f68558c4186d7a740a3a +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/6b1110992dffe4c4455380229a0b8dff +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/6db6675fbfed66d3d342f71869217dac +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/75d2dc9028e3a3f3e6ca14d8f2fe7b5e +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/76b036b95dde7edc081890640b4e7ed0 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/76da432edc6235bd7d73c3335233b1ed +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/76faccd1d102ff2260e90ba48328b865 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/7cbc737c6b2b24706bf9170823e12d87 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/7de191b871e66d0c65b1cbaf04a60f58 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/802227e7577d1f42b5991586df8c9f02 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/848e56c99230cfa8034c10a99fc52c28 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/8619cf373138f78fdaab67c14cf6593b +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/8b8f23bb1606d4e7f5738827686ff14f +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/8dde0af325a3c57426da61982576c899 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/92396eadb57dc8abfb0bf5b3a01295a8 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/92a86617e44e9093fb483fc122b75752 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/940b911c55d2dc0ea6ca56b25f087739 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/a39a3034ca0b3e6ae8eaca11c3ca5ad6 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/a8036af98430c82633505d9ca5fcde5f +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/b4869b1ad3dab2a1821989791a57171f +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/b7ad7703003d24dab911bd3730756ca6 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/b89605b311bfb96d01c875e7a9710861 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/c237c4326b837e51c2650d4f6ed7b7a5 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/c780d1da090d4bb4d9fa09753f04e17f +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/ca91101b167a195ab54cdbc39efec3e9 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/cdb61eee371606ef082a5ee3189889d2 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/d86f52fe55c0b5686bacec92537b0c03 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/e9636c04426623ad28848cb917d96a95 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/ee9a7b09a7ab141b6ae0cf8ce9197a3c +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/f0fcdc72564e7709bcdeb9e88dd86135 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/f5bcd46e1a1371d63dec98bc97bcda4c +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/fb3e3925ae8dcb2704d2602719387463 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/fcbbb63c7069e7c3b471d13ff0441d2a +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/ff8858e82d7df03c855d847837676e31 +0 -0
- data/test/test_helper.rb +10 -0
- metadata +291 -0
@@ -0,0 +1,47 @@
|
|
1
|
+
/*
|
2
|
+
Place all the styles related to the matching controller here.
|
3
|
+
They will automatically be included in application.css.
|
4
|
+
*/
|
5
|
+
|
6
|
+
.wrapper {
|
7
|
+
margin-top: 60px;
|
8
|
+
}
|
9
|
+
|
10
|
+
.main h1 { margin-bottom: 0.5em; }
|
11
|
+
|
12
|
+
h1 .label {
|
13
|
+
margin-right: 4px;
|
14
|
+
font-weight: normal;
|
15
|
+
}
|
16
|
+
|
17
|
+
small.pull-right {
|
18
|
+
float: right;
|
19
|
+
}
|
20
|
+
|
21
|
+
.response .output {
|
22
|
+
display: block;
|
23
|
+
width: 98%;
|
24
|
+
min-height: 400px;
|
25
|
+
padding: 13px;
|
26
|
+
}
|
27
|
+
|
28
|
+
table.table tbody tr.strong th {
|
29
|
+
background-color: #eee;
|
30
|
+
}
|
31
|
+
|
32
|
+
.input.additional {
|
33
|
+
display: block;
|
34
|
+
}
|
35
|
+
|
36
|
+
.authenticated .icon {
|
37
|
+
display: inline-block;
|
38
|
+
background: url(/assets/easy_api_doc/glyphicons-halflings.png) -288px -25px no-repeat;
|
39
|
+
|
40
|
+
width: 12px;
|
41
|
+
height: 12px;
|
42
|
+
margin-right: 5px;
|
43
|
+
}
|
44
|
+
|
45
|
+
textarea {
|
46
|
+
width: 350px;
|
47
|
+
}
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module EasyApiDoc
|
2
|
+
class ApplicationController < ActionController::Base
|
3
|
+
|
4
|
+
before_filter :load_versions
|
5
|
+
|
6
|
+
protected
|
7
|
+
|
8
|
+
def load_versions
|
9
|
+
@api_versions = EasyApiDoc::ApiVersion.all
|
10
|
+
end
|
11
|
+
|
12
|
+
def load_config
|
13
|
+
Configuration.load
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module EasyApiDoc
|
2
|
+
class DocumentationController < EasyApiDoc::ApplicationController
|
3
|
+
before_filter :defaults
|
4
|
+
|
5
|
+
def namespace
|
6
|
+
@resources = @namespace.resources
|
7
|
+
end
|
8
|
+
|
9
|
+
def resource
|
10
|
+
@resource = @namespace.resources.find {|r| r.name == params[:resource] }
|
11
|
+
if @resource.nil?
|
12
|
+
raise "no resource #{params[:resource]}"
|
13
|
+
end
|
14
|
+
@actions = @resource.actions
|
15
|
+
end
|
16
|
+
|
17
|
+
def api_action
|
18
|
+
@resource = @namespace.resources.find {|r| r.name == params[:resource] }
|
19
|
+
@action = @resource.actions.find {|a| a.name == params[:api_action] }
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def defaults
|
25
|
+
@api_version = EasyApiDoc::ApiVersion.find(params[:api])
|
26
|
+
@namespace = @api_version.namespaces.find {|ns| ns.name == params[:namespace] }
|
27
|
+
@meta = EasyApiDoc::ApiVersion.config['meta']
|
28
|
+
@app_title = @meta['app_title'] if @meta
|
29
|
+
end
|
30
|
+
# def execute_action
|
31
|
+
# @api_version = EasyApiDoc::ApiVersion.find(params[:api])
|
32
|
+
# @namespace = @api_version.namespaces.find {|ns| ns.name == params[:namespace] }
|
33
|
+
# @resource = @namespace.resources.find {|r| r.name == params[:resource] }
|
34
|
+
# @action = @resource.actions.find {|a| a.name == params[:api_action] }
|
35
|
+
# params[:payload].delete(:authenticity_token)
|
36
|
+
|
37
|
+
# res = @action.run(params[:payload], params[:remote_method], params[:format])
|
38
|
+
# render params[:format].to_sym => res, :status => 200 #res[:status]
|
39
|
+
# end
|
40
|
+
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'github/markup'
|
2
|
+
|
3
|
+
module EasyApiDoc
|
4
|
+
module ApplicationHelper
|
5
|
+
|
6
|
+
def api_link(api)
|
7
|
+
api_path(:id => api.name)
|
8
|
+
end
|
9
|
+
|
10
|
+
def namespace_link(namespace)
|
11
|
+
namespace_path(:api => namespace.parents['apiversion'].name, :namespace => namespace.name)
|
12
|
+
end
|
13
|
+
|
14
|
+
def resource_link(resource)
|
15
|
+
resource_path(:api => resource.parents['apiversion'].name, :namespace => resource.parents['namespace'].name, :resource => resource.name)
|
16
|
+
end
|
17
|
+
|
18
|
+
def action_link(action)
|
19
|
+
api_action_path(:api => action.parents['apiversion'].name, :namespace => action.parents['namespace'].name, :resource => action.parents['resource'].name, :api_action => action.name)
|
20
|
+
end
|
21
|
+
|
22
|
+
def breadcrumbs(stack)
|
23
|
+
crumbs = []
|
24
|
+
stack.each do |name, uri|
|
25
|
+
if uri
|
26
|
+
crumbs << link_to(name, uri)
|
27
|
+
else
|
28
|
+
crumbs << name
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
content_tag(:ol, :class => "breadcrumb") do
|
33
|
+
output = ""
|
34
|
+
crumbs.each do |c|
|
35
|
+
output += content_tag(:li, c, :class => crumbs.last ? 'active' : nil)
|
36
|
+
end
|
37
|
+
output.html_safe
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def contents_for_resource(resource, attribute_name)
|
42
|
+
tree = ['doc', 'api', resource.parents['apiversion'].name, resource.parents['namespace'].name, resource.name]
|
43
|
+
file = File.join(*tree, "#{attribute_name}.md")
|
44
|
+
if File.exists?(file)
|
45
|
+
GitHub::Markup.render(file, File.read(file)).html_safe
|
46
|
+
else
|
47
|
+
resource.attributes[attribute_name]
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def contents_for_action(resource, action, attribute_name)
|
52
|
+
tree = ['doc', 'api', resource.parents['apiversion'].name, resource.parents['namespace'].name, resource.name, action.name]
|
53
|
+
file = File.join(*tree, "#{attribute_name}.md")
|
54
|
+
if File.exists?(file)
|
55
|
+
GitHub::Markup.render(file, File.read(file)).html_safe
|
56
|
+
else
|
57
|
+
action.attributes[attribute_name]
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def example_json(key_json_file)
|
62
|
+
tree = ['doc', 'api', 'examples', 'json']
|
63
|
+
file = File.join(*tree, "#{key_json_file}")
|
64
|
+
if File.exists?(file)
|
65
|
+
File.read(file)
|
66
|
+
else
|
67
|
+
nil
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'net/http'
|
2
|
+
|
3
|
+
module EasyApiDoc
|
4
|
+
class Action
|
5
|
+
include EasyApiDoc::Configurable
|
6
|
+
|
7
|
+
def path
|
8
|
+
uri = attributes['uri']
|
9
|
+
if host
|
10
|
+
"#{protocol}://#{host}#{uri}"
|
11
|
+
else
|
12
|
+
uri
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
# def run(params, method, format)
|
17
|
+
# uri = URI(path + "." + format)
|
18
|
+
# res = Net::HTTP.send(method.downcase, uri) # TODO works with get only
|
19
|
+
# # {:body => res.body, :status => res.status}
|
20
|
+
# res
|
21
|
+
# end
|
22
|
+
|
23
|
+
def parameters
|
24
|
+
@parameters ||= load_children(EasyApiDoc::Parameter, 'parameters')
|
25
|
+
end
|
26
|
+
|
27
|
+
def post_data
|
28
|
+
attributes['post_data']
|
29
|
+
end
|
30
|
+
|
31
|
+
def protocol
|
32
|
+
v = @parents['apiversion']
|
33
|
+
v.attributes['defaults']['protocol'] || 'http'
|
34
|
+
end
|
35
|
+
|
36
|
+
def host
|
37
|
+
v = @parents['apiversion']
|
38
|
+
if v && v.attributes['defaults']
|
39
|
+
v.attributes['defaults']['domain']
|
40
|
+
else
|
41
|
+
nil
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def formats
|
46
|
+
v = inherited_overridable('formats', :from => ['resource', 'namespace'])
|
47
|
+
v.split(/\,\s/) if v
|
48
|
+
end
|
49
|
+
|
50
|
+
def authentication
|
51
|
+
@authentication ||= inherited_overridable('authentication', :from => ['resource', 'namespace', 'apiversion'])
|
52
|
+
end
|
53
|
+
|
54
|
+
def options
|
55
|
+
@attributes['options']
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module EasyApiDoc
|
2
|
+
class ApiVersion
|
3
|
+
include EasyApiDoc::Configurable
|
4
|
+
|
5
|
+
def namespaces
|
6
|
+
@namespaces ||= load_children(EasyApiDoc::Namespace, nil, {:exclude => ['defaults', 'meta']})
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.config_path
|
10
|
+
['api']
|
11
|
+
end
|
12
|
+
|
13
|
+
def authentication
|
14
|
+
@authentication ||= inherited_overridable('authentication', :from => ['resource', 'namespace', 'apiversion'])
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module EasyApiDoc
|
2
|
+
class Namespace
|
3
|
+
include EasyApiDoc::Configurable
|
4
|
+
|
5
|
+
def resources
|
6
|
+
@resources ||= load_children(EasyApiDoc::Resource, 'resources')
|
7
|
+
end
|
8
|
+
|
9
|
+
def authentication
|
10
|
+
@authentication ||= inherited_overridable('authentication', :from => ['resource', 'namespace', 'apiversion'])
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
module EasyApiDoc
|
2
|
+
class Parameter
|
3
|
+
include EasyApiDoc::Configurable
|
4
|
+
|
5
|
+
attr_accessor :field_name
|
6
|
+
|
7
|
+
def initialize(*params)
|
8
|
+
super(*params)
|
9
|
+
set_field_name
|
10
|
+
end
|
11
|
+
|
12
|
+
def nested?
|
13
|
+
self['type'] == nil
|
14
|
+
end
|
15
|
+
|
16
|
+
def parameters
|
17
|
+
return [] unless nested?
|
18
|
+
return @parameters if @parameters
|
19
|
+
field_namespace = @field_namespace || []
|
20
|
+
field_namespace << @name
|
21
|
+
@parameters = load_children(EasyApiDoc::Parameter, nil, {:extra_attributes => {'field_namespace' => field_namespace}})
|
22
|
+
end
|
23
|
+
|
24
|
+
def scope_level
|
25
|
+
(@attributes['field_namespace'] || []).size
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
# Field namespace is for managing nested paramaters so that the form we output will have an input labelled correctly in our executable harness
|
31
|
+
# :user => {:email}
|
32
|
+
# will produce: 'user[email]' as the @field_name
|
33
|
+
# name: the name/label of this parameter (email in our example)
|
34
|
+
# namespaces, an array of the scopes to prepend
|
35
|
+
def set_field_name
|
36
|
+
field_namespace = @attributes['field_namespace']
|
37
|
+
fname = if field_namespace
|
38
|
+
field_namespace.map do |n|
|
39
|
+
n == field_namespace.first ? n : "[#{n}]"
|
40
|
+
end.join + "[#{@name}]"
|
41
|
+
else
|
42
|
+
@name
|
43
|
+
end
|
44
|
+
fname += '[]' if self['type'] == 'array'
|
45
|
+
@field_name = fname
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module EasyApiDoc
|
2
|
+
class Resource
|
3
|
+
include EasyApiDoc::Configurable
|
4
|
+
|
5
|
+
def formats
|
6
|
+
inherited_overridable('formats', :from => ['namespace'])
|
7
|
+
end
|
8
|
+
|
9
|
+
def actions
|
10
|
+
@actions ||= load_children(EasyApiDoc::Action, 'actions')
|
11
|
+
end
|
12
|
+
|
13
|
+
def authentication
|
14
|
+
@authentication ||= inherited_overridable('authentication', :from => ['resource', 'namespace', 'apiversion'])
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
<% if parameter.nested? %>
|
2
|
+
<%# Nested param %>
|
3
|
+
<tr>
|
4
|
+
<td><strong><%= parameter.name %></strong></td>
|
5
|
+
<td>nested attributes below</td>
|
6
|
+
<td></td>
|
7
|
+
<td></td>
|
8
|
+
<td></td>
|
9
|
+
<td></td>
|
10
|
+
<td></td>
|
11
|
+
</tr>
|
12
|
+
<% parameter.parameters.each do |p| %>
|
13
|
+
<%= render :partial => 'easy_api_doc/documentation/parameter', :locals => {:parameter => p} %>
|
14
|
+
<% end %>
|
15
|
+
<% else %>
|
16
|
+
<%# Standard parameter %>
|
17
|
+
<tr>
|
18
|
+
<td><%= raw('» ' * parameter.scope_level) %> <%= parameter.name %></td>
|
19
|
+
<td>
|
20
|
+
<%= text_field_tag(parameter.field_name, (parameter['example'] || parameter['default']), :class => 'input') %>
|
21
|
+
<%= link_to('add another item', '#', :class => 'append-fields') if parameter['type'] == 'array' %><br />
|
22
|
+
</td>
|
23
|
+
<td><%= link_to 'disable', '#', :class => 'disable-field-toggle' %></td>
|
24
|
+
<td><%= parameter['type'] %></td>
|
25
|
+
<td><%= parameter['default'] %></td>
|
26
|
+
<td><%= parameter['required'] %></td>
|
27
|
+
<td><%= parameter['info'] %></td>
|
28
|
+
</tr>
|
29
|
+
<% end %>
|
@@ -0,0 +1,16 @@
|
|
1
|
+
<div class="panel panel-default">
|
2
|
+
<div class="panel-heading">
|
3
|
+
<h3 class="panel-title"><%= @api_version.name %> / <%= @namespace.name %></h3>
|
4
|
+
</div>
|
5
|
+
<div class="panel-body">
|
6
|
+
<ul class='nav nav-list'>
|
7
|
+
<% @namespace.resources.each do |rs| %>
|
8
|
+
<li><strong><%= link_to rs.name, resource_link(rs) %></strong></li>
|
9
|
+
<% rs.actions.each do |ac| %>
|
10
|
+
<li><%= link_to ac.name, action_link(ac) %></li>
|
11
|
+
<% end %>
|
12
|
+
<% end %>
|
13
|
+
</ul>
|
14
|
+
</div>
|
15
|
+
|
16
|
+
</div>
|
@@ -0,0 +1,105 @@
|
|
1
|
+
<% provide(:sidebar) do %>
|
2
|
+
<%= render :partial => 'resource_index' %>
|
3
|
+
<% end %>
|
4
|
+
|
5
|
+
<%= breadcrumbs([
|
6
|
+
[@api_version.name, api_link(@api_version)],
|
7
|
+
[@namespace.name, namespace_link(@namespace)],
|
8
|
+
[@resource.name, resource_link(@resource)],
|
9
|
+
[@action.name]
|
10
|
+
]) %>
|
11
|
+
|
12
|
+
<div class="panel panel-default">
|
13
|
+
<div class="panel-heading">
|
14
|
+
<h3 class="panel-title">[<%= @action.attributes['http_method'] %>] <%= @action.name %>
|
15
|
+
<%= @action.formats.map {|l| content_tag(:span, l, :class => 'label label-info') }.join.html_safe %>
|
16
|
+
<%= content_tag(:small, content_tag(:span, '', :class => 'icon') + 'authenticated', :class => 'authenticated') if @action.authentication %></h3>
|
17
|
+
</div>
|
18
|
+
<div class="panel-body">
|
19
|
+
<%= @action.attributes['uri'] %>
|
20
|
+
</div>
|
21
|
+
</div>
|
22
|
+
|
23
|
+
<div class="panel panel-default">
|
24
|
+
<div class="panel-heading">
|
25
|
+
<h3 class="panel-title">Description</h3>
|
26
|
+
</div>
|
27
|
+
<div class="panel-body">
|
28
|
+
<%= contents_for_action(@resource, @action, 'description') %>
|
29
|
+
</div>
|
30
|
+
</div>
|
31
|
+
|
32
|
+
<%= content_tag(:form, {:class => 'api_call', :action => @action.path, :method => @action.attributes['http_method'].downcase, 'accept-charset' => 'UTF8'}) do %>
|
33
|
+
|
34
|
+
<% if @action.authentication %>
|
35
|
+
<table class='table table-bordered'>
|
36
|
+
<% auth_keys = @action.authentication.keys %>
|
37
|
+
<tr class='strong'>
|
38
|
+
<% auth_keys.each do |k| %>
|
39
|
+
<th><%= (k =~ /type/i) ? 'Authentication' : k %></th>
|
40
|
+
<% end %>
|
41
|
+
</tr>
|
42
|
+
<tr>
|
43
|
+
<% auth_keys.each do |k| %>
|
44
|
+
<td>
|
45
|
+
<% if ( k =~ /type/i) %>
|
46
|
+
<%= hidden_field_tag("_doc_authentication[#{k}]", @action.authentication[k], :class => 'input') %> <%= @action.authentication[k] %>
|
47
|
+
<% elsif ( k =~ /password/i)%>
|
48
|
+
<%= password_field_tag("_doc_authentication[#{k}]", @action.authentication[k], :class => 'input') %>
|
49
|
+
<% else %>
|
50
|
+
<%= text_field_tag("_doc_authentication[#{k}]", @action.authentication[k], :class => 'input') %>
|
51
|
+
<% end %>
|
52
|
+
</td>
|
53
|
+
<% end %>
|
54
|
+
</tr>
|
55
|
+
</table>
|
56
|
+
<% end %>
|
57
|
+
|
58
|
+
<div class="panel panel-default">
|
59
|
+
<div class="panel-heading">
|
60
|
+
<h3 class="panel-title">Parameters<small class='pull-right'>format–<%= select_tag 'format', options_for_select(@action.formats) %></small></h3>
|
61
|
+
</div>
|
62
|
+
<div class="panel-body">
|
63
|
+
|
64
|
+
<% if @action.parameters && @action.parameters.any? %>
|
65
|
+
<table class='table table-bordered table-condensed'>
|
66
|
+
<tr class='strong'>
|
67
|
+
<th>Parameter</th>
|
68
|
+
<th>Value</th>
|
69
|
+
<th><%= link_to 'disable all', '#', :class => 'disable-all-toggle' %></th>
|
70
|
+
<th>Type</th>
|
71
|
+
<th>Default</th>
|
72
|
+
<th>Required</th>
|
73
|
+
<th>Info</th>
|
74
|
+
</tr>
|
75
|
+
<% @action.parameters.each do |p| %>
|
76
|
+
<%= render :partial => 'easy_api_doc/documentation/parameter', :locals => {:parameter => p} %>
|
77
|
+
<% end %>
|
78
|
+
</table>
|
79
|
+
<% end %>
|
80
|
+
|
81
|
+
</div>
|
82
|
+
</div>
|
83
|
+
|
84
|
+
<div class="panel panel-default">
|
85
|
+
<% if @action.post_data.present? %>
|
86
|
+
<div class="panel-heading">
|
87
|
+
<h3 class="panel-title">Post Data</h3>
|
88
|
+
</div>
|
89
|
+
<div class="panel-body">
|
90
|
+
<% content = example_json(@action.post_data['example']) || @action.post_data['json'] || {} %>
|
91
|
+
<%= text_area_tag :_doc_post_data, content, rows: 10, cols: 70 %>
|
92
|
+
</div>
|
93
|
+
<% end %>
|
94
|
+
</div>
|
95
|
+
|
96
|
+
<%= link_to 'Run example', '#', :class => 'btn btn-primary run_api_call' %> <%= image_tag("easy_api_doc/loading.gif", :class => "loading", :style => "display:none") %>
|
97
|
+
|
98
|
+
<div class='response' style="display:none;">
|
99
|
+
<hr>
|
100
|
+
<h3>Response</h3>
|
101
|
+
<pre>http status: <span class='http_status'></span></pre>
|
102
|
+
<textarea class="prettyprint output"></textarea>
|
103
|
+
</div>
|
104
|
+
|
105
|
+
<% end %>
|
@@ -0,0 +1,13 @@
|
|
1
|
+
<% content_for(:sidebar) do %>
|
2
|
+
<%= render :partial => 'resource_index' %>
|
3
|
+
<% end %>
|
4
|
+
|
5
|
+
<div class="panel panel-default">
|
6
|
+
<div class="panel-heading">
|
7
|
+
<h3 class="panel-title"><%= @api_version.name %> > <%= @namespace.name %><%= content_tag(:small, content_tag(:span, '', :class => 'icon') + 'authenticated', :class => 'authenticated') if @namespace.authentication %></h3>
|
8
|
+
</div>
|
9
|
+
<div class="panel-body">
|
10
|
+
<p><%= @namespace.attributes['description'] %></p>
|
11
|
+
<p><%= @namespace.attributes['detail'] %></p>
|
12
|
+
</div>
|
13
|
+
</div>
|
@@ -0,0 +1,18 @@
|
|
1
|
+
<% content_for(:sidebar) do %>
|
2
|
+
<%= render :partial => 'resource_index' %>
|
3
|
+
<% end %>
|
4
|
+
|
5
|
+
<div class="panel panel-default">
|
6
|
+
<div class="panel-heading">
|
7
|
+
<h3 class="panel-title"><%= @api_version.name %> / <%= @namespace.name %> / <%= @resource.name %> / <%= content_tag(:small, content_tag(:span, '', :class => 'icon') + 'authenticated', :class => 'authenticated') if @resource.authentication %></h3>
|
8
|
+
</div>
|
9
|
+
<div class="panel-body">
|
10
|
+
<%= contents_for_resource(@resource, 'description') %>
|
11
|
+
</div>
|
12
|
+
</div>
|
13
|
+
|
14
|
+
<ul class="list-group">
|
15
|
+
<% @actions.each do |a| %>
|
16
|
+
<li class="list-group-item">[<%= a.attributes['http_method'].upcase %>] <%= link_to a.name, action_link(a) %></li>
|
17
|
+
<% end %>
|
18
|
+
</ul>
|
@@ -0,0 +1,23 @@
|
|
1
|
+
<nav class="navbar navbar-default" role="navigation">
|
2
|
+
<div class="navbar-header">
|
3
|
+
<%= link_to @app_title || 'API Documentation', root_path, :class => 'navbar-brand' %>
|
4
|
+
</div>
|
5
|
+
|
6
|
+
<div class="collapse navbar-collapse navbar-ex1-collapse">
|
7
|
+
<ul class="nav navbar-nav">
|
8
|
+
|
9
|
+
<% @api_versions.each do |api| %>
|
10
|
+
<li class="dropdown">
|
11
|
+
<%= link_to api.name, '#', :class => 'dropdown-toggle', 'data-toggle' => 'dropdown' %>
|
12
|
+
<ul class="dropdown-menu">
|
13
|
+
<% api.namespaces.each do |ns| %>
|
14
|
+
<li><%= link_to ns.name, namespace_link(ns) %></li>
|
15
|
+
<% end %>
|
16
|
+
</ul>
|
17
|
+
</li>
|
18
|
+
<% end %>
|
19
|
+
|
20
|
+
</ul>
|
21
|
+
|
22
|
+
</div>
|
23
|
+
</nav>
|
@@ -0,0 +1,34 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<title><%= @app_title || 'EasyApiDoc' %> </title>
|
5
|
+
<link rel="shortcut icon" href="<%= asset_path("easy_api_doc/favicon.ico") %>" >
|
6
|
+
<%= stylesheet_link_tag "easy_api_doc/application", :media => "all" %>
|
7
|
+
<%= javascript_include_tag "easy_api_doc/application" %>
|
8
|
+
<%= csrf_meta_tags %>
|
9
|
+
</head>
|
10
|
+
<body>
|
11
|
+
|
12
|
+
<div class='container'>
|
13
|
+
|
14
|
+
<%= render :partial => 'layouts/easy_api_doc/header' %>
|
15
|
+
|
16
|
+
<div class='row'>
|
17
|
+
|
18
|
+
<% if sidebar = yield(:sidebar) %>
|
19
|
+
<div class='col-md-3 sidebar'>
|
20
|
+
<%= sidebar %>
|
21
|
+
<%#= render :partial => 'shared/versions_index' %>
|
22
|
+
</div>
|
23
|
+
<% end %>
|
24
|
+
|
25
|
+
<div class='<%= sidebar ? "col-md-9" : "col-md-12" %> main'>
|
26
|
+
<%= yield %>
|
27
|
+
</div>
|
28
|
+
|
29
|
+
</div>
|
30
|
+
|
31
|
+
</div>
|
32
|
+
|
33
|
+
</body>
|
34
|
+
</html>
|
@@ -0,0 +1,10 @@
|
|
1
|
+
<h2>Index</h2>
|
2
|
+
|
3
|
+
<ul class='nav nav-list'>
|
4
|
+
<% @versions.each do |version| %>
|
5
|
+
<li class='nav-header'><%= link_to version.name, api_path(version.name) %></li>
|
6
|
+
<% version.namespaces.each do |ns| %>
|
7
|
+
<li><%= link_to ns.name, namespace_path(:api => version.name, :namespace => ns.name) %></li>
|
8
|
+
<% end %>
|
9
|
+
<% end %>
|
10
|
+
</ul>
|
data/config/routes.rb
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
EasyApiDoc::Engine.routes.draw do
|
2
|
+
|
3
|
+
resources :api, :only => [:index, :show]
|
4
|
+
get '/api/:api/:namespace' => 'documentation#namespace', :as => 'namespace'
|
5
|
+
get '/api/:api/:namespace/:resource' => 'documentation#resource', :as => 'resource'
|
6
|
+
get '/api/:api/:namespace/:resource/:api_action' => 'documentation#api_action', :as => 'api_action'
|
7
|
+
|
8
|
+
root :to => 'api#index'
|
9
|
+
end
|