praxis 0.16.1 → 0.17.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (399) hide show
  1. checksums.yaml +4 -4
  2. data/.rspec +0 -1
  3. data/.ruby-version +1 -1
  4. data/.travis.yml +2 -1
  5. data/CHANGELOG.md +41 -0
  6. data/CONTRIBUTING.md +3 -0
  7. data/lib/api_browser/Gruntfile.js +20 -4
  8. data/lib/api_browser/app/bower_components/angular-mocks/.bower.json +6 -6
  9. data/lib/api_browser/app/bower_components/angular-mocks/README.md +11 -5
  10. data/lib/api_browser/app/bower_components/angular-mocks/angular-mocks.js +475 -216
  11. data/lib/api_browser/app/bower_components/angular-mocks/bower.json +2 -2
  12. data/lib/api_browser/app/bower_components/angular-mocks/ngAnimateMock.js +2 -0
  13. data/lib/api_browser/app/bower_components/angular-mocks/ngMock.js +2 -0
  14. data/lib/api_browser/app/bower_components/angular-mocks/ngMockE2E.js +2 -0
  15. data/lib/api_browser/app/bower_components/angular-mocks/package.json +1 -1
  16. data/lib/api_browser/app/bower_components/angular-sanitize/.bower.json +8 -8
  17. data/lib/api_browser/app/bower_components/angular-sanitize/README.md +19 -5
  18. data/lib/api_browser/app/bower_components/angular-sanitize/angular-sanitize.js +186 -127
  19. data/lib/api_browser/app/bower_components/angular-sanitize/angular-sanitize.min.js +12 -10
  20. data/lib/api_browser/app/bower_components/angular-sanitize/angular-sanitize.min.js.map +3 -3
  21. data/lib/api_browser/app/bower_components/angular-sanitize/bower.json +3 -2
  22. data/lib/api_browser/app/bower_components/angular-sanitize/index.js +2 -0
  23. data/lib/api_browser/app/bower_components/angular-sanitize/package.json +26 -0
  24. data/lib/api_browser/app/bower_components/angular-ui-bootstrap-bower/.bower.json +15 -8
  25. data/lib/api_browser/app/bower_components/angular-ui-bootstrap-bower/bower.json +11 -3
  26. data/lib/api_browser/app/bower_components/angular-ui-bootstrap-bower/ui-bootstrap-csp.css +6 -0
  27. data/lib/api_browser/app/bower_components/angular-ui-bootstrap-bower/ui-bootstrap-tpls.js +1177 -453
  28. data/lib/api_browser/app/bower_components/angular-ui-bootstrap-bower/ui-bootstrap-tpls.min.js +4 -4
  29. data/lib/api_browser/app/bower_components/angular-ui-bootstrap-bower/ui-bootstrap.js +1066 -404
  30. data/lib/api_browser/app/bower_components/angular-ui-bootstrap-bower/ui-bootstrap.min.js +3 -3
  31. data/lib/api_browser/app/bower_components/angular-ui-router/.bower.json +5 -6
  32. data/lib/api_browser/app/bower_components/angular-ui-router/CHANGELOG.md +208 -3
  33. data/lib/api_browser/app/bower_components/angular-ui-router/CONTRIBUTING.md +65 -0
  34. data/lib/api_browser/app/bower_components/angular-ui-router/LICENSE +1 -1
  35. data/lib/api_browser/app/bower_components/angular-ui-router/README.md +36 -71
  36. data/lib/api_browser/app/bower_components/angular-ui-router/api/angular-ui-router.d.ts +126 -0
  37. data/lib/api_browser/app/bower_components/angular-ui-router/bower.json +1 -1
  38. data/lib/api_browser/app/bower_components/angular-ui-router/release/angular-ui-router.js +1902 -755
  39. data/lib/api_browser/app/bower_components/angular-ui-router/release/angular-ui-router.min.js +2 -2
  40. data/lib/api_browser/app/bower_components/angular-ui-router/src/common.js +69 -23
  41. data/lib/api_browser/app/bower_components/angular-ui-router/src/resolve.js +15 -5
  42. data/lib/api_browser/app/bower_components/angular-ui-router/src/state.js +556 -295
  43. data/lib/api_browser/app/bower_components/angular-ui-router/src/stateDirectives.js +101 -42
  44. data/lib/api_browser/app/bower_components/angular-ui-router/src/stateFilters.js +6 -2
  45. data/lib/api_browser/app/bower_components/angular-ui-router/src/templateFactory.js +2 -2
  46. data/lib/api_browser/app/bower_components/angular-ui-router/src/urlMatcherFactory.js +822 -97
  47. data/lib/api_browser/app/bower_components/angular-ui-router/src/urlRouter.js +274 -120
  48. data/lib/api_browser/app/bower_components/angular-ui-router/src/viewDirective.js +33 -20
  49. data/lib/api_browser/app/bower_components/angular-ui-router/src/viewScroll.js +1 -1
  50. data/lib/api_browser/app/bower_components/angular/.bower.json +5 -5
  51. data/lib/api_browser/app/bower_components/angular/README.md +2 -5
  52. data/lib/api_browser/app/bower_components/angular/angular-csp.css +5 -8
  53. data/lib/api_browser/app/bower_components/angular/angular.js +12975 -6996
  54. data/lib/api_browser/app/bower_components/angular/angular.min.js +285 -213
  55. data/lib/api_browser/app/bower_components/angular/angular.min.js.gzip +0 -0
  56. data/lib/api_browser/app/bower_components/angular/angular.min.js.map +3 -3
  57. data/lib/api_browser/app/bower_components/angular/bower.json +1 -1
  58. data/lib/api_browser/app/bower_components/angular/index.js +2 -0
  59. data/lib/api_browser/app/bower_components/angular/package.json +2 -2
  60. data/lib/api_browser/app/bower_components/bootstrap-sass/.bower.json +31 -16
  61. data/lib/api_browser/app/bower_components/bootstrap-sass/CHANGELOG.md +108 -0
  62. data/lib/api_browser/app/bower_components/bootstrap-sass/CONTRIBUTING.md +55 -37
  63. data/lib/api_browser/app/bower_components/bootstrap-sass/README.md +147 -206
  64. data/lib/api_browser/app/bower_components/bootstrap-sass/bower.json +19 -8
  65. data/lib/api_browser/app/bower_components/bootstrap-sass/{dist/fonts → vendor/assets/fonts/bootstrap}/glyphicons-halflings-regular.eot +0 -0
  66. data/lib/api_browser/app/bower_components/bootstrap-sass/{dist/fonts → vendor/assets/fonts/bootstrap}/glyphicons-halflings-regular.svg +0 -0
  67. data/lib/api_browser/app/bower_components/bootstrap-sass/{dist/fonts → vendor/assets/fonts/bootstrap}/glyphicons-halflings-regular.ttf +0 -0
  68. data/lib/api_browser/app/bower_components/bootstrap-sass/{dist/fonts → vendor/assets/fonts/bootstrap}/glyphicons-halflings-regular.woff +0 -0
  69. data/lib/api_browser/app/bower_components/bootstrap-sass/vendor/assets/javascripts/bootstrap.js +12 -0
  70. data/lib/api_browser/app/bower_components/bootstrap-sass/{js → vendor/assets/javascripts/bootstrap}/affix.js +1 -1
  71. data/lib/api_browser/app/bower_components/bootstrap-sass/{js → vendor/assets/javascripts/bootstrap}/alert.js +1 -1
  72. data/lib/api_browser/app/bower_components/bootstrap-sass/{js → vendor/assets/javascripts/bootstrap}/button.js +11 -5
  73. data/lib/api_browser/app/bower_components/bootstrap-sass/{js → vendor/assets/javascripts/bootstrap}/carousel.js +5 -5
  74. data/lib/api_browser/app/bower_components/bootstrap-sass/{js → vendor/assets/javascripts/bootstrap}/collapse.js +1 -1
  75. data/lib/api_browser/app/bower_components/bootstrap-sass/{js → vendor/assets/javascripts/bootstrap}/dropdown.js +5 -5
  76. data/lib/api_browser/app/bower_components/bootstrap-sass/{js → vendor/assets/javascripts/bootstrap}/modal.js +1 -1
  77. data/lib/api_browser/app/bower_components/bootstrap-sass/{js → vendor/assets/javascripts/bootstrap}/popover.js +1 -1
  78. data/lib/api_browser/app/bower_components/bootstrap-sass/{js → vendor/assets/javascripts/bootstrap}/scrollspy.js +2 -2
  79. data/lib/api_browser/app/bower_components/bootstrap-sass/{js → vendor/assets/javascripts/bootstrap}/tab.js +1 -1
  80. data/lib/api_browser/app/bower_components/bootstrap-sass/{js → vendor/assets/javascripts/bootstrap}/tooltip.js +1 -1
  81. data/lib/api_browser/app/bower_components/bootstrap-sass/{js → vendor/assets/javascripts/bootstrap}/transition.js +1 -1
  82. data/lib/api_browser/app/bower_components/bootstrap-sass/vendor/assets/stylesheets/bootstrap.scss +1 -0
  83. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_alerts.scss +0 -0
  84. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_badges.scss +6 -6
  85. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_breadcrumbs.scss +0 -0
  86. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_button-groups.scss +7 -33
  87. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_buttons.scss +2 -5
  88. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_carousel.scss +1 -0
  89. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_close.scss +0 -0
  90. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_code.scss +0 -0
  91. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_component-animations.scss +0 -0
  92. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_dropdowns.scss +3 -8
  93. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_forms.scss +11 -0
  94. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_glyphicons.scss +5 -5
  95. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_grid.scss +12 -26
  96. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_input-groups.scss +1 -1
  97. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_jumbotron.scss +8 -2
  98. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_labels.scss +6 -0
  99. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_list-group.scss +0 -0
  100. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_media.scss +0 -0
  101. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_mixins.scss +38 -51
  102. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_modals.scss +2 -5
  103. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_navbar.scss +41 -53
  104. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_navs.scss +0 -20
  105. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_normalize.scss +0 -0
  106. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_pager.scss +0 -0
  107. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_pagination.scss +0 -0
  108. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_panels.scss +11 -1
  109. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_popovers.scss +0 -0
  110. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_print.scss +0 -0
  111. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_progress-bars.scss +0 -12
  112. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_responsive-utilities.scss +0 -0
  113. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_scaffolding.scss +0 -0
  114. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_tables.scss +5 -18
  115. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_theme.scss +2 -2
  116. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_thumbnails.scss +9 -3
  117. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_tooltip.scss +0 -0
  118. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_type.scss +54 -52
  119. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_utilities.scss +0 -0
  120. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_variables.scss +20 -11
  121. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_wells.scss +0 -0
  122. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/bootstrap.scss +0 -0
  123. data/lib/api_browser/app/bower_components/lodash/.bower.json +9 -13
  124. data/lib/api_browser/app/bower_components/lodash/LICENSE.txt +3 -3
  125. data/lib/api_browser/app/bower_components/lodash/bower.json +4 -7
  126. data/lib/api_browser/app/bower_components/lodash/lodash.js +12235 -0
  127. data/lib/api_browser/app/bower_components/lodash/lodash.min.js +98 -0
  128. data/lib/api_browser/app/index.html +0 -1
  129. data/lib/api_browser/app/js/app.js +2 -5
  130. data/lib/api_browser/app/js/controllers/action.js +21 -37
  131. data/lib/api_browser/app/js/controllers/controller.js +23 -1
  132. data/lib/api_browser/app/js/controllers/menu.js +46 -14
  133. data/lib/api_browser/app/js/controllers/type.js +2 -9
  134. data/lib/api_browser/app/js/directives/attribute_description.js +15 -5
  135. data/lib/api_browser/app/js/directives/attribute_table.js +6 -6
  136. data/lib/api_browser/app/js/directives/fixed_if_fits.js +20 -0
  137. data/lib/api_browser/app/js/directives/no_container.js +6 -6
  138. data/lib/api_browser/app/js/directives/type_placeholder.js +21 -0
  139. data/lib/api_browser/app/js/factories/Configuration.js +13 -0
  140. data/lib/api_browser/app/js/factories/Documentation.js +0 -3
  141. data/lib/api_browser/app/js/factories/normalize_attributes.js +19 -0
  142. data/lib/api_browser/app/js/factories/template_for.js +113 -0
  143. data/lib/api_browser/app/sass/modules/_body.scss +26 -4
  144. data/lib/api_browser/app/sass/modules/_sidebar.scss +68 -1
  145. data/lib/api_browser/app/sass/praxis.scss +1 -5
  146. data/lib/api_browser/app/sass/variables/_bootstrap-variables.scss +13 -4
  147. data/lib/api_browser/app/views/action.html +13 -17
  148. data/lib/api_browser/app/views/controller.html +32 -4
  149. data/lib/api_browser/app/views/directives/attribute_description.html +1 -1
  150. data/lib/api_browser/app/views/directives/attribute_description/{_default.html → default.html} +0 -0
  151. data/lib/api_browser/app/views/directives/attribute_description/example.html +13 -0
  152. data/lib/api_browser/app/views/directives/attribute_description/headers.html +8 -0
  153. data/lib/api_browser/app/views/directives/attribute_description/member_options.html +4 -0
  154. data/lib/api_browser/app/views/directives/attribute_description/values.html +14 -0
  155. data/lib/api_browser/app/views/directives/attribute_table.html +2 -2
  156. data/lib/api_browser/app/views/home.html +1 -3
  157. data/lib/api_browser/app/views/layout.html +3 -36
  158. data/lib/api_browser/app/views/menu.html +45 -0
  159. data/lib/api_browser/app/views/navbar.html +1 -1
  160. data/lib/api_browser/app/views/type.html +2 -2
  161. data/lib/api_browser/app/views/type/{_details.html → details.html} +6 -6
  162. data/lib/api_browser/app/views/types/embedded/default.html +10 -0
  163. data/lib/api_browser/app/views/types/embedded/links.html +11 -0
  164. data/lib/api_browser/app/views/types/embedded/struct.html +2 -0
  165. data/lib/api_browser/app/views/types/label/link.html +1 -0
  166. data/lib/api_browser/app/views/types/label/primitive.html +1 -0
  167. data/lib/api_browser/app/views/types/label/primitive_collection.html +1 -0
  168. data/lib/api_browser/app/views/types/label/type.html +1 -0
  169. data/lib/api_browser/app/views/types/label/type_collection.html +1 -0
  170. data/lib/api_browser/app/views/{directives/request_body/_default.html → types/standalone/default.html} +1 -1
  171. data/lib/api_browser/app/views/types/standalone/struct.html +1 -0
  172. data/lib/api_browser/bower.json +9 -9
  173. data/lib/api_browser/package.json +1 -1
  174. data/lib/praxis.rb +10 -4
  175. data/lib/praxis/action_definition.rb +16 -4
  176. data/lib/praxis/action_definition/headers_dsl_compiler.rb +5 -2
  177. data/lib/praxis/api_definition.rb +3 -1
  178. data/lib/praxis/api_general_info.rb +49 -5
  179. data/lib/praxis/application.rb +12 -4
  180. data/lib/praxis/bootloader.rb +1 -0
  181. data/lib/praxis/bootloader_stages/environment.rb +2 -0
  182. data/lib/praxis/bootloader_stages/routing.rb +1 -1
  183. data/lib/praxis/bootloader_stages/subgroup_loader.rb +1 -0
  184. data/lib/praxis/exceptions/validation.rb +7 -0
  185. data/lib/praxis/handlers/plain.rb +16 -0
  186. data/lib/praxis/handlers/xml.rb +4 -4
  187. data/lib/praxis/links.rb +13 -3
  188. data/lib/praxis/media_type_identifier.rb +3 -0
  189. data/lib/praxis/multipart/parser.rb +41 -48
  190. data/lib/praxis/multipart/part.rb +196 -3
  191. data/lib/praxis/request.rb +14 -11
  192. data/lib/praxis/request_stages/request_stage.rb +4 -0
  193. data/lib/praxis/request_stages/response.rb +10 -9
  194. data/lib/praxis/request_stages/validate.rb +1 -7
  195. data/lib/praxis/request_stages/validate_params_and_headers.rb +30 -5
  196. data/lib/praxis/request_stages/validate_payload.rb +14 -5
  197. data/lib/praxis/resource_definition.rb +117 -15
  198. data/lib/praxis/response.rb +6 -5
  199. data/lib/praxis/response_definition.rb +51 -5
  200. data/lib/praxis/responses/http.rb +5 -0
  201. data/lib/praxis/responses/multipart_ok.rb +51 -0
  202. data/lib/praxis/responses/validation_error.rb +7 -7
  203. data/lib/praxis/restful_doc_generator.rb +9 -4
  204. data/lib/praxis/route.rb +3 -2
  205. data/lib/praxis/router.rb +26 -16
  206. data/lib/praxis/router/rack.rb +51 -0
  207. data/lib/praxis/router/simple.rb +146 -0
  208. data/lib/praxis/routing_config.rb +2 -2
  209. data/lib/praxis/trait.rb +1 -1
  210. data/lib/praxis/types/fuzzy_hash.rb +49 -0
  211. data/lib/praxis/types/media_type_common.rb +1 -1
  212. data/lib/praxis/types/multipart.rb +47 -12
  213. data/lib/praxis/types/multipart_array.rb +320 -0
  214. data/lib/praxis/types/multipart_array/part_definition.rb +52 -0
  215. data/lib/praxis/validation_handler.rb +10 -0
  216. data/lib/praxis/version.rb +2 -2
  217. data/praxis.gemspec +3 -3
  218. data/spec/api_browser/directives/type_placeholder_spec.js +134 -0
  219. data/spec/api_browser/factories/normalize_attributes_spec.js +97 -0
  220. data/spec/api_browser/factories/template_for_spec.js +67 -0
  221. data/spec/functional_spec.rb +111 -45
  222. data/spec/praxis/action_definition_spec.rb +31 -7
  223. data/spec/praxis/api_definition_spec.rb +2 -2
  224. data/spec/praxis/api_general_info_spec.rb +25 -0
  225. data/spec/praxis/application_spec.rb +24 -11
  226. data/spec/praxis/handlers/xml_spec.rb +55 -33
  227. data/spec/praxis/links_spec.rb +18 -1
  228. data/spec/praxis/media_type_collection_spec.rb +1 -1
  229. data/spec/praxis/media_type_spec.rb +2 -2
  230. data/spec/praxis/multipart/parser_spec.rb +21 -13
  231. data/spec/praxis/plugins/praxis_mapper_plugin_spec.rb +1 -1
  232. data/spec/praxis/request_spec.rb +52 -24
  233. data/spec/praxis/{request_stages_action_spec.rb → request_stages/action_spec.rb} +1 -1
  234. data/spec/praxis/{request_stage_spec.rb → request_stages/request_stage_spec.rb} +0 -0
  235. data/spec/praxis/{request_stages_validate_spec.rb → request_stages/validate_spec.rb} +1 -1
  236. data/spec/praxis/resource_definition_spec.rb +30 -4
  237. data/spec/praxis/response_definition_spec.rb +60 -19
  238. data/spec/praxis/response_spec.rb +2 -2
  239. data/spec/praxis/responses/validation_error_spec.rb +33 -16
  240. data/spec/praxis/route_spec.rb +4 -2
  241. data/spec/praxis/router_spec.rb +28 -12
  242. data/spec/praxis/routing_config_spec.rb +11 -5
  243. data/spec/praxis/types/collection_spec.rb +1 -1
  244. data/spec/praxis/types/fuzzy_hash_spec.rb +20 -0
  245. data/spec/praxis/types/multipart_array/part_definition_spec.rb +5 -0
  246. data/spec/praxis/types/multipart_array_spec.rb +334 -0
  247. data/spec/praxis/types/multipart_spec.rb +14 -5
  248. data/spec/spec_app/app/controllers/instances.rb +20 -10
  249. data/spec/spec_app/app/controllers/volumes.rb +8 -4
  250. data/spec/spec_app/app/responses/bulk_response.rb +0 -6
  251. data/spec/spec_app/config/environment.rb +13 -0
  252. data/spec/spec_app/design/api.rb +7 -10
  253. data/spec/spec_app/design/media_types/instance.rb +3 -1
  254. data/spec/spec_app/design/resources/instances.rb +50 -41
  255. data/spec/spec_app/design/resources/volume_snapshots.rb +39 -0
  256. data/spec/spec_app/design/resources/volumes.rb +11 -6
  257. data/spec/spec_helper.rb +3 -1
  258. metadata +125 -218
  259. data/lib/api_browser/app/bower_components/angular-ui-router/src/compat.js +0 -146
  260. data/lib/api_browser/app/bower_components/bootstrap-sass/CNAME +0 -1
  261. data/lib/api_browser/app/bower_components/bootstrap-sass/DOCS-LICENSE +0 -319
  262. data/lib/api_browser/app/bower_components/bootstrap-sass/Gemfile +0 -5
  263. data/lib/api_browser/app/bower_components/bootstrap-sass/Gemfile.lock +0 -14
  264. data/lib/api_browser/app/bower_components/bootstrap-sass/Gruntfile.js +0 -244
  265. data/lib/api_browser/app/bower_components/bootstrap-sass/LICENSE +0 -176
  266. data/lib/api_browser/app/bower_components/bootstrap-sass/LICENSE-MIT +0 -21
  267. data/lib/api_browser/app/bower_components/bootstrap-sass/Rakefile +0 -44
  268. data/lib/api_browser/app/bower_components/bootstrap-sass/_config.yml +0 -25
  269. data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/ads.html +0 -1
  270. data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/footer.html +0 -34
  271. data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/header.html +0 -42
  272. data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/nav-about.html +0 -12
  273. data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/nav-components.html +0 -137
  274. data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/nav-css.html +0 -99
  275. data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/nav-customize.html +0 -40
  276. data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/nav-getting-started.html +0 -44
  277. data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/nav-javascript.html +0 -88
  278. data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/nav-main.html +0 -37
  279. data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/old-bs-docs.html +0 -8
  280. data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/social-buttons.html +0 -16
  281. data/lib/api_browser/app/bower_components/bootstrap-sass/_layouts/default.html +0 -79
  282. data/lib/api_browser/app/bower_components/bootstrap-sass/_layouts/home.html +0 -47
  283. data/lib/api_browser/app/bower_components/bootstrap-sass/about.html +0 -93
  284. data/lib/api_browser/app/bower_components/bootstrap-sass/browserstack.json +0 -37
  285. data/lib/api_browser/app/bower_components/bootstrap-sass/components.html +0 -3689
  286. data/lib/api_browser/app/bower_components/bootstrap-sass/composer.json +0 -28
  287. data/lib/api_browser/app/bower_components/bootstrap-sass/css.html +0 -2674
  288. data/lib/api_browser/app/bower_components/bootstrap-sass/customize.html +0 -1715
  289. data/lib/api_browser/app/bower_components/bootstrap-sass/dist/css/bootstrap-theme.css +0 -427
  290. data/lib/api_browser/app/bower_components/bootstrap-sass/dist/css/bootstrap-theme.min.css +0 -1
  291. data/lib/api_browser/app/bower_components/bootstrap-sass/dist/css/bootstrap.css +0 -6350
  292. data/lib/api_browser/app/bower_components/bootstrap-sass/dist/css/bootstrap.min.css +0 -1
  293. data/lib/api_browser/app/bower_components/bootstrap-sass/dist/js/bootstrap.js +0 -2002
  294. data/lib/api_browser/app/bower_components/bootstrap-sass/dist/js/bootstrap.min.js +0 -9
  295. data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/css/docs.css +0 -1195
  296. data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/css/pygments-manni.css +0 -66
  297. data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/ico/apple-touch-icon-144-precomposed.png +0 -0
  298. data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/ico/favicon.png +0 -0
  299. data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/js/application.js +0 -103
  300. data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/js/customizer.js +0 -332
  301. data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/js/filesaver.js +0 -169
  302. data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/js/holder.js +0 -404
  303. data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/js/ie8-responsive-file-warning.js +0 -12
  304. data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/js/jszip.js +0 -1467
  305. data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/js/less.js +0 -9
  306. data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/js/raw-files.js +0 -3
  307. data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/js/uglify.js +0 -14
  308. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/carousel/carousel.css +0 -148
  309. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/carousel/index.html +0 -206
  310. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/grid/grid.css +0 -28
  311. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/grid/index.html +0 -148
  312. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/jumbotron-narrow/index.html +0 -82
  313. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/jumbotron-narrow/jumbotron-narrow.css +0 -79
  314. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/jumbotron/index.html +0 -99
  315. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/jumbotron/jumbotron.css +0 -5
  316. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/justified-nav/index.html +0 -83
  317. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/justified-nav/justified-nav.css +0 -88
  318. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/navbar-fixed-top/index.html +0 -91
  319. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/navbar-fixed-top/navbar-fixed-top.css +0 -4
  320. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/navbar-static-top/index.html +0 -92
  321. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/navbar-static-top/navbar-static-top.css +0 -7
  322. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/navbar/index.html +0 -88
  323. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/navbar/navbar.css +0 -8
  324. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/non-responsive/index.html +0 -101
  325. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/non-responsive/non-responsive.css +0 -116
  326. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/offcanvas/index.html +0 -130
  327. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/offcanvas/offcanvas.css +0 -50
  328. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/offcanvas/offcanvas.js +0 -5
  329. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/carousel.jpg +0 -0
  330. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/grid.jpg +0 -0
  331. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/jumbotron-narrow.jpg +0 -0
  332. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/jumbotron.jpg +0 -0
  333. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/justified-nav.jpg +0 -0
  334. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/navbar-fixed.jpg +0 -0
  335. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/navbar-static.jpg +0 -0
  336. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/navbar.jpg +0 -0
  337. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/non-responsive.jpg +0 -0
  338. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/offcanvas.jpg +0 -0
  339. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/sign-in.jpg +0 -0
  340. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/starter-template.jpg +0 -0
  341. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/sticky-footer-navbar.jpg +0 -0
  342. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/sticky-footer.jpg +0 -0
  343. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/theme.jpg +0 -0
  344. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/signin/index.html +0 -50
  345. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/signin/signin.css +0 -40
  346. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/starter-template/index.html +0 -68
  347. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/starter-template/starter-template.css +0 -7
  348. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/sticky-footer-navbar/index.html +0 -91
  349. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/sticky-footer-navbar/sticky-footer-navbar.css +0 -45
  350. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/sticky-footer/index.html +0 -55
  351. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/sticky-footer/sticky-footer.css +0 -38
  352. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/theme/index.html +0 -384
  353. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/theme/theme.css +0 -14
  354. data/lib/api_browser/app/bower_components/bootstrap-sass/fonts/glyphicons-halflings-regular.eot +0 -0
  355. data/lib/api_browser/app/bower_components/bootstrap-sass/fonts/glyphicons-halflings-regular.svg +0 -229
  356. data/lib/api_browser/app/bower_components/bootstrap-sass/fonts/glyphicons-halflings-regular.ttf +0 -0
  357. data/lib/api_browser/app/bower_components/bootstrap-sass/fonts/glyphicons-halflings-regular.woff +0 -0
  358. data/lib/api_browser/app/bower_components/bootstrap-sass/getting-started.html +0 -1021
  359. data/lib/api_browser/app/bower_components/bootstrap-sass/index.html +0 -16
  360. data/lib/api_browser/app/bower_components/bootstrap-sass/javascript.html +0 -1983
  361. data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/index.html +0 -52
  362. data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/affix.js +0 -25
  363. data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/alert.js +0 -62
  364. data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/button.js +0 -116
  365. data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/carousel.js +0 -87
  366. data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/collapse.js +0 -164
  367. data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/dropdown.js +0 -219
  368. data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/modal.js +0 -196
  369. data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/phantom.js +0 -69
  370. data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/popover.js +0 -133
  371. data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/scrollspy.js +0 -37
  372. data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/tab.js +0 -86
  373. data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/tooltip.js +0 -437
  374. data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/transition.js +0 -13
  375. data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/vendor/jquery.js +0 -6
  376. data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/vendor/qunit.css +0 -232
  377. data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/vendor/qunit.js +0 -1510
  378. data/lib/api_browser/app/bower_components/bootstrap-sass/package.json +0 -40
  379. data/lib/api_browser/app/bower_components/lodash/dist/lodash.compat.js +0 -7157
  380. data/lib/api_browser/app/bower_components/lodash/dist/lodash.compat.min.js +0 -61
  381. data/lib/api_browser/app/bower_components/lodash/dist/lodash.js +0 -6785
  382. data/lib/api_browser/app/bower_components/lodash/dist/lodash.min.js +0 -56
  383. data/lib/api_browser/app/bower_components/lodash/dist/lodash.underscore.js +0 -4979
  384. data/lib/api_browser/app/bower_components/lodash/dist/lodash.underscore.min.js +0 -39
  385. data/lib/api_browser/app/js/directives/attribute_table_row.js +0 -17
  386. data/lib/api_browser/app/js/directives/request_body.js +0 -25
  387. data/lib/api_browser/app/js/directives/request_headers.js +0 -17
  388. data/lib/api_browser/app/js/directives/request_parameters.js +0 -17
  389. data/lib/api_browser/app/js/directives/type_label.js +0 -52
  390. data/lib/api_browser/app/js/factories/PayloadTemplates.js +0 -10
  391. data/lib/api_browser/app/js/factories/TemplateProvider.js +0 -45
  392. data/lib/api_browser/app/js/factories/TypeTemplates.js +0 -11
  393. data/lib/api_browser/app/views/directives/attribute_description/_example.html +0 -13
  394. data/lib/api_browser/app/views/directives/attribute_description/_headers.html +0 -8
  395. data/lib/api_browser/app/views/directives/attribute_table_row/_default.html +0 -10
  396. data/lib/api_browser/app/views/directives/attribute_table_row/_links.html +0 -11
  397. data/lib/api_browser/app/views/directives/attribute_table_row/_struct.html +0 -2
  398. data/lib/api_browser/app/views/directives/request_body/_struct.html +0 -1
  399. data/lib/api_browser/app/views/resource/_actions.html +0 -27
