easy_api_doc 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (123) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.rdoc +58 -0
  4. data/Rakefile +40 -0
  5. data/app/assets/images/easy_api_doc/favicon.ico +0 -0
  6. data/app/assets/images/easy_api_doc/glyphicons-halflings-white.png +0 -0
  7. data/app/assets/images/easy_api_doc/glyphicons-halflings.png +0 -0
  8. data/app/assets/images/easy_api_doc/loading.gif +0 -0
  9. data/app/assets/javascripts/easy_api_doc/api.js +2 -0
  10. data/app/assets/javascripts/easy_api_doc/application.js +15 -0
  11. data/app/assets/javascripts/easy_api_doc/base64.js +65 -0
  12. data/app/assets/javascripts/easy_api_doc/bootstrap.js +1999 -0
  13. data/app/assets/javascripts/easy_api_doc/documentation.js +223 -0
  14. data/app/assets/javascripts/easy_api_doc/status_codes.js +61 -0
  15. data/app/assets/stylesheets/easy_api_doc/api.css +4 -0
  16. data/app/assets/stylesheets/easy_api_doc/application.css +13 -0
  17. data/app/assets/stylesheets/easy_api_doc/bootstrap.css +6805 -0
  18. data/app/assets/stylesheets/easy_api_doc/documentation.css +47 -0
  19. data/app/controllers/easy_api_doc/api_controller.rb +13 -0
  20. data/app/controllers/easy_api_doc/application_controller.rb +17 -0
  21. data/app/controllers/easy_api_doc/documentation_controller.rb +42 -0
  22. data/app/helpers/easy_api_doc/application_helper.rb +71 -0
  23. data/app/helpers/easy_api_doc/documentation_helper.rb +5 -0
  24. data/app/models/easy_api_doc/action.rb +59 -0
  25. data/app/models/easy_api_doc/api_version.rb +18 -0
  26. data/app/models/easy_api_doc/namespace.rb +14 -0
  27. data/app/models/easy_api_doc/parameter.rb +49 -0
  28. data/app/models/easy_api_doc/resource.rb +18 -0
  29. data/app/views/easy_api_doc/api/index.html.erb +5 -0
  30. data/app/views/easy_api_doc/documentation/_parameter.html.erb +29 -0
  31. data/app/views/easy_api_doc/documentation/_resource_index.html.erb +16 -0
  32. data/app/views/easy_api_doc/documentation/api_action.html.erb +105 -0
  33. data/app/views/easy_api_doc/documentation/namespace.html.erb +13 -0
  34. data/app/views/easy_api_doc/documentation/resource.html.erb +18 -0
  35. data/app/views/layouts/easy_api_doc/_header.html.erb +23 -0
  36. data/app/views/layouts/easy_api_doc/application.html.erb +34 -0
  37. data/app/views/shared/_versions_index.html.erb +10 -0
  38. data/config/routes.rb +9 -0
  39. data/lib/configurable.rb +92 -0
  40. data/lib/configuration.rb +31 -0
  41. data/lib/easy_api_doc/engine.rb +5 -0
  42. data/lib/easy_api_doc/version.rb +3 -0
  43. data/lib/easy_api_doc.rb +6 -0
  44. data/test/dummy/README.rdoc +261 -0
  45. data/test/dummy/Rakefile +7 -0
  46. data/test/dummy/app/assets/javascripts/application.js +15 -0
  47. data/test/dummy/app/assets/stylesheets/application.css +13 -0
  48. data/test/dummy/app/controllers/application_controller.rb +3 -0
  49. data/test/dummy/app/helpers/application_helper.rb +2 -0
  50. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  51. data/test/dummy/config/application.rb +59 -0
  52. data/test/dummy/config/boot.rb +10 -0
  53. data/test/dummy/config/database.yml +25 -0
  54. data/test/dummy/config/environment.rb +5 -0
  55. data/test/dummy/config/environments/development.rb +36 -0
  56. data/test/dummy/config/environments/production.rb +67 -0
  57. data/test/dummy/config/environments/test.rb +39 -0
  58. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  59. data/test/dummy/config/initializers/inflections.rb +15 -0
  60. data/test/dummy/config/initializers/mime_types.rb +5 -0
  61. data/test/dummy/config/initializers/secret_token.rb +7 -0
  62. data/test/dummy/config/initializers/session_store.rb +8 -0
  63. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  64. data/test/dummy/config/locales/en.yml +5 -0
  65. data/test/dummy/config/routes.rb +3 -0
  66. data/test/dummy/config.ru +4 -0
  67. data/test/dummy/doc/api_doc.yml +104 -0
  68. data/test/dummy/log/development.log +742 -0
  69. data/test/dummy/public/404.html +26 -0
  70. data/test/dummy/public/422.html +26 -0
  71. data/test/dummy/public/500.html +25 -0
  72. data/test/dummy/public/favicon.ico +0 -0
  73. data/test/dummy/script/rails +6 -0
  74. data/test/dummy/tmp/cache/assets/development/sprockets/04965396c9cfe69081b5dd98c3212fae +0 -0
  75. data/test/dummy/tmp/cache/assets/development/sprockets/16d88b38a506ba01a817e258ad8fb263 +0 -0
  76. data/test/dummy/tmp/cache/assets/development/sprockets/203aa633656e7d9c927c57c46e470c83 +0 -0
  77. data/test/dummy/tmp/cache/assets/development/sprockets/2f062b493cefffdbc012a973e9a105d5 +0 -0
  78. data/test/dummy/tmp/cache/assets/development/sprockets/2f0ed6020953bd16ba9b363edbf7cda0 +0 -0
  79. data/test/dummy/tmp/cache/assets/development/sprockets/30465ccaba36954861158b4242883bd6 +0 -0
  80. data/test/dummy/tmp/cache/assets/development/sprockets/36351f369d6eaf233c5e86e07555c170 +0 -0
  81. data/test/dummy/tmp/cache/assets/development/sprockets/405c9c78a785fb067d1c67657cfc62ef +0 -0
  82. data/test/dummy/tmp/cache/assets/development/sprockets/4abfd2becb22be944eb58bcf7107c873 +0 -0
  83. data/test/dummy/tmp/cache/assets/development/sprockets/4c371d51ee36edfddc4b8428b18dd632 +0 -0
  84. data/test/dummy/tmp/cache/assets/development/sprockets/4e7b4f8fde8fe12c9c12da639bed576e +0 -0
  85. data/test/dummy/tmp/cache/assets/development/sprockets/543e8b4a615c1577865f6ef73059d40f +0 -0
  86. data/test/dummy/tmp/cache/assets/development/sprockets/593636db3cefe193ebf65f5b58f57c9a +0 -0
  87. data/test/dummy/tmp/cache/assets/development/sprockets/67409083f86d1b03662b495d04418132 +0 -0
  88. data/test/dummy/tmp/cache/assets/development/sprockets/6afb7fed89c6f68558c4186d7a740a3a +0 -0
  89. data/test/dummy/tmp/cache/assets/development/sprockets/6b1110992dffe4c4455380229a0b8dff +0 -0
  90. data/test/dummy/tmp/cache/assets/development/sprockets/6db6675fbfed66d3d342f71869217dac +0 -0
  91. data/test/dummy/tmp/cache/assets/development/sprockets/75d2dc9028e3a3f3e6ca14d8f2fe7b5e +0 -0
  92. data/test/dummy/tmp/cache/assets/development/sprockets/76b036b95dde7edc081890640b4e7ed0 +0 -0
  93. data/test/dummy/tmp/cache/assets/development/sprockets/76da432edc6235bd7d73c3335233b1ed +0 -0
  94. data/test/dummy/tmp/cache/assets/development/sprockets/76faccd1d102ff2260e90ba48328b865 +0 -0
  95. data/test/dummy/tmp/cache/assets/development/sprockets/7cbc737c6b2b24706bf9170823e12d87 +0 -0
  96. data/test/dummy/tmp/cache/assets/development/sprockets/7de191b871e66d0c65b1cbaf04a60f58 +0 -0
  97. data/test/dummy/tmp/cache/assets/development/sprockets/802227e7577d1f42b5991586df8c9f02 +0 -0
  98. data/test/dummy/tmp/cache/assets/development/sprockets/848e56c99230cfa8034c10a99fc52c28 +0 -0
  99. data/test/dummy/tmp/cache/assets/development/sprockets/8619cf373138f78fdaab67c14cf6593b +0 -0
  100. data/test/dummy/tmp/cache/assets/development/sprockets/8b8f23bb1606d4e7f5738827686ff14f +0 -0
  101. data/test/dummy/tmp/cache/assets/development/sprockets/8dde0af325a3c57426da61982576c899 +0 -0
  102. data/test/dummy/tmp/cache/assets/development/sprockets/92396eadb57dc8abfb0bf5b3a01295a8 +0 -0
  103. data/test/dummy/tmp/cache/assets/development/sprockets/92a86617e44e9093fb483fc122b75752 +0 -0
  104. data/test/dummy/tmp/cache/assets/development/sprockets/940b911c55d2dc0ea6ca56b25f087739 +0 -0
  105. data/test/dummy/tmp/cache/assets/development/sprockets/a39a3034ca0b3e6ae8eaca11c3ca5ad6 +0 -0
  106. data/test/dummy/tmp/cache/assets/development/sprockets/a8036af98430c82633505d9ca5fcde5f +0 -0
  107. data/test/dummy/tmp/cache/assets/development/sprockets/b4869b1ad3dab2a1821989791a57171f +0 -0
  108. data/test/dummy/tmp/cache/assets/development/sprockets/b7ad7703003d24dab911bd3730756ca6 +0 -0
  109. data/test/dummy/tmp/cache/assets/development/sprockets/b89605b311bfb96d01c875e7a9710861 +0 -0
  110. data/test/dummy/tmp/cache/assets/development/sprockets/c237c4326b837e51c2650d4f6ed7b7a5 +0 -0
  111. data/test/dummy/tmp/cache/assets/development/sprockets/c780d1da090d4bb4d9fa09753f04e17f +0 -0
  112. data/test/dummy/tmp/cache/assets/development/sprockets/ca91101b167a195ab54cdbc39efec3e9 +0 -0
  113. data/test/dummy/tmp/cache/assets/development/sprockets/cdb61eee371606ef082a5ee3189889d2 +0 -0
  114. data/test/dummy/tmp/cache/assets/development/sprockets/d86f52fe55c0b5686bacec92537b0c03 +0 -0
  115. data/test/dummy/tmp/cache/assets/development/sprockets/e9636c04426623ad28848cb917d96a95 +0 -0
  116. data/test/dummy/tmp/cache/assets/development/sprockets/ee9a7b09a7ab141b6ae0cf8ce9197a3c +0 -0
  117. data/test/dummy/tmp/cache/assets/development/sprockets/f0fcdc72564e7709bcdeb9e88dd86135 +0 -0
  118. data/test/dummy/tmp/cache/assets/development/sprockets/f5bcd46e1a1371d63dec98bc97bcda4c +0 -0
  119. data/test/dummy/tmp/cache/assets/development/sprockets/fb3e3925ae8dcb2704d2602719387463 +0 -0
  120. data/test/dummy/tmp/cache/assets/development/sprockets/fcbbb63c7069e7c3b471d13ff0441d2a +0 -0
  121. data/test/dummy/tmp/cache/assets/development/sprockets/ff8858e82d7df03c855d847837676e31 +0 -0
  122. data/test/test_helper.rb +10 -0
  123. 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,13 @@
1
+ module EasyApiDoc
2
+ class ApiController < EasyApiDoc::ApplicationController
3
+
4
+ def index
5
+ @api_versions = EasyApiDoc::ApiVersion.all
6
+ end
7
+
8
+ def show
9
+ @api_version = EasyApiDoc::ApiVersion.find(params[:id])
10
+ end
11
+
12
+ end
13
+ end
@@ -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,5 @@
1
+ module EasyApiDoc
2
+ module DocumentationHelper
3
+
4
+ end
5
+ 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,5 @@
1
+ <h1>API Versions</h1>
2
+
3
+ <% @api_versions.each do |api| %>
4
+ <p><%= api.name %></p>
5
+ <% 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('&#187; ' * 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 %> &gt; <%= @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