praxis 0.0.1 → 0.9

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 (484) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +11 -0
  3. data/.rspec +3 -0
  4. data/.ruby-version +1 -0
  5. data/.simplecov +7 -0
  6. data/.travis.yml +4 -0
  7. data/CONTRIBUTING.md +183 -0
  8. data/Gemfile +3 -0
  9. data/Guardfile +8 -0
  10. data/LICENSE +22 -0
  11. data/MAINTAINERS +2 -0
  12. data/MAINTAINERS.md +86 -0
  13. data/README.md +69 -3
  14. data/Rakefile +18 -0
  15. data/bin/praxis +10 -0
  16. data/lib/api_browser/.bowerrc +3 -0
  17. data/lib/api_browser/.editorconfig +21 -0
  18. data/lib/api_browser/Gruntfile.js +264 -0
  19. data/lib/api_browser/app/bower_components/angular/.bower.json +16 -0
  20. data/lib/api_browser/app/bower_components/angular/README.md +48 -0
  21. data/lib/api_browser/app/bower_components/angular/angular-csp.css +18 -0
  22. data/lib/api_browser/app/bower_components/angular/angular.js +21464 -0
  23. data/lib/api_browser/app/bower_components/angular/angular.min.js +210 -0
  24. data/lib/api_browser/app/bower_components/angular/angular.min.js.gzip +0 -0
  25. data/lib/api_browser/app/bower_components/angular/angular.min.js.map +8 -0
  26. data/lib/api_browser/app/bower_components/angular/bower.json +7 -0
  27. data/lib/api_browser/app/bower_components/angular-sanitize/.bower.json +19 -0
  28. data/lib/api_browser/app/bower_components/angular-sanitize/README.md +54 -0
  29. data/lib/api_browser/app/bower_components/angular-sanitize/angular-sanitize.js +624 -0
  30. data/lib/api_browser/app/bower_components/angular-sanitize/angular-sanitize.min.js +14 -0
  31. data/lib/api_browser/app/bower_components/angular-sanitize/angular-sanitize.min.js.map +8 -0
  32. data/lib/api_browser/app/bower_components/angular-sanitize/bower.json +8 -0
  33. data/lib/api_browser/app/bower_components/angular-ui-bootstrap-bower/.bower.json +24 -0
  34. data/lib/api_browser/app/bower_components/angular-ui-bootstrap-bower/bower.json +11 -0
  35. data/lib/api_browser/app/bower_components/angular-ui-bootstrap-bower/ui-bootstrap-tpls.js +4116 -0
  36. data/lib/api_browser/app/bower_components/angular-ui-bootstrap-bower/ui-bootstrap-tpls.min.js +10 -0
  37. data/lib/api_browser/app/bower_components/angular-ui-bootstrap-bower/ui-bootstrap.js +3799 -0
  38. data/lib/api_browser/app/bower_components/angular-ui-bootstrap-bower/ui-bootstrap.min.js +9 -0
  39. data/lib/api_browser/app/bower_components/angular-ui-router/.bower.json +34 -0
  40. data/lib/api_browser/app/bower_components/angular-ui-router/CHANGELOG.md +23 -0
  41. data/lib/api_browser/app/bower_components/angular-ui-router/LICENSE +21 -0
  42. data/lib/api_browser/app/bower_components/angular-ui-router/README.md +280 -0
  43. data/lib/api_browser/app/bower_components/angular-ui-router/bower.json +23 -0
  44. data/lib/api_browser/app/bower_components/angular-ui-router/release/angular-ui-router.js +3223 -0
  45. data/lib/api_browser/app/bower_components/angular-ui-router/release/angular-ui-router.min.js +7 -0
  46. data/lib/api_browser/app/bower_components/angular-ui-router/src/common.js +246 -0
  47. data/lib/api_browser/app/bower_components/angular-ui-router/src/compat.js +146 -0
  48. data/lib/api_browser/app/bower_components/angular-ui-router/src/resolve.js +242 -0
  49. data/lib/api_browser/app/bower_components/angular-ui-router/src/state.js +1204 -0
  50. data/lib/api_browser/app/bower_components/angular-ui-router/src/stateDirectives.js +226 -0
  51. data/lib/api_browser/app/bower_components/angular-ui-router/src/stateFilters.js +35 -0
  52. data/lib/api_browser/app/bower_components/angular-ui-router/src/templateFactory.js +110 -0
  53. data/lib/api_browser/app/bower_components/angular-ui-router/src/urlMatcherFactory.js +325 -0
  54. data/lib/api_browser/app/bower_components/angular-ui-router/src/urlRouter.js +273 -0
  55. data/lib/api_browser/app/bower_components/angular-ui-router/src/view.js +71 -0
  56. data/lib/api_browser/app/bower_components/angular-ui-router/src/viewDirective.js +290 -0
  57. data/lib/api_browser/app/bower_components/angular-ui-router/src/viewScroll.js +52 -0
  58. data/lib/api_browser/app/bower_components/bootstrap-sass/.bower.json +26 -0
  59. data/lib/api_browser/app/bower_components/bootstrap-sass/CNAME +1 -0
  60. data/lib/api_browser/app/bower_components/bootstrap-sass/CONTRIBUTING.md +61 -0
  61. data/lib/api_browser/app/bower_components/bootstrap-sass/DOCS-LICENSE +319 -0
  62. data/lib/api_browser/app/bower_components/bootstrap-sass/Gemfile +5 -0
  63. data/lib/api_browser/app/bower_components/bootstrap-sass/Gemfile.lock +14 -0
  64. data/lib/api_browser/app/bower_components/bootstrap-sass/Gruntfile.js +244 -0
  65. data/lib/api_browser/app/bower_components/bootstrap-sass/LICENSE +176 -0
  66. data/lib/api_browser/app/bower_components/bootstrap-sass/LICENSE-MIT +21 -0
  67. data/lib/api_browser/app/bower_components/bootstrap-sass/README.md +277 -0
  68. data/lib/api_browser/app/bower_components/bootstrap-sass/Rakefile +44 -0
  69. data/lib/api_browser/app/bower_components/bootstrap-sass/_config.yml +25 -0
  70. data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/ads.html +1 -0
  71. data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/footer.html +34 -0
  72. data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/header.html +42 -0
  73. data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/nav-about.html +12 -0
  74. data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/nav-components.html +137 -0
  75. data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/nav-css.html +99 -0
  76. data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/nav-customize.html +40 -0
  77. data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/nav-getting-started.html +44 -0
  78. data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/nav-javascript.html +88 -0
  79. data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/nav-main.html +37 -0
  80. data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/old-bs-docs.html +8 -0
  81. data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/social-buttons.html +16 -0
  82. data/lib/api_browser/app/bower_components/bootstrap-sass/_layouts/default.html +79 -0
  83. data/lib/api_browser/app/bower_components/bootstrap-sass/_layouts/home.html +47 -0
  84. data/lib/api_browser/app/bower_components/bootstrap-sass/about.html +93 -0
  85. data/lib/api_browser/app/bower_components/bootstrap-sass/bower.json +11 -0
  86. data/lib/api_browser/app/bower_components/bootstrap-sass/browserstack.json +37 -0
  87. data/lib/api_browser/app/bower_components/bootstrap-sass/components.html +3689 -0
  88. data/lib/api_browser/app/bower_components/bootstrap-sass/composer.json +28 -0
  89. data/lib/api_browser/app/bower_components/bootstrap-sass/css.html +2674 -0
  90. data/lib/api_browser/app/bower_components/bootstrap-sass/customize.html +1715 -0
  91. data/lib/api_browser/app/bower_components/bootstrap-sass/dist/css/bootstrap-theme.css +427 -0
  92. data/lib/api_browser/app/bower_components/bootstrap-sass/dist/css/bootstrap-theme.min.css +1 -0
  93. data/lib/api_browser/app/bower_components/bootstrap-sass/dist/css/bootstrap.css +6350 -0
  94. data/lib/api_browser/app/bower_components/bootstrap-sass/dist/css/bootstrap.min.css +1 -0
  95. data/lib/api_browser/app/bower_components/bootstrap-sass/dist/fonts/glyphicons-halflings-regular.eot +0 -0
  96. data/lib/api_browser/app/bower_components/bootstrap-sass/dist/fonts/glyphicons-halflings-regular.svg +229 -0
  97. data/lib/api_browser/app/bower_components/bootstrap-sass/dist/fonts/glyphicons-halflings-regular.ttf +0 -0
  98. data/lib/api_browser/app/bower_components/bootstrap-sass/dist/fonts/glyphicons-halflings-regular.woff +0 -0
  99. data/lib/api_browser/app/bower_components/bootstrap-sass/dist/js/bootstrap.js +2002 -0
  100. data/lib/api_browser/app/bower_components/bootstrap-sass/dist/js/bootstrap.min.js +9 -0
  101. data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/css/docs.css +1195 -0
  102. data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/css/pygments-manni.css +66 -0
  103. data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/ico/apple-touch-icon-144-precomposed.png +0 -0
  104. data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/ico/favicon.png +0 -0
  105. data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/js/application.js +103 -0
  106. data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/js/customizer.js +332 -0
  107. data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/js/filesaver.js +169 -0
  108. data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/js/holder.js +404 -0
  109. data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/js/ie8-responsive-file-warning.js +12 -0
  110. data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/js/jszip.js +1467 -0
  111. data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/js/less.js +9 -0
  112. data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/js/raw-files.js +3 -0
  113. data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/js/uglify.js +14 -0
  114. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/carousel/carousel.css +148 -0
  115. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/carousel/index.html +206 -0
  116. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/grid/grid.css +28 -0
  117. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/grid/index.html +148 -0
  118. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/jumbotron/index.html +99 -0
  119. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/jumbotron/jumbotron.css +5 -0
  120. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/jumbotron-narrow/index.html +82 -0
  121. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/jumbotron-narrow/jumbotron-narrow.css +79 -0
  122. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/justified-nav/index.html +83 -0
  123. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/justified-nav/justified-nav.css +88 -0
  124. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/navbar/index.html +88 -0
  125. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/navbar/navbar.css +8 -0
  126. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/navbar-fixed-top/index.html +91 -0
  127. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/navbar-fixed-top/navbar-fixed-top.css +4 -0
  128. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/navbar-static-top/index.html +92 -0
  129. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/navbar-static-top/navbar-static-top.css +7 -0
  130. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/non-responsive/index.html +101 -0
  131. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/non-responsive/non-responsive.css +116 -0
  132. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/offcanvas/index.html +130 -0
  133. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/offcanvas/offcanvas.css +50 -0
  134. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/offcanvas/offcanvas.js +5 -0
  135. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/carousel.jpg +0 -0
  136. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/grid.jpg +0 -0
  137. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/jumbotron-narrow.jpg +0 -0
  138. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/jumbotron.jpg +0 -0
  139. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/justified-nav.jpg +0 -0
  140. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/navbar-fixed.jpg +0 -0
  141. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/navbar-static.jpg +0 -0
  142. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/navbar.jpg +0 -0
  143. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/non-responsive.jpg +0 -0
  144. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/offcanvas.jpg +0 -0
  145. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/sign-in.jpg +0 -0
  146. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/starter-template.jpg +0 -0
  147. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/sticky-footer-navbar.jpg +0 -0
  148. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/sticky-footer.jpg +0 -0
  149. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/theme.jpg +0 -0
  150. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/signin/index.html +50 -0
  151. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/signin/signin.css +40 -0
  152. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/starter-template/index.html +68 -0
  153. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/starter-template/starter-template.css +7 -0
  154. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/sticky-footer/index.html +55 -0
  155. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/sticky-footer/sticky-footer.css +38 -0
  156. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/sticky-footer-navbar/index.html +91 -0
  157. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/sticky-footer-navbar/sticky-footer-navbar.css +45 -0
  158. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/theme/index.html +384 -0
  159. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/theme/theme.css +14 -0
  160. data/lib/api_browser/app/bower_components/bootstrap-sass/fonts/glyphicons-halflings-regular.eot +0 -0
  161. data/lib/api_browser/app/bower_components/bootstrap-sass/fonts/glyphicons-halflings-regular.svg +229 -0
  162. data/lib/api_browser/app/bower_components/bootstrap-sass/fonts/glyphicons-halflings-regular.ttf +0 -0
  163. data/lib/api_browser/app/bower_components/bootstrap-sass/fonts/glyphicons-halflings-regular.woff +0 -0
  164. data/lib/api_browser/app/bower_components/bootstrap-sass/getting-started.html +1021 -0
  165. data/lib/api_browser/app/bower_components/bootstrap-sass/index.html +16 -0
  166. data/lib/api_browser/app/bower_components/bootstrap-sass/javascript.html +1983 -0
  167. data/lib/api_browser/app/bower_components/bootstrap-sass/js/affix.js +126 -0
  168. data/lib/api_browser/app/bower_components/bootstrap-sass/js/alert.js +98 -0
  169. data/lib/api_browser/app/bower_components/bootstrap-sass/js/button.js +109 -0
  170. data/lib/api_browser/app/bower_components/bootstrap-sass/js/carousel.js +217 -0
  171. data/lib/api_browser/app/bower_components/bootstrap-sass/js/collapse.js +179 -0
  172. data/lib/api_browser/app/bower_components/bootstrap-sass/js/dropdown.js +154 -0
  173. data/lib/api_browser/app/bower_components/bootstrap-sass/js/modal.js +246 -0
  174. data/lib/api_browser/app/bower_components/bootstrap-sass/js/popover.js +117 -0
  175. data/lib/api_browser/app/bower_components/bootstrap-sass/js/scrollspy.js +158 -0
  176. data/lib/api_browser/app/bower_components/bootstrap-sass/js/tab.js +135 -0
  177. data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/index.html +52 -0
  178. data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/affix.js +25 -0
  179. data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/alert.js +62 -0
  180. data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/button.js +116 -0
  181. data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/carousel.js +87 -0
  182. data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/collapse.js +164 -0
  183. data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/dropdown.js +219 -0
  184. data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/modal.js +196 -0
  185. data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/phantom.js +69 -0
  186. data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/popover.js +133 -0
  187. data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/scrollspy.js +37 -0
  188. data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/tab.js +86 -0
  189. data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/tooltip.js +437 -0
  190. data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/transition.js +13 -0
  191. data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/vendor/jquery.js +6 -0
  192. data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/vendor/qunit.css +232 -0
  193. data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/vendor/qunit.js +1510 -0
  194. data/lib/api_browser/app/bower_components/bootstrap-sass/js/tooltip.js +386 -0
  195. data/lib/api_browser/app/bower_components/bootstrap-sass/js/transition.js +56 -0
  196. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_alerts.scss +67 -0
  197. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_badges.scss +51 -0
  198. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_breadcrumbs.scss +23 -0
  199. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_button-groups.scss +253 -0
  200. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_buttons.scss +158 -0
  201. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_carousel.scss +231 -0
  202. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_close.scss +35 -0
  203. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_code.scss +53 -0
  204. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_component-animations.scss +29 -0
  205. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_dropdowns.scss +193 -0
  206. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_forms.scss +363 -0
  207. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_glyphicons.scss +237 -0
  208. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_grid.scss +93 -0
  209. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_input-groups.scss +136 -0
  210. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_jumbotron.scss +40 -0
  211. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_labels.scss +58 -0
  212. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_list-group.scss +88 -0
  213. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_media.scss +56 -0
  214. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_mixins.scss +861 -0
  215. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_modals.scss +132 -0
  216. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_navbar.scss +628 -0
  217. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_navs.scss +262 -0
  218. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_normalize.scss +406 -0
  219. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_pager.scss +55 -0
  220. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_pagination.scss +85 -0
  221. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_panels.scss +172 -0
  222. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_popovers.scss +133 -0
  223. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_print.scss +105 -0
  224. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_progress-bars.scss +92 -0
  225. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_responsive-utilities.scss +198 -0
  226. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_scaffolding.scss +119 -0
  227. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_tables.scss +244 -0
  228. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_theme.scss +247 -0
  229. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_thumbnails.scss +32 -0
  230. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_tooltip.scss +95 -0
  231. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_type.scss +279 -0
  232. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_utilities.scss +56 -0
  233. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_variables.scss +637 -0
  234. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_wells.scss +29 -0
  235. data/lib/api_browser/app/bower_components/bootstrap-sass/lib/bootstrap.scss +49 -0
  236. data/lib/api_browser/app/bower_components/bootstrap-sass/package.json +40 -0
  237. data/lib/api_browser/app/bower_components/jquery/.bower.json +38 -0
  238. data/lib/api_browser/app/bower_components/jquery/MIT-LICENSE.txt +21 -0
  239. data/lib/api_browser/app/bower_components/jquery/bower.json +27 -0
  240. data/lib/api_browser/app/bower_components/jquery/dist/jquery.js +9190 -0
  241. data/lib/api_browser/app/bower_components/jquery/dist/jquery.min.js +5 -0
  242. data/lib/api_browser/app/bower_components/jquery/dist/jquery.min.map +1 -0
  243. data/lib/api_browser/app/bower_components/jquery/src/ajax/jsonp.js +89 -0
  244. data/lib/api_browser/app/bower_components/jquery/src/ajax/load.js +75 -0
  245. data/lib/api_browser/app/bower_components/jquery/src/ajax/parseJSON.js +13 -0
  246. data/lib/api_browser/app/bower_components/jquery/src/ajax/parseXML.js +28 -0
  247. data/lib/api_browser/app/bower_components/jquery/src/ajax/script.js +64 -0
  248. data/lib/api_browser/app/bower_components/jquery/src/ajax/var/nonce.js +5 -0
  249. data/lib/api_browser/app/bower_components/jquery/src/ajax/var/rquery.js +3 -0
  250. data/lib/api_browser/app/bower_components/jquery/src/ajax/xhr.js +135 -0
  251. data/lib/api_browser/app/bower_components/jquery/src/ajax.js +806 -0
  252. data/lib/api_browser/app/bower_components/jquery/src/attributes/attr.js +143 -0
  253. data/lib/api_browser/app/bower_components/jquery/src/attributes/classes.js +158 -0
  254. data/lib/api_browser/app/bower_components/jquery/src/attributes/prop.js +96 -0
  255. data/lib/api_browser/app/bower_components/jquery/src/attributes/support.js +35 -0
  256. data/lib/api_browser/app/bower_components/jquery/src/attributes/val.js +163 -0
  257. data/lib/api_browser/app/bower_components/jquery/src/attributes.js +11 -0
  258. data/lib/api_browser/app/bower_components/jquery/src/callbacks.js +205 -0
  259. data/lib/api_browser/app/bower_components/jquery/src/core/access.js +60 -0
  260. data/lib/api_browser/app/bower_components/jquery/src/core/init.js +123 -0
  261. data/lib/api_browser/app/bower_components/jquery/src/core/parseHTML.js +39 -0
  262. data/lib/api_browser/app/bower_components/jquery/src/core/ready.js +97 -0
  263. data/lib/api_browser/app/bower_components/jquery/src/core/var/rsingleTag.js +4 -0
  264. data/lib/api_browser/app/bower_components/jquery/src/core.js +498 -0
  265. data/lib/api_browser/app/bower_components/jquery/src/css/addGetHookIf.js +24 -0
  266. data/lib/api_browser/app/bower_components/jquery/src/css/curCSS.js +57 -0
  267. data/lib/api_browser/app/bower_components/jquery/src/css/defaultDisplay.js +70 -0
  268. data/lib/api_browser/app/bower_components/jquery/src/css/hiddenVisibleSelectors.js +15 -0
  269. data/lib/api_browser/app/bower_components/jquery/src/css/support.js +91 -0
  270. data/lib/api_browser/app/bower_components/jquery/src/css/swap.js +28 -0
  271. data/lib/api_browser/app/bower_components/jquery/src/css/var/cssExpand.js +3 -0
  272. data/lib/api_browser/app/bower_components/jquery/src/css/var/getStyles.js +5 -0
  273. data/lib/api_browser/app/bower_components/jquery/src/css/var/isHidden.js +13 -0
  274. data/lib/api_browser/app/bower_components/jquery/src/css/var/rmargin.js +3 -0
  275. data/lib/api_browser/app/bower_components/jquery/src/css/var/rnumnonpx.js +5 -0
  276. data/lib/api_browser/app/bower_components/jquery/src/css.js +451 -0
  277. data/lib/api_browser/app/bower_components/jquery/src/data/Data.js +181 -0
  278. data/lib/api_browser/app/bower_components/jquery/src/data/accepts.js +20 -0
  279. data/lib/api_browser/app/bower_components/jquery/src/data/var/data_priv.js +5 -0
  280. data/lib/api_browser/app/bower_components/jquery/src/data/var/data_user.js +5 -0
  281. data/lib/api_browser/app/bower_components/jquery/src/data.js +179 -0
  282. data/lib/api_browser/app/bower_components/jquery/src/deferred.js +149 -0
  283. data/lib/api_browser/app/bower_components/jquery/src/deprecated.js +13 -0
  284. data/lib/api_browser/app/bower_components/jquery/src/dimensions.js +50 -0
  285. data/lib/api_browser/app/bower_components/jquery/src/effects/Tween.js +114 -0
  286. data/lib/api_browser/app/bower_components/jquery/src/effects/animatedSelector.js +13 -0
  287. data/lib/api_browser/app/bower_components/jquery/src/effects.js +649 -0
  288. data/lib/api_browser/app/bower_components/jquery/src/event/alias.js +39 -0
  289. data/lib/api_browser/app/bower_components/jquery/src/event/support.js +9 -0
  290. data/lib/api_browser/app/bower_components/jquery/src/event.js +868 -0
  291. data/lib/api_browser/app/bower_components/jquery/src/exports/amd.js +24 -0
  292. data/lib/api_browser/app/bower_components/jquery/src/exports/global.js +32 -0
  293. data/lib/api_browser/app/bower_components/jquery/src/intro.js +44 -0
  294. data/lib/api_browser/app/bower_components/jquery/src/jquery.js +36 -0
  295. data/lib/api_browser/app/bower_components/jquery/src/manipulation/_evalUrl.js +18 -0
  296. data/lib/api_browser/app/bower_components/jquery/src/manipulation/support.js +31 -0
  297. data/lib/api_browser/app/bower_components/jquery/src/manipulation/var/rcheckableType.js +3 -0
  298. data/lib/api_browser/app/bower_components/jquery/src/manipulation.js +582 -0
  299. data/lib/api_browser/app/bower_components/jquery/src/offset.js +204 -0
  300. data/lib/api_browser/app/bower_components/jquery/src/outro.js +1 -0
  301. data/lib/api_browser/app/bower_components/jquery/src/queue/delay.js +22 -0
  302. data/lib/api_browser/app/bower_components/jquery/src/queue.js +142 -0
  303. data/lib/api_browser/app/bower_components/jquery/src/selector-native.js +172 -0
  304. data/lib/api_browser/app/bower_components/jquery/src/selector-sizzle.js +14 -0
  305. data/lib/api_browser/app/bower_components/jquery/src/selector.js +1 -0
  306. data/lib/api_browser/app/bower_components/jquery/src/serialize.js +111 -0
  307. data/lib/api_browser/app/bower_components/jquery/src/sizzle/dist/sizzle.js +2044 -0
  308. data/lib/api_browser/app/bower_components/jquery/src/sizzle/dist/sizzle.min.js +3 -0
  309. data/lib/api_browser/app/bower_components/jquery/src/sizzle/dist/sizzle.min.map +1 -0
  310. data/lib/api_browser/app/bower_components/jquery/src/traversing/findFilter.js +100 -0
  311. data/lib/api_browser/app/bower_components/jquery/src/traversing/var/rneedsContext.js +6 -0
  312. data/lib/api_browser/app/bower_components/jquery/src/traversing.js +200 -0
  313. data/lib/api_browser/app/bower_components/jquery/src/var/arr.js +3 -0
  314. data/lib/api_browser/app/bower_components/jquery/src/var/class2type.js +4 -0
  315. data/lib/api_browser/app/bower_components/jquery/src/var/concat.js +5 -0
  316. data/lib/api_browser/app/bower_components/jquery/src/var/hasOwn.js +5 -0
  317. data/lib/api_browser/app/bower_components/jquery/src/var/indexOf.js +5 -0
  318. data/lib/api_browser/app/bower_components/jquery/src/var/pnum.js +3 -0
  319. data/lib/api_browser/app/bower_components/jquery/src/var/push.js +5 -0
  320. data/lib/api_browser/app/bower_components/jquery/src/var/rnotwhite.js +3 -0
  321. data/lib/api_browser/app/bower_components/jquery/src/var/slice.js +5 -0
  322. data/lib/api_browser/app/bower_components/jquery/src/var/strundefined.js +3 -0
  323. data/lib/api_browser/app/bower_components/jquery/src/var/support.js +4 -0
  324. data/lib/api_browser/app/bower_components/jquery/src/var/toString.js +5 -0
  325. data/lib/api_browser/app/bower_components/jquery/src/wrap.js +78 -0
  326. data/lib/api_browser/app/bower_components/lodash/.bower.json +34 -0
  327. data/lib/api_browser/app/bower_components/lodash/LICENSE.txt +22 -0
  328. data/lib/api_browser/app/bower_components/lodash/bower.json +23 -0
  329. data/lib/api_browser/app/bower_components/lodash/dist/lodash.compat.js +7157 -0
  330. data/lib/api_browser/app/bower_components/lodash/dist/lodash.compat.min.js +61 -0
  331. data/lib/api_browser/app/bower_components/lodash/dist/lodash.js +6785 -0
  332. data/lib/api_browser/app/bower_components/lodash/dist/lodash.min.js +56 -0
  333. data/lib/api_browser/app/bower_components/lodash/dist/lodash.underscore.js +4979 -0
  334. data/lib/api_browser/app/bower_components/lodash/dist/lodash.underscore.min.js +39 -0
  335. data/lib/api_browser/app/css/main.css +4510 -0
  336. data/lib/api_browser/app/index.html +51 -0
  337. data/lib/api_browser/app/js/app.js +32 -0
  338. data/lib/api_browser/app/js/controllers/action.js +51 -0
  339. data/lib/api_browser/app/js/controllers/controller.js +10 -0
  340. data/lib/api_browser/app/js/controllers/menu.js +49 -0
  341. data/lib/api_browser/app/js/controllers/type.js +28 -0
  342. data/lib/api_browser/app/js/directives/attribute_description.js +43 -0
  343. data/lib/api_browser/app/js/directives/attribute_table.js +27 -0
  344. data/lib/api_browser/app/js/directives/attribute_table_row.js +17 -0
  345. data/lib/api_browser/app/js/directives/no_container.js +8 -0
  346. data/lib/api_browser/app/js/directives/request_body.js +25 -0
  347. data/lib/api_browser/app/js/directives/request_headers.js +20 -0
  348. data/lib/api_browser/app/js/directives/request_parameters.js +20 -0
  349. data/lib/api_browser/app/js/directives/type_label.js +53 -0
  350. data/lib/api_browser/app/js/factories/Documentation.js +16 -0
  351. data/lib/api_browser/app/js/factories/PayloadTemplates.js +10 -0
  352. data/lib/api_browser/app/js/factories/TemplateProvider.js +45 -0
  353. data/lib/api_browser/app/js/factories/TypeTemplates.js +11 -0
  354. data/lib/api_browser/app/js/filters/attribute_name.js +9 -0
  355. data/lib/api_browser/app/js/filters/friendly_json.js +5 -0
  356. data/lib/api_browser/app/js/filters/is_empty.js +8 -0
  357. data/lib/api_browser/app/js/filters/resource_name.js +5 -0
  358. data/lib/api_browser/app/sass/main.scss +59 -0
  359. data/lib/api_browser/app/sass/modules/_body.scss +11 -0
  360. data/lib/api_browser/app/sass/modules/_cloke.scss +8 -0
  361. data/lib/api_browser/app/sass/modules/_header.scss +15 -0
  362. data/lib/api_browser/app/sass/modules/_nav.scss +7 -0
  363. data/lib/api_browser/app/sass/modules/_sidebar.scss +26 -0
  364. data/lib/api_browser/app/sass/modules/_switch.scss +55 -0
  365. data/lib/api_browser/app/sass/modules/_table.scss +13 -0
  366. data/lib/api_browser/app/sass/variables/_bootstrap-variables.scss +762 -0
  367. data/lib/api_browser/app/views/action.html +83 -0
  368. data/lib/api_browser/app/views/controller.html +24 -0
  369. data/lib/api_browser/app/views/directives/attribute_description/_default.html +2 -0
  370. data/lib/api_browser/app/views/directives/attribute_description/_example.html +8 -0
  371. data/lib/api_browser/app/views/directives/attribute_description/_headers.html +8 -0
  372. data/lib/api_browser/app/views/directives/attribute_description.html +2 -0
  373. data/lib/api_browser/app/views/directives/attribute_table.html +23 -0
  374. data/lib/api_browser/app/views/directives/attribute_table_row/_default.html +10 -0
  375. data/lib/api_browser/app/views/directives/attribute_table_row/_links.html +10 -0
  376. data/lib/api_browser/app/views/directives/attribute_table_row/_struct.html +2 -0
  377. data/lib/api_browser/app/views/directives/request_body/_default.html +20 -0
  378. data/lib/api_browser/app/views/directives/request_body/_struct.html +1 -0
  379. data/lib/api_browser/app/views/home.html +7 -0
  380. data/lib/api_browser/app/views/layout.html +50 -0
  381. data/lib/api_browser/app/views/resource/_actions.html +23 -0
  382. data/lib/api_browser/app/views/type/_details.html +29 -0
  383. data/lib/api_browser/app/views/type.html +25 -0
  384. data/lib/api_browser/bower.json +26 -0
  385. data/lib/api_browser/package.json +30 -0
  386. data/lib/praxis/action_definition/headers_dsl_compiler.rb +36 -0
  387. data/lib/praxis/action_definition.rb +153 -0
  388. data/lib/praxis/api_definition.rb +59 -0
  389. data/lib/praxis/application.rb +65 -0
  390. data/lib/praxis/bootloader.rb +91 -0
  391. data/lib/praxis/bootloader_stages/environment.rb +57 -0
  392. data/lib/praxis/bootloader_stages/file_loader.rb +31 -0
  393. data/lib/praxis/bootloader_stages/routing.rb +34 -0
  394. data/lib/praxis/bootloader_stages/subgroup_loader.rb +27 -0
  395. data/lib/praxis/bootloader_stages/warn_unloaded_files.rb +40 -0
  396. data/lib/praxis/config.rb +92 -0
  397. data/lib/praxis/content_type_parser.rb +62 -0
  398. data/lib/praxis/controller.rb +59 -0
  399. data/lib/praxis/dispatcher.rb +102 -0
  400. data/lib/praxis/exception.rb +4 -0
  401. data/lib/praxis/exceptions/config.rb +6 -0
  402. data/lib/praxis/exceptions/config_load.rb +9 -0
  403. data/lib/praxis/exceptions/config_validation.rb +9 -0
  404. data/lib/praxis/exceptions/invalid_configuration.rb +6 -0
  405. data/lib/praxis/exceptions/invalid_response.rb +6 -0
  406. data/lib/praxis/exceptions/invalid_trait.rb +6 -0
  407. data/lib/praxis/exceptions/stage_not_found.rb +6 -0
  408. data/lib/praxis/exceptions/validation.rb +6 -0
  409. data/lib/praxis/file_group.rb +39 -0
  410. data/lib/praxis/links.rb +110 -0
  411. data/lib/praxis/media_type.rb +40 -0
  412. data/lib/praxis/media_type_collection.rb +120 -0
  413. data/lib/praxis/multipart/parser.rb +213 -0
  414. data/lib/praxis/multipart/part.rb +26 -0
  415. data/lib/praxis/plugin.rb +30 -0
  416. data/lib/praxis/request.rb +131 -0
  417. data/lib/praxis/request_stages/action.rb +20 -0
  418. data/lib/praxis/request_stages/load_request.rb +13 -0
  419. data/lib/praxis/request_stages/request_stage.rb +52 -0
  420. data/lib/praxis/request_stages/response.rb +26 -0
  421. data/lib/praxis/request_stages/validate.rb +20 -0
  422. data/lib/praxis/request_stages/validate_params_and_headers.rb +38 -0
  423. data/lib/praxis/request_stages/validate_payload.rb +32 -0
  424. data/lib/praxis/resource_definition.rb +89 -0
  425. data/lib/praxis/response.rb +107 -0
  426. data/lib/praxis/response_definition.rb +264 -0
  427. data/lib/praxis/response_template.rb +34 -0
  428. data/lib/praxis/responses/http.rb +166 -0
  429. data/lib/praxis/responses/validation_error.rb +36 -0
  430. data/lib/praxis/route.rb +27 -0
  431. data/lib/praxis/router.rb +89 -0
  432. data/lib/praxis/simple_media_type.rb +24 -0
  433. data/lib/praxis/skeletor/restful_routing_config.rb +45 -0
  434. data/lib/praxis/stage.rb +94 -0
  435. data/lib/praxis/tasks/api_docs.rb +336 -0
  436. data/lib/praxis/tasks/console.rb +11 -0
  437. data/lib/praxis/tasks/environment.rb +5 -0
  438. data/lib/praxis/tasks/routes.rb +45 -0
  439. data/lib/praxis/tasks.rb +4 -0
  440. data/lib/praxis/types/collection.rb +17 -0
  441. data/lib/praxis/types/multipart.rb +69 -0
  442. data/lib/praxis/version.rb +3 -0
  443. data/lib/praxis.rb +119 -1
  444. data/praxis.gemspec +50 -0
  445. data/spec/functional_spec.rb +186 -0
  446. data/spec/praxis/action_definition_spec.rb +134 -0
  447. data/spec/praxis/api_resource_spec.rb +0 -0
  448. data/spec/praxis/application_spec.rb +46 -0
  449. data/spec/praxis/bootloader_spec.rb +58 -0
  450. data/spec/praxis/config_spec.rb +118 -0
  451. data/spec/praxis/content_type_parser_spec.rb +91 -0
  452. data/spec/praxis/controller_spec.rb +73 -0
  453. data/spec/praxis/dispatcher_spec.rb +0 -0
  454. data/spec/praxis/file_group_spec.rb +34 -0
  455. data/spec/praxis/links_spec.rb +45 -0
  456. data/spec/praxis/media_type_collection_spec.rb +145 -0
  457. data/spec/praxis/media_type_spec.rb +80 -0
  458. data/spec/praxis/multipart/parser_spec.rb +54 -0
  459. data/spec/praxis/request_spec.rb +109 -0
  460. data/spec/praxis/request_stages_validate_spec.rb +34 -0
  461. data/spec/praxis/resource_definition_spec.rb +116 -0
  462. data/spec/praxis/response_definition_spec.rb +500 -0
  463. data/spec/praxis/response_spec.rb +166 -0
  464. data/spec/praxis/restful_routing_config_spec.rb +88 -0
  465. data/spec/praxis/route_spec.rb +42 -0
  466. data/spec/praxis/router_spec.rb +148 -0
  467. data/spec/praxis/stage_spec.rb +110 -0
  468. data/spec/praxis/types/multipart_spec.rb +81 -0
  469. data/spec/spec_app/app/controllers/instances.rb +63 -0
  470. data/spec/spec_app/app/responses/bulk_response.rb +6 -0
  471. data/spec/spec_app/app/responses/multipart.rb +10 -0
  472. data/spec/spec_app/app/responses/other_response.rb +6 -0
  473. data/spec/spec_app/config/environment.rb +17 -0
  474. data/spec/spec_app/config.ru +17 -0
  475. data/spec/spec_app/design/api.rb +27 -0
  476. data/spec/spec_app/design/media_types/instance.rb +35 -0
  477. data/spec/spec_app/design/media_types/volume.rb +34 -0
  478. data/spec/spec_app/design/media_types/volume_snapshot.rb +38 -0
  479. data/spec/spec_app/design/resources/instances.rb +161 -0
  480. data/spec/spec_helper.rb +39 -0
  481. data/spec/support/spec_media_types.rb +46 -0
  482. data/spec/support/spec_resource_definitions.rb +33 -0
  483. data/tasks/praxis_app_generator.thor +307 -0
  484. metadata +847 -12