@@ -11,7 +11,7 @@ describe Praxis::ActionDefinition do
11
11
 
12
12
  media_type 'application/json'
13
13
  version '1.0'
14
- prefix '/api/hello_world'
14
+ prefix '/foobars/hello_world'
15
15
  action_defaults do
16
16
  payload { attribute :inherited, String }
17
17
  headers { header "Inherited", String }
@@ -90,7 +90,7 @@ describe Praxis::ActionDefinition do
90
90
  end
91
91
 
92
92
  its('params.attributes.keys') { should eq [:inherited, :app_name, :name, :one]}
93
- its('routes.first.path.to_s') { should eq '/api/hello_world/test_trait/:app_name/:one' }
93
+ its('routes.first.path.to_s') { should eq '/api/foobars/hello_world/test_trait/:app_name/:one' }
94
94
  its(:traits) { should eq [:test] }
95
95
 
96
96
  it 'is reflected in the describe output' do
@@ -141,8 +141,32 @@ describe Praxis::ActionDefinition do
141
141
  end
142
142
  end
143
143
 
144
- describe '#routing' do
145
- it 'has some tests when Skeletor::RestfulRoutingConfig disappears'
144
+ context '#routing' do
145
+ context 'with a parent specified' do
146
+ let(:resource) { ApiResources::VolumeSnapshots }
147
+ subject(:action) { resource.actions[:show] }
148
+
149
+ let(:parent_param) { ApiResources::Volumes.actions[:show].params.attributes[:id] }
150
+
151
+ it 'has the right path' do
152
+ expect(action.primary_route.path.to_s).to eq '/api/clouds/:cloud_id/volumes/:volume_id/snapshots/:id'
153
+ end
154
+
155
+ its('params.attributes'){ should have_key(:cloud_id) }
156
+
157
+ context 'with pre-existing parent param' do
158
+ let(:action) { resource.actions[:index] }
159
+ subject(:param) { action.params.attributes[:volume_id] }
160
+ its(:options) { should_not eq parent_param.options }
161
+ end
162
+
163
+ context 'with auto-generated param' do
164
+ subject(:param) { action.params.attributes[:volume_id] }
165
+ it { should_not be nil }
166
+ its(:options) { should eq parent_param.options }
167
+ end
168
+
169
+ end
146
170
  end
