diff --git a/Makefile b/Makefile index fc6d0094..c9d836ff 100644 --- a/Makefile +++ b/Makefile @@ -281,7 +281,7 @@ lint-subset-files-enable-expensive-io-checks: ## Lint a small subset of files in $(SUPER_LINTER_TEST_CONTAINER_URL) .PHONY: test-lib -test-lib: test-globals-languages test-build-file-list test-detect-files test-github-event test-setup-ssh test-validation test-output ## Test super-linter libs and globals +test-lib: test-globals-languages test-linter-rules test-build-file-list test-detect-files test-github-event test-setup-ssh test-validation test-output ## Test super-linter libs and globals .PHONY: test-globals-languages test-globals-languages: ## Test globals/languages.sh @@ -291,6 +291,14 @@ test-globals-languages: ## Test globals/languages.sh --entrypoint /tmp/lint/test/lib/globalsLanguagesTest.sh \ $(SUPER_LINTER_TEST_CONTAINER_URL) +.PHONY: test-linter-rules +test-linter-rules: ## Test linterRules.sh + docker run \ + -v "$(CURDIR):/tmp/lint" \ + -w /tmp/lint \ + --entrypoint /tmp/lint/test/lib/linterRulesTest.sh \ + $(SUPER_LINTER_TEST_CONTAINER_URL) + .PHONY: test-build-file-list test-build-file-list: ## Test buildFileList docker run \ diff --git a/docs/add-new-linter.md b/docs/add-new-linter.md index 8b457a09..11d4d081 100644 --- a/docs/add-new-linter.md +++ b/docs/add-new-linter.md @@ -89,9 +89,23 @@ new tool, it should include: - Update the orchestration scripts to run the new tool: + - `globals/languages.sh`: add a new item to `LANGUAGES_ARRAY` array. Use the + "name" of the language, then a `_`, and finally the name of the linter. Example: `PYTHON_RUFF` + - Linter configuration: + - `globals/linterRules.sh`: + - If the new linter accepts a configuration files from the command line, add a new variable + with a default filename using the item that you added to the `LANGUAGES_ARRAY` as a prefix, + followed by the `CONFIG_FILE` suffix. Example: + `PYTHON_RUFF_FILE_NAME="${PYTHON_RUFF_CONFIG_FILE:-.ruff.toml}"`. + - If there are arguments that you can only pass using the command line, and you think users + might want to customize them, define a new variable using the item that + you added to the `LANGUAGES_ARRAY` as a prefix, followed by the + `COMMAND_ARGS` suffix. Example: + `GITHUB_ACTIONS_COMMAND_ARGS="${GITHUB_ACTIONS_COMMAND_ARGS:-""}"` + - Create a new minimal configuration file in the `TEMPLATES` directory with the same name as the + default configuration filename. Example: `TEMPLATES/.ruff.toml`. - `lib/linter.sh` - - `globals/languages.sh` - - `lib/functions/linterCommands.sh` + - `lib/functions/linterCommands.sh`: define a new array to invoke the new linter. - Provide the logic to populate the list of files or directories to examine: `lib/buildFileList.sh` - If necessary, provide elaborate logic to detect if the tool should examine a file or a directory: `lib/detectFiles.sh` - If the tool needs to take into account special cases: diff --git a/lib/globals/languages.sh b/lib/globals/languages.sh index df39bc9a..e3f24864 100755 --- a/lib/globals/languages.sh +++ b/lib/globals/languages.sh @@ -15,3 +15,5 @@ LANGUAGE_ARRAY=('ANSIBLE' 'ARM' 'BASH' 'BASH_EXEC' 'CHECKOV' 'CLANG_FORMAT' 'SNAKEMAKE_LINT' 'SNAKEMAKE_SNAKEFMT' 'STATES' 'SQL' 'SQLFLUFF' 'TEKTON' 'TERRAFORM_FMT' 'TERRAFORM_TFLINT' 'TERRAFORM_TERRASCAN' 'TERRAGRUNT' 'TSX' 'TYPESCRIPT_ES' 'TYPESCRIPT_PRETTIER' 'TYPESCRIPT_STANDARD' 'XML' 'YAML') + +LANGUAGE_ARRAY_FOR_LINTER_RULES=("${LANGUAGE_ARRAY[@]}" "TYPESCRIPT_STANDARD_TSCONFIG") diff --git a/lib/globals/linterRules.sh b/lib/globals/linterRules.sh new file mode 100755 index 00000000..ad38124d --- /dev/null +++ b/lib/globals/linterRules.sh @@ -0,0 +1,107 @@ +#!/usr/bin/env bash + +LINTER_RULES_PATH="${LINTER_RULES_PATH:-.github/linters}" # Linter rules directory + +# shellcheck disable=SC2034 # Variable is referenced indirectly +ANSIBLE_FILE_NAME="${ANSIBLE_CONFIG_FILE:-.ansible-lint.yml}" +# shellcheck disable=SC2034 # Variable is referenced indirectly +ARM_FILE_NAME=".arm-ttk.psd1" +BASH_FILE_NAME="${BASH_FILE_NAME:-".shellcheckrc"}" +BASH_SEVERITY="${BASH_SEVERITY:-""}" +CHECKOV_FILE_NAME="${CHECKOV_FILE_NAME:-".checkov.yaml"}" +# shellcheck disable=SC2034 # Variable is referenced indirectly +CLANG_FORMAT_FILE_NAME="${CLANG_FORMAT_FILE_NAME:-".clang-format"}" +# shellcheck disable=SC2034 # Variable is referenced indirectly +CLOJURE_FILE_NAME=".clj-kondo/config.edn" +# shellcheck disable=SC2034 # Variable is referenced indirectly +CLOUDFORMATION_FILE_NAME=".cfnlintrc.yml" +# shellcheck disable=SC2034 # Variable is referenced indirectly +COFFEESCRIPT_FILE_NAME=".coffee-lint.json" +CSS_FILE_NAME="${CSS_FILE_NAME:-.stylelintrc.json}" +DOCKERFILE_HADOLINT_FILE_NAME="${DOCKERFILE_HADOLINT_FILE_NAME:-.hadolint.yaml}" +EDITORCONFIG_FILE_NAME="${EDITORCONFIG_FILE_NAME:-.ecrc}" +# shellcheck disable=SC2034 # Variable is referenced indirectly +GITHUB_ACTIONS_FILE_NAME="${GITHUB_ACTIONS_CONFIG_FILE:-actionlint.yml}" +# shellcheck disable=SC2034 # Variable is referenced indirectly +GITHUB_ACTIONS_COMMAND_ARGS="${GITHUB_ACTIONS_COMMAND_ARGS:-null}" +# shellcheck disable=SC2034 # Variable is referenced indirectly +GITLEAKS_FILE_NAME="${GITLEAKS_CONFIG_FILE:-.gitleaks.toml}" +# shellcheck disable=SC2034 # Variable is referenced indirectly +GHERKIN_FILE_NAME=".gherkin-lintrc" +# shellcheck disable=SC2034 # Variable is referenced indirectly +GO_FILE_NAME=".golangci.yml" +# shellcheck disable=SC2034 # Variable is referenced indirectly +GROOVY_FILE_NAME=".groovylintrc.json" +# shellcheck disable=SC2034 # Variable is referenced indirectly +HTML_FILE_NAME=".htmlhintrc" +# shellcheck disable=SC2034 # Variable is referenced indirectly +JAVA_FILE_NAME="${JAVA_FILE_NAME:-sun_checks.xml}" +# shellcheck disable=SC2034 # Variable is referenced indirectly +JAVASCRIPT_ES_FILE_NAME="${JAVASCRIPT_ES_CONFIG_FILE:-.eslintrc.yml}" +# shellcheck disable=SC2034 # Variable is referenced indirectly +JAVASCRIPT_STANDARD_FILE_NAME="${JAVASCRIPT_ES_CONFIG_FILE:-.eslintrc.yml}" +# shellcheck disable=SC2034 # Variable is referenced indirectly +JSCPD_FILE_NAME="${JSCPD_CONFIG_FILE:-.jscpd.json}" +# shellcheck disable=SC2034 # Variable is referenced indirectly +JSX_FILE_NAME="${JAVASCRIPT_ES_CONFIG_FILE:-.eslintrc.yml}" +# shellcheck disable=SC2034 # Variable is referenced indirectly +KUBERNETES_KUBECONFORM_OPTIONS="${KUBERNETES_KUBECONFORM_OPTIONS:-null}" +# shellcheck disable=SC2034 # Variable is referenced indirectly +LATEX_FILE_NAME=".chktexrc" +# shellcheck disable=SC2034 # Variable is referenced indirectly +LUA_FILE_NAME=".luacheckrc" +MARKDOWN_CUSTOM_RULE_GLOBS="${MARKDOWN_CUSTOM_RULE_GLOBS:-""}" +# shellcheck disable=SC2034 # Variable is referenced indirectly +MARKDOWN_FILE_NAME="${MARKDOWN_CONFIG_FILE:-.markdown-lint.yml}" +# shellcheck disable=SC2034 # Variable is referenced indirectly +OPENAPI_FILE_NAME=".openapirc.yml" +# shellcheck disable=SC2034 # Variable is referenced indirectly +PERL_PERLCRITIC_OPTIONS="${PERL_PERLCRITIC_OPTIONS:-null}" +# shellcheck disable=SC2034 # Variable is referenced indirectly +PHP_BUILTIN_FILE_NAME="${PHP_CONFIG_FILE:-php.ini}" +# shellcheck disable=SC2034 # Variable is referenced indirectly +PHP_PHPCS_FILE_NAME="${PHP_PHPCS_FILE_NAME:-phpcs.xml}" +# shellcheck disable=SC2034 # Variable is referenced indirectly +PHP_PHPSTAN_FILE_NAME="${PHP_PHPSTAN_CONFIG_FILE:-phpstan.neon}" +# shellcheck disable=SC2034 # Variable is referenced indirectly +PHP_PSALM_FILE_NAME="psalm.xml" +# shellcheck disable=SC2034 # Variable is referenced indirectly +POWERSHELL_FILE_NAME="${POWERSHELL_CONFIG_FILE:-.powershell-psscriptanalyzer.psd1}" +# shellcheck disable=SC2034 # Variable is referenced indirectly +PROTOBUF_FILE_NAME="${PROTOBUF_CONFIG_FILE:-.protolintrc.yml}" +# shellcheck disable=SC2034 # Variable is referenced indirectly +PYTHON_BLACK_FILE_NAME="${PYTHON_BLACK_CONFIG_FILE:-.python-black}" +# shellcheck disable=SC2034 # Variable is referenced indirectly +PYTHON_FLAKE8_FILE_NAME="${PYTHON_FLAKE8_CONFIG_FILE:-.flake8}" +# shellcheck disable=SC2034 # Variable is referenced indirectly +PYTHON_ISORT_FILE_NAME="${PYTHON_ISORT_CONFIG_FILE:-.isort.cfg}" +# shellcheck disable=SC2034 # Variable is referenced indirectly +PYTHON_MYPY_FILE_NAME="${PYTHON_MYPY_CONFIG_FILE:-.mypy.ini}" +# shellcheck disable=SC2034 # Variable is referenced indirectly +PYTHON_PYLINT_FILE_NAME="${PYTHON_PYLINT_CONFIG_FILE:-.python-lint}" +# shellcheck disable=SC2034 # Variable is referenced indirectly +PYTHON_RUFF_FILE_NAME="${PYTHON_RUFF_CONFIG_FILE:-.ruff.toml}" +# shellcheck disable=SC2034 # Variable is referenced indirectly +R_FILE_NAME=".lintr" +# shellcheck disable=SC2034 # Variable is referenced indirectly +RUBY_FILE_NAME="${RUBY_CONFIG_FILE:-.ruby-lint.yml}" +# shellcheck disable=SC2034 # Variable is referenced indirectly +SCALAFMT_FILE_NAME="${SCALAFMT_CONFIG_FILE:-.scalafmt.conf}" +# shellcheck disable=SC2034 # Variable is referenced indirectly +SNAKEMAKE_SNAKEFMT_FILE_NAME="${SNAKEMAKE_SNAKEFMT_CONFIG_FILE:-.snakefmt.toml}" +# shellcheck disable=SC2034 # Variable is referenced indirectly +SQL_FILE_NAME="${SQL_CONFIG_FILE:-.sql-config.json}" +# shellcheck disable=SC2034 # Variable is referenced indirectly +SQLFLUFF_FILE_NAME="${SQLFLUFF_CONFIG_FILE:-/.sqlfluff}" +# shellcheck disable=SC2034 # Variable is referenced indirectly +TERRAFORM_TFLINT_FILE_NAME="${TERRAFORM_TFLINT_CONFIG_FILE:-.tflint.hcl}" +# shellcheck disable=SC2034 # Variable is referenced indirectly +TERRAFORM_TERRASCAN_FILE_NAME="${TERRAFORM_TERRASCAN_CONFIG_FILE:-terrascan.toml}" +# shellcheck disable=SC2034 # Variable is referenced indirectly +NATURAL_LANGUAGE_FILE_NAME="${NATURAL_LANGUAGE_CONFIG_FILE:-.textlintrc}" +# shellcheck disable=SC2034 # Variable is referenced indirectly +TSX_FILE_NAME="${TYPESCRIPT_ES_CONFIG_FILE:-.eslintrc.yml}" +# shellcheck disable=SC2034 # Variable is referenced indirectly +TYPESCRIPT_ES_FILE_NAME="${TYPESCRIPT_ES_CONFIG_FILE:-.eslintrc.yml}" +# shellcheck disable=SC2034 # Variable is referenced indirectly +YAML_FILE_NAME="${YAML_CONFIG_FILE:-.yaml-lint.yml}" diff --git a/lib/linter.sh b/lib/linter.sh index b8b33dc7..797bc0b2 100755 --- a/lib/linter.sh +++ b/lib/linter.sh @@ -152,7 +152,6 @@ FILTER_REGEX_INCLUDE="${FILTER_REGEX_INCLUDE:-""}" export FILTER_REGEX_INCLUDE FILTER_REGEX_EXCLUDE="${FILTER_REGEX_EXCLUDE:-""}" export FILTER_REGEX_EXCLUDE -LINTER_RULES_PATH="${LINTER_RULES_PATH:-.github/linters}" # Linter rules directory # shellcheck disable=SC2034 # Variable is referenced in other scripts RAW_FILE_ARRAY=() # Array of all files that were changed # shellcheck disable=SC2034 # Variable is referenced in other scripts @@ -169,113 +168,11 @@ TFLINT_LOG="${TF_LOG_LEVEL}" export TFLINT_LOG debug "TFLINT_LOG: ${TFLINT_LOG}" -############### -# Rules files # -############### -# shellcheck disable=SC2034 # Variable is referenced indirectly -ANSIBLE_FILE_NAME="${ANSIBLE_CONFIG_FILE:-.ansible-lint.yml}" -# shellcheck disable=SC2034 # Variable is referenced indirectly -ARM_FILE_NAME=".arm-ttk.psd1" -BASH_FILE_NAME="${BASH_FILE_NAME:-".shellcheckrc"}" -BASH_SEVERITY="${BASH_SEVERITY:-""}" -CHECKOV_FILE_NAME="${CHECKOV_FILE_NAME:-".checkov.yaml"}" -# shellcheck disable=SC2034 # Variable is referenced indirectly -CLANG_FORMAT_FILE_NAME="${CLANG_FORMAT_FILE_NAME:-".clang-format"}" -# shellcheck disable=SC2034 # Variable is referenced indirectly -CLOJURE_FILE_NAME=".clj-kondo/config.edn" -# shellcheck disable=SC2034 # Variable is referenced indirectly -CLOUDFORMATION_FILE_NAME=".cfnlintrc.yml" -# shellcheck disable=SC2034 # Variable is referenced indirectly -COFFEESCRIPT_FILE_NAME=".coffee-lint.json" -CSS_FILE_NAME="${CSS_FILE_NAME:-.stylelintrc.json}" -DOCKERFILE_HADOLINT_FILE_NAME="${DOCKERFILE_HADOLINT_FILE_NAME:-.hadolint.yaml}" -EDITORCONFIG_FILE_NAME="${EDITORCONFIG_FILE_NAME:-.ecrc}" -# shellcheck disable=SC2034 # Variable is referenced indirectly -GITHUB_ACTIONS_FILE_NAME="${GITHUB_ACTIONS_CONFIG_FILE:-actionlint.yml}" -# shellcheck disable=SC2034 # Variable is referenced indirectly -GITHUB_ACTIONS_COMMAND_ARGS="${GITHUB_ACTIONS_COMMAND_ARGS:-null}" -# shellcheck disable=SC2034 # Variable is referenced indirectly -GITLEAKS_FILE_NAME="${GITLEAKS_CONFIG_FILE:-.gitleaks.toml}" -# shellcheck disable=SC2034 # Variable is referenced indirectly -GHERKIN_FILE_NAME=".gherkin-lintrc" -# shellcheck disable=SC2034 # Variable is referenced indirectly -GO_FILE_NAME=".golangci.yml" -# shellcheck disable=SC2034 # Variable is referenced indirectly -GROOVY_FILE_NAME=".groovylintrc.json" -# shellcheck disable=SC2034 # Variable is referenced indirectly -HTML_FILE_NAME=".htmlhintrc" -# shellcheck disable=SC2034 # Variable is referenced indirectly -JAVA_FILE_NAME="${JAVA_FILE_NAME:-sun_checks.xml}" -# shellcheck disable=SC2034 # Variable is referenced indirectly -JAVASCRIPT_ES_FILE_NAME="${JAVASCRIPT_ES_CONFIG_FILE:-.eslintrc.yml}" -# shellcheck disable=SC2034 # Variable is referenced indirectly -JAVASCRIPT_STANDARD_FILE_NAME="${JAVASCRIPT_ES_CONFIG_FILE:-.eslintrc.yml}" -# shellcheck disable=SC2034 # Variable is referenced indirectly -JSCPD_FILE_NAME="${JSCPD_CONFIG_FILE:-.jscpd.json}" -# shellcheck disable=SC2034 # Variable is referenced indirectly -JSX_FILE_NAME="${JAVASCRIPT_ES_CONFIG_FILE:-.eslintrc.yml}" -# shellcheck disable=SC2034 # Variable is referenced indirectly -KUBERNETES_KUBECONFORM_OPTIONS="${KUBERNETES_KUBECONFORM_OPTIONS:-null}" -# shellcheck disable=SC2034 # Variable is referenced indirectly -LATEX_FILE_NAME=".chktexrc" -# shellcheck disable=SC2034 # Variable is referenced indirectly -LUA_FILE_NAME=".luacheckrc" -MARKDOWN_CUSTOM_RULE_GLOBS="${MARKDOWN_CUSTOM_RULE_GLOBS:-""}" -# shellcheck disable=SC2034 # Variable is referenced indirectly -MARKDOWN_FILE_NAME="${MARKDOWN_CONFIG_FILE:-.markdown-lint.yml}" -# shellcheck disable=SC2034 # Variable is referenced indirectly -OPENAPI_FILE_NAME=".openapirc.yml" -# shellcheck disable=SC2034 # Variable is referenced indirectly -PERL_PERLCRITIC_OPTIONS="${PERL_PERLCRITIC_OPTIONS:-null}" -# shellcheck disable=SC2034 # Variable is referenced indirectly -PHP_BUILTIN_FILE_NAME="${PHP_CONFIG_FILE:-php.ini}" -# shellcheck disable=SC2034 # Variable is referenced indirectly -PHP_PHPCS_FILE_NAME="${PHP_PHPCS_FILE_NAME:-phpcs.xml}" -# shellcheck disable=SC2034 # Variable is referenced indirectly -PHP_PHPSTAN_FILE_NAME="${PHP_PHPSTAN_CONFIG_FILE:-phpstan.neon}" -# shellcheck disable=SC2034 # Variable is referenced indirectly -PHP_PSALM_FILE_NAME="psalm.xml" -# shellcheck disable=SC2034 # Variable is referenced indirectly -POWERSHELL_FILE_NAME="${POWERSHELL_CONFIG_FILE:-.powershell-psscriptanalyzer.psd1}" -# shellcheck disable=SC2034 # Variable is referenced indirectly -PROTOBUF_FILE_NAME="${PROTOBUF_CONFIG_FILE:-.protolintrc.yml}" -# shellcheck disable=SC2034 # Variable is referenced indirectly -PYTHON_BLACK_FILE_NAME="${PYTHON_BLACK_CONFIG_FILE:-.python-black}" -# shellcheck disable=SC2034 # Variable is referenced indirectly -PYTHON_FLAKE8_FILE_NAME="${PYTHON_FLAKE8_CONFIG_FILE:-.flake8}" -# shellcheck disable=SC2034 # Variable is referenced indirectly -PYTHON_ISORT_FILE_NAME="${PYTHON_ISORT_CONFIG_FILE:-.isort.cfg}" -# shellcheck disable=SC2034 # Variable is referenced indirectly -PYTHON_MYPY_FILE_NAME="${PYTHON_MYPY_CONFIG_FILE:-.mypy.ini}" -# shellcheck disable=SC2034 # Variable is referenced indirectly -PYTHON_PYLINT_FILE_NAME="${PYTHON_PYLINT_CONFIG_FILE:-.python-lint}" -# shellcheck disable=SC2034 # Variable is referenced indirectly -PYTHON_RUFF_FILE_NAME="${PYTHON_RUFF_CONFIG_FILE:-.ruff.toml}" -# shellcheck disable=SC2034 # Variable is referenced indirectly -R_FILE_NAME=".lintr" -# shellcheck disable=SC2034 # Variable is referenced indirectly -RUBY_FILE_NAME="${RUBY_CONFIG_FILE:-.ruby-lint.yml}" -# shellcheck disable=SC2034 # Variable is referenced indirectly -SCALAFMT_FILE_NAME="${SCALAFMT_CONFIG_FILE:-.scalafmt.conf}" -# shellcheck disable=SC2034 # Variable is referenced indirectly -SNAKEMAKE_SNAKEFMT_FILE_NAME="${SNAKEMAKE_SNAKEFMT_CONFIG_FILE:-.snakefmt.toml}" -# shellcheck disable=SC2034 # Variable is referenced indirectly -SQL_FILE_NAME="${SQL_CONFIG_FILE:-.sql-config.json}" -# shellcheck disable=SC2034 # Variable is referenced indirectly -SQLFLUFF_FILE_NAME="${SQLFLUFF_CONFIG_FILE:-/.sqlfluff}" -# shellcheck disable=SC2034 # Variable is referenced indirectly -TERRAFORM_TFLINT_FILE_NAME="${TERRAFORM_TFLINT_CONFIG_FILE:-.tflint.hcl}" -# shellcheck disable=SC2034 # Variable is referenced indirectly -TERRAFORM_TERRASCAN_FILE_NAME="${TERRAFORM_TERRASCAN_CONFIG_FILE:-terrascan.toml}" -# shellcheck disable=SC2034 # Variable is referenced indirectly -NATURAL_LANGUAGE_FILE_NAME="${NATURAL_LANGUAGE_CONFIG_FILE:-.textlintrc}" -# shellcheck disable=SC2034 # Variable is referenced indirectly -TSX_FILE_NAME="${TYPESCRIPT_ES_CONFIG_FILE:-.eslintrc.yml}" -# shellcheck disable=SC2034 # Variable is referenced indirectly -TYPESCRIPT_ES_FILE_NAME="${TYPESCRIPT_ES_CONFIG_FILE:-.eslintrc.yml}" -# shellcheck disable=SC2034 # Variable is referenced indirectly -YAML_FILE_NAME="${YAML_CONFIG_FILE:-.yaml-lint.yml}" +# Load linter configuration and rules files +# shellcheck source=/dev/null +source /action/lib/globals/linterRules.sh +# Load languages array # shellcheck source=/dev/null source /action/lib/globals/languages.sh @@ -883,8 +780,6 @@ LinterRulesLocation ######################## # Get the linter rules # ######################## -LANGUAGE_ARRAY_FOR_LINTER_RULES=("${LANGUAGE_ARRAY[@]}" "TYPESCRIPT_STANDARD_TSCONFIG") - for LANGUAGE in "${LANGUAGE_ARRAY_FOR_LINTER_RULES[@]}"; do debug "Loading rules for ${LANGUAGE}..." eval "GetLinterRules ${LANGUAGE} ${DEFAULT_RULES_LOCATION}" diff --git a/test/inspec/super-linter/controls/super_linter.rb b/test/inspec/super-linter/controls/super_linter.rb index 5baec988..faf2212e 100644 --- a/test/inspec/super-linter/controls/super_linter.rb +++ b/test/inspec/super-linter/controls/super_linter.rb @@ -472,6 +472,7 @@ control "super-linter-validate-files" do "/action/lib/functions/validation.sh", "/action/lib/functions/worker.sh", "/action/lib/globals/languages.sh", + "/action/lib/globals/linterRules.sh", "/action/lib/.automation/actionlint.yml", "/action/lib/.automation/.ansible-lint.yml", "/action/lib/.automation/.arm-ttk.psd1", diff --git a/test/lib/buildFileListTest.sh b/test/lib/buildFileListTest.sh index ae1034a2..2226ce59 100755 --- a/test/lib/buildFileListTest.sh +++ b/test/lib/buildFileListTest.sh @@ -52,7 +52,7 @@ function GenerateFileDiffOneFileTest() { GITHUB_WORKSPACE="$(mktemp -d)" # shellcheck disable=SC2064 # Once the path is set, we don't expect it to change trap "rm -fr '${GITHUB_WORKSPACE}'" EXIT - echo "GITHUB_WORKSPACE: ${GITHUB_WORKSPACE}" + debug "GITHUB_WORKSPACE: ${GITHUB_WORKSPACE}" local FILES_TO_COMMIT="${FILES_TO_COMMIT:-1}" local COMMIT_FILE_INITIAL_COMMIT="${COMMIT_FILE_INITIAL_COMMIT:-"false"}" diff --git a/test/lib/linterRulesTest.sh b/test/lib/linterRulesTest.sh new file mode 100755 index 00000000..62537ba6 --- /dev/null +++ b/test/lib/linterRulesTest.sh @@ -0,0 +1,93 @@ +#!/usr/bin/env bash + +set -o errexit +set -o nounset +set -o pipefail + +# Default log level +# shellcheck disable=SC2034 +LOG_LEVEL="DEBUG" + +# shellcheck source=/dev/null +source "lib/functions/log.sh" + +# shellcheck source=/dev/null +source "lib/globals/linterRules.sh" + +TEST_LANGUAGE_NAME="TEST_LANGUAGE" +TEST_LANGUAGE_NAME_WITHOUT_RULES="TEST_LANGUAGE_WITHOUT_RULES" +LANGUAGE_ARRAY=("${TEST_LANGUAGE_NAME}" "${TEST_LANGUAGE_NAME_WITHOUT_RULES}") + +# shellcheck source=/dev/null +source "lib/functions/linterRules.sh" + +DEFAULT_RULES_LOCATION="TEMPLATES" + +# Use an existing configuration file. Can be anything inside +# DEFAULT_RULES_LOCATION +# shellcheck disable=SC2034 +TEST_LANGUAGE_FILE_NAME=".eslintrc.yml" + +# shellcheck disable=SC2034 +GITHUB_WORKSPACE="$(pwd)" + +function GetLinterRulesTest() { + local FUNCTION_NAME + FUNCTION_NAME="${FUNCNAME[0]}" + info "${FUNCTION_NAME} start" + + for LANGUAGE in "${LANGUAGE_ARRAY[@]}"; do + debug "Loading rules for ${LANGUAGE}..." + eval "GetLinterRules ${LANGUAGE} ${DEFAULT_RULES_LOCATION}" + done + + local EXPECTED_TEST_LANGUAGE_LINTER_RULES="${DEFAULT_RULES_LOCATION}/${TEST_LANGUAGE_FILE_NAME}" + if [[ "${TEST_LANGUAGE_LINTER_RULES}" == "${EXPECTED_TEST_LANGUAGE_LINTER_RULES}" ]]; then + debug "TEST_LANGUAGE_LINTER_RULES (${TEST_LANGUAGE_LINTER_RULES}) matches the expected value (${EXPECTED_TEST_LANGUAGE_LINTER_RULES})" + else + fatal "TEST_LANGUAGE_LINTER_RULES (${TEST_LANGUAGE_LINTER_RULES}) doesn't match the expected value (${EXPECTED_TEST_LANGUAGE_LINTER_RULES})" + fi + if [[ -z "${TEST_LANGUAGE_WITHOUT_RULES_LINTER_RULES:-}" ]]; then + debug "TEST_LANGUAGE_WITHOUT_RULES_LINTER_RULES is not set as expected" + else + fatal "TEST_LANGUAGE_WITHOUT_RULES_LINTER_RULES shouldn't be set" + fi + unset TEST_LANGUAGE_LINTER_RULES + unset TEST_LANGUAGE_WITHOUT_RULES_LINTER_RULES + unset EXPECTED_TEST_LANGUAGE_LINTER_RULES + + notice "${FUNCTION_NAME} PASS" +} + +function LinterRulesVariablesExportTest() { + local FUNCTION_NAME + FUNCTION_NAME="${FUNCNAME[0]}" + info "${FUNCTION_NAME} start" + + for LANGUAGE in "${LANGUAGE_ARRAY[@]}"; do + debug "Loading rules for ${LANGUAGE}..." + eval "GetLinterRules ${LANGUAGE} ${DEFAULT_RULES_LOCATION}" + done + + for LANGUAGE in "${LANGUAGE_ARRAY[@]}"; do + if [[ "${LANGUAGE}" == "${TEST_LANGUAGE_NAME_WITHOUT_RULES}" ]]; then + debug "${LANGUAGE} doesn't have linter rules. Skipping export test." + continue + fi + + local -n LANGUAGE_LINTER_RULES + LANGUAGE_LINTER_RULES="${LANGUAGE}_LINTER_RULES" + debug "LANGUAGE_LINTER_RULES (${LANGUAGE}) variable attributes: ${LANGUAGE_LINTER_RULES@a}" + if [[ "${LANGUAGE_LINTER_RULES@a}" == *x* ]]; then + info "LANGUAGE_LINTER_RULES for ${LANGUAGE} is exported as expected" + else + fatal "LANGUAGE_LINTER_RULES for ${LANGUAGE} should have been exported" + fi + unset -n LANGUAGE_LINTER_RULES + done + + notice "${FUNCTION_NAME} PASS" +} + +GetLinterRulesTest +LinterRulesVariablesExportTest