easy_api_doc 0.2.1

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.
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