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.
This commit is contained in:
takeokunn committed 2026-02-13 15:39:52 +09:00
1 parent 43902782fa
commit 0025402f37
3 files changed
+15 -22

No files matched your search

+2 -2
View File
@@ -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
+7 -13
View File
@@ -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
@@ -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"))