diff --git a/.automation/test/python/python_good_1.py b/.automation/test/python/python_good_1.py index e894c36f..a2f7c3e6 100644 --- a/.automation/test/python/python_good_1.py +++ b/.automation/test/python/python_good_1.py @@ -3,9 +3,9 @@ from os import getenv, path from pprint import pprint import sys -import click # pylint: disable=import-error -from dotenv import load_dotenv # pylint: disable=import-error -import requests # pylint: disable=import-error +import click # pylint: disable=import-error +from dotenv import load_dotenv # pylint: disable=import-error +import requests # pylint: disable=import-error env = load_dotenv() api_url = getenv('API_URL', default='https://api.github.com/graphql') @@ -13,8 +13,8 @@ github_token = getenv("GITHUB_TOKEN", default=None) if github_token is None: sys.exit("GitHub Token is not set." + - "Please set the GITHUB_TOKEN env variable in your system or " + - "the .env file of your project.") + "Please set the GITHUB_TOKEN env variable in your system or " + + "the .env file of your project.") client_id = getenv('CLIENT_ID', default='copy_labels.py') headers = { @@ -23,6 +23,7 @@ headers = { 'Content-Type': 'application/json' } + def create_label(repo_id, label): """ Create label in the supplied repo. @@ -52,6 +53,7 @@ def create_label(repo_id, label): return response + def get_labels(owner, repo): """ Gets a list of labels from the supplied repo. @@ -62,7 +64,7 @@ def get_labels(owner, repo): :return: A tuple with the GitHub id for the repository and a list of labels defined in the repository """ - query_variables = { "owner": owner, "name": repo, } + query_variables = {"owner": owner, "name": repo, } with open(path.join(path.dirname(__file__), 'queries/get_repo_data.gql'), 'r') as query_file: query = "".join(query_file.readlines()) @@ -83,6 +85,7 @@ def get_labels(owner, repo): '[ERROR] getting issue labels. Status Code: {status_code} - Message: {result}'.format( status_code=status_code, result=result["message"])) + def delete_label(label_id): """ Delete the specified label @@ -106,6 +109,7 @@ def delete_label(label_id): return result + @click.command() @click.option('--dry', is_flag=True) @click.argument('source_repo') @@ -149,7 +153,8 @@ def copy_labels(source_repo, target_repo, dry): print('Done') + if __name__ == "__main__": # Pylint doesn't know that @click.command takes care of injecting the # function parameters. Disabling Pylint error. - copy_labels() # pylint: disable=no-value-for-parameter + copy_labels() # pylint: disable=no-value-for-parameter diff --git a/.github/linters/.flake8 b/.github/linters/.flake8 new file mode 100644 index 00000000..6deafc26 --- /dev/null +++ b/.github/linters/.flake8 @@ -0,0 +1,2 @@ +[flake8] +max-line-length = 120 diff --git a/Dockerfile b/Dockerfile index 2aa7dec9..884c1c4f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -247,6 +247,8 @@ ENV ACTIONS_RUNNER_DEBUG=${ACTIONS_RUNNER_DEBUG} \ VALIDATE_POWERSHELL=${VALIDATE_POWERSHELL} \ VALIDATE_PROTOBUF=${VALIDATE_PROTOBUF} \ VALIDATE_PYTHON=${VALIDATE_PYTHON} \ + VALIDATE_PYTHON_PYLINT=${VALIDATE_PYTHON_PYLINT} \ + VALIDATE_PYTHON_FLAKE8=${VALIDATE_PYTHON_FLAKE8} \ VALIDATE_RAKU=${VALIDATE_RAKU} \ VALIDATE_RUBY=${VALIDATE_RUBY} \ VALIDATE_STATES=${VALIDATE_STATES} \ diff --git a/README.md b/README.md index 4c09d542..a453dc1e 100644 --- a/README.md +++ b/README.md @@ -66,7 +66,7 @@ Developers on **GitHub** can call the **GitHub Action** to lint their code base | **PHP** | [PHP](https://www.php.net/) | | **PowerShell** | [PSScriptAnalyzer](https://github.com/PowerShell/Psscriptanalyzer) | | **Protocol Buffers** | [protolint](https://github.com/yoheimuta/protolint) | -| **Python3** | [pylint](https://www.pylint.org/) | +| **Python3** | [pylint](https://www.pylint.org/) [flake8](https://flake8.pycqa.org/en/latest/) | | **Raku** | [raku](https://raku.org) | | **Ruby** | [RuboCop](https://github.com/rubocop-hq/rubocop) | | **Shell** | [Shellcheck](https://github.com/koalaman/shellcheck) | @@ -180,6 +180,8 @@ and won't run anything unexpected. | **OUTPUT_FORMAT** | `none` | The report format to be generated, besides the stdout one. Output format of tap is currently using v13 of the specification. Supported formats: tap | | **OUTPUT_FOLDER** | `super-linter.report` | The location where the output reporting will be generated to. Output folder must not previously exist. | | **OUTPUT_DETAILS** | `simpler` | What level of details to be reported. Supported formats: simpler or detailed. | +| **PYTHON_PYLINT_CONFIG_FILE** | `.python-lint` | Filename for [pylint configuration](http://pylint.pycqa.org/en/latest/user_guide/run.html?highlight=rcfile#command-line-options) (ex: `.python-lint`, `.pylintrc`) | +| **PYTHON_FLAKE8_CONFIG_FILE** | `.flake8` | Filename for [flake8 configuration](https://flake8.pycqa.org/en/latest/user/configuration.html) (ex: `.flake8`, `tox.ini`) | | **RUBY_CONFIG_FILE** | `.ruby-lint.yml` | Filename for [rubocop configuration](https://docs.rubocop.org/rubocop/configuration.html) (ex: `.ruby-lint.yml`, `.rubocop.yml`) | | **TYPESCRIPT_ES_CONFIG_FILE** | `.eslintrc.yml` | Filename for [eslint configuration](https://eslint.org/docs/user-guide/configuring#configuration-file-formats) (ex: `.eslintrc.yml`, `.eslintrc.json`) | | **VALIDATE_ALL_CODEBASE** | `true` | Will parse the entire repository and find all files to validate across all types. **NOTE:** When set to `false`, only **new** or **edited** files will be parsed for validation. | @@ -208,7 +210,9 @@ and won't run anything unexpected. | **VALIDATE_PERL** | `true` | Flag to enable or disable the linting process of the Perl language. | | **VALIDATE_PHP** | `true` | Flag to enable or disable the linting process of the PHP language. | | **VALIDATE_PROTOBUF** | `true` | Flag to enable or disable the linting process of the Protobuf language. | -| **VALIDATE_PYTHON** | `true` | Flag to enable or disable the linting process of the Python language. | +| **VALIDATE_PYTHON** | `true` | Flag to enable or disable the linting process of the Python language. (Utilizing: pylint) (keep for backward compatibility) | +| **VALIDATE_PYTHON_PYLINT** | `true` | Flag to enable or disable the linting process of the Python language. (Utilizing: pylint) | +| **VALIDATE_PYTHON_FLAKE8** | `true` | Flag to enable or disable the linting process of the Python language. (Utilizing: flake8) | | **VALIDATE_POWERSHELL** | `true` | Flag to enable or disable the linting process of the Powershell language. | | **VALIDATE_RAKU** | `true` | Flag to enable or disable the linting process of the Raku language. | | **VALIDATE_RUBY** | `true` | Flag to enable or disable the linting process of the Ruby language. | diff --git a/TEMPLATES/.flake8 b/TEMPLATES/.flake8 new file mode 100644 index 00000000..6deafc26 --- /dev/null +++ b/TEMPLATES/.flake8 @@ -0,0 +1,2 @@ +[flake8] +max-line-length = 120 diff --git a/dependencies/Pipfile b/dependencies/Pipfile index dbc906c9..0fcce921 100644 --- a/dependencies/Pipfile +++ b/dependencies/Pipfile @@ -11,6 +11,7 @@ pylint = "*" yq = "*" cfn-lint = "*" terrascan = "*" +flake8 = "*" [requires] python_version = "3.8" diff --git a/dependencies/Pipfile.lock b/dependencies/Pipfile.lock index 32180e96..962c1041 100644 --- a/dependencies/Pipfile.lock +++ b/dependencies/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "c62b95247cb67b10711da0012966cc031d5a9ec08885a45736c0ee77bba3a844" + "sha256": "f8ea3853c4bb4533103043533d08982436551678c827f59809c94bf0ee54a187" }, "pipfile-spec": 6, "requires": { @@ -28,6 +28,7 @@ "sha256:2f4078c2a41bf377eea06d71c9d2ba4eb8f6b1af2135bec27bbbb7d8f12bb703", "sha256:bc58d83eb610252fd8de6363e39d4f1d0619c894b0ed24603b881c02e64c7386" ], + "markers": "python_version >= '3.5'", "version": "==2.4.2" }, "attrs": { @@ -35,6 +36,7 @@ "sha256:08a96c641c3a74e44eb59afb61a24f2cb9f4d7188748e76ba4bb5edfa3cb7d1c", "sha256:f7b7ce16570fe9965acd6d30101a28f62fb4a7f9e926b3bbc9b61f8b04247e72" ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==19.3.0" }, "aws-sam-translator": { @@ -80,13 +82,23 @@ "sha256:9e4d7ecfc600058e07ba661411a2b7de2fd0fafa17d1a7f7361cd47b1175c827", "sha256:a2aeea129088da402665e92e0b25b04b073c04b2dce4ab65caaa38b7ce2e1a99" ], + "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2'", "version": "==0.15.2" }, + "flake8": { + "hashes": [ + "sha256:15e351d19611c887e482fb960eae4d44845013cc142d42896e9862f775d8cf5c", + "sha256:f04b9fcbac03b0a3e58c0ab3a0ecc462e023a9faf046d57794184028123aa208" + ], + "index": "pypi", + "version": "==3.8.3" + }, "isort": { "hashes": [ "sha256:54da7e92468955c4fceacd0c86bd0ec997b0e1ee80d97f67c35a78b719dccab1", "sha256:6e811fcb295968434526407adb8796944f1988c5b65e8139058f2014cbe100fd" ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==4.3.21" }, "jmespath": { @@ -94,6 +106,7 @@ "sha256:b85d0567b8666149a93172712e68920734333c0ce7e89b78b3e987f71e5ed4f9", "sha256:cdf6525904cc597730141d61b36f2e4b8ecc257c420fa2f4549bac2c2d0cb72f" ], + "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2'", "version": "==0.10.0" }, "jsonpatch": { @@ -109,6 +122,7 @@ "sha256:c192ba86648e05fdae4f08a17ec25180a9aef5008d973407b581798a83975362", "sha256:ff379fa021d1b81ab539f5ec467c7745beb1a5671463f9dcc2b2d458bd361c1e" ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==2.0" }, "jsonschema": { @@ -148,6 +162,7 @@ "sha256:efa1909120ce98bbb3777e8b6f92237f5d5c8ea6758efea36a473e1d38f7d3e4", "sha256:f3900e8a5de27447acbf900b4750b0ddfd7ec1ea7fbaf11dfa911141bc522af0" ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==1.4.3" }, "mccabe": { @@ -172,6 +187,22 @@ ], "version": "==0.8.0" }, + "pycodestyle": { + "hashes": [ + "sha256:2295e7b2f6b5bd100585ebcb1f616591b652db8a741695b3d8f5d28bdc934367", + "sha256:c58a7d2815e0e8d7972bf1803331fb0152f867bd89adf8a01dfd55085434192e" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==2.6.0" + }, + "pyflakes": { + "hashes": [ + "sha256:0d94e0e05a19e57a99444b6ddcf9a6eb2e5c68d3ca1e98e90707af8152c90a92", + "sha256:35b2d75ee967ea93b55750aa9edbbf72813e06a66ba54438df2cfac9e3c27fc8" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==2.2.0" + }, "pyhcl": { "hashes": [ "sha256:2d9b9dcdf1023d812bfed561ba72c99104c5b3f52e558d595130a44ce081b003" @@ -197,6 +228,7 @@ "sha256:73ebfe9dbf22e832286dafa60473e4cd239f8592f699aa5adaf10050e6e1823c", "sha256:75bb3f31ea686f1197762692a9ee6a7550b59fc6ca3a1f4b5d7e32fb98e2da2a" ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", "version": "==2.8.1" }, "pyyaml": { @@ -228,6 +260,7 @@ "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259", "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced" ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", "version": "==1.15.0" }, "terrascan": { diff --git a/docs/disabling-linters.md b/docs/disabling-linters.md index fbdb578e..599bf126 100644 --- a/docs/disabling-linters.md +++ b/docs/disabling-linters.md @@ -14,40 +14,862 @@ For some linters it is also possible to override rules on a case by case level w ## Table of Linters -- [Ruby](#ruby) -- [Shell](#shell) -- [Ansible](#ansible) -- [YAML](#yaml) -- [AWS CloudFormation templates](#aws-cloud-formation) -- [Python](#python3) -- [JSON](#json) -- [Markdown](#markdown) -- [Perl](#perl) -- [Raku](#raku) -- [PHP](#php) -- [XML](#xml) -- [Coffeescript](#coffeescript) -- [Javascript Eslint](#javascript-eslint) -- [Javascript Standard](#javascript-standard) -- [Typescript Eslint](#typescript-eslint) -- [Typescript Standard](#typescript-standard) -- [Golang](#golang) -- [Groovy](#groovy) -- [Dockerfile](#dockerfile) -- [Terraform](#terraform) -- [CSS](#css) -- [DART](#dart) -- [ENV](#dotenv-linter) -- [Kotlin](#kotlin) -- [OpenAPI](#openapi) -- [Protocol Buffers](#protocol-buffers) -- [Clojure](#clojure) -- [EDITORCONFIG-CHECKER](#editorconfig-checker) -- [HTML](#html) -- [LUA](#lua) +- [Disabling linters and Rules](#disabling-linters-and-rules) + - [Table of Linters](#table-of-linters) + - [Ansible](#ansible) + - [AWS CloudFormation templates](#aws-cloudformation-templates) + - [Clojure](#clojure) + - [Coffeescript](#coffeescript) + - [CSS](#css) + - [Dart](#dart) + - [Dockerfile](#dockerfile) + - [EDITORCONFIG-CHECKER](#editorconfig-checker) + - [ENV](#env) + - [Golang](#golang) + - [Groovy](#groovy) + - [HTML](#html) + - [Javascript eslint](#javascript-eslint) + - [Javascript standard](#javascript-standard) + - [JSON](#json) + - [Kotlin](#kotlin) + - [Lua](#lua) + - [Markdown](#markdown) + - [OpenAPI](#openapi) + - [Perl](#perl) + - [PHP](#php) + - [Protocol Buffers](#protocol-buffers) + - [Python3 pylint](#python3-pylint) + - [Python3 flake8](#python3-flake8) + - [Raku](#raku) + - [Ruby](#ruby) + - [Shell](#shell) + - [Terraform](#terraform) + - [Typescript eslint](#typescript-eslint) + - [Typescript standard](#typescript-standard) + - [XML](#xml) + - [YAML](#yaml) +--- + +## Ansible + +- [ansible-lint](https://github.com/ansible/ansible-lint) + +### Ansible-lint Config file + +- `.github/linters/.ansible-lint.yml` +- You can pass multiple rules and overwrite default rules +- File should be located at: `.github/linters/.ansible-lint.yml` + +### Ansible-lint disable single line + +```yml +- name: this would typically fire GitHasVersionRule 401 and BecomeUserWithoutBecomeRule 501 + become_user: alice # noqa 401 501 + git: src=/path/to/git/repo dest=checkout +``` + +### Ansible-lint disable code block + +```yml +- name: this would typically fire GitHasVersionRule 401 + git: src=/path/to/git/repo dest=checkout + tags: + - skip_ansible_lint +``` + +### Ansible-lint disable entire file + +```yml +- name: this would typically fire GitHasVersionRule 401 + git: src=/path/to/git/repo dest=checkout + tags: + - skip_ansible_lint +``` + +--- + +## AWS CloudFormation templates + +- [cfn-lint](https://github.com/aws-cloudformation/cfn-python-lint/) + +### cfn-lint Config file + +- `.github/linters/.cfnlintrc.yml` +- You can pass multiple rules and overwrite default rules +- File should be located at: `.github/linters/.cfnlintrc.yml` + +### cfn-lint disable single line + +- There is currently **No** way to disable rules inline of the file(s) + +### cfn-lint disable code block + +You can disable both [template](https://github.com/aws-cloudformation/cfn-python-lint/#template-based-metadata) or [resource](https://github.com/aws-cloudformation/cfn-python-lint/#resource-based-metadata) via [metadata](https://github.com/aws-cloudformation/cfn-python-lint/#metadata): + +```yaml +Resources: + myInstance: + Type: AWS::EC2::Instance + Metadata: + cfn-lint: + config: + ignore_checks: + - E3030 + Properties: + InstanceType: nt.x4superlarge + ImageId: ami-abc1234 +``` + +### cfn-lint disable entire file + +If you need to ignore an entire file, you can update the `.github/linters/.cfnlintrc.yml` to ignore certain files and locations + +```yaml +ignore_templates: + - codebuild.yaml +``` + +--- + +## Clojure + +- [clj-kondo](https://github.com/borkdude/clj-kondo) +- Since clj-kondo approaches static analysis in a very Clojure way, it is advised to read the [configuration docs](https://github.com/borkdude/clj-kondo/blob/master/doc/config.md) + +### clj-kondo standard Config file + +- `.github/linters/.clj-kondo/config.edn` + +### clj-kondo disable single line + +- There is currently **No** way to disable rules in a single line + +### clj-kondo disable code block + +- There is currently **No** way to disable rules in a code block + +### clj-kondo disable entire file + +```clojure +{:output {:exclude-files ["path/to/file"]}} +``` + +--- + +## Coffeescript + +- [coffeelint](https://coffeelint.github.io/) + +### coffeelint Config file + +- `.github/linters/.coffee-lint.yml` +- You can pass multiple rules and overwrite default rules +- File should be located at: `.github/linters/.coffee.yml` + +### coffeelint disable single line + +```Coffeescript +# coffeelint: disable=max_line_length +foo = "some/huge/line/string/with/embed/#{values}.that/surpasses/the/max/column/width" +# coffeelint: enable=max_line_length +``` + +### coffeelint disable code block + +```Coffeescript +# coffeelint: disable +foo = "some/huge/line/string/with/embed/#{values}.that/surpasses/the/max/column/width" +bar = "some/huge/line/string/with/embed/#{values}.that/surpasses/the/max/column/width" +baz = "some/huge/line/string/with/embed/#{values}.that/surpasses/the/max/column/width" +taz = "some/huge/line/string/with/embed/#{values}.that/surpasses/the/max/column/width" +# coffeelint: enable +``` + +### coffeelint disable entire file + +- You can encapsulate the entire file with the _code block format_ to disable an entire file from being parsed + +--- + +## CSS + +- [stylelint](https://stylelint.io/) + +### stylelint standard Config file + +- `.github/linters/.stylelintrc.json` + +### stylelint disable single line + +```css +#id { + /* stylelint-disable-next-line declaration-no-important */ + color: pink !important; +} +``` + +### stylelint disable code block + +```css +/* stylelint-disable */ +a { +} +/* stylelint-enable */ +``` + +### stylelint disable entire file + +- You can disable entire files with the `ignoreFiles` property in `.stylelintrc.json` + +```json +{ + "ignoreFiles": [ + "styles/ignored/wildcards/*.css", + "styles/ignored/specific-file.css" + ] +} +``` + +--- + +## Dart + +- [dartanalyzer](https://dart.dev/tools/dartanalyzer) + +### dartanalyzer standard Config file + +- `.github/linters/.dart-lint.yml` +- You can pass multiple rules and overwrite default rules +- File should be located at: `.github/linters/anaylsis_options.yaml` + +### dartanalyzer disable single line + +```dart +int x = ''; // ignore: invalid_assignment +``` + +### dartanalyzer disable code block + +- You can make [rule exceptions](https://dart.dev/guides/language/analysis-options#excluding-code-from-analysis) for the entire file. + +```dart +// ignore_for_file: unused_import, unused_local_variable +``` + +### dartanalyzer disable entire file + +- You can disable entire files with the `analyzer.exclude` property in `anaylsis_options.yaml` + +```dart +analyzer: + exclude: + - file +``` + +--- + +## Dockerfile + +- [dockerfilelint](https://github.com/replicatedhq/dockerfilelint.git) + +### Dockerfilelint standard Config file + +- `.github/linters/.dockerfilelintrc` +- You can pass multiple rules and overwrite default rules +- File should be located at: `.github/linters/.dockerfilelintrc` + +### Dockerfilelint disable single line + +- There is currently **No** way to disable rules inline of the file(s) + +### Dockerfilelint disable code block + +- There is currently **No** way to disable rules inline of the file(s) + +### Dockerfilelint disable entire file + +- There is currently **No** way to disable rules inline of the file(s) + +--- + +## EDITORCONFIG-CHECKER +- [editorconfig-checker](https://github.com/editorconfig-checker/editorconfig-checker) + +### editorconfig-checker Config file +- `.github/linters/.ecrc` +- This linter will also use the [`.editorconfig`](https://editorconfig.org/) of your project + +### editorconfig-checker disable single line + +```js + // editorconfig-checker-disable-line +``` + +### editorconfig-checker disable code block + +- There is currently **No** way to disable rules inline of the file(s) + +### editorconfig-checker disable entire file + +```js +// editorconfig-checker-disable-file +``` + +- You can disable entire files with the `Exclude` property in `.ecrc` + +```json +{ + "Exclude": ["path/to/file", "^regular\\/expression\\.ext$"] +} +``` + +--- + +## ENV + +- [dotenv-linter](https://github.com/dotenv-linter/dotenv-linter) + +### dotenv-linter Config file + +- There is no top level _configuration file_ available at this time + +### dotenv-linter disable single line + +```env +# Comment line will be ignored +``` + +### dotenv-linter disable code block + +- There is currently **No** way to disable rules inline of the file(s) + +### dotenv-linter disable entire file + +- There is currently **No** way to disable rules inline of the file(s) + +--- + +## Golang + +- [golangci-lint](https://github.com/golangci/golangci-lint) + +### golangci-lint standard Config file + +- `.github/linters/.golangci.yml` +- You can pass multiple rules and overwrite default rules +- File should be located at: `.github/linters/.golangci.yml` + +### golangci-lint disable single line + +- There is currently **No** way to disable rules inline of the file(s) + +### golangci-lint disable code block + +- There is currently **No** way to disable rules inline of the file(s) + +### golangci-lint disable entire file + +- There is currently **No** way to disable rules inline of the file(s) + +--- + +## Groovy +- [npm-groovy-lint](https://github.com/nvuillam/npm-groovy-lint) + +### groovy-lint standard Config file +- `.github/linters/.groovylintrc.json` +- You can pass multiple rules and overwrite default rules +- File should be located at: `.github/linters/.groovylintrc.json` + +### groovy-lint disable single line +```groovy +def variable = 1; // groovylint-disable-line + +// groovylint-disable-next-line +def variable = 1; + +/* groovylint-disable-next-line */ +def variable = 1; + +def variable = 1; /* groovylint-disable-line */ +``` + +### groovy-lint disable code block +```groovy +/* groovylint-disable */ + +def variable = 1; + +/* groovylint-enable */ +``` + +### groovy-lint disable entire file +- At the top line of the file add the line: +```groovy +/* groovylint-disable */ +``` + +--- + +## HTML + +- [htmlhint](https://htmlhint.com/) + +### htmlhint standard Config file + +- `.github/linters/.htmlhintrc` + +### htmlhint disable single line + +- There is currently **No** way to disable rules in a single line + +### htmlhint disable code block + +- There is currently **No** way to disable rules in a code block + +### htmlhint disable entire file + +- There is currently **No** way to disable rules in an entire file + +--- + +## Javascript eslint + +- [eslint](https://eslint.org/) + +### Javascript eslint Config file + +- `.github/linters/.eslintrc.yml` +- You can pass multiple rules and overwrite default rules +- File should be located at: `.github/linters/.eslintrc.yml` + +### Javascript eslint disable single line + +```javascript +var thing = new Thing(); // eslint-disable-line no-use-before-define +thing.sayHello(); + +function Thing() { + this.sayHello = function () { + console.log("hello"); + }; +} +``` + +### Javascript eslint disable code block + +```javascript +/*eslint-disable */ + +//suppress all warnings between comments +alert("foo"); + +/*eslint-enable */ +``` + +### Javascript eslint disable entire file + +- Place at the top of the file: + +```javascript +/* eslint-disable */ +``` + +--- + +## Javascript standard + +- [standard js](https://standardjs.com/) + +### Javascript standard Config file + +- There is no top level _configuration file_ available at this time + +### Javascript standard disable single line + +- There is currently **No** way to disable rules inline of the file(s) + +### Javascript standard disable code block + +- There is currently **No** way to disable rules inline of the file(s) + +### Javascript standard disable entire file + +- There is currently **No** way to disable rules inline of the file(s) + +--- + +## JSON + +- [jsonlint](https://github.com/zaach/jsonlint) + +### JsonLint Config file + +- There is no top level _configuration file_ available at this time + +### JsonLint disable single line + +- There is currently **No** way to disable rules inline of the file(s) + +### JsonLint disable code block + +- There is currently **No** way to disable rules inline of the file(s) + +### JsonLint disable entire file + +- There is currently **No** way to disable rules inline of the file(s) + +--- + +## Kotlin + +- [ktlint](https://github.com/pinterest/ktlint) + +### ktlint Config file + +- There is no top level _configuration file_ available at this time + +### ktlint disable single line + +```kotlin +import package.* // ktlint-disable no-wildcard-imports +``` + +### ktlint disable code block + +```kotlin +/* ktlint-disable no-wildcard-imports */ +import package.a.* +import package.b.* +/* ktlint-enable no-wildcard-imports */ +``` + +### ktlint disable entire file + +- There is currently **No** way to disable rules inline of the file(s) + +--- + +## Lua + +- [luarocks](https://github.com/luarocks/luacheck) + +### luacheck standard Config file +- `.github/linters/.luacheckrc` +- You can pass multiple rules and overwrite default rules +- File should be located at: `.github/linters/.luacheckrc` +- See [luacheck](https://luacheck.readthedocs.io/en/stable/config.html) docs for additional + behaviors + +### luacheck disable single line +```lua +-- luacheck: globals g1 g2, ignore foo +local foo = g1(g2) -- No warnings emitted. +``` + +### luacheck disable code block +```lua +-- The following unused function is not reported. +local function f() -- luacheck: ignore + -- luacheck: globals g3 + g3() -- No warning. +end +``` + +### luacheck include/exclude files (via .luacheckrc) +```lua +include_files = {"src", "spec/*.lua", "scripts/*.lua", "*.rockspec", "*.luacheckrc"} +exclude_files = {"src/luacheck/vendor"} +``` + +### luacheck push/pop +```lua +-- luacheck: push ignore foo +foo() -- No warning. +-- luacheck: pop +foo() -- Warning is emitted. +``` + +--- + +## Markdown + +- [markdownlint-cli](https://github.com/igorshubovych/markdownlint-cli#readme) +- [markdownlint rule documentation](https://github.com/DavidAnson/markdownlint/blob/main/doc/Rules.md) +- [markdownlint inline comment syntax](https://github.com/DavidAnson/markdownlint#configuration) + +### markdownlint Config file + +- You can pass multiple rules and overwrite default rules +- File should be located at: `.github/linters/.markdown-lint.yml` + +### markdownlint disable single line + +```markdown +## Here is some document + +Here is some random data + + + +any violation you want + + + +Here is more data + +``` + +### markdownlint disable code block + +```markdown +## Here is some document + +Here is some random data + + + +any violations you want + + + +Here is more data +``` + +### markdownlint disable entire file + +- You can encapsulate the entire file with the _code block format_ to disable an entire file from being parsed + +--- + +## OpenAPI + +- [spectral](https://github.com/stoplightio/spectral) + +### OpenAPI Config file + +- `.github/linters/.openapirc.yml` +- You can add, extend, and disable rules +- Documentation at [Spectral Custom Rulesets](https://stoplight.io/p/docs/gh/stoplightio/spectral/docs/guides/4-custom-rulesets.md) +- File should be located at: `.github/linters/.openapirc.yml` + +### OpenAPI disable single line + +- There is currently **No** way to disable rules inline of the file(s) + +### OpenAPI disable code block + +- There is currently **No** way to disable rules inline of the file(s) + +### OpenAPI disable entire file + +- There is currently **No** way to disable rules inline of the file(s) +- However, you can make [rule exceptions](https://stoplight.io/p/docs/gh/stoplightio/spectral/docs/guides/6-exceptions.md?srn=gh/stoplightio/spectral/docs/guides/6-exceptions.md) in the config for individual file(s). + +--- + +## Perl + +- [perl](https://pkgs.alpinelinux.org/package/edge/main/x86/perl) + +### Perl Config file + +- There is no top level _configuration file_ available at this time + +### Perl disable single line + +- There is currently **No** way to disable rules inline of the file(s) + +### Perl disable code block + +- There is currently **No** way to disable rules inline of the file(s) + +### Perl disable entire file + +- There is currently **No** way to disable rules inline of the file(s) + +--- + +## PHP + +- [PHP](https://www.php.net/) + +### PHP Config file + +- There is no top level _configuration file_ available at this time + +### PHP disable single line + +- There is currently **No** way to disable rules inline of the file(s) + +### PHP disable code block + +- There is currently **No** way to disable rules inline of the file(s) + +### PHP disable entire file + +- There is currently **No** way to disable rules inline of the file(s) + +--- + +## Protocol Buffers + +- [protolint](https://github.com/yoheimuta/protolint) + +### protolint Config file + +- `.github/linters/.protolintrc.yml` +- You can add, extend, and disable rules +- Documentation at [Rules](https://github.com/yoheimuta/protolint#rules) and [Configuring](https://github.com/yoheimuta/protolint#configuring) + +### protolint disable single line + +```protobuf +enum Foo { + // protolint:disable:next ENUM_FIELD_NAMES_UPPER_SNAKE_CASE + firstValue = 0; + second_value = 1; // protolint:disable:this ENUM_FIELD_NAMES_UPPER_SNAKE_CASE + THIRD_VALUE = 2; +} +``` + +### protolint disable code block + +```protobuf +// protolint:disable ENUM_FIELD_NAMES_UPPER_SNAKE_CASE +enum Foo { + firstValue = 0; + second_value = 1; + THIRD_VALUE = 2; +} +// protolint:enable ENUM_FIELD_NAMES_UPPER_SNAKE_CASE +``` + +### protolint disable entire file + +- You can disable entire files with the `lint.files.exclude` property in `.protolintrc.yml` + +```yaml +# Lint directives. +lint: + # Linter files to walk. + files: + # The specific files to exclude. + exclude: + - path/to/file +``` + +--- + +## Python3 pylint + +- [pylint](https://www.pylint.org/) + +### Pylint Config file + +- `.github/linters/.python-lint` +- You can pass multiple rules and overwrite default rules +- File should be located at: `.github/linters/.python-lint` + +### Pylint disable single line + +```python +global VAR # pylint: disable=global-statement +``` + +### Pylint disable code block + +```python +"""pylint option block-disable""" + +__revision__ = None + +class Foo(object): + """block-disable test""" + + def __init__(self): + pass + + def meth1(self, arg): + """this issues a message""" + print(self) + + def meth2(self, arg): + """and this one not""" + # pylint: disable=unused-argument + print(self\ + + "foo") + + def meth3(self): + """test one line disabling""" + # no error + print(self.baz) # pylint: disable=no-member + # error + print(self.baz) +``` + +### Pylint disable entire file + +```python +#!/bin/python3 +# pylint: skip-file + +var = "terrible code down here..." +``` + +--- + +## Python3 flake8 + +- [flake8](https://flake8.pycqa.org/en/latest/) + +### flake8 Config file + +- `.github/linters/.flake8` +- You can pass multiple rules and overwrite default rules +- File should be located at: `.github/linters/.flake8` + +### flake8 disable single line + +```python +example = lambda: 'example' # noqa: E731 +``` + +### flake8 disable entire file + +```python +#!/bin/python3 +# flake8: noqa + +var = "terrible code down here..." +``` + +--- + +## Raku + +- [raku](https://raku.org) + +### Raku Config file + +- There is no top level _configuration file_ available at this time + +### Raku disable single line + +- There is currently **No** way to disable rules inline of the file(s) + +### Raku disable code block + +- There is currently **No** way to disable rules inline of the file(s) + +### Raku disable entire file + +- There is currently **No** way to disable rules inline of the file(s) + + --- ## Ruby @@ -141,452 +963,25 @@ moreThings() --- -## Ansible +## Terraform -- [ansible-lint](https://github.com/ansible/ansible-lint) +- [tflint](https://github.com/terraform-linters/tflint) -### Ansible-lint Config file +### tflint standard Config file -- `.github/linters/.ansible-lint.yml` +- `.github/linters/.tflint.hcl` - You can pass multiple rules and overwrite default rules -- File should be located at: `.github/linters/.ansible-lint.yml` +- File should be located at: `.github/linters/.tflint.hcl` -### Ansible-lint disable single line - -```yml -- name: this would typically fire GitHasVersionRule 401 and BecomeUserWithoutBecomeRule 501 - become_user: alice # noqa 401 501 - git: src=/path/to/git/repo dest=checkout -``` - -### Ansible-lint disable code block - -```yml -- name: this would typically fire GitHasVersionRule 401 - git: src=/path/to/git/repo dest=checkout - tags: - - skip_ansible_lint -``` - -### Ansible-lint disable entire file - -```yml -- name: this would typically fire GitHasVersionRule 401 - git: src=/path/to/git/repo dest=checkout - tags: - - skip_ansible_lint -``` - ---- - -## YAML - -- [YamlLint](https://github.com/adrienverge/yamllint) - -### Yamllint Config file - -- `.github/linters/.yaml-lint.yml` -- You can pass multiple rules and overwrite default rules -- File should be located at: `.github/linters/.yaml-lint.yml` - -### Yamllint disable single line - -```yml -This line is waaaaaaaaaay too long # yamllint disable-line -``` - -### Yamllint disable code block - -```yml -# yamllint disable rule:colons -- Key: value - dolor: sit, - foo: bar -# yamllint enable -``` - -### Yamllint disable entire file - -If you need to ignore an entire file, you can update the `.github/linters/.yaml-lint.yml` to ignore certain files and locations - -```yml -# For all rules -ignore: | - *.dont-lint-me.yaml - /bin/ - !/bin/*.lint-me-anyway.yaml - -rules: - key-duplicates: - ignore: | - generated - *.template.yaml - trailing-spaces: - ignore: | - *.ignore-trailing-spaces.yaml - /ascii-art/* -``` - ---- - -## Python3 - -- [pylint](https://www.pylint.org/) - -### Pylint Config file - -- `.github/linters/.python-lint` -- You can pass multiple rules and overwrite default rules -- File should be located at: `.github/linters/.python-lint` - -### Pylint disable single line - -```python -global VAR # pylint: disable=global-statement -``` - -### Pylint disable code block - -```python -"""pylint option block-disable""" - -__revision__ = None - -class Foo(object): - """block-disable test""" - - def __init__(self): - pass - - def meth1(self, arg): - """this issues a message""" - print(self) - - def meth2(self, arg): - """and this one not""" - # pylint: disable=unused-argument - print(self\ - + "foo") - - def meth3(self): - """test one line disabling""" - # no error - print(self.baz) # pylint: disable=no-member - # error - print(self.baz) -``` - -### Pylint disable entire file - -```python -#!/bin/python3 -# pylint: skip-file - -var = "terrible code down here..." -``` - ---- - -## AWS CloudFormation templates - -- [cfn-lint](https://github.com/aws-cloudformation/cfn-python-lint/) - -### cfn-lint Config file - -- `.github/linters/.cfnlintrc.yml` -- You can pass multiple rules and overwrite default rules -- File should be located at: `.github/linters/.cfnlintrc.yml` - -### cfn-lint disable single line +### tflint disable single line - There is currently **No** way to disable rules inline of the file(s) -### cfn-lint disable code block - -You can disable both [template](https://github.com/aws-cloudformation/cfn-python-lint/#template-based-metadata) or [resource](https://github.com/aws-cloudformation/cfn-python-lint/#resource-based-metadata) via [metadata](https://github.com/aws-cloudformation/cfn-python-lint/#metadata): - -```yaml -Resources: - myInstance: - Type: AWS::EC2::Instance - Metadata: - cfn-lint: - config: - ignore_checks: - - E3030 - Properties: - InstanceType: nt.x4superlarge - ImageId: ami-abc1234 -``` - -### cfn-lint disable entire file - -If you need to ignore an entire file, you can update the `.github/linters/.cfnlintrc.yml` to ignore certain files and locations - -```yaml -ignore_templates: - - codebuild.yaml -``` - ---- - -## JSON - -- [jsonlint](https://github.com/zaach/jsonlint) - -### JsonLint Config file - -- There is no top level _configuration file_ available at this time - -### JsonLint disable single line +### tflint disable code block - There is currently **No** way to disable rules inline of the file(s) -### JsonLint disable code block - -- There is currently **No** way to disable rules inline of the file(s) - -### JsonLint disable entire file - -- There is currently **No** way to disable rules inline of the file(s) - ---- - -## Markdown - -- [markdownlint-cli](https://github.com/igorshubovych/markdownlint-cli#readme) -- [markdownlint rule documentation](https://github.com/DavidAnson/markdownlint/blob/main/doc/Rules.md) -- [markdownlint inline comment syntax](https://github.com/DavidAnson/markdownlint#configuration) - -### markdownlint Config file - -- You can pass multiple rules and overwrite default rules -- File should be located at: `.github/linters/.markdown-lint.yml` - -### markdownlint disable single line - -```markdown -## Here is some document - -Here is some random data - - - -any violation you want - - - -Here is more data -``` - -### markdownlint disable code block - -```markdown -## Here is some document - -Here is some random data - - - -any violations you want - - - -Here is more data -``` - -### markdownlint disable entire file - -- You can encapsulate the entire file with the _code block format_ to disable an entire file from being parsed - ---- - -## Perl - -- [perl](https://pkgs.alpinelinux.org/package/edge/main/x86/perl) - -### Perl Config file - -- There is no top level _configuration file_ available at this time - -### Perl disable single line - -- There is currently **No** way to disable rules inline of the file(s) - -### Perl disable code block - -- There is currently **No** way to disable rules inline of the file(s) - -### Perl disable entire file - -- There is currently **No** way to disable rules inline of the file(s) - ---- - -## Raku - -- [raku](https://raku.org) - -### Raku Config file - -- There is no top level _configuration file_ available at this time - -### Raku disable single line - -- There is currently **No** way to disable rules inline of the file(s) - -### Raku disable code block - -- There is currently **No** way to disable rules inline of the file(s) - -### Raku disable entire file - -- There is currently **No** way to disable rules inline of the file(s) - ---- - ---- - -## PHP - -- [PHP](https://www.php.net/) - -### PHP Config file - -- There is no top level _configuration file_ available at this time - -### PHP disable single line - -- There is currently **No** way to disable rules inline of the file(s) - -### PHP disable code block - -- There is currently **No** way to disable rules inline of the file(s) - -### PHP disable entire file - -- There is currently **No** way to disable rules inline of the file(s) - ---- - -## XML - -- [XML](http://xmlsoft.org/) - -### LibXML Config file - -- There is no top level _configuration file_ available at this time - -### LibXML disable single line - -- There is currently **No** way to disable rules inline of the file(s) - -### LibXML disable code block - -- There is currently **No** way to disable rules inline of the file(s) - -### LibXML disable entire file - -- There is currently **No** way to disable rules inline of the file(s) - ---- - -## Coffeescript - -- [coffeelint](https://coffeelint.github.io/) - -### coffeelint Config file - -- `.github/linters/.coffee-lint.yml` -- You can pass multiple rules and overwrite default rules -- File should be located at: `.github/linters/.coffee.yml` - -### coffeelint disable single line - -```Coffeescript -# coffeelint: disable=max_line_length -foo = "some/huge/line/string/with/embed/#{values}.that/surpasses/the/max/column/width" -# coffeelint: enable=max_line_length -``` - -### coffeelint disable code block - -```Coffeescript -# coffeelint: disable -foo = "some/huge/line/string/with/embed/#{values}.that/surpasses/the/max/column/width" -bar = "some/huge/line/string/with/embed/#{values}.that/surpasses/the/max/column/width" -baz = "some/huge/line/string/with/embed/#{values}.that/surpasses/the/max/column/width" -taz = "some/huge/line/string/with/embed/#{values}.that/surpasses/the/max/column/width" -# coffeelint: enable -``` - -### coffeelint disable entire file - -- You can encapsulate the entire file with the _code block format_ to disable an entire file from being parsed - ---- - -## Javascript eslint - -- [eslint](https://eslint.org/) - -### Javascript eslint Config file - -- `.github/linters/.eslintrc.yml` -- You can pass multiple rules and overwrite default rules -- File should be located at: `.github/linters/.eslintrc.yml` - -### Javascript eslint disable single line - -```javascript -var thing = new Thing(); // eslint-disable-line no-use-before-define -thing.sayHello(); - -function Thing() { - this.sayHello = function () { - console.log("hello"); - }; -} -``` - -### Javascript eslint disable code block - -```javascript -/*eslint-disable */ - -//suppress all warnings between comments -alert("foo"); - -/*eslint-enable */ -``` - -### Javascript eslint disable entire file - -- Place at the top of the file: - -```javascript -/* eslint-disable */ -``` - ---- - -## Javascript standard - -- [standard js](https://standardjs.com/) - -### Javascript standard Config file - -- There is no top level _configuration file_ available at this time - -### Javascript standard disable single line - -- There is currently **No** way to disable rules inline of the file(s) - -### Javascript standard disable code block - -- There is currently **No** way to disable rules inline of the file(s) - -### Javascript standard disable entire file +### tflint disable entire file - There is currently **No** way to disable rules inline of the file(s) @@ -656,431 +1051,72 @@ alert("foo"); --- -## Golang +## XML -- [golangci-lint](https://github.com/golangci/golangci-lint) +- [XML](http://xmlsoft.org/) -### golangci-lint standard Config file - -- `.github/linters/.golangci.yml` -- You can pass multiple rules and overwrite default rules -- File should be located at: `.github/linters/.golangci.yml` - -### golangci-lint disable single line - -- There is currently **No** way to disable rules inline of the file(s) - -### golangci-lint disable code block - -- There is currently **No** way to disable rules inline of the file(s) - -### golangci-lint disable entire file - -- There is currently **No** way to disable rules inline of the file(s) - ---- - -## Groovy -- [npm-groovy-lint](https://github.com/nvuillam/npm-groovy-lint) - -### groovy-lint standard Config file -- `.github/linters/.groovylintrc.json` -- You can pass multiple rules and overwrite default rules -- File should be located at: `.github/linters/.groovylintrc.json` - -### groovy-lint disable single line -```groovy -def variable = 1; // groovylint-disable-line - -// groovylint-disable-next-line -def variable = 1; - -/* groovylint-disable-next-line */ -def variable = 1; - -def variable = 1; /* groovylint-disable-line */ -``` - -### groovy-lint disable code block -```groovy -/* groovylint-disable */ - -def variable = 1; - -/* groovylint-enable */ -``` - -### groovy-lint disable entire file -- At the top line of the file add the line: -```groovy -/* groovylint-disable */ -``` - ---- - -## Dockerfile - -- [dockerfilelint](https://github.com/replicatedhq/dockerfilelint.git) - -### Dockerfilelint standard Config file - -- `.github/linters/.dockerfilelintrc` -- You can pass multiple rules and overwrite default rules -- File should be located at: `.github/linters/.dockerfilelintrc` - -### Dockerfilelint disable single line - -- There is currently **No** way to disable rules inline of the file(s) - -### Dockerfilelint disable code block - -- There is currently **No** way to disable rules inline of the file(s) - -### Dockerfilelint disable entire file - -- There is currently **No** way to disable rules inline of the file(s) - ---- - -## Terraform - -- [tflint](https://github.com/terraform-linters/tflint) - -### tflint standard Config file - -- `.github/linters/.tflint.hcl` -- You can pass multiple rules and overwrite default rules -- File should be located at: `.github/linters/.tflint.hcl` - -### tflint disable single line - -- There is currently **No** way to disable rules inline of the file(s) - -### tflint disable code block - -- There is currently **No** way to disable rules inline of the file(s) - -### tflint disable entire file - -- There is currently **No** way to disable rules inline of the file(s) - ---- - -## CSS - -- [stylelint](https://stylelint.io/) - -### stylelint standard Config file - -- `.github/linters/.stylelintrc.json` - -### stylelint disable single line - -```css -#id { - /* stylelint-disable-next-line declaration-no-important */ - color: pink !important; -} -``` - -### stylelint disable code block - -```css -/* stylelint-disable */ -a { -} -/* stylelint-enable */ -``` - -### stylelint disable entire file - -- You can disable entire files with the `ignoreFiles` property in `.stylelintrc.json` - -```json -{ - "ignoreFiles": [ - "styles/ignored/wildcards/*.css", - "styles/ignored/specific-file.css" - ] -} -``` - ---- - -## ENV - -- [dotenv-linter](https://github.com/dotenv-linter/dotenv-linter) - -### dotenv-linter Config file +### LibXML Config file - There is no top level _configuration file_ available at this time -### dotenv-linter disable single line - -```env -# Comment line will be ignored -``` - -### dotenv-linter disable code block +### LibXML disable single line - There is currently **No** way to disable rules inline of the file(s) -### dotenv-linter disable entire file +### LibXML disable code block + +- There is currently **No** way to disable rules inline of the file(s) + +### LibXML disable entire file - There is currently **No** way to disable rules inline of the file(s) --- -## Kotlin +## YAML -- [ktlint](https://github.com/pinterest/ktlint) +- [YamlLint](https://github.com/adrienverge/yamllint) -### ktlint Config file +### Yamllint Config file -- There is no top level _configuration file_ available at this time - -### ktlint disable single line - -```kotlin -import package.* // ktlint-disable no-wildcard-imports -``` - -### ktlint disable code block - -```kotlin -/* ktlint-disable no-wildcard-imports */ -import package.a.* -import package.b.* -/* ktlint-enable no-wildcard-imports */ -``` - -### ktlint disable entire file - -- There is currently **No** way to disable rules inline of the file(s) - ---- - -## Lua -- [luarocks](https://github.com/luarocks/luacheck) - -### luacheck standard Config file -- `.github/linters/.luacheckrc` +- `.github/linters/.yaml-lint.yml` - You can pass multiple rules and overwrite default rules -- File should be located at: `.github/linters/.luacheckrc` -- See [luacheck](https://luacheck.readthedocs.io/en/stable/config.html) docs for additional - behaviors +- File should be located at: `.github/linters/.yaml-lint.yml` -### luacheck disable single line -```lua --- luacheck: globals g1 g2, ignore foo -local foo = g1(g2) -- No warnings emitted. +### Yamllint disable single line + +```yml +This line is waaaaaaaaaay too long # yamllint disable-line ``` -### luacheck disable code block -```lua --- The following unused function is not reported. -local function f() -- luacheck: ignore - -- luacheck: globals g3 - g3() -- No warning. -end +### Yamllint disable code block + +```yml +# yamllint disable rule:colons +- Key: value + dolor: sit, + foo: bar +# yamllint enable ``` -### luacheck include/exclude files (via .luacheckrc) -```lua -include_files = {"src", "spec/*.lua", "scripts/*.lua", "*.rockspec", "*.luacheckrc"} -exclude_files = {"src/luacheck/vendor"} +### Yamllint disable entire file + +If you need to ignore an entire file, you can update the `.github/linters/.yaml-lint.yml` to ignore certain files and locations + +```yml +# For all rules +ignore: | + *.dont-lint-me.yaml + /bin/ + !/bin/*.lint-me-anyway.yaml + +rules: + key-duplicates: + ignore: | + generated + *.template.yaml + trailing-spaces: + ignore: | + *.ignore-trailing-spaces.yaml + /ascii-art/* ``` - -### luacheck push/pop -```lua --- luacheck: push ignore foo -foo() -- No warning. --- luacheck: pop -foo() -- Warning is emitted. -``` ---- - -## Dart - -- [dartanalyzer](https://dart.dev/tools/dartanalyzer) - -### dartanalyzer standard Config file - -- `.github/linters/.dart-lint.yml` -- You can pass multiple rules and overwrite default rules -- File should be located at: `.github/linters/anaylsis_options.yaml` - -### dartanalyzer disable single line - -```dart -int x = ''; // ignore: invalid_assignment -``` - -### dartanalyzer disable code block - -- You can make [rule exceptions](https://dart.dev/guides/language/analysis-options#excluding-code-from-analysis) for the entire file. - -```dart -// ignore_for_file: unused_import, unused_local_variable -``` - -### dartanalyzer disable entire file - -- You can disable entire files with the `analyzer.exclude` property in `anaylsis_options.yaml` - -```dart -analyzer: - exclude: - - file -``` - ---- - -## OpenAPI - -- [spectral](https://github.com/stoplightio/spectral) - -### OpenAPI Config file - -- `.github/linters/.openapirc.yml` -- You can add, extend, and disable rules -- Documentation at [Spectral Custom Rulesets](https://stoplight.io/p/docs/gh/stoplightio/spectral/docs/guides/4-custom-rulesets.md) -- File should be located at: `.github/linters/.openapirc.yml` - -### OpenAPI disable single line - -- There is currently **No** way to disable rules inline of the file(s) - -### OpenAPI disable code block - -- There is currently **No** way to disable rules inline of the file(s) - -### OpenAPI disable entire file - -- There is currently **No** way to disable rules inline of the file(s) -- However, you can make [rule exceptions](https://stoplight.io/p/docs/gh/stoplightio/spectral/docs/guides/6-exceptions.md?srn=gh/stoplightio/spectral/docs/guides/6-exceptions.md) in the config for individual file(s). - ---- - -## Protocol Buffers - -- [protolint](https://github.com/yoheimuta/protolint) - -### protolint Config file - -- `.github/linters/.protolintrc.yml` -- You can add, extend, and disable rules -- Documentation at [Rules](https://github.com/yoheimuta/protolint#rules) and [Configuring](https://github.com/yoheimuta/protolint#configuring) - -### protolint disable single line - -```protobuf -enum Foo { - // protolint:disable:next ENUM_FIELD_NAMES_UPPER_SNAKE_CASE - firstValue = 0; - second_value = 1; // protolint:disable:this ENUM_FIELD_NAMES_UPPER_SNAKE_CASE - THIRD_VALUE = 2; -} -``` - -### protolint disable code block - -```protobuf -// protolint:disable ENUM_FIELD_NAMES_UPPER_SNAKE_CASE -enum Foo { - firstValue = 0; - second_value = 1; - THIRD_VALUE = 2; -} -// protolint:enable ENUM_FIELD_NAMES_UPPER_SNAKE_CASE -``` - -### protolint disable entire file - -- You can disable entire files with the `lint.files.exclude` property in `.protolintrc.yml` - -```yaml -# Lint directives. -lint: - # Linter files to walk. - files: - # The specific files to exclude. - exclude: - - path/to/file -``` - -## Clojure - -- [clj-kondo](https://github.com/borkdude/clj-kondo) -- Since clj-kondo approaches static analysis in a very Clojure way, it is advised to read the [configuration docs](https://github.com/borkdude/clj-kondo/blob/master/doc/config.md) - -### clj-kondo standard Config file - -- `.github/linters/.clj-kondo/config.edn` - -### clj-kondo disable single line - -- There is currently **No** way to disable rules in a single line - -### clj-kondo disable code block - -- There is currently **No** way to disable rules in a code block - -### clj-kondo disable entire file - -```clojure -{:output {:exclude-files ["path/to/file"]}} -``` - -## EDITORCONFIG-CHECKER -- [editorconfig-checker](https://github.com/editorconfig-checker/editorconfig-checker) - -### editorconfig-checker Config file -- `.github/linters/.ecrc` -- This linter will also use the [`.editorconfig`](https://editorconfig.org/) of your project - -### editorconfig-checker disable single line -- -```js - // editorconfig-checker-disable-line -``` - -### editorconfig-checker disable code block - -- There is currently **No** way to disable rules inline of the file(s) - -### editorconfig-checker disable entire file - -- - -```js -// editorconfig-checker-disable-file -``` - -- You can disable entire files with the `Exclude` property in `.ecrc` - -```json -{ - "Exclude": ["path/to/file", "^regular\\/expression\\.ext$"] -} -``` - -## HTML - -- [htmlhint](https://htmlhint.com/) - -### htmlhint standard Config file - -- `.github/linters/.htmlhintrc` - -### htmlhint disable single line - -- There is currently **No** way to disable rules in a single line - -### htmlhint disable code block - -- There is currently **No** way to disable rules in a code block - -### htmlhint disable entire file - -- There is currently **No** way to disable rules in an entire file diff --git a/lib/buildFileList.sh b/lib/buildFileList.sh index 05cdf29f..7e1ad63e 100755 --- a/lib/buildFileList.sh +++ b/lib/buildFileList.sh @@ -263,7 +263,8 @@ function BuildFileList() { ################################ # Append the file to the array # ################################ - FILE_ARRAY_PYTHON+=("${FILE}") + FILE_ARRAY_PYTHON_PYLINT+=("${FILE}") + FILE_ARRAY_PYTHON_FLAKE8+=("${FILE}") ########################################################## # Set the READ_ONLY_CHANGE_FLAG since this could be exec # ########################################################## diff --git a/lib/linter.sh b/lib/linter.sh index 5ccbafaf..464b8a53 100755 --- a/lib/linter.sh +++ b/lib/linter.sh @@ -78,8 +78,10 @@ POWERSHELL_LINTER_RULES="${DEFAULT_RULES_LOCATION}/${POWERSHELL_FILE_NAME}" PROTOBUF_FILE_NAME='.protolintrc.yml' # Name of the file PROTOBUF_LINTER_RULES="${DEFAULT_RULES_LOCATION}/${PROTOBUF_FILE_NAME}" # Path to the Protocol Buffers lint rules # Python Vars -PYTHON_FILE_NAME='.python-lint' # Name of the file -PYTHON_LINTER_RULES="${DEFAULT_RULES_LOCATION}/${PYTHON_FILE_NAME}" # Path to the python lint rules +PYTHON_PYLINT_FILE_NAME="${PYTHON_PYLINT_CONFIG_FILE:-.python-lint}" # Name of the file +PYTHON_PYLINT_LINTER_RULES="${DEFAULT_RULES_LOCATION}/${PYTHON_PYLINT_FILE_NAME}" # Path to the python lint rules +PYTHON_FLAKE8_FILE_NAME="${PYTHON_FLAKE8_CONFIG_FILE:-.flake8}" # Name of the file +PYTHON_FLAKE8_LINTER_RULES="${DEFAULT_RULES_LOCATION}/${PYTHON_FLAKE8_FILE_NAME}" # Path to the python lint rules # Ruby Vars RUBY_FILE_NAME="${RUBY_CONFIG_FILE:-.ruby-lint.yml}" # Name of the file RUBY_LINTER_RULES="${DEFAULT_RULES_LOCATION}/${RUBY_FILE_NAME}" # Path to the ruby lint rules @@ -97,22 +99,20 @@ YAML_LINTER_RULES="${DEFAULT_RULES_LOCATION}/${YAML_FILE_NAME}" ####################################### # Linter array for information prints # ####################################### -LINTER_ARRAY=('ansible-lint' 'arm-ttk' 'asl-validator' 'cfn-lint' 'clj-kondo' - 'coffeelint' 'dart' 'dockerfilelint' 'dotenv-linter' 'eslint' 'golangci-lint' - 'htmlhint' 'jsonlint' 'ktlint' 'lua' 'markdownlint' 'npm-groovy-lint' 'perl' - 'protolint' 'pwsh' 'pylint' 'raku' 'rubocop' 'shellcheck' 'spectral' - 'standard' 'stylelint' 'terrascan' 'tflint' 'xmllint' 'yamllint') - +LINTER_ARRAY=('ansible-lint' 'arm-ttk' 'asl-validator' 'cfn-lint' 'clj-kondo' 'coffeelint' + 'dart' 'dockerfilelint' 'dotenv-linter' 'eslint' 'flake8' 'golangci-lint' 'htmlhint' + 'jsonlint' 'ktlint' 'lua' 'markdownlint' 'npm-groovy-lint' 'perl' 'protolint' 'pwsh' + 'pylint' 'raku' 'rubocop' 'shellcheck' 'spectral' 'standard' 'stylelint' 'terrascan' + 'tflint' 'xmllint' 'yamllint') ############################# # Language array for prints # ############################# -LANGUAGE_ARRAY=('ANSIBLE' 'ARM' 'BASH' 'CLOUDFORMATION' 'CLOJURE' 'COFFEESCRIPT' - 'CSS' 'DART' 'DOCKER' 'ENV' 'GO' 'GROOVY' 'HTML' 'JAVASCRIPT_ES' - 'JAVASCRIPT_STANDARD' 'JSON' 'JSX' 'KOTLIN' 'LUA' 'MARKDOWN' 'OPENAPI' - 'PERL' 'PHP' 'POWERSHELL' 'PROTOBUF' 'PYTHON' - 'RAKU' 'RUBY' 'STATES' 'TERRAFORM' 'TERRAFORM_TERRASCAN' 'TSX' 'TYPESCRIPT_ES' - 'TYPESCRIPT_STANDARD' 'XML' 'YAML') +LANGUAGE_ARRAY=('ANSIBLE' 'ARM' 'BASH' 'CLOUDFORMATION' 'CLOJURE' 'COFFEESCRIPT' 'CSS' + 'DART' 'DOCKER' 'ENV' 'GO' 'GROOVY' 'HTML' 'JAVASCRIPT_ES' 'JAVASCRIPT_STANDARD' + 'JSON' 'JSX' 'KOTLIN' 'LUA' 'MARKDOWN' 'OPENAPI' 'PERL' 'PHP' 'POWERSHELL' + 'PROTOBUF' 'PYTHON_PYLINT' 'PYTHON_FLAKE8' 'RAKU' 'RUBY' 'STATES' 'TERRAFORM' + 'TERRAFORM_TERRASCAN' 'TSX' 'TYPESCRIPT_ES' 'TYPESCRIPT_STANDARD' 'XML' 'YML') ############################################ # Array for all languages that were linted # @@ -123,54 +123,55 @@ LINTED_LANGUAGES_ARRAY=() # Will be filled at run time with all languages that w ################### # GitHub ENV Vars # ################### -ANSIBLE_DIRECTORY="${ANSIBLE_DIRECTORY}" # Ansible Directory -DEFAULT_BRANCH="${DEFAULT_BRANCH:-master}" # Default Git Branch to use (master by default) -DISABLE_ERRORS="${DISABLE_ERRORS}" # Boolean to enable warning-only output without throwing errors -GITHUB_EVENT_PATH="${GITHUB_EVENT_PATH}" # Github Event Path -GITHUB_REPOSITORY="${GITHUB_REPOSITORY}" # GitHub Org/Repo passed from system -GITHUB_RUN_ID="${GITHUB_RUN_ID}" # GitHub RUn ID to point to logs -GITHUB_SHA="${GITHUB_SHA}" # GitHub sha from the commit -GITHUB_TOKEN="${GITHUB_TOKEN}" # GitHub Token passed from environment -GITHUB_WORKSPACE="${GITHUB_WORKSPACE}" # Github Workspace -MULTI_STATUS="${MULTI_STATUS:-true}" # Multiple status are created for each check ran -TEST_CASE_RUN="${TEST_CASE_RUN}" # Boolean to validate only test cases -VALIDATE_ALL_CODEBASE="${VALIDATE_ALL_CODEBASE}" # Boolean to validate all files -VALIDATE_ANSIBLE="${VALIDATE_ANSIBLE}" # Boolean to validate language -VALIDATE_ARM="${VALIDATE_ARM}" # Boolean to validate language -VALIDATE_BASH="${VALIDATE_BASH}" # Boolean to validate language -VALIDATE_CLOUDFORMATION="${VALIDATE_CLOUDFORMATION}" # Boolean to validate language -VALIDATE_CLOJURE="${VALIDATE_CLOJURE}" # Boolean to validate language -VALIDATE_COFFEE="${VALIDATE_COFFEE}" # Boolean to validate language -VALIDATE_CSS="${VALIDATE_CSS}" # Boolean to validate language -VALIDATE_DART="${VALIDATE_DART}" # Boolean to validate language -VALIDATE_DOCKER="${VALIDATE_DOCKER}" # Boolean to validate language -VALIDATE_EDITORCONFIG="${VALIDATE_EDITORCONFIG}" # Boolean to validate files with editorconfig -VALIDATE_ENV="${VALIDATE_ENV}" # Boolean to validate language -VALIDATE_GO="${VALIDATE_GO}" # Boolean to validate language -VALIDATE_GROOVY="${VALIDATE_GROOVY}" # Boolean to validate language -VALIDATE_HTML="${VALIDATE_HTML}" # Boolean to validate language -VALIDATE_JAVASCRIPT_ES="${VALIDATE_JAVASCRIPT_ES}" # Boolean to validate language -VALIDATE_JAVASCRIPT_STANDARD="${VALIDATE_JAVASCRIPT_STANDARD}" # Boolean to validate language -VALIDATE_JSON="${VALIDATE_JSON}" # Boolean to validate language -VALIDATE_JSX="${VALIDATE_JSX}" # Boolean to validate language -VALIDATE_KOTLIN="${VALIDATE_KOTLIN}" # Boolean to validate language -VALIDATE_LUA="${VALIDATE_LUA}" # Boolean to validate language -VALIDATE_MARKDOWN="${VALIDATE_MD:-}" # Boolean to validate language -VALIDATE_OPENAPI="${VALIDATE_OPENAPI}" # Boolean to validate language -VALIDATE_PERL="${VALIDATE_PERL}" # Boolean to validate language -VALIDATE_PHP="${VALIDATE_PHP}" # Boolean to validate language -VALIDATE_POWERSHELL="${VALIDATE_POWERSHELL}" # Boolean to validate language -VALIDATE_PYTHON="${VALIDATE_PYTHON}" # Boolean to validate language -VALIDATE_RAKU="${VALIDATE_RAKU}" # Boolean to validate language -VALIDATE_RUBY="${VALIDATE_RUBY}" # Boolean to validate language -VALIDATE_STATES="${VALIDATE_STATES}" # Boolean to validate language -VALIDATE_TERRAFORM="${VALIDATE_TERRAFORM}" # Boolean to validate language -VALIDATE_TERRAFORM_TERRASCAN="${VALIDATE_TERRAFORM_TERRASCAN}" # Boolean to validate language -VALIDATE_TSX="${VALIDATE_TSX}" # Boolean to validate language -VALIDATE_TYPESCRIPT_ES="${VALIDATE_TYPESCRIPT_ES}" # Boolean to validate language -VALIDATE_TYPESCRIPT_STANDARD="${VALIDATE_TYPESCRIPT_STANDARD}" # Boolean to validate language -VALIDATE_XML="${VALIDATE_XML}" # Boolean to validate language -VALIDATE_YAML="${VALIDATE_YAML}" # Boolean to validate language +ANSIBLE_DIRECTORY="${ANSIBLE_DIRECTORY}" # Ansible Directory +DEFAULT_BRANCH="${DEFAULT_BRANCH:-master}" # Default Git Branch to use (master by default) +DISABLE_ERRORS="${DISABLE_ERRORS}" # Boolean to enable warning-only output without throwing errors +GITHUB_EVENT_PATH="${GITHUB_EVENT_PATH}" # Github Event Path +GITHUB_REPOSITORY="${GITHUB_REPOSITORY}" # GitHub Org/Repo passed from system +GITHUB_RUN_ID="${GITHUB_RUN_ID}" # GitHub RUn ID to point to logs +GITHUB_SHA="${GITHUB_SHA}" # GitHub sha from the commit +GITHUB_TOKEN="${GITHUB_TOKEN}" # GitHub Token passed from environment +GITHUB_WORKSPACE="${GITHUB_WORKSPACE}" # Github Workspace +MULTI_STATUS="${MULTI_STATUS:-true}" # Multiple status are created for each check ran +TEST_CASE_RUN="${TEST_CASE_RUN}" # Boolean to validate only test cases +VALIDATE_ALL_CODEBASE="${VALIDATE_ALL_CODEBASE}" # Boolean to validate all files +VALIDATE_ANSIBLE="${VALIDATE_ANSIBLE}" # Boolean to validate language +VALIDATE_ARM="${VALIDATE_ARM}" # Boolean to validate language +VALIDATE_BASH="${VALIDATE_BASH}" # Boolean to validate language +VALIDATE_CLOUDFORMATION="${VALIDATE_CLOUDFORMATION}" # Boolean to validate language +VALIDATE_CLOJURE="${VALIDATE_CLOJURE}" # Boolean to validate language +VALIDATE_COFFEE="${VALIDATE_COFFEE}" # Boolean to validate language +VALIDATE_CSS="${VALIDATE_CSS}" # Boolean to validate language +VALIDATE_DART="${VALIDATE_DART}" # Boolean to validate language +VALIDATE_DOCKER="${VALIDATE_DOCKER}" # Boolean to validate language +VALIDATE_EDITORCONFIG="${VALIDATE_EDITORCONFIG}" # Boolean to validate files with editorconfig +VALIDATE_ENV="${VALIDATE_ENV}" # Boolean to validate language +VALIDATE_GO="${VALIDATE_GO}" # Boolean to validate language +VALIDATE_GROOVY="${VALIDATE_GROOVY}" # Boolean to validate language +VALIDATE_HTML="${VALIDATE_HTML}" # Boolean to validate language +VALIDATE_JAVASCRIPT_ES="${VALIDATE_JAVASCRIPT_ES}" # Boolean to validate language +VALIDATE_JAVASCRIPT_STANDARD="${VALIDATE_JAVASCRIPT_STANDARD}" # Boolean to validate language +VALIDATE_JSON="${VALIDATE_JSON}" # Boolean to validate language +VALIDATE_JSX="${VALIDATE_JSX}" # Boolean to validate language +VALIDATE_KOTLIN="${VALIDATE_KOTLIN}" # Boolean to validate language +VALIDATE_LUA="${VALIDATE_LUA}" # Boolean to validate language +VALIDATE_MARKDOWN="${VALIDATE_MD:-}" # Boolean to validate language +VALIDATE_OPENAPI="${VALIDATE_OPENAPI}" # Boolean to validate language +VALIDATE_PERL="${VALIDATE_PERL}" # Boolean to validate language +VALIDATE_PHP="${VALIDATE_PHP}" # Boolean to validate language +VALIDATE_POWERSHELL="${VALIDATE_POWERSHELL}" # Boolean to validate language +VALIDATE_PYTHON_PYLINT="${VALIDATE_PYTHON:-$VALIDATE_PYTHON_PYLINT}" # Boolean to validate language +VALIDATE_PYTHON_FLAKE8="${VALIDATE_PYTHON_FLAKE8}" # Boolean to validate language +VALIDATE_RAKU="${VALIDATE_RAKU}" # Boolean to validate language +VALIDATE_RUBY="${VALIDATE_RUBY}" # Boolean to validate language +VALIDATE_STATES="${VALIDATE_STATES}" # Boolean to validate language +VALIDATE_TERRAFORM="${VALIDATE_TERRAFORM}" # Boolean to validate language +VALIDATE_TERRAFORM_TERRASCAN="${VALIDATE_TERRAFORM_TERRASCAN}" # Boolean to validate language +VALIDATE_TSX="${VALIDATE_TSX}" # Boolean to validate language +VALIDATE_TYPESCRIPT_ES="${VALIDATE_TYPESCRIPT_ES}" # Boolean to validate language +VALIDATE_TYPESCRIPT_STANDARD="${VALIDATE_TYPESCRIPT_STANDARD}" # Boolean to validate language +VALIDATE_XML="${VALIDATE_XML}" # Boolean to validate language +VALIDATE_YAML="${VALIDATE_YAML}" # Boolean to validate language ############## # Debug Vars # @@ -238,7 +239,8 @@ FILE_ARRAY_PERL=() # Array of files to check FILE_ARRAY_PHP=() # Array of files to check FILE_ARRAY_POWERSHELL=() # Array of files to check FILE_ARRAY_PROTOBUF=() # Array of files to check -FILE_ARRAY_PYTHON=() # Array of files to check +FILE_ARRAY_PYTHON_PYLINT=() # Array of files to check +FILE_ARRAY_PYTHON_FLAKE8=() # Array of files to check FILE_ARRAY_RAKU=() # Array of files to check FILE_ARRAY_RUBY=() # Array of files to check FILE_ARRAY_STATES=() # Array of files to check @@ -302,8 +304,10 @@ ERRORS_FOUND_POWERSHELL=0 # Count of errors found export ERRORS_FOUND_POWERSHELL # Workaround SC2034 ERRORS_FOUND_PROTOBUF=0 # Count of errors found export ERRORS_FOUND_PROTOBUF # Workaround SC2034 -ERRORS_FOUND_PYTHON=0 # Count of errors found -export ERRORS_FOUND_PYTHON # Workaround SC2034 +ERRORS_FOUND_PYTHON_PYLINT=0 # Count of errors found +export ERRORS_FOUND_PYTHON_PYLINT # Workaround SC2034 +ERRORS_FOUND_PYTHON_FLAKE8=0 # Count of errors found +export ERRORS_FOUND_PYTHON_FLAKE8 # Workaround SC2034 ERRORS_FOUND_RAKU=0 # Count of errors found export ERRORS_FOUND_RAKU # Workaround SC2034 ERRORS_FOUND_RUBY=0 # Count of errors found @@ -1093,8 +1097,10 @@ GetLinterRules "LUA" GetLinterRules "MARKDOWN" # Get PowerShell rules GetLinterRules "POWERSHELL" -# Get Python rules -GetLinterRules "PYTHON" +# Get Python pylint rules +GetLinterRules "PYTHON_PYLINT" +# Get Python flake8 rules +GetLinterRules "PYTHON_FLAKE8" # Get Ruby rules GetLinterRules "RUBY" # Get Terraform rules @@ -1511,12 +1517,23 @@ fi ################## # PYTHON LINTING # ################## -if [ "${VALIDATE_PYTHON}" == "true" ]; then +if [ "${VALIDATE_PYTHON_PYLINT}" == "true" ]; then ######################### # Lint the python files # ######################### # LintCodebase "FILE_TYPE" "LINTER_NAME" "LINTER_CMD" "FILE_TYPES_REGEX" "FILE_ARRAY" - LintCodebase "PYTHON" "pylint" "pylint --rcfile ${PYTHON_LINTER_RULES}" ".*\.\(py\)\$" "${FILE_ARRAY_PYTHON[@]}" + LintCodebase "PYTHON_PYLINT" "pylint" "pylint --rcfile ${PYTHON_PYLINT_LINTER_RULES}" ".*\.\(py\)\$" "${FILE_ARRAY_PYTHON_PYLINT[@]}" +fi + +################## +# PYTHON LINTING # +################## +if [ "${VALIDATE_PYTHON_FLAKE8}" == "true" ]; then + ######################### + # Lint the python files # + ######################### + # LintCodebase "FILE_TYPE" "LINTER_NAME" "LINTER_CMD" "FILE_TYPES_REGEX" "FILE_ARRAY" + LintCodebase "PYTHON_FLAKE8" "flake8" "flake8 --config=${PYTHON_FLAKE8_LINTER_RULES}" ".*\.\(py\)\$" "${FILE_ARRAY_PYTHON_FLAKE8[@]}" fi ################ diff --git a/lib/validation.sh b/lib/validation.sh index 07387fd5..178ffbae 100755 --- a/lib/validation.sh +++ b/lib/validation.sh @@ -46,7 +46,6 @@ function GetValidationInfo() { ################################ # Convert strings to lowercase # ################################ - # Loop through all languages for LANGUAGE in "${LANGUAGE_ARRAY[@]}"; do # build the variable @@ -55,7 +54,6 @@ function GetValidationInfo() { eval "${VALIDATE_LANGUAGE}=${!VALIDATE_LANGUAGE,,}" done - ################################################ # Determine if any linters were explicitly set # ################################################ @@ -71,7 +69,6 @@ function GetValidationInfo() { fi done - ################################################### # Validate if we should check individual lanuages # ################################################### diff --git a/lib/worker.sh b/lib/worker.sh index ab23e60f..7a9ddc59 100755 --- a/lib/worker.sh +++ b/lib/worker.sh @@ -602,7 +602,8 @@ function RunTestCases() { TestCodebase "OPENAPI" "spectral" "spectral lint -r ${OPENAPI_LINTER_RULES}" ".*\.\(ymlopenapi\|jsonopenapi\)\$" "openapi" TestCodebase "POWERSHELL" "pwsh" "Invoke-ScriptAnalyzer -EnableExit -Settings ${POWERSHELL_LINTER_RULES} -Path" ".*\.\(ps1\|psm1\|psd1\|ps1xml\|pssc\|psrc\|cdxml\)\$" "powershell" TestCodebase "PROTOBUF" "protolint" "protolint lint --config_path ${PROTOBUF_LINTER_RULES}" ".*\.\(proto\)\$" "protobuf" - TestCodebase "PYTHON" "pylint" "pylint --rcfile ${PYTHON_LINTER_RULES}" ".*\.\(py\)\$" "python" + TestCodebase "PYTHON_PYLINT" "pylint" "pylint --rcfile ${PYTHON_PYLINT_LINTER_RULES}" ".*\.\(py\)\$" "python" + TestCodebase "PYTHON_FLAKE8" "flake8" "flake8 --config ${PYTHON_FLAKE8_LINTER_RULES}" ".*\.\(py\)\$" "python" TestCodebase "RAKU" "raku" "raku -c" ".*\.\(raku\|rakumod\|rakutest\|pm6\|pl6\|p6\)\$" "raku" TestCodebase "RUBY" "rubocop" "rubocop -c ${RUBY_LINTER_RULES}" ".*\.\(rb\)\$" "ruby" TestCodebase "STATES" "asl-validator" "asl-validator --json-path" ".*\.\(json\)\$" "states"