apidoco 1.2.0 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +39 -9
- data/app/assets/javascripts/apidoco/apidoco_app.js +1 -1
- data/app/assets/javascripts/apidoco/application.js +2 -0
- data/app/assets/javascripts/apidoco/clipboard.min.js +7 -0
- data/app/assets/javascripts/apidoco/directives/angular_scroll.min.js +0 -1
- data/app/assets/javascripts/apidoco/directives/jq_json_viewer.js +1 -1
- data/app/assets/javascripts/apidoco/directives/ngclipboard.js +48 -0
- data/app/controllers/apidoco/apis_controller.rb +3 -0
- data/app/views/apidoco/apis/show.html.erb +28 -9
- data/lib/apidoco.rb +3 -1
- data/lib/apidoco/version.rb +1 -1
- metadata +7 -4
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: b50213662ec2a1915fb036922e4df1c22dc93466
|
|
4
|
+
data.tar.gz: 1fa99c664b15ed0713e2dae12d5f697ceecc2331
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 13cc77b6575ac454869087f7a961fa67d71bf6372131d00705b6563004418d8948d1ecd34564afaa4505621ec8e9ed6d3fa917793e6d00ab158bcb53c07f9af4
|
|
7
|
+
data.tar.gz: ac3f2ffd8b016b42002793954fd9d7455eab48360843a94e4eb508567ab644c60c9dc42070dce37f68353f1502370ccc2ec89a75aea9b0a495a3ea37fd61d532
|
data/README.md
CHANGED
|
@@ -1,6 +1,12 @@
|
|
|
1
|
-
|
|
1
|
+
[](https://badge.fury.io/rb/apidoco)
|
|
2
|
+
|
|
3
|
+
# Apidoco - Ruby on Rails API documentation tool
|
|
2
4
|
Easy documentation of REST APIs - [Demo](https://apidoco-demo.herokuapp.com/docs/).
|
|
3
5
|
|
|
6
|
+
## Screenshots
|
|
7
|
+
|
|
8
|
+

|
|
9
|
+
|
|
4
10
|
|
|
5
11
|
## Installation
|
|
6
12
|
Add this line to your application's Gemfile:
|
|
@@ -20,6 +26,15 @@ Add this line to your routes:
|
|
|
20
26
|
mount Apidoco::Engine, at: "/docs"
|
|
21
27
|
```
|
|
22
28
|
|
|
29
|
+
## How to add authentication
|
|
30
|
+
|
|
31
|
+
Create a configuration file in initializers e.g. /config/initializers/apidoco.rb and add the following.
|
|
32
|
+
|
|
33
|
+
```ruby
|
|
34
|
+
Apidoco.auth_name = 'authentication_name'
|
|
35
|
+
Apidoco.auth_password = 'authentication_password'
|
|
36
|
+
```
|
|
37
|
+
|
|
23
38
|
## Generators
|
|
24
39
|
|
|
25
40
|
To create a Api documentation file for an action:
|
|
@@ -51,12 +66,6 @@ will create the following files with sample content
|
|
|
51
66
|
- docs/api/v1/posts/download.json
|
|
52
67
|
- docs/api/v1/posts/upload.json
|
|
53
68
|
|
|
54
|
-
## Contributing
|
|
55
|
-
Contribution directions go here.
|
|
56
|
-
|
|
57
|
-
## License
|
|
58
|
-
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
|
59
|
-
|
|
60
69
|
### Sample API documentation format
|
|
61
70
|
|
|
62
71
|
```
|
|
@@ -97,7 +106,9 @@ The gem is available as open source under the terms of the [MIT License](http://
|
|
|
97
106
|
}
|
|
98
107
|
}]
|
|
99
108
|
}
|
|
109
|
+
```
|
|
100
110
|
|
|
111
|
+
```
|
|
101
112
|
// docs/api/v1/posts/edit.json
|
|
102
113
|
{
|
|
103
114
|
"published": true,
|
|
@@ -140,10 +151,12 @@ The gem is available as open source under the terms of the [MIT License](http://
|
|
|
140
151
|
"http_method": "POST",
|
|
141
152
|
"params": [{
|
|
142
153
|
"key": "post['name']",
|
|
143
|
-
"required": true
|
|
154
|
+
"required": true,
|
|
155
|
+
"type": "String"
|
|
144
156
|
}, {
|
|
145
157
|
"key": "post['content']",
|
|
146
|
-
"required": false
|
|
158
|
+
"required": false,
|
|
159
|
+
"type": "String"
|
|
147
160
|
}],
|
|
148
161
|
"examples": [{
|
|
149
162
|
"request": {
|
|
@@ -162,3 +175,20 @@ The gem is available as open source under the terms of the [MIT License](http://
|
|
|
162
175
|
}]
|
|
163
176
|
}
|
|
164
177
|
```
|
|
178
|
+
|
|
179
|
+
## Documentation format reference
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
| Key | Description | Default | Example |
|
|
183
|
+
| --- | --- | --- | --- |
|
|
184
|
+
| `published` | Set this to false if you do not want to list this api | `true` | -- |
|
|
185
|
+
| `sort_order` | The order of the api in the documenatation | 0 | `"sort_order": 10` |
|
|
186
|
+
| `name` | Name of the api | --- | --- |
|
|
187
|
+
| `end_point` | --- | --- | `"end_point": "/posts"` |
|
|
188
|
+
| `http_method` | The HTTP method of the API | --- | `"http_method": "GET"` |
|
|
189
|
+
| `params` | Parameters to be used | --- | `"params: [{ "key": "post['name']", "required": true, "type": "String" }]"` |
|
|
190
|
+
| `examples` | Array of sample requests and responses | --- | `[{ "request": { "post": { "name": "I was scared" } } }, "response": { "message": "Post was successfully created", "id": 101 } }]`
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
## License
|
|
194
|
+
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
angular.module('apiDocoApp', ['duScroll'])
|
|
1
|
+
angular.module('apiDocoApp', ['duScroll', 'ngclipboard'])
|
|
2
2
|
.value('duScrollOffset', 250) // offset from top to the div
|
|
3
3
|
.value('duScrollBottomSpy', true); // To make the last du-scrollspy link active when scroll reaches page/container bottom
|
|
@@ -15,7 +15,9 @@
|
|
|
15
15
|
//= require apidoco/jquery.min
|
|
16
16
|
//= require apidoco/jquery.json-viewer
|
|
17
17
|
//= require apidoco/bootstrap/bootstrap.min
|
|
18
|
+
//= require apidoco/clipboard.min
|
|
18
19
|
//= require apidoco/directives/angular_scroll.min
|
|
20
|
+
//= require apidoco/directives/ngclipboard
|
|
19
21
|
//= require apidoco/apidoco_app
|
|
20
22
|
//= require apidoco/directives/jq_json_viewer
|
|
21
23
|
//= require apidoco/controllers/documentations_controller
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* clipboard.js v1.6.0
|
|
3
|
+
* https://zenorocha.github.io/clipboard.js
|
|
4
|
+
*
|
|
5
|
+
* Licensed MIT © Zeno Rocha
|
|
6
|
+
*/
|
|
7
|
+
!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var t;t="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,t.Clipboard=e()}}(function(){var e,t,n;return function e(t,n,o){function i(a,c){if(!n[a]){if(!t[a]){var l="function"==typeof require&&require;if(!c&&l)return l(a,!0);if(r)return r(a,!0);var u=new Error("Cannot find module '"+a+"'");throw u.code="MODULE_NOT_FOUND",u}var s=n[a]={exports:{}};t[a][0].call(s.exports,function(e){var n=t[a][1][e];return i(n?n:e)},s,s.exports,e,t,n,o)}return n[a].exports}for(var r="function"==typeof require&&require,a=0;a<o.length;a++)i(o[a]);return i}({1:[function(e,t,n){function o(e,t){for(;e&&e.nodeType!==i;){if(e.matches(t))return e;e=e.parentNode}}var i=9;if(Element&&!Element.prototype.matches){var r=Element.prototype;r.matches=r.matchesSelector||r.mozMatchesSelector||r.msMatchesSelector||r.oMatchesSelector||r.webkitMatchesSelector}t.exports=o},{}],2:[function(e,t,n){function o(e,t,n,o,r){var a=i.apply(this,arguments);return e.addEventListener(n,a,r),{destroy:function(){e.removeEventListener(n,a,r)}}}function i(e,t,n,o){return function(n){n.delegateTarget=r(n.target,t),n.delegateTarget&&o.call(e,n)}}var r=e("./closest");t.exports=o},{"./closest":1}],3:[function(e,t,n){n.node=function(e){return void 0!==e&&e instanceof HTMLElement&&1===e.nodeType},n.nodeList=function(e){var t=Object.prototype.toString.call(e);return void 0!==e&&("[object NodeList]"===t||"[object HTMLCollection]"===t)&&"length"in e&&(0===e.length||n.node(e[0]))},n.string=function(e){return"string"==typeof e||e instanceof String},n.fn=function(e){var t=Object.prototype.toString.call(e);return"[object Function]"===t}},{}],4:[function(e,t,n){function o(e,t,n){if(!e&&!t&&!n)throw new Error("Missing required arguments");if(!c.string(t))throw new TypeError("Second argument must be a String");if(!c.fn(n))throw new TypeError("Third argument must be a Function");if(c.node(e))return i(e,t,n);if(c.nodeList(e))return r(e,t,n);if(c.string(e))return a(e,t,n);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}function i(e,t,n){return e.addEventListener(t,n),{destroy:function(){e.removeEventListener(t,n)}}}function r(e,t,n){return Array.prototype.forEach.call(e,function(e){e.addEventListener(t,n)}),{destroy:function(){Array.prototype.forEach.call(e,function(e){e.removeEventListener(t,n)})}}}function a(e,t,n){return l(document.body,e,t,n)}var c=e("./is"),l=e("delegate");t.exports=o},{"./is":3,delegate:2}],5:[function(e,t,n){function o(e){var t;if("SELECT"===e.nodeName)e.focus(),t=e.value;else if("INPUT"===e.nodeName||"TEXTAREA"===e.nodeName){var n=e.hasAttribute("readonly");n||e.setAttribute("readonly",""),e.select(),e.setSelectionRange(0,e.value.length),n||e.removeAttribute("readonly"),t=e.value}else{e.hasAttribute("contenteditable")&&e.focus();var o=window.getSelection(),i=document.createRange();i.selectNodeContents(e),o.removeAllRanges(),o.addRange(i),t=o.toString()}return t}t.exports=o},{}],6:[function(e,t,n){function o(){}o.prototype={on:function(e,t,n){var o=this.e||(this.e={});return(o[e]||(o[e]=[])).push({fn:t,ctx:n}),this},once:function(e,t,n){function o(){i.off(e,o),t.apply(n,arguments)}var i=this;return o._=t,this.on(e,o,n)},emit:function(e){var t=[].slice.call(arguments,1),n=((this.e||(this.e={}))[e]||[]).slice(),o=0,i=n.length;for(o;o<i;o++)n[o].fn.apply(n[o].ctx,t);return this},off:function(e,t){var n=this.e||(this.e={}),o=n[e],i=[];if(o&&t)for(var r=0,a=o.length;r<a;r++)o[r].fn!==t&&o[r].fn._!==t&&i.push(o[r]);return i.length?n[e]=i:delete n[e],this}},t.exports=o},{}],7:[function(t,n,o){!function(i,r){if("function"==typeof e&&e.amd)e(["module","select"],r);else if("undefined"!=typeof o)r(n,t("select"));else{var a={exports:{}};r(a,i.select),i.clipboardAction=a.exports}}(this,function(e,t){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=n(t),r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},a=function(){function e(e,t){for(var n=0;n<t.length;n++){var o=t[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,o.key,o)}}return function(t,n,o){return n&&e(t.prototype,n),o&&e(t,o),t}}(),c=function(){function e(t){o(this,e),this.resolveOptions(t),this.initSelection()}return a(e,[{key:"resolveOptions",value:function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.action=t.action,this.emitter=t.emitter,this.target=t.target,this.text=t.text,this.trigger=t.trigger,this.selectedText=""}},{key:"initSelection",value:function e(){this.text?this.selectFake():this.target&&this.selectTarget()}},{key:"selectFake",value:function e(){var t=this,n="rtl"==document.documentElement.getAttribute("dir");this.removeFake(),this.fakeHandlerCallback=function(){return t.removeFake()},this.fakeHandler=document.body.addEventListener("click",this.fakeHandlerCallback)||!0,this.fakeElem=document.createElement("textarea"),this.fakeElem.style.fontSize="12pt",this.fakeElem.style.border="0",this.fakeElem.style.padding="0",this.fakeElem.style.margin="0",this.fakeElem.style.position="absolute",this.fakeElem.style[n?"right":"left"]="-9999px";var o=window.pageYOffset||document.documentElement.scrollTop;this.fakeElem.style.top=o+"px",this.fakeElem.setAttribute("readonly",""),this.fakeElem.value=this.text,document.body.appendChild(this.fakeElem),this.selectedText=(0,i.default)(this.fakeElem),this.copyText()}},{key:"removeFake",value:function e(){this.fakeHandler&&(document.body.removeEventListener("click",this.fakeHandlerCallback),this.fakeHandler=null,this.fakeHandlerCallback=null),this.fakeElem&&(document.body.removeChild(this.fakeElem),this.fakeElem=null)}},{key:"selectTarget",value:function e(){this.selectedText=(0,i.default)(this.target),this.copyText()}},{key:"copyText",value:function e(){var t=void 0;try{t=document.execCommand(this.action)}catch(e){t=!1}this.handleResult(t)}},{key:"handleResult",value:function e(t){this.emitter.emit(t?"success":"error",{action:this.action,text:this.selectedText,trigger:this.trigger,clearSelection:this.clearSelection.bind(this)})}},{key:"clearSelection",value:function e(){this.target&&this.target.blur(),window.getSelection().removeAllRanges()}},{key:"destroy",value:function e(){this.removeFake()}},{key:"action",set:function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"copy";if(this._action=t,"copy"!==this._action&&"cut"!==this._action)throw new Error('Invalid "action" value, use either "copy" or "cut"')},get:function e(){return this._action}},{key:"target",set:function e(t){if(void 0!==t){if(!t||"object"!==("undefined"==typeof t?"undefined":r(t))||1!==t.nodeType)throw new Error('Invalid "target" value, use a valid Element');if("copy"===this.action&&t.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if("cut"===this.action&&(t.hasAttribute("readonly")||t.hasAttribute("disabled")))throw new Error('Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes');this._target=t}},get:function e(){return this._target}}]),e}();e.exports=c})},{select:5}],8:[function(t,n,o){!function(i,r){if("function"==typeof e&&e.amd)e(["module","./clipboard-action","tiny-emitter","good-listener"],r);else if("undefined"!=typeof o)r(n,t("./clipboard-action"),t("tiny-emitter"),t("good-listener"));else{var a={exports:{}};r(a,i.clipboardAction,i.tinyEmitter,i.goodListener),i.clipboard=a.exports}}(this,function(e,t,n,o){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function a(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function c(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function l(e,t){var n="data-clipboard-"+e;if(t.hasAttribute(n))return t.getAttribute(n)}var u=i(t),s=i(n),f=i(o),d=function(){function e(e,t){for(var n=0;n<t.length;n++){var o=t[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,o.key,o)}}return function(t,n,o){return n&&e(t.prototype,n),o&&e(t,o),t}}(),h=function(e){function t(e,n){r(this,t);var o=a(this,(t.__proto__||Object.getPrototypeOf(t)).call(this));return o.resolveOptions(n),o.listenClick(e),o}return c(t,e),d(t,[{key:"resolveOptions",value:function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.action="function"==typeof t.action?t.action:this.defaultAction,this.target="function"==typeof t.target?t.target:this.defaultTarget,this.text="function"==typeof t.text?t.text:this.defaultText}},{key:"listenClick",value:function e(t){var n=this;this.listener=(0,f.default)(t,"click",function(e){return n.onClick(e)})}},{key:"onClick",value:function e(t){var n=t.delegateTarget||t.currentTarget;this.clipboardAction&&(this.clipboardAction=null),this.clipboardAction=new u.default({action:this.action(n),target:this.target(n),text:this.text(n),trigger:n,emitter:this})}},{key:"defaultAction",value:function e(t){return l("action",t)}},{key:"defaultTarget",value:function e(t){var n=l("target",t);if(n)return document.querySelector(n)}},{key:"defaultText",value:function e(t){return l("text",t)}},{key:"destroy",value:function e(){this.listener.destroy(),this.clipboardAction&&(this.clipboardAction.destroy(),this.clipboardAction=null)}}],[{key:"isSupported",value:function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:["copy","cut"],n="string"==typeof t?[t]:t,o=!!document.queryCommandSupported;return n.forEach(function(e){o=o&&!!document.queryCommandSupported(e)}),o}}]),t}(s.default);e.exports=h})},{"./clipboard-action":7,"good-listener":4,"tiny-emitter":6}]},{},[8])(8)});
|
|
@@ -1,2 +1 @@
|
|
|
1
1
|
var duScrollDefaultEasing=function(e){"use strict";return.5>e?Math.pow(2*e,2)/2:1-Math.pow(2*(1-e),2)/2},duScroll=angular.module("duScroll",["duScroll.scrollspy","duScroll.smoothScroll","duScroll.scrollContainer","duScroll.spyContext","duScroll.scrollHelpers"]).value("duScrollDuration",350).value("duScrollSpyWait",100).value("duScrollGreedy",!1).value("duScrollOffset",0).value("duScrollEasing",duScrollDefaultEasing).value("duScrollCancelOnEvents","scroll mousedown mousewheel touchmove keydown").value("duScrollBottomSpy",!1).value("duScrollActiveClass","active");"undefined"!=typeof module&&module&&module.exports&&(module.exports=duScroll),angular.module("duScroll.scrollHelpers",["duScroll.requestAnimation"]).run(["$window","$q","cancelAnimation","requestAnimation","duScrollEasing","duScrollDuration","duScrollOffset","duScrollCancelOnEvents",function(e,t,n,r,o,l,u,c){"use strict";var i={},a=function(e){return"undefined"!=typeof HTMLDocument&&e instanceof HTMLDocument||e.nodeType&&e.nodeType===e.DOCUMENT_NODE},s=function(e){return"undefined"!=typeof HTMLElement&&e instanceof HTMLElement||e.nodeType&&e.nodeType===e.ELEMENT_NODE},d=function(e){return s(e)||a(e)?e:e[0]};i.duScrollTo=function(t,n,r,o){var l;if(angular.isElement(t)?l=this.duScrollToElement:angular.isDefined(r)&&(l=this.duScrollToAnimated),l)return l.apply(this,arguments);var u=d(this);return a(u)?e.scrollTo(t,n):(u.scrollLeft=t,void(u.scrollTop=n))};var f,m;i.duScrollToAnimated=function(e,l,u,i){u&&!i&&(i=o);var a=this.duScrollLeft(),s=this.duScrollTop(),d=Math.round(e-a),p=Math.round(l-s),S=null,g=0,v=this,h=function(e){(!e||g&&e.which>0)&&(c&&v.unbind(c,h),n(f),m.reject(),f=null)};if(f&&h(),m=t.defer(),0===u||!d&&!p)return 0===u&&v.duScrollTo(e,l),m.resolve(),m.promise;var y=function(e){null===S&&(S=e),g=e-S;var t=g>=u?1:i(g/u);v.scrollTo(a+Math.ceil(d*t),s+Math.ceil(p*t)),1>t?f=r(y):(c&&v.unbind(c,h),f=null,m.resolve())};return v.duScrollTo(a,s),c&&v.bind(c,h),f=r(y),m.promise},i.duScrollToElement=function(e,t,n,r){var o=d(this);(!angular.isNumber(t)||isNaN(t))&&(t=u);var l=this.duScrollTop()+d(e).getBoundingClientRect().top-t;return s(o)&&(l-=o.getBoundingClientRect().top),this.duScrollTo(0,l,n,r)},i.duScrollLeft=function(t,n,r){if(angular.isNumber(t))return this.duScrollTo(t,this.duScrollTop(),n,r);var o=d(this);return a(o)?e.scrollX||document.documentElement.scrollLeft||document.body.scrollLeft:o.scrollLeft},i.duScrollTop=function(t,n,r){if(angular.isNumber(t))return this.duScrollTo(this.duScrollLeft(),t,n,r);var o=d(this);return a(o)?e.scrollY||document.documentElement.scrollTop||document.body.scrollTop:o.scrollTop},i.duScrollToElementAnimated=function(e,t,n,r){return this.duScrollToElement(e,t,n||l,r)},i.duScrollTopAnimated=function(e,t,n){return this.duScrollTop(e,t||l,n)},i.duScrollLeftAnimated=function(e,t,n){return this.duScrollLeft(e,t||l,n)},angular.forEach(i,function(e,t){angular.element.prototype[t]=e;var n=t.replace(/^duScroll/,"scroll");angular.isUndefined(angular.element.prototype[n])&&(angular.element.prototype[n]=e)})}]),angular.module("duScroll.polyfill",[]).factory("polyfill",["$window",function(e){"use strict";var t=["webkit","moz","o","ms"];return function(n,r){if(e[n])return e[n];for(var o,l=n.substr(0,1).toUpperCase()+n.substr(1),u=0;u<t.length;u++)if(o=t[u]+l,e[o])return e[o];return r}}]),angular.module("duScroll.requestAnimation",["duScroll.polyfill"]).factory("requestAnimation",["polyfill","$timeout",function(e,t){"use strict";var n=0,r=function(e,r){var o=(new Date).getTime(),l=Math.max(0,16-(o-n)),u=t(function(){e(o+l)},l);return n=o+l,u};return e("requestAnimationFrame",r)}]).factory("cancelAnimation",["polyfill","$timeout",function(e,t){"use strict";var n=function(e){t.cancel(e)};return e("cancelAnimationFrame",n)}]),angular.module("duScroll.spyAPI",["duScroll.scrollContainerAPI"]).factory("spyAPI",["$rootScope","$timeout","$window","$document","scrollContainerAPI","duScrollGreedy","duScrollSpyWait","duScrollBottomSpy","duScrollActiveClass",function(e,t,n,r,o,l,u,c,i){"use strict";var a=function(o){var a=!1,s=!1,d=function(){s=!1;var t,u=o.container,a=u[0],d=0;if("undefined"!=typeof HTMLElement&&a instanceof HTMLElement||a.nodeType&&a.nodeType===a.ELEMENT_NODE)d=a.getBoundingClientRect().top,t=Math.round(a.scrollTop+a.clientHeight)>=a.scrollHeight;else{var f=r[0].body.scrollHeight||r[0].documentElement.scrollHeight;t=Math.round(n.pageYOffset+n.innerHeight)>=f}var m,p,S,g,v,h,y=c&&t?"bottom":"top";for(g=o.spies,p=o.currentlyActive,S=void 0,m=0;m<g.length;m++)v=g[m],h=v.getTargetPosition(),h&&(c&&t||h.top+v.offset-d<20&&(l||-1*h.top+d)<h.height)&&(!S||S[y]<h[y])&&(S={spy:v},S[y]=h[y]);S&&(S=S.spy),p===S||l&&!S||(p&&(p.$element.removeClass(i),e.$broadcast("duScrollspy:becameInactive",p.$element,angular.element(p.getTargetElement()))),S&&(S.$element.addClass(i),e.$broadcast("duScrollspy:becameActive",S.$element,angular.element(S.getTargetElement()))),o.currentlyActive=S)};return u?function(){a?s=!0:(d(),a=t(function(){a=!1,s&&d()},u,!1))}:d},s={},d=function(e){var t=e.$id,n={spies:[]};return n.handler=a(n),s[t]=n,e.$on("$destroy",function(){f(e)}),t},f=function(e){var t=e.$id,n=s[t],r=n.container;r&&r.off("scroll",n.handler),delete s[t]},m=d(e),p=function(e){return s[e.$id]?s[e.$id]:e.$parent?p(e.$parent):s[m]},S=function(e){var t,n,r=e.$scope;if(r)return p(r);for(n in s)if(t=s[n],-1!==t.spies.indexOf(e))return t},g=function(e){for(;e.parentNode;)if(e=e.parentNode,e===document)return!0;return!1},v=function(e){var t=S(e);t&&(t.spies.push(e),t.container&&g(t.container)||(t.container&&t.container.off("scroll",t.handler),t.container=o.getContainer(e.$scope),t.container.on("scroll",t.handler).triggerHandler("scroll")))},h=function(t){var n=S(t);t===n.currentlyActive&&(e.$broadcast("duScrollspy:becameInactive",n.currentlyActive.$element),n.currentlyActive=null);var r=n.spies.indexOf(t);-1!==r&&n.spies.splice(r,1),t.$element=null};return{addSpy:v,removeSpy:h,createContext:d,destroyContext:f,getContextForScope:p}}]),angular.module("duScroll.scrollContainerAPI",[]).factory("scrollContainerAPI",["$document",function(e){"use strict";var t={},n=function(e,n){var r=e.$id;return t[r]=n,r},r=function(e){return t[e.$id]?e.$id:e.$parent?r(e.$parent):void 0},o=function(n){var o=r(n);return o?t[o]:e},l=function(e){var n=r(e);n&&delete t[n]};return{getContainerId:r,getContainer:o,setContainer:n,removeContainer:l}}]),angular.module("duScroll.smoothScroll",["duScroll.scrollHelpers","duScroll.scrollContainerAPI"]).directive("duSmoothScroll",["duScrollDuration","duScrollOffset","scrollContainerAPI",function(e,t,n){"use strict";return{link:function(r,o,l){o.on("click",function(o){if(l.href&&-1!==l.href.indexOf("#")||""!==l.duSmoothScroll){var u=l.href?l.href.replace(/.*(?=#[^\s]+$)/,"").substring(1):l.duSmoothScroll,c=document.getElementById(u)||document.getElementsByName(u)[0];if(c&&c.getBoundingClientRect){o.stopPropagation&&o.stopPropagation(),o.preventDefault&&o.preventDefault();var i=l.offset?parseInt(l.offset,10):t,a=l.duration?parseInt(l.duration,10):e,s=n.getContainer(r);s.duScrollToElement(angular.element(c),isNaN(i)?0:i,isNaN(a)?0:a)}}})}}}]),angular.module("duScroll.spyContext",["duScroll.spyAPI"]).directive("duSpyContext",["spyAPI",function(e){"use strict";return{restrict:"A",scope:!0,compile:function(t,n,r){return{pre:function(t,n,r,o){e.createContext(t)}}}}}]),angular.module("duScroll.scrollContainer",["duScroll.scrollContainerAPI"]).directive("duScrollContainer",["scrollContainerAPI",function(e){"use strict";return{restrict:"A",scope:!0,compile:function(t,n,r){return{pre:function(t,n,r,o){r.$observe("duScrollContainer",function(r){angular.isString(r)&&(r=document.getElementById(r)),r=angular.isElement(r)?angular.element(r):n,e.setContainer(t,r),t.$on("$destroy",function(){e.removeContainer(t)})})}}}}}]),angular.module("duScroll.scrollspy",["duScroll.spyAPI"]).directive("duScrollspy",["spyAPI","duScrollOffset","$timeout","$rootScope",function(e,t,n,r){"use strict";var o=function(e,t,n,r){angular.isElement(e)?this.target=e:angular.isString(e)&&(this.targetId=e),this.$scope=t,this.$element=n,this.offset=r};return o.prototype.getTargetElement=function(){return!this.target&&this.targetId&&(this.target=document.getElementById(this.targetId)||document.getElementsByName(this.targetId)[0]),this.target},o.prototype.getTargetPosition=function(){var e=this.getTargetElement();return e?e.getBoundingClientRect():void 0},o.prototype.flushTargetCache=function(){this.targetId&&(this.target=void 0)},{link:function(l,u,c){var i,a=c.ngHref||c.href;if(a&&-1!==a.indexOf("#")?i=a.replace(/.*(?=#[^\s]+$)/,"").substring(1):c.duScrollspy?i=c.duScrollspy:c.duSmoothScroll&&(i=c.duSmoothScroll),i){var s=n(function(){var n=new o(i,l,u,-(c.offset?parseInt(c.offset,10):t));e.addSpy(n),l.$on("$locationChangeSuccess",n.flushTargetCache.bind(n));var a=r.$on("$stateChangeSuccess",n.flushTargetCache.bind(n));l.$on("$destroy",function(){e.removeSpy(n),a()})},0,!1);l.$on("$destroy",function(){n.cancel(s)})}}}}]);
|
|
2
|
-
//# sourceMappingURL=angular-scroll.min.js.map
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/*! ngclipboard - v1.1.1 - 2016-02-26
|
|
2
|
+
* https://github.com/sachinchoolur/ngclipboard
|
|
3
|
+
* Copyright (c) 2016 Sachin; Licensed MIT */
|
|
4
|
+
(function() {
|
|
5
|
+
'use strict';
|
|
6
|
+
var MODULE_NAME = 'ngclipboard';
|
|
7
|
+
var angular, Clipboard;
|
|
8
|
+
|
|
9
|
+
// Check for CommonJS support
|
|
10
|
+
if (typeof module === 'object' && module.exports) {
|
|
11
|
+
angular = require('angular');
|
|
12
|
+
Clipboard = require('clipboard');
|
|
13
|
+
module.exports = MODULE_NAME;
|
|
14
|
+
} else {
|
|
15
|
+
angular = window.angular;
|
|
16
|
+
Clipboard = window.Clipboard;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
angular.module(MODULE_NAME, []).directive('ngclipboard', function() {
|
|
20
|
+
return {
|
|
21
|
+
restrict: 'A',
|
|
22
|
+
scope: {
|
|
23
|
+
ngclipboardSuccess: '&',
|
|
24
|
+
ngclipboardError: '&'
|
|
25
|
+
},
|
|
26
|
+
link: function(scope, element) {
|
|
27
|
+
var clipboard = new Clipboard(element[0]);
|
|
28
|
+
|
|
29
|
+
clipboard.on('success', function(e) {
|
|
30
|
+
scope.$apply(function () {
|
|
31
|
+
scope.ngclipboardSuccess({
|
|
32
|
+
e: e
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
clipboard.on('error', function(e) {
|
|
38
|
+
scope.$apply(function () {
|
|
39
|
+
scope.ngclipboardError({
|
|
40
|
+
e: e
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
});
|
|
48
|
+
}());
|
|
@@ -4,6 +4,9 @@ module Apidoco
|
|
|
4
4
|
class ApisController < ApplicationController
|
|
5
5
|
before_action :set_version_parser
|
|
6
6
|
|
|
7
|
+
http_basic_authenticate_with name: Apidoco.auth_name, password: Apidoco.auth_password,
|
|
8
|
+
if: proc { Apidoco.auth_name && Apidoco.auth_password }
|
|
9
|
+
|
|
7
10
|
def index
|
|
8
11
|
redirect_to api_path(id: @vp.documentations.first.name)
|
|
9
12
|
end
|
|
@@ -29,8 +29,13 @@
|
|
|
29
29
|
<h4>{{x.name}}</h4>
|
|
30
30
|
<div class="row mt-10">
|
|
31
31
|
<div class="col-lg-2 text-right">End Point:</div>
|
|
32
|
-
<div class="col-lg-
|
|
33
|
-
<
|
|
32
|
+
<div class="col-lg-5">
|
|
33
|
+
<div class="input-group">
|
|
34
|
+
<input type="text" readonly class="form-control" value="{{x.end_point}}">
|
|
35
|
+
<span class="input-group-btn">
|
|
36
|
+
<button class="btn btn-default" type="button" ngclipboard data-clipboard-text="{{x.end_point}}">Copy</button>
|
|
37
|
+
</span>
|
|
38
|
+
</div>
|
|
34
39
|
</div>
|
|
35
40
|
</div>
|
|
36
41
|
|
|
@@ -39,7 +44,7 @@
|
|
|
39
44
|
<div class="col-lg-10">{{x.http_method}}</div>
|
|
40
45
|
</div>
|
|
41
46
|
|
|
42
|
-
<div class="row mt-10" ng-if="
|
|
47
|
+
<div class="row mt-10" ng-if="x.header">
|
|
43
48
|
<div class="col-lg-2 text-right">Headers:</div>
|
|
44
49
|
<div class="col-lg-10">
|
|
45
50
|
<p ng-repeat="(key, value) in x.header">
|
|
@@ -52,7 +57,7 @@
|
|
|
52
57
|
</div>
|
|
53
58
|
</div>
|
|
54
59
|
|
|
55
|
-
<div class="row mt-10" ng-if="params && params.length > 0">
|
|
60
|
+
<div class="row mt-10" ng-if="x.params && x.params.length > 0">
|
|
56
61
|
<div class="col-lg-2 text-right">Params:</div>
|
|
57
62
|
<div class="col-lg-10">
|
|
58
63
|
<p ng-repeat="param in x.params">
|
|
@@ -65,7 +70,7 @@
|
|
|
65
70
|
</div>
|
|
66
71
|
</div>
|
|
67
72
|
|
|
68
|
-
<div class="row mt-10" ng-if="x.notes
|
|
73
|
+
<div class="row mt-10" ng-if="x.notes">
|
|
69
74
|
<div class="col-lg-2 text-right">Notes:</div>
|
|
70
75
|
<div class="col-lg-10">
|
|
71
76
|
<p ng-repeat="note in x.notes">
|
|
@@ -79,12 +84,26 @@
|
|
|
79
84
|
<div class="col-lg-10">
|
|
80
85
|
<div ng-repeat="example in x.examples">
|
|
81
86
|
<div ng-if="example.request">
|
|
82
|
-
<
|
|
83
|
-
|
|
87
|
+
<div class="panel panel-default">
|
|
88
|
+
<div class="panel-heading">
|
|
89
|
+
<h4 class="panel-title">Request</h4>
|
|
90
|
+
</div>
|
|
91
|
+
<div class="panel-body">
|
|
92
|
+
<button class="btn btn-default btn-sm pull-right" ngclipboard data-clipboard-text="{{example.request}}">Copy</button>
|
|
93
|
+
<div jq-json-viewer data="example.request"></div>
|
|
94
|
+
</div>
|
|
95
|
+
</div>
|
|
84
96
|
</div>
|
|
85
97
|
<div ng-if="example.response">
|
|
86
|
-
<
|
|
87
|
-
|
|
98
|
+
<div class="panel panel-default">
|
|
99
|
+
<div class="panel-heading">
|
|
100
|
+
<h4 class="panel-title">Response</h4>
|
|
101
|
+
</div>
|
|
102
|
+
<div class="panel-body">
|
|
103
|
+
<button class="btn btn-default btn-sm pull-right" ngclipboard data-clipboard-text="{{example.response}}">Copy</button>
|
|
104
|
+
<div jq-json-viewer data="example.response"></div>
|
|
105
|
+
</div>
|
|
106
|
+
</div>
|
|
88
107
|
</div>
|
|
89
108
|
</div>
|
|
90
109
|
</div>
|
data/lib/apidoco.rb
CHANGED
data/lib/apidoco/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: apidoco
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.
|
|
4
|
+
version: 1.3.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Al Ameen
|
|
8
8
|
- Sufinsha Musthafa
|
|
9
9
|
- Nidhin S G
|
|
10
|
+
- Aby George
|
|
10
11
|
autorequire:
|
|
11
12
|
bindir: bin
|
|
12
13
|
cert_chain: []
|
|
13
|
-
date: 2017-04-
|
|
14
|
+
date: 2017-04-17 00:00:00.000000000 Z
|
|
14
15
|
dependencies:
|
|
15
16
|
- !ruby/object:Gem::Dependency
|
|
16
17
|
name: rails
|
|
@@ -98,7 +99,7 @@ dependencies:
|
|
|
98
99
|
version: '0'
|
|
99
100
|
description: Document Rest APIs.
|
|
100
101
|
email:
|
|
101
|
-
-
|
|
102
|
+
- alameenkhader@gmail.com
|
|
102
103
|
- nidhinsg@gmail.com
|
|
103
104
|
executables: []
|
|
104
105
|
extensions: []
|
|
@@ -111,9 +112,11 @@ files:
|
|
|
111
112
|
- app/assets/javascripts/apidoco/apidoco_app.js
|
|
112
113
|
- app/assets/javascripts/apidoco/application.js
|
|
113
114
|
- app/assets/javascripts/apidoco/bootstrap/bootstrap.min.js
|
|
115
|
+
- app/assets/javascripts/apidoco/clipboard.min.js
|
|
114
116
|
- app/assets/javascripts/apidoco/controllers/documentations_controller.js
|
|
115
117
|
- app/assets/javascripts/apidoco/directives/angular_scroll.min.js
|
|
116
118
|
- app/assets/javascripts/apidoco/directives/jq_json_viewer.js
|
|
119
|
+
- app/assets/javascripts/apidoco/directives/ngclipboard.js
|
|
117
120
|
- app/assets/javascripts/apidoco/jquery.json-viewer.js
|
|
118
121
|
- app/assets/javascripts/apidoco/jquery.min.js
|
|
119
122
|
- app/assets/stylesheets/apidoco/application.css
|
|
@@ -194,7 +197,7 @@ files:
|
|
|
194
197
|
- spec/generators/apidoco_generator_spec.rb
|
|
195
198
|
- spec/rails_helper.rb
|
|
196
199
|
- spec/spec_helper.rb
|
|
197
|
-
homepage: https://github.com/
|
|
200
|
+
homepage: https://github.com/72pulses/apidoco
|
|
198
201
|
licenses:
|
|
199
202
|
- MIT
|
|
200
203
|
metadata: {}
|