From 0025402f37057c7fd41812249bff79bcd01961a9 Mon Sep 17 00:00:00 2001 From: takeokunn Date: Fri, 13 Feb 2026 15:39:52 +0900 Subject: [PATCH] RegisteredProject: pass SerenaConfig through get_project_instance Remove serena_config storage from RegisteredProject; instead accept it as an explicit parameter in get_project_instance() for cleaner separation of concerns. --- src/serena/cli.py | 4 ++-- src/serena/config/serena_config.py | 20 +++++++------------ .../config/test_global_ignored_paths.py | 13 ++++++------ 3 files changed, 15 insertions(+), 22 deletions(-) diff --git a/src/serena/cli.py b/src/serena/cli.py index ee36be22..33595e70 100644 --- a/src/serena/cli.py +++ b/src/serena/cli.py @@ -567,7 +567,7 @@ class ProjectCommands(AutoRegisteringGroup): serena_config = SerenaConfig.from_config_file() registered_project = serena_config.get_registered_project(str(project_root)) if registered_project is None: - registered_project = RegisteredProject(str(project_root), generated_conf, serena_config=serena_config) + registered_project = RegisteredProject(str(project_root), generated_conf) serena_config.add_registered_project(registered_project) return registered_project @@ -637,7 +637,7 @@ class ProjectCommands(AutoRegisteringGroup): lvl = logging.getLevelNamesMapping()[log_level.upper()] logging.configure(level=lvl) serena_config = SerenaConfig.from_config_file() - proj = registered_project.get_project_instance() + proj = registered_project.get_project_instance(serena_config=serena_config) click.echo(f"Indexing symbols in {proj} …") ls_mgr = proj.create_language_server_manager( log_level=lvl, ls_timeout=timeout, ls_specific_settings=serena_config.ls_specific_settings diff --git a/src/serena/config/serena_config.py b/src/serena/config/serena_config.py index 79b8dab0..be7faaff 100644 --- a/src/serena/config/serena_config.py +++ b/src/serena/config/serena_config.py @@ -402,7 +402,6 @@ class RegisteredProject(ToStringMixin): project_root: str, project_config: "ProjectConfig", project_instance: Optional["Project"] = None, - serena_config: "SerenaConfig | None" = None, ) -> None: """ Represents a registered project in the Serena configuration. @@ -410,12 +409,10 @@ class RegisteredProject(ToStringMixin): :param project_root: the root directory of the project :param project_config: the configuration of the project :param project_instance: an existing project instance (if already loaded) - :param serena_config: the SerenaConfig instance for global settings """ self.project_root = Path(project_root).resolve() self.project_config = project_config self._project_instance = project_instance - self._serena_config = serena_config def _tostring_exclude_private(self) -> bool: return True @@ -425,21 +422,19 @@ class RegisteredProject(ToStringMixin): return self.project_config.project_name @classmethod - def from_project_instance(cls, project_instance: "Project", serena_config: "SerenaConfig | None" = None) -> "RegisteredProject": + def from_project_instance(cls, project_instance: "Project") -> "RegisteredProject": return RegisteredProject( project_root=project_instance.project_root, project_config=project_instance.project_config, project_instance=project_instance, - serena_config=serena_config, ) @classmethod - def from_project_root(cls, project_root: str | Path, serena_config: "SerenaConfig | None" = None) -> "RegisteredProject": + def from_project_root(cls, project_root: str | Path) -> "RegisteredProject": project_config = ProjectConfig.load(project_root) return RegisteredProject( project_root=str(project_root), project_config=project_config, - serena_config=serena_config, ) def matches_root_path(self, path: str | Path) -> bool: @@ -451,7 +446,7 @@ class RegisteredProject(ToStringMixin): """ return self.project_root.samefile(Path(path).resolve()) - def get_project_instance(self) -> "Project": + def get_project_instance(self, serena_config: "SerenaConfig | None") -> "Project": """ Returns the project instance for this registered project, loading it if necessary. """ @@ -462,7 +457,7 @@ class RegisteredProject(ToStringMixin): self._project_instance = Project( project_root=str(self.project_root), project_config=self.project_config, - serena_config=self._serena_config, + serena_config=serena_config, ) return self._project_instance @@ -629,7 +624,6 @@ class SerenaConfig(ToolInclusionDefinition, ModeSelectionDefinition, ToStringMix project = RegisteredProject( project_root=str(path), project_config=project_config, - serena_config=instance, ) instance.projects.append(project) @@ -720,7 +714,7 @@ class SerenaConfig(ToolInclusionDefinition, ModeSelectionDefinition, ToStringMix if autoregister: config_path = ProjectConfig.path_to_project_yml(project_root_or_name) if os.path.isfile(config_path): - registered_project = RegisteredProject.from_project_root(project_root_or_name, serena_config=self) + registered_project = RegisteredProject.from_project_root(project_root_or_name) self.add_registered_project(registered_project) return registered_project # nothing found @@ -731,7 +725,7 @@ class SerenaConfig(ToolInclusionDefinition, ModeSelectionDefinition, ToStringMix if registered_project is None: return None else: - return registered_project.get_project_instance() + return registered_project.get_project_instance(serena_config=self) def add_registered_project(self, registered_project: RegisteredProject) -> None: """ @@ -771,7 +765,7 @@ class SerenaConfig(ToolInclusionDefinition, ModeSelectionDefinition, ToStringMix is_newly_created=True, serena_config=self, ) - self.add_registered_project(RegisteredProject.from_project_instance(new_project, serena_config=self)) + self.add_registered_project(RegisteredProject.from_project_instance(new_project)) return new_project diff --git a/test/serena/config/test_global_ignored_paths.py b/test/serena/config/test_global_ignored_paths.py index 230a950d..23481373 100644 --- a/test/serena/config/test_global_ignored_paths.py +++ b/test/serena/config/test_global_ignored_paths.py @@ -145,9 +145,8 @@ class TestRegisteredProjectGlobalIgnoredPaths: registered = RegisteredProject( project_root=str(self.project_path), project_config=config, - serena_config=serena_config, ) - project = registered.get_project_instance() + project = registered.get_project_instance(serena_config=serena_config) assert project.is_ignored_path(str(self.project_path / "node_modules" / "pkg.js")) def test_get_project_instance_without_global_ignored_paths(self) -> None: @@ -162,7 +161,7 @@ class TestRegisteredProjectGlobalIgnoredPaths: project_root=str(self.project_path), project_config=config, ) - project = registered.get_project_instance() + project = registered.get_project_instance(serena_config=None) assert not project.is_ignored_path(str(self.project_path / "node_modules" / "pkg.js")) def test_from_project_root_passes_global_ignored_paths(self) -> None: @@ -173,11 +172,11 @@ class TestRegisteredProjectGlobalIgnoredPaths: (serena_dir / "project.yml").write_text( 'project_name: "test_project"\nlanguages: ["python"]\nignored_paths: []\nignore_all_files_in_gitignore: false\n' ) + serena_config = SerenaConfig(gui_log_window=False, web_dashboard=False, ignored_paths=["node_modules"]) registered = RegisteredProject.from_project_root( str(self.project_path), - serena_config=SerenaConfig(gui_log_window=False, web_dashboard=False, ignored_paths=["node_modules"]), ) - project = registered.get_project_instance() + project = registered.get_project_instance(serena_config=serena_config) assert project.is_ignored_path(str(self.project_path / "node_modules" / "pkg.js")) def test_from_project_instance_passes_global_ignored_paths(self) -> None: @@ -194,9 +193,9 @@ class TestRegisteredProjectGlobalIgnoredPaths: project_config=config, serena_config=serena_config, ) - registered = RegisteredProject.from_project_instance(project, serena_config=serena_config) + registered = RegisteredProject.from_project_instance(project) # The registered project already has a project_instance, so get_project_instance() returns it directly - retrieved = registered.get_project_instance() + retrieved = registered.get_project_instance(serena_config=serena_config) assert retrieved.is_ignored_path(str(self.project_path / "node_modules" / "pkg.js"))