From 5c93926b7a53bae306182297eefc6929b9c0fa5a Mon Sep 17 00:00:00 2001 From: Markus Stahl Date: Tue, 9 Sep 2025 16:33:55 +0200 Subject: [PATCH 1/4] feat: core: environment variable for load library timeout --- .../robotcode/robot/diagnostics/imports_manager.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/robot/src/robotcode/robot/diagnostics/imports_manager.py b/packages/robot/src/robotcode/robot/diagnostics/imports_manager.py index 3c0607aa..ef80fe3d 100644 --- a/packages/robot/src/robotcode/robot/diagnostics/imports_manager.py +++ b/packages/robot/src/robotcode/robot/diagnostics/imports_manager.py @@ -96,8 +96,8 @@ REST_EXTENSIONS = (".rst", ".rest") -LOAD_LIBRARY_TIME_OUT = 10 -COMPLETE_LIBRARY_IMPORT_TIME_OUT = COMPLETE_RESOURCE_IMPORT_TIME_OUT = COMPLETE_VARIABLES_IMPORT_TIME_OUT = 5 +LOAD_LIBRARY_TIMEOUT: int = int(os.environ.get("ROBOTCODE_LOAD_LIBRARY_TIMEOUT", 10)) +COMPLETE_LIBRARY_IMPORT_TIMEOUT = COMPLETE_RESOURCE_IMPORT_TIMEOUT = COMPLETE_VARIABLES_IMPORT_TIMEOUT = 5 class _EntryKey: @@ -1266,7 +1266,7 @@ def _get_library_libdoc( base_dir, self.get_resolvable_command_line_variables(), variables, - ).result(LOAD_LIBRARY_TIME_OUT) + ).result(LOAD_LIBRARY_TIMEOUT) except TimeoutError as e: raise RuntimeError(f"Timeout loading library {name}({args!r})") from e @@ -1438,7 +1438,7 @@ def _get_variables_libdoc( base_dir, self.get_resolvable_command_line_variables() if resolve_command_line_vars else None, variables, - ).result(LOAD_LIBRARY_TIME_OUT) + ).result(LOAD_LIBRARY_TIMEOUT) except TimeoutError as e: raise RuntimeError(f"Timeout loading library {name}({args!r})") from e @@ -1608,7 +1608,7 @@ def complete_library_import( base_dir, self.get_resolvable_command_line_variables(), variables, - ).result(COMPLETE_LIBRARY_IMPORT_TIME_OUT) + ).result(COMPLETE_LIBRARY_IMPORT_TIMEOUT) def complete_resource_import( self, @@ -1623,7 +1623,7 @@ def complete_resource_import( base_dir, self.get_resolvable_command_line_variables(), variables, - ).result(COMPLETE_RESOURCE_IMPORT_TIME_OUT) + ).result(COMPLETE_RESOURCE_IMPORT_TIMEOUT) def complete_variables_import( self, @@ -1638,7 +1638,7 @@ def complete_variables_import( base_dir, self.get_resolvable_command_line_variables(), variables, - ).result(COMPLETE_VARIABLES_IMPORT_TIME_OUT) + ).result(COMPLETE_VARIABLES_IMPORT_TIMEOUT) def resolve_variable( self, From 9394619998963d9b9a752913dcae72c18582c3df Mon Sep 17 00:00:00 2001 From: Markus Stahl Date: Wed, 10 Sep 2025 14:20:30 +0200 Subject: [PATCH 2/4] explain error message --- .../src/robotcode/robot/diagnostics/imports_manager.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/robot/src/robotcode/robot/diagnostics/imports_manager.py b/packages/robot/src/robotcode/robot/diagnostics/imports_manager.py index ef80fe3d..365e8bab 100644 --- a/packages/robot/src/robotcode/robot/diagnostics/imports_manager.py +++ b/packages/robot/src/robotcode/robot/diagnostics/imports_manager.py @@ -1269,7 +1269,9 @@ def _get_library_libdoc( ).result(LOAD_LIBRARY_TIMEOUT) except TimeoutError as e: - raise RuntimeError(f"Timeout loading library {name}({args!r})") from e + raise RuntimeError( + f"Exceeded timeout of {LOAD_LIBRARY_TIMEOUT} seconds loading library {name}({args!r}). Check implementation of the library, why instantiation would take so long. If you think, you require more time to load a library, set environment variable ROBOTCODE_LOAD_LIBRARY_TIMEOUT to amount of seconds." + ) from e except (SystemExit, KeyboardInterrupt): raise @@ -1441,7 +1443,9 @@ def _get_variables_libdoc( ).result(LOAD_LIBRARY_TIMEOUT) except TimeoutError as e: - raise RuntimeError(f"Timeout loading library {name}({args!r})") from e + raise RuntimeError( + f"Exceeded timeout of {LOAD_LIBRARY_TIMEOUT} seconds loading library {name}({args!r}). Check implementation of the library, why instantiation would take so long. If you think, you require more time to load a library, set environment variable ROBOTCODE_LOAD_LIBRARY_TIMEOUT to amount of seconds." + ) from e except (SystemExit, KeyboardInterrupt): raise From a899238ad6627972a392d689351d7083f5a76ec3 Mon Sep 17 00:00:00 2001 From: Markus <5188411+Noordsestern@users.noreply.github.com> Date: Thu, 11 Sep 2025 07:57:03 +0000 Subject: [PATCH 3/4] format document to satisfy linter --- .../robot/diagnostics/imports_manager.py | 192 ++++++++++++------ 1 file changed, 128 insertions(+), 64 deletions(-) diff --git a/packages/robot/src/robotcode/robot/diagnostics/imports_manager.py b/packages/robot/src/robotcode/robot/diagnostics/imports_manager.py index 365e8bab..932c82b2 100644 --- a/packages/robot/src/robotcode/robot/diagnostics/imports_manager.py +++ b/packages/robot/src/robotcode/robot/diagnostics/imports_manager.py @@ -96,7 +96,8 @@ REST_EXTENSIONS = (".rst", ".rest") -LOAD_LIBRARY_TIMEOUT: int = int(os.environ.get("ROBOTCODE_LOAD_LIBRARY_TIMEOUT", 10)) +LOAD_LIBRARY_TIMEOUT: int = int( + os.environ.get("ROBOTCODE_LOAD_LIBRARY_TIMEOUT", 10)) COMPLETE_LIBRARY_IMPORT_TIMEOUT = COMPLETE_RESOURCE_IMPORT_TIMEOUT = COMPLETE_VARIABLES_IMPORT_TIMEOUT = 5 @@ -134,11 +135,13 @@ def __del__(self) -> None: def _remove_file_watcher(self) -> None: if self.file_watchers: for watcher in self.file_watchers: - self.parent.file_watcher_manager.remove_file_watcher_entry(watcher) + self.parent.file_watcher_manager.remove_file_watcher_entry( + watcher) self.file_watchers = [] @abstractmethod - def check_file_changed(self, changes: List[FileEvent]) -> Optional[FileChangeType]: ... + def check_file_changed( + self, changes: List[FileEvent]) -> Optional[FileChangeType]: ... @final def invalidate(self) -> None: @@ -221,7 +224,8 @@ def check_file_changed(self, changes: List[FileEvent]) -> Optional[FileChangeTyp return None def _update(self) -> None: - self._lib_doc = self._get_libdoc_callback(self.name, self.args, self.working_dir, self.base_dir) + self._lib_doc = self._get_libdoc_callback( + self.name, self.args, self.working_dir, self.base_dir) source_or_origin = ( self._lib_doc.source @@ -264,7 +268,8 @@ def _update(self) -> None: self.file_watchers.append( self.parent.file_watcher_manager.add_file_watchers( self.parent.did_change_watched_files, - [str(Path(s).joinpath("**")) for s in self._lib_doc.python_path], + [str(Path(s).joinpath("**")) + for s in self._lib_doc.python_path], ) ) @@ -438,7 +443,8 @@ def check_file_changed(self, changes: List[FileEvent]) -> Optional[FileChangeTyp return None def _update(self) -> None: - self._lib_doc = self._get_variables_doc_handler(self.name, self.args, self.working_dir, self.base_dir) + self._lib_doc = self._get_variables_doc_handler( + self.name, self.args, self.working_dir, self.base_dir) if self._lib_doc is not None: self.file_watchers.append( @@ -518,8 +524,10 @@ def __init__( super().__init__() self.documents_manager = documents_manager - self.documents_manager.did_create_uri.add(self._on_possible_imports_modified) - self.documents_manager.did_change.add(self._on_possible_resource_document_modified) + self.documents_manager.did_create_uri.add( + self._on_possible_imports_modified) + self.documents_manager.did_change.add( + self._on_possible_resource_document_modified) self.file_watcher_manager: FileWatcherManagerBase = ( file_watcher_manager if file_watcher_manager is not None else FileWatcherManagerDummy() @@ -532,7 +540,8 @@ def __init__( if cache_base_path is None: cache_base_path = root_folder - self._logger.trace(lambda: f"use {cache_base_path} as base for caching") + self._logger.trace( + lambda: f"use {cache_base_path} as base for caching") self.cache_path = cache_base_path / ".robotcode_cache" self.data_cache = DefaultDataCache( @@ -544,18 +553,27 @@ def __init__( self.cmd_variables = variables self.cmd_variable_files = variable_files - self.ignored_libraries_patters = [Pattern(s) for s in ignored_libraries] - self.ignored_variables_patters = [Pattern(s) for s in ignored_variables] - self.ignore_arguments_for_library_patters = [Pattern(s) for s in ignore_arguments_for_library] + self.ignored_libraries_patters = [ + Pattern(s) for s in ignored_libraries] + self.ignored_variables_patters = [ + Pattern(s) for s in ignored_variables] + self.ignore_arguments_for_library_patters = [ + Pattern(s) for s in ignore_arguments_for_library] self.global_library_search_order = global_library_search_order - self._libaries_lock = RLock(default_timeout=120, name="ImportsManager._libaries_lock") - self._libaries: OrderedDict[_LibrariesEntryKey, _LibrariesEntry] = OrderedDict() - self._resources_lock = RLock(default_timeout=120, name="ImportsManager._resources_lock") - self._resources: OrderedDict[_ResourcesEntryKey, _ResourcesEntry] = OrderedDict() - self._variables_lock = RLock(default_timeout=120, name="ImportsManager._variables_lock") - self._variables: OrderedDict[_VariablesEntryKey, _VariablesEntry] = OrderedDict() + self._libaries_lock = RLock( + default_timeout=120, name="ImportsManager._libaries_lock") + self._libaries: OrderedDict[_LibrariesEntryKey, + _LibrariesEntry] = OrderedDict() + self._resources_lock = RLock( + default_timeout=120, name="ImportsManager._resources_lock") + self._resources: OrderedDict[_ResourcesEntryKey, + _ResourcesEntry] = OrderedDict() + self._variables_lock = RLock( + default_timeout=120, name="ImportsManager._variables_lock") + self._variables: OrderedDict[_VariablesEntryKey, + _VariablesEntry] = OrderedDict() self.file_watchers: List[FileWatcherEntry] = [] self._command_line_variables: Optional[List[VariableDefinition]] = None self._command_line_variables_lock = RLock( @@ -574,7 +592,8 @@ def __init__( self._resource_files_cache = SimpleLRUCache(2048) self._variables_files_cache = SimpleLRUCache(2048) - self._executor_lock = RLock(default_timeout=120, name="ImportsManager._executor_lock") + self._executor_lock = RLock( + default_timeout=120, name="ImportsManager._executor_lock") self._executor: Optional[ProcessPoolExecutor] = None self._resource_document_changed_timer_lock = RLock( @@ -638,7 +657,8 @@ def get_command_line_variables(self) -> List[VariableDefinition]: ] for variable_file in self.cmd_variable_files: - name, args = split_args_from_name_or_path(str(variable_file)) + name, args = split_args_from_name_or_path( + str(variable_file)) try: lib_doc = self.get_libdoc_for_variables_import( name.replace("\\", "\\\\"), @@ -679,9 +699,11 @@ def get_command_line_variables(self) -> List[VariableDefinition]: [ DiagnosticRelatedInformation( Location( - str(Uri.from_path(os.path.abspath(error.source))), + str(Uri.from_path( + os.path.abspath(error.source))), Range.from_int_range( - (error.line_no - 1) if error.line_no is not None else -1 + (error.line_no - + 1) if error.line_no is not None else -1 ), ), error.message, @@ -749,7 +771,8 @@ def _on_possible_imports_modified(self, sender: Any, uri: DocumentUri) -> None: @language_id("robotframework") def _on_possible_resource_document_modified(self, sender: Any, document: TextDocument) -> None: - run_as_task(self.__on_possible_resource_document_modified, sender, document) + run_as_task(self.__on_possible_resource_document_modified, + sender, document) def __on_possible_resource_document_modified(self, sender: Any, document: TextDocument) -> None: with self._resource_document_changed_timer_lock: @@ -806,9 +829,12 @@ def __resource_document_changed(self, document: TextDocument) -> None: @_logger.call def did_change_watched_files(self, sender: Any, changes: List[FileEvent]) -> None: - libraries_changed: List[Tuple[_LibrariesEntryKey, FileChangeType, Optional[LibraryDoc]]] = [] - resource_changed: List[Tuple[_ResourcesEntryKey, FileChangeType, Optional[LibraryDoc]]] = [] - variables_changed: List[Tuple[_VariablesEntryKey, FileChangeType, Optional[LibraryDoc]]] = [] + libraries_changed: List[Tuple[_LibrariesEntryKey, + FileChangeType, Optional[LibraryDoc]]] = [] + resource_changed: List[Tuple[_ResourcesEntryKey, + FileChangeType, Optional[LibraryDoc]]] = [] + variables_changed: List[Tuple[_VariablesEntryKey, + FileChangeType, Optional[LibraryDoc]]] = [] lib_doc: Optional[LibraryDoc] @@ -848,21 +874,24 @@ def did_change_watched_files(self, sender: Any, changes: List[FileEvent]) -> Non if t == FileChangeType.DELETED: self.__remove_library_entry(l, self._libaries[l], True) - self.libraries_changed(self, [v for (_, _, v) in libraries_changed if v is not None]) + self.libraries_changed( + self, [v for (_, _, v) in libraries_changed if v is not None]) if resource_changed: for r, t, _ in resource_changed: if t == FileChangeType.DELETED: self.__remove_resource_entry(r, self._resources[r], True) - self.resources_changed(self, [v for (_, _, v) in resource_changed if v is not None]) + self.resources_changed( + self, [v for (_, _, v) in resource_changed if v is not None]) if variables_changed: for v, t, _ in variables_changed: if t == FileChangeType.DELETED: self.__remove_variables_entry(v, self._variables[v], True) - self.variables_changed(self, [v for (_, _, v) in variables_changed if v is not None]) + self.variables_changed( + self, [v for (_, _, v) in variables_changed if v is not None]) def __remove_library_entry( self, @@ -879,7 +908,8 @@ def __remove_library_entry( if e1 == entry: self._libaries.pop(entry_key, None) entry.invalidate() - self._logger.debug(lambda: f"Library Entry {entry_key} removed") + self._logger.debug( + lambda: f"Library Entry {entry_key} removed") finally: self._library_files_cache.clear() @@ -891,7 +921,8 @@ def __remove_resource_entry( ) -> None: try: if len(entry.references) == 0 or now: - self._logger.debug(lambda: f"Remove Resource Entry {entry_key}") + self._logger.debug( + lambda: f"Remove Resource Entry {entry_key}") with self._resources_lock: if len(entry.references) == 0 or now: e1 = self._resources.get(entry_key, None) @@ -899,7 +930,8 @@ def __remove_resource_entry( self._resources.pop(entry_key, None) entry.invalidate() - self._logger.debug(lambda: f"Resource Entry {entry_key} removed") + self._logger.debug( + lambda: f"Resource Entry {entry_key} removed") finally: self._resource_files_cache.clear() @@ -911,14 +943,16 @@ def __remove_variables_entry( ) -> None: try: if len(entry.references) == 0 or now: - self._logger.debug(lambda: f"Remove Variables Entry {entry_key}") + self._logger.debug( + lambda: f"Remove Variables Entry {entry_key}") with self._variables_lock: if len(entry.references) == 0: e1 = self._variables.get(entry_key, None) if e1 == entry: self._variables.pop(entry_key, None) entry.invalidate() - self._logger.debug(lambda: f"Variables Entry {entry_key} removed") + self._logger.debug( + lambda: f"Variables Entry {entry_key} removed") finally: self._variables_files_cache.clear() @@ -930,13 +964,15 @@ def get_library_meta( ) -> Tuple[Optional[LibraryMetaData], str, bool]: ignore_arguments = False try: - import_name = self.find_library(name, base_dir=base_dir, variables=variables) + import_name = self.find_library( + name, base_dir=base_dir, variables=variables) result: Optional[LibraryMetaData] = None module_spec: Optional[ModuleSpec] = None if is_library_by_path(import_name): if (p := Path(import_name)).exists(): - result = LibraryMetaData(__version__, p.stem, None, import_name, None, True) + result = LibraryMetaData( + __version__, p.stem, None, import_name, None, True) else: module_spec = get_module_spec(import_name) if module_spec is not None and module_spec.origin is not None: @@ -971,7 +1007,8 @@ def get_library_meta( return None, import_name, ignore_arguments if result.origin is not None: - result.mtimes = {result.origin: os.stat(result.origin, follow_symlinks=False).st_mtime_ns} + result.mtimes = {result.origin: os.stat( + result.origin, follow_symlinks=False).st_mtime_ns} if result.submodule_search_locations: if result.mtimes is None: @@ -1014,7 +1051,8 @@ def get_variables_meta( module_spec: Optional[ModuleSpec] = None if is_variables_by_path(import_name): if (p := Path(import_name)).exists(): - result = LibraryMetaData(__version__, p.stem, None, import_name, None, True) + result = LibraryMetaData( + __version__, p.stem, None, import_name, None, True) else: module_spec = get_module_spec(import_name) if module_spec is not None and module_spec.origin is not None: @@ -1040,7 +1078,8 @@ def get_variables_meta( return None, import_name if result.origin is not None: - result.mtimes = {result.origin: os.stat(result.origin, follow_symlinks=False).st_mtime_ns} + result.mtimes = {result.origin: os.stat( + result.origin, follow_symlinks=False).st_mtime_ns} if result.submodule_search_locations: if result.mtimes is None: @@ -1191,7 +1230,8 @@ def __find_variables_simple( def executor(self) -> ProcessPoolExecutor: with self._executor_lock: if self._executor is None: - self._executor = ProcessPoolExecutor(mp_context=mp.get_context("spawn")) + self._executor = ProcessPoolExecutor( + mp_context=mp.get_context("spawn")) return self._executor @@ -1217,7 +1257,8 @@ def _get_library_libdoc( base_dir: str, variables: Optional[Dict[str, Any]] = None, ) -> LibraryDoc: - meta, _source, ignore_arguments = self.get_library_meta(name, base_dir, variables) + meta, _source, ignore_arguments = self.get_library_meta( + name, base_dir, variables) if meta is not None and not meta.has_errors: meta_file = meta.filepath_base + ".meta" @@ -1225,7 +1266,8 @@ def _get_library_libdoc( try: spec_path = None try: - saved_meta = self.data_cache.read_cache_data(CacheSection.LIBRARY, meta_file, LibraryMetaData) + saved_meta = self.data_cache.read_cache_data( + CacheSection.LIBRARY, meta_file, LibraryMetaData) if saved_meta.has_errors: self._logger.debug( lambda: f"Saved library spec for {name}{args!r} is not used due to errors in meta data", @@ -1251,11 +1293,13 @@ def _get_library_libdoc( except BaseException as e: self._logger.exception(e) - self._logger.debug(lambda: f"Load library in process {name}{args!r}", context_name="import") + self._logger.debug( + lambda: f"Load library in process {name}{args!r}", context_name="import") # if self._process_pool_executor is None: # self._process_pool_executor = ProcessPoolExecutor(max_workers=1, mp_context=mp.get_context("spawn")) # executor = self._process_pool_executor - executor = ProcessPoolExecutor(max_workers=1, mp_context=mp.get_context("spawn")) + executor = ProcessPoolExecutor( + max_workers=1, mp_context=mp.get_context("spawn")) try: try: result = executor.submit( @@ -1289,15 +1333,19 @@ def _get_library_libdoc( spec_file = meta.filepath_base + ".spec" try: - self.data_cache.save_cache_data(CacheSection.LIBRARY, spec_file, result) + self.data_cache.save_cache_data( + CacheSection.LIBRARY, spec_file, result) except (SystemExit, KeyboardInterrupt): raise except BaseException as e: - raise RuntimeError(f"Cannot write spec file for library '{name}' to '{spec_file}'") from e + raise RuntimeError( + f"Cannot write spec file for library '{name}' to '{spec_file}'") from e - self.data_cache.save_cache_data(CacheSection.LIBRARY, meta_file, meta) + self.data_cache.save_cache_data( + CacheSection.LIBRARY, meta_file, meta) else: - self._logger.debug(lambda: f"Skip caching library {name}{args!r}", context_name="import") + self._logger.debug( + lambda: f"Skip caching library {name}{args!r}", context_name="import") except (SystemExit, KeyboardInterrupt): raise except BaseException as e: @@ -1341,7 +1389,8 @@ def get_libdoc_for_library_import( entry = self._libaries[entry_key] if not entry.ignore_reference and sentinel is not None and sentinel not in entry.references: - weakref.finalize(sentinel, self.__remove_library_entry, entry_key, entry) + weakref.finalize( + sentinel, self.__remove_library_entry, entry_key, entry) entry.references.add(sentinel) return entry.get_libdoc() @@ -1413,7 +1462,8 @@ def _get_variables_libdoc( try: spec_path = None try: - saved_meta = self.data_cache.read_cache_data(CacheSection.VARIABLES, meta_file, LibraryMetaData) + saved_meta = self.data_cache.read_cache_data( + CacheSection.VARIABLES, meta_file, LibraryMetaData) if saved_meta == meta: spec_path = meta.filepath_base + ".spec" @@ -1429,7 +1479,8 @@ def _get_variables_libdoc( except BaseException as e: self._logger.exception(e) - executor = ProcessPoolExecutor(max_workers=1, mp_context=mp.get_context("spawn")) + executor = ProcessPoolExecutor( + max_workers=1, mp_context=mp.get_context("spawn")) try: try: result = executor.submit( @@ -1461,14 +1512,18 @@ def _get_variables_libdoc( spec_file = meta.filepath_base + ".spec" try: - self.data_cache.save_cache_data(CacheSection.VARIABLES, spec_file, result) + self.data_cache.save_cache_data( + CacheSection.VARIABLES, spec_file, result) except (SystemExit, KeyboardInterrupt): raise except BaseException as e: - raise RuntimeError(f"Cannot write spec file for variables '{name}' to '{spec_file}'") from e - self.data_cache.save_cache_data(CacheSection.VARIABLES, meta_file, meta) + raise RuntimeError( + f"Cannot write spec file for variables '{name}' to '{spec_file}'") from e + self.data_cache.save_cache_data( + CacheSection.VARIABLES, meta_file, meta) else: - self._logger.debug(lambda: f"Skip caching variables {name}{args!r}", context_name="import") + self._logger.debug( + lambda: f"Skip caching variables {name}{args!r}", context_name="import") except (SystemExit, KeyboardInterrupt): raise except BaseException as e: @@ -1488,7 +1543,8 @@ def get_libdoc_for_variables_import( resolve_command_line_vars: bool = True, ) -> VariablesDoc: with self._logger.measure_time(lambda: f"getting libdoc for variables import {name}", context_name="import"): - source = self.find_variables(name, base_dir, variables, resolve_variables, resolve_command_line_vars) + source = self.find_variables( + name, base_dir, variables, resolve_variables, resolve_command_line_vars) if args: resolved_args = resolve_args( @@ -1511,14 +1567,16 @@ def get_libdoc_for_variables_import( str(self.root_folder), base_dir, self, - self._get_variables_libdoc_handler(variables, resolve_variables, resolve_command_line_vars), + self._get_variables_libdoc_handler( + variables, resolve_variables, resolve_command_line_vars), ) entry = self._variables[entry_key] if sentinel is not None and sentinel not in entry.references: entry.references.add(sentinel) - weakref.finalize(sentinel, self.__remove_variables_entry, entry_key, entry) + weakref.finalize( + sentinel, self.__remove_variables_entry, entry_key, entry) return entry.get_libdoc() @@ -1534,7 +1592,8 @@ def _get_entry_for_resource_import( source_path = normalized_path(Path(source)) def _get_document() -> TextDocument: - self._logger.debug(lambda: f"Load resource {name} from source {source_path}", context_name="import") + self._logger.debug( + lambda: f"Load resource {name} from source {source_path}", context_name="import") extension = source_path.suffix if extension.lower() not in RESOURCE_EXTENSIONS: @@ -1549,13 +1608,15 @@ def _get_document() -> TextDocument: with self._resources_lock: if entry_key not in self._resources: - self._resources[entry_key] = _ResourcesEntry(name, self, _get_document) + self._resources[entry_key] = _ResourcesEntry( + name, self, _get_document) entry = self._resources[entry_key] if sentinel is not None and sentinel not in entry.references: entry.references.add(sentinel) - weakref.finalize(sentinel, self.__remove_resource_entry, entry_key, entry) + weakref.finalize( + sentinel, self.__remove_resource_entry, entry_key, entry) return entry @@ -1568,7 +1629,8 @@ def get_namespace_and_libdoc_for_resource_import( ) -> Tuple["Namespace", LibraryDoc]: with self._logger.measure_time(lambda: f"getting namespace and libdoc for {name}", context_name="import"): with self._logger.measure_time(lambda: f"getting resource entry {name}", context_name="import"): - entry = self._get_entry_for_resource_import(name, base_dir, sentinel, variables) + entry = self._get_entry_for_resource_import( + name, base_dir, sentinel, variables) with self._logger.measure_time(lambda: f"getting namespace {name}", context_name="import"): namespace = entry.get_namespace() @@ -1584,7 +1646,8 @@ def get_namespace_for_resource_import( sentinel: Any = None, variables: Optional[Dict[str, Any]] = None, ) -> "Namespace": - entry = self._get_entry_for_resource_import(name, base_dir, sentinel, variables) + entry = self._get_entry_for_resource_import( + name, base_dir, sentinel, variables) return entry.get_namespace() @@ -1595,7 +1658,8 @@ def get_libdoc_for_resource_import( sentinel: Any = None, variables: Optional[Dict[str, Any]] = None, ) -> LibraryDoc: - entry = self._get_entry_for_resource_import(name, base_dir, sentinel, variables) + entry = self._get_entry_for_resource_import( + name, base_dir, sentinel, variables) return entry.get_libdoc() From c69e5a36ee57ee26c0464bffa7a29e08663c6244 Mon Sep 17 00:00:00 2001 From: Markus <5188411+Noordsestern@users.noreply.github.com> Date: Thu, 11 Sep 2025 08:13:08 +0000 Subject: [PATCH 4/4] revert auto formatting, satisfy linter --- .../robot/diagnostics/imports_manager.py | 202 +++++++----------- 1 file changed, 72 insertions(+), 130 deletions(-) diff --git a/packages/robot/src/robotcode/robot/diagnostics/imports_manager.py b/packages/robot/src/robotcode/robot/diagnostics/imports_manager.py index 932c82b2..83a45e89 100644 --- a/packages/robot/src/robotcode/robot/diagnostics/imports_manager.py +++ b/packages/robot/src/robotcode/robot/diagnostics/imports_manager.py @@ -96,8 +96,7 @@ REST_EXTENSIONS = (".rst", ".rest") -LOAD_LIBRARY_TIMEOUT: int = int( - os.environ.get("ROBOTCODE_LOAD_LIBRARY_TIMEOUT", 10)) +LOAD_LIBRARY_TIMEOUT: int = int(os.environ.get("ROBOTCODE_LOAD_LIBRARY_TIMEOUT", 10)) COMPLETE_LIBRARY_IMPORT_TIMEOUT = COMPLETE_RESOURCE_IMPORT_TIMEOUT = COMPLETE_VARIABLES_IMPORT_TIMEOUT = 5 @@ -135,13 +134,11 @@ def __del__(self) -> None: def _remove_file_watcher(self) -> None: if self.file_watchers: for watcher in self.file_watchers: - self.parent.file_watcher_manager.remove_file_watcher_entry( - watcher) + self.parent.file_watcher_manager.remove_file_watcher_entry(watcher) self.file_watchers = [] @abstractmethod - def check_file_changed( - self, changes: List[FileEvent]) -> Optional[FileChangeType]: ... + def check_file_changed(self, changes: List[FileEvent]) -> Optional[FileChangeType]: ... @final def invalidate(self) -> None: @@ -224,8 +221,7 @@ def check_file_changed(self, changes: List[FileEvent]) -> Optional[FileChangeTyp return None def _update(self) -> None: - self._lib_doc = self._get_libdoc_callback( - self.name, self.args, self.working_dir, self.base_dir) + self._lib_doc = self._get_libdoc_callback(self.name, self.args, self.working_dir, self.base_dir) source_or_origin = ( self._lib_doc.source @@ -268,8 +264,7 @@ def _update(self) -> None: self.file_watchers.append( self.parent.file_watcher_manager.add_file_watchers( self.parent.did_change_watched_files, - [str(Path(s).joinpath("**")) - for s in self._lib_doc.python_path], + [str(Path(s).joinpath("**")) for s in self._lib_doc.python_path], ) ) @@ -443,8 +438,7 @@ def check_file_changed(self, changes: List[FileEvent]) -> Optional[FileChangeTyp return None def _update(self) -> None: - self._lib_doc = self._get_variables_doc_handler( - self.name, self.args, self.working_dir, self.base_dir) + self._lib_doc = self._get_variables_doc_handler(self.name, self.args, self.working_dir, self.base_dir) if self._lib_doc is not None: self.file_watchers.append( @@ -524,10 +518,8 @@ def __init__( super().__init__() self.documents_manager = documents_manager - self.documents_manager.did_create_uri.add( - self._on_possible_imports_modified) - self.documents_manager.did_change.add( - self._on_possible_resource_document_modified) + self.documents_manager.did_create_uri.add(self._on_possible_imports_modified) + self.documents_manager.did_change.add(self._on_possible_resource_document_modified) self.file_watcher_manager: FileWatcherManagerBase = ( file_watcher_manager if file_watcher_manager is not None else FileWatcherManagerDummy() @@ -540,8 +532,7 @@ def __init__( if cache_base_path is None: cache_base_path = root_folder - self._logger.trace( - lambda: f"use {cache_base_path} as base for caching") + self._logger.trace(lambda: f"use {cache_base_path} as base for caching") self.cache_path = cache_base_path / ".robotcode_cache" self.data_cache = DefaultDataCache( @@ -553,27 +544,18 @@ def __init__( self.cmd_variables = variables self.cmd_variable_files = variable_files - self.ignored_libraries_patters = [ - Pattern(s) for s in ignored_libraries] - self.ignored_variables_patters = [ - Pattern(s) for s in ignored_variables] - self.ignore_arguments_for_library_patters = [ - Pattern(s) for s in ignore_arguments_for_library] + self.ignored_libraries_patters = [Pattern(s) for s in ignored_libraries] + self.ignored_variables_patters = [Pattern(s) for s in ignored_variables] + self.ignore_arguments_for_library_patters = [Pattern(s) for s in ignore_arguments_for_library] self.global_library_search_order = global_library_search_order - self._libaries_lock = RLock( - default_timeout=120, name="ImportsManager._libaries_lock") - self._libaries: OrderedDict[_LibrariesEntryKey, - _LibrariesEntry] = OrderedDict() - self._resources_lock = RLock( - default_timeout=120, name="ImportsManager._resources_lock") - self._resources: OrderedDict[_ResourcesEntryKey, - _ResourcesEntry] = OrderedDict() - self._variables_lock = RLock( - default_timeout=120, name="ImportsManager._variables_lock") - self._variables: OrderedDict[_VariablesEntryKey, - _VariablesEntry] = OrderedDict() + self._libaries_lock = RLock(default_timeout=120, name="ImportsManager._libaries_lock") + self._libaries: OrderedDict[_LibrariesEntryKey, _LibrariesEntry] = OrderedDict() + self._resources_lock = RLock(default_timeout=120, name="ImportsManager._resources_lock") + self._resources: OrderedDict[_ResourcesEntryKey, _ResourcesEntry] = OrderedDict() + self._variables_lock = RLock(default_timeout=120, name="ImportsManager._variables_lock") + self._variables: OrderedDict[_VariablesEntryKey, _VariablesEntry] = OrderedDict() self.file_watchers: List[FileWatcherEntry] = [] self._command_line_variables: Optional[List[VariableDefinition]] = None self._command_line_variables_lock = RLock( @@ -592,8 +574,7 @@ def __init__( self._resource_files_cache = SimpleLRUCache(2048) self._variables_files_cache = SimpleLRUCache(2048) - self._executor_lock = RLock( - default_timeout=120, name="ImportsManager._executor_lock") + self._executor_lock = RLock(default_timeout=120, name="ImportsManager._executor_lock") self._executor: Optional[ProcessPoolExecutor] = None self._resource_document_changed_timer_lock = RLock( @@ -657,8 +638,7 @@ def get_command_line_variables(self) -> List[VariableDefinition]: ] for variable_file in self.cmd_variable_files: - name, args = split_args_from_name_or_path( - str(variable_file)) + name, args = split_args_from_name_or_path(str(variable_file)) try: lib_doc = self.get_libdoc_for_variables_import( name.replace("\\", "\\\\"), @@ -699,11 +679,9 @@ def get_command_line_variables(self) -> List[VariableDefinition]: [ DiagnosticRelatedInformation( Location( - str(Uri.from_path( - os.path.abspath(error.source))), + str(Uri.from_path(os.path.abspath(error.source))), Range.from_int_range( - (error.line_no - - 1) if error.line_no is not None else -1 + (error.line_no - 1) if error.line_no is not None else -1 ), ), error.message, @@ -771,8 +749,7 @@ def _on_possible_imports_modified(self, sender: Any, uri: DocumentUri) -> None: @language_id("robotframework") def _on_possible_resource_document_modified(self, sender: Any, document: TextDocument) -> None: - run_as_task(self.__on_possible_resource_document_modified, - sender, document) + run_as_task(self.__on_possible_resource_document_modified, sender, document) def __on_possible_resource_document_modified(self, sender: Any, document: TextDocument) -> None: with self._resource_document_changed_timer_lock: @@ -829,12 +806,9 @@ def __resource_document_changed(self, document: TextDocument) -> None: @_logger.call def did_change_watched_files(self, sender: Any, changes: List[FileEvent]) -> None: - libraries_changed: List[Tuple[_LibrariesEntryKey, - FileChangeType, Optional[LibraryDoc]]] = [] - resource_changed: List[Tuple[_ResourcesEntryKey, - FileChangeType, Optional[LibraryDoc]]] = [] - variables_changed: List[Tuple[_VariablesEntryKey, - FileChangeType, Optional[LibraryDoc]]] = [] + libraries_changed: List[Tuple[_LibrariesEntryKey, FileChangeType, Optional[LibraryDoc]]] = [] + resource_changed: List[Tuple[_ResourcesEntryKey, FileChangeType, Optional[LibraryDoc]]] = [] + variables_changed: List[Tuple[_VariablesEntryKey, FileChangeType, Optional[LibraryDoc]]] = [] lib_doc: Optional[LibraryDoc] @@ -874,24 +848,21 @@ def did_change_watched_files(self, sender: Any, changes: List[FileEvent]) -> Non if t == FileChangeType.DELETED: self.__remove_library_entry(l, self._libaries[l], True) - self.libraries_changed( - self, [v for (_, _, v) in libraries_changed if v is not None]) + self.libraries_changed(self, [v for (_, _, v) in libraries_changed if v is not None]) if resource_changed: for r, t, _ in resource_changed: if t == FileChangeType.DELETED: self.__remove_resource_entry(r, self._resources[r], True) - self.resources_changed( - self, [v for (_, _, v) in resource_changed if v is not None]) + self.resources_changed(self, [v for (_, _, v) in resource_changed if v is not None]) if variables_changed: for v, t, _ in variables_changed: if t == FileChangeType.DELETED: self.__remove_variables_entry(v, self._variables[v], True) - self.variables_changed( - self, [v for (_, _, v) in variables_changed if v is not None]) + self.variables_changed(self, [v for (_, _, v) in variables_changed if v is not None]) def __remove_library_entry( self, @@ -908,8 +879,7 @@ def __remove_library_entry( if e1 == entry: self._libaries.pop(entry_key, None) entry.invalidate() - self._logger.debug( - lambda: f"Library Entry {entry_key} removed") + self._logger.debug(lambda: f"Library Entry {entry_key} removed") finally: self._library_files_cache.clear() @@ -921,8 +891,7 @@ def __remove_resource_entry( ) -> None: try: if len(entry.references) == 0 or now: - self._logger.debug( - lambda: f"Remove Resource Entry {entry_key}") + self._logger.debug(lambda: f"Remove Resource Entry {entry_key}") with self._resources_lock: if len(entry.references) == 0 or now: e1 = self._resources.get(entry_key, None) @@ -930,8 +899,7 @@ def __remove_resource_entry( self._resources.pop(entry_key, None) entry.invalidate() - self._logger.debug( - lambda: f"Resource Entry {entry_key} removed") + self._logger.debug(lambda: f"Resource Entry {entry_key} removed") finally: self._resource_files_cache.clear() @@ -943,16 +911,14 @@ def __remove_variables_entry( ) -> None: try: if len(entry.references) == 0 or now: - self._logger.debug( - lambda: f"Remove Variables Entry {entry_key}") + self._logger.debug(lambda: f"Remove Variables Entry {entry_key}") with self._variables_lock: if len(entry.references) == 0: e1 = self._variables.get(entry_key, None) if e1 == entry: self._variables.pop(entry_key, None) entry.invalidate() - self._logger.debug( - lambda: f"Variables Entry {entry_key} removed") + self._logger.debug(lambda: f"Variables Entry {entry_key} removed") finally: self._variables_files_cache.clear() @@ -964,15 +930,13 @@ def get_library_meta( ) -> Tuple[Optional[LibraryMetaData], str, bool]: ignore_arguments = False try: - import_name = self.find_library( - name, base_dir=base_dir, variables=variables) + import_name = self.find_library(name, base_dir=base_dir, variables=variables) result: Optional[LibraryMetaData] = None module_spec: Optional[ModuleSpec] = None if is_library_by_path(import_name): if (p := Path(import_name)).exists(): - result = LibraryMetaData( - __version__, p.stem, None, import_name, None, True) + result = LibraryMetaData(__version__, p.stem, None, import_name, None, True) else: module_spec = get_module_spec(import_name) if module_spec is not None and module_spec.origin is not None: @@ -1007,8 +971,7 @@ def get_library_meta( return None, import_name, ignore_arguments if result.origin is not None: - result.mtimes = {result.origin: os.stat( - result.origin, follow_symlinks=False).st_mtime_ns} + result.mtimes = {result.origin: os.stat(result.origin, follow_symlinks=False).st_mtime_ns} if result.submodule_search_locations: if result.mtimes is None: @@ -1051,8 +1014,7 @@ def get_variables_meta( module_spec: Optional[ModuleSpec] = None if is_variables_by_path(import_name): if (p := Path(import_name)).exists(): - result = LibraryMetaData( - __version__, p.stem, None, import_name, None, True) + result = LibraryMetaData(__version__, p.stem, None, import_name, None, True) else: module_spec = get_module_spec(import_name) if module_spec is not None and module_spec.origin is not None: @@ -1078,8 +1040,7 @@ def get_variables_meta( return None, import_name if result.origin is not None: - result.mtimes = {result.origin: os.stat( - result.origin, follow_symlinks=False).st_mtime_ns} + result.mtimes = {result.origin: os.stat(result.origin, follow_symlinks=False).st_mtime_ns} if result.submodule_search_locations: if result.mtimes is None: @@ -1230,8 +1191,7 @@ def __find_variables_simple( def executor(self) -> ProcessPoolExecutor: with self._executor_lock: if self._executor is None: - self._executor = ProcessPoolExecutor( - mp_context=mp.get_context("spawn")) + self._executor = ProcessPoolExecutor(mp_context=mp.get_context("spawn")) return self._executor @@ -1257,8 +1217,7 @@ def _get_library_libdoc( base_dir: str, variables: Optional[Dict[str, Any]] = None, ) -> LibraryDoc: - meta, _source, ignore_arguments = self.get_library_meta( - name, base_dir, variables) + meta, _source, ignore_arguments = self.get_library_meta(name, base_dir, variables) if meta is not None and not meta.has_errors: meta_file = meta.filepath_base + ".meta" @@ -1266,8 +1225,7 @@ def _get_library_libdoc( try: spec_path = None try: - saved_meta = self.data_cache.read_cache_data( - CacheSection.LIBRARY, meta_file, LibraryMetaData) + saved_meta = self.data_cache.read_cache_data(CacheSection.LIBRARY, meta_file, LibraryMetaData) if saved_meta.has_errors: self._logger.debug( lambda: f"Saved library spec for {name}{args!r} is not used due to errors in meta data", @@ -1293,13 +1251,11 @@ def _get_library_libdoc( except BaseException as e: self._logger.exception(e) - self._logger.debug( - lambda: f"Load library in process {name}{args!r}", context_name="import") + self._logger.debug(lambda: f"Load library in process {name}{args!r}", context_name="import") # if self._process_pool_executor is None: # self._process_pool_executor = ProcessPoolExecutor(max_workers=1, mp_context=mp.get_context("spawn")) # executor = self._process_pool_executor - executor = ProcessPoolExecutor( - max_workers=1, mp_context=mp.get_context("spawn")) + executor = ProcessPoolExecutor(max_workers=1, mp_context=mp.get_context("spawn")) try: try: result = executor.submit( @@ -1314,7 +1270,10 @@ def _get_library_libdoc( except TimeoutError as e: raise RuntimeError( - f"Exceeded timeout of {LOAD_LIBRARY_TIMEOUT} seconds loading library {name}({args!r}). Check implementation of the library, why instantiation would take so long. If you think, you require more time to load a library, set environment variable ROBOTCODE_LOAD_LIBRARY_TIMEOUT to amount of seconds." + f"""Exceeded timeout of {LOAD_LIBRARY_TIMEOUT} seconds loading library {name}({args!r}). + Check implementation of the library, why instantiation would take so long. If you think, + you require more time to load a library, set environment variable + ROBOTCODE_LOAD_LIBRARY_TIMEOUT to amount of seconds.""" ) from e except (SystemExit, KeyboardInterrupt): @@ -1333,19 +1292,15 @@ def _get_library_libdoc( spec_file = meta.filepath_base + ".spec" try: - self.data_cache.save_cache_data( - CacheSection.LIBRARY, spec_file, result) + self.data_cache.save_cache_data(CacheSection.LIBRARY, spec_file, result) except (SystemExit, KeyboardInterrupt): raise except BaseException as e: - raise RuntimeError( - f"Cannot write spec file for library '{name}' to '{spec_file}'") from e + raise RuntimeError(f"Cannot write spec file for library '{name}' to '{spec_file}'") from e - self.data_cache.save_cache_data( - CacheSection.LIBRARY, meta_file, meta) + self.data_cache.save_cache_data(CacheSection.LIBRARY, meta_file, meta) else: - self._logger.debug( - lambda: f"Skip caching library {name}{args!r}", context_name="import") + self._logger.debug(lambda: f"Skip caching library {name}{args!r}", context_name="import") except (SystemExit, KeyboardInterrupt): raise except BaseException as e: @@ -1389,8 +1344,7 @@ def get_libdoc_for_library_import( entry = self._libaries[entry_key] if not entry.ignore_reference and sentinel is not None and sentinel not in entry.references: - weakref.finalize( - sentinel, self.__remove_library_entry, entry_key, entry) + weakref.finalize(sentinel, self.__remove_library_entry, entry_key, entry) entry.references.add(sentinel) return entry.get_libdoc() @@ -1462,8 +1416,7 @@ def _get_variables_libdoc( try: spec_path = None try: - saved_meta = self.data_cache.read_cache_data( - CacheSection.VARIABLES, meta_file, LibraryMetaData) + saved_meta = self.data_cache.read_cache_data(CacheSection.VARIABLES, meta_file, LibraryMetaData) if saved_meta == meta: spec_path = meta.filepath_base + ".spec" @@ -1479,8 +1432,7 @@ def _get_variables_libdoc( except BaseException as e: self._logger.exception(e) - executor = ProcessPoolExecutor( - max_workers=1, mp_context=mp.get_context("spawn")) + executor = ProcessPoolExecutor(max_workers=1, mp_context=mp.get_context("spawn")) try: try: result = executor.submit( @@ -1495,7 +1447,10 @@ def _get_variables_libdoc( except TimeoutError as e: raise RuntimeError( - f"Exceeded timeout of {LOAD_LIBRARY_TIMEOUT} seconds loading library {name}({args!r}). Check implementation of the library, why instantiation would take so long. If you think, you require more time to load a library, set environment variable ROBOTCODE_LOAD_LIBRARY_TIMEOUT to amount of seconds." + f"""Exceeded timeout of {LOAD_LIBRARY_TIMEOUT} seconds loading library {name}({args!r}). + Check implementation of the library, why instantiation would take so long. If you think, + you require more time to load a library, set environment variable + ROBOTCODE_LOAD_LIBRARY_TIMEOUT to amount of seconds.""" ) from e except (SystemExit, KeyboardInterrupt): @@ -1512,18 +1467,14 @@ def _get_variables_libdoc( spec_file = meta.filepath_base + ".spec" try: - self.data_cache.save_cache_data( - CacheSection.VARIABLES, spec_file, result) + self.data_cache.save_cache_data(CacheSection.VARIABLES, spec_file, result) except (SystemExit, KeyboardInterrupt): raise except BaseException as e: - raise RuntimeError( - f"Cannot write spec file for variables '{name}' to '{spec_file}'") from e - self.data_cache.save_cache_data( - CacheSection.VARIABLES, meta_file, meta) + raise RuntimeError(f"Cannot write spec file for variables '{name}' to '{spec_file}'") from e + self.data_cache.save_cache_data(CacheSection.VARIABLES, meta_file, meta) else: - self._logger.debug( - lambda: f"Skip caching variables {name}{args!r}", context_name="import") + self._logger.debug(lambda: f"Skip caching variables {name}{args!r}", context_name="import") except (SystemExit, KeyboardInterrupt): raise except BaseException as e: @@ -1543,8 +1494,7 @@ def get_libdoc_for_variables_import( resolve_command_line_vars: bool = True, ) -> VariablesDoc: with self._logger.measure_time(lambda: f"getting libdoc for variables import {name}", context_name="import"): - source = self.find_variables( - name, base_dir, variables, resolve_variables, resolve_command_line_vars) + source = self.find_variables(name, base_dir, variables, resolve_variables, resolve_command_line_vars) if args: resolved_args = resolve_args( @@ -1567,16 +1517,14 @@ def get_libdoc_for_variables_import( str(self.root_folder), base_dir, self, - self._get_variables_libdoc_handler( - variables, resolve_variables, resolve_command_line_vars), + self._get_variables_libdoc_handler(variables, resolve_variables, resolve_command_line_vars), ) entry = self._variables[entry_key] if sentinel is not None and sentinel not in entry.references: entry.references.add(sentinel) - weakref.finalize( - sentinel, self.__remove_variables_entry, entry_key, entry) + weakref.finalize(sentinel, self.__remove_variables_entry, entry_key, entry) return entry.get_libdoc() @@ -1592,8 +1540,7 @@ def _get_entry_for_resource_import( source_path = normalized_path(Path(source)) def _get_document() -> TextDocument: - self._logger.debug( - lambda: f"Load resource {name} from source {source_path}", context_name="import") + self._logger.debug(lambda: f"Load resource {name} from source {source_path}", context_name="import") extension = source_path.suffix if extension.lower() not in RESOURCE_EXTENSIONS: @@ -1608,15 +1555,13 @@ def _get_document() -> TextDocument: with self._resources_lock: if entry_key not in self._resources: - self._resources[entry_key] = _ResourcesEntry( - name, self, _get_document) + self._resources[entry_key] = _ResourcesEntry(name, self, _get_document) entry = self._resources[entry_key] if sentinel is not None and sentinel not in entry.references: entry.references.add(sentinel) - weakref.finalize( - sentinel, self.__remove_resource_entry, entry_key, entry) + weakref.finalize(sentinel, self.__remove_resource_entry, entry_key, entry) return entry @@ -1629,8 +1574,7 @@ def get_namespace_and_libdoc_for_resource_import( ) -> Tuple["Namespace", LibraryDoc]: with self._logger.measure_time(lambda: f"getting namespace and libdoc for {name}", context_name="import"): with self._logger.measure_time(lambda: f"getting resource entry {name}", context_name="import"): - entry = self._get_entry_for_resource_import( - name, base_dir, sentinel, variables) + entry = self._get_entry_for_resource_import(name, base_dir, sentinel, variables) with self._logger.measure_time(lambda: f"getting namespace {name}", context_name="import"): namespace = entry.get_namespace() @@ -1646,8 +1590,7 @@ def get_namespace_for_resource_import( sentinel: Any = None, variables: Optional[Dict[str, Any]] = None, ) -> "Namespace": - entry = self._get_entry_for_resource_import( - name, base_dir, sentinel, variables) + entry = self._get_entry_for_resource_import(name, base_dir, sentinel, variables) return entry.get_namespace() @@ -1658,8 +1601,7 @@ def get_libdoc_for_resource_import( sentinel: Any = None, variables: Optional[Dict[str, Any]] = None, ) -> LibraryDoc: - entry = self._get_entry_for_resource_import( - name, base_dir, sentinel, variables) + entry = self._get_entry_for_resource_import(name, base_dir, sentinel, variables) return entry.get_libdoc()