Source code for boto3_dataclass.models.caster
# -*- coding: utf-8 -*-
"""
这个模块负责对 Client 转换器 (Caster) 进行数据建模. 用于将 boto3 原生响应
自动转换为对应的 dataclass 对象.
Caster 模块的作用是提供一个便捷的转换层, 让用户可以无缝地将 boto3 client 的
响应从 TypedDict 格式转换为更易于使用的 dataclass 对象.
例如::
# 原生 boto3 用法
client = boto3.client('iam')
response = client.get_role(RoleName='my-role') # 返回 dict
role_id = response['Role']['RoleId'] # 需要手动访问字典键
# 使用 Caster 后的用法
response = client.get_role(RoleName='my-role')
role = caster.get_role(response) # 转换为 dataclass
role_id = role.Role.RoleId # 类型安全的属性访问
"""
import dataclasses
from functools import cached_property
from ..templates.template_enum import tpl_enum
[docs]
@dataclasses.dataclass
class CasterMethod:
"""
储存着单个转换器方法的信息, 对应一个 AWS service client 的方法.
每个 CasterMethod 代表一个从 boto3 原生响应到 dataclass 的转换方法.
例如 IAM service 的 get_role 方法会对应一个 CasterMethod 实例.
:param method_name: 方法名称, 例如 'get_role', 'list_users'
:param boto3_stubs_type_name: boto3-stubs 中的 TypedDict 类型名称,
例如 'GetRoleResponseTypeDef'
:param boto3_dataclass_type_name: 对应的 dataclass 类型名称,
例如 'GetRoleResponse' (移除了 'TypeDef' 后缀)
"""
method_name: str = dataclasses.field()
boto3_stubs_type_name: str = dataclasses.field()
boto3_dataclass_type_name: str = dataclasses.field()
[docs]
def gen_code(self) -> str:
"""
生成转换器方法的代码字符串.
生成的代码会是一个方法, 接收 boto3 原生响应并返回对应的 dataclass 对象.
"""
tpl = tpl_enum.boto3_dataclass_service__package__caster_method
return tpl.render(caster_method=self)
[docs]
@dataclasses.dataclass
class CasterModule:
"""
储存着整个服务的转换器模块信息, 包含该服务所有可转换方法的集合.
每个 AWS 服务 (如 IAM, S3, EC2) 都会对应一个 CasterModule 实例,
包含该服务所有返回 TypedDict 的 client 方法的转换器.
:param service_name: AWS 服务名称, 例如 'iam', 's3', 'ec2'
:param cms: CasterMethod 列表, 包含该服务所有可转换的方法
"""
service_name: str = dataclasses.field()
cms: list[CasterMethod] = dataclasses.field(default_factory=list)
@cached_property
def cms_mapping(self) -> dict[str, "CasterMethod"]:
"""
NEW 通过方法名称获取转换器方法的映射, 例如 ``{"get_role": <CasterMethod>, ...}``.
"""
return {cm.method_name: cm for cm in self.cms}
[docs]
def gen_code(self) -> str:
"""
生成整个转换器模块的代码字符串.
生成的代码会是一个完整的 Python 模块, 包含该服务所有转换器方法.
用户可以直接导入并使用这个模块来转换 boto3 响应.
"""
tpl = tpl_enum.boto3_dataclass_service__package__caster_py
return tpl.render(caster_module=self)