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
15 changes: 15 additions & 0 deletions injection/loaders.py
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,15 @@ class ProfileLoader:
def __is_empty(self) -> bool:
return not self.module_subsets

def required_module_names(self, name: str | None = None, /) -> frozenset[str]:
Copy link

Copilot AI May 29, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[nitpick] Consider adding a docstring for required_module_names to explain its parameters (including name=None) and the structure of its return value, making its behavior clearer to future readers.

Copilot uses AI. Check for mistakes.
names = {self.module.name}

if name is not None:
names.add(name)

subsets = (self.__walk_subsets_for(name) for name in names)
return frozenset(itertools.chain.from_iterable(subsets))

def init(self) -> Self:
self.__init_subsets_for(self.module)
return self
Expand Down Expand Up @@ -179,6 +188,12 @@ def __is_initialized(self, module: Module) -> bool:
def __mark_initialized(self, module: Module) -> None:
self.__initialized_modules.add(module.name)

def __walk_subsets_for(self, module_name: str) -> Iterator[str]:
yield module_name

for name in self.module_subsets.get(module_name, ()):
yield from self.__walk_subsets_for(name)


@runtime_checkable
class LoadedProfile(Protocol):
Expand Down
36 changes: 36 additions & 0 deletions tests/loaders/test_profile_loader.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,42 @@


class TestProfileLoader:
def test_required_module_names_with_success_return_frozenset(self):
loader = ProfileLoader(
{
mod().name: ["a", "b", "c"],
"dev": ["m", "n", "o"],
"b": ["x", "y", "z"],
"c": ["i", "j"],
}
)
assert loader.required_module_names() == {
mod().name,
"a",
"b",
"c",
"x",
"y",
"z",
"i",
"j",
}

def test_required_module_names_with_name_return_frozenset(self):
loader = ProfileLoader(
{
mod().name: ["a"],
"dev": ["z"],
"test": ["i"],
}
)
assert loader.required_module_names("dev") == {
mod().name,
"dev",
"a",
"z",
}

def test_load_with_success(self):
profile_name = "test"
global_profile_name = uuid4().hex
Expand Down