Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 7 additions & 7 deletions CHANGELOG.md

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,10 @@
import threading
from typing import Any, Dict, Optional

from UnleashClient._transport import AlreadyClosedError, FetchResult, _normalized_url
from UnleashClient.config import UnleashConfig
from UnleashClient.constants import FEATURES_URL, METRICS_URL, REGISTER_URL
from UnleashClient.headers import HeaderFactory
from UnleashClient.transport import AlreadyClosedError, FetchResult, _normalized_url
from UnleashClient.utils import LOGGER

try:
Expand All @@ -33,8 +33,8 @@ async def _log_resp_info(resp: "aiohttp.ClientResponse") -> None:
LOGGER.debug("HTTP content: %s", await resp.text())


class AsyncTransport:
"""The asyncio twin of :class:`UnleashClient.transport.Transport`."""
class _AsyncTransport:
"""The asyncio twin of :class:`UnleashClient._transport._Transport`."""

def __init__(self, config: UnleashConfig, headers: HeaderFactory) -> None:
"""
Expand Down
2 changes: 1 addition & 1 deletion UnleashClient/transport.py → UnleashClient/_transport.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ def _log_resp_info(resp: Response) -> None:
LOGGER.debug("HTTP content: %s", resp.text)


class Transport:
class _Transport:
"""
Sends the SDK's requests to the Unleash server: feature fetches, client
registration and metrics submission.
Expand Down
6 changes: 3 additions & 3 deletions UnleashClient/async_metrics_reporter.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
from yggdrasil_engine.engine import UnleashEngine

from UnleashClient._async_scheduler import _AsyncJob, _AsyncScheduler
from UnleashClient.async_transport import AsyncTransport
from UnleashClient._async_transport import _AsyncTransport
from UnleashClient.config import UnleashConfig
from UnleashClient.impact_metrics import ImpactMetrics
from UnleashClient.payloads import build_metrics_payload
Expand Down Expand Up @@ -38,13 +38,13 @@ class AsyncMetricsReporter:
def __init__(
self,
config: UnleashConfig,
transport: AsyncTransport,
transport: _AsyncTransport,
scheduler: _AsyncScheduler,
engine: UnleashEngine,
impact_metrics: ImpactMetrics,
) -> None:
self._config: UnleashConfig = config
self._transport: AsyncTransport = transport
self._transport: _AsyncTransport = transport
self._scheduler: _AsyncScheduler = scheduler
self._engine: UnleashEngine = engine
self._impact_metrics: ImpactMetrics = impact_metrics
Expand Down
4 changes: 2 additions & 2 deletions UnleashClient/clients/async_unleash_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,10 @@
from yggdrasil_engine.engine import UnleashEngine

