|
23 | 23 | final,
|
24 | 24 | )
|
25 | 25 |
|
| 26 | +from ....utils.async_cache import AsyncSimpleCache |
26 | 27 | from ....utils.async_tools import Lock, async_tasking_event, create_sub_task
|
27 | 28 | from ....utils.logging import LoggingDescriptor
|
28 | 29 | from ....utils.path import path_is_relative_to
|
@@ -471,6 +472,10 @@ def __init__(self, parent_protocol: RobotLanguageServerProtocol, folder: Uri, co
|
471 | 472 | self._python_path: Optional[List[str]] = None
|
472 | 473 | self._environment: Optional[Mapping[str, str]] = None
|
473 | 474 |
|
| 475 | + self._library_files_cache = AsyncSimpleCache() |
| 476 | + self._resource_files_cache = AsyncSimpleCache() |
| 477 | + self._variables_files_cache = AsyncSimpleCache() |
| 478 | + |
474 | 479 | @property
|
475 | 480 | def environment(self) -> Mapping[str, str]:
|
476 | 481 | if self._environment is None:
|
@@ -691,8 +696,10 @@ async def remove(k: _VariablesEntryKey, e: _VariablesEntry) -> None:
|
691 | 696 | except RuntimeError:
|
692 | 697 | pass
|
693 | 698 |
|
694 |
| - @_logger.call |
695 | 699 | async def find_library(self, name: str, base_dir: str, variables: Optional[Dict[str, Any]] = None) -> str:
|
| 700 | + return await self._library_files_cache.get(self._find_library, name, base_dir, variables) |
| 701 | + |
| 702 | + async def _find_library(self, name: str, base_dir: str, variables: Optional[Dict[str, Any]] = None) -> str: |
696 | 703 | from robot.libraries import STDLIBS
|
697 | 704 | from robot.variables.search import contains_variable
|
698 | 705 |
|
@@ -722,8 +729,41 @@ async def find_library(self, name: str, base_dir: str, variables: Optional[Dict[
|
722 | 729 |
|
723 | 730 | return result
|
724 | 731 |
|
| 732 | + async def find_resource( |
| 733 | + self, name: str, base_dir: str, file_type: str = "Resource", variables: Optional[Dict[str, Any]] = None |
| 734 | + ) -> str: |
| 735 | + return await self._resource_files_cache.get(self.__find_resource, name, base_dir, file_type, variables) |
| 736 | + |
725 | 737 | @_logger.call
|
| 738 | + async def __find_resource( |
| 739 | + self, name: str, base_dir: str, file_type: str = "Resource", variables: Optional[Dict[str, Any]] = None |
| 740 | + ) -> str: |
| 741 | + from robot.variables.search import contains_variable |
| 742 | + |
| 743 | + if contains_variable(name, "$@&%"): |
| 744 | + return await asyncio.wait_for( |
| 745 | + asyncio.get_running_loop().run_in_executor( |
| 746 | + self.process_pool, |
| 747 | + find_file, |
| 748 | + name, |
| 749 | + str(self.folder.to_path()), |
| 750 | + base_dir, |
| 751 | + self.config.python_path if self.config is not None else None, |
| 752 | + self.config.env if self.config is not None else None, |
| 753 | + self.config.variables if self.config is not None else None, |
| 754 | + variables, |
| 755 | + file_type, |
| 756 | + ), |
| 757 | + FIND_FILE_TIME_OUT, |
| 758 | + ) |
| 759 | + |
| 760 | + return str(find_file_ex(name, base_dir, self.python_path, file_type)) |
| 761 | + |
726 | 762 | async def find_variables(self, name: str, base_dir: str, variables: Optional[Dict[str, Any]] = None) -> str:
|
| 763 | + return await self._variables_files_cache.get(self._find_variables, name, base_dir, variables) |
| 764 | + |
| 765 | + @_logger.call |
| 766 | + async def _find_variables(self, name: str, base_dir: str, variables: Optional[Dict[str, Any]] = None) -> str: |
727 | 767 | from robot.variables.search import contains_variable
|
728 | 768 |
|
729 | 769 | if contains_variable(name, "$@&%"):
|
@@ -970,34 +1010,6 @@ async def _get_libdoc() -> VariablesDoc:
|
970 | 1010 |
|
971 | 1011 | return await entry.get_libdoc()
|
972 | 1012 |
|
973 |
| - @_logger.call |
974 |
| - async def find_resource( |
975 |
| - self, name: str, base_dir: str, file_type: str = "Resource", variables: Optional[Dict[str, Any]] = None |
976 |
| - ) -> str: |
977 |
| - from robot.variables.search import contains_variable |
978 |
| - |
979 |
| - # if contains_variable(name, "$@&%"): |
980 |
| - # name = name.replace("%{CI_PROJECT_DIR}", self.environment["CI_PROJECT_DIR"]) |
981 |
| - |
982 |
| - if contains_variable(name, "$@&%"): |
983 |
| - return await asyncio.wait_for( |
984 |
| - asyncio.get_running_loop().run_in_executor( |
985 |
| - self.process_pool, |
986 |
| - find_file, |
987 |
| - name, |
988 |
| - str(self.folder.to_path()), |
989 |
| - base_dir, |
990 |
| - self.config.python_path if self.config is not None else None, |
991 |
| - self.config.env if self.config is not None else None, |
992 |
| - self.config.variables if self.config is not None else None, |
993 |
| - variables, |
994 |
| - file_type, |
995 |
| - ), |
996 |
| - FIND_FILE_TIME_OUT, |
997 |
| - ) |
998 |
| - |
999 |
| - return str(find_file_ex(name, base_dir, self.python_path, file_type)) |
1000 |
| - |
1001 | 1013 | @_logger.call
|
1002 | 1014 | async def _get_entry_for_resource_import(
|
1003 | 1015 | self, name: str, base_dir: str, sentinel: Any = None, variables: Optional[Dict[str, Any]] = None
|
|
0 commit comments