ava-data-models
AVACloud 业务领域公共 Pydantic v2 数据模型包。
项目定位
ava-data-models 是 AVACloud 生态下的公共业务对象模型层,仅存放:
- Pydantic v2 业务对象数据模型
- 业务对象公共基类
不包含业务枚举、查询条件、分页、批量操作、通用请求/响应包装,也不包含任何业务查询、校验逻辑、持久化或外部服务调用,作为各智能体项目的公共依赖被引用。
技术栈
- Python >= 3.10
- Pydantic v2
- pydantic-settings
- typing-extensions
安装
# 作为依赖安装(发布到 PyPI 后)
pip install ava-data-models
# 本地开发安装
pip install -e ".[dev]"
目录结构
ava-data-models/
├── pyproject.toml
├── README.md
├── scripts/
│ ├── generate_from_dts.py # 从 ibas index.d.ts 自动生成模型
│ └── generate_inits.py # 生成业务模块 __init__.py
├── src/
│ └── ava_data_models/
│ ├── __init__.py # 根包导出:公共业务对象基类
│ ├── common/ # 公共基础
│ │ └── base.py # BusinessObject / Document / DocumentLine / MasterData / ...
│ ├── accounting/
│ ├── apparelindustry/
│ ├── approvalprocess/
│ ├── budget/
│ ├── businesspartner/
│ ├── cargos/
│ ├── channels/
│ ├── dealer/
│ ├── documents/
│ ├── equipment/
│ ├── groupfinancemanagement/
│ ├── humanresources/
│ ├── importexport/
│ ├── initialfantasy/
│ ├── integration/
│ ├── invoice/
│ ├── manufacturing/
│ ├── manufacturingcost/
│ ├── manufacturingoutsourcing/
│ ├── manufacturingscheduling/
│ ├── marketingpromotion/
│ ├── masterdata/
│ ├── materials/
│ ├── membercenter/
│ ├── message/
│ ├── product/
│ ├── projectsystem/
│ ├── purchase/
│ ├── qualitycontrol/
│ ├── receiptpayment/
│ ├── reimbursement/
│ ├── reportanalysis/
│ ├── sales/
│ ├── salesopportunity/
│ ├── servicecenter/
│ ├── shopping/
│ ├── store/
│ ├── supplier/
│ ├── taxation/
│ ├── thirdpartyapp/
│ └── ... # 每个业务模块独立分包
└── tests/
└── test_common.py
命名规范
- 类名:大驼峰(PascalCase),例如
SalesOrder、PurchaseRequestItem。 - 属性名:小驼峰(camelCase),例如
docEntry、customerCode,与 ibas TypeScript 声明(*.d.ts)中定义的字段名保持一致。 - 字段类型参考 *.java 源码中声明的 Java 类型,解决 d.ts 中
number不区分int/decimal的问题。
业务对象基类层次
模型基类与 ibas 业务对象体系对齐:
BusinessObject
├── MasterData # 对应 ibas.IBOMasterData
├── MasterDataLine # 对应 ibas.IBOMasterDataLine
├── Document # 对应 ibas.IBODocument
├── DocumentLine # 对应 ibas.IBODocumentLine
├── Simple # 对应 ibas.IBOSimple
└── SimpleLine # 对应 ibas.IBOSimpleLine
BusinessObject携带source_system/fetched_at跨系统溯源元信息(非 ibas 原有字段,采用 snake_case 风格以避免与业务字段命名冲突)。- 生成器仅对直接继承上述
ibas.IBO*接口的类生成模型。 - 集合壳类(如
ISalesOrderItems)不再保留,字段统一用list[T]表示。
使用示例
1. 导入公共基础模型
from ava_data_models import BusinessObject, Document
2. 导入业务模块模型
from ava_data_models.sales import SalesOrder, SalesOrderItem
from ava_data_models.purchase import PurchaseOrder, PurchaseRequest
from ava_data_models.materials import Material, Warehouse
from ava_data_models.manufacturing import ProductionOrder
3. 直接解析 ibas API 返回的 camelCase JSON
import json
from ava_data_models.sales import SalesOrder
payload = {
"docEntry": 10001,
"docNum": "SO-2024-0001",
"customerCode": "C001",
"customerName": "示例客户",
"documentTotal": 1250.00,
"salesOrderItems": [
{"itemCode": "P001", "quantity": 10.0, "price": 125.0},
],
}
order = SalesOrder.model_validate(payload)
print(order.docEntry) # 10001
print(order.customerCode) # C001
print(order.documentTotal) # 1250.0
print(len(order.salesOrderItems)) # 1
4. 序列化
# 输出 camelCase(与 ibas API 一致)
order.model_dump()
# JSON 字符串
order.model_dump_json()
模型生成脚本
本项目提供 scripts/generate_from_dts.py,可基于本地 ibas-typescript/test/apps/{module}/index.d.ts 中的 bo 命名空间自动生成对应业务模块的 Pydantic 模型。
生成范围
仅对 bo 命名空间中直接继承 ibas.IBO* 业务对象接口的类生成模型:
| ibas 接口 | Python 基类 |
|---|---|
ibas.IBusinessObject |
BusinessObject |
ibas.IBODocument |
Document |
ibas.IBODocumentLine |
DocumentLine |
ibas.IBOMasterData |
MasterData |
ibas.IBOMasterDataLine |
MasterDataLine |
ibas.IBOSimple |
Simple |
ibas.IBOSimpleLine |
SimpleLine |
集合壳类(如 ISalesOrderItems)不生成独立模型,相关字段统一用 list[T] 表示。
前提
- 本地存在 ibas 源码目录,默认搜索路径:
/home/niuren.zhu/Codes/ColorCoding/home/niuren.zhu/Codes/AVA/Cloud-v2
- 脚本会在以上路径中查找
ibas.{module}/ibas.{module}.service/src/main/webapp/index.d.ts文件。 - 可通过环境变量覆盖:
export IBAS_TEST_APPS=/path/to/ibas-typescript/test/apps
生成全部模块
python scripts/generate_from_dts.py
python scripts/generate_inits.py
生成单个模块
# 修改 generate_from_dts.py 中的 MODULES 列表,仅保留目标模块后执行
python scripts/generate_from_dts.py
python scripts/generate_inits.py
生成后注意事项
- 生成器为尽力解析,复杂的泛型、方法、跨模块引用会降级为
Any。 - 集合类(如
ISalesOrderItems)会启发式转换为list[SalesOrderItem]。 - 生成后建议人工复核关键字段类型与注释,必要时手工补充或修正。
开发
# 创建虚拟环境
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
# 安装开发依赖
pip install -e ".[dev]"
# 运行测试
pytest tests/ -v
# 代码格式化(可选)
black src tests
ruff check src tests --fix
发布到 PyPI
# 1. 安装构建与上传工具
pip install build twine
# 2. 清理历史构建产物
rm -rf dist/ build/ *.egg-info
# 3. 构建源码分发包与 Wheel
python -m build
# 4. 先上传到 TestPyPI 验证(可选)
python -m twine upload --repository testpypi dist/*
# 5. 上传到正式 PyPI
python -m twine upload dist/*
上传前请确认:
pyproject.toml中的version已更新。- 已配置 PyPI API token(
~/.pypirc或通过twine login)。
贡献与维护
- 新增业务模块:在
src/ava_data_models/下新增分包,参照现有模块结构编写models.py与__init__.py。 - 修改公共模型:优先在
common/中定义,并在common/__init__.py与根包__init__.py中导出。 - 保持只存放业务对象模型,不引入枚举、查询条件、分页、批量操作、业务逻辑、数据库查询或外部 HTTP 调用。
许可证
Metadata
Release files for ava-data-models 0.2.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| ava_data_models-0.2.1.tar.gz | 108.9 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| ava_data_models-0.2.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 260.1 kB
Release files / ava_data_models-0.2.1.tar.gz
| Download URL | ava_data_models-0.2.1.tar.gz |
|---|---|
| Size | 108.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
3b8fc709f4b84751673b8f13f684aa34922c2e891c880a3364c81a07b67c1d2c
|
|
BLAKE2b-256 checksum How to use checksums |
287995b57c487c8c9c3f9432bf34517ebdd8c67ab386899c14bfc907c001f4df
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.14.6
|
Release files / ava_data_models-0.2.1-py3-none-any.whl
| Download URL | ava_data_models-0.2.1-py3-none-any.whl |
|---|---|
| Size | 151.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
733125ff18cfbd13163697197469c4932c2457b4d7838495e3cc91c5edcc46af
|
|
BLAKE2b-256 checksum How to use checksums |
232c9962a370a65aa5b713e090e450ffe4430a3647cc8917f4881d6c05a57732
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.14.6
|
Security for ava-data-models 0.2.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.