o
    Vh.                     @   s    G d d dZ G dd dZdS )c                   @   s"   e Zd ZdZdd ZdddZdS )NonDataPropertya  Much like the property builtin, but only implements __get__,
    making it a non-data property, and can be subsequently reset.

    See http://users.rcn.com/python/download/Descriptor.htm for more
    information.

    >>> class X(object):
    ...   @NonDataProperty
    ...   def foo(self):
    ...     return 3
    >>> x = X()
    >>> x.foo
    3
    >>> x.foo = 4
    >>> x.foo
    4
    c                 C   s*   |d usJ dt |sJ d|| _d S )Nzfget cannot be nonezfget must be callable)callablefget)selfr    r   m/var/www/html/construction_image-detection-poc/venv/lib/python3.10/site-packages/keyring/compat/properties.py__init__   s   
zNonDataProperty.__init__Nc                 C   s   |d u r| S |  |S N)r   )r   objobjtyper   r   r   __get__   s   
zNonDataProperty.__get__r   )__name__
__module____qualname____doc__r   r   r   r   r   r   r      s    r   c                   @   sP   e Zd ZdZG dd deZdddZdddZd	d
 Zdd Z	e
dd ZdS )classpropertya  
    Like @property but applies at the class level.


    >>> class X(metaclass=classproperty.Meta):
    ...   val = None
    ...   @classproperty
    ...   def foo(cls):
    ...     return cls.val
    ...   @foo.setter
    ...   def foo(cls, val):
    ...     cls.val = val
    >>> X.foo
    >>> X.foo = 3
    >>> X.foo
    3
    >>> x = X()
    >>> x.foo
    3
    >>> X.foo = 4
    >>> x.foo
    4

    Setting the property on an instance affects the class.

    >>> x.foo = 5
    >>> x.foo
    5
    >>> X.foo
    5
    >>> vars(x)
    {}
    >>> X().foo
    5

    Attempting to set an attribute where no setter was defined
    results in an AttributeError:

    >>> class GetOnly(metaclass=classproperty.Meta):
    ...   @classproperty
    ...   def foo(cls):
    ...     return 'bar'
    >>> GetOnly.foo = 3
    Traceback (most recent call last):
    ...
    AttributeError: can't set attribute

    It is also possible to wrap a classmethod or staticmethod in
    a classproperty.

    >>> class Static(metaclass=classproperty.Meta):
    ...   @classproperty
    ...   @classmethod
    ...   def foo(cls):
    ...     return 'foo'
    ...   @classproperty
    ...   @staticmethod
    ...   def bar():
    ...     return 'bar'
    >>> Static.foo
    'foo'
    >>> Static.bar
    'bar'

    *Legacy*

    For compatibility, if the metaclass isn't specified, the
    legacy behavior will be invoked.

    >>> class X:
    ...   val = None
    ...   @classproperty
    ...   def foo(cls):
    ...     return cls.val
    ...   @foo.setter
    ...   def foo(cls, val):
    ...     cls.val = val
    >>> X.foo
    >>> X.foo = 3
    >>> X.foo
    3
    >>> x = X()
    >>> x.foo
    3
    >>> X.foo = 4
    >>> x.foo
    4

    Note, because the metaclass was not specified, setting
    a value on an instance does not have the intended effect.

    >>> x.foo = 5
    >>> x.foo
    5
    >>> X.foo  # should be 5
    4
    >>> vars(x)  # should be empty
    {'foo': 5}
    >>> X().foo  # should be 5
    4
    c                       s   e Zd Z fddZ  ZS )zclassproperty.Metac                    s4   | j |d }t|tu r|| |S t ||S r   )__dict__gettyper   __set__super__setattr__)r   keyvaluer	   	__class__r   r   r      s   zclassproperty.Meta.__setattr__)r   r   r   r   __classcell__r   r   r   r   Meta   s    r   Nc                 C   s*   |  || _|| _|o| | d S  d S r   )_ensure_methodr   fsetsetter)r   r   r   r   r   r   r      s   zclassproperty.__init__c                 C   s   | j d | S r   )r   r   )r   instanceownerr   r   r   r      s   zclassproperty.__get__c                 C   s6   | j stdt|tjurt|}| j d ||S )Nzcan't set attribute)r   AttributeErrorr   r   r   r   )r   r!   r   r   r   r   r      s
   zclassproperty.__set__c                 C   s   |  || _| S r   )r   r   )r   r   r   r   r   r      s   zclassproperty.setterc                 C   s    t |ttf }|rt|S |S )z=
        Ensure fn is a classmethod or staticmethod.
        )
isinstanceclassmethodstaticmethod)clsfnneeds_methodr   r   r   r      s   zclassproperty._ensure_methodr   )r   r   r   r   r   r   r   r   r   r   r$   r   r   r   r   r   r   "   s    f

r   N)r   r   r   r   r   r   <module>   s   