22Configuration for LaunchDarkly's data acquisition strategy.
33"""
44
5- from typing import Callable , List , Optional , TypeVar
5+ from typing import List , Optional
66
7- from ldclient .config import Config as LDConfig
8- from ldclient .config import DataSystemConfig
7+ from ldclient .config import DataSourceBuilder , DataSystemConfig
98from ldclient .impl .datasourcev2 .polling import (
10- PollingDataSource ,
11- PollingDataSourceBuilder ,
12- Urllib3FDv1PollingRequester ,
13- Urllib3PollingRequester
14- )
15- from ldclient .impl .datasourcev2 .streaming import (
16- StreamingDataSource ,
17- StreamingDataSourceBuilder
9+ FallbackToFDv1PollingDataSourceBuilder ,
10+ PollingDataSourceBuilder
1811)
12+ from ldclient .impl .datasourcev2 .streaming import StreamingDataSourceBuilder
1913from ldclient .impl .integrations .files .file_data_sourcev2 import (
20- _FileDataSourceV2
14+ FileDataSourceV2Builder
2115)
2216from ldclient .interfaces import (
2317 DataStoreMode ,
2620 Synchronizer
2721)
2822
29- T = TypeVar ("T" )
30-
31- Builder = Callable [[LDConfig ], T ]
32-
3323
3424class ConfigBuilder : # pylint: disable=too-few-public-methods
3525 """
3626 Builder for the data system configuration.
3727 """
3828
3929 def __init__ (self ) -> None :
40- self ._initializers : Optional [List [Builder [Initializer ]]] = None
41- self ._primary_synchronizer : Optional [Builder [Synchronizer ]] = None
42- self ._secondary_synchronizer : Optional [Builder [Synchronizer ]] = None
43- self ._fdv1_fallback_synchronizer : Optional [Builder [Synchronizer ]] = None
30+ self ._initializers : Optional [List [DataSourceBuilder [Initializer ]]] = None
31+ self ._synchronizers : List [DataSourceBuilder [Synchronizer ]] = []
32+ self ._fdv1_fallback_synchronizer : Optional [DataSourceBuilder [Synchronizer ]] = None
4433 self ._store_mode : DataStoreMode = DataStoreMode .READ_ONLY
4534 self ._data_store : Optional [FeatureStore ] = None
4635
47- def initializers (self , initializers : Optional [List [Builder [Initializer ]]]) -> "ConfigBuilder" :
36+ def initializers (self , initializers : Optional [List [DataSourceBuilder [Initializer ]]]) -> "ConfigBuilder" :
4837 """
4938 Sets the initializers for the data system.
5039 """
@@ -53,19 +42,28 @@ def initializers(self, initializers: Optional[List[Builder[Initializer]]]) -> "C
5342
5443 def synchronizers (
5544 self ,
56- primary : Builder [Synchronizer ],
57- secondary : Optional [Builder [Synchronizer ]] = None ,
45+ * sync_builders : DataSourceBuilder [Synchronizer ]
5846 ) -> "ConfigBuilder" :
5947 """
6048 Sets the synchronizers for the data system.
49+
50+ Accepts one or more synchronizer builders, ordered by preference.
51+ The first synchronizer is the most preferred, with subsequent
52+ synchronizers serving as fallbacks in order of decreasing preference.
53+
54+ Examples:
55+ builder.synchronizers(streaming_builder)
56+ builder.synchronizers(streaming_builder, polling_builder)
57+ builder.synchronizers(sync1, sync2, sync3)
6158 """
62- self ._primary_synchronizer = primary
63- self ._secondary_synchronizer = secondary
59+ if len (sync_builders ) == 0 :
60+ raise ValueError ("At least one synchronizer must be provided" )
61+ self ._synchronizers = list (sync_builders )
6462 return self
6563
6664 def fdv1_compatible_synchronizer (
6765 self ,
68- fallback : Builder [Synchronizer ]
66+ fallback : DataSourceBuilder [Synchronizer ]
6967 ) -> "ConfigBuilder" :
7068 """
7169 Configures the SDK with a fallback synchronizer that is compatible with
@@ -86,53 +84,41 @@ def build(self) -> DataSystemConfig:
8684 """
8785 Builds the data system configuration.
8886 """
89- if self ._secondary_synchronizer is not None and self ._primary_synchronizer is None :
90- raise ValueError ("Primary synchronizer must be set if secondary is set" )
91-
9287 return DataSystemConfig (
9388 initializers = self ._initializers ,
94- primary_synchronizer = self ._primary_synchronizer ,
95- secondary_synchronizer = self ._secondary_synchronizer ,
89+ synchronizers = self ._synchronizers if len (self ._synchronizers ) > 0 else None ,
9690 fdv1_fallback_synchronizer = self ._fdv1_fallback_synchronizer ,
9791 data_store_mode = self ._store_mode ,
9892 data_store = self ._data_store ,
9993 )
10094
10195
102- def polling_ds_builder () -> Builder [PollingDataSource ]:
103- def builder (config : LDConfig ) -> PollingDataSource :
104- requester = Urllib3PollingRequester (config )
105- polling_ds = PollingDataSourceBuilder (config )
106- polling_ds .requester (requester )
107-
108- return polling_ds .build ()
109-
110- return builder
111-
112-
113- def fdv1_fallback_ds_builder () -> Builder [PollingDataSource ]:
114- def builder (config : LDConfig ) -> PollingDataSource :
115- requester = Urllib3FDv1PollingRequester (config )
116- polling_ds = PollingDataSourceBuilder (config )
117- polling_ds .requester (requester )
118-
119- return polling_ds .build ()
120-
121- return builder
96+ def polling_ds_builder () -> PollingDataSourceBuilder :
97+ """
98+ Returns a builder for a polling data source.
99+ """
100+ return PollingDataSourceBuilder ()
122101
123102
124- def streaming_ds_builder () -> Builder [StreamingDataSource ]:
125- def builder (config : LDConfig ) -> StreamingDataSource :
126- return StreamingDataSourceBuilder (config ).build ()
103+ def fdv1_fallback_ds_builder () -> FallbackToFDv1PollingDataSourceBuilder :
104+ """
105+ Returns a builder for a Flag Delivery v1 compatible fallback polling data source.
106+ """
107+ return FallbackToFDv1PollingDataSourceBuilder ()
127108
128- return builder
129109
110+ def streaming_ds_builder () -> StreamingDataSourceBuilder :
111+ """
112+ Returns a builder for a streaming data source.
113+ """
114+ return StreamingDataSourceBuilder ()
130115
131- def file_ds_builder (paths : List [str ]) -> Builder [Initializer ]:
132- def builder (_ : LDConfig ) -> Initializer :
133- return _FileDataSourceV2 (paths )
134116
135- return builder
117+ def file_ds_builder (paths : List [str ]) -> FileDataSourceV2Builder :
118+ """
119+ Returns a builder for a file-based data source.
120+ """
121+ return FileDataSourceV2Builder (paths )
136122
137123
138124def default () -> ConfigBuilder :
@@ -185,7 +171,7 @@ def polling() -> ConfigBuilder:
185171 streaming, but may be necessary in some network environments.
186172 """
187173
188- polling_builder : Builder [Synchronizer ] = polling_ds_builder ()
174+ polling_builder : DataSourceBuilder [Synchronizer ] = polling_ds_builder ()
189175 fallback = fdv1_fallback_ds_builder ()
190176
191177 builder = ConfigBuilder ()
0 commit comments