40 lines
1.5 KiB
Python
40 lines
1.5 KiB
Python
# -*- coding: utf-8 -*-
|
||
"""M1b 测试引导器(tests 专用,不属于模块运行时代码)。
|
||
|
||
背景:pbl_blueprint/__init__.py 会 eager import .init -> .api_blueprint,
|
||
后者依赖 pbl_common(M1a 挂载链)。当 pbl_common 契约尚未对齐时,
|
||
任何 `from pbl_blueprint.m1b_xxx import ...` 都会在包初始化阶段炸掉,
|
||
导致 M1b 自包含代码无法被单测覆盖。
|
||
|
||
做法:在 sys.modules 里预置一个「空壳包」pbl_blueprint,只设 __path__
|
||
指向真实包目录,不执行真实 __init__.py;随后 import pbl_blueprint.m1b_*
|
||
即按子模块直接加载(子模块间的相对导入照常工作)。
|
||
|
||
M1b 的 m1b_common / m1b_db / m1b_template / m1b_subobject / m1b_ref /
|
||
m1b_api / m1b_init 均不 import pbl_common,故本引导器不掩盖任何真实缺陷;
|
||
M1a 挂载链的集成验证由 tests/test_m1b_realdb.py 与部署阶段负责。
|
||
"""
|
||
import os
|
||
import sys
|
||
import types
|
||
|
||
_PKG_DIR = os.path.join(
|
||
os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "pbl_blueprint")
|
||
_MOD_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(_PKG_DIR)))
|
||
|
||
|
||
def bootstrap():
|
||
"""预置空壳包,返回包目录。可重复调用(幂等)。"""
|
||
if _MOD_ROOT not in sys.path:
|
||
sys.path.insert(0, _MOD_ROOT)
|
||
pkg = sys.modules.get("pbl_blueprint")
|
||
if pkg is None or not getattr(pkg, "_m1b_stub", False):
|
||
stub = types.ModuleType("pbl_blueprint")
|
||
stub.__path__ = [_PKG_DIR]
|
||
stub._m1b_stub = True
|
||
sys.modules["pbl_blueprint"] = stub
|
||
return _PKG_DIR
|
||
|
||
|
||
bootstrap()
|