funcnodes-core 2.3.1__tar.gz → 2.3.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 (92) hide show
  1. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/CHANGELOG.md +6 -0
  2. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/PKG-INFO +1 -1
  3. funcnodes_core-2.3.2/cz.toml +6 -0
  4. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/pyproject.toml +1 -1
  5. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/src/funcnodes_core/eventmanager.py +2 -2
  6. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/tests/test_eventmanager.py +49 -0
  7. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/uv.lock +1 -1
  8. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/.coveragerc +0 -0
  9. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/.flake8 +0 -0
  10. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/.github/actions/install_package/action.yml +0 -0
  11. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/.github/workflows/py_test.yml +0 -0
  12. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/.github/workflows/version_publish_main.yml +0 -0
  13. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/.gitignore +0 -0
  14. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/.pre-commit-config.yaml +0 -0
  15. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/LICENSE +0 -0
  16. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/MANIFEST.in +0 -0
  17. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/README.md +0 -0
  18. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/THIRD_PARTY_NOTICES.md +0 -0
  19. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/conftest.py +0 -0
  20. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/pytest.ini +0 -0
  21. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/src/funcnodes_core/__init__.py +0 -0
  22. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/src/funcnodes_core/_logging.py +0 -0
  23. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/src/funcnodes_core/_setup.py +0 -0
  24. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/src/funcnodes_core/config.py +0 -0
  25. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/src/funcnodes_core/data.py +0 -0
  26. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/src/funcnodes_core/datapath.py +0 -0
  27. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/src/funcnodes_core/decorator/__init__.py +0 -0
  28. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/src/funcnodes_core/exceptions.py +0 -0
  29. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/src/funcnodes_core/graph.py +0 -0
  30. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/src/funcnodes_core/grouping_logic.py +0 -0
  31. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/src/funcnodes_core/io.py +0 -0
  32. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/src/funcnodes_core/lib/__init__.py +0 -0
  33. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/src/funcnodes_core/lib/lib.py +0 -0
  34. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/src/funcnodes_core/lib/libfinder.py +0 -0
  35. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/src/funcnodes_core/lib/libparser.py +0 -0
  36. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/src/funcnodes_core/node.py +0 -0
  37. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/src/funcnodes_core/nodemaker.py +0 -0
  38. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/src/funcnodes_core/nodespace.py +0 -0
  39. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/src/funcnodes_core/testing.py +0 -0
  40. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/src/funcnodes_core/triggerstack.py +0 -0
  41. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/src/funcnodes_core/utils/__init__.py +0 -0
  42. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/src/funcnodes_core/utils/cache.py +0 -0
  43. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/src/funcnodes_core/utils/data.py +0 -0
  44. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/src/funcnodes_core/utils/deprecations.py +0 -0
  45. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/src/funcnodes_core/utils/files.py +0 -0
  46. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/src/funcnodes_core/utils/functions.py +0 -0
  47. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/src/funcnodes_core/utils/modules.py +0 -0
  48. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/src/funcnodes_core/utils/nodetqdm.py +0 -0
  49. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/src/funcnodes_core/utils/nodeutils.py +0 -0
  50. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/src/funcnodes_core/utils/plugins.py +0 -0
  51. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/src/funcnodes_core/utils/plugins_types.py +0 -0
  52. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/src/funcnodes_core/utils/saving.py +0 -0
  53. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/src/funcnodes_core/utils/serialization.py +0 -0
  54. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/src/funcnodes_core/utils/special_types.py +0 -0
  55. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/src/funcnodes_core/utils/wrapper.py +0 -0
  56. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/tests/__init__.py +0 -0
  57. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/tests/conftest.py +0 -0
  58. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/tests/test_cache_utils.py +0 -0
  59. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/tests/test_config.py +0 -0
  60. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/tests/test_data.py +0 -0
  61. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/tests/test_datapaths.py +0 -0
  62. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/tests/test_decorator.py +0 -0
  63. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/tests/test_exceptions.py +0 -0
  64. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/tests/test_functions.py +0 -0
  65. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/tests/test_graph.py +0 -0
  66. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/tests/test_grouping_logic.py +0 -0
  67. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/tests/test_lib.py +0 -0
  68. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/tests/test_libfinder.py +0 -0
  69. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/tests/test_nodeclass.py +0 -0
  70. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/tests/test_nodeclassmixin.py +0 -0
  71. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/tests/test_nodeio.py +0 -0
  72. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/tests/test_nodemaker.py +0 -0
  73. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/tests/test_nodespace.py +0 -0
  74. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/tests/test_nodeutils.py +0 -0
  75. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/tests/test_public_api.py +0 -0
  76. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/tests/test_setup.py +0 -0
  77. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/tests/test_triggering.py +0 -0
  78. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/tests/test_triggerstack.py +0 -0
  79. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/tests/test_utils/__init__.py +0 -0
  80. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/tests/test_utils/test_datautils.py +0 -0
  81. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/tests/test_utils/test_deprecations.py +0 -0
  82. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/tests/test_utils/test_files.py +0 -0
  83. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/tests/test_utils/test_logging.py +0 -0
  84. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/tests/test_utils/test_modules.py +0 -0
  85. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/tests/test_utils/test_nodetqdm.py +0 -0
  86. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/tests/test_utils/test_plugins.py +0 -0
  87. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/tests/test_utils/test_plugins_types.py +0 -0
  88. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/tests/test_utils/test_saving.py +0 -0
  89. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/tests/test_utils/test_serialization.py +0 -0
  90. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/tests/test_utils/test_special_types.py +0 -0
  91. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/tests/test_utils/test_testing.py +0 -0
  92. {funcnodes_core-2.3.1 → funcnodes_core-2.3.2}/tests/test_utils/test_wrapper.py +0 -0
