Merge pull request #812 from public/circular-fix
Fix circular imports with available_backends()
diff --git a/cryptography/hazmat/backends/__init__.py b/cryptography/hazmat/backends/__init__.py
index 59d1bc6..ae78822 100644
--- a/cryptography/hazmat/backends/__init__.py
+++ b/cryptography/hazmat/backends/__init__.py
@@ -13,23 +13,42 @@
from __future__ import absolute_import, division, print_function
-from cryptography.hazmat.backends import openssl
from cryptography.hazmat.backends.multibackend import MultiBackend
from cryptography.hazmat.bindings.commoncrypto.binding import (
Binding as CommonCryptoBinding
)
-
-_ALL_BACKENDS = []
-
-if CommonCryptoBinding.is_available():
- from cryptography.hazmat.backends import commoncrypto
- _ALL_BACKENDS.append(commoncrypto.backend)
-
-_ALL_BACKENDS.append(openssl.backend)
+from cryptography.hazmat.bindings.openssl.binding import (
+ Binding as OpenSSLBinding
+)
-_default_backend = MultiBackend(_ALL_BACKENDS)
+_available_backends_list = None
+
+
+def _available_backends():
+ global _available_backends_list
+
+ if _available_backends_list is None:
+ _available_backends_list = []
+
+ if CommonCryptoBinding.is_available():
+ from cryptography.hazmat.backends import commoncrypto
+ _available_backends_list.append(commoncrypto.backend)
+
+ if OpenSSLBinding.is_available():
+ from cryptography.hazmat.backends import openssl
+ _available_backends_list.append(openssl.backend)
+
+ return _available_backends_list
+
+
+_default_backend = None
def default_backend():
+ global _default_backend
+
+ if _default_backend is None:
+ _default_backend = MultiBackend(_available_backends())
+
return _default_backend
diff --git a/tests/conftest.py b/tests/conftest.py
index 0069f2c..36183f4 100644
--- a/tests/conftest.py
+++ b/tests/conftest.py
@@ -15,7 +15,7 @@
import pytest
-from cryptography.hazmat.backends import _ALL_BACKENDS
+from cryptography.hazmat.backends import _available_backends
from cryptography.hazmat.backends.interfaces import (
HMACBackend, CipherBackend, HashBackend, PBKDF2HMACBackend, RSABackend
)
@@ -25,7 +25,7 @@
def pytest_generate_tests(metafunc):
names = metafunc.config.getoption("--backend")
- selected_backends = select_backends(names, _ALL_BACKENDS)
+ selected_backends = select_backends(names, _available_backends())
if "backend" in metafunc.fixturenames:
metafunc.parametrize("backend", selected_backends)