__init__.py 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. # SPDX-License-Identifier: MIT
  2. """
  3. Classes Without Boilerplate
  4. """
  5. from functools import partial
  6. from typing import Callable, Literal, Protocol
  7. from . import converters, exceptions, filters, setters, validators
  8. from ._cmp import cmp_using
  9. from ._config import get_run_validators, set_run_validators
  10. from ._funcs import asdict, assoc, astuple, has, resolve_types
  11. from ._make import (
  12. NOTHING,
  13. Attribute,
  14. Converter,
  15. Factory,
  16. _Nothing,
  17. attrib,
  18. attrs,
  19. evolve,
  20. fields,
  21. fields_dict,
  22. make_class,
  23. validate,
  24. )
  25. from ._next_gen import define, field, frozen, mutable
  26. from ._version_info import VersionInfo
  27. s = attributes = attrs
  28. ib = attr = attrib
  29. dataclass = partial(attrs, auto_attribs=True) # happy Easter ;)
  30. class AttrsInstance(Protocol):
  31. pass
  32. NothingType = Literal[_Nothing.NOTHING]
  33. __all__ = [
  34. "NOTHING",
  35. "Attribute",
  36. "AttrsInstance",
  37. "Converter",
  38. "Factory",
  39. "NothingType",
  40. "asdict",
  41. "assoc",
  42. "astuple",
  43. "attr",
  44. "attrib",
  45. "attributes",
  46. "attrs",
  47. "cmp_using",
  48. "converters",
  49. "define",
  50. "evolve",
  51. "exceptions",
  52. "field",
  53. "fields",
  54. "fields_dict",
  55. "filters",
  56. "frozen",
  57. "get_run_validators",
  58. "has",
  59. "ib",
  60. "make_class",
  61. "mutable",
  62. "resolve_types",
  63. "s",
  64. "set_run_validators",
  65. "setters",
  66. "validate",
  67. "validators",
  68. ]
  69. def _make_getattr(mod_name: str) -> Callable:
  70. """
  71. Create a metadata proxy for packaging information that uses *mod_name* in
  72. its warnings and errors.
  73. """
  74. def __getattr__(name: str) -> str:
  75. if name not in ("__version__", "__version_info__"):
  76. msg = f"module {mod_name} has no attribute {name}"
  77. raise AttributeError(msg)
  78. from importlib.metadata import metadata
  79. meta = metadata("attrs")
  80. if name == "__version_info__":
  81. return VersionInfo._from_version_string(meta["version"])
  82. return meta["version"]
  83. return __getattr__
  84. __getattr__ = _make_getattr(__name__)