147
171
 
148
172
  context '#description' do
@@ -171,7 +195,7 @@ describe Praxis::ActionDefinition do
171
195
 
172
196
  it 'works' do
173
197
  expansion = action.primary_route.path.expand(cloud_id:232, id: 2)
174
- expect(expansion).to eq "/clouds/232/instances/2"
198
+ expect(expansion).to eq "/api/clouds/232/instances/2"
175
199
  end
176
200
 
177
201
  context '#primary_route' do
@@ -228,7 +252,7 @@ describe Praxis::ActionDefinition do
228
252
  allow(Praxis::ApiDefinition).to receive(:instance).and_return(non_singleton_api)
229
253
  end
230
254
 
231
- its('routes.first.path.to_s') { should eq '/apps/:app_name/api/hello_world/:one' }
255
+ its('routes.first.path.to_s') { should eq '/apps/:app_name/foobars/hello_world/:one' }
232
256
  its('params.attributes.keys') { should eq [:inherited, :app_name, :one]}
233
257
 
234
258
  context 'where the action overrides a base_param' do
@@ -241,7 +265,7 @@ describe Praxis::ActionDefinition do
241
265
  'FooBar'
242
266
  end
243
267
  version '1.0'
244
- prefix '/api/hello_world'
268
+ prefix '/foobars/hello_world'
245
269
  action_defaults do
