From 43318b0b05bc88fe271eddcf71d2ad3308d42ced Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Mon, 11 Sep 2023 19:00:22 +0200 Subject: [PATCH] Done --- .../workflows/deploy-docs.yml | 0 .gitignore | 6 + README.adoc | 384 +-------------- .../build_adocs.sh | 2 +- docs/antora-playbook.yml | 16 +- docs/antora.yml | 4 +- docs/modules/ROOT/examples/samples-src | 1 + docs/modules/ROOT/examples/specs-src | 1 + docs/modules/ROOT/examples/stubrunner-src | 1 + docs/modules/ROOT/examples/tests-src | 1 + docs/modules/ROOT/examples/tools-src | 1 + docs/modules/ROOT/examples/verifier-src | 1 + docs/modules/ROOT/examples/wiremock-src | 1 + docs/modules/ROOT/nav.adoc | 111 ++--- docs/modules/ROOT/pages/_attributes.adoc | 36 -- docs/modules/ROOT/pages/_index.adoc | 18 - docs/modules/ROOT/pages/_index_pdf.adoc | 6 - docs/modules/ROOT/pages/_index_single.adoc | 7 - .../pages/_project-features-contract/yml.adoc | 6 - .../ROOT/pages/_project-features-flows.adoc | 5 - .../stub-runner-publishing-stubs-as-jars.adoc | 32 -- docs/modules/ROOT/pages/advanced.adoc | 104 +---- docs/modules/ROOT/pages/appendix.adoc | 8 +- .../pages/{_building.adoc => building.adoc} | 0 docs/modules/ROOT/pages/configprops.adoc | 6 + docs/modules/ROOT/pages/docker-project.adoc | 45 +- .../ROOT/pages/documentation-overview.adoc | 129 ----- docs/modules/ROOT/pages/getting-started.adoc | 2 + .../ROOT/pages/getting-started/cdc.adoc | 103 ++-- .../getting-started/first-application.adoc | 90 ++-- .../introducing-spring-cloud-contract.adoc | 14 +- .../getting-started/three-second-tour.adoc | 22 +- .../pages/getting-started/whats-next.adoc | 2 + docs/modules/ROOT/pages/gradle-project.adoc | 112 ++--- docs/modules/ROOT/pages/howto.adoc | 2 + .../pages/howto/contract-dsl-rest-docs.adoc | 32 +- .../how-to-common-repo-with-contracts.adoc | 36 +- .../pages/howto/how-to-debug-wiremock.adoc | 4 +- .../ROOT/pages/howto/how-to-debug.adoc | 4 +- .../howto/how-to-do-stubs-versioning.adoc | 14 +- .../pages/howto/how-to-generate-from-scc.adoc | 17 + .../howto/how-to-generate-pact-from-scc.adoc | 67 --- .../how-to-generate-stubs-at-runtime.adoc | 4 +- .../how-to-mark-contract-in-progress.adoc | 4 +- .../how-to-not-write-contracts-in-groovy.adoc | 2 +- .../howto/how-to-provide-dynamic-values.adoc | 16 +- .../how-to-reference-text-from-file.adoc | 2 + .../howto/how-to-see-registered-stubs.adoc | 2 + .../howto/how-to-use-git-as-storage.adoc | 37 +- .../how-to-use-stubs-from-a-location.adoc | 4 +- .../how-to-use-the-failonnostubs-feature.adoc | 4 +- .../howto/how-to-work-with-transitivie.adoc | 4 +- .../howto/why-spring-cloud-contract.adoc | 2 + docs/modules/ROOT/pages/index.adoc | 6 + docs/modules/ROOT/pages/legal.adoc | 2 +- docs/modules/ROOT/pages/maven-project.adoc | 70 +-- ...ct.adoc => project-features-contract.adoc} | 9 +- .../common-top-elements.adoc | 78 ++-- .../dsl-async.adoc | 2 + .../dsl-dynamic-properties.adoc | 62 +-- .../dsl-http-top-level-elements.adoc | 14 +- .../dsl-multiple.adoc | 6 +- .../dsl-request.adoc | 68 +-- .../dsl-response.adoc | 14 +- .../dsl-xml.adoc | 14 +- .../groovy.adoc | 2 + .../java.adoc | 2 + .../kotlin.adoc | 4 +- .../limitations.adoc | 2 + .../stateful-contracts.adoc | 2 + .../pages/project-features-contract/yml.adoc | 6 + .../context-paths.adoc | 6 +- .../custom-mode.adoc | 2 + .../feature-webflux-explicit.adoc | 18 +- .../feature-webflux.adoc | 2 + .../graphql.adoc | 2 + .../grpc.adoc | 2 + .../jax-rs.adoc | 4 +- .../rest-docs.adoc | 14 +- .../pages/project-features-integrations.adoc | 4 + ...g.adoc => project-features-messaging.adoc} | 25 +- ....adoc => project-features-stubrunner.adoc} | 0 .../stub-runner-boot.adoc | 22 +- .../stub-runner-cloud.adoc | 2 + .../stub-runner-common.adoc | 6 +- .../stub-runner-core.adoc | 12 +- .../stub-runner-fail-on-no-stubs.adoc | 2 + ...stub-runner-generate-stubs-at-runtime.adoc | 4 +- .../stub-runner-junit.adoc | 24 +- .../stub-runner-publishing-stubs-as-jars.adoc | 12 + .../stub-runner-snapshot-versions.adoc | 6 +- .../stub-runner-stubs-per-consumer.adoc | 6 +- .../stub-runner-stubs-protocol.adoc | 2 + ...ck.adoc => project-features-wiremock.adoc} | 32 +- docs/modules/ROOT/pages/project-features.adoc | 2 + .../ROOT/pages/spring-cloud-contract.adoc | 18 - docs/modules/ROOT/pages/using.adoc | 122 ++--- docs/modules/ROOT/pages/yml-schema.adoc | 6 +- docs/modules/ROOT/partials/_attributes.adoc | 23 + .../{pages => partials}/_configprops.adoc | 2 +- docs/modules/ROOT/partials/appProps.adoc | 13 + .../ROOT/partials/contract_schema.json | 442 ++++++++++++++++++ docs/modules/ROOT/partials/props.adoc | 30 ++ docs/pom.xml | 130 ++---- .../resources/antora-resources/antora.yml | 20 + .../pages => src/main/asciidoc}/README.adoc | 0 docs/src/main/asciidoc/ghpages.sh | 330 ------------- docs/src/main/asciidoc/images/Deps.png | Bin 37192 -> 0 bytes docs/src/main/asciidoc/images/Stubs1.png | Bin 35170 -> 0 bytes docs/src/main/asciidoc/images/Stubs2.png | Bin 18143 -> 0 bytes .../images/start_spring_io_dependencies.png | Bin 347308 -> 0 bytes docs/src/main/asciidoc/index.htmladoc | 1 - docs/src/main/asciidoc/index.htmlsingleadoc | 1 - docs/src/main/asciidoc/index.pdfadoc | 1 - .../main/asciidoc}/sagan-boot.adoc | 0 .../main/asciidoc}/sagan-index.adoc | 0 .../spring-cloud-contract.htmlsingleadoc | 17 - .../asciidoc/spring-cloud-contract.pdfadoc | 17 - .../cloud/contract/docs/Main.java | 2 +- 119 files changed, 1255 insertions(+), 2028 deletions(-) rename {docs/.github => .github}/workflows/deploy-docs.yml (100%) create mode 120000 docs/modules/ROOT/examples/samples-src create mode 120000 docs/modules/ROOT/examples/specs-src create mode 120000 docs/modules/ROOT/examples/stubrunner-src create mode 120000 docs/modules/ROOT/examples/tests-src create mode 120000 docs/modules/ROOT/examples/tools-src create mode 120000 docs/modules/ROOT/examples/verifier-src create mode 120000 docs/modules/ROOT/examples/wiremock-src delete mode 100644 docs/modules/ROOT/pages/_attributes.adoc delete mode 100644 docs/modules/ROOT/pages/_index.adoc delete mode 100644 docs/modules/ROOT/pages/_index_pdf.adoc delete mode 100644 docs/modules/ROOT/pages/_index_single.adoc delete mode 100644 docs/modules/ROOT/pages/_project-features-contract/yml.adoc delete mode 100644 docs/modules/ROOT/pages/_project-features-flows.adoc delete mode 100644 docs/modules/ROOT/pages/_project-features-stubrunner/stub-runner-publishing-stubs-as-jars.adoc rename docs/modules/ROOT/pages/{_building.adoc => building.adoc} (100%) create mode 100644 docs/modules/ROOT/pages/configprops.adoc delete mode 100644 docs/modules/ROOT/pages/documentation-overview.adoc create mode 100644 docs/modules/ROOT/pages/howto/how-to-generate-from-scc.adoc delete mode 100644 docs/modules/ROOT/pages/howto/how-to-generate-pact-from-scc.adoc rename docs/modules/ROOT/pages/{_project-features-contract.adoc => project-features-contract.adoc} (78%) rename docs/modules/ROOT/pages/{_project-features-contract => project-features-contract}/common-top-elements.adoc (60%) rename docs/modules/ROOT/pages/{_project-features-contract => project-features-contract}/dsl-async.adoc (98%) rename docs/modules/ROOT/pages/{_project-features-contract => project-features-contract}/dsl-dynamic-properties.adoc (86%) rename docs/modules/ROOT/pages/{_project-features-contract => project-features-contract}/dsl-http-top-level-elements.adoc (56%) rename docs/modules/ROOT/pages/{_project-features-contract => project-features-contract}/dsl-multiple.adoc (91%) rename docs/modules/ROOT/pages/{_project-features-contract => project-features-contract}/dsl-request.adoc (59%) rename docs/modules/ROOT/pages/{_project-features-contract => project-features-contract}/dsl-response.adoc (54%) rename docs/modules/ROOT/pages/{_project-features-contract => project-features-contract}/dsl-xml.adoc (88%) rename docs/modules/ROOT/pages/{_project-features-contract => project-features-contract}/groovy.adoc (96%) rename docs/modules/ROOT/pages/{_project-features-contract => project-features-contract}/java.adoc (97%) rename docs/modules/ROOT/pages/{_project-features-contract => project-features-contract}/kotlin.adoc (97%) rename docs/modules/ROOT/pages/{_project-features-contract => project-features-contract}/limitations.adoc (94%) rename docs/modules/ROOT/pages/{_project-features-contract => project-features-contract}/stateful-contracts.adoc (97%) create mode 100644 docs/modules/ROOT/pages/project-features-contract/yml.adoc rename docs/modules/ROOT/pages/{_project-features-flows => project-features-flows}/context-paths.adoc (81%) rename docs/modules/ROOT/pages/{_project-features-flows => project-features-flows}/custom-mode.adoc (98%) rename docs/modules/ROOT/pages/{_project-features-flows => project-features-flows}/feature-webflux-explicit.adoc (61%) rename docs/modules/ROOT/pages/{_project-features-flows => project-features-flows}/feature-webflux.adoc (97%) rename docs/modules/ROOT/pages/{_project-features-flows => project-features-flows}/graphql.adoc (99%) rename docs/modules/ROOT/pages/{_project-features-flows => project-features-flows}/grpc.adoc (99%) rename docs/modules/ROOT/pages/{_project-features-flows => project-features-flows}/jax-rs.adoc (75%) rename docs/modules/ROOT/pages/{_project-features-flows => project-features-flows}/rest-docs.adoc (92%) create mode 100644 docs/modules/ROOT/pages/project-features-integrations.adoc rename docs/modules/ROOT/pages/{_project-features-messaging.adoc => project-features-messaging.adoc} (94%) rename docs/modules/ROOT/pages/{_project-features-stubrunner.adoc => project-features-stubrunner.adoc} (100%) rename docs/modules/ROOT/pages/{_project-features-stubrunner => project-features-stubrunner}/stub-runner-boot.adoc (80%) rename docs/modules/ROOT/pages/{_project-features-stubrunner => project-features-stubrunner}/stub-runner-cloud.adoc (98%) rename docs/modules/ROOT/pages/{_project-features-stubrunner => project-features-stubrunner}/stub-runner-common.adoc (88%) rename docs/modules/ROOT/pages/{_project-features-stubrunner => project-features-stubrunner}/stub-runner-core.adoc (92%) rename docs/modules/ROOT/pages/{_project-features-stubrunner => project-features-stubrunner}/stub-runner-fail-on-no-stubs.adoc (97%) rename docs/modules/ROOT/pages/{_project-features-stubrunner => project-features-stubrunner}/stub-runner-generate-stubs-at-runtime.adoc (87%) rename docs/modules/ROOT/pages/{_project-features-stubrunner => project-features-stubrunner}/stub-runner-junit.adoc (73%) create mode 100644 docs/modules/ROOT/pages/project-features-stubrunner/stub-runner-publishing-stubs-as-jars.adoc rename docs/modules/ROOT/pages/{_project-features-stubrunner => project-features-stubrunner}/stub-runner-snapshot-versions.adoc (69%) rename docs/modules/ROOT/pages/{_project-features-stubrunner => project-features-stubrunner}/stub-runner-stubs-per-consumer.adoc (88%) rename docs/modules/ROOT/pages/{_project-features-stubrunner => project-features-stubrunner}/stub-runner-stubs-protocol.adoc (99%) rename docs/modules/ROOT/pages/{_project-features-wiremock.adoc => project-features-wiremock.adoc} (89%) delete mode 100644 docs/modules/ROOT/pages/spring-cloud-contract.adoc create mode 100644 docs/modules/ROOT/partials/_attributes.adoc rename docs/modules/ROOT/{pages => partials}/_configprops.adoc (99%) create mode 100644 docs/modules/ROOT/partials/appProps.adoc create mode 100644 docs/modules/ROOT/partials/contract_schema.json create mode 100644 docs/modules/ROOT/partials/props.adoc create mode 100644 docs/src/main/antora/resources/antora-resources/antora.yml rename docs/{modules/ROOT/pages => src/main/asciidoc}/README.adoc (100%) delete mode 100755 docs/src/main/asciidoc/ghpages.sh delete mode 100644 docs/src/main/asciidoc/images/Deps.png delete mode 100644 docs/src/main/asciidoc/images/Stubs1.png delete mode 100644 docs/src/main/asciidoc/images/Stubs2.png delete mode 100644 docs/src/main/asciidoc/images/start_spring_io_dependencies.png delete mode 100644 docs/src/main/asciidoc/index.htmladoc delete mode 100644 docs/src/main/asciidoc/index.htmlsingleadoc delete mode 100644 docs/src/main/asciidoc/index.pdfadoc rename docs/{modules/ROOT/pages => src/main/asciidoc}/sagan-boot.adoc (100%) rename docs/{modules/ROOT/pages => src/main/asciidoc}/sagan-index.adoc (100%) delete mode 100644 docs/src/main/asciidoc/spring-cloud-contract.htmlsingleadoc delete mode 100644 docs/src/main/asciidoc/spring-cloud-contract.pdfadoc diff --git a/docs/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml similarity index 100% rename from docs/.github/workflows/deploy-docs.yml rename to .github/workflows/deploy-docs.yml diff --git a/.gitignore b/.gitignore index 052b287229..b36bfbc292 100644 --- a/.gitignore +++ b/.gitignore @@ -44,3 +44,9 @@ dependency-reduced-pom.xml .vscode/ .flattened-pom.xml + +node +node_modules +build +package.json +package-lock.json diff --git a/README.adoc b/README.adoc index 40a6c4eb2a..511971a889 100644 --- a/README.adoc +++ b/README.adoc @@ -5,7 +5,9 @@ Edit the files in the src/main/asciidoc/ directory instead. //// -== Spring Cloud Contract +[[spring-cloud-contract]] += Spring Cloud Contract +:page-section-summary-toc: 1 You always need confidence when pushing new features into a new application or service in a distributed system. To that end, this project provides support for consumer-driven @@ -13,380 +15,14 @@ contracts and service schemas in Spring applications, covering a range of option writing tests, publishing them as assets, and asserting that a contract is kept by producers and consumers -- for both HTTP and message-based interactions. -== Project page +[[project-page]] += Project page +:page-section-summary-toc: 1 You can read more about Spring Cloud Contract by going to https://spring.io/projects/spring-cloud-contract[the project page] -== Contributing +[[contributing]] += Contributing +:page-section-summary-toc: 1 -:spring-cloud-build-branch: master - -Spring Cloud is released under the non-restrictive Apache 2.0 license, -and follows a very standard Github development process, using Github -tracker for issues and merging pull requests into master. If you want -to contribute even something trivial please do not hesitate, but -follow the guidelines below. - -=== Sign the Contributor License Agreement -Before we accept a non-trivial patch or pull request we will need you to sign the -https://cla.pivotal.io/sign/spring[Contributor License Agreement]. -Signing the contributor's agreement does not grant anyone commit rights to the main -repository, but it does mean that we can accept your contributions, and you will get an -author credit if we do. Active contributors might be asked to join the core team, and -given the ability to merge pull requests. - -=== Code of Conduct -This project adheres to the Contributor Covenant https://github.com/spring-cloud/spring-cloud-build/blob/master/docs/src/main/asciidoc/code-of-conduct.adoc[code of -conduct]. By participating, you are expected to uphold this code. Please report -unacceptable behavior to spring-code-of-conduct@pivotal.io. - -=== Code Conventions and Housekeeping -None of these is essential for a pull request, but they will all help. They can also be -added after the original pull request but before a merge. - -* Use the Spring Framework code format conventions. If you use Eclipse - you can import formatter settings using the - `eclipse-code-formatter.xml` file from the - https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/master/spring-cloud-dependencies-parent/eclipse-code-formatter.xml[Spring - Cloud Build] project. If using IntelliJ, you can use the - https://plugins.jetbrains.com/plugin/6546[Eclipse Code Formatter - Plugin] to import the same file. -* Make sure all new `.java` files to have a simple Javadoc class comment with at least an - `@author` tag identifying you, and preferably at least a paragraph on what the class is - for. -* Add the ASF license header comment to all new `.java` files (copy from existing files - in the project) -* Add yourself as an `@author` to the .java files that you modify substantially (more - than cosmetic changes). -* Add some Javadocs and, if you change the namespace, some XSD doc elements. -* A few unit tests would help a lot as well -- someone has to do it. -* If no-one else is using your branch, please rebase it against the current master (or - other target branch in the main project). -* When writing a commit message please follow https://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html[these conventions], - if you are fixing an existing issue please add `Fixes gh-XXXX` at the end of the commit - message (where XXXX is the issue number). - -=== Checkstyle - -Spring Cloud Build comes with a set of checkstyle rules. You can find them in the `spring-cloud-build-tools` module. The most notable files under the module are: - -.spring-cloud-build-tools/ ----- -└── src -    ├── checkstyle -    │   └── checkstyle-suppressions.xml <3> -    └── main -    └── resources -    ├── checkstyle-header.txt <2> -    └── checkstyle.xml <1> ----- -<1> Default Checkstyle rules -<2> File header setup -<3> Default suppression rules - -==== Checkstyle configuration - -Checkstyle rules are *disabled by default*. To add checkstyle to your project just define the following properties and plugins. - -.pom.xml ----- - -true <1> - true - <2> - true - <3> - - - - - <4> - io.spring.javaformat - spring-javaformat-maven-plugin - - <5> - org.apache.maven.plugins - maven-checkstyle-plugin - - - - - - <5> - org.apache.maven.plugins - maven-checkstyle-plugin - - - - ----- -<1> Fails the build upon Checkstyle errors -<2> Fails the build upon Checkstyle violations -<3> Checkstyle analyzes also the test sources -<4> Add the Spring Java Format plugin that will reformat your code to pass most of the Checkstyle formatting rules -<5> Add checkstyle plugin to your build and reporting phases - -If you need to suppress some rules (e.g. line length needs to be longer), then it's enough for you to define a file under `${project.root}/src/checkstyle/checkstyle-suppressions.xml` with your suppressions. Example: - -.projectRoot/src/checkstyle/checkstyle-suppresions.xml ----- - - - - - - ----- - -It's advisable to copy the `${spring-cloud-build.rootFolder}/.editorconfig` and `${spring-cloud-build.rootFolder}/.springformat` to your project. That way, some default formatting rules will be applied. You can do so by running this script: - -```bash -$ curl https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/master/.editorconfig -o .editorconfig -$ touch .springformat -``` - -=== IDE setup - -==== Intellij IDEA - -In order to setup Intellij you should import our coding conventions, inspection profiles and set up the checkstyle plugin. -The following files can be found in the https://github.com/spring-cloud/spring-cloud-build/tree/master/spring-cloud-build-tools[Spring Cloud Build] project. - -.spring-cloud-build-tools/ ----- -└── src -    ├── checkstyle -    │   └── checkstyle-suppressions.xml <3> -    └── main -    └── resources -    ├── checkstyle-header.txt <2> -    ├── checkstyle.xml <1> -    └── intellij -       ├── Intellij_Project_Defaults.xml <4> -       └── Intellij_Spring_Boot_Java_Conventions.xml <5> ----- -<1> Default Checkstyle rules -<2> File header setup -<3> Default suppression rules -<4> Project defaults for Intellij that apply most of Checkstyle rules -<5> Project style conventions for Intellij that apply most of Checkstyle rules - -.Code style - -image::https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/{spring-cloud-build-branch}/docs/src/main/asciidoc/images/intellij-code-style.png[Code style] - -Go to `File` -> `Settings` -> `Editor` -> `Code style`. There click on the icon next to the `Scheme` section. There, click on the `Import Scheme` value and pick the `Intellij IDEA code style XML` option. Import the `spring-cloud-build-tools/src/main/resources/intellij/Intellij_Spring_Boot_Java_Conventions.xml` file. - -.Inspection profiles - -image::https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/{spring-cloud-build-branch}/docs/src/main/asciidoc/images/intellij-inspections.png[Code style] - -Go to `File` -> `Settings` -> `Editor` -> `Inspections`. There click on the icon next to the `Profile` section. There, click on the `Import Profile` and import the `spring-cloud-build-tools/src/main/resources/intellij/Intellij_Project_Defaults.xml` file. - -.Checkstyle - -To have Intellij work with Checkstyle, you have to install the `Checkstyle` plugin. It's advisable to also install the `Assertions2Assertj` to automatically convert the JUnit assertions - -image::https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/{spring-cloud-build-branch}/docs/src/main/asciidoc/images/intellij-checkstyle.png[Checkstyle] - -Go to `File` -> `Settings` -> `Other settings` -> `Checkstyle`. There click on the `+` icon in the `Configuration file` section. There, you'll have to define where the checkstyle rules should be picked from. In the image above, we've picked the rules from the cloned Spring Cloud Build repository. However, you can point to the Spring Cloud Build's GitHub repository (e.g. for the `checkstyle.xml` : `https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/master/spring-cloud-build-tools/src/main/resources/checkstyle.xml`). We need to provide the following variables: - -- `checkstyle.header.file` - please point it to the Spring Cloud Build's, `spring-cloud-build-tools/src/main/resources/checkstyle-header.txt` file either in your cloned repo or via the `https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/master/spring-cloud-build-tools/src/main/resources/checkstyle-header.txt` URL. -- `checkstyle.suppressions.file` - default suppressions. Please point it to the Spring Cloud Build's, `spring-cloud-build-tools/src/checkstyle/checkstyle-suppressions.xml` file either in your cloned repo or via the `https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/master/spring-cloud-build-tools/src/checkstyle/checkstyle-suppressions.xml` URL. -- `checkstyle.additional.suppressions.file` - this variable corresponds to suppressions in your local project. E.g. you're working on `spring-cloud-contract`. Then point to the `project-root/src/checkstyle/checkstyle-suppressions.xml` folder. Example for `spring-cloud-contract` would be: `/home/username/spring-cloud-contract/src/checkstyle/checkstyle-suppressions.xml`. - -IMPORTANT: Remember to set the `Scan Scope` to `All sources` since we apply checkstyle rules for production and test sources. - -=== Duplicate Finder - -Spring Cloud Build brings along the `basepom:duplicate-finder-maven-plugin`, that enables flagging duplicate and conflicting classes and resources on the java classpath. - -==== Duplicate Finder configuration - -Duplicate finder is *enabled by default* and will run in the `verify` phase of your Maven build, but it will only take effect in your project if you add the `duplicate-finder-maven-plugin` to the `build` section of the projecst's `pom.xml`. - -.pom.xml -[source,xml] ----- - - - - org.basepom.maven - duplicate-finder-maven-plugin - - - ----- - -For other properties, we have set defaults as listed in the https://github.com/basepom/duplicate-finder-maven-plugin/wiki[plugin documentation]. - -You can easily override them but setting the value of the selected property prefixed with `duplicate-finder-maven-plugin`. For example, set `duplicate-finder-maven-plugin.skip` to `true` in order to skip duplicates check in your build. - -If you need to add `ignoredClassPatterns` or `ignoredResourcePatterns` to your setup, make sure to add them in the plugin configuration section of your project: - -[source,xml] ----- - - - - org.basepom.maven - duplicate-finder-maven-plugin - - - org.joda.time.base.BaseDateTime - .*module-info - - - changelog.txt - - - - - - - ----- - - -== How to Build Spring Cloud Contract - -=== Cloning the repository on Windows - -While cloning this project on Windows, some files in the git repository may exceed the Windows maximum file path limit of 255 characters, which may -result in an incorrectly (probably partially) checked out repository. - -To resolve this issue, you can set the `core.longPaths` attribute to `true` or clone the Spring Cloud Contract repository. - -To set the `core.longPaths` attribute to `true`, you have three options: - -- Change it for all users of the machine (doing so requires administrator privileges): - - -[source,bash] ----- -git config --system core.longPaths true -git clone https://github.com/spring-cloud/spring-cloud-contract.git ----- - -- Change it for the current user (no administrative privileges required): - -[source,bash] ----- -git config --global core.longPaths true -git clone https://github.com/spring-cloud/spring-cloud-contract.git ----- - -- Change for just this repository (administrative privileges depend on where the repository is being cloned to): - -[source,bash] ----- -git clone -c core.longPaths=true https://github.com/spring-cloud/spring-cloud-contract.git ----- - -IMPORTANT: You need to have all the necessary Groovy plugins -installed for your IDE to properly resolve the sources. For example, in -Intellij IDEA, having both the Eclipse Groovy Compiler Plugin and the GMavenPlus Intellij -Plugin results in properly imported project. - -IMPORTANT: Spring Cloud Contract builds Docker images. Remember to -have Docker installed. - -IMPORTANT: If you want to run the build in offline mode, you must have Maven 3.5.2+ installed. - -=== Project structure - -The following listing shows the Spring Cloud Contract folder structure: - -``` -├── config -├── docker -├── samples -├── scripts -├── specs -├── spring-cloud-contract-dependencies -├── spring-cloud-contract-shade -├── spring-cloud-contract-starters -├── spring-cloud-contract-stub-runner -├── spring-cloud-contract-stub-runner-boot -├── spring-cloud-contract-tools -├── spring-cloud-contract-verifier -├── spring-cloud-contract-wiremock -└── tests -``` - -The following list describes each of the top-level folders in the project structure: - -- `config`: Folder contains setup for Spring Cloud Release Tools automated release process -- `docker`: Folder contains docker images -- `samples`: Folder contains test samples together with standalone ones used also to build documentation -- `scripts`: Contains scripts to build and test `Spring Cloud Contract` with Maven, Gradle and standalone projects -- `specs`: Contains specifications for the Contract DSL. -- `spring-cloud-contract-dependencies`: Contains Spring Cloud Contract BOM -- `spring-cloud-contract-shade`: Shaded dependencies used by the plugins -- `spring-cloud-contract-starters`: Contains Spring Cloud Contract Starters -- `spring-cloud-contract-spec`: Contains specification modules (contains concept of a Contract) -- `spring-cloud-contract-stub-runner`: Contains Stub Runner related modules -- `spring-cloud-contract-stub-runner-boot`: Contains Stub Runner Boot app -- `spring-cloud-contract-tools`: Gradle and Maven plugin for `Spring Cloud Contract Verifier` -- `spring-cloud-contract-verifier`: Core of the `Spring Cloud Contract Verifier` functionality -- `spring-cloud-contract-wiremock`: All WireMock related functionality -- `tests`: Integration tests for different messaging technologies - -=== Commands - -To build the core functionality together with the Maven Plugin, you can run the following -command: - -``` -./mvnw clean install -P integration -``` - -Calling that function builds the core, the Maven plugin, and the Gradle plugin and runs -end-to_end tests on the -standalone samples in the proper order (both for Maven and Gradle). - -To build only the Gradle Plugin, you can run the following commands: - -``` -cd spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin -./gradlew clean build -``` - -=== Helpful scripts - -We provide a couple of helpful scripts to build the project. - -To build the project in parallel (by default, it uses four cores, but you can change it), -run the following command: - -``` -./scripts/parallelBuild.sh -``` - -To use eight 8 cores, run the following command: - -``` -CORES=8 ./scripts/parallelBuild.sh -``` - -To build the project without any integration tests (by default, this uses one core), run -the following command: - -``` -./scripts/noIntegration.sh -``` - -To use eight cores, run the following command: - -``` -CORES=8 ./scripts/noIntegration.sh -``` - -To generate the documentation (for both the root project and the maven plugin), run the -following command: - -``` -./scripts/generateDocs.sh -``` +Unresolved directive in - include::https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/main/docs/src/main/asciidoc/contributing.adoc[] diff --git a/docker/spring-cloud-contract-docker/build_adocs.sh b/docker/spring-cloud-contract-docker/build_adocs.sh index 2b337b3d31..16d7237588 100755 --- a/docker/spring-cloud-contract-docker/build_adocs.sh +++ b/docker/spring-cloud-contract-docker/build_adocs.sh @@ -3,7 +3,7 @@ set -e CURRENT_DIR="$( pwd )" -ADOC_OUTPUT_DIR="${CURRENT_DIR}/target/adoc/" +ADOC_OUTPUT_DIR="${1:-${CURRENT_DIR}/target/adoc/}" pushd project mkdir -p "${ADOC_OUTPUT_DIR}" ./gradlew dumpAllProps diff --git a/docs/antora-playbook.yml b/docs/antora-playbook.yml index 9a70e676ca..0d5cf10209 100644 --- a/docs/antora-playbook.yml +++ b/docs/antora-playbook.yml @@ -6,15 +6,10 @@ antora: - '@antora/collector-extension' - '@antora/atlas-extension' - require: '@springio/antora-extensions/root-component-extension' - root_component_name: 'PROJECT_WITHOUT_SPRING' - # FIXME: Run antora once using this extension to migrate to the Asciidoc Tabs syntax - # and then remove this extension - - require: '@springio/antora-extensions/tabs-migration-extension' - unwrap_example_block: always - save_result: true + root_component_name: 'cloud-contract' site: - title: PROJECT_FULL_NAME - url: https://docs.spring.io/PROJECT_NAME/reference/ + title: Spring Cloud Contract + url: https://docs.spring.io/spring-cloud-contract/reference/ content: sources: - url: ./.. @@ -28,15 +23,16 @@ asciidoc: hide-uri-scheme: '@' tabs-sync-option: '@' chomp: 'all' + plantuml-server-url: http://www.plantuml.com/plantuml extensions: - '@asciidoctor/tabs' - - '@springio/asciidoctor-extensions' + - '@springio/asciidoctor-extensions' #TODO: Add plantuml rendering sourcemap: true urls: latest_version_segment: '' runtime: log: - failure_level: warn + failure_level: error # at least until we figure out what's wrong in contract files format: pretty ui: bundle: diff --git a/docs/antora.yml b/docs/antora.yml index 15b346da04..79e069250a 100644 --- a/docs/antora.yml +++ b/docs/antora.yml @@ -1,6 +1,6 @@ -name: PROJECT_WITHOUT_SPRING +name: cloud-contract version: true -title: PROJECT_NAME +title: spring-cloud-contract nav: - modules/ROOT/nav.adoc ext: diff --git a/docs/modules/ROOT/examples/samples-src b/docs/modules/ROOT/examples/samples-src new file mode 120000 index 0000000000..63a8114bd2 --- /dev/null +++ b/docs/modules/ROOT/examples/samples-src @@ -0,0 +1 @@ +../../../../samples \ No newline at end of file diff --git a/docs/modules/ROOT/examples/specs-src b/docs/modules/ROOT/examples/specs-src new file mode 120000 index 0000000000..8ab946905a --- /dev/null +++ b/docs/modules/ROOT/examples/specs-src @@ -0,0 +1 @@ +../../../../specs \ No newline at end of file diff --git a/docs/modules/ROOT/examples/stubrunner-src b/docs/modules/ROOT/examples/stubrunner-src new file mode 120000 index 0000000000..d59b649fe8 --- /dev/null +++ b/docs/modules/ROOT/examples/stubrunner-src @@ -0,0 +1 @@ +../../../../spring-cloud-contract-stub-runner \ No newline at end of file diff --git a/docs/modules/ROOT/examples/tests-src b/docs/modules/ROOT/examples/tests-src new file mode 120000 index 0000000000..70ef7f3e31 --- /dev/null +++ b/docs/modules/ROOT/examples/tests-src @@ -0,0 +1 @@ +../../../../tests \ No newline at end of file diff --git a/docs/modules/ROOT/examples/tools-src b/docs/modules/ROOT/examples/tools-src new file mode 120000 index 0000000000..7f3c24e44c --- /dev/null +++ b/docs/modules/ROOT/examples/tools-src @@ -0,0 +1 @@ +../../../../spring-cloud-contract-tools \ No newline at end of file diff --git a/docs/modules/ROOT/examples/verifier-src b/docs/modules/ROOT/examples/verifier-src new file mode 120000 index 0000000000..2154bc32cc --- /dev/null +++ b/docs/modules/ROOT/examples/verifier-src @@ -0,0 +1 @@ +../../../../spring-cloud-contract-verifier \ No newline at end of file diff --git a/docs/modules/ROOT/examples/wiremock-src b/docs/modules/ROOT/examples/wiremock-src new file mode 120000 index 0000000000..b3036584af --- /dev/null +++ b/docs/modules/ROOT/examples/wiremock-src @@ -0,0 +1 @@ +../../../../spring-cloud-contract-wiremock \ No newline at end of file diff --git a/docs/modules/ROOT/nav.adoc b/docs/modules/ROOT/nav.adoc index d4e53eadee..b8590122fb 100644 --- a/docs/modules/ROOT/nav.adoc +++ b/docs/modules/ROOT/nav.adoc @@ -1,62 +1,55 @@ * xref:index.adoc[] -* xref:spring-cloud-contract.adoc[] -* xref:_attributes.adoc[] -* xref:README.adoc[] -* xref:_additional-stubrunner-configprops.adoc[] -* xref:_building.adoc[] -* xref:_configprops.adoc[] -* xref:_index.adoc[] -* xref:_index_pdf.adoc[] -* xref:_index_single.adoc[] -* xref:_project-features-contract.adoc[] -** xref:_project-features-contract/groovy.adoc[] -** xref:_project-features-contract/java.adoc[] -** xref:_project-features-contract/kotlin.adoc[] -** xref:_project-features-contract/yml.adoc[] -** xref:_project-features-contract/limitations.adoc[] -** xref:_project-features-contract/common-top-elements.adoc[] -** xref:_project-features-contract/dsl-http-top-level-elements.adoc[] -** xref:_project-features-contract/dsl-request.adoc[] -** xref:_project-features-contract/dsl-response.adoc[] -** xref:_project-features-contract/dsl-dynamic-properties.adoc[] -** xref:_project-features-contract/dsl-async.adoc[] -** xref:_project-features-contract/dsl-xml.adoc[] -** xref:_project-features-contract/dsl-multiple.adoc[] -** xref:_project-features-contract/stateful-contracts.adoc[] -* xref:_project-features-flows.adoc[] -** xref:_project-features-flows/jax-rs.adoc[] -** xref:_project-features-flows/feature-webflux.adoc[] -** xref:_project-features-flows/feature-webflux-explicit.adoc[] -** xref:_project-features-flows/custom-mode.adoc[] -** xref:_project-features-flows/context-paths.adoc[] -** xref:_project-features-flows/rest-docs.adoc[] -** xref:_project-features-flows/graphql.adoc[] -** xref:_project-features-flows/grpc.adoc[] -* xref:_project-features-messaging.adoc[] -* xref:_project-features-stubrunner.adoc[] -** xref:_project-features-stubrunner/stub-runner-snapshot-versions.adoc[] -** xref:_project-features-stubrunner/stub-runner-publishing-stubs-as-jars.adoc[] -** xref:_project-features-stubrunner/stub-runner-core.adoc[] -** xref:_project-features-stubrunner/stub-runner-junit.adoc[] -** xref:_project-features-stubrunner/stub-runner-cloud.adoc[] -** xref:_project-features-stubrunner/stub-runner-boot.adoc[] -** xref:_project-features-stubrunner/stub-runner-stubs-per-consumer.adoc[] -** xref:_project-features-stubrunner/stub-runner-stubs-protocol.adoc[] -** xref:_project-features-stubrunner/stub-runner-generate-stubs-at-runtime.adoc[] -** xref:_project-features-stubrunner/stub-runner-fail-on-no-stubs.adoc[] -** xref:_project-features-stubrunner/stub-runner-common.adoc[] -* xref:_project-features-wiremock.adoc[] -* xref:advanced.adoc[] -* xref:appendix.adoc[] -* xref:docker-project.adoc[] -* xref:documentation-overview.adoc[] +* xref:legal.adoc[] * xref:getting-started.adoc[] ** xref:getting-started/introducing-spring-cloud-contract.adoc[] ** xref:getting-started/three-second-tour.adoc[] ** xref:getting-started/first-application.adoc[] ** xref:getting-started/cdc.adoc[] ** xref:getting-started/whats-next.adoc[] -* xref:gradle-project.adoc[] +* xref:using.adoc[] +* xref:project-features.adoc[] +*** xref:project-features-contract/groovy.adoc[] +*** xref:project-features-contract/java.adoc[] +*** xref:project-features-contract/kotlin.adoc[] +*** xref:project-features-contract/yml.adoc[] +*** xref:project-features-contract/limitations.adoc[] +*** xref:project-features-contract/common-top-elements.adoc[] +** xref:project-features-contract.adoc[] +*** xref:project-features-contract/dsl-http-top-level-elements.adoc[] +*** xref:project-features-contract/dsl-request.adoc[] +*** xref:project-features-contract/dsl-response.adoc[] +*** xref:project-features-contract/dsl-dynamic-properties.adoc[] +*** xref:project-features-contract/dsl-async.adoc[] +*** xref:project-features-contract/dsl-xml.adoc[] +*** xref:project-features-contract/dsl-multiple.adoc[] +*** xref:project-features-contract/stateful-contracts.adoc[] +** xref:project-features-integrations.adoc[] +*** xref:project-features-flows/jax-rs.adoc[] +*** xref:project-features-flows/feature-webflux.adoc[] +*** xref:project-features-flows/feature-webflux-explicit.adoc[] +*** xref:project-features-flows/custom-mode.adoc[] +*** xref:project-features-flows/context-paths.adoc[] +*** xref:project-features-flows/rest-docs.adoc[] +*** xref:project-features-flows/graphql.adoc[] +*** xref:project-features-flows/grpc.adoc[] +** xref:project-features-messaging.adoc[] +** xref:project-features-stubrunner.adoc[] +*** xref:project-features-stubrunner/stub-runner-snapshot-versions.adoc[] +*** xref:project-features-stubrunner/stub-runner-publishing-stubs-as-jars.adoc[] +*** xref:project-features-stubrunner/stub-runner-core.adoc[] +*** xref:project-features-stubrunner/stub-runner-junit.adoc[] +*** xref:project-features-stubrunner/stub-runner-cloud.adoc[] +*** xref:project-features-stubrunner/stub-runner-boot.adoc[] +*** xref:project-features-stubrunner/stub-runner-stubs-per-consumer.adoc[] +*** xref:project-features-stubrunner/stub-runner-stubs-protocol.adoc[] +*** xref:project-features-stubrunner/stub-runner-generate-stubs-at-runtime.adoc[] +*** xref:project-features-stubrunner/stub-runner-fail-on-no-stubs.adoc[] +*** xref:project-features-stubrunner/stub-runner-common.adoc[] +** xref:project-features-wiremock.adoc[] +* Build Tools +** xref:docker-project.adoc[] +** xref:gradle-project.adoc[] +** xref:maven-project.adoc[] * xref:howto.adoc[] ** xref:howto/why-spring-cloud-contract.adoc[] ** xref:howto/how-to-not-write-contracts-in-groovy.adoc[] @@ -68,17 +61,15 @@ ** xref:howto/how-to-debug-wiremock.adoc[] ** xref:howto/how-to-see-registered-stubs.adoc[] ** xref:howto/how-to-reference-text-from-file.adoc[] -** xref:howto/how-to-generate-pact-from-scc.adoc[] +** xref:howto/how-to-generate-from-scc.adoc[] ** xref:howto/how-to-work-with-transitivie.adoc[] ** xref:howto/contract-dsl-rest-docs.adoc[] ** xref:howto/how-to-use-stubs-from-a-location.adoc[] ** xref:howto/how-to-generate-stubs-at-runtime.adoc[] ** xref:howto/how-to-use-the-failonnostubs-feature.adoc[] ** xref:howto/how-to-mark-contract-in-progress.adoc[] -* xref:legal.adoc[] -* xref:maven-project.adoc[] -* xref:project-features.adoc[] -* xref:sagan-boot.adoc[] -* xref:sagan-index.adoc[] -* xref:using.adoc[] -* xref:yml-schema.adoc[] +* xref:advanced.adoc[] +* xref:appendix.adoc[] +** xref:building.adoc[] +** xref:configprops.adoc[] +** xref:yml-schema.adoc[] \ No newline at end of file diff --git a/docs/modules/ROOT/pages/_attributes.adoc b/docs/modules/ROOT/pages/_attributes.adoc deleted file mode 100644 index 3462a070a2..0000000000 --- a/docs/modules/ROOT/pages/_attributes.adoc +++ /dev/null @@ -1,36 +0,0 @@ -:doctype: book -:idprefix: -:idseparator: - -:tabsize: 4 -:numbered: -:sectanchors: -:sectnums: -:icons: font -:hide-uri-scheme: -:docinfo: shared,private - -:sc-ext: java -:project-full-name: Spring Cloud Contract - -// project-specific attributes -:core_path: {project-root} -:plugins_path: {project-root}/spring-cloud-contract-tools -:converters_path: {plugins_path}/spring-cloud-contract-converters -:verifier_root_path: {core_path}/spring-cloud-contract-verifier -:contract_spec_path: {core_path}/specs/spring-cloud-contract-spec-java -:contract_spec_tests_path: {core_path}/specs/spring-cloud-contract-spec -:contract_kotlin_spec_path: {core_path}/specs/spring-cloud-contract-spec-kotlin -:samples_path: {core_path}/samples -:verifier_core_path: {verifier_root_path} -:stubrunner_core_path: {core_path}/spring-cloud-contract-stub-runner -:standalone_samples_path: {samples_path}/standalone/dsl -:standalone_messaging_samples_path: {samples_path}/standalone/dsl -:standalone_restdocs_path: {samples_path}/standalone/restdocs -:tests_path: {core_path}/tests -:samples_branch: main -:samples_url: https://raw.githubusercontent.com/spring-cloud-samples/spring-cloud-contract-samples/{samples_branch} -:samples_code: https://github.com/spring-cloud-samples/spring-cloud-contract-samples/tree/{samples_branch} -:doc_samples: {samples_code}/wiremock-for-contract-docs -:doc_samples_url: {samples_url}/wiremock-for-contract-docs -:wiremock_tests: {core_path}/spring-cloud-contract-wiremock -:introduction_url: {core_path} diff --git a/docs/modules/ROOT/pages/_index.adoc b/docs/modules/ROOT/pages/_index.adoc deleted file mode 100644 index b2a57fca62..0000000000 --- a/docs/modules/ROOT/pages/_index.adoc +++ /dev/null @@ -1,18 +0,0 @@ -[[spring-cloud-contract-reference-documentation]] -= Spring Cloud Contract Reference Documentation -:page-section-summary-toc: 1 -Adam Dudczak, Mathias Düsterhöft, Marcin Grzejszczak, Dennis Kieselhorst, Jakub Kubryński, Karol Lassak, Olga Maciaszek-Sharma, Mariusz Smykuła, Dave Syer, Jay Bryant - -:docinfo: shared - -The reference documentation consists of the following sections: - -[horizontal] -<> :: Legal information. -<> :: About the Documentation, Getting Help, First Steps, and more. -xref:getting-started.adoc[Getting Started] :: Introducing {project-full-name}, Developing Your First {project-full-name}-based Application -xref:using.adoc[Using {project-full-name}] :: {project-full-name} usage examples and workflows. -xref:project-features.adoc[{project-full-name} Features] :: Contract DSL, Messaging, Spring Cloud Contract Stub Runner, and Spring Cloud Contract WireMock. -xref:project-features.adoc#features-build-tools[Build Tools] :: Maven Plugin, Gradle Plugin, and Docker. -xref:howto.adoc["`How-to`" Guides] :: Stubs versioning, Debugging, and more. -<> :: Properties, Metadata, Configuration, Dependencies, and more. diff --git a/docs/modules/ROOT/pages/_index_pdf.adoc b/docs/modules/ROOT/pages/_index_pdf.adoc deleted file mode 100644 index 07072dfaa3..0000000000 --- a/docs/modules/ROOT/pages/_index_pdf.adoc +++ /dev/null @@ -1,6 +0,0 @@ -[[spring-cloud-contract-reference-documentation]] -= Spring Cloud Contract Reference Documentation -:page-section-summary-toc: 1 -Adam Dudczak, Mathias Düsterhöft, Marcin Grzejszczak, Dennis Kieselhorst, Jakub Kubryński, Karol Lassak, Olga Maciaszek-Sharma, Mariusz Smykuła, Dave Syer, Jay Bryant - - diff --git a/docs/modules/ROOT/pages/_index_single.adoc b/docs/modules/ROOT/pages/_index_single.adoc deleted file mode 100644 index 332ec80b0b..0000000000 --- a/docs/modules/ROOT/pages/_index_single.adoc +++ /dev/null @@ -1,7 +0,0 @@ -[[spring-cloud-contract-reference-documentation]] -= Spring Cloud Contract Reference Documentation -:page-section-summary-toc: 1 -Adam Dudczak, Mathias Düsterhöft, Marcin Grzejszczak, Dennis Kieselhorst, Jakub Kubryński, Karol Lassak, Olga Maciaszek-Sharma, Mariusz Smykuła, Dave Syer, Jay Bryant - -:docinfo: shared - diff --git a/docs/modules/ROOT/pages/_project-features-contract/yml.adoc b/docs/modules/ROOT/pages/_project-features-contract/yml.adoc deleted file mode 100644 index 3198fc1d10..0000000000 --- a/docs/modules/ROOT/pages/_project-features-contract/yml.adoc +++ /dev/null @@ -1,6 +0,0 @@ -[[contract-yml]] -= Contract DSL in YAML -:page-section-summary-toc: 1 - -To see a schema of a YAML contract, visit the {docs-url}/reference/html/yml-schema.html[YML Schema] page. - diff --git a/docs/modules/ROOT/pages/_project-features-flows.adoc b/docs/modules/ROOT/pages/_project-features-flows.adoc deleted file mode 100644 index 027ad53950..0000000000 --- a/docs/modules/ROOT/pages/_project-features-flows.adoc +++ /dev/null @@ -1,5 +0,0 @@ -[[feature-integrations]] -= Integrations -:page-section-summary-toc: 1 - - diff --git a/docs/modules/ROOT/pages/_project-features-stubrunner/stub-runner-publishing-stubs-as-jars.adoc b/docs/modules/ROOT/pages/_project-features-stubrunner/stub-runner-publishing-stubs-as-jars.adoc deleted file mode 100644 index 3e12070ae2..0000000000 --- a/docs/modules/ROOT/pages/_project-features-stubrunner/stub-runner-publishing-stubs-as-jars.adoc +++ /dev/null @@ -1,32 +0,0 @@ -[[features-stub-runner-publishing-stubs-as-jars]] -= Publishing Stubs as JARs - -The easiest approach to publishing stubs as jars is to centralize the way stubs are kept. -For example, you can keep them as jars in a Maven repository. - -TIP: For both Maven and Gradle, the setup comes ready to work. However, you can customize -it if you want to. - -The following example shows how to publish stubs as jars: - -==== -[source,xml,indent=0,subs="verbatim,attributes",role="primary"] -.Maven ----- - -include:../:{samples_url}/producer_with_restdocs/pom.xml[tags=skip_jar,indent=0] - - -include:../:{samples_url}/producer_with_restdocs/pom.xml[tags=assembly,indent=0] - - -include:../:{samples_url}/producer_with_restdocs/src/assembly/stub.xml[indent=0] ----- - -[source,groovy,indent=0,subs="verbatim,attributes",role="secondary"] -.Gradle ----- -include:../:{plugins_path}/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/scenarioProject/build.gradle[tags=jar_setup,indent=0] ----- -==== - diff --git a/docs/modules/ROOT/pages/advanced.adoc b/docs/modules/ROOT/pages/advanced.adoc index b1b48e2166..64cbd7a1b4 100644 --- a/docs/modules/ROOT/pages/advanced.adoc +++ b/docs/modules/ROOT/pages/advanced.adoc @@ -1,6 +1,8 @@ [[contract-customization]] = Spring Cloud Contract customization +include::partial$_attributes.adoc[] + In this section, we describe how to customize various parts of Spring Cloud Contract. [[customization-customization]] @@ -28,35 +30,11 @@ https://github.com/spring-cloud-samples/spring-cloud-contract-samples[here]. The following examples show three classes that can be reused in the DSLs. -`PatternUtils` contains functions used by both the consumer and the producer. -The following listing shows the `PatternUtils` class: +{samples_url}/common/src/main/java/com/example/PatternUtils.java[PatternUtils] contains functions used by both the consumer and the producer. -==== -[source,java] ----- -include::{samples_url}/common/src/main/java/com/example/PatternUtils.java[] ----- -==== +{samples_url}/common/src/main/java/com/example/ConsumerUtils.java[ConsumerUtils] contains functions used by the consumer. -`ConsumerUtils` contains functions used by the consumer. -The following listing shows the `ConsumerUtils` class: - -==== -[source,java] ----- -include::{samples_url}/common/src/main/java/com/example/ConsumerUtils.java[] ----- -==== - -`ProducerUtils` contains functions used by the producer. -The following listing shows the `ProducerUtils` class: - -==== -[source,java] ----- -include::{samples_url}/common/src/main/java/com/example/ProducerUtils.java[] ----- -==== +{samples_url}/common/src/main/java/com/example/ProducerUtils.java[ProducerUtils] contains functions used by the producer. [[customization-test-dep]] === Adding a Test Dependency in the Project's Dependencies @@ -64,53 +42,17 @@ include::{samples_url}/common/src/main/java/com/example/ProducerUtils.java[] To add a test dependency in the project's dependencies, you must first add the common jar dependency as a test dependency. Because your contracts files are available on the test resources path, the common jar classes automatically become -visible in your Groovy files. The following examples show how to test the dependency: - -==== -[source,xml,indent=0,subs="verbatim,attributes",role="primary"] -.Maven ----- -include::{samples_url}/producer/pom.xml[tags=test_dep,indent=0] ----- - -[source,groovy,indent=0,subs="verbatim,attributes",role="secondary"] -.Gradle ----- -include::{samples_url}/producer/build.gradle[tags=test_dep,indent=0] ----- -==== +visible in your Groovy files. The following {samples_url}/producer/[example] show how to test the dependency. [[customization-plugin-dep]] === Adding a Test Dependency in the Plugin's Dependencies -Now, you must add the dependency for the plugin to reuse at runtime, as the -following example shows: - -==== -[source,xml,indent=0,subs="verbatim,attributes",role="primary"] -.Maven ----- -include::{samples_url}/producer/pom.xml[tags=test_dep_in_plugin,indent=0] ----- - -[source,groovy,indent=0,subs="verbatim,attributes",role="secondary"] -.Gradle ----- -include::{samples_url}/producer/build.gradle[tags=test_dep_in_plugin,indent=0] ----- -==== +Now, you must add the dependency for the plugin to reuse at runtime. [[customization-referencing]] === Referencing Classes in DSLs -You can now reference your classes in your DSL, as the following example shows: - -==== -[source,groovy] ----- -include::{samples_url}/producer/src/test/resources/contracts/beer/rest/shouldGrantABeerIfOldEnough.groovy[indent=0] ----- -==== +You can now reference your classes in your DSL, as the {samples_url}/producer/src/test/resources/contracts/beer/rest/shouldGrantABeerIfOldEnough.groovy[following example shows]. IMPORTANT: You can set the Spring Cloud Contract plugin up by setting `convertToYaml` to `true`. That way, you do NOT have to add the dependency with the extended functionality @@ -131,22 +73,18 @@ provide your own extensions, you can register an implementation of the Since we use the `spring.factories` extension approach, you can create an entry similar to the following in the `META-INF/spring.factories` file: -==== [source,groovy,indent=0] ---- include::{stubrunner_core_path}/src/test/resources/META-INF/spring.factories[indent=0] ---- -==== The following example shows a custom extension: .TestWireMockExtensions.groovy -==== [source,groovy,indent=0] ---- -include::{verifier_core_path}/src/test/groovy/org/springframework/cloud/contract/verifier/dsl/wiremock/TestWireMockExtensions.groovy[indent=0] +include::{verifier_root_path}/src/test/groovy/org/springframework/cloud/contract/verifier/dsl/wiremock/TestWireMockExtensions.groovy[indent=0] ---- -==== IMPORTANT: If you want the transformation to be applied only for a mapping that explicitly requires it, override the `applyGlobally()` method and set it to `false` . @@ -158,14 +96,12 @@ You can register a bean of type `org.springframework.cloud.contract.wiremock.Wir to customize the WireMock configuration (for example, to add custom transformers). The following example shows how to do so: -==== [source,java,indent=0] ---- include::{wiremock_tests}/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockConfigurationCustomizerTests.java[tags=customizer_1] // perform your customization here include::{wiremock_tests}/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockConfigurationCustomizerTests.java[tags=customizer_2] ---- -==== [[customization-wiremock-from-metadata]] === Customization of WireMock via Metadata @@ -231,12 +167,10 @@ can generate stubs for other HTTP server implementations). The `ContractConverter` interface lets you register your own implementation of a contract structure converter. The following code listing shows the `ContractConverter` interface: -==== [source,java] ---- include::{contract_spec_path}/src/main/java/org/springframework/cloud/contract/spec/ContractConverter.java[indent=0,lines=17..-1] ---- -==== Your implementation must define the condition on which it should start the conversion. Also, you must define how to perform that conversion in both directions. @@ -247,13 +181,11 @@ implementation. The following example shows a typical `spring.factories` file: -==== [source] ---- org.springframework.cloud.contract.spec.ContractConverter=\ org.springframework.cloud.contract.verifier.converter.YamlContractConverter ---- -==== [[customization-custom-test-generator]] === Using the Custom Test Generator @@ -264,23 +196,19 @@ way the verifier builds Java tests, you can register your own implementation. The `SingleTestGenerator` interface lets you register your own implementation. The following code listing shows the `SingleTestGenerator` interface: -==== [source,groovy] ---- -include::{verifier_core_path}/src/main/java/org/springframework/cloud/contract/verifier/builder/SingleTestGenerator.java[indent=0,lines=17..-1] +include::{verifier_root_path}/src/main/java/org/springframework/cloud/contract/verifier/builder/SingleTestGenerator.java[indent=0,lines=17..-1] ---- -==== Again, you must provide a `spring.factories` file, such as the one shown in the following example: -==== [source] ---- org.springframework.cloud.contract.verifier.builder.SingleTestGenerator=/ com.example.MyGenerator ---- -==== [[customization-custom-stub-generator]] === Using the Custom Stub Generator @@ -289,22 +217,18 @@ If you want to generate stubs for stub servers other than WireMock, you can plug own implementation of the `StubGenerator` interface. The following code listing shows the `StubGenerator` interface: -==== [source,groovy] ---- include::{converters_path}/src/main/java/org/springframework/cloud/contract/verifier/converter/StubGenerator.java[indent=0,lines=16..-1] ---- -==== Again, you must provide a `spring.factories` file, such as the one shown in the following example: -==== [source] ---- include::{converters_path}/src/main/resources/META-INF/spring.factories[indent=0] ---- -==== The default implementation is the WireMock stub generation. @@ -323,23 +247,19 @@ you have written a stub generator and placed your stubs in a JAR file. In order for Stub Runner to know how to run your stubs, you have to define a custom HTTP Stub server implementation, which might resemble the following example: -==== [source,groovy] ---- include::{tests_path}/spring-cloud-contract-stub-runner-moco/src/test/groovy/org/springframework/cloud/contract/stubrunner/provider/moco/MocoHttpServerStub.groovy[indent=0,lines=16..-1] ---- -==== Then you can register it in your `spring.factories` file, as the following example shows: -==== [source] ---- org.springframework.cloud.contract.stubrunner.HttpServerStub=\ org.springframework.cloud.contract.stubrunner.provider.moco.MocoHttpServerStub ---- -==== Now you can run stubs with Moco. @@ -352,7 +272,6 @@ implementation is used. If you provide more than one, the first one on the list You can customize the way your stubs are downloaded by creating an implementation of the `StubDownloaderBuilder` interface, as the following example shows: -==== [source,java] ---- package com.example; @@ -378,19 +297,16 @@ class CustomStubDownloaderBuilder implements StubDownloaderBuilder { } } ---- -==== Then you can register it in your `spring.factories` file, as the following example shows: -==== [source] ---- # Example of a custom Stub Downloader Provider org.springframework.cloud.contract.stubrunner.StubDownloaderBuilder=\ com.example.CustomStubDownloaderBuilder ---- -==== Now you can pick a folder with the source of your stubs. diff --git a/docs/modules/ROOT/pages/appendix.adoc b/docs/modules/ROOT/pages/appendix.adoc index e88632a567..524105a024 100644 --- a/docs/modules/ROOT/pages/appendix.adoc +++ b/docs/modules/ROOT/pages/appendix.adoc @@ -4,6 +4,7 @@ = Common application properties :page-section-summary-toc: 1 +include::partial$_attributes.adoc[] Various properties can be specified inside your `application.properties` file, inside your `application.yml` file, or as command line switches. This appendix provides a list of common {project-full-name} properties and references to the underlying classes that consume them. @@ -11,10 +12,3 @@ This appendix provides a list of common {project-full-name} properties and refer NOTE: Property contributions can come from additional jar files on your classpath, so you should not consider this an exhaustive list. Also, you can define your own properties. -[[default-application-properties]] -== Default application properties - - -[[additional-application-properties]] -== Additional application properties - diff --git a/docs/modules/ROOT/pages/_building.adoc b/docs/modules/ROOT/pages/building.adoc similarity index 100% rename from docs/modules/ROOT/pages/_building.adoc rename to docs/modules/ROOT/pages/building.adoc diff --git a/docs/modules/ROOT/pages/configprops.adoc b/docs/modules/ROOT/pages/configprops.adoc new file mode 100644 index 0000000000..32cbb8e589 --- /dev/null +++ b/docs/modules/ROOT/pages/configprops.adoc @@ -0,0 +1,6 @@ +[[configuration-properties]] += Configuration Properties + +Below you can find a list of configuration properties. + +include::partial$_configprops.adoc[] diff --git a/docs/modules/ROOT/pages/docker-project.adoc b/docs/modules/ROOT/pages/docker-project.adoc index fce6ad412c..2d1f294186 100644 --- a/docs/modules/ROOT/pages/docker-project.adoc +++ b/docs/modules/ROOT/pages/docker-project.adoc @@ -1,6 +1,8 @@ [[docker]] = Docker Project +include::partial$_attributes.adoc[] + In this section, we publish a `springcloud/spring-cloud-contract` Docker image that contains a project that generates tests and runs them in `EXPLICIT` mode against a running application. @@ -75,24 +77,20 @@ The Docker image requires some environment variables to point to your running application, to the Artifact manager instance, and so on. The following list describes the environment variables: -// TODO: reenable -//include::{project-root}/docker/spring-cloud-contract-docker/target/adoc/props.adoc[indent=0] +include::partial$props.adoc[indent=0] The following environment variables are used when tests are run: -// TODO: reenable -//include::{project-root}/docker/spring-cloud-contract-docker/target/adoc/appProps.adoc[indent=0] +include::partial$appProps.adoc[indent=0] ### Customizing the gradle build You can provide a customized `gradle.build` to be run in the container by mounting your customized build file as a volume when running the container: -==== [source,bash] ---- $ docker run -v :/spring-cloud-contract/build.gradle springcloud/spring-cloud-contract: ---- -==== [[docker-example-of-usage]] === Example of Usage via HTTP @@ -100,28 +98,23 @@ $ docker run -v :/spring-cloud-contract/build In this section, we explore a simple MVC application. To get started, clone the following git repository and cd to the resulting directory, by running the following commands: -==== [source,bash] ---- $ git clone https://github.com/spring-cloud-samples/spring-cloud-contract-nodejs $ cd bookstore ---- -==== The contracts are available in the `/contracts` folder. Since we want to run tests, we can run the following command: -==== [source,bash] ---- $ npm test ---- -==== However, for learning purposes, we split it into pieces, as follows: -==== [source,bash] ---- # Stop docker infra (nodejs, artifactory) @@ -150,7 +143,6 @@ $ docker run --rm -e "APPLICATION_BASE_URL=${APPLICATION_BASE_URL}" -e "PUBLISH # Kill app $ pkill -f "node app" ---- -==== Through bash scripts, the following happens: @@ -188,9 +180,11 @@ in case of polyglot applications) then you'll have to have the following prerequ The contract needs to call a `triggerMessage(...)` method. That method is already provided in the base class for all tests in the docker image and will send out a request to the HTTP endpoint on the producer side. Below you can find examples of such contracts. -==== +[tabs] +====== +Groovy:: ++ [source,groovy,indent=0,subs="verbatim,attributes",role="primary"] -.Groovy ---- import org.springframework.cloud.contract.spec.Contract @@ -224,8 +218,9 @@ Contract.make { } ---- +YAML:: ++ [source,yml,indent=0,subs="verbatim,attributes",role="secondary"] -.YAML ---- description: 'Send a pong message in response to a ping message' label: 'ping_pong' @@ -245,7 +240,7 @@ metadata: messageProperties: receivedRoutingKey: '#' ---- -==== +====== [[docker-example-of-usage-messaging-endpoint]] ==== HTTP Endpoint to Trigger a Message @@ -256,7 +251,7 @@ code that sends a message to a broker. If such code is not generated then we nee The endpoint must have the following configuration: -- URL: `/springcloudcontract/{label}` where `label` can be any text +- URL: `/springcloudcontract/\{label}` where `label` can be any text - Method: `POST` - Basing on the `label` will generate a message that will be sent to a given destination according to the contract definition @@ -264,7 +259,6 @@ Below you have an example of such an endpoint. If you're interested in providing an example in your language don't hesitate to file an issue in the https://github.com/spring-cloud/spring-cloud-contract/issues/new?assignees=&labels=&template=feature_request.md&title=New+Polyglot+Sample+of+a+HTTP+controller[Spring Cloud Contract repository at Github]. -==== [source,python,indent=0,subs="verbatim,attributes"] .Python ---- @@ -300,7 +294,6 @@ if 'CONTRACT_TEST' in os.environ: else: raise ValueError('No such label expected.') ---- -==== [[docker-example-of-usage-messaging-producer]] ==== Running Message Tests on the Producer Side @@ -311,7 +304,6 @@ with attached contracts, however we will also add variables for the messaging code to work. In this case let's assume that the contracts are being stored in a Git repository. -==== [source,bash] ---- #!/bin/bash @@ -369,7 +361,6 @@ kill $APP_PID yes | docker-compose kill ---- -==== What will happen is: @@ -398,7 +389,7 @@ Since the Spring Cloud Contract Stub Runner Docker Image uses the standalone ver [[docker-stubrunner-env-vars]] === Environment Variables -You can run the docker image and pass any of the xref:_project-features-stubrunner/stub-runner-common.adoc#features-stub-runner-common-properties-junit-spring[common properties for JUnit and Spring] +You can run the docker image and pass any of the xref:project-features-stubrunner/stub-runner-common.adoc[common properties for JUnit and Spring] as environment variables. The convention is that all the letters should be upper case. The dot (`.`) should be replaced with underscore (`_`) characters. For example, @@ -417,18 +408,15 @@ We want to use the stubs created in this <> step. Assume that we want to run the stubs on port `9876`. You can see the NodeJS code by cloning the repository and changing to the directory indicated in the following commands: -==== [source,bash] ---- $ git clone https://github.com/spring-cloud-samples/spring-cloud-contract-nodejs $ cd bookstore ---- -==== Now we can run the Stub Runner Boot application with the stubs, by running the following commands: -==== [source,bash] ---- # Provide the Spring Cloud Contract Docker version @@ -449,7 +437,6 @@ $ docker run --rm \ -p "9876:9876" \ springcloud/spring-cloud-contract-stub-runner:"${SC_CONTRACT_DOCKER_VERSION}" ---- -==== When the preceding commands run, @@ -462,7 +449,6 @@ When the preceding commands run, On the server side, we built a stateful stub. We can use curl to assert that the stubs are setup properly. To do so, run the following commands: -==== [source,bash] ---- # let's run the first request (no response is returned) @@ -471,11 +457,10 @@ $ curl -H "Content-Type:application/json" -X POST --data '{ "title" : "Title", " $ curl -X GET http://localhost:9876/api/books # You will receive contents of the JSON ---- -==== IMPORTANT: If you want use the stubs that you have built locally, on your host, you should set the `-e STUBRUNNER_STUBS_MODE=LOCAL` environment variable and mount -the volume of your local m2 (`-v "${HOME}/.m2/:/home/scc/.m2:ro"`). +the volume of your local m2 (`-v "$\{HOME}/.m2/:/home/scc/.m2:ro"`). [[docker-stubrunner-example-messaging]] === Example of Usage with Messaging @@ -576,7 +561,7 @@ yes | docker-compose kill ---- <1> We need to have the middleware running first <2> The application needs to be up and running -<3> Via the `STANDALONE_PROTOCOL` environment variable we will fetch a https://camel.apache.org/components/latest/index.html[Apache Camel Component]. The artifact that we will fetch is `org.apache.camel.springboot:camel-${STANDALONE_PROTOCOL}-starter`. In other words `STANDALONE_PROTOCOL` is matching Camel's component. +<3> Via the `STANDALONE_PROTOCOL` environment variable we will fetch a https://camel.apache.org/components/latest/index.html[Apache Camel Component]. The artifact that we will fetch is `org.apache.camel.springboot:camel-$\{STANDALONE_PROTOCOL}-starter`. In other words `STANDALONE_PROTOCOL` is matching Camel's component. <4> We're setting addresses (we could be setting credentials) via Camel's Spring Boot Starter mechanisms. Example for https://camel.apache.org/components/latest/rabbitmq-component.html#_spring_boot_auto_configuration[Apache Camel's RabbitMQ Spring Boot Auto-Configuration] [[docker-stubrunner-running-middlware]] diff --git a/docs/modules/ROOT/pages/documentation-overview.adoc b/docs/modules/ROOT/pages/documentation-overview.adoc deleted file mode 100644 index 497b13b20f..0000000000 --- a/docs/modules/ROOT/pages/documentation-overview.adoc +++ /dev/null @@ -1,129 +0,0 @@ -[[documentation]] -= Spring Cloud Contract Documentation - -This section provides a brief overview of {project-full-name} reference documentation. It serves -as a map for the rest of the document. - - - -[[contract-documentation-about]] -== About the Documentation - -The {project-full-name} reference guide is available as - -* {docs-url}/reference/html[Multi-page HTML] -* {docs-url}/reference/htmlsingle[Single-page HTML] -* {docs-url}/reference/pdf/{project-name}.pdf[PDF] - -Copies of this document may be made for your own use and for distribution to others, -provided that you do not charge any fee for such copies and further provided that each -copy contains this Copyright Notice, whether distributed in print or electronically. - - - -[[documentation-getting-help]] -== Getting Help -If you have trouble with {project-full-name}, we would like to help. - -* Try the xref:howto.adoc[How-to documents]. They provide solutions to the most -common questions. -* Learn the {project-full-name} basics. If you are -starting out with {project-full-name}, try one of the https://spring.io/guides[guides]. -* Ask a question. We monitor https://stackoverflow.com[stackoverflow.com] for questions -tagged with https://stackoverflow.com/tags/{project-name}[`{project-name}`]. -* Report bugs with {project-full-name} at https://github.com/spring-cloud/{project-name}/issues. -* Chat with us at http://https://gitter.im/spring-cloud/{project-name}[{project-full-name} Gitter] - -NOTE: All of {project-full-name} is open source, including the documentation. If you find -problems with the docs or if you want to improve them, please {github-code}[get -involved]. - - -[[contract-documentation-first-steps]] -== First Steps -If you are getting started with {project-full-name} or 'Spring' in general, start with -xref:getting-started.adoc[the following topics]: - -* *From scratch:* -<> | -xref:getting-started/three-second-tour.adoc[Three-second Tour] | -xref:getting-started/first-application.adoc[First application] -* *Tutorial:* -xref:getting-started/cdc.adoc[Introduction] | -<> | -<> | -xref:getting-started/cdc.adoc#getting-started-cdc-consumer-final[Consumer, Part 2] - - - -[[working-with-{project-full-name}]] -== Working with {project-full-name} -Ready to actually start using {project-full-name}? xref:using.adoc[We have you covered] -: - -* *Provider contract testing:* - -** xref:using.adoc#flows-provider-nexus[Provider contract testing with stubs in Nexus or Artifactory] -** xref:using.adoc#flows-provider-git[Provider contract testing with stubs in Git] -** xref:using.adoc#flows-provider-non-spring[Provider contract testing with stubs in Artifactory for a non-Spring application] -** xref:using.adoc#flows-provider-non-jvm[Provider contract testing with stubs in Artifactory in non JVM world] -** xref:using.adoc#flows-provider-rest-docs[Provider contract testing with REST Docs and stubs in Nexus / Artifactory] - -* *Consumer-Driven contract testing:* -** xref:using.adoc#flows-cdc-contracts-producer[Consumer Driven Contracts with contracts on the producer side] -** xref:using.adoc#flows-cdc-contracts-external[Consumer Driven Contracts with contracts in external repo] -** xref:using.adoc#flows-cdc-contracts-stubs-git[Consumer Driven Contracts with contracts on the producer side, pushed to git] - -TIP: We talk about *Provider Contracts* when it is the producer of the API that defines the contracts and -publishes it for all its consumers to use. This approach is useful for producers that cannot -directly collaborate with their consumers -- for example, when there are too many consumers or -the consumers are external (do not work within the same company). - -TIP: We use the term, *Consumer-Driven Contracts*, to refer to workflows where the consumers of an API -play a vital role in the process of creating the contracts. We recommended this approach, because it is easy -to implement when both producer and consumer teams work for the same organizations and the number -of consumers is not extremely large. - -[[learning-about-{project-full-name}-features]] -== Learning about {project-full-name} Features -Need more details about {project-full-name}'s core features? -xref:project-features.adoc[The following content is for you]: - -* *Core Features:* -xref:_project-features-contract.adoc[Contract DSL] | -xref:_project-features-contract/common-top-elements.adoc#features-http[Contracts for HTTP] | -xref:_project-features-messaging.adoc[Contracts for Messaging] -* *Integrations:* -xref:_project-features-flows/jax-rs.adoc[JAX-RS] | -xref:_project-features-flows/context-paths.adoc[Context Paths] | -xref:_project-features-flows/rest-docs.adoc[RESTDocs] -* *Modules:* -xref:_project-features-stubrunner.adoc[Stub Runner] | -xref:_project-features-wiremock.adoc[WireMock] -// TODO: links don't work in "build Tools" section -* *Build Tools:* -link:maven-project.html[Contract Verifier - Maven] | -link:gradle-project.html[Contract Verifier - Gradle] | -link:docker-project.html[Docker] - - -[[advanced-topics]] -== Advanced Topics -Finally, we have a few topics for more advanced users: - -* *Customizing the DSL:* -<> | -<> | -<> | -<> | -<> -* *Customizing WireMock:* -xref:advanced.adoc#customization-wiremock-extension[Extensions] | -xref:advanced.adoc#customization-wiremock-configuration[Configuration] -* *Customizing {project-full-name}:* -<> | -<> | -<> | -<> | -<> | -<> diff --git a/docs/modules/ROOT/pages/getting-started.adoc b/docs/modules/ROOT/pages/getting-started.adoc index 4c0000f239..f78cc38e88 100644 --- a/docs/modules/ROOT/pages/getting-started.adoc +++ b/docs/modules/ROOT/pages/getting-started.adoc @@ -2,6 +2,8 @@ = Getting Started :page-section-summary-toc: 1 +include::partial$_attributes.adoc[] + If you are getting started with {project-full-name} or Spring in general, start by reading this section. It answers the basic "`what?`", "`how?`" and "`why?`" questions. It includes an introduction to {project-full-name}, along with installation instructions. We then diff --git a/docs/modules/ROOT/pages/getting-started/cdc.adoc b/docs/modules/ROOT/pages/getting-started/cdc.adoc index 0a889312d9..40eb259781 100644 --- a/docs/modules/ROOT/pages/getting-started/cdc.adoc +++ b/docs/modules/ROOT/pages/getting-started/cdc.adoc @@ -1,6 +1,8 @@ [[getting-started-cdc]] = Step-by-step Guide to Consumer Driven Contracts (CDC) with Contracts on the Producer Side +include::partial$_attributes.adoc[] + Consider an example of fraud detection and the loan issuance process. The business scenario is such that we want to issue loans to people but do not want them to steal from us. The current implementation of our system grants loans to everybody. @@ -33,21 +35,23 @@ in the producer's repository. If you use the SNAPSHOT, Milestone, or Release Candidate versions, you need to add the following section to your build: -==== +[tabs] +====== +Maven:: ++ [source,xml,indent=0,subs="verbatim,attributes",role="primary"] -.Maven ---- -include:../:{introduction_url}/samples/standalone/dsl/http-server/pom.xml[tags=repos,indent=0] +include::{samples_path}/standalone/dsl/http-server/pom.xml[tags=repos,indent=0] ---- +====== //// //// [source,groovy,indent=0,subs="verbatim,attributes",role="secondary"] .Gradle ---- -include:../:{introduction_url}/samples/standalone/dsl/http-server/build.gradle[tags=deps_repos,indent=0] +include::{samples_path}/standalone/dsl/http-server/build.gradle[tags=deps_repos,indent=0] ---- -==== For simplicity, we use the following acronyms: @@ -109,12 +113,10 @@ We start with the loan issuance flow, which the following UML diagram shows: The following listing shows a test that we might use to check whether a loan amount is too large: -==== [source,groovy,indent=0] ---- -include:../:{introduction_url}/samples/standalone/dsl/http-client/src/test/java/com/example/loan/LoanApplicationServiceTests.java[tags=client_tdd,indent=0] +include::{samples_path}/standalone/dsl/http-client/src/test/java/com/example/loan/LoanApplicationServiceTests.java[tags=client_tdd,indent=0] ---- -==== Assume that you have written a test of your new feature. If a loan application for a big amount is received, the system should reject that loan application with some description. @@ -127,12 +129,10 @@ that you need to send the request containing the ID of the client and the amount client wants to borrow. You want to send it to the `/fraudcheck` URL by using the `PUT` method. To do so, you might use code similar to the following: -==== [source,groovy,indent=0] ---- -include:../:{introduction_url}/samples/standalone/dsl/http-client/src/main/java/com/example/loan/LoanApplicationService.java[tags=client_call_server,indent=0] +include::{samples_path}/standalone/dsl/http-client/src/main/java/com/example/loan/LoanApplicationService.java[tags=client_call_server,indent=0] ---- -==== For simplicity, the port of the Fraud Detection service is set to `8080`, and the application runs on `8090`. @@ -146,12 +146,10 @@ NOTE: If you start the test at this point, it breaks, because no service current You can start by playing around with the server side contract. To do so, you must first clone it, by running the following command: -==== [source,bash,indent=0] ---- $ git clone https://your-git-server.com/server-side.git local-http-server-repo ---- -==== [[getting-started-cdc-consumer-define]] === Define the Contract Locally in the Repository of the Fraud Detection Service @@ -164,21 +162,16 @@ is important because the producer's test base class name references that folder. The following example shows our contract, in both Groovy and YAML: -==== [source,groovy,indent=0,role="primary"] -.groovy ---- -include:../:{introduction_url}/samples/standalone/dsl/http-server/src/test/resources/contracts/fraud/shouldMarkClientAsFraud.groovy[] +include::{samples_path}/standalone/dsl/http-server/src/test/resources/contracts/fraud/shouldMarkClientAsFraud.groovy[] ---- -//// -//// [source,yaml,indent=0,role="secondary"] .yaml ---- -include:../:{introduction_url}/samples/standalone/dsl/http-server/src/test/resources/contracts/yml/fraud/shouldMarkClientAsFraud.yml[] +include::{samples_path}/standalone/dsl/http-server/src/test/resources/contracts/yml/fraud/shouldMarkClientAsFraud.yml[] ---- -==== The YML contract is quite straightforward. However, when you take a look at the contract written with a statically typed Groovy DSL, you might wonder what the @@ -196,7 +189,7 @@ The previously shown contract is an agreement between two sides that: * If an HTTP request is sent with all of: ** A `PUT` method on the `/fraudcheck` endpoint -** A JSON body with a `client.id` that matches the regular expression `[0-9]{10}` and +** A JSON body with a `client.id` that matches the regular expression `[0-9]\{10}` and `loanAmount` equal to `99999` ** A `Content-Type` header with a value of `application/vnd.fraud.v1+json` * Then an HTTP response is sent to the consumer that @@ -214,21 +207,17 @@ install the stubs locally. We can add either a Maven or a Gradle plugin. In this example, we show how to add Maven. First, we add the `Spring Cloud Contract` BOM, as the following example shows: -==== [source,xml,indent=0] ---- -include:../:{introduction_url}/samples/standalone/dsl/http-server/pom.xml[tags=contract_bom,indent=0] +include::{samples_path}/standalone/dsl/http-server/pom.xml[tags=contract_bom,indent=0] ---- -==== Next, add the `Spring Cloud Contract Verifier` Maven plugin, as the following example shows: -==== [source,xml,indent=0] ---- -include:../:{introduction_url}/samples/standalone/dsl/http-server/pom.xml[tags=contract_maven_plugin,indent=0] +include::{samples_path}/standalone/dsl/http-server/pom.xml[tags=contract_maven_plugin,indent=0] ---- -==== Since the plugin was added, you get the `Spring Cloud Contract Verifier` features, which, from the provided contracts: @@ -239,17 +228,14 @@ from the provided contracts: You do not want to generate tests, since you, as the consumer, want only to play with the stubs. You need to skip the test generation and invokation. To do so, run the following commands: -==== [source,bash,indent=0] ---- $ cd local-http-server-repo $ ./mvnw clean install -DskipTests ---- -==== Once you run those commands, you should you see something like the following content in the logs: -==== [source,bash,indent=0] ---- [INFO] --- spring-cloud-contract-maven-plugin:1.0.0.BUILD-SNAPSHOT:generateStubs (default-generateStubs) @ http-server --- @@ -265,16 +251,13 @@ Once you run those commands, you should you see something like the following con [INFO] Installing /some/path/http-server/pom.xml to /path/to/your/.m2/repository/com/example/http-server/0.0.1-SNAPSHOT/http-server-0.0.1-SNAPSHOT.pom [INFO] Installing /some/path/http-server/target/http-server-0.0.1-SNAPSHOT-stubs.jar to /path/to/your/.m2/repository/com/example/http-server/0.0.1-SNAPSHOT/http-server-0.0.1-SNAPSHOT-stubs.jar ---- -==== The following line is extremely important: -==== [source,bash,indent=0] ---- [INFO] Installing /some/path/http-server/target/http-server-0.0.1-SNAPSHOT-stubs.jar to /path/to/your/.m2/repository/com/example/http-server/0.0.1-SNAPSHOT/http-server-0.0.1-SNAPSHOT-stubs.jar ---- -==== It confirms that the stubs of the `http-server` have been installed in the local repository. @@ -288,39 +271,32 @@ Application service`): . Add the `Spring Cloud Contract` BOM, as follows: + -==== [source,xml,indent=0] ---- -include:../:{introduction_url}/samples/standalone/dsl/http-client/pom.xml[tags=contract_bom,indent=0] +include::{samples_path}/standalone/dsl/http-client/pom.xml[tags=contract_bom,indent=0] ---- -==== . Add the dependency to `Spring Cloud Contract Stub Runner`, as follows: + -==== [source,xml,indent=0] ---- -include:../:{introduction_url}/samples/standalone/dsl/http-client/pom.xml[tags=stub_runner,indent=0] +include::{samples_path}/standalone/dsl/http-client/pom.xml[tags=stub_runner,indent=0] ---- -==== . Annotate your test class with `@AutoConfigureStubRunner`. In the annotation, provide the `group-id` and `artifact-id` for the Stub Runner to download the stubs of your collaborators. + -==== [source,groovy,indent=0] ---- -include:../:{introduction_url}/samples/standalone/dsl/http-client/src/test/java/com/example/loan/LoanApplicationServiceTests.java[tags=autoconfigure_stubrunner,indent=0] +include::{samples_path}/standalone/dsl/http-client/src/test/java/com/example/loan/LoanApplicationServiceTests.java[tags=autoconfigure_stubrunner,indent=0] ---- -==== . (Optional) Because you are playing with the collaborators offline, you can also provide the offline work switch (`StubRunnerProperties.StubsMode.LOCAL`). Now, when you run your tests, you see something like the following output in the logs: -==== [source,bash,indent=0] ---- 2016-07-19 14:22:25.403 INFO 41050 --- [ main] o.s.c.c.stubrunner.AetherStubDownloader : Desired version is + - will try to resolve the latest version @@ -331,7 +307,6 @@ Now, when you run your tests, you see something like the following output in the 2016-07-19 14:22:25.475 INFO 41050 --- [ main] o.s.c.c.stubrunner.AetherStubDownloader : Unpacked file to [/var/folders/0p/xwq47sq106x1_g3dtv6qfm940000gq/T/contracts100276532569594265] 2016-07-19 14:22:27.737 INFO 41050 --- [ main] o.s.c.c.stubrunner.StubRunnerExecutor : All stubs are now running RunningStubs [namesAndPorts={com.example:http-server:0.0.1-SNAPSHOT:stubs=8080}] ---- -==== This output means that Stub Runner has found your stubs and started a server for your application with a group ID of `com.example` and an artifact ID of `http-server` with version `0.0.1-SNAPSHOT` of @@ -384,42 +359,34 @@ The following UML diagram shows the fraud detection flow: As a reminder, the following listing shows the initial implementation: -==== [source,java,indent=0] ---- -include:../:{introduction_url}/samples/standalone/dsl/http-server/src/main/java/com/example/fraud/FraudDetectionController.java[tags=server_api,indent=0] -include:../:{introduction_url}/samples/standalone/dsl/http-server/src/main/java/com/example/fraud/FraudDetectionController.java[tags=initial_impl,indent=0] +include::{samples_path}/standalone/dsl/http-server/src/main/java/com/example/fraud/FraudDetectionController.java[tags=server_api,indent=0] +include::{samples_path}/standalone/dsl/http-server/src/main/java/com/example/fraud/FraudDetectionController.java[tags=initial_impl,indent=0] } ---- -==== Then you can run the following commands: -==== [source,bash,indent=0] ---- $ git checkout -b contract-change-pr master $ git pull https://your-git-server.com/server-side-fork.git contract-change-pr ---- -==== You must add the dependencies needed by the autogenerated tests, as follows: -==== [source,xml,indent=0] ---- -include:../:{introduction_url}/samples/standalone/dsl/http-server/pom.xml[tags=verifier_test_dependencies,indent=0] +include::{samples_path}/standalone/dsl/http-server/pom.xml[tags=verifier_test_dependencies,indent=0] ---- -==== In the configuration of the Maven plugin, you must pass the `packageWithBaseClasses` property, as follows: -==== [source,xml,indent=0] ---- -include:../:{introduction_url}/samples/standalone/dsl/http-server/pom.xml[tags=contract_maven_plugin,indent=0] +include::{samples_path}/standalone/dsl/http-server/pom.xml[tags=contract_maven_plugin,indent=0] ---- -==== IMPORTANT: This example uses "`convention-based`" naming by setting the `packageWithBaseClasses` property. Doing so means that the two last packages combine to @@ -433,16 +400,13 @@ or whatever is necessary. In this case, you should use https://github.com/rest-a start the server side `FraudDetectionController`. The following listing shows the `FraudBase` class: -==== [source,java,indent=0] ---- -include:../:{introduction_url}/samples/standalone/dsl/http-server/src/test/java/com/example/fraud/FraudBase.java[] +include::{samples_path}/standalone/dsl/http-server/src/test/java/com/example/fraud/FraudBase.java[] ---- -==== Now, if you run the `./mvnw clean install`, you get something like the following output: -==== [source,bash,indent=0] ---- Results : @@ -450,13 +414,11 @@ Results : Tests in error: ContractVerifierTest.validate_shouldMarkClientAsFraud:32 » IllegalState Parsed... ---- -==== This error occurs because you have a new contract from which a test was generated, and it failed since you have not implemented the feature. The auto-generated test would look like the following test method: -==== [source,java,indent=0] ---- @Test @@ -479,7 +441,6 @@ public void validate_shouldMarkClientAsFraud() throws Exception { assertThatJson(parsedJson).field("['rejection.reason']").isEqualTo("Amount too high"); } ---- -==== If you used the Groovy DSL, you can see that all the `producer()` parts of the Contract that were present in the `value(consumer(...), producer(...))` blocks got injected into the test. @@ -497,15 +458,13 @@ in the response. In other words, you have the `red` part of `red`, `green`, and Because you know the expected input and expected output, you can write the missing implementation as follows: -==== [source,java,indent=0] ---- -include:../:{introduction_url}/samples/standalone/dsl/http-server/src/main/java/com/example/fraud/FraudDetectionController.java[tags=server_api,indent=0] -include:../:{introduction_url}/samples/standalone/dsl/http-server/src/main/java/com/example/fraud/FraudDetectionController.java[tags=new_impl,indent=0] -include:../:{introduction_url}/samples/standalone/dsl/http-server/src/main/java/com/example/fraud/FraudDetectionController.java[tags=initial_impl,indent=0] +include::{samples_path}/standalone/dsl/http-server/src/main/java/com/example/fraud/FraudDetectionController.java[tags=server_api,indent=0] +include::{samples_path}/standalone/dsl/http-server/src/main/java/com/example/fraud/FraudDetectionController.java[tags=new_impl,indent=0] +include::{samples_path}/standalone/dsl/http-server/src/main/java/com/example/fraud/FraudDetectionController.java[tags=initial_impl,indent=0] } ---- -==== When you run `./mvnw clean install` again, the tests pass. Since the Spring Cloud Contract Verifier plugin adds the tests to the `generated-test-sources`, you can @@ -517,14 +476,12 @@ actually run those tests from your IDE. Once you finish your work, you can deploy your changes. To do so, you must first merge the branch by running the following commands: -==== [source,bash,indent=0] ---- $ git checkout master $ git merge --no-ff contract-change-pr $ git push origin master ---- -==== Your CI might run a command such as `./mvnw clean deploy`, which would publish both the application and the stub artifacts. @@ -560,13 +517,11 @@ The following UML diagram shows the final state of the process: The following commands show one way to merge a branch into master with Git: -==== [source,bash,indent=0] ---- $ git checkout master $ git merge --no-ff contract-change-pr ---- -==== [[getting-started-cdc-consumer-final-online]] === Working Online @@ -577,12 +532,10 @@ side are automatically downloaded from Nexus/Artifactory. You can set the value `stubsMode` to `REMOTE`. The following code shows an example of achieving the same thing by changing the properties: -==== [source,yaml,indent=0] ---- -include:../:{introduction_url}/samples/standalone/dsl/http-client/src/test/resources/application-test-repo.yaml[] +include::{samples_path}/standalone/dsl/http-client/src/test/resources/application-test-repo.yaml[] ---- -==== That's it. You have finished the tutorial. diff --git a/docs/modules/ROOT/pages/getting-started/first-application.adoc b/docs/modules/ROOT/pages/getting-started/first-application.adoc index e710eeda2e..f9cb08e385 100644 --- a/docs/modules/ROOT/pages/getting-started/first-application.adoc +++ b/docs/modules/ROOT/pages/getting-started/first-application.adoc @@ -1,6 +1,8 @@ [[getting-started-first-application]] = Developing Your First Spring Cloud Contract-based Application +include::partial$_attributes.adoc[] + This brief tour walks through using Spring Cloud Contract. It consists of the following topics: * xref:getting-started/first-application.adoc#getting-started-first-application-producer[On the Producer Side] @@ -13,7 +15,23 @@ For the sake of this example, the `Stub Storage` is Nexus/Artifactory. The following UML diagram shows the relationship of the parts of Spring Cloud Contract: -image::getting-started-three-second.png[Getting started first application] +[plantuml, getting-started-three-second, png] +---- +"API Producer"->"API Producer": add Spring Cloud \nContract (SCC) plugin +"API Producer"->"API Producer": add SCC Verifier dependency +"API Producer"->"API Producer": define contracts +"API Producer"->"Build": run build +"Build"->"SCC Plugin": generate \ntests, stubs and stubs \nartifact (e.g. stubs-jar) +"Build"->"Stub Storage": upload contracts \nand stubs and the project arifact +"Build"->"API Producer": Build successful +"API Consumer"->"API Consumer": add SCC Stub Runner \ndependency +"API Consumer"->"API Consumer": write a SCC Stub Runner \nbased contract test +"SCC Stub Runner"->"Stub Storage": test asks for [API Producer] stubs +"Stub Storage"->"SCC Stub Runner": fetch the [API Producer] stubs +"SCC Stub Runner"->"SCC Stub Runner": run in memory\n HTTP server stubs +"API Consumer"->"SCC Stub Runner": send a request \nto the HTTP server stub +"SCC Stub Runner"->"API Consumer": communication is correct +---- [[getting-started-first-application-producer]] == On the Producer Side @@ -21,17 +39,14 @@ image::getting-started-three-second.png[Getting started first application] To start working with `Spring Cloud Contract`, you can add the Spring Cloud Contract Verifier dependency and plugin to your build file, as the following example shows: -==== [source,xml,indent=0] ---- -include:../:{introduction_url}/samples/standalone/dsl/http-server/pom.xml[tags=verifier_test_dependencies,indent=0] +include::{samples_path}/standalone/dsl/http-server/pom.xml[tags=verifier_test_dependencies,indent=0] ---- -==== The following listing shows how to add the plugin, which should go in the build/plugins portion of the file: -==== [source,xml,indent=0] ---- @@ -41,7 +56,6 @@ portion of the file: true ---- -==== [TIP] ==== @@ -64,9 +78,11 @@ For the HTTP stubs, a contract defines what kind of response should be returned given request (taking into account the HTTP methods, URLs, headers, status codes, and so on). The following example shows an HTTP stub contract in both Groovy and YAML: -==== +[tabs] +====== +groovy:: ++ [source,groovy,indent=0,role="primary"] -.groovy ---- package contracts @@ -95,8 +111,9 @@ org.springframework.cloud.contract.spec.Contract.make { } ---- +yaml:: ++ [source,yaml,indent=0,role="secondary"] -.yaml ---- request: method: PUT @@ -119,7 +136,7 @@ response: headers: Content-Type: application/json;charset=UTF-8 ---- -==== +====== If you need to use messaging, you can define: @@ -130,19 +147,22 @@ was sent, the message body, and the header). The following example shows a Camel messaging contract: -==== +[tabs] +====== +groovy:: ++ [source,groovy,indent=0,role="primary"] -.groovy ---- -include:../:{verifier_core_path}/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MessagingMethodBodyBuilderSpec.groovy[tags=trigger_method_dsl] +include::{verifier_root_path}/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MessagingMethodBodyBuilderSpec.groovy[tags=trigger_method_dsl] ---- +yaml:: ++ [source,yaml,indent=0,role="secondary"] -.yaml ---- -include:../:{verifier_core_path}/src/test/resources/yml/contract_message_scenario1.yml[indent=0] +include::{verifier_root_path}/src/test/resources/yml/contract_message_scenario1.yml[indent=0] ---- -==== +====== Running `./mvnw clean install` automatically generates tests that verify the application compliance with the added contracts. By default, the generated tests are under @@ -163,9 +183,11 @@ of the other frameworks, add its library to your classpath. The following listing shows samples for all frameworks: -==== +[tabs] +====== +mockmvc:: ++ [source,java,indent=0,role="primary"] -.mockmvc ---- @Test public void validate_shouldMarkClientAsFraud() throws Exception { @@ -188,8 +210,9 @@ public void validate_shouldMarkClientAsFraud() throws Exception { } ---- +jaxrs:: ++ [source,java,indent=0,role="secondary"] -.jaxrs ---- @SuppressWarnings("rawtypes") public class FooTest { @@ -225,8 +248,9 @@ public class FooTest { } ---- +webtestclient:: ++ [source,java,indent=0,role="secondary"] -.webtestclient ---- @Test public void validate_shouldRejectABeerIfTooYoung() throws Exception { @@ -247,7 +271,7 @@ public class FooTest { assertThatJson(parsedJson).field("['status']").isEqualTo("NOT_OK"); } ---- -==== +====== As the implementation of the functionalities described by the contracts is not yet present, the tests fail. @@ -260,7 +284,6 @@ contain all the setup necessary information needed to run them (for example, The following example, from `pom.xml`, shows how to specify the base test class: -==== [source,xml,indent=0] ---- @@ -283,11 +306,9 @@ The following example, from `pom.xml`, shows how to specify the base test class: ---- <1> The `baseClassForTests` element lets you specify your base test class. It must be a child of a `configuration` element within `spring-cloud-contract-maven-plugin`. -==== The following example shows a minimal (but functional) base test class: -==== [source,java, indent=0] ---- package com.example.contractTest; @@ -304,7 +325,6 @@ public class BaseTestClass { } } ---- -==== This minimal class really is all you need to get your tests to work. It serves as a starting place to which the automatically generated tests attach. @@ -312,7 +332,6 @@ starting place to which the automatically generated tests attach. Now we can move on to the implementation. For that, we first need a data class, which we then use in our controller. The following listing shows the data class: -==== [source,java, indent=0] ---- package com.example.Test; @@ -343,7 +362,6 @@ public class LoanRequest { } } ---- -==== The preceding class provides an object in which we can store the parameters. Because the client ID in the contract is called `client.id`, we need to use the @@ -351,7 +369,6 @@ client ID in the contract is called `client.id`, we need to use the Now we can move along to the controller, which the following listing shows: -==== [source,java, indent=0] ---- package com.example.docTest; @@ -379,7 +396,6 @@ public class FraudController { <3> If it is too much, we return the JSON (created with a simple string here) that the test expects. <4> If we had a test to catch when the amount is allowable, we could match it to this output. -==== The `FraudController` is about as simple as things get. You can do much more, including logging, validating the client ID, and so on. @@ -389,7 +405,6 @@ application and the stub artifacts are built and installed in the local Maven re Information about installing the stubs jar to the local repository appears in the logs, as the following example shows: -==== [source,bash,indent=0] ---- [INFO] --- spring-cloud-contract-maven-plugin:1.0.0.BUILD-SNAPSHOT:generateStubs (default-generateStubs) @ http-server --- @@ -405,7 +420,6 @@ the following example shows: [INFO] Installing /some/path/http-server/pom.xml to /path/to/your/.m2/repository/com/example/http-server/0.0.1-SNAPSHOT/http-server-0.0.1-SNAPSHOT.pom [INFO] Installing /some/path/http-server/target/http-server-0.0.1-SNAPSHOT-stubs.jar to /path/to/your/.m2/repository/com/example/http-server/0.0.1-SNAPSHOT/http-server-0.0.1-SNAPSHOT-stubs.jar ---- -==== You can now merge the changes and publish both the application and the stub artifacts in an online repository. @@ -418,12 +432,10 @@ WireMock instance or messaging route that simulates the actual service. To get started, add the dependency to `Spring Cloud Contract Stub Runner`, as follows: -==== [source,xml,indent=0] ---- -include:../:{introduction_url}/samples/standalone/dsl/http-client/pom.xml[tags=stub_runner,indent=0] +include::{samples_path}/standalone/dsl/http-client/pom.xml[tags=stub_runner,indent=0] ---- -==== You can get the Producer-side stubs installed in your Maven repository in either of two ways: @@ -431,13 +443,11 @@ ways: * By checking out the Producer side repository and adding contracts and generating the stubs by running the following commands: + -==== [source,bash,indent=0] ---- $ cd local-http-server-repo $ ./mvnw clean install -DskipTests ---- -==== NOTE: The tests are skipped because the Producer-side contract implementation is not yet in place, so the automatically-generated contract tests fail. @@ -445,18 +455,15 @@ in place, so the automatically-generated contract tests fail. pass the stub artifact IDs and artifact repository URL as `Spring Cloud Contract Stub Runner` properties, as the following example shows: + -==== [source,yaml,indent=0] ---- -include:../:{introduction_url}/samples/standalone/dsl/http-client/src/test/resources/application-test-repo.yaml[] +include::{samples_path}/standalone/dsl/http-client/src/test/resources/application-test-repo.yaml[] ---- -==== Now you can annotate your test class with `@AutoConfigureStubRunner`. In the annotation, provide the `group-id` and `artifact-id` for `Spring Cloud Contract Stub Runner` to run the collaborators' stubs for you, as the following example shows: -==== [source,java, indent=0] ---- @RunWith(SpringRunner.class) @@ -467,7 +474,6 @@ public class LoanApplicationServiceTests { . . . } ---- -==== TIP: Use the `REMOTE` `stubsMode` when downloading stubs from an online repository and `LOCAL` for offline work. @@ -476,7 +482,6 @@ In your integration test, you can receive stubbed versions of HTTP responses or that are expected to be emitted by the collaborator service. You can see entries similar to the following in the build logs: -==== [source,bash,indent=0] ---- 2016-07-19 14:22:25.403 INFO 41050 --- [ main] o.s.c.c.stubrunner.AetherStubDownloader : Desired version is + - will try to resolve the latest version @@ -487,5 +492,4 @@ to the following in the build logs: 2016-07-19 14:22:25.475 INFO 41050 --- [ main] o.s.c.c.stubrunner.AetherStubDownloader : Unpacked file to [/var/folders/0p/xwq47sq106x1_g3dtv6qfm940000gq/T/contracts100276532569594265] 2016-07-19 14:22:27.737 INFO 41050 --- [ main] o.s.c.c.stubrunner.StubRunnerExecutor : All stubs are now running RunningStubs [namesAndPorts={com.example:http-server:0.0.1-SNAPSHOT:stubs=8080}] ---- -==== diff --git a/docs/modules/ROOT/pages/getting-started/introducing-spring-cloud-contract.adoc b/docs/modules/ROOT/pages/getting-started/introducing-spring-cloud-contract.adoc index 4cedb1d226..2f1a53bf74 100644 --- a/docs/modules/ROOT/pages/getting-started/introducing-spring-cloud-contract.adoc +++ b/docs/modules/ROOT/pages/getting-started/introducing-spring-cloud-contract.adoc @@ -1,6 +1,8 @@ [[getting-started-introducing-spring-cloud-contract]] = Introducing Spring Cloud Contract +include::partial$_attributes.adoc[] + Spring Cloud Contract moves TDD to the level of software architecture. It lets you perform consumer-driven and producer-driven contract testing. @@ -106,21 +108,23 @@ amount it wants to borrow from us. You also want to send it to the `/fraudcheck` the `PUT` method. The following listing shows a contract to check whether a client should be marked as a fraud in both Groovy and YAML: -==== +[tabs] +====== +groovy:: ++ [source,groovy,indent=0,role="primary"] -.groovy ---- -include:../:{introduction_url}/samples/standalone/dsl/http-server/src/test/resources/contracts/fraud/shouldMarkClientAsFraud.groovy[] +include::{samples_path}/standalone/dsl/http-server/src/test/resources/contracts/fraud/shouldMarkClientAsFraud.groovy[] ---- +====== //// //// [source,yaml,indent=0,role="secondary"] .yaml ---- -include:../:{introduction_url}/samples/standalone/dsl/http-server/src/test/resources/contracts/yml/fraud/shouldMarkClientAsFraud.yml[] +include::{samples_path}/standalone/dsl/http-server/src/test/resources/contracts/yml/fraud/shouldMarkClientAsFraud.yml[] ---- -==== IMPORTANT: It is expected that contracts are coming from a **trusted source**. You should never download nor interact with contracts coming from untrusted locations. diff --git a/docs/modules/ROOT/pages/getting-started/three-second-tour.adoc b/docs/modules/ROOT/pages/getting-started/three-second-tour.adoc index e1857b0b46..b35ebed07e 100644 --- a/docs/modules/ROOT/pages/getting-started/three-second-tour.adoc +++ b/docs/modules/ROOT/pages/getting-started/three-second-tour.adoc @@ -1,6 +1,8 @@ [[getting-started-three-second-tour]] = A Three-second Tour +include::partial$_attributes.adoc[] + This very brief tour walks through using Spring Cloud Contract. It consists of the following topics: @@ -40,17 +42,14 @@ expressed in either Groovy DSL or YAML to the contracts directory, which is set Then you can add the Spring Cloud Contract Verifier dependency and plugin to your build file, as the following example shows: -==== [source,xml,indent=0] ---- -include:../:{introduction_url}/samples/standalone/dsl/http-server/pom.xml[tags=verifier_test_dependencies,indent=0] +include::{samples_path}/standalone/dsl/http-server/pom.xml[tags=verifier_test_dependencies,indent=0] ---- -==== The following listing shows how to add the plugin, which should go in the build/plugins portion of the file: -==== [source,xml,indent=0] ---- @@ -60,7 +59,6 @@ portion of the file: true ---- -==== Running `./mvnw clean install` automatically generates tests that verify the application compliance with the added contracts. By default, the tests get generated under @@ -77,7 +75,6 @@ controller setup or messaging test setup). The following example, from `pom.xml`, shows how to specify the base test class: -==== [source,xml,indent=0] ---- @@ -100,7 +97,6 @@ The following example, from `pom.xml`, shows how to specify the base test class: ---- <1> The `baseClassForTests` element lets you specify your base test class. It must be a child of a `configuration` element within `spring-cloud-contract-maven-plugin`. -==== Once the implementation and the test base class are in place, the tests pass, and both the application and the stub artifacts are built and installed in the local Maven repository. @@ -116,12 +112,10 @@ WireMock instance or messaging route that simulates the actual service. To do so, add the dependency to `Spring Cloud Contract Stub Runner`, as the following example shows: -==== [source,xml,indent=0] ---- -include:../:{introduction_url}/samples/standalone/dsl/http-client/pom.xml[tags=stub_runner,indent=0] +include::{samples_path}/standalone/dsl/http-client/pom.xml[tags=stub_runner,indent=0] ---- -==== You can get the Producer-side stubs installed in your Maven repository in either of two ways: @@ -129,13 +123,11 @@ ways: * By checking out the Producer side repository and adding contracts and generating the stubs by running the following commands: + -==== [source,bash,indent=0] ---- $ cd local-http-server-repo $ ./mvnw clean install -DskipTests ---- -==== TIP: The tests are being skipped because the producer-side contract implementation is not in place yet, so the automatically-generated contract tests fail. @@ -144,18 +136,15 @@ in place yet, so the automatically-generated contract tests fail. pass the stub artifact IDs and artifact repository URL as `Spring Cloud Contract Stub Runner` properties, as the following example shows: + -==== [source,yaml,indent=0] ---- -include:../:{introduction_url}/samples/standalone/dsl/http-client/src/test/resources/application-test-repo.yaml[] +include::{samples_path}/standalone/dsl/http-client/src/test/resources/application-test-repo.yaml[] ---- -==== Now you can annotate your test class with `@AutoConfigureStubRunner`. In the annotation, provide the `group-id` and `artifact-id` values for `Spring Cloud Contract Stub Runner` to run the collaborators' stubs for you, as the following example shows: -==== [source,java, indent=0] ---- @RunWith(SpringRunner.class) @@ -166,7 +155,6 @@ public class LoanApplicationServiceTests { . . . } ---- -==== TIP: Use the `REMOTE` `stubsMode` when downloading stubs from an online repository and `LOCAL` for offline work. diff --git a/docs/modules/ROOT/pages/getting-started/whats-next.adoc b/docs/modules/ROOT/pages/getting-started/whats-next.adoc index 35d3a5d4b2..795ea65e13 100644 --- a/docs/modules/ROOT/pages/getting-started/whats-next.adoc +++ b/docs/modules/ROOT/pages/getting-started/whats-next.adoc @@ -1,6 +1,8 @@ [[getting-started-whats-next]] = Next Steps +include::partial$_attributes.adoc[] + Hopefully, this section provided some of the {project-full-name} basics and got you on your way to writing your own applications. If you are a task-oriented type of developer, you might want to jump over to https://spring.io and check out some diff --git a/docs/modules/ROOT/pages/gradle-project.adoc b/docs/modules/ROOT/pages/gradle-project.adoc index abb4f6b6ae..723d1a900f 100644 --- a/docs/modules/ROOT/pages/gradle-project.adoc +++ b/docs/modules/ROOT/pages/gradle-project.adoc @@ -1,23 +1,7 @@ [[gradle-project]] = Gradle Project -To learn how to set up the Gradle project for Spring Cloud Contract Verifier, read the -following sections: - -* xref:gradle-project.adoc#gradle-prerequisites[Prerequisites] -* xref:gradle-project.adoc#gradle-add-gradle-plugin[Add Gradle Plugin with Dependencies] -* xref:gradle-project.adoc#gradle-and-rest-assured[Gradle and Rest Assured 2.0] -* xref:gradle-project.adoc#gradle-snapshot-versions[Snapshot Versions for Gradle] -* xref:gradle-project.adoc#gradle-add-stubs[Add stubs] -* xref:gradle-project.adoc#gradle-default-setup[Default Setup] -* xref:gradle-project.adoc#gradle-configure-plugin[Configuring the Plugin] -* xref:gradle-project.adoc#gradle-configuration-options[Configuration Options] -* xref:gradle-project.adoc#gradle-single-base-class[Single Base Class for All Tests] -* xref:gradle-project.adoc#gradle-different-base-classes[Different Base Classes for Contracts] -* xref:gradle-project.adoc#gradle-invoking-generated-tests[Invoking Generated Tests] -* xref:gradle-project.adoc#gradle-publishing-stubs-to-artifact-repo[Publishing Stubs to Artifact Repository] -* xref:gradle-project.adoc#gradle-pushing-stubs-to-scm[Pushing Stubs to SCM] -* xref:gradle-project.adoc#gradle-consumer[Spring Cloud Contract Verifier on the Consumer Side] +include::partial$_attributes.adoc[] [[gradle-prerequisites]] == Prerequisites @@ -34,39 +18,42 @@ documentation] for more information. To add a Gradle plugin with dependencies, you can use code similar to the following: -==== +[tabs] +====== +Plugin DSL GA versions:: ++ [source,groovy,indent=0,subs="verbatim,attributes",role="primary"] -.Plugin DSL GA versions ---- // build.gradle plugins { id "groovy" // this will work only for GA versions of Spring Cloud Contract - id "org.springframework.cloud.contract" version "${GAVerifierVersion}" + id "org.springframework.cloud.contract" version "$\{GAVerifierVersion}" } dependencyManagement { imports { - mavenBom "org.springframework.cloud:spring-cloud-contract-dependencies:${GAVerifierVersion}" + mavenBom "org.springframework.cloud:spring-cloud-contract-dependencies:$\{GAVerifierVersion}" } } dependencies { - testImplementation "org.apache.groovy:groovy-all:${groovyVersion}" + testImplementation "org.apache.groovy:groovy-all:$\{groovyVersion}" // example with adding Spock core and Spock Spring - testImplementation "org.spockframework:spock-core:${spockVersion}" - testImplementation "org.spockframework:spock-spring:${spockVersion}" + testImplementation "org.spockframework:spock-core:$\{spockVersion}" + testImplementation "org.spockframework:spock-spring:$\{spockVersion}" testImplementation 'org.springframework.cloud:spring-cloud-starter-contract-verifier' } ---- +Plugin DSL non GA versions:: ++ [source,groovy,indent=0,subs="verbatim,attributes",role="secondary"] -.Plugin DSL non GA versions ---- // settings.gradle pluginManagement { plugins { - id "org.springframework.cloud.contract" version "${verifierVersion}" + id "org.springframework.cloud.contract" version "$\{verifierVersion}" } repositories { // to pick from local .m2 @@ -88,21 +75,22 @@ plugins { dependencyManagement { imports { - mavenBom "org.springframework.cloud:spring-cloud-contract-dependencies:${verifierVersion}" + mavenBom "org.springframework.cloud:spring-cloud-contract-dependencies:$\{verifierVersion}" } } dependencies { - testImplementation "org.apache.groovy:groovy-all:${groovyVersion}" + testImplementation "org.apache.groovy:groovy-all:$\{groovyVersion}" // example with adding Spock core and Spock Spring - testImplementation "org.spockframework:spock-core:${spockVersion}" - testImplementation "org.spockframework:spock-spring:${spockVersion}" + testImplementation "org.spockframework:spock-core:$\{spockVersion}" + testImplementation "org.spockframework:spock-spring:$\{spockVersion}" testImplementation 'org.springframework.cloud:spring-cloud-starter-contract-verifier' } ---- +Legacy Plugin Application:: ++ [source,groovy,indent=0,subs="verbatim,attributes",role="secondary"] -.Legacy Plugin Application ---- // build.gradle buildscript { @@ -110,10 +98,10 @@ buildscript { mavenCentral() } dependencies { - classpath "org.springframework.boot:spring-boot-gradle-plugin:${springboot_version}" - classpath "org.springframework.cloud:spring-cloud-contract-gradle-plugin:${verifier_version}" + classpath "org.springframework.boot:spring-boot-gradle-plugin:$\{springboot_version}" + classpath "org.springframework.cloud:spring-cloud-contract-gradle-plugin:$\{verifier_version}" // here you can also pass additional dependencies such as Kotlin spec e.g.: - // classpath "org.springframework.cloud:spring-cloud-contract-spec-kotlin:${verifier_version}" + // classpath "org.springframework.cloud:spring-cloud-contract-spec-kotlin:$\{verifier_version}" } } @@ -122,19 +110,19 @@ apply plugin: 'org.springframework.cloud.contract' dependencyManagement { imports { - mavenBom "org.springframework.cloud:spring-cloud-contract-dependencies:${verifier_version}" + mavenBom "org.springframework.cloud:spring-cloud-contract-dependencies:$\{verifier_version}" } } dependencies { - testImplementation "org.apache.groovy:groovy-all:${groovyVersion}" + testImplementation "org.apache.groovy:groovy-all:$\{groovyVersion}" // example with adding Spock core and Spock Spring - testImplementation "org.spockframework:spock-core:${spockVersion}" - testImplementation "org.spockframework:spock-spring:${spockVersion}" + testImplementation "org.spockframework:spock-core:$\{spockVersion}" + testImplementation "org.spockframework:spock-spring:$\{spockVersion}" testImplementation 'org.springframework.cloud:spring-cloud-starter-contract-verifier' } ---- -==== +====== [[gradle-and-rest-assured]] == Gradle and Rest Assured 2.0 @@ -142,7 +130,6 @@ dependencies { By default, Rest Assured 3.x is added to the classpath. However, to use Rest Assured 2.x, you can add it instead, as the following listing shows: -==== [source,groovy,indent=0] ---- buildscript { @@ -150,8 +137,8 @@ buildscript { mavenCentral() } dependencies { - classpath "org.springframework.boot:spring-boot-gradle-plugin:${springboot_version}" - classpath "org.springframework.cloud:spring-cloud-contract-gradle-plugin:${verifier_version}" + classpath "org.springframework.boot:spring-boot-gradle-plugin:$\{springboot_version}" + classpath "org.springframework.cloud:spring-cloud-contract-gradle-plugin:$\{verifier_version}" } } @@ -162,7 +149,6 @@ dependencies { testCompile "com.jayway.restassured:spring-mock-mvc:2.5.0" } ---- -==== That way, the plugin automatically sees that Rest Assured 2.x is present on the classpath and modifies the imports accordingly. @@ -173,13 +159,11 @@ and modifies the imports accordingly. You can add the additional snapshot repository to your `settings.gradle` to use snapshot versions, which are automatically uploaded after every successful build, as the following listing shows: -==== [source,groovy,indent=0] ---- include::{standalone_samples_path}/http-server/settings.gradle[tags=repos,indent=0] } ---- -==== [[gradle-add-stubs]] == Add stubs @@ -190,8 +174,8 @@ will also look for contracts in `src/test/resources/contracts`, however, this di is deprecated as of Spring Cloud Contract 3.0.0. It should also be noted, that with this new Gradle source set, you should also migrate -any base classes used within your contract tests to `src/contractTest/{language}` where -`{language}` should be replaced with Java or Groovy as needed for your purposes. +any base classes used within your contract tests to `src/contractTest/\{language}` where +`\{language}` should be replaced with Java or Groovy as needed for your purposes. The directory that contains stub definitions is treated as a class name, and each stub definition is treated as a single test. Spring Cloud Contract Verifier assumes that it @@ -199,13 +183,11 @@ contains at least one level of directories that are to be used as the test class If more than one level of nested directories is present, all except the last one is used as the package name. Consider the following structure: -==== [source,groovy,indent=0] ---- src/contractTest/resources/contracts/myservice/shouldCreateUser.groovy src/contractTest/resources/contracts/myservice/shouldReturnUser.groovy ---- -==== Given the preceding structure, Spring Cloud Contract Verifier creates a test class named `defaultBasePackage.MyService` with two methods: @@ -226,18 +208,17 @@ tests, invoke the `generateContractTests` task. The default Gradle Plugin setup creates the following Gradle part of the build (in pseudocode): -==== [source,groovy,indent=0] ---- contracts { testFramework ='JUNIT' testMode = 'MockMvc' - generatedTestJavaSourcesDir = project.file("${project.buildDir}/generated-test-sources/contractTest/java") - generatedTestGroovySourcesDir = project.file("${project.buildDir}/generated-test-sources/contractTest/groovy") - generatedTestResourcesDir = project.file("${project.buildDir}/generated-test-resources/contracts") - contractsDslDir = project.file("${project.projectDir}/src/contractTest/resources/contracts") + generatedTestJavaSourcesDir = project.file("$\{project.buildDir}/generated-test-sources/contractTest/java") + generatedTestGroovySourcesDir = project.file("$\{project.buildDir}/generated-test-sources/contractTest/groovy") + generatedTestResourcesDir = project.file("$\{project.buildDir}/generated-test-resources/contracts") + contractsDslDir = project.file("$\{project.projectDir}/src/contractTest/resources/contracts") basePackageForTests = 'org.springframework.cloud.verifier.tests' - stubsOutputDir = project.file("${project.buildDir}/stubs") + stubsOutputDir = project.file("$\{project.buildDir}/stubs") sourceSet = null } @@ -254,7 +235,6 @@ def copyContracts = tasks.register(type: Copy, name: 'copyContracts') { verifierStubsJar.dependsOn copyContracts ---- -==== [[gradle-configure-plugin]] == Configuring the Plugin @@ -262,7 +242,6 @@ verifierStubsJar.dependsOn copyContracts To change the default configuration, you can add a `contracts` snippet to your Gradle configuration, as the following listing shows: -==== [source,groovy,indent=0] ---- contracts { @@ -271,11 +250,9 @@ contracts { generatedTestJavaSourcesDir = project.file('src/generatedContract') } ---- -==== To download contracts from a remote source, you can use the following snippets as needed: -==== [source,groovy,indent=0] ---- contracts { @@ -300,22 +277,19 @@ contracts { contractsPath = '' } ---- -==== Since we are using Gradle's Jar packaging task, there are several options and capabilities that you may wish to utilize to further extend what is created by the `verifierStubsJar`. In order to do this, you would use the native mechanisms provided directly by Gradle for customizing an existing task like so: NOTE: for the sake of the example, we desire to add a `git.properties` file to the `verifierStubsJar`. -==== [source,groovy,inden=0] ---- verifierStubsJar { - from("${buildDir}/resources/main/") { + from("$\{buildDir}/resources/main/") { include("git.properties") } } ---- -==== It should also be noted that as of 3.0.0, the default publication has been disabled. As a result this means, that you are able to create any named jar and publish it as you would normally have done via Gradle configuration options. This means that you can build a jar file customized just the way you would like and publish that for absolute full control over the jar's layout and contents. @@ -399,12 +373,10 @@ When using Spring Cloud Contract Verifier in MockMvc (the default), you need to specification for all generated acceptance tests. In this class, you need to point to an endpoint, which should be verified. The following example shows how to do so: -==== [source,groovy,indent=0] ---- include::{plugins_path}/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/bootSimple/src/test/groovy/org/springframework/cloud/contract/verifier/twitter/places/BaseMockMvcSpec.groovy[tags=base_class,indent=0] ---- -==== If you use `Explicit` mode, you can use a base class to initialize the whole tested application, as you might see in regular integration tests. If you use the `JAXRSCLIENT` mode, this @@ -454,12 +426,10 @@ generated from `src/contractTest/resources/contract/com/` contracts extend the To ensure that the provider side is compliant with your defined contracts, you need to run the following command: -==== [source,bash,indent=0] ---- ./gradlew contractTest ---- -==== [[gradle-publishing-stubs-to-artifact-repo]] == Publishing Stubs to Artifact Repository @@ -469,7 +439,6 @@ you will need to configure the publishing section for Gradle to include the `verifierStubsJar`. To do that, you can use the example configuration below: -==== [source,groovy,indent=0] ---- apply plugin: 'maven-publish' @@ -484,7 +453,6 @@ publishing { } } ---- -==== Since 3.0.0, the internal stubs publication has been deprecated and disabled by default. It is recommended to include the @@ -498,12 +466,10 @@ stubs, you might want to automate the step of pushing stubs to the repository. To do that, you can call the `pushStubsToScm` task by running the following command: -==== [source,bash,indent=0] ---- $ ./gradlew pushStubsToScm ---- -==== Under xref:advanced.adoc#scm-stub-downloader[Using the SCM Stub Downloader], you can find all possible configuration options that you can pass either through @@ -519,19 +485,16 @@ in exactly the same way as in the case of a provider. If you do not want to use you need to copy the contracts stored in `src/contractTest/resources/contracts` and generate WireMock JSON stubs by using the following command: -==== [source,bash,indent=0] ---- ./gradlew generateClientStubs ---- -==== NOTE: The `stubsOutputDir` option has to be set for stub generation to work. When present, you can use JSON stubs in automated tests to consume a service. The following example shows how to do so: -==== [source,groovy,indent=0] ---- @ContextConfiguration(loader == SpringApplicationContextLoader, classes == Application) @@ -556,7 +519,6 @@ class LoanApplicationServiceSpec extends Specification { } } ---- -==== In the preceding example, `LoanApplication` makes a call to the `FraudDetection` service. This request is handled by a WireMock server configured with stubs that were generated by diff --git a/docs/modules/ROOT/pages/howto.adoc b/docs/modules/ROOT/pages/howto.adoc index f266a48551..fe16d5a8a5 100644 --- a/docs/modules/ROOT/pages/howto.adoc +++ b/docs/modules/ROOT/pages/howto.adoc @@ -2,6 +2,8 @@ = "`How-to`" Guides :page-section-summary-toc: 1 +include::partial$_attributes.adoc[] + This section provides answers to some common "`how do I do that...?`" questions that often arise when using {project-full-name}. Its coverage is not exhaustive, but it does cover quite a lot. diff --git a/docs/modules/ROOT/pages/howto/contract-dsl-rest-docs.adoc b/docs/modules/ROOT/pages/howto/contract-dsl-rest-docs.adoc index 8726df5a42..90713615a9 100644 --- a/docs/modules/ROOT/pages/howto/contract-dsl-rest-docs.adoc +++ b/docs/modules/ROOT/pages/howto/contract-dsl-rest-docs.adoc @@ -1,40 +1,48 @@ [[contract-dsl-rest-docs]] = How Can I Generate Spring REST Docs Snippets from the Contracts? +include::partial$_attributes.adoc[] + When you want to include the requests and responses of your API by using Spring REST Docs, you only need to make some minor changes to your setup if you are using MockMvc and RestAssuredMockMvc. To do so, include the following dependencies (if you have not already done so): -==== +[tabs] +====== +maven:: ++ [source,xml,indent=0,subs="verbatim,attributes",role="primary"] -.maven ---- -include:../:{standalone_restdocs_path}/http-server/pom.xml[tags=dependencies,indent=0] +include::{standalone_restdocs_path}/http-server/pom.xml[tags=dependencies,indent=0] ---- +gradle:: ++ [source,groovy,indent=0,subs="verbatim,attributes",role="secondary"] -.gradle ---- -include:../:{standalone_restdocs_path}/http-server/build.gradle[tags=dependencies,indent=0] +include::{standalone_restdocs_path}/http-server/build.gradle[tags=dependencies,indent=0] ---- -==== +====== Next, you need to make some changes to your base class. The following examples use `WebAppContext` and the standalone option with RestAssured: -==== +[tabs] +====== +WebAppContext:: ++ [source,java,indent=0,subs="verbatim,attributes",role="primary"] -.WebAppContext ---- -include:../:{standalone_restdocs_path}/http-server/src/test/java/com/example/fraud/FraudBaseWithWebAppSetup.java[tags=base_class,indent=0] +include::{standalone_restdocs_path}/http-server/src/test/java/com/example/fraud/FraudBaseWithWebAppSetup.java[tags=base_class,indent=0] ---- +Standalone:: ++ [source,java,indent=0,subs="verbatim,attributes",role="secondary"] -.Standalone ---- -include:../:{standalone_restdocs_path}/http-server/src/test/java/com/example/fraud/FraudBaseWithStandaloneSetup.java[tags=base_class,indent=0] +include::{standalone_restdocs_path}/http-server/src/test/java/com/example/fraud/FraudBaseWithStandaloneSetup.java[tags=base_class,indent=0] ---- -==== +====== TIP: You need not specify the output directory for the generated snippets (since version 1.2.0.RELEASE of Spring REST Docs). diff --git a/docs/modules/ROOT/pages/howto/how-to-common-repo-with-contracts.adoc b/docs/modules/ROOT/pages/howto/how-to-common-repo-with-contracts.adoc index 343c325037..b32843dad9 100644 --- a/docs/modules/ROOT/pages/howto/how-to-common-repo-with-contracts.adoc +++ b/docs/modules/ROOT/pages/howto/how-to-common-repo-with-contracts.adoc @@ -1,6 +1,8 @@ [[how-to-common-repo-with-contracts]] = How Can I use a Common Repository with Contracts Instead of Storing Them with the Producer? +include::partial$_attributes.adoc[] + Another way of storing contracts, rather than having them with the producer, is to keep them in a common place. This situation can be related to security issues (where the consumers cannot clone the producer's code). Also, if you keep contracts in a single place, @@ -16,7 +18,6 @@ contracts, you could have the following setup (which you can check out https://github.com/spring-cloud/spring-cloud-contract/tree/{github-tag}/samples/standalone/contracts[here]). The following listing shows such a structure: -==== [source,bash,indent=0] ---- ├── com @@ -36,7 +37,6 @@ The following listing shows such a structure: └── assembly └── contracts.xml ---- -==== Under the slash-delimited `groupid/artifact id` folder (`com/example/server`), you have expectations of the three consumers (`client1`, `client2`, and `client3`). Expectations are the standard Groovy DSL @@ -45,12 +45,10 @@ one-to-one to the contents of the repository. The following example shows a `pom.xml` file inside the `server` folder: -==== [source,xml,indent=0] ---- -include:../:{introduction_url}/samples/standalone/contracts/com/example/server/pom.xml[indent=0] +include::{samples_path}/standalone/contracts/com/example/server/pom.xml[indent=0] ---- -==== There are no dependencies other than the Spring Cloud Contract Maven Plugin. Those `pom.xml` files are necessary for the consumer side to run `mvn clean install -DskipTests` to locally install @@ -58,22 +56,18 @@ the stubs of the producer project. The `pom.xml` file in the root folder can look like the following: -==== [source,xml,indent=0] ---- -include:../:{introduction_url}/samples/standalone/contracts/pom.xml[indent=0] +include::{samples_path}/standalone/contracts/pom.xml[indent=0] ---- -==== It uses the assembly plugin to build the JAR with all the contracts. The following example shows such a setup: -==== [source,xml,indent=0] ---- -include:../:{introduction_url}/samples/standalone/contracts/src/assembly/contracts.xml[indent=0] +include::{samples_path}/standalone/contracts/src/assembly/contracts.xml[indent=0] ---- -==== [[how-to-workflow]] == Workflow @@ -134,12 +128,10 @@ TIP: You need to have https://maven.apache.org/download.cgi[Maven installed loca As a producer, you can alter the Spring Cloud Contract Verifier to provide the URL and the dependency of the JAR that contains the contracts, as follows: -==== [source,xml,indent=0] ---- -include:../:{introduction_url}/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/basic-remote-contracts/pom-with-repo.xml[tags=remote_config,indent=0] +include::{tools_path}/spring-cloud-contract-maven-plugin/src/test/projects/basic-remote-contracts/pom-with-repo.xml[tags=remote_config,indent=0] ---- -==== With this setup, the JAR with a `groupid` of `com.example.standalone` and an `artifactid` of `contracts` is downloaded from `https://link/to/your/nexus/or/artifactory/or/sth`. It is @@ -167,7 +159,6 @@ lets us do so. Also, `contractsPath` need to be specified, since the default pat the common repository `groupid/artifactid`. The following example shows a Maven plugin for Spring Cloud Contract: -==== [source,xml,indent=0] ---- @@ -201,7 +192,6 @@ plugin for Spring Cloud Contract: ---- -==== NOTE: Many of the values in the preceding Maven plugin can be changed. We included it for illustration purposes rather than trying to provide a "`typical`" example. @@ -213,7 +203,6 @@ To work with a Gradle project: . Add a custom configuration for the common repository dependency, as follows: + -==== [source,groovy,indent=0] ---- ext { @@ -228,11 +217,9 @@ configurations { } } ---- -==== . Add the common repository dependency to your classpath, as follows: + -==== [source,groovy,indent=0] ---- dependencies { @@ -240,11 +227,9 @@ dependencies { testCompile "${contractsGroupId}:${contractsArtifactId}:${contractsVersion}" } ---- -==== . Download the dependency to an appropriate folder, as follows: + -==== [source,groovy,indent=0] ---- task getContracts(type: Copy) { @@ -252,11 +237,9 @@ task getContracts(type: Copy) { into new File(project.buildDir, "downloadedContracts") } ---- -==== . Unzip the JAR, as follows: + -==== [source,groovy,indent=0] ---- task unzipContracts(type: Copy) { @@ -267,11 +250,9 @@ task unzipContracts(type: Copy) { into outputDir } ---- -==== . Cleanup unused contracts, as follows: + -==== [source,groovy,indent=0] ---- task deleteUnwantedContracts(type: Delete) { @@ -283,28 +264,23 @@ task deleteUnwantedContracts(type: Delete) { "**/${second-topic}/**"]) } ---- -==== . Create task dependencies, as follows: + -==== [source,groovy,indent=0] ---- unzipContracts.dependsOn("getContracts") deleteUnwantedContracts.dependsOn("unzipContracts") build.dependsOn("deleteUnwantedContracts") ---- -==== . Configure the plugin by specifying the directory that contains the contracts, by setting the `contractsDslDir` property, as follows: + -==== [source,groovy,indent=0] ---- contracts { contractsDslDir = new File("${buildDir}/unpackedContracts") } ---- -==== diff --git a/docs/modules/ROOT/pages/howto/how-to-debug-wiremock.adoc b/docs/modules/ROOT/pages/howto/how-to-debug-wiremock.adoc index 3c888bcb50..85b7729f73 100644 --- a/docs/modules/ROOT/pages/howto/how-to-debug-wiremock.adoc +++ b/docs/modules/ROOT/pages/howto/how-to-debug-wiremock.adoc @@ -2,6 +2,8 @@ = How Can I Debug the Mapping, Request, or Response Being Sent by WireMock? :page-section-summary-toc: 1 +include::partial$_attributes.adoc[] + Starting from version `1.2.0`, we set WireMock logging to `info` and set the WireMock notifier to being verbose. Now you can exactly know what request was received by the WireMock server and which @@ -9,10 +11,8 @@ matching response definition was picked. To turn off this feature, set WireMock logging to `ERROR`, as follows: -==== [source,properties,indent=0] ---- logging.level.com.github.tomakehurst.wiremock=ERROR ---- -==== diff --git a/docs/modules/ROOT/pages/howto/how-to-debug.adoc b/docs/modules/ROOT/pages/howto/how-to-debug.adoc index e3cec6df92..fb7c4540c8 100644 --- a/docs/modules/ROOT/pages/howto/how-to-debug.adoc +++ b/docs/modules/ROOT/pages/howto/how-to-debug.adoc @@ -2,6 +2,8 @@ = How Can I Debug the Request/Response Being Sent by the Generated Tests Client? :page-section-summary-toc: 1 +include::partial$_attributes.adoc[] + The generated tests all boil down to RestAssured in some form or fashion. RestAssured relies on the https://hc.apache.org/httpcomponents-client-ga/[Apache HttpClient]. HttpClient has a facility called @@ -10,10 +12,8 @@ which logs the entire request and response to HttpClient. Spring Boot has a logg https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html[common application property] for doing this sort of thing. To use it, add it to your application properties, as follows: -==== [source,properties,indent=0] ---- logging.level.org.apache.http.wire=DEBUG ---- -==== diff --git a/docs/modules/ROOT/pages/howto/how-to-do-stubs-versioning.adoc b/docs/modules/ROOT/pages/howto/how-to-do-stubs-versioning.adoc index 967392b40f..10e95c70e8 100644 --- a/docs/modules/ROOT/pages/howto/how-to-do-stubs-versioning.adoc +++ b/docs/modules/ROOT/pages/howto/how-to-do-stubs-versioning.adoc @@ -1,6 +1,8 @@ [[how-to-do-stubs-versioning]] = How to Do Stubs versioning? +include::partial$_attributes.adoc[] + This section covers versioning of the stubs, which you can handle in a number of different ways: * xref:howto/how-to-do-stubs-versioning.adoc#how-to-api-versioning[API Versioning] @@ -31,42 +33,34 @@ Assume that you do continuous delivery and deployment, which means that you gene the jar each time you go through the pipeline and that the jar can go to production at any time. For example, your jar version looks like the following (because it got built on the 20.10.2016 at 20:15:21) : -==== [source,groovy,indent=0] ---- 1.0.0.20161020-201521-RELEASE ---- -==== In that case, your generated stub jar should look like the following: -==== [source,groovy,indent=0] ---- 1.0.0.20161020-201521-RELEASE-stubs.jar ---- -==== In this case, you should, inside your `application.yml` or `@AutoConfigureStubRunner` when referencing stubs, provide the latest version of the stubs. You can do that by passing the `+` sign. the following example shows how to do so: -==== [source,java,indent=0] ---- @AutoConfigureStubRunner(ids = {"com.example:http-server-dsl:+:stubs:8080"}) ---- -==== If the versioning, however, is fixed (for example, `1.0.4.RELEASE` or `2.1.1`), you have to set the concrete value of the jar version. The following example shows how to do so for version 2.1.1: -==== [source,java,indent=0] ---- @AutoConfigureStubRunner(ids = {"com.example:http-server-dsl:2.1.1:stubs:8080"}) ---- -==== [[how-to-dev-or-prod-stubs]] == Development or Production Stubs @@ -78,21 +72,17 @@ deployment, you can run tests in one case with development stubs and in another The following example works for tests that use the development version of the stubs: -==== [source,java,indent=0] ---- @AutoConfigureStubRunner(ids = {"com.example:http-server-dsl:+:stubs:8080"}) ---- -==== The following example works for tests that use the production version of stubs: -==== [source,java,indent=0] ---- @AutoConfigureStubRunner(ids = {"com.example:http-server-dsl:+:prod-stubs:8080"}) ---- -==== You can also pass those values also in properties from your deployment pipeline. diff --git a/docs/modules/ROOT/pages/howto/how-to-generate-from-scc.adoc b/docs/modules/ROOT/pages/howto/how-to-generate-from-scc.adoc new file mode 100644 index 0000000000..27b7702147 --- /dev/null +++ b/docs/modules/ROOT/pages/howto/how-to-generate-from-scc.adoc @@ -0,0 +1,17 @@ +[[how-to-generate-from-scc]] += How Can I Generate YAML, or X files from Spring Cloud Contract Contracts? + +include::partial$_attributes.adoc[] + +Spring Cloud Contract comes with a `ToFileContractsTransformer` class that lets you dump +contracts as files for the given `ContractConverter`. It contains a `static void main` +method that lets you run the transformer as an executable. It takes the following +arguments: + +- argument 1 : `FQN`: Fully qualified name of the `ContractConverter` (for example, `PactContractConverter`). *REQUIRED*. +- argument 2 : `path`: Path where the dumped files should be stored. *OPTIONAL* -- defaults to `target/converted-contracts`. +- argument 3 : `path`: Path were the contracts should be searched for. *OPTIONAL* -- defaults to `src/test/resources/contracts`. + +After calling the transformer, the Spring Cloud Contract files are processed and, +depending on the provided FQN of the `ContractTransformer`, the contracts are transformed +to the required format and dumped to the provided folder. \ No newline at end of file diff --git a/docs/modules/ROOT/pages/howto/how-to-generate-pact-from-scc.adoc b/docs/modules/ROOT/pages/howto/how-to-generate-pact-from-scc.adoc deleted file mode 100644 index 638560df08..0000000000 --- a/docs/modules/ROOT/pages/howto/how-to-generate-pact-from-scc.adoc +++ /dev/null @@ -1,67 +0,0 @@ -[[how-to-generate-pact-from-scc]] -= How Can I Generate Pact, YAML, or X files from Spring Cloud Contract Contracts? - -Spring Cloud Contract comes with a `ToFileContractsTransformer` class that lets you dump -contracts as files for the given `ContractConverter`. It contains a `static void main` -method that lets you run the transformer as an executable. It takes the following -arguments: - -- argument 1 : `FQN`: Fully qualified name of the `ContractConverter` (for example, `PactContractConverter`). *REQUIRED*. -- argument 2 : `path`: Path where the dumped files should be stored. *OPTIONAL* -- defaults to `target/converted-contracts`. -- argument 3 : `path`: Path were the contracts should be searched for. *OPTIONAL* -- defaults to `src/test/resources/contracts`. - -After calling the transformer, the Spring Cloud Contract files are processed and, -depending on the provided FQN of the `ContractTransformer`, the contracts are transformed -to the required format and dumped to the provided folder. - -The following example shows how to configure Pact integration for both Maven and Gradle: - -==== -[source,xml,indent=0,role="primary"] -.Maven ----- - - org.codehaus.mojo - exec-maven-plugin - 1.6.0 - - - convert-dsl-to-pact - process-test-classes - - test - - org.springframework.cloud.contract.verifier.util.ToFileContractsTransformer - - - - org.springframework.cloud.contract.verifier.spec.pact.PactContractConverter - - ${project.basedir}/target/pacts - - ${project.basedir}/src/test/resources/contracts - - - - - java - - - - ----- - -[source,groovy,indent=0,role="secondary"] -.Gradle ----- -task convertContracts(type: JavaExec) { - main = "org.springframework.cloud.contract.verifier.util.ToFileContractsTransformer" - classpath = sourceSets.test.compileClasspath - args("org.springframework.cloud.contract.verifier.spec.pact.PactContractConverter", - "${project.rootDir}/build/pacts", "${project.rootDir}/src/test/resources/contracts") -} - -test.dependsOn("convertContracts") ----- -==== - diff --git a/docs/modules/ROOT/pages/howto/how-to-generate-stubs-at-runtime.adoc b/docs/modules/ROOT/pages/howto/how-to-generate-stubs-at-runtime.adoc index 2c8220da33..110fe5b468 100644 --- a/docs/modules/ROOT/pages/howto/how-to-generate-stubs-at-runtime.adoc +++ b/docs/modules/ROOT/pages/howto/how-to-generate-stubs-at-runtime.adoc @@ -2,5 +2,7 @@ = How Can I Generate Stubs at Runtime :page-section-summary-toc: 1 -If you want to generate stubs at runtime for contracts, switch the `generateStubs` property in the `@AutoConfigureStubRunner` annotation, or call the `withGenerateStubs(true)` method on the JUnit Rule or Extension. You can read more about this in xref:_project-features-stubrunner/stub-runner-generate-stubs-at-runtime.adoc[this section] of the documentation. +include::partial$_attributes.adoc[] + +If you want to generate stubs at runtime for contracts, switch the `generateStubs` property in the `@AutoConfigureStubRunner` annotation, or call the `withGenerateStubs(true)` method on the JUnit Rule or Extension. You can read more about this in xref:../project-features-stubrunner/stub-runner-generate-stubs-at-runtime.adoc[this section] of the documentation. diff --git a/docs/modules/ROOT/pages/howto/how-to-mark-contract-in-progress.adoc b/docs/modules/ROOT/pages/howto/how-to-mark-contract-in-progress.adoc index bd19fb5b71..bf0edaf2fa 100644 --- a/docs/modules/ROOT/pages/howto/how-to-mark-contract-in-progress.adoc +++ b/docs/modules/ROOT/pages/howto/how-to-mark-contract-in-progress.adoc @@ -2,6 +2,8 @@ = How Can I Mark that a Contract Is in Progress :page-section-summary-toc: 1 -If a contract is in progress, it means that the, on the producer side, tests are not generated, but the stub is generated. You can read more about this in xref:_project-features-contract/common-top-elements.adoc#contract-dsl-in-progress[this section] of the documentation. +include::partial$_attributes.adoc[] + +If a contract is in progress, it means that the, on the producer side, tests are not generated, but the stub is generated. You can read more about this in xref:project-features-contract/common-top-elements.adoc#contract-dsl-in-progress[this section] of the documentation. In a CI build, before going to production, you would like to ensure that no in-progress contracts are on the classpath, because they may lead to false positives. For this reason, by default, in the Spring Cloud Contract plugin, we set the value of `failOnInProgress` to `true`. If you want to allow such contracts when tests are to be generated, set the flag to `false`. diff --git a/docs/modules/ROOT/pages/howto/how-to-not-write-contracts-in-groovy.adoc b/docs/modules/ROOT/pages/howto/how-to-not-write-contracts-in-groovy.adoc index 89d2f14928..37fba5a606 100644 --- a/docs/modules/ROOT/pages/howto/how-to-not-write-contracts-in-groovy.adoc +++ b/docs/modules/ROOT/pages/howto/how-to-not-write-contracts-in-groovy.adoc @@ -2,7 +2,7 @@ = How Can I Write Contracts in a Language Other than Groovy? :page-section-summary-toc: 1 -You can write a contract in YAML. See xref:_project-features-contract.adoc[this section] for more information. +You can write a contract in YAML. See xref:../project-features-contract.adoc[this section] for more information. We are working on allowing more ways of describing the contracts. You can check the {github-issues}[github-issues] for more information. diff --git a/docs/modules/ROOT/pages/howto/how-to-provide-dynamic-values.adoc b/docs/modules/ROOT/pages/howto/how-to-provide-dynamic-values.adoc index 2e7b73fd8e..29c2704f6f 100644 --- a/docs/modules/ROOT/pages/howto/how-to-provide-dynamic-values.adoc +++ b/docs/modules/ROOT/pages/howto/how-to-provide-dynamic-values.adoc @@ -1,11 +1,12 @@ [[how-to-provide-dynamic-values]] = How Can I Provide Dynamic Values to a Contract? +include::partial$_attributes.adoc[] + One of the biggest challenges related to stubs is their reusability. Only if they can be widely used can they serve their purpose. The hard-coded values (such as dates and IDs) of request and response elements generally make that difficult. Consider the following JSON request: -==== [source,json,indent=0] ---- { @@ -14,11 +15,9 @@ Consider the following JSON request: "body" : "foo" } ---- -==== Now consider the following JSON response: -==== [source,json,indent=0] ---- { @@ -27,7 +26,6 @@ Now consider the following JSON response: "body" : "bar" } ---- -==== Imagine the pain required to set the proper value of the `time` field (assume that this content is generated by the database) by changing the clock in the system or by providing stub implementations of data providers. The same is related @@ -38,7 +36,6 @@ works as usual, generating data without you having to stub out anything. Assume JSON, the most important part is the `body` field. You can focus on that and provide matching for other fields. In other words, you would like the stub to work as follows: -==== [source,json,indent=0] ---- { @@ -47,12 +44,10 @@ you would like the stub to work as follows: "body" : "foo" } ---- -==== As far as the response goes, as a consumer, you need a concrete value on which you can operate. Consequently, the following JSON is valid: -==== [source,json,indent=0] ---- { @@ -61,14 +56,12 @@ Consequently, the following JSON is valid: "body" : "bar" } ---- -==== In the previous sections, we generated tests from contracts. So, from the producer's side, the situation looks much different. We parse the provided contract, and, in the test, we want to send a real request to your endpoints. So, for the case of a producer for the request, we cannot have any sort of matching. We need concrete values on which the producer's backend can work. Consequently, the following JSON would be valid: -==== [source,json,indent=0] ---- { @@ -77,14 +70,12 @@ producer's backend can work. Consequently, the following JSON would be valid: "body" : "foo" } ---- -==== On the other hand, from the point of view of the validity of the contract, the response does not necessarily have to contain concrete values for `time` or `id`. Suppose you generate those on the producer side. Again, you have to do a lot of stubbing to ensure that you always return the same values. That is why, from the producer's side, you might want the following response: -==== [source,json,indent=0] ---- { @@ -93,13 +84,12 @@ you might want the following response: "body" : "bar" } ---- -==== How can you then provide a matcher for the consumer and a concrete value for the producer (and the opposite at some other time)? Spring Cloud Contract lets you provide a dynamic value. That means that it can differ for both sides of the communication. -You can read more about this in the xref:_project-features-contract.adoc[Contract DSL] section. +You can read more about this in the xref:project-features-contract.adoc[Contract DSL] section. IMPORTANT: Read the https://groovy-lang.org/json.html[Groovy docs related to JSON] to understand how to properly structure the request and response bodies. diff --git a/docs/modules/ROOT/pages/howto/how-to-reference-text-from-file.adoc b/docs/modules/ROOT/pages/howto/how-to-reference-text-from-file.adoc index 601f698386..073d4622ae 100644 --- a/docs/modules/ROOT/pages/howto/how-to-reference-text-from-file.adoc +++ b/docs/modules/ROOT/pages/howto/how-to-reference-text-from-file.adoc @@ -2,6 +2,8 @@ = How Can I Reference Text from File? :page-section-summary-toc: 1 +include::partial$_attributes.adoc[] + In version 1.2.0, we added this ability. You can call a `file(...)` method in the DSL and provide a path relative to where the contract lies. If you use YAML, you can use the `bodyFromFile` property. diff --git a/docs/modules/ROOT/pages/howto/how-to-see-registered-stubs.adoc b/docs/modules/ROOT/pages/howto/how-to-see-registered-stubs.adoc index 79e46667e4..24eaf3d6b3 100644 --- a/docs/modules/ROOT/pages/howto/how-to-see-registered-stubs.adoc +++ b/docs/modules/ROOT/pages/howto/how-to-see-registered-stubs.adoc @@ -2,6 +2,8 @@ = How Can I See What Got Registered in the HTTP Server Stub? :page-section-summary-toc: 1 +include::partial$_attributes.adoc[] + You can use the `mappingsOutputFolder` property on `@AutoConfigureStubRunner`, `StubRunnerRule`, or `StubRunnerExtension` to dump all mappings for each artifact ID. Also, the port at which the given stub server was started is attached. diff --git a/docs/modules/ROOT/pages/howto/how-to-use-git-as-storage.adoc b/docs/modules/ROOT/pages/howto/how-to-use-git-as-storage.adoc index 0990ca7342..05fcb339e6 100644 --- a/docs/modules/ROOT/pages/howto/how-to-use-git-as-storage.adoc +++ b/docs/modules/ROOT/pages/howto/how-to-use-git-as-storage.adoc @@ -1,6 +1,8 @@ [[how-to-use-git-as-storage]] = How Can I Use Git as the Storage for Contracts and Stubs? +include::partial$_attributes.adoc[] + In the polyglot world, there are languages that do not use binary storage, as Artifactory and Nexus do. Starting from Spring Cloud Contract version 2.0.0, we provide mechanisms to store contracts and stubs in a SCM (Source Control Management) repository. Currently, the @@ -9,7 +11,6 @@ only supported SCM is Git. The repository would have to have the following setup (which you can checkout from https://github.com/spring-cloud-samples/spring-cloud-contract-samples/tree/{samples_branch}/contracts_git/[here]): -==== [source,indent=0] ---- . @@ -31,7 +32,6 @@ The repository would have to have the following setup ├── shouldGrantABeerIfOldEnough.json └── shouldRejectABeerIfTooYoung.json ---- -==== Under the `META-INF` folder: @@ -73,14 +73,12 @@ For the SCM functionality, currently, we support the Git repository. To use it, in the property where the repository URL needs to be placed, you have to prefix the connection URL with `git://`. The following listing shows some examples: -==== [source,indent=0] ---- git://file:///foo/bar git://https://github.com/spring-cloud-samples/spring-cloud-contract-nodejs-contracts-git.git git://git@github.com:spring-cloud-samples/spring-cloud-contract-nodejs-contracts-git.git ---- -==== [[how-to-protocol-convention-producer]] == Producer @@ -97,9 +95,11 @@ repository. The following listing includes the relevant parts both Maven and Gradle build files: -==== +[tabs] +====== +Maven:: ++ [source,xml,indent=0,role="primary"] -.Maven ---- org.springframework.cloud @@ -137,8 +137,9 @@ The following listing includes the relevant parts both Maven and Gradle build fi ---- +Gradle:: ++ [source,groovy,indent=0,role="secondary"] -.Gradle ---- contracts { // We want to pick contracts from a Git repository @@ -164,12 +165,11 @@ the `publish` task is invoked */ publish.dependsOn("publishStubsToScm") ---- -==== +====== You can also further customize the `publishStubsToScm` gradle task. In the following example, the task is customized to pick contracts from a local git repository: -==== [source,groovy,indent=0] .gradle ---- @@ -191,7 +191,6 @@ publishStubsToScm { contractsMode = "LOCAL" } ---- -==== IMPORTANT:: Starting with the `2.3.0.RELEASE`, the `customize{}` closure previously used for the `publishStubsToScm` customization is no longer available. The settings should be applied directly @@ -213,21 +212,7 @@ to find contracts. For example, for `com.example:foo:1.0.0`, the path would be Another option to use the SCM as the destination for stubs and contracts is to store the contracts locally, with the producer, and only push the contracts and the stubs to SCM. -The following listing shows the setup required to achieve this with Maven and Gradle: - -==== -[source,xml,indent=0,role="primary"] -.Maven ----- -include:../:{samples_url}/producer_with_empty_git/pom.xml[tags=plugin,indent=0] ----- - -[source,groovy,indent=0,role="secondary"] -.Gradle ----- -include:../:{samples_url}/producer_with_empty_git/build.gradle[tags=plugin,indent=0] ----- -==== +The following {samples_url}/producer_with_empty_git/[project] shows the setup required to achieve this with Maven and Gradle. With such a setup: @@ -257,7 +242,6 @@ either from the `@AutoConfigureStubRunner` annotation, the JUnit 4 rule, JUnit 5 extension, or properties, you can pass the URL of the SCM repository, prefixed with the `git://` protocol. The following example shows how to do so: -==== [source,java,indent=0] ---- @AutoConfigureStubRunner( @@ -266,7 +250,6 @@ SCM repository, prefixed with the `git://` protocol. The following example shows ids="com.example:bookstore:0.0.1.RELEASE" ) ---- -==== With such a setup: diff --git a/docs/modules/ROOT/pages/howto/how-to-use-stubs-from-a-location.adoc b/docs/modules/ROOT/pages/howto/how-to-use-stubs-from-a-location.adoc index bf7c433b11..99028da462 100644 --- a/docs/modules/ROOT/pages/howto/how-to-use-stubs-from-a-location.adoc +++ b/docs/modules/ROOT/pages/howto/how-to-use-stubs-from-a-location.adoc @@ -2,5 +2,7 @@ = How Can I Use Stubs from a Location :page-section-summary-toc: 1 -If you want to fetch contracts or stubs from a given location without cloning a repository or fetching a JAR, use the `stubs://` protocol when providing the repository root argument for Stub Runner or the Spring Cloud Contract plugin. You can read more about this in xref:_project-features-stubrunner/stub-runner-stubs-protocol.adoc[this section] of the documentation. +include::partial$_attributes.adoc[] + +If you want to fetch contracts or stubs from a given location without cloning a repository or fetching a JAR, use the `stubs://` protocol when providing the repository root argument for Stub Runner or the Spring Cloud Contract plugin. You can read more about this in xref:../project-features-stubrunner/stub-runner-stubs-protocol.adoc[this section] of the documentation. diff --git a/docs/modules/ROOT/pages/howto/how-to-use-the-failonnostubs-feature.adoc b/docs/modules/ROOT/pages/howto/how-to-use-the-failonnostubs-feature.adoc index c0f03aee16..a568a5ff1a 100644 --- a/docs/modules/ROOT/pages/howto/how-to-use-the-failonnostubs-feature.adoc +++ b/docs/modules/ROOT/pages/howto/how-to-use-the-failonnostubs-feature.adoc @@ -2,7 +2,9 @@ = How Can I Make The Build Pass if There Are No Contracts or Stubs :page-section-summary-toc: 1 -If you want Stub Runner not to fail if no stubs were found, switch the `generateStubs` property in the `@AutoConfigureStubRunner` annotation or call the `withFailOnNoStubs(false)` method on the JUnit Rule or Extension. You can read more about this in xref:_project-features-stubrunner/stub-runner-fail-on-no-stubs.adoc[this section] of the documentation. +include::partial$_attributes.adoc[] + +If you want Stub Runner not to fail if no stubs were found, switch the `generateStubs` property in the `@AutoConfigureStubRunner` annotation or call the `withFailOnNoStubs(false)` method on the JUnit Rule or Extension. You can read more about this in xref:../project-features-stubrunner/stub-runner-fail-on-no-stubs.adoc[this section] of the documentation. If you want the plugins not to fail the build when no contracts were found, you can set the `failOnNoStubs` flag in Maven or call the `contractRepository { failOnNoStubs(false) }` closure in Gradle. diff --git a/docs/modules/ROOT/pages/howto/how-to-work-with-transitivie.adoc b/docs/modules/ROOT/pages/howto/how-to-work-with-transitivie.adoc index 0ac9564dec..5911ddb8a8 100644 --- a/docs/modules/ROOT/pages/howto/how-to-work-with-transitivie.adoc +++ b/docs/modules/ROOT/pages/howto/how-to-work-with-transitivie.adoc @@ -1,12 +1,13 @@ [[how-to-work-with-transitivie]] = How Can I Work with Transitive Dependencies? +include::partial$_attributes.adoc[] + The Spring Cloud Contract plugins add the tasks that create the stubs jar for you. One problem that arises is that, when reusing the stubs, you can mistakenly import all of that stub's dependencies. When building a Maven artifact, even though you have a couple of different jars, all of them share one `pom.xml` file, as the following listing shows: -==== [source,bash,indent=0] ---- ├── producer-0.0.1.BUILD-20160903.075506-1-stubs.jar @@ -19,7 +20,6 @@ of different jars, all of them share one `pom.xml` file, as the following listin ├── ... └── ... ---- -==== There are three possibilities of working with those dependencies so as not to have any issues with transitive dependencies: diff --git a/docs/modules/ROOT/pages/howto/why-spring-cloud-contract.adoc b/docs/modules/ROOT/pages/howto/why-spring-cloud-contract.adoc index 31effddf75..b0d19aaa2d 100644 --- a/docs/modules/ROOT/pages/howto/why-spring-cloud-contract.adoc +++ b/docs/modules/ROOT/pages/howto/why-spring-cloud-contract.adoc @@ -2,6 +2,8 @@ = Why use Spring Cloud Contract? :page-section-summary-toc: 1 +include::partial$_attributes.adoc[] + Spring Cloud Contract works great in a polyglot environment. This project has a lot of really interesting features. Quite a few of these features definitely make Spring Cloud Contract Verifier stand out on the market of Consumer Driven Contract diff --git a/docs/modules/ROOT/pages/index.adoc b/docs/modules/ROOT/pages/index.adoc index e69de29bb2..b58fbf5807 100644 --- a/docs/modules/ROOT/pages/index.adoc +++ b/docs/modules/ROOT/pages/index.adoc @@ -0,0 +1,6 @@ +[[spring-cloud-contract-reference-documentation]] += Spring Cloud Contract Reference Documentation +:page-section-summary-toc: 1 +Adam Dudczak, Mathias Düsterhöft, Marcin Grzejszczak, Dennis Kieselhorst, Jakub Kubryński, Karol Lassak, Olga Maciaszek-Sharma, Mariusz Smykuła, Dave Syer, Jay Bryant + +Spring Cloud Contract moves TDD to the level of software architecture. It lets you perform consumer-driven and producer-driven contract testing. diff --git a/docs/modules/ROOT/pages/legal.adoc b/docs/modules/ROOT/pages/legal.adoc index bcae63734d..79f3f383b5 100644 --- a/docs/modules/ROOT/pages/legal.adoc +++ b/docs/modules/ROOT/pages/legal.adoc @@ -5,7 +5,7 @@ {project-version} -Copyright © 2012-2020 +Copyright © 2012-2023 Copies of this document may be made for your own use and for distribution to others, provided that you do not charge any fee for such copies and further diff --git a/docs/modules/ROOT/pages/maven-project.adoc b/docs/modules/ROOT/pages/maven-project.adoc index 838c45f0b5..fb381e54e7 100644 --- a/docs/modules/ROOT/pages/maven-project.adoc +++ b/docs/modules/ROOT/pages/maven-project.adoc @@ -1,44 +1,24 @@ [[maven-project]] = Maven Project -To learn how to set up the Maven project for Spring Cloud Contract Verifier, read the -following sections: - -* xref:maven-project.adoc#maven-add-plugin[Adding the Maven Plugin] -* xref:maven-project.adoc#maven-rest-assured[Maven and Rest Assured 2.0] -* xref:maven-project.adoc#maven-snapshot-versions[Using Snapshot and Milestone Versions for Maven] -* xref:maven-project.adoc#maven-add-stubs[Adding stubs] -* xref:maven-project.adoc#maven-run-plugin[Run Plugin] -* xref:maven-project.adoc#maven-configure-plugin[Configure plugin] -* xref:maven-project.adoc#maven-configuration-options[Configuration Options] -* xref:maven-project.adoc#maven-single-base[Single Base Class for All Tests] -* xref:maven-project.adoc#maven-different-base[Using Different Base Classes for Contracts] -* xref:maven-project.adoc#maven-invoking-generated-tests[Invoking Generated Tests] -* xref:maven-project.adoc#maven-pushing-stubs-to-scm[Pushing Stubs to SCM] -* xref:maven-project.adoc#maven-sts[Maven Plugin and STS] - -You can also check the plugin's documentation link:../../spring-cloud-contract-maven-plugin/index.html[here]. +include::partial$_attributes.adoc[] [[maven-add-plugin]] == Adding the Maven Plugin To add the Spring Cloud Contract BOM, include the following section in your `pom.xml` file: -==== [source,xml,indent=0] ---- include::{standalone_samples_path}/http-server/pom.xml[tags=contract_bom,indent=0] ---- -==== Next, add the `Spring Cloud Contract Verifier` Maven plugin, as follows: -==== [source,xml,indent=0] ---- include::{standalone_samples_path}/http-server/pom.xml[tags=contract_maven_plugin,indent=0] ---- -==== You can read more in the spring-cloud-contract-maven-plugin/index.html[Spring @@ -46,7 +26,6 @@ Cloud Contract Maven Plugin Documentation]. Sometimes, regardless of the picked IDE, you can see that the `target/generated-test-source` folder is not visible on the IDE's classpath. To ensure that it is always there, you can add the following entry to your `pom.xml` -==== [source,xml,indent=0] ---- @@ -68,7 +47,6 @@ Sometimes, regardless of the picked IDE, you can see that the `target/generated- ---- -==== [[maven-rest-assured]] == Maven and Rest Assured 2.0 @@ -76,7 +54,6 @@ Sometimes, regardless of the picked IDE, you can see that the `target/generated- By default, Rest Assured 3.x is added to the classpath. However, you can use Rest Assured 2.x by adding it to the plugins classpath, as follows: -==== [source,groovy,indent=0] ---- @@ -125,7 +102,6 @@ Assured 2.x by adding it to the plugins classpath, as follows: ---- -==== That way, the plugin automatically sees that Rest Assured 2.x is present on the classpath and modifies the imports accordingly. @@ -136,12 +112,10 @@ and modifies the imports accordingly. To use Snapshot and Milestone versions, you have to add the following section to your `pom.xml`: -==== [source,xml,indent=0] ---- include::{standalone_samples_path}/http-server/pom.xml[tags=repos,indent=0] ---- -==== [[maven-add-stubs]] == Adding stubs @@ -153,13 +127,11 @@ that it contains at least one directory to be used as the test class name. If th than one level of nested directories, all except the last one is used as the package name. Consider the following structure: -==== [source,groovy,indent=0] ---- src/test/resources/contracts/myservice/shouldCreateUser.groovy src/test/resources/contracts/myservice/shouldReturnUser.groovy ---- -==== Given that structure, Spring Cloud Contract Verifier creates a test class named `defaultBasePackage.MyService` with two methods: @@ -188,7 +160,6 @@ mvn org.springframework.cloud:spring-cloud-contract-maven-plugin:run \ To change the default configuration, you can add a `configuration` section to the plugin definition or the `execution` definition, as follows: -==== [source,xml,indent=0] ---- @@ -209,7 +180,6 @@ definition or the `execution` definition, as follows: ---- -==== [[maven-configuration-options]] == Configuration Options @@ -295,7 +265,6 @@ When using Spring Cloud Contract Verifier in the default (`MockMvc`), you need t specification for all generated acceptance tests. In this class, you need to point to an endpoint, which should be verified. The following example shows how to do so: -==== [source,groovy,indent=0] ---- package org.mycompany.tests @@ -310,11 +279,9 @@ class MvcSpec extends Specification { } } ---- -==== If necessary, you can also setup the whole context, as the following example shows: -==== [source,java,indent=0] ---- import io.restassured.module.mockmvc.RestAssuredMockMvc; @@ -338,13 +305,11 @@ public abstract class BaseTestClass { } } ---- -==== If you use `EXPLICIT` mode, you can use a base class to initialize the whole tested app, similar to what you might do in regular integration tests. The following example shows how to do so: -==== [source,java,indent=0] ---- import io.restassured.RestAssured; @@ -369,7 +334,6 @@ public abstract class BaseTestClass { } } ---- -==== If you use the `JAXRSCLIENT` mode, this base class should also contain a `protected WebTarget webTarget` field. Right now, the only way to test the JAX-RS API is to start a web server. @@ -394,12 +358,10 @@ In other words, the system takes the last two parts of the package, if they exis forms a class with a `Base` suffix. This rule takes precedence over `baseClassForTests`. The following example shows how it works in the `contracts` closure: -==== [source,xml,indent=0] ---- include::{plugins_path}/spring-cloud-contract-maven-plugin/src/test/projects/basic-generated-baseclass/pom.xml[tags=convention,indent=0] ---- -==== [[by-mapping]] === By Mapping @@ -409,12 +371,10 @@ name of the base class for the matched contract. You have to provide a list call `baseClassMappings` that consists of `baseClassMapping` objects that each take a `contractPackageRegex` to `baseClassFQN` mapping. Consider the following example: -==== [source,xml,indent=0] ---- include::{plugins_path}/spring-cloud-contract-maven-plugin/src/test/projects/basic-baseclass-from-mappings/pom.xml[tags=mapping,indent=0] ---- -==== Assume that you have contracts under these two locations: @@ -435,7 +395,6 @@ goal. For Groovy Spock code, you can use the following: -==== [source,xml,indent=0] ---- @@ -467,7 +426,6 @@ For Groovy Spock code, you can use the following: ---- -==== To ensure that the provider side is compliant with defined contracts, you need to invoke `mvn generateTest test`. @@ -480,7 +438,6 @@ stubs, you might want to automate the step of pushing stubs to the repository. To do that, you can add the `pushStubsToScm` goal. The following example shows how to do so: -==== [source,xml,indent=0] ---- @@ -518,14 +475,12 @@ goal. The following example shows how to do so: ---- -==== Under xref:advanced.adoc#scm-stub-downloader[Using the SCM Stub Downloader], you can find all possible configuration options that you can pass through the `` map, a system property, or an environment variable. For instance, you could specify a concrete branch to checkout, instead of the default one -==== [source,xml,indent=0] ---- @@ -566,7 +521,6 @@ or an environment variable. For instance, you could specify a concrete branch to ---- -==== [[maven-sts]] @@ -578,7 +532,6 @@ image::{github-raw}/docs/src/main/asciidoc/images/sts_exception.png[STS Exceptio When you click on the error marker, you should see something like the following: -==== [source,bash] ---- plugin:1.1.0.M1:convert:default-convert:process-test-resources) org.apache.maven.plugin.PluginExecutionException: Execution default-convert of goal org.springframework.cloud:spring- @@ -589,11 +542,9 @@ When you click on the error marker, you should see something like the following: org.eclipse.m2e.core.internal.builder.plexusbuildapi.EclipseIncrementalBuildContext.hasDelta(EclipseIncrementalBuildContext.java:53) at org.sonatype.plexus.build.incremental.ThreadBuildContext.hasDelta(ThreadBuildContext.java:59) at ---- -==== To fix this issue, provide the following section in your `pom.xml`: -==== [source,xml] ---- @@ -629,7 +580,6 @@ To fix this issue, provide the following section in your `pom.xml`: ---- -==== [[maven-plugin-with-spock-tests]] == Maven Plugin with Spock Tests @@ -641,21 +591,7 @@ in Maven, you need some additional setup in order to make the tests compile and First of all, you must use a plugin, such as the https://github.com/groovy/GMavenPlus[GMavenPlus] plugin, to add Groovy to your project. In GMavenPlus plugin, you need to explicitly set test sources, including both the path where your base test classes are defined and the path were the generated contract tests are added. -The following example shows how to do so: - -==== -[source,xml,indent=0] ----- -include::{samples_url}/producer_with_spock/pom.xml[tags=gmavenplus-setup,indent=0] ----- -==== +The {samples_url}/producer_with_spock/pom.xml[following example] shows how to do so. If you uphold the Spock convention of ending the test class names with `Spec`, you also need to adjust your Maven -Surefire plugin setup, as the following example shows: - -==== -[source,xml,indent=0] ----- -include::{samples_url}/producer_with_spock/pom.xml[tags=spock-surefire-setup,indent=0] ----- -==== +Surefire plugin setup, as the {samples_url}/producer_with_spock/pom.xml[following example] shows. diff --git a/docs/modules/ROOT/pages/_project-features-contract.adoc b/docs/modules/ROOT/pages/project-features-contract.adoc similarity index 78% rename from docs/modules/ROOT/pages/_project-features-contract.adoc rename to docs/modules/ROOT/pages/project-features-contract.adoc index e5dbd42061..b9adf60f35 100644 --- a/docs/modules/ROOT/pages/_project-features-contract.adoc +++ b/docs/modules/ROOT/pages/project-features-contract.adoc @@ -1,6 +1,7 @@ [[contract-dsl]] = Contract DSL +include::partial$_attributes.adoc[] Spring Cloud Contract supports DSLs written in the following languages: @@ -17,25 +18,25 @@ The following example shows a contract definition: [source,groovy,indent=0,subs="verbatim,attributes",role="primary"] .Groovy ---- -include::{verifier_core_path}/src/test/groovy/org/springframework/cloud/contract/verifier/builder/SpringTestMethodBodyBuildersSpec.groovy[tags=dsl_example,indent=0] +include::{verifier_root_path}/src/test/groovy/org/springframework/cloud/contract/verifier/builder/SpringTestMethodBodyBuildersSpec.groovy[tags=dsl_example,indent=0] ---- [source,yml,indent=0,subs="verbatim,attributes",role="secondary"] .YAML ---- -include::{verifier_core_path}/src/test/resources/yml/contract_rest.yml[indent=0] +include::{verifier_root_path}/src/test/resources/yml/contract_rest.yml[indent=0] ---- [source,java,indent=0,subs="verbatim,attributes",role="secondary"] .Java ---- -include::{verifier_core_path}/src/test/resources/contractsToCompile/contract_rest.java[tags=class,indent=0] +include::{verifier_root_path}/src/test/resources/contractsToCompile/contract_rest.java[tags=class,indent=0] ---- [source,kotlin,indent=0,subs="verbatim,attributes",role="secondary"] .Kotlin ---- -include::{verifier_core_path}/src/test/resources/kotlin/contract_rest.kts[tags=class,indent=0] +include::{verifier_root_path}/src/test/resources/kotlin/contract_rest.kts[tags=class,indent=0] ---- ==== diff --git a/docs/modules/ROOT/pages/_project-features-contract/common-top-elements.adoc b/docs/modules/ROOT/pages/project-features-contract/common-top-elements.adoc similarity index 60% rename from docs/modules/ROOT/pages/_project-features-contract/common-top-elements.adoc rename to docs/modules/ROOT/pages/project-features-contract/common-top-elements.adoc index dcf8fc1b48..1a0407c0bf 100644 --- a/docs/modules/ROOT/pages/_project-features-contract/common-top-elements.adoc +++ b/docs/modules/ROOT/pages/project-features-contract/common-top-elements.adoc @@ -1,14 +1,16 @@ [[contract-common-top-elements]] = Common Top-Level Elements +include::partial$_attributes.adoc[] + The following sections describe the most common top-level elements: -* xref:_project-features-contract/common-top-elements.adoc#contract-dsl-description[Description] -* xref:_project-features-contract/common-top-elements.adoc#contract-dsl-name[Name] -* xref:_project-features-contract/common-top-elements.adoc#contract-dsl-ignoring-contracts[Ignoring Contracts] -* xref:_project-features-contract/common-top-elements.adoc#contract-dsl-in-progress[Contracts in Progress] -* xref:_project-features-contract/common-top-elements.adoc#contract-dsl-passing-values-from-files[Passing Values from Files] -* xref:_project-features-contract/common-top-elements.adoc#contract-dsl-metadata[Metadata] +* xref:project-features-contract/common-top-elements.adoc#contract-dsl-description[Description] +* xref:project-features-contract/common-top-elements.adoc#contract-dsl-name[Name] +* xref:project-features-contract/common-top-elements.adoc#contract-dsl-ignoring-contracts[Ignoring Contracts] +* xref:project-features-contract/common-top-elements.adoc#contract-dsl-in-progress[Contracts in Progress] +* xref:project-features-contract/common-top-elements.adoc#contract-dsl-passing-values-from-files[Passing Values from Files] +* xref:project-features-contract/common-top-elements.adoc#contract-dsl-metadata[Metadata] [[contract-dsl-description]] == Description @@ -20,25 +22,25 @@ following code shows an example: [source,groovy,indent=0,role="primary"] .Groovy ---- -include:../:{contract_spec_tests_path}/src/test/groovy/org/springframework/cloud/contract/spec/internal/ContractSpec.groovy[tags=description,indent=0] +include::{contract_spec_tests_path}/src/test/groovy/org/springframework/cloud/contract/spec/internal/ContractSpec.groovy[tags=description,indent=0] ---- [source,yaml,indent=0,role="secondary"] .YAML ---- -include:../:{verifier_core_path}/src/test/resources/yml/contract_rest.yml[indent=0] +include::{verifier_root_path}/src/test/resources/yml/contract_rest.yml[indent=0] ---- [source,java,indent=0,subs="verbatim,attributes",role="secondary"] .Java ---- -include:../:{verifier_core_path}/src/test/resources/contractsToCompile/contract_rest_with_tags.java[tags=description,indent=0] +include::{verifier_root_path}/src/test/resources/contractsToCompile/contract_rest_with_tags.java[tags=description,indent=0] ---- [source,kotlin,indent=0,subs="verbatim,attributes",role="secondary"] .Kotlin ---- -include:../:{contract_kotlin_spec_path}/src/test/kotlin/org/springframework/cloud/contract/spec/ContractTests.kt[tags=description,indent=0] +include::{contract_kotlin_spec_path}/src/test/kotlin/org/springframework/cloud/contract/spec/ContractTests.kt[tags=description,indent=0] ---- ==== @@ -61,25 +63,25 @@ The following example shows how to add a name to a contract: [source,groovy,indent=0,role="primary"] .Groovy ---- -include:../:{contract_spec_tests_path}/src/test/groovy/org/springframework/cloud/contract/spec/internal/ContractSpec.groovy[tags=name,indent=0] +include::{contract_spec_tests_path}/src/test/groovy/org/springframework/cloud/contract/spec/internal/ContractSpec.groovy[tags=name,indent=0] ---- [source,yaml,indent=0,role="secondary"] .YAML ---- -include:../:{verifier_core_path}/src/test/resources/yml/contract.yml[tags=name,indent=0] +include::{verifier_root_path}/src/test/resources/yml/contract.yml[tags=name,indent=0] ---- [source,java,indent=0,subs="verbatim,attributes",role="secondary"] .Java ---- -include:../:{verifier_core_path}/src/test/resources/contractsToCompile/contract_rest_with_tags.java[tags=name,indent=0] +include::{verifier_root_path}/src/test/resources/contractsToCompile/contract_rest_with_tags.java[tags=name,indent=0] ---- [source,kotlin,indent=0,subs="verbatim,attributes",role="secondary"] .Kotlin ---- -include:../:{contract_kotlin_spec_path}/src/test/kotlin/org/springframework/cloud/contract/spec/ContractTests.kt[tags=name,indent=0] +include::{contract_kotlin_spec_path}/src/test/kotlin/org/springframework/cloud/contract/spec/ContractTests.kt[tags=name,indent=0] ---- ==== @@ -94,25 +96,25 @@ example shows how to do so: [source,groovy,indent=0,role="primary"] .Groovy ---- -include:../:{contract_spec_tests_path}/src/test/groovy/org/springframework/cloud/contract/spec/internal/ContractSpec.groovy[tags=ignored,indent=0] +include::{contract_spec_tests_path}/src/test/groovy/org/springframework/cloud/contract/spec/internal/ContractSpec.groovy[tags=ignored,indent=0] ---- [source,yaml,indent=0,role="secondary"] .YAML ---- -include:../:{verifier_core_path}/src/test/resources/yml/contract.yml[tags=ignored,indent=0] +include::{verifier_root_path}/src/test/resources/yml/contract.yml[tags=ignored,indent=0] ---- [source,java,indent=0,subs="verbatim,attributes",role="secondary"] .Java ---- -include:../:{verifier_core_path}/src/test/resources/contractsToCompile/contract_rest_with_tags.java[tags=ignored,indent=0] +include::{verifier_root_path}/src/test/resources/contractsToCompile/contract_rest_with_tags.java[tags=ignored,indent=0] ---- [source,kotlin,indent=0,subs="verbatim,attributes",role="secondary"] .Kotlin ---- -include:../:{contract_kotlin_spec_path}/src/test/kotlin/org/springframework/cloud/contract/spec/ContractTests.kt[tags=ignored,indent=0] +include::{contract_kotlin_spec_path}/src/test/kotlin/org/springframework/cloud/contract/spec/ContractTests.kt[tags=ignored,indent=0] ---- ==== @@ -130,25 +132,25 @@ example shows how to do so: [source,groovy,indent=0,role="primary"] .Groovy ---- -include:../:{contract_spec_tests_path}/src/test/groovy/org/springframework/cloud/contract/spec/internal/ContractSpec.groovy[tags=in_progress,indent=0] +include::{contract_spec_tests_path}/src/test/groovy/org/springframework/cloud/contract/spec/internal/ContractSpec.groovy[tags=in_progress,indent=0] ---- [source,yaml,indent=0,role="secondary"] .YAML ---- -include:../:{verifier_core_path}/src/test/resources/yml/contract.yml[tags=in_progress,indent=0] +include::{verifier_root_path}/src/test/resources/yml/contract.yml[tags=in_progress,indent=0] ---- [source,java,indent=0,subs="verbatim,attributes",role="secondary"] .Java ---- -include:../:{verifier_core_path}/src/test/resources/contractsToCompile/contract_rest_with_tags.java[tags=in_progress,indent=0] +include::{verifier_root_path}/src/test/resources/contractsToCompile/contract_rest_with_tags.java[tags=in_progress,indent=0] ---- [source,kotlin,indent=0,subs="verbatim,attributes",role="secondary"] .Kotlin ---- -include:../:{contract_kotlin_spec_path}/src/test/kotlin/org/springframework/cloud/contract/spec/ContractTests.kt[tags=in_progress,indent=0] +include::{contract_kotlin_spec_path}/src/test/kotlin/org/springframework/cloud/contract/spec/ContractTests.kt[tags=in_progress,indent=0] ---- ==== @@ -177,25 +179,25 @@ Further assume that your contract is as follows: [source,groovy,indent=0,role="primary"] .Groovy ---- -include:../:{verifier_core_path}/src/test/resources/classpath/readFromFile.groovy[indent=0] +include::{verifier_root_path}/src/test/resources/classpath/readFromFile.groovy[indent=0] ---- [source,yaml,indent=0,role="secondary"] .YAML ---- -include:../:{verifier_core_path}/src/test/resources/yml/contract_from_file.yml[indent=0] +include::{verifier_root_path}/src/test/resources/yml/contract_from_file.yml[indent=0] ---- [source,java,indent=0,subs="verbatim,attributes",role="secondary"] .Java ---- -include:../:{verifier_core_path}/src/test/resources/contractsToCompile/contract_rest_from_file.java[tags=class,indent=0] +include::{verifier_root_path}/src/test/resources/contractsToCompile/contract_rest_from_file.java[tags=class,indent=0] ---- [source,kotlin,indent=0,subs="verbatim,attributes",role="secondary"] .Kotlin ---- -include:../:{verifier_core_path}/src/test/resources/kotlin/readFromFile.kts[tags=class,indent=0] +include::{verifier_root_path}/src/test/resources/kotlin/readFromFile.kts[tags=class,indent=0] ---- ==== @@ -205,13 +207,13 @@ Further assume that the JSON files are as follows: [source,json,indent=0,subs="verbatim,attributes",role="primary"] .request.json ---- -include:../:{verifier_core_path}/src/test/resources/classpath/request.json[indent=0] +include::{verifier_root_path}/src/test/resources/classpath/request.json[indent=0] ---- [source,groovy,indent=0,subs="verbatim,attributes",role="secondary"] .response.json ---- -include:../:{verifier_core_path}/src/test/resources/classpath/response.json[indent=0] +include::{verifier_root_path}/src/test/resources/classpath/response.json[indent=0] ---- ==== @@ -228,25 +230,25 @@ The following example shows how to pass the contents of binary files: [source,groovy,indent=0,role="primary"] .Groovy ---- -include:../:{verifier_core_path}/src/test/resources/body_builder/worksWithPdf.groovy[indent=0] +include::{verifier_root_path}/src/test/resources/body_builder/worksWithPdf.groovy[indent=0] ---- [source,yaml,indent=0,role="secondary"] .YAML ---- -include:../:{verifier_core_path}/src/test/resources/yml/contract_pdf.yml[indent=0] +include::{verifier_root_path}/src/test/resources/yml/contract_pdf.yml[indent=0] ---- [source,java,indent=0,subs="verbatim,attributes",role="secondary"] .Java ---- -include:../:{verifier_core_path}/src/test/resources/contractsToCompile/contract_rest_from_pdf.java[tags=class,indent=0] +include::{verifier_root_path}/src/test/resources/contractsToCompile/contract_rest_from_pdf.java[tags=class,indent=0] ---- [source,kotlin,indent=0,subs="verbatim,attributes",role="secondary"] .Kotlin ---- -include:../:{contract_kotlin_spec_path}/src/test/resources/contracts/shouldWorkWithBinaryPayload.kts[tags=class,indent=0] +include::{contract_kotlin_spec_path}/src/test/resources/contracts/shouldWorkWithBinaryPayload.kts[tags=class,indent=0] ---- ==== @@ -265,36 +267,36 @@ delays or integrate with third party WireMock extensions. [source,groovy,indent=0,role="primary"] .groovy ---- -include:../:{standalone_samples_path}/http-server/src/test/resources/contracts/fraud/shouldReturnFraudStats.groovy[tags=metadata,indent=0] +include::{standalone_samples_path}/http-server/src/test/resources/contracts/fraud/shouldReturnFraudStats.groovy[tags=metadata,indent=0] ---- [source,yaml,indent=0,role="secondary"] .yml ---- -include:../:{standalone_samples_path}/http-server/src/test/resources/contracts/yml/fraud/shouldReturnFraudStats.yml[tags=metadata,indent=0] +include::{standalone_samples_path}/http-server/src/test/resources/contracts/yml/fraud/shouldReturnFraudStats.yml[tags=metadata,indent=0] ---- [source,java,indent=0,subs="verbatim,attributes",role="secondary"] .java ---- -include:../:{verifier_core_path}/src/test/resources/contractsToCompile/contract_rest_with_tags.java[tags=metadata,indent=0] +include::{verifier_root_path}/src/test/resources/contractsToCompile/contract_rest_with_tags.java[tags=metadata,indent=0] ---- [source,kotlin,indent=0,subs="verbatim,attributes",role="secondary"] .kotlin ---- -include:../:{contract_kotlin_spec_path}/src/test/kotlin/org/springframework/cloud/contract/spec/ContractTests.kt[tags=metadata,indent=0] +include::{contract_kotlin_spec_path}/src/test/kotlin/org/springframework/cloud/contract/spec/ContractTests.kt[tags=metadata,indent=0] ---- ==== In the following sections you can find examples of the supported metadata entries. //// -include:../:{project-root}/docs/target/metadata.adoc[indent=0] +include::{project-root}/docs/target/metadata.adoc[indent=0] //// [[features-http]] -= Contracts for HTTP +== Contracts for HTTP Spring Cloud Contract lets you verify applications that use REST or HTTP as a means of communication. Spring Cloud Contract verifies that, for a request that matches the diff --git a/docs/modules/ROOT/pages/_project-features-contract/dsl-async.adoc b/docs/modules/ROOT/pages/project-features-contract/dsl-async.adoc similarity index 98% rename from docs/modules/ROOT/pages/_project-features-contract/dsl-async.adoc rename to docs/modules/ROOT/pages/project-features-contract/dsl-async.adoc index c1763f0314..c9dfea5a3b 100644 --- a/docs/modules/ROOT/pages/_project-features-contract/dsl-async.adoc +++ b/docs/modules/ROOT/pages/project-features-contract/dsl-async.adoc @@ -1,6 +1,8 @@ [[contract-dsl-async]] = Asynchronous Support +include::partial$_attributes.adoc[] + If you use asynchronous communication on the server side (your controllers are returning `Callable`, `DeferredResult`, and so on), then, inside your contract, you must provide an `async()` method in the `response` section. The following code shows an example: diff --git a/docs/modules/ROOT/pages/_project-features-contract/dsl-dynamic-properties.adoc b/docs/modules/ROOT/pages/project-features-contract/dsl-dynamic-properties.adoc similarity index 86% rename from docs/modules/ROOT/pages/_project-features-contract/dsl-dynamic-properties.adoc rename to docs/modules/ROOT/pages/project-features-contract/dsl-dynamic-properties.adoc index 0a38b44f02..19ce12585f 100644 --- a/docs/modules/ROOT/pages/_project-features-contract/dsl-dynamic-properties.adoc +++ b/docs/modules/ROOT/pages/project-features-contract/dsl-dynamic-properties.adoc @@ -1,6 +1,8 @@ [[contract-dsl-dynamic-properties]] = Dynamic properties +include::partial$_attributes.adoc[] + The contract can contain some dynamic properties: timestamps, IDs, and so on. You do not want to force the consumers to stub their clocks to always return the same value of time so that it gets matched by the stub. @@ -20,7 +22,7 @@ IMPORTANT: Entries inside the `matchers` must reference existing elements of the == Dynamic Properties inside the Body IMPORTANT: This section is valid only for the Coded DSL (Groovy, Java, and so on). See the -xref:_project-features-contract/dsl-dynamic-properties.adoc#contract-dsl-matchers[Dynamic Properties in the Matchers Sections] section for YAML examples of a similar feature. +xref:project-features-contract/dsl-dynamic-properties.adoc#contract-dsl-matchers[Dynamic Properties in the Matchers Sections] section for YAML examples of a similar feature. You can set the properties inside the body either with the `value` method or, if you use the Groovy map notation, with `$()`. The following example shows how to set dynamic @@ -53,7 +55,7 @@ method. Subsequent sections take a closer look at what you can do with those val == Regular Expressions IMPORTANT: This section is valid only for the Groovy DSL. See the -xref:_project-features-contract/dsl-dynamic-properties.adoc#contract-dsl-matchers[Dynamic Properties in the Matchers Sections] section for YAML examples of a similar feature. +xref:project-features-contract/dsl-dynamic-properties.adoc#contract-dsl-matchers[Dynamic Properties in the Matchers Sections] section for YAML examples of a similar feature. You can use regular expressions to write your requests in the contract DSL. Doing so is particularly useful when you want to indicate that a given response should be provided @@ -63,7 +65,7 @@ need to use patterns and not exact values both for your tests and your server-si Make sure that regex matches a whole region of a sequence, as, internally, https://docs.oracle.com/javase/8/docs/api/java/util/regex/Matcher.html#matches[`Pattern.matches()`] is called. For instance, `abc` does not match `aabc`, but `.abc` does. -There are several additional xref:_project-features-contract/dsl-dynamic-properties.adoc#contract-dsl-regex-limitations[known limitations] as well. +There are several additional xref:project-features-contract/dsl-dynamic-properties.adoc#contract-dsl-regex-limitations[known limitations] as well. The following example shows how to use regular expressions to write a request: @@ -71,19 +73,19 @@ The following example shows how to use regular expressions to write a request: [source,groovy,indent=0,role="primary"] .Groovy ---- -include:../:{verifier_core_path}/src/test/groovy/org/springframework/cloud/contract/verifier/builder/ContractHttpDocsSpec.groovy[tags=regex,indent=0] +include::{verifier_root_path}/src/test/groovy/org/springframework/cloud/contract/verifier/builder/ContractHttpDocsSpec.groovy[tags=regex,indent=0] ---- [source,java,indent=0,subs="verbatim,attributes",role="secondary"] .Java ---- -include:../:{verifier_core_path}/src/test/resources/contractsToCompile/contract_docs_examples.java[tags=regex,indent=0] +include::{verifier_root_path}/src/test/resources/contractsToCompile/contract_docs_examples.java[tags=regex,indent=0] ---- [source,kotlin,indent=0,subs="verbatim,attributes",role="secondary"] .Kotlin ---- -include:../:{verifier_core_path}/src/test/resources/kotlin/contract_docs_examples.kts[tags=regex,indent=0] +include::{verifier_root_path}/src/test/resources/kotlin/contract_docs_examples.kts[tags=regex,indent=0] ---- ==== @@ -93,7 +95,7 @@ the provided regular expression. The following code shows an example for Groovy: [source,groovy,indent=0] ---- -include:../:{verifier_core_path}/src/test/groovy/org/springframework/cloud/contract/verifier/builder/SpringTestMethodBodyBuildersSpec.groovy[tags=dsl_one_side_data_generation_example,indent=0] +include::{verifier_root_path}/src/test/groovy/org/springframework/cloud/contract/verifier/builder/SpringTestMethodBodyBuildersSpec.groovy[tags=dsl_one_side_data_generation_example,indent=0] ---- In the preceding example, the opposite side of the communication has the respective data @@ -104,14 +106,14 @@ use in your contracts, as the following example shows: [source,java,indent=0] ---- -include:../:{contract_spec_path}/src/main/java/org/springframework/cloud/contract/spec/internal/RegexPatterns.java[tags=regexps,indent=0] +include::{contract_spec_path}/src/main/java/org/springframework/cloud/contract/spec/internal/RegexPatterns.java[tags=regexps,indent=0] ---- In your contract, you can use it as follows (example for the Groovy DSL): [source,groovy,indent=0] ---- -include:../:{verifier_core_path}/src/test/groovy/org/springframework/cloud/contract/verifier/builder/SpringTestMethodBodyBuildersSpec.groovy[tags=contract_with_regex,indent=0] +include::{verifier_root_path}/src/test/groovy/org/springframework/cloud/contract/verifier/builder/SpringTestMethodBodyBuildersSpec.groovy[tags=contract_with_regex,indent=0] ---- To make matters even simpler, you can use a set of predefined objects that automatically @@ -120,7 +122,7 @@ All of those methods start with the `any` prefix, as follows: [source,java,indent=0] ---- -include:../:{contract_spec_path}/src/main/java/org/springframework/cloud/contract/spec/internal/RegexCreatingProperty.java[tags=regex_creating_props,indent=0] +include::{contract_spec_path}/src/main/java/org/springframework/cloud/contract/spec/internal/RegexCreatingProperty.java[tags=regex_creating_props,indent=0] ---- The following example shows how you can reference those methods: @@ -129,13 +131,13 @@ The following example shows how you can reference those methods: [source,groovy,indent=0,role="primary"] .Groovy ---- -include:../:{verifier_core_path}/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MessagingMethodBodyBuilderSpec.groovy[tags=regex_creating_props,indent=0] +include::{verifier_root_path}/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MessagingMethodBodyBuilderSpec.groovy[tags=regex_creating_props,indent=0] ---- [source,kotlin,indent=0,subs="verbatim,attributes",role="secondary"] .Kotlin ---- -include:../:{verifier_core_path}/src/test/resources/kotlin/contract_docs_examples.kts[tags=regex_creating_props,indent=0] +include::{verifier_root_path}/src/test/resources/kotlin/contract_docs_examples.kts[tags=regex_creating_props,indent=0] ---- ==== @@ -154,7 +156,7 @@ See https://github.com/spring-cloud/spring-cloud-contract/issues/900[Issue 900]. == Passing Optional Parameters IMPORTANT: This section is valid only for Groovy DSL. See the -xref:_project-features-contract/dsl-dynamic-properties.adoc#contract-dsl-matchers[Dynamic Properties in the Matchers Sections] section for YAML examples of a similar feature. +xref:project-features-contract/dsl-dynamic-properties.adoc#contract-dsl-matchers[Dynamic Properties in the Matchers Sections] section for YAML examples of a similar feature. You can provide optional parameters in your contract. However, you can provide optional parameters only for the following: @@ -168,19 +170,19 @@ The following example shows how to provide optional parameters: [source,groovy,indent=0,role="primary"] .Groovy ---- -include:../:{verifier_core_path}/src/test/groovy/org/springframework/cloud/contract/verifier/builder/ContractHttpDocsSpec.groovy[tags=optionals,indent=0] +include::{verifier_root_path}/src/test/groovy/org/springframework/cloud/contract/verifier/builder/ContractHttpDocsSpec.groovy[tags=optionals,indent=0] ---- [source,java,indent=0,subs="verbatim,attributes",role="secondary"] .Java ---- -include:../:{verifier_core_path}/src/test/resources/contractsToCompile/contract_docs_examples.java[tags=optionals,indent=0] +include::{verifier_root_path}/src/test/resources/contractsToCompile/contract_docs_examples.java[tags=optionals,indent=0] ---- [source,kotlin,indent=0,subs="verbatim,attributes",role="secondary"] .Kotlin ---- -include:../:{verifier_core_path}/src/test/resources/kotlin/contract_docs_examples.kts[tags=optionals,indent=0] +include::{verifier_root_path}/src/test/resources/kotlin/contract_docs_examples.kts[tags=optionals,indent=0] ---- ==== @@ -193,7 +195,7 @@ If you use Spock, the following test would be generated from the previous exampl [source,groovy,indent=0] .Groovy ---- -include:../:{verifier_core_path}/src/test/groovy/org/springframework/cloud/contract/verifier/builder/ContractHttpDocsSpec.groovy[tags=optionals_test,indent=0] +include::{verifier_root_path}/src/test/groovy/org/springframework/cloud/contract/verifier/builder/ContractHttpDocsSpec.groovy[tags=optionals_test,indent=0] ---- ==== @@ -201,14 +203,14 @@ The following stub would also be generated: [source,groovy,indent=0] ---- -include:../:{plugins_path}/spring-cloud-contract-converters/src/test/groovy/org/springframework/cloud/contract/verifier/wiremock/DslToWireMockClientConverterSpec.groovy[tags=wiremock,indent=0] +include::{plugins_path}/spring-cloud-contract-converters/src/test/groovy/org/springframework/cloud/contract/verifier/wiremock/DslToWireMockClientConverterSpec.groovy[tags=wiremock,indent=0] ---- [[contract-dsl-custom-methods]] == Calling Custom Methods on the Server Side IMPORTANT: This section is valid only for the Groovy DSL. See the -xref:_project-features-contract/dsl-dynamic-properties.adoc#contract-dsl-matchers[Dynamic Properties in the Matchers Sections] section for YAML examples of a similar feature. +xref:project-features-contract/dsl-dynamic-properties.adoc#contract-dsl-matchers[Dynamic Properties in the Matchers Sections] section for YAML examples of a similar feature. You can define a method call that runs on the server side during the test. Such a method can be added to the class defined as `baseClassForTests` in the configuration. The @@ -218,19 +220,19 @@ following code shows an example of the contract portion of the test case: [source,groovy,indent=0,role="primary"] .Groovy ---- -include:../:{verifier_core_path}/src/test/groovy/org/springframework/cloud/contract/verifier/builder/ContractHttpDocsSpec.groovy[tags=method,indent=0] +include::{verifier_root_path}/src/test/groovy/org/springframework/cloud/contract/verifier/builder/ContractHttpDocsSpec.groovy[tags=method,indent=0] ---- [source,java,indent=0,subs="verbatim,attributes",role="secondary"] .Java ---- -include:../:{verifier_core_path}/src/test/resources/contractsToCompile/contract_docs_examples.java[tags=method,indent=0] +include::{verifier_root_path}/src/test/resources/contractsToCompile/contract_docs_examples.java[tags=method,indent=0] ---- [source,kotlin,indent=0,subs="verbatim,attributes",role="secondary"] .Kotlin ---- -include:../:{verifier_core_path}/src/test/resources/kotlin/contract_docs_examples.kts[tags=method,indent=0] +include::{verifier_root_path}/src/test/resources/kotlin/contract_docs_examples.kts[tags=method,indent=0] ---- ==== @@ -238,7 +240,7 @@ The following code shows the base class portion of the test case: [source,groovy,indent=0] ---- -include:../:{plugins_path}/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/bootSimple/src/test/groovy/org/springframework/cloud/contract/verifier/twitter/places/BaseMockMvcSpec.groovy[tags=base_class,indent=0] +include::{plugins_path}/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/bootSimple/src/test/groovy/org/springframework/cloud/contract/verifier/twitter/places/BaseMockMvcSpec.groovy[tags=base_class,indent=0] ---- IMPORTANT: You cannot use both a `String` and `execute` to perform concatenation. For @@ -265,7 +267,7 @@ The following example shows how to read an object from JSON: [source,groovy,indent=0] ---- -include:../:{verifier_core_path}/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MethodBodyBuilderSpec.groovy[tags=body_execute,indent=0] +include::{verifier_root_path}/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MethodBodyBuilderSpec.groovy[tags=body_execute,indent=0] ---- The preceding example results in calling the `hashCode()` method in the request body. @@ -329,13 +331,13 @@ Consider the following contract: [source,groovy,indent=0,role="primary"] .Groovy ---- -include:../:{verifier_core_path}/src/test/groovy/org/springframework/cloud/contract/verifier/builder/SpringTestMethodBodyBuildersSpec.groovy[tags=template_contract,indent=0] +include::{verifier_root_path}/src/test/groovy/org/springframework/cloud/contract/verifier/builder/SpringTestMethodBodyBuildersSpec.groovy[tags=template_contract,indent=0] ---- [source,yaml,indent=0,role="secondary"] .YAML ---- -include:../:{verifier_core_path}/src/test/resources/yml/contract_reference_request.yml[indent=0] +include::{verifier_root_path}/src/test/resources/yml/contract_reference_request.yml[indent=0] ---- [source,java,indent=0,subs="verbatim,attributes",role="secondary"] @@ -399,7 +401,7 @@ contract { response { status = OK body(mapOf( - "text" to "Don't worry ${fromRequest().body("$.name")} thanks for your interested in drinking beer", + "text" to "Don't worry $\{fromRequest().body("$.name")} thanks for your interested in drinking beer", "quantity" to v(c(5), p(anyNumber)) )) headers { @@ -645,13 +647,13 @@ Consider the following example: [source,groovy,indent=0,role="primary"] .Groovy ---- -include:../:{verifier_core_path}/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MockMvcMethodBodyBuilderWithMatchersSpec.groovy[tags=matchers,indent=0] +include::{verifier_root_path}/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MockMvcMethodBodyBuilderWithMatchersSpec.groovy[tags=matchers,indent=0] ---- [source,yaml,indent=0,role="secondary"] .YAML ---- -include:../:{verifier_core_path}/src/test/resources/yml/contract_matchers.yml[indent=0] +include::{verifier_root_path}/src/test/resources/yml/contract_matchers.yml[indent=0] ---- ==== @@ -731,7 +733,7 @@ The resulting WireMock stub is in the following example: [source,json,indent=0] ---- -include:../:{plugins_path}/spring-cloud-contract-converters/src/test/groovy/org/springframework/cloud/contract/verifier/wiremock/DslToWireMockClientConverterSpec.groovy[tags=matchers,indent=0] +include::{plugins_path}/spring-cloud-contract-converters/src/test/groovy/org/springframework/cloud/contract/verifier/wiremock/DslToWireMockClientConverterSpec.groovy[tags=matchers,indent=0] ---- IMPORTANT: If you use a `matcher`, the part of the request and response that the diff --git a/docs/modules/ROOT/pages/_project-features-contract/dsl-http-top-level-elements.adoc b/docs/modules/ROOT/pages/project-features-contract/dsl-http-top-level-elements.adoc similarity index 56% rename from docs/modules/ROOT/pages/_project-features-contract/dsl-http-top-level-elements.adoc rename to docs/modules/ROOT/pages/project-features-contract/dsl-http-top-level-elements.adoc index 557f079f78..908020b62d 100644 --- a/docs/modules/ROOT/pages/_project-features-contract/dsl-http-top-level-elements.adoc +++ b/docs/modules/ROOT/pages/project-features-contract/dsl-http-top-level-elements.adoc @@ -1,6 +1,8 @@ [[contract-dsl-http-top-level-elements]] = HTTP Top-Level Elements +include::partial$_attributes.adoc[] + You can call the following methods in the top-level closure of a contract definition: * `request`: Mandatory @@ -13,29 +15,29 @@ The following example shows how to define an HTTP request contract: [source,groovy,indent=0,subs="verbatim,attributes",role="primary"] .Groovy ---- -include:../:{verifier_core_path}/src/test/groovy/org/springframework/cloud/contract/verifier/builder/ContractHttpDocsSpec.groovy[tags=http_dsl,indent=0] +include::{verifier_root_path}/src/test/groovy/org/springframework/cloud/contract/verifier/builder/ContractHttpDocsSpec.groovy[tags=http_dsl,indent=0] ---- [source,yml,indent=0,subs="verbatim,attributes",role="secondary"] .YAML ---- -include:../:{verifier_core_path}/src/test/resources/yml/contract.yml[tags=priority,indent=0] -include:../:{verifier_core_path}/src/test/resources/yml/contract.yml[tags=request,indent=0] +include::{verifier_root_path}/src/test/resources/yml/contract.yml[tags=priority,indent=0] +include::{verifier_root_path}/src/test/resources/yml/contract.yml[tags=request,indent=0] ... -include:../:{verifier_core_path}/src/test/resources/yml/contract.yml[tags=response,indent=0] +include::{verifier_root_path}/src/test/resources/yml/contract.yml[tags=response,indent=0] ... ---- [source,java,indent=0,subs="verbatim,attributes",role="secondary"] .Java ---- -include:../:{verifier_core_path}/src/test/resources/contractsToCompile/contract_docs_examples.java[tags=http_dsl,indent=0] +include::{verifier_root_path}/src/test/resources/contractsToCompile/contract_docs_examples.java[tags=http_dsl,indent=0] ---- [source,kotlin,indent=0,subs="verbatim,attributes",role="secondary"] .Kotlin ---- -include:../:{verifier_core_path}/src/test/resources/kotlin/contract_docs_examples.kts[tags=http_dsl,indent=0] +include::{verifier_root_path}/src/test/resources/kotlin/contract_docs_examples.kts[tags=http_dsl,indent=0] ---- ==== diff --git a/docs/modules/ROOT/pages/_project-features-contract/dsl-multiple.adoc b/docs/modules/ROOT/pages/project-features-contract/dsl-multiple.adoc similarity index 91% rename from docs/modules/ROOT/pages/_project-features-contract/dsl-multiple.adoc rename to docs/modules/ROOT/pages/project-features-contract/dsl-multiple.adoc index e3d3f70ce2..9a47f315c5 100644 --- a/docs/modules/ROOT/pages/_project-features-contract/dsl-multiple.adoc +++ b/docs/modules/ROOT/pages/project-features-contract/dsl-multiple.adoc @@ -1,6 +1,8 @@ [[contract-dsl-multiple]] = Multiple Contracts in One File +include::partial$_attributes.adoc[] + You can define multiple contracts in one file. Such a contract might resemble the following example: @@ -8,13 +10,13 @@ following example: [source,groovy,indent=0,role="primary"] .Groovy ---- -include:../:{plugins_path}/spring-cloud-contract-maven-plugin/src/test/projects/multiple-contracts/src/test/resources/contracts/com/hello/v1/WithList.groovy[lines=18..-1,indent=0] +include::{plugins_path}/spring-cloud-contract-maven-plugin/src/test/projects/multiple-contracts/src/test/resources/contracts/com/hello/v1/WithList.groovy[lines=18..-1,indent=0] ---- [source,yaml,indent=0,role="secondary"] .YAML ---- -include:../:{verifier_core_path}/src/test/resources/yml/multiple_contracts.yml[indent=0] +include::{verifier_root_path}/src/test/resources/yml/multiple_contracts.yml[indent=0] ---- [source,java,indent=0,subs="verbatim,attributes",role="secondary"] diff --git a/docs/modules/ROOT/pages/_project-features-contract/dsl-request.adoc b/docs/modules/ROOT/pages/project-features-contract/dsl-request.adoc similarity index 59% rename from docs/modules/ROOT/pages/_project-features-contract/dsl-request.adoc rename to docs/modules/ROOT/pages/project-features-contract/dsl-request.adoc index 906600ca8b..4c5e28936d 100644 --- a/docs/modules/ROOT/pages/_project-features-contract/dsl-request.adoc +++ b/docs/modules/ROOT/pages/project-features-contract/dsl-request.adoc @@ -1,6 +1,8 @@ [[contract-dsl-request]] = HTTP Request +include::partial$_attributes.adoc[] + The HTTP protocol requires only the method and the URL to be specified in a request. The same information is mandatory in request definition of the contract. @@ -10,25 +12,25 @@ The following example shows a contract for a request: [source,groovy,indent=0,role="primary"] .Groovy ---- -include:../:{verifier_core_path}/src/test/groovy/org/springframework/cloud/contract/verifier/builder/ContractHttpDocsSpec.groovy[tags=request,indent=0] +include::{verifier_root_path}/src/test/groovy/org/springframework/cloud/contract/verifier/builder/ContractHttpDocsSpec.groovy[tags=request,indent=0] ---- [source,yaml,indent=0,role="secondary"] .YAML ---- -include:../:{verifier_core_path}/src/test/resources/yml/contract.yml[tags=request_obligatory,indent=0] +include::{verifier_root_path}/src/test/resources/yml/contract.yml[tags=request_obligatory,indent=0] ---- [source,java,indent=0,subs="verbatim,attributes",role="secondary"] .Java ---- -include:../:{verifier_core_path}/src/test/resources/contractsToCompile/contract_docs_examples.java[tags=request,indent=0] +include::{verifier_root_path}/src/test/resources/contractsToCompile/contract_docs_examples.java[tags=request,indent=0] ---- [source,kotlin,indent=0,subs="verbatim,attributes",role="secondary"] .Kotlin ---- -include:../:{verifier_core_path}/src/test/resources/kotlin/contract_docs_examples.kts[tags=request,indent=0] +include::{verifier_root_path}/src/test/resources/kotlin/contract_docs_examples.kts[tags=request,indent=0] ---- ==== @@ -41,25 +43,25 @@ The following example uses `url`: [source,groovy,indent=0,role="primary"] .Groovy ---- -include:../:{verifier_core_path}/src/test/groovy/org/springframework/cloud/contract/verifier/builder/ContractHttpDocsSpec.groovy[tags=url,indent=0] +include::{verifier_root_path}/src/test/groovy/org/springframework/cloud/contract/verifier/builder/ContractHttpDocsSpec.groovy[tags=url,indent=0] ---- [source,yaml,indent=0,role="secondary"] .YAML ---- -include:../:{verifier_core_path}/src/test/resources/yml/contract_rest_with_path.yml[tags=url_path,indent=0] +include::{verifier_root_path}/src/test/resources/yml/contract_rest_with_path.yml[tags=url_path,indent=0] ---- [source,java,indent=0,subs="verbatim,attributes",role="secondary"] .Java ---- -include:../:{verifier_core_path}/src/test/resources/contractsToCompile/contract_docs_examples.java[tags=url,indent=0] +include::{verifier_root_path}/src/test/resources/contractsToCompile/contract_docs_examples.java[tags=url,indent=0] ---- [source,kotlin,indent=0,subs="verbatim,attributes",role="secondary"] .Kotlin ---- -include:../:{verifier_core_path}/src/test/resources/kotlin/contract_docs_examples.kts[tags=url,indent=0] +include::{verifier_root_path}/src/test/resources/kotlin/contract_docs_examples.kts[tags=url,indent=0] ---- ==== @@ -69,27 +71,27 @@ include:../:{verifier_core_path}/src/test/resources/kotlin/contract_docs_example [source,groovy,indent=0,subs="verbatim,attributes",role="primary"] .Groovy ---- -include:../:{verifier_core_path}/src/test/groovy/org/springframework/cloud/contract/verifier/builder/ContractHttpDocsSpec.groovy[tags=urlpath,indent=0] +include::{verifier_root_path}/src/test/groovy/org/springframework/cloud/contract/verifier/builder/ContractHttpDocsSpec.groovy[tags=urlpath,indent=0] ---- [source,yml,indent=0,subs="verbatim,attributes",role="secondary"] .YAML ---- -include:../:{verifier_core_path}/src/test/resources/yml/contract.yml[tags=request,indent=0] +include::{verifier_root_path}/src/test/resources/yml/contract.yml[tags=request,indent=0] ... -include:../:{verifier_core_path}/src/test/resources/yml/contract.yml[tags=query_params,indent=0] +include::{verifier_root_path}/src/test/resources/yml/contract.yml[tags=query_params,indent=0] ---- [source,java,indent=0,subs="verbatim,attributes",role="secondary"] .Java ---- -include:../:{verifier_core_path}/src/test/resources/contractsToCompile/contract_docs_examples.java[tags=urlpath,indent=0] +include::{verifier_root_path}/src/test/resources/contractsToCompile/contract_docs_examples.java[tags=urlpath,indent=0] ---- [source,kotlin,indent=0,subs="verbatim,attributes",role="secondary"] .Kotlin ---- -include:../:{verifier_core_path}/src/test/resources/kotlin/contract_docs_examples.kts[tags=urlpath,indent=0] +include::{verifier_root_path}/src/test/resources/kotlin/contract_docs_examples.kts[tags=urlpath,indent=0] ---- ==== @@ -99,27 +101,27 @@ include:../:{verifier_core_path}/src/test/resources/kotlin/contract_docs_example [source,groovy,indent=0,subs="verbatim,attributes",role="primary"] .Groovy ---- -include:../:{verifier_core_path}/src/test/groovy/org/springframework/cloud/contract/verifier/builder/ContractHttpDocsSpec.groovy[tags=headers,indent=0] +include::{verifier_root_path}/src/test/groovy/org/springframework/cloud/contract/verifier/builder/ContractHttpDocsSpec.groovy[tags=headers,indent=0] ---- [source,yml,indent=0,subs="verbatim,attributes",role="secondary"] .YAML ---- -include:../:{verifier_core_path}/src/test/resources/yml/contract.yml[tags=request,indent=0] +include::{verifier_root_path}/src/test/resources/yml/contract.yml[tags=request,indent=0] ... -include:../:{verifier_core_path}/src/test/resources/yml/contract.yml[tags=headers,indent=0] +include::{verifier_root_path}/src/test/resources/yml/contract.yml[tags=headers,indent=0] ---- [source,java,indent=0,subs="verbatim,attributes",role="secondary"] .Java ---- -include:../:{verifier_core_path}/src/test/resources/contractsToCompile/contract_docs_examples.java[tags=headers,indent=0] +include::{verifier_root_path}/src/test/resources/contractsToCompile/contract_docs_examples.java[tags=headers,indent=0] ---- [source,kotlin,indent=0,subs="verbatim,attributes",role="secondary"] .Kotlin ---- -include:../:{verifier_core_path}/src/test/resources/kotlin/contract_docs_examples.kts[tags=headers,indent=0] +include::{verifier_root_path}/src/test/resources/kotlin/contract_docs_examples.kts[tags=headers,indent=0] ---- ==== @@ -129,27 +131,27 @@ include:../:{verifier_core_path}/src/test/resources/kotlin/contract_docs_example [source,groovy,indent=0,subs="verbatim,attributes",role="primary"] .Groovy ---- -include:../:{verifier_core_path}/src/test/groovy/org/springframework/cloud/contract/verifier/builder/ContractHttpDocsSpec.groovy[tags=cookies,indent=0] +include::{verifier_root_path}/src/test/groovy/org/springframework/cloud/contract/verifier/builder/ContractHttpDocsSpec.groovy[tags=cookies,indent=0] ---- [source,yml,indent=0,subs="verbatim,attributes",role="secondary"] .YAML ---- -include:../:{verifier_core_path}/src/test/resources/yml/contract.yml[tags=request,indent=0] +include::{verifier_root_path}/src/test/resources/yml/contract.yml[tags=request,indent=0] ... -include:../:{verifier_core_path}/src/test/resources/yml/contract.yml[tags=cookies,indent=0] +include::{verifier_root_path}/src/test/resources/yml/contract.yml[tags=cookies,indent=0] ---- [source,java,indent=0,subs="verbatim,attributes",role="secondary"] .Java ---- -include:../:{verifier_core_path}/src/test/resources/contractsToCompile/contract_docs_examples.java[tags=cookies,indent=0] +include::{verifier_root_path}/src/test/resources/contractsToCompile/contract_docs_examples.java[tags=cookies,indent=0] ---- [source,kotlin,indent=0,subs="verbatim,attributes",role="secondary"] .Kotlin ---- -include:../:{verifier_core_path}/src/test/resources/kotlin/contract_docs_examples.kts[tags=cookies,indent=0] +include::{verifier_root_path}/src/test/resources/kotlin/contract_docs_examples.kts[tags=cookies,indent=0] ---- ==== @@ -159,27 +161,27 @@ include:../:{verifier_core_path}/src/test/resources/kotlin/contract_docs_example [source,groovy,indent=0,subs="verbatim,attributes",role="primary"] .Groovy ---- -include:../:{verifier_core_path}/src/test/groovy/org/springframework/cloud/contract/verifier/builder/ContractHttpDocsSpec.groovy[tags=body,indent=0] +include::{verifier_root_path}/src/test/groovy/org/springframework/cloud/contract/verifier/builder/ContractHttpDocsSpec.groovy[tags=body,indent=0] ---- [source,yml,indent=0,subs="verbatim,attributes",role="secondary"] .YAML ---- -include:../:{verifier_core_path}/src/test/resources/yml/contract.yml[tags=request,indent=0] +include::{verifier_root_path}/src/test/resources/yml/contract.yml[tags=request,indent=0] ... -include:../:{verifier_core_path}/src/test/resources/yml/contract.yml[tags=body,indent=0] +include::{verifier_root_path}/src/test/resources/yml/contract.yml[tags=body,indent=0] ---- [source,java,indent=0,subs="verbatim,attributes",role="secondary"] .Java ---- -include:../:{verifier_core_path}/src/test/resources/contractsToCompile/contract_docs_examples.java[tags=body,indent=0] +include::{verifier_root_path}/src/test/resources/contractsToCompile/contract_docs_examples.java[tags=body,indent=0] ---- [source,kotlin,indent=0,subs="verbatim,attributes",role="secondary"] .Kotlin ---- -include:../:{verifier_core_path}/src/test/resources/kotlin/contract_docs_examples.kts[tags=body,indent=0] +include::{verifier_root_path}/src/test/resources/kotlin/contract_docs_examples.kts[tags=body,indent=0] ---- ==== @@ -190,25 +192,25 @@ include:../:{verifier_core_path}/src/test/resources/kotlin/contract_docs_example [source,groovy,indent=0,role="primary"] .Groovy ---- -include:../:{verifier_core_path}/src/test/groovy/org/springframework/cloud/contract/verifier/builder/SpringTestMethodBodyBuildersSpec.groovy[tags=multipartdsl,indent=0] +include::{verifier_root_path}/src/test/groovy/org/springframework/cloud/contract/verifier/builder/SpringTestMethodBodyBuildersSpec.groovy[tags=multipartdsl,indent=0] ---- [source,yaml,indent=0,role="secondary"] .YAML ---- -include:../:{verifier_core_path}/src/test/resources/yml/contract_multipart.yml[indent=0] +include::{verifier_root_path}/src/test/resources/yml/contract_multipart.yml[indent=0] ---- [source,java,indent=0,subs="verbatim,attributes",role="secondary"] .Java ---- -include:../:{verifier_core_path}/src/test/resources/contractsToCompile/contract_multipart.java[tags=class,indent=0] +include::{verifier_root_path}/src/test/resources/contractsToCompile/contract_multipart.java[tags=class,indent=0] ---- [source,kotlin,indent=0,subs="verbatim,attributes",role="secondary"] .Kotlin ---- -include:../:{verifier_core_path}/src/test/resources/kotlin/multipart.kts[tags=class,indent=0] +include::{verifier_root_path}/src/test/resources/kotlin/multipart.kts[tags=class,indent=0] ---- ==== @@ -265,7 +267,7 @@ From the contract in the preceding example, the generated test and stub look as [source,json,indent=0,subs="verbatim,attributes",role="secondary"] .Stub ---- -include:../:{verifier_core_path}/src/test/groovy/org/springframework/cloud/contract/verifier/dsl/wiremock/WireMockGroovyDslSpec.groovy[tags=multipartwiremock,indent=0] +include::{verifier_root_path}/src/test/groovy/org/springframework/cloud/contract/verifier/dsl/wiremock/WireMockGroovyDslSpec.groovy[tags=multipartwiremock,indent=0] ---- ==== diff --git a/docs/modules/ROOT/pages/_project-features-contract/dsl-response.adoc b/docs/modules/ROOT/pages/project-features-contract/dsl-response.adoc similarity index 54% rename from docs/modules/ROOT/pages/_project-features-contract/dsl-response.adoc rename to docs/modules/ROOT/pages/project-features-contract/dsl-response.adoc index e656e4e802..e41435dcde 100644 --- a/docs/modules/ROOT/pages/_project-features-contract/dsl-response.adoc +++ b/docs/modules/ROOT/pages/project-features-contract/dsl-response.adoc @@ -1,6 +1,8 @@ [[contract-dsl-response]] = HTTP Response +include::partial$_attributes.adoc[] + The response must contain an HTTP status code and may contain other information. The following code shows an example: @@ -8,32 +10,32 @@ following code shows an example: [source,groovy,indent=0,subs="verbatim,attributes",role="primary"] .Groovy ---- -include:../:{verifier_core_path}/src/test/groovy/org/springframework/cloud/contract/verifier/builder/ContractHttpDocsSpec.groovy[tags=response,indent=0] +include::{verifier_root_path}/src/test/groovy/org/springframework/cloud/contract/verifier/builder/ContractHttpDocsSpec.groovy[tags=response,indent=0] ---- [source,yml,indent=0,subs="verbatim,attributes",role="secondary"] .YAML ---- -include:../:{verifier_core_path}/src/test/resources/yml/contract.yml[tags=response,indent=0] +include::{verifier_root_path}/src/test/resources/yml/contract.yml[tags=response,indent=0] ... -include:../:{verifier_core_path}/src/test/resources/yml/contract.yml[tags=response_obligatory,indent=0] +include::{verifier_root_path}/src/test/resources/yml/contract.yml[tags=response_obligatory,indent=0] ---- [source,java,indent=0,subs="verbatim,attributes",role="secondary"] .Java ---- -include:../:{verifier_core_path}/src/test/resources/contractsToCompile/contract_docs_examples.java[tags=response,indent=0] +include::{verifier_root_path}/src/test/resources/contractsToCompile/contract_docs_examples.java[tags=response,indent=0] ---- [source,kotlin,indent=0,subs="verbatim,attributes",role="secondary"] .Kotlin ---- -include:../:{verifier_core_path}/src/test/resources/kotlin/contract_docs_examples.kts[tags=response,indent=0] +include::{verifier_root_path}/src/test/resources/kotlin/contract_docs_examples.kts[tags=response,indent=0] ---- ==== Besides status, the response may contain headers, cookies, and a body, which are -specified the same way as in the request (see xref:_project-features-contract/dsl-request.adoc[HTTP Request]). +specified the same way as in the request (see xref:project-features-contract/dsl-request.adoc[HTTP Request]). TIP: In the Groovy DSL, you can reference the `org.springframework.cloud.contract.spec.internal.HttpStatus` methods to provide a meaningful status instead of a digit. For example, you can call diff --git a/docs/modules/ROOT/pages/_project-features-contract/dsl-xml.adoc b/docs/modules/ROOT/pages/project-features-contract/dsl-xml.adoc similarity index 88% rename from docs/modules/ROOT/pages/_project-features-contract/dsl-xml.adoc rename to docs/modules/ROOT/pages/project-features-contract/dsl-xml.adoc index 4d8166088c..f0a11b9f2c 100644 --- a/docs/modules/ROOT/pages/_project-features-contract/dsl-xml.adoc +++ b/docs/modules/ROOT/pages/project-features-contract/dsl-xml.adoc @@ -1,6 +1,8 @@ [[contract-dsl-xml]] = XML Support for HTTP +include::partial$_attributes.adoc[] + For HTTP contracts, we also support using XML in the request and response body. The XML body has to be passed within the `body` element as a `String` or `GString`. Also, body matchers can be provided for @@ -14,25 +16,25 @@ The following example shows a Groovy DSL contract with XML in the response body: [source,groovy,indent=0,subs="verbatim,attributes",role="primary"] .Groovy ---- -include:../:{verifier_core_path}/src/test/groovy/org/springframework/cloud/contract/verifier/builder/XmlMethodBodyBuilderSpec.groovy[tags=xmlgroovy] +include::{verifier_root_path}/src/test/groovy/org/springframework/cloud/contract/verifier/builder/XmlMethodBodyBuilderSpec.groovy[tags=xmlgroovy] ---- [source,yml,indent=0,subs="verbatim,attributes",role="secondary"] .YAML ---- -include:../:{verifier_core_path}/src/test/resources/yml/contract_rest_xml.yml[indent=0] +include::{verifier_root_path}/src/test/resources/yml/contract_rest_xml.yml[indent=0] ---- [source,java,indent=0,subs="verbatim,attributes",role="secondary"] .Java ---- -include:../:{verifier_core_path}/src/test/resources/contractsToCompile/contract_xml.java[tags=class,indent=0] +include::{verifier_root_path}/src/test/resources/contractsToCompile/contract_xml.java[tags=class,indent=0] ---- [source,kotlin,indent=0,subs="verbatim,attributes",role="secondary"] .Kotlin ---- -include:../:{verifier_core_path}/src/test/resources/kotlin/contract_xml.kts[tags=class,indent=0] +include::{verifier_root_path}/src/test/resources/kotlin/contract_xml.kts[tags=class,indent=0] ---- ==== @@ -60,9 +62,9 @@ public void validate_xmlMatches() throws Exception { // and: assertThat(valueFromXPath(parsedXml, "/test/list/elem/text()")).isEqualTo("abc"); assertThat(valueFromXPath(parsedXml,"/test/list/elem[2]/text()")).isEqualTo("def"); - assertThat(valueFromXPath(parsedXml, "/test/duck/text()")).matches("[0-9]{3}"); + assertThat(valueFromXPath(parsedXml, "/test/duck/text()")).matches("[0-9]\{3}"); assertThat(nodeFromXPath(parsedXml, "/test/duck/xxx")).isNull(); - assertThat(valueFromXPath(parsedXml, "/test/alpha/text()")).matches("[\\p{L}]*"); + assertThat(valueFromXPath(parsedXml, "/test/alpha/text()")).matches("[\\p\{L}]*"); assertThat(valueFromXPath(parsedXml, "/test/*/complex/text()")).isEqualTo("foo"); assertThat(valueFromXPath(parsedXml, "/test/duck/@type")).isEqualTo("xtype"); } diff --git a/docs/modules/ROOT/pages/_project-features-contract/groovy.adoc b/docs/modules/ROOT/pages/project-features-contract/groovy.adoc similarity index 96% rename from docs/modules/ROOT/pages/_project-features-contract/groovy.adoc rename to docs/modules/ROOT/pages/project-features-contract/groovy.adoc index 640b9a8f97..379c09687a 100644 --- a/docs/modules/ROOT/pages/_project-features-contract/groovy.adoc +++ b/docs/modules/ROOT/pages/project-features-contract/groovy.adoc @@ -2,6 +2,8 @@ = Contract DSL in Groovy :page-section-summary-toc: 1 +include::partial$_attributes.adoc[] + If you are not familiar with Groovy, do not worry. You can use Java syntax in the Groovy DSL files as well. diff --git a/docs/modules/ROOT/pages/_project-features-contract/java.adoc b/docs/modules/ROOT/pages/project-features-contract/java.adoc similarity index 97% rename from docs/modules/ROOT/pages/_project-features-contract/java.adoc rename to docs/modules/ROOT/pages/project-features-contract/java.adoc index fba47a5c12..31d38b942e 100644 --- a/docs/modules/ROOT/pages/_project-features-contract/java.adoc +++ b/docs/modules/ROOT/pages/project-features-contract/java.adoc @@ -1,6 +1,8 @@ [[contract-java]] = Contract DSL in Java +include::partial$_attributes.adoc[] + To write a contract definition in Java, you need to create a class that implements either the `Supplier` interface (for a single contract) or `Supplier>` (for multiple contracts). You can also write the contract definitions under `src/test/java` (for example, `src/test/java/contracts`) so that you do not have to modify the classpath of your project. In this case, you have to provide a new location of contract definitions to your Spring Cloud Contract plugin. diff --git a/docs/modules/ROOT/pages/_project-features-contract/kotlin.adoc b/docs/modules/ROOT/pages/project-features-contract/kotlin.adoc similarity index 97% rename from docs/modules/ROOT/pages/_project-features-contract/kotlin.adoc rename to docs/modules/ROOT/pages/project-features-contract/kotlin.adoc index 5621cb7d0e..c495c62782 100644 --- a/docs/modules/ROOT/pages/_project-features-contract/kotlin.adoc +++ b/docs/modules/ROOT/pages/project-features-contract/kotlin.adoc @@ -1,6 +1,8 @@ [[contract-kotlin]] = Contract DSL in Kotlin +include::partial$_attributes.adoc[] + To get started with writing contracts in Kotlin, you need to start with a (newly created) Kotlin Script file (`.kts`). As with the Java DSL, you can put your contracts in any directory of your choice. By default, the Maven plugin will look at the `src/test/resources/contracts` directory and Gradle plugin will @@ -52,7 +54,7 @@ buildscript { // ... } dependencies { - classpath "org.springframework.cloud:spring-cloud-contract-gradle-plugin:${scContractVersion}" + classpath "org.springframework.cloud:spring-cloud-contract-gradle-plugin:$\{scContractVersion}" } } diff --git a/docs/modules/ROOT/pages/_project-features-contract/limitations.adoc b/docs/modules/ROOT/pages/project-features-contract/limitations.adoc similarity index 94% rename from docs/modules/ROOT/pages/_project-features-contract/limitations.adoc rename to docs/modules/ROOT/pages/project-features-contract/limitations.adoc index 0191619c34..a8f6bb2749 100644 --- a/docs/modules/ROOT/pages/_project-features-contract/limitations.adoc +++ b/docs/modules/ROOT/pages/project-features-contract/limitations.adoc @@ -2,6 +2,8 @@ = Limitations :page-section-summary-toc: 1 +include::partial$_attributes.adoc[] + WARNING: The support for verifying the size of JSON arrays is experimental. If you want to turn it on, set the value of the following system property to `true`: `spring.cloud.contract.verifier.assert.size`. By default, this feature is set to `false`. diff --git a/docs/modules/ROOT/pages/_project-features-contract/stateful-contracts.adoc b/docs/modules/ROOT/pages/project-features-contract/stateful-contracts.adoc similarity index 97% rename from docs/modules/ROOT/pages/_project-features-contract/stateful-contracts.adoc rename to docs/modules/ROOT/pages/project-features-contract/stateful-contracts.adoc index c141a8b00b..564ab14776 100644 --- a/docs/modules/ROOT/pages/_project-features-contract/stateful-contracts.adoc +++ b/docs/modules/ROOT/pages/project-features-contract/stateful-contracts.adoc @@ -1,6 +1,8 @@ [[contract-stateful-contracts]] = Stateful Contracts +include::partial$_attributes.adoc[] + Stateful contracts (also known as scenarios) are contract definitions that should be read in order. This might be useful in the following situations: diff --git a/docs/modules/ROOT/pages/project-features-contract/yml.adoc b/docs/modules/ROOT/pages/project-features-contract/yml.adoc new file mode 100644 index 0000000000..1cbbb2881a --- /dev/null +++ b/docs/modules/ROOT/pages/project-features-contract/yml.adoc @@ -0,0 +1,6 @@ +[[contract-yml]] += Contract DSL in YAML +:page-section-summary-toc: 1 + +To see a schema of a YAML contract, visit the xref:../yml-schema.adoc[YML Schema] page. + diff --git a/docs/modules/ROOT/pages/_project-features-flows/context-paths.adoc b/docs/modules/ROOT/pages/project-features-flows/context-paths.adoc similarity index 81% rename from docs/modules/ROOT/pages/_project-features-flows/context-paths.adoc rename to docs/modules/ROOT/pages/project-features-flows/context-paths.adoc index 8f806362d6..823d9cdf1c 100644 --- a/docs/modules/ROOT/pages/_project-features-flows/context-paths.adoc +++ b/docs/modules/ROOT/pages/project-features-flows/context-paths.adoc @@ -1,6 +1,8 @@ [[features-context-paths]] = Working with Context Paths +include::partial$_attributes.adoc[] + Spring Cloud Contract supports context paths. [IMPORTANT] @@ -43,14 +45,14 @@ Consider the following contract: [source,groovy,indent=0] ---- -include:../:{verifier_core_path}/src/test/groovy/org/springframework/cloud/contract/verifier/builder/SingleTestGeneratorSpec.groovy[tags=context_path_contract,indent=0] +include::{verifier_root_path}/src/test/groovy/org/springframework/cloud/contract/verifier/builder/SingleTestGeneratorSpec.groovy[tags=context_path_contract,indent=0] ---- The following example shows how to set up a base class and RestAssured: [source,groovy,indent=0] ---- -include:../:{verifier_core_path}/src/test/groovy/org/springframework/cloud/contract/verifier/builder/SingleTestGeneratorSpec.groovy[tags=context_path_baseclass,indent=0] +include::{verifier_root_path}/src/test/groovy/org/springframework/cloud/contract/verifier/builder/SingleTestGeneratorSpec.groovy[tags=context_path_baseclass,indent=0] ---- If you do it this way: diff --git a/docs/modules/ROOT/pages/_project-features-flows/custom-mode.adoc b/docs/modules/ROOT/pages/project-features-flows/custom-mode.adoc similarity index 98% rename from docs/modules/ROOT/pages/_project-features-flows/custom-mode.adoc rename to docs/modules/ROOT/pages/project-features-flows/custom-mode.adoc index 5258dd6741..e8c9457d23 100644 --- a/docs/modules/ROOT/pages/_project-features-flows/custom-mode.adoc +++ b/docs/modules/ROOT/pages/project-features-flows/custom-mode.adoc @@ -1,6 +1,8 @@ [[features-custom-mode]] = Custom Mode +include::partial$_attributes.adoc[] + IMPORTANT: This mode is experimental and can change in the future. The Spring Cloud Contract lets you provide your own, custom, implementation of the diff --git a/docs/modules/ROOT/pages/_project-features-flows/feature-webflux-explicit.adoc b/docs/modules/ROOT/pages/project-features-flows/feature-webflux-explicit.adoc similarity index 61% rename from docs/modules/ROOT/pages/_project-features-flows/feature-webflux-explicit.adoc rename to docs/modules/ROOT/pages/project-features-flows/feature-webflux-explicit.adoc index d33bf0da45..dc68c5af74 100644 --- a/docs/modules/ROOT/pages/_project-features-flows/feature-webflux-explicit.adoc +++ b/docs/modules/ROOT/pages/project-features-flows/feature-webflux-explicit.adoc @@ -1,6 +1,8 @@ [[feature-webflux-explicit]] = WebFlux with Explicit Mode +include::partial$_attributes.adoc[] + You can also use WebFlux with the explicit mode in your generated tests to work with WebFlux. The following example shows how to configure using explicit mode: @@ -28,19 +30,5 @@ contracts { ---- ==== -The following example shows how to set up a base class and RestAssured for Web Flux: - -==== -[source,groovy,indent=0] ----- -include:../:{samples_url}/producer_webflux/src/test/java/com/example/BeerRestBase.java[tags=annotations,indent=0] - - // your tests go here - - // in this config class you define all controllers and mocked services -include:../:{samples_url}/producer_webflux/src/test/java/com/example/BeerRestBase.java[tags=config,indent=0] - -} ----- -==== +The following {samples_url}/producer_webflux/[example] shows how to set up a base class and RestAssured for Web Flux. diff --git a/docs/modules/ROOT/pages/_project-features-flows/feature-webflux.adoc b/docs/modules/ROOT/pages/project-features-flows/feature-webflux.adoc similarity index 97% rename from docs/modules/ROOT/pages/_project-features-flows/feature-webflux.adoc rename to docs/modules/ROOT/pages/project-features-flows/feature-webflux.adoc index 016113e6d0..419105855b 100644 --- a/docs/modules/ROOT/pages/_project-features-flows/feature-webflux.adoc +++ b/docs/modules/ROOT/pages/project-features-flows/feature-webflux.adoc @@ -1,6 +1,8 @@ [[feature-webflux]] = WebFlux with WebTestClient +include::partial$_attributes.adoc[] + You can work with WebFlux by using WebTestClient. The following listing shows how to configure WebTestClient as the test mode: diff --git a/docs/modules/ROOT/pages/_project-features-flows/graphql.adoc b/docs/modules/ROOT/pages/project-features-flows/graphql.adoc similarity index 99% rename from docs/modules/ROOT/pages/_project-features-flows/graphql.adoc rename to docs/modules/ROOT/pages/project-features-flows/graphql.adoc index f4c67cbca3..487776591c 100644 --- a/docs/modules/ROOT/pages/_project-features-flows/graphql.adoc +++ b/docs/modules/ROOT/pages/project-features-flows/graphql.adoc @@ -1,6 +1,8 @@ [[features-graphql]] = GraphQL +include::partial$_attributes.adoc[] + Since https://graphql.org/[GraphQL] is essentially HTTP you can write a contract for it by creating a standard HTTP contract with an additional `metadata` entry with key `verifier` and a mapping `tool=graphql`. ==== diff --git a/docs/modules/ROOT/pages/_project-features-flows/grpc.adoc b/docs/modules/ROOT/pages/project-features-flows/grpc.adoc similarity index 99% rename from docs/modules/ROOT/pages/_project-features-flows/grpc.adoc rename to docs/modules/ROOT/pages/project-features-flows/grpc.adoc index d8c5d7d75b..344d7ad927 100644 --- a/docs/modules/ROOT/pages/_project-features-flows/grpc.adoc +++ b/docs/modules/ROOT/pages/project-features-flows/grpc.adoc @@ -1,6 +1,8 @@ [[features-grpc]] = GRPC +include::partial$_attributes.adoc[] + https://grpc.io/[GRPC] is an RPC framework built on top of HTTP/2 for which Spring Cloud Contract has basic support. IMPORTANT: Spring Cloud Contract has an experimental support for basic use cases of GRPC. Unfortunately, due to GRPC's tweaking of the HTTP/2 Header frames, it's impossible to assert the `grpc-status` header. diff --git a/docs/modules/ROOT/pages/_project-features-flows/jax-rs.adoc b/docs/modules/ROOT/pages/project-features-flows/jax-rs.adoc similarity index 75% rename from docs/modules/ROOT/pages/_project-features-flows/jax-rs.adoc rename to docs/modules/ROOT/pages/project-features-flows/jax-rs.adoc index 9f951c19fb..35704b2b84 100644 --- a/docs/modules/ROOT/pages/_project-features-flows/jax-rs.adoc +++ b/docs/modules/ROOT/pages/project-features-flows/jax-rs.adoc @@ -1,6 +1,8 @@ [[features-jax-rs]] = JAX-RS +include::partial$_attributes.adoc[] + The Spring Cloud Contract supports the JAX-RS 2 Client API. The base class needs to define `protected WebTarget webTarget` and server initialization. The only option for testing JAX-RS API is to start a web server. Also, a request with a body needs to have a @@ -20,7 +22,7 @@ The following example shows a generated test API: ==== [source,groovy,indent=0] ---- -include:../:{verifier_core_path}/src/test/groovy/org/springframework/cloud/contract/verifier/builder/JaxRsClientMethodBuilderSpec.groovy[tags=jaxrs,indent=0] +include::{verifier_root_path}/src/test/groovy/org/springframework/cloud/contract/verifier/builder/JaxRsClientMethodBuilderSpec.groovy[tags=jaxrs,indent=0] ---- ==== diff --git a/docs/modules/ROOT/pages/_project-features-flows/rest-docs.adoc b/docs/modules/ROOT/pages/project-features-flows/rest-docs.adoc similarity index 92% rename from docs/modules/ROOT/pages/_project-features-flows/rest-docs.adoc rename to docs/modules/ROOT/pages/project-features-flows/rest-docs.adoc index b9b540717a..74fc1285ef 100644 --- a/docs/modules/ROOT/pages/_project-features-flows/rest-docs.adoc +++ b/docs/modules/ROOT/pages/project-features-flows/rest-docs.adoc @@ -1,6 +1,8 @@ [[features-rest-docs]] = Working with REST Docs +include::partial$_attributes.adoc[] + You can use https://projects.spring.io/spring-restdocs[Spring REST Docs] to generate documentation (for example, in Asciidoc format) for an HTTP API with Spring MockMvc, WebTestClient, or RestAssured. At the same time that you generate documentation for your API, you can also @@ -177,7 +179,7 @@ methods to create request matchers, but you cannot use both approaches. On the consumer side, you can make the `resource.json` generated earlier in this section available on the classpath (by -xref:_project-features-stubrunner/stub-runner-publishing-stubs-as-jars.adoc[Publishing Stubs as JARs], for example). After that, you can create a stub that uses WireMock in a +xref:../project-features-stubrunner/stub-runner-publishing-stubs-as-jars.adoc[Publishing Stubs as JARs], for example). After that, you can create a stub that uses WireMock in a number of different ways, including by using `@AutoConfigureWireMock(stubs="classpath:resource.json")`, as described earlier in this document. @@ -203,7 +205,7 @@ Consider the following test: ==== [source,java] ---- -include:../:{wiremock_tests}/src/test/java/org/springframework/cloud/contract/wiremock/restdocs/ContractDslSnippetTests.java[tags=contract_snippet] +include::{wiremock_tests}/src/test/java/org/springframework/cloud/contract/wiremock/restdocs/ContractDslSnippetTests.java[tags=contract_snippet] ---- ==== @@ -254,7 +256,7 @@ contract. The location of this file would be `index/dsl-contract.adoc`. The method `SpringCloudContractRestDocs.dslContract()` takes an optional Map parameter that allows you to specify additional attributes in the template. -One of these attributes is the xref:_project-features-contract/dsl-http-top-level-elements.adoc[priority] field that you may specify as follows: +One of these attributes is the xref:project-features-contract/dsl-http-top-level-elements.adoc[priority] field that you may specify as follows: [source,java,indent=0] ---- @@ -297,9 +299,9 @@ should be changed to: Templates are resolved by looking for resources on the classpath. The following locations are checked in order: -* `org/springframework/restdocs/templates/${templateFormatId}/${name}.snippet` -* `org/springframework/restdocs/templates/${name}.snippet` -* `org/springframework/restdocs/templates/${templateFormatId}/default-${name}.snippet` +* `org/springframework/restdocs/templates/$\{templateFormatId}/$\{name}.snippet` +* `org/springframework/restdocs/templates/$\{name}.snippet` +* `org/springframework/restdocs/templates/$\{templateFormatId}/default-$\{name}.snippet` Therefore in the example above you should place a file named custom-dsl-template.snippet in `src/test/resources/org/springframework/restdocs/templates/custom-dsl-template.snippet` diff --git a/docs/modules/ROOT/pages/project-features-integrations.adoc b/docs/modules/ROOT/pages/project-features-integrations.adoc new file mode 100644 index 0000000000..787789ca38 --- /dev/null +++ b/docs/modules/ROOT/pages/project-features-integrations.adoc @@ -0,0 +1,4 @@ +[[flows]] += Spring Cloud Contract Integrations + +In these pages you will be able to learn about different Spring Cloud Contract integrations. \ No newline at end of file diff --git a/docs/modules/ROOT/pages/_project-features-messaging.adoc b/docs/modules/ROOT/pages/project-features-messaging.adoc similarity index 94% rename from docs/modules/ROOT/pages/_project-features-messaging.adoc rename to docs/modules/ROOT/pages/project-features-messaging.adoc index a51d0b6b8b..3d04f1cd8d 100644 --- a/docs/modules/ROOT/pages/_project-features-messaging.adoc +++ b/docs/modules/ROOT/pages/project-features-messaging.adoc @@ -1,6 +1,7 @@ [[features-messaging]] = Messaging +include::partial$_attributes.adoc[] Spring Cloud Contract lets you verify applications that use messaging as a means of communication. All of the integrations shown in this document work with Spring, @@ -12,9 +13,9 @@ but you can also create one of your own and use that. The DSL for messaging looks a little bit different than the one that focuses on HTTP. The following sections explain the differences: -* xref:_project-features-messaging.adoc#contract-dsl-output-triggered-method[Output Triggered by a Method] -* xref:_project-features-messaging.adoc#contract-dsl-consumer-producer[Consumer/Producer] -* xref:_project-features-messaging.adoc#contract-dsl-messaging-common[Common] +* xref:project-features-messaging.adoc#contract-dsl-output-triggered-method[Output Triggered by a Method] +* xref:project-features-messaging.adoc#contract-dsl-consumer-producer[Consumer/Producer] +* xref:project-features-messaging.adoc#contract-dsl-messaging-common[Common] [[contract-dsl-output-triggered-method]] === Output Triggered by a Method @@ -32,7 +33,7 @@ include::{tests_path}/samples-messaging-integration/src/test/groovy/com/example/ [source,groovy,indent=0,subs="verbatim,attributes",role="secondary"] .YAML ---- -include::{verifier_core_path}/src/test/resources/yml/contract_message_method.yml[indent=0] +include::{verifier_root_path}/src/test/resources/yml/contract_message_method.yml[indent=0] ---- ==== @@ -152,14 +153,14 @@ Consider the following contract: [source,groovy,indent=0,subs="verbatim,attributes",role="primary"] .Groovy ---- -include::{verifier_core_path}/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MessagingMethodBodyBuilderSpec.groovy[tags=trigger_method_dsl] +include::{verifier_root_path}/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MessagingMethodBodyBuilderSpec.groovy[tags=trigger_method_dsl] ---- [source,yml,indent=0,subs="verbatim,attributes",role="secondary"] .YAML [source,yml,indent=0] ---- -include::{verifier_core_path}/src/test/resources/yml/contract_message_scenario1.yml[indent=0] +include::{verifier_root_path}/src/test/resources/yml/contract_message_scenario1.yml[indent=0] ---- ===== @@ -169,13 +170,13 @@ For the preceding example, the following test would be created: [source,java,indent=0,subs="verbatim,attributes",role="primary"] .JUnit ---- -include::{verifier_core_path}/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MessagingMethodBodyBuilderSpec.groovy[tags=trigger_method_junit_test] +include::{verifier_root_path}/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MessagingMethodBodyBuilderSpec.groovy[tags=trigger_method_junit_test] ---- [source,groovy,indent=0,subs="verbatim,attributes",role="secondary"] .Spock ---- -include::{verifier_core_path}/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MessagingMethodBodyBuilderSpec.groovy[tags=trigger_method_test] +include::{verifier_root_path}/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MessagingMethodBodyBuilderSpec.groovy[tags=trigger_method_test] ---- ==== @@ -208,10 +209,10 @@ or the other in your tests. `StubTrigger` gives you the following options to trigger a message: -* xref:_project-features-messaging.adoc#features-messaging-trigger-label[Trigger by Label] -* xref:_project-features-messaging.adoc#features-messaging-trigger-group-artifact-ids[Trigger by Group and Artifact IDs] -* xref:_project-features-messaging.adoc#features-messaging-trigger-artifact-ids[Trigger by Artifact IDs] -* xref:_project-features-messaging.adoc#features-messaging-trigger-all-messages[Trigger All Messages] +* xref:project-features-messaging.adoc#features-messaging-trigger-label[Trigger by Label] +* xref:project-features-messaging.adoc#features-messaging-trigger-group-artifact-ids[Trigger by Group and Artifact IDs] +* xref:project-features-messaging.adoc#features-messaging-trigger-artifact-ids[Trigger by Artifact IDs] +* xref:project-features-messaging.adoc#features-messaging-trigger-all-messages[Trigger All Messages] [[features-messaging-trigger-label]] === Trigger by Label diff --git a/docs/modules/ROOT/pages/_project-features-stubrunner.adoc b/docs/modules/ROOT/pages/project-features-stubrunner.adoc similarity index 100% rename from docs/modules/ROOT/pages/_project-features-stubrunner.adoc rename to docs/modules/ROOT/pages/project-features-stubrunner.adoc diff --git a/docs/modules/ROOT/pages/_project-features-stubrunner/stub-runner-boot.adoc b/docs/modules/ROOT/pages/project-features-stubrunner/stub-runner-boot.adoc similarity index 80% rename from docs/modules/ROOT/pages/_project-features-stubrunner/stub-runner-boot.adoc rename to docs/modules/ROOT/pages/project-features-stubrunner/stub-runner-boot.adoc index e63a0b3512..ba91208dcd 100644 --- a/docs/modules/ROOT/pages/_project-features-stubrunner/stub-runner-boot.adoc +++ b/docs/modules/ROOT/pages/project-features-stubrunner/stub-runner-boot.adoc @@ -1,6 +1,8 @@ [[features-stub-runner-boot]] = Using the Stub Runner Boot Application +include::partial$_attributes.adoc[] + Spring Cloud Contract Stub Runner Boot is a Spring Boot application that exposes REST endpoints to trigger the messaging labels and to access WireMock servers. @@ -12,7 +14,7 @@ stubs even if they don't actually require it. Since this is a testing utility - to be used in production environments. IMPORTANT: It is expected that **only a trusted client** has access to the Stub Runner Boot server. You should not -run this application as a Fat Jar or a link:docker-project.html#docker-stubrunner[Docker Image] in untrusted locations. +run this application as a Fat Jar or a xref:../docker-project.adoc[Docker Image] in untrusted locations. [[features-stub-runner-boot-server]] == Stub Runner Server @@ -28,7 +30,7 @@ compile "org.springframework.cloud:spring-cloud-starter-stub-runner" Then annotate a class with `@EnableStubRunnerServer`, build a fat jar, and it is ready to work. -For the properties, see the xref:_project-features-stubrunner/stub-runner-junit.adoc#features-stub-runner-rule-spring[Stub Runner Spring] section. +For the properties, see the xref:../project-features-stubrunner/stub-runner-junit.adoc#features-stub-runner-rule-spring[Stub Runner Spring] section. [[features-stub-runner-boot-how-fat-jar]] == Stub Runner Server Fat Jar @@ -74,8 +76,8 @@ the Stub Runner server. It is available at port `8750`. Stub Runner Boot offers two endpoints: -* xref:_project-features-stubrunner/stub-runner-boot.adoc#features-stub-runner-boot-endpoints-http[HTTP] -* xref:_project-features-stubrunner/stub-runner-boot.adoc#features-stub-runner-boot-endpoints-messaging[Messaging] +* xref:../project-features-stubrunner/stub-runner-boot.adoc#features-stub-runner-boot-endpoints-http[HTTP] +* xref:../project-features-stubrunner/stub-runner-boot.adoc#features-stub-runner-boot-endpoints-messaging[Messaging] [[features-stub-runner-boot-endpoints-http]] === HTTP @@ -83,7 +85,7 @@ Stub Runner Boot offers two endpoints: For HTTP, Stub Runner Boot makes the following endpoints available: - GET `/stubs`: Returns a list of all running stubs in `ivy:integer` notation -- GET `/stubs/{ivy}`: Returns a port for the given `ivy` notation (when calling the endpoint `ivy` can also be `artifactId` only) +- GET `/stubs/\{ivy}`: Returns a port for the given `ivy` notation (when calling the endpoint `ivy` can also be `artifactId` only) [[features-stub-runner-boot-endpoints-messaging]] === Messaging @@ -91,8 +93,8 @@ For HTTP, Stub Runner Boot makes the following endpoints available: For Messaging, Stub Runner Boot makes the following endpoints available: - GET `/triggers`: Returns a list of all running labels in `ivy : [ label1, label2 ...]` notation -- POST `/triggers/{label}`: Runs a trigger with `label` -- POST `/triggers/{ivy}/{label}`: Runs a trigger with a `label` for the given `ivy` notation +- POST `/triggers/\{label}`: Runs a trigger with `label` +- POST `/triggers/\{ivy}/\{label}`: Runs a trigger with a `label` for the given `ivy` notation (when calling the endpoint, `ivy` can also be `artifactId` only) [[features-stub-runner-boot-endpoints-example]] @@ -102,7 +104,7 @@ The following example shows typical usage of Stub Runner Boot: [source,groovy,indent=0] ---- -include:../:{stubrunner_core_path}/src/test/groovy/org/springframework/cloud/contract/stubrunner/server/StubRunnerBootSpec.groovy[tags=boot_usage] +include::{stubrunner_core_path}/src/test/groovy/org/springframework/cloud/contract/stubrunner/server/StubRunnerBootSpec.groovy[tags=boot_usage] ---- [[features-stub-runner-boot-service-discovery]] @@ -121,8 +123,8 @@ use a service discovery tool. Stub Runner Boot lets you solve this issue by star required stubs and registering them in a service discovery tool. Now assume that we want to start this application so that the stubs get automatically registered. -We can do so by running the application with `java -jar ${SYSTEM_PROPS} stub-runner-boot-eureka-example.jar`, where -`${SYSTEM_PROPS}`. +We can do so by running the application with `java -jar $\{SYSTEM_PROPS} stub-runner-boot-eureka-example.jar`, where +`$\{SYSTEM_PROPS}`. That way, your deployed application can send requests to started WireMock servers through service discovery. Most likely, points 1 through 3 could be set by default in `application.yml`, because they are not diff --git a/docs/modules/ROOT/pages/_project-features-stubrunner/stub-runner-cloud.adoc b/docs/modules/ROOT/pages/project-features-stubrunner/stub-runner-cloud.adoc similarity index 98% rename from docs/modules/ROOT/pages/_project-features-stubrunner/stub-runner-cloud.adoc rename to docs/modules/ROOT/pages/project-features-stubrunner/stub-runner-cloud.adoc index 70be63c9a6..10457f5dea 100644 --- a/docs/modules/ROOT/pages/_project-features-stubrunner/stub-runner-cloud.adoc +++ b/docs/modules/ROOT/pages/project-features-stubrunner/stub-runner-cloud.adoc @@ -1,6 +1,8 @@ [[features-stub-runner-cloud]] = Stub Runner Spring Cloud +include::partial$_attributes.adoc[] + Stub Runner can integrate with Spring Cloud. For real life examples, see: diff --git a/docs/modules/ROOT/pages/_project-features-stubrunner/stub-runner-common.adoc b/docs/modules/ROOT/pages/project-features-stubrunner/stub-runner-common.adoc similarity index 88% rename from docs/modules/ROOT/pages/_project-features-stubrunner/stub-runner-common.adoc rename to docs/modules/ROOT/pages/project-features-stubrunner/stub-runner-common.adoc index 487058628c..10ccc3c817 100644 --- a/docs/modules/ROOT/pages/_project-features-stubrunner/stub-runner-common.adoc +++ b/docs/modules/ROOT/pages/project-features-stubrunner/stub-runner-common.adoc @@ -1,10 +1,12 @@ [[features-stub-runner-common]] = Common Properties +include::partial$_attributes.adoc[] + This section briefly describes common properties, including: -* xref:_project-features-stubrunner/stub-runner-common.adoc#features-stub-runner-common-properties-junit-spring[Common Properties for JUnit and Spring] -* xref:_project-features-stubrunner/stub-runner-common.adoc#features-stub-runner-stub-runner-stub-ids[Stub Runner Stubs IDs] +* xref:../project-features-stubrunner/stub-runner-common.adoc#features-stub-runner-common-properties-junit-spring[Common Properties for JUnit and Spring] +* xref:../project-features-stubrunner/stub-runner-common.adoc#features-stub-runner-stub-runner-stub-ids[Stub Runner Stubs IDs] [[features-stub-runner-common-properties-junit-spring]] == Common Properties for JUnit and Spring diff --git a/docs/modules/ROOT/pages/_project-features-stubrunner/stub-runner-core.adoc b/docs/modules/ROOT/pages/project-features-stubrunner/stub-runner-core.adoc similarity index 92% rename from docs/modules/ROOT/pages/_project-features-stubrunner/stub-runner-core.adoc rename to docs/modules/ROOT/pages/project-features-stubrunner/stub-runner-core.adoc index d9b97944d7..014379644e 100644 --- a/docs/modules/ROOT/pages/_project-features-stubrunner/stub-runner-core.adoc +++ b/docs/modules/ROOT/pages/project-features-stubrunner/stub-runner-core.adoc @@ -1,6 +1,8 @@ [[features-stub-runner-core]] = Stub Runner Core +include::partial$_attributes.adoc[] + The stub runner core runs stubs for service collaborators. Treating stubs as contracts of services lets you use stub-runner as an implementation of https://martinfowler.com/articles/consumerDrivenContracts.html[Consumer-driven Contracts]. @@ -183,7 +185,7 @@ example shows how to do so: ==== [source,groovy,indent=0] ---- -include:../:{stubrunner_core_path}/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/StubRunnerConfigurationSpec.groovy[tags=wireMockHttpServerStubConfigurer] +include::{stubrunner_core_path}/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/StubRunnerConfigurationSpec.groovy[tags=wireMockHttpServerStubConfigurer] ---- ==== @@ -192,7 +194,7 @@ You can then reuse it with the `@AutoConfigureStubRunner` annotation, as follows ==== [source,groovy,indent=0] ---- -include:../:{stubrunner_core_path}/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/StubRunnerConfigurationSpec.groovy[tags=annotation] +include::{stubrunner_core_path}/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/StubRunnerConfigurationSpec.groovy[tags=annotation] ---- ==== @@ -203,9 +205,9 @@ Whenever an HTTPS port is found, it takes precedence over the HTTP port. This section describes how to run stubs. It contains the following topics: -* xref:_project-features-stubrunner/stub-runner-core.adoc#features-stub-runner-http-stubs[HTTP Stubs] -* xref:_project-features-stubrunner/stub-runner-core.adoc#features-stub-runner-viewing[Viewing Registered Mappings] -* xref:_project-features-stubrunner/stub-runner-core.adoc#features-stub-runner-messaging[Messaging Stubs] +* xref:../project-features-stubrunner/stub-runner-core.adoc#features-stub-runner-http-stubs[HTTP Stubs] +* xref:../project-features-stubrunner/stub-runner-core.adoc#features-stub-runner-viewing[Viewing Registered Mappings] +* xref:../project-features-stubrunner/stub-runner-core.adoc#features-stub-runner-messaging[Messaging Stubs] [[features-stub-runner-http-stubs]] === HTTP Stubs diff --git a/docs/modules/ROOT/pages/_project-features-stubrunner/stub-runner-fail-on-no-stubs.adoc b/docs/modules/ROOT/pages/project-features-stubrunner/stub-runner-fail-on-no-stubs.adoc similarity index 97% rename from docs/modules/ROOT/pages/_project-features-stubrunner/stub-runner-fail-on-no-stubs.adoc rename to docs/modules/ROOT/pages/project-features-stubrunner/stub-runner-fail-on-no-stubs.adoc index 3480c144f3..2888637c6e 100644 --- a/docs/modules/ROOT/pages/_project-features-stubrunner/stub-runner-fail-on-no-stubs.adoc +++ b/docs/modules/ROOT/pages/project-features-stubrunner/stub-runner-fail-on-no-stubs.adoc @@ -1,6 +1,8 @@ [[features-stub-runner-fail-on-no-stubs]] = Fail On No Stubs +include::partial$_attributes.adoc[] + By default, Stub Runner will fail if no stubs are found. In order to change that behavior, set the `failOnNoStubs` property to `false` in the annotation or call the `withFailOnNoStubs(false)` method on a JUnit Rule or Extension. The following example shows how to do so: ==== diff --git a/docs/modules/ROOT/pages/_project-features-stubrunner/stub-runner-generate-stubs-at-runtime.adoc b/docs/modules/ROOT/pages/project-features-stubrunner/stub-runner-generate-stubs-at-runtime.adoc similarity index 87% rename from docs/modules/ROOT/pages/_project-features-stubrunner/stub-runner-generate-stubs-at-runtime.adoc rename to docs/modules/ROOT/pages/project-features-stubrunner/stub-runner-generate-stubs-at-runtime.adoc index 66b064fd5f..ccbf4e35cc 100644 --- a/docs/modules/ROOT/pages/_project-features-stubrunner/stub-runner-generate-stubs-at-runtime.adoc +++ b/docs/modules/ROOT/pages/project-features-stubrunner/stub-runner-generate-stubs-at-runtime.adoc @@ -1,9 +1,11 @@ [[features-stub-runner-generate-stubs-at-runtime]] = Generating Stubs at Runtime +include::partial$_attributes.adoc[] + As a consumer, you might not want to wait for the producer to finish its implementation and then publish their stubs. A solution to this problem can be generation of stubs at runtime. -As a producer, when a contract is defined, you are required to make the generated tests pass in order for the stubs to be published. There are cases where you would like to unblock the consumers so that they can fetch the stubs before your tests actually pass. In this case, you should set such contracts as in-progress. You can read more about this under the xref:_project-features-contract/common-top-elements.adoc#contract-dsl-in-progress[Contracts in Progress] section. That way, your tests are not generated, but the stubs are generated. +As a producer, when a contract is defined, you are required to make the generated tests pass in order for the stubs to be published. There are cases where you would like to unblock the consumers so that they can fetch the stubs before your tests actually pass. In this case, you should set such contracts as in-progress. You can read more about this under the xref:project-features-contract/common-top-elements.adoc#contract-dsl-in-progress[Contracts in Progress] section. That way, your tests are not generated, but the stubs are generated. As a consumer, you can toggle a switch to generate stubs at runtime. Stub Runner ignores all the existing stub mappings and generates new ones for all the contract definitions. Another option is to pass the `stubrunner.generate-stubs` system property. The following example shows such a setup: diff --git a/docs/modules/ROOT/pages/_project-features-stubrunner/stub-runner-junit.adoc b/docs/modules/ROOT/pages/project-features-stubrunner/stub-runner-junit.adoc similarity index 73% rename from docs/modules/ROOT/pages/_project-features-stubrunner/stub-runner-junit.adoc rename to docs/modules/ROOT/pages/project-features-stubrunner/stub-runner-junit.adoc index 5c7ad331af..19e3593553 100644 --- a/docs/modules/ROOT/pages/_project-features-stubrunner/stub-runner-junit.adoc +++ b/docs/modules/ROOT/pages/project-features-stubrunner/stub-runner-junit.adoc @@ -1,13 +1,15 @@ [[features-stub-runner-junit]] = Stub Runner JUnit Rule and Stub Runner JUnit5 Extension +include::partial$_attributes.adoc[] + Stub Runner comes with a JUnit rule that lets you can download and run stubs for a given group and artifact ID, as the following example shows: ==== [source,java,indent=0] ---- -include:../:{stubrunner_core_path}/src/test/groovy/org/springframework/cloud/contract/stubrunner/junit4/StubRunnerRuleJUnitTest.java[tags=classrule] +include::{stubrunner_core_path}/src/test/groovy/org/springframework/cloud/contract/stubrunner/junit4/StubRunnerRuleJUnitTest.java[tags=classrule] ---- ==== @@ -33,7 +35,7 @@ you find the started stubs, as the following example shows: ==== [source,groovy,indent=0] ---- -include:../:{stubrunner_core_path}/src/main/java/org/springframework/cloud/contract/stubrunner/StubFinder.java[lines=16..-1] +include::{stubrunner_core_path}/src/main/java/org/springframework/cloud/contract/stubrunner/StubFinder.java[lines=16..-1] ---- ==== @@ -43,23 +45,23 @@ The following examples provide more detail about using Stub Runner: [source,groovy,indent=0,subs="verbatim,attributes",role="primary"] .Spock ---- -include:../:{stubrunner_core_path}/src/test/groovy/org/springframework/cloud/contract/stubrunner/junit4/StubRunnerRuleSpec.groovy[tags=classrule] +include::{stubrunner_core_path}/src/test/groovy/org/springframework/cloud/contract/stubrunner/junit4/StubRunnerRuleSpec.groovy[tags=classrule] ---- [source,java,indent=0,subs="verbatim,attributes",role="secondary"] .Junit 4 ---- -include:../:{stubrunner_core_path}/src/test/groovy/org/springframework/cloud/contract/stubrunner/junit4/StubRunnerRuleJUnitTest.java[tags=test] +include::{stubrunner_core_path}/src/test/groovy/org/springframework/cloud/contract/stubrunner/junit4/StubRunnerRuleJUnitTest.java[tags=test] ---- [source,java,indent=0,subs="verbatim,attributes",role="secondary"] .Junit 5 ---- -include:../:{stubrunner_core_path}/src/test/java/org/springframework/cloud/contract/stubrunner/junit/StubRunnerJUnit5ExtensionTests.java[tags=extension] +include::{stubrunner_core_path}/src/test/java/org/springframework/cloud/contract/stubrunner/junit/StubRunnerJUnit5ExtensionTests.java[tags=extension] ---- ==== -See the xref:_project-features-stubrunner/stub-runner-common.adoc#features-stub-runner-common-properties-junit-spring[Common Properties for JUnit and Spring] for more information on +See the xref:../project-features-stubrunner/stub-runner-common.adoc#features-stub-runner-common-properties-junit-spring[Common Properties for JUnit and Spring] for more information on how to apply global configuration of Stub Runner. IMPORTANT: To use the JUnit rule or JUnit 5 extension together with messaging, you have to provide an implementation of the @@ -89,7 +91,7 @@ and then pass the port for the last downloaded stub. The following example shows ==== [source,java,indent=0] ---- -include:../:{stubrunner_core_path}/src/test/groovy/org/springframework/cloud/contract/stubrunner/junit4/StubRunnerRuleCustomPortJUnitTest.java[tags=classrule_with_port] +include::{stubrunner_core_path}/src/test/groovy/org/springframework/cloud/contract/stubrunner/junit4/StubRunnerRuleCustomPortJUnitTest.java[tags=classrule_with_port] ---- ==== @@ -98,7 +100,7 @@ For the preceding example, the following test is valid: ==== [source,java,indent=0] ---- -include:../:{stubrunner_core_path}/src/test/groovy/org/springframework/cloud/contract/stubrunner/junit4/StubRunnerRuleCustomPortJUnitTest.java[tags=test_with_port] +include::{stubrunner_core_path}/src/test/groovy/org/springframework/cloud/contract/stubrunner/junit4/StubRunnerRuleCustomPortJUnitTest.java[tags=test_with_port] ---- ==== @@ -116,7 +118,7 @@ its methods, as follows: ==== [source,groovy,indent=0] ---- -include:../:{stubrunner_core_path}/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/StubRunnerConfigurationSpec.groovy[tags=test] +include::{stubrunner_core_path}/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/StubRunnerConfigurationSpec.groovy[tags=test] ---- ==== @@ -125,7 +127,7 @@ Doing so depends on the following configuration file: ==== [source,yml,indent=0] ---- -include:../:{stubrunner_core_path}/src/test/resources/application-test.yml[tags=test] +include::{stubrunner_core_path}/src/test/resources/application-test.yml[tags=test] ---- ==== @@ -135,7 +137,7 @@ The following example achieves the same result by setting values on the annotati ==== [source,groovy,indent=0] ---- -include:../:{stubrunner_core_path}/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/cloud/consul/StubRunnerSpringCloudConsulAutoConfigurationSpec.groovy[tags=autoconfigure] +include::{stubrunner_core_path}/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/cloud/consul/StubRunnerSpringCloudConsulAutoConfigurationSpec.groovy[tags=autoconfigure] ---- ==== diff --git a/docs/modules/ROOT/pages/project-features-stubrunner/stub-runner-publishing-stubs-as-jars.adoc b/docs/modules/ROOT/pages/project-features-stubrunner/stub-runner-publishing-stubs-as-jars.adoc new file mode 100644 index 0000000000..7573898d6d --- /dev/null +++ b/docs/modules/ROOT/pages/project-features-stubrunner/stub-runner-publishing-stubs-as-jars.adoc @@ -0,0 +1,12 @@ +[[features-stub-runner-publishing-stubs-as-jars]] += Publishing Stubs as JARs + +include::partial$_attributes.adoc[] + +The easiest approach to publishing stubs as jars is to centralize the way stubs are kept. +For example, you can keep them as jars in a Maven repository. + +TIP: For both Maven and Gradle, the setup comes ready to work. However, you can customize +it if you want to. + +Check these URL for {samples_url}/producer_with_restdocs/pom.xml[Maven] and {samples_url}/producer_with_restdocs/pom.xml[Gradle] samples. \ No newline at end of file diff --git a/docs/modules/ROOT/pages/_project-features-stubrunner/stub-runner-snapshot-versions.adoc b/docs/modules/ROOT/pages/project-features-stubrunner/stub-runner-snapshot-versions.adoc similarity index 69% rename from docs/modules/ROOT/pages/_project-features-stubrunner/stub-runner-snapshot-versions.adoc rename to docs/modules/ROOT/pages/project-features-stubrunner/stub-runner-snapshot-versions.adoc index f1b2725e86..92bbfc387c 100644 --- a/docs/modules/ROOT/pages/_project-features-stubrunner/stub-runner-snapshot-versions.adoc +++ b/docs/modules/ROOT/pages/project-features-stubrunner/stub-runner-snapshot-versions.adoc @@ -2,6 +2,8 @@ = Snapshot Versions :page-section-summary-toc: 1 +include::partial$_attributes.adoc[] + You can add the additional snapshot repository to your build file to use snapshot versions, which are automatically uploaded after every successful build, as follows: @@ -9,13 +11,13 @@ versions, which are automatically uploaded after every successful build, as foll [source,xml,indent=0,subs="verbatim,attributes",role="primary"] .Maven ---- -include:../:{standalone_samples_path}/http-server/pom.xml[tags=repos,indent=0] +include::{standalone_samples_path}/http-server/pom.xml[tags=repos,indent=0] ---- [source,groovy,indent=0,subs="verbatim,attributes",role="secondary"] .Gradle (`settings.xml`) ---- -include:../:{standalone_samples_path}/http-server/settings.gradle[tags=repos,indent=0] +include::{standalone_samples_path}/http-server/settings.gradle[tags=repos,indent=0] ---- ==== diff --git a/docs/modules/ROOT/pages/_project-features-stubrunner/stub-runner-stubs-per-consumer.adoc b/docs/modules/ROOT/pages/project-features-stubrunner/stub-runner-stubs-per-consumer.adoc similarity index 88% rename from docs/modules/ROOT/pages/_project-features-stubrunner/stub-runner-stubs-per-consumer.adoc rename to docs/modules/ROOT/pages/project-features-stubrunner/stub-runner-stubs-per-consumer.adoc index 9b2cf5cc1e..0c04c690dc 100644 --- a/docs/modules/ROOT/pages/_project-features-stubrunner/stub-runner-stubs-per-consumer.adoc +++ b/docs/modules/ROOT/pages/project-features-stubrunner/stub-runner-stubs-per-consumer.adoc @@ -1,6 +1,8 @@ [[features-stub-runner-stubs-per-consumer]] = Consumer-Driven Contracts: Stubs Per Consumer +include::partial$_attributes.adoc[] + There are cases in which two consumers of the same endpoint want to have two different responses. TIP: This approach also lets you immediately know which consumer uses which part of your API. @@ -70,7 +72,7 @@ Alternatively, you can set the test as follows: ==== [source,groovy] ---- -include:../:{stubrunner_core_path}/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/cloud/StubRunnerStubsPerConsumerSpec.groovy[tags=test] +include::{stubrunner_core_path}/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/cloud/StubRunnerStubsPerConsumerSpec.groovy[tags=test] ... } ---- @@ -84,7 +86,7 @@ You can also set the consumer name explicitly, as follows: ==== [source,groovy] ---- -include:../:{stubrunner_core_path}/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/cloud/StubRunnerStubsPerConsumerWithConsumerNameSpec.groovy[tags=test] +include::{stubrunner_core_path}/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/cloud/StubRunnerStubsPerConsumerWithConsumerNameSpec.groovy[tags=test] ... } ---- diff --git a/docs/modules/ROOT/pages/_project-features-stubrunner/stub-runner-stubs-protocol.adoc b/docs/modules/ROOT/pages/project-features-stubrunner/stub-runner-stubs-protocol.adoc similarity index 99% rename from docs/modules/ROOT/pages/_project-features-stubrunner/stub-runner-stubs-protocol.adoc rename to docs/modules/ROOT/pages/project-features-stubrunner/stub-runner-stubs-protocol.adoc index c4085957a7..fe3ddeb3d4 100644 --- a/docs/modules/ROOT/pages/_project-features-stubrunner/stub-runner-stubs-protocol.adoc +++ b/docs/modules/ROOT/pages/project-features-stubrunner/stub-runner-stubs-protocol.adoc @@ -1,6 +1,8 @@ [[features-stub-runner-stubs-protocol]] = Fetching Stubs or Contract Definitions From A Location +include::partial$_attributes.adoc[] + Instead of picking the stubs or contract definitions from Artifactory, Nexus, or Git, you can point to a location on a drive or the classpath. Doing so can be especially useful in a multi-module project, where one module wants diff --git a/docs/modules/ROOT/pages/_project-features-wiremock.adoc b/docs/modules/ROOT/pages/project-features-wiremock.adoc similarity index 89% rename from docs/modules/ROOT/pages/_project-features-wiremock.adoc rename to docs/modules/ROOT/pages/project-features-wiremock.adoc index fb4bfe4d0e..5071f9d934 100644 --- a/docs/modules/ROOT/pages/_project-features-wiremock.adoc +++ b/docs/modules/ROOT/pages/project-features-wiremock.adoc @@ -1,6 +1,7 @@ [[features-wiremock]] = Spring Cloud Contract WireMock +include::partial$_attributes.adoc[] The Spring Cloud Contract WireMock modules let you use https://github.com/tomakehurst/wiremock[WireMock] in a Spring Boot application. For more detail, check out the @@ -11,15 +12,7 @@ the default with `spring-boot-starter-web`), you can add `spring-cloud-starter-contract-stub-runner` to your classpath and add `@AutoConfigureWireMock` to use Wiremock in your tests. Wiremock runs as a stub server, and you can register stub behavior by using a Java API or by using static JSON declarations as part of -your test. The following code shows an example: - -==== -[source,java,indent=0] ----- -include::{doc_samples_url}/src/test/java/com/example/WiremockForDocsTests.java[tags=wiremock_test1] -include::{doc_samples_url}/src/test/java/com/example/WiremockForDocsTests.java[tags=wiremock_test2] ----- -==== +your test. To start the stub server on a different port, use (for example), `@AutoConfigureWireMock(port=9999)`. For a random port, use a value of `0`. The stub @@ -61,7 +54,7 @@ public class WiremockImportApplicationTests { NOTE: Actually, WireMock always loads mappings from `src/test/resources/mappings` *as well as* the custom locations in the `stubs` attribute. To change this behavior, you can -also specify a file root, as described in the xref:_project-features-wiremock.adoc#features-wiremock-using-files[next section of this document]. +also specify a file root, as described in the xref:project-features-wiremock.adoc#features-wiremock-using-files[next section of this document]. NOTE: Also, the mappings in the `stubs` location are not considered part of Wiremock's "default mappings" and calls to `com.github.tomakehurst.wiremock.client.WireMock.resetToDefaultMappings` during a test do not result in the mappings @@ -106,15 +99,7 @@ effect on the stubs loaded explicitly from the `stubs` attribute. For a more conventional WireMock experience, you can use JUnit `@Rules` to start and stop the server. To do so, use the `WireMockSpring` convenience class to obtain an `Options` -instance, as the following example shows: - -==== -[source,java,indent=0] ----- -include::{doc_samples_url}/src/test/java/com/example/WiremockForDocsClassRuleTests.java[tags=wiremock_test1] -include::{doc_samples_url}/src/test/java/com/example/WiremockForDocsClassRuleTests.java[tags=wiremock_test2] ----- -==== +instance, as the following {doc_samples_url}[example] shows: The `@ClassRule` means that the server shuts down after all the methods in this class have been run. @@ -177,14 +162,7 @@ property to `false`. == WireMock and Spring MVC Mocks Spring Cloud Contract provides a convenience class that can load JSON WireMock stubs into -a Spring `MockRestServiceServer`. The following code shows an example: - -==== -[source,java,indent=0] ----- -include::{doc_samples_url}/src/test/java/com/example/WiremockForDocsMockServerApplicationTests.java[tags=wiremock_test] ----- -==== +a Spring `MockRestServiceServer`. The following {doc_samples_url}[project] shows that. The `baseUrl` value is prepended to all mock calls, and the `stubs()` method takes a stub path resource pattern as an argument. In the preceding example, the stub defined at diff --git a/docs/modules/ROOT/pages/project-features.adoc b/docs/modules/ROOT/pages/project-features.adoc index 4ced140fde..f46ff9c7c1 100644 --- a/docs/modules/ROOT/pages/project-features.adoc +++ b/docs/modules/ROOT/pages/project-features.adoc @@ -1,6 +1,8 @@ [[features]] = Spring Cloud Contract Features +include::partial$_attributes.adoc[] + This section dives into the details of {project-full-name}. Here you can learn about the key features that you may want to use and customize. If you have not already done so, you might want to read the "xref:getting-started.adoc[Getting Started]" and diff --git a/docs/modules/ROOT/pages/spring-cloud-contract.adoc b/docs/modules/ROOT/pages/spring-cloud-contract.adoc deleted file mode 100644 index b2a57fca62..0000000000 --- a/docs/modules/ROOT/pages/spring-cloud-contract.adoc +++ /dev/null @@ -1,18 +0,0 @@ -[[spring-cloud-contract-reference-documentation]] -= Spring Cloud Contract Reference Documentation -:page-section-summary-toc: 1 -Adam Dudczak, Mathias Düsterhöft, Marcin Grzejszczak, Dennis Kieselhorst, Jakub Kubryński, Karol Lassak, Olga Maciaszek-Sharma, Mariusz Smykuła, Dave Syer, Jay Bryant - -:docinfo: shared - -The reference documentation consists of the following sections: - -[horizontal] -<> :: Legal information. -<> :: About the Documentation, Getting Help, First Steps, and more. -xref:getting-started.adoc[Getting Started] :: Introducing {project-full-name}, Developing Your First {project-full-name}-based Application -xref:using.adoc[Using {project-full-name}] :: {project-full-name} usage examples and workflows. -xref:project-features.adoc[{project-full-name} Features] :: Contract DSL, Messaging, Spring Cloud Contract Stub Runner, and Spring Cloud Contract WireMock. -xref:project-features.adoc#features-build-tools[Build Tools] :: Maven Plugin, Gradle Plugin, and Docker. -xref:howto.adoc["`How-to`" Guides] :: Stubs versioning, Debugging, and more. -<> :: Properties, Metadata, Configuration, Dependencies, and more. diff --git a/docs/modules/ROOT/pages/using.adoc b/docs/modules/ROOT/pages/using.adoc index fdc078ceee..dc5e8447fb 100644 --- a/docs/modules/ROOT/pages/using.adoc +++ b/docs/modules/ROOT/pages/using.adoc @@ -1,6 +1,8 @@ [[using]] = Using Spring Cloud Contract +include::partial$_attributes.adoc[] + This section goes into more detail about how you should use {project-full-name}. It covers topics such as flows of how to work with {project-full-name}. We also cover some {project-full-name} best practices. @@ -19,7 +21,7 @@ You can check the xref:getting-started/first-application.adoc[Developing Your Fi In this flow, we perform the provider contract testing (the producer has no knowledge of how consumers use their API). The stubs are uploaded to a separate repository (they are not uploaded to Artifactory or Nexus). -[[prerequisites]] +[[using-prerequisites]] === Prerequisites Before testing provider contracts with stubs in git, you must provide a git repository @@ -27,7 +29,6 @@ that contains all the stubs for each producer. For an example of such a project, {samples_code}/contract_git[this samples ] or {samples_code}/contract_git[this sample]. As a result of pushing stubs there, the repository has the following structure: -==== [source,bash,indent=0] ---- $ tree . @@ -40,7 +41,6 @@ $ tree .    └── contractC.groovy ---- -==== You must also provide consumer code that has Spring Cloud Contract Stub Runner set up. For an example of such a project, see {samples_code}/consumer[this sample] and search for a @@ -65,9 +65,11 @@ In order to fetch the stubs from a git repository instead of Nexus or Artifactor need to use the `git` protocol in the URL of the `repositoryRoot` property in Stub Runner. The following example shows how to set it up: -==== +[tabs] +====== +Annotation:: ++ [source,java,indent=0,subs="verbatim,attributes",role="primary"] -.Annotation ---- @AutoConfigureStubRunner( stubsMode = StubRunnerProperties.StubsMode.REMOTE, @@ -75,8 +77,9 @@ stubsMode = StubRunnerProperties.StubsMode.REMOTE, ids = "com.example:artifact-id:0.0.1") ---- +JUnit 4 Rule:: ++ [source,java,indent=0,subs="verbatim,attributes",role="secondary"] -.JUnit 4 Rule ---- @Rule public StubRunnerRule rule = new StubRunnerRule() @@ -85,8 +88,9 @@ stubsMode = StubRunnerProperties.StubsMode.REMOTE, .stubsMode(StubRunnerProperties.StubsMode.REMOTE); ---- +JUnit 5 Extension:: ++ [source,java,indent=0,subs="verbatim,attributes",role="secondary"] -.JUnit 5 Extension ---- @RegisterExtension public StubRunnerExtension stubRunnerExtension = new StubRunnerExtension() @@ -94,7 +98,7 @@ stubsMode = StubRunnerProperties.StubsMode.REMOTE, .repoRoot("git://git@github.com:spring-cloud-samples/spring-cloud-contract-nodejs-contracts-git.git") .stubsMode(StubRunnerProperties.StubsMode.REMOTE); ---- -==== +====== [[flows-provider-git-producer]] === Setting up the Producer @@ -104,9 +108,11 @@ to use the `git` protocol in the URL of the plugin setup. Also you need to expli the plugin to push the stubs at the end of the build process. The following examples show how to do so in both Maven and Gradle: -==== +[tabs] +====== +Maven:: ++ [source,xml,indent=0,role="primary"] -.Maven ---- org.springframework.cloud @@ -144,8 +150,9 @@ how to do so in both Maven and Gradle: ---- +Gradle:: ++ [source,groovy,indent=0,role="secondary"] -.Gradle ---- contracts { // We want to pick contracts from a Git repository @@ -171,7 +178,7 @@ the `publish` task is run */ publish.dependsOn("publishStubsToScm") ---- -==== +====== You can read more about setting up a git repository in the xref:howto/how-to-use-git-as-storage.adoc[How To section] of the documentation. @@ -239,13 +246,11 @@ The test fails due to no server being present. For example, for a producer named `producer` and a consumer named `consumer`, the contracts would be stored under `src/main/resources/contracts/producer/consumer/`) . Once the contracts are defined, installs the producer stubs to local storage, as the following example shows: + -==== [source,bash,indent=0] ---- $ cd src/main/resource/contracts/producer $ ./mvnw clean install ---- -==== . Sets up Spring Cloud Contract (SCC) Stub Runner in the consumer tests, to: * Fetch the producer stubs from local storage. * Work in the stubs-per-consumer mode (this enables consumer driven contracts mode). @@ -285,27 +290,25 @@ The producer: . Takes over the pull request to the repository with contract definitions. You can do it from the command line, as follows + -==== [source,bash,indent=0] ---- $ git checkout -b the_branch_with_pull_request master git pull https://github.com/user_id/project_name.git the_branch_with_pull_request ---- -==== . Installs the contract definitions, as follows + -==== [source,bash,indent=0] ---- $ ./mvnw clean install ---- -==== . Sets up the plugin to fetch the contract definitions from a JAR instead of from `src/test/resources/contracts`, as follows: + -==== +[tabs] +====== +Maven:: ++ [source,xml,indent=0,subs="verbatim,attributes",role="primary"] -.Maven ---- org.springframework.cloud @@ -325,8 +328,9 @@ $ ./mvnw clean install ---- +Gradle:: ++ [source,groovy,indent=0,subs="verbatim,attributes",role="secondary"] -.Gradle ---- contracts { // We want to use the JAR with contracts with the following coordinates @@ -339,26 +343,28 @@ contracts { // Additional configuration } ---- -==== +====== . Runs the build to generate tests and stubs, as follows: + -==== +[tabs] +====== +Maven:: ++ [source,bash,indent=0,subs="verbatim,attributes",role="primary"] -.Maven ---- ./mvnw clean install ---- +Gradle:: ++ [source,groovy,indent=0,subs="verbatim,attributes",role="secondary"] -.Gradle ---- ./gradlew clean build ---- -==== +====== . Writes the missing implementation, to make the tests pass. . Merges the pull request to the repository with contract definitions, as follows: + -==== [source,bash,indent=0] ---- $ git commit -am "Finished the implementation to make the contract tests pass" @@ -366,7 +372,6 @@ $ git checkout master $ git merge --no-ff the_branch_with_pull_request $ git push origin master ---- -==== + The CI system builds the project with the contract definitions and uploads the JAR with the contract definitions to Nexus or Artifactory. @@ -374,9 +379,11 @@ the contract definitions to Nexus or Artifactory. . Sets up the plugin so that the contract definitions are no longer taken from the local storage but from a remote location, as follows: + -==== +[tabs] +====== +Maven:: ++ [source,xml,indent=0,subs="verbatim,attributes",role="primary"] -.Maven ---- org.springframework.cloud @@ -396,8 +403,9 @@ storage but from a remote location, as follows: ---- +Gradle:: ++ [source,groovy,indent=0,subs="verbatim,attributes",role="secondary"] -.Gradle ---- contracts { // We want to use the JAR with contracts with the following coordinates @@ -410,7 +418,7 @@ contracts { // Additional configuration } ---- -==== +====== . Merges the producer code with the new implementation. . The CI system: ** Builds the project. @@ -475,9 +483,11 @@ You can read xref:getting-started/first-application.adoc[Developing Your First S For the consumer side, you can use a JUnit rule. That way, you need not start a Spring context. The following listing shows such a rule (in JUnit4 and JUnit 5); -==== +[tabs] +====== +JUnit 4 Rule:: ++ [source,java,indent=0,subs="verbatim,attributes",role="primary"] -.JUnit 4 Rule ---- @Rule public StubRunnerRule rule = new StubRunnerRule() @@ -486,8 +496,9 @@ For the consumer side, you can use a JUnit rule. That way, you need not start a .stubsMode(StubRunnerProperties.StubsMode.REMOTE); ---- +JUnit 5 Extension:: ++ [source,java,indent=0,subs="verbatim,attributes",role="secondary"] -.JUnit 5 Extension ---- @RegisterExtension public StubRunnerExtension stubRunnerExtension = new StubRunnerExtension() @@ -495,7 +506,7 @@ For the consumer side, you can use a JUnit rule. That way, you need not start a .repoRoot("git://git@github.com:spring-cloud-samples/spring-cloud-contract-nodejs-contracts-git.git") .stubsMode(StubRunnerProperties.StubsMode.REMOTE); ---- -==== +====== [[flows-provider-non-spring-producer]] === Setting up the Producer @@ -509,7 +520,6 @@ non-Spring HTTP server. Assume that we have the following application: -==== [source,java,indent=0] ---- package com.example.demo; @@ -536,14 +546,15 @@ public class DemoApplication { } ---- -==== Given that application, we can set up the plugin to use the `EXPLICIT` mode (that is, to send out requests to a real port), as follows: -==== +[tabs] +====== +Maven:: ++ [source,xml,indent=0,role="primary"] -.Maven ---- org.springframework.cloud @@ -558,8 +569,9 @@ send out requests to a real port), as follows: ---- +Gradle:: ++ [source,groovy,indent=0,role="secondary"] -.Gradle ---- contracts { // This will setup the EXPLICIT mode for the tests @@ -567,11 +579,10 @@ contracts { baseClassForTests = "com.example.demo.BaseClass" } ---- -==== +====== The base class might resemble the following: -==== [source,java,indent=0] ---- import io.javalin.Javalin; @@ -606,7 +617,6 @@ public class BaseClass { } } ---- -==== With such a setup: @@ -647,8 +657,8 @@ At a high level, the producer: .. Start the application with mocked services on a given port. + If mocking is not possible, you can set up the infrastructure and define tests in a stateful way. -.. Run the Spring Cloud Contract Docker image and pass the port of a running application as an environment variable. +.. Run the Spring Cloud Contract Docker image and pass the port of a running application as an environment variable. The SCC Docker image: * Generates the tests from the attached volume. * Runs the tests against the running application. @@ -725,9 +735,11 @@ As a producer, we: . Write RESTDocs tests of our API. . Add Spring Cloud Contract Stub Runner starter to our build (`spring-cloud-starter-contract-stub-runner`), as follows: + -==== +[tabs] +====== +Maven:: ++ [source,xml,indent=0,role="primary"] -.Maven ---- @@ -750,8 +762,9 @@ As a producer, we: ---- +Gradle:: ++ [source,groovy,indent=0,role="secondary"] -.Gradle ---- dependencies { testImplementation 'org.springframework.cloud:spring-cloud-starter-contract-stub-runner' @@ -763,12 +776,14 @@ dependencyManagement { } } ---- -==== +====== . We set up the build tool to package our stubs, as follows: + -==== +[tabs] +====== +Maven:: ++ [source,xml,indent=0,role="primary"] -.Maven ---- @@ -816,8 +831,9 @@ dependencyManagement { ---- +Gradle:: ++ [source,groovy,indent=0,role="secondary"] -.Gradle ---- task stubsJar(type: Jar) { classifier = "stubs" @@ -830,7 +846,7 @@ task stubsJar(type: Jar) { stubsJar.dependsOn(test) bootJar.dependsOn(stubsJar) ---- -==== +====== Now, when we run the tests, stubs are automatically published and packaged. diff --git a/docs/modules/ROOT/pages/yml-schema.adoc b/docs/modules/ROOT/pages/yml-schema.adoc index b5196fc2bb..7a8f33cadf 100644 --- a/docs/modules/ROOT/pages/yml-schema.adoc +++ b/docs/modules/ROOT/pages/yml-schema.adoc @@ -2,13 +2,9 @@ = YML Schema :page-section-summary-toc: 1 - Below you can find a JSON schema definition of a YAML contract. -==== [source,json,indent=0] ---- -// TODO: reenable -//include::{project-root}/docs/target/contract_schema.json[indent=0] +include::partial$contract_schema.json[indent=0] ---- -==== diff --git a/docs/modules/ROOT/partials/_attributes.adoc b/docs/modules/ROOT/partials/_attributes.adoc new file mode 100644 index 0000000000..5dfe8f3d0a --- /dev/null +++ b/docs/modules/ROOT/partials/_attributes.adoc @@ -0,0 +1,23 @@ +:sc-ext: java +:project-full-name: Spring Cloud Contract + +// project-specific attributes +:converters_path: example$tools-src/spring-cloud-contract-converters +:verifier_root_path: example$verifier-src +:contract_spec_path: example$specs-src/spring-cloud-contract-spec-java +:contract_spec_tests_path: example$specs-src/spring-cloud-contract-spec +:contract_kotlin_spec_path: example$specs-src/spring-cloud-contract-spec-kotlin +:samples_path: example$samples-src +:stubrunner_core_path: example$stubrunner-src +:standalone_samples_path: example$samples-src/standalone/dsl +:standalone_messaging_samples_path: example$samples-src/standalone/dsl +:standalone_restdocs_path: example$samples-src/standalone/restdocs +:tests_path: example$tests-src +:tools_path: example$tools-src +:plugins_path: {tools_path} +:samples_branch: main +:samples_url: https://raw.githubusercontent.com/spring-cloud-samples/spring-cloud-contract-samples/{samples_branch} +:samples_code: https://github.com/spring-cloud-samples/spring-cloud-contract-samples/tree/{samples_branch} +:doc_samples: {samples_code}/wiremock-for-contract-docs +:doc_samples_url: {samples_url}/wiremock-for-contract-docs +:wiremock_tests: example$wiremock-src diff --git a/docs/modules/ROOT/pages/_configprops.adoc b/docs/modules/ROOT/partials/_configprops.adoc similarity index 99% rename from docs/modules/ROOT/pages/_configprops.adoc rename to docs/modules/ROOT/partials/_configprops.adoc index 444298319f..af43ade08a 100644 --- a/docs/modules/ROOT/pages/_configprops.adoc +++ b/docs/modules/ROOT/partials/_configprops.adoc @@ -44,4 +44,4 @@ |wiremock.server.port-dynamic | `+++false+++` | |wiremock.server.stubs | `+++[]+++` | -|=== +|=== \ No newline at end of file diff --git a/docs/modules/ROOT/partials/appProps.adoc b/docs/modules/ROOT/partials/appProps.adoc new file mode 100644 index 0000000000..e8be5b1b43 --- /dev/null +++ b/docs/modules/ROOT/partials/appProps.adoc @@ -0,0 +1,13 @@ +.Docker environment variables - read at runtime +|=== +|Name | Description | Default +|APPLICATION_BASE_URL|URL at which the application is running.| +|APPLICATION_PASSWORD|Optional password to access the application.| +|APPLICATION_USERNAME|Optional username to access the application.| +|MESSAGING_TRIGGER_CONNECT_TIMEOUT|Timeout to connect to the application to trigger a message.|5000 +|MESSAGING_TRIGGER_READ_TIMEOUT|Timeout to read the response from the application to trigger a message.|5000 +|MESSAGING_TYPE|Type of messaging. Can be either [rabbit] or [kafka].| +|MESSAGING_TYPE|Defines the messaging type when dealing with message based contracts.| +|SPRING_KAFKA_BOOTSTRAP_SERVERS|For Kafka - brokers addresses.| +|SPRING_RABBITMQ_ADDRESSES|For RabbitMQ - brokers addresses.| +|=== \ No newline at end of file diff --git a/docs/modules/ROOT/partials/contract_schema.json b/docs/modules/ROOT/partials/contract_schema.json new file mode 100644 index 0000000000..16d0b27a20 --- /dev/null +++ b/docs/modules/ROOT/partials/contract_schema.json @@ -0,0 +1,442 @@ +{ + "type" : "object", + "id" : "urn:jsonschema:org:springframework:cloud:contract:verifier:converter:YamlContract", + "properties" : { + "request" : { + "type" : "object", + "id" : "urn:jsonschema:org:springframework:cloud:contract:verifier:converter:YamlContract:Request", + "properties" : { + "method" : { + "type" : "string" + }, + "url" : { + "type" : "string" + }, + "urlPath" : { + "type" : "string" + }, + "queryParameters" : { + "type" : "object", + "additionalProperties" : { + "type" : "object", + "id" : "urn:jsonschema:java:lang:Object" + } + }, + "headers" : { + "type" : "object", + "additionalProperties" : { + "type" : "object", + "$ref" : "urn:jsonschema:java:lang:Object" + } + }, + "cookies" : { + "type" : "object", + "additionalProperties" : { + "type" : "object", + "$ref" : "urn:jsonschema:java:lang:Object" + } + }, + "body" : { + "type" : "object", + "$ref" : "urn:jsonschema:java:lang:Object" + }, + "bodyFromFile" : { + "type" : "string" + }, + "bodyFromFileAsBytes" : { + "type" : "string" + }, + "matchers" : { + "type" : "object", + "id" : "urn:jsonschema:org:springframework:cloud:contract:verifier:converter:YamlContract:StubMatchers", + "properties" : { + "url" : { + "type" : "object", + "id" : "urn:jsonschema:org:springframework:cloud:contract:verifier:converter:YamlContract:KeyValueMatcher", + "properties" : { + "key" : { + "type" : "string" + }, + "regex" : { + "type" : "string" + }, + "predefined" : { + "type" : "string", + "enum" : [ "only_alpha_unicode", "number", "any_double", "any_boolean", "ip_address", "hostname", "email", "url", "uuid", "iso_date", "iso_date_time", "iso_time", "iso_8601_with_offset", "non_empty", "non_blank" ] + }, + "command" : { + "type" : "string" + }, + "regexType" : { + "type" : "string", + "enum" : [ "as_integer", "as_double", "as_float", "as_long", "as_short", "as_boolean", "as_string" ] + } + } + }, + "body" : { + "type" : "array", + "items" : { + "type" : "object", + "id" : "urn:jsonschema:org:springframework:cloud:contract:verifier:converter:YamlContract:BodyStubMatcher", + "properties" : { + "path" : { + "type" : "string" + }, + "type" : { + "type" : "string", + "enum" : [ "by_date", "by_time", "by_timestamp", "by_regex", "by_equality", "by_type", "by_null" ] + }, + "value" : { + "type" : "string" + }, + "predefined" : { + "type" : "string", + "enum" : [ "only_alpha_unicode", "number", "any_double", "any_boolean", "ip_address", "hostname", "email", "url", "uuid", "iso_date", "iso_date_time", "iso_time", "iso_8601_with_offset", "non_empty", "non_blank" ] + }, + "minOccurrence" : { + "type" : "integer" + }, + "maxOccurrence" : { + "type" : "integer" + }, + "regexType" : { + "type" : "string", + "enum" : [ "as_integer", "as_double", "as_float", "as_long", "as_short", "as_boolean", "as_string" ] + } + } + } + }, + "headers" : { + "type" : "array", + "items" : { + "type" : "object", + "$ref" : "urn:jsonschema:org:springframework:cloud:contract:verifier:converter:YamlContract:KeyValueMatcher" + } + }, + "queryParameters" : { + "type" : "array", + "items" : { + "type" : "object", + "id" : "urn:jsonschema:org:springframework:cloud:contract:verifier:converter:YamlContract:QueryParameterMatcher", + "properties" : { + "key" : { + "type" : "string" + }, + "type" : { + "type" : "string", + "enum" : [ "equal_to", "containing", "matching", "not_matching", "equal_to_json", "equal_to_xml", "absent", "binary_equal_to" ] + }, + "value" : { + "type" : "object", + "$ref" : "urn:jsonschema:java:lang:Object" + } + } + } + }, + "cookies" : { + "type" : "array", + "items" : { + "type" : "object", + "$ref" : "urn:jsonschema:org:springframework:cloud:contract:verifier:converter:YamlContract:KeyValueMatcher" + } + }, + "multipart" : { + "type" : "object", + "id" : "urn:jsonschema:org:springframework:cloud:contract:verifier:converter:YamlContract:MultipartStubMatcher", + "properties" : { + "params" : { + "type" : "array", + "items" : { + "type" : "object", + "$ref" : "urn:jsonschema:org:springframework:cloud:contract:verifier:converter:YamlContract:KeyValueMatcher" + } + }, + "named" : { + "type" : "array", + "items" : { + "type" : "object", + "id" : "urn:jsonschema:org:springframework:cloud:contract:verifier:converter:YamlContract:MultipartNamedStubMatcher", + "properties" : { + "paramName" : { + "type" : "string" + }, + "fileName" : { + "type" : "object", + "id" : "urn:jsonschema:org:springframework:cloud:contract:verifier:converter:YamlContract:ValueMatcher", + "properties" : { + "regex" : { + "type" : "string" + }, + "predefined" : { + "type" : "string", + "enum" : [ "only_alpha_unicode", "number", "any_double", "any_boolean", "ip_address", "hostname", "email", "url", "uuid", "iso_date", "iso_date_time", "iso_time", "iso_8601_with_offset", "non_empty", "non_blank" ] + } + } + }, + "fileContent" : { + "type" : "object", + "$ref" : "urn:jsonschema:org:springframework:cloud:contract:verifier:converter:YamlContract:ValueMatcher" + }, + "contentType" : { + "type" : "object", + "$ref" : "urn:jsonschema:org:springframework:cloud:contract:verifier:converter:YamlContract:ValueMatcher" + } + } + } + } + } + } + } + }, + "multipart" : { + "type" : "object", + "id" : "urn:jsonschema:org:springframework:cloud:contract:verifier:converter:YamlContract:Multipart", + "properties" : { + "params" : { + "type" : "object", + "additionalProperties" : { + "type" : "string" + } + }, + "named" : { + "type" : "array", + "items" : { + "type" : "object", + "id" : "urn:jsonschema:org:springframework:cloud:contract:verifier:converter:YamlContract:Named", + "properties" : { + "paramName" : { + "type" : "string" + }, + "fileName" : { + "type" : "string" + }, + "fileContent" : { + "type" : "string" + }, + "fileContentAsBytes" : { + "type" : "string" + }, + "fileContentFromFileAsBytes" : { + "type" : "string" + }, + "contentType" : { + "type" : "string" + }, + "fileNameCommand" : { + "type" : "string" + }, + "fileContentCommand" : { + "type" : "string" + }, + "contentTypeCommand" : { + "type" : "string" + } + } + } + } + } + } + } + }, + "response" : { + "type" : "object", + "id" : "urn:jsonschema:org:springframework:cloud:contract:verifier:converter:YamlContract:Response", + "properties" : { + "status" : { + "type" : "integer" + }, + "headers" : { + "type" : "object", + "additionalProperties" : { + "type" : "object", + "$ref" : "urn:jsonschema:java:lang:Object" + } + }, + "cookies" : { + "type" : "object", + "additionalProperties" : { + "type" : "object", + "$ref" : "urn:jsonschema:java:lang:Object" + } + }, + "body" : { + "type" : "object", + "$ref" : "urn:jsonschema:java:lang:Object" + }, + "bodyFromFile" : { + "type" : "string" + }, + "bodyFromFileAsBytes" : { + "type" : "string" + }, + "matchers" : { + "type" : "object", + "id" : "urn:jsonschema:org:springframework:cloud:contract:verifier:converter:YamlContract:TestMatchers", + "properties" : { + "body" : { + "type" : "array", + "items" : { + "type" : "object", + "id" : "urn:jsonschema:org:springframework:cloud:contract:verifier:converter:YamlContract:BodyTestMatcher", + "properties" : { + "path" : { + "type" : "string" + }, + "type" : { + "type" : "string", + "enum" : [ "by_date", "by_time", "by_timestamp", "by_regex", "by_equality", "by_type", "by_command", "by_null" ] + }, + "value" : { + "type" : "string" + }, + "minOccurrence" : { + "type" : "integer" + }, + "maxOccurrence" : { + "type" : "integer" + }, + "predefined" : { + "type" : "string", + "enum" : [ "only_alpha_unicode", "number", "any_double", "any_boolean", "ip_address", "hostname", "email", "url", "uuid", "iso_date", "iso_date_time", "iso_time", "iso_8601_with_offset", "non_empty", "non_blank" ] + }, + "regexType" : { + "type" : "string", + "enum" : [ "as_integer", "as_double", "as_float", "as_long", "as_short", "as_boolean", "as_string" ] + } + } + } + }, + "headers" : { + "type" : "array", + "items" : { + "type" : "object", + "id" : "urn:jsonschema:org:springframework:cloud:contract:verifier:converter:YamlContract:TestHeaderMatcher", + "properties" : { + "key" : { + "type" : "string" + }, + "regex" : { + "type" : "string" + }, + "command" : { + "type" : "string" + }, + "predefined" : { + "type" : "string", + "enum" : [ "only_alpha_unicode", "number", "any_double", "any_boolean", "ip_address", "hostname", "email", "url", "uuid", "iso_date", "iso_date_time", "iso_time", "iso_8601_with_offset", "non_empty", "non_blank" ] + }, + "regexType" : { + "type" : "string", + "enum" : [ "as_integer", "as_double", "as_float", "as_long", "as_short", "as_boolean", "as_string" ] + } + } + } + }, + "cookies" : { + "type" : "array", + "items" : { + "type" : "object", + "id" : "urn:jsonschema:org:springframework:cloud:contract:verifier:converter:YamlContract:TestCookieMatcher", + "properties" : { + "key" : { + "type" : "string" + }, + "regex" : { + "type" : "string" + }, + "command" : { + "type" : "string" + }, + "predefined" : { + "type" : "string", + "enum" : [ "only_alpha_unicode", "number", "any_double", "any_boolean", "ip_address", "hostname", "email", "url", "uuid", "iso_date", "iso_date_time", "iso_time", "iso_8601_with_offset", "non_empty", "non_blank" ] + }, + "regexType" : { + "type" : "string", + "enum" : [ "as_integer", "as_double", "as_float", "as_long", "as_short", "as_boolean", "as_string" ] + } + } + } + } + } + }, + "async" : { + "type" : "boolean" + }, + "fixedDelayMilliseconds" : { + "type" : "integer" + } + } + }, + "input" : { + "type" : "object", + "id" : "urn:jsonschema:org:springframework:cloud:contract:verifier:converter:YamlContract:Input", + "properties" : { + "triggeredBy" : { + "type" : "string" + }, + "assertThat" : { + "type" : "string" + } + } + }, + "outputMessage" : { + "type" : "object", + "id" : "urn:jsonschema:org:springframework:cloud:contract:verifier:converter:YamlContract:OutputMessage", + "properties" : { + "sentTo" : { + "type" : "string" + }, + "headers" : { + "type" : "object", + "additionalProperties" : { + "type" : "object", + "$ref" : "urn:jsonschema:java:lang:Object" + } + }, + "body" : { + "type" : "object", + "$ref" : "urn:jsonschema:java:lang:Object" + }, + "bodyFromFile" : { + "type" : "string" + }, + "bodyFromFileAsBytes" : { + "type" : "string" + }, + "assertThat" : { + "type" : "string" + }, + "matchers" : { + "type" : "object", + "$ref" : "urn:jsonschema:org:springframework:cloud:contract:verifier:converter:YamlContract:TestMatchers" + } + } + }, + "description" : { + "type" : "string" + }, + "label" : { + "type" : "string" + }, + "name" : { + "type" : "string" + }, + "priority" : { + "type" : "integer" + }, + "ignored" : { + "type" : "boolean" + }, + "inProgress" : { + "type" : "boolean" + }, + "metadata" : { + "type" : "object", + "additionalProperties" : { + "type" : "object", + "$ref" : "urn:jsonschema:java:lang:Object" + } + } + } +} \ No newline at end of file diff --git a/docs/modules/ROOT/partials/props.adoc b/docs/modules/ROOT/partials/props.adoc new file mode 100644 index 0000000000..44c956e667 --- /dev/null +++ b/docs/modules/ROOT/partials/props.adoc @@ -0,0 +1,30 @@ +.Docker environment variables +|=== +|Name | Description | Default +|ADDITIONAL_FLAGS|(Docker Image only) Additional flags to be passed to the Gradle build| +|DEBUG|(Docker Image only) Applicable for Docker Image - turns on debug mode for the Gradle build|false +|EXTERNAL_CONTRACTS_ARTIFACT_ID|Artifact ID of the project with contracts| +|EXTERNAL_CONTRACTS_CLASSIFIER|Classifier of the project with contracts| +|EXTERNAL_CONTRACTS_GROUP_ID|Group ID of the project with contracts|com.example +|EXTERNAL_CONTRACTS_PATH|Path to contracts for the given project, inside the project with contracts. Defaults to slash-separated `EXTERNAL_CONTRACTS_GROUP_ID` concatenated with `/` and `EXTERNAL_CONTRACTS_ARTIFACT_ID. For example, +for group id `cat-server-side.dog` and artifact ID `fish`, would result in `cat/dog/fish` for the contracts path.| +|EXTERNAL_CONTRACTS_REPO_WITH_BINARIES_PASSWORD|(optional) Password if the `EXTERNAL_CONTRACTS_REPO_WITH_BINARIES_URL` requires authentication. It defaults to `REPO_WITH_BINARIES_PASSWORD, If that is not set, it defaults to `password| +|EXTERNAL_CONTRACTS_REPO_WITH_BINARIES_URL|URL of your Artifact Manager. It defaults to the value of `REPO_WITH_BINARIES_URL` environment variable and if that is not set, it defaults to `http://localhost:8081/artifactory/libs-release-local`| +|EXTERNAL_CONTRACTS_REPO_WITH_BINARIES_USERNAME|(optional) Username if the `EXTERNAL_CONTRACTS_REPO_WITH_BINARIES_URL` requires authentication. It defaults to `REPO_WITH_BINARIES_USERNAME`. If that is not set, it defaults to `admin| +|EXTERNAL_CONTRACTS_VERSION|Version of the project with contracts. Defautls to an equivalent of picking the latest|+ +|EXTERNAL_CONTRACTS_WORK_OFFLINE|If set to `true`, retrieves the artifact with contracts from the container's `.m2`. Mount your local `.m2` as a volume available at the container's `/root/.m2` path|false +|FAIL_ON_NO_CONTRACTS|Should the build fail if there are no contracts present?|false +|MESSAGING_TYPE|Type of messaging. Can be either [rabbit] or [kafka].| +|PRODUCER_STUBS_CLASSIFIER|Archive classifier used for generated producer stubs|stubs +|PROJECT_GROUP|Your project's group ID|com.example +|PROJECT_NAME|Your project's artifact id|example +|PROJECT_VERSION|Your project's version|0.0.1-SNAPSHOT +|PUBLISH_ARTIFACTS|If set to `true`, publishes the artifact to binary storage|true +|PUBLISH_ARTIFACTS_OFFLINE|If set to `true`, publishes the artifacts to local m2|false +|PUBLISH_STUBS_TO_SCM|If set to `true` will run the task to publish stubs to scm|false +|REPO_ALLOW_INSECURE_PROTOCOL|(optional) If allows to publish artifacts to Artifact Manager over insecure HTTP|false +|REPO_WITH_BINARIES_PASSWORD|(optional) Password when the Artifact Manager is secured|password +|REPO_WITH_BINARIES_URL|URL of your Artifact Manager (defaults to the default URL of https://jfrog.com/artifactory/[Artifactory] when running locally)|http://localhost:8081/artifactory/libs-release-local +|REPO_WITH_BINARIES_USERNAME|(optional) Username when the Artifact Manager is secured|admin +|STANDALONE_PROTOCOL|For standalone version, which additional protocol should be added| +|=== \ No newline at end of file diff --git a/docs/pom.xml b/docs/pom.xml index 02c559dc50..37e10cf074 100644 --- a/docs/pom.xml +++ b/docs/pom.xml @@ -3,32 +3,52 @@ xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 + org.springframework.cloud + spring-cloud-contract-docs org.springframework.cloud spring-cloud-contract-parent 4.1.0-SNAPSHOT .. - spring-cloud-contract-docs jar Spring Cloud Contract Docs - Spring Cloud Docs + Spring Cloud Contract Docs 2.14.2 spring-cloud-contract ${basedir}/.. - 3.4 - stubrunner.*|wiremock.*| - deploy + spring.cloud.* + + none 4.0.6 - + + + ${project.groupId} + spring-cloud-starter-contract-stub-runner + + + ${project.groupId} + spring-cloud-starter-contract-verifier + + + com.fasterxml.jackson.module + jackson-module-jsonSchema + ${jackson-module-jsonSchema.version} + + + org.springframework.amqp + spring-amqp + + org.codehaus.mojo build-helper-maven-plugin + 3.4.0 generate-sources @@ -79,29 +99,16 @@ - - - ${project.groupId} - spring-cloud-starter-contract-stub-runner - - - ${project.groupId} - spring-cloud-starter-contract-verifier - - - com.fasterxml.jackson.module - jackson-module-jsonSchema - ${jackson-module-jsonSchema.version} - - - org.springframework.amqp - spring-amqp - - docs + + + src/main/antora/resources/antora-resources + true + + pl.project13.maven @@ -111,10 +118,6 @@ org.apache.maven.plugins maven-dependency-plugin - - org.apache.maven.plugins - maven-resources-plugin - org.codehaus.mojo exec-maven-plugin @@ -128,6 +131,9 @@ ${maven.multiModuleProjectDirectory}/docker/spring-cloud-contract-docker ./build_adocs.sh + + ${maven.multiModuleProjectDirectory}/docs/modules/ROOT/partials/ + @@ -146,8 +152,12 @@ - org.asciidoctor - asciidoctor-maven-plugin + io.spring.maven.antora + antora-component-version-maven-plugin + + + io.spring.maven.antora + antora-maven-plugin org.apache.maven.plugins @@ -158,64 +168,6 @@ - - - spring-snapshots - Spring Snapshots - https://repo.spring.io/snapshot - - true - - - false - - - - spring-milestones - Spring Milestones - https://repo.spring.io/milestone - - false - - - - spring-releases - Spring Releases - https://repo.spring.io/release - - false - - - - - - spring-snapshots - Spring Snapshots - https://repo.spring.io/snapshot - - true - - - false - - - - spring-milestones - Spring Milestones - https://repo.spring.io/milestone - - false - - - - spring-releases - Spring Releases - https://repo.spring.io/release - - false - - - diff --git a/docs/src/main/antora/resources/antora-resources/antora.yml b/docs/src/main/antora/resources/antora-resources/antora.yml new file mode 100644 index 0000000000..9148923fa3 --- /dev/null +++ b/docs/src/main/antora/resources/antora-resources/antora.yml @@ -0,0 +1,20 @@ +version: @antora-component.version@ +prerelease: @antora-component.prerelease@ + +asciidoc: + attributes: + attribute-missing: 'warn' + chomp: 'all' + project-root: @maven.multiModuleProjectDirectory@ + github-repo: @docs.main@ + github-raw: https://raw.githubusercontent.com/spring-cloud/@docs.main@/@github-tag@ + github-code: https://github.com/spring-cloud/@docs.main@/tree/@github-tag@ + github-issues: https://github.com/spring-cloud/@docs.main@/issues/ + github-wiki: https://github.com/spring-cloud/@docs.main@/wiki + spring-cloud-version: @project.version@ + github-tag: @github-tag@ + version-type: @version-type@ + docs-url: https://docs.spring.io/@docs.main@/docs/@project.version@ + raw-docs-url: https://raw.githubusercontent.com/spring-cloud/@docs.main@/@github-tag@ + project-version: @project.version@ + project-name: @docs.main@ diff --git a/docs/modules/ROOT/pages/README.adoc b/docs/src/main/asciidoc/README.adoc similarity index 100% rename from docs/modules/ROOT/pages/README.adoc rename to docs/src/main/asciidoc/README.adoc diff --git a/docs/src/main/asciidoc/ghpages.sh b/docs/src/main/asciidoc/ghpages.sh deleted file mode 100755 index d5b92aabb8..0000000000 --- a/docs/src/main/asciidoc/ghpages.sh +++ /dev/null @@ -1,330 +0,0 @@ -#!/bin/bash -x - -set -e - -# Set default props like MAVEN_PATH, ROOT_FOLDER etc. -function set_default_props() { - # The script should be run from the root folder - ROOT_FOLDER=`pwd` - echo "Current folder is ${ROOT_FOLDER}" - - if [[ ! -e "${ROOT_FOLDER}/.git" ]]; then - echo "You're not in the root folder of the project!" - exit 1 - fi - - # Prop that will let commit the changes - COMMIT_CHANGES="no" - MAVEN_PATH=${MAVEN_PATH:-} - echo "Path to Maven is [${MAVEN_PATH}]" - REPO_NAME=${PWD##*/} - echo "Repo name is [${REPO_NAME}]" - SPRING_CLOUD_STATIC_REPO=${SPRING_CLOUD_STATIC_REPO:-git@github.com:spring-cloud/spring-cloud-static.git} - echo "Spring Cloud Static repo is [${SPRING_CLOUD_STATIC_REPO}" -} - -# Check if gh-pages exists and docs have been built -function check_if_anything_to_sync() { - git remote set-url --push origin `git config remote.origin.url | sed -e 's/^git:/https:/'` - - if ! (git remote set-branches --add origin gh-pages && git fetch -q); then - echo "No gh-pages, so not syncing" - exit 0 - fi - - if ! [ -d docs/target/generated-docs ] && ! [ "${BUILD}" == "yes" ]; then - echo "No gh-pages sources in docs/target/generated-docs, so not syncing" - exit 0 - fi -} - -function retrieve_current_branch() { - # Code getting the name of the current branch. For master we want to publish as we did until now - # https://stackoverflow.com/questions/1593051/how-to-programmatically-determine-the-current-checked-out-git-branch - # If there is a branch already passed will reuse it - otherwise will try to find it - CURRENT_BRANCH=${BRANCH} - if [[ -z "${CURRENT_BRANCH}" ]] ; then - CURRENT_BRANCH=$(git symbolic-ref -q HEAD) - CURRENT_BRANCH=${CURRENT_BRANCH##refs/heads/} - CURRENT_BRANCH=${CURRENT_BRANCH:-HEAD} - fi - echo "Current branch is [${CURRENT_BRANCH}]" - git checkout ${CURRENT_BRANCH} || echo "Failed to check the branch... continuing with the script" -} - -# Switches to the provided value of the release version. We always prefix it with `v` -function switch_to_tag() { - git checkout v${VERSION} -} - -# Build the docs if switch is on -function build_docs_if_applicable() { - if [[ "${BUILD}" == "yes" ]] ; then - ./mvnw clean install -P docs -pl docs -DskipTests - fi -} - -# Get the name of the `docs.main` property -# Get allowed branches - assumes that a `docs` module is available under `docs` profile -function retrieve_doc_properties() { - MAIN_ADOC_VALUE=$("${MAVEN_PATH}"mvn -q \ - -Dexec.executable="echo" \ - -Dexec.args='${docs.main}' \ - --non-recursive \ - org.codehaus.mojo:exec-maven-plugin:1.3.1:exec) - echo "Extracted 'main.adoc' from Maven build [${MAIN_ADOC_VALUE}]" - - - ALLOW_PROPERTY=${ALLOW_PROPERTY:-"docs.allowed.branches"} - ALLOWED_BRANCHES_VALUE=$("${MAVEN_PATH}"mvn -q \ - -Dexec.executable="echo" \ - -Dexec.args="\${${ALLOW_PROPERTY}}" \ - org.codehaus.mojo:exec-maven-plugin:1.3.1:exec \ - -P docs \ - -pl docs) - echo "Extracted '${ALLOW_PROPERTY}' from Maven build [${ALLOWED_BRANCHES_VALUE}]" -} - -# Stash any outstanding changes -function stash_changes() { - git diff-index --quiet HEAD && dirty=$? || (echo "Failed to check if the current repo is dirty. Assuming that it is." && dirty="1") - if [ "$dirty" != "0" ]; then git stash; fi -} - -# Switch to gh-pages branch to sync it with current branch -function add_docs_from_target() { - local DESTINATION_REPO_FOLDER - if [[ -z "${DESTINATION}" && -z "${CLONE}" ]] ; then - DESTINATION_REPO_FOLDER=${ROOT_FOLDER} - elif [[ "${CLONE}" == "yes" ]]; then - mkdir -p ${ROOT_FOLDER}/target - local clonedStatic=${ROOT_FOLDER}/target/spring-cloud-static - if [[ ! -e "${clonedStatic}/.git" ]]; then - echo "Cloning Spring Cloud Static to target" - git clone ${SPRING_CLOUD_STATIC_REPO} ${clonedStatic} && git checkout gh-pages - else - echo "Spring Cloud Static already cloned - will pull changes" - cd ${clonedStatic} && git checkout gh-pages && git pull origin gh-pages - fi - DESTINATION_REPO_FOLDER=${clonedStatic}/${REPO_NAME} - mkdir -p ${DESTINATION_REPO_FOLDER} - else - if [[ ! -e "${DESTINATION}/.git" ]]; then - echo "[${DESTINATION}] is not a git repository" - exit 1 - fi - DESTINATION_REPO_FOLDER=${DESTINATION}/${REPO_NAME} - mkdir -p ${DESTINATION_REPO_FOLDER} - echo "Destination was provided [${DESTINATION}]" - fi - cd ${DESTINATION_REPO_FOLDER} - git checkout gh-pages - git pull origin gh-pages - - # Add git branches - ################################################################### - if [[ -z "${VERSION}" ]] ; then - copy_docs_for_current_version - else - copy_docs_for_provided_version - fi - commit_changes_if_applicable -} - - -# Copies the docs by using the retrieved properties from Maven build -function copy_docs_for_current_version() { - if [[ "${CURRENT_BRANCH}" == "main" ]] ; then - echo -e "Current branch is main - will copy the current docs only to the root folder" - for f in docs/target/generated-docs/*; do - file=${f#docs/target/generated-docs/*} - if ! git ls-files -i -o --exclude-standard --directory | grep -q ^$file$; then - # Not ignored... - cp -rf $f ${ROOT_FOLDER}/ - git add -A ${ROOT_FOLDER}/$file - fi - done - COMMIT_CHANGES="yes" - else - echo -e "Current branch is [${CURRENT_BRANCH}]" - # https://stackoverflow.com/questions/29300806/a-bash-script-to-check-if-a-string-is-present-in-a-comma-separated-list-of-strin - if [[ ",${ALLOWED_BRANCHES_VALUE}," = *",${CURRENT_BRANCH},"* ]] ; then - mkdir -p ${ROOT_FOLDER}/${CURRENT_BRANCH} - echo -e "Branch [${CURRENT_BRANCH}] is allowed! Will copy the current docs to the [${CURRENT_BRANCH}] folder" - for f in docs/target/generated-docs/*; do - file=${f#docs/target/generated-docs/*} - if ! git ls-files -i -o --exclude-standard --directory | grep -q ^$file$; then - # Not ignored... - # We want users to access 1.0.0.RELEASE/ instead of 1.0.0.RELEASE/spring-cloud.sleuth.html - if [[ "${file}" == "${MAIN_ADOC_VALUE}.html" ]] ; then - # We don't want to copy the spring-cloud-sleuth.html - # we want it to be converted to index.html - cp -rf $f ${ROOT_FOLDER}/${CURRENT_BRANCH}/index.html - git add -A ${ROOT_FOLDER}/${CURRENT_BRANCH}/index.html - else - cp -rf $f ${ROOT_FOLDER}/${CURRENT_BRANCH} - git add -A ${ROOT_FOLDER}/${CURRENT_BRANCH}/$file - fi - fi - done - COMMIT_CHANGES="yes" - else - echo -e "Branch [${CURRENT_BRANCH}] is not on the allow list! Check out the Maven [${ALLOW_PROPERTY}] property in - [docs] module available under [docs] profile. Won't commit any changes to gh-pages for this branch." - fi - fi -} - -# Copies the docs by using the explicitly provided version -function copy_docs_for_provided_version() { - local FOLDER=${DESTINATION_REPO_FOLDER}/${VERSION} - mkdir -p ${FOLDER} - echo -e "Current tag is [v${VERSION}] Will copy the current docs to the [${FOLDER}] folder" - for f in ${ROOT_FOLDER}/docs/target/generated-docs/*; do - file=${f#${ROOT_FOLDER}/docs/target/generated-docs/*} - copy_docs_for_branch ${file} ${FOLDER} - done - COMMIT_CHANGES="yes" - CURRENT_BRANCH="v${VERSION}" -} - -# Copies the docs from target to the provided destination -# Params: -# $1 - file from target -# $2 - destination to which copy the files -function copy_docs_for_branch() { - local file=$1 - local destination=$2 - if ! git ls-files -i -o --exclude-standard --directory | grep -q ^${file}$; then - # Not ignored... - # We want users to access 1.0.0.RELEASE/ instead of 1.0.0.RELEASE/spring-cloud.sleuth.html - if [[ ("${file}" == "${MAIN_ADOC_VALUE}.html") || ("${file}" == "${REPO_NAME}.html") ]] ; then - # We don't want to copy the spring-cloud-sleuth.html - # we want it to be converted to index.html - cp -rf $f ${destination}/index.html - git add -A ${destination}/index.html - else - cp -rf $f ${destination} - git add -A ${destination}/$file - fi - fi -} - -function commit_changes_if_applicable() { - if [[ "${COMMIT_CHANGES}" == "yes" ]] ; then - COMMIT_SUCCESSFUL="no" - git commit -a -m "Sync docs from ${CURRENT_BRANCH} to gh-pages" && COMMIT_SUCCESSFUL="yes" || echo "Failed to commit changes" - - # Uncomment the following push if you want to auto push to - # the gh-pages branch whenever you commit to master locally. - # This is a little extreme. Use with care! - ################################################################### - if [[ "${COMMIT_SUCCESSFUL}" == "yes" ]] ; then - git push origin gh-pages - fi - fi -} - -# Switch back to the previous branch and exit block -function checkout_previous_branch() { - # If -version was provided we need to come back to root project - cd ${ROOT_FOLDER} - git checkout ${CURRENT_BRANCH} || echo "Failed to check the branch... continuing with the script" - if [ "$dirty" != "0" ]; then git stash pop; fi - exit 0 -} - -# Assert if properties have been properly passed -function assert_properties() { -echo "VERSION [${VERSION}], DESTINATION [${DESTINATION}], CLONE [${CLONE}]" -if [[ "${VERSION}" != "" && (-z "${DESTINATION}" && -z "${CLONE}") ]] ; then echo "Version was set but destination / clone was not!"; exit 1;fi -if [[ ("${DESTINATION}" != "" && "${CLONE}" != "") && -z "${VERSION}" ]] ; then echo "Destination / clone was set but version was not!"; exit 1;fi -if [[ "${DESTINATION}" != "" && "${CLONE}" == "yes" ]] ; then echo "Destination and clone was set. Pick one!"; exit 1;fi -} - -# Prints the usage -function print_usage() { -cat </` -- if the destination switch is passed (-d) then the script will check if the provided dir is a git repo and then will - switch to gh-pages of that repo and copy the generated docs to `docs//` - -USAGE: - -You can use the following options: - --v|--version - the script will apply the whole procedure for a particular library version --d|--destination - the root of destination folder where the docs should be copied. You have to use the full path. - E.g. point to spring-cloud-static folder. Can't be used with (-c) --b|--build - will run the standard build process after checking out the branch --c|--clone - will automatically clone the spring-cloud-static repo instead of providing the destination. - Obviously can't be used with (-d) - -EOF -} - - -# ========================================== -# ____ ____ _____ _____ _____ _______ -# / ____|/ ____| __ \|_ _| __ \__ __| -# | (___ | | | |__) | | | | |__) | | | -# \___ \| | | _ / | | | ___/ | | -# ____) | |____| | \ \ _| |_| | | | -# |_____/ \_____|_| \_\_____|_| |_| -# -# ========================================== - -while [[ $# > 0 ]] -do -key="$1" -case ${key} in - -v|--version) - VERSION="$2" - shift # past argument - ;; - -d|--destination) - DESTINATION="$2" - shift # past argument - ;; - -b|--build) - BUILD="yes" - ;; - -c|--clone) - CLONE="yes" - ;; - -h|--help) - print_usage - exit 0 - ;; - *) - echo "Invalid option: [$1]" - print_usage - exit 1 - ;; -esac -shift # past argument or value -done - -assert_properties -set_default_props -check_if_anything_to_sync -if [[ -z "${VERSION}" ]] ; then - retrieve_current_branch -else - switch_to_tag -fi -build_docs_if_applicable -retrieve_doc_properties -stash_changes -add_docs_from_target -checkout_previous_branch diff --git a/docs/src/main/asciidoc/images/Deps.png b/docs/src/main/asciidoc/images/Deps.png deleted file mode 100644 index 1426814308101b8ccf6ef95fd195e37c0a180392..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37192 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 A(f|Me diff --git a/docs/src/main/asciidoc/images/Stubs1.png b/docs/src/main/asciidoc/images/Stubs1.png deleted file mode 100644 index ebadfdb91014284b917367e3d9c9c8a137da3993..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35170 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 diff --git a/docs/src/main/asciidoc/images/start_spring_io_dependencies.png b/docs/src/main/asciidoc/images/start_spring_io_dependencies.png deleted file mode 100644 index 0b4784234b8118859f476bdc0aa908b63a1136e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 347308 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�P7>c8|nmWH@sJ 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%0Dv?AJbBFAdp6l%~@$e)!}LaZi$}Yob}O7q4}E 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
omEMx;XC*w+_GfbLVbr$D&}6) z~`ztu?@@8<{rnj-b{fU$$AwTOO_cs_=QIjIKx46UR_Gu?QE;Vgp#EaBPW}>>MnNJ+&AYxIuju;!2aA0$;ZdUELW9s ze=(9yyKK#>6&8yv`MrrnST4nOVVzUUMW@ixU$Pw&-Tlo(qXX%j)uO;5f`DDt*}i3P zD6FI4pie=(HF;{E$mB^MAz!W+=7j*@wkCC)%8`m!3Ta)*D%V#!C|BG=(4xhT`AB6< z>42#%w;_TnpK|`rNW+PP5t$#%!CA(lyzXKHRPU0AKMtZ!OQYI=7Lehm-KkK$p&K$H5Iycv@LHCIm#fNV4ZYKvinBJ$)qHqUkhKxhEm^rLr$t>LGBm0m zA)qkQ7>fbnSE2>UGmCT-ub01Lt*8Nnw$Tqv<)cz9O$2OxQ##tbQe_`@1MzJW*1ObD zZt!^^>?13Leagm^LwKZ6zEBs90_?M}=J~C1I(k?(G=oJdRP#AcTJ|Lv^9c9WZ zt!Bf8J_y=+bC@SKt$a(=g(b!?X7{=WF=kfl&)^Aa8c-AP^$~4UA*S~d*#qGeZ2tAD zvs~?hJ&;hQ08h<9I(Ev{2AMa?fpS+|MBkaE?M*{}5Klscu@d7K(`bvbRN%f*CM