nodebpy 520.6.0__tar.gz → 520.7.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 (82) hide show
  1. {nodebpy-520.6.0 → nodebpy-520.7.0}/PKG-INFO +1 -1
  2. {nodebpy-520.6.0 → nodebpy-520.7.0}/pyproject.toml +1 -1
  3. nodebpy-520.7.0/src/nodebpy/assets/__init__.py +20 -0
  4. {nodebpy-520.6.0 → nodebpy-520.7.0}/src/nodebpy/assets/__main__.py +16 -2
  5. {nodebpy-520.6.0 → nodebpy-520.7.0}/src/nodebpy/assets/_codegen.py +52 -0
  6. nodebpy-520.6.0/src/nodebpy/assets/__init__.py +0 -17
  7. {nodebpy-520.6.0 → nodebpy-520.7.0}/README.md +0 -0
  8. {nodebpy-520.6.0 → nodebpy-520.7.0}/src/nodebpy/__init__.py +0 -0
  9. {nodebpy-520.6.0 → nodebpy-520.7.0}/src/nodebpy/builder/__init__.py +0 -0
  10. {nodebpy-520.6.0 → nodebpy-520.7.0}/src/nodebpy/builder/_registry.py +0 -0
  11. {nodebpy-520.6.0 → nodebpy-520.7.0}/src/nodebpy/builder/_utils.py +0 -0
  12. {nodebpy-520.6.0 → nodebpy-520.7.0}/src/nodebpy/builder/accessor.py +0 -0
  13. {nodebpy-520.6.0 → nodebpy-520.7.0}/src/nodebpy/builder/arrange.py +0 -0
  14. {nodebpy-520.6.0 → nodebpy-520.7.0}/src/nodebpy/builder/asset.py +0 -0
  15. {nodebpy-520.6.0 → nodebpy-520.7.0}/src/nodebpy/builder/items.py +0 -0
  16. {nodebpy-520.6.0 → nodebpy-520.7.0}/src/nodebpy/builder/mixins.py +0 -0
  17. {nodebpy-520.6.0 → nodebpy-520.7.0}/src/nodebpy/builder/node.py +0 -0
  18. {nodebpy-520.6.0 → nodebpy-520.7.0}/src/nodebpy/builder/socket.py +0 -0
  19. {nodebpy-520.6.0 → nodebpy-520.7.0}/src/nodebpy/builder/tree.py +0 -0
  20. {nodebpy-520.6.0 → nodebpy-520.7.0}/src/nodebpy/export/__init__.py +0 -0
  21. {nodebpy-520.6.0 → nodebpy-520.7.0}/src/nodebpy/export/codegen.py +0 -0
  22. {nodebpy-520.6.0 → nodebpy-520.7.0}/src/nodebpy/export/diagram.py +0 -0
  23. {nodebpy-520.6.0 → nodebpy-520.7.0}/src/nodebpy/export/web_render.py +0 -0
  24. {nodebpy-520.6.0 → nodebpy-520.7.0}/src/nodebpy/lib/nodearrange/__init__.py +0 -0
  25. {nodebpy-520.6.0 → nodebpy-520.7.0}/src/nodebpy/lib/nodearrange/arrange/__init__.py +0 -0
  26. {nodebpy-520.6.0 → nodebpy-520.7.0}/src/nodebpy/lib/nodearrange/arrange/graph.py +0 -0
  27. {nodebpy-520.6.0 → nodebpy-520.7.0}/src/nodebpy/lib/nodearrange/arrange/ordering.py +0 -0
  28. {nodebpy-520.6.0 → nodebpy-520.7.0}/src/nodebpy/lib/nodearrange/arrange/ranking.py +0 -0
  29. {nodebpy-520.6.0 → nodebpy-520.7.0}/src/nodebpy/lib/nodearrange/arrange/realize.py +0 -0
  30. {nodebpy-520.6.0 → nodebpy-520.7.0}/src/nodebpy/lib/nodearrange/arrange/stacking.py +0 -0
  31. {nodebpy-520.6.0 → nodebpy-520.7.0}/src/nodebpy/lib/nodearrange/arrange/structs.py +0 -0
  32. {nodebpy-520.6.0 → nodebpy-520.7.0}/src/nodebpy/lib/nodearrange/arrange/sugiyama.py +0 -0
  33. {nodebpy-520.6.0 → nodebpy-520.7.0}/src/nodebpy/lib/nodearrange/arrange/x_coords.py +0 -0
  34. {nodebpy-520.6.0 → nodebpy-520.7.0}/src/nodebpy/lib/nodearrange/arrange/y_coords.py +0 -0
  35. {nodebpy-520.6.0 → nodebpy-520.7.0}/src/nodebpy/lib/nodearrange/config.py +0 -0
  36. {nodebpy-520.6.0 → nodebpy-520.7.0}/src/nodebpy/lib/nodearrange/utils.py +0 -0
  37. {nodebpy-520.6.0 → nodebpy-520.7.0}/src/nodebpy/nodes/__init__.py +0 -0
  38. {nodebpy-520.6.0 → nodebpy-520.7.0}/src/nodebpy/nodes/_mixins.py +0 -0
  39. {nodebpy-520.6.0 → nodebpy-520.7.0}/src/nodebpy/nodes/compositor/__init__.py +0 -0
  40. {nodebpy-520.6.0 → nodebpy-520.7.0}/src/nodebpy/nodes/compositor/assets.py +0 -0
  41. {nodebpy-520.6.0 → nodebpy-520.7.0}/src/nodebpy/nodes/compositor/color.py +0 -0
  42. {nodebpy-520.6.0 → nodebpy-520.7.0}/src/nodebpy/nodes/compositor/converter.py +0 -0
  43. {nodebpy-520.6.0 → nodebpy-520.7.0}/src/nodebpy/nodes/compositor/distort.py +0 -0
  44. {nodebpy-520.6.0 → nodebpy-520.7.0}/src/nodebpy/nodes/compositor/filter.py +0 -0
  45. {nodebpy-520.6.0 → nodebpy-520.7.0}/src/nodebpy/nodes/compositor/group.py +0 -0
  46. {nodebpy-520.6.0 → nodebpy-520.7.0}/src/nodebpy/nodes/compositor/input.py +0 -0
  47. {nodebpy-520.6.0 → nodebpy-520.7.0}/src/nodebpy/nodes/compositor/interface.py +0 -0
  48. {nodebpy-520.6.0 → nodebpy-520.7.0}/src/nodebpy/nodes/compositor/manual.py +0 -0
  49. {nodebpy-520.6.0 → nodebpy-520.7.0}/src/nodebpy/nodes/compositor/matte.py +0 -0
  50. {nodebpy-520.6.0 → nodebpy-520.7.0}/src/nodebpy/nodes/compositor/output.py +0 -0
  51. {nodebpy-520.6.0 → nodebpy-520.7.0}/src/nodebpy/nodes/compositor/vector.py +0 -0
  52. {nodebpy-520.6.0 → nodebpy-520.7.0}/src/nodebpy/nodes/geometry/__init__.py +0 -0
  53. {nodebpy-520.6.0 → nodebpy-520.7.0}/src/nodebpy/nodes/geometry/assets.py +0 -0
  54. {nodebpy-520.6.0 → nodebpy-520.7.0}/src/nodebpy/nodes/geometry/attribute.py +0 -0
  55. {nodebpy-520.6.0 → nodebpy-520.7.0}/src/nodebpy/nodes/geometry/color.py +0 -0
  56. {nodebpy-520.6.0 → nodebpy-520.7.0}/src/nodebpy/nodes/geometry/converter.py +0 -0
  57. {nodebpy-520.6.0 → nodebpy-520.7.0}/src/nodebpy/nodes/geometry/geometry.py +0 -0
  58. {nodebpy-520.6.0 → nodebpy-520.7.0}/src/nodebpy/nodes/geometry/grid.py +0 -0
  59. {nodebpy-520.6.0 → nodebpy-520.7.0}/src/nodebpy/nodes/geometry/group.py +0 -0
  60. {nodebpy-520.6.0 → nodebpy-520.7.0}/src/nodebpy/nodes/geometry/groups.py +0 -0
  61. {nodebpy-520.6.0 → nodebpy-520.7.0}/src/nodebpy/nodes/geometry/input.py +0 -0
  62. {nodebpy-520.6.0 → nodebpy-520.7.0}/src/nodebpy/nodes/geometry/interface.py +0 -0
  63. {nodebpy-520.6.0 → nodebpy-520.7.0}/src/nodebpy/nodes/geometry/manual.py +0 -0
  64. {nodebpy-520.6.0 → nodebpy-520.7.0}/src/nodebpy/nodes/geometry/output.py +0 -0
  65. {nodebpy-520.6.0 → nodebpy-520.7.0}/src/nodebpy/nodes/geometry/texture.py +0 -0
  66. {nodebpy-520.6.0 → nodebpy-520.7.0}/src/nodebpy/nodes/geometry/utilities.py +0 -0
  67. {nodebpy-520.6.0 → nodebpy-520.7.0}/src/nodebpy/nodes/geometry/vector.py +0 -0
  68. {nodebpy-520.6.0 → nodebpy-520.7.0}/src/nodebpy/nodes/geometry/zone.py +0 -0
  69. {nodebpy-520.6.0 → nodebpy-520.7.0}/src/nodebpy/nodes/shader/__init__.py +0 -0
  70. {nodebpy-520.6.0 → nodebpy-520.7.0}/src/nodebpy/nodes/shader/assets.py +0 -0
  71. {nodebpy-520.6.0 → nodebpy-520.7.0}/src/nodebpy/nodes/shader/color.py +0 -0
  72. {nodebpy-520.6.0 → nodebpy-520.7.0}/src/nodebpy/nodes/shader/converter.py +0 -0
  73. {nodebpy-520.6.0 → nodebpy-520.7.0}/src/nodebpy/nodes/shader/grid.py +0 -0
  74. {nodebpy-520.6.0 → nodebpy-520.7.0}/src/nodebpy/nodes/shader/group.py +0 -0
  75. {nodebpy-520.6.0 → nodebpy-520.7.0}/src/nodebpy/nodes/shader/input.py +0 -0
  76. {nodebpy-520.6.0 → nodebpy-520.7.0}/src/nodebpy/nodes/shader/manual.py +0 -0
  77. {nodebpy-520.6.0 → nodebpy-520.7.0}/src/nodebpy/nodes/shader/output.py +0 -0
  78. {nodebpy-520.6.0 → nodebpy-520.7.0}/src/nodebpy/nodes/shader/script.py +0 -0
  79. {nodebpy-520.6.0 → nodebpy-520.7.0}/src/nodebpy/nodes/shader/shader.py +0 -0
  80. {nodebpy-520.6.0 → nodebpy-520.7.0}/src/nodebpy/nodes/shader/texture.py +0 -0
  81. {nodebpy-520.6.0 → nodebpy-520.7.0}/src/nodebpy/nodes/shader/vector.py +0 -0
  82. {nodebpy-520.6.0 → nodebpy-520.7.0}/src/nodebpy/types.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: nodebpy