246
270
  payload { attribute :inherited, String }
247
271
  headers { header "Inherited", String }
@@ -134,7 +134,7 @@ describe Praxis::ApiDefinition do
134
134
  its([:title]) { should eq 'A simple App to do some simple integration testing' }
135
135
  its([:description]) { should eq 'This example API should really be replaced by a set of more full-fledged example apps in the future' }
136
136
  end
137
-
137
+
138
138
  it 'outputs data for 1.0 info' do
139
139
  expect(output.keys).to include("1.0")
140
140
  expect(output["1.0"]).to include(:info)
@@ -147,7 +147,7 @@ describe Praxis::ApiDefinition do
147
147
  expect(info[:name]).to eq("Spec App")
148
148
  expect(info[:title]).to eq("A simple App to do some simple integration testing")
149
149
  expect(info[:description]).to eq("A simple 1.0 App")
150
- expect(info[:base_path]).to eq("/")
150
+ expect(info[:base_path]).to eq("/api")
151
151
  end
152
152
  end
153
153
 
@@ -4,11 +4,17 @@ describe Praxis::ApiGeneralInfo do
4
4
 
5
5
  subject(:info){ Praxis::ApiGeneralInfo.new }
6
6
 
7
+ before do
8
+ allow(Praxis::Application.instance).to receive(:versioning_scheme=).with([:header, :params])
9
+ end
10
+
11
+
7
12
  let(:info_block) do
