Source code for descarteslabs.common.http.service

# Copyright 2018-2023 Descartes Labs.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.


class DefaultClientMixin:
    """
    Provides common service functionality to HTTP and Grpc clients.
    """

    @classmethod
    def get_default_client(cls):
        """Retrieve the default client.

        This client is used whenever you don't explicitly set the client.
        """

        instance = getattr(cls, "_instance", None)

        if not isinstance(instance, cls):
            instance = cls()
            cls._instance = instance

        return instance

    @classmethod
    def set_default_client(cls, client):
        """Change the default client to the given client.

        This is the client that will be used whenever you don't explicitly set the
        client
        """

        if not isinstance(client, cls):
            raise ValueError(f"client must be an instance of {cls.__name__}")

        cls._instance = client

    @classmethod
    def clear_all_default_clients(cls):
        """Clear all default clients of this class and all its subclasses."""

        cls._instance = None

        for subclass in cls.__subclasses__():
            subclass.clear_all_default_clients()