infinity-data 1.2.0__tar.gz → 2.1.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.2.0/src/infinity_data.egg-info → infinity_data-2.1.0}/PKG-INFO +1 -1
- {infinity_data-1.2.0 → infinity_data-2.1.0}/pyproject.toml +6 -1
- {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/emit/converter.py +1 -0
- infinity_data-2.1.0/src/infinity_data/infra/__init__.py +10 -0
- {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/infra/diagnostics.py +1 -0
- {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/infra/file.py +7 -2
- {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/parser/__init__.py +8 -0
- {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/parser/diagnostics.py +10 -0
- infinity_data-2.1.0/src/infinity_data/parser/models.py +622 -0
- {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/parser/parser.py +201 -25
- {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/parser/token_stream.py +2 -0
- infinity_data-2.1.0/src/infinity_data/semantic/builder/builder.py +968 -0
- infinity_data-2.1.0/src/infinity_data/semantic/builder/models.py +70 -0
- {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/semantic/constraints.py +1 -1
- {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/semantic/diagnostics.py +46 -0
- infinity_data-2.1.0/src/infinity_data/semantic/jsonpath.py +34 -0
- {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/semantic/registry/__init__.py +8 -0
- {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/semantic/registry/general.py +28 -0
- infinity_data-2.1.0/src/infinity_data/semantic/resolver/identity.py +106 -0
- {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/semantic/resolver/imports.py +27 -30
- {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/semantic/resolver/models.py +10 -9
- {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/semantic/resolver/resolver.py +31 -0
- infinity_data-1.2.0/src/infinity_data/semantic/builder/models.py → infinity_data-2.1.0/src/infinity_data/semantic/std.py +51 -38
- {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/tokenizer/diagnostics.py +5 -0
- {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/tokenizer/finalizer.py +10 -0
- {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/tokenizer/models/raw_tokens.py +5 -0
- {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/tokenizer/models/tokens.py +63 -3
- {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/tokenizer/tokenizer.py +71 -2
- {infinity_data-1.2.0 → infinity_data-2.1.0/src/infinity_data.egg-info}/PKG-INFO +1 -1
- {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data.egg-info/SOURCES.txt +3 -0
- infinity_data-1.2.0/src/infinity_data/infra/__init__.py +0 -4
- infinity_data-1.2.0/src/infinity_data/parser/models.py +0 -295
- infinity_data-1.2.0/src/infinity_data/semantic/builder/builder.py +0 -569
- {infinity_data-1.2.0 → infinity_data-2.1.0}/LICENSE +0 -0
- {infinity_data-1.2.0 → infinity_data-2.1.0}/README.md +0 -0
- {infinity_data-1.2.0 → infinity_data-2.1.0}/setup.cfg +0 -0
- {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/__init__.py +0 -0
- {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/emit/__init__.py +0 -0
- {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/frontend.py +0 -0
- {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/infra/ll1_stream.py +0 -0
- {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/infra/location.py +0 -0
- {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/infra/path.py +0 -0
- {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/pipeline.py +0 -0
- {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/py.typed +0 -0
- {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/sandbox/__init__.py +0 -0
- {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/sandbox/config.py +0 -0
- {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/sandbox/errors.py +0 -0
- {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/sandbox/mediator.py +0 -0
- {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/sandbox/schema.py +0 -0
- {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/semantic/__init__.py +0 -0
- {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/semantic/builder/__init__.py +0 -0
- {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/semantic/executor/__init__.py +0 -0
- {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/semantic/executor/executor.py +0 -0
- {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/semantic/registry/_core.py +0 -0
- {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/semantic/registry/dict_constraints.py +0 -0
- {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/semantic/registry/logic.py +0 -0
- {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/semantic/registry/types.py +0 -0
- {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/semantic/resolver/__init__.py +0 -0
- {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/tokenizer/__init__.py +0 -0
- {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/tokenizer/char_stream.py +0 -0
- {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/tokenizer/models/__init__.py +0 -0
- {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data.egg-info/dependency_links.txt +0 -0
- {infinity_data-1.2.0 → infinity_data-2.1.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 = "1.
|
|
3
|
+
version = "2.1.0"
|
|
4
4
|
description = "InfinityData:声明式配置语言(.infd/.inft)的 Python 编译器库"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
license = { text = "MIT" }
|
|
@@ -92,3 +92,8 @@ reportMissingImports = "error"
|
|
|
92
92
|
exclude = ["**/node_modules", "**/__pycache__", "**/.*", ".venv"]
|
|
93
93
|
venvPath = "."
|
|
94
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()
|
|
@@ -22,6 +22,7 @@ from infinity_data.parser.models import (
|
|
|
22
22
|
DictValue,
|
|
23
23
|
Document,
|
|
24
24
|
DollarValue,
|
|
25
|
+
EnvImportItem,
|
|
25
26
|
EnvImportStmt,
|
|
26
27
|
ErrorConstraint,
|
|
27
28
|
ErrorStatement,
|
|
@@ -40,7 +41,10 @@ from infinity_data.parser.models import (
|
|
|
40
41
|
TemplateField,
|
|
41
42
|
TemplateImportItem,
|
|
42
43
|
TemplateImportStmt,
|
|
44
|
+
UnpackValue,
|
|
43
45
|
Value,
|
|
46
|
+
VarStmt,
|
|
47
|
+
walk,
|
|
44
48
|
)
|
|
45
49
|
from infinity_data.parser.parser import Parser
|
|
46
50
|
|
|
@@ -56,6 +60,7 @@ __all__ = [
|
|
|
56
60
|
'DictValue',
|
|
57
61
|
'Document',
|
|
58
62
|
'DollarValue',
|
|
63
|
+
'EnvImportItem',
|
|
59
64
|
'EnvImportStmt',
|
|
60
65
|
'ErrorConstraint',
|
|
61
66
|
'ErrorStatement',
|
|
@@ -75,5 +80,8 @@ __all__ = [
|
|
|
75
80
|
'TemplateField',
|
|
76
81
|
'TemplateImportItem',
|
|
77
82
|
'TemplateImportStmt',
|
|
83
|
+
'UnpackValue',
|
|
78
84
|
'Value',
|
|
85
|
+
'VarStmt',
|
|
86
|
+
'walk',
|
|
79
87
|
]
|
|
@@ -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}] 位置参数不能出现在命名参数之后',
|