3
- Version: 520.6.0
3
+ Version: 520.7.0
4
4
  Summary: Build nodes trees in Blender more elegantly with code
5
5
  Author: Brady Johnston
6
6
  Author-email: Brady Johnston <brady.johnston@me.com>
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "nodebpy"
3
- version = "520.6.0"
3
+ version = "520.7.0"
4
4
  description = "Build nodes trees in Blender more elegantly with code"
5
5
  readme = "README.md"
6
6
  authors = [
@@ -0,0 +1,20 @@
1
+ """Typed APIs for node-group assets.
2
+
3
+ ``generate_asset_api`` builds typed :class:`~nodebpy.builder.AssetNodeGroup`
4
+ classes for the node groups in a ``.blend`` asset library into a single module;
5
+ ``generate_asset_modules`` splits them into one module per tree type
6
+ (``geometry.py`` / ``shader.py`` / ``compositor.py``). The bundled-essentials
7
+ APIs generated for nodebpy itself live in ``nodebpy.nodes.{geometry,shader,
8
+ compositor}.assets`` and are re-exported alongside the built-in nodes.
9
+ """
10
+
11
+ from ..builder import AssetLibrary, BundledLibrary, PackageLibrary
12
+ from ._codegen import generate_asset_api, generate_asset_modules
13
+
14
+ __all__ = [
15
+ "generate_asset_api",
16
+ "generate_asset_modules",
17
+ "AssetLibrary",
18
+ "BundledLibrary",
19
+ "PackageLibrary",
20
+ ]
@@ -14,7 +14,7 @@ import os
14
14
  from pathlib import Path
15
15
 
16
16
  from ..builder import BundledLibrary, PackageLibrary
17
- from ._codegen import generate_asset_api
17
+ from ._codegen import generate_asset_api, generate_asset_modules
18
18
 
19
19
  # Bundled libraries shipped with Blender, grouped by output module. Each library
20
20
  # holds node groups of a single tree type.
@@ -70,7 +70,11 @@ def parse_args() -> argparse.Namespace:
70
70
  "-o",
71
71
  dest="output",
72
72
  type=Path,
73
- help="Path of the assets.py module to write.",
73
+ help=(
74
+ "Where to write the generated module(s). A .py path writes a single "
75
+ "module; a directory writes one module per tree type "
76
+ "(geometry.py / shader.py / compositor.py)."
77
+ ),
74
78
  )
