infinity-data 1.1.0__tar.gz → 2.0.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {infinity_data-1.1.0/src/infinity_data.egg-info → infinity_data-2.0.0}/PKG-INFO +1 -1
- {infinity_data-1.1.0 → infinity_data-2.0.0}/pyproject.toml +9 -1
- {infinity_data-1.1.0 → infinity_data-2.0.0}/src/infinity_data/emit/converter.py +1 -0
- infinity_data-2.0.0/src/infinity_data/infra/__init__.py +10 -0
- {infinity_data-1.1.0 → infinity_data-2.0.0}/src/infinity_data/infra/diagnostics.py +1 -0
- {infinity_data-1.1.0 → infinity_data-2.0.0}/src/infinity_data/infra/file.py +7 -2
- {infinity_data-1.1.0 → infinity_data-2.0.0}/src/infinity_data/parser/__init__.py +6 -0
- {infinity_data-1.1.0 → infinity_data-2.0.0}/src/infinity_data/parser/diagnostics.py +15 -0
- infinity_data-2.0.0/src/infinity_data/parser/models.py +608 -0
- {infinity_data-1.1.0 → infinity_data-2.0.0}/src/infinity_data/parser/parser.py +180 -12
- {infinity_data-1.1.0 → infinity_data-2.0.0}/src/infinity_data/parser/token_stream.py +2 -0
- infinity_data-2.0.0/src/infinity_data/py.typed +0 -0
- infinity_data-2.0.0/src/infinity_data/semantic/builder/builder.py +952 -0
- infinity_data-2.0.0/src/infinity_data/semantic/builder/models.py +70 -0
- {infinity_data-1.1.0 → infinity_data-2.0.0}/src/infinity_data/semantic/diagnostics.py +42 -0
- infinity_data-2.0.0/src/infinity_data/semantic/jsonpath.py +34 -0
- {infinity_data-1.1.0 → infinity_data-2.0.0}/src/infinity_data/semantic/registry/dict_constraints.py +13 -4
- infinity_data-2.0.0/src/infinity_data/semantic/resolver/identity.py +106 -0
- {infinity_data-1.1.0 → infinity_data-2.0.0}/src/infinity_data/semantic/resolver/imports.py +17 -28
- {infinity_data-1.1.0 → infinity_data-2.0.0}/src/infinity_data/semantic/resolver/models.py +10 -9
- {infinity_data-1.1.0 → infinity_data-2.0.0}/src/infinity_data/semantic/resolver/resolver.py +31 -0
- infinity_data-1.1.0/src/infinity_data/semantic/builder/models.py → infinity_data-2.0.0/src/infinity_data/semantic/std.py +51 -38
- {infinity_data-1.1.0 → infinity_data-2.0.0}/src/infinity_data/tokenizer/diagnostics.py +5 -0
- {infinity_data-1.1.0 → infinity_data-2.0.0}/src/infinity_data/tokenizer/finalizer.py +10 -0
- {infinity_data-1.1.0 → infinity_data-2.0.0}/src/infinity_data/tokenizer/models/raw_tokens.py +5 -0
- {infinity_data-1.1.0 → infinity_data-2.0.0}/src/infinity_data/tokenizer/models/tokens.py +63 -3
- {infinity_data-1.1.0 → infinity_data-2.0.0}/src/infinity_data/tokenizer/tokenizer.py +71 -2
- {infinity_data-1.1.0 → infinity_data-2.0.0/src/infinity_data.egg-info}/PKG-INFO +1 -1
- {infinity_data-1.1.0 → infinity_data-2.0.0}/src/infinity_data.egg-info/SOURCES.txt +4 -0
- infinity_data-1.1.0/src/infinity_data/infra/__init__.py +0 -4
- infinity_data-1.1.0/src/infinity_data/parser/models.py +0 -295
- infinity_data-1.1.0/src/infinity_data/semantic/builder/builder.py +0 -569
- {infinity_data-1.1.0 → infinity_data-2.0.0}/LICENSE +0 -0
- {infinity_data-1.1.0 → infinity_data-2.0.0}/README.md +0 -0
- {infinity_data-1.1.0 → infinity_data-2.0.0}/setup.cfg +0 -0
- {infinity_data-1.1.0 → infinity_data-2.0.0}/src/infinity_data/__init__.py +0 -0
- {infinity_data-1.1.0 → infinity_data-2.0.0}/src/infinity_data/emit/__init__.py +0 -0
- {infinity_data-1.1.0 → infinity_data-2.0.0}/src/infinity_data/frontend.py +0 -0
- {infinity_data-1.1.0 → infinity_data-2.0.0}/src/infinity_data/infra/ll1_stream.py +0 -0
- {infinity_data-1.1.0 → infinity_data-2.0.0}/src/infinity_data/infra/location.py +0 -0
- {infinity_data-1.1.0 → infinity_data-2.0.0}/src/infinity_data/infra/path.py +0 -0
- {infinity_data-1.1.0 → infinity_data-2.0.0}/src/infinity_data/pipeline.py +0 -0
- {infinity_data-1.1.0 → infinity_data-2.0.0}/src/infinity_data/sandbox/__init__.py +0 -0
- {infinity_data-1.1.0 → infinity_data-2.0.0}/src/infinity_data/sandbox/config.py +0 -0
- {infinity_data-1.1.0 → infinity_data-2.0.0}/src/infinity_data/sandbox/errors.py +0 -0
- {infinity_data-1.1.0 → infinity_data-2.0.0}/src/infinity_data/sandbox/mediator.py +0 -0
- {infinity_data-1.1.0 → infinity_data-2.0.0}/src/infinity_data/sandbox/schema.py +0 -0
- {infinity_data-1.1.0 → infinity_data-2.0.0}/src/infinity_data/semantic/__init__.py +0 -0
- {infinity_data-1.1.0 → infinity_data-2.0.0}/src/infinity_data/semantic/builder/__init__.py +0 -0
- {infinity_data-1.1.0 → infinity_data-2.0.0}/src/infinity_data/semantic/constraints.py +0 -0
- {infinity_data-1.1.0 → infinity_data-2.0.0}/src/infinity_data/semantic/executor/__init__.py +0 -0
- {infinity_data-1.1.0 → infinity_data-2.0.0}/src/infinity_data/semantic/executor/executor.py +0 -0
- {infinity_data-1.1.0 → infinity_data-2.0.0}/src/infinity_data/semantic/registry/__init__.py +0 -0
- {infinity_data-1.1.0 → infinity_data-2.0.0}/src/infinity_data/semantic/registry/_core.py +0 -0
- {infinity_data-1.1.0 → infinity_data-2.0.0}/src/infinity_data/semantic/registry/general.py +0 -0
- {infinity_data-1.1.0 → infinity_data-2.0.0}/src/infinity_data/semantic/registry/logic.py +0 -0
- {infinity_data-1.1.0 → infinity_data-2.0.0}/src/infinity_data/semantic/registry/types.py +0 -0
- {infinity_data-1.1.0 → infinity_data-2.0.0}/src/infinity_data/semantic/resolver/__init__.py +0 -0
- {infinity_data-1.1.0 → infinity_data-2.0.0}/src/infinity_data/tokenizer/__init__.py +0 -0
- {infinity_data-1.1.0 → infinity_data-2.0.0}/src/infinity_data/tokenizer/char_stream.py +0 -0
- {infinity_data-1.1.0 → infinity_data-2.0.0}/src/infinity_data/tokenizer/models/__init__.py +0 -0
- {infinity_data-1.1.0 → infinity_data-2.0.0}/src/infinity_data.egg-info/dependency_links.txt +0 -0
- {infinity_data-1.1.0 → infinity_data-2.0.0}/src/infinity_data.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "infinity-data"
|
|
3
|
-
version = "
|
|
3
|
+
version = "2.0.0"
|
|
4
4
|
description = "InfinityData:声明式配置语言(.infd/.inft)的 Python 编译器库"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
license = { text = "MIT" }
|
|
@@ -57,6 +57,9 @@ package-dir = {"" = "src"}
|
|
|
57
57
|
[tool.setuptools.packages.find]
|
|
58
58
|
where = ["src"]
|
|
59
59
|
|
|
60
|
+
[tool.setuptools.package-data]
|
|
61
|
+
infinity_data = ["py.typed"]
|
|
62
|
+
|
|
60
63
|
[tool.ruff]
|
|
61
64
|
line-length = 120
|
|
62
65
|
target-version = "py312"
|
|
@@ -89,3 +92,8 @@ reportMissingImports = "error"
|
|
|
89
92
|
exclude = ["**/node_modules", "**/__pycache__", "**/.*", ".venv"]
|
|
90
93
|
venvPath = "."
|
|
91
94
|
venv = ".venv"
|
|
95
|
+
|
|
96
|
+
[tool.interrogate]
|
|
97
|
+
fail-under = 70
|
|
98
|
+
# 测试函数名自解释,docstring 可选;产品代码(src)不豁免
|
|
99
|
+
ignore-regex = ["^test_"]
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"""基础设施层:诊断、位置、源码来源与 LL(1) 流抽象。
|
|
2
|
+
|
|
3
|
+
最底层依赖(不依赖 tokenizer / parser / semantic):诊断注册表与收集器、
|
|
4
|
+
SourceRange / SourceInfo、File 抽象(磁盘 / 内存)、LL1Stream 泛型流。
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from infinity_data.infra.diagnostics import Diagnostic, DiagnosticCollector, Severity
|
|
8
|
+
from infinity_data.infra.ll1_stream import LL1Stream
|
|
9
|
+
|
|
10
|
+
__all__ = ['Diagnostic', 'DiagnosticCollector', 'Severity', 'LL1Stream']
|
|
@@ -35,7 +35,7 @@ class File:
|
|
|
35
35
|
|
|
36
36
|
@property
|
|
37
37
|
def identity(self) -> str:
|
|
38
|
-
"""唯一身份(循环导入防护 /
|
|
38
|
+
"""唯一身份(循环导入防护 / parse_cache 键;模板身份已改用依赖闭包哈希,§2.5)。"""
|
|
39
39
|
raise NotImplementedError
|
|
40
40
|
|
|
41
41
|
def content_hash(self) -> str:
|
|
@@ -49,13 +49,16 @@ class DiskFile(File):
|
|
|
49
49
|
|
|
50
50
|
@property
|
|
51
51
|
def path(self) -> Path:
|
|
52
|
+
"""完整路径(``name`` 的 :class:`Path` 视图)。"""
|
|
52
53
|
return Path(self.name)
|
|
53
54
|
|
|
54
55
|
def read(self) -> str:
|
|
56
|
+
"""读取源码内容(utf-8)。"""
|
|
55
57
|
return self.path.read_text(encoding='utf-8')
|
|
56
58
|
|
|
57
59
|
@property
|
|
58
60
|
def identity(self) -> str:
|
|
61
|
+
"""解析后绝对路径(循环导入防护 / parse_cache 键)。"""
|
|
59
62
|
return str(self.path.resolve())
|
|
60
63
|
|
|
61
64
|
@classmethod
|
|
@@ -67,11 +70,12 @@ class DiskFile(File):
|
|
|
67
70
|
|
|
68
71
|
@dataclass(frozen=True)
|
|
69
72
|
class MemFile(File):
|
|
70
|
-
"""内存源码(测试/嵌入式场景)。身份 = 根路径:mem:内容hash
|
|
73
|
+
"""内存源码(测试/嵌入式场景)。身份 = 根路径:mem:内容hash(循环导入防护 / 缓存键)。"""
|
|
71
74
|
|
|
72
75
|
content: str
|
|
73
76
|
|
|
74
77
|
def read(self) -> str:
|
|
78
|
+
"""返回内存内容。"""
|
|
75
79
|
return self.content
|
|
76
80
|
|
|
77
81
|
def chars(self) -> Iterable[str]:
|
|
@@ -80,4 +84,5 @@ class MemFile(File):
|
|
|
80
84
|
|
|
81
85
|
@property
|
|
82
86
|
def identity(self) -> str:
|
|
87
|
+
"""身份 = 根路径:mem:内容hash(循环导入防护 / 缓存键)。"""
|
|
83
88
|
return str(self.root_path.resolve()) + ':mem:' + self.content_hash()
|
|
@@ -40,7 +40,10 @@ from infinity_data.parser.models import (
|
|
|
40
40
|
TemplateField,
|
|
41
41
|
TemplateImportItem,
|
|
42
42
|
TemplateImportStmt,
|
|
43
|
+
UnpackValue,
|
|
43
44
|
Value,
|
|
45
|
+
VarStmt,
|
|
46
|
+
walk,
|
|
44
47
|
)
|
|
45
48
|
from infinity_data.parser.parser import Parser
|
|
46
49
|
|
|
@@ -75,5 +78,8 @@ __all__ = [
|
|
|
75
78
|
'TemplateField',
|
|
76
79
|
'TemplateImportItem',
|
|
77
80
|
'TemplateImportStmt',
|
|
81
|
+
'UnpackValue',
|
|
78
82
|
'Value',
|
|
83
|
+
'VarStmt',
|
|
84
|
+
'walk',
|
|
79
85
|
]
|
|
@@ -26,6 +26,16 @@ register_diagnostic_define(
|
|
|
26
26
|
'[{location}] 期望 {expected},实际为 {actual}',
|
|
27
27
|
en='[{location}] expected {expected}, got {actual}',
|
|
28
28
|
),
|
|
29
|
+
diagnostic_define(
|
|
30
|
+
'parse.expand_outside_call',
|
|
31
|
+
'[{location}] ... 只能在模板调用参数上下文使用(展开轴 / 展开传播,§2.8)',
|
|
32
|
+
en='[{location}] ... is only valid in template call argument context (expand axis / propagate)',
|
|
33
|
+
),
|
|
34
|
+
diagnostic_define(
|
|
35
|
+
'parse.expand_suffix_order',
|
|
36
|
+
'[{location}] ... 后不能再跟 ^(调用级后缀顺序固定:^ 笛卡尔积 → ... 传播,§2.8)',
|
|
37
|
+
en='[{location}] ^ cannot follow ... (call-level suffix order: ^ cartesian → ... propagate)',
|
|
38
|
+
),
|
|
29
39
|
diagnostic_define(
|
|
30
40
|
'parse.template_arg_order',
|
|
31
41
|
'[{location}] 位置参数不能出现在命名参数之后',
|
|
@@ -48,6 +58,11 @@ register_diagnostic_define(
|
|
|
48
58
|
'[{location}] 导入项之间必须用逗号分隔(import 列表不接受换行/空格分隔)',
|
|
49
59
|
en='[{location}] import items must be separated by commas (newlines/spaces are not allowed)',
|
|
50
60
|
),
|
|
61
|
+
diagnostic_define(
|
|
62
|
+
'parse.import_requires_newline',
|
|
63
|
+
'[{location}] 导入语句必须以换行结尾(同一行逗号后不能再接其他语句)',
|
|
64
|
+
en='[{location}] import statement must end with a newline (cannot be followed by more tokens on the same line)',
|
|
65
|
+
),
|
|
51
66
|
diagnostic_define(
|
|
52
67
|
'parse.value_field',
|
|
53
68
|
'[{location}] 值位置出现字段定义 {name}(外层数组/对象未闭合)',
|