apidoco 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (98) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +149 -0
  4. data/Rakefile +34 -0
  5. data/app/assets/config/apidoco_manifest.js +2 -0
  6. data/app/assets/javascripts/apidoco/apidoco_app.js +3 -0
  7. data/app/assets/javascripts/apidoco/application.js +15 -0
  8. data/app/assets/javascripts/apidoco/bootstrap/bootstrap.min.js +7 -0
  9. data/app/assets/javascripts/apidoco/controllers/documentations_controller.js +26 -0
  10. data/app/assets/javascripts/apidoco/directives/angular-scroll.min.js.map +1 -0
  11. data/app/assets/javascripts/apidoco/directives/angular_scroll.min.js +2 -0
  12. data/app/assets/javascripts/apidoco/directives/ng_prettyjson.min.js +22 -0
  13. data/app/assets/javascripts/apidoco/jquery.min.js +5 -0
  14. data/app/assets/stylesheets/apidoco/application.css +15 -0
  15. data/app/assets/stylesheets/apidoco/bootstrap/bootstrap.min.css +6 -0
  16. data/app/assets/stylesheets/apidoco/bootstrap/bootstrap.min.css.map +1 -0
  17. data/app/assets/stylesheets/apidoco/custom.css +15 -0
  18. data/app/assets/stylesheets/apidoco/fonts/glyphicons-halflings-regular.eot +0 -0
  19. data/app/assets/stylesheets/apidoco/fonts/glyphicons-halflings-regular.svg +288 -0
  20. data/app/assets/stylesheets/apidoco/fonts/glyphicons-halflings-regular.ttf +0 -0
  21. data/app/assets/stylesheets/apidoco/fonts/glyphicons-halflings-regular.woff +0 -0
  22. data/app/assets/stylesheets/apidoco/fonts/glyphicons-halflings-regular.woff2 +0 -0
  23. data/app/assets/stylesheets/apidoco/helpers.css +12 -0
  24. data/app/assets/stylesheets/apidoco/ng-prettyjson.min.css +7 -0
  25. data/app/assets/stylesheets/apidoco/simple-sidebar.css +127 -0
  26. data/app/controllers/apidoco/apis_controller.rb +22 -0
  27. data/app/controllers/apidoco/application_controller.rb +5 -0
  28. data/app/helpers/apidoco/application_helper.rb +9 -0
  29. data/app/jobs/apidoco/application_job.rb +4 -0
  30. data/app/mailers/apidoco/application_mailer.rb +6 -0
  31. data/app/models/apidoco/application_record.rb +5 -0
  32. data/app/views/apidoco/apis/_side_bar.html.erb +20 -0
  33. data/app/views/apidoco/apis/show.html.erb +73 -0
  34. data/app/views/layouts/apidoco/application.html.erb +14 -0
  35. data/config/routes.rb +4 -0
  36. data/lib/apidoco.rb +8 -0
  37. data/lib/apidoco/engine.rb +5 -0
  38. data/lib/apidoco/resource_documentation.rb +19 -0
  39. data/lib/apidoco/version.rb +3 -0
  40. data/lib/apidoco/version_documentation.rb +32 -0
  41. data/lib/apidoco/version_parser.rb +24 -0
  42. data/lib/generators/apidoco_generator.rb +82 -0
  43. data/lib/tasks/apidoco_tasks.rake +4 -0
  44. data/spec/dummy/Rakefile +6 -0
  45. data/spec/dummy/app/assets/config/manifest.js +5 -0
  46. data/spec/dummy/app/assets/javascripts/application.js +13 -0
  47. data/spec/dummy/app/assets/javascripts/cable.js +13 -0
  48. data/spec/dummy/app/assets/stylesheets/application.css +15 -0
  49. data/spec/dummy/app/channels/application_cable/channel.rb +4 -0
  50. data/spec/dummy/app/channels/application_cable/connection.rb +4 -0
  51. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  52. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  53. data/spec/dummy/app/jobs/application_job.rb +2 -0
  54. data/spec/dummy/app/mailers/application_mailer.rb +4 -0
  55. data/spec/dummy/app/models/application_record.rb +3 -0
  56. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  57. data/spec/dummy/app/views/layouts/mailer.html.erb +13 -0
  58. data/spec/dummy/app/views/layouts/mailer.text.erb +1 -0
  59. data/spec/dummy/bin/bundle +3 -0
  60. data/spec/dummy/bin/rails +4 -0
  61. data/spec/dummy/bin/rake +4 -0
  62. data/spec/dummy/bin/setup +34 -0
  63. data/spec/dummy/bin/update +29 -0
  64. data/spec/dummy/config.ru +5 -0
  65. data/spec/dummy/config/application.rb +15 -0
  66. data/spec/dummy/config/boot.rb +5 -0
  67. data/spec/dummy/config/cable.yml +9 -0
  68. data/spec/dummy/config/database.yml +25 -0
  69. data/spec/dummy/config/environment.rb +5 -0
  70. data/spec/dummy/config/environments/development.rb +54 -0
  71. data/spec/dummy/config/environments/production.rb +86 -0
  72. data/spec/dummy/config/environments/test.rb +42 -0
  73. data/spec/dummy/config/initializers/application_controller_renderer.rb +6 -0
  74. data/spec/dummy/config/initializers/assets.rb +11 -0
  75. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  76. data/spec/dummy/config/initializers/cookies_serializer.rb +5 -0
  77. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  78. data/spec/dummy/config/initializers/inflections.rb +16 -0
  79. data/spec/dummy/config/initializers/mime_types.rb +4 -0
  80. data/spec/dummy/config/initializers/new_framework_defaults.rb +24 -0
  81. data/spec/dummy/config/initializers/session_store.rb +3 -0
  82. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  83. data/spec/dummy/config/locales/en.yml +23 -0
  84. data/spec/dummy/config/puma.rb +47 -0
  85. data/spec/dummy/config/routes.rb +3 -0
  86. data/spec/dummy/config/secrets.yml +22 -0
  87. data/spec/dummy/config/spring.rb +6 -0
  88. data/spec/dummy/db/test.sqlite3 +0 -0
  89. data/spec/dummy/public/404.html +67 -0
  90. data/spec/dummy/public/422.html +67 -0
  91. data/spec/dummy/public/500.html +66 -0
  92. data/spec/dummy/public/apple-touch-icon-precomposed.png +0 -0
  93. data/spec/dummy/public/apple-touch-icon.png +0 -0
  94. data/spec/dummy/public/favicon.ico +0 -0
  95. data/spec/generators/apidoco_generator_spec.rb +34 -0
  96. data/spec/rails_helper.rb +57 -0
  97. data/spec/spec_helper.rb +17 -0
  98. metadata +281 -0
