diff --git a/extensions/fine_python_flake8/fine_python_flake8/action.py b/extensions/fine_python_flake8/fine_python_flake8/action.py index 9d9f9d3..f55f8e6 100644 --- a/extensions/fine_python_flake8/fine_python_flake8/action.py +++ b/extensions/fine_python_flake8/fine_python_flake8/action.py @@ -182,6 +182,10 @@ async def run( payload: lint_action.LintRunPayload, run_context: code_action.RunActionWithPartialResultsContext, ) -> None: + if self.config.select is not None and len(self.config.select) == 0: + # empty set of rules is selected, no need to run flake8 + return None + file_paths = [file_path async for file_path in payload] for file_path in file_paths: diff --git a/extensions/fine_python_pip/src/fine_python_pip/install_deps_in_env_handler.py b/extensions/fine_python_pip/src/fine_python_pip/install_deps_in_env_handler.py index e1800d8..45deff3 100644 --- a/extensions/fine_python_pip/src/fine_python_pip/install_deps_in_env_handler.py +++ b/extensions/fine_python_pip/src/fine_python_pip/install_deps_in_env_handler.py @@ -1,4 +1,3 @@ -import asyncio import dataclasses import pathlib diff --git a/extensions/fine_python_virtualenv/src/fine_python_virtualenv/prepare_envs_handler.py b/extensions/fine_python_virtualenv/src/fine_python_virtualenv/prepare_envs_handler.py index a732bec..e0a62b5 100644 --- a/extensions/fine_python_virtualenv/src/fine_python_virtualenv/prepare_envs_handler.py +++ b/extensions/fine_python_virtualenv/src/fine_python_virtualenv/prepare_envs_handler.py @@ -37,7 +37,7 @@ async def run( for env_info in payload.envs: if payload.recreate and env_info.venv_dir_path.exists(): self.logger.debug(f"Remove virtualenv dir {env_info.venv_dir_path}") - self.file_manager.remove_dir(env_info.venv_dir_path) + await self.file_manager.remove_dir(env_info.venv_dir_path) self.logger.info(f"Creating virtualenv {env_info.venv_dir_path}") if not env_info.venv_dir_path.exists(): diff --git a/finecode_builtin_handlers/README.md b/finecode_builtin_handlers/README.md new file mode 100644 index 0000000..e69de29 diff --git a/finecode_builtin_handlers/pyproject.toml b/finecode_builtin_handlers/pyproject.toml new file mode 100644 index 0000000..3453288 --- /dev/null +++ b/finecode_builtin_handlers/pyproject.toml @@ -0,0 +1,19 @@ +[project] +name = "finecode_builtin_handlers" +version = "0.1.0" +description = "FineCode built-in handlers" +authors = [{ name = "Vladyslav Hnatiuk", email = "aders1234@gmail.com" }] +readme = "README.md" +requires-python = ">=3.11, < 3.14" +dependencies = ["finecode_extension_api==0.3.*", "tomlkit==0.11.*"] + +[dependency-groups] +dev_workspace = ["finecode==0.3.*", "finecode_dev_common_preset==0.2.*"] + +[tool.finecode.env.dev_workspace.dependencies] +finecode_dev_common_preset = { path = "../finecode_dev_common_preset", editable = true } +finecode = { path = "../", editable = true } +finecode_extension_runner = { path = "../finecode_extension_runner", editable = true } + +[tool.finecode] +presets = [{ source = "finecode_dev_common_preset" }] diff --git a/finecode_builtin_handlers/setup.py b/finecode_builtin_handlers/setup.py new file mode 100644 index 0000000..7f6fc6f --- /dev/null +++ b/finecode_builtin_handlers/setup.py @@ -0,0 +1,67 @@ +import atexit +import shutil +import sys +import tempfile + +from setuptools import setup +from setuptools.command.build import build +from setuptools.command.build_ext import build_ext +from setuptools.command.build_py import build_py +from setuptools.command.egg_info import egg_info + +# Create a single temp directory for all build operations +_TEMP_BUILD_DIR = None + + +def get_temp_build_dir(pkg_name): + global _TEMP_BUILD_DIR + if _TEMP_BUILD_DIR is None: + _TEMP_BUILD_DIR = tempfile.mkdtemp(prefix=f"{pkg_name}_build_") + atexit.register(lambda: shutil.rmtree(_TEMP_BUILD_DIR, ignore_errors=True)) + return _TEMP_BUILD_DIR + + +class TempDirBuildMixin: + def initialize_options(self): + super().initialize_options() + temp_dir = get_temp_build_dir(self.distribution.get_name()) + self.build_base = temp_dir + + +class TempDirEggInfoMixin: + def initialize_options(self): + super().initialize_options() + temp_dir = get_temp_build_dir(self.distribution.get_name()) + self.egg_base = temp_dir + + +class CustomBuild(TempDirBuildMixin, build): + pass + + +class CustomBuildPy(TempDirBuildMixin, build_py): + pass + + +class CustomBuildExt(TempDirBuildMixin, build_ext): + pass + + +class CustomEggInfo(TempDirEggInfoMixin, egg_info): + def initialize_options(self): + # Don't use temp dir for editable installs + if "--editable" in sys.argv or "-e" in sys.argv: + egg_info.initialize_options(self) + else: + super().initialize_options() + + +setup( + name="finecode_builtin_handlers", + cmdclass={ + "build": CustomBuild, + "build_py": CustomBuildPy, + "build_ext": CustomBuildExt, + "egg_info": CustomEggInfo, + }, +) diff --git a/finecode_extension_runner/src/finecode_extension_runner/action_handlers/__init__.py b/finecode_builtin_handlers/src/finecode_builtin_handlers/__init__.py similarity index 94% rename from finecode_extension_runner/src/finecode_extension_runner/action_handlers/__init__.py rename to finecode_builtin_handlers/src/finecode_builtin_handlers/__init__.py index 7f3bdaf..32bd0b4 100644 --- a/finecode_extension_runner/src/finecode_extension_runner/action_handlers/__init__.py +++ b/finecode_builtin_handlers/src/finecode_builtin_handlers/__init__.py @@ -1,3 +1,5 @@ +"""FineCode Built-in handlers.""" + from .dump_config import DumpConfigHandler from .dump_config_save import DumpConfigSaveHandler from .prepare_envs_install_deps import PrepareEnvsInstallDepsHandler @@ -14,4 +16,4 @@ "PrepareRunnersInstallRunnerAndPresetsHandler", "PrepareRunnersReadConfigsHandler", "DumpConfigSaveHandler", -] +] \ No newline at end of file diff --git a/finecode_extension_runner/src/finecode_extension_runner/action_handlers/dependency_config_utils.py b/finecode_builtin_handlers/src/finecode_builtin_handlers/dependency_config_utils.py similarity index 100% rename from finecode_extension_runner/src/finecode_extension_runner/action_handlers/dependency_config_utils.py rename to finecode_builtin_handlers/src/finecode_builtin_handlers/dependency_config_utils.py diff --git a/finecode_extension_runner/src/finecode_extension_runner/action_handlers/dump_config.py b/finecode_builtin_handlers/src/finecode_builtin_handlers/dump_config.py similarity index 93% rename from finecode_extension_runner/src/finecode_extension_runner/action_handlers/dump_config.py rename to finecode_builtin_handlers/src/finecode_builtin_handlers/dump_config.py index 263ee38..a8b611c 100644 --- a/finecode_extension_runner/src/finecode_extension_runner/action_handlers/dump_config.py +++ b/finecode_builtin_handlers/src/finecode_builtin_handlers/dump_config.py @@ -1,9 +1,7 @@ import dataclasses -import pathlib from finecode_extension_api import code_action from finecode_extension_api.actions import dump_config as dump_config_action -from finecode_extension_api.interfaces import ifilemanager @dataclasses.dataclass diff --git a/finecode_extension_runner/src/finecode_extension_runner/action_handlers/dump_config_save.py b/finecode_builtin_handlers/src/finecode_builtin_handlers/dump_config_save.py similarity index 100% rename from finecode_extension_runner/src/finecode_extension_runner/action_handlers/dump_config_save.py rename to finecode_builtin_handlers/src/finecode_builtin_handlers/dump_config_save.py diff --git a/finecode_extension_runner/src/finecode_extension_runner/action_handlers/prepare_envs_install_deps.py b/finecode_builtin_handlers/src/finecode_builtin_handlers/prepare_envs_install_deps.py similarity index 98% rename from finecode_extension_runner/src/finecode_extension_runner/action_handlers/prepare_envs_install_deps.py rename to finecode_builtin_handlers/src/finecode_builtin_handlers/prepare_envs_install_deps.py index 8f87893..b8c4c95 100644 --- a/finecode_extension_runner/src/finecode_extension_runner/action_handlers/prepare_envs_install_deps.py +++ b/finecode_builtin_handlers/src/finecode_builtin_handlers/prepare_envs_install_deps.py @@ -10,7 +10,7 @@ ilogger, iprojectinfoprovider, ) -from finecode_extension_runner.action_handlers import dependency_config_utils +from finecode_builtin_handlers import dependency_config_utils @dataclasses.dataclass diff --git a/finecode_extension_runner/src/finecode_extension_runner/action_handlers/prepare_envs_read_configs.py b/finecode_builtin_handlers/src/finecode_builtin_handlers/prepare_envs_read_configs.py similarity index 96% rename from finecode_extension_runner/src/finecode_extension_runner/action_handlers/prepare_envs_read_configs.py rename to finecode_builtin_handlers/src/finecode_builtin_handlers/prepare_envs_read_configs.py index 49c4cbf..9eed259 100644 --- a/finecode_extension_runner/src/finecode_extension_runner/action_handlers/prepare_envs_read_configs.py +++ b/finecode_builtin_handlers/src/finecode_builtin_handlers/prepare_envs_read_configs.py @@ -1,7 +1,6 @@ import asyncio import dataclasses import pathlib -import shutil import typing from finecode_extension_api import code_action @@ -11,7 +10,7 @@ ilogger, iprojectinfoprovider, ) -from finecode_extension_runner.action_handlers import dependency_config_utils +from finecode_builtin_handlers import dependency_config_utils @dataclasses.dataclass diff --git a/finecode_extension_runner/src/finecode_extension_runner/action_handlers/prepare_runners_install_runner_and_presets.py b/finecode_builtin_handlers/src/finecode_builtin_handlers/prepare_runners_install_runner_and_presets.py similarity index 98% rename from finecode_extension_runner/src/finecode_extension_runner/action_handlers/prepare_runners_install_runner_and_presets.py rename to finecode_builtin_handlers/src/finecode_builtin_handlers/prepare_runners_install_runner_and_presets.py index 89330a5..c7493ff 100644 --- a/finecode_extension_runner/src/finecode_extension_runner/action_handlers/prepare_runners_install_runner_and_presets.py +++ b/finecode_builtin_handlers/src/finecode_builtin_handlers/prepare_runners_install_runner_and_presets.py @@ -11,7 +11,7 @@ ilogger, iprojectinfoprovider, ) -from finecode_extension_runner.action_handlers import dependency_config_utils +from finecode_builtin_handlers import dependency_config_utils @dataclasses.dataclass diff --git a/finecode_extension_runner/src/finecode_extension_runner/action_handlers/prepare_runners_read_configs.py b/finecode_builtin_handlers/src/finecode_builtin_handlers/prepare_runners_read_configs.py similarity index 97% rename from finecode_extension_runner/src/finecode_extension_runner/action_handlers/prepare_runners_read_configs.py rename to finecode_builtin_handlers/src/finecode_builtin_handlers/prepare_runners_read_configs.py index e9408b0..915ecc2 100644 --- a/finecode_extension_runner/src/finecode_extension_runner/action_handlers/prepare_runners_read_configs.py +++ b/finecode_builtin_handlers/src/finecode_builtin_handlers/prepare_runners_read_configs.py @@ -11,7 +11,7 @@ ilogger, iprojectinfoprovider, ) -from finecode_extension_runner.action_handlers import dependency_config_utils +from finecode_builtin_handlers import dependency_config_utils @dataclasses.dataclass diff --git a/finecode_extension_api/src/finecode_extension_api/interfaces/iactionrunner.py b/finecode_extension_api/src/finecode_extension_api/interfaces/iactionrunner.py index aa78d09..8ae5e10 100644 --- a/finecode_extension_api/src/finecode_extension_api/interfaces/iactionrunner.py +++ b/finecode_extension_api/src/finecode_extension_api/interfaces/iactionrunner.py @@ -1,4 +1,3 @@ -from pathlib import Path from typing import Any, Protocol diff --git a/finecode_extension_runner/pyproject.toml b/finecode_extension_runner/pyproject.toml index 0c1073d..fce3a02 100644 --- a/finecode_extension_runner/pyproject.toml +++ b/finecode_extension_runner/pyproject.toml @@ -7,7 +7,6 @@ readme = "README.md" requires-python = ">=3.11, < 3.14" dependencies = [ "loguru==0.7.*", - "tomlkit==0.11.*", "click==8.1.*", "pydantic==2.11.*", "pygls==2.0.0-a6", diff --git a/finecode_extension_runner/src/finecode_extension_runner/di/bootstrap.py b/finecode_extension_runner/src/finecode_extension_runner/di/bootstrap.py index 45d2cfd..6299bb6 100644 --- a/finecode_extension_runner/src/finecode_extension_runner/di/bootstrap.py +++ b/finecode_extension_runner/src/finecode_extension_runner/di/bootstrap.py @@ -1,6 +1,6 @@ import functools import pathlib -from typing import Any, Awaitable, Callable, Type, TypeVar +from typing import Any, Awaitable, Callable try: import fine_python_ast @@ -12,7 +12,6 @@ except ImportError: fine_python_mypy = None -from finecode_extension_api import code_action from finecode_extension_api.interfaces import ( iactionrunner, icache, diff --git a/finecode_extension_runner/src/finecode_extension_runner/impls/action_runner.py b/finecode_extension_runner/src/finecode_extension_runner/impls/action_runner.py index 1b39c80..98bf5d8 100644 --- a/finecode_extension_runner/src/finecode_extension_runner/impls/action_runner.py +++ b/finecode_extension_runner/src/finecode_extension_runner/impls/action_runner.py @@ -1,5 +1,4 @@ -from pathlib import Path -from typing import Any, TypeAlias +from typing import Any from finecode_extension_api.interfaces import iactionrunner diff --git a/finecode_extension_runner/src/finecode_extension_runner/impls/command_runner.py b/finecode_extension_runner/src/finecode_extension_runner/impls/command_runner.py index bbf4343..464c348 100644 --- a/finecode_extension_runner/src/finecode_extension_runner/impls/command_runner.py +++ b/finecode_extension_runner/src/finecode_extension_runner/impls/command_runner.py @@ -100,7 +100,10 @@ def __init__(self, logger: ilogger.ILogger): async def run( self, cmd: str, cwd: Path | None = None, env: dict[str, str] | None = None ) -> icommandrunner.IAsyncProcess: - self.logger.debug(f"Async subprocess run: {cmd} in {cwd}") + log_msg = f"Async subprocess run: {cmd}" + if cwd is not None: + log_msg += f" in {cwd}" + self.logger.debug(log_msg) # TODO: investigate why it works only with shell, not exec async_subprocess = await asyncio.create_subprocess_shell( cmd, @@ -116,7 +119,10 @@ def run_sync( self, cmd: str, cwd: Path | None = None, env: dict[str, str] | None = None ) -> icommandrunner.ISyncProcess: cmd_parts = shlex.split(cmd) - self.logger.debug(f"Sync subprocess run: {cmd_parts}") + log_msg = f"Sync subprocess run: {cmd_parts}" + if cwd is not None: + log_msg += f' {cwd}' + self.logger.debug(log_msg) async_subprocess = subprocess.Popen( cmd_parts, stdin=subprocess.PIPE, diff --git a/pyproject.toml b/pyproject.toml index 5734c56..4f7fa72 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -14,6 +14,7 @@ dependencies = [ "pygls==2.0.0-a6", "finecode_extension_api==0.3.*", "finecode_extension_runner==0.3.*", + "finecode_builtin_handlers==0.1.*", "ordered-set==4.1.*", "mcp==1.13.*", "fine_python_virtualenv==0.1.*", diff --git a/src/finecode/base_config.toml b/src/finecode/base_config.toml index 520d83d..06df1aa 100644 --- a/src/finecode/base_config.toml +++ b/src/finecode/base_config.toml @@ -3,13 +3,13 @@ source = "finecode_extension_api.actions.prepare_envs.PrepareEnvsAction" [[tool.finecode.action.prepare_envs.handlers]] name = "prepare_envs_dump_configs" -source = "finecode_extension_runner.action_handlers.PrepareEnvsReadConfigsHandler" +source = "finecode_builtin_handlers.PrepareEnvsReadConfigsHandler" env = "dev_workspace" [[tool.finecode.action.prepare_envs.handlers]] name = "prepare_envs_install_deps" -source = "finecode_extension_runner.action_handlers.PrepareEnvsInstallDepsHandler" +source = "finecode_builtin_handlers.PrepareEnvsInstallDepsHandler" env = "dev_workspace" @@ -30,13 +30,13 @@ dependencies = ["fine_python_virtualenv==0.1.*"] [[tool.finecode.action.prepare_dev_workspaces_envs.handlers]] name = "prepare_envs_read_configs" -source = "finecode_extension_runner.action_handlers.PrepareEnvsReadConfigsHandler" +source = "finecode_builtin_handlers.PrepareEnvsReadConfigsHandler" env = "dev_workspace" [[tool.finecode.action.prepare_dev_workspaces_envs.handlers]] name = "prepare_envs_install_deps" -source = "finecode_extension_runner.action_handlers.PrepareEnvsInstallDepsHandler" +source = "finecode_builtin_handlers.PrepareEnvsInstallDepsHandler" env = "dev_workspace" @@ -51,13 +51,13 @@ dependencies = ["fine_python_virtualenv==0.1.*"] [[tool.finecode.action.prepare_runners.handlers]] name = "prepare_runners_read_configs" -source = "finecode_extension_runner.action_handlers.PrepareRunnersReadConfigsHandler" +source = "finecode_builtin_handlers.PrepareRunnersReadConfigsHandler" env = "dev_workspace" [[tool.finecode.action.prepare_runners.handlers]] name = "prepare_runners_install_runner_and_presets" -source = "finecode_extension_runner.action_handlers.PrepareRunnersInstallRunnerAndPresetsHandler" +source = "finecode_builtin_handlers.PrepareRunnersInstallRunnerAndPresetsHandler" env = "dev_workspace" @@ -66,13 +66,13 @@ source = "finecode_extension_api.actions.dump_config.DumpConfigAction" [[tool.finecode.action.dump_config.handlers]] name = "dump_config" -source = "finecode_extension_runner.action_handlers.DumpConfigHandler" +source = "finecode_builtin_handlers.DumpConfigHandler" env = "dev_workspace" [[tool.finecode.action.dump_config.handlers]] name = "dump_config_save" -source = "finecode_extension_runner.action_handlers.DumpConfigSaveHandler" +source = "finecode_builtin_handlers.DumpConfigSaveHandler" env = "dev_workspace" diff --git a/src/finecode/config/read_configs.py b/src/finecode/config/read_configs.py index 6842d6f..9806ffb 100644 --- a/src/finecode/config/read_configs.py +++ b/src/finecode/config/read_configs.py @@ -583,8 +583,10 @@ def add_extension_runner_to_dependencies(project_config: dict[str, Any]) -> None finecode_version = metadata.version("finecode") for group_name, group_packages in deps_groups.items(): - if group_name == "dev_workspace": - # skip `dev_workspace` because it contains finecode already + if group_name == "dev_workspace" or group_name == "runtime": + # - skip `dev_workspace` because it contains finecode already + # - skip `runtime` because FineCode doesn't start runner in runtime env, all + # development-related processes happen in `dev` env. continue group_packages.append(f"finecode_extension_runner == {finecode_version}")