a
    ij                     @  s   d Z ddlmZ ddlZddlZddlZddlmZmZmZ ddl	Z	edZ
e	jdd dkrfejfneejfZG dd	 d	geR  Zd
dddZddd
dddZdd Zdd ZdddddZdS )zPython utils.    )annotationsN)AnyTypeVarUnion_Cls   )      c                      sn   e Zd ZdZddddZedd dddZdd	d
 fddZdd fddZe	j
rfedd Z  ZS )StrEnuma(  Like `Enum`, but `enum.auto()` assigns `str` rather than `int`.

  ```python
  class MyEnum(epy.StrEnum):
    SOME_ATTR = enum.auto()
    OTHER_ATTR = enum.auto()

  assert MyEnum('some_attr') is MyEnum.SOME_ATTR
  assert MyEnum.SOME_ATTR == 'some_attr'
  ```

  `StrEnum` is case insensitive.
  strreturnc                 C  s   |   S N)lower)namestartcountlast_values r   P/home/ghrups/robot-bench/.venv/lib/python3.9/site-packages/etils/epy/py_utils.py_generate_next_value_2   s    zStrEnum._generate_next_value_)valuer   c                 C  sJ   t |tr| s| | S dd | D }t|d| j d| d S )Nc                 S  s   g | ]
}|j qS r   )r   ).0er   r   r   
<listcomp>:       z%StrEnum._missing_.<locals>.<listcomp>z is not a valid z. Expected one of )
isinstancer   islowerr   
ValueError__qualname__)clsr   Z
all_valuesr   r   r   	_missing_5   s    zStrEnum._missing_bool)otherr   c                   s   t  | S r   )super__eq__r   )selfr#   	__class__r   r   r%   @   s    zStrEnum.__eq__intc                   s
   t   S r   )r$   __hash__)r&   r'   r   r   r*   C   s    zStrEnum.__hash__c                 C  s   t tj| S r   )typeenumEnum__iter__r    r   r   r   r.   K   s    zStrEnum.__iter__)__name__
__module__r   __doc__r   classmethodr!   r%   r*   typingTYPE_CHECKINGr.   __classcell__r   r   r'   r   r
   !   s   
r
   r"   r   c                 C  s   t | tot| dS )zReturns `True` if the value is instance of `NamedTuple`.

  This is using some heuristic by checking for a `._field` attribute.

  Args:
    x: Object to check

  Returns:
    `True` if the object is a `namedtuple`
  _fields)r   tuplehasattr)xr   r   r   is_namedtupleP   s    r;   r   z'Union[type[Any], tuple[type[Any], ...]])r    typesr   c                 C  s   t | tot| |S )zALike `issubclass`, but do not raise error if value is not `type`.)r   r+   
issubclass)r    r<   r   r   r   issubclass_^   s    r>   c                   s   t   fdd}|S )z`__init__` wrapper.c                   sV   d| j v r  | g|R i |S t| dd  | g|R i | t| dd d S )N_epy_is_init_doneFT)__dict__object__setattr__)r&   argskwargsinit_fnr   r   new_initi   s
    
z_wrap_init.<locals>.new_init	functoolswraps)rF   rG   r   rE   r   
_wrap_initf   s    
rK   c                   s   t   fdd}|S )z`__setattr__` wrapper.c                   sL   t | dstdt|  d| js0 | ||S td|dt|  d S )Nr?   zKChild of `@epy.frozen` class should be `@epy.frozen` too. (Error raised by )zCannot assign z in `@epy.frozen` class )r9   r   r+   r?   AttributeError)r&   r   r   
setattr_fnr   r   new_setattrz   s    
z"_wrap_setattr.<locals>.new_setattrrH   )rO   rP   r   rN   r   _wrap_setattrw   s    rQ   )r    r   c                 C  s6   t | tst| j dt| j| _t| j| _| S )a  Class decorator which prevent mutating attributes after `__init__`.

  Example:

  ```python
  @epy.frozen
  class A:

    def __init__(self):
      self.x = 123

  a = A()
  a.x = 456  # AttributeError
  ```

  Supports inheritance, child classes should explicitly be marked as
  `@epy.frozen` if they mutate additional attributes in `__init__`.

  Args:
    cls: The class to freeze.

  Returns:
    cls: The class object
  z is not)r   r+   	TypeErrorr0   rK   __init__rQ   rB   r/   r   r   r   frozen   s
    
rT   )r2   
__future__r   r,   rI   r4   r   r   r   sysr   version_infor
   r   r-   Z_StrEnumr;   r>   rK   rQ   rT   r   r   r   r   <module>   s   "/