Stage 15 · 公开 API 与守链收官¶
目标¶
公开完整教学 API,并证明重建后的源码与测试逐字节等于 main。
动手任务¶
从stage-14开始,完成 minis3.__init__ 导出,并运行完整 49 项测试契约。 行为必须留在下列源码同构边界中;不要先复制补丁。
交付文件¶
src/minis3/__init__.py
自查¶
-
本阶段的可见性或状态迁移由谁负责?
答案
只有 CI 同时守护行为与最终源码一致性,重建旅程才可信。
-
如果绕过新边界,哪个测试会最先失败?
答案
阅读
tests.txt,找出最窄的新节点,并说出它覆盖的公开调用。
通关命令¶
uv run pytest -q $(cat journey/stages/15-public-api-parity/tests.txt)
对应真实 S3 的一课¶
只有 CI 同时守护行为与最终源码一致性,重建旅程才可信。
教材¶
完成后可运行 git checkout stage-15 对照你的结果。
先做后看:stage.patch
diff --git a/src/minis3/__init__.py b/src/minis3/__init__.py
index 36bc1f3..86d6755 100644
--- a/src/minis3/__init__.py
+++ b/src/minis3/__init__.py
@@ -32,3 +32,38 @@ from .lifecycle import (
from .multipart import MIN_PART_SIZE, MultipartPart, MultipartUpload
from .store import MiniS3
from .storage import InjectedCrash
+
+__all__ = [
+ "BucketAlreadyExists",
+ "BucketNotEmpty",
+ "DeleteMarker",
+ "EntityTooSmall",
+ "ExpirationRule",
+ "InvalidPart",
+ "InvalidPartOrder",
+ "ListedObject",
+ "ListedVersion",
+ "ListObjectsResult",
+ "ListObjectVersionsResult",
+ "MiniS3",
+ "InvalidContinuationToken",
+ "InjectedCrash",
+ "LifecycleAction",
+ "LifecycleActionKind",
+ "MIN_PART_SIZE",
+ "MiniS3Error",
+ "NoSuchBucket",
+ "NoSuchKey",
+ "NoSuchUpload",
+ "NoSuchVersion",
+ "NotModified",
+ "ObjectRecord",
+ "MultipartPart",
+ "MultipartUpload",
+ "PreconditionFailed",
+ "SequenceCounter",
+ "Version",
+ "VersioningState",
+ "content_etag",
+ "evaluate_expiration",
+]