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.
Files changed (63) hide show
  1. {infinity_data-1.2.0/src/infinity_data.egg-info → infinity_data-2.1.0}/PKG-INFO +1 -1
  2. {infinity_data-1.2.0 → infinity_data-2.1.0}/pyproject.toml +6 -1
  3. {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/emit/converter.py +1 -0
  4. infinity_data-2.1.0/src/infinity_data/infra/__init__.py +10 -0
  5. {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/infra/diagnostics.py +1 -0
  6. {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/infra/file.py +7 -2
  7. {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/parser/__init__.py +8 -0
  8. {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/parser/diagnostics.py +10 -0
  9. infinity_data-2.1.0/src/infinity_data/parser/models.py +622 -0
  10. {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/parser/parser.py +201 -25
  11. {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/parser/token_stream.py +2 -0
  12. infinity_data-2.1.0/src/infinity_data/semantic/builder/builder.py +968 -0
  13. infinity_data-2.1.0/src/infinity_data/semantic/builder/models.py +70 -0
  14. {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/semantic/constraints.py +1 -1
  15. {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/semantic/diagnostics.py +46 -0
  16. infinity_data-2.1.0/src/infinity_data/semantic/jsonpath.py +34 -0
  17. {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/semantic/registry/__init__.py +8 -0
  18. {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/semantic/registry/general.py +28 -0
  19. infinity_data-2.1.0/src/infinity_data/semantic/resolver/identity.py +106 -0
  20. {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/semantic/resolver/imports.py +27 -30
  21. {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/semantic/resolver/models.py +10 -9
  22. {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/semantic/resolver/resolver.py +31 -0
  23. 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
  24. {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/tokenizer/diagnostics.py +5 -0
  25. {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/tokenizer/finalizer.py +10 -0
  26. {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/tokenizer/models/raw_tokens.py +5 -0
  27. {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/tokenizer/models/tokens.py +63 -3
  28. {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/tokenizer/tokenizer.py +71 -2
  29. {infinity_data-1.2.0 → infinity_data-2.1.0/src/infinity_data.egg-info}/PKG-INFO +1 -1
  30. {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data.egg-info/SOURCES.txt +3 -0
  31. infinity_data-1.2.0/src/infinity_data/infra/__init__.py +0 -4
  32. infinity_data-1.2.0/src/infinity_data/parser/models.py +0 -295
  33. infinity_data-1.2.0/src/infinity_data/semantic/builder/builder.py +0 -569
  34. {infinity_data-1.2.0 → infinity_data-2.1.0}/LICENSE +0 -0
  35. {infinity_data-1.2.0 → infinity_data-2.1.0}/README.md +0 -0
  36. {infinity_data-1.2.0 → infinity_data-2.1.0}/setup.cfg +0 -0
  37. {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/__init__.py +0 -0
  38. {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/emit/__init__.py +0 -0
  39. {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/frontend.py +0 -0
  40. {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/infra/ll1_stream.py +0 -0
  41. {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/infra/location.py +0 -0
  42. {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/infra/path.py +0 -0
  43. {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/pipeline.py +0 -0
  44. {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/py.typed +0 -0
  45. {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/sandbox/__init__.py +0 -0
  46. {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/sandbox/config.py +0 -0
  47. {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/sandbox/errors.py +0 -0
  48. {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/sandbox/mediator.py +0 -0
  49. {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/sandbox/schema.py +0 -0
  50. {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/semantic/__init__.py +0 -0
  51. {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/semantic/builder/__init__.py +0 -0
  52. {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/semantic/executor/__init__.py +0 -0
  53. {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/semantic/executor/executor.py +0 -0
  54. {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/semantic/registry/_core.py +0 -0
  55. {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/semantic/registry/dict_constraints.py +0 -0
  56. {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/semantic/registry/logic.py +0 -0
  57. {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/semantic/registry/types.py +0 -0
  58. {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/semantic/resolver/__init__.py +0 -0
  59. {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/tokenizer/__init__.py +0 -0
  60. {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/tokenizer/char_stream.py +0 -0
  61. {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data/tokenizer/models/__init__.py +0 -0
  62. {infinity_data-1.2.0 → infinity_data-2.1.0}/src/infinity_data.egg-info/dependency_links.txt +0 -0
  63. {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
  Metadata-Version: 2.4
2
2
  Name: infinity-data
3
- Version: 1.2.0
3
+ Version: 2.1.0
4
4
  Summary: InfinityData:声明式配置语言(.infd/.inft)的 Python 编译器库
5
5
  Author: infinity_system: yin_bailiang
6
6
  License: MIT
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "infinity-data"
3
- version = "1.2.0"
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_"]
@@ -48,6 +48,7 @@ def reduce_value(val: StdValue, *, keep_null: bool = True) -> Any:
48
48
 
49
49
 
50
50
  def _reduce_literal(lit: StdLiteral) -> Any:
51
+ """字面量降维:null / noexist → None;其余返回原始值。"""
51
52
  match lit.kind:
52
53
  case 'null' | 'noexist':
53
54
  return None
@@ -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']
@@ -58,6 +58,7 @@ class Diagnostic:
58
58
 
59
59
  @property
60
60
  def location(self) -> str:
61
+ """格式化的源码位置(``file:line:col``,零宽 / 区间统一)。"""
61
62
  return format_location(self.source)
62
63
 
63
64
  @property
@@ -35,7 +35,7 @@ class File:
35
35
 
36
36
  @property
37
37
  def identity(self) -> str:
38
- """唯一身份(循环导入防护 / 模板身份(TemplateKey)基础,含来源路径)。"""
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}] 位置参数不能出现在命名参数之后',