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
@@ -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);