{"id":23734032,"url":"https://github.com/trialandsuccess/su6","last_synced_at":"2025-09-04T09:33:22.357Z","repository":{"id":169891813,"uuid":"645983898","full_name":"trialandsuccess/su6","owner":"trialandsuccess","description":"Python cli tool to use tools for some common code quality checks (opinionated)","archived":false,"fork":false,"pushed_at":"2024-05-22T19:44:30.000Z","size":278,"stargazers_count":5,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-07-06T00:51:26.872Z","etag":null,"topics":["bandit","black","cli","hatch","mypy","python","ruff","su6","typer"],"latest_commit_sha":null,"homepage":"https://pypi.org/project/su6/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/trialandsuccess.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-05-26T23:39:21.000Z","updated_at":"2025-06-17T10:50:02.000Z","dependencies_parsed_at":"2024-12-31T05:33:33.288Z","dependency_job_id":"3a5915b9-b9a1-49e0-baf6-da4ff8cdc230","html_url":"https://github.com/trialandsuccess/su6","commit_stats":null,"previous_names":["robinvandernoord/su6-checker","trialandsuccess/su6"],"tags_count":44,"template":false,"template_full_name":null,"purl":"pkg:github/trialandsuccess/su6","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/trialandsuccess%2Fsu6","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/trialandsuccess%2Fsu6/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/trialandsuccess%2Fsu6/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/trialandsuccess%2Fsu6/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/trialandsuccess","download_url":"https://codeload.github.com/trialandsuccess/su6/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/trialandsuccess%2Fsu6/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":273583393,"owners_count":25131812,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-04T02:00:08.968Z","response_time":61,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bandit","black","cli","hatch","mypy","python","ruff","su6","typer"],"created_at":"2024-12-31T05:33:28.774Z","updated_at":"2025-09-04T09:33:22.047Z","avatar_url":"https://github.com/trialandsuccess.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n    \u003cimg \n        align=\"center\" \n        src=\"https://raw.githubusercontent.com/trialandsuccess/su6/master/_static/su6.png\" \n        alt=\"su6 checker\"\n        width=\"400px\"\n        /\u003e\n    \u003ch1 align=\"center\"\u003esu6\u003c/h1\u003e\n\u003c/div\u003e\n\n\u003cdiv align=\"center\"\u003e\n    6 is pronounced as '/zɛs/' in Dutch, so 'su6' is basically 'success'. \u003cbr /\u003e\n    This package will hopefully help achieve that!\n\u003c/div\u003e\n\n\u003cbr\u003e\n\n\u003cdiv align=\"center\"\u003e\n    \u003ca href=\"https://pypi.org/project/su6\"\u003e\u003cimg alt=\"PyPI - Version\" src=\"https://img.shields.io/pypi/v/su6.svg\"/\u003e\u003c/a\u003e\n    \u003ca href=\"https://pypi.org/project/su6\"\u003e\u003cimg alt=\"PyPI - Python Version\" src=\"https://img.shields.io/pypi/pyversions/su6.svg\"/\u003e\u003c/a\u003e\n    \u003cbr/\u003e\n    \u003ca href=\"https://github.com/psf/black\"\u003e\u003cimg alt=\"Code style: black\" src=\"https://img.shields.io/badge/code%20style-black-000000.svg\"/\u003e\u003c/a\u003e\n    \u003ca href=\"https://opensource.org/licenses/MIT\"\u003e\u003cimg alt=\"License: MIT\" src=\"https://img.shields.io/badge/License-MIT-yellow.svg\"/\u003e\u003c/a\u003e\n    \u003cbr/\u003e\n    \u003ca href=\"https://github.com/trialandsuccess/su6/actions\"\u003e\u003cimg alt=\"su6 checks\" src=\"https://github.com/trialandsuccess/su6/actions/workflows/su6.yml/badge.svg?branch=development\"/\u003e\u003c/a\u003e\n    \u003ca href=\"https://github.com/trialandsuccess/su6/actions\"\u003e\u003cimg alt=\"Coverage\" src=\"coverage.svg\"/\u003e\u003c/a\u003e\n\u003c/div\u003e\n\n-----\n\n**Table of Contents**\n\n- [Installation](#installation)\n- [Usage](#usage)\n- [Plugins](#plugins)\n- [License](#license)\n- [Changelog](#changelog)\n\n## Installation\n\n```console\n# quick install with all possible checkers:\npip install su6[all]\n# or pick and choose checkers:\npip install [black,bandit,pydocstyle]\n```\n\n**Note**: this package does not work well with `pipx`, since a lot of the tools need to be in the same (virtual)\nenvironment\nof your code, in order to do proper analysis.\n\nThe following checkers are supported:\n\n### ruff\n\n- install: `pip install su6[ruff]`\n- use: `su6 ruff [directory]`\n- functionality: linter\n- pypi: [ruff](https://pypi.org/project/ruff/)\n\n### black\n\n- install: `pip install su6[black]`\n- use: `su6 black [directory] [--fix]`\n- functionality: formatter\n- pypi: [black](https://pypi.org/project/black/)\n\n### mypy\n\n- install: `pip install su6[mypy]`\n- use: `su6 mypy [directory]`\n- functionality: static type checker\n- pypi: [mypy](https://pypi.org/project/mypy/)\n\n### bandit\n\n- install: `pip install su6[bandit]`\n- use: `su6 bandit [directory]`\n- functionality: security linter\n- pypi: [bandit](https://pypi.org/project/bandit/)\n\n### isort\n\n- install: `pip install su6[isort]`\n- use: `su6 isort [directory] [--fix]`\n- functionality: import sorter\n- pypi: [isort](https://pypi.org/project/isort/)\n\n### pydocstyle\n\n- install: `pip install su6[pydocstyle]`\n- use: `su6 pydocstyle [directory]`\n- functionality: docstring checker\n- pypi: [pydocstyle](https://pypi.org/project/pydocstyle/)\n\n### pytest\n\n- install: `pip install su6[pytest]`\n- use: `su6 pytest [directory] [--coverage \u003cint\u003e] [--json] [--html] [--badge \u003cpath\u003e]`\n- functionality: tester with coverage\n- pypi: [pytest](https://pypi.org/project/pytest/), [pytest-cov](https://pypi.org/project/pytest-cov/)\n\n## Usage\n\n```console\nsu6 --help\n# or, easiest to start:\nsu6 all\n# usual signature:\nsu6 [--verbosity=1|2|3] [--config=...] [--format=text|json] \u003csubcommand\u003e [directory] [...specific options]\n```\n\nwhere `subcommand` is `all` or one of the available checkers;  \n`verbosity` indicates how much information you want to see (default is '2').  \n`config` allows you to select a different `.toml` file (default is `pyproject.toml`).  \n`format` allows you to get a JSON output instead of the textual traffic lights (default is `text`).  \n`directory` is the location you want to run the scans (default is current directory);  \nIn the case of `black` and `isort`, another optional parameter `--fix` can be passed.\nThis will allow the tools to do the suggested changes (if applicable).\nRunning `su6 fix` will run both these tools with the `--fix` flag.  \nFor `pytest`, `--json`, `--html`, `--badge \u003cstr\u003e` and `--coverage \u003cint\u003e` are supported.\nThe latter two can also be configured in the pyproject.toml (see ['Configuration'](#configuration)).\nThe first two arguments can be used to control the output format of `pytest --cov`. Both options can be used at the same\ntime. The `--coverage` flag can be used to set a threshold for code coverage %. If the coverage is less than this\nthreshold, the check will fail.\nIf `badge` is set using cli or toml config, a SVG badge with the coverage % will be generated.\nThis badge can be used in for example the README.md.\n\n### Configuration\n\nIn your `pyproject.toml`, you can add a `[tools.su6]` section to configure some of the behavior of this tools.\nCurrently, the following keys are supported:\n\n```toml\n[tool.su6]\ndirectory = \".\" # string path to the directory on which to run all tools, e.g. 'src'\ninclude = [] # list of checks to run (when calling `su6 all`), e.g. ['black', 'mypy']\nexclude = [] # list of checks to skip (when calling `su6 all`), e.g. ['bandit']\nstop-after-first-failure = false  # bool to indicate whether to exit 'all' after one failure or to do all checks\ncoverage = 100 # int threshold for pytest coverage \nbadge = \"coverage.svg\"  # str path or bool (true | false) whether and where to output the coverage badge\n```\n\nAll keys are optional. Note that if you have both an `include` as well as an `exclude`, all the tools in `include` will\nrun and `exclude` will be fully ignored.  \nAdditionally, the order in which the checks are defined in 'include', is the order in which they will run (in `all`\nand `fix`)\n\n### Github Action\n\nIn order to use this checker within Github to run checks after pushing,\nyou can add a workflow (e.g. `.github/workflows/su6.yaml`) like this example:\n\n```yaml\nname: run su6 checks\non:\n  push:\n    branches-ignore:\n      - master\njobs:\n  check:\n    name: Check with `su6 all`\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v3\n      - uses: actions/setup-python@v4\n        with:\n          python-version: '3.11'\n          cache: 'pip' # caching pip dependencies\n      - run: pip install su6[all] .\n      - run: su6 all\n```\n\n**Note:** if you don't want to run all checks, but specific ones only, you need to add the `--ignore-uninstalled` flag\nto `su6 all`! Otherwise, Github will see exit code 127 (command missing) as a failure.\n\n```yaml\nname: run some su6 checks\non:\n  push:\n    branches-ignore:\n      - master\njobs:\n  check:\n    name: Check with `su6 all`\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v3\n      - uses: actions/setup-python@v4\n        with:\n          python-version: '3.11'\n          cache: 'pip' # caching pip dependencies\n      - run: pip install su6[pycodestyle,black] .\n      - run: su6 all --ignore-uninstalled  # ... other settings such as --stop-after-first-failure, --coverage ...\n```\n\n## Plugins\n\nThis tool also supports plugins to add extra checkers or other functionality.\nSee [docs/plugins.md](https://github.com/trialandsuccess/su6/blob/master/docs/plugins.md) for information on how to\nbuild a Plugin.\n\n### svelte-check\n\n[robinvandernoord/su6-plugin-svelte-check](https://github.com/robinvandernoord/su6-plugin-svelte-check) is a Plugin that\nadds `svelte-check` functionality.  \nCan be installed using `pip install su6[svelte-check]`\n\n### prettier\n\n[robinvandernoord/su6-plugin-prettier](https://github.com/robinvandernoord/su6-plugin-prettier) is a Plugin that\nadds `prettier.io` functionality.  \nCan be installed using `pip install su6[prettier]`\n\n## License\n\n`su6` is distributed under the terms of the [MIT](https://spdx.org/licenses/MIT.html) license.\n\n## Changelog\n\nSee `CHANGELOG.md` [on GitHub](https://github.com/trialandsuccess/su6/blob/master/CHANGELOG.md)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftrialandsuccess%2Fsu6","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftrialandsuccess%2Fsu6","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftrialandsuccess%2Fsu6/lists"}