fix+feat: 修复打包/解包主链路,并把存储层重建为内容寻址 + 快照
起始状态:主链路 100% 不可用,而且失败被静默吞掉——打包后库里 0 个文件、 界面仍打印"文件数量: N";解包导出 0 个文件并在磁盘上生成几百层 sub/sub/sub 垃圾目录。 缺陷修复(4 个 P0 + 12 个 P1,逐条见 BUG_REPORT.md): - 建表列名 compresse_algo 与 INSERT/read_file 用的 compress_algo 不一致 - list_directory 按 path 而非 parent_path 过滤,导致导出无限自递归 - CLI --ignore-timestamps 把 export_filesystem 赋成引用自身的 lambda - add_file 缺少 commit(直接调用 API 时静默丢数据) - LIKE 前缀误伤兄弟目录(删 doc 连带删 docs);mv_dir 二次改名 - 失败路径一律返回 exit code 0;--exclude 是子串匹配而非 glob - FolderPacker.add_file 反向调用 export_file_safe,会用库内内容覆盖源文件 存储层(schema v3,格式变更,提供 vfsmigrate 迁移): - 内容移入 blobs(hash PRIMARY KEY):相同内容只存一份,跨路径/跨快照共享 - files 的唯一约束改为 UNIQUE(snapshot_id, path):一个库存多个版本 - 完整性:每文件 sha256 + 快照级摘要 + HMAC-SHA256 签名,只读连接即可验证 - 增量打包:按 mtime+size 或 sha256 只写变化项,未变文件不重写不重压 - get_file_info 不再返回 content(元数据查询不该搬 BLOB) 新增能力: - 可选 FastAPI 静态文件插件(extras,核心仍零第三方依赖) - 内容寻址发布到对象存储 + 逐对象校验的取回客户端 - 压缩默认改回 zlib:实测比自研哈夫曼体积小 1/3~1/170、快数百倍 其它: - P2-4:时间戳显式转字符串,清掉 1240 条 DeprecationWarning(盘上格式不变) - read_file 负数 offset/size 改为报错(原先会走切片语义从末尾取) - requires-python 从 >=3.7 改为按实际 API 推导的 >=3.9 测试:0 → 343 个用例,纯标准库 unittest,有/无 FastAPI 两种环境都跑通。 证据见 docs/evidence-*.txt。
This commit is contained in:
+22
-5
@@ -3,17 +3,30 @@ dependencies = []
|
||||
description = "sqlite virtual file system"
|
||||
name = "sqlite-vfs"
|
||||
readme = "README.md"
|
||||
requires-python = ">=3.7"
|
||||
# 版本门槛按实际用到的 API 推导,不是拍的:
|
||||
# * contrib/fastapi_static.py 用了 hashlib.md5(..., usedforsecurity=False) → 3.9+
|
||||
# * 测试用了 random.Random.randbytes → 3.9+
|
||||
# 核心(core/compression/migration/publish/folder_*)本身只用到 3.7 就有的东西;
|
||||
# 仓库里没有 3.10+ 的语法(无 match、无 PEP 604 注解、无 zip(strict=))。
|
||||
# 说明:这里只在本机的 3.13 上跑过,"3.9 可用"是代码审查的结论,没有在 3.9 上实测。
|
||||
requires-python = ">=3.9"
|
||||
version = "0.1.0"
|
||||
|
||||
# 可选集成:核心功能只用标准库,第三方框架一律走 extras。
|
||||
# 例如 pip install "sqlite-vfs[fastapi]" 才会装上 FastAPI/Starlette。
|
||||
[project.optional-dependencies]
|
||||
fastapi = [
|
||||
"fastapi>=0.100",
|
||||
"starlette>=0.27",
|
||||
]
|
||||
|
||||
[[tool.uv.index]]
|
||||
default = true
|
||||
url = "https://pypi.tuna.tsinghua.edu.cn/simple"
|
||||
|
||||
[tool.uv.workspace]
|
||||
members = [
|
||||
"devmo",
|
||||
]
|
||||
# 说明:这里原先有 [tool.uv.workspace] members = ["devmo"],但仓库里没有 devmo 目录。
|
||||
# 实测 uv 0.11.8 容忍这种写法(uv sync --dry-run 退出码 0),所以它不是阻塞项,
|
||||
# 只是会误导人,因此删掉。
|
||||
|
||||
[build-system]
|
||||
build-backend = "hatchling.build"
|
||||
@@ -27,6 +40,10 @@ dev = [
|
||||
[project.scripts]
|
||||
vfspack = "sqlite_vfs.cli.packer:pack"
|
||||
vfsunpack = "sqlite_vfs.cli.unpacker:unpack"
|
||||
vfsverify = "sqlite_vfs.cli.verify:verify"
|
||||
vfsmigrate = "sqlite_vfs.cli.migrate:main"
|
||||
vfspublish = "sqlite_vfs.cli.publish:publish_objects"
|
||||
vfsfetch = "sqlite_vfs.cli.fetch:fetch_objects"
|
||||
|
||||
[tool.hatch.build.targets.wheel]
|
||||
packages = ["src/sqlite_vfs"]
|
||||
|
||||
Reference in New Issue
Block a user