From 8f0710b1481efd77557f0e064a59af923513e392 Mon Sep 17 00:00:00 2001 From: Yass Almardoud Date: Mon, 22 Jul 2024 10:46:28 +0200 Subject: [PATCH] returned --- .editorconfig | 12 + .github/dependabot.yml | 15 + .github/release_drafter.yml | 45 + .github/workflows/ci.yml | 30 + .github/workflows/release-drafter.yml | 44 + .github/workflows/release.yml | 44 + .gitignore | 23 + manual/pom.xml | 379 ++++ manual/src/main/asciidoc/images/jqa.jpg | Bin 0 -> 151055 bytes .../main/asciidoc/include/configuration.adoc | 350 ++++ .../src/main/asciidoc/include/devguide.adoc | 1 + .../main/asciidoc/include/introduction.adoc | 467 +++++ manual/src/main/asciidoc/include/license.adoc | 2 + .../src/main/asciidoc/include/overview.adoc | 25 + manual/src/main/asciidoc/include/plugins.adoc | 17 + .../src/main/asciidoc/include/quickstart.adoc | 169 ++ manual/src/main/asciidoc/index.adoc | 29 + manual/src/main/asciidoc/jqassistant.css | 1784 +++++++++++++++++ manual/src/main/assembly/manual.xml | 18 + pom.xml | 884 ++++++++ 20 files changed, 4338 insertions(+) create mode 100644 .editorconfig create mode 100644 .github/dependabot.yml create mode 100644 .github/release_drafter.yml create mode 100644 .github/workflows/ci.yml create mode 100644 .github/workflows/release-drafter.yml create mode 100644 .github/workflows/release.yml create mode 100644 .gitignore create mode 100644 manual/pom.xml create mode 100644 manual/src/main/asciidoc/images/jqa.jpg create mode 100644 manual/src/main/asciidoc/include/configuration.adoc create mode 100644 manual/src/main/asciidoc/include/devguide.adoc create mode 100644 manual/src/main/asciidoc/include/introduction.adoc create mode 100644 manual/src/main/asciidoc/include/license.adoc create mode 100644 manual/src/main/asciidoc/include/overview.adoc create mode 100644 manual/src/main/asciidoc/include/plugins.adoc create mode 100644 manual/src/main/asciidoc/include/quickstart.adoc create mode 100644 manual/src/main/asciidoc/index.adoc create mode 100644 manual/src/main/asciidoc/jqassistant.css create mode 100644 manual/src/main/assembly/manual.xml create mode 100644 pom.xml diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000000..8d67bc7a54 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,12 @@ +# top-most EditorConfig file +root = true + +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +indent_style = space + +[*.{java,xml}] +indent_size = 4 +trim_trailing_whitespace = true diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000000..14f5f8fa88 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,15 @@ +version: 2 +updates: + - package-ecosystem: 'maven' + directory: '/' + schedule: + interval: 'daily' + time: '00:00' + open-pull-requests-limit: 15 + + - package-ecosystem: 'github-actions' + directory: '/' + schedule: + interval: 'daily' + time: '00:00' + open-pull-requests-limit: 10 diff --git a/.github/release_drafter.yml b/.github/release_drafter.yml new file mode 100644 index 0000000000..2fe7a3e609 --- /dev/null +++ b/.github/release_drafter.yml @@ -0,0 +1,45 @@ +name-template: 'v$RESOLVED_VERSION' +tag-template: 'v$RESOLVED_VERSION' +categories: + - title: '✨ Features' + labels: + - 'feature' + - title: '🐛 Bug Fixes' + labels: + - 'bug' + - title: '🧰 Maintenance' + labels: + - 'chore' + +change-template: '- $TITLE (#$NUMBER by @$AUTHOR)' +change-title-escapes: '\<*_&' +# You can add # and @ to disable mentions, and add ` to disable code blocks. +version-resolver: + major: + labels: + - 'major' + minor: + labels: + - 'minor' + patch: + labels: + - 'patch' + default: patch +exclude-labels: + - 'skip-changelog' +template: | + ## What's changed + + $CHANGES +autolabeler: + - label: 'chore' + branch: + - '/chore\/.+/' + - label: 'bug' + branch: + - '/bug\/.+/' + - '/bugfix\/.+/' + - '/hotfix\/.+/' + - label: 'feature' + branch: + - '/feature\/.+/' diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000000..22570cfb28 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,30 @@ +--- +name: CI + +on: + push: + branches: + - master + tags-ignore: + - "*" + pull_request: + branches: + - master + workflow_dispatch: {} + +concurrency: + group: build-java-${{ github.ref }} + cancel-in-progress: true + +jobs: + build: + uses: jqassistant-tooling/jqassistant-github-actions/.github/workflows/ci.yml@main + with: + publish_snapshots: true + java_test_versions: '[11,17,21]' + secrets: + ossrh_username: ${{ secrets.OSSRH_USERNAME }} + ossrh_password: ${{ secrets.OSSRH_PASSWORD }} + ossrh_signing_key: ${{ secrets.OSSRH_SIGNING_KEY }} + ossrh_signing_password: ${{ secrets.OSSRH_SIGNING_PASSWORD }} + sonar_token: ${{ secrets.SONAR_TOKEN }} diff --git a/.github/workflows/release-drafter.yml b/.github/workflows/release-drafter.yml new file mode 100644 index 0000000000..b998a3ebe8 --- /dev/null +++ b/.github/workflows/release-drafter.yml @@ -0,0 +1,44 @@ +--- +name: Release + +on: + workflow_dispatch: + inputs: + java_version: + description: Java version to use + type: string + required: false + default: 17 + releaseVersion: + description: "Default version to use when preparing a release." + required: true + default: "X.Y.Z" + developmentVersion: + description: "Default version to use for new local working copy." + required: true + default: "X.Y.Z-SNAPSHOT" + dryRun: + description: "Perform a dry run" + required: true + default: false + type: boolean + assets: + description: "Path expression for Assets to upload." + type: string + required: false + default: "target/checkout/cli/neo4jv?/target/*-distribution.zip" + +jobs: + build: + uses: jqassistant-tooling/jqassistant-github-actions/.github/workflows/release.yml@main + with: + releaseVersion: ${{ github.event.inputs.releaseVersion }} + developmentVersion: ${{ github.event.inputs.developmentVersion }} + dryRun: ${{ github.event.inputs.dryRun }} + assets : ${{ github.event.inputs.assets }} + secrets: + ossrh_username: ${{ secrets.OSSRH_USERNAME }} + ossrh_password: ${{ secrets.OSSRH_PASSWORD }} + ossrh_signing_key: ${{ secrets.OSSRH_SIGNING_KEY }} + ossrh_signing_password: ${{ secrets.OSSRH_SIGNING_PASSWORD }} + sonar_token: ${{ secrets.SONAR_TOKEN }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000000..b998a3ebe8 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,44 @@ +--- +name: Release + +on: + workflow_dispatch: + inputs: + java_version: + description: Java version to use + type: string + required: false + default: 17 + releaseVersion: + description: "Default version to use when preparing a release." + required: true + default: "X.Y.Z" + developmentVersion: + description: "Default version to use for new local working copy." + required: true + default: "X.Y.Z-SNAPSHOT" + dryRun: + description: "Perform a dry run" + required: true + default: false + type: boolean + assets: + description: "Path expression for Assets to upload." + type: string + required: false + default: "target/checkout/cli/neo4jv?/target/*-distribution.zip" + +jobs: + build: + uses: jqassistant-tooling/jqassistant-github-actions/.github/workflows/release.yml@main + with: + releaseVersion: ${{ github.event.inputs.releaseVersion }} + developmentVersion: ${{ github.event.inputs.developmentVersion }} + dryRun: ${{ github.event.inputs.dryRun }} + assets : ${{ github.event.inputs.assets }} + secrets: + ossrh_username: ${{ secrets.OSSRH_USERNAME }} + ossrh_password: ${{ secrets.OSSRH_PASSWORD }} + ossrh_signing_key: ${{ secrets.OSSRH_SIGNING_KEY }} + ossrh_signing_password: ${{ secrets.OSSRH_SIGNING_PASSWORD }} + sonar_token: ${{ secrets.SONAR_TOKEN }} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000..bec1ca50eb --- /dev/null +++ b/.gitignore @@ -0,0 +1,23 @@ +/.idea +*.iml +*.ipr +*~ +*.log +.DS_Store +# Files we would like to have in our local repository, but not in the remote repository +*.ignore +release.properties +pom.xml.releaseBackup +.java-version +*.backup + +# Files generated by the release tooling of jQAssistant +pom.xml.updatetorelease +pom.xml.updatetonextdevversion + +# Ignore temporary shell scripts used to script small tasks +*.sh.ignore + +# Maven related files and directories +target +/.mvn diff --git a/manual/pom.xml b/manual/pom.xml new file mode 100644 index 0000000000..3e4d3306ff --- /dev/null +++ b/manual/pom.xml @@ -0,0 +1,379 @@ + + 4.0.0 + + + com.buschmais.jqassistant + parent + 2.4.0-SNAPSHOT + + + manual + + jQAssistant User Manual + + + The user manual of jQAssistant. + + + + ${project.build.directory}/asciidoc-modules-documentation + ${project.build.directory}/asciidoc-modules-documentation + + + + + + org.asciidoctor + asciidoctor-maven-plugin + + + manual + process-resources + + process-asciidoc + + + + auto + jqassistant.css + ${asciidoc.directory} + + src/main/asciidoc/ + index.adoc + ${project.build.directory}/generated-docs/ + + + ${project.basedir}/src/main/asciidoc + ${project.build.directory}/generated-docs/ + + **/*.png + + + + + + + + xhtml5 + + 3 + 4 + ${asciidoc.directory} + coderay + ${project.groupId} + ${project.artifactId} + ${project.version} + + + + + com.buschmais.jqassistant + jqassistant-maven-plugin + + + + org.apache.maven.plugins + maven-assembly-plugin + + + package-manual + + single + + package + + true + jqassistant-manual-${project.version} + false + + ${project.basedir}/src/main/assembly/manual.xml + + + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + unpack-manual-source + + unpack-dependencies + + generate-resources + + ${asciidoc.directory} + zip + asciidoc + true + + + + + + + + + + + + com.buschmais.jqassistant.core + parent + ${project.version} + zip + asciidoc + provided + + + * + * + + + + + com.buschmais.jqassistant.core + neo4j + ${project.version} + zip + asciidoc + provided + + + * + * + + + + + + com.buschmais.jqassistant.plugin + yaml2 + ${project.version} + zip + asciidoc + provided + + + * + * + + + + + com.buschmais.jqassistant.plugin + json + ${project.version} + zip + asciidoc + provided + + + * + * + + + + + com.buschmais.jqassistant.plugin + junit + ${project.version} + zip + asciidoc + provided + + + * + * + + + + + com.buschmais.jqassistant.plugin + xml + ${project.version} + zip + asciidoc + provided + + + * + * + + + + + com.buschmais.jqassistant.plugin + common + ${project.version} + + + com.buschmais.jqassistant.plugin + common + ${project.version} + zip + asciidoc + provided + + + * + * + + + + + com.buschmais.jqassistant.plugin + java + ${project.version} + zip + asciidoc + provided + + + * + * + + + + + com.buschmais.jqassistant.plugin + maven3 + ${project.version} + zip + asciidoc + provided + + + * + * + + + + + + + com.buschmais.jqassistant.cli + parent + ${project.version} + zip + asciidoc + provided + + + * + * + + + + + + + com.buschmais.jqassistant + jqassistant-maven-plugin + ${project.version} + zip + asciidoc + provided + + + * + * + + + + + + + + com.buschmais.jqassistant.core + parent + zip + asciidoc + provided + + + com.buschmais.jqassistant.core + neo4j + zip + asciidoc + provided + + + com.buschmais.jqassistant.plugin + common + zip + asciidoc + provided + + + com.buschmais.jqassistant.plugin + java + zip + asciidoc + provided + + + com.buschmais.jqassistant.plugin + json + zip + asciidoc + provided + + + com.buschmais.jqassistant.plugin + junit + zip + asciidoc + provided + + + com.buschmais.jqassistant.plugin + maven3 + zip + asciidoc + provided + + + com.buschmais.jqassistant.plugin + xml + zip + asciidoc + provided + + + com.buschmais.jqassistant.plugin + yaml2 + zip + asciidoc + provided + + + + + com.buschmais.jqassistant.cli + parent + zip + asciidoc + provided + + + + + com.buschmais.jqassistant + jqassistant-maven-plugin + zip + asciidoc + provided + + + + + diff --git a/manual/src/main/asciidoc/images/jqa.jpg b/manual/src/main/asciidoc/images/jqa.jpg new file mode 100644 index 0000000000000000000000000000000000000000..987facac8501009cd25c918805d06f263a71076f GIT binary patch literal 151055 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 z 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