from UnleashClient._async_scheduler import _AsyncScheduler
from UnleashClient._async_transport import _AsyncTransport
from UnleashClient._evaluator import _Evaluator
from UnleashClient._instance_registry import _get_instance_registry
from UnleashClient.async_metrics_reporter import AsyncMetricsReporter
from UnleashClient.async_transport import AsyncTransport
from UnleashClient.cache import BaseCache, FileCache
from UnleashClient.config import ExperimentalMode, UnleashConfig
from UnleashClient.constants import REQUEST_RETRIES, REQUEST_TIMEOUT
Expand Down Expand Up @@ -113,7 +113,7 @@ def __init__( # noqa: PLR0913, PLR0917
config=self._config,
events=self._event_dispatcher,
)
self._transport: AsyncTransport = AsyncTransport(self._config, self._headers)
self._transport: _AsyncTransport = _AsyncTransport(self._config, self._headers)
self._scheduler: _AsyncScheduler = _AsyncScheduler()
self._metrics: AsyncMetricsReporter = AsyncMetricsReporter(
config=self._config,
Expand Down
4 changes: 2 additions & 2 deletions UnleashClient/clients/unleash_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
from UnleashClient._evaluator import _Evaluator
from UnleashClient._instance_registry import _get_instance_registry
from UnleashClient._scheduler import _ScheduledJob, _Scheduler
from UnleashClient._transport import _Transport
from UnleashClient.cache import BaseCache, FileCache
from UnleashClient.config import (
ExperimentalMode,
Expand Down Expand Up @@ -43,7 +44,6 @@
from UnleashClient.metrics_reporter import MetricsReporter
from UnleashClient.payloads import build_register_payload
from UnleashClient.store import FeatureStore
from UnleashClient.transport import Transport
from UnleashClient.utils import (
LOGGER,
InstanceAllowType,
Expand Down Expand Up @@ -218,7 +218,7 @@ def __init__( # noqa: PLR0913, PLR0917
events=self.__events,
)

self._transport = Transport(self._config, self._headers)
self._transport = _Transport(self._config, self._headers)

self._scheduler = _Scheduler(scheduler, scheduler_executor)

Expand Down
6 changes: 3 additions & 3 deletions UnleashClient/connectors/_async_connector.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from typing import Optional

from UnleashClient._async_scheduler import _AsyncScheduler
from UnleashClient.async_transport import AsyncTransport
from UnleashClient._async_transport import _AsyncTransport
from UnleashClient.store import FeatureStore


Expand Down Expand Up @@ -43,7 +43,7 @@ class _AsyncPollingConnector(_AsyncBaseConnector):
def __init__(
self,
store: FeatureStore,
transport: AsyncTransport,
transport: _AsyncTransport,
refresh_interval: float = 15,
refresh_jitter: Optional[float] = None,
) -> None:
Expand All @@ -55,7 +55,7 @@ def __init__(
None for no jitter.
"""
super().__init__(store)
self._transport: AsyncTransport = transport
self._transport: _AsyncTransport = transport
self._refresh_interval = refresh_interval
self._refresh_jitter = refresh_jitter
self._scheduler: _AsyncScheduler = _AsyncScheduler()
Expand Down
6 changes: 3 additions & 3 deletions UnleashClient/connectors/polling_connector.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
from typing import Optional

from UnleashClient._scheduler import _ScheduledJob, _Scheduler
from UnleashClient._transport import _Transport
from UnleashClient.store import FeatureStore
from UnleashClient.transport import Transport

from .base_connector import BaseConnector

Expand All @@ -14,7 +14,7 @@ def __init__(
self,
store: FeatureStore,
scheduler: _Scheduler,
transport: Transport,
transport: _Transport,
refresh_interval: int = 15,
refresh_jitter: Optional[int] = None,
):
Expand All @@ -26,7 +26,7 @@ def __init__(
"""
super().__init__(store)
self.scheduler: _Scheduler = scheduler
self.transport: Transport = transport
self.transport: _Transport = transport
self.refresh_interval = refresh_interval
self.refresh_jitter = refresh_jitter
self.job: _ScheduledJob = None
Expand Down
2 changes: 1 addition & 1 deletion UnleashClient/headers.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ class HeaderFactory:
Every method returns a fresh dict and reads the config on each call, so
reassigning or mutating ``config.custom_headers`` (which
``UnleashClient.unleash_custom_headers`` allows) is picked up by the next
call. :class:`~UnleashClient.transport.Transport` holds the factory and asks
call. :class:`~UnleashClient._transport._Transport` holds the factory and asks
it once per request, so a change reaches the wire on the next poll or send.
The client still calls ``streaming()`` once, at initialization, and hands the
dict to the connector; that one keeps the headers it was given.
Expand Down
6 changes: 3 additions & 3 deletions UnleashClient/metrics_reporter.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@
from yggdrasil_engine.engine import UnleashEngine

from UnleashClient._scheduler import _ScheduledJob, _Scheduler
from UnleashClient._transport import _Transport
from UnleashClient.config import UnleashConfig
from UnleashClient.impact_metrics import ImpactMetrics
from UnleashClient.payloads import build_metrics_payload
from UnleashClient.transport import Transport
from UnleashClient.utils import LOGGER


Expand All @@ -19,13 +19,13 @@ class MetricsReporter:
def __init__(
self,
config: UnleashConfig,
transport: Transport,
transport: _Transport,
scheduler: _Scheduler,
engine: UnleashEngine,
impact_metrics: ImpactMetrics,
) -> None:
self._config: UnleashConfig = config
self._transport: Transport = transport
self._transport: _Transport = transport
self._scheduler: _Scheduler = scheduler
self._engine: UnleashEngine = engine
self._impact_metrics: ImpactMetrics = impact_metrics
Expand Down
4 changes: 2 additions & 2 deletions tests/unit_tests/connectors/test_async_connector.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
from tests.utilities.fake_unleash_server import FakeUnleash
from tests.utilities.mocks.mock_features import MOCK_FEATURE_RESPONSE
from tests.utilities.testing_constants import APP_NAME, ETAG_VALUE
from UnleashClient.async_transport import AsyncTransport
from UnleashClient._async_transport import _AsyncTransport
from UnleashClient.config import UnleashConfig
from UnleashClient.connectors._async_connector import _AsyncPollingConnector
from UnleashClient.constants import ETAG, FEATURES_URL
Expand Down Expand Up @@ -43,7 +43,7 @@ def _build_connector(
store: FeatureStore, refresh_interval: float = INTERVAL
) -> _AsyncPollingConnector:
config = UnleashConfig(server.base_url, APP_NAME, request_retries=0)
transport = AsyncTransport(config, HeaderFactory(config))
transport = _AsyncTransport(config, HeaderFactory(config))
connector = _AsyncPollingConnector(
store=store, transport=transport, refresh_interval=refresh_interval
)
Expand Down
6 changes: 3 additions & 3 deletions tests/unit_tests/connectors/test_polling_connector.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,18 +19,18 @@
URL,
)
from UnleashClient._scheduler import _Scheduler
from UnleashClient._transport import _Transport
from UnleashClient.config import UnleashConfig
from UnleashClient.connectors import PollingConnector
from UnleashClient.constants import ETAG, FEATURES_URL
from UnleashClient.events import EventDispatcher, UnleashEventType
from UnleashClient.headers import HeaderFactory
from UnleashClient.store import FeatureStore
from UnleashClient.transport import Transport

FULL_FEATURE_URL = URL + FEATURES_URL


def build_transport(**kwargs) -> Transport:
def build_transport(**kwargs) -> _Transport:
defaults = {
"instance_id": INSTANCE_ID,
"custom_headers": CUSTOM_HEADERS,
Expand All @@ -40,7 +40,7 @@ def build_transport(**kwargs) -> Transport:
}
defaults.update(kwargs)
config = UnleashConfig(URL, APP_NAME, **defaults)
return Transport(config, HeaderFactory(config))
return _Transport(config, HeaderFactory(config))


@responses.activate
Expand Down
6 changes: 3 additions & 3 deletions tests/unit_tests/test_async_metrics_reporter.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@
_AsyncJobFn,
_AsyncScheduler,
)
from UnleashClient._async_transport import _AsyncTransport
from UnleashClient.async_metrics_reporter import AsyncMetricsReporter
from UnleashClient.async_transport import AsyncTransport
from UnleashClient.config import UnleashConfig
from UnleashClient.constants import CLIENT_SPEC_VERSION, METRICS_URL
from UnleashClient.headers import HeaderFactory
Expand Down Expand Up @@ -114,7 +114,7 @@ def _build_reporter(impact_metrics=None, **kwargs) -> AsyncMetricsReporter:
engine = UnleashEngine()
reporter = AsyncMetricsReporter(
config=config,
transport=AsyncTransport(config, HeaderFactory(config)),
transport=_AsyncTransport(config, HeaderFactory(config)),
scheduler=RecordingScheduler(),
engine=engine,
impact_metrics=(
Expand Down Expand Up @@ -252,7 +252,7 @@ async def test_the_config_is_read_on_every_flush(server, reporter):
async def test_the_flush_goes_through_the_async_transport(reporter):
# The flush runs on the client's loop, so a blocking transport would hold it up for
# the length of every POST.
assert isinstance(reporter._transport, AsyncTransport)
assert isinstance(reporter._transport, _AsyncTransport)
assert asyncio.iscoroutinefunction(reporter._transport.send_metrics)
assert asyncio.iscoroutinefunction(reporter.flush)

Expand Down
10 changes: 5 additions & 5 deletions tests/unit_tests/test_async_transport.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,8 @@
REQUEST_RETRIES,
REQUEST_TIMEOUT,
)
from UnleashClient.async_transport import AsyncTransport
from UnleashClient._async_transport import _AsyncTransport
from UnleashClient._transport import AlreadyClosedError
from UnleashClient.config import UnleashConfig
from UnleashClient.constants import (
CLIENT_SPEC_VERSION,
Expand All @@ -31,7 +32,6 @@
REGISTER_URL,
)
from UnleashClient.headers import HeaderFactory
from UnleashClient.transport import AlreadyClosedError

API_PREFIX = "/api"
FEATURES_PATH = API_PREFIX + FEATURES_URL
Expand All @@ -58,7 +58,7 @@ async def build_transport(server: FakeUnleash):
"""
built = []

def _build_transport(**kwargs) -> AsyncTransport:
def _build_transport(**kwargs) -> _AsyncTransport:
defaults = {
"instance_id": INSTANCE_ID,
"custom_headers": CUSTOM_HEADERS,
Expand All @@ -67,7 +67,7 @@ def _build_transport(**kwargs) -> AsyncTransport:
}
defaults.update(kwargs)
config = UnleashConfig(server.base_url, APP_NAME, **defaults)
transport = AsyncTransport(config, HeaderFactory(config))
transport = _AsyncTransport(config, HeaderFactory(config))
built.append(transport)
return transport

Expand All @@ -79,7 +79,7 @@ def _build_transport(**kwargs) -> AsyncTransport:


@pytest_asyncio.fixture
async def transport(build_transport: Callable[..., AsyncTransport]) -> AsyncTransport:
async def transport(build_transport: Callable[..., _AsyncTransport]) -> _AsyncTransport:
"""The transport the tests that need no config override share."""
return build_transport()

Expand Down
4 changes: 2 additions & 2 deletions tests/unit_tests/test_metrics_reporter.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,12 @@
from yggdrasil_engine.engine import UnleashEngine

from UnleashClient._scheduler import _Scheduler
from UnleashClient._transport import _Transport
from UnleashClient.config import UnleashConfig
from UnleashClient.constants import CLIENT_SPEC_VERSION, METRICS_URL
from UnleashClient.headers import HeaderFactory
from UnleashClient.impact_metrics import ImpactMetrics
from UnleashClient.metrics_reporter import MetricsReporter
from UnleashClient.transport import Transport

URL = "http://localhost:4242/api"
APP_NAME = "pytest"
Expand Down Expand Up @@ -66,7 +66,7 @@ def build_reporter(scheduler=None, impact_metrics=None, **kwargs) -> MetricsRepo
engine = UnleashEngine()
return MetricsReporter(
config=config,
transport=Transport(config, HeaderFactory(config)),
transport=_Transport(config, HeaderFactory(config)),
scheduler=scheduler if scheduler is not None else _Scheduler(),
engine=engine,
impact_metrics=(
Expand Down
8 changes: 4 additions & 4 deletions tests/unit_tests/test_transport.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
REQUEST_TIMEOUT,
URL,
)
from UnleashClient._transport import _Transport
from UnleashClient.config import UnleashConfig
from UnleashClient.constants import (
CLIENT_SPEC_VERSION,
Expand All @@ -31,7 +32,6 @@
REGISTER_URL,
)
from UnleashClient.headers import HeaderFactory
from UnleashClient.transport import Transport

FULL_FEATURE_URL = URL + FEATURES_URL
FULL_REGISTER_URL = URL + REGISTER_URL
Expand All @@ -42,7 +42,7 @@
def build_transport():
"""Factory. Keyword arguments override the defaults on the config."""

def _build_transport(**kwargs) -> Transport:
def _build_transport(**kwargs) -> _Transport:
defaults = {
"instance_id": INSTANCE_ID,
"custom_headers": CUSTOM_HEADERS,
Expand All @@ -52,13 +52,13 @@ def _build_transport(**kwargs) -> Transport:
}
defaults.update(kwargs)
config = UnleashConfig(URL, APP_NAME, **defaults)
return Transport(config, HeaderFactory(config))
return _Transport(config, HeaderFactory(config))

return _build_transport


@pytest.fixture
def transport(build_transport) -> Transport:
def transport(build_transport) -> _Transport:
return build_transport()


Expand Down
Loading