diff --git a/incognia/api.py b/incognia/api.py index 8814d60..c4c4339 100644 --- a/incognia/api.py +++ b/incognia/api.py @@ -6,11 +6,12 @@ from .exceptions import IncogniaHTTPError, IncogniaError from .json_util import encode from .models import Coordinates, StructuredAddress, TransactionAddress, PaymentValue, PaymentMethod +from .singleton import Singleton from .token_manager import TokenManager from .base_request import BaseRequest, JSON_CONTENT_HEADER -class IncogniaAPI: +class IncogniaAPI(metaclass=Singleton): def __init__(self, client_id: str, client_secret: str): self.__token_manager = TokenManager(client_id, client_secret) self.__request = BaseRequest() diff --git a/incognia/singleton.py b/incognia/singleton.py new file mode 100644 index 0000000..7573028 --- /dev/null +++ b/incognia/singleton.py @@ -0,0 +1,8 @@ + +class Singleton(type): + _instances = {} + + def __call__(cls, *args, **kwargs): + if cls not in cls._instances: + cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs) + return cls._instances[cls] diff --git a/tests/test_api.py b/tests/test_api.py index a7952cd..de7df22 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -136,6 +136,12 @@ class TestIncogniaAPI(TestCase): }) DEFAULT_PARAMS: Final[None] = None + def test_metaclass_singleton_should_always_return_the_same_instance(self): + api1 = IncogniaAPI(self.CLIENT_ID, self.CLIENT_SECRET) + api2 = IncogniaAPI(self.CLIENT_ID, self.CLIENT_SECRET) + + self.assertEqual(api1, api2) + @patch.object(BaseRequest, 'post') @patch.object(TokenManager, 'get', return_value=TOKEN_VALUES) def test_register_new_signup_when_installation_id_is_valid_should_return_a_valid_dict(