Skip to content

Commit 906f4cc

Browse files
committed
Add error handling in ipypackagelayoutinfoprovider and its implementation, cache package names
1 parent 120f411 commit 906f4cc

File tree

4 files changed

+53
-11
lines changed

4 files changed

+53
-11
lines changed

extensions/fine_python_package_info/fine_python_package_info/py_package_layout_info_provider.py

Lines changed: 41 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,42 +3,74 @@
33

44
import tomlkit
55

6-
from finecode_extension_api.interfaces import ifilemanager, ipypackagelayoutinfoprovider
6+
from finecode_extension_api.interfaces import ifilemanager, ipypackagelayoutinfoprovider, icache
77
from finecode_extension_api import service
88

99

10+
class ConfigParseError(Exception):
11+
def __init__(self, message: str) -> None:
12+
self.message = message
13+
14+
1015
class PyPackageLayoutInfoProvider(ipypackagelayoutinfoprovider.IPyPackageLayoutInfoProvider, service.Service):
11-
def __init__(self, file_manager: ifilemanager.IFileManager) -> None:
16+
PACKAGE_NAME_CACHE_KEY = 'PyPackageLayoutInfoProviderPackageName'
17+
18+
def __init__(self, file_manager: ifilemanager.IFileManager, cache: icache.ICache) -> None:
1219
self.file_manager = file_manager
13-
# TODO: cache package name by file version?
20+
self.cache = cache
1421

1522
async def _get_package_name(self, package_dir_path: pathlib.Path) -> str:
23+
# raises ConfigParseError
1624
package_def_file = package_dir_path / 'pyproject.toml'
1725
if not package_def_file.exists():
1826
raise NotImplementedError("Only python packages with pyproject.toml config file are supported")
1927

28+
try:
29+
cached_package_name = await self.cache.get_file_cache(file_path=package_def_file, key=self.PACKAGE_NAME_CACHE_KEY)
30+
return cached_package_name
31+
except icache.CacheMissException:
32+
...
33+
2034
package_def_file_content = await self.file_manager.get_content(file_path=package_def_file)
21-
# TODO: handle errors
22-
package_def_dict = tomlkit.loads(package_def_file_content)
35+
package_def_file_version = await self.file_manager.get_file_version(file_path=package_def_file)
36+
try:
37+
package_def_dict = tomlkit.loads(package_def_file_content)
38+
except tomlkit.exceptions.ParseError as exception:
39+
raise ConfigParseError(f"Failed to parse package config {package_def_file}: {exception.message} at {exception.line}:{exception.col}")
40+
2341
package_raw_name = package_def_dict.get('project', {}).get('name', None)
2442
if package_raw_name is None:
2543
raise ValueError(f"package.name not found in {package_def_file}")
2644

27-
return package_raw_name.replace('-', '_')
45+
package_name = package_raw_name.replace('-', '_')
46+
await self.cache.save_file_cache(file_path=package_def_file, file_version=package_def_file_version, key=self.PACKAGE_NAME_CACHE_KEY, value=package_name)
47+
return package_name
2848

2949
async def get_package_layout(self, package_dir_path: pathlib.Path) -> ipypackagelayoutinfoprovider.PyPackageLayout:
3050
if (package_dir_path / 'src').exists():
3151
return ipypackagelayoutinfoprovider.PyPackageLayout.SRC
3252
else:
33-
package_name = await self._get_package_name(package_dir_path=package_dir_path)
53+
try:
54+
package_name = await self._get_package_name(package_dir_path=package_dir_path)
55+
except ConfigParseError as exception:
56+
raise ipypackagelayoutinfoprovider.FailedToGetPackageLayout(exception.message)
57+
3458
if (package_dir_path / package_name).exists():
3559
return ipypackagelayoutinfoprovider.PyPackageLayout.FLAT
3660
else:
3761
return ipypackagelayoutinfoprovider.PyPackageLayout.CUSTOM
3862

3963
async def get_package_src_root_dir_path(self, package_dir_path: str) -> pathlib.Path:
40-
package_layout = await self.get_package_layout(package_dir_path=package_dir_path)
41-
package_name = await self._get_package_name(package_dir_path=package_dir_path)
64+
try:
65+
package_layout = await self.get_package_layout(package_dir_path=package_dir_path)
66+
except ipypackagelayoutinfoprovider.FailedToGetPackageLayout as exception:
67+
raise ipypackagelayoutinfoprovider.FailedToGetPackageSrcRootDirPath(exception.message)
68+
69+
try:
70+
package_name = await self._get_package_name(package_dir_path=package_dir_path)
71+
except ConfigParseError as exception:
72+
raise ipypackagelayoutinfoprovider.FailedToGetPackageSrcRootDirPath(exception.message)
73+
4274
if package_layout == ipypackagelayoutinfoprovider.PyPackageLayout.SRC:
4375
return package_dir_path / 'src' / package_name
4476
elif package_layout == ipypackagelayoutinfoprovider.PyPackageLayout.FLAT:

finecode_extension_api/src/finecode_extension_api/actions/list_project_files_by_lang.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import dataclasses
22
import pathlib
33
import sys
4-
import typing
54

65
if sys.version_info >= (3, 12):
76
from typing import override

finecode_extension_api/src/finecode_extension_api/interfaces/ipypackagelayoutinfoprovider.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,13 @@ async def get_package_src_root_dir_path(
2121
# if you need path to directory which is added to sys.path during execution, take
2222
# parent of this directory.
2323
...
24+
25+
26+
class FailedToGetPackageLayout(Exception):
27+
def __init__(self, message: str) -> None:
28+
self.message = message
29+
30+
31+
class FailedToGetPackageSrcRootDirPath(Exception):
32+
def __init__(self, message: str) -> None:
33+
self.message = message

finecode_extension_runner/src/finecode_extension_runner/di/bootstrap.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,7 @@ async def project_file_classifier_factory(
170170

171171
async def py_package_layout_info_provider_factory(container):
172172
file_manager = await resolver.get_service_instance(ifilemanager.IFileManager)
173+
cache = await resolver.get_service_instance(icache.ICache)
173174
return fine_python_package_info.PyPackageLayoutInfoProvider(
174-
file_manager=file_manager,
175+
file_manager=file_manager, cache=cache
175176
)

0 commit comments

Comments
 (0)