From b58d0dde3e1fa5dc1098ce101a70abb0314e5d8f Mon Sep 17 00:00:00 2001 From: Roman Isecke <136338424+rbiseck3@users.noreply.github.com> Date: Thu, 2 Nov 2023 17:18:40 -0400 Subject: [PATCH] Add CliMix class to wrap both BaseConfig and CliMixin (#1957) ### Description Add new class to wrap base config and cli mixin to help with typing: ```python class CliConfig(BaseConfig, CliMixin): pass ``` --- CHANGELOG.md | 2 +- unstructured/__version__.py | 2 +- unstructured/ingest/cli/base/cmd.py | 4 ++-- unstructured/ingest/cli/cmds/airtable.py | 5 ++--- unstructured/ingest/cli/cmds/azure.py | 5 ++--- unstructured/ingest/cli/cmds/azure_cognitive_search.py | 5 ++--- unstructured/ingest/cli/cmds/biomed.py | 5 ++--- unstructured/ingest/cli/cmds/box.py | 5 ++--- unstructured/ingest/cli/cmds/confluence.py | 5 ++--- unstructured/ingest/cli/cmds/delta_table.py | 7 +++---- unstructured/ingest/cli/cmds/discord.py | 5 ++--- unstructured/ingest/cli/cmds/dropbox.py | 5 ++--- unstructured/ingest/cli/cmds/elasticsearch.py | 5 ++--- unstructured/ingest/cli/cmds/gcs.py | 8 +++++--- unstructured/ingest/cli/cmds/github.py | 5 ++--- unstructured/ingest/cli/cmds/gitlab.py | 5 ++--- unstructured/ingest/cli/cmds/google_drive.py | 9 ++++++--- unstructured/ingest/cli/cmds/jira.py | 5 ++--- unstructured/ingest/cli/cmds/local.py | 5 ++--- unstructured/ingest/cli/cmds/notion.py | 5 ++--- unstructured/ingest/cli/cmds/onedrive.py | 5 ++--- unstructured/ingest/cli/cmds/outlook.py | 5 ++--- unstructured/ingest/cli/cmds/reddit.py | 5 ++--- unstructured/ingest/cli/cmds/s3.py | 5 ++--- unstructured/ingest/cli/cmds/salesforce.py | 5 ++--- unstructured/ingest/cli/cmds/sharepoint.py | 5 ++--- unstructured/ingest/cli/cmds/slack.py | 5 ++--- unstructured/ingest/cli/cmds/wikipedia.py | 5 ++--- unstructured/ingest/cli/interfaces.py | 6 +++++- unstructured/ingest/cli/utils.py | 6 +++--- 30 files changed, 70 insertions(+), 84 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8d9c44c22..08f6c65d9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -## 0.10.29-dev9 +## 0.10.29-dev10 ### Enhancements diff --git a/unstructured/__version__.py b/unstructured/__version__.py index 6e0192bbe..e95996b1c 100644 --- a/unstructured/__version__.py +++ b/unstructured/__version__.py @@ -1 +1 @@ -__version__ = "0.10.29-dev9" # pragma: no cover +__version__ = "0.10.29-dev10" # pragma: no cover diff --git a/unstructured/ingest/cli/base/cmd.py b/unstructured/ingest/cli/base/cmd.py index 274358d0b..f02a81424 100644 --- a/unstructured/ingest/cli/base/cmd.py +++ b/unstructured/ingest/cli/base/cmd.py @@ -2,7 +2,7 @@ import typing as t from abc import ABC from dataclasses import dataclass, field -from unstructured.ingest.cli.interfaces import CliMixin +from unstructured.ingest.cli.interfaces import CliConfig from unstructured.ingest.interfaces import BaseConfig @@ -10,7 +10,7 @@ from unstructured.ingest.interfaces import BaseConfig class BaseCmd(ABC): cmd_name: str cli_config: t.Optional[t.Type[BaseConfig]] = None - additional_cli_options: t.List[t.Type[CliMixin]] = field(default_factory=list) + additional_cli_options: t.List[t.Type[CliConfig]] = field(default_factory=list) addition_configs: t.Dict[str, t.Type[BaseConfig]] = field(default_factory=dict) is_fsspec: bool = False diff --git a/unstructured/ingest/cli/cmds/airtable.py b/unstructured/ingest/cli/cmds/airtable.py index 30993a6bb..ba2d6bcc2 100644 --- a/unstructured/ingest/cli/cmds/airtable.py +++ b/unstructured/ingest/cli/cmds/airtable.py @@ -5,13 +5,12 @@ import click from unstructured.ingest.cli.base.src import BaseSrcCmd from unstructured.ingest.cli.interfaces import ( - CliMixin, + CliConfig, ) -from unstructured.ingest.interfaces import BaseConfig @dataclass -class AirtableCliConfig(BaseConfig, CliMixin): +class AirtableCliConfig(CliConfig): personal_access_token: t.Optional[str] = None @staticmethod diff --git a/unstructured/ingest/cli/cmds/azure.py b/unstructured/ingest/cli/cmds/azure.py index 133f840d5..0a28d49e3 100644 --- a/unstructured/ingest/cli/cmds/azure.py +++ b/unstructured/ingest/cli/cmds/azure.py @@ -5,15 +5,14 @@ import click from unstructured.ingest.cli.base.src import BaseSrcCmd from unstructured.ingest.cli.interfaces import ( - CliMixin, + CliConfig, ) -from unstructured.ingest.interfaces import BaseConfig CMD_NAME = "azure" @dataclass -class AzureCliConfig(BaseConfig, CliMixin): +class AzureCliConfig(CliConfig): account_id: t.Optional[str] = None account_name: t.Optional[str] = None connection_string: t.Optional[str] = None diff --git a/unstructured/ingest/cli/cmds/azure_cognitive_search.py b/unstructured/ingest/cli/cmds/azure_cognitive_search.py index d27db2834..964cf6927 100644 --- a/unstructured/ingest/cli/cmds/azure_cognitive_search.py +++ b/unstructured/ingest/cli/cmds/azure_cognitive_search.py @@ -4,13 +4,12 @@ from dataclasses import dataclass import click from unstructured.ingest.cli.interfaces import ( - CliMixin, + CliConfig, ) -from unstructured.ingest.interfaces import BaseConfig @dataclass -class AzureCognitiveSearchCliWriteConfig(BaseConfig, CliMixin): +class AzureCognitiveSearchCliWriteConfig(CliConfig): key: str endpoint: str index: str diff --git a/unstructured/ingest/cli/cmds/biomed.py b/unstructured/ingest/cli/cmds/biomed.py index d5c9eeb4d..a03f9cc98 100644 --- a/unstructured/ingest/cli/cmds/biomed.py +++ b/unstructured/ingest/cli/cmds/biomed.py @@ -5,13 +5,12 @@ import click from unstructured.ingest.cli.base.src import BaseSrcCmd from unstructured.ingest.cli.interfaces import ( - CliMixin, + CliConfig, ) -from unstructured.ingest.interfaces import BaseConfig @dataclass -class BiomedCliConfig(BaseConfig, CliMixin): +class BiomedCliConfig(CliConfig): api_id: t.Optional[str] = None api_from: t.Optional[str] = None api_until: t.Optional[str] = None diff --git a/unstructured/ingest/cli/cmds/box.py b/unstructured/ingest/cli/cmds/box.py index 8a361152d..e55a5d0db 100644 --- a/unstructured/ingest/cli/cmds/box.py +++ b/unstructured/ingest/cli/cmds/box.py @@ -5,15 +5,14 @@ import click from unstructured.ingest.cli.base.src import BaseSrcCmd from unstructured.ingest.cli.interfaces import ( - CliMixin, + CliConfig, ) -from unstructured.ingest.interfaces import BaseConfig CMD_NAME = "box" @dataclass -class BoxCliConfig(BaseConfig, CliMixin): +class BoxCliConfig(CliConfig): box_app_config: t.Optional[str] = None @staticmethod diff --git a/unstructured/ingest/cli/cmds/confluence.py b/unstructured/ingest/cli/cmds/confluence.py index b84c179df..69717c974 100644 --- a/unstructured/ingest/cli/cmds/confluence.py +++ b/unstructured/ingest/cli/cmds/confluence.py @@ -5,14 +5,13 @@ import click from unstructured.ingest.cli.base.src import BaseSrcCmd from unstructured.ingest.cli.interfaces import ( - CliMixin, + CliConfig, DelimitedString, ) -from unstructured.ingest.interfaces import BaseConfig @dataclass -class ConfluenceCliConfig(BaseConfig, CliMixin): +class ConfluenceCliConfig(CliConfig): api_token: str url: str user_email: str diff --git a/unstructured/ingest/cli/cmds/delta_table.py b/unstructured/ingest/cli/cmds/delta_table.py index 37627f91a..5ae34d0d4 100644 --- a/unstructured/ingest/cli/cmds/delta_table.py +++ b/unstructured/ingest/cli/cmds/delta_table.py @@ -5,15 +5,14 @@ import click from unstructured.ingest.cli.base.src import BaseSrcCmd from unstructured.ingest.cli.interfaces import ( - CliMixin, + CliConfig, ) -from unstructured.ingest.interfaces import BaseConfig CMD_NAME = "delta-table" @dataclass -class DeltaTableCliConfig(BaseConfig, CliMixin): +class DeltaTableCliConfig(CliConfig): table_uri: str version: t.Optional[int] = None storage_options: t.Optional[str] = None @@ -51,7 +50,7 @@ class DeltaTableCliConfig(BaseConfig, CliMixin): @dataclass -class DeltaTableCliWriteConfig(BaseConfig, CliMixin): +class DeltaTableCliWriteConfig(CliConfig): write_column: str mode: t.Literal["error", "append", "overwrite", "ignore"] = "error" diff --git a/unstructured/ingest/cli/cmds/discord.py b/unstructured/ingest/cli/cmds/discord.py index 9bea878ac..4d591c6e7 100644 --- a/unstructured/ingest/cli/cmds/discord.py +++ b/unstructured/ingest/cli/cmds/discord.py @@ -5,14 +5,13 @@ import click from unstructured.ingest.cli.base.src import BaseSrcCmd from unstructured.ingest.cli.interfaces import ( - CliMixin, + CliConfig, DelimitedString, ) -from unstructured.ingest.interfaces import BaseConfig @dataclass -class DiscordCliConfig(BaseConfig, CliMixin): +class DiscordCliConfig(CliConfig): channels: t.List[str] token: str period: t.Optional[int] = None diff --git a/unstructured/ingest/cli/cmds/dropbox.py b/unstructured/ingest/cli/cmds/dropbox.py index 0df8b55bb..a741f93df 100644 --- a/unstructured/ingest/cli/cmds/dropbox.py +++ b/unstructured/ingest/cli/cmds/dropbox.py @@ -5,15 +5,14 @@ import click from unstructured.ingest.cli.base.src import BaseSrcCmd from unstructured.ingest.cli.interfaces import ( - CliMixin, + CliConfig, ) -from unstructured.ingest.interfaces import BaseConfig CMD_NAME = "dropbox" @dataclass -class DropboxCliConfig(BaseConfig, CliMixin): +class DropboxCliConfig(CliConfig): token: str @staticmethod diff --git a/unstructured/ingest/cli/cmds/elasticsearch.py b/unstructured/ingest/cli/cmds/elasticsearch.py index 245ff3a1c..5b5d44a66 100644 --- a/unstructured/ingest/cli/cmds/elasticsearch.py +++ b/unstructured/ingest/cli/cmds/elasticsearch.py @@ -5,13 +5,12 @@ import click from unstructured.ingest.cli.base.src import BaseSrcCmd from unstructured.ingest.cli.interfaces import ( - CliMixin, + CliConfig, ) -from unstructured.ingest.interfaces import BaseConfig @dataclass -class ElasticsearchCliConfig(BaseConfig, CliMixin): +class ElasticsearchCliConfig(CliConfig): index_name: str url: str jq_query: t.Optional[str] = None diff --git a/unstructured/ingest/cli/cmds/gcs.py b/unstructured/ingest/cli/cmds/gcs.py index 95105d668..9237a8e3c 100644 --- a/unstructured/ingest/cli/cmds/gcs.py +++ b/unstructured/ingest/cli/cmds/gcs.py @@ -4,14 +4,16 @@ from dataclasses import dataclass import click from unstructured.ingest.cli.base.src import BaseSrcCmd -from unstructured.ingest.cli.interfaces import CliMixin, FileOrJson -from unstructured.ingest.interfaces import BaseConfig +from unstructured.ingest.cli.interfaces import ( + CliConfig, + FileOrJson, +) CMD_NAME = "gcs" @dataclass -class GcsCliConfig(BaseConfig, CliMixin): +class GcsCliConfig(CliConfig): service_account_key: t.Optional[t.Union[dict, str]] = None @staticmethod diff --git a/unstructured/ingest/cli/cmds/github.py b/unstructured/ingest/cli/cmds/github.py index 5528acd82..a3365565e 100644 --- a/unstructured/ingest/cli/cmds/github.py +++ b/unstructured/ingest/cli/cmds/github.py @@ -5,13 +5,12 @@ import click from unstructured.ingest.cli.base.src import BaseSrcCmd from unstructured.ingest.cli.interfaces import ( - CliMixin, + CliConfig, ) -from unstructured.ingest.interfaces import BaseConfig @dataclass -class GithubCliConfig(BaseConfig, CliMixin): +class GithubCliConfig(CliConfig): url: str git_access_token: t.Optional[str] = None git_branch: t.Optional[str] = None diff --git a/unstructured/ingest/cli/cmds/gitlab.py b/unstructured/ingest/cli/cmds/gitlab.py index b277a9413..6708f8282 100644 --- a/unstructured/ingest/cli/cmds/gitlab.py +++ b/unstructured/ingest/cli/cmds/gitlab.py @@ -5,13 +5,12 @@ import click from unstructured.ingest.cli.base.src import BaseSrcCmd from unstructured.ingest.cli.interfaces import ( - CliMixin, + CliConfig, ) -from unstructured.ingest.interfaces import BaseConfig @dataclass -class GitlabCliConfig(BaseConfig, CliMixin): +class GitlabCliConfig(CliConfig): url: str git_access_token: t.Optional[str] = None git_branch: t.Optional[str] = None diff --git a/unstructured/ingest/cli/cmds/google_drive.py b/unstructured/ingest/cli/cmds/google_drive.py index 5e1158413..4c2a92640 100644 --- a/unstructured/ingest/cli/cmds/google_drive.py +++ b/unstructured/ingest/cli/cmds/google_drive.py @@ -4,12 +4,15 @@ from dataclasses import dataclass import click from unstructured.ingest.cli.base.src import BaseSrcCmd -from unstructured.ingest.cli.interfaces import CliMixin, CliRecursiveConfig, FileOrJson -from unstructured.ingest.interfaces import BaseConfig +from unstructured.ingest.cli.interfaces import ( + CliConfig, + CliRecursiveConfig, + FileOrJson, +) @dataclass -class GoogleDriveCliConfig(BaseConfig, CliMixin): +class GoogleDriveCliConfig(CliConfig): drive_id: str service_account_key: t.Union[dict, str] extension: t.Optional[str] = None diff --git a/unstructured/ingest/cli/cmds/jira.py b/unstructured/ingest/cli/cmds/jira.py index 539b60443..b75a57588 100644 --- a/unstructured/ingest/cli/cmds/jira.py +++ b/unstructured/ingest/cli/cmds/jira.py @@ -5,14 +5,13 @@ import click from unstructured.ingest.cli.base.src import BaseSrcCmd from unstructured.ingest.cli.interfaces import ( - CliMixin, + CliConfig, DelimitedString, ) -from unstructured.ingest.interfaces import BaseConfig @dataclass -class JiraCliConfig(BaseConfig, CliMixin): +class JiraCliConfig(CliConfig): api_token: str url: str user_email: str diff --git a/unstructured/ingest/cli/cmds/local.py b/unstructured/ingest/cli/cmds/local.py index 66b76ce77..0886c57e0 100644 --- a/unstructured/ingest/cli/cmds/local.py +++ b/unstructured/ingest/cli/cmds/local.py @@ -5,14 +5,13 @@ import click from unstructured.ingest.cli.base.src import BaseSrcCmd from unstructured.ingest.cli.interfaces import ( - CliMixin, + CliConfig, CliRecursiveConfig, ) -from unstructured.ingest.interfaces import BaseConfig @dataclass -class LocalCliConfig(BaseConfig, CliMixin): +class LocalCliConfig(CliConfig): input_path: str file_glob: t.Optional[str] = None diff --git a/unstructured/ingest/cli/cmds/notion.py b/unstructured/ingest/cli/cmds/notion.py index b149c339a..e8c36ae18 100644 --- a/unstructured/ingest/cli/cmds/notion.py +++ b/unstructured/ingest/cli/cmds/notion.py @@ -5,15 +5,14 @@ import click from unstructured.ingest.cli.base.src import BaseSrcCmd from unstructured.ingest.cli.interfaces import ( - CliMixin, + CliConfig, CliRecursiveConfig, DelimitedString, ) -from unstructured.ingest.interfaces import BaseConfig @dataclass -class NotionCliConfig(BaseConfig, CliMixin): +class NotionCliConfig(CliConfig): notion_api_key: str page_ids: t.Optional[t.List[str]] database_ids: t.Optional[t.List[str]] diff --git a/unstructured/ingest/cli/cmds/onedrive.py b/unstructured/ingest/cli/cmds/onedrive.py index ab947cd5d..089cbce5d 100644 --- a/unstructured/ingest/cli/cmds/onedrive.py +++ b/unstructured/ingest/cli/cmds/onedrive.py @@ -5,14 +5,13 @@ import click from unstructured.ingest.cli.base.src import BaseSrcCmd from unstructured.ingest.cli.interfaces import ( - CliMixin, + CliConfig, CliRecursiveConfig, ) -from unstructured.ingest.interfaces import BaseConfig @dataclass -class OnedriveCliConfig(BaseConfig, CliMixin): +class OnedriveCliConfig(CliConfig): client_id: str client_cred: str user_pname: str diff --git a/unstructured/ingest/cli/cmds/outlook.py b/unstructured/ingest/cli/cmds/outlook.py index ecc9148f3..98904d1ee 100644 --- a/unstructured/ingest/cli/cmds/outlook.py +++ b/unstructured/ingest/cli/cmds/outlook.py @@ -5,15 +5,14 @@ import click from unstructured.ingest.cli.base.src import BaseSrcCmd from unstructured.ingest.cli.interfaces import ( - CliMixin, + CliConfig, CliRecursiveConfig, DelimitedString, ) -from unstructured.ingest.interfaces import BaseConfig @dataclass -class OutlookCliConfig(BaseConfig, CliMixin): +class OutlookCliConfig(CliConfig): client_id: str user_email: str tenant: t.Optional[str] = "common" diff --git a/unstructured/ingest/cli/cmds/reddit.py b/unstructured/ingest/cli/cmds/reddit.py index 1fc4623ac..a4efdb124 100644 --- a/unstructured/ingest/cli/cmds/reddit.py +++ b/unstructured/ingest/cli/cmds/reddit.py @@ -5,13 +5,12 @@ import click from unstructured.ingest.cli.base.src import BaseSrcCmd from unstructured.ingest.cli.interfaces import ( - CliMixin, + CliConfig, ) -from unstructured.ingest.interfaces import BaseConfig @dataclass -class RedditCliConfig(BaseConfig, CliMixin): +class RedditCliConfig(CliConfig): client_id: str client_secret: str subreddit_name: str diff --git a/unstructured/ingest/cli/cmds/s3.py b/unstructured/ingest/cli/cmds/s3.py index a2d4173c4..2c6bfbf1a 100644 --- a/unstructured/ingest/cli/cmds/s3.py +++ b/unstructured/ingest/cli/cmds/s3.py @@ -5,15 +5,14 @@ import click from unstructured.ingest.cli.base.src import BaseSrcCmd from unstructured.ingest.cli.interfaces import ( - CliMixin, + CliConfig, ) -from unstructured.ingest.interfaces import BaseConfig CMD_NAME = "s3" @dataclass -class S3CliConfig(BaseConfig, CliMixin): +class S3CliConfig(CliConfig): anonymous: bool = False endpoint_url: t.Optional[str] = None diff --git a/unstructured/ingest/cli/cmds/salesforce.py b/unstructured/ingest/cli/cmds/salesforce.py index 56744c87b..d4ba3dea1 100644 --- a/unstructured/ingest/cli/cmds/salesforce.py +++ b/unstructured/ingest/cli/cmds/salesforce.py @@ -5,15 +5,14 @@ import click from unstructured.ingest.cli.base.src import BaseSrcCmd from unstructured.ingest.cli.interfaces import ( - CliMixin, + CliConfig, CliRecursiveConfig, DelimitedString, ) -from unstructured.ingest.interfaces import BaseConfig @dataclass -class SalesforceCliConfig(BaseConfig, CliMixin): +class SalesforceCliConfig(CliConfig): username: str consumer_key: str private_key_path: str diff --git a/unstructured/ingest/cli/cmds/sharepoint.py b/unstructured/ingest/cli/cmds/sharepoint.py index 6c2fa0ca4..c73dd43bb 100644 --- a/unstructured/ingest/cli/cmds/sharepoint.py +++ b/unstructured/ingest/cli/cmds/sharepoint.py @@ -5,14 +5,13 @@ import click from unstructured.ingest.cli.base.src import BaseSrcCmd from unstructured.ingest.cli.interfaces import ( - CliMixin, + CliConfig, CliRecursiveConfig, ) -from unstructured.ingest.interfaces import BaseConfig @dataclass -class SharepointCliConfig(BaseConfig, CliMixin): +class SharepointCliConfig(CliConfig): client_id: t.Optional[str] = None client_cred: t.Optional[str] = None site: t.Optional[str] = None diff --git a/unstructured/ingest/cli/cmds/slack.py b/unstructured/ingest/cli/cmds/slack.py index 2ef4b5167..baea6617d 100644 --- a/unstructured/ingest/cli/cmds/slack.py +++ b/unstructured/ingest/cli/cmds/slack.py @@ -5,14 +5,13 @@ import click from unstructured.ingest.cli.base.src import BaseSrcCmd from unstructured.ingest.cli.interfaces import ( - CliMixin, + CliConfig, DelimitedString, ) -from unstructured.ingest.interfaces import BaseConfig @dataclass -class SlackCliConfig(BaseConfig, CliMixin): +class SlackCliConfig(CliConfig): token: str channels: t.List[str] start_date: t.Optional[str] = None diff --git a/unstructured/ingest/cli/cmds/wikipedia.py b/unstructured/ingest/cli/cmds/wikipedia.py index e42ec8714..f2165be57 100644 --- a/unstructured/ingest/cli/cmds/wikipedia.py +++ b/unstructured/ingest/cli/cmds/wikipedia.py @@ -5,13 +5,12 @@ import click from unstructured.ingest.cli.base.src import BaseSrcCmd from unstructured.ingest.cli.interfaces import ( - CliMixin, + CliConfig, ) -from unstructured.ingest.interfaces import BaseConfig @dataclass -class WikipediaCliConfig(BaseConfig, CliMixin): +class WikipediaCliConfig(CliConfig): page_title: str auto_suggest: bool = True diff --git a/unstructured/ingest/cli/interfaces.py b/unstructured/ingest/cli/interfaces.py index a5a365506..2bda79c87 100644 --- a/unstructured/ingest/cli/interfaces.py +++ b/unstructured/ingest/cli/interfaces.py @@ -108,6 +108,10 @@ class CliMixin: cmd.params.append(param) +class CliConfig(BaseConfig, CliMixin): + pass + + class CliRetryStrategyConfig(RetryStrategyConfig, CliMixin): @staticmethod def get_cli_options() -> t.List[click.Option]: @@ -319,7 +323,7 @@ class CliPartitionConfig(PartitionConfig, CliMixin): return options -class CliRecursiveConfig(BaseConfig, CliMixin): +class CliRecursiveConfig(CliConfig): recursive: bool @staticmethod diff --git a/unstructured/ingest/cli/utils.py b/unstructured/ingest/cli/utils.py index 12083585c..7ca5f34ac 100644 --- a/unstructured/ingest/cli/utils.py +++ b/unstructured/ingest/cli/utils.py @@ -5,8 +5,8 @@ import click from unstructured.ingest.cli.interfaces import ( CliChunkingConfig, + CliConfig, CliEmbeddingConfig, - CliMixin, CliPartitionConfig, CliPermissionsConfig, CliProcessorConfig, @@ -51,8 +51,8 @@ def extract_configs( return res -def add_options(cmd: click.Command, extras=t.List[t.Type[CliMixin]], is_src=True) -> click.Command: - configs: t.List[t.Type[CliMixin]] = ( +def add_options(cmd: click.Command, extras=t.List[t.Type[CliConfig]], is_src=True) -> click.Command: + configs: t.List[t.Type[CliConfig]] = ( [ CliPartitionConfig, CliReadConfig,