@@ -0,0 +1,94 @@
1
+ module Praxis
2
+
3
+ class Stage
4
+
5
+ attr_reader :name, :context, :stages, :before_callbacks, :after_callbacks
6
+
7
+ def application
8
+ context
9
+ end
10
+
11
+ def initialize(name, context,**opts)
12
+ @name = name
13
+ @context = context
14
+ @before_callbacks = Array.new
15
+ @after_callbacks = Array.new
16
+ @deferred_callbacks = Hash.new do |hash,stage|
17
+ hash[stage] = {before: [], after:[]}
18
+ end
19
+ @stages = Array.new
20
+ end
21
+
22
+ def run
23
+ setup!
24
+ setup_deferred_callbacks!
25
+ execute_callbacks(self.before_callbacks)
26
+ execute
27
+ execute_callbacks(self.after_callbacks)
28
+ end
29
+
30
+ def setup!
31
+ end
32
+
33
+ def setup_deferred_callbacks!
34
+ @deferred_callbacks.keys.each do |stage_name|
35
+ callbacks = @deferred_callbacks.delete stage_name
36
+ callbacks[:before].each do |(*stage_path, block)|
37
+ self.before(stage_name, *stage_path, &block)
38
+ end
39
+
40
+ callbacks[:after].each do |(*stage_path, block)|
41
+ self.after(stage_name, *stage_path, &block)
42
+ end
43
+ end
44
+ end
45
+
46
+ def execute
47
+ raise NotImplementedError, 'Subclass must implement Stage#execute' unless @stages.any?
48
+
49
+ @stages.each do |stage|
50
+ stage.run
51
+ end
52
+ end
53
+
54
+ def execute_callbacks(callbacks)
55
+ callbacks.each do |callback|
56
+ callback.call(callback_args, name: name)
57
+ end
58
+ end
59
+
60
+ def callback_args
61
+ nil
62
+ end
63
+
64
+ def before(*stage_path, &block)
65
+ if stage_path.any?
66
+ stage_name = stage_path.shift
67
+ stage = stages.find { |stage| stage.name == stage_name }
68
+ if stage
69
+ stage.before(*stage_path, &block)
70
+ else
71
+ @deferred_callbacks[stage_name][:before] << [*stage_path, block]
72
+ end
73
+ else
74
+ @before_callbacks << block
75
+ end
76
+ end
77
+
78
+ def after(*stage_path, &block)
79
+ if stage_path.any?
80
+ stage_name = stage_path.shift
81
+ stage = stages.find { |stage| stage.name == stage_name }
82
+ if stage
83
+ stage.after(*stage_path, &block)
84
+ else
85
+ @deferred_callbacks[stage_name][:after] << [*stage_path, block]
86
+ end
87
+ else
88
+ @after_callbacks << block
89
+ end
90
+ end
91
+
92
+
93
+ end
94
+ end
@@ -0,0 +1,336 @@
1
+ class RestfulDocGenerator
2
+
3
+ class << self
4
+ attr_reader :inspected_types
5
+ end
6
+
7
+ @inspected_types = Set.new
8
+ API_DOCS_DIRNAME = 'api_docs'
9
+
10
+ EXCLUDED_TYPES_FROM_TOP_LEVEL = Set.new( [Attributor::Boolean, Attributor::CSV, Attributor::DateTime, Attributor::Float, Attributor::Hash, Attributor::Ids, Attributor::Integer, Attributor::Object, Attributor::String ] ).freeze
11
+
12
+ def self.inspect_attributes(the_type)
13
+
14
+ reachable = Set.new
15
+ return reachable if the_type.nil? || the_type.is_a?(Praxis::SimpleMediaType)
16
+
17
+ # If an attribute comes in, get its type
18
+ the_type = the_type.type if the_type.is_a? Attributor::Attribute
19
+
20
+ # Collection types are special since they wrap a member type, so let's reach in and grab it
21
+ the_type = the_type.member_attribute.type if the_type < Attributor::Collection
22
+
23
+ if @inspected_types.include? the_type
24
+ # We're done if we've already inspected it
25
+ return reachable
26
+ else
27
+ # Mark it as inspected (before recursing)
28
+ @inspected_types << the_type unless the_type.name == nil # Don't bother with anon structs
29
+ end
30
+ #puts "Inspecting type: #{the_type.name}" if the_type.name != nil
31
+
32
+ reachable << the_type unless the_type.name == nil # Don't bother with anon structs
33
+ if the_type.respond_to? :attributes
34
+ the_type.attributes.each do |name, attr|
35
+ attr_type = attr.type
36
+ #puts "Inspecting attr: #{name} (class: #{attr_type.name}) #{attr_type.inspect}"
37
+ reachable += self.inspect_attributes(attr_type)
38
+ end
39
+ end
40
+ reachable
41
+ end
42
+
43
+ class Resource
44
+
45
+ attr_accessor :media_type, :reachable_types, :version, :controller_config
46
+
47
+ def initialize( definition )
48
+ @controller_config = definition
49
+ if controller_config.version == 'n/a'
50
+ @version = 'unversioned'
51
+ else
52
+ @version = controller_config.version
53
+ end
54
+ @media_type = controller_config.media_type
55
+ @reachable_types = Set.new
56
+
57
+ # Collect reachable types from the media_type if any (plus itself)
58
+ if @media_type && ! @media_type.is_a?(Praxis::SimpleMediaType)
59
+ add_to_reachable RestfulDocGenerator.inspect_attributes(@media_type)
60
+ @media_type.attributes.each do |name, attr|
61
+ add_to_reachable RestfulDocGenerator.inspect_attributes(attr)
62
+ end
63
+ @generated_example = @media_type.example(self.id)
64
+ end
65
+
66
+ # Collect reachable types from the params and payload definitions
67
+ @controller_config.actions.each do |name, action_config|
68
+ add_to_reachable RestfulDocGenerator.inspect_attributes(action_config.params)
69
+ add_to_reachable RestfulDocGenerator.inspect_attributes(action_config.payload)
70
+ end
71
+
72
+ end
73
+
74
+ # TODO: I think that the "id"/"name" of a resource should be provided by the definition/controller...not derived here
75
+ def id
76
+ if @controller_config.controller
77
+ @controller_config.controller.name
78
+ else
79
+ # If an API doesn't quite have the controller defined, let's use the name from the resource definition
80
+ @controller_config.name
81
+ end
82
+ end
83
+
84
+ def add_to_reachable( found )
85
+ return if found == nil
86
+ @reachable_types += found
87
+ end
88
+ end
89
+
90
+ def initialize(root_dir)
91
+ @root_dir = root_dir
92
+ @doc_root_dir = File.join(@root_dir, API_DOCS_DIRNAME)
93
+ @resources = []
94
+
95
+ remove_previous_doc_data
96
+ load_resources
97
+
98
+ # Gather all reachable types (grouped by version)
99
+ types_for = Hash.new
100
+ @resources.each do |r|
101
+ types_for[r.version] ||= Set.new
102
+ types_for[r.version] += r.reachable_types
103
+ end
104
+
105
+ write_resources
106
+ write_types(types_for)
107
+ write_index(types_for)
108
+ write_templates(types_for)
109
+ end
110
+
111
+ def load_resources
112
+ Praxis::Application.instance.resource_definitions.map do |resource|
113
+ @resources << Resource.new(resource)
114
+ end
115
+
116
+ end
117
+
118
+ def dump_example_for(context_name, object)
119
+ example = object.example(Array(context_name))
120
+ if object.is_a? Praxis::Blueprint
121
+ example.render(:master)
122
+ else
123
+ example.dump
124
+ end
125
+ end
126
+
127
+ def write_resources
128
+ @resources.each do |r|
129
+ filename = File.join(@doc_root_dir, r.version, "resources","#{r.id}.json")
130
+ #puts "Dumping #{r.id} to #{filename}"
131
+ base = File.dirname(filename)
132
+ FileUtils.mkdir_p base unless File.exists? base
133
+ resource_description = r.controller_config.describe
134
+ # Go through the params/payload of each action and generate an example for them (then stick it into the description hash)
135
+ r.controller_config.actions.each do |action_name, action|
136
+ generated_examples = {}
137
+ if action.params
138
+ generated_examples[:params] = dump_example_for( r.id, action.params )
139
+ end
140
+ if action.payload
141
+ generated_examples[:payload] = dump_example_for( r.id, action.payload )
142
+ end
143
+ action_description = resource_description[:actions].find{|a| a[:name] == action_name }
144
+ action_description[:params][:example] = generated_examples[:params] if generated_examples[:params]
145
+ action_description[:payload][:example] = generated_examples[:payload] if generated_examples[:payload]
146
+ end
147
+
148
+ File.open(filename, 'w') {|f| f.write(JSON.dump(resource_description))}
149
+ end
150
+ end
151
+
152
+ def write_types( versioned_types )
153
+ versioned_types.each do |version, types|
154
+ dirname = File.join(@doc_root_dir, version, "types")
155
+ FileUtils.mkdir_p dirname unless File.exists? dirname
156
+ reportable_types = types - EXCLUDED_TYPES_FROM_TOP_LEVEL
157
+ reportable_types.each do |type|
158
+ filename = File.join(dirname, "#{type.name}.json")
159
+ #puts "Dumping #{type.name} to #{filename}"
160
+ type_output = type.describe
161
+ example_data = type.example(type.to_s)
162
+ if type_output[:views]
163
+ type_output[:views].delete(:master)
164
+ type_output[:views].each do |view_name, view_info|
165
+ # Add and example for each view
166
+ unless( type < Praxis::Links ) #TODO: why do we need to skip an example for links?
167
+ view_info[:example] = example_data.render(view_name)
168
+ end
169
+ end
170
+ end
171
+ # Save a full type example
172
+ # ...but not for links or link classes (there's no object container context if done alone!!)
173
+ unless( type < Praxis::Links ) #TODO: again, why is this special?
174
+ type_output[:example] = if example_data.respond_to? :render
175
+ example_data.render(:master)
176
+ else
177
+ example_data.dump
178
+ end
179
+ end
180
+
181
+ # add an example for each attribute??
182
+ File.open(filename, 'w') {|f| f.write(JSON.dump(type_output))}
183
+ end
184
+ end
185
+ end
186
+
187
+ # index looks like something like this:
188
+ # {'1.0':
189
+ # {
190
+ # // Typical entry for controller with an associated mediatype
191
+ # "Post" : { media_type: "V1::MT:Post" , controller: "V1:Ctrl:Post"}
192
+ # // Unusual entry for controller without an associated mediatype
193
+ # "Admin" : { controller: "V1:Ctrl:Admin" }
194
+ # // Entry for mediatype that somehow is not associated with any controller...
195
+ # "RemoteMT" : { media_type: "V1:Ctrl:RemoteMT" }
196
+ # // Entry to a non-primitive type (but not a mediatype), that it is not covered by any related controller or mt
197
+ # "Locale" : { kind: "Module::Locale"}
198
+ # }
199
+ #
200
+ # '2.0': { ... }
201
+ # }
202
+ def write_index( versioned_types )
203
+ index = Hash.new
204
+ media_types_seen_from_controllers = Set.new
205
+ # Process the resources first
206
+
207
+ @resources.each do |r|
208
+ index[r.version] ||= Hash.new
209
+ info = {controller: r.id}
210
+ if r.media_type
211
+ info[:media_type] = r.media_type.name
212
+ media_types_seen_from_controllers << r.media_type
213
+ end
214
+ display_name = r.id.split("::").last
215
+ index[r.version][display_name] = info
216
+ end
217
+
218
+ versioned_types.each do |version, types|
219
+ # Discard any mediatypes that we've already seen and processed as controller related
220
+ reportable_types = types - media_types_seen_from_controllers - EXCLUDED_TYPES_FROM_TOP_LEVEL
221
+ #TODO: think about these special cases, is it needed?
222
+ reportable_types.reject!{|type| type < Praxis::Links || type < Praxis::MediaTypeCollection }
223
+
224
+ reportable_types.each do |type|
225
+ index[version] ||= Hash.new
226
+ display_name = type.name.split("::").last + " (*)" #somehow this is just a MT so we probably wanna mark it different
227
+ if index[version].has_key? display_name
228
+ raise "Display name already taken for version #{version}! #{display_name}"
229
+ end
230
+ index[version][display_name] = if type < Praxis::MediaType
231
+ {media_type: type.name }
232
+ else
233
+ {kind: type.name}
234
+ end
235
+ end
236
+ end
237
+ filename = File.join(@doc_root_dir, "index.json")
238
+ dirname = File.dirname(filename)
239
+ FileUtils.mkdir_p dirname unless File.exists? dirname
240
+ File.open(filename, 'w') {|f| f.write(JSON.dump(index))}
241
+ end
242
+
243
+ def write_templates(versioned_types)
244
+ # Calculate and write top-level (non-versioned) templates
245
+ top_templates = write_template("")
246
+ # Calculate and write versioned templates (passing the top level ones for inheritance)
247
+ versioned_types.keys.each do |version|
248
+ write_template(version,top_templates)
249
+ end
250
+ end
251
+
252
+ def write_template(version,top_templates=nil)
253
+ # Collect template filenames (grouped by type: embedded vs. standalone)
254
+ templates_dir = File.join(@root_dir,"doc_browser","templates",version)
255
+
256
+ # Slurp in any top level (unversioned) templates if any
257
+ # Top level templates will apply to any versioned one (and can be overwritten
258
+ # if the version defines their own)
259
+ templates = {embedded: {}, standalone: {} }
260
+ if top_templates
261
+ templates[:embedded] = top_templates[:embedded].clone
262
+ templates[:standalone] = top_templates[:standalone].clone
263
+ end
264
+
265
+ dual = Dir.glob(File.join(templates_dir,"*.tmpl"))
266
+ embedded = Dir.glob(File.join(templates_dir,"embedded","*.tmpl"))
267
+ standalone = Dir.glob(File.join(templates_dir,"standalone","*.tmpl"))
268
+
269
+ # TODO: Encode the contents more appropriately rather than dumping a string
270
+ # Templates defined at the top will apply to both embedded and standalone
271
+ # But it can be overriden if the same type exists in the more specific directory
272
+ dual.each do |filename|
273
+ type_key = File.basename(filename).gsub(/.tmpl$/,'')
274
+ contents = IO.read(filename)
275
+ templates[:embedded][type_key] = contents
276
+ templates[:standalone][type_key] = contents
277
+ end
278
+
279
+ # For each embedded one, create a key in the embedded section, and encode the file contents in the value
280
+ embedded.each do |filename|
281
+ type_key = File.basename(filename).gsub(/.tmpl$/,'')
282
+ templates[:embedded][type_key] = IO.read(filename)
283
+ end
284
+ # For each standalone one, create a key in the standalone section, and encode the file contents in the value
285
+ standalone.each do |filename|
286
+ type_key = File.basename(filename).gsub(/.tmpl$/,'')
287
+ templates[:standalone][type_key] = IO.read(filename)
288
+ end
289
+
290
+ [:embedded,:standalone].each do |type|
291
+ v = version.empty? ? "top level": version
292
+ puts "Packaging #{v} #{type} templates for: #{templates[type].keys}" unless templates[type].keys.empty?
293
+ end
294
+
295
+ # Write the resulting hash to the final file in the docs directory
296
+ filename = File.join(@doc_root_dir, version, "templates.json")
297
+ dirname = File.dirname(filename)
298
+ FileUtils.mkdir_p dirname unless File.exists? dirname
299
+ File.open(filename, 'w') {|f| f.write(JSON.dump(templates))}
300
+ return templates
301
+ end
302
+ private
303
+
304
+ def remove_previous_doc_data
305
+ FileUtils.rm_rf @doc_root_dir if File.exists?(@doc_root_dir)
306
+ end
307
+
308
+ end
309
+
310
+ namespace :praxis do
311
+ desc "Generate API docs (JSON definitions) for a Praxis App"
312
+ task :api_docs => [:environment] do |t, args|
313
+ require 'fileutils'
314
+
315
+ Praxis::Blueprint.caching_enabled = false
316
+ generator = RestfulDocGenerator.new(Dir.pwd)
317
+ end
318
+
319
+ desc "API Documenation Browser"
320
+ desc "API Documentation Browser"
321
+ task :doc_browser => [:api_docs] do
322
+ public_folder = File.expand_path("../../../", __FILE__) + "/api_browser/app"
323
+ app = Rack::Builder.new do
324
+ map "/docs" do # application JSON docs
325
+ use Rack::Static, urls: [""], root: File.join(Dir.pwd, RestfulDocGenerator::API_DOCS_DIRNAME)
326
+ end
327
+ map "/" do # Assets mapping
328
+ use Rack::Static, urls: [""], root: public_folder, index: "index.html"
329
+ end
330
+
331
+ run lambda { |env| [404, {'Content-Type' => 'text/plain'}, ['Not Found']] }
332
+ end
333
+
334
+ Rack::Server.start app: app, Port: 4567
335
+ end
336
+ end
@@ -0,0 +1,11 @@
1
+ namespace :praxis do
2
+ task :console => :environment do
3
+ begin
4
+ require 'pry'
5
+ pry
6
+ rescue LoadError
7
+ require 'irb'
8
+ IRB.start
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,5 @@
1
+ namespace :praxis do
2
+ task :environment do
3
+ Praxis::Application.instance.setup
4
+ end
5
+ end
@@ -0,0 +1,45 @@
1
+ namespace :praxis do
2
+
3
+ desc 'List routes, format=json or table, default table'
4
+ task :routes, [:format] => [:environment] do |t, args|
5
+ require 'ruport'
6
+
7
+ table = Table(:version, :path, :verb, :resource,
8
+ :action, :implementation, :name, :primary)
9
+
10
+ Praxis::Application.instance.resource_definitions.each do |resource_definition|
11
+ resource_definition.actions.each do |name, action|
12
+ method = begin
13
+ m = resource_definition.controller.instance_method(name)
14
+ rescue
15
+ nil
16
+ end
17
+
18
+ method_name = method ? "#{method.owner.name}##{method.name}" : 'n/a'
19
+
20
+ action.routes.each do |route|
21
+ table << {
22
+ resource: resource_definition.name,
23
+ version: route.version,
24
+ verb: route.verb,
25
+ path: route.path,
26
+ action: name,
27
+ implementation: method_name,
28
+ name: route.name,
29
+ primary: (action.primary_route == route ? 'yes' : '')
30
+ }
31
+ end
32
+ end
33
+ end
34
+
35
+ case args[:format] || "table"
36
+ when "json"
37
+ puts JSON.pretty_generate(table.collect { |r| r.to_hash })
38
+ when "table"
39
+ puts table.to_s
40
+ else
41
+ raise "unknown output format: #{args[:format]}"
42
+ end
43
+
44
+ end
45
+ end
@@ -0,0 +1,4 @@
1
+ require 'praxis/tasks/environment'
2
+ require 'praxis/tasks/console'
3
+ require 'praxis/tasks/routes'
4
+ require 'praxis/tasks/api_docs'
@@ -0,0 +1,17 @@
1
+ module Praxis
2
+
3
+ class Collection
4
+
5
+ # checks if +type+ is a MediaType, and if so, if it has an inner
6
+ # Collection class defined
7
+ def self.of(type)
8
+ if type < Attributor::Type && defined?(type::Collection)
9
+ return type::Collection
10
+ end
11
+
12
+ Attributor::Collection.of(type)
13
+ end
14
+
15
+ end
16
+
17
+ end
@@ -0,0 +1,69 @@
1
+ module Praxis
2
+
3
+ class Multipart < Attributor::Hash
4
+
5
+ @key_type = Attributor::String
6
+
7
+ def self.load(value, context=Attributor::DEFAULT_ROOT_CONTEXT, content_type:)
8
+ #return super if content_type.nil?
9
+
10
+ headers = {'Content-Type' => content_type}
11
+
12
+ parser = MultipartParser.new(headers, value)
13
+ preamble, parts = parser.parse
14
+
15
+ hash = Hash[parts.collect { |name, part| [name, part.body] }]
16
+
17
+ instance = super(hash, context, **options)
18
+
19
+ instance.preamble = preamble
20
+ instance.parts = parts
21
+ instance.headers = headers
22
+
23
+ instance
24
+ end
25
+
26
+ def self.example(context=nil, options: {})
27
+ form = MIME::Multipart::FormData.new
28
+
29
+ super(context, options: options).each do |k,v|
30
+ body = if v.respond_to?(:dump) && !v.kind_of?(String)
31
+ JSON.pretty_generate(v.dump)
32
+ else
33
+ v
34
+ end
35
+
36
+ entity = MIME::Text.new(body)
37
+
38
+ form.add entity, String(k)
39
+ end
40
+
41
+ content_type = form.headers.get('Content-Type')
42
+ body = form.body.to_s
43
+
44
+ self.load(body, context, content_type: content_type)
45
+ #result.each do |k, v|
46
+ # result.parts[k] = MultipartPart.new(v)
47
+ #end
48
+
49
+ #result.headers = {'Content-Type'}
50
+
51
+
52
+ end
53
+
54
+ attr_accessor :preamble
55
+ attr_accessor :parts
56
+ attr_accessor :headers
57
+
58
+
59
+ def validate(context=Attributor::DEFAULT_ROOT_CONTEXT)
60
+ super
61
+ end
62
+
63
+ #def []=(k, v)
64
+ #end
65
+
66
+ end
67
+
68
+
69
+ end
@@ -0,0 +1,3 @@
1
+ module Praxis
2
+ VERSION = '0.9'
3
+ end