fix: geo 收口(模块单例/IPv6测试/降级日志)

- 导出模块级 resolver 单例:Task 6 起 import resolver 使用,
  防多实例各持 ~11MB xdb 副本、lru_cache 按实例分片
- 补公网 IPv6→None 测试,锁定 M1 v4-only 决策
- __init__ 降级路径(文件过短/结构无法识别/except)均记
  warning 日志,运维可区分「没部署 xdb」与「库 API 崩了」
- 删掉测试未使用的 monkeypatch 参数

Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
浅念
2026-09-15 12:39:08 +08:00
parent c5626be589
commit e880dbe458
2 changed files with 22 additions and 3 deletions
+7 -1
View File
@@ -14,13 +14,19 @@ def test_private_ip_returns_local():
assert r.resolve("127.0.0.1") is None
def test_public_ip_parsed_or_none(monkeypatch):
def test_public_ip_parsed_or_none():
r = GeoResolver()
# xdb 未下载/解析失败时优雅降级返回 None,不抛异常
out = r.resolve("8.8.8.8")
assert out is None or set(out) == {"country", "province", "city"}
def test_public_ipv6_returns_none():
# 锁定 M1 的 v4-only 决策:公网 IPv6 查 v4 库因字节长度不符抛 ValueError,
# 降级为 None(防库/数据未来变更悄悄改变行为)
assert GeoResolver().resolve("2001:4860:4860::8888") is None
def test_parse_region_two_layouts():
# 旧版 2.0 结构:"国家|区域|省|市|ISP"
assert parse_region("中国|0|江苏省|南京市|电信", new_layout=False) == {