Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion extensions/fine_python_ast/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ version = "0.2.0"
description = ""
authors = [{ name = "Vladyslav Hnatiuk", email = "aders1234@gmail.com" }]
readme = "README.md"
requires-python = ">=3.11, < 3.14"
requires-python = ">=3.11, <= 3.14"
dependencies = ["finecode_extension_api==0.3.*"]

[dependency-groups]
Expand Down
4 changes: 3 additions & 1 deletion extensions/fine_python_black/fine_python_black/action.py
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,9 @@ def format_one(file_content: str, black_mode: Mode) -> tuple[str, bool]:
# `fast` whether to validate code after formatting
# `lines` is range to format
new_file_content = black.format_file_contents(
file_content, fast=False, mode=black_mode # , lines=lines
file_content,
fast=False,
mode=black_mode, # , lines=lines
)
file_changed = True
except black.NothingChanged:
Expand Down
2 changes: 1 addition & 1 deletion extensions/fine_python_black/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ version = "0.2.0"
description = ""
authors = [{ name = "Vladyslav Hnatiuk", email = "aders1234@gmail.com" }]
readme = "README.md"
requires-python = ">=3.11, < 3.14"
requires-python = ">=3.11, <= 3.14"
dependencies = ["finecode_extension_api==0.3.*", "black (>=25.1.0,<26.0.0)"]

[dependency-groups]
Expand Down
2 changes: 1 addition & 1 deletion extensions/fine_python_flake8/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ version = "0.2.1"
description = ""
authors = [{ name = "Vladyslav Hnatiuk", email = "aders1234@gmail.com" }]
readme = "README.md"
requires-python = ">=3.11, < 3.14"
requires-python = ">=3.11, <= 3.14"
dependencies = [
"finecode_extension_api==0.3.*",
"fine_python_ast==0.2.*",
Expand Down
2 changes: 1 addition & 1 deletion extensions/fine_python_import_linter/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ version = "0.1.0"
description = ""
authors = [{ name = "Vladyslav Hnatiuk", email = "aders1234@gmail.com" }]
readme = "README.md"
requires-python = ">= 3.11, < 3.14"
requires-python = ">= 3.11, <= 3.14"
dependencies = ["finecode_extension_api == 0.3.*", "import-linter (>=2.1,<3.0)"]


Expand Down
2 changes: 1 addition & 1 deletion extensions/fine_python_isort/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ version = "0.2.0"
description = ""
authors = [{ name = "Vladyslav Hnatiuk", email = "aders1234@gmail.com" }]
readme = "README.md"
requires-python = ">= 3.11, < 3.14"
requires-python = ">= 3.11, <= 3.14"
dependencies = ["finecode_extension_api==0.3.*", "isort (>=5.13, <6)"]

[dependency-groups]
Expand Down
2 changes: 1 addition & 1 deletion extensions/fine_python_module_exports/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ version = "0.2.0"
description = ""
authors = [{ name = "Vladyslav Hnatiuk", email = "aders1234@gmail.com" }]
readme = "README.md"
requires-python = ">= 3.11, < 3.14"
requires-python = ">= 3.11, <= 3.14"
dependencies = ["finecode_extension_api==0.3.*", "fine_python_ast==0.2.*"]

[dependency-groups]
Expand Down
2 changes: 1 addition & 1 deletion extensions/fine_python_mypy/fine_python_mypy/action.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
ifilemanager,
ilogger,
iextensionrunnerinfoprovider,
iprojectinfoprovider
iprojectinfoprovider,
)


Expand Down
2 changes: 1 addition & 1 deletion extensions/fine_python_mypy/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ version = "0.2.0"
description = ""
authors = [{ name = "Vladyslav Hnatiuk", email = "aders1234@gmail.com" }]
readme = "README.md"
requires-python = ">=3.11, < 3.14"
requires-python = ">=3.11, <= 3.14"
dependencies = ["finecode_extension_api==0.3.*", "mypy (>=1.15, <2.0)"]

[dependency-groups]
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,4 @@
from .list_project_files_by_lang_python import ListProjectFilesByLangPythonHandler
from .py_package_layout_info_provider import PyPackageLayoutInfoProvider

__all__ = [
"ListProjectFilesByLangPythonHandler",
"PyPackageLayoutInfoProvider"
]
__all__ = ["ListProjectFilesByLangPythonHandler", "PyPackageLayoutInfoProvider"]
Original file line number Diff line number Diff line change
@@ -1,9 +1,15 @@
from finecode_extension_api.interfaces import iprojectinfoprovider, ipypackagelayoutinfoprovider, ilogger
from finecode_extension_api.interfaces import (
iprojectinfoprovider,
ipypackagelayoutinfoprovider,
ilogger,
)
import dataclasses
import pathlib

from finecode_extension_api import code_action
from finecode_extension_api.actions import list_project_files_by_lang as list_project_files_by_lang_action
from finecode_extension_api.actions import (
list_project_files_by_lang as list_project_files_by_lang_action,
)


@dataclasses.dataclass
Expand All @@ -15,52 +21,61 @@ class ListProjectFilesByLangPythonHandlerConfig(code_action.ActionHandlerConfig)

