diff --git a/.automation/test/python/python_good_1.py b/.automation/test/python/python_good_1.py index a2f7c3e6..8106d8d8 100644 --- a/.automation/test/python/python_good_1.py +++ b/.automation/test/python/python_good_1.py @@ -8,19 +8,21 @@ 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') +api_url = getenv("API_URL", default="https://api.github.com/graphql") 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.") + sys.exit( + "GitHub Token is not set." + + "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') +client_id = getenv("CLIENT_ID", default="copy_labels.py") headers = { - 'Authorization': 'bearer {github_token}'.format(github_token=github_token), - 'Accept': 'application/vnd.github.bane-preview+json', - 'Content-Type': 'application/json' + "Authorization": "bearer {github_token}".format(github_token=github_token), + "Accept": "application/vnd.github.bane-preview+json", + "Content-Type": "application/json", } @@ -40,16 +42,18 @@ def create_label(repo_id, label): "color": label["color"], "description": label["description"], "name": label["name"], - "repositoryId": repo_id + "repositoryId": repo_id, } } - with open(path.join(path.dirname(__file__), 'queries/create_label.gql'), 'r') as query_file: + with open( + path.join(path.dirname(__file__), "queries/create_label.gql"), "r" + ) as query_file: query = "".join(query_file.readlines()) payload = {"query": query, "variables": query_variables} response = requests.post(api_url, data=json.dumps(payload), headers=headers).json() - print('Created label {label}'.format(label=label["name"])) + print("Created label {label}".format(label=label["name"])) return response @@ -64,9 +68,14 @@ 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: + with open( + path.join(path.dirname(__file__), "queries/get_repo_data.gql"), "r" + ) as query_file: query = "".join(query_file.readlines()) payload = {"query": query, "variables": query_variables} @@ -82,8 +91,10 @@ def get_labels(owner, repo): return repo_id, labels else: raise Exception( - '[ERROR] getting issue labels. Status Code: {status_code} - Message: {result}'.format( - status_code=status_code, result=result["message"])) + "[ERROR] getting issue labels. Status Code: {status_code} - Message: {result}".format( + status_code=status_code, result=result["message"] + ) + ) def delete_label(label_id): @@ -95,13 +106,12 @@ def delete_label(label_id): """ query_variables = { - "deleteLabelInput": { - "clientMutationId": client_id, - "id": label_id, - } + "deleteLabelInput": {"clientMutationId": client_id, "id": label_id} } - with open(path.join(path.dirname(__file__), 'queries/delete_label.gql'), 'r') as query_file: + with open( + path.join(path.dirname(__file__), "queries/delete_label.gql"), "r" + ) as query_file: query = "".join(query_file.readlines()) payload = {"query": query, "variables": query_variables} @@ -111,9 +121,9 @@ def delete_label(label_id): @click.command() -@click.option('--dry', is_flag=True) -@click.argument('source_repo') -@click.argument('target_repo') +@click.option("--dry", is_flag=True) +@click.argument("source_repo") +@click.argument("target_repo") def copy_labels(source_repo, target_repo, dry): """ Copy labels from the source repository to the target repository. @@ -128,30 +138,55 @@ def copy_labels(source_repo, target_repo, dry): target_owner, target_repo_name = target_repo.split("/") try: - print('Fetching labels for {source_repo_name} repo.'.format(source_repo_name=source_repo_name)) + print( + "Fetching labels for {source_repo_name} repo.".format( + source_repo_name=source_repo_name + ) + ) _, source_repo_labels = get_labels(source_owner, source_repo_name) - print('Fetched labels for {source_repo_name}'.format(source_repo_name=source_repo_name)) + print( + "Fetched labels for {source_repo_name}".format( + source_repo_name=source_repo_name + ) + ) - print('Fetching labels for {target_repo_name} repo.'.format(target_repo_name=target_repo_name)) + print( + "Fetching labels for {target_repo_name} repo.".format( + target_repo_name=target_repo_name + ) + ) target_repo_id, target_repo_labels = get_labels(target_owner, target_repo_name) - print('Fetched labels for {target_repo_name}'.format(target_repo_name=target_repo_name)) + print( + "Fetched labels for {target_repo_name}".format( + target_repo_name=target_repo_name + ) + ) - filtered_labels = list(filter(lambda x: x not in target_repo_labels, source_repo_labels)) + filtered_labels = list( + filter(lambda x: x not in target_repo_labels, source_repo_labels) + ) if dry: - print('This is just a dry run. No labels will be copied/created.') - print('{label_count} labels would have been created.'.format(label_count=len(filtered_labels))) + print("This is just a dry run. No labels will be copied/created.") + print( + "{label_count} labels would have been created.".format( + label_count=len(filtered_labels) + ) + ) pprint(filtered_labels, indent=4) else: - print('Preparing to created {label_count} labels in {target_repo}'.format( - label_count=len(filtered_labels), target_repo=target_repo)) + print( + "Preparing to created {label_count} labels in {target_repo}".format( + label_count=len(filtered_labels), target_repo=target_repo + ) + ) for label in filtered_labels: create_label(target_repo_id, label) except Exception as error: sys.exit(error) - print('Done') + print("Done") if __name__ == "__main__": diff --git a/Dockerfile b/Dockerfile index 74990862..710d665e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -17,6 +17,7 @@ FROM wata727/tflint:0.19.0 as tflint FROM hadolint/hadolint:latest-alpine as dockerfile-lint FROM assignuser/lintr-lib:latest as lintr-lib FROM assignuser/chktex-alpine:latest as chktex + ################## # Get base image # ################## @@ -73,8 +74,7 @@ RUN apk add --update --no-cache \ py3-setuptools \ R \ readline-dev \ - ruby ruby-dev ruby-bundler ruby-rdoc - + ruby ruby-dev ruby-bundler ruby-rdoc ######################################## # Copy dependencies files to container # @@ -308,8 +308,9 @@ 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_BLACK=${VALIDATE_PYTHON_BLACK} \ VALIDATE_PYTHON_FLAKE8=${VALIDATE_PYTHON_FLAKE8} \ + VALIDATE_PYTHON_PYLINT=${VALIDATE_PYTHON_PYLINT} \ VALIDATE_R=${VALIDATE_R} \ VALIDATE_RAKU=${VALIDATE_RAKU} \ VALIDATE_RUBY=${VALIDATE_RUBY} \ diff --git a/README.md b/README.md index 70eab815..06e41da6 100644 --- a/README.md +++ b/README.md @@ -68,7 +68,7 @@ Developers on **GitHub** can call the **GitHub Action** to lint their code base | **PHP** | [PHP built-in linter](https://www.php.net/) / [PHP CodeSniffer](https://github.com/squizlabs/PHP_CodeSniffer) / [PHPStan](https://phpstan.org/n) / [Psalm](https://psalm.dev/) | | **PowerShell** | [PSScriptAnalyzer](https://github.com/PowerShell/Psscriptanalyzer) | | **Protocol Buffers** | [protolint](https://github.com/yoheimuta/protolint) | -| **Python3** | [pylint](https://www.pylint.org/) / [flake8](https://flake8.pycqa.org/en/latest/) | +| **Python3** | [pylint](https://www.pylint.org/) / [flake8](https://flake8.pycqa.org/en/latest/) / [black](https://github.com/psf/black) | | **R** | [lintr](https://github.com/jimhester/lintr) | | **Raku** | [Raku](https://raku.org) | | **Ruby** | [RuboCop](https://github.com/rubocop-hq/rubocop) | @@ -226,6 +226,7 @@ But if you wish to select or exclude specific linters, we give you full control | **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_PYTHON_BLACK** | `true` | Flag to enable or disable the linting process of the Python language. (Utilizing: black) | | **VALIDATE_POWERSHELL** | `true` | Flag to enable or disable the linting process of the Powershell language. | | **VALIDATE_R** | `true` | Flag to enable or disable the linting process of the R language. | | **VALIDATE_RAKU** | `true` | Flag to enable or disable the linting process of the Raku language. | diff --git a/dependencies/Pipfile b/dependencies/Pipfile index 0fcce921..ffe213f6 100644 --- a/dependencies/Pipfile +++ b/dependencies/Pipfile @@ -6,12 +6,16 @@ verify_ssl = true [dev-packages] [packages] -yamllint = "*" -pylint = "*" -yq = "*" +black = "*" cfn-lint = "*" -terrascan = "*" flake8 = "*" +pylint = "*" +terrascan = "*" +yamllint = "*" +yq = "*" [requires] python_version = "3.8" + +[pipenv] +allow_prereleases = true diff --git a/dependencies/Pipfile.lock b/dependencies/Pipfile.lock index de2a9a11..2c430b50 100644 --- a/dependencies/Pipfile.lock +++ b/dependencies/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "f8ea3853c4bb4533103043533d08982436551678c827f59809c94bf0ee54a187" + "sha256": "1f13d59524584eca4db2ae57cf6d3acd02250a28bce7bee9414f21c45cae09af" }, "pipfile-spec": 6, "requires": { @@ -16,6 +16,13 @@ ] }, "default": { + "appdirs": { + "hashes": [ + "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41", + "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128" + ], + "version": "==1.4.4" + }, "argcomplete": { "hashes": [ "sha256:2fbe5ed09fd2c1d727d4199feca96569a5b50d44c71b16da9c742201f7cc295c", @@ -28,6 +35,7 @@ "sha256:2f4078c2a41bf377eea06d71c9d2ba4eb8f6b1af2135bec27bbbb7d8f12bb703", "sha256:bc58d83eb610252fd8de6363e39d4f1d0619c894b0ed24603b881c02e64c7386" ], + "markers": "python_version >= '3.5'", "version": "==2.4.2" }, "attrs": { @@ -35,6 +43,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": { @@ -45,19 +54,27 @@ ], "version": "==1.26.0" }, + "black": { + "hashes": [ + "sha256:1b30e59be925fafc1ee4565e5e08abef6b03fe455102883820fe5ee2e4734e0b", + "sha256:c2edb73a08e9e0e6f65a0e6af18b059b8b1cdd5bef997d7a0b181df93dc81539" + ], + "index": "pypi", + "version": "==19.10b0" + }, "boto3": { "hashes": [ - "sha256:640a8372ce0edfbb84a8f63584a0b64c78d61a751a27c2a47f92d2ebaf021ce4", - "sha256:a6c9a3d3abbad2ff2e5751af599492a9271633a7c9fef343482524464c53e451" + "sha256:1cfbadf41777dade69a3e5eaf1b71d15b4ae616fd94d16a894b692e14319f4a2", + "sha256:cc3636828f1677ff93e8b1130c90dfe800187964e33786711450e8653d3f245f" ], - "version": "==1.14.43" + "version": "==1.14.46" }, "botocore": { "hashes": [ - "sha256:3fb144d2b5d705127f394f7483737ece6fa79577ca7c493e4f42047ac8636200", - "sha256:f8801ce7f7603922ccab1c86c448e802f94183e31d99457e85fb9985a20d3abc" + "sha256:2f15a755b990db13a7a9e06a124c6ca5fa1c4470d76672363024d7f2a6c2566c", + "sha256:6b134681c938f00b28424abf4b46fa6034b516d8add3a3f524e2292db61aa070" ], - "version": "==1.17.43" + "version": "==1.17.46" }, "cfn-lint": { "hashes": [ @@ -67,6 +84,14 @@ "index": "pypi", "version": "==0.35.0" }, + "click": { + "hashes": [ + "sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a", + "sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", + "version": "==7.1.2" + }, "decorator": { "hashes": [ "sha256:41fa54c2a0cc4ba648be4fd43cff00aedf5b9465c9bf18d64325bc225f08f760", @@ -80,6 +105,7 @@ "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": { @@ -95,6 +121,7 @@ "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": { @@ -102,6 +129,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": { @@ -117,6 +145,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": { @@ -156,6 +185,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": { @@ -185,6 +215,7 @@ "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": { @@ -192,6 +223,7 @@ "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": { @@ -219,6 +251,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": { @@ -238,6 +271,32 @@ "markers": "python_version != '3.4'", "version": "==5.3.1" }, + "regex": { + "hashes": [ + "sha256:0dc64ee3f33cd7899f79a8d788abfbec168410be356ed9bd30bbd3f0a23a7204", + "sha256:1269fef3167bb52631ad4fa7dd27bf635d5a0790b8e6222065d42e91bede4162", + "sha256:14a53646369157baa0499513f96091eb70382eb50b2c82393d17d7ec81b7b85f", + "sha256:3a3af27a8d23143c49a3420efe5b3f8cf1a48c6fc8bc6856b03f638abc1833bb", + "sha256:46bac5ca10fb748d6c55843a931855e2727a7a22584f302dd9bb1506e69f83f6", + "sha256:4c037fd14c5f4e308b8370b447b469ca10e69427966527edcab07f52d88388f7", + "sha256:51178c738d559a2d1071ce0b0f56e57eb315bcf8f7d4cf127674b533e3101f88", + "sha256:5ea81ea3dbd6767873c611687141ec7b06ed8bab43f68fad5b7be184a920dc99", + "sha256:6961548bba529cac7c07af2fd4d527c5b91bb8fe18995fed6044ac22b3d14644", + "sha256:75aaa27aa521a182824d89e5ab0a1d16ca207318a6b65042b046053cfc8ed07a", + "sha256:7a2dd66d2d4df34fa82c9dc85657c5e019b87932019947faece7983f2089a840", + "sha256:8a51f2c6d1f884e98846a0a9021ff6861bdb98457879f412fdc2b42d14494067", + "sha256:9c568495e35599625f7b999774e29e8d6b01a6fb684d77dee1f56d41b11b40cd", + "sha256:9eddaafb3c48e0900690c1727fba226c4804b8e6127ea409689c3bb492d06de4", + "sha256:bbb332d45b32df41200380fff14712cb6093b61bd142272a10b16778c418e98e", + "sha256:bc3d98f621898b4a9bc7fecc00513eec8f40b5b83913d74ccb445f037d58cd89", + "sha256:c11d6033115dc4887c456565303f540c44197f4fc1a2bfb192224a301534888e", + "sha256:c50a724d136ec10d920661f1442e4a8b010a4fe5aebd65e0c2241ea41dbe93dc", + "sha256:d0a5095d52b90ff38592bbdc2644f17c6d495762edf47d876049cfd2968fbccf", + "sha256:d6cff2276e502b86a25fd10c2a96973fdb45c7a977dca2138d661417f3728341", + "sha256:e46d13f38cfcbb79bfdb2964b0fe12561fe633caf964a77a5f8d4e45fe5d2ef7" + ], + "version": "==2020.7.14" + }, "s3transfer": { "hashes": [ "sha256:2482b4259524933a022d59da830f51bd746db62f047d6eb213f2f8855dcb8a13", @@ -250,6 +309,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": { @@ -267,6 +327,32 @@ ], "version": "==0.10.1" }, + "typed-ast": { + "hashes": [ + "sha256:0666aa36131496aed8f7be0410ff974562ab7eeac11ef351def9ea6fa28f6355", + "sha256:0c2c07682d61a629b68433afb159376e24e5b2fd4641d35424e462169c0a7919", + "sha256:249862707802d40f7f29f6e1aad8d84b5aa9e44552d2cc17384b209f091276aa", + "sha256:24995c843eb0ad11a4527b026b4dde3da70e1f2d8806c99b7b4a7cf491612652", + "sha256:269151951236b0f9a6f04015a9004084a5ab0d5f19b57de779f908621e7d8b75", + "sha256:4083861b0aa07990b619bd7ddc365eb7fa4b817e99cf5f8d9cf21a42780f6e01", + "sha256:498b0f36cc7054c1fead3d7fc59d2150f4d5c6c56ba7fb150c013fbc683a8d2d", + "sha256:4e3e5da80ccbebfff202a67bf900d081906c358ccc3d5e3c8aea42fdfdfd51c1", + "sha256:6daac9731f172c2a22ade6ed0c00197ee7cc1221aa84cfdf9c31defeb059a907", + "sha256:715ff2f2df46121071622063fc7543d9b1fd19ebfc4f5c8895af64a77a8c852c", + "sha256:73d785a950fc82dd2a25897d525d003f6378d1cb23ab305578394694202a58c3", + "sha256:8c8aaad94455178e3187ab22c8b01a3837f8ee50e09cf31f1ba129eb293ec30b", + "sha256:8ce678dbaf790dbdb3eba24056d5364fb45944f33553dd5869b7580cdbb83614", + "sha256:aaee9905aee35ba5905cfb3c62f3e83b3bec7b39413f0a7f19be4e547ea01ebb", + "sha256:bcd3b13b56ea479b3650b82cabd6b5343a625b0ced5429e4ccad28a8973f301b", + "sha256:c9e348e02e4d2b4a8b2eedb48210430658df6951fa484e59de33ff773fbd4b41", + "sha256:d205b1b46085271b4e15f670058ce182bd1199e56b317bf2ec004b6a44f911f6", + "sha256:d43943ef777f9a1c42bf4e552ba23ac77a6351de620aa9acf64ad54933ad4d34", + "sha256:d5d33e9e7af3b34a40dc05f498939f0ebf187f07c385fd58d591c533ad8562fe", + "sha256:fc0fea399acb12edbf8a628ba8d2312f583bdbdb3335635db062fa98cf71fca4", + "sha256:fe460b922ec15dd205595c9b5b99e2f056fd98ae8f9f56b888e7a17dc2b757e7" + ], + "version": "==1.4.1" + }, "urllib3": { "hashes": [ "sha256:91056c15fa70756691db97756772bb1eb9678fa585d9184f24534b100dc60f4a", diff --git a/docs/disabling-linters.md b/docs/disabling-linters.md index cedac356..a5432d0c 100644 --- a/docs/disabling-linters.md +++ b/docs/disabling-linters.md @@ -41,8 +41,9 @@ For some linters it is also possible to override rules on a case by case level w - [Perl](#perl) - [PHP](#php) - [Protocol Buffers](#protocol-buffers) - - [Python3 pylint](#python3-pylint) + - [Python3 black](#python3-black) - [Python3 flake8](#python3-flake8) + - [Python3 pylint](#python3-pylint) - [R](#r) - [Raku](#raku) - [Ruby](#ruby) @@ -940,6 +941,29 @@ var = "terrible code down here..." ``` --- + +## Python3 black + +- `https://black.readthedocs.io/en/stable/installation_and_usage.html#` + +### Black Config file + +- There is no top level _configuration file_ available at this time + +### Black disable single line + +- There is currently **No** way to disable rules inline of the file(s) + +### Black disable code block + +- There is currently **No** way to disable rules inline of the file(s) + +### Black disable entire file + +- There is currently **No** way to disable rules inline of the file(s) + +--- + ## R - [lintr](https://github.com/jimhester/lintr) diff --git a/lib/linter.sh b/lib/linter.sh index 1b57ffb2..fab24b88 100755 --- a/lib/linter.sh +++ b/lib/linter.sh @@ -133,7 +133,7 @@ YAML_LINTER_RULES="${DEFAULT_RULES_LOCATION}/${YAML_FILE_NAME}" # Path to the ya ####################################### # Linter array for information prints # ####################################### -LINTER_ARRAY=('ansible-lint' 'arm-ttk' 'asl-validator' 'cfn-lint' 'checkstyle' 'chktex' 'clj-kondo' 'coffeelint' +LINTER_ARRAY=('ansible-lint' 'arm-ttk' 'asl-validator' 'black' 'cfn-lint' 'checkstyle' 'chktex' 'clj-kondo' 'coffeelint' 'dart' 'dockerfilelint' 'dotenv-linter' 'editorconfig-checker' 'eslint' 'flake8' 'golangci-lint' 'hadolint' 'htmlhint' 'jsonlint' 'ktlint' 'lintr' 'lua' 'markdownlint' 'npm-groovy-lint' 'perl' 'protolint' 'pwsh' 'pylint' 'raku' 'rubocop' 'shellcheck' 'spectral' 'standard' 'stylelint' 'sql-lint' @@ -146,7 +146,7 @@ LANGUAGE_ARRAY=('ANSIBLE' 'ARM' 'BASH' 'CLOUDFORMATION' 'CLOJURE' 'COFFEESCRIPT' 'DART' 'DOCKERFILE' 'DOCKERFILE_HADOLINT' 'EDITORCONFIG' 'ENV' 'GO' 'GROOVY' 'HTML' 'JAVA' 'JAVASCRIPT_ES' 'JAVASCRIPT_STANDARD' 'JSON' 'JSX' 'KOTLIN' 'LATEX' 'LUA' 'MARKDOWN' 'OPENAPI' 'PERL' 'PHP_BUILTIN' 'PHP_PHPCS' 'PHP_PHPSTAN' 'PHP_PSALM' 'POWERSHELL' - 'PROTOBUF' 'PYTHON_PYLINT' 'PYTHON_FLAKE8' 'R' 'RAKU' 'RUBY' 'STATES' 'SQL' 'TERRAFORM' + 'PROTOBUF' 'PYTHON_BLACK' 'PYTHON_PYLINT' 'PYTHON_FLAKE8' 'R' 'RAKU' 'RUBY' 'STATES' 'SQL' 'TERRAFORM' 'TERRAFORM_TERRASCAN' 'TSX' 'TYPESCRIPT_ES' 'TYPESCRIPT_STANDARD' 'XML' 'YAML') ############################################ @@ -202,8 +202,9 @@ VALIDATE_PHP_PHPCS="${VALIDATE_PHP_PHPCS}" # Boolean t VALIDATE_PHP_PHPSTAN="${VALIDATE_PHP_PHPSTAN}" # Boolean to validate language VALIDATE_PHP_PSALM="${VALIDATE_PHP_PSALM}" # 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_PYTHON_BLACK="${VALIDATE_PYTHON_BLACK}" # Boolean to validate language +VALIDATE_PYTHON_PYLINT="${VALIDATE_PYTHON:-$VALIDATE_PYTHON_PYLINT}" # Boolean to validate language VALIDATE_R="${VALIDATE_R}" # Boolean to validate language VALIDATE_RAKU="${VALIDATE_RAKU}" # Boolean to validate language VALIDATE_RUBY="${VALIDATE_RUBY}" # Boolean to validate language @@ -302,6 +303,7 @@ FILE_ARRAY_PHP_PHPSTAN=() # Array of files to check FILE_ARRAY_PHP_PSALM=() # Array of files to check FILE_ARRAY_POWERSHELL=() # Array of files to check FILE_ARRAY_PROTOBUF=() # Array of files to check +FILE_ARRAY_PYTHON_BLACK=() # 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_R=() # Array of files to check @@ -349,8 +351,8 @@ ERRORS_FOUND_GROOVY=0 # Count of errors found export ERRORS_FOUND_GROOVY # Workaround SC2034 ERRORS_FOUND_HTML=0 # Count of errors found export ERRORS_FOUND_HTML # Workaround SC2034 -ERRORS_FOUND_JAVA=0 -export ERRORS_FOUND_JAVA +ERRORS_FOUND_JAVA=0 # Count of errors found +export ERRORS_FOUND_JAVA # Workaround SC2034 ERRORS_FOUND_JAVASCRIPT_STANDARD=0 # Count of errors found export ERRORS_FOUND_JAVASCRIPT_STANDARD # Workaround SC2034 ERRORS_FOUND_JAVASCRIPT_ES=0 # Count of errors found @@ -383,6 +385,8 @@ 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_BLACK=0 # Count of errors found +export ERRORS_FOUND_PYTHON_BLACK # 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 @@ -1700,9 +1704,20 @@ if [ "${VALIDATE_PROTOBUF}" == "true" ]; then LintCodebase "PROTOBUF" "protolint" "protolint lint --config_path ${PROTOBUF_LINTER_RULES}" ".*\.\(proto\)\$" "${FILE_ARRAY_PROTOBUF[@]}" fi -################## -# PYTHON LINTING # -################## +######################## +# PYTHON BLACK LINTING # +######################## +if [ "${VALIDATE_PYTHON_BLACK}" == "true" ]; then + ######################### + # Lint the python files # + ######################### + # LintCodebase "FILE_TYPE" "LINTER_NAME" "LINTER_CMD" "FILE_TYPES_REGEX" "FILE_ARRAY" + LintCodebase "PYTHON_BLACK" "black" "black --diff --check" ".*\.\(py\)\$" "${FILE_ARRAY_PYTHON_BLACK[@]}" +fi + +######################### +# PYTHON PYLINT LINTING # +######################### if [ "${VALIDATE_PYTHON_PYLINT}" == "true" ]; then ######################### # Lint the python files # @@ -1711,9 +1726,9 @@ if [ "${VALIDATE_PYTHON_PYLINT}" == "true" ]; then LintCodebase "PYTHON_PYLINT" "pylint" "pylint --rcfile ${PYTHON_PYLINT_LINTER_RULES}" ".*\.\(py\)\$" "${FILE_ARRAY_PYTHON_PYLINT[@]}" fi -################## -# PYTHON LINTING # -################## +######################### +# PYTHON FLAKE8 LINTING # +######################### if [ "${VALIDATE_PYTHON_FLAKE8}" == "true" ]; then ######################### # Lint the python files # @@ -1722,9 +1737,9 @@ if [ "${VALIDATE_PYTHON_FLAKE8}" == "true" ]; then LintCodebase "PYTHON_FLAKE8" "flake8" "flake8 --config=${PYTHON_FLAKE8_LINTER_RULES}" ".*\.\(py\)\$" "${FILE_ARRAY_PYTHON_FLAKE8[@]}" fi -################ +############# # R LINTING # -################ +############# if [ "${VALIDATE_R}" == "true" ]; then ########################## # Check for local config # diff --git a/lib/worker.sh b/lib/worker.sh index b17070ef..e2afbee3 100755 --- a/lib/worker.sh +++ b/lib/worker.sh @@ -220,7 +220,7 @@ function LintCodebase() { fi LINT_CMD=$( cd "$r_dir" || exit - R --slave -e "errors <- lintr::lint('$FILE');print(errors);quit(save = 'no', status = if (length(errors) > 0) 1 else 0)" 2>&1 + R --slave -e "errors <- lintr::lint('$FILE');print(errors);quit(save = 'no', status = if (length(errors) > 0) 1 else 0)" 2>&1 ) #LINTER_COMMAND="lintr::lint('${FILE}')" else @@ -452,8 +452,8 @@ function TestCodebase() { ####################################### LINT_CMD=$( cd "${GITHUB_WORKSPACE}" || exit - R --slave -e "errors <- lintr::lint('$FILE');print(errors);quit(save = 'no', status = if (length(errors) > 0) 1 else 0)" 2>&1 - ) + R --slave -e "errors <- lintr::lint('$FILE');print(errors);quit(save = 'no', status = if (length(errors) > 0) 1 else 0)" 2>&1 + ) else ################################ # Lint the file with the rules # @@ -636,8 +636,9 @@ 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" "pylint --rcfile ${PYTHON_PYLINT_LINTER_RULES}" ".*\.\(py\)\$" "python" + TestCodebase "PYTHON_BLACK" "black" "black --diff --check" ".*\.\(py\)\$" "python" TestCodebase "PYTHON_FLAKE8" "flake8" "flake8 --config ${PYTHON_FLAKE8_LINTER_RULES}" ".*\.\(py\)\$" "python" + TestCodebase "PYTHON_PYLINT" "pylint" "pylint --rcfile ${PYTHON_PYLINT_LINTER_RULES}" ".*\.\(py\)\$" "python" TestCodebase "R" "lintr" "lintr::lint()" ".*\.\(r\|rmd\)\$" "r" TestCodebase "RAKU" "raku" "raku -c" ".*\.\(raku\|rakumod\|rakutest\|pm6\|pl6\|p6\)\$" "raku" TestCodebase "RUBY" "rubocop" "rubocop -c ${RUBY_LINTER_RULES}" ".*\.\(rb\)\$" "ruby"