From 125f4d09dd199c23cd27538e8385aaec6c4dae97 Mon Sep 17 00:00:00 2001 From: keonlee2 Date: Fri, 29 May 2026 12:17:16 -0400 Subject: [PATCH 1/4] Fixes to configbuilder and typeutils --- nodescraper/configbuilder.py | 8 ++++++++ nodescraper/typeutils.py | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/nodescraper/configbuilder.py b/nodescraper/configbuilder.py index 354ebc43..df8b379a 100644 --- a/nodescraper/configbuilder.py +++ b/nodescraper/configbuilder.py @@ -109,6 +109,14 @@ def _process_value(cls, value: Any) -> Optional[Union[dict, str, int, float, lis return_dict = {} for key, val in value.items(): return_dict[key] = cls._process_value(val) + return return_dict + + if isinstance(value, list): + return_list = [] + for item in value: + return_list.append(cls._process_value(item)) + return return_list + elif not isinstance( value, diff --git a/nodescraper/typeutils.py b/nodescraper/typeutils.py index cd7a4650..8620e708 100644 --- a/nodescraper/typeutils.py +++ b/nodescraper/typeutils.py @@ -168,7 +168,7 @@ def get_model_types(cls, model: type[BaseModel]) -> dict[str, TypeData]: type_map[name] = TypeData( type_classes=cls.process_type(field.annotation), required=field.is_required(), - default=field.default, + default=field.default_factory() if callable(field.default_factory) else field.default, ) return type_map From 1cf115434c518baa0fcf2c2b0167206b0d7df91e Mon Sep 17 00:00:00 2001 From: amd-keonlee2 Date: Tue, 9 Jun 2026 18:14:35 -0400 Subject: [PATCH 2/4] Changes to config builder unit test --- nodescraper/pluginregistry.py | 4 +++- test/unit/framework/common/shared_utils.py | 2 ++ test/unit/framework/test_cli_helper.py | 2 ++ test/unit/framework/test_config_builder.py | 2 ++ 4 files changed, 9 insertions(+), 1 deletion(-) diff --git a/nodescraper/pluginregistry.py b/nodescraper/pluginregistry.py index 559d96f6..097bd61e 100644 --- a/nodescraper/pluginregistry.py +++ b/nodescraper/pluginregistry.py @@ -28,7 +28,7 @@ import inspect import pkgutil import types -from typing import Optional +from typing import Iterable, Optional import nodescraper.connection as internal_connections import nodescraper.plugins as internal_plugins @@ -135,6 +135,7 @@ def load_connection_managers_from_entry_points() -> dict[str, type]: managers: dict[str, type] = {} try: + eps: Iterable try: eps = importlib.metadata.entry_points( # type: ignore[call-arg] group="nodescraper.connection_managers" @@ -177,6 +178,7 @@ def load_plugins_from_entry_points() -> dict[str, type]: plugins = {} try: + eps: Iterable # Python 3.10+ supports group parameter try: eps = importlib.metadata.entry_points(group="nodescraper.plugins") # type: ignore[call-arg] diff --git a/test/unit/framework/common/shared_utils.py b/test/unit/framework/common/shared_utils.py index 11e6f541..5b882549 100644 --- a/test/unit/framework/common/shared_utils.py +++ b/test/unit/framework/common/shared_utils.py @@ -95,6 +95,8 @@ def run( self, test_bool_arg: bool = True, test_str_arg: str = "test", + test_list_arg: list[int] = [1], # noqa: B006 + test_dict_arg: dict = {}, # noqa: B006 test_model_arg: Optional[TestModelArg] = None, ): return PluginResult( diff --git a/test/unit/framework/test_cli_helper.py b/test/unit/framework/test_cli_helper.py index 3e09c108..7a29d888 100644 --- a/test/unit/framework/test_cli_helper.py +++ b/test/unit/framework/test_cli_helper.py @@ -140,6 +140,8 @@ def test_config_builder(plugin_registry): "TestPluginA": { "test_bool_arg": True, "test_str_arg": "test", + "test_list_arg": [1], + "test_dict_arg": {}, "test_model_arg": {"model_attr": 123}, }, "ExamplePlugin": {}, diff --git a/test/unit/framework/test_config_builder.py b/test/unit/framework/test_config_builder.py index 862d4011..ede3fac6 100644 --- a/test/unit/framework/test_config_builder.py +++ b/test/unit/framework/test_config_builder.py @@ -36,6 +36,8 @@ def test_config_builder(plugin_registry): "TestPluginA": { "test_bool_arg": True, "test_str_arg": "test", + "test_list_arg": [1], + "test_dict_arg": {}, "test_model_arg": {"model_attr": 123}, } } From b18ac487862f350c254a0b2a7e561a7d03246fec Mon Sep 17 00:00:00 2001 From: amd-keonlee2 Date: Wed, 10 Jun 2026 10:59:18 -0400 Subject: [PATCH 3/4] Reformatted --- nodescraper/configbuilder.py | 1 - nodescraper/typeutils.py | 4 +++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/nodescraper/configbuilder.py b/nodescraper/configbuilder.py index df8b379a..7823b95a 100644 --- a/nodescraper/configbuilder.py +++ b/nodescraper/configbuilder.py @@ -117,7 +117,6 @@ def _process_value(cls, value: Any) -> Optional[Union[dict, str, int, float, lis return_list.append(cls._process_value(item)) return return_list - elif not isinstance( value, ( diff --git a/nodescraper/typeutils.py b/nodescraper/typeutils.py index 8620e708..c77a9879 100644 --- a/nodescraper/typeutils.py +++ b/nodescraper/typeutils.py @@ -168,7 +168,9 @@ def get_model_types(cls, model: type[BaseModel]) -> dict[str, TypeData]: type_map[name] = TypeData( type_classes=cls.process_type(field.annotation), required=field.is_required(), - default=field.default_factory() if callable(field.default_factory) else field.default, + default=( + field.default_factory() if callable(field.default_factory) else field.default + ), ) return type_map From 5c4bdccf1734edec5cf36f6d3c58a452881bda4b Mon Sep 17 00:00:00 2001 From: amd-keonlee2 Date: Wed, 10 Jun 2026 11:41:12 -0400 Subject: [PATCH 4/4] Updated ignore list for MyPy --- nodescraper/pluginregistry.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nodescraper/pluginregistry.py b/nodescraper/pluginregistry.py index 097bd61e..5abc2f84 100644 --- a/nodescraper/pluginregistry.py +++ b/nodescraper/pluginregistry.py @@ -146,7 +146,7 @@ def load_connection_managers_from_entry_points() -> dict[str, type]: for entry_point in eps: try: - loaded = entry_point.load() # type: ignore[attr-defined] + loaded = entry_point.load() # type: ignore[attr-defined, union-attr] if not ( inspect.isclass(loaded) and issubclass(loaded, ConnectionManager) @@ -189,7 +189,7 @@ def load_plugins_from_entry_points() -> dict[str, type]: for entry_point in eps: try: - plugin_class = entry_point.load() # type: ignore[attr-defined] + plugin_class = entry_point.load() # type: ignore[attr-defined, union-attr] if ( inspect.isclass(plugin_class)