nodebpy 520.37.0__tar.gz → 520.38.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 (117) hide show
  1. {nodebpy-520.37.0 → nodebpy-520.38.0}/PKG-INFO +1 -1
  2. {nodebpy-520.37.0 → nodebpy-520.38.0}/pyproject.toml +1 -1
  3. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/builder/socket.py +4 -2
  4. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/export/codegen.py +25 -0
  5. {nodebpy-520.37.0 → nodebpy-520.38.0}/README.md +0 -0
  6. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/__init__.py +0 -0
  7. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/__main__.py +0 -0
  8. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/_lookup.py +0 -0
  9. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/_skill.py +0 -0
  10. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/assets/__init__.py +0 -0
  11. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/assets/__main__.py +0 -0
  12. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/assets/_codegen.py +0 -0
  13. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/assets/_library.py +0 -0
  14. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/assets/_pipeline.py +0 -0
  15. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/assets/_textconv.py +0 -0
  16. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/builder/__init__.py +0 -0
  17. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/builder/_combine.py +0 -0
  18. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/builder/_infer.py +0 -0
  19. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/builder/_registry.py +0 -0
  20. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/builder/_socket_order.py +0 -0
  21. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/builder/_utils.py +0 -0
  22. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/builder/accessor.py +0 -0
  23. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/builder/asset.py +0 -0
  24. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/builder/items.py +0 -0
  25. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/builder/mixins.py +0 -0
  26. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/builder/node.py +0 -0
  27. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/builder/tree.py +0 -0
  28. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/export/__init__.py +0 -0
  29. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/export/_floats.py +0 -0
  30. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/export/diagram.py +0 -0
  31. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/export/parity.py +0 -0
  32. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/export/plot.py +0 -0
  33. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/export/web_render.py +0 -0
  34. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/layout/DESIGN.md +0 -0
  35. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/layout/__init__.py +0 -0
  36. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/layout/api.py +0 -0
  37. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/layout/apply.py +0 -0
  38. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/layout/balancing.py +0 -0
  39. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/layout/build.py +0 -0
  40. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/layout/common.py +0 -0
  41. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/layout/config.py +0 -0
  42. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/layout/digraph.py +0 -0
  43. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/layout/dna.py +0 -0
  44. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/layout/edits.py +0 -0
  45. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/layout/extract.py +0 -0
  46. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/layout/feeders.py +0 -0
  47. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/layout/long_links.py +0 -0
  48. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/layout/model.py +0 -0
  49. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/layout/node_size.py +0 -0
  50. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/layout/ordering.py +0 -0
  51. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/layout/packing.py +0 -0
  52. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/layout/pipeline.py +0 -0
  53. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/layout/placement.py +0 -0
  54. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/layout/priority.py +0 -0
  55. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/layout/ranking.py +0 -0
  56. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/layout/realize.py +0 -0
  57. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/layout/reroutes.py +0 -0
  58. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/layout/routing.py +0 -0
  59. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/layout/snapping.py +0 -0
  60. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/layout/spacing.py +0 -0
  61. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/layout/stacking.py +0 -0
  62. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/layout/sugiyama.py +0 -0
  63. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/layout/zones.py +0 -0
  64. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/live.py +0 -0
  65. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/nodes/__init__.py +0 -0
  66. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/nodes/_mixins.py +0 -0
  67. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/nodes/compositor/__init__.py +0 -0
  68. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/nodes/compositor/assets.py +0 -0
  69. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/nodes/compositor/color.py +0 -0
  70. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/nodes/compositor/converter.py +0 -0
  71. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/nodes/compositor/distort.py +0 -0
  72. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/nodes/compositor/filter.py +0 -0
  73. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/nodes/compositor/group.py +0 -0
  74. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/nodes/compositor/input.py +0 -0
  75. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/nodes/compositor/interface.py +0 -0
  76. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/nodes/compositor/manual.py +0 -0
  77. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/nodes/compositor/matte.py +0 -0
  78. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/nodes/compositor/output.py +0 -0
  79. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/nodes/compositor/vector.py +0 -0
  80. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/nodes/geometry/__init__.py +0 -0
  81. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/nodes/geometry/assets.py +0 -0
  82. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/nodes/geometry/attribute.py +0 -0
  83. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/nodes/geometry/color.py +0 -0
  84. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/nodes/geometry/converter.py +0 -0
  85. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/nodes/geometry/geometry.py +0 -0
  86. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/nodes/geometry/grid.py +0 -0
  87. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/nodes/geometry/group.py +0 -0
  88. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/nodes/geometry/groups.py +0 -0
  89. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/nodes/geometry/input.py +0 -0
  90. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/nodes/geometry/interface.py +0 -0
  91. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/nodes/geometry/manual.py +0 -0
  92. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/nodes/geometry/output.py +0 -0
  93. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/nodes/geometry/texture.py +0 -0
  94. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/nodes/geometry/utilities.py +0 -0
  95. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/nodes/geometry/vector.py +0 -0
  96. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/nodes/geometry/zone.py +0 -0
  97. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/nodes/shader/__init__.py +0 -0
  98. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/nodes/shader/assets.py +0 -0
  99. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/nodes/shader/color.py +0 -0
  100. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/nodes/shader/converter.py +0 -0
  101. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/nodes/shader/grid.py +0 -0
  102. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/nodes/shader/group.py +0 -0
  103. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/nodes/shader/input.py +0 -0
  104. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/nodes/shader/manual.py +0 -0
  105. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/nodes/shader/output.py +0 -0
  106. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/nodes/shader/script.py +0 -0
  107. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/nodes/shader/shader.py +0 -0
  108. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/nodes/shader/texture.py +0 -0
  109. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/nodes/shader/vector.py +0 -0
  110. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/py.typed +0 -0
  111. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/skills/nodebpy/SKILL.md +0 -0
  112. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/skills/nodebpy/references/existing-trees.md +0 -0
  113. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/skills/nodebpy/references/shader-compositor.md +0 -0
  114. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/skills/nodebpy/references/verifying.md +0 -0
  115. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/skills/nodebpy/references/writing-trees.md +0 -0
  116. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/skills/nodebpy/references/zones-and-items.md +0 -0
  117. {nodebpy-520.37.0 → nodebpy-520.38.0}/src/nodebpy/types.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: nodebpy
