praxis 0.16.1 → 0.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
@@ -3,6 +3,7 @@
3
3
  * @name ui.router.router.$urlRouterProvider
4
4
  *
5
5
  * @requires ui.router.util.$urlMatcherFactoryProvider
6
+ * @requires $locationProvider
6
7
  *
7
8
  * @description
8
9
  * `$urlRouterProvider` has the responsibility of watching `$location`.
@@ -13,10 +14,9 @@
13
14
  * There are several methods on `$urlRouterProvider` that make it useful to use directly
14
15
  * in your module config.
15
16
  */
16
- $UrlRouterProvider.$inject = ['$urlMatcherFactoryProvider'];
17
- function $UrlRouterProvider( $urlMatcherFactory) {
18
- var rules = [],
19
- otherwise = null;
17
+ $UrlRouterProvider.$inject = ['$locationProvider', '$urlMatcherFactoryProvider'];
18
+ function $UrlRouterProvider( $locationProvider, $urlMatcherFactory) {
19
+ var rules = [], otherwise = null, interceptDeferred = false, listener;
20
20
 
21
21
  // Returns a string that is a prefix of all strings matching the RegExp
22
22
  function regExpPrefix(re) {
@@ -37,7 +37,7 @@ function $UrlRouterProvider( $urlMatcherFactory) {
37
37
  * @methodOf ui.router.router.$urlRouterProvider
38
38
  *
39
39
  * @description
40
- * Defines rules that are used by `$urlRouterProvider to find matches for
40
+ * Defines rules that are used by `$urlRouterProvider` to find matches for
41
41
  * specific URLs.
42
42
  *
43
43
  * @example
@@ -60,14 +60,13 @@ function $UrlRouterProvider( $urlMatcherFactory) {
60
60
  * @param {object} rule Handler function that takes `$injector` and `$location`
61
61
  * services as arguments. You can use them to return a valid path as a string.
62
62
  *
63
- * @return {object} $urlRouterProvider - $urlRouterProvider instance
63
+ * @return {object} `$urlRouterProvider` - `$urlRouterProvider` instance
64
64
  */
65
- this.rule =
66
- function (rule) {
67
- if (!isFunction(rule)) throw new Error("'rule' must be a function");
68
- rules.push(rule);
69
- return this;
70
- };
65
+ this.rule = function (rule) {
66
+ if (!isFunction(rule)) throw new Error("'rule' must be a function");
67
+ rules.push(rule);
68
+ return this;
69
+ };
71
70
 
72
71
  /**
73
72
  * @ngdoc object
@@ -75,7 +74,7 @@ function $UrlRouterProvider( $urlMatcherFactory) {
75
74
  * @methodOf ui.router.router.$urlRouterProvider
76
75
  *
77
76
  * @description
78
- * Defines a path that is used when an invalied route is requested.
77
+ * Defines a path that is used when an invalid route is requested.
79
78
  *
80
79
  * @example
81
80
  * <pre>
@@ -89,27 +88,26 @@ function $UrlRouterProvider( $urlMatcherFactory) {
89
88
  *
90
89
  * // Example of using function rule as param
91
90
  * $urlRouterProvider.otherwise(function ($injector, $location) {
92
- * ...
91
+ * return '/a/valid/url';
93
92
  * });
94
93
  * });
95
94
  * </pre>
96
95
  *
97
96
  * @param {string|object} rule The url path you want to redirect to or a function
98
97
  * rule that returns the url path. The function version is passed two params:
99
- * `$injector` and `$location` services.
98
+ * `$injector` and `$location` services, and must return a url string.
100
99
  *
101
- * @return {object} $urlRouterProvider - $urlRouterProvider instance
100
+ * @return {object} `$urlRouterProvider` - `$urlRouterProvider` instance
102
101
  */
103
- this.otherwise =
104
- function (rule) {
105
- if (isString(rule)) {
106
- var redirect = rule;
107
- rule = function () { return redirect; };
108
- }
109
- else if (!isFunction(rule)) throw new Error("'rule' must be a function");
110
- otherwise = rule;
111
- return this;
112
- };
102
+ this.otherwise = function (rule) {
103
+ if (isString(rule)) {
104
+ var redirect = rule;
105
+ rule = function () { return redirect; };
106
+ }
107
+ else if (!isFunction(rule)) throw new Error("'rule' must be a function");
108
+ otherwise = rule;
109
+ return this;
110
+ };
113
111
 
114
112
 
115
113
  function handleIfMatch($injector, handler, match) {
@@ -125,8 +123,8 @@ function $UrlRouterProvider( $urlMatcherFactory) {
125
123
  *
126
124
  * @description
127
125
  * Registers a handler for a given url matching. if handle is a string, it is
128
- * treated as a redirect, and is interpolated according to the syyntax of match
129
- * (i.e. like String.replace() for RegExp, or like a UrlMatcher pattern otherwise).
126
+ * treated as a redirect, and is interpolated according to the syntax of match
127
+ * (i.e. like `String.replace()` for `RegExp`, or like a `UrlMatcher` pattern otherwise).
130
128
  *
131
129
  * If the handler is a function, it is injectable. It gets invoked if `$location`
132
130
  * matches. You have the option of inject the match object as `$match`.
@@ -155,52 +153,102 @@ function $UrlRouterProvider( $urlMatcherFactory) {
155
153
  * @param {string|object} what The incoming path that you want to redirect.
156
154
  * @param {string|object} handler The path you want to redirect your user to.
157
155
  */
158
- this.when =
159
- function (what, handler) {
160
- var redirect, handlerIsString = isString(handler);
161
- if (isString(what)) what = $urlMatcherFactory.compile(what);
162
-
163
- if (!handlerIsString && !isFunction(handler) && !isArray(handler))
164
- throw new Error("invalid 'handler' in when()");
165
-
166
- var strategies = {
167
- matcher: function (what, handler) {
168
- if (handlerIsString) {
169
- redirect = $urlMatcherFactory.compile(handler);
170
- handler = ['$match', function ($match) { return redirect.format($match); }];
171
- }
172
- return extend(function ($injector, $location) {
173
- return handleIfMatch($injector, handler, what.exec($location.path(), $location.search()));
174
- }, {
175
- prefix: isString(what.prefix) ? what.prefix : ''
176
- });
177
- },
178
- regex: function (what, handler) {
179
- if (what.global || what.sticky) throw new Error("when() RegExp must not be global or sticky");
180
-
181
- if (handlerIsString) {
182
- redirect = handler;
183
- handler = ['$match', function ($match) { return interpolate(redirect, $match); }];
184
- }
185
- return extend(function ($injector, $location) {
186
- return handleIfMatch($injector, handler, what.exec($location.path()));
187
- }, {
188
- prefix: regExpPrefix(what)
189
- });
190
- }
191
- };
156
+ this.when = function (what, handler) {
157
+ var redirect, handlerIsString = isString(handler);
158
+ if (isString(what)) what = $urlMatcherFactory.compile(what);
192
159
 
193
- var check = { matcher: $urlMatcherFactory.isMatcher(what), regex: what instanceof RegExp };
160
+ if (!handlerIsString && !isFunction(handler) && !isArray(handler))
161
+ throw new Error("invalid 'handler' in when()");
194
162
 
195
- for (var n in check) {
196
- if (check[n]) {
197
- return this.rule(strategies[n](what, handler));
163
+ var strategies = {
164
+ matcher: function (what, handler) {
165
+ if (handlerIsString) {
166
+ redirect = $urlMatcherFactory.compile(handler);
167
+ handler = ['$match', function ($match) { return redirect.format($match); }];
198
168
  }
199
- }
169
+ return extend(function ($injector, $location) {
170
+ return handleIfMatch($injector, handler, what.exec($location.path(), $location.search()));
171
+ }, {
172
+ prefix: isString(what.prefix) ? what.prefix : ''
173
+ });
174
+ },
175
+ regex: function (what, handler) {
176
+ if (what.global || what.sticky) throw new Error("when() RegExp must not be global or sticky");
200
177
 
201
- throw new Error("invalid 'what' in when()");
178
+ if (handlerIsString) {
179
+ redirect = handler;
180
+ handler = ['$match', function ($match) { return interpolate(redirect, $match); }];
181
+ }
182
+ return extend(function ($injector, $location) {
183
+ return handleIfMatch($injector, handler, what.exec($location.path()));
184
+ }, {
185
+ prefix: regExpPrefix(what)
186
+ });
187
+ }
202
188
  };
203
189
 
190
+ var check = { matcher: $urlMatcherFactory.isMatcher(what), regex: what instanceof RegExp };
191
+
192
+ for (var n in check) {
193
+ if (check[n]) return this.rule(strategies[n](what, handler));
194
+ }
195
+
196
+ throw new Error("invalid 'what' in when()");
197
+ };
198
+
199
+ /**
200
+ * @ngdoc function
201
+ * @name ui.router.router.$urlRouterProvider#deferIntercept
202
+ * @methodOf ui.router.router.$urlRouterProvider
203
+ *
204
+ * @description
205
+ * Disables (or enables) deferring location change interception.
206
+ *
207
+ * If you wish to customize the behavior of syncing the URL (for example, if you wish to
208
+ * defer a transition but maintain the current URL), call this method at configuration time.
209
+ * Then, at run time, call `$urlRouter.listen()` after you have configured your own
210
+ * `$locationChangeSuccess` event handler.
211
+ *
212
+ * @example
213
+ * <pre>
214
+ * var app = angular.module('app', ['ui.router.router']);
215
+ *
216
+ * app.config(function ($urlRouterProvider) {
217
+ *
218
+ * // Prevent $urlRouter from automatically intercepting URL changes;
219
+ * // this allows you to configure custom behavior in between
220
+ * // location changes and route synchronization:
221
+ * $urlRouterProvider.deferIntercept();
222
+ *
223
+ * }).run(function ($rootScope, $urlRouter, UserService) {
224
+ *
225
+ * $rootScope.$on('$locationChangeSuccess', function(e) {
226
+ * // UserService is an example service for managing user state
227
+ * if (UserService.isLoggedIn()) return;
228
+ *
229
+ * // Prevent $urlRouter's default handler from firing
230
+ * e.preventDefault();
231
+ *
232
+ * UserService.handleLogin().then(function() {
233
+ * // Once the user has logged in, sync the current URL
234
+ * // to the router:
235
+ * $urlRouter.sync();
236
+ * });
237
+ * });
238
+ *
239
+ * // Configures $urlRouter's listener *after* your custom listener
240
+ * $urlRouter.listen();
241
+ * });
242
+ * </pre>
243
+ *
244
+ * @param {boolean} defer Indicates whether to defer location change interception. Passing
245
+ no parameter is equivalent to `true`.
246
+ */
247
+ this.deferIntercept = function (defer) {
248
+ if (defer === undefined) defer = true;
249
+ interceptDeferred = defer;
250
+ };
251
+
204
252
  /**
205
253
  * @ngdoc object
206
254
  * @name ui.router.router.$urlRouter
@@ -208,66 +256,172 @@ function $UrlRouterProvider( $urlMatcherFactory) {
208
256
  * @requires $location
209
257
  * @requires $rootScope
210
258
  * @requires $injector
259
+ * @requires $browser
211
260
  *
212
261
  * @description
213
262
  *
214
263
  */
215
- this.$get =
216
- [ '$location', '$rootScope', '$injector',
217
- function ($location, $rootScope, $injector) {
218
- // TODO: Optimize groups of rules with non-empty prefix into some sort of decision tree
219
- function update(evt) {
220
- if (evt && evt.defaultPrevented) return;
221
- function check(rule) {
222
- var handled = rule($injector, $location);
223
- if (handled) {
224
- if (isString(handled)) $location.replace().url(handled);
225
- return true;
226
- }
227
- return false;
264
+ this.$get = $get;
265
+ $get.$inject = ['$location', '$rootScope', '$injector', '$browser'];
266
+ function $get( $location, $rootScope, $injector, $browser) {
267
+
268
+ var baseHref = $browser.baseHref(), location = $location.url(), lastPushedUrl;
269
+
270
+ function appendBasePath(url, isHtml5, absolute) {
271
+ if (baseHref === '/') return url;
272
+ if (isHtml5) return baseHref.slice(0, -1) + url;
273
+ if (absolute) return baseHref.slice(1) + url;
274
+ return url;
275
+ }
276
+
277
+ // TODO: Optimize groups of rules with non-empty prefix into some sort of decision tree
278
+ function update(evt) {
279
+ if (evt && evt.defaultPrevented) return;
280
+ var ignoreUpdate = lastPushedUrl && $location.url() === lastPushedUrl;
281
+ lastPushedUrl = undefined;
282
+ // TODO: Re-implement this in 1.0 for https://github.com/angular-ui/ui-router/issues/1573
283
+ //if (ignoreUpdate) return true;
284
+
285
+ function check(rule) {
286
+ var handled = rule($injector, $location);
287
+
288
+ if (!handled) return false;
289
+ if (isString(handled)) $location.replace().url(handled);
290
+ return true;
291
+ }
292
+ var n = rules.length, i;
293
+
294
+ for (i = 0; i < n; i++) {
295
+ if (check(rules[i])) return;
296
+ }
297
+ // always check otherwise last to allow dynamic updates to the set of rules
298
+ if (otherwise) check(otherwise);
299
+ }
300
+
301
+ function listen() {
302
+ listener = listener || $rootScope.$on('$locationChangeSuccess', update);
303
+ return listener;
304
+ }
305
+
306
+ if (!interceptDeferred) listen();
307
+
308
+ return {
309
+ /**
310
+ * @ngdoc function
311
+ * @name ui.router.router.$urlRouter#sync
312
+ * @methodOf ui.router.router.$urlRouter
313
+ *
314
+ * @description
315
+ * Triggers an update; the same update that happens when the address bar url changes, aka `$locationChangeSuccess`.
316
+ * This method is useful when you need to use `preventDefault()` on the `$locationChangeSuccess` event,
317
+ * perform some custom logic (route protection, auth, config, redirection, etc) and then finally proceed
318
+ * with the transition by calling `$urlRouter.sync()`.
319
+ *
320
+ * @example
321
+ * <pre>
322
+ * angular.module('app', ['ui.router'])
323
+ * .run(function($rootScope, $urlRouter) {
324
+ * $rootScope.$on('$locationChangeSuccess', function(evt) {
325
+ * // Halt state change from even starting
326
+ * evt.preventDefault();
327
+ * // Perform custom logic
328
+ * var meetsRequirement = ...
329
+ * // Continue with the update and state transition if logic allows
330
+ * if (meetsRequirement) $urlRouter.sync();
331
+ * });
332
+ * });
333
+ * </pre>
334
+ */
335
+ sync: function() {
336
+ update();
337
+ },
338
+
339
+ listen: function() {
340
+ return listen();
341
+ },
342
+
343
+ update: function(read) {
344
+ if (read) {
345
+ location = $location.url();
346
+ return;
347
+ }
348
+ if ($location.url() === location) return;
349
+
350
+ $location.url(location);
351
+ $location.replace();
352
+ },
353
+
354
+ push: function(urlMatcher, params, options) {
355
+ var url = urlMatcher.format(params || {});
356
+
357
+ // Handle the special hash param, if needed
358
+ if (url !== null && params && params['#']) {
359
+ url += '#' + params['#'];
360
+ }
361
+
362
+ $location.url(url);
363
+ lastPushedUrl = options && options.$$avoidResync ? $location.url() : undefined;
364
+ if (options && options.replace) $location.replace();
365
+ },
366
+
367
+ /**
368
+ * @ngdoc function
369
+ * @name ui.router.router.$urlRouter#href
370
+ * @methodOf ui.router.router.$urlRouter
371
+ *
372
+ * @description
373
+ * A URL generation method that returns the compiled URL for a given
374
+ * {@link ui.router.util.type:UrlMatcher `UrlMatcher`}, populated with the provided parameters.
375
+ *
376
+ * @example
377
+ * <pre>
378
+ * $bob = $urlRouter.href(new UrlMatcher("/about/:person"), {
379
+ * person: "bob"
380
+ * });
381
+ * // $bob == "/about/bob";
382
+ * </pre>
383
+ *
384
+ * @param {UrlMatcher} urlMatcher The `UrlMatcher` object which is used as the template of the URL to generate.
385
+ * @param {object=} params An object of parameter values to fill the matcher's required parameters.
386
+ * @param {object=} options Options object. The options are:
387
+ *
388
+ * - **`absolute`** - {boolean=false}, If true will generate an absolute url, e.g. "http://www.example.com/fullurl".
389
+ *
390
+ * @returns {string} Returns the fully compiled URL, or `null` if `params` fail validation against `urlMatcher`
391
+ */
392
+ href: function(urlMatcher, params, options) {
393
+ if (!urlMatcher.validates(params)) return null;
394
+
395
+ var isHtml5 = $locationProvider.html5Mode();
396
+ if (angular.isObject(isHtml5)) {
397
+ isHtml5 = isHtml5.enabled;
228
398
  }
229
- var n=rules.length, i;
230
- for (i=0; i<n; i++) {
231
- if (check(rules[i])) return;
399
+
400
+ var url = urlMatcher.format(params);
401
+ options = options || {};
402
+
403
+ if (!isHtml5 && url !== null) {
404
+ url = "#" + $locationProvider.hashPrefix() + url;
232
405
  }
233
- // always check otherwise last to allow dynamic updates to the set of rules
234
- if (otherwise) check(otherwise);
235
- }
236
406
 
237
- $rootScope.$on('$locationChangeSuccess', update);
238
-
239
- return {
240
- /**
241
- * @ngdoc function
242
- * @name ui.router.router.$urlRouter#sync
243
- * @methodOf ui.router.router.$urlRouter
244
- *
245
- * @description
246
- * Triggers an update; the same update that happens when the address bar url changes, aka `$locationChangeSuccess`.
247
- * This method is useful when you need to use `preventDefault()` on the `$locationChangeSuccess` event,
248
- * perform some custom logic (route protection, auth, config, redirection, etc) and then finally proceed
249
- * with the transition by calling `$urlRouter.sync()`.
250
- *
251
- * @example
252
- * <pre>
253
- * angular.module('app', ['ui.router']);
254
- * .run(function($rootScope, $urlRouter) {
255
- * $rootScope.$on('$locationChangeSuccess', function(evt) {
256
- * // Halt state change from even starting
257
- * evt.preventDefault();
258
- * // Perform custom logic
259
- * var meetsRequirement = ...
260
- * // Continue with the update and state transition if logic allows
261
- * if (meetsRequirement) $urlRouter.sync();
262
- * });
263
- * });
264
- * </pre>
265
- */
266
- sync: function () {
267
- update();
407
+ // Handle special hash param, if needed
408
+ if (url !== null && params && params['#']) {
409
+ url += '#' + params['#'];
268
410
  }
269
- };
270
- }];
411
+
412
+ url = appendBasePath(url, isHtml5, options.absolute);
413
+
414
+ if (!options.absolute || !url) {
415
+ return url;
416
+ }
417
+
418
+ var slash = (!isHtml5 && url ? '/' : ''), port = $location.port();
419
+ port = (port === 80 || port === 443 ? '' : ':' + port);
420
+
421
+ return [$location.protocol(), '://', $location.host(), port, slash, url].join('');
422
+ }
423
+ };
424
+ }
271
425
  }
272
426
 
273
427
  angular.module('ui.router.router').provider('$urlRouter', $UrlRouterProvider);