@@ -1,3 +1,9 @@
1
+ ## v2.3.2 (2025-12-24)
2
+
3
+ ### Fix
4
+
5
+ - **eventmanager**: prevent skipping listeners during event emission
6
+
1
7
  ## v2.3.1 (2025-12-23)
2
8
 
3
9
  ### Fix
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: funcnodes-core
3
- Version: 2.3.1
3
+ Version: 2.3.2
4
4
  Summary: core package for funcnodes
5
5
  Project-URL: homepage, https://github.com/Linkdlab/funcnodes_core
6
6
  Project-URL: source, https://github.com/Linkdlab/funcnodes_core
@@ -0,0 +1,6 @@
1
+ [tool.commitizen]
2
+ name = "cz_conventional_commits"
3
+ tag_format = "$version"
4
+ version_scheme = "pep440"
5
+ version_provider = "uv"
6
+ update_changelog_on_bump = true
@@ -1,7 +1,7 @@
1
1
  [project]
2
2
  name = "funcnodes-core"
3
3
 
4
- version = "2.3.1"
4
+ version = "2.3.2"
5
5
 
6
6
  description = "core package for funcnodes"
7
7
  authors = [{name = "Julian Kimmig", email = "julian.kimmig@linkdlab.de"}]
@@ -337,11 +337,11 @@ class EventEmitterMixin:
337
337
  msg["src"] = self
338
338
  listened = False
339
339
  if event_name in self._events:
340
- for callback in self._events[event_name]:
340
+ for callback in self._events[event_name][:]:
341
341
  callback(**msg)
342
342
  listened = True
343
343
  if "*" in self._events:
344
- for callback in self._events["*"]:
344
+ for callback in self._events["*"][:]:
345
345
  callback(event=event_name, **msg)
346
346
  listened = True
347
347
 
@@ -597,3 +597,52 @@ def test_emit_after_decorator_async_function():
597
597
  {"src": emitter, "result": "async_function_result"},
598
598
  )
599
599
  assert result == "async_function_result"
600
+
601
+
602
+ class EmitterTest(EventEmitterMixin):
603
+ pass
604
+
605
+
606
+ @pytest.mark.asyncio
607
+ async def test_event_manager_modification_during_emit():
608
+ """
609
+ Test that modifying the event listener list (e.g., via once()) during
610
+ event emission does not cause listeners to be skipped.
611
+ """
612
+ emitter = EmitterTest()
613
+ called = []
614
+
615
+ def cb1(**kwargs):
616
+ called.append(1)
617
+
618
+ def cb2(**kwargs):
619
+ called.append(2)
620
+
621
+ def cb3(**kwargs):
622
+ called.append(3)
623
+
624
+ # Scenario: cb1 is 'once', cb2 is normal.
625
+ # When event fires:
626
+ # 1. cb1 is called. It calls 'off' which removes itself from the list.
627
+ # 2. cb2 should still be called.
628
+
629
+ emitter.once("test", cb1)
630
+ emitter.on("test", cb2)
631
+ emitter.emit("test")
632
+
633
+ assert 1 in called
634
+ assert 2 in called
635
+
636
+ called.clear()
637
+ emitter.off("test")
638
+
639
+ # Scenario: cb1 is normal, cb2 is once, cb3 is normal.
640
+ emitter.on("test", cb1)
641
+ emitter.once("test", cb2)
642
+ emitter.on("test", cb3)
643
+
644
+ emitter.emit("test")
645
+
646
+ assert 1 in called
647
+ assert 2 in called
648
+ assert 3 in called
@@ -457,7 +457,7 @@ wheels = [
457
457
 
458
458
  [[package]]
459
459
  name = "funcnodes-core"
460
- version = "2.3.1"
460
+ version = "2.3.2"
461
461
  source = { editable = "." }
462
462
  dependencies = [
463
463
  { name = "dill" },
File without changes
File without changes
File without changes