pyVHDLModelTreesitter 0.5.0__tar.gz → 0.5.2__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 (49) hide show
  1. {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/PKG-INFO +4 -4
  2. {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/pyproject.toml +4 -4
  3. {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/DesignUnit.py +1 -1
  4. {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/_Document.py +21 -7
  5. pyvhdlmodeltreesitter-0.5.2/src/pyVHDLModelTreesitter/format.py +68 -0
  6. pyvhdlmodeltreesitter-0.5.2/src/pyVHDLModelTreesitter/treesitter/queries/concurrent_simple_signal_assignment.scm +5 -0
  7. {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/.gitignore +0 -0
  8. {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/LICENSE +0 -0
  9. {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/README.md +0 -0
  10. {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/Association.py +0 -0
  11. {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/Base.py +0 -0
  12. {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/Concurrent.py +0 -0
  13. {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/Expression.py +0 -0
  14. {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/Interface.py +0 -0
  15. {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/Name.py +0 -0
  16. {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/Object.py +0 -0
  17. {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/Symbol.py +0 -0
  18. {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/_Design.py +0 -0
  19. {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/_Library.py +0 -0
  20. {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/__init__.py +0 -0
  21. {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/_errors.py +0 -0
  22. {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/_parse.py +0 -0
  23. {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/py.typed +0 -0
  24. {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/treesitter/__init__.py +0 -0
  25. {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/treesitter/_base_class.py +0 -0
  26. {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/treesitter/_utils.py +0 -0
  27. {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/treesitter/queries/adding_expression.scm +0 -0
  28. {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/treesitter/queries/architecture_definition.scm +0 -0
  29. {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/treesitter/queries/association_element.scm +0 -0
  30. {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/treesitter/queries/association_elements.scm +0 -0
  31. {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/treesitter/queries/component_instantiation_statement.scm +0 -0
  32. {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/treesitter/queries/constant_declaration.scm +0 -0
  33. {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/treesitter/queries/constrained_1d_array.scm +0 -0
  34. {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/treesitter/queries/design_units.scm +0 -0
  35. {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/treesitter/queries/entity_declaration.scm +0 -0
  36. {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/treesitter/queries/function_call.scm +0 -0
  37. {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/treesitter/queries/ignorable_parentheses.scm +0 -0
  38. {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/treesitter/queries/interface_declaration.scm +0 -0
  39. {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/treesitter/queries/interface_declarations.scm +0 -0
  40. {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/treesitter/queries/library_clauses.scm +0 -0
  41. {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/treesitter/queries/library_namespaces.scm +0 -0
  42. {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/treesitter/queries/multiplying_expression.scm +0 -0
  43. {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/treesitter/queries/package_declaration.scm +0 -0
  44. {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/treesitter/queries/package_definition.scm +0 -0
  45. {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/treesitter/queries/selected_names.scm +0 -0
  46. {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/treesitter/queries/simple_subtype.scm +0 -0
  47. {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/treesitter/queries/type_conversion.scm +0 -0
  48. {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/treesitter/queries/use_clauses.scm +0 -0
  49. {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/treesitter/query.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyVHDLModelTreesitter
3
- Version: 0.5.0
3
+ Version: 0.5.2
4
4
  Summary: An implementation of pyVHDLModel using treesitter
5
5
  Project-URL: Repository, https://gitlab.com/dawalters/pyVHDLModelTreesitter
6
6
  Author: Dominic Adam Walters
@@ -15,7 +15,9 @@ Classifier: Programming Language :: Python :: 3.12
15
15
  Classifier: Programming Language :: Python :: 3.13
16
16
  Classifier: Programming Language :: Python :: 3.14
17
17
  Requires-Python: >=3.11
18
- Requires-Dist: pyvhdlmodel>=0.32.0
18
+ Requires-Dist: pygments>=2.20.0
19
+ Requires-Dist: pyvhdlmodel>=0.34.0
20
+ Requires-Dist: rich>=11.0.0
19
21
  Requires-Dist: tree-sitter-vhdl>=1.2.5
20
22
  Requires-Dist: tree-sitter>=0.23.0
21
23
  Provides-Extra: dev
@@ -26,13 +28,11 @@ Requires-Dist: idna==3.16; extra == 'dev'
26
28
  Requires-Dist: jaraco-context==6.1.2; extra == 'dev'
27
29
  Requires-Dist: mypy==2.1.0; extra == 'dev'
28
30
  Requires-Dist: pre-commit==4.6.0; extra == 'dev'
29
- Requires-Dist: pygments==2.20.0; extra == 'dev'
30
31
  Requires-Dist: pytest-cov==7.1.0; extra == 'dev'
31
32
  Requires-Dist: pytest-order==1.4.0; extra == 'dev'
32
33
  Requires-Dist: pytest-sugar==1.1.1; extra == 'dev'
33
34
  Requires-Dist: pytest-xdist==3.8.0; extra == 'dev'
34
35
  Requires-Dist: pytest==9.0.3; extra == 'dev'
35
- Requires-Dist: rich==15.0.0; extra == 'dev'
36
36
  Requires-Dist: ruff==0.15.14; extra == 'dev'
37
37
  Requires-Dist: ty==0.0.39; extra == 'dev'
38
38
  Requires-Dist: uv==0.11.16; extra == 'dev'
@@ -4,12 +4,14 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "pyVHDLModelTreesitter"
7
- version = "0.5.0"
7
+ version = "0.5.2"
8
8
  description = "An implementation of pyVHDLModel using treesitter"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
11
11
  dependencies = [
12
- "pyVHDLModel >= 0.32.0",
12
+ "pyVHDLModel >= 0.34.0",
13
+ "rich >= 11.0.0",
14
+ "pygments >= 2.20.0", # forced to avoid CVE
13
15
  "tree-sitter >= 0.23.0",
14
16
  "tree-sitter-vhdl >= 1.2.5",
15
17
  ]
@@ -42,8 +44,6 @@ dev = [
42
44
  "pytest-order == 1.4.0",
43
45
  "pytest-sugar == 1.1.1",
44
46
  "pytest-xdist == 3.8.0",
45
- "rich == 15.0.0",
46
- "pygments == 2.20.0", # forced to avoid CVE
47
47
  "ruff == 0.15.14",
48
48
  "ty == 0.0.39",
49
49
  "uv == 0.11.16",
@@ -120,7 +120,7 @@ class UseClause(TreesitterNodeMixin, VHDLModel_UseClause): # noqa: D101
120
120
  symbols.append(
121
121
  PackageReferenceSymbol(selected_or_simple_name(selected_name)),
122
122
  )
123
- ret.append(cls(symbols, _treesitter_node=selected_name_node))
123
+ ret.append(cls(symbols, _treesitter_node=use_clause_node))
124
124
  return ret
125
125
 
126
126
  def __eq__(self, other: object) -> bool: # noqa: D105
@@ -21,7 +21,23 @@ from pyVHDLModelTreesitter.treesitter.query import PARSER, DesignUnits
21
21
 
22
22
  class Document(VHDLModel_Document):
23
23
  @classmethod
24
- def from_file(cls, path: str | Path) -> Self: # noqa: C901, PLR0912 # TODO: refactor
24
+ def from_file(cls, path: str | Path) -> Self:
25
+ """
26
+ Create a Document, and all ModelEntities it contains.
27
+
28
+ Nodes that are not recognised issue a `NotImplementedWarning`.
29
+ """
30
+ if isinstance(path, str):
31
+ path = Path(path)
32
+ path = path.resolve()
33
+ return cls.from_text(path.read_bytes(), path)
34
+
35
+ @classmethod
36
+ def from_text( # noqa: C901, PLR0912 # TODO: refactor
37
+ cls,
38
+ text: str | bytes,
39
+ path: str | Path,
40
+ ) -> Self:
25
41
  """
26
42
  Create a Document, and all ModelEntities it contains.
27
43
 
@@ -34,13 +50,16 @@ class Document(VHDLModel_Document):
34
50
  - Any `design_unit` node has no children.
35
51
 
36
52
  """
53
+ if isinstance(text, str):
54
+ text = text.encode()
37
55
  if isinstance(path, str):
38
56
  path = Path(path)
39
57
  path = path.resolve()
40
58
  document = cls(path)
41
59
 
42
- tree = PARSER.parse(path.read_bytes())
60
+ tree = PARSER.parse(text)
43
61
  node = tree.root_node
62
+
44
63
  captures = DesignUnits.capture(node)
45
64
  design_unit_captures = captures.get("design_unit")
46
65
  if design_unit_captures is None:
@@ -52,9 +71,6 @@ class Document(VHDLModel_Document):
52
71
  context_children = design_unit_capture.children[:-1]
53
72
  context_items: list[LibraryClause | UseClause] = []
54
73
  for context_child in context_children:
55
- if context_child is None:
56
- # TODO: error type is wrong: should be "discovered child is empty"
57
- raise NodeMissingChildError(node, "design_unit")
58
74
  if context_child.type == "library_clause":
59
75
  context_items.extend(
60
76
  LibraryClause.from_treesitter_node(context_child),
@@ -65,8 +81,6 @@ class Document(VHDLModel_Document):
65
81
  )
66
82
  else:
67
83
  NotImplementedWarning.warn_child_type(context_child)
68
- if design_unit_child is None:
69
- raise NodeMissingChildError(node, "design_unit")
70
84
  if design_unit_child.type == "architecture_definition":
71
85
  architecture = Architecture.from_treesitter_node(
72
86
  node,
@@ -0,0 +1,68 @@
1
+ """
2
+ Submodule that provides useful utilities for performing nice looking outputs.
3
+
4
+ WARNING: This submodule is a filthy hack. When called, `patch_module`
5
+ monkeypatches a generic `__rich_repr__` method onto every class in a given
6
+ module within `pyVHDLModel`.
7
+
8
+ This avoids having to write a `__rich_repr__` for every class. This is not a
9
+ good solution, but it was quick and works for what I care about.
10
+ """
11
+
12
+ from __future__ import annotations
13
+
14
+ import importlib
15
+ import inspect
16
+ import pkgutil
17
+ from typing import TYPE_CHECKING
18
+
19
+ if TYPE_CHECKING:
20
+ from types import ModuleType
21
+
22
+ if TYPE_CHECKING:
23
+ from rich.repr import Result as RichReprResult
24
+
25
+ import pyVHDLModelTreesitter
26
+
27
+
28
+ def __rich_repr__(obj: object) -> RichReprResult: # noqa: N807
29
+ """
30
+ Return a rich compatible repr for an arbitrary object.
31
+
32
+ WARNING: `obj` must define `__allSlots__` or `__dict__`.
33
+ """ # noqa: DOC402
34
+ for attr in (
35
+ getattr(obj, "__allSlots__", [])
36
+ if hasattr(obj, "__allSlots__")
37
+ else obj.__dict__
38
+ ):
39
+ if attr in {
40
+ "_documents", # this duplicates data in the `_libraries` field
41
+ "_namespace", # this isn't printed
42
+ "_parent", # this duplicates the parent
43
+ "_treesitter_node", # this doesn't provide useful info
44
+ } or attr.endswith(("Graph", "Vertex")): # these are from the dependency graph
45
+ continue
46
+ yield attr, getattr(obj, attr)
47
+
48
+
49
+ def patch_module(
50
+ *,
51
+ module: ModuleType = pyVHDLModelTreesitter,
52
+ top: bool = True,
53
+ ) -> None:
54
+ """Inject a `__rich_repr__` into every class defined in a given module."""
55
+ # Inject into all classes defined in this module
56
+ for _, obj in inspect.getmembers(module):
57
+ if (
58
+ inspect.isclass(obj)
59
+ and obj.__module__ == module.__name__
60
+ and not hasattr(obj, "__rich_repr__")
61
+ ):
62
+ obj.__rich_repr__ = __rich_repr__
63
+ # Inject into all submodules of this module
64
+ if top and hasattr(module, "__path__"):
65
+ for _, name, _ in pkgutil.walk_packages(pyVHDLModelTreesitter.__path__):
66
+ full_name = f"{pyVHDLModelTreesitter.__name__}.{name}"
67
+ submodule = importlib.import_module(full_name)
68
+ patch_module(module=submodule, top=False)
@@ -0,0 +1,5 @@
1
+ (concurrent_simple_signal_assignment
2
+ (name) @lhs
3
+ (signal_assignment)
4
+ (waveform) @rhs
5
+ ) @signal