3
- Version: 520.37.0
3
+ Version: 520.38.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.37.0"
3
+ version = "520.38.0"
4
4
  description = "Build nodes trees in Blender more elegantly with code"
5
5
  readme = "README.md"
6
6
  authors = [
@@ -15,6 +15,7 @@ Organization (top to bottom):
15
15
 
16
16
  from __future__ import annotations
17
17
 
18
+ import math
18
19
  from collections.abc import Iterable, Iterator, Mapping
19
20
  from typing import (
20
21
  TYPE_CHECKING,
@@ -1958,8 +1959,9 @@ class _FloatMixin[IntegerResult: (IntegerSocket, IntegerSocketGrid, IntegerSocke
1958
1959
  self._assert_output("power")
1959
1960
  return self._math.power(self.socket, exponent).o.value # ty: ignore[invalid-return-type]
1960
1961
 
1961
- def log(self, base: InputFloat = 2.0) -> Self:
1962
- """Return the logarithm of this value to *base*."""
1962
+ def log(self, base: InputFloat = math.e) -> Self:
1963
+ """Return the logarithm of this value to *base*, the natural logarithm
1964
+ by default (as ``math.log``)."""
1963
1965
  self._assert_output("log")
1964
1966
  return self._math.logarithm(self.socket, base).o.value # ty: ignore[invalid-return-type]
1965
1967
 
@@ -3245,6 +3245,24 @@ def _match_socket_method(
3245
3245
  return None
3246
3246
 
3247
3247
 
3248
+ def _method_defaults(receiver: NodeSocket, method: str) -> dict[str, Any]:
3249
+ """The defaults of the method the receiver's socket class has under the
3250
+ name *method*, by parameter. A ``None`` default leaves the socket as it
3251
+ is, so it is left out, as are methods reached through an accessor
3252
+ (``point.at``)."""
3253
+ from ..builder._registry import _wrap_socket
3254
+
3255
+ cls = type(_wrap_socket(receiver))
3256
+ function = None if "." in method else getattr(cls, method, None)
3257
+ if not callable(function):
3258
+ return {}
3259
+ return {
3260
+ name: parameter.default
3261
+ for name, parameter in inspect.signature(function).parameters.items()
3262
+ if parameter.default not in (inspect.Parameter.empty, None)
3263
+ }
3264
+
3265
+
3248
3266
  def _socket_method_val(ctx: EmitContext, node) -> _Val | None:
3249
3267
  """Emit a node as a method call on its receiver socket, if possible."""
3250
3268
  dissolve = _DISSOLVE_SPECS.get(node.bl_idname)
@@ -3261,6 +3279,9 @@ def _socket_method_val(ctx: EmitContext, node) -> _Val | None:
3261
3279
  link.to_socket.identifier: link for link in ctx.incoming.get(node.name, ())
3262
3280
  }
3263
3281
  receiver = ctx.socket_expr(incoming[spec.receiver])
3282
+ # An argument left out takes the method's default, which need not be
3283
+ # the node's (log() is natural where Blender's base is 0.5).
3284
+ method_defaults = _method_defaults(incoming[spec.receiver].from_socket, method)
3264
3285
 
3265
3286
  kwargs: dict[str, Expr] = {}
3266
3287
  blender_defaults: dict[str, object] | None = None
@@ -3273,6 +3294,10 @@ def _socket_method_val(ctx: EmitContext, node) -> _Val | None:
3273
3294
  if socket is None or not hasattr(socket, "default_value"):
3274
3295
  continue # pragma: no cover - spec params name real sockets
3275
3296
  value = socket.default_value
3297
+ if index >= spec.always_args and method_defaults.get(param) is not None:
3298
+ if not _eq(value, method_defaults[param]):
3299
+ kwargs[param] = Lit(value)
3300
+ continue
3276
3301
  if index >= spec.always_args:
3277
3302
  if blender_defaults is None:
3278
3303
  blender_defaults = _get_blender_socket_defaults(
File without changes