praxis 0.16.1 → 0.17.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rspec +0 -1
- data/.ruby-version +1 -1
- data/.travis.yml +2 -1
- data/CHANGELOG.md +41 -0
- data/CONTRIBUTING.md +3 -0
- data/lib/api_browser/Gruntfile.js +20 -4
- data/lib/api_browser/app/bower_components/angular-mocks/.bower.json +6 -6
- data/lib/api_browser/app/bower_components/angular-mocks/README.md +11 -5
- data/lib/api_browser/app/bower_components/angular-mocks/angular-mocks.js +475 -216
- data/lib/api_browser/app/bower_components/angular-mocks/bower.json +2 -2
- data/lib/api_browser/app/bower_components/angular-mocks/ngAnimateMock.js +2 -0
- data/lib/api_browser/app/bower_components/angular-mocks/ngMock.js +2 -0
- data/lib/api_browser/app/bower_components/angular-mocks/ngMockE2E.js +2 -0
- data/lib/api_browser/app/bower_components/angular-mocks/package.json +1 -1
- data/lib/api_browser/app/bower_components/angular-sanitize/.bower.json +8 -8
- data/lib/api_browser/app/bower_components/angular-sanitize/README.md +19 -5
- data/lib/api_browser/app/bower_components/angular-sanitize/angular-sanitize.js +186 -127
- data/lib/api_browser/app/bower_components/angular-sanitize/angular-sanitize.min.js +12 -10
- data/lib/api_browser/app/bower_components/angular-sanitize/angular-sanitize.min.js.map +3 -3
- data/lib/api_browser/app/bower_components/angular-sanitize/bower.json +3 -2
- data/lib/api_browser/app/bower_components/angular-sanitize/index.js +2 -0
- data/lib/api_browser/app/bower_components/angular-sanitize/package.json +26 -0
- data/lib/api_browser/app/bower_components/angular-ui-bootstrap-bower/.bower.json +15 -8
- data/lib/api_browser/app/bower_components/angular-ui-bootstrap-bower/bower.json +11 -3
- data/lib/api_browser/app/bower_components/angular-ui-bootstrap-bower/ui-bootstrap-csp.css +6 -0
- data/lib/api_browser/app/bower_components/angular-ui-bootstrap-bower/ui-bootstrap-tpls.js +1177 -453
- data/lib/api_browser/app/bower_components/angular-ui-bootstrap-bower/ui-bootstrap-tpls.min.js +4 -4
- data/lib/api_browser/app/bower_components/angular-ui-bootstrap-bower/ui-bootstrap.js +1066 -404
- data/lib/api_browser/app/bower_components/angular-ui-bootstrap-bower/ui-bootstrap.min.js +3 -3
- data/lib/api_browser/app/bower_components/angular-ui-router/.bower.json +5 -6
- data/lib/api_browser/app/bower_components/angular-ui-router/CHANGELOG.md +208 -3
- data/lib/api_browser/app/bower_components/angular-ui-router/CONTRIBUTING.md +65 -0
- data/lib/api_browser/app/bower_components/angular-ui-router/LICENSE +1 -1
- data/lib/api_browser/app/bower_components/angular-ui-router/README.md +36 -71
- data/lib/api_browser/app/bower_components/angular-ui-router/api/angular-ui-router.d.ts +126 -0
- data/lib/api_browser/app/bower_components/angular-ui-router/bower.json +1 -1
- data/lib/api_browser/app/bower_components/angular-ui-router/release/angular-ui-router.js +1902 -755
- data/lib/api_browser/app/bower_components/angular-ui-router/release/angular-ui-router.min.js +2 -2
- data/lib/api_browser/app/bower_components/angular-ui-router/src/common.js +69 -23
- data/lib/api_browser/app/bower_components/angular-ui-router/src/resolve.js +15 -5
- data/lib/api_browser/app/bower_components/angular-ui-router/src/state.js +556 -295
- data/lib/api_browser/app/bower_components/angular-ui-router/src/stateDirectives.js +101 -42
- data/lib/api_browser/app/bower_components/angular-ui-router/src/stateFilters.js +6 -2
- data/lib/api_browser/app/bower_components/angular-ui-router/src/templateFactory.js +2 -2
- data/lib/api_browser/app/bower_components/angular-ui-router/src/urlMatcherFactory.js +822 -97
- data/lib/api_browser/app/bower_components/angular-ui-router/src/urlRouter.js +274 -120
- data/lib/api_browser/app/bower_components/angular-ui-router/src/viewDirective.js +33 -20
- data/lib/api_browser/app/bower_components/angular-ui-router/src/viewScroll.js +1 -1
- data/lib/api_browser/app/bower_components/angular/.bower.json +5 -5
- data/lib/api_browser/app/bower_components/angular/README.md +2 -5
- data/lib/api_browser/app/bower_components/angular/angular-csp.css +5 -8
- data/lib/api_browser/app/bower_components/angular/angular.js +12975 -6996
- data/lib/api_browser/app/bower_components/angular/angular.min.js +285 -213
- data/lib/api_browser/app/bower_components/angular/angular.min.js.gzip +0 -0
- data/lib/api_browser/app/bower_components/angular/angular.min.js.map +3 -3
- data/lib/api_browser/app/bower_components/angular/bower.json +1 -1
- data/lib/api_browser/app/bower_components/angular/index.js +2 -0
- data/lib/api_browser/app/bower_components/angular/package.json +2 -2
- data/lib/api_browser/app/bower_components/bootstrap-sass/.bower.json +31 -16
- data/lib/api_browser/app/bower_components/bootstrap-sass/CHANGELOG.md +108 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/CONTRIBUTING.md +55 -37
- data/lib/api_browser/app/bower_components/bootstrap-sass/README.md +147 -206
- data/lib/api_browser/app/bower_components/bootstrap-sass/bower.json +19 -8
- data/lib/api_browser/app/bower_components/bootstrap-sass/{dist/fonts → vendor/assets/fonts/bootstrap}/glyphicons-halflings-regular.eot +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/{dist/fonts → vendor/assets/fonts/bootstrap}/glyphicons-halflings-regular.svg +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/{dist/fonts → vendor/assets/fonts/bootstrap}/glyphicons-halflings-regular.ttf +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/{dist/fonts → vendor/assets/fonts/bootstrap}/glyphicons-halflings-regular.woff +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/vendor/assets/javascripts/bootstrap.js +12 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/{js → vendor/assets/javascripts/bootstrap}/affix.js +1 -1
- data/lib/api_browser/app/bower_components/bootstrap-sass/{js → vendor/assets/javascripts/bootstrap}/alert.js +1 -1
- data/lib/api_browser/app/bower_components/bootstrap-sass/{js → vendor/assets/javascripts/bootstrap}/button.js +11 -5
- data/lib/api_browser/app/bower_components/bootstrap-sass/{js → vendor/assets/javascripts/bootstrap}/carousel.js +5 -5
- data/lib/api_browser/app/bower_components/bootstrap-sass/{js → vendor/assets/javascripts/bootstrap}/collapse.js +1 -1
- data/lib/api_browser/app/bower_components/bootstrap-sass/{js → vendor/assets/javascripts/bootstrap}/dropdown.js +5 -5
- data/lib/api_browser/app/bower_components/bootstrap-sass/{js → vendor/assets/javascripts/bootstrap}/modal.js +1 -1
- data/lib/api_browser/app/bower_components/bootstrap-sass/{js → vendor/assets/javascripts/bootstrap}/popover.js +1 -1
- data/lib/api_browser/app/bower_components/bootstrap-sass/{js → vendor/assets/javascripts/bootstrap}/scrollspy.js +2 -2
- data/lib/api_browser/app/bower_components/bootstrap-sass/{js → vendor/assets/javascripts/bootstrap}/tab.js +1 -1
- data/lib/api_browser/app/bower_components/bootstrap-sass/{js → vendor/assets/javascripts/bootstrap}/tooltip.js +1 -1
- data/lib/api_browser/app/bower_components/bootstrap-sass/{js → vendor/assets/javascripts/bootstrap}/transition.js +1 -1
- data/lib/api_browser/app/bower_components/bootstrap-sass/vendor/assets/stylesheets/bootstrap.scss +1 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_alerts.scss +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_badges.scss +6 -6
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_breadcrumbs.scss +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_button-groups.scss +7 -33
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_buttons.scss +2 -5
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_carousel.scss +1 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_close.scss +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_code.scss +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_component-animations.scss +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_dropdowns.scss +3 -8
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_forms.scss +11 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_glyphicons.scss +5 -5
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_grid.scss +12 -26
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_input-groups.scss +1 -1
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_jumbotron.scss +8 -2
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_labels.scss +6 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_list-group.scss +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_media.scss +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_mixins.scss +38 -51
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_modals.scss +2 -5
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_navbar.scss +41 -53
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_navs.scss +0 -20
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_normalize.scss +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_pager.scss +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_pagination.scss +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_panels.scss +11 -1
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_popovers.scss +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_print.scss +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_progress-bars.scss +0 -12
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_responsive-utilities.scss +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_scaffolding.scss +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_tables.scss +5 -18
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_theme.scss +2 -2
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_thumbnails.scss +9 -3
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_tooltip.scss +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_type.scss +54 -52
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_utilities.scss +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_variables.scss +20 -11
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_wells.scss +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/bootstrap.scss +0 -0
- data/lib/api_browser/app/bower_components/lodash/.bower.json +9 -13
- data/lib/api_browser/app/bower_components/lodash/LICENSE.txt +3 -3
- data/lib/api_browser/app/bower_components/lodash/bower.json +4 -7
- data/lib/api_browser/app/bower_components/lodash/lodash.js +12235 -0
- data/lib/api_browser/app/bower_components/lodash/lodash.min.js +98 -0
- data/lib/api_browser/app/index.html +0 -1
- data/lib/api_browser/app/js/app.js +2 -5
- data/lib/api_browser/app/js/controllers/action.js +21 -37
- data/lib/api_browser/app/js/controllers/controller.js +23 -1
- data/lib/api_browser/app/js/controllers/menu.js +46 -14
- data/lib/api_browser/app/js/controllers/type.js +2 -9
- data/lib/api_browser/app/js/directives/attribute_description.js +15 -5
- data/lib/api_browser/app/js/directives/attribute_table.js +6 -6
- data/lib/api_browser/app/js/directives/fixed_if_fits.js +20 -0
- data/lib/api_browser/app/js/directives/no_container.js +6 -6
- data/lib/api_browser/app/js/directives/type_placeholder.js +21 -0
- data/lib/api_browser/app/js/factories/Configuration.js +13 -0
- data/lib/api_browser/app/js/factories/Documentation.js +0 -3
- data/lib/api_browser/app/js/factories/normalize_attributes.js +19 -0
- data/lib/api_browser/app/js/factories/template_for.js +113 -0
- data/lib/api_browser/app/sass/modules/_body.scss +26 -4
- data/lib/api_browser/app/sass/modules/_sidebar.scss +68 -1
- data/lib/api_browser/app/sass/praxis.scss +1 -5
- data/lib/api_browser/app/sass/variables/_bootstrap-variables.scss +13 -4
- data/lib/api_browser/app/views/action.html +13 -17
- data/lib/api_browser/app/views/controller.html +32 -4
- data/lib/api_browser/app/views/directives/attribute_description.html +1 -1
- data/lib/api_browser/app/views/directives/attribute_description/{_default.html → default.html} +0 -0
- data/lib/api_browser/app/views/directives/attribute_description/example.html +13 -0
- data/lib/api_browser/app/views/directives/attribute_description/headers.html +8 -0
- data/lib/api_browser/app/views/directives/attribute_description/member_options.html +4 -0
- data/lib/api_browser/app/views/directives/attribute_description/values.html +14 -0
- data/lib/api_browser/app/views/directives/attribute_table.html +2 -2
- data/lib/api_browser/app/views/home.html +1 -3
- data/lib/api_browser/app/views/layout.html +3 -36
- data/lib/api_browser/app/views/menu.html +45 -0
- data/lib/api_browser/app/views/navbar.html +1 -1
- data/lib/api_browser/app/views/type.html +2 -2
- data/lib/api_browser/app/views/type/{_details.html → details.html} +6 -6
- data/lib/api_browser/app/views/types/embedded/default.html +10 -0
- data/lib/api_browser/app/views/types/embedded/links.html +11 -0
- data/lib/api_browser/app/views/types/embedded/struct.html +2 -0
- data/lib/api_browser/app/views/types/label/link.html +1 -0
- data/lib/api_browser/app/views/types/label/primitive.html +1 -0
- data/lib/api_browser/app/views/types/label/primitive_collection.html +1 -0
- data/lib/api_browser/app/views/types/label/type.html +1 -0
- data/lib/api_browser/app/views/types/label/type_collection.html +1 -0
- data/lib/api_browser/app/views/{directives/request_body/_default.html → types/standalone/default.html} +1 -1
- data/lib/api_browser/app/views/types/standalone/struct.html +1 -0
- data/lib/api_browser/bower.json +9 -9
- data/lib/api_browser/package.json +1 -1
- data/lib/praxis.rb +10 -4
- data/lib/praxis/action_definition.rb +16 -4
- data/lib/praxis/action_definition/headers_dsl_compiler.rb +5 -2
- data/lib/praxis/api_definition.rb +3 -1
- data/lib/praxis/api_general_info.rb +49 -5
- data/lib/praxis/application.rb +12 -4
- data/lib/praxis/bootloader.rb +1 -0
- data/lib/praxis/bootloader_stages/environment.rb +2 -0
- data/lib/praxis/bootloader_stages/routing.rb +1 -1
- data/lib/praxis/bootloader_stages/subgroup_loader.rb +1 -0
- data/lib/praxis/exceptions/validation.rb +7 -0
- data/lib/praxis/handlers/plain.rb +16 -0
- data/lib/praxis/handlers/xml.rb +4 -4
- data/lib/praxis/links.rb +13 -3
- data/lib/praxis/media_type_identifier.rb +3 -0
- data/lib/praxis/multipart/parser.rb +41 -48
- data/lib/praxis/multipart/part.rb +196 -3
- data/lib/praxis/request.rb +14 -11
- data/lib/praxis/request_stages/request_stage.rb +4 -0
- data/lib/praxis/request_stages/response.rb +10 -9
- data/lib/praxis/request_stages/validate.rb +1 -7
- data/lib/praxis/request_stages/validate_params_and_headers.rb +30 -5
- data/lib/praxis/request_stages/validate_payload.rb +14 -5
- data/lib/praxis/resource_definition.rb +117 -15
- data/lib/praxis/response.rb +6 -5
- data/lib/praxis/response_definition.rb +51 -5
- data/lib/praxis/responses/http.rb +5 -0
- data/lib/praxis/responses/multipart_ok.rb +51 -0
- data/lib/praxis/responses/validation_error.rb +7 -7
- data/lib/praxis/restful_doc_generator.rb +9 -4
- data/lib/praxis/route.rb +3 -2
- data/lib/praxis/router.rb +26 -16
- data/lib/praxis/router/rack.rb +51 -0
- data/lib/praxis/router/simple.rb +146 -0
- data/lib/praxis/routing_config.rb +2 -2
- data/lib/praxis/trait.rb +1 -1
- data/lib/praxis/types/fuzzy_hash.rb +49 -0
- data/lib/praxis/types/media_type_common.rb +1 -1
- data/lib/praxis/types/multipart.rb +47 -12
- data/lib/praxis/types/multipart_array.rb +320 -0
- data/lib/praxis/types/multipart_array/part_definition.rb +52 -0
- data/lib/praxis/validation_handler.rb +10 -0
- data/lib/praxis/version.rb +2 -2
- data/praxis.gemspec +3 -3
- data/spec/api_browser/directives/type_placeholder_spec.js +134 -0
- data/spec/api_browser/factories/normalize_attributes_spec.js +97 -0
- data/spec/api_browser/factories/template_for_spec.js +67 -0
- data/spec/functional_spec.rb +111 -45
- data/spec/praxis/action_definition_spec.rb +31 -7
- data/spec/praxis/api_definition_spec.rb +2 -2
- data/spec/praxis/api_general_info_spec.rb +25 -0
- data/spec/praxis/application_spec.rb +24 -11
- data/spec/praxis/handlers/xml_spec.rb +55 -33
- data/spec/praxis/links_spec.rb +18 -1
- data/spec/praxis/media_type_collection_spec.rb +1 -1
- data/spec/praxis/media_type_spec.rb +2 -2
- data/spec/praxis/multipart/parser_spec.rb +21 -13
- data/spec/praxis/plugins/praxis_mapper_plugin_spec.rb +1 -1
- data/spec/praxis/request_spec.rb +52 -24
- data/spec/praxis/{request_stages_action_spec.rb → request_stages/action_spec.rb} +1 -1
- data/spec/praxis/{request_stage_spec.rb → request_stages/request_stage_spec.rb} +0 -0
- data/spec/praxis/{request_stages_validate_spec.rb → request_stages/validate_spec.rb} +1 -1
- data/spec/praxis/resource_definition_spec.rb +30 -4
- data/spec/praxis/response_definition_spec.rb +60 -19
- data/spec/praxis/response_spec.rb +2 -2
- data/spec/praxis/responses/validation_error_spec.rb +33 -16
- data/spec/praxis/route_spec.rb +4 -2
- data/spec/praxis/router_spec.rb +28 -12
- data/spec/praxis/routing_config_spec.rb +11 -5
- data/spec/praxis/types/collection_spec.rb +1 -1
- data/spec/praxis/types/fuzzy_hash_spec.rb +20 -0
- data/spec/praxis/types/multipart_array/part_definition_spec.rb +5 -0
- data/spec/praxis/types/multipart_array_spec.rb +334 -0
- data/spec/praxis/types/multipart_spec.rb +14 -5
- data/spec/spec_app/app/controllers/instances.rb +20 -10
- data/spec/spec_app/app/controllers/volumes.rb +8 -4
- data/spec/spec_app/app/responses/bulk_response.rb +0 -6
- data/spec/spec_app/config/environment.rb +13 -0
- data/spec/spec_app/design/api.rb +7 -10
- data/spec/spec_app/design/media_types/instance.rb +3 -1
- data/spec/spec_app/design/resources/instances.rb +50 -41
- data/spec/spec_app/design/resources/volume_snapshots.rb +39 -0
- data/spec/spec_app/design/resources/volumes.rb +11 -6
- data/spec/spec_helper.rb +3 -1
- metadata +125 -218
- data/lib/api_browser/app/bower_components/angular-ui-router/src/compat.js +0 -146
- data/lib/api_browser/app/bower_components/bootstrap-sass/CNAME +0 -1
- data/lib/api_browser/app/bower_components/bootstrap-sass/DOCS-LICENSE +0 -319
- data/lib/api_browser/app/bower_components/bootstrap-sass/Gemfile +0 -5
- data/lib/api_browser/app/bower_components/bootstrap-sass/Gemfile.lock +0 -14
- data/lib/api_browser/app/bower_components/bootstrap-sass/Gruntfile.js +0 -244
- data/lib/api_browser/app/bower_components/bootstrap-sass/LICENSE +0 -176
- data/lib/api_browser/app/bower_components/bootstrap-sass/LICENSE-MIT +0 -21
- data/lib/api_browser/app/bower_components/bootstrap-sass/Rakefile +0 -44
- data/lib/api_browser/app/bower_components/bootstrap-sass/_config.yml +0 -25
- data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/ads.html +0 -1
- data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/footer.html +0 -34
- data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/header.html +0 -42
- data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/nav-about.html +0 -12
- data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/nav-components.html +0 -137
- data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/nav-css.html +0 -99
- data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/nav-customize.html +0 -40
- data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/nav-getting-started.html +0 -44
- data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/nav-javascript.html +0 -88
- data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/nav-main.html +0 -37
- data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/old-bs-docs.html +0 -8
- data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/social-buttons.html +0 -16
- data/lib/api_browser/app/bower_components/bootstrap-sass/_layouts/default.html +0 -79
- data/lib/api_browser/app/bower_components/bootstrap-sass/_layouts/home.html +0 -47
- data/lib/api_browser/app/bower_components/bootstrap-sass/about.html +0 -93
- data/lib/api_browser/app/bower_components/bootstrap-sass/browserstack.json +0 -37
- data/lib/api_browser/app/bower_components/bootstrap-sass/components.html +0 -3689
- data/lib/api_browser/app/bower_components/bootstrap-sass/composer.json +0 -28
- data/lib/api_browser/app/bower_components/bootstrap-sass/css.html +0 -2674
- data/lib/api_browser/app/bower_components/bootstrap-sass/customize.html +0 -1715
- data/lib/api_browser/app/bower_components/bootstrap-sass/dist/css/bootstrap-theme.css +0 -427
- data/lib/api_browser/app/bower_components/bootstrap-sass/dist/css/bootstrap-theme.min.css +0 -1
- data/lib/api_browser/app/bower_components/bootstrap-sass/dist/css/bootstrap.css +0 -6350
- data/lib/api_browser/app/bower_components/bootstrap-sass/dist/css/bootstrap.min.css +0 -1
- data/lib/api_browser/app/bower_components/bootstrap-sass/dist/js/bootstrap.js +0 -2002
- data/lib/api_browser/app/bower_components/bootstrap-sass/dist/js/bootstrap.min.js +0 -9
- data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/css/docs.css +0 -1195
- data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/css/pygments-manni.css +0 -66
- data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/ico/apple-touch-icon-144-precomposed.png +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/ico/favicon.png +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/js/application.js +0 -103
- data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/js/customizer.js +0 -332
- data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/js/filesaver.js +0 -169
- data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/js/holder.js +0 -404
- data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/js/ie8-responsive-file-warning.js +0 -12
- data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/js/jszip.js +0 -1467
- data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/js/less.js +0 -9
- data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/js/raw-files.js +0 -3
- data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/js/uglify.js +0 -14
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/carousel/carousel.css +0 -148
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/carousel/index.html +0 -206
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/grid/grid.css +0 -28
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/grid/index.html +0 -148
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/jumbotron-narrow/index.html +0 -82
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/jumbotron-narrow/jumbotron-narrow.css +0 -79
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/jumbotron/index.html +0 -99
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/jumbotron/jumbotron.css +0 -5
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/justified-nav/index.html +0 -83
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/justified-nav/justified-nav.css +0 -88
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/navbar-fixed-top/index.html +0 -91
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/navbar-fixed-top/navbar-fixed-top.css +0 -4
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/navbar-static-top/index.html +0 -92
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/navbar-static-top/navbar-static-top.css +0 -7
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/navbar/index.html +0 -88
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/navbar/navbar.css +0 -8
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/non-responsive/index.html +0 -101
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/non-responsive/non-responsive.css +0 -116
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/offcanvas/index.html +0 -130
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/offcanvas/offcanvas.css +0 -50
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/offcanvas/offcanvas.js +0 -5
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/carousel.jpg +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/grid.jpg +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/jumbotron-narrow.jpg +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/jumbotron.jpg +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/justified-nav.jpg +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/navbar-fixed.jpg +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/navbar-static.jpg +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/navbar.jpg +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/non-responsive.jpg +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/offcanvas.jpg +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/sign-in.jpg +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/starter-template.jpg +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/sticky-footer-navbar.jpg +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/sticky-footer.jpg +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/theme.jpg +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/signin/index.html +0 -50
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/signin/signin.css +0 -40
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/starter-template/index.html +0 -68
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/starter-template/starter-template.css +0 -7
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/sticky-footer-navbar/index.html +0 -91
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/sticky-footer-navbar/sticky-footer-navbar.css +0 -45
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/sticky-footer/index.html +0 -55
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/sticky-footer/sticky-footer.css +0 -38
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/theme/index.html +0 -384
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/theme/theme.css +0 -14
- data/lib/api_browser/app/bower_components/bootstrap-sass/fonts/glyphicons-halflings-regular.eot +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/fonts/glyphicons-halflings-regular.svg +0 -229
- data/lib/api_browser/app/bower_components/bootstrap-sass/fonts/glyphicons-halflings-regular.ttf +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/fonts/glyphicons-halflings-regular.woff +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/getting-started.html +0 -1021
- data/lib/api_browser/app/bower_components/bootstrap-sass/index.html +0 -16
- data/lib/api_browser/app/bower_components/bootstrap-sass/javascript.html +0 -1983
- data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/index.html +0 -52
- data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/affix.js +0 -25
- data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/alert.js +0 -62
- data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/button.js +0 -116
- data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/carousel.js +0 -87
- data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/collapse.js +0 -164
- data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/dropdown.js +0 -219
- data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/modal.js +0 -196
- data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/phantom.js +0 -69
- data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/popover.js +0 -133
- data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/scrollspy.js +0 -37
- data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/tab.js +0 -86
- data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/tooltip.js +0 -437
- data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/transition.js +0 -13
- data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/vendor/jquery.js +0 -6
- data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/vendor/qunit.css +0 -232
- data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/vendor/qunit.js +0 -1510
- data/lib/api_browser/app/bower_components/bootstrap-sass/package.json +0 -40
- data/lib/api_browser/app/bower_components/lodash/dist/lodash.compat.js +0 -7157
- data/lib/api_browser/app/bower_components/lodash/dist/lodash.compat.min.js +0 -61
- data/lib/api_browser/app/bower_components/lodash/dist/lodash.js +0 -6785
- data/lib/api_browser/app/bower_components/lodash/dist/lodash.min.js +0 -56
- data/lib/api_browser/app/bower_components/lodash/dist/lodash.underscore.js +0 -4979
- data/lib/api_browser/app/bower_components/lodash/dist/lodash.underscore.min.js +0 -39
- data/lib/api_browser/app/js/directives/attribute_table_row.js +0 -17
- data/lib/api_browser/app/js/directives/request_body.js +0 -25
- data/lib/api_browser/app/js/directives/request_headers.js +0 -17
- data/lib/api_browser/app/js/directives/request_parameters.js +0 -17
- data/lib/api_browser/app/js/directives/type_label.js +0 -52
- data/lib/api_browser/app/js/factories/PayloadTemplates.js +0 -10
- data/lib/api_browser/app/js/factories/TemplateProvider.js +0 -45
- data/lib/api_browser/app/js/factories/TypeTemplates.js +0 -11
- data/lib/api_browser/app/views/directives/attribute_description/_example.html +0 -13
- data/lib/api_browser/app/views/directives/attribute_description/_headers.html +0 -8
- data/lib/api_browser/app/views/directives/attribute_table_row/_default.html +0 -10
- data/lib/api_browser/app/views/directives/attribute_table_row/_links.html +0 -11
- data/lib/api_browser/app/views/directives/attribute_table_row/_struct.html +0 -2
- data/lib/api_browser/app/views/directives/request_body/_struct.html +0 -1
- data/lib/api_browser/app/views/resource/_actions.html +0 -27
@@ -56,7 +56,7 @@ describe Praxis::Plugins::PraxisMapperPlugin do
|
|
56
56
|
with(kind_of(Praxis::Request),kind_of(Praxis::Mapper::IdentityMap), 'detailed').
|
57
57
|
and_call_original
|
58
58
|
the_body = StringIO.new("{}") # This is a funny, GET request expecting a body
|
59
|
-
get '/clouds/1/instances/2?junk=foo&api_version=1.0', nil, 'rack.input' => the_body,'CONTENT_TYPE' => "application/json", 'global_session' => session
|
59
|
+
get '/api/clouds/1/instances/2?junk=foo&api_version=1.0', nil, 'rack.input' => the_body,'CONTENT_TYPE' => "application/json", 'global_session' => session
|
60
60
|
|
61
61
|
expect(last_response.status).to eq(200)
|
62
62
|
end
|
data/spec/praxis/request_spec.rb
CHANGED
@@ -1,10 +1,11 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Praxis::Request do
|
4
|
+
let(:path) { '/instances/1?junk=foo&api_version=1.0' }
|
4
5
|
let(:rack_input) { StringIO.new('something=given') }
|
5
6
|
let(:env_content_type){ 'application/x-www-form-urlencoded' }
|
6
7
|
let(:env) do
|
7
|
-
env = Rack::MockRequest.env_for(
|
8
|
+
env = Rack::MockRequest.env_for(path)
|
8
9
|
env['rack.input'] = rack_input
|
9
10
|
env['CONTENT_TYPE'] = env_content_type
|
10
11
|
env['HTTP_VERSION'] = 'HTTP/1.1'
|
@@ -32,49 +33,76 @@ describe Praxis::Request do
|
|
32
33
|
its(:path) { should eq('/instances/1') }
|
33
34
|
its(:raw_params) { should eq({'junk' => 'foo'}) }
|
34
35
|
its(:version) { should eq('1.0') }
|
35
|
-
|
36
|
+
|
36
37
|
context 'path versioning' do
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
38
|
+
before do
|
39
|
+
allow(
|
40
|
+
Praxis::Application.instance
|
41
|
+
).to receive(:versioning_scheme).and_return(:path)
|
42
|
+
allow(
|
43
|
+
Praxis::ApiDefinition.instance.info
|
44
|
+
).to receive(:base_path).and_return('/api/v:api_version')
|
45
|
+
|
43
46
|
end
|
47
|
+
|
48
|
+
let(:path) { '/api/v2.0/instances/1' }
|
49
|
+
|
50
|
+
|
51
|
+
its(:version) { should eq '2.0' }
|
52
|
+
#its('class.path_version_prefix'){ should eq("/v") }
|
53
|
+
#its(:path_version_matcher){ should be_kind_of(Regexp) }
|
54
|
+
#it 'uses a "/v*" default matcher with a "version" named capture' do
|
55
|
+
# match = subject.path_version_matcher.match("/v5.5/something")
|
56
|
+
# expect(match).to_not be(nil)
|
57
|
+
# expect(match['version']).to eq("5.5")
|
58
|
+
#end
|
44
59
|
end
|
45
|
-
|
60
|
+
|
46
61
|
context 'loading api version' do
|
47
|
-
let(:request) { Praxis::Request.new(env) }
|
48
|
-
subject(:version){ request.version
|
62
|
+
#let(:request) { Praxis::Request.new(env) }
|
63
|
+
subject(:version){ request.version }
|
64
|
+
let(:versioning_scheme){ Praxis::Request::VERSION_USING_DEFAULTS }
|
65
|
+
before do
|
66
|
+
allow(
|
67
|
+
Praxis::Application.instance
|
68
|
+
).to receive(:versioning_scheme).and_return(versioning_scheme)
|
69
|
+
end
|
70
|
+
|
49
71
|
context 'using X-Api-Header' do
|
50
72
|
let(:env){ {'HTTP_X_API_VERSION' => "5.0", "PATH_INFO" => "/something"} }
|
51
|
-
let(:
|
73
|
+
let(:versioning_scheme){ :header }
|
52
74
|
it { should eq('5.0') }
|
53
75
|
end
|
54
76
|
context 'using query param' do
|
55
77
|
let(:env) { Rack::MockRequest.env_for('/instances/1?junk=foo&api_version=5.0') }
|
56
|
-
let(:
|
78
|
+
let(:versioning_scheme){ :params }
|
57
79
|
it { should eq('5.0') }
|
58
80
|
end
|
59
81
|
context 'using path (with the default pattern matcher)' do
|
60
82
|
let(:env){ Rack::MockRequest.env_for('/v5.0/instances/1?junk=foo') }
|
61
|
-
let(:
|
62
|
-
|
83
|
+
let(:versioning_scheme){ :path }
|
84
|
+
|
85
|
+
before do
|
86
|
+
allow(
|
87
|
+
Praxis::ApiDefinition.instance.info
|
88
|
+
).to receive(:base_path).and_return('/v:api_version')
|
89
|
+
end
|
90
|
+
it { should eq('5.0') }
|
63
91
|
end
|
64
|
-
|
92
|
+
|
65
93
|
context 'using a method that it is not allowed in the definition' do
|
66
94
|
context 'allowing query param but passing it through a header' do
|
67
95
|
let(:env){ {'HTTP_X_API_VERSION' => "5.0", "PATH_INFO" => "/something"} }
|
68
|
-
let(:
|
96
|
+
let(:versioning_scheme){ :params }
|
69
97
|
it { should eq('n/a') }
|
70
98
|
end
|
71
99
|
context 'allowing header but passing it through param' do
|
72
100
|
let(:env) { Rack::MockRequest.env_for('/instances/1?junk=foo&api_version=5.0') }
|
73
|
-
let(:
|
101
|
+
let(:versioning_scheme){ :header }
|
74
102
|
it { should eq('n/a') }
|
75
103
|
end
|
76
104
|
end
|
77
|
-
|
105
|
+
|
78
106
|
context 'using defaults' do
|
79
107
|
subject(:version){ request.version }
|
80
108
|
context 'would succeed if passed through the header' do
|
@@ -98,8 +126,8 @@ describe Praxis::Request do
|
|
98
126
|
form_data
|
99
127
|
end
|
100
128
|
|
101
|
-
let(:rack_input) {
|
102
|
-
StringIO.new(form.body.to_s)
|
129
|
+
let(:rack_input) {
|
130
|
+
StringIO.new(form.body.to_s)
|
103
131
|
}
|
104
132
|
|
105
133
|
let(:env) do
|
@@ -124,7 +152,7 @@ describe Praxis::Request do
|
|
124
152
|
|
125
153
|
it 'is done preserving the original case' do
|
126
154
|
request.load_headers(context[:headers])
|
127
|
-
expect(request.headers).to
|
155
|
+
expect(request.headers).to eq({"Authorization" => "Secret"})
|
128
156
|
end
|
129
157
|
|
130
158
|
it 'performs it using the memoized rack keys from the action (Hacky but...performance is important)' do
|
@@ -132,7 +160,7 @@ describe Praxis::Request do
|
|
132
160
|
request.load_headers(context[:headers])
|
133
161
|
end
|
134
162
|
end
|
135
|
-
|
163
|
+
|
136
164
|
context "performs request validation" do
|
137
165
|
before(:each) do
|
138
166
|
request.load_headers(context[:headers])
|
@@ -175,7 +203,7 @@ describe Praxis::Request do
|
|
175
203
|
expect(request.validate_payload(context[:payload])).to eq(['some_error'])
|
176
204
|
end
|
177
205
|
end
|
178
|
-
|
206
|
+
|
179
207
|
context '#load_payload' do
|
180
208
|
let(:load_context){ context[:payload] }
|
181
209
|
let(:parsed_result){ double("parsed") }
|
File without changes
|
@@ -7,7 +7,6 @@ describe Praxis::ResourceDefinition do
|
|
7
7
|
its(:media_type) { should eq(Person) }
|
8
8
|
|
9
9
|
its(:version) { should eq('1.0') }
|
10
|
-
its(:version_options) { should eq({using: [:header,:params]}) }
|
11
10
|
|
12
11
|
its(:prefix) { should eq('/people') }
|
13
12
|
|
@@ -23,8 +22,34 @@ describe Praxis::ResourceDefinition do
|
|
23
22
|
its([:actions]) { should have(2).items }
|
24
23
|
its([:metadata]) { should be_kind_of(Hash) }
|
25
24
|
its([:traits]) { should eq [:test] }
|
25
|
+
it { should_not have_key(:parent)}
|
26
|
+
|
27
|
+
context 'for a resource with a parent' do
|
28
|
+
let(:resource_definition) { ApiResources::VolumeSnapshots}
|
29
|
+
|
30
|
+
its([:parent]) { should eq ApiResources::Volumes.id }
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
|
36
|
+
context '.routing_prefix' do
|
37
|
+
subject(:resource_definition) { ApiResources::VolumeSnapshots }
|
38
|
+
it do
|
39
|
+
expect(resource_definition.routing_prefix).to eq('/clouds/:cloud_id/volumes/:volume_id/snapshots')
|
40
|
+
end
|
26
41
|
end
|
27
42
|
|
43
|
+
context '.parent_prefix' do
|
44
|
+
subject(:resource_definition) { ApiResources::VolumeSnapshots }
|
45
|
+
let(:base_path){ Praxis::ApiDefinition.instance.info.base_path }
|
46
|
+
its(:parent_prefix){ should eq('/clouds/:cloud_id/volumes/:volume_id') }
|
47
|
+
it do
|
48
|
+
expect(resource_definition.parent_prefix).to_not match(/^#{base_path}/)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
|
28
53
|
context '.action' do
|
29
54
|
it 'requires a block' do
|
30
55
|
expect { resource_definition.action(:something)
|
@@ -79,11 +104,11 @@ describe Praxis::ResourceDefinition do
|
|
79
104
|
it 'are applied to actions' do
|
80
105
|
action = resource_definition.actions[:show]
|
81
106
|
expect(action.params.attributes).to have_key(:id)
|
82
|
-
expect(action.routes.first.path.to_s).to eq '/people/:id'
|
107
|
+
expect(action.routes.first.path.to_s).to eq '/api/people/:id'
|
83
108
|
end
|
84
109
|
|
85
110
|
end
|
86
|
-
|
111
|
+
|
87
112
|
context 'setting other values' do
|
88
113
|
subject(:resource_definition) { Class.new {include Praxis::ResourceDefinition } }
|
89
114
|
|
@@ -118,7 +143,7 @@ describe Praxis::ResourceDefinition do
|
|
118
143
|
def self.name
|
119
144
|
'FooBar'
|
120
145
|
end
|
121
|
-
|
146
|
+
|
122
147
|
silence_warnings do
|
123
148
|
payload { attribute :inherited_payload, String }
|
124
149
|
headers { key "Inherited-Header", String }
|
@@ -209,4 +234,5 @@ describe Praxis::ResourceDefinition do
|
|
209
234
|
expect(parsed[:id]).to be_kind_of(Integer)
|
210
235
|
end
|
211
236
|
end
|
237
|
+
|
212
238
|
end
|
@@ -49,6 +49,46 @@ describe Praxis::ResponseDefinition do
|
|
49
49
|
end
|
50
50
|
end
|
51
51
|
|
52
|
+
context '#example' do
|
53
|
+
let(:media_type) { nil }
|
54
|
+
|
55
|
+
before do
|
56
|
+
response_definition.media_type media_type
|
57
|
+
end
|
58
|
+
|
59
|
+
context 'with media_type unset' do
|
60
|
+
its(:example) { should be nil }
|
61
|
+
it 'is not in the describe output' do
|
62
|
+
expect(response_definition.describe).to_not have_key(:example)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
context 'with media_type set to a string' do
|
67
|
+
let(:media_type) { 'application/json' }
|
68
|
+
its(:example) { should be nil }
|
69
|
+
it 'is not in the describe output' do
|
70
|
+
expect(response_definition.describe).to_not have_key(:example)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
# TODO: Complete/correct the "example" generation when it is done in the ResponseDefinition class
|
75
|
+
#context 'with media_type set to a MediaType' do
|
76
|
+
# let(:media_type) { Person }
|
77
|
+
#
|
78
|
+
# let(:expected_context) { "Person-#{name}" }
|
79
|
+
# let!(:example) { Person.example(expected_context) }
|
80
|
+
#
|
81
|
+
# before do
|
82
|
+
# expect(Person).to receive(:example).with(expected_context).and_call_original
|
83
|
+
# end
|
84
|
+
#
|
85
|
+
# its(:example) { should be_kind_of(Person) }
|
86
|
+
# it 'is rendered in the describe output' do
|
87
|
+
# expect(response_definition.describe[:example]).to eq(example.render)
|
88
|
+
# end
|
89
|
+
#end
|
90
|
+
end
|
91
|
+
|
52
92
|
context '#location' do
|
53
93
|
it 'accepts a String' do
|
54
94
|
response_definition.location "string_location"
|
@@ -405,33 +445,34 @@ describe Praxis::ResponseDefinition do
|
|
405
445
|
end
|
406
446
|
|
407
447
|
describe '#validate_parts!' do
|
408
|
-
|
409
|
-
|
410
|
-
let(:part) { Praxis::MultipartPart.new('done', {'Status' => 200, 'Content-Type' => 'application/special'}) }
|
448
|
+
context 'with legacy multipart response' do
|
449
|
+
subject(:response) { Praxis::Responses::Ok.new(status: response_status, headers: response_headers) }
|
411
450
|
|
412
|
-
|
413
|
-
response_definition.parts like: :ok, media_type: 'application/special'
|
414
|
-
response.add_part(part)
|
415
|
-
end
|
416
|
-
|
417
|
-
it 'validates each part' do
|
418
|
-
response_definition.parts
|
419
|
-
expect {
|
420
|
-
response_definition.validate_parts!(response)
|
421
|
-
}.to_not raise_error
|
422
|
-
end
|
451
|
+
let(:part) { Praxis::MultipartPart.new('done', {'Status' => 200, 'Content-Type' => 'application/special'}) }
|
423
452
|
|
424
|
-
|
425
|
-
|
453
|
+
before do
|
454
|
+
response_definition.parts like: :ok, media_type: 'application/special'
|
455
|
+
response.add_part(part)
|
456
|
+
end
|
426
457
|
|
427
|
-
it 'validates' do
|
458
|
+
it 'validates each part' do
|
459
|
+
response_definition.parts
|
428
460
|
expect {
|
429
461
|
response_definition.validate_parts!(response)
|
430
|
-
}.
|
462
|
+
}.to_not raise_error
|
431
463
|
end
|
432
464
|
|
433
|
-
|
465
|
+
context 'with invalid part' do
|
466
|
+
let(:part) { Praxis::MultipartPart.new('done', {'Status' => 200, "Location" => "somewhere"}) }
|
434
467
|
|
468
|
+
it 'validates' do
|
469
|
+
expect {
|
470
|
+
response_definition.validate_parts!(response)
|
471
|
+
}.to raise_error(Praxis::Exceptions::Validation)
|
472
|
+
end
|
473
|
+
|
474
|
+
end
|
475
|
+
end
|
435
476
|
end
|
436
477
|
end
|
437
478
|
|
@@ -62,7 +62,7 @@ describe Praxis::Response do
|
|
62
62
|
it 'should raise an error' do
|
63
63
|
expect {
|
64
64
|
response.validate(action)
|
65
|
-
}.to raise_error(
|
65
|
+
}.to raise_error(Praxis::Exceptions::Validation, /response definition with that name can be found/)
|
66
66
|
end
|
67
67
|
end
|
68
68
|
|
@@ -183,7 +183,7 @@ describe Praxis::Response do
|
|
183
183
|
expect(preamble).to eq("a preamble")
|
184
184
|
expect(parts).to have(1).item
|
185
185
|
|
186
|
-
|
186
|
+
part_response = parts.first
|
187
187
|
expect(part_response.headers['Status']).to eq(part.headers['Status'].to_s)
|
188
188
|
expect(part_response.headers['Location']).to eq(part.headers['Location'])
|
189
189
|
expect(part_response.body).to eq('not so ok')
|
@@ -2,9 +2,10 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
|
4
4
|
describe Praxis::Responses::ValidationError do
|
5
|
-
|
5
|
+
|
6
|
+
let(:summary){ "Something happened here" }
|
6
7
|
context 'a basic response' do
|
7
|
-
subject(:response) { Praxis::Responses::ValidationError.new }
|
8
|
+
subject(:response) { Praxis::Responses::ValidationError.new(summary: summary) }
|
8
9
|
it 'always sets the json content type' do
|
9
10
|
expect(response.name).to be(:validation_error)
|
10
11
|
expect(response.status).to be(400)
|
@@ -12,51 +13,67 @@ describe Praxis::Responses::ValidationError do
|
|
12
13
|
expect(response.headers).to have_key('Content-Type')
|
13
14
|
expect(response.headers['Content-Type']).to eq('application/json')
|
14
15
|
expect(response.instance_variable_get(:@errors)).to be(nil)
|
15
|
-
expect(response.instance_variable_get(:@exception)).to be(nil)
|
16
|
+
expect(response.instance_variable_get(:@exception)).to be(nil)
|
16
17
|
end
|
17
18
|
end
|
18
|
-
|
19
|
+
|
19
20
|
context '.format!' do
|
20
21
|
let(:errors) { [1,2] }
|
21
22
|
let(:cause){ Exception.new( "cause message") }
|
22
23
|
let(:exception_message){ "exception message" }
|
23
24
|
let(:exception){ nil }
|
24
|
-
subject(:response) { Praxis::Responses::ValidationError.new(errors: errors, exception: exception) }
|
25
|
+
subject(:response) { Praxis::Responses::ValidationError.new(summary: summary, errors: errors, exception: exception) }
|
25
26
|
before do
|
26
27
|
expect(response.body).to be_empty
|
27
28
|
end
|
28
29
|
context 'when errors' do
|
29
30
|
it 'it fills the errors key' do
|
30
31
|
response.format!
|
31
|
-
expect(response.body).to eq({name: 'ValidationError', errors: errors})
|
32
|
+
expect(response.body).to eq({name: 'ValidationError', summary: summary, errors: errors})
|
32
33
|
end
|
33
34
|
end
|
34
|
-
|
35
|
+
|
35
36
|
context 'without errors but with an exception' do
|
36
37
|
let(:errors) { nil }
|
37
38
|
let(:exception){ double("exception", message: exception_message, cause: cause)}
|
38
39
|
before do
|
39
40
|
response.format!
|
41
|
+
expect(response.body.keys).to include(:name,:summary)
|
42
|
+
expect(response.body[:name]).to eq('ValidationError')
|
43
|
+
expect(response.body[:summary]).to eq(summary)
|
40
44
|
end
|
45
|
+
|
46
|
+
context 'that has a message' do
|
47
|
+
it 'fills the errors array with the exception message' do
|
48
|
+
expect(response.body).to have_key(:errors)
|
49
|
+
expect(response.body[:errors]).to eq([exception.message])
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
context 'that does not contain a message' do
|
54
|
+
let(:exception_message){ nil }
|
55
|
+
it 'does not touch the errors key' do
|
56
|
+
expect(response.body).to_not have_key(:errors)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
41
60
|
context 'without cause' do
|
42
61
|
let(:cause){ nil}
|
43
|
-
it 'it
|
44
|
-
expect(response.body).
|
62
|
+
it 'does not include it in the output' do
|
63
|
+
expect(response.body).to_not have_key(:cause)
|
45
64
|
end
|
46
65
|
end
|
47
|
-
|
66
|
+
|
48
67
|
context 'with a cause' do
|
49
|
-
it 'it fills the
|
50
|
-
expect(response.body
|
51
|
-
expect(response.body[:name]).to eq('ValidationError')
|
52
|
-
expect(response.body[:message]).to eq(exception_message)
|
68
|
+
it 'it fills the cause too' do
|
69
|
+
expect(response.body).to have_key(:cause)
|
53
70
|
expect(response.body[:cause]).to eq({name: cause.class.name, message: cause.message })
|
54
71
|
end
|
55
72
|
end
|
56
73
|
end
|
57
|
-
|
74
|
+
|
58
75
|
end
|
59
|
-
|
76
|
+
|
60
77
|
context 'its response template' do
|
61
78
|
let(:template){ Praxis::ApiDefinition.instance.responses[:validation_error] }
|
62
79
|
it 'is registered with the ApiDefinition' do
|