@@ -0,0 +1,12 @@
1
+ /* All the helper/reusable classes should be in here */
2
+ .pointer {
3
+ cursor: pointer;
4
+ }
5
+
6
+ .mt-10 {
7
+ margin-top: 10px !important;
8
+ }
9
+
10
+ .padding-10 {
11
+ padding: 10px !important;
12
+ }
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @license ng-prettyjson - v0.2.0
3
+ * (c) 2013 Julien VALERY https://github.com/darul75/ng-prettyjson
4
+ * License: MIT
5
+ **/
6
+
7
+ pre.pretty-json{outline:1px solid #e9e9e9;padding:5px;margin:5px}pre.pretty-json span.string{color:green}pre.pretty-json span.number{color:#ff8c00}pre.pretty-json span.boolean{color:#00f}pre.pretty-json span.null{color:#ff00ff}pre.pretty-json span.key{color:red}pre.pretty-json span.sep{color:#000}
@@ -0,0 +1,127 @@
1
+ /*!
2
+ * Start Bootstrap - Simple Sidebar (http://startbootstrap.com/)
3
+ * Copyright 2013-2016 Start Bootstrap
4
+ * Licensed under MIT (https://github.com/BlackrockDigital/startbootstrap/blob/gh-pages/LICENSE)
5
+ */
6
+
7
+ body {
8
+ overflow-x: hidden;
9
+ }
10
+
11
+ /* Toggle Styles */
12
+
13
+ #wrapper {
14
+ padding-left: 0;
15
+ -webkit-transition: all 0.5s ease;
16
+ -moz-transition: all 0.5s ease;
17
+ -o-transition: all 0.5s ease;
18
+ transition: all 0.5s ease;
19
+ }
20
+
21
+ #wrapper.toggled {
22
+ padding-left: 250px;
23
+ }
24
+
25
+ #sidebar-wrapper {
26
+ z-index: 1000;
27
+ position: fixed;
28
+ left: 250px;
29
+ width: 0;
30
+ height: 100%;
31
+ margin-left: -250px;
32
+ overflow-y: auto;
33
+ background: #000;
34
+ -webkit-transition: all 0.5s ease;
35
+ -moz-transition: all 0.5s ease;
36
+ -o-transition: all 0.5s ease;
37
+ transition: all 0.5s ease;
38
+ }
39
+
40
+ #wrapper.toggled #sidebar-wrapper {
41
+ width: 250px;
42
+ }
43
+
44
+ #page-content-wrapper {
45
+ width: 100%;
46
+ position: absolute;
47
+ padding: 15px;
48
+ }
49
+
50
+ #wrapper.toggled #page-content-wrapper {
51
+ position: absolute;
52
+ margin-right: -250px;
53
+ }
54
+
55
+ /* Sidebar Styles */
56
+
57
+ .sidebar-nav {
58
+ position: absolute;
59
+ top: 0;
60
+ width: 250px;
61
+ margin: 0;
62
+ padding: 0;
63
+ list-style: none;
64
+ }
65
+
66
+ .sidebar-nav li {
67
+ text-indent: 20px;
68
+ line-height: 40px;
69
+ }
70
+
71
+ .sidebar-nav li a {
72
+ display: block;
73
+ text-decoration: none;
74
+ color: #999999;
75
+ }
76
+
77
+ .sidebar-nav li a:hover,
78
+ .sidebar-nav li a:active,
79
+ .sidebar-nav li a.active,
80
+ .sidebar-nav li a:focus {
81
+ text-decoration: none;
82
+ color: #fff;
83
+ background: rgba(255,255,255,0.2);
84
+ }
85
+
86
+ .sidebar-nav > .sidebar-brand {
87
+ height: 65px;
88
+ font-size: 18px;
89
+ line-height: 60px;
90
+ }
91
+
92
+ .sidebar-nav > .sidebar-brand a {
93
+ color: #999999;
94
+ }
95
+
96
+ .sidebar-nav > .sidebar-brand a:hover {
97
+ color: #fff;
98
+ background: none;
99
+ }
100
+
101
+ @media(min-width:768px) {
102
+ #wrapper {
103
+ padding-left: 250px;
104
+ }
105
+
106
+ #wrapper.toggled {
107
+ padding-left: 0;
108
+ }
109
+
110
+ #sidebar-wrapper {
111
+ width: 250px;
112
+ }
113
+
114
+ #wrapper.toggled #sidebar-wrapper {
115
+ width: 0;
116
+ }
117
+
118
+ #page-content-wrapper {
119
+ padding: 20px;
120
+ position: relative;
121
+ }
122
+
123
+ #wrapper.toggled #page-content-wrapper {
124
+ position: relative;
125
+ margin-right: 0;
126
+ }
127
+ }
@@ -0,0 +1,22 @@
1
+ require_dependency "apidoco/application_controller"
2
+
3
+ module Apidoco
4
+ class ApisController < ApplicationController
5
+ before_action :set_version_parser
6
+
7
+ def index
8
+ redirect_to api_path(id: @vp.documentations.first.name)
9
+ end
10
+
11
+ def show
12
+ @documentation = @vp.documentation(params[:id])
13
+ @data = @documentation.as_json
14
+ end
15
+
16
+ private
17
+
18
+ def set_version_parser
19
+ @vp = VersionParser.new
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,5 @@
1
+ module Apidoco
2
+ class ApplicationController < ActionController::Base
3
+ protect_from_forgery with: :exception
4
+ end
5
+ end
@@ -0,0 +1,9 @@
1
+ module Apidoco
2
+ module ApplicationHelper
3
+ def documentation_versions(version_parser)
4
+ version_parser.documentations.map do |documentation|
5
+ { name: documentation.name, path: api_path(id: documentation.name) }
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,4 @@
1
+ module Apidoco
2
+ class ApplicationJob < ActiveJob::Base
3
+ end
4
+ end
@@ -0,0 +1,6 @@
1
+ module Apidoco
2
+ class ApplicationMailer < ActionMailer::Base
3
+ default from: 'from@example.com'
4
+ layout 'mailer'
5
+ end
6
+ end
@@ -0,0 +1,5 @@
1
+ module Apidoco
2
+ class ApplicationRecord < ActiveRecord::Base
3
+ self.abstract_class = true
4
+ end
5
+ end
@@ -0,0 +1,20 @@
1
+ <div id="sidebar-wrapper">
2
+ <ul class="sidebar-nav">
3
+ <li class="sidebar-brand">
4
+ <a href="#">
5
+ APIDOCO::{{currentVersion}}
6
+ </a>
7
+ </li>
8
+ <li class="padding-10">
9
+ <select class="form-control" ng-if="documentationVersions.length > 1" ng-model="currentVersion" ng-change="navigateToCurrentVersion(currentVersion);">
10
+ <option ng-repeat="version in documentationVersions" ng-value="version.name">{{version.name}}</option>
11
+ </select>
12
+ </li>
13
+ <li class="mt-10 padding-10">
14
+ <input type="text" placeholder="Search.." class="form-control input-sm" ng-model="searchKeyword" />
15
+ </li>
16
+ <li ng-repeat="x in jsonItem.apis | filter: searchKeyword">
17
+ <a href="#api_{{$index}}" du-smooth-scroll du-scrollspy>{{x.name}}</a>
18
+ </li>
19
+ </ul>
20
+ </div>
@@ -0,0 +1,73 @@
1
+ <div ng-controller="DocumentationController"
2
+ ng-init="jsonItem = <%= @data.to_json %>;
3
+ documentationVersions = <%= documentation_versions(@vp).to_json %>;
4
+ currentVersion = '<%= @documentation.version %>';">
5
+ <!-- Sidebar -->
6
+ <%= render partial: "side_bar" %>
7
+ <!-- Page Content -->
8
+ <div id="page-content-wrapper">
9
+ <div class="container-fluid">
10
+ <div class="row">
11
+ <div class="col-lg-12">
12
+ <div class="row">
13
+ <div class="col-lg-2">
14
+ <a href="#menu-toggle" class="btn btn-default glyphicon glyphicon-align-justify" id="menu-toggle"></a>
15
+ </div>
16
+ </div><br />
17
+
18
+ <div class="row">
19
+ <div class="col-lg-12 text_wheat">
20
+ <strong>BASE URL</strong>
21
+ {{ jsonItem.base_url }}
22
+ </div>
23
+ </div><br />
24
+
25
+ <div class="row api_details" ng-repeat="x in jsonItem.apis | filter: searchKeyword" id="api_{{$index}}">
26
+ <div class="col-lg-12">
27
+ <h4>{{x.name}}</h4>
28
+ <div class="row mt-10">
29
+ <div class="col-lg-2 text-right">End Point:</div>
30
+ <div class="col-lg-10">
31
+ <code>{{x.end_point}}</code>
32
+ </div>
33
+ </div>
34
+
35
+ <div class="row mt-10">
36
+ <div class="col-lg-2 text-right">HTTP Method:</div>
37
+ <div class="col-lg-10">{{x.http_method}}</div>
38
+ </div>
39
+
40
+ <div class="row mt-10">
41
+ <div class="col-lg-2 text-right">Params:</div>
42
+ <div class="col-lg-10">
43
+ <p ng-repeat="param in x.params">
44
+ <code>{{param.key}}
45
+ <span ng-if="param.required">
46
+ #{{param.required ? 'required' : 'optional'}}</span>
47
+ </code>
48
+ </p>
49
+ </div>
50
+ </div>
51
+
52
+ <div class="row mt-10">
53
+ <div class="col-lg-2 text-right">Examples:</div>
54
+ <div class="col-lg-10">
55
+ <div ng-repeat="example in x.examples">
56
+ <div>
57
+ <p class="text-center">Request</p>
58
+ <pre pretty-json="example.request" />
59
+ </div>
60
+ <div>
61
+ <p class="text-center">Response</p>
62
+ <pre pretty-json="example.response" />
63
+ </div>
64
+ </div>
65
+ </div>
66
+ </div>
67
+ </div>
68
+ </div>
69
+ </div>
70
+ </div>
71
+ </div>
72
+ </div>
73
+ </div>
@@ -0,0 +1,14 @@
1
+ <!DOCTYPE html>
2
+ <html ng-app="apiDocoApp">
3
+ <head>
4
+ <title>Apidoco</title>
5
+ <%= stylesheet_link_tag "apidoco/application", media: "all" %>
6
+ <%= javascript_include_tag "apidoco/application" %>
7
+ <%= csrf_meta_tags %>
8
+ </head>
9
+ <body>
10
+ <div id="wrapper">
11
+ <%= yield %>
12
+ </div>
13
+ </body>
14
+ </html>
@@ -0,0 +1,4 @@
1
+ Apidoco::Engine.routes.draw do
2
+ root 'apis#index'
3
+ resources :apis, only: [:show]
4
+ end
@@ -0,0 +1,8 @@
1
+ require "angularjs-rails"
2
+
3
+ require "apidoco/engine"
4
+ require "apidoco/version_parser"
5
+ require "apidoco/version_documentation"
6
+ require "apidoco/resource_documentation"
7
+
8
+ module Apidoco; end
@@ -0,0 +1,5 @@
1
+ module Apidoco
2
+ class Engine < ::Rails::Engine
3
+ isolate_namespace Apidoco
4
+ end
5
+ end
@@ -0,0 +1,19 @@
1
+ module Apidoco
2
+ class ResourceDocumentation
3
+ attr_accessor :directory
4
+
5
+ def initialize(directory)
6
+ self.directory = directory
7
+ end
8
+
9
+ def as_json
10
+ children.map { |c| JSON.parse(File.read(c)) }
11
+ end
12
+
13
+ def children
14
+ directory.children.select do |child|
15
+ child.extname.eql?('.json')
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,3 @@
1
+ module Apidoco
2
+ VERSION = '0.1.0'
3
+ end
@@ -0,0 +1,32 @@
1
+ module Apidoco
2
+ class VersionDocumentation
3
+ attr_accessor :directory
4
+
5
+ def initialize(directory)
6
+ self.directory = directory
7
+ end
8
+
9
+ def name
10
+ directory.basename.to_s
11
+ end
12
+ alias_method :version, :name
13
+
14
+ def as_json
15
+ {
16
+ name: name,
17
+ base_url: "",
18
+ apis: resource_documentations.flat_map(&:as_json)
19
+ }
20
+ end
21
+
22
+ def resource_documentations
23
+ resource_directories.map { |dir| ResourceDocumentation.new(dir) }
24
+ end
25
+
26
+ protected
27
+
28
+ def resource_directories
29
+ directory.children.select(&:directory?)
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,24 @@
1
+ module Apidoco
2
+ # Parses the documentation versions, keeps track of all the documented api versions
3
+ class VersionParser
4
+ attr_accessor :base_path
5
+
6
+ def initialize
7
+ self.base_path = Pathname('docs').join('api')
8
+ end
9
+
10
+ def documentations
11
+ documentation_directories.map { |dir| VersionDocumentation.new(dir) }
12
+ end
13
+
14
+ def documentation(version)
15
+ documentations.find { |doc| doc.version.eql?(version) }
16
+ end
17
+
18
+ private
19
+
20
+ def documentation_directories
21
+ base_path.children.select(&:directory?)
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,82 @@
1
+ #
2
+ # ApidocoGenerator
3
+ #
4
+ # @author sufinsha
5
+ #
6
+ class ApidocoGenerator < Rails::Generators::Base
7
+ desc 'This generator creates empty folder for api versions'
8
+ def create_apidoco_folder
9
+ resource = args[0]
10
+
11
+ resource_actions = actions(args[1..-1])
12
+
13
+ resource_actions.each do |action|
14
+ create_file "#{Rails.root}/docs/#{file_name(resource, action)}",
15
+ file_content(resource, action)
16
+ end
17
+ end
18
+
19
+ private
20
+
21
+ def actions(args)
22
+ return args if args.present?
23
+
24
+ [:show, :index, :create, :update, :destroy]
25
+ end
26
+
27
+ def default_end_points_with_method(action)
28
+ end_points_with_method = {
29
+ index: {
30
+ endpoint: '.json', method: 'GET', collection: true
31
+ },
32
+ show: {
33
+ endpoint: '/:id.json', method: 'GET', collection: false
34
+ },
35
+ create: {
36
+ endpoint: '.json', method: 'POST', collection: true
37
+ },
38
+ update: {
39
+ endpoint: '/:id.json', method: 'PUT|PATCH', collection: false
40
+ },
41
+ destroy: {
42
+ endpoint: '/:id.json', method: 'DELETE', collection: false
43
+ }
44
+ }
45
+ end_points_with_method[action] || {}
46
+ end
47
+
48
+ def api_name(resource, action)
49
+ endpoint_with_method = default_end_points_with_method(action.intern)
50
+ resource_title = if endpoint_with_method[:collection]
51
+ resource.pluralize.titleize
52
+ else
53
+ resource.singularize.titleize
54
+ end
55
+ "#{action.to_s.titleize} #{resource_title}"
56
+ end
57
+
58
+ def file_name(resource, action)
59
+ "#{resource}/#{action}.json"
60
+ end
61
+
62
+ def resource_name(resource)
63
+ resource.split('/').last
64
+ end
65
+
66
+ def file_content(resource, action)
67
+ endpoint_with_method = default_end_points_with_method(action.intern)
68
+ name = api_name(resource_name(resource), action)
69
+ <<-FILE
70
+ {
71
+ "name": "#{name}",
72
+ "end_point": "#{resource}#{endpoint_with_method[:endpoint]}",
73
+ "http_method": "#{endpoint_with_method[:method]}",
74
+ "params": [],
75
+ "examples": [{
76
+ "request": {},
77
+ "response": {}
78
+ }]
79
+ }
80
+ FILE
81
+ end
82
+ end