class ListProjectFilesByLangPythonHandler(
code_action.ActionHandler[
list_project_files_by_lang_action.ListProjectFilesByLangAction, ListProjectFilesByLangPythonHandlerConfig
list_project_files_by_lang_action.ListProjectFilesByLangAction,
ListProjectFilesByLangPythonHandlerConfig,
]
):
def __init__(
self,
config: ListProjectFilesByLangPythonHandlerConfig,
project_info_provider: iprojectinfoprovider.IProjectInfoProvider,
py_package_layout_info_provider: ipypackagelayoutinfoprovider.IPyPackageLayoutInfoProvider,
logger: ilogger.ILogger
logger: ilogger.ILogger,
) -> None:
self.config = config
self.project_info_provider = project_info_provider
self.py_package_layout_info_provider = py_package_layout_info_provider
self.logger = logger

self.current_project_dir_path = self.project_info_provider.get_current_project_dir_path()
self.tests_dir_path = self.current_project_dir_path / 'tests'
self.scripts_dir_path = self.current_project_dir_path / 'scripts'
self.setup_py_path = self.current_project_dir_path / 'setup.py'
self.current_project_dir_path = (
self.project_info_provider.get_current_project_dir_path()
)
self.tests_dir_path = self.current_project_dir_path / "tests"
self.scripts_dir_path = self.current_project_dir_path / "scripts"
self.setup_py_path = self.current_project_dir_path / "setup.py"

async def run(
self,
payload: list_project_files_by_lang_action.ListProjectFilesByLangRunPayload,
run_context: list_project_files_by_lang_action.ListProjectFilesByLangRunContext,
) -> list_project_files_by_lang_action.ListProjectFilesByLangRunResult:
py_files: list[pathlib.Path] = []
project_package_src_root_dir_path = await self.py_package_layout_info_provider.get_package_src_root_dir_path(package_dir_path=self.current_project_dir_path)
py_files += list(project_package_src_root_dir_path.rglob('*.py'))
project_package_src_root_dir_path = (
await self.py_package_layout_info_provider.get_package_src_root_dir_path(
package_dir_path=self.current_project_dir_path
)
)
py_files += list(project_package_src_root_dir_path.rglob("*.py"))

if self.scripts_dir_path.exists():
py_files += list(self.scripts_dir_path.rglob('*.py'))
py_files += list(self.scripts_dir_path.rglob("*.py"))

if self.tests_dir_path.exists():
py_files += list(self.tests_dir_path.rglob('*.py'))
py_files += list(self.tests_dir_path.rglob("*.py"))

if self.setup_py_path.exists():
py_files.append(self.setup_py_path)

if self.config.additional_dirs is not None:
for dir_path in self.config.additional_dirs:
dir_absolute_path = self.current_project_dir_path / dir_path
if not dir_absolute_path.exists():
self.logger.warning(f"Skip {dir_path} because {dir_absolute_path} doesn't exist")
self.logger.warning(
f"Skip {dir_path} because {dir_absolute_path} doesn't exist"
)
continue

py_files += list(dir_absolute_path.rglob('*.py'))
py_files += list(dir_absolute_path.rglob("*.py"))

return list_project_files_by_lang_action.ListProjectFilesByLangRunResult(
files_by_lang={"python": py_files}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,11 @@
import tomlkit
import tomlkit.exceptions

from finecode_extension_api.interfaces import ifilemanager, ipypackagelayoutinfoprovider, icache
from finecode_extension_api.interfaces import (
ifilemanager,
ipypackagelayoutinfoprovider,
icache,
)
from finecode_extension_api import service


Expand All @@ -12,68 +16,105 @@ def __init__(self, message: str) -> None:
self.message = message


class PyPackageLayoutInfoProvider(ipypackagelayoutinfoprovider.IPyPackageLayoutInfoProvider, service.Service):
PACKAGE_NAME_CACHE_KEY = 'PyPackageLayoutInfoProviderPackageName'
class PyPackageLayoutInfoProvider(
ipypackagelayoutinfoprovider.IPyPackageLayoutInfoProvider, service.Service
):
PACKAGE_NAME_CACHE_KEY = "PyPackageLayoutInfoProviderPackageName"

def __init__(self, file_manager: ifilemanager.IFileManager, cache: icache.ICache) -> None:
def __init__(
self, file_manager: ifilemanager.IFileManager, cache: icache.ICache
) -> None:
self.file_manager = file_manager
self.cache = cache

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

try:
cached_package_name = await self.cache.get_file_cache(file_path=package_def_file, key=self.PACKAGE_NAME_CACHE_KEY)
cached_package_name = await self.cache.get_file_cache(
file_path=package_def_file, key=self.PACKAGE_NAME_CACHE_KEY
)
return cached_package_name
except icache.CacheMissException:
...

package_def_file_content = await self.file_manager.get_content(file_path=package_def_file)
package_def_file_version = await self.file_manager.get_file_version(file_path=package_def_file)
package_def_file_content = await self.file_manager.get_content(
file_path=package_def_file
)
package_def_file_version = await self.file_manager.get_file_version(
file_path=package_def_file
)
try:
package_def_dict = tomlkit.loads(package_def_file_content)
except tomlkit.exceptions.ParseError as exception:
raise ConfigParseError(f"Failed to parse package config {package_def_file}: toml parsing failed at {exception.line}:{exception.col}") from exception
raise ConfigParseError(
f"Failed to parse package config {package_def_file}: toml parsing failed at {exception.line}:{exception.col}"
) from exception

package_raw_name = package_def_dict.get('project', {}).get('name', None)
package_raw_name = package_def_dict.get("project", {}).get("name", None)
if package_raw_name is None:
raise ValueError(f"package.name not found in {package_def_file}")

package_name = package_raw_name.replace('-', '_')
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)
package_name = package_raw_name.replace("-", "_")
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,
)
return package_name

