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,65 @@
1
+ require 'singleton'
2
+ require 'mustermann'
3
+ require 'logger'
4
+
5
+ module Praxis
6
+ class Application
7
+ include Singleton
8
+
9
+ attr_reader :router
10
+ attr_reader :controllers
11
+ attr_reader :resource_definitions
12
+
13
+ attr_accessor :bootloader
14
+ attr_accessor :file_layout
15
+ attr_accessor :loaded_files
16
+ attr_accessor :logger
17
+ attr_accessor :plugins
18
+ attr_accessor :root
19
+
20
+ def self.configure
21
+ yield(self.instance)
22
+ end
23
+
24
+ def initialize
25
+ @controllers = Set.new
26
+ @resource_definitions = Set.new
27
+
28
+ @router = Router.new(self)
29
+
30
+ @bootloader = Bootloader.new(self)
31
+ @file_layout = nil
32
+ @plugins = Array.new
33
+ @loaded_files = Set.new
34
+ @config = Config.new
35
+ @root = nil
36
+ @logger = Logger.new(STDOUT)
37
+ end
38
+
39
+ def setup(root: '.')
40
+ @root = Pathname.new(root).expand_path
41
+
42
+ @bootloader.setup!
43
+ end
44
+
45
+ def call(env)
46
+ self.router.call(env)
47
+ end
48
+
49
+ def layout(&block)
50
+ self.file_layout = FileGroup.new(self.root, &block)
51
+ end
52
+
53
+ def config(key=nil, type=Attributor::Struct, **opts, &block)
54
+ if block_given? || (type==Attributor::Struct && !opts.empty? )
55
+ @config.define(key, type, opts, &block)
56
+ else
57
+ @config.get
58
+ end
59
+ end
60
+
61
+ def config=(config)
62
+ @config.set(config)
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,91 @@
1
+ module Praxis
2
+
3
+
4
+ class Bootloader
5
+
6
+ attr_reader :application, :stages
7
+
8
+ def initialize(application)
9
+ @application = application
10
+ @stages = Array.new
11
+
12
+ setup_stages!
13
+ end
14
+
15
+ def config
16
+ @application.config
17
+ end
18
+
19
+ def root
20
+ @application.root
21
+ end
22
+
23
+ def setup_stages!
24
+ # Require environment first. they define constants and environment specific settings
25
+ stages << BootloaderStages::Environment.new(:environment, application)
26
+
27
+ # then the initializers. as it is their job to ensure monkey patches and other
28
+ # config is in place first.
29
+ stages << BootloaderStages::FileLoader.new(:initializers, application)
30
+
31
+ # then require lib/ code.
32
+ stages << BootloaderStages::FileLoader.new(:lib, application)
33
+
34
+ # design-specific code.
35
+ stages << BootloaderStages::SubgroupLoader.new(:design, application)
36
+
37
+ # app-specific code.
38
+ stages << BootloaderStages::SubgroupLoader.new(:app, application)
39
+
40
+ # setup routing
41
+ stages << BootloaderStages::Routing.new(:routing, application)
42
+
43
+ # naggy warning about unloaded files
44
+ stages << BootloaderStages::WarnUnloadedFiles.new(:warn_unloaded_files, application)
45
+
46
+ after(:app) do
47
+ Praxis::Mapper.finalize!
48
+ Praxis::Blueprint.finalize!
49
+ end
50
+
51
+ end
52
+
53
+ def delete_stage(stage_name)
54
+ if (stage = stages.find { |stage| stage.name == stage_name })
55
+ stages.delete(stage)
56
+ else
57
+ raise Exceptions::StageNotFound.new(
58
+ "Cannot remove stage with name #{stage_name}, stage does not exist."
59
+ )
60
+ end
61
+ end
62
+
63
+
64
+ def before(*stage_path, &block)
65
+ stage_name = stage_path.shift
66
+ stages.find { |stage| stage.name == stage_name }.before(*stage_path, &block)
67
+ end
68
+
69
+ def after(*stage_path, &block)
70
+ stage_name = stage_path.shift
71
+ stages.find { |stage| stage.name == stage_name }.after(*stage_path, &block)
72
+ end
73
+
74
+ def use(plugin,&block)
75
+ application.plugins << plugin.new(application, &block)
76
+ end
77
+
78
+ def setup!
79
+ run
80
+ end
81
+
82
+ def run
83
+ stages.each do |stage|
84
+ stage.run
85
+ end
86
+ end
87
+
88
+ end
89
+
90
+
91
+ end
@@ -0,0 +1,57 @@
1
+ module Praxis
2
+
3
+
4
+ module BootloaderStages
5
+
6
+ class Environment < Stage
7
+
8
+ # require environment files. we will require 2 files:
9
+ # 1) the environment.rb file - generic stuff for all environments
10
+ # 2) "Deployer.environment".rb - environment specific stuff
11
+ def execute
12
+ env_file = application.root + "config/environment.rb"
13
+ require env_file if File.exists? env_file
14
+
15
+ application.plugins.each do |plugin|
16
+ plugin.setup!
17
+ end
18
+
19
+ unless application.file_layout
20
+ setup_default_layout!
21
+ end
22
+
23
+ setup_initial_config!
24
+ end
25
+
26
+ def setup_default_layout!
27
+ application.layout do
28
+ layout do
29
+ map :initializers, 'config/initializers/**/*'
30
+ map :lib, 'lib/**/*'
31
+ map :design, 'design/' do
32
+ map :api, 'api.rb'
33
+ map :media_types, '**/media_types/**/*'
34
+ map :resources, '**/resources/**/*'
35
+ end
36
+ map :app, 'app/' do
37
+ map :models, 'models/**/*'
38
+ map :controllers, '**/controllers/**/*'
39
+ map :responses, '**/responses/**/*'
40
+ end
41
+ end
42
+ end
43
+ end
44
+
45
+ # TODO: not really sure I like this here... but where else is better?
46
+ def setup_initial_config!
47
+ application.config do
48
+ attribute :praxis do
49
+ attribute :validate_responses, Attributor::Boolean, default: false
50
+ end
51
+ end
52
+ end
53
+
54
+ end
55
+
56
+ end
57
+ end
@@ -0,0 +1,31 @@
1
+ module Praxis
2
+
3
+
4
+ module BootloaderStages
5
+
6
+ class FileLoader < Stage
7
+
8
+ attr_reader :path
9
+
10
+ def initialize(name, application, path: nil)
11
+ super
12
+ @path = path || Array(name)
13
+ end
14
+
15
+ def execute
16
+ application.file_layout[*path].each do |file|
17
+ next if application.loaded_files.include?(file)
18
+ next unless file.extname == '.rb'
19
+ require file
20
+ application.loaded_files << file
21
+ end
22
+ end
23
+
24
+ def callback_args
25
+ application.file_layout[*path]
26
+ end
27
+
28
+ end
29
+ end
30
+
31
+ end
@@ -0,0 +1,34 @@
1
+ module Praxis
2
+
3
+
4
+ module BootloaderStages
5
+
6
+ class Routing < Stage
7
+
8
+ def execute
9
+ application.controllers.each do |controller|
10
+ controller.actions.each do |action_name, action|
11
+ action.routes.each do |route|
12
+ target = target_factory(controller, action_name)
13
+ application.router.add_route target, route
14
+ end
15
+ end
16
+ end
17
+ end
18
+
19
+
20
+ def target_factory(controller, action_name)
21
+ action = controller.action(action_name)
22
+
23
+ Proc.new do |request|
24
+ request.action = action
25
+ dispatcher = Dispatcher.current(thread: Thread.current, application: application)
26
+
27
+ dispatcher.dispatch(controller, action, request)
28
+ end
29
+ end
30
+
31
+ end
32
+
33
+ end
34
+ end
@@ -0,0 +1,27 @@
1
+ module Praxis
2
+
3
+ module BootloaderStages
4
+
5
+ class SubgroupLoader < Stage
6
+
7
+ attr_writer :order
8
+
9
+ def initialize(name, application)
10
+ super
11
+ # always finalize Taylor after loading app code.
12
+
13
+ end
14
+
15
+ def order
16
+ @order ||= application.file_layout[name].groups.keys
17
+ end
18
+
19
+ def setup!
20
+ order.each do |group|
21
+ @stages << FileLoader.new(group, application, path: [name, group])
22
+ end
23
+ end
24
+ end
25
+
26
+ end
27
+ end
@@ -0,0 +1,40 @@
1
+ module Praxis
2
+
3
+
4
+ module BootloaderStages
5
+
6
+ class WarnUnloadedFiles < Stage
7
+ @enabled = true
8
+
9
+ def self.enabled=(enabled)
10
+ @enabled = enabled
11
+ end
12
+
13
+ def self.enabled
14
+ @enabled
15
+ end
16
+
17
+ def execute
18
+ return unless self.class.enabled
19
+ base = application.file_layout[:app].base
20
+ file_enum = base.find.to_a
21
+ files = file_enum.select do |file|
22
+ path = file.relative_path_from(base)
23
+ path.extname == '.rb'
24
+ end
25
+
26
+ missing = Set.new(files) - application.loaded_files
27
+ if missing.any?
28
+ msg = "The following files application files under #{base} were not loaded:\n"
29
+ missing.each do |file|
30
+ path = file.relative_path_from(base)
31
+ msg << " * #{path}\n"
32
+ end
33
+ puts msg
34
+ end
35
+ end
36
+
37
+
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,92 @@
1
+ module Praxis
2
+ class Config
3
+ include Attributor::Type
4
+
5
+ attr_reader :attribute
6
+
7
+ def initialize
8
+ @attribute = Attributor::Attribute.new(Attributor::Struct) {}
9
+ @value = nil
10
+ end
11
+
12
+ # You can define the configuration in different ways
13
+ #
14
+ # Add a key to the top struct
15
+ # define do
16
+ # attribute :added_to_top, String
17
+ # end
18
+ #
19
+ # Add a key to the top struct (that is a struct itself)
20
+ # define do
21
+ # attribute :app do
22
+ # attribute :one String
23
+ # end
24
+ # end
25
+ # Which you could expand too in this way
26
+ # define do
27
+ # attribute :app do
28
+ # attribute :two String
29
+ # end
30
+ # end
31
+ # ...or using this way too (equivalent)
32
+ # define(:app) do
33
+ # attribute :two, String
34
+ # end
35
+ # You can also define a key to be a non-Struct type
36
+ # define :app, Attributor::Hash
37
+
38
+ def define(key=nil, type=Attributor::Struct, **opts, &block)
39
+ if key.nil? && type != Attributor::Struct
40
+ raise Exceptions::InvalidConfiguration.new(
41
+ "You cannot define the top level configuration with a non-Struct type. Got: #{type.inspect}"
42
+ )
43
+ end
44
+
45
+ case key
46
+ when String, Symbol, NilClass
47
+
48
+ top = key.nil? ? @attribute : @attribute.attributes[key]
49
+ if top #key defined...redefine
50
+ unless type == Attributor::Struct && top.type < Attributor::Struct
51
+ raise Exceptions::InvalidConfiguration.new(
52
+ "Incompatible type received for extending configuration key [#{key}]. Got type #{type.name}"
53
+ )
54
+ end
55
+ top.options.merge!(opts)
56
+ top.type.attributes(opts, &block)
57
+ else
58
+ @attribute.attributes[key] = Attributor::Attribute.new(type, opts, &block)
59
+ end
60
+ else
61
+ raise Exceptions::InvalidConfiguration.new(
62
+ "Defining a configuration key requires a String or a Symbol key. Got: #{key.inspect}"
63
+ )
64
+ end
65
+
66
+ end
67
+
68
+ def set(config)
69
+ context = ['Application', 'config']
70
+
71
+ begin
72
+ @value = @attribute.load(config, context)
73
+ rescue Attributor::AttributorException => e
74
+ raise Exceptions::ConfigLoad.new(exception: e)
75
+ end
76
+
77
+ errors = @attribute.validate(@value, context)
78
+
79
+ unless errors.empty?
80
+ raise Exceptions::ConfigValidation.new(errors: errors)
81
+ end
82
+ end
83
+
84
+ def get
85
+ @value ||= begin
86
+ context = ['Application','config'].freeze
87
+ @attribute.load({},context)
88
+ end
89
+ end
90
+
91
+ end
92
+ end
@@ -0,0 +1,62 @@
1
+ module Praxis
2
+ module ContentTypeParser
3
+ REGEXP = /^
4
+ \s*
5
+ (?<type>[^+;\s]+)
6
+ (\+(?<sub_type>[^;\s]+))?
7
+ (\s*;\s*)?
8
+ (?<params>.*?)?
9
+ (\s*;\s*)?
10
+ $/x
11
+
12
+ # Parses Content type
13
+ #
14
+ # @param [String] Content type to parse
15
+ # @return [Hash] A hash with keys: :type, :sub_type(optional) and :params(optional)
16
+ # @raise [ArgumentError] It fails when blank or weird content type is provided
17
+ #
18
+ # @example
19
+ # parse(nil) #=> Exception: Content type does not have any type defined (ArgumentError)
20
+ # parse('+json') #=> Exception: Content type does not have any type defined (ArgumentError)
21
+ # parse(';p1=11') #=> Exception: Content type does not have any type defined (ArgumentError)
22
+ #
23
+ # @example
24
+ # parse('text/xml') #=>
25
+ # {:type => "text/xml",
26
+ # :sub_type => nil,
27
+ # :params => {}}
28
+ #
29
+ # @example
30
+ # parse('application/vnd.something+json') #=>
31
+ # {:type => "application/vnd.something",
32
+ # :sub_type => "json",
33
+ # :params => {}}
34
+ #
35
+ # @example
36
+ # parse('application/vnd.something+json;p1=1.0;param_with_noval;p2=a13') #=>
37
+ # {:type => "application/vnd.something",
38
+ # :sub_type => "json",
39
+ # :params => {"p1"=>"1.0", "param_with_noval"=>nil, "p2"=>"a13"}}
40
+ #
41
+ def self.parse(content_type)
42
+ parsed = REGEXP.match(content_type.to_s)
43
+ raise(ArgumentError, 'Content type does not have any type defined') unless parsed
44
+
45
+ result = {
46
+ type: parsed[:type]
47
+ }
48
+ result[:sub_type] = parsed[:sub_type] if parsed[:sub_type]
49
+ if parsed[:params]
50
+ params = {}
51
+ parsed[:params].split(';').each do |param|
52
+ key, value = param.split('=')
53
+ key = key.to_s.strip
54
+ next if key.empty?
55
+ params[key.strip] = value && value.strip
56
+ end
57
+ result[:params] = params unless params.empty?
58
+ end
59
+ result
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,59 @@
1
+ require 'active_support/concern'
2
+ require 'active_support/inflector'
3
+
4
+ module Praxis
5
+
6
+ module Controller
7
+ extend ActiveSupport::Concern
8
+
9
+ included do
10
+ attr_reader :request
11
+ attr_accessor :response
12
+ Application.instance.controllers << self
13
+ self.instance_eval do
14
+ @before_callbacks = Hash.new
15
+ @after_callbacks = Hash.new
16
+ end
17
+
18
+ end
19
+
20
+ module ClassMethods
21
+ attr_reader :before_callbacks, :after_callbacks
22
+
23
+ def implements(definition)
24
+ define_singleton_method(:definition) do
25
+ definition
26
+ end
27
+ definition.controller = self
28
+ end
29
+
30
+ def actions
31
+ definition.actions
32
+ end
33
+
34
+ def action(name)
35
+ actions.fetch(name)
36
+ end
37
+
38
+ def before(*stage_path, **conditions, &block)
39
+ stage_path = [:action] if stage_path.empty?
40
+ @before_callbacks[stage_path] ||= Array.new
41
+ @before_callbacks[stage_path] << [conditions, block]
42
+ end
43
+
44
+ def after(*stage_path, **conditions, &block)
45
+ stage_path = [:action] if stage_path.empty?
46
+ @after_callbacks[stage_path] ||= Array.new
47
+ @after_callbacks[stage_path] << [conditions, block]
48
+ end
49
+
50
+ end
51
+
52
+
53
+ def initialize(request, response=Responses::Ok.new)
54
+ @request = request
55
+ @response = response
56
+ end
57
+
58
+ end
59
+ end
@@ -0,0 +1,102 @@
1
+ module Praxis
2
+
3
+ CONTEXT_FOR = {
4
+ params: [Attributor::AttributeResolver::ROOT_PREFIX, "params".freeze],
5
+ headers: [Attributor::AttributeResolver::ROOT_PREFIX, "headers".freeze],
6
+ payload: [Attributor::AttributeResolver::ROOT_PREFIX, "payload".freeze]
7
+ }.freeze
8
+
9
+ class Dispatcher
10
+ attr_reader :controller, :action, :request, :application
11
+
12
+ @deferred_callbacks = Hash.new do |hash,stage|
13
+ hash[stage] = {before: [], after:[]}
14
+ end
15
+
16
+ class << self
17
+ attr_reader :deferred_callbacks
18
+ end
19
+
20
+ def self.before(*stage_path, **conditions, &block)
21
+ @deferred_callbacks[:before] << [conditions, block]
22
+ end
23
+
24
+ def self.after(*stage_path, **conditions, &block)
25
+ @deferred_callbacks[:after] << [conditions, block]
26
+ end
27
+
28
+ def self.current(thread: Thread.current, application: Application.instance)
29
+ thread[:praxis_dispatcher] ||= self.new(application: application)
30
+ end
31
+
32
+ def initialize(application: Application.instance)
33
+ @stages = []
34
+ @application = application
35
+ setup_stages!
36
+ end
37
+
38
+ def setup_stages!
39
+ @stages << RequestStages::LoadRequest.new(:load_request, self)
40
+ @stages << RequestStages::Validate.new(:validate, self)
41
+ @stages << RequestStages::Action.new(:action, self)
42
+ @stages << RequestStages::Response.new(:response, self)
43
+ setup_deferred_callbacks!
44
+ end
45
+
46
+ def setup_deferred_callbacks!
47
+ self.class.deferred_callbacks.each do |stage_name, callbacks|
48
+ callbacks[:before].each do |(*stage_path, block)|
49
+ self.before(stage_name, *stage_path, &block)
50
+ end
51
+
52
+ callbacks[:after].each do |(*stage_path, block)|
53
+ self.after(stage_name, *stage_path, &block)
54
+ end
55
+ end
56
+ end
57
+
58
+ def before(*stage_path, &block)
59
+ stage_name = stage_path.shift
60
+ stages.find { |stage| stage.name == stage_name }.before(*stage_path, &block)
61
+ end
62
+
63
+ def after(*stage_path, &block)
64
+ stage_name = stage_path.shift
65
+ stages.find { |stage| stage.name == stage_name }.after(*stage_path, &block)
66
+ end
67
+
68
+ def dispatch(controller_class, action, request)
69
+ @controller = controller_class.new(request)
70
+ @action = action
71
+ @request = request
72
+
73
+ @stages.each do |stage|
74
+ result = stage.run
75
+ case result
76
+ when Response
77
+ return result.finish
78
+ end
79
+ end
80
+
81
+ controller.response.finish
82
+ rescue => e
83
+ response = Responses::InternalServerError.new(error: e)
84
+ response.request = controller.request
85
+ response.finish
86
+ ensure
87
+ @controller = nil
88
+ @action = nil
89
+ @request = nil
90
+ end
91
+
92
+
93
+ def reset_cache!
94
+ return unless Praxis::Blueprint.caching_enabled?
95
+
96
+ Praxis::Blueprint.cache = Hash.new do |hash, key|
97
+ hash[key] = Hash.new
98
+ end
99
+ end
100
+
101
+ end
102
+ end
@@ -0,0 +1,4 @@
1
+ module Praxis
2
+ class Exception < StandardError
3
+ end
4
+ end
@@ -0,0 +1,6 @@
1
+ module Praxis
2
+ module Exceptions
3
+ class Config < Exception
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,9 @@
1
+ module Praxis
2
+ module Exceptions
3
+ class ConfigLoad < Config
4
+ def initialize(exception:)
5
+ super(exception.message)
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Praxis
2
+ module Exceptions
3
+ class ConfigValidation < Config
4
+ def initialize(errors:)
5
+ super('Validation error: ' << errors.join('; '))
6
+ end
7
+ end
8
+ end
9
+ end