utils.py 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. import importlib
  2. import logging
  3. import os
  4. from eth_hash.abc import (
  5. BackendAPI,
  6. )
  7. from eth_hash.backends import (
  8. SUPPORTED_BACKENDS,
  9. )
  10. def auto_choose_backend() -> BackendAPI:
  11. env_backend = get_backend_in_environment()
  12. if env_backend:
  13. return load_environment_backend(env_backend)
  14. else:
  15. return choose_available_backend()
  16. def get_backend_in_environment() -> str:
  17. return os.environ.get("ETH_HASH_BACKEND", "")
  18. def load_backend(backend_name: str) -> BackendAPI:
  19. import_path = f"eth_hash.backends.{backend_name}"
  20. module = importlib.import_module(import_path)
  21. try:
  22. backend = module.backend
  23. except AttributeError as e:
  24. raise ValueError(
  25. f"Import of {import_path} failed, because {module} does not have "
  26. "'backend' attribute"
  27. ) from e
  28. if isinstance(backend, BackendAPI):
  29. return backend
  30. else:
  31. raise ValueError(
  32. f"Import of {import_path} failed, because {backend} is an invalid back end"
  33. )
  34. def load_environment_backend(env_backend: str) -> BackendAPI:
  35. if env_backend in SUPPORTED_BACKENDS:
  36. try:
  37. return load_backend(env_backend)
  38. except ImportError as e:
  39. raise ImportError(
  40. f"The backend specified in ETH_HASH_BACKEND, '{env_backend}', is not "
  41. f"installed. Install with `python -m pip install "
  42. f'"eth-hash[{env_backend}]"`.'
  43. ) from e
  44. else:
  45. raise ValueError(
  46. f"The backend specified in ETH_HASH_BACKEND, '{env_backend}', is not "
  47. f"supported. Choose one of: {SUPPORTED_BACKENDS}"
  48. )
  49. def choose_available_backend() -> BackendAPI:
  50. for backend in SUPPORTED_BACKENDS:
  51. try:
  52. return load_backend(backend)
  53. except ImportError:
  54. logging.getLogger("eth_hash").debug(
  55. f"Failed to import {backend}", exc_info=True
  56. )
  57. raise ImportError(
  58. f"None of these hashing backends are installed: {SUPPORTED_BACKENDS}.\n"
  59. f'Install with `python -m pip install "eth-hash[{SUPPORTED_BACKENDS[0]}]"`.'
  60. )