saqds 1.9.5__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- saqds-1.9.5/.gitignore +41 -0
- saqds-1.9.5/LICENSE.txt +3 -0
- saqds-1.9.5/PKG-INFO +166 -0
- saqds-1.9.5/README.md +147 -0
- saqds-1.9.5/pyproject.toml +101 -0
- saqds-1.9.5/scripts/build-release-windows.bat +82 -0
- saqds-1.9.5/scripts/build-release-windows.ps1 +364 -0
- saqds-1.9.5/scripts/draw_formula.py +23 -0
- saqds-1.9.5/src/saqds/__init__.py +61 -0
- saqds-1.9.5/src/saqds/cli.py +23 -0
- saqds-1.9.5/src/saqds/clickhouse_tool.py +978 -0
- saqds-1.9.5/src/saqds/evaluate.py +188 -0
- saqds-1.9.5/src/saqds/factor.py +136 -0
- saqds-1.9.5/src/saqds/formula_plot.py +46 -0
- saqds-1.9.5/src/saqds/math.py +6 -0
- saqds-1.9.5/src/saqds/stats.py +9 -0
- saqds-1.9.5/tests/test_api.py +171 -0
- saqds-1.9.5/tests/test_cli.py +29 -0
- saqds-1.9.5/tests/test_clickhouse_tool.py +981 -0
- saqds-1.9.5/tests/test_evaluate.py +303 -0
- saqds-1.9.5/tests/test_factor.py +140 -0
- saqds-1.9.5/tests/test_formula_plot.py +25 -0
- saqds-1.9.5/tests/test_math.py +8 -0
- saqds-1.9.5/tests/test_stats.py +16 -0
saqds-1.9.5/.gitignore
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# 本地环境配置(含密钥,勿提交)
|
|
2
|
+
.env
|
|
3
|
+
.env.*
|
|
4
|
+
!.env.example
|
|
5
|
+
|
|
6
|
+
# Python 缓存与编译产物
|
|
7
|
+
__pycache__/
|
|
8
|
+
*.py[cod]
|
|
9
|
+
*.egg-info/
|
|
10
|
+
.eggs/
|
|
11
|
+
|
|
12
|
+
# uv 虚拟环境
|
|
13
|
+
.venv/
|
|
14
|
+
venv/
|
|
15
|
+
|
|
16
|
+
# 构建 / 打包产物
|
|
17
|
+
build/
|
|
18
|
+
dist/
|
|
19
|
+
*.build-cache/
|
|
20
|
+
|
|
21
|
+
# 测试与覆盖率
|
|
22
|
+
.pytest_cache/
|
|
23
|
+
.coverage
|
|
24
|
+
.coverage.*
|
|
25
|
+
htmlcov/
|
|
26
|
+
|
|
27
|
+
# 类型检查缓存
|
|
28
|
+
.ty/
|
|
29
|
+
|
|
30
|
+
# mkdocs 构建产物
|
|
31
|
+
docs/site/
|
|
32
|
+
|
|
33
|
+
# 运行期数据 / 日志
|
|
34
|
+
*.log
|
|
35
|
+
ray_workspace/
|
|
36
|
+
|
|
37
|
+
# 系统与编辑器
|
|
38
|
+
.DS_Store
|
|
39
|
+
Thumbs.db
|
|
40
|
+
.idea/
|
|
41
|
+
.vscode/
|
saqds-1.9.5/LICENSE.txt
ADDED
saqds-1.9.5/PKG-INFO
ADDED
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: saqds
|
|
3
|
+
Version: 1.9.5
|
|
4
|
+
Summary: Quant core toolkit: A股行情(SAOIDC密钥鉴权直连ClickHouse)+VNPY数据接口、数学/统计指标、公式可视化绘图、CLI工具、Ray分布式批量任务
|
|
5
|
+
Project-URL: Homepage, https://gitlab.dc3.everonquant.net/foundation/python/core
|
|
6
|
+
Author-email: SequArc 序衍 <dev@sequarc.tech>
|
|
7
|
+
License: 序衍量化 版权所有,未经书面许可禁止外部分发/商用
|
|
8
|
+
License-File: LICENSE.txt
|
|
9
|
+
Requires-Python: >=3.10
|
|
10
|
+
Requires-Dist: akshare
|
|
11
|
+
Requires-Dist: click>=8.3.2
|
|
12
|
+
Requires-Dist: clickhouse-connect>=0.8
|
|
13
|
+
Requires-Dist: matplotlib>=3.8
|
|
14
|
+
Requires-Dist: numpy>=1.26
|
|
15
|
+
Requires-Dist: pandas>=2.0
|
|
16
|
+
Requires-Dist: ray[default]>=2.55.1
|
|
17
|
+
Requires-Dist: vnpy[no-gui]>=4.4.0
|
|
18
|
+
Description-Content-Type: text/markdown
|
|
19
|
+
|
|
20
|
+
# Saqds Quant Toolkit
|
|
21
|
+
序衍量化内部量化核心工具库
|
|
22
|
+
> Version: v1.7.5 | Python >=3.10 | Package Manager: uv
|
|
23
|
+
|
|
24
|
+
## 项目简介
|
|
25
|
+
一套面向投研的轻量化量化底层工具集:
|
|
26
|
+
- 📈 行情接口:Akshare A股日线封装,兼容VNPY数据接口
|
|
27
|
+
- 🧮 数值工具:基础数学函数、量化统计指标
|
|
28
|
+
- 📊 可视化:服务端无GUI环境一元数学公式绘图
|
|
29
|
+
- 💻 命令行:内置CLI工具,快速计算
|
|
30
|
+
- ⚡ 分布式:基于Ray实现多标的批量并发任务
|
|
31
|
+
|
|
32
|
+
> 【版权说明】序衍量化专有代码,未经书面许可禁止外部分发、商用。
|
|
33
|
+
|
|
34
|
+
## 目录结构
|
|
35
|
+
```
|
|
36
|
+
./
|
|
37
|
+
├── docs/ # mkdocs 文档站
|
|
38
|
+
├── scripts/ # 独立运行脚本(调试/演示/分布式任务)
|
|
39
|
+
├── specs/ # 技术设计文档(Spec)
|
|
40
|
+
├── src/saqds/ # 核心源码包(可import导入)
|
|
41
|
+
├── tests/ # 单元测试用例
|
|
42
|
+
├── CHANGELOG.md # 版本变更记录
|
|
43
|
+
├── Dockerfile # 容器部署文件
|
|
44
|
+
├── LICENSE.txt # 版权声明
|
|
45
|
+
├── Makefile # 工程运维(对齐 saqds 平台模版)
|
|
46
|
+
├── pyproject.toml # uv项目配置、依赖、工具链
|
|
47
|
+
├── README.md
|
|
48
|
+
├── .env.example # 环境配置模板(复制为 .env 填写)
|
|
49
|
+
└── uv.lock # 依赖锁文件,保障环境一致性
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## uv 包管理器安装(国内服务器)
|
|
53
|
+
> ⚠️ 请勿执行 `apt install uv`,Ubuntu官方软件源不包含uv
|
|
54
|
+
|
|
55
|
+
### 方式1|二进制部署(生产服务器推荐)
|
|
56
|
+
```bash
|
|
57
|
+
# 版本与架构按需调整:x86_64-unknown-linux-gnu / aarch64-unknown-linux-gnu / armv7-unknown-linux-gnueabihf
|
|
58
|
+
VER=0.11.31
|
|
59
|
+
ARCH=armv7-unknown-linux-gnueabihf
|
|
60
|
+
|
|
61
|
+
# ghproxy国内加速下载
|
|
62
|
+
wget https://ghproxy.com/https://github.com/astral-sh/uv/releases/download/$VER/uv-$ARCH.tar.gz
|
|
63
|
+
|
|
64
|
+
# 解压并全局安装
|
|
65
|
+
tar -xf uv-$ARCH.tar.gz
|
|
66
|
+
sudo mv uv uvx /usr/local/bin/
|
|
67
|
+
rm -rf uv-$ARCH.tar.gz
|
|
68
|
+
|
|
69
|
+
# 写入全局配置:清华PyPI源
|
|
70
|
+
mkdir -p ~/.config/uv
|
|
71
|
+
cat > ~/.config/uv/uv.toml <<'EOF'
|
|
72
|
+
[[index]]
|
|
73
|
+
url = "https://pypi.tuna.tsinghua.edu.cn/simple"
|
|
74
|
+
default = true
|
|
75
|
+
EOF
|
|
76
|
+
|
|
77
|
+
# 校验安装
|
|
78
|
+
uv --version
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### 方式2|官方脚本快速安装(外网畅通环境)
|
|
82
|
+
```bash
|
|
83
|
+
curl -LsSf https://astral.org.cn/uv/install.sh | sh
|
|
84
|
+
source $HOME/.cargo/env
|
|
85
|
+
# 配置国内源
|
|
86
|
+
uv config set index-url https://pypi.tuna.tsinghua.edu.cn/simple
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
## 环境准备
|
|
90
|
+
### 1. 初始化虚拟环境
|
|
91
|
+
```bash
|
|
92
|
+
# 拉取全部依赖(包含开发工具)
|
|
93
|
+
uv sync --group dev
|
|
94
|
+
# 激活虚拟环境(Linux/macOS)
|
|
95
|
+
source .venv/bin/activate
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### 2. 代码质量与静态检查
|
|
99
|
+
```bash
|
|
100
|
+
# 自动修复代码规范
|
|
101
|
+
uv run ruff check src tests --fix
|
|
102
|
+
# 统一格式化
|
|
103
|
+
uv run ruff format src tests
|
|
104
|
+
# 静态类型校验
|
|
105
|
+
uv run ty check src
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### 3. 执行单元测试
|
|
109
|
+
```bash
|
|
110
|
+
# 运行测试并开启覆盖率门禁(阈值80%)
|
|
111
|
+
uv run pytest
|
|
112
|
+
# 生成HTML覆盖率可视化报告
|
|
113
|
+
uv run pytest --cov-report=html:htmlcov
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
## 使用示例
|
|
117
|
+
### 1. 作为Python包导入
|
|
118
|
+
```python
|
|
119
|
+
import saqds
|
|
120
|
+
|
|
121
|
+
# 获取A股日线数据(纯数字代码,不带.SH/.SZ,SAOIDC 密钥鉴权后直连 ClickHouse)
|
|
122
|
+
df = saqds.get_stock_hist("600519", "20260101", "20260716")
|
|
123
|
+
# 数学计算
|
|
124
|
+
sq_sum = saqds.sum_of_squares([1, 2, 3])
|
|
125
|
+
avg = saqds.mean([2, 4, 6])
|
|
126
|
+
# 公式绘图
|
|
127
|
+
img_path = saqds.plot_custom_formula("x**2 - 4*x")
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
### 2. 命令行工具(平方和计算)
|
|
131
|
+
```bash
|
|
132
|
+
# 普通正数
|
|
133
|
+
uv run saqds 1 2 3 4
|
|
134
|
+
# 传入负数,必须使用 -- 分隔符
|
|
135
|
+
uv run saqds -- -1 2.5
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
### 3. 执行scripts下独立脚本
|
|
139
|
+
```bash
|
|
140
|
+
# 交互式自定义公式绘图
|
|
141
|
+
uv run python scripts/draw_formula.py
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
## Ray分布式说明
|
|
145
|
+
- 支持单机本地集群,同时兼容远程Ray集群;
|
|
146
|
+
- 通过环境变量 `RAY_ADDRESS` 指定集群地址接入多机集群;
|
|
147
|
+
- 任务内部自动配置 `PYTHONPATH`,保证容器/服务器环境导入正常。
|
|
148
|
+
|
|
149
|
+
## 容器构建与运行
|
|
150
|
+
```bash
|
|
151
|
+
# 构建镜像
|
|
152
|
+
docker build -t saqds-quant:v1.7.5 .
|
|
153
|
+
# 默认执行 saqds CLI(--help)
|
|
154
|
+
docker run --rm saqds-quant:v1.7.5
|
|
155
|
+
# 自定义执行:平方和计算
|
|
156
|
+
docker run --rm saqds-quant:v1.7.5 uv run saqds 1 2 3 4
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
## 开发规范
|
|
160
|
+
1. 新增核心函数在 `src/saqds/` 对应模块实现,并在 `__init__.py` 按需导出;
|
|
161
|
+
2. 新增API必须配套 `tests/` 单元测试,IO/网络相关使用mock隔离外部依赖;
|
|
162
|
+
3. scripts仅作为可执行入口,不承载业务核心逻辑;
|
|
163
|
+
4. 版本迭代变更写入 `CHANGELOG.md`,遵循 Keep a Changelog 格式。
|
|
164
|
+
|
|
165
|
+
## 联系方式
|
|
166
|
+
作者: SequArc(序衍量化)
|
saqds-1.9.5/README.md
ADDED
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
# Saqds Quant Toolkit
|
|
2
|
+
序衍量化内部量化核心工具库
|
|
3
|
+
> Version: v1.7.5 | Python >=3.10 | Package Manager: uv
|
|
4
|
+
|
|
5
|
+
## 项目简介
|
|
6
|
+
一套面向投研的轻量化量化底层工具集:
|
|
7
|
+
- 📈 行情接口:Akshare A股日线封装,兼容VNPY数据接口
|
|
8
|
+
- 🧮 数值工具:基础数学函数、量化统计指标
|
|
9
|
+
- 📊 可视化:服务端无GUI环境一元数学公式绘图
|
|
10
|
+
- 💻 命令行:内置CLI工具,快速计算
|
|
11
|
+
- ⚡ 分布式:基于Ray实现多标的批量并发任务
|
|
12
|
+
|
|
13
|
+
> 【版权说明】序衍量化专有代码,未经书面许可禁止外部分发、商用。
|
|
14
|
+
|
|
15
|
+
## 目录结构
|
|
16
|
+
```
|
|
17
|
+
./
|
|
18
|
+
├── docs/ # mkdocs 文档站
|
|
19
|
+
├── scripts/ # 独立运行脚本(调试/演示/分布式任务)
|
|
20
|
+
├── specs/ # 技术设计文档(Spec)
|
|
21
|
+
├── src/saqds/ # 核心源码包(可import导入)
|
|
22
|
+
├── tests/ # 单元测试用例
|
|
23
|
+
├── CHANGELOG.md # 版本变更记录
|
|
24
|
+
├── Dockerfile # 容器部署文件
|
|
25
|
+
├── LICENSE.txt # 版权声明
|
|
26
|
+
├── Makefile # 工程运维(对齐 saqds 平台模版)
|
|
27
|
+
├── pyproject.toml # uv项目配置、依赖、工具链
|
|
28
|
+
├── README.md
|
|
29
|
+
├── .env.example # 环境配置模板(复制为 .env 填写)
|
|
30
|
+
└── uv.lock # 依赖锁文件,保障环境一致性
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## uv 包管理器安装(国内服务器)
|
|
34
|
+
> ⚠️ 请勿执行 `apt install uv`,Ubuntu官方软件源不包含uv
|
|
35
|
+
|
|
36
|
+
### 方式1|二进制部署(生产服务器推荐)
|
|
37
|
+
```bash
|
|
38
|
+
# 版本与架构按需调整:x86_64-unknown-linux-gnu / aarch64-unknown-linux-gnu / armv7-unknown-linux-gnueabihf
|
|
39
|
+
VER=0.11.31
|
|
40
|
+
ARCH=armv7-unknown-linux-gnueabihf
|
|
41
|
+
|
|
42
|
+
# ghproxy国内加速下载
|
|
43
|
+
wget https://ghproxy.com/https://github.com/astral-sh/uv/releases/download/$VER/uv-$ARCH.tar.gz
|
|
44
|
+
|
|
45
|
+
# 解压并全局安装
|
|
46
|
+
tar -xf uv-$ARCH.tar.gz
|
|
47
|
+
sudo mv uv uvx /usr/local/bin/
|
|
48
|
+
rm -rf uv-$ARCH.tar.gz
|
|
49
|
+
|
|
50
|
+
# 写入全局配置:清华PyPI源
|
|
51
|
+
mkdir -p ~/.config/uv
|
|
52
|
+
cat > ~/.config/uv/uv.toml <<'EOF'
|
|
53
|
+
[[index]]
|
|
54
|
+
url = "https://pypi.tuna.tsinghua.edu.cn/simple"
|
|
55
|
+
default = true
|
|
56
|
+
EOF
|
|
57
|
+
|
|
58
|
+
# 校验安装
|
|
59
|
+
uv --version
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### 方式2|官方脚本快速安装(外网畅通环境)
|
|
63
|
+
```bash
|
|
64
|
+
curl -LsSf https://astral.org.cn/uv/install.sh | sh
|
|
65
|
+
source $HOME/.cargo/env
|
|
66
|
+
# 配置国内源
|
|
67
|
+
uv config set index-url https://pypi.tuna.tsinghua.edu.cn/simple
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## 环境准备
|
|
71
|
+
### 1. 初始化虚拟环境
|
|
72
|
+
```bash
|
|
73
|
+
# 拉取全部依赖(包含开发工具)
|
|
74
|
+
uv sync --group dev
|
|
75
|
+
# 激活虚拟环境(Linux/macOS)
|
|
76
|
+
source .venv/bin/activate
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### 2. 代码质量与静态检查
|
|
80
|
+
```bash
|
|
81
|
+
# 自动修复代码规范
|
|
82
|
+
uv run ruff check src tests --fix
|
|
83
|
+
# 统一格式化
|
|
84
|
+
uv run ruff format src tests
|
|
85
|
+
# 静态类型校验
|
|
86
|
+
uv run ty check src
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### 3. 执行单元测试
|
|
90
|
+
```bash
|
|
91
|
+
# 运行测试并开启覆盖率门禁(阈值80%)
|
|
92
|
+
uv run pytest
|
|
93
|
+
# 生成HTML覆盖率可视化报告
|
|
94
|
+
uv run pytest --cov-report=html:htmlcov
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
## 使用示例
|
|
98
|
+
### 1. 作为Python包导入
|
|
99
|
+
```python
|
|
100
|
+
import saqds
|
|
101
|
+
|
|
102
|
+
# 获取A股日线数据(纯数字代码,不带.SH/.SZ,SAOIDC 密钥鉴权后直连 ClickHouse)
|
|
103
|
+
df = saqds.get_stock_hist("600519", "20260101", "20260716")
|
|
104
|
+
# 数学计算
|
|
105
|
+
sq_sum = saqds.sum_of_squares([1, 2, 3])
|
|
106
|
+
avg = saqds.mean([2, 4, 6])
|
|
107
|
+
# 公式绘图
|
|
108
|
+
img_path = saqds.plot_custom_formula("x**2 - 4*x")
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
### 2. 命令行工具(平方和计算)
|
|
112
|
+
```bash
|
|
113
|
+
# 普通正数
|
|
114
|
+
uv run saqds 1 2 3 4
|
|
115
|
+
# 传入负数,必须使用 -- 分隔符
|
|
116
|
+
uv run saqds -- -1 2.5
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
### 3. 执行scripts下独立脚本
|
|
120
|
+
```bash
|
|
121
|
+
# 交互式自定义公式绘图
|
|
122
|
+
uv run python scripts/draw_formula.py
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
## Ray分布式说明
|
|
126
|
+
- 支持单机本地集群,同时兼容远程Ray集群;
|
|
127
|
+
- 通过环境变量 `RAY_ADDRESS` 指定集群地址接入多机集群;
|
|
128
|
+
- 任务内部自动配置 `PYTHONPATH`,保证容器/服务器环境导入正常。
|
|
129
|
+
|
|
130
|
+
## 容器构建与运行
|
|
131
|
+
```bash
|
|
132
|
+
# 构建镜像
|
|
133
|
+
docker build -t saqds-quant:v1.7.5 .
|
|
134
|
+
# 默认执行 saqds CLI(--help)
|
|
135
|
+
docker run --rm saqds-quant:v1.7.5
|
|
136
|
+
# 自定义执行:平方和计算
|
|
137
|
+
docker run --rm saqds-quant:v1.7.5 uv run saqds 1 2 3 4
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
## 开发规范
|
|
141
|
+
1. 新增核心函数在 `src/saqds/` 对应模块实现,并在 `__init__.py` 按需导出;
|
|
142
|
+
2. 新增API必须配套 `tests/` 单元测试,IO/网络相关使用mock隔离外部依赖;
|
|
143
|
+
3. scripts仅作为可执行入口,不承载业务核心逻辑;
|
|
144
|
+
4. 版本迭代变更写入 `CHANGELOG.md`,遵循 Keep a Changelog 格式。
|
|
145
|
+
|
|
146
|
+
## 联系方式
|
|
147
|
+
作者: SequArc(序衍量化)
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "saqds"
|
|
3
|
+
version = "1.9.5"
|
|
4
|
+
description = "Quant core toolkit: A股行情(SAOIDC密钥鉴权直连ClickHouse)+VNPY数据接口、数学/统计指标、公式可视化绘图、CLI工具、Ray分布式批量任务"
|
|
5
|
+
readme = "README.md"
|
|
6
|
+
# 企业闭源专有软件,非开源协议
|
|
7
|
+
license = { text = "序衍量化 版权所有,未经书面许可禁止外部分发/商用" }
|
|
8
|
+
authors = [
|
|
9
|
+
{ name = "SequArc 序衍", email = "dev@sequarc.tech" },
|
|
10
|
+
]
|
|
11
|
+
requires-python = ">=3.10"
|
|
12
|
+
dependencies = [
|
|
13
|
+
"click>=8.3.2",
|
|
14
|
+
"vnpy[no-gui]>=4.4.0",
|
|
15
|
+
"akshare",
|
|
16
|
+
"ray[default]>=2.55.1",
|
|
17
|
+
"numpy>=1.26",
|
|
18
|
+
"matplotlib>=3.8",
|
|
19
|
+
"clickhouse-connect>=0.8", # 直连 ClickHouse(SAOIDC 密钥鉴权后取数)
|
|
20
|
+
"pandas>=2.0", # DataFrame 处理
|
|
21
|
+
]
|
|
22
|
+
|
|
23
|
+
[project.urls]
|
|
24
|
+
Homepage = "https://gitlab.dc3.everonquant.net/foundation/python/core"
|
|
25
|
+
|
|
26
|
+
[project.scripts]
|
|
27
|
+
# 全局CLI命令:uv run saqds
|
|
28
|
+
saqds = "saqds.cli:main"
|
|
29
|
+
|
|
30
|
+
[build-system]
|
|
31
|
+
# uv_build 仅支持单个顶级模块;本包含 saqds,用 hatchling 显式声明
|
|
32
|
+
requires = ["hatchling>=1.27"]
|
|
33
|
+
build-backend = "hatchling.build"
|
|
34
|
+
|
|
35
|
+
[tool.hatch.build.targets.wheel]
|
|
36
|
+
packages = ["src/saqds"]
|
|
37
|
+
|
|
38
|
+
[tool.hatch.build.targets.sdist]
|
|
39
|
+
include = ["/src", "/tests", "/scripts"]
|
|
40
|
+
|
|
41
|
+
[dependency-groups]
|
|
42
|
+
# 本地开发、测试、代码规范、二进制打包依赖
|
|
43
|
+
dev = [
|
|
44
|
+
"nuitka>=4.0.8", # Python编译独立二进制程序
|
|
45
|
+
"ruff>=0.15.10", # 代码格式化、静态lint
|
|
46
|
+
"ty>=0.0.29", # 静态类型检查
|
|
47
|
+
"pytest>=7.0", # 单元测试
|
|
48
|
+
"pytest-cov>=4.0", # 代码覆盖率统计
|
|
49
|
+
"flask>=3.1.3",
|
|
50
|
+
"requests>=2.34.2",
|
|
51
|
+
"python-dotenv>=1.2.3",
|
|
52
|
+
"flask-cors>=6.0.5",
|
|
53
|
+
]
|
|
54
|
+
|
|
55
|
+
[tool.ruff]
|
|
56
|
+
line-length = 120
|
|
57
|
+
target-version = "py311"
|
|
58
|
+
exclude = [
|
|
59
|
+
".git",
|
|
60
|
+
".venv",
|
|
61
|
+
"build",
|
|
62
|
+
"dist",
|
|
63
|
+
"output",
|
|
64
|
+
"*.png"
|
|
65
|
+
]
|
|
66
|
+
|
|
67
|
+
[tool.ruff.lint]
|
|
68
|
+
select = ["E", "F", "I", "B", "C4", "UP", "N", "SIM", "RUF"]
|
|
69
|
+
# E501:允许单行超过120字符(量化长公式/行情参数)
|
|
70
|
+
# RUF001/RUF002/RUF003:允许中文字符串、docstring、中文标点不强制转义
|
|
71
|
+
ignore = ["E501", "RUF001", "RUF002", "RUF003"]
|
|
72
|
+
fixable = ["ALL"]
|
|
73
|
+
|
|
74
|
+
[tool.ruff.format]
|
|
75
|
+
quote-style = "double"
|
|
76
|
+
indent-style = "space"
|
|
77
|
+
line-ending = "auto"
|
|
78
|
+
|
|
79
|
+
[tool.ty.src]
|
|
80
|
+
include = ["src"]
|
|
81
|
+
exclude = ["tests/data", "build", "dist"]
|
|
82
|
+
|
|
83
|
+
[tool.ty.rules]
|
|
84
|
+
unresolved-import = "error"
|
|
85
|
+
index-out-of-bounds = "warn"
|
|
86
|
+
call-non-callable = "error"
|
|
87
|
+
|
|
88
|
+
[tool.ty.environment]
|
|
89
|
+
root = ["src"]
|
|
90
|
+
|
|
91
|
+
[tool.pytest.ini_options]
|
|
92
|
+
testpaths = ["tests"]
|
|
93
|
+
pythonpath = ["src"]
|
|
94
|
+
# 仅统计核心库src/saqds,覆盖率门槛80%
|
|
95
|
+
addopts = "-v --cov=src/saqds --cov-report=term-missing --cov-fail-under=80"
|
|
96
|
+
|
|
97
|
+
[tool.uv]
|
|
98
|
+
|
|
99
|
+
[[tool.uv.index]]
|
|
100
|
+
url = "https://pypi.tuna.tsinghua.edu.cn/simple"
|
|
101
|
+
default = true
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
@echo off
|
|
2
|
+
rem ==============================================================================
|
|
3
|
+
rem saqds Windows one-click build & release | double-click to run
|
|
4
|
+
rem
|
|
5
|
+
rem Flow: enumerate Python 3.10+ -> Nuitka onefile exe per version
|
|
6
|
+
rem -> uv build (wheel + sdist) -> optional twine publish to pypi.org
|
|
7
|
+
rem
|
|
8
|
+
rem Edit the CONFIG section below before use if needed. Works as-is:
|
|
9
|
+
rem * auto-detects installed Python 3.10+ (falls back to 3.12, uv downloads it)
|
|
10
|
+
rem * reuses pyproject.toml version
|
|
11
|
+
rem * build only (no publish) unless SAQDS_PYPI_TOKEN is set
|
|
12
|
+
rem ==============================================================================
|
|
13
|
+
setlocal EnableExtensions
|
|
14
|
+
|
|
15
|
+
cd /d "%~dp0.."
|
|
16
|
+
|
|
17
|
+
rem ------------------------------------------------------------------------------
|
|
18
|
+
rem CONFIG (edit me)
|
|
19
|
+
rem SAQDS_PY_VERSIONS comma list, e.g. 3.10,3.11,3.12 ; empty = auto-detect
|
|
20
|
+
rem SAQDS_VERSION release version, e.g. 1.10.0 ; empty = keep pyproject.toml
|
|
21
|
+
rem SAQDS_PYPI_TOKEN pypi.org API token (pypi-xxxx) ; empty = skip publish
|
|
22
|
+
rem SAQDS_PUBLISH_IF_TOKEN 1 = publish when token above present, 0 = never publish
|
|
23
|
+
rem ------------------------------------------------------------------------------
|
|
24
|
+
set "SAQDS_PY_VERSIONS="
|
|
25
|
+
set "SAQDS_VERSION="
|
|
26
|
+
set "SAQDS_PYPI_TOKEN="
|
|
27
|
+
set "SAQDS_PUBLISH_IF_TOKEN=1"
|
|
28
|
+
rem ------------------------------------------------------------------------------
|
|
29
|
+
rem END OF CONFIG - no need to change anything below
|
|
30
|
+
rem ------------------------------------------------------------------------------
|
|
31
|
+
|
|
32
|
+
echo.
|
|
33
|
+
echo === [1/3] Check prerequisites (uv)
|
|
34
|
+
where uv >nul 2>nul
|
|
35
|
+
if errorlevel 1 (
|
|
36
|
+
echo [..] uv not found, installing via official script...
|
|
37
|
+
powershell -NoProfile -ExecutionPolicy Bypass -Command "irm https://astral.sh/uv/install.ps1 | iex"
|
|
38
|
+
set "PATH=%USERPROFILE%\.local\bin;%PATH%"
|
|
39
|
+
where uv >nul 2>nul
|
|
40
|
+
if errorlevel 1 (
|
|
41
|
+
echo [X] uv install failed. Open a NEW terminal and re-run this file.
|
|
42
|
+
pause
|
|
43
|
+
exit /b 1
|
|
44
|
+
)
|
|
45
|
+
)
|
|
46
|
+
for /f "delims=" %%v in ('uv --version') do echo [OK] %%v
|
|
47
|
+
|
|
48
|
+
rem ---- assemble powershell arguments from config ----
|
|
49
|
+
set "PS1=%~dp0build-release-windows.ps1"
|
|
50
|
+
set "ARGS="
|
|
51
|
+
if defined SAQDS_PY_VERSIONS set "ARGS=%ARGS% -PyVersions %SAQDS_PY_VERSIONS%"
|
|
52
|
+
if defined SAQDS_VERSION set "ARGS=%ARGS% -Version %SAQDS_VERSION%"
|
|
53
|
+
|
|
54
|
+
if "%SAQDS_PUBLISH_IF_TOKEN%"=="0" goto nopublish
|
|
55
|
+
if defined SAQDS_PYPI_TOKEN goto dopublish
|
|
56
|
+
echo [i] No SAQDS_PYPI_TOKEN configured - BUILD ONLY (publish skipped)
|
|
57
|
+
goto nopublish
|
|
58
|
+
|
|
59
|
+
:dopublish
|
|
60
|
+
set "PYPI_TOKEN=%SAQDS_PYPI_TOKEN%"
|
|
61
|
+
set "ARGS=%ARGS% -Publish"
|
|
62
|
+
echo [i] PyPI token found - publish to pypi.org ENABLED (confirm inside script)
|
|
63
|
+
|
|
64
|
+
:nopublish
|
|
65
|
+
echo.
|
|
66
|
+
echo === [2/3] Build: multi-version exe + wheel/sdist
|
|
67
|
+
echo Running: powershell -ExecutionPolicy Bypass -File %PS1%%ARGS%
|
|
68
|
+
powershell -NoProfile -ExecutionPolicy Bypass -File "%PS1%"%ARGS%
|
|
69
|
+
set "RC=%ERRORLEVEL%"
|
|
70
|
+
|
|
71
|
+
echo.
|
|
72
|
+
echo === [3/3] Result
|
|
73
|
+
if not "%RC%"=="0" (
|
|
74
|
+
echo [X] Build finished with exit code %RC%. Review messages above.
|
|
75
|
+
pause
|
|
76
|
+
exit /b %RC%
|
|
77
|
+
)
|
|
78
|
+
echo [OK] Done. Artifacts in dist\: saqds-py3xx.exe / saqds.exe / saqds-<version> whl + tar.gz
|
|
79
|
+
echo.
|
|
80
|
+
echo Verify: .\dist\saqds.exe --help
|
|
81
|
+
pause
|
|
82
|
+
exit /b 0
|