async def get_package_layout(self, package_dir_path: pathlib.Path) -> ipypackagelayoutinfoprovider.PyPackageLayout:
if (package_dir_path / 'src').exists():
async def get_package_layout(
self, package_dir_path: pathlib.Path
) -> ipypackagelayoutinfoprovider.PyPackageLayout:
if (package_dir_path / "src").exists():
return ipypackagelayoutinfoprovider.PyPackageLayout.SRC
else:
try:
package_name = await self._get_package_name(package_dir_path=package_dir_path)
package_name = await self._get_package_name(
package_dir_path=package_dir_path
)
except ConfigParseError as exception:
raise ipypackagelayoutinfoprovider.FailedToGetPackageLayout(exception.message)

raise ipypackagelayoutinfoprovider.FailedToGetPackageLayout(
exception.message
)

if (package_dir_path / package_name).exists():
return ipypackagelayoutinfoprovider.PyPackageLayout.FLAT
else:
return ipypackagelayoutinfoprovider.PyPackageLayout.CUSTOM

async def get_package_src_root_dir_path(self, package_dir_path: str) -> pathlib.Path:
async def get_package_src_root_dir_path(
self, package_dir_path: str
) -> pathlib.Path:
try:
package_layout = await self.get_package_layout(package_dir_path=package_dir_path)
package_layout = await self.get_package_layout(
package_dir_path=package_dir_path
)
except ipypackagelayoutinfoprovider.FailedToGetPackageLayout as exception:
raise ipypackagelayoutinfoprovider.FailedToGetPackageSrcRootDirPath(exception.message)
raise ipypackagelayoutinfoprovider.FailedToGetPackageSrcRootDirPath(
exception.message
)

try:
package_name = await self._get_package_name(package_dir_path=package_dir_path)
package_name = await self._get_package_name(
package_dir_path=package_dir_path
)
except ConfigParseError as exception:
raise ipypackagelayoutinfoprovider.FailedToGetPackageSrcRootDirPath(exception.message)
raise ipypackagelayoutinfoprovider.FailedToGetPackageSrcRootDirPath(
exception.message
)

if package_layout == ipypackagelayoutinfoprovider.PyPackageLayout.SRC:
return package_dir_path / 'src' / package_name
return package_dir_path / "src" / package_name
elif package_layout == ipypackagelayoutinfoprovider.PyPackageLayout.FLAT:
return package_dir_path / package_name
else:
raise NotImplementedError(f"Custom python package layout in {package_dir_path} is not supported")
raise NotImplementedError(
f"Custom python package layout in {package_dir_path} is not supported"
)
2 changes: 1 addition & 1 deletion extensions/fine_python_package_info/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ version = "0.1.0"
description = ""
authors = [{ name = "Vladyslav Hnatiuk", email = "aders1234@gmail.com" }]
readme = "README.md"
requires-python = ">=3.11, < 3.14"
requires-python = ">=3.11, <= 3.14"
dependencies = ["finecode_extension_api==0.3.*", "tomlkit==0.11.*"]

[dependency-groups]
Expand Down
2 changes: 1 addition & 1 deletion extensions/fine_python_package_info/setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -64,4 +64,4 @@ def initialize_options(self):
"build_ext": CustomBuildExt,
"egg_info": CustomEggInfo,
},
)
)
2 changes: 1 addition & 1 deletion extensions/fine_python_package_info/tests/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
# Tests for fine_python_package_info extension
# Tests for fine_python_package_info extension
2 changes: 1 addition & 1 deletion extensions/fine_python_pip/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ version = "0.1.1"
description = ""
authors = [{ name = "Vladyslav Hnatiuk", email = "aders1234@gmail.com" }]
readme = "README.md"
requires-python = ">=3.11, < 3.14"
requires-python = ">=3.11, <= 3.14"
dependencies = ["finecode_extension_api==0.3.*"]

[dependency-groups]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,9 @@ def _construct_pip_install_cmd(
install_params += f'--find-links="{link}" '

if self.config.editable_mode is not None:
install_params += f"--config-settings editable_mode='{self.config.editable_mode}' "
install_params += (
f"--config-settings editable_mode='{self.config.editable_mode}' "
)

for dependency in dependencies:
if dependency.editable:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,4 @@
__all__ = [
"PyreflyLintHandler",
"PyreflyLintHandlerConfig",
]
]
Loading
Loading