88from collections import namedtuple
99from threading import Event
1010from time import time
11- from typing import Generator , Optional , Protocol
11+ from typing import Generator , Mapping , Optional , Protocol , Tuple
1212from urllib import parse
1313
1414import urllib3
1515
16- from ldclient .impl .datasourcev2 import BasisResult , PollingResult , Update
16+ from ldclient .config import Config
17+ from ldclient .impl .datasystem import BasisResult , Update
1718from ldclient .impl .datasystem .protocolv2 import (
1819 Basis ,
1920 ChangeSet ,
4647POLLING_ENDPOINT = "/sdk/poll"
4748
4849
49- CacheEntry = namedtuple ( "CacheEntry" , [ "data" , "etag" ])
50+ PollingResult = _Result [ Tuple [ ChangeSet , Mapping ], str ]
5051
5152
5253class Requester (Protocol ): # pylint: disable=too-few-public-methods
@@ -68,6 +69,9 @@ def fetch(self, selector: Optional[Selector]) -> PollingResult:
6869 raise NotImplementedError
6970
7071
72+ CacheEntry = namedtuple ("CacheEntry" , ["data" , "etag" ])
73+
74+
7175class PollingDataSource :
7276 """
7377 PollingDataSource is a data source that can retrieve information from
@@ -206,7 +210,7 @@ class Urllib3PollingRequester:
206210 requests.
207211 """
208212
209- def __init__ (self , config ):
213+ def __init__ (self , config : Config ):
210214 self ._etag = None
211215 self ._http = _http_factory (config ).create_pool_manager (1 , config .base_uri )
212216 self ._config = config
@@ -335,3 +339,30 @@ def polling_payload_to_changeset(data: dict) -> _Result[ChangeSet, str]:
335339 )
336340
337341 return _Fail (error = "didn't receive any known protocol events in polling payload" )
342+
343+
344+ class PollingDataSourceBuilder :
345+ """
346+ Builder for a PollingDataSource.
347+ """
348+
349+ def __init__ (self , config : Config ):
350+ self ._config = config
351+ self ._requester : Optional [Requester ] = None
352+
353+ def requester (self , requester : Requester ) -> "PollingDataSourceBuilder" :
354+ """Sets a custom Requester for the PollingDataSource."""
355+ self ._requester = requester
356+ return self
357+
358+ def build (self ) -> PollingDataSource :
359+ """Builds the PollingDataSource with the configured parameters."""
360+ requester = (
361+ self ._requester
362+ if self ._requester is not None
363+ else Urllib3PollingRequester (self ._config )
364+ )
365+
366+ return PollingDataSource (
367+ poll_interval = self ._config .poll_interval , requester = requester
368+ )
0 commit comments