QctPI97pB7?p&})wD-Vrh{Fx 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 Q_)Fj~f&U`}uKhdxKg2c0n*aa+ literal 0 HcmV?d00001 diff --git a/manual/src/main/asciidoc/include/configuration.adoc b/manual/src/main/asciidoc/include/configuration.adoc new file mode 100644 index 0000000000..0e90e1453d --- /dev/null +++ b/manual/src/main/asciidoc/include/configuration.adoc @@ -0,0 +1,350 @@ +[[core:Configuration]] +== Configuration + +The behavior of jQAssistant accepts a wide range of configuration options, e.g. + +* passing properties to scanner or report plugins +* rules to be executed during analysis including required rule parameters +* define thresholds for warnings and failures during analysis +* location of the database to use, e.g. directory of the embedded Neo4j instance or URL of a remote Neo4j instance + +The configuration options can be passed in different ways: + +* YAML files (recommended) +* system properties or environment variables +* command line options for the Command Line Interface +* configuration options in the Maven build descriptors (pom.xml) + +=== YAML files + +jQAssistant automatically loads YAML files from the following locations of the user home and the working directory: + +* `.jqassistant.yml` or `.jqassistant.yaml` +* `.yml` or `.yaml` files located in the directory or sub-directories of `.jqassistant/` + +NOTE: Configuration files in the user home directory have a lower priority than those in the working directory. + +TIP: The locations can be overridden by command line parameters of the Command Line Utility or the Maven plugin. + +The following options are supported (including default values): + +[source,yaml] +---- +jqassistant: + # Controls whether the execution of jQAssistant shall be skipped + # + # -Djqassistant.skip: true|false + skip: false + + # The list of jQAssistant plugins to load and activate. + # + # Each plugin is identified using its Maven coordinates: + # + # -Djqassistant.plugins[0].group-id + # -Djqassistant.plugins[0].artifact-id + # -Djqassistant.plugins[0].version + # -Djqassistant.plugins[0].classifier (optional) + # -Djqassistant.plugins[0].type (optional) + # -Djqassistant.plugins[0].exclusions[0].group-id (optional) + # -Djqassistant.plugins[0].exclusions[0].artifact-id (optional) + plugins: + - group-id: + artifact-id: + version: + classifier: + type: + exclusions: + - group-id: + artifact-id: + + + # The store configuration + store: + + # URI of the database to connect to. Supported URI schemes are 'file' for embedded databases and 'bolt' for connecting to a running Neo4j instance (3.x+), e.g. + # + # -Djqassistant.store.uri + uri: file://target/jqassistant/store + + # Settings for the embedded Neo4j store + embedded: + + # Enable the HTTP and BOLT connector for the embedded store + # + # -Djqassistant.store.embedded.connector-enabled: true|false + connector-enabled: false + + # The listen address for the HTTP and BOLT connectors + # + # -Djqassistant.store.embedded.listen-address + listen-address: localhost + + # The BOLT connector port + # + # -Djqassistant.store.embedded.bolt-port + bolt-port: 7687 + + # The HTTP connector port + # + # -Djqassistant.store.embedded.http-port + http-port: 7474 + + # The directory from which Neo4j shall load plugins (e.g. APOC) + # + # -Djqassistant.store.embedded.neo4j-plugin-directory + neo4j-plugin-directory: + + # The list of Neo4j plugins to load and activate. + # It uses the "neo4j-plugin-directory" (see above) if provided, otherwise a temporary directory is created. + neo4j-plugins: + # Each plugin is identified using its Maven coordinates: + # + # -Djqassistant.store.embedded.neo4j-plugins[0].group-id + # -Djqassistant.store.embedded.neo4j-plugins[0].artifact-id + # -Djqassistant.store.embedded.neo4j-plugins[0].version + # -Djqassistant.store.embedded.neo4j-plugins[0].classifier (optional) + # -Djqassistant.store.embedded.neo4j-plugins[0].type (optional) + # -Djqassistant.store.embedded.neo4j-plugins[0].exclusions[0].group-id (optional) + # -Djqassistant.store.embedded.neo4j-plugins[0].exclusions[0].artifact-id (optional) + - group-id: + artifact-id: + version: + classifier: + type: + exclusions: + - group-id: + artifact-id: + + + # Settings for connecting to a remote Neo4j store + remote: + + # The user name for authentication. + # + # -Djqassistant.store.username + username: + + # The password for authentication. + # + # -Djqassistant.store.password + password: + + # Activate encryption level for 'bolt' connections. + # + # -Djqassistant.store.encryption: true|false + encryption: true + + #The trust strategy for 'bolt' connections + # + # -Djqassistant.store.trust-strategy: trustAllCertificates|trustCustomCaSignedCertificates|trustSystemCaSignedCertificates + trust-strategy: trustAllCertificates + + # The file containing the custom CA certificate for trust strategy. + # + # -Djqassistant.store.trust-certificate + trust-certificate: + + # Additional properties to be passed to the remote store as key-value pairs. + # + # -Djqassistant.store.properties + properties: + + + # The Scanner configuration + scan: + + # Indicates whether to initially reset the store (i.e. clear all nodes and relationships) before scanning. + # + # -Djqassistant.scan.reset: true|false + reset: true + + # Specifies if a scan shall be continued if an error is encountered. + # + # -Djqassistant.scan.continue-on-error: true|false + continue-on-error: false + + # The items to include for scanning. + include: + + # A list of files to include. + # + #jqassistant.scan.include.files[0] + files: + # - src/folder + + # A list of URLs to include. + # + #jqassistant.scan.include.urls[0] + urls: + # - maven:repository::https://nexus/repository + + # The properties to configure scanner plugins as key-value pairs. The supported properties are plugin specific. + # + # -Djqassistant.scan.properties + properties: + # plugin.property.key: value + + + # The analyze configuration + analyze: + + # The rule configuration + rule: + + # The name of the directory containing project rules. + # + # -Djqassistant.analyze.rule.directory + directory: jqassistant/ + + # The default severity of concepts without an explicit severity. + # + # -Djqassistant.analyze.rule.default-concept-severity: INFO|MINOR|MAJOR|CRITICAL|BLOCKER + default-concept-severity: MINOR + + # The default severity of constraint without an explicit severity. + # + # -Djqassistant.analyze.rule.default-constraint-severity: INFO|MINOR|MAJOR|CRITICAL|BLOCKER + default-constraint-severity: MAJOR + + # The default severity of groups without an explicit severity. + # + # -Djqassistant.analyze.rule.default-group-severity: INFO|MINOR|MAJOR|CRITICAL|BLOCKER + default-group-severity: + + # The baseline configuration + baseline: + + # Enables baseline management for concept and constraint results. + # + # -Djqassistant.analyze.baseline.enabled: true|false + enabled: false + + # The file name for storing the baseline. + # + # -Djqassistant.analyze.baseline.file + file: jqassistant/jqassistant-baseline.xml + + # The concepts to be managed in the baseline (default: none) + # + # -Djqassistant.analyze.baseline-include.concepts[0] + include.concepts: + # - my-concept + + # The constraints to be managed in the baseline (default: all) + # + # -Djqassistant.analyze.baseline.include-constraints[0] + include-constraints: + - "*" + + # The report configuration + report: + + # The properties to configure report plugins. The supported properties are plugin specific. + # + # -Djqassistant.analyze.report.properties + properties: + # plugin.property.key: value + + # Determines the severity level for reporting a warning. + # + # -Djqassistant.analyze.report.warn-on-severity: INFO|MINOR|MAJOR|CRITICAL|BLOCKER|NEVER + warn-on-severity: MINOR + + # Determines the severity level for reporting a failure. + # + # -Djqassistant.analyze.report.fail-on-severity: INFO|MINOR|MAJOR|CRITICAL|BLOCKER|NEVER + fail-on-severity: MAJOR + + # Determines if jQAssistant shall continue the build if failures have been detected. + # + # -Djqassistant.analyze.report.continue-on-failure: true|false + continue-on-failure: false + + # Create an archive containing all generated reports. + # + # -Djqassistant.analyze.report.create-archive: true|false + create-archive: false + + # The concepts to be applied. + # + # -Djqassistant.analyze.concepts[0] + concepts: + # - my-concept + + # The constraints to be validated. + # + # -Djqassistant.analyze.constraints[0] + constraints: + # - my-constraint + + # The constraints to be excluded (e.g. if referenced from a group). + # + # -Djqassistant.analyze.exclude-constraints[0] + exclude-constraints: + # - any-constraint + + + # The groups to be executed. + # + # -Djqassistant.analyze.groups[0] + groups: + # - spring-boot:Default + + # The parameters to be passed to the executed rules. + # + # -Djqassistant.analyze.rule-parameters."parameterName" + rule-parameters: + # parameterName: value + + # Execute concepts even if they have already been applied before + # + # -Djqassistant.analyze.execute-applied-concepts: true|false + execute-applied-concepts: false + + # The execution time [seconds] for rules (concepts/constraints) to show a warning. Can be used as a hint for optimization. + # + # -Djqassistant.analyze.warn-on-rule-execution-time-seconds + warn-on-rule-execution-time-seconds: 5 +---- + +=== Environment Variables + +The names of system properties may be used for environment variables. +Depending on execution environment there may be restrictions on the naming, e.g. not allowing characters like `.`. +Therefore, the following mappings are supported (see https://download.eclipse.org/microprofile/microprofile-config-1.4/microprofile-config-spec.html#default_configsources.env.mapping[Eclipse Microprofile Config]): + +* Exact match (e.g. `jqassistant.scan.continue-on-error`) +* Replace each character that is neither alphanumeric nor _ with _ (e.g. `jqassistant_scan_continue_on_error`) +* Replace each character that is neither alphanumeric nor _ with _; then convert the name to upper case (`JQASSISTANT_SCAN_CONTINUE_ON_ERROR`) + +=== System Properties + +All configuration options can be provided as system properties. +The according names are documented in the YAML example above. + +NOTE: Configuration options defined in a YAML file can be overridden by environment variables of system properties. +The priorities are as following: `System Property` --> `Environment Variable` --> `YAML file`. + +=== Property placeholders + +Values may contain placeholders referering to other properties: + +[source,yaml] +---- +src-dir: ./src + +jqassistant: + scan: + include: + files: + - ${src-dir}/folder1 + - ${src-dir}/folder2 +---- + +The properties in placeholders can be defined in different sources: + +- within the same or other configuration files +- system properties +- environment variables +- Maven or user properties specified in the files pom.xml or settings.xml (for the jQAssistant Maven plugin) + diff --git a/manual/src/main/asciidoc/include/devguide.adoc b/manual/src/main/asciidoc/include/devguide.adoc new file mode 100644 index 0000000000..86f0c2fc5c --- /dev/null +++ b/manual/src/main/asciidoc/include/devguide.adoc @@ -0,0 +1 @@ +== Developer Guide diff --git a/manual/src/main/asciidoc/include/introduction.adoc b/manual/src/main/asciidoc/include/introduction.adoc new file mode 100644 index 0000000000..feb857ddeb --- /dev/null +++ b/manual/src/main/asciidoc/include/introduction.adoc @@ -0,0 +1,467 @@ +== Introduction + +This chapter provides an introduction to the concepts of jQAssistant. + +=== How it works + +The basic idea behind jQAssistant is to integrate the following steps into the build process of a software system: + +1. Scan the generated artifacts and store structural information about them into a database +2. Analyze the structures using _rules_ which are represented by queries +3. Report violations + +jQAssistant itself is a plugin based framework. It comes with a pre-defined set of plugins containing scanners, rules and reports but can be easily extended by +custom rules or implementations. + +As database an embedded instance of Neo4j Community Edition is managed and used by jQAssistant. This means that no setup or configuration of a dedicated server +is required. Neo4j has been chosen because: + +- it is a mature open source graph database +- it allows easy modelling of structural elements of a software and their relations +- it comes with a very expressive and easy to learn query language (Cypher) + +=== Scanner +Scanners are used to import software structures into the database. They are provided by plugins and may support several types of artifacts, e.g. +Java classes, XML files or database structures. +The jQAssistant framework (including the command line or Maven plugin) only provides the infrastructure to run a scan operation on a set +of items, e.g. files, directories or URLs. Every active plugin decides itself if it accepts and imports a given item by checking several +conditions, e.g. file name extensions or a provided scope. The latter is an extra information which provides specific context information +like "java:classpath" for a directory containing Java classes or "maven:repository" for a URL. + +=== Rules +Rules are expressed as Cypher queries and are specified in XML files: + +[source,xml] +.my-rules.xml +---- + + + + + + + + A human readable description of the concept. + + + + + + A human readable description of the concept. + + + + + + + A human readable description of the constraint. + + + + +---- + +Each rule comes with an unique id (e.g. "my-rules:MyConstraint") which can be referenced by other rules. jQAssistant will take care about executing the rules in +the correct order. Furthermore a human readable description shall help developers to understand the rationale behind them. + +TIP: Despite rules are usually referenced by their id it is also possible to use the wildcards `\*` and `?`. +This is especially useful for defining groups and include all constraints that match a specific pattern, e.g. `my-rules:*`. + +==== Groups +A group is a set of rules (i.e. concepts, constraints or other groups) that shall be executed together by including them with the option to overwrite their default severity. +This allows to adjust analysis depth for different types of builds, e.g. a Continuous Integration build (CI) can be configured +to only execute rules with low costs (i.e. execution times) whereas a report build is allowed to run for a longer time with more +expensive checks. + + +==== Concepts +The information created by the scanner represents the structure of a software project on a raw level. _Concept_ rules allow enriching the database with higher +level information to ease the process of writing queries that check for violations (i.e. constraints) . This typically means adding labels, properties or +relations. + +jQAssistant comes with language and framework plugins which include general technical concepts, e.g. + +- "java:MethodOverrides" provided by the Java plugin adds a relation "OVERRIDES" between a method of a sub class to the super class methods it overrides. + +It is recommended to use concepts to enrich the database with information which is specific for the concrete project, e.g. labels can be added to + +- package nodes representing modules of the application ("Module") +- package nodes that represent technical layers ("UI", "EJB") +- class nodes representing elements with a specific role ("Controller", "Model") + +NOTE: Even if the primary intention of a concept is to enrich data it still must provide a return clause. +If a concept returns an empty result a warning will be generated by jQAssistant. +The rationale is that in such case the concept does not match the structure of the application and other rules which depend on it will probably not work as expected. + +TIP: The return clause of the concept shall preferably return a node/relation itself instead of an attribute of it. +With this, XML and HTML reports can provide additional information about the concept. + +==== Constraints +A _Constraint_ is a query which detects violations, e.g. + +- classes with specific roles (e.g. entity, controller, etc.) that are either located in the wrong packages or have names that do not fit defined conventions +- invocations of methods which are deprecated and/or forbidden (e.g. constructors of java.util.Date) +- dependencies to other modules which are not allowed + +A constraint can depend on one or more concepts and usually is referenced by one or more groups. + +NOTE: If a constraint returns a result jQAssistant will report an error including the provided description and information about the returned elements. This +information shall help the developer to understand and fix the problem. + +==== Rule Dependencies + +As shown in the snippets above concepts or constraints may define dependencies to other concepts. There are two approaches: + +`requiresConcept` (XML) or `requiresConcepts` (Asciidoc):: A rule explicitly requires another concept to be executed before. +`providesConcept` (XML) or `providesConcepts` (Asciidoc):: A concept extends another concept by adding the same labels or relationships. + +The rules are referenced by their ids. jQAssistant will ensure that these rules are executed in the correct order. + +Usually dependencies are expressed using `requiresConcept(s)`, e.g. a constraint requires one or more specific concepts. +These concepts again might require other concepts. + +There may be situation where pre-defined constraints and required concepts are defined within a plugin. +In this case it can become necessary to extend such concepts with project-specific concepts, e.g. to work with generated code: + +* Constraints defined by the Spring plugin delivered with jQAssistant verify correct usage of dependency injection +* These constraints exclude all Java types labeled with `:Type:Generated` and therefore require the concept `java:GeneratedType` which is defined by the Java plugin +* This concept may be extended by project specific concepts adding labels `:Type:Generated` and declaring the provided concept `java:GeneratedType` using `providesConcept(s)` + +There might be cases where a concept is provided by a rule plugin which provides the same labels or relationships as an (abstract) concept from another plugin. +In these cases it is possible to perform a dynamic extension (duck-typing) to the abstract by specifying `providesConcept` in a group definition: + +[source,xml] +.my-rules.xml +---- + + + + + + + + + +---- + +==== Severity Of Rules + +A rule may optionally define the _severity_ level. jQAssistant allows to break the build if there are violations in the configured severity level (or higher). +For example, if the severity is set to critical, and if there are violated constraints with blocker and/or critical severity; the build will break. +This feature allows projects to pay down their technical debt in an iterative manner. + +Following severity levels are supported: + +- info +- minor (default for concepts) +- major (default for constraints) +- critical +- blocker + +There is no default severity for groups. If a severity is specified then it is applied to all included elements where no +further severity is given, e.g. + +[source,xml] +.my-rules.xml +---- + + + + + + + + +---- + +Thus execution of the group 'my-rules:MyGroup' will report a violation of constraint... + +- ...'my-rules-Constraint1' with severity 'blocker' (inherited from the group) +- ...'my-rules-Constraint2' with severity 'minor' (specified within the group) + +==== Warnings and Failures + +Based on the severity of violated rules jQAssistant generates warnings and failures. +These are based on configurable thresholds: + +* `jqassistant.analyze.report.warn-on-severity` (default: `minor`) +* `jqassistant.analyze.report.fail-on-severity` (default: `major`) + +The warnings and failures are logged on the console and part of generated reports (e.g. XML or Asciidoc). + +Furthermore, the setting `jqassistant.analyze.report.continue-on-failure` (default: `false`) controls whether jQAssistant will continue or break the build failures have been detected during analysis. + +TIP: If violations are exported to dashboards (e.g. SonarQube, Teamscale) then `jqassistant.analyze.report.continue-on-failure` should be set to `true`. + +==== Script Languages + +Instead of cypher scripting languages like JavaScript, Ruby or Groovy may be used for writing concepts or constraints: + +[source,xml] +.my-scripting-rules.xml +---- + + JavaScript example constraint: returns a result containing the number + of declared methods for each class. + + +---- + +==== Rule Parameters + +Both concepts and constraints may define required parameters: + +[source,xml] +.my-rules.xml +---- + + + + <1> + Labels the root package of the application with "Root". + + SET + root:Root + RETURN + root + ]]> + + + +---- + +<1> Declaration of a required parameter with a default value. +<2> Reference to a parameter in a Cypher query. + +The following parameter types are supported: + +* char +* byte +* short +* int +* long +* float +* double +* boolean +* String + +The values for the required parameters must be provided by the execution context, e.g. the jQAssistant +Maven plugin or the command line utility. A rule may specify a default value which is used if no concrete value +is provided for an execution. + +NOTE: Default values are currently not supported for rules in Asciidoc files. + +For rules expressed in Cypher the parameters are referenced by `{...}` placeholders. For scripts the values are passed +as parameters, i.e. they may be used directly in the code. + +==== Result verification + +The default strategy (`rowCount`) verifies a result of a concept or constraint by counting the number of returned rows, i.e. + +- a concept is valid if it returns at least one row +- a constraint is valid if it returns no row + +This behavior can be customized by specifing `min` and `max` thresholds: + +[source,xml] +---- + + A human readable description of the constraint. + + + + + +---- + +It is also possible to verify aggregated results reported as numeric values in a column, e.g. + +[source,xml] +---- + + A human readable description of the constraint. + + + + + +---- + +* For each returned row the value of the column "Count" will be verified following the same principles as described above +* The rule fails if at least one returned row does not match the expected result +* The attribute `column`/`aggregationColumn` can be omitted, in this case the first column of the result is evaluated +* Similar to the row count verification the attributes `min`/`aggregationMin` and `max`/`aggregationMax` can be specified for individual thresholds + +==== Report + +A rule may select a specific report plugin and pass properties to it: + +[source,xml] +---- + + A human readable description of the concept. + (n) + ... + RETURN + m, n + ]]> + + value + + +---- + +===== Primary Column + +If a rule reports more than one column it might be necessary to specify the column which contains the primary element +the rule refers to, e.g. the Java class. The information may be evaluated by reporting tools, e.g. for creating issues +in SonarQube: + +[source,xml] +---- + + A human readable description of the concept. + (n) + ... + RETURN + m, n + ]]> + + +---- + +NOTE: The first column will be used automatically if no primary column is explicitly specified. + +==== Baseline Management + +Introducing rules to an existing codebase usually leads to a large number of existing violations. +It is a common strategy to suppress them and only check for new ones. +This can be achieved by enabling baseline management in the configuration: + +[source,yaml] +.jqassistant.yml +---- +jqassistant: + analyze: + baseline: + enabled: true +---- + +Existing violations will be reported during the first analysis. +At the same time a file `jqassistant-baseline.xml` will be created in the rule directory containing these violations as entries. These will no longer be reported by subsequent executions. + +The file `jqassistant-baseline.xml` is supposed to be checked in into the VCS. +If an entry contained in the baseline file is no longer detected during an analysis, then the according entry will be removed from the file which can be updated in the VCS again. + +TIP: Entries in the baseline can be removed manually if these entries no longer shall be suppressed during analysis. To achieve this the according ` ... ` must be deleted and the baseline file updated in the VCS. + +If baseline management is enabled the by default all constraint violations will be included. +This can be fine-tuned by adding further configuration properties: + +[source,yaml] +.jqassistant.yml +---- +jqassistant: + analyze: + baseline: + enabled: true + include-constraints: + - "spring-injection:*" + include-concepts: + - "spring-injection:*" +---- + +TIP: By default concepts are not included in the baseline but this can be activated (see above). +This is useful for monitoring existing concepts. +If they disappear for any reason (i.e. changed code or updated rules), then the baseline file will be updated and the change be reported by the VCS. + diff --git a/manual/src/main/asciidoc/include/license.adoc b/manual/src/main/asciidoc/include/license.adoc new file mode 100644 index 0000000000..16d056be56 --- /dev/null +++ b/manual/src/main/asciidoc/include/license.adoc @@ -0,0 +1,2 @@ +== License +jQAssistant is contributed under http://www.gnu.org/licenses/gpl-3.0.html[GNU General Public License, v3]. diff --git a/manual/src/main/asciidoc/include/overview.adoc b/manual/src/main/asciidoc/include/overview.adoc new file mode 100644 index 0000000000..30a77e8122 --- /dev/null +++ b/manual/src/main/asciidoc/include/overview.adoc @@ -0,0 +1,25 @@ +== Overview + +jQAssistant is a QA tool which allows the definition and validation of project specific rules on a structural level. It is built upon the +graph database http://neo4j.org[Neo4j] and can easily be plugged into the build process to automate detection of constraint violations +and generate reports about user defined concepts and metrics. + +Example use cases: + +- Enforce naming conventions, e.g. EJBs, JPA entities, test classes, packages, maven modules etc. +- Validate dependencies between modules of your project +- Separate API and implementation packages +- Detect common problems like cyclic dependencies or tests without assertions + +The rules are expressed in Cypher - the easy-to-learn query language of Neo4j: + +[source] +---- +MATCH + (t:Test:Method) +WHERE NOT + (t)-[:INVOKES]->(:Assert:Method) +RETURN + t AS TestWithoutAssertion +---- + diff --git a/manual/src/main/asciidoc/include/plugins.adoc b/manual/src/main/asciidoc/include/plugins.adoc new file mode 100644 index 0000000000..2ad40ea522 --- /dev/null +++ b/manual/src/main/asciidoc/include/plugins.adoc @@ -0,0 +1,17 @@ +== Plugins + +This section provides detailed descriptions of all distributed plugins. + +:leveloffset: 2 + +// +// Please insert new documents in alphabetical order!!!! +// + +include::{docRoot}/com.buschmais.jqassistant.plugin/java/asciidoc/plugin.adoc[] +include::{docRoot}/com.buschmais.jqassistant.plugin/json/asciidoc/plugin.adoc[] +include::{docRoot}/com.buschmais.jqassistant.plugin/junit/asciidoc/plugin.adoc[] +include::{docRoot}/com.buschmais.jqassistant.plugin/maven3/asciidoc/plugin.adoc[] +include::{docRoot}/com.buschmais.jqassistant.plugin/xml/asciidoc/plugin.adoc[] + +:leveloffset: 0 diff --git a/manual/src/main/asciidoc/include/quickstart.adoc b/manual/src/main/asciidoc/include/quickstart.adoc new file mode 100644 index 0000000000..0d43fbe150 --- /dev/null +++ b/manual/src/main/asciidoc/include/quickstart.adoc @@ -0,0 +1,169 @@ +== Quickstart + +=== Command Line + +==== Requirements + +- Java Development Kit 11 or later +- optional _JAVA_HOME_ environment variable pointing to the JDK to be used for jQAssistant + +==== Installation + +* The latest command line distributions are available on Maven Central. Use one of the links below for selecting the bundled Neo4j version depending on your local JDK, select `Browse` and download the `*-distribution.zip` file: +** https://central.sonatype.com/artifact/com.buschmais.jqassistant.cli/jqassistant-commandline-neo4jv5/versions[jQAssistant for JDK 17 or later] (includes Neo4j v5.x, _recommended_) +** https://central.sonatype.com/artifact/com.buschmais.jqassistant.cli/jqassistant-commandline-neo4jv4/versions[jQAssistant for JDK 11] (includes Neo4j v4.x) +* Unpack the distribution, a directory + `jqassistant-commandline-neo4jv____-__` will be created + +NOTE: jQAssistant releases until 2.0.x are available https://central.sonatype.com/artifact/com.buschmais.jqassistant.cli/jqassistant-commandline-distribution/versions[here]. + +==== Scan + +[source] +.Windows +---- +bin\jqassistant.cmd scan -f lib +---- + +[source] +.Linux +---- +bin/jqassistant.sh scan -f lib +---- + +* The JAR files contained in the lib/ folder will be scanned. + +==== Explore + +[source] +.Windows +---- +bin\jqassistant.cmd server +---- + +[source] +.Linux +---- +bin/jqassistant.sh server +---- + +* Open a browser and navigate to http://localhost:7474[http://localhost:7474] +* Enter the following query in the top level area and hit Ctrl-Enter: + +[source] +---- +MATCH + (a:Artifact)-[:CONTAINS]->(t:Type)-[:DECLARES]->(m:Method) +RETURN + a.fileName as Artifact, t.fqn AS Type, count(t) AS DeclaredMethods +ORDER BY + DeclaredMethods DESC +LIMIT 20 +---- + +=== Maven + +==== Requirements + +- Maven 3.5 or later +- Java Development Kit 11 or later + +==== Add the plugin + +Add the following lines to the parent pom.xml file of your project: + +[source,xml,subs=attributes+] +---- + + + + {projectVersion} + + + + + com.buschmais.jqassistant + jqassistant-maven-plugin + ${jqassistant.version} + + + + scan + analyze + + + + + + + +---- + +==== Add a rule + +Within your parent module create a directory `jqassistant` and a file `my-rules.adoc`: + +[source,xml] +.jqassistant/my-rules.adoc +.... += My Project + +// Include a summary of all executed rules and their status +include::jQA:Summary[] + +[[default]] +[role=group,includesConstraints="my-rules:*"] +== Default Rules + +[[my-rules:TestClassName]] +[source,cypher,role=constraint,requiresConcepts="junit4:TestClass"] +---- +MATCH + (t:Junit4:Test:Class) +WHERE NOT + t.name ends with "Test" +RETURN + t AS InvalidTestClass +---- + +== Imported Rules + +// Include specific rules that have been executed and their results. +include::jQA:Rules[concepts="junit*:*"] +.... + +==== Run the build + +Execute the following command from your parent module: + +[source] +---- +mvn install +---- + +The build will fail with the rule's message if it is violated. + +The HTML report generated from the Asciidoc file including all results is available from `target/jqassistant/report/asciidoc/index.html`. + +==== Explore your application + +jQAssistant comes with an integrated Neo4j server, you can run it using + +[source] +---- +mvn jqassistant:server +---- + +* Open a browser and navigate to http://localhost:7474[http://localhost:7474] +* Enter the follwoing query in the top level area and hit Ctrl-Enter: + +[source] +---- +MATCH + (t:Type)-[:DECLARES]->(m:Method) +RETURN + t.fqn AS Type, count(t) AS DeclaredMethods +ORDER BY + DeclaredMethods DESC +LIMIT 20 +---- diff --git a/manual/src/main/asciidoc/index.adoc b/manual/src/main/asciidoc/index.adoc new file mode 100644 index 0000000000..d09385cba8 --- /dev/null +++ b/manual/src/main/asciidoc/index.adoc @@ -0,0 +1,29 @@ +:numbered: +:sectnumlevels: 2 +:toclevels: 2 + += jQAssistant User Manual +jQAssistant @jqassistant + +image::images/jqa.jpg[] + +This document describes the concepts of jQAssistant and usage information. + +[abstract] +include::include/overview.adoc[] + +include::include/license.adoc[] + +include::include/quickstart.adoc[] + +include::include/introduction.adoc[] + +include::{docRoot}/com.buschmais.jqassistant.cli/parent/asciidoc/readme.adoc[] + +include::{docRoot}/com.buschmais.jqassistant/jqassistant-maven-plugin/asciidoc/readme.adoc[] + +include::include/configuration.adoc[] + +include::include/plugins.adoc[] + + diff --git a/manual/src/main/asciidoc/jqassistant.css b/manual/src/main/asciidoc/jqassistant.css new file mode 100644 index 0000000000..3d13152c17 --- /dev/null +++ b/manual/src/main/asciidoc/jqassistant.css @@ -0,0 +1,1784 @@ + +/**** + **** + ****/ + +/* Asciidoctor default stylesheet | MIT License | http://asciidoctor.org */ +article, aside, details, figcaption, figure, footer, header, hgroup, main, nav, section, summary { + display: block; +} + +audio, canvas, video { + display: inline-block; +} + +audio:not([controls]) { + display: none; + height: 0; +} + +[hidden] { + display: none; +} + +html { + background: #fff; + color: #3d3a37; + font-family: 'Open Sans', sans-serif; + -ms-text-size-adjust: 100%; + -webkit-text-size-adjust: 100%; +} + +body { + font-family: 'Open Sans', sans-serif; + color: #3d3a37; + margin: 0; +} + +a:focus { + outline: thin dotted; +} + +a:active, a:hover { + outline: 0; +} + +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +abbr[title] { + border-bottom: 1px dotted; +} + +b, strong { + font-weight: bold; +} + +dfn { + font-style: italic; +} + +hr { + -moz-box-sizing: content-box; + box-sizing: content-box; + height: 0; +} + +mark { + background: #ff0; + color: #3d3a37; +} + +code, kbd, pre, samp { + font-family: monospace, serif; + font-size: 1em; + background-color: #f2f2f2; +} + +pre { + white-space: pre-wrap; +} + +q { + quotes: "\201C" "\201D" "\2018" "\2019"; +} + +small { + font-size: 80%; +} + +sub, sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +img { + border: 0; +} + +svg:not(:root) { + overflow: hidden; +} + +figure { + margin: 0; +} + +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} + +legend { + border: 0; + padding: 0; +} + +button, input, select, textarea { + font-family: inherit; + font-size: 100%; + margin: 0; +} + +button, input { + line-height: normal; +} + +button, select { + text-transform: none; +} + +button, html input[type="button"], input[type="reset"], input[type="submit"] { + -webkit-appearance: button; + cursor: pointer; +} + +button[disabled], html input[disabled] { + cursor: default; +} + +input[type="checkbox"], input[type="radio"] { + box-sizing: border-box; + padding: 0; +} + +input[type="search"] { + -webkit-appearance: textfield; + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; + box-sizing: content-box; +} + +input[type="search"]::-webkit-search-cancel-button, input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +button::-moz-focus-inner, input::-moz-focus-inner { + border: 0; + padding: 0; +} + +textarea { + overflow: auto; + vertical-align: top; +} + +table { + border-collapse: collapse; + border-spacing: 0; +} + +*, *:before, *:after { + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; +} + +html, body { + font-size: 100%; +} + +body { + background: white; + color: #1b1a19; + padding: 0; + margin: 0; + font-family: 'Open Sans', sans-serif; + font-weight: normal; + font-style: normal; + line-height: 1; + position: relative; + cursor: auto; +} + +a:hover { + cursor: pointer; +} + +a:focus { + outline: none; +} + +img, object, embed { + max-width: 100%; + height: auto; +} + +object, embed { + height: 100%; +} + +img { + -ms-interpolation-mode: bicubic; +} + +#map_canvas img, #map_canvas embed, #map_canvas object, .map_canvas img, .map_canvas embed, .map_canvas object { + max-width: none !important; +} + +.left { + float: left !important; +} + +.right { + float: right !important; +} + +.text-left { + text-align: left !important; +} + +.text-right { + text-align: right !important; +} + +.text-center { + text-align: center !important; +} + +.text-justify { + text-align: justify !important; +} + +.hide { + display: none; +} + +.antialiased, body { + -webkit-font-smoothing: antialiased; +} + +img { + display: inline-block; + vertical-align: middle; +} + +textarea { + height: auto; + min-height: 50px; +} + +select { + width: 100%; +} + +p.lead, .paragraph.lead > p, #preamble > .sectionbody > .paragraph:first-of-type p { + font-size: 1.21875em; + line-height: 1.6; +} + +.subheader, #content #toctitle, .admonitionblock td.content > .title, .exampleblock > .title, .imageblock > .title, .videoblock > .title, .listingblock > .title, .literalblock > .title, .openblock > .title, .paragraph > .title, .quoteblock > .title, .sidebarblock > .title, .tableblock > .title, .verseblock > .title, .dlist > .title, .olist > .title, .ulist > .title, .qlist > .title, .hdlist > .title, .tableblock > caption { + line-height: 1.4; + color: #7a2518; + font-weight: 300; + margin-top: 0.2em; + margin-bottom: 0.5em; +} + +div, dl, dt, dd, ul, ol, li, h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6, pre, form, p, blockquote, th, td { + margin: 0; + padding: 0; + direction: ltr; +} + +a { + color: #74bc00; + text-decoration: underline; + line-height: inherit; +} + +a:hover, a:focus { + color: #1b1a19; +} + +a img { + border: none; +} + +p { + font-family: inherit; + font-weight: normal; + font-size: 1em; + line-height: 1.6; + margin-bottom: 1.25em; + text-rendering: optimizeLegibility; +} + +p aside { + font-size: 0.875em; + line-height: 1.35; + font-style: italic; +} + +h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6 { + font-family: 'Open Sans', serif; + font-weight: normal; + font-style: normal; + color: #578d00; + text-rendering: optimizeLegibility; + margin-top: 1em; + margin-bottom: 0.5em; + line-height: 1.2125em; +} + +h1 small, h2 small, h3 small, #toctitle small, .sidebarblock > .content > .title small, h4 small, h5 small, h6 small { + font-size: 60%; + color: #e99b8f; + line-height: 0; +} + +h1 { + color: #1b1a19; + font-size: 2.125em; +} + +h2 { + font-size: 1.6875em; +} + +h3, #toctitle, .sidebarblock > .content > .title { + font-size: 1.375em; +} + +h4 { + font-size: 1.125em; +} + +h5 { + font-size: 1.125em; +} + +h6 { + font-size: 1em; +} + +hr { + border: solid #e3e3e2; + border-width: 1px 0 0; + clear: both; + margin: 1.25em 0 1.1875em; + height: 0; +} + +em, i { + font-style: italic; + line-height: inherit; +} + +strong, b { + font-weight: bold; + line-height: inherit; +} + +small { + font-size: 60%; + line-height: inherit; +} + +code { + font-family: Consolas, "Liberation Mono", Courier, monospace; + font-weight: normal; + color: #6d180b; +} + +ul, ol, dl { + font-size: 1em; + line-height: 1.6; + margin-bottom: 1.25em; + list-style-position: outside; + font-family: inherit; +} + +ul, ol { + margin-left: 1.5em; +} + +ul li ul, ul li ol { + margin-left: 1.25em; + margin-bottom: 0; + font-size: 1em; +} + +ul.square li ul, ul.circle li ul, ul.disc li ul { + list-style: inherit; +} + +ul.square { + list-style-type: square; +} + +ul.circle { + list-style-type: circle; +} + +ul.disc { + list-style-type: disc; +} + +ul.no-bullet { + list-style: none; +} + +ol li ul, ol li ol { + margin-left: 1.25em; + margin-bottom: 0; +} + +dl dt { + margin-bottom: 0.3125em; + font-weight: bold; +} + +dl dd { + margin-bottom: 1.25em; +} + +abbr, acronym { + text-transform: uppercase; + font-size: 90%; + color: #e3e3e2; + border-bottom: 1px dotted #dddddd; + cursor: help; +} + +abbr { + text-transform: none; +} + +blockquote { + margin: 0 0 1.25em; + padding: 0.5625em 1.25em 0 1.1875em; + border-left: 1px solid #e3e3e2; +} + +blockquote cite { + display: block; + font-size: inherit; + color: #3d3a37; +} + +blockquote cite:before { + content: "\2014 \0020"; +} + +blockquote cite a, blockquote cite a:visited { + color: #3d3a37; +} + +blockquote, blockquote p { + line-height: 1.6; + color: #6f6f6f; +} + +.vcard { + display: inline-block; + margin: 0 0 1.25em 0; + border: 1px solid #dddddd; + padding: 0.625em 0.75em; +} + +.vcard li { + margin: 0; + display: block; +} + +.vcard .fn { + font-weight: bold; + font-size: 0.9375em; +} + +.vevent .summary { + font-weight: bold; +} + +.vevent abbr { + cursor: auto; + text-decoration: none; + font-weight: bold; + border: none; + padding: 0 0.0625em; +} + +@media only screen and (min-width: 768px) { + h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6 { + line-height: 1.4; + } + + h1 { + font-size: 2.75em; + } + + h2 { + font-size: 2.3125em; + } + + h3, #toctitle, .sidebarblock > .content > .title { + font-size: 1.6875em; + } + + h4 { + font-size: 1.4375em; + } +} + +.print-only { + display: none !important; +} + +@media print { + * { + background: transparent !important; + color: #000 !important; + box-shadow: none !important; + text-shadow: none !important; + } + + a, a:visited { + text-decoration: underline; + } + + a[href]:after { + content: " (" attr(href) ")"; + } + + abbr[title]:after { + content: " (" attr(title) ")"; + } + + .ir a:after, a[href^="javascript:"]:after, a[href^="#"]:after { + content: ""; + } + + pre, blockquote { + border: 1px solid #999; + page-break-inside: avoid; + } + + thead { + display: table-header-group; + } + + tr, img { + page-break-inside: avoid; + } + + img { + max-width: 100% !important; + } + + @page { + margin: 0.5cm; + } + + p, h2, h3, #toctitle, .sidebarblock > .content > .title { + orphans: 3; + widows: 3; + } + + h2, h3, #toctitle, .sidebarblock > .content > .title { + page-break-after: avoid; + } + + .hide-on-print { + display: none !important; + } + + .print-only { + display: block !important; + } + + .hide-for-print { + display: none !important; + } + + .show-for-print { + display: inherit !important; + } +} + +table { + background: white; + margin-bottom: 1.25em; + border: solid 1px #e3e3e2; +} + +table thead, table tfoot { + background: whitesmoke; + font-weight: bold; +} + +table thead tr th, table thead tr td, table tfoot tr th, table tfoot tr td { + padding: 0.5em 0.625em 0.625em; + font-size: inherit; + color: #1b1a19; + text-align: left; +} + +table tr th, table tr td { + padding: 0.5625em 0.625em; + font-size: inherit; + color: #1b1a19; +} + +table tr.even, table tr.alt, table tr:nth-of-type(even) { + background: #f9f9f9; +} + +table thead tr th, table tfoot tr th, table tbody tr td, table tr td, table tfoot tr td { + display: table-cell; + line-height: 1.6; +} + +.clearfix:before, .clearfix:after, .float-group:before, .float-group:after { + content: " "; + display: table; +} + +.clearfix:after, .float-group:after { + clear: both; +} + +*:not(pre) > code { + font-size: 0.9375em; + padding: 1px 3px 0; + white-space: nowrap; + background-color: #f2f2f2; + border: 1px solid #cccccc; + -webkit-border-radius: 4px; + border-radius: 4px; + text-shadow: none; +} + +pre, pre > code { + line-height: 1.4; + color: inherit; + font-family: Consolas, "Liberation Mono", Courier, monospace; + font-weight: normal; +} + +kbd.keyseq { + color: #3d3a37; +} + +kbd:not(.keyseq) { + display: inline-block; + color: #222222; + font-size: 0.75em; + line-height: 1.4; + background-color: #F7F7F7; + border: 1px solid #ccc; + -webkit-border-radius: 3px; + border-radius: 3px; + -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2), 0 0 0 2px white inset; + box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2), 0 0 0 2px white inset; + margin: -0.15em 0.15em 0 0.15em; + padding: 0.2em 0.6em 0.2em 0.5em; + vertical-align: middle; + white-space: nowrap; +} + +kbd kbd:first-child { + margin-left: 0; +} + +kbd kbd:last-child { + margin-right: 0; +} + +.menuseq, .menu { + color: #1b1a19; +} + +p a > code:hover { + color: #74bc00; +} + +#header, #content, #footnotes, #footer { + width: 100%; + margin-left: auto; + margin-right: auto; + margin-top: 0; + margin-bottom: 0; + max-width: 62.5em; + *zoom: 1; + position: relative; + padding-left: 0.9375em; + padding-right: 0.9375em; +} + +#header:before, #header:after, #content:before, #content:after, #footnotes:before, #footnotes:after, #footer:before, #footer:after { + content: " "; + display: table; +} + +#header:after, #content:after, #footnotes:after, #footer:after { + clear: both; +} + +#header { + margin-bottom: 2.5em; +} + +#header > h1 { + color: #1b1a19; + font-weight: normal; + border-bottom: 2px solid #1b1a19; + margin-bottom: -28px; + padding-bottom: 32px; +} + +#header span { + color: #747270; +} + +#header #revnumber { + text-transform: capitalize; +} + +#header br { + display: none; +} + +#header br + span { + padding-left: 3px; +} + +#header br + span:before { + content: "\2013 \0020"; +} + +#header br + span.author { + padding-left: 0; +} + +#header br + span.author:before { + content: ", "; +} + +#toc { + border-bottom: 2px solid #74bc00; + padding-bottom: 1.25em; + background-color: #e3e3e2; +} + +#toc > ul { + margin-left: 0.25em; +} + +#toc ul.sectlevel0 > li > a { + font-style: italic; +} + +#toc ul.sectlevel0 ul.sectlevel1 { + margin-left: 0; + margin-top: 0.5em; + margin-bottom: 0.5em; +} + +#toc ul { + list-style-type: none; +} + +#toctitle { + color: #578d00; +} + +@media only screen and (min-width: 1280px) { + + body.toc { + padding-left: 15em; + padding-right: 0; + } + + #toc.toc { + margin-top: 0!important; + position: fixed; + width: 15em; + left: 0; + top: 0; + border-right: 1px solid #efefed; + border-top-width: 0!important; + border-bottom-width: 0!important; + z-index: 1000; + padding: 1.25em 1em; + height: 100%; + overflow: auto; + } + + #toc.toc #toctitle { + margin-top: 0; + } + + #toc.toc > ul { + font-size: .95em; + margin-bottom: 0; + } + + #toc.toc ul ul { + margin-left: 0; + padding-left: 1.25em; + } + + #toc.toc ul.sectlevel0 ul.sectlevel1 { + padding-left: 0; + margin-top: 0.5em; + margin-bottom: 0.5em; + } + + body.toc.toc-right { + padding-left: 0; + padding-right: 20em; + } + + body.toc.toc-right #toc.toc { + border-right: 0; + border-left: 1px solid #ebebeb; + left: auto; + right: 0; + } + + #content, #footnotes, #footer { + width: 100%; + max-width: 62.5em; + margin-left: 16.25em; + margin-right: auto; + margin-top: 0; + margin-bottom: 0em; + *zoom: 1; + position: relative; + padding-left: 0.9375em; + padding-right: 0.9375em; + } + + #header { + width: 100%; + max-width: 62.5em; + margin-left: 16.25em; + margin-right: auto; + margin-top: 0; + margin-bottom: 4em; + *zoom: 1; + position: relative; + padding-left: 0.9375em; + padding-right: 0.9375em; + } +} + +#content #toc { + border-style: solid; + border-width: 1px; + border-color: #e3e3e2; + margin-bottom: 1.25em; + padding: 1.25em; + background: #f3f3f2; + border-width: 0; + -webkit-border-radius: 4px; + border-radius: 4px; +} + +#content #toc > :first-child { + margin-top: 0; +} + +#content #toc > :last-child { + margin-bottom: 0; +} + +#content #toc a { + text-decoration: none; +} + +#content #toctitle { + font-weight: bold; + font-family: 'Open Sans', sans-serif; + font-size: 1em; + padding-left: 0.125em; +} + +#footer { + width: 100%; + max-width: 62.5em; + padding: 1.25em; +} + +#footer-text { + color: #c8c8c8; + line-height: 1.44; +} + +.sect1 { + padding-bottom: 1.25em; +} + +.sect1 + .sect1 { + border-top: 2px solid #74bc00; +} + +#content h1 > a.anchor, h2 > a.anchor, h3 > a.anchor, #toctitle > a.anchor, .sidebarblock > .content > .title > a.anchor, h4 > a.anchor, h5 > a.anchor, h6 > a.anchor { + position: absolute; + width: 1em; + margin-left: -1em; + display: block; + text-decoration: none; + visibility: hidden; + text-align: center; + font-weight: normal; +} + +#content h1 > a.anchor:before, h2 > a.anchor:before, h3 > a.anchor:before, #toctitle > a.anchor:before, .sidebarblock > .content > .title > a.anchor:before, h4 > a.anchor:before, h5 > a.anchor:before, h6 > a.anchor:before { + content: '\00A7'; + font-size: .85em; + vertical-align: text-top; + display: block; + margin-top: 0.05em; +} + +#content h1:hover > a.anchor, #content h1 > a.anchor:hover, h2:hover > a.anchor, h2 > a.anchor:hover, h3:hover > a.anchor, #toctitle:hover > a.anchor, .sidebarblock > .content > .title:hover > a.anchor, h3 > a.anchor:hover, #toctitle > a.anchor:hover, .sidebarblock > .content > .title > a.anchor:hover, h4:hover > a.anchor, h4 > a.anchor:hover, h5:hover > a.anchor, h5 > a.anchor:hover, h6:hover > a.anchor, h6 > a.anchor:hover { + visibility: visible; +} + +#content h1 > a.link, h2 > a.link, h3 > a.link, #toctitle > a.link, .sidebarblock > .content > .title > a.link, h4 > a.link, h5 > a.link, h6 > a.link { + color: #578d00; + text-decoration: none; +} + +#content h1 > a.link:hover, h2 > a.link:hover, h3 > a.link:hover, #toctitle > a.link:hover, .sidebarblock > .content > .title > a.link:hover, h4 > a.link:hover, h5 > a.link:hover, h6 > a.link:hover { + color: #74bc00; +} + +.imageblock, .literalblock, .listingblock, .verseblock, .videoblock { + margin-bottom: 1.25em; +} + +.admonitionblock td.content > .title, .exampleblock > .title, .imageblock > .title, .videoblock > .title, .listingblock > .title, .literalblock > .title, .openblock > .title, .paragraph > .title, .quoteblock > .title, .sidebarblock > .title, .tableblock > .title, .verseblock > .title, .dlist > .title, .olist > .title, .ulist > .title, .qlist > .title, .hdlist > .title { + text-align: left; + font-weight: bold; +} + +.tableblock > caption { + text-align: left; + font-weight: bold; + white-space: nowrap; + overflow: visible; + max-width: 0; +} + +table.tableblock #preamble > .sectionbody > .paragraph:first-of-type p { + font-size: inherit; +} + +.admonitionblock > table { + border: 0; + background: none; + width: 100%; +} + +.admonitionblock > table td.icon { + text-align: center; + width: 80px; +} + +.admonitionblock > table td.icon img { + max-width: none; +} + +.admonitionblock > table td.icon .title { + font-weight: bold; + text-transform: uppercase; +} + +.admonitionblock > table td.content { + padding-left: 1.125em; + padding-right: 1.25em; + border-left: 1px solid #e3e3e2; + color: #6f6f6f; +} + +.admonitionblock > table td.content > :last-child > :last-child { + margin-bottom: 0; +} + +.exampleblock > .content { + border-style: solid; + border-width: 1px; + border-color: #e6e6e6; + margin-bottom: 1.25em; + padding: 1.25em; + background: white; + -webkit-border-radius: 4px; + border-radius: 4px; +} + +.exampleblock > .content > :first-child { + margin-top: 0; +} + +.exampleblock > .content > :last-child { + margin-bottom: 0; +} + +.exampleblock > .content h1, .exampleblock > .content h2, .exampleblock > .content h3, .exampleblock > .content #toctitle, .sidebarblock.exampleblock > .content > .title, .exampleblock > .content h4, .exampleblock > .content h5, .exampleblock > .content h6, .exampleblock > .content p { + color: #1b1a19; +} + +.exampleblock > .content h1, .exampleblock > .content h2, .exampleblock > .content h3, .exampleblock > .content #toctitle, .sidebarblock.exampleblock > .content > .title, .exampleblock > .content h4, .exampleblock > .content h5, .exampleblock > .content h6 { + line-height: 1; + margin-bottom: 0.625em; +} + +.exampleblock > .content h1.subheader, .exampleblock > .content h2.subheader, .exampleblock > .content h3.subheader, .exampleblock > .content .subheader#toctitle, .sidebarblock.exampleblock > .content > .subheader.title, .exampleblock > .content h4.subheader, .exampleblock > .content h5.subheader, .exampleblock > .content h6.subheader { + line-height: 1.4; +} + +.exampleblock.result > .content { + -webkit-box-shadow: 0 1px 8px #d9d9d9; + box-shadow: 0 1px 8px #d9d9d9; +} + +.sidebarblock { + border-style: solid; + border-width: 1px; + border-color: #d9d9d9; + margin-bottom: 1.25em; + padding: 1.25em; + background: #f2f2f2; + -webkit-border-radius: 4px; + border-radius: 4px; +} + +.sidebarblock > :first-child { + margin-top: 0; +} + +.sidebarblock > :last-child { + margin-bottom: 0; +} + +.sidebarblock h1, .sidebarblock h2, .sidebarblock h3, .sidebarblock #toctitle, .sidebarblock > .content > .title, .sidebarblock h4, .sidebarblock h5, .sidebarblock h6, .sidebarblock p { + color: #1b1a19; +} + +.sidebarblock h1, .sidebarblock h2, .sidebarblock h3, .sidebarblock #toctitle, .sidebarblock > .content > .title, .sidebarblock h4, .sidebarblock h5, .sidebarblock h6 { + line-height: 1; + margin-bottom: 0.625em; +} + +.sidebarblock h1.subheader, .sidebarblock h2.subheader, .sidebarblock h3.subheader, .sidebarblock .subheader#toctitle, .sidebarblock > .content > .subheader.title, .sidebarblock h4.subheader, .sidebarblock h5.subheader, .sidebarblock h6.subheader { + line-height: 1.4; +} + +.sidebarblock > .content > .title { + color: #578d00; + margin-top: 0; + line-height: 1.6; +} + +.exampleblock > .content > :last-child > :last-child, .exampleblock > .content .olist > ol > li:last-child > :last-child, .exampleblock > .content .ulist > ul > li:last-child > :last-child, .exampleblock > .content .qlist > ol > li:last-child > :last-child, .sidebarblock > .content > :last-child > :last-child, .sidebarblock > .content .olist > ol > li:last-child > :last-child, .sidebarblock > .content .ulist > ul > li:last-child > :last-child, .sidebarblock > .content .qlist > ol > li:last-child > :last-child { + margin-bottom: 0; +} + +.literalblock > .content pre, .listingblock > .content pre { + background: none; + border-width: 2px 0; + border-style: dotted; + border-color: #74bc00; + -webkit-border-radius: 4px; + border-radius: 4px; + padding: 0.75em 0.75em 0.5em 0.75em; + word-wrap: break-word; +} + +.literalblock > .content pre.nowrap, .listingblock > .content pre.nowrap { + overflow-x: auto; + white-space: pre; + word-wrap: normal; +} + +.literalblock > .content pre > code, .listingblock > .content pre > code { + display: block; +} + +@media only screen { + .literalblock > .content pre, .listingblock > .content pre { + font-size: 0.8em; + } +} + +@media only screen and (min-width: 768px) { + .literalblock > .content pre, .listingblock > .content pre { + font-size: 0.9em; + } +} + +@media only screen and (min-width: 1280px) { + .literalblock > .content pre, .listingblock > .content pre { + font-size: 1em; + } +} + +.listingblock > .content { + position: relative; +} + +.listingblock:hover code[class*=" language-"]:before { + text-transform: uppercase; + font-size: 0.9em; + color: #999; + position: absolute; + top: 0.375em; + right: 0.375em; +} + +.listingblock:hover code.asciidoc:before { + content: "asciidoc"; +} + +.listingblock:hover code.clojure:before { + content: "clojure"; +} + +.listingblock:hover code.css:before { + content: "css"; +} + +.listingblock:hover code.groovy:before { + content: "groovy"; +} + +.listingblock:hover code.html:before { + content: "html"; +} + +.listingblock:hover code.java:before { + content: "java"; +} + +.listingblock:hover code.javascript:before { + content: "javascript"; +} + +.listingblock:hover code.python:before { + content: "python"; +} + +.listingblock:hover code.ruby:before { + content: "ruby"; +} + +.listingblock:hover code.scss:before { + content: "scss"; +} + +.listingblock:hover code.xml:before { + content: "xml"; +} + +.listingblock:hover code.yaml:before { + content: "yaml"; +} + +.listingblock.terminal pre .command:before { + content: attr(data-prompt); + padding-right: 0.5em; + color: #999; +} + +.listingblock.terminal pre .command:not([data-prompt]):before { + content: '$'; +} + +table.pyhltable { + border: 0; + margin-bottom: 0; +} + +table.pyhltable td { + vertical-align: top; + padding-top: 0; + padding-bottom: 0; +} + +table.pyhltable td.code { + padding-left: .75em; + padding-right: 0; +} + +.highlight.pygments .lineno, table.pyhltable td:not(.code) { + color: #999; + padding-left: 0; + padding-right: .5em; + border-right: 1px solid #dddddd; +} + +.highlight.pygments .lineno { + display: inline-block; + margin-right: .25em; +} + +table.pyhltable .linenodiv { + background-color: transparent !important; + padding-right: 0 !important; +} + +.quoteblock { + margin: 0 0 1.25em; + padding: 0.5625em 1.25em 0 1.1875em; + border-left: 1px solid #dddddd; +} + +.quoteblock blockquote { + margin: 0 0 1.25em 0; + padding: 0 0 0.5625em 0; + border: 0; +} + +.quoteblock blockquote > .paragraph:last-child p { + margin-bottom: 0; +} + +.quoteblock .attribution { + margin-top: -.25em; + padding-bottom: 0.5625em; + font-size: inherit; + color: #3d3a37; +} + +.quoteblock .attribution br { + display: none; +} + +.quoteblock .attribution cite { + display: block; + margin-bottom: 0.625em; +} + +table thead th, table tfoot th { + font-weight: bold; +} + +table.tableblock.grid-all { + border-collapse: separate; + border-spacing: 1px; + -webkit-border-radius: 4px; + border-radius: 4px; + border-top: 1px solid #e3e3e2; + border-bottom: 1px solid #e3e3e2; +} + +table.tableblock.frame-topbot, table.tableblock.frame-none { + border-left: 0; + border-right: 0; +} + +table.tableblock.frame-sides, table.tableblock.frame-none { + border-top: 0; + border-bottom: 0; +} + +table.tableblock td .paragraph:last-child p, table.tableblock td > p:last-child { + margin-bottom: 0; +} + +th.tableblock.halign-left, td.tableblock.halign-left { + text-align: left; +} + +th.tableblock.halign-right, td.tableblock.halign-right { + text-align: right; +} + +th.tableblock.halign-center, td.tableblock.halign-center { + text-align: center; +} + +th.tableblock.valign-top, td.tableblock.valign-top { + vertical-align: top; +} + +th.tableblock.valign-bottom, td.tableblock.valign-bottom { + vertical-align: bottom; +} + +th.tableblock.valign-middle, td.tableblock.valign-middle { + vertical-align: middle; +} + +p.tableblock.header { + color: #1b1a19; + font-weight: bold; +} + +td > div.verse { + white-space: pre; +} + +ol { + margin-left: 1.75em; +} + +ul li ol { + margin-left: 1.5em; +} + +dl dd { + margin-left: 1.125em; +} + +dl dd:last-child, dl dd:last-child > :last-child { + margin-bottom: 0; +} + +ol > li p, ul > li p, ul dd, ol dd, .olist .olist, .ulist .ulist, .ulist .olist, .olist .ulist { + margin-bottom: 0.625em; +} + +ul.unstyled, ol.unnumbered, ul.checklist, ul.none { + list-style-type: none; +} + +ul.unstyled, ol.unnumbered, ul.checklist { + margin-left: 0.625em; +} + +ul.checklist li > p:first-child > i[class^="icon-check"]:first-child, ul.checklist li > p:first-child > input[type="checkbox"]:first-child { + margin-right: 0.25em; +} + +ul.checklist li > p:first-child > input[type="checkbox"]:first-child { + position: relative; + top: 1px; +} + +ul.inline { + margin: 0 auto 0.625em auto; + margin-left: -1.375em; + margin-right: 0; + padding: 0; + list-style: none; + overflow: hidden; +} + +ul.inline > li { + list-style: none; + float: left; + margin-left: 1.375em; + display: block; +} + +ul.inline > li > * { + display: block; +} + +.unstyled dl dt { + font-weight: normal; + font-style: normal; +} + +ol.arabic { + list-style-type: decimal; +} + +ol.decimal { + list-style-type: decimal-leading-zero; +} + +ol.loweralpha { + list-style-type: lower-alpha; +} + +ol.upperalpha { + list-style-type: upper-alpha; +} + +ol.lowerroman { + list-style-type: lower-roman; +} + +ol.upperroman { + list-style-type: upper-roman; +} + +ol.lowergreek { + list-style-type: lower-greek; +} + +.hdlist > table, .colist > table { + border: 0; + background: none; +} + +.hdlist > table > tbody > tr, .colist > table > tbody > tr { + background: none; +} + +td.hdlist1 { + padding-right: .8em; + font-weight: bold; +} + +td.hdlist1, td.hdlist2 { + vertical-align: top; +} + +.literalblock + .colist, .listingblock + .colist { + margin-top: -0.5em; +} + +.colist > table tr > td:first-of-type { + padding: 0 .8em; + line-height: 1; +} + +.colist > table tr > td:last-of-type { + padding: 0.25em 0; +} + +.qanda > ol > li > p > em:only-child { + color: #00467f; +} + +.thumb, .th { + line-height: 0; + display: inline-block; + border: solid 4px white; + -webkit-box-shadow: 0 0 0 1px #dddddd; + box-shadow: 0 0 0 1px #dddddd; +} + +.imageblock.left, .imageblock[style*="float: left"] { + margin: 0.25em 0.625em 1.25em 0; +} + +.imageblock.right, .imageblock[style*="float: right"] { + margin: 0.25em 0 1.25em 0.625em; +} + +.imageblock > .title { + margin-bottom: 0; +} + +.imageblock.thumb, .imageblock.th { + border-width: 6px; +} + +.imageblock.thumb > .title, .imageblock.th > .title { + padding: 0 0.125em; +} + +.image.left, .image.right { + margin-top: 0.25em; + margin-bottom: 0.25em; + display: inline-block; + line-height: 0; +} + +.image.left { + margin-right: 0.625em; +} + +.image.right { + margin-left: 0.625em; +} + +a.image { + text-decoration: none; +} + +span.footnote, span.footnoteref { + vertical-align: super; + font-size: 0.875em; +} + +span.footnote a, span.footnoteref a { + text-decoration: none; +} + +#footnotes { + padding-top: 0.75em; + padding-bottom: 0.75em; + margin-bottom: 0.625em; +} + +#footnotes hr { + width: 20%; + min-width: 6.25em; + margin: -.25em 0 .75em 0; + border-width: 1px 0 0 0; +} + +#footnotes .footnote { + padding: 0 0.375em; + line-height: 1.3; + font-size: 0.875em; + margin-left: 1.2em; + text-indent: -1.2em; + margin-bottom: .2em; +} + +#footnotes .footnote a:first-of-type { + font-weight: bold; + text-decoration: none; +} + +#footnotes .footnote:last-of-type { + margin-bottom: 0; +} + +#content #footnotes { + margin-top: -0.625em; + margin-bottom: 0; + padding: 0.75em 0; +} + +.gist .file-data > table { + border: none; + background: #fff; + width: 100%; + margin-bottom: 0; +} + +.gist .file-data > table td.line-data { + width: 99%; +} + +div.unbreakable { + page-break-inside: avoid; +} + +.big { + font-size: larger; +} + +.small { + font-size: smaller; +} + +.underline { + text-decoration: underline; +} + +.overline { + text-decoration: overline; +} + +.line-through { + text-decoration: line-through; +} + +.aqua { + color: #00bfbf; +} + +.aqua-background { + background-color: #00fafa; +} + +.black { + color: black; +} + +.black-background { + background-color: black; +} + +.blue { + color: #0000bf; +} + +.blue-background { + background-color: #0000fa; +} + +.fuchsia { + color: #bf00bf; +} + +.fuchsia-background { + background-color: #fa00fa; +} + +.gray { + color: #606060; +} + +.gray-background { + background-color: #7d7d7d; +} + +.green { + color: #006000; +} + +.green-background { + background-color: #007d00; +} + +.lime { + color: #00bf00; +} + +.lime-background { + background-color: #00fa00; +} + +.maroon { + color: #600000; +} + +.maroon-background { + background-color: #7d0000; +} + +.navy { + color: #000060; +} + +.navy-background { + background-color: #00007d; +} + +.olive { + color: #606000; +} + +.olive-background { + background-color: #7d7d00; +} + +.purple { + color: #600060; +} + +.purple-background { + background-color: #7d007d; +} + +.red { + color: #bf0000; +} + +.red-background { + background-color: #fa0000; +} + +.silver { + color: #909090; +} + +.silver-background { + background-color: #bcbcbc; +} + +.teal { + color: #006060; +} + +.teal-background { + background-color: #007d7d; +} + +.white { + color: #bfbfbf; +} + +.white-background { + background-color: #fafafa; +} + +.yellow { + color: #bfbf00; +} + +.yellow-background { + background-color: #fafa00; +} + +span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { + cursor: default; +} + +.admonitionblock td.icon [class^="icon-"]:before { + font-size: 2.5em; + text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.5); + cursor: default; +} + +.admonitionblock td.icon .icon-note:before { + content: "\f05a"; + color: #005498; + color: #003f72; +} + +.admonitionblock td.icon .icon-tip:before { + content: "\f0eb"; + text-shadow: 1px 1px 2px rgba(155, 155, 0, 0.8); + color: #111; +} + +.admonitionblock td.icon .icon-warning:before { + content: "\f071"; + color: #bf6900; +} + +.admonitionblock td.icon .icon-caution:before { + content: "\f06d"; + color: #bf3400; +} + +.admonitionblock td.icon .icon-important:before { + content: "\f06a"; + color: #bf0000; +} + +.conum { + display: inline-block; + color: white !important; + background-color: #222222; + -webkit-border-radius: 100px; + border-radius: 100px; + text-align: center; + width: 20px; + height: 20px; + font-size: 12px; + font-weight: bold; + line-height: 20px; + font-family: Arial, sans-serif; + font-style: normal; + position: relative; + top: -2px; + letter-spacing: -1px; +} + +.conum * { + color: white !important; +} + +.conum + b { + display: none; +} + +.conum:after { + content: attr(data-value); +} + +.conum:not([data-value]):empty { + display: none; +} + +.literalblock > .content > pre, .listingblock > .content > pre { + -webkit-border-radius: 0; + border-radius: 0; +} diff --git a/manual/src/main/assembly/manual.xml b/manual/src/main/assembly/manual.xml new file mode 100644 index 0000000000..44378a4629 --- /dev/null +++ b/manual/src/main/assembly/manual.xml @@ -0,0 +1,18 @@ + + manual + + zip + + + + ${project.build.directory}/generated-docs + . + + **/* + images/** + + + + diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000000..47222cc518 --- /dev/null +++ b/pom.xml @@ -0,0 +1,884 @@ + + 4.0.0 + + com.buschmais.jqassistant + parent + 2.4.0-SNAPSHOT + pom + + jQAssistant Parent + https://jqassistant.org/ + + + Maven Parent POM for all projects of the jQAssistant ecosystem. + It provides common and useful settings shared by all + jQAssistant projects. + + + + jQAssistant Development Team + https://jqassistant.org + + + + + GNU General Public License, v3 + https://www.gnu.org/licenses/gpl-3.0.html + + + + + scm:git:https://github.com/jqassistant/jqassistant.git + scm:git:https://github.com/jqassistant/jqassistant.git + https://github.com/jqassistant/jqassistant/ + parent-2.4.0-M1 + + + + 3.6 + + + + + sonatype-nexus-snapshots + Sonatype Nexus Snapshots + https://oss.sonatype.org/content/repositories/snapshots/ + + + sonatype-nexus-staging + Nexus Release Repository + https://oss.sonatype.org/service/local/staging/deploy/maven2/ + + + + + + dirk-mahler + Dirk Mahler + dirk.mahler@buschmais.com + + + stephan.pirnbaum + Stephan Pirnbaum + stephan.pirnbaum@buschmais.com + + + oliver.b.fischer + Oliver B. Fischer + o.b.fischer@swe-blog.net + + + + + + 3.22.0 + 9.7 + 3.1.6 + 1.9.4 + 1.15 + 3.2.2 + 1.8 + 2.16.1 + 2.6 + 3.14.0 + 1.12.0 + 32.0.1-jre + 7.0.0 + 2.0.0.0 + 4.4.16 + 2.17.2 + 2.4.0-b180830.0359 + 2.4.0-b180830.0438 + 2.1.1 + 1.3.2 + 1.0.36 + 5.10.3 + 2.2.0 + 1.18.32 + 1.5.5.Final + 2.23.4 + 4.4.35 + 4.4.0.29 + 5.21.2 + ${neo4j_5x.version} + + ${neo4j_4x.version} + 4.4.17 + 5.21.0 + 1.7.36 + 3.8.2 + 1.9.21 + 2.0 + 2.3 + 2.0.1.Final + 2.2.7 + + 1.12.0 + 1.18.20.0 + 3.3.0 + 3.6.0 + 3.1.0 + 9.0.8 + 2.8.0 + 3.1.0 + 3.13.0 + 3.3.0 + 3.1.2 + 3.0.1 + 3.0.0 + 3.3.1 + 0.8.12 + 3.1.1 + 3.2.2 + 3.8.0 + 0.15.1 + 3.3.0 + 3.1.1 + 3.12.1 + 3.3.1 + ${maven.failsafe.version} + 1.0.2 + 3.7.0 + 2.2.4 + 1.6 + 1.6.13 + 4.0.0.4121 + + 3.5.0 + UTF-8 + UTF-8 + + memory:/// + + 2.3.1 + + 2.4.0-M1 + + + + + + + org.asciidoctor + asciidoctor-maven-plugin + ${org.asciidoctor-plugin.version} + + + com.buschmais.jqassistant + jqassistant-maven-plugin + 2.4.0-M1 + + + default + + scan + analyze + + + + + + jqassistant: + scan: + include: + files: + - ${project.basedir}/readme.adoc + - ${project.basedir}/src/main/asciidoc + - ${project.basedir}/.editorconfig + - ${project.basedir}/LICENSE + analyze: + groups: + - jqa-* + + + + + com.buschmais.jqassistant.build + jqassistant + ${jqassistant.build.version} + + + + + org.apache.maven.plugins + maven-checkstyle-plugin + ${maven.checkstyle.version} + + + + check + + + + + checkstyle/jqa-code-style.xml + checkstyle/jqa-code-suppressions.xml + + ${project.build.sourceDirectory} + + true + + ${project.build.testSourceDirectory} + + true + + + + com.buschmais.jqassistant.build + checkstyle + ${jqassistant.build.version} + + + + + org.apache.maven.plugins + maven-clean-plugin + ${maven.clean.version} + + + + org.apache.maven.plugins + maven-failsafe-plugin + ${maven.failsafe.version} + + + + ${it.jqassistant.store.uri} + + + + @{argLine} + --add-opens java.base/java.lang=ALL-UNNAMED + --add-opens java.base/java.nio=ALL-UNNAMED + --add-opens java.base/java.util=ALL-UNNAMED + + + + + org.apache.maven.plugins + maven-surefire-plugin + ${maven.surefire.version} + + + + ${it.jqassistant.store.uri} + + + + @{argLine} + --add-opens java.base/java.lang=ALL-UNNAMED + --add-opens java.base/java.nio=ALL-UNNAMED + --add-opens java.base/java.util=ALL-UNNAMED + + + + + org.jacoco + jacoco-maven-plugin + ${maven.jacoco.version} + + + org.apache.maven.plugins + maven-invoker-plugin + ${maven.invoker.version} + + ${project.build.directory}/it + ${project.build.directory}/it-repo + false + + 11 + + + verify -e + + true + verify + true + + + + integration-test + + install + run + + + + + + org.apache.groovy + groovy + 4.0.22 + + + org.apache.groovy + groovy-xml + 4.0.22 + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.version} + + + attach-asciidoc + package + + single + + + + asciidoc + + + + + + + com.buschmais.jqassistant.build + asciidoc + ${jqassistant.build.version} + + + + + + org.projectlombok + lombok-maven-plugin + ${lombok-maven-plugin.version} + + + generate-sources + + delombok + + + true + false + ${project.basedir}/src/main/java + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven.compiler.version} + + UTF-8 + 11 + + + org.projectlombok + lombok + ${lombok.version} + + + org.projectlombok + lombok-mapstruct-binding + 0.2.0 + + + org.mapstruct + mapstruct-processor + ${mapstruct.version} + + + + -Amapstruct.unmappedTargetPolicy=ERROR + -Amapstruct.unmappedSourcePolicy=ERROR + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + ${maven.javadoc.version} + + UTF-8 + false + none + + ${project.basedir}/src/main/java;${project.build.directory}/generated-sources/delombok;${project.build.directory}/generated-sources/xjc + + + + + attach-javadocs + + jar + + + + + + + org.apache.maven.plugins + maven-install-plugin + ${maven.install.version} + + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.version} + + + + org.jvnet.jaxb2.maven2 + maven-jaxb2-plugin + ${maven.jaxb2-plugin.version} + + + + generate + + + src/main/resources/META-INF/xsd + + false + + -mark-generated + -Xdefault-value + + + + org.jvnet.jaxb2_commons + jaxb2-default-value + 1.1 + + + + + + + + + org.apache.maven.plugins + maven-shade-plugin + ${maven.shade.version} + + + + org.apache.maven.plugins + maven-dependency-plugin + ${maven.dependency.version} + + + + org.apache.maven.plugins + maven-deploy-plugin + ${maven.deploy.version} + + + + org.apache.maven.plugins + maven-release-plugin + ${maven.release.version} + + forked-path + true + @{version} + deploy + release + + + + org.sonarsource.scanner.maven + sonar-maven-plugin + ${maven.sonar.version} + + + org.apache.maven.plugins + maven-enforcer-plugin + ${maven.enforcer.version} + + + enforce-plugin-versions + + enforce + + + + + [${maven.min.version},) + + + + org.apache.maven.plugins:maven-surefire-plugin + org.apache.maven.plugins:maven-failsafe-plugin + org.apache.maven.plugins:maven-surefire-report-plugin + + + + Best Practice is to always define plugin versions! + true + true + true + clean,deploy,site + + + + + + enforce-java-version + + enforce + + + + + [11,) + + + + + + + + + org.apache.maven.plugins + maven-resources-plugin + ${maven.resources.version} + + UTF-8 + + + + + org.apache.maven.plugins + maven-site-plugin + ${maven.site.version} + + + org.apache.maven.doxia + doxia-module-markdown + ${doxia-markdown.version} + + + org.asciidoctor + asciidoctor-maven-plugin + ${org.asciidoctor-plugin.version} + + + + true + + + + + + org.apache.maven.plugins + maven-source-plugin + ${maven.source.plugin} + + + attach-sources + + jar-no-fork + + + + + + + org.codehaus.mojo + build-helper-maven-plugin + ${maven.buildhelper.version} + + + + org.codehaus.mojo + xml-maven-plugin + ${maven.xml.version} + + + + org.cyclonedx + cyclonedx-maven-plugin + ${maven.cyclonedx.version} + + + package + + makeAggregateBom + + + true + false + true + true + false + + + + + + org.owasp + dependency-check-maven + ${maven.owasp-dependency-check.version} + + true + true + + false + + CSV + XML + HTML + + + + + org.apache.maven.plugins + maven-gpg-plugin + ${maven-gpg-plugin.version} + + + org.sonatype.plugins + nexus-staging-maven-plugin + ${nexus-staging-maven-plugin.version} + + + + + + + org.projectlombok + lombok-maven-plugin + + + org.apache.maven.plugins + maven-enforcer-plugin + + + org.jacoco + jacoco-maven-plugin + + + + prepare-agent + report + + + + + + org.apache.maven.plugins + maven-source-plugin + + + org.apache.maven.plugins + maven-javadoc-plugin + + + com.buschmais.jqassistant + jqassistant-maven-plugin + + + org.apache.maven.plugins + maven-checkstyle-plugin + + + + + + + neo4jv4 + + 11 + + + ${neo4j_4x.version} + + + + neo4jv5 + + [17,) + + + ${neo4j_5x.version} + + + + IT + + + + org.apache.maven.plugins + maven-failsafe-plugin + + + + integration-test + verify + + + + + + + + + it-store-remote + + neo4j://localhost:7687 + + + + it-store-file + + file:${project.build.directory}/jqassistant/test-store + + + + owasp + + + + org.owasp + dependency-check-maven + ${maven.owasp-dependency-check.version} + + + + check + + + + + + + + + sonar + + + performRelease + true + + + + https://sonarcloud.io + jqassistant + jqassistant_jqassistant + ${env.SONARCLOUD_LOGIN} + + + + + org.sonarsource.scanner.maven + sonar-maven-plugin + + + verify + + sonar + + + + + + + + + release + + + + performRelease + true + + + + + + org.apache.maven.plugins + maven-enforcer-plugin + + + enforce-release-versions + + enforce + + + + + + + + + + + + org.apache.maven.plugins + maven-gpg-plugin + + + + --pinentry-mode + loopback + + + + + sign-artifacts + verify + + sign + + + + + + org.sonatype.plugins + nexus-staging-maven-plugin + true + + sonatype-nexus-staging + https://oss.sonatype.org/ + true + + + + + + + IntelliJ + + false + + idea.maven.embedder.version + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + + + + + bom + core + plugin + distribution-specification + cli + maven + manual + +