支持Anaconda CLI插件的基CLI入口
项目描述
anaconda-cli-base
使用Typer支持Anaconda CLI插件的基CLI入口。
注册插件
要在第三方包中开发子命令,首先创建一个包含一个或多个命令的typer.Typer()
应用程序。请参阅此示例。您包中定义的命令将带有您在注册插件时定义的子命令作为前缀。
在您的pyproject.toml
中可以按以下方式注册子命令
# In pyproject.toml
[project.entry-points."anaconda_cli.subcommand"]
auth = "anaconda_cloud_auth.cli:app"
在上面的示例中
"anaconda_cloud_cli.subcommand"
是用于注册的必需字符串。引号很重要。auth
是新子命令的名称,即anaconda auth
- 您包中定义的所有
typer.Typer
命令都可以通过注册的子命令访问 - 即
anaconda auth <command>
。
- 您包中定义的所有
anaconda_cloud_auth.cli:app
表示anaconda_cloud_auth.cli
模块中名为app
的对象是子命令的入口点。
错误处理
默认情况下,在您的注册插件中执行CLI时引发的任何异常都将被捕获,并且只会向用户显示最小消息。
您可以为可能从您的子命令抛出的个别异常定义自定义回调。您可以注册标准库异常或自定义定义的异常的处理程序。最好使用自定义异常以避免对其他插件产生意外后果。
要注册回调,请使用装饰器装饰一个接受异常作为输入的函数,并返回一个整数错误代码。错误代码将通过CLI发送回,并且您的子命令将以该错误代码退出。
from typing import Type
from anaconda_cli_base.exceptions import register_error_handler
@register_error_handler(MyCustomException)
def better_exception_handling(e: Type[Exception]) -> int:
# do something or print useful information
return 1
@register_error_handler(AnotherException)
def just_ignore_it(e: Type[Exception])
# ignore the error and let the CLI exit successfully
return 0
@register_error_handler(YetAnotherException)
def fix_the_error_and_try_again(e: Type[Exception]) -> int:
# do something and retry the CLI command
return -1
在第二个示例中,处理程序返回-1
。这意味着处理程序已尝试纠正错误,CLI子命令应该重新尝试。处理程序可以在再次尝试CLI子命令之前调用另一个交互式命令,如登录操作。
请参阅anaconda-cloud-auth插件以获取自定义处理程序的示例。
配置文件
如果您的插件想使用Anaconda配置文件(默认位置~/.anaconda/config.toml
),以读取从anaconda_cli_base.config.AnacondaBaseSettings
派生的配置参数,您可以在配置文件中为您的插件添加一个部分。每个AnacondaBaseSettings
的子类定义了部分标题。基类被配置为允许从以下优先级从低到高读取子类中定义的参数。
AnacondaBaseSettings
子类的默认值- 全局配置文件位于
~/.anaconda/config.toml
- 工作目录中.env文件中定义的
ANACONDA_<PLUGIN-NAME>_<FIELD>
变量 - 在您的shell或命令调用中设置的
ANACONDA_<PLUGIN-NAME>_<FIELD>
环境变量 - 直接使用配置子类时传递的kwarg值
注意
AnacondaBaseSettings
是来自pydantic-settings的BaseSettings
的子类。- 还支持嵌套pydantic模型。
以下是一个示例子类
from anaconda_cli_base.config import AnacondaBaseSettings
class MyPluginConfig(AnacondaBaseSettings, plugin_name="my_plugin"):
foo: str = "bar"
根据上述优先级在您的插件中读取配置值
config = MyPluginConfig()
assert config.foo == "bar"
由于配置文件中没有foo
的值,它假设来自子类定义的默认值。
现在可以将foo
的值写入配置文件中的my_plugin
部分
# ~/.anaconda/config.toml
[plugin.my_plugin]
foo = "baz"
配置文件已写入后,从config.toml
文件读取foo
的值
config = MyPluginConfig()
assert config.foo == "baz"
有关更多示例,请参阅测试。
开发设置
确保您已安装conda
。然后运行
make setup
运行单元测试
make test
使用tox运行跨隔离环境的单元测试
make tox
项目详情
下载文件
下载适合您平台文件的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。
源分布
构建分布
anaconda_cli_base-0.4.0.tar.gz的哈希
算法 | 哈希摘要 | |
---|---|---|
SHA256 | e23cfa48030e896f301c03511e80cbef5a91a02da93e8d5d8e4198d0badea6c7 |
|
MD5 | c67ce0984dcec7de6afc6de5947797d7 |
|
BLAKE2b-256 | c6653b78beb4fe12308c3e378bf09bf3bed88f0ee3b468652fdc245ef3e11db6 |