8
13
  Proc.new do
9
14
  name "Name"
10
15
  title "Title"
11
16
  description "Description"
17
+ endpoint 'api.example.com'
12
18
  base_path "/base"
13
19
  base_params do
14
20
  attribute :name, String
@@ -45,6 +51,25 @@ describe Praxis::ApiGeneralInfo do
45
51
  its([:base_path]) {should eq '/base' }
46
52
  its([:base_params]) { should have_key :name }
47
53
  its([:base_params, :name, :type, :name]) { should eq 'String' }
54
+ its([:version_with]) { should eq([:header, :params]) }
55
+ its([:endpoint]) { should eq 'api.example.com' }
56
+ end
57
+
58
+ context 'base_path with versioning' do
59
+ let(:global_info){ Praxis::ApiGeneralInfo.new }
60
+ subject(:info){ Praxis::ApiGeneralInfo.new(global_info, version: '1.0') }
48
61
 
62
+ before do
63
+ global_info
64
+
65
+ expect(Praxis::Application.instance).to receive(:versioning_scheme=).with(:path)
66
+
67
+ global_info.version_with :path
68
+ global_info.base_path '/api/v:api_version'
69
+ end
70
+
71
+
72
+ its(:base_path) { should eq '/api/v1.0'}
49
73
  end
