praxis 0.0.1 → 0.9

Sign up to get free protection for your applications and to get access to all the features.
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,264 @@
1
+
2
+ module Praxis
3
+ # Response spec DSL container
4
+
5
+ class ResponseDefinition
6
+ attr_reader :name
7
+
8
+ def initialize(response_name, **spec, &block)
9
+ unless response_name
10
+ raise Exceptions::InvalidConfiguration.new(
11
+ "Response name is required for a response specification"
12
+ )
13
+ end
14
+ @spec = { headers:{} }
15
+ @name = response_name
16
+ self.instance_exec(**spec, &block) if block_given?
17
+
18
+ if self.status.nil?
19
+ raise Exceptions::InvalidConfiguration.new(
20
+ "Status code is required for a response specification"
21
+ )
22
+ end
23
+ end
24
+
25
+ def description(text=nil)
26
+ return @spec[:description] if text.nil?
27
+ @spec[:description] = text
28
+ end
29
+
30
+ def status(code=nil)
31
+ return @spec[:status] if code.nil?
32
+ @spec[:status] = code
33
+ end
34
+
35
+ def media_type(media_type=nil)
36
+ return @spec[:media_type] if media_type.nil?
37
+
38
+ @spec[:media_type] = case media_type
39
+ when String
40
+ SimpleMediaType.new(media_type)
41
+ when Class
42
+ if media_type < Praxis::MediaType
43
+ media_type
44
+ else
45
+ raise Exceptions::InvalidConfiguration.new(
46
+ 'Invalid media_type specification. media_type must be a Praxis::MediaType'
47
+ )
48
+ end
49
+ when SimpleMediaType
50
+ media_type
51
+ else
52
+ raise Exceptions::InvalidConfiguration.new(
53
+ 'Invalid media_type specification. media_type must be a String, MediaType or SimpleMediaType'
54
+ )
55
+ end
56
+ end
57
+
58
+ def location(loc=nil)
59
+ return @spec[:location] if loc.nil?
60
+ unless ( loc.is_a?(Regexp) || loc.is_a?(String) )
61
+ raise Exceptions::InvalidConfiguration.new(
62
+ "Invalid location specification. Location in response must be either a regular expression or a string."
63
+ )
64
+ end
65
+ @spec[:location] = loc
66
+ end
67
+
68
+ def headers(hdrs = nil)
69
+ return @spec[:headers] if hdrs.nil?
70
+
71
+ case hdrs
72
+ when Array
73
+ hdrs.each {|header_name| header(header_name) }
74
+ when Hash
75
+ header(hdrs)
76
+ when String
77
+ header(hdrs)
78
+ else
79
+ raise Exceptions::InvalidConfiguration.new(
80
+ "Invalid headers specification: Arrays, Hash, or String must be used. Received: #{hdrs.inspect}"
81
+ )
82
+ end
83
+ end
84
+
85
+ def header(hdr)
86
+ case hdr
87
+ when String
88
+ @spec[:headers][hdr] = true
89
+ when Hash
90
+ hdr.each do | k, v |
91
+ unless v.is_a?(Regexp) || v.is_a?(String)
92
+ raise Exceptions::InvalidConfiguration.new(
93
+ "Header definitions for #{k.inspect} can only match values of type String or Regexp. Received: #{v.inspect}"
94
+ )
95
+ end
96
+ @spec[:headers][k] = v
97
+ end
98
+ else
99
+ raise Exceptions::InvalidConfiguration.new(
100
+ "A header definition can only take a String (to match the name) or" +
101
+ " a Hash (to match both the name and the value). Received: #{hdr.inspect}"
102
+ )
103
+ end
104
+ end
105
+
106
+ def describe
107
+ location_type = location.is_a?(Regexp) ? :regexp : :string
108
+ location_value = location.is_a?(Regexp) ? location.inspect : location
109
+ content = {
110
+ :description => description,
111
+ :status => status,
112
+ :headers => {}
113
+ }
114
+ content[:location] = _describe_header(location) unless location == nil
115
+ # TODO: Change the mime_type key to media_type!!
116
+ if media_type
117
+ content[:media_type] = if media_type.is_a? Symbol
118
+ media_type
119
+ else
120
+ media_type.describe(true) # TODO: is a shallow describe what we want? or just the name?
121
+ end
122
+ end
123
+ unless headers == nil
124
+ headers.each do |name, value|
125
+ content[:headers][name] = _describe_header(value)
126
+ end
127
+ end
128
+ unless parts == nil
129
+ content[:parts_like] = parts.describe
130
+ end
131
+ content
132
+ end
133
+
134
+ def _describe_header(data)
135
+ data_type = data.is_a?(Regexp) ? :regexp : :string
136
+ data_value = data.is_a?(Regexp) ? data.inspect : data
137
+ { :value => data_value, :type => data_type }
138
+ end
139
+
140
+ def validate( response )
141
+ validate_status!(response)
142
+ validate_location!(response)
143
+ validate_headers!(response)
144
+ validate_content_type!(response)
145
+ validate_parts!(response)
146
+ end
147
+
148
+ def parts(proc=nil, like: nil, **args, &block)
149
+ a_proc = proc || block
150
+ if like.nil? && !a_proc
151
+ raise ArgumentError, "Parts definition for response #{name} needs a :like argument or a block/proc" if !args.empty?
152
+ return @parts
153
+ end
154
+ if like && a_proc
155
+ raise ArgumentError, "Parts definition for response #{name} does not allow :like and a block simultaneously"
156
+ end
157
+ if like
158
+ template = ApiDefinition.instance.response(like)
159
+ @parts = template.compile(nil, **args)
160
+ else # block
161
+ @parts = Praxis::ResponseDefinition.new('anonymous', **args, &a_proc)
162
+ end
163
+ end
164
+
165
+ # Validates Status code
166
+ #
167
+ # @raise [Exceptions::Validation] When response returns an unexpected status.
168
+ #
169
+ def validate_status!(response)
170
+ return unless status
171
+ # Validate status code if defined in the spec
172
+ if response.status != status
173
+ raise Exceptions::Validation.new(
174
+ "Invalid response code detected. Response %s dictates status of %s but this response is returning %s." %
175
+ [name, status.inspect, response.status.inspect]
176
+ )
177
+ end
178
+ end
179
+
180
+
181
+ # Validates 'Location' header
182
+ #
183
+ # @raise [Exceptions::Validation] When location header does not match to the defined one.
184
+ #
185
+ def validate_location!(response)
186
+ return if location.nil? || location === response.headers['Location']
187
+ raise Exceptions::Validation.new("LOCATION does not match #{location.inspect}")
188
+ end
189
+
190
+
191
+ # Validates Headers
192
+ #
193
+ # @raise [Exceptions::Validation] When there is a missing required header..
194
+ #
195
+ def validate_headers!(response)
196
+ return unless headers
197
+ headers.each do |name, value|
198
+ if name.is_a? Symbol
199
+ raise Exceptions::Validation.new(
200
+ "Symbols are not supported in headers"
201
+ )
202
+ end
203
+
204
+ unless response.headers.has_key?(name)
205
+ raise Exceptions::Validation.new(
206
+ "Header #{name.inspect} was required but is missing"
207
+ )
208
+ end
209
+
210
+ case value
211
+ when String
212
+ if response.headers[name] != value
213
+ unless valid
214
+ raise Exceptions::Validation.new(
215
+ "Header #{name.inspect}, with value #{value.inspect} does not match #{response.headers[name]}."
216
+ )
217
+ end
218
+ end
219
+ when Regexp
220
+ if response.headers[name] !~ value
221
+ unless valid
222
+ raise Exceptions::Validation.new(
223
+ "Header #{name.inspect}, with value #{value.inspect} does not match #{response.headers[name].inspect}."
224
+ )
225
+ end
226
+ end
227
+ end
228
+ end
229
+ end
230
+
231
+
232
+ # Validates Content-Type header and response media type
233
+ #
234
+ # @param [Object] action
235
+ #
236
+ # @raise [Exceptions::Validation] When there is a missing required header
237
+ #
238
+ def validate_content_type!(response)
239
+ return unless media_type
240
+
241
+ extracted_identifier = nil
242
+ if response.headers['Content-Type']
243
+ extracted_identifier = Praxis::ContentTypeParser.parse(response.headers['Content-Type'])[:type]
244
+ end
245
+
246
+ if media_type.identifier != extracted_identifier
247
+ raise Exceptions::Validation.new(
248
+ "Bad Content-Type header. Returned type #{extracted_identifier}" +
249
+ " does not match type #{media_type.identifier} as described in response: #{self.name}"
250
+ )
251
+ end
252
+ end
253
+
254
+ def validate_parts!(response)
255
+ return unless parts
256
+
257
+ response.parts.each do |name, part|
258
+ parts.validate(part)
259
+ end
260
+
261
+ end
262
+
263
+ end
264
+ end
@@ -0,0 +1,34 @@
1
+ module Praxis
2
+
3
+ class ResponseTemplate
4
+ attr_reader :name, :block
5
+
6
+ def initialize(response_name, &block)
7
+ @name = response_name
8
+ @block = block
9
+ end
10
+
11
+ def compile(action=nil, **args)
12
+ # Default media_type to the resource_definition one, if the block has it in
13
+ # its required args but no value is passed (funky, but can help in the common case)
14
+ if block.parameters.any? { |(type, name)| name == :media_type && type == :keyreq } && action
15
+ unless args.has_key? :media_type
16
+ media_type = action.resource_definition.media_type
17
+ unless media_type
18
+ raise Exceptions::InvalidConfiguration.new(
19
+ "Could not default :media_type argument for response template #{@name}." +
20
+ " Resource #{action.resource_definition} does not have an associated mediatype and none was passed"
21
+ )
22
+ end
23
+ args[:media_type] = media_type
24
+ end
25
+ end
26
+ Praxis::ResponseDefinition.new(name, **args, &block)
27
+ end
28
+
29
+ def describe
30
+ puts "TODO!!!!!!"
31
+ end
32
+ end
33
+
34
+ end
@@ -0,0 +1,166 @@
1
+ module Praxis
2
+
3
+ module Responses
4
+
5
+ # Standard response for successful HTTP requests.
6
+ # The actual response will depend on the request method used.
7
+ # In a GET request, the response will contain an entity
8
+ # corresponding to the requested resource.
9
+ # In a POST request the response will contain an entity
10
+ # describing or containing the result of the action.
11
+ class Ok < Praxis::Response
12
+ self.status = 200
13
+ end
14
+
15
+
16
+ # The request has been fulfilled and resulted in a new resource
17
+ # being created.
18
+ class Created < Praxis::Response
19
+ self.status = 201
20
+ end
21
+
22
+
23
+ # The request has been accepted for processing, but the
24
+ # processing has not been completed. The request might or might
25
+ # not eventually be acted upon, as it might be disallowed when
26
+ # processing actually takes place.
27
+ class Accepted < Praxis::Response
28
+ self.status = 202
29
+ end
30
+
31
+
32
+ # The server successfully processed the request, but is not returning any content. Usually used as a response to a successful delete request.
33
+ class NoContent < Praxis::Response
34
+ self.status = 204
35
+ end
36
+
37
+
38
+ # Indicates multiple options for the resource that the client may follow. It, for instance, could be used to present different format options for video, list files with different extensions, or word sense disambiguation.
39
+ class MultipleChoices < Praxis::Response
40
+ self.status = 300
41
+ end
42
+
43
+
44
+ # This and all future requests should be directed to the given URI.
45
+ class MovedPermanently < Praxis::Response
46
+ self.status = 301
47
+ end
48
+
49
+
50
+ # This is an example of industry practice contradicting the standard. The HTTP/1.0 specification (RFC 1945) required the client to perform a temporary redirect (the original describing phrase was "Moved Temporarily"),[5] but popular browsers implemented 302 with the functionality of a 303 See Other. Therefore, HTTP/1.1 added self.status = codes 303 and 307 to distinguish between the two behaviours.[6] However, some Web applications and frameworks use the 302 self.status = code as if it were the 303.[7]
51
+ class Found < Praxis::Response
52
+ self.status = 302
53
+ end
54
+
55
+
56
+ # The response to the request can be found under another URI using a GET method. When received in response to a POST (or PUT/DELETE), it should be assumed that the server has received the data and the redirect should be issued with a separate GET message.
57
+ class SeeOther < Praxis::Response
58
+ self.status = 303
59
+ end
60
+
61
+
62
+ # Indicates that the resource has not been modified since the version specified by the request headers If-Modified-Since or If-Match. This means that there is no need to retransmit the resource, since the client still has a previously-downloaded copy.
63
+ class NotModified < Praxis::Response
64
+ self.status = 304
65
+ end
66
+
67
+
68
+ # In this case, the request should be repeated with another URI; however, future requests should still use the original URI. In contrast to how 302 was historically implemented, the request method is not allowed to be changed when reissuing the original request. For instance, a POST request should be repeated using another POST request.[10]
69
+ class TemporaryRedirect < Praxis::Response
70
+ self.status = 307
71
+ end
72
+
73
+
74
+ # The request cannot be fulfilled due to bad syntax.
75
+ class BadRequest < Praxis::Response
76
+ self.status = 400
77
+ end
78
+
79
+
80
+ # Similar to 403 Forbidden, but specifically for use when authentication is required and has failed or has not yet been provided. The response must include a WWW-Authenticate header field containing a challenge applicable to the requested resource. See Basic access authentication and Digest access authentication.
81
+ class Unauthorized < Praxis::Response
82
+ self.status = 401
83
+ end
84
+
85
+
86
+ # The request was a valid request, but the server is refusing to respond to it. Unlike a 401 Unauthorized response, authenticating will make no difference.
87
+ class Forbidden < Praxis::Response
88
+ self.status = 403
89
+ end
90
+
91
+
92
+ # The requested resource could not be found but may be available again in the future. Subsequent requests by the client are permissible.
93
+ class NotFound < Praxis::Response
94
+ self.status = 404
95
+ end
96
+
97
+
98
+ # A request was made of a resource using a request method not supported by that resource; for example, using GET on a form which requires data to be presented via POST, or using PUT on a read-only resource.
99
+ class MethodNotAllowed < Praxis::Response
100
+ self.status = 405
101
+ end
102
+
103
+
104
+ # A request was made of a resource using a request method not supported by that resource; for example, using GET on a form which requires data to be presented via POST, or using PUT on a read-only resource.
105
+ class NotAcceptable < Praxis::Response
106
+ self.status = 406
107
+ end
108
+
109
+
110
+ # Indicates that the request could not be processed because of conflict in the request, such as an edit conflict in the case of multiple updates.
111
+ class Conflict < Praxis::Response
112
+ self.status = 409
113
+ end
114
+
115
+
116
+ # The server does not meet one of the preconditions that the requester put on the request.
117
+ class PreconditionFailed < Praxis::Response
118
+ self.status = 412
119
+ end
120
+
121
+
122
+ # The request was well-formed but was unable to be followed due to semantic errors.[3]
123
+ class UnprocessableEntity < Praxis::Response
124
+ self.status = 422
125
+ end
126
+
127
+
128
+ # A generic error message, given when an unexpected condition was encountered and no more specific message is suitable.
129
+ class InternalServerError < Praxis::Response
130
+ self.status = 500
131
+
132
+ attr_accessor :error
133
+
134
+ def initialize(error: nil, **opts)
135
+ super(**opts)
136
+ @error = error
137
+ end
138
+
139
+ def format!(exception = @error) #_exception(exception)
140
+ if @error
141
+ msg = {
142
+ name: exception.class.name,
143
+ message: exception.message,
144
+ backtrace: exception.backtrace
145
+ }
146
+ msg[:cause] = format!(exception.cause) if exception.cause
147
+ @body = msg
148
+ end
149
+ end
150
+ end
151
+
152
+ ApiDefinition.define do |api|
153
+ self.constants.each do |class_name|
154
+ response_class = self.const_get(class_name)
155
+ response_name = response_class.response_name
156
+ next if api.responses.key?(response_name)
157
+
158
+ api.response_template response_name do
159
+ status response_class.status
160
+ end
161
+
162
+ end
163
+ end
164
+
165
+ end
166
+ end
@@ -0,0 +1,36 @@
1
+ module Praxis
2
+
3
+ module Responses
4
+
5
+ class ValidationError < BadRequest
6
+ def initialize(errors: nil, exception: nil, **opts)
7
+ super(**opts)
8
+ @errors = errors
9
+ @exception = exception
10
+ end
11
+
12
+ def format!
13
+ if @errors
14
+ @body = {name: 'ValidationError', errors: @errors}
15
+ elsif @exception
16
+ @body = {name: 'ValidationError', message: @exception.message}
17
+ if @exception.cause
18
+ @body[:cause] = {name: @exception.cause.class.name, message: @exception.cause.message}
19
+ end
20
+ @body
21
+ end
22
+ end
23
+ end
24
+
25
+ end
26
+
27
+
28
+ ApiDefinition.define do |api|
29
+ api.response_template :validation_error do
30
+ description "When parameter validation hits..."
31
+ status 400
32
+ media_type "application/json"
33
+ end
34
+ end
35
+
36
+ end
@@ -0,0 +1,27 @@
1
+ module Praxis
2
+
3
+ class Route
4
+ attr_accessor :verb, :path, :version, :name, :options
5
+
6
+ def initialize(verb, path, version='n/a', name:nil, **options)
7
+ @verb = verb
8
+ @path = path
9
+ @version = version
10
+ @name = name
11
+ @options = options
12
+ end
13
+
14
+ def describe
15
+ result = {
16
+ verb: verb,
17
+ path: path,
18
+ version: version
19
+ }
20
+ result[:name] = name unless name.nil?
21
+ result[:options] = options if options.any?
22
+ result
23
+ end
24
+
25
+ end
26
+
27
+ end
@@ -0,0 +1,89 @@
1
+ require 'mustermann/router/rack'
2
+
3
+ module Praxis
4
+
5
+ class Router
6
+ attr_reader :request_class, :application
7
+
8
+ class VersionMatcher
9
+ def initialize(target, version: 'n/a')
10
+ @target = target
11
+ @version = version
12
+ end
13
+ def call(request)
14
+ if request.version == @version
15
+ @target.call(request)
16
+ else
17
+ # Version doesn't match, pass and continue
18
+ request.unmatched_versions << @version
19
+ throw :pass
20
+ end
21
+ end
22
+ end
23
+
24
+ class RequestRouter < Mustermann::Router::Simple
25
+ def initialize(default: nil, **options, &block)
26
+ options[:default] = :not_found
27
+
28
+ super(**options, &block)
29
+ end
30
+
31
+ def invoke(callback, request, params, pattern)
32
+ request.route_params = params
33
+ callback.call(request)
34
+ end
35
+
36
+ def string_for(request)
37
+ request.path
38
+ end
39
+ end
40
+
41
+
42
+ def initialize(application, request_class: Praxis::Request)
43
+ @routes = Hash.new do |hash, verb|
44
+ hash[verb] = RequestRouter.new
45
+ end
46
+ @request_class = request_class
47
+ @application = application
48
+ end
49
+
50
+ def add_route(target, route)
51
+ warn 'other conditions not supported yet' if route.options.any?
52
+ version_wrapper = VersionMatcher.new(target, version: route.version)
53
+ @routes[route.verb].on(route.path, call: version_wrapper)
54
+ end
55
+
56
+ def call(env_or_request)
57
+ request = case env_or_request
58
+ when Hash
59
+ request_class.new(env_or_request)
60
+ when request_class
61
+ env_or_request
62
+ else
63
+ raise ArgumentError, "received #{env_or_request.class}"
64
+ end
65
+
66
+ version = request.version
67
+ verb = request.verb
68
+ result = @routes[verb].call(request)
69
+ if result == :not_found
70
+
71
+ attempted_versions = request.unmatched_versions
72
+ body = "NotFound"
73
+ unless attempted_versions.empty? || (attempted_versions.size == 1 && attempted_versions.first == 'n/a')
74
+ body += if request.version == 'n/a'
75
+ ". Your request did not specify an API version.".freeze
76
+ else
77
+ ". Your request speficied API version = \"#{request.version}\"."
78
+ end
79
+ pretty_versions = attempted_versions.collect(&:inspect).join(', ')
80
+ body += " Available versions = #{pretty_versions}."
81
+ end
82
+ result = [404, {"Content-Type" => "text/plain", }, [body]]
83
+ end
84
+ result
85
+ end
86
+
87
+ end
88
+
89
+ end
@@ -0,0 +1,24 @@
1
+ module Praxis
2
+
3
+ SimpleMediaType = Struct.new(:identifier) do
4
+ def name
5
+ self.class.name
6
+ end
7
+
8
+ def ===(other_thing)
9
+ case other_thing
10
+ when String
11
+ identifier == other_thing
12
+ when MediaType
13
+ identifier == other_thing.identifier
14
+ else
15
+ raise 'can not compare'
16
+ end
17
+ end
18
+
19
+ def describe(shallow=true)
20
+ {identifier: identifier}
21
+ end
22
+ end
23
+
24
+ end
@@ -0,0 +1,45 @@
1
+ module Praxis
2
+ module Skeletor
3
+ class RestfulRoutingConfig
4
+
5
+ attr_reader :name, :resource_definition, :routes
6
+
7
+ def initialize(name, resource_definition, &block)
8
+ @name = name
9
+ @resource_definition = resource_definition
10
+ @routes = []
11
+
12
+ @prefix = "/" + resource_definition.name.split("::").last.underscore
13
+
14
+ if resource_definition.routing_config
15
+ instance_eval(&resource_definition.routing_config)
16
+ end
17
+
18
+ instance_eval(&block)
19
+ end
20
+
21
+ def prefix(prefix=nil)
22
+ return @prefix unless prefix
23
+ @prefix = prefix
24
+ end
25
+
26
+ def options(path, opts={}) add_route 'OPTIONS', path, opts end
27
+ def get(path, opts={}) add_route 'GET', path, opts end
28
+ def head(path, opts={}) add_route 'HEAD', path, opts end
29
+ def post(path, opts={}) add_route 'POST', path, opts end
30
+ def put(path, opts={}) add_route 'PUT', path, opts end
31
+ def delete(path, opts={}) add_route 'DELETE', path, opts end
32
+ def trace(path, opts={}) add_route 'TRACE', path, opts end
33
+ def connect(path, opts={}) add_route 'CONNECT', path, opts end
34
+ def patch(path, opts={}) add_route 'PATCH', path, opts end
35
+
36
+ def add_route(verb, path, options={})
37
+ path = Mustermann.new(@prefix + path)
38
+
39
+ @routes << Route.new(verb, path, resource_definition.version, **options)
40
+ end
41
+
42
+ end
43
+
44
+ end
45
+ end