75
79
  parser.add_argument(
76
80
  "--nodebpy-pkg",
@@ -98,6 +102,16 @@ def main() -> None: # pragma: no cover - CLI wrapper
98
102
  # directory (``__file__``), so express the .blend relative to the output
99
103
  # module — not the CWD the command happened to run from.
100
104
  blend = args.blend_file.resolve()
105
+ if output.suffix != ".py":
106
+ # Directory output: one module per tree type.
107
+ out_dir = output.resolve()
108
+ relative = Path(os.path.relpath(blend, out_dir)).as_posix()
109
+ generate_asset_modules(
110
+ [PackageLibrary(str(out_dir / "_anchor.py"), relative)],
111
+ output,
112
+ nodebpy_pkg=args.nodebpy_pkg,
113
+ )
114
+ return
101
115
  relative = Path(os.path.relpath(blend, output.resolve().parent)).as_posix()
102
116
  generate_asset_api(
103
117
  [PackageLibrary(str(output), relative)],
@@ -50,6 +50,14 @@ _SOCKET_TYPES: dict[str, tuple[str, str]] = {
50
50
  }
51
51
 
52
52
 
53
+ # Tree type → module name used when splitting generated output per tree type.
54
+ _TREE_MODULES: dict[str, str] = {
55
+ "GeometryNodeTree": "geometry",
56
+ "ShaderNodeTree": "shader",
57
+ "CompositorNodeTree": "compositor",
58
+ }
59
+
60
+
53
61
  def _socket_types(bl_socket_type: str) -> tuple[str, str]:
54
62
  for key, value in _SOCKET_TYPES.items():
55
63
  if key in bl_socket_type:
@@ -329,3 +337,47 @@ def generate_asset_api(
329
337
  _render_module(classes, nodebpy_pkg=nodebpy_pkg), encoding="utf-8"
330
338
  )
331
339
  return [c.class_name for c in classes]
340
+
341
+
342
+ def generate_asset_modules(
343
+ libraries: AssetLibrary | Sequence[AssetLibrary],
344
+ output_dir: str | Path,
345
+ *,
346
+ names: set[str] | None = None,
347
+ nodebpy_pkg: str = "nodebpy",
348
+ ) -> dict[str, list[str]]:
349
+ """Generate typed asset classes for ``libraries``, split into one module per
350
+ tree type inside ``output_dir``.
351
+
352
+ Writes ``geometry.py``, ``shader.py`` and/or ``compositor.py`` — one module
353
+ for each tree type that has assets in the libraries (no file for the
354
+ others). Asset names repeat across editors (a geometry *and* a compositor
355
+ "Combine Spherical" both exist), so splitting keeps the generated class
356
+ names collision-free where a single :func:`generate_asset_api` module would
357
+ silently shadow one with the other.
358
+
359
+ Parameters are as for :func:`generate_asset_api`, except ``output_dir`` is
360
+ the directory to write the modules into (created if needed).
361
+
362
+ Returns a mapping of module name (``"geometry"`` / ``"shader"`` /
363
+ ``"compositor"``) to the class names written to it.
364
+ """
365
+ if isinstance(libraries, AssetLibrary):
366
+ libraries = [libraries]
367
+
368
+ classes: list[_AssetClass] = []
369
+ for library in libraries:
370
+ classes.extend(_introspect(library, names))
371
+
372
+ output_dir = Path(output_dir)
373
+ output_dir.mkdir(parents=True, exist_ok=True)
374
+ written: dict[str, list[str]] = {}
375
+ for tree_idname, module in _TREE_MODULES.items():
376
+ tree_classes = [c for c in classes if c.tree_idname == tree_idname]
377
+ if not tree_classes:
378
+ continue
379
+ (output_dir / f"{module}.py").write_text(
380
+ _render_module(tree_classes, nodebpy_pkg=nodebpy_pkg), encoding="utf-8"
381
+ )
382
+ written[module] = [c.class_name for c in tree_classes]
383
+ return written
@@ -1,17 +0,0 @@
1
- """Typed APIs for node-group assets.
2
-
3
- ``generate_asset_api`` builds typed :class:`~nodebpy.builder.AssetNodeGroup`
4
- classes for the node groups in a ``.blend`` asset library. The bundled-essentials
5
- APIs generated for nodebpy itself live alongside this module as
6
- ``nodebpy.assets.geometry`` / ``.shader`` / ``.compositor``.
7
- """
8
-
9
- from ..builder import AssetLibrary, BundledLibrary, PackageLibrary
10
- from ._codegen import generate_asset_api
11
-
12
- __all__ = [
13
- "generate_asset_api",
14
- "AssetLibrary",
15
- "BundledLibrary",
16
- "PackageLibrary",
17
- ]
File without changes