74
+
50
75
  end
@@ -48,17 +48,9 @@ describe Praxis::Application do
48
48
  subject { Class.new(Praxis::Application).instance }
49
49
 
50
50
  before do
51
- bootloader = double('bootloader')
52
- allow(bootloader).to receive(:setup!).and_return(true)
53
-
54
- app = double('built Rack app')
55
-
56
- builder = double('Rack builder')
57
- allow(builder).to receive(:run)
58
- allow(builder).to receive(:to_app).and_return(app)
59
-
60
- subject.instance_variable_set(:@bootloader, bootloader)
61
- subject.instance_variable_set(:@builder, builder)
51
+ # don't actually bootload; we're merely running specs
52
+ allow(subject.bootloader).to receive(:setup!).and_return(true)
53
+ allow(subject.builder).to receive(:to_app).and_return(double('Rack app'))
62
54
  end
63
55
 
64
56
  describe '#handler' do
@@ -100,4 +92,25 @@ describe Praxis::Application do
100
92
  end
101
93
  end
102
94
  end
95
+
96
+ describe '#setup' do
97
+ subject { Class.new(Praxis::Application).instance }
98
+
99
+ before do
100
+ # don't actually bootload; we're merely running specs
101
+ allow(subject.bootloader).to receive(:setup!).and_return(true)
102
+ allow(subject.builder).to receive(:to_app).and_return(double('Rack app'))
103
+ end
104
+
105
+ it 'is idempotent' do
106
+ expect(subject.builder).to receive(:to_app).once
107
+ subject.setup
108
+ subject.setup
109
+ end
110
+
111
+ it 'returns itself' do
112
+ expect(subject.setup).to eq(subject)
113
+ expect(subject.setup).to eq(subject)
114
+ end
115
+ end
103
116
  end
@@ -3,8 +3,10 @@ require 'spec_helper'
3
3
  describe Praxis::Handlers::XML do
4
4
 
5
5
  describe '#parse' do
6
- after do
7
- expect( subject.parse(xml) ).to eq(parsed)
6
+ shared_examples 'xml something' do
7
+ it 'works' do
8
+ expect(subject.parse(parsed.to_xml)).to eq(parsed)
9
+ end
8
10
  end
