Source code for gemseo.core.grammars.required_names
# Copyright 2021 IRT Saint Exupéry, https://www.irt-saintexupery.com
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License version 3 as published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
"""Grammar required names."""
from __future__ import annotations
from collections.abc import Iterable
from collections.abc import Iterator
from collections.abc import MutableSet
from typing import TYPE_CHECKING
from typing import Any
if TYPE_CHECKING:
from typing_extensions import Self
from gemseo.core.grammars.base_grammar import BaseGrammar
[docs]
class RequiredNames(MutableSet[str]):
"""A set-like class for handling grammar required names.
The names in an instance of this class shall belong to the bound grammar.
"""
__grammar: BaseGrammar
"""The grammar bound to the required names."""
__names: set[str]
"""The required names."""
def __init__(
self,
grammar: BaseGrammar,
names: Iterable[str] = (),
) -> None:
"""
Args:
grammar: The grammar bound to the required names.
names: The required names.
""" # noqa: D205, D212, D415
self.__grammar = grammar
self.__names = set(names)
# Do not use the names variable such that it works with generators
# (used by __sub__).
self.__grammar._check_name(*self.__names)
[docs]
def add(self, name: str) -> None: # noqa: D102
self.__grammar._check_name(name)
self.__names.add(name)
def __contains__(self, name: Any) -> bool:
return name in self.__names
def __iter__(self) -> Iterator[str]:
return iter(self.__names)
def __len__(self) -> int:
return len(self.__names)
[docs]
def discard(self, name: str) -> None: # noqa: D102
self.__names.discard(name)
def __str__(self) -> str:
return str(self.__names)
def _from_iterable(self, names: Iterable[str]) -> Self:
# This method is required for propagating the bound grammar
# for operations that imply other sets that are not instances
# of this class (like - or | or &).
return self.__class__(self.__grammar, names)