quantdb-sdk 0.2.7__tar.gz → 0.3.3__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.
- {quantdb_sdk-0.2.7 → quantdb_sdk-0.3.3}/CHANGELOG.md +173 -113
- {quantdb_sdk-0.2.7 → quantdb_sdk-0.3.3}/MANIFEST.in +5 -5
- {quantdb_sdk-0.2.7/quantdb_sdk.egg-info → quantdb_sdk-0.3.3}/PKG-INFO +6 -6
- {quantdb_sdk-0.2.7 → quantdb_sdk-0.3.3}/README.md +3 -3
- {quantdb_sdk-0.2.7 → quantdb_sdk-0.3.3}/pyproject.toml +67 -67
- {quantdb_sdk-0.2.7 → quantdb_sdk-0.3.3}/quantdb_sdk/__init__.py +53 -33
- {quantdb_sdk-0.2.7 → quantdb_sdk-0.3.3}/quantdb_sdk/__main__.py +36 -2
- {quantdb_sdk-0.2.7 → quantdb_sdk-0.3.3}/quantdb_sdk/_utils.py +127 -1
- {quantdb_sdk-0.2.7 → quantdb_sdk-0.3.3}/quantdb_sdk/async_client.py +892 -665
- {quantdb_sdk-0.2.7 → quantdb_sdk-0.3.3}/quantdb_sdk/client.py +303 -36
- quantdb_sdk-0.3.3/quantdb_sdk/examples/__init__.py +9 -0
- quantdb_sdk-0.3.3/quantdb_sdk/examples/demo_01_connect_basics.py +50 -0
- quantdb_sdk-0.3.3/quantdb_sdk/examples/demo_02_kline_v2_daily.py +48 -0
- quantdb_sdk-0.3.3/quantdb_sdk/examples/demo_03_sync_full_market.py +50 -0
- quantdb_sdk-0.3.3/quantdb_sdk/examples/demo_04_duckdb_warehouse.py +46 -0
- quantdb_sdk-0.3.3/quantdb_sdk/examples/demo_05_read_local_data.py +68 -0
- quantdb_sdk-0.3.3/quantdb_sdk/examples/demo_06_tick_and_factors.py +45 -0
- quantdb_sdk-0.3.3/quantdb_sdk/layout.py +126 -0
- {quantdb_sdk-0.2.7 → quantdb_sdk-0.3.3/quantdb_sdk.egg-info}/PKG-INFO +6 -6
- {quantdb_sdk-0.2.7 → quantdb_sdk-0.3.3}/quantdb_sdk.egg-info/SOURCES.txt +12 -1
- quantdb_sdk-0.3.3/tests/test_hub_models.py +125 -0
- quantdb_sdk-0.3.3/tests/test_layout.py +101 -0
- quantdb_sdk-0.3.3/tests/test_utils.py +102 -0
- {quantdb_sdk-0.2.7 → quantdb_sdk-0.3.3}/LICENSE +0 -0
- {quantdb_sdk-0.2.7 → quantdb_sdk-0.3.3}/quantdb_sdk/errors.py +0 -0
- {quantdb_sdk-0.2.7 → quantdb_sdk-0.3.3}/quantdb_sdk/py.typed +0 -0
- {quantdb_sdk-0.2.7 → quantdb_sdk-0.3.3}/quantdb_sdk.egg-info/dependency_links.txt +0 -0
- {quantdb_sdk-0.2.7 → quantdb_sdk-0.3.3}/quantdb_sdk.egg-info/entry_points.txt +0 -0
- {quantdb_sdk-0.2.7 → quantdb_sdk-0.3.3}/quantdb_sdk.egg-info/requires.txt +0 -0
- {quantdb_sdk-0.2.7 → quantdb_sdk-0.3.3}/quantdb_sdk.egg-info/top_level.txt +0 -0
- {quantdb_sdk-0.2.7 → quantdb_sdk-0.3.3}/setup.cfg +0 -0
- {quantdb_sdk-0.2.7 → quantdb_sdk-0.3.3}/tests/test_async_client.py +0 -0
- {quantdb_sdk-0.2.7 → quantdb_sdk-0.3.3}/tests/test_client.py +0 -0
- {quantdb_sdk-0.2.7 → quantdb_sdk-0.3.3}/tests/test_technical_indicators.py +0 -0
- {quantdb_sdk-0.2.7 → quantdb_sdk-0.3.3}/tests/test_update_pipeline.py +0 -0
|
@@ -1,118 +1,178 @@
|
|
|
1
|
-
# Changelog
|
|
2
|
-
|
|
3
|
-
所有 notable 变更都会记录在此文件。格式基于 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.1.0/),
|
|
4
|
-
版本号遵循 [Semantic Versioning](https://semver.org/lang/zh-CN/)。
|
|
5
|
-
|
|
6
|
-
## [0.
|
|
7
|
-
|
|
8
|
-
### Fixed
|
|
9
|
-
- **V1 回退对纯 V2 数据集失效**:`query_kline` / `a_query_kline` 无日期范围时不再默认走 V1。`margin_trading`、`features_daily`、`l1_factors`、`l2_factors` 等 11 个纯 V2 数据集在 COS 上已无 V1 逐股票文件,V1 回退会 404。现在无范围时也走 V2 manifest 路径(manifest 列出的所有分区全量下载),仅在有日期范围时才做日历完整性校验。显式 `layout="v1"` 仍可直接走逐股票文件。
|
|
10
|
-
- **异步客户端时区处理不一致**:`AsyncQuantDBClient._normalise_kline` 缺少 `tz_convert` 逻辑,与同步客户端行为不一致(相同输入可能产生不同的 `trade_date` 字符串),已对齐。
|
|
11
|
-
|
|
12
|
-
## [0.2.6] - 2026-07-27
|
|
13
|
-
|
|
14
|
-
### Fixed
|
|
15
|
-
- **适配服务端 CDN 直连下载(302 跳转)**:异步客户端(httpx 默认不跟随重定向)此前在服务端开启 302 直连后所有下载/同步接口失效,现已修复。
|
|
16
|
-
- **凭证保护**:同步客户端此前跟随 302 时会把 `X-API-Key` 透传给 CDN 域;现两个客户端统一改为「手动处理 302 + 无鉴权头裸请求直连 CDN」,凭证只发给 QuantDB 网关。
|
|
17
|
-
- 302 响应中的 COS ETag 回填至 CDN 响应,保证进程内 ETag 缓存与 If-None-Match 304 逻辑不受影响。
|
|
18
|
-
|
|
19
|
-
### Security (后端)
|
|
20
|
-
- **一次性下载令牌**:302 直连模式改为两跳(`/download` → `/cdn-bridge?token=xxx` → CDN),令牌一次性消费,防止签名 URL 被重复使用或分享给他人免费下载。
|
|
21
|
-
- **移除 `?direct=1` 请求级覆盖**:用户无法再通过请求参数强制走 302 模式,仅全局开关 `QUANTDB_DOWNLOAD_REDIRECT` 可控制。
|
|
22
|
-
- 令牌有效期 90s,远小于 CDN 签名有效期 300s,窗口极小。
|
|
23
|
-
|
|
24
|
-
### Data Architecture (COS)
|
|
25
|
-
- **V2 数据集全面清理 V1 残留**:COS 上 11 个 V2 数据集已删除全部 V1 逐股票文件(~1.8 万对象),实现纯 V2 存储。ListObjects 分页效率提升 3-5 倍。
|
|
26
|
-
- **L1 日频因子 V2 全量上线**:`l1_factors` 2565 个交易日分区(2016-01-04 ~ 至今),支持按日范围高效查询。
|
|
27
|
-
- **L2 高频因子 V2 上线**:`l2_factors` 34 个交易日分区(2026-01-05 ~ 2026-02-27)。
|
|
28
|
-
- **融资融券纯 V2**:`margin_trading` 已从 V1 迁移至纯 V2 按日分区(2563 个分区)。
|
|
29
|
-
|
|
30
|
-
## [0.2.5] - 2026-07-26
|
|
31
|
-
|
|
32
|
-
### Security
|
|
33
|
-
- 下载响应文件名与 release/Manifest 相对路径均限制在指定下载目录内,防止路径穿越。
|
|
34
|
-
- 公网 API Host 强制 HTTPS;CLI 改从环境变量读取 API Key,避免密钥出现在命令历史和进程参数中。
|
|
35
|
-
- 下载增加单文件大小上限(默认 2 GiB,可通过 `QUANTDB_MAX_DOWNLOAD_BYTES` 配置)。
|
|
36
|
-
- `query_local()` / `a_query_local()` 只接受 WHERE 条件,拒绝完整 SQL、JOIN 和外部表函数。
|
|
37
|
-
|
|
38
|
-
### Documentation
|
|
39
|
-
- 更新官网 SDK 文档:并发下载建议、V1/V2 选择、安全配置与异常处理。
|
|
40
|
-
|
|
41
|
-
## [0.2.4] - 2026-07-26
|
|
42
|
-
|
|
43
|
-
### Fixed
|
|
44
|
-
- **Windows CLI 编码**:移除 `✓/✗` 字符,GBK 控制台可正常执行 `quantdb check`。
|
|
45
|
-
|
|
46
|
-
## [0.2.3] - 2026-07-26
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
所有 notable 变更都会记录在此文件。格式基于 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.1.0/),
|
|
4
|
+
版本号遵循 [Semantic Versioning](https://semver.org/lang/zh-CN/)。
|
|
5
|
+
|
|
6
|
+
## [0.3.3] - 2026-08-29
|
|
47
7
|
|
|
48
8
|
### Added
|
|
49
|
-
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
### Added
|
|
54
|
-
- **全数据集增量同步**:`sync_dataset()` / `a_sync_dataset()` 覆盖基础、财务、ETF/可转债、行情、技术与 ML 子类;没有 V2 release 的数据集自动走 V1 Manifest。
|
|
55
|
-
- **CLI 同步**:新增 `quantdb sync <api_key> <dataset> --save-dir <目录>`。
|
|
56
|
-
|
|
57
|
-
### Fixed
|
|
58
|
-
- **V1 强校验**:V1 Manifest 同步以 ETag + size 判断变更,并在原子落盘前验证实际字节数。
|
|
59
|
-
- **同步/异步一致性**:异步 release 同步采用 `relative_path`,SQLite 同时记录对象大小,与同步客户端保持同构目录和恢复语义。
|
|
60
|
-
|
|
61
|
-
## [0.2.1] - 2026-07-26
|
|
9
|
+
- **本地完整性扫描 `scan_local_directory`**,并作为 `QuantDBClient.scan_local()` / `AsyncQuantDBClient.a_scan_local()` 方法公开:扫描本地数据目录,流式计算每个文件的 MD5 与 COS 形态 ETag。只做本地 IO、不发起网络请求、不消耗流量,用于对落地数据做独立的完整性指纹扫描(发布前/对账/排障前置核对)。
|
|
10
|
+
- 支持递归/非递归、按后缀过滤(默认 `.parquet`)、可选进度回调。
|
|
11
|
+
- 返回含汇总 `file_count` / `total_bytes` 与逐文件 `{relative_path, path, size, md5, etag}` 的清单;读取失败的文件登记到 `errors` 不中断扫描。
|
|
62
12
|
|
|
63
|
-
|
|
64
|
-
- **历史发布清单兼容**:同步客户端自动归一化旧 release manifest 遗留的 `v2/` 前缀,并可下载 release patch 对象。
|
|
65
|
-
- **布局回退**:服务端以 COS Manifest 为可用性权威,V2 元数据缺失时可正确回退 V1,而非将数据误判为不可下载。
|
|
66
|
-
|
|
67
|
-
## [0.2.0] - 2026-07-26
|
|
68
|
-
|
|
69
|
-
### Added
|
|
70
|
-
- **V1/V2 布局兼容**:同步与异步客户端的下载、Manifest、DataFrame、K 线和 Tick 接口均支持 `layout="auto" | "v1" | "v2"`。
|
|
71
|
-
- **V2 release 增量同步**:`sync_dataset()` / `a_sync_dataset()` 使用发布 cursor,同步 daily 与 patch 对象;文件 SHA-256 校验和原子落盘成功后才推进 cursor。
|
|
13
|
+
## [0.3.2] - 2026-08-27
|
|
72
14
|
|
|
73
15
|
### Changed
|
|
74
|
-
- `
|
|
75
|
-
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
- **
|
|
82
|
-
-
|
|
83
|
-
|
|
84
|
-
## [0.
|
|
85
|
-
|
|
86
|
-
###
|
|
87
|
-
-
|
|
88
|
-
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
-
|
|
94
|
-
- `
|
|
95
|
-
- `
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
-
|
|
99
|
-
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
- `
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
16
|
+
- **同步/异步客户端 `sync_dataset` 服务端 304 权威对账**:当本地文件已在磁盘(含 sqlite 记录缺失或指纹对不上场景)时,先发 `If-None-Match=<本地文件 MD5>` 给 `/download`,命中 304(网关在预扣/COS 直连前短路,免流量)则只登记跳过,避免"本地明明有文件但记录/指纹对不上"时的整块重下。修复此前 V2 release 对象缺 `etag` 字段导致 `local_file_matches` 恒 `False`、本地清空 sqlite 后全量重下的问题。
|
|
17
|
+
- **判重主键从 etag 改为 `sha256`**:V2 release 对象无 etag 字段,原判重实际退化为仅靠弱指纹;现统一以内容 sha256 判重,正常增量仍按 sha 命中跳过。
|
|
18
|
+
- 下载成功后落库记录**真实 COS ETag**,供后续对账/304 复用。
|
|
19
|
+
|
|
20
|
+
## [0.3.1] - 2026-08-15
|
|
21
|
+
|
|
22
|
+
### Added
|
|
23
|
+
- **CLI 目录规范命令**:`quantdb layout` 打印本地数据目录规范(顶层分类目录、各数据集 V1/V2/tick 布局、路径示例),无需 API Key。
|
|
24
|
+
- **CLI 帮助增强**:`quantdb --help` 补充演示脚本提示;`quantdb sync` 帮助说明数据根目录来源(`QUANTDB_DATA_DIR` → 默认下载目录),并打印 `matched`(本地对账跳过数)。
|
|
25
|
+
|
|
26
|
+
## [0.3.0] - 2026-08-15
|
|
27
|
+
|
|
28
|
+
### Added
|
|
29
|
+
- **目录规范模块 `quantdb_sdk.layout`**:新增本地数据目录规范,与采集根目录 `D:\quant_data` 保持一致。
|
|
30
|
+
- `CATEGORY_DIRS`:6 个顶层分类目录(1_kline_data / 2_base_sector / 3_financial_data / 4_bond_etf / 5_technical_derived / 6_ml_datasets)。
|
|
31
|
+
- `dataset_dir(dataset)` / `category_id(dataset)` / `dataset_layout(dataset)`:数据集 → 相对目录 / 分类 ID / 物理布局(`v2_daily_partition | v1_symbol | tick_shard`)。
|
|
32
|
+
- `local_relative_path(dataset, symbol=None, trade_date=None, layout=None)`:生成 V1(`{Symbol}.parquet`)、V2(`dt=YYYYMMDD/data.parquet`)、tick(`{SYM}_{YYYYMMDD}.parquet`)的相对路径。
|
|
33
|
+
- `data_root()`:新增 `QUANTDB_DATA_DIR` 环境变量指定本地数据根目录,未设置时回退 SDK 默认下载目录。
|
|
34
|
+
- **演示脚本包 `quantdb_sdk.examples`**(随 wheel 发布,6 个):
|
|
35
|
+
- `demo_01_connect_basics` 连接 / 用量 / 订阅 / 股票列表 / 日历(零流量接口)
|
|
36
|
+
- `demo_02_kline_v2_daily` 按 V2 日分区查询 K 线(单日全市场切片 + 单股日期范围)
|
|
37
|
+
- `demo_03_sync_full_market` 全市场增量同步,落地到规范目录
|
|
38
|
+
- `demo_04_duckdb_warehouse` DuckDB 本地 SQL JOIN(V2 日分区)
|
|
39
|
+
- `demo_05_read_local_data` 按目录规范定位并读取本地已同步数据
|
|
40
|
+
- `demo_06_tick_and_factors` Tick 按日下载 + L1 因子 V2 分区装载
|
|
41
|
+
- 公开导出:`quantdb_sdk.layout` 模块及 `CATEGORY_DIRS` / `V2_DAILY_PARTITION` / `data_root` / `dataset_dir` / `dataset_layout` / `local_relative_path`。
|
|
42
|
+
|
|
43
|
+
### Changed
|
|
44
|
+
- `DuckDBWarehouse.mount_local_dataset` 的目录映射字典重构为复用 `layout.dataset_dir`,消除与目录规范的重复定义,行为不变。
|
|
45
|
+
- **同步对账(reconciliation)**:`sync_dataset()` / `a_sync_dataset()` 新增本地磁盘对账——目标文件已存在、大小一致且本地 MD5 == COS ETag 时,直接登记进状态并跳过下载(V2 与 V1 Manifest 两条路径均生效)。数据根目录可任意调整(`QUANTDB_DATA_DIR` / `--root` / `save_dir`),指向已含相同数据的目录时无需全量重下,与 Electron 本地对账语义一致。返回结果新增 `matched` 字段(已对账跳过对象数)。
|
|
46
|
+
- 目录规范模块说明不再包含任何绝对路径,`D:\quant_data` 仅作为组织方式参考;本地根目录始终可配置。
|
|
47
|
+
|
|
48
|
+
## [0.2.10] - 2026-08-03
|
|
49
|
+
|
|
50
|
+
### Fixed
|
|
51
|
+
- **对象 SHA-256 校验在旧 manifest 过期时卡死整个 release**:追加式发布链中同一 `dt=` 分区可被多份历史 manifest 引用,重写分区后旧清单 sha256 过期。同步/异步客户端此前对过期条目硬校验失败即中止整份 release 且不提交 cursor,导致每次重下、永远卡死(`对象 SHA-256 校验失败`)。现在 sync 时以 cursor 序列中**最新一份** manifest 的指纹作为权威校验值,旧清单过期只重下该分区,不再阻塞。管线侧已配套加 manifest 回填 + 全量审计(`pipeline/sync_to_cos.py`、`pipeline/verify_cos_manifests.py`)。
|
|
52
|
+
- **User-Agent 版本号与 pyproject 不同步**:0.2.9 发版时漏改,同步/异步客户端 `_USER_AGENT` 仍为 0.2.8,已对齐为 0.2.10。
|
|
53
|
+
|
|
54
|
+
## [0.2.9] - 2026-07-30
|
|
55
|
+
|
|
56
|
+
### Fixed
|
|
57
|
+
- **CDN 直连重试路径缺失导入**:0.2.8 引入的重试逻辑(指数退避)在同步/异步客户端分别使用 `time.sleep` / `asyncio.sleep`,但模块缺失 `import time` / `import asyncio`,触发重试时抛 `NameError` 导致下载中断,已补齐导入。
|
|
58
|
+
|
|
59
|
+
## [0.2.8] - 2026-07-30
|
|
60
|
+
|
|
61
|
+
### Fixed
|
|
62
|
+
- **CDN 直连下载 302 相对 URL 拼接**:服务端 CDN 直连模式(`QUANTDB_DOWNLOAD_REDIRECT`)的 Stage 1 302 返回相对 URL(`/api/v1/data/cdn-bridge?token=xxx`),同步/异步客户端此前直接将此相对路径作为请求 URL,导致 `requests`/`httpx` 无法解析(`MissingSchema`/`UnsupportedProtocol`),CDN 直连下载完全不可用。现在当 `Location` 以 `/` 开头时自动拼接 `api_host` 构造完整 URL。
|
|
63
|
+
- **CDN 直连请求无重试**:cdn-bridge 和 CDN 签名 URL 请求此前使用裸 `requests.get()`/`httpx.stream()` 调用,无重试、无超时容错。一次 connect timeout 或网络抖动即导致整个 `sync_dataset` 中断(且预扣流量不退)。现在两跳均带 2 次重试(指数退避 1s/2s),捕获 `ConnectionError`/`Timeout`/`ReadError` 自动重试。
|
|
64
|
+
- **302 重定向链路手动跟随**:此前只跟随第一跳 302,服务端两跳链路(`/download` → `/cdn-bridge?token=xxx` → CDN 签名 URL)的第二跳被忽略。现在统一用 `_follow_redirect_with_retry` 循环跟随最多 3 跳,ETag 逐跳透传。
|
|
65
|
+
|
|
66
|
+
## [0.2.7] - 2026-07-29
|
|
67
|
+
|
|
68
|
+
### Fixed
|
|
69
|
+
- **V1 回退对纯 V2 数据集失效**:`query_kline` / `a_query_kline` 无日期范围时不再默认走 V1。`margin_trading`、`features_daily`、`l1_factors`、`l2_factors` 等 11 个纯 V2 数据集在 COS 上已无 V1 逐股票文件,V1 回退会 404。现在无范围时也走 V2 manifest 路径(manifest 列出的所有分区全量下载),仅在有日期范围时才做日历完整性校验。显式 `layout="v1"` 仍可直接走逐股票文件。
|
|
70
|
+
- **异步客户端时区处理不一致**:`AsyncQuantDBClient._normalise_kline` 缺少 `tz_convert` 逻辑,与同步客户端行为不一致(相同输入可能产生不同的 `trade_date` 字符串),已对齐。
|
|
71
|
+
|
|
72
|
+
## [0.2.6] - 2026-07-27
|
|
73
|
+
|
|
74
|
+
### Fixed
|
|
75
|
+
- **适配服务端 CDN 直连下载(302 跳转)**:异步客户端(httpx 默认不跟随重定向)此前在服务端开启 302 直连后所有下载/同步接口失效,现已修复。
|
|
76
|
+
- **凭证保护**:同步客户端此前跟随 302 时会把 `X-API-Key` 透传给 CDN 域;现两个客户端统一改为「手动处理 302 + 无鉴权头裸请求直连 CDN」,凭证只发给 QuantDB 网关。
|
|
77
|
+
- 302 响应中的 COS ETag 回填至 CDN 响应,保证进程内 ETag 缓存与 If-None-Match 304 逻辑不受影响。
|
|
78
|
+
|
|
79
|
+
### Security (后端)
|
|
80
|
+
- **一次性下载令牌**:302 直连模式改为两跳(`/download` → `/cdn-bridge?token=xxx` → CDN),令牌一次性消费,防止签名 URL 被重复使用或分享给他人免费下载。
|
|
81
|
+
- **移除 `?direct=1` 请求级覆盖**:用户无法再通过请求参数强制走 302 模式,仅全局开关 `QUANTDB_DOWNLOAD_REDIRECT` 可控制。
|
|
82
|
+
- 令牌有效期 90s,远小于 CDN 签名有效期 300s,窗口极小。
|
|
83
|
+
|
|
84
|
+
### Data Architecture (COS)
|
|
85
|
+
- **V2 数据集全面清理 V1 残留**:COS 上 11 个 V2 数据集已删除全部 V1 逐股票文件(~1.8 万对象),实现纯 V2 存储。ListObjects 分页效率提升 3-5 倍。
|
|
86
|
+
- **L1 日频因子 V2 全量上线**:`l1_factors` 2565 个交易日分区(2016-01-04 ~ 至今),支持按日范围高效查询。
|
|
87
|
+
- **L2 高频因子 V2 上线**:`l2_factors` 34 个交易日分区(2026-01-05 ~ 2026-02-27)。
|
|
88
|
+
- **融资融券纯 V2**:`margin_trading` 已从 V1 迁移至纯 V2 按日分区(2563 个分区)。
|
|
89
|
+
|
|
90
|
+
## [0.2.5] - 2026-07-26
|
|
91
|
+
|
|
92
|
+
### Security
|
|
93
|
+
- 下载响应文件名与 release/Manifest 相对路径均限制在指定下载目录内,防止路径穿越。
|
|
94
|
+
- 公网 API Host 强制 HTTPS;CLI 改从环境变量读取 API Key,避免密钥出现在命令历史和进程参数中。
|
|
95
|
+
- 下载增加单文件大小上限(默认 2 GiB,可通过 `QUANTDB_MAX_DOWNLOAD_BYTES` 配置)。
|
|
96
|
+
- `query_local()` / `a_query_local()` 只接受 WHERE 条件,拒绝完整 SQL、JOIN 和外部表函数。
|
|
97
|
+
|
|
98
|
+
### Documentation
|
|
99
|
+
- 更新官网 SDK 文档:并发下载建议、V1/V2 选择、安全配置与异常处理。
|
|
100
|
+
|
|
101
|
+
## [0.2.4] - 2026-07-26
|
|
102
|
+
|
|
103
|
+
### Fixed
|
|
104
|
+
- **Windows CLI 编码**:移除 `✓/✗` 字符,GBK 控制台可正常执行 `quantdb check`。
|
|
105
|
+
|
|
106
|
+
## [0.2.3] - 2026-07-26
|
|
107
|
+
|
|
108
|
+
### Added
|
|
109
|
+
- **财务本地仓库**:`mount_local_dataset()` 支持财务 V1、ETF/可转债与更多日频子类;财务数据以 `Symbol + m_timetag/endDate/time` 业务主键去重。
|
|
110
|
+
|
|
111
|
+
## [0.2.2] - 2026-07-26
|
|
112
|
+
|
|
113
|
+
### Added
|
|
114
|
+
- **全数据集增量同步**:`sync_dataset()` / `a_sync_dataset()` 覆盖基础、财务、ETF/可转债、行情、技术与 ML 子类;没有 V2 release 的数据集自动走 V1 Manifest。
|
|
115
|
+
- **CLI 同步**:新增 `quantdb sync <api_key> <dataset> --save-dir <目录>`。
|
|
116
|
+
|
|
117
|
+
### Fixed
|
|
118
|
+
- **V1 强校验**:V1 Manifest 同步以 ETag + size 判断变更,并在原子落盘前验证实际字节数。
|
|
119
|
+
- **同步/异步一致性**:异步 release 同步采用 `relative_path`,SQLite 同时记录对象大小,与同步客户端保持同构目录和恢复语义。
|
|
120
|
+
|
|
121
|
+
## [0.2.1] - 2026-07-26
|
|
122
|
+
|
|
123
|
+
### Fixed
|
|
124
|
+
- **历史发布清单兼容**:同步客户端自动归一化旧 release manifest 遗留的 `v2/` 前缀,并可下载 release patch 对象。
|
|
125
|
+
- **布局回退**:服务端以 COS Manifest 为可用性权威,V2 元数据缺失时可正确回退 V1,而非将数据误判为不可下载。
|
|
126
|
+
|
|
127
|
+
## [0.2.0] - 2026-07-26
|
|
128
|
+
|
|
129
|
+
### Added
|
|
130
|
+
- **V1/V2 布局兼容**:同步与异步客户端的下载、Manifest、DataFrame、K 线和 Tick 接口均支持 `layout="auto" | "v1" | "v2"`。
|
|
131
|
+
- **V2 release 增量同步**:`sync_dataset()` / `a_sync_dataset()` 使用发布 cursor,同步 daily 与 patch 对象;文件 SHA-256 校验和原子落盘成功后才推进 cursor。
|
|
132
|
+
|
|
133
|
+
### Changed
|
|
134
|
+
- `query_kline()` 在给出日期范围时优先 V2 日切片;V2 覆盖缺日时自动模式整体回退 V1,显式 V2 则返回覆盖错误。未给日期范围时保持 V1 全历史行为。
|
|
135
|
+
- 下载接口支持 ETag 条件请求;服务端命中 `304 Not Modified` 时不传输对象正文、不扣下载流量。
|
|
136
|
+
|
|
137
|
+
## [0.1.4] - 2026-07-25
|
|
138
|
+
|
|
139
|
+
### Fixed
|
|
140
|
+
- **用户名密码登录**:先初始化 HTTP 会话再登录,修复 `QuantDBClient(username=..., password=...)` 初始化时访问未创建会话的错误。
|
|
141
|
+
- **API Key 删除**:`delete_api_key()` / `a_delete_api_key()` 改为调用服务端实际的 `DELETE /api/v1/auth/api-keys/{id}` 接口,并明确接受 API Key ID。
|
|
142
|
+
- **流量用量**:`get_usage()` / `a_get_usage()` 将余额购买的额外流量纳入剩余流量和活跃状态计算,并新增 `purchased_gb` 返回字段。
|
|
143
|
+
|
|
144
|
+
## [0.1.3] - 2026-07-25
|
|
145
|
+
|
|
146
|
+
### Changed
|
|
147
|
+
- **User-Agent 统一规范**:同步同步客户端 (`client.py`) 与异步客户端 (`async_client.py`) 的 `User-Agent` 标头为 `QuantDB-Python-SDK/0.1.3`,提升服务端请求追踪与日志分流精度。
|
|
148
|
+
- **服务端 Redis 集中式缓存兼容**:完全兼容服务端网关新上线的 Redis 集中缓存层(自动接收 `X-Cache-Hit` 响应标头)。
|
|
149
|
+
|
|
150
|
+
## [0.1.2] - 2026-07-25
|
|
151
|
+
|
|
152
|
+
### Added
|
|
153
|
+
- **CLI 入口**:`[project.scripts]` 注册 `quantdb` 命令,装包后可直接 `quantdb --help` / `quantdb check <key>`,等价于 `python -m quantdb_sdk`。修复了 0.1.0/0.1.1 README 中 `python -m quantdb`(用连字符)会报 `No module named quantdb` 的问题。
|
|
154
|
+
- `CHANGELOG.md` 与 `LICENSE`(MIT)文本随仓库发布。
|
|
155
|
+
- `pyproject.toml` 新增 `Changelog` 项目 URL。
|
|
156
|
+
|
|
157
|
+
### Notes
|
|
158
|
+
- 0.1.2 严格向后兼容 0.1.1,仅元数据层面的修补,不改任何运行时行为。
|
|
159
|
+
- 若 0.1.1 已经在生产环境运行,可选升级;不升级也不受影响。
|
|
160
|
+
|
|
161
|
+
## [0.1.1] - 2026-07-25
|
|
162
|
+
|
|
163
|
+
### Fixed
|
|
164
|
+
- **关键 packaging bug**:`pyarrow` 未声明在 `pyproject.toml` 的运行时依赖,但 `client.py:482` 与 `async_client.py:413` 调用了 `pd.read_parquet(io.BytesIO(...))`。
|
|
165
|
+
- **影响**:任何 `pip install quantdb-sdk==0.1.0` 的用户,在首次调用 `query_kline` / `query_tick` / `query_financial` 等下载类接口时会抛 `ImportError: Missing optional dependency 'pyarrow'`。只有 `get_usage` / `query_stock_list` 等非 parquet 接口 OOTB 可用。
|
|
166
|
+
- **修复**:在 `dependencies` 加入 `pyarrow>=10.0.0`。
|
|
167
|
+
- **服务端 User-Agent** 同步从 `0.1.0` 升级到 `0.1.1`,便于服务端按版本做调用归因与问题分流。
|
|
168
|
+
|
|
169
|
+
## [0.1.0] - 2026-07-22
|
|
170
|
+
|
|
171
|
+
### Added
|
|
172
|
+
- 初版发布。
|
|
173
|
+
- `QuantDBClient` 同步客户端(基于 `requests`)。
|
|
174
|
+
- `AsyncQuantDBClient` 异步客户端(基于 `httpx`)。
|
|
175
|
+
- `DuckDBWarehouse` 本地仓库管理:自动下载 Parquet → 注册 DuckDB 视图 → 跨表 SQL 查询。
|
|
176
|
+
- 异常体系:`QuantDBError` / `AuthError` / `RateLimitError` / `InsufficientTrafficError` / `NotFoundError` / `ServerError` / `ValidationError`。
|
|
177
|
+
- 覆盖接口:流量查询、用户信息、API Key 管理、订阅与订单、股票列表、交易日历、K 线、Tick、财务、按日分片分钟线。
|
|
178
|
+
- `py.typed` 标记(PEP 561),第三方库可获得完整类型信息。
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
include README.md
|
|
2
|
-
include LICENSE
|
|
3
|
-
include CHANGELOG.md
|
|
4
|
-
include pyproject.toml
|
|
5
|
-
recursive-include quantdb_sdk *.py *.typed
|
|
1
|
+
include README.md
|
|
2
|
+
include LICENSE
|
|
3
|
+
include CHANGELOG.md
|
|
4
|
+
include pyproject.toml
|
|
5
|
+
recursive-include quantdb_sdk *.py *.typed
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: quantdb-sdk
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.3.3
|
|
4
4
|
Summary: QuantDB 量化数据平台官方 Python SDK
|
|
5
5
|
Author: QuantDB Team
|
|
6
6
|
License: MIT
|
|
7
|
-
Project-URL: Homepage, https://
|
|
8
|
-
Project-URL: Documentation, https://
|
|
7
|
+
Project-URL: Homepage, https://quantdb.quantmind.cloud
|
|
8
|
+
Project-URL: Documentation, https://quantdb.quantmind.cloud/docs/sdk.html
|
|
9
9
|
Project-URL: Repository, https://github.com/quantdb/quantdb
|
|
10
10
|
Project-URL: Changelog, https://github.com/quantdb/quantdb/blob/main/CHANGELOG.md
|
|
11
11
|
Keywords: quant,finance,data,a-share,parquet
|
|
@@ -77,7 +77,7 @@ print(df.head())
|
|
|
77
77
|
### 用户名密码鉴权
|
|
78
78
|
|
|
79
79
|
```python
|
|
80
|
-
client = QuantDBClient(username="admin", password="
|
|
80
|
+
client = QuantDBClient(username="admin", password="Js897459835@")
|
|
81
81
|
```
|
|
82
82
|
|
|
83
83
|
## 核心功能
|
|
@@ -143,8 +143,8 @@ with ThreadPoolExecutor(max_workers=8) as pool:
|
|
|
143
143
|
|
|
144
144
|
## 流量说明
|
|
145
145
|
|
|
146
|
-
免费注册用户获赠
|
|
146
|
+
免费注册用户获赠 500 MB 一次性体验流量,下载接口不限频率,可下载 K线/Tick/财务等全部分类;**模型训练数据集(第 6 大类,含 300+ 维预计算 AI/ML 因子宽表)仅限订阅用户下载**。订阅用户每月含 50 GB 下载流量,超出部分按 ¥1/GB 从账户余额扣减。余额不足时下载会被拦截。
|
|
147
147
|
|
|
148
148
|
## 文档
|
|
149
149
|
|
|
150
|
-
完整文档请访问:https://
|
|
150
|
+
完整文档请访问:https://quantdb.quantmind.cloud/docs/sdk.html
|
|
@@ -40,7 +40,7 @@ print(df.head())
|
|
|
40
40
|
### 用户名密码鉴权
|
|
41
41
|
|
|
42
42
|
```python
|
|
43
|
-
client = QuantDBClient(username="admin", password="
|
|
43
|
+
client = QuantDBClient(username="admin", password="Js897459835@")
|
|
44
44
|
```
|
|
45
45
|
|
|
46
46
|
## 核心功能
|
|
@@ -106,8 +106,8 @@ with ThreadPoolExecutor(max_workers=8) as pool:
|
|
|
106
106
|
|
|
107
107
|
## 流量说明
|
|
108
108
|
|
|
109
|
-
免费注册用户获赠
|
|
109
|
+
免费注册用户获赠 500 MB 一次性体验流量,下载接口不限频率,可下载 K线/Tick/财务等全部分类;**模型训练数据集(第 6 大类,含 300+ 维预计算 AI/ML 因子宽表)仅限订阅用户下载**。订阅用户每月含 50 GB 下载流量,超出部分按 ¥1/GB 从账户余额扣减。余额不足时下载会被拦截。
|
|
110
110
|
|
|
111
111
|
## 文档
|
|
112
112
|
|
|
113
|
-
完整文档请访问:https://
|
|
113
|
+
完整文档请访问:https://quantdb.quantmind.cloud/docs/sdk.html
|
|
@@ -1,67 +1,67 @@
|
|
|
1
|
-
[build-system]
|
|
2
|
-
requires = ["setuptools>=61.0", "wheel"]
|
|
3
|
-
build-backend = "setuptools.build_meta"
|
|
4
|
-
|
|
5
|
-
[project]
|
|
6
|
-
name = "quantdb-sdk"
|
|
7
|
-
version = "0.
|
|
8
|
-
description = "QuantDB 量化数据平台官方 Python SDK"
|
|
9
|
-
readme = "README.md"
|
|
10
|
-
license = {text = "MIT"}
|
|
11
|
-
requires-python = ">=3.8"
|
|
12
|
-
authors = [
|
|
13
|
-
{name = "QuantDB Team"},
|
|
14
|
-
]
|
|
15
|
-
keywords = ["quant", "finance", "data", "a-share", "parquet"]
|
|
16
|
-
classifiers = [
|
|
17
|
-
"Development Status :: 3 - Alpha",
|
|
18
|
-
"Intended Audience :: Developers",
|
|
19
|
-
"Intended Audience :: Financial and Insurance Industry",
|
|
20
|
-
"License :: OSI Approved :: MIT License",
|
|
21
|
-
"Programming Language :: Python :: 3",
|
|
22
|
-
"Programming Language :: Python :: 3.8",
|
|
23
|
-
"Programming Language :: Python :: 3.9",
|
|
24
|
-
"Programming Language :: Python :: 3.10",
|
|
25
|
-
"Programming Language :: Python :: 3.11",
|
|
26
|
-
"Programming Language :: Python :: 3.12",
|
|
27
|
-
"Topic :: Office/Business :: Financial",
|
|
28
|
-
]
|
|
29
|
-
dependencies = [
|
|
30
|
-
"requests>=2.25.0",
|
|
31
|
-
"pandas>=1.3.0",
|
|
32
|
-
"httpx>=0.24.0",
|
|
33
|
-
"duckdb>=0.8.0",
|
|
34
|
-
# 0.1.1 修复:pyarrow 是 pd.read_parquet 的硬依赖(client.py:482, async_client.py:413),
|
|
35
|
-
# 但 0.1.0 漏声明,导致 pip install 后首次 K线/Tick 查询会抛 ImportError。
|
|
36
|
-
# 锁定到 >=10.0.0 以获得 Python 3.10+ 完整支持(pyarrow 14+ 更好)。
|
|
37
|
-
"pyarrow>=10.0.0",
|
|
38
|
-
]
|
|
39
|
-
|
|
40
|
-
# 0.1.2 新增:装包后提供 `quantdb` shell 命令,等价于 `python -m quantdb_sdk`。
|
|
41
|
-
# 0.1.0/0.1.1 README 写的是 `python -m quantdb`(用了 PyPI 名带连字符),
|
|
42
|
-
# 但 Python 模块名是下划线,安装后 `python -m quantdb` 会报 No module named quantdb。
|
|
43
|
-
# 加这个 entry point 后两个名字都能用,README 不需要再改。
|
|
44
|
-
[project.scripts]
|
|
45
|
-
quantdb = "quantdb_sdk.__main__:main"
|
|
46
|
-
|
|
47
|
-
[project.optional-dependencies]
|
|
48
|
-
dev = [
|
|
49
|
-
"pytest>=7.0.0",
|
|
50
|
-
"pytest-asyncio>=0.21.0",
|
|
51
|
-
"responses>=0.23.0",
|
|
52
|
-
"respx>=0.20.0",
|
|
53
|
-
]
|
|
54
|
-
|
|
55
|
-
[project.urls]
|
|
56
|
-
Homepage = "https://
|
|
57
|
-
Documentation = "https://
|
|
58
|
-
Repository = "https://github.com/quantdb/quantdb"
|
|
59
|
-
Changelog = "https://github.com/quantdb/quantdb/blob/main/CHANGELOG.md"
|
|
60
|
-
|
|
61
|
-
[tool.setuptools.packages.find]
|
|
62
|
-
where = ["."]
|
|
63
|
-
include = ["quantdb_sdk*"]
|
|
64
|
-
|
|
65
|
-
# 0.1.2 新增:让 wheel 包含 LICENSE 和 CHANGELOG.md
|
|
66
|
-
[tool.setuptools.package-data]
|
|
67
|
-
quantdb_sdk = ["py.typed"]
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=61.0", "wheel"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "quantdb-sdk"
|
|
7
|
+
version = "0.3.3"
|
|
8
|
+
description = "QuantDB 量化数据平台官方 Python SDK"
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
license = {text = "MIT"}
|
|
11
|
+
requires-python = ">=3.8"
|
|
12
|
+
authors = [
|
|
13
|
+
{name = "QuantDB Team"},
|
|
14
|
+
]
|
|
15
|
+
keywords = ["quant", "finance", "data", "a-share", "parquet"]
|
|
16
|
+
classifiers = [
|
|
17
|
+
"Development Status :: 3 - Alpha",
|
|
18
|
+
"Intended Audience :: Developers",
|
|
19
|
+
"Intended Audience :: Financial and Insurance Industry",
|
|
20
|
+
"License :: OSI Approved :: MIT License",
|
|
21
|
+
"Programming Language :: Python :: 3",
|
|
22
|
+
"Programming Language :: Python :: 3.8",
|
|
23
|
+
"Programming Language :: Python :: 3.9",
|
|
24
|
+
"Programming Language :: Python :: 3.10",
|
|
25
|
+
"Programming Language :: Python :: 3.11",
|
|
26
|
+
"Programming Language :: Python :: 3.12",
|
|
27
|
+
"Topic :: Office/Business :: Financial",
|
|
28
|
+
]
|
|
29
|
+
dependencies = [
|
|
30
|
+
"requests>=2.25.0",
|
|
31
|
+
"pandas>=1.3.0",
|
|
32
|
+
"httpx>=0.24.0",
|
|
33
|
+
"duckdb>=0.8.0",
|
|
34
|
+
# 0.1.1 修复:pyarrow 是 pd.read_parquet 的硬依赖(client.py:482, async_client.py:413),
|
|
35
|
+
# 但 0.1.0 漏声明,导致 pip install 后首次 K线/Tick 查询会抛 ImportError。
|
|
36
|
+
# 锁定到 >=10.0.0 以获得 Python 3.10+ 完整支持(pyarrow 14+ 更好)。
|
|
37
|
+
"pyarrow>=10.0.0",
|
|
38
|
+
]
|
|
39
|
+
|
|
40
|
+
# 0.1.2 新增:装包后提供 `quantdb` shell 命令,等价于 `python -m quantdb_sdk`。
|
|
41
|
+
# 0.1.0/0.1.1 README 写的是 `python -m quantdb`(用了 PyPI 名带连字符),
|
|
42
|
+
# 但 Python 模块名是下划线,安装后 `python -m quantdb` 会报 No module named quantdb。
|
|
43
|
+
# 加这个 entry point 后两个名字都能用,README 不需要再改。
|
|
44
|
+
[project.scripts]
|
|
45
|
+
quantdb = "quantdb_sdk.__main__:main"
|
|
46
|
+
|
|
47
|
+
[project.optional-dependencies]
|
|
48
|
+
dev = [
|
|
49
|
+
"pytest>=7.0.0",
|
|
50
|
+
"pytest-asyncio>=0.21.0",
|
|
51
|
+
"responses>=0.23.0",
|
|
52
|
+
"respx>=0.20.0",
|
|
53
|
+
]
|
|
54
|
+
|
|
55
|
+
[project.urls]
|
|
56
|
+
Homepage = "https://quantdb.quantmind.cloud"
|
|
57
|
+
Documentation = "https://quantdb.quantmind.cloud/docs/sdk.html"
|
|
58
|
+
Repository = "https://github.com/quantdb/quantdb"
|
|
59
|
+
Changelog = "https://github.com/quantdb/quantdb/blob/main/CHANGELOG.md"
|
|
60
|
+
|
|
61
|
+
[tool.setuptools.packages.find]
|
|
62
|
+
where = ["."]
|
|
63
|
+
include = ["quantdb_sdk*"]
|
|
64
|
+
|
|
65
|
+
# 0.1.2 新增:让 wheel 包含 LICENSE 和 CHANGELOG.md
|
|
66
|
+
[tool.setuptools.package-data]
|
|
67
|
+
quantdb_sdk = ["py.typed"]
|
|
@@ -1,33 +1,53 @@
|
|
|
1
|
-
"""QuantDB 量化数据平台官方 Python SDK。"""
|
|
2
|
-
|
|
3
|
-
try:
|
|
4
|
-
from importlib.metadata import version
|
|
5
|
-
# 注意:此处用 PyPI 包名(连字符)查找版本号,不是模块名(下划线)
|
|
6
|
-
__version__ = version("quantdb-sdk")
|
|
7
|
-
except ImportError:
|
|
8
|
-
__version__ = "0.
|
|
9
|
-
|
|
10
|
-
from .
|
|
11
|
-
from .
|
|
12
|
-
from .
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
1
|
+
"""QuantDB 量化数据平台官方 Python SDK。"""
|
|
2
|
+
|
|
3
|
+
try:
|
|
4
|
+
from importlib.metadata import version
|
|
5
|
+
# 注意:此处用 PyPI 包名(连字符)查找版本号,不是模块名(下划线)
|
|
6
|
+
__version__ = version("quantdb-sdk")
|
|
7
|
+
except ImportError:
|
|
8
|
+
__version__ = "0.3.3"
|
|
9
|
+
|
|
10
|
+
from . import layout
|
|
11
|
+
from ._utils import scan_local_directory
|
|
12
|
+
from .async_client import AsyncQuantDBClient
|
|
13
|
+
from .client import DuckDBWarehouse, QuantDBClient
|
|
14
|
+
from .errors import (
|
|
15
|
+
AuthError,
|
|
16
|
+
InsufficientTrafficError,
|
|
17
|
+
NotFoundError,
|
|
18
|
+
QuantDBError,
|
|
19
|
+
RateLimitError,
|
|
20
|
+
ServerError,
|
|
21
|
+
ValidationError,
|
|
22
|
+
)
|
|
23
|
+
from .layout import (
|
|
24
|
+
CATEGORY_DIRS,
|
|
25
|
+
V2_DAILY_PARTITION,
|
|
26
|
+
data_root,
|
|
27
|
+
dataset_dir,
|
|
28
|
+
dataset_layout,
|
|
29
|
+
local_relative_path,
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
__all__ = [
|
|
33
|
+
"QuantDBClient",
|
|
34
|
+
"AsyncQuantDBClient",
|
|
35
|
+
"DuckDBWarehouse",
|
|
36
|
+
"QuantDBError",
|
|
37
|
+
"AuthError",
|
|
38
|
+
"InsufficientTrafficError",
|
|
39
|
+
"NotFoundError",
|
|
40
|
+
"RateLimitError",
|
|
41
|
+
"ServerError",
|
|
42
|
+
"ValidationError",
|
|
43
|
+
# 目录规范模块(quantdb_sdk.layout)
|
|
44
|
+
"layout",
|
|
45
|
+
"CATEGORY_DIRS",
|
|
46
|
+
"V2_DAILY_PARTITION",
|
|
47
|
+
"data_root",
|
|
48
|
+
"dataset_dir",
|
|
49
|
+
"dataset_layout",
|
|
50
|
+
"local_relative_path",
|
|
51
|
+
# 本地完整性扫描(quantdb_sdk._utils.scan_local_directory)
|
|
52
|
+
"scan_local_directory",
|
|
53
|
+
]
|