9
11
 
10
12
  # XML_TYPE_NAMES = {
@@ -23,72 +25,81 @@ describe Praxis::Handlers::XML do
23
25
  context "Parsing symbols" do
24
26
  let(:xml){ '<objects type="array"><object type="symbol">a_symbol</object></objects>' }
25
27
  let(:parsed){ [:a_symbol] }
26
- it 'works' do end
28
+ it_behaves_like 'xml something'
27
29
  end
28
30
 
29
31
  context "Parsing integers" do
30
32
  let(:xml){ '<objects type="array"><object type="integer">1234</object></objects>' }
31
33
  let(:parsed){ [1234] }
32
- it 'works' do end
34
+ it_behaves_like 'xml something'
33
35
  end
34
36
 
35
37
  context "Parsing decimals" do
36
38
  let(:xml){ '<objects type="array"><object type="decimal">0.1</object></objects>' }
37
39
  let(:parsed){ [0.1] }
38
- it 'works' do end
40
+ it_behaves_like 'xml something'
39
41
  end
40
42
 
41
43
  context "Parsing floats" do
42
44
  let(:xml){ '<objects type="array"><object type="float">0.1</object></objects>' }
43
45
  let(:parsed){ [0.1] }
44
- it 'works' do end
46
+ it_behaves_like 'xml something'
45
47
  end
46
48
 
47
49
  context "Parsing booleans" do
48
50
  context "that are true" do
49
51
  let(:xml){ '<objects type="array"><object type="boolean">true</object></objects>' }
50
52
  let(:parsed){ [true] }
51
- it 'works' do end
53
+ it_behaves_like 'xml something'
52
54
  end
53
55
  context "that are false" do
54
56
  let(:xml){ '<objects type="array"><object type="boolean">false</object></objects>' }
55
57
  let(:parsed){ [false] }
56
- it 'works' do end
58
+ it_behaves_like 'xml something'
59
+
57
60
  end
58
61
  end
59
62
 
60
63
  context "Parsing dates" do
61
64
  let(:xml){ '<objects type="array"><object type="date">2001-01-01</object></objects>' }
62
65
  let(:parsed){ [Date.parse("2001-01-01")] }
63
- it 'works' do end
66
+ it_behaves_like 'xml something'
64
67
  end
65
68
 
66
69
  context "Parsing dateTimes" do
67
70
  let(:xml){ '<objects type="array"><object type="dateTime">2015-03-13T19:34:40-07:00</object></objects>' }
68
71
  let(:parsed){ [DateTime.parse("2015-03-13T19:34:40-07:00")] }
69
- it 'works' do end
72
+ it_behaves_like 'xml something'
70
73
  end
71
74
 
72
75
  context "Parsing hashes" do
73
76
  context "that are empty" do
74
- let(:xml){ '<hash></hash>' }
75
- let(:parsed){ {} }
76
- it 'works' do end
77
+ let(:xml){ "<hash></hash>" }
78
+
79
+ it 'get converted to empty strings' do
80
+ expect(subject.parse(xml)).to eq('')
81
+ end
77
82
  end
83
+
78
84
  context "with a couple of elements" do
79
85
  let(:xml){ '<hash><one type="integer">1</one><two type="integer">2</two></hash>' }
80
86
  let(:parsed){ {"one"=>1, "two"=>2} }
81
- it 'works' do end
87
+ it_behaves_like 'xml something'
88
+ end
89
+ context "with hyphenated elements" do
90
+ let(:xml){ '<hash><part-one type="integer">1</part-one><part-two type="integer">2</part-two></hash>' }
91
+ let(:parsed){ {"part_one"=>1, "part_two"=>2} }
92
+ it_behaves_like 'xml something'
82
93
  end
83
94
  context "with a nested hash" do
84
95
  let(:xml){ '<hash><one type="integer">1</one><sub_hash><first>hello</first></sub_hash></hash>' }
85
96
  let(:parsed){ {"one"=>1, "sub_hash"=>{"first"=>"hello"} } }
86
- it 'works' do end
97
+ it_behaves_like 'xml something'
87
98
  end
88
99
  context "with a nested array" do
89
100
  let(:xml){ '<hash><one type="integer">1</one><two type="array"><object>just text</object></two></hash>' }
90
101
  let(:parsed){ {"one"=>1, "two" => ["just text"] } }
91
- it 'works' do end
102
+ it_behaves_like 'xml something'
92
103
  end
93
104
 
94
105
  end
@@ -97,12 +108,12 @@ describe Praxis::Handlers::XML do
97
108
  context 'with a couple of simple elements in it' do
98
109
  let(:xml){ '<objects type="array"><object>just text</object><object type="integer">1</object></objects>' }
99
110
  let(:parsed){ ["just text", 1] }
100
- it 'works' do end
111
+ it_behaves_like 'xml something'
101
112
  end
102
113
  context "with a nested hash" do
103
114
  let(:xml){ '<objects type="array"><object>just text</object><object><one type="integer">1</one></object></objects>' }
104
115
  let(:parsed){ ["just text", { "one" => 1}] }
105
- it 'works' do end
116
+ it_behaves_like 'xml something'
106
117
  end
107
118
  end
108
119
 
@@ -110,40 +121,51 @@ describe Praxis::Handlers::XML do
110
121
  let(:xml){ parsed.to_xml }
111
122
  context 'array with a couple of simple elements in it' do
112
123
  let(:parsed){ ["just text", 1] }
113
- it 'works' do end
124
+ it_behaves_like 'xml something'
114
125
  end
115
126
  context 'a hash with a couple of simple elements in it' do
116
127
  let(:parsed){ { "one"=>"just text", "two"=> 1 } }
117
- it 'works' do end
128
+ it_behaves_like 'xml something'
118
129
  end
119
130
  context 'a array with elements of all types' do
120
131
  let(:parsed){ ["just text",:a,1,BigDecimal.new(100),0.1,true,Date.new] }
121
- it 'works' do end
132
+ it_behaves_like 'xml something'
122
133
  end
123
134
  context 'a hash with a complex substructure' do
124
135
  let(:parsed) do
125
136
  Hash(
126
- "text" => "just text",
127
- "symbol" => :a,
128
- "num" => 1,
129
- "BD" => BigDecimal.new(100),
130
- "float" => 0.1,
131
- "truthyness" => true,
132
- "day" => Date.new )
137
+ "text" => "just text",
138
+ "symbol" => :a,
139
+ "num" => 1,
140
+ "bd" => BigDecimal.new(100),
141
+ "float" => 0.1,
142
+ "truthyness" => true,
143
+ "day" => Date.new,
144
+ "empty_string" => ""
145
+ )
133
146
  end
