Skip to content

Stage 15 · 公开 API 与守链收官

目标

公开完整教学 API,并证明重建后的源码与测试逐字节等于 main。

动手任务

从stage-14开始,完成 minis3.__init__ 导出,并运行完整 49 项测试契约。 行为必须留在下列源码同构边界中;不要先复制补丁。

交付文件

  • src/minis3/__init__.py

自查

  1. 本阶段的可见性或状态迁移由谁负责?

    答案

    只有 CI 同时守护行为与最终源码一致性,重建旅程才可信。

  2. 如果绕过新边界,哪个测试会最先失败?

    答案

    阅读 tests.txt,找出最窄的新节点,并说出它覆盖的公开调用。

通关命令

uv run pytest -q $(cat journey/stages/15-public-api-parity/tests.txt)

对应真实 S3 的一课

只有 CI 同时守护行为与最终源码一致性,重建旅程才可信。

教材

第 9 章

在 GitHub 查看阶段差异

完成后可运行 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",
+]