tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

setters.py (1400B)


      1 # SPDX-License-Identifier: MIT
      2 
      3 """
      4 Commonly used hooks for on_setattr.
      5 """
      6 
      7 
      8 from . import _config
      9 from .exceptions import FrozenAttributeError
     10 
     11 
     12 def pipe(*setters):
     13    """
     14    Run all *setters* and return the return value of the last one.
     15 
     16    .. versionadded:: 20.1.0
     17    """
     18 
     19    def wrapped_pipe(instance, attrib, new_value):
     20        rv = new_value
     21 
     22        for setter in setters:
     23            rv = setter(instance, attrib, rv)
     24 
     25        return rv
     26 
     27    return wrapped_pipe
     28 
     29 
     30 def frozen(_, __, ___):
     31    """
     32    Prevent an attribute to be modified.
     33 
     34    .. versionadded:: 20.1.0
     35    """
     36    raise FrozenAttributeError()
     37 
     38 
     39 def validate(instance, attrib, new_value):
     40    """
     41    Run *attrib*'s validator on *new_value* if it has one.
     42 
     43    .. versionadded:: 20.1.0
     44    """
     45    if _config._run_validators is False:
     46        return new_value
     47 
     48    v = attrib.validator
     49    if not v:
     50        return new_value
     51 
     52    v(instance, attrib, new_value)
     53 
     54    return new_value
     55 
     56 
     57 def convert(instance, attrib, new_value):
     58    """
     59    Run *attrib*'s converter -- if it has one --  on *new_value* and return the
     60    result.
     61 
     62    .. versionadded:: 20.1.0
     63    """
     64    c = attrib.converter
     65    if c:
     66        return c(new_value)
     67 
     68    return new_value
     69 
     70 
     71 # Sentinel for disabling class-wide *on_setattr* hooks for certain attributes.
     72 # autodata stopped working, so the docstring is inlined in the API docs.
     73 NO_OP = object()