134
- it 'works' do end
147
+ it_behaves_like 'xml something'
135
148
  end
136
149
 
137
150
  context "transformed characters when using .to_xml" do
138
151
  context 'underscores become dashes' do
139
152
  let(:xml){ {"one_thing"=>1, "two_things"=>2}.to_xml }
140
- let(:parsed){ {"one-thing"=>1, "two-things"=>2} }
141
- it 'works' do end
153
+ it do
154
+ doc = Nokogiri::XML(xml)
155
+
156
+ expect(doc.search('one-thing')).to_not be_empty
157
+ expect(doc.search('two-things')).to_not be_empty
158
+ end
142
159
  end
143
160
  context 'spaces become dashes' do
144
161
  let(:xml){ {"one thing"=>1, "two things"=>2}.to_xml }
145
162
  let(:parsed){ {"one-thing"=>1, "two-things"=>2} }
146
- it 'works' do end
163
+ it do
164
+ doc = Nokogiri::XML(xml)
165
+
166
+ expect(doc.search('one-thing')).to_not be_empty
167
+ expect(doc.search('two-things')).to_not be_empty
168
+ end
147
169
  end
148
170
  end
149
171
  end
@@ -152,4 +174,4 @@ describe Praxis::Handlers::XML do
152
174
  it 'has tests'
153
175
  end
154
176
  end
155
- end
177
+ end
@@ -19,7 +19,7 @@ describe Praxis::Links do
19
19
  expect(link.for(Address)).to eq(link)
20
20
  end
21
21
 
22
- context 'rendering' do
22
+ context 'contents' do
23
23
  subject(:view) { link.view(:default) }
24
24
 
25
25
  its(:name) { should eq(:default) }
@@ -28,6 +28,23 @@ describe Praxis::Links do
28
28
  its(:contents) { should have_key(:super) }
29
29
  end
30
30
 
31
+ context 'rendering' do
32
+ let(:example){ Address.example }
33
+ context 'for :default' do
34
+ subject(:rendered_links){ example.render(view: :default)[:links] }
35
+
36
+ it 'should use the :link for rendering its attributes' do
37
+ expect(rendered_links[:owner]).to eq( example.owner.render(view: :link))
38
+ end
39
+ end
40
+ context 'for :master' do
41
+ subject(:rendered_links){ example.render(view: :master)[:links] }
42
+ it 'should use the :link for rendering its attributes' do
43
+ expect(rendered_links[:owner]).to eq( example.owner.render(view: :link))
44
+ end
45
+ end
46
+ end
47
+
31
48
  context '.example' do
32
49
  subject(:example) { Address.example }
33
50
 
@@ -78,7 +78,7 @@ describe Praxis::MediaTypeCollection do
78
78
  context 'for standard views' do
79
79
  let(:snapshots_data) { {name: 'snapshots', href: '/bob/snapshots' } }
80
80
  let(:snapshots) { media_type_collection.load(snapshots_data) }
81
- subject(:output) { snapshots.render(:link) }
81
+ subject(:output) { snapshots.render(view: :link) }
82
82
 
83
83
  its([:name]) { should eq(snapshots.name)}
84
84
  its([:size]) { should eq(snapshots.size)}
@@ -96,7 +96,7 @@ describe Praxis::MediaType do
96
96
  end
97
97
 
98
98
  context "rendering" do
99
- subject(:output) { address.render(:default) }
99
+ subject(:output) { address.render(view: :default) }
100
100
 
101
101
  its([:id]) { should eq(address.id) }
102
102
  its([:name]) { should eq(address.name) }
@@ -112,7 +112,7 @@ describe Praxis::MediaType do
112
112
  context 'for a collection summary' do
113
113
  let(:volume) { Volume.example }
114
114
  let(:snapshots_summary) { volume.snapshots_summary }
115
- let(:output) { volume.render(:default) }
115
+ let(:output) { volume.render(view: :default) }
116
116
  subject { links[:snapshots] }
117
117
 
118
118
  its([:name]) { should eq(snapshots_summary.name) }
@@ -19,11 +19,14 @@ describe Praxis::MultipartParser do
19
19
  subject(:parts) { parser.parse[1] }
20
20
 
21
21
  context 'with simple parts' do
22
+ it { should be_kind_of(Array) }
22
23
  it { should have(1).item }
23
- it { should have_key('destination_path') }
24
24
 
25
- it 'sets the right values on the part' do
26
- expect(parts['destination_path'].body).to eq('/etc/defaults')
25
+ context 'the parsed parts' do
26
+ subject(:part) { parts.first }
27
+
28
+ its(:name) { should eq 'destination_path' }
29
+ its(:body) { should eq '/etc/defaults' }
27
30
  end
28
31
  end
29
32
 
@@ -33,20 +36,25 @@ describe Praxis::MultipartParser do
33
36
  form.add text, 'file', 'docker'
34
37
  end
35
38
 
36
- subject(:file_part_body) { parts['file'].body }
39
+ subject(:part) { parts.find { |p| p.name == 'file'} }
40
+ #subject(:part_body) { part.body }
41
+
37
42
 
38
- it { should be_kind_of(Hash) }
39
- its([:filename]) { should eq("docker") }
40
- its([:name]) { should eq("file") }
41
- its([:type]) { should eq("text/plain") }
42
- its([:tempfile]) { should be_kind_of(Tempfile)}
43
- its([:head]) { should match(/Content-Disposition/) }
43
+ its(:payload) { should be_kind_of(Tempfile) }
44
+ its(:filename) { should eq("docker") }
45
+ its(:name) { should eq("file") }
46
+
47
+ context 'headers' do
48
+ subject(:part_headers) { part.headers }
49
+ its(['Content-Type']) { should eq("text/plain") }
50
+ its(['Content-Disposition']) { should match(/filename=docker/) }
51
+ end
44
52
 
45
53
  it 'saves the value to the tempfile' do
46
- expect(File.exist?(file_part_body[:tempfile].path)).to be(true)
54
+ expect(File.exist?(part.payload.path)).to be(true)
47
55
 
48
- file_part_body[:tempfile].rewind
49
- expect(file_part_body[:tempfile].read).to eq('DOCKER_HOST=tcp://127.0.0.1:2375')
56
+ part.payload.rewind
57
+ expect(part.payload.read).to eq('DOCKER_HOST=tcp://127.0.0.1:2375')
50
58
  end
51
59
 
52
60
  end