From 19a746092d565ef70e37a41904aa6b93fe317932 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Brunner?= Date: Fri, 25 Oct 2024 19:45:23 +0200 Subject: [PATCH] Back to meter argparse --- poetry.lock | 65 +---------- prospector/config/configuration.py | 176 +++++++++++++++++------------ pyproject.toml | 2 - 3 files changed, 106 insertions(+), 137 deletions(-) diff --git a/poetry.lock b/poetry.lock index 3721f7a6..ea4287cd 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.4 and should not be changed by hand. [[package]] name = "annotated-types" @@ -304,21 +304,6 @@ files = [ {file = "charset_normalizer-3.4.0.tar.gz", hash = "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e"}, ] -[[package]] -name = "clipstick" -version = "0.6.1" -description = "A pydantic cli creation tool based on Pydantic models." -optional = false -python-versions = ">=3.10,<4.0" -files = [ - {file = "clipstick-0.6.1-py3-none-any.whl", hash = "sha256:ae014e1e607019cc6e50869a08064b3da16a56021579c94d710aec9b3a5cd4d8"}, - {file = "clipstick-0.6.1.tar.gz", hash = "sha256:f7cd156b3d82554463d410b49cc063fa7cd19e2389a5a518954c443b8a9807c5"}, -] - -[package.dependencies] -pydantic = ">=2.3.0,<3.0.0" -rich = ">=13.6.0,<14.0.0" - [[package]] name = "colorama" version = "0.4.6" @@ -499,17 +484,6 @@ files = [ {file = "docopt-0.6.2.tar.gz", hash = "sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491"}, ] -[[package]] -name = "docstring-parser" -version = "0.16" -description = "Parse Python docstrings in reST, Google and Numpydoc format" -optional = false -python-versions = ">=3.6,<4.0" -files = [ - {file = "docstring_parser-0.16-py3-none-any.whl", hash = "sha256:bf0a1387354d3691d102edef7ec124f219ef639982d096e26e3b60aeffa90637"}, - {file = "docstring_parser-0.16.tar.gz", hash = "sha256:538beabd0af1e2db0146b6bd3caa526c35a34d61af9fd2887f3a8a27a739aa6e"}, -] - [[package]] name = "docutils" version = "0.21.2" @@ -1729,20 +1703,6 @@ enabler = ["pytest-enabler (>=2.2)"] test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] type = ["importlib-metadata (>=7.0.2)", "jaraco.develop (>=7.21)", "mypy (==1.11.*)", "pytest-mypy"] -[[package]] -name = "shtab" -version = "1.7.1" -description = "Automagic shell tab completion for Python CLI applications" -optional = false -python-versions = ">=3.7" -files = [ - {file = "shtab-1.7.1-py3-none-any.whl", hash = "sha256:32d3d2ff9022d4c77a62492b6ec875527883891e33c6b479ba4d41a51e259983"}, - {file = "shtab-1.7.1.tar.gz", hash = "sha256:4e4bcb02eeb82ec45920a5d0add92eac9c9b63b2804c9196c1f1fdc2d039243c"}, -] - -[package.extras] -dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout"] - [[package]] name = "six" version = "1.16.0" @@ -1903,27 +1863,6 @@ files = [ {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, ] -[[package]] -name = "tyro" -version = "0.8.14" -description = "Strongly typed, zero-effort CLI interfaces" -optional = false -python-versions = ">=3.7" -files = [ - {file = "tyro-0.8.14-py3-none-any.whl", hash = "sha256:1904bffb0e4d5e16c5eb50c518c89a368a44d56405f79b316c58e1206c102e87"}, - {file = "tyro-0.8.14.tar.gz", hash = "sha256:2516e34d21763575159459c3b15fe4a13472a2166dff32169c9d7aab70853058"}, -] - -[package.dependencies] -colorama = {version = ">=0.4.0", markers = "platform_system == \"Windows\""} -docstring-parser = ">=0.16" -rich = ">=11.1.0" -shtab = ">=1.5.6" -typing-extensions = ">=4.7.0" - -[package.extras] -dev = ["PyYAML (>=6.0)", "attrs (>=21.4.0)", "coverage[toml] (>=6.5.0)", "eval-type-backport (>=0.1.3)", "flax (>=0.6.9)", "frozendict (>=2.3.4)", "mypy (>=1.4.1)", "numpy (>=1.20.0)", "omegaconf (>=2.2.2)", "pydantic (>=2.5.2)", "pyright (>=1.1.349,!=1.1.379)", "pytest (>=7.1.2)", "pytest-cov (>=3.0.0)", "ruff (>=0.1.13)", "torch (>=1.10.0)"] - [[package]] name = "tzdata" version = "2024.2" @@ -2035,4 +1974,4 @@ with-vulture = ["vulture"] [metadata] lock-version = "2.0" python-versions = ">=3.10,<4.0" -content-hash = "8b65148fbbe092078619239b999e524415476a4db60641f351230e2e751e4f07" +content-hash = "354c47b9c5692c00333e4f1295d409e2da77739171f1f747322afea31562d8fa" diff --git a/prospector/config/configuration.py b/prospector/config/configuration.py index 2ef9f7c4..952d04fa 100644 --- a/prospector/config/configuration.py +++ b/prospector/config/configuration.py @@ -1,11 +1,12 @@ import argparse +import ast import configparser -from dataclasses import dataclass +import inspect import os import sys -import tyro +import textwrap from enum import Enum -from typing import Any, List, Optional, Union, get_args, get_origin +from typing import Any, Optional, Union, get_args, get_origin import toml # type: ignore[import-untyped] import yaml @@ -34,19 +35,25 @@ class ProspectorConfiguration(BaseModel): zero_exit: bool = False """ - Prospector will exit with a code of 1 (one) if any messages are found. This makes automation easier; if there are any problems at all, the exit code is non-zero. However this behavior is not always desirable, so if this flag is set, prospector will exit with a code of 0 if it ran successfully, and non-zero if it failed to run. + Prospector will exit with a code of 1 (one) if any messages are found. This makes automation easier; + if there are any problems at all, the exit code is non-zero. However this behavior is not always + desirable, so if this flag is set, prospector will exit with a code of 0 if it ran successfully, + and non-zero if it failed to run. """ autodetect: bool = True """ - Turn off auto-detection of frameworks and libraries used. By default, autodetection will be used. To specify manually, see the --uses option. + Turn off auto-detection of frameworks and libraries used. By default, autodetection will be used. + To specify manually, see the --uses option. """ uses: list[str] = [] """ - A list of one or more libraries or frameworks that the project uses. Possible values are: django, celery, flask. This will be autodetected by default, but if autodetection doesn't work, manually specify them using this flag. + A list of one or more libraries or frameworks that the project uses. Possible values are: django, celery, flask. + This will be autodetected by default, but if autodetection doesn't work, manually specify them using this flag. """ blending: bool = True """ - Turn off blending of messages. Prospector will merge together messages from different tools if they represent the same error. Use this option to see all unmerged messages. + Turn off blending of messages. Prospector will merge together messages from different tools if they represent + the same error. Use this option to see all unmerged messages. """ doc_warnings: Optional[bool] = None """ @@ -62,7 +69,8 @@ class ProspectorConfiguration(BaseModel): """ member_warnings: Optional[bool] = None """ - Attempt to warn when code tries to access an attribute of a class or member of a module which does not exist. This is disabled by default as it tends to be quite inaccurate. + Attempt to warn when code tries to access an attribute of a class or member of a module which does not exist. + This is disabled by default as it tends to be quite inaccurate. """ full_pep8: Optional[bool] = None """ @@ -86,43 +94,56 @@ class ProspectorConfiguration(BaseModel): """ output_format: Optional[list[str]] = None """ - The output format. Valid values are: {}. This will output to stdout by default, however a target file can be used instead by adding :path-to-output-file, eg, -o json:output.json + The output format. This will output to stdout by default, however a target file can be used instead by adding + :path-to-output-file, eg, -o json:output.json. """ absolute_paths: bool = False """ - Whether to output absolute paths when referencing files in messages. By default, paths will be relative to the project path + Whether to output absolute paths when referencing files in messages. By default, paths will be relative + to the project path. """ tools: Optional[list[str]] = None """ - A list of tools to run. This lets you set exactly which tools to run. To add extra tools to the defaults, see --with-tool. + A list of tools to run. This lets you set exactly which tools to run. To add extra tools to the defaults, + see --with-tool. """ with_tools: list[str] = [] """ - A list of tools to run in addition to the default tools. To specify all tools explicitly, use the --tool argument. Possible values are {}. + A list of tools to run in addition to the default tools. To specify all tools explicitly, use the --tool argument. """ without_tools: list[str] = [] """ - A list of tools that should not be run. Useful to turn off only a single tool from the defaults. To specify all tools explicitly, use the --tool argument. + A list of tools that should not be run. Useful to turn off only a single tool from the defaults. + To specify all tools explicitly, use the --tool argument. """ profiles: list[str] = [] """ - The list of profiles to load. A profile is a certain 'type' of behavior for prospector, and is represented by a YAML configuration file. Either a full path to the YAML file describing the profile must be provided, or it must be on the profile path (see --profile-path) + The list of profiles to load. A profile is a certain 'type' of behavior for prospector, and is represented by a + YAML configuration file. Either a full path to the YAML file describing the profile must be provided, + or it must be on the profile path (see --profile-path) """ profile_path: list[str] = [] """ - Additional paths to search for profile files. By default this is the path that prospector will check, and a directory called '.prospector' in the path that prospector will check. + Additional paths to search for profile files. By default this is the path that prospector will check, + and a directory called '.prospector' in the path that prospector will check. """ strictness: Optional[Strictness] = None """ - How strict the checker should be. This affects how harshly the checker will enforce coding guidelines. The default value is "medium", possible values are "veryhigh", "high", "medium", "low" and "verylow". + How strict the checker should be. This affects how harshly the checker will enforce coding guidelines. + The default value is "medium", possible values are "veryhigh", "high", "medium", "low" and "verylow". """ show_profile: bool = False """ - Include the computed profile in the summary. This will show what prospector has decided the overall profile is once all profiles have been combined and inherited from. This will produce a large output in most cases so is only useful when trying to debug why prospector is not behaving like you expect. + Include the computed profile in the summary. This will show what prospector has decided the overall + profile is once all profiles have been combined and inherited from. This will produce a large output + in most cases so is only useful when trying to debug why prospector is not behaving like you expect. """ no_external_config: bool = False """ - Determines how prospector should behave when configuration already exists for a tool. By default, prospector will use existing configuration. This flag will cause prospector to ignore existing configuration and use its own settings for every tool. Note that prospector will always use its own config for tools which do not have custom configuration. + Determines how prospector should behave when configuration already exists for a tool. By default, + prospector will use existing configuration. This flag will cause prospector to ignore existing configuration + and use its own settings for every tool. Note that prospector will always use its own config for tools + which do not have custom configuration. """ legacy_tool_names: bool = False """ @@ -130,31 +151,42 @@ class ProspectorConfiguration(BaseModel): """ pylint_config_file: Optional[str] = None """ - The path to a pylintrc file to use to configure pylint. Prospector will find .pylintrc files in the root of the project, but you can use this option to specify manually where it is. + The path to a pylintrc file to use to configure pylint. Prospector will find .pylintrc files in + the root of the project, but you can use this option to specify manually where it is. """ path: Optional[str] = None """ - The path to a Python project to inspect. Defaults to PWD if not specified. Note: This command line argument is deprecated and will be removed in a future update. Please use the positional PATH argument instead. + The path to a Python project to inspect. Defaults to PWD if not specified. If multiple paths are specified, + they must all be files (no directories). """ ignore_patterns: list[str] = [] """ - A list of paths to ignore, as a list of regular expressions. Files and folders will be ignored if their full path contains any of these patterns. + A list of paths to ignore, as a list of regular expressions. Files and folders will be ignored if + their full path contains any of these patterns. """ ignore_paths: list[str] = [] """ - A list of file or directory names to ignore. If the complete name matches any of the items in this list, the file or directory (and all subdirectories) will be ignored. + A list of file or directory names to ignore. If the complete name matches any of the items in this list, + the file or directory (and all subdirectories) will be ignored. """ die_on_tool_error: bool = False """ - If a tool fails to run, prospector will try to carry on. Use this flag to cause prospector to die and raise the exception the tool generated. Mostly useful for development on prospector. + If a tool fails to run, prospector will try to carry on. Use this flag to cause prospector to die and raise + the exception the tool generated. Mostly useful for development on prospector. """ include_tool_stdout: bool = False """ - There are various places where tools will output warnings to stdout/stderr, which breaks parsing of JSON output. Therefore while tols is running, this is suppressed. For developing, it is sometimes useful to see this. This flag will cause stdout/stderr from a tool to be shown as a normal message amongst other warnings. See also --direct-tool-stdout + There are various places where tools will output warnings to stdout/stderr, which breaks parsing of JSON output. + Therefore while tols is running, this is suppressed. For developing, it is sometimes useful to see this. + This flag will cause stdout/stderr from a tool to be shown as a normal message amongst other warnings. + See also --direct-tool-stdout """ direct_tool_stdout: bool = False """ - There are various places where tools will output warnings to stdout/stderr, which breaks parsing of JSON output. Therefore while tols is running, this is suppressed. For developing, it is sometimes useful to see this. This flag will cause stdout/stderr from a tool to be shown as a normal message amongst other warnings. See also --direct-tool-stdout + There are various places where tools will output warnings to stdout/stderr, which breaks parsing of JSON output. + Therefore while tols is running, this is suppressed. For developing, it is sometimes useful to see this. + This flag will cause stdout/stderr from a tool to be shown as a normal message amongst other warnings. + See also --direct-tool-stdout """ @@ -184,7 +216,7 @@ def _parse_value( # Enum value = type_(value_str) else: - if origin == list: + if origin is list: sub_type = get_args(type_)[0] if sub_type is str: value = value_str.split(",") @@ -251,7 +283,7 @@ def get_config() -> ProspectorConfiguration: config[name] = value args = build_command_line_parser().parse_args() - for name, conf in ProspectorConfiguration.model_fields.items(): + for name in ProspectorConfiguration.model_fields: if hasattr(args, name): value = getattr(args, name) if value is not None: @@ -272,104 +304,110 @@ def get_config() -> ProspectorConfiguration: return ProspectorConfiguration(**config) -# flake8: noqa def build_command_line_parser( prog: str = "prospector", description: str = "Performs static analysis of Python code" -) -> ProspectorConfiguration: - return tyro.cli(ProspectorConfiguration) # , prog==prog, description=description) +) -> argparse.ArgumentParser: parser = argparse.ArgumentParser(prog=prog, description=description) + # Get comments of the fields model + module = ast.parse(textwrap.dedent(inspect.getsource(ProspectorConfiguration))) + class_def = module.body[0] + field_doc = {} + for last, node in zip(class_def.body, class_def.body[1:]): + if not (isinstance(last, ast.AnnAssign) and isinstance(last.target, ast.Name) and isinstance(node, ast.Expr)): + continue + field_doc[last.target.id] = node.value.value.strip().replace("\n", " ").replace(" ", " ") + parser.add_argument( "-0", "--zero-exit", action="store_true", - help="Prospector will exit with a code of 1 (one) if any messages are found. This makes automation easier; if there are any problems at all, the exit code is non-zero. However this behavior is not always desirable, so if this flag is set, prospector will exit with a code of 0 if it ran successfully, and non-zero if it failed to run.", + help=field_doc["zero_exit"], ) parser.add_argument( "-A", "--no-autodetect", action="store_true", - help="Turn off auto-detection of frameworks and libraries used. By default, autodetection will be used. To specify manually, see the --uses option.", + help=field_doc["autodetect"], ) parser.add_argument( "-u", "--uses", action="append", - help="A list of one or more libraries or frameworks that the project uses. Possible values are: django, celery, flask. This will be autodetected by default, but if autodetection doesn't work, manually specify them using this flag.", + help=field_doc["uses"], ) parser.add_argument( "-B", "--no-blending", action="store_true", - help="Turn off blending of messages. Prospector will merge together messages from different tools if they represent the same error. Use this option to see all unmerged messages.", + help=field_doc["blending"], ) - parser.add_argument("-D", "--doc-warnings", action="store_true", help="Include warnings about documentation.") - parser.add_argument("-T", "--test-warnings", action="store_true", help="Also check test modules and packages.") + parser.add_argument("-D", "--doc-warnings", action="store_true", help=field_doc["doc_warnings"]) + parser.add_argument("-T", "--test-warnings", action="store_true", help=field_doc["test_warnings"]) parser.add_argument( "--legacy-tool-names", action="store_true", - help="Output deprecated names for tools (pep8, pep257) instead of updated names (pycodestyle, pydocstyle)", + help=field_doc["legacy_tool_names"], ) parser.add_argument( "-8", "--no-style-warnings", action="store_true", - help="Don't create any warnings about style. This disables the PEP8 tool and similar checks for formatting.", + help=field_doc["no_style_warnings"], ) parser.add_argument( "-m", "--member-warnings", action="store_true", - help="Attempt to warn when code tries to access an attribute of a class or member of a module which does not exist. This is disabled by default as it tends to be quite inaccurate.", + help=field_doc["member_warnings"], ) parser.add_argument( "-q", "--quiet", action="store_true", - help="Run but do not output anything to stdout. Useful to suppress output in scripts without sending to a file (via -o)", + help=field_doc["quiet"], ) parser.add_argument( "-F", "--full-pep8", action="store_true", - help="Enables every PEP8 warning, so that all PEP8 style violation will be reported.", + help=field_doc["full_pep8"], ) parser.add_argument( "--max-line-length", type=int, - help="The maximum line length allowed. This will be set by the strictness if no value is explicitly specified", + help=field_doc["max_line_length"], ) parser.add_argument( "-M", "--messages-only", action="store_true", - help="Only output message information (don't output summary information about the checks)", + help=field_doc["messages_only"], ) parser.add_argument( "-S", "--summary-only", action="store_true", - help="Only output summary information about the checks (don't output message information)", + help=field_doc["summary_only"], ) parser.add_argument( "-o", "--output-format", action="append", - help="The output format. Valid values are: {}. This will output to stdout by default, however a target file can be used instead by adding :path-to-output-file, eg, -o json:output.json".format( - ", ".join(sorted(FORMATTERS.keys())) - ), + help=field_doc["output_format"] + " Valid values are: {}.".format(", ".join(sorted(FORMATTERS.keys()))), ) parser.add_argument( "--absolute-paths", action="store_true", - help="Whether to output absolute paths when referencing files in messages. By default, paths will be relative to the project path", + help=field_doc["absolute_paths"], ) parser.add_argument( "-t", "--tool", dest="tools", action="append", - help="A list of tools to run. This lets you set exactly which tools to run. To add extra tools to the defaults, see --with-tool. Possible values are: {}. By default, the following tools will be run: {}".format( + help=field_doc["tools"] + + " Possible values are: {}. By default, the following tools will be run: {}".format( ", ".join(sorted(TOOLS.keys())), ", ".join(sorted(DEFAULT_TOOLS)) ), ) @@ -378,88 +416,82 @@ def build_command_line_parser( "--with-tool", dest="with_tools", action="append", - help="A list of tools to run in addition to the default tools. To specify all tools explicitly, use the --tool argument. Possible values are {}.".format( - ", ".join(sorted(TOOLS.keys())) - ), + help=field_doc["with_tools"] + " Possible values are {}.".format(", ".join(sorted(TOOLS.keys()))), ) parser.add_argument( "-W", "--without-tool", dest="without_tools", action="append", - help="A list of tools that should not be run. Useful to turn off only a single tool from the defaults. To specify all tools explicitly, use the --tool argument. Possible values are {}.".format( - ", ".join(sorted(TOOLS.keys())) - ), + help=field_doc["without_tools"] + " Possible values are {}.".format(", ".join(sorted(TOOLS.keys()))), ) parser.add_argument( "-P", "--profile", dest="profiles", action="append", - help="The list of profiles to load. A profile is a certain 'type' of behavior for prospector, and is represented by a YAML configuration file. Either a full path to the YAML file describing the profile must be provided, or it must be on the profile path (see --profile-path)", + help=field_doc["profiles"], ) parser.add_argument( "--profile-path", action="append", - help="Additional paths to search for profile files. By default this is the path that prospector will check, and a directory called '.prospector' in the path that prospector will check.", + help=field_doc["profile_path"], ) parser.add_argument( "--show-profile", action="store_true", - help="Include the computed profile in the summary. This will show what prospector has decided the overall profile is once all profiles have been combined and inherited from. This will produce a large output in most cases so is only useful when trying to debug why prospector is not behaving like you expect.", - ) - parser.add_argument( - "-s", - "--strictness", - help='How strict the checker should be. This affects how harshly the checker will enforce coding guidelines. The default value is "medium", possible values are "veryhigh", "high", "medium", "low" and "verylow".', + help=field_doc["show_profile"], ) + parser.add_argument("-s", "--strictness", help=field_doc["strictness"]) parser.add_argument( "-E", "--no-external-config", action="store_true", - help="Determines how prospector should behave when configuration already exists for a tool. By default, prospector will use existing configuration. This flag will cause prospector to ignore existing configuration and use its own settings for every tool. Note that prospector will always use its own config for tools which do not have custom configuration.", + help=field_doc["no_external_config"], ) parser.add_argument( "--pylint-config-file", - help="The path to a pylintrc file to use to configure pylint. Prospector will find .pylintrc files in the root of the project, but you can use this option to specify manually where it is.", + help=field_doc["pylint_config_file"], ) parser.add_argument( "-I", "--ignore-patterns", action="append", - help="A list of paths to ignore, as a list of regular expressions. Files and folders will be ignored if their full path contains any of these patterns.", + help=field_doc["ignore_patterns"], ) parser.add_argument( "-i", "--ignore-paths", action="append", - help="A list of file or directory names to ignore. If the complete name matches any of the items in this list, the file or directory (and all subdirectories) will be ignored.", + help=field_doc["ignore_paths"], ) parser.add_argument( "-X", "--die-on-tool-error", action="store_true", - help="If a tool fails to run, prospector will try to carry on. Use this flag to cause prospector to die and raise the exception the tool generated. Mostly useful for development on prospector.", + help=field_doc["die_on_tool_error"], ) parser.add_argument( "--include-tool-stdout", action="store_true", - help="There are various places where tools will output warnings to stdout/stderr, which breaks parsing of JSON output. Therefore while tols is running, this is suppressed. For developing, it is sometimes useful to see this. This flag will cause stdout/stderr from a tool to be shown as a normal message amongst other warnings. See also --direct-tool-stdout", + help=field_doc["include_tool_stdout"], ) parser.add_argument( "--direct-tool-stdout", action="store_true", - help="Same as --include-tool-stdout, except the output will be printed directly rather than shown as a message.", + help=field_doc["direct_tool_stdout"], ) parser.add_argument( "-p", "--path", - help="The path to a Python project to inspect. Defaults to PWD if not specified. Note: This command line argument is deprecated and will be removed in a future update. Please use the positional PATH argument instead.", + help=field_doc["path"] + + " Note: This command line argument is deprecated and will be removed in a future update. " + "Please use the positional PATH argument instead.", ) parser.add_argument( "path", - help="The path to a Python project to inspect. Defaults to PWD if not specified. If multiple paths are specified, they must all be files (no directories).", + help=field_doc["path"], metavar="PATH", nargs="?", ) diff --git a/pyproject.toml b/pyproject.toml index 63e18d0c..c15f3d51 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -60,8 +60,6 @@ pyright = {version = ">=1.1.3", optional = true} pyroma = {version = ">=2.4", optional = true} ruff = {version = "*", optional = true} pydantic = "^2.0.0" -clipstick = "^0.6.1" -tyro = "^0.8.14" [tool.poetry.extras] with_bandit = ["bandit"]