# Path: robel/components/builder.py
# class ComponentBuilder(metaclass=abc.ABCMeta):
#     """Base class for a component configuration.
# 
#     This wraps a dictionary of parameters that is used to initialize a
#     Component.
#     """
# 
#     def __init__(self):
#         self.group_configs = {}
# 
#     @property
#     def group_names(self) -> List[str]:
#         """Returns the sorted list of current group names."""
#         return sorted(self.group_configs.keys())
# 
#     @abc.abstractmethod
#     def build(self, *args, **kwargs) -> BaseComponent:
#         """Builds the component."""
# 
#     def add_group(self, group_name: str, **group_kwargs):
#         """Adds a group configuration.
# 
#         Args:
#             group_name: The name of the group.
#             **group_kwargs: Key-value pairs to configure the group with.
#         """
#         if group_name in self.group_configs:
#             raise ValueError(
#                 'Group with name `{}` already exists in component config.'
#                 .format(group_name))
#         self.group_configs[group_name] = group_kwargs
# 
#     def update_group(self, group_name: str, **group_kwargs):
#         """Updates a group configuration.
# 
#         Args:
#             group_name: The name of the group.
#             **group_kwargs: Key-value pairs to configure the group with.
#         """
#         self._check_group_exists(group_name)
#         self.group_configs[group_name].update(group_kwargs)
# 
#     def _check_group_exists(self, name: str):
#         """Raises an error if a group with the given name doesn't exist."""
#         if name not in self.group_configs:
#             raise ValueError(
#                 ('No group with name "{}" was added to the builder. Currently '
#                  'added groups: {}').format(name, self.group_names))


import abc
from robel.components.builder import ComponentBuilder
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

"""Manages resetting functionality."""




class ResetProcedure(metaclass=abc.ABCMeta):
    """Implements a reset procedure for a robot."""

    def __init__(self):
        """Creates a new reset procedure."""

    @abc.abstractmethod
    def configure_reset_groups(self, builder: ComponentBuilder):
        """Configures the component groups needed for reset."""

    @abc.abstractmethod
    def reset(self, **kwargs):
        """Performs the reset procedure."""

    def finish(self):
        """Called when the reset is complete."""


class ManualResetProcedure(ResetProcedure):
    """Reset procedure that waits for the user to press enter."""


# Path: robel/components/builder.py
# class ComponentBuilder(metaclass=abc.ABCMeta):
#     """Base class for a component configuration.
# 
#     This wraps a dictionary of parameters that is used to initialize a
#     Component.
#     """
# 
#     def __init__(self):
#         self.group_configs = {}
# 
#     @property
#     def group_names(self) -> List[str]:
#         """Returns the sorted list of current group names."""
#         return sorted(self.group_configs.keys())
# 
#     @abc.abstractmethod
#     def build(self, *args, **kwargs) -> BaseComponent:
#         """Builds the component."""
# 
#     def add_group(self, group_name: str, **group_kwargs):
#         """Adds a group configuration.
# 
#         Args:
#             group_name: The name of the group.
#             **group_kwargs: Key-value pairs to configure the group with.
#         """
#         if group_name in self.group_configs:
#             raise ValueError(
#                 'Group with name `{}` already exists in component config.'
#                 .format(group_name))
#         self.group_configs[group_name] = group_kwargs
# 
#     def update_group(self, group_name: str, **group_kwargs):
#         """Updates a group configuration.
# 
#         Args:
#             group_name: The name of the group.
#             **group_kwargs: Key-value pairs to configure the group with.
#         """
#         self._check_group_exists(group_name)
#         self.group_configs[group_name].update(group_kwargs)
# 
#     def _check_group_exists(self, name: str):
#         """Raises an error if a group with the given name doesn't exist."""
#         if name not in self.group_configs:
#             raise ValueError(
#                 ('No group with name "{}" was added to the builder. Currently '
#                  'added groups: {}').format(name, self.group_names))


# Path: robel/utils/reset_procedure.py
import abc
from robel.components.builder import ComponentBuilder

# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

"""Manages resetting functionality."""




class ResetProcedure(metaclass=abc.ABCMeta):
    """Implements a reset procedure for a robot."""

    def __init__(self):
        """Creates a new reset procedure."""

    @abc.abstractmethod
    def configure_reset_groups(self, builder: ComponentBuilder):
        """Configures the component groups needed for reset."""

    @abc.abstractmethod
    def reset(self, **kwargs):
        """Performs the reset procedure."""

    def finish(self):
        """Called when the reset is complete."""


class ManualResetProcedure(ResetProcedure):
    """Reset procedure that waits for the user to press enter."""


    def configure_reset_groups(self, builder: ComponentBuilder):