diff --git a/fbclient/client.py b/fbclient/client.py index 225663f..0909378 100644 --- a/fbclient/client.py +++ b/fbclient/client.py @@ -14,7 +14,6 @@ from fbclient.event_types import FlagEvent, Metric, MetricEvent, UserEvent from fbclient.interfaces import DataUpdateStatusProvider from fbclient.status import DataUpdateStatusProviderImpl -from fbclient.status_types import State from fbclient.streaming import Streaming, _data_to_dict from fbclient.update_processor import NullUpdateProcessor from fbclient.utils import (cast_variation_by_flag_type, check_uwsgi, log, @@ -67,7 +66,10 @@ def __init__(self, config: Config, start_wait: float = 15.): raise ValueError("Config is not valid") self._config = config - self._config.validate() + if self._config.is_offline: + log.info("FB Python SDK: SDK is in offline mode") + else: + self._config.validate() # init components # event processor @@ -90,15 +92,11 @@ def __init__(self, config: Config, start_wait: float = 15.): if not isinstance(self._update_processor, NullUpdateProcessor): log.info("FB Python SDK: Waiting for Client initialization in %s seconds" % str(start_wait)) - if isinstance(self._data_storage, NullDataStorage) or not self._data_storage.initialized: + if isinstance(self._data_storage, NullDataStorage) or (not self._data_storage.initialized and not self._config.is_offline): log.warning("FB Python SDK: SDK just returns default variation because of no data found in the given environment") update_processor_ready.wait(start_wait) - if self._config.is_offline: - log.info("FB Python SDK: SDK is in offline mode") - elif self._update_processor.initialized: - log.info("FB Python SDK: SDK initialization is completed") - else: + if not self._update_processor.initialized: log.warning("FB Python SDK: SDK was not successfully initialized") else: log.info("FB Python SDK: SDK starts in asynchronous mode") @@ -374,13 +372,10 @@ def initialize_from_external_json(self, json_str: str) -> bool: :param json_str: feature flags, segments...etc in the json format :return: True if the initialization is well done """ - if self._config.is_offline and json_str: + if self._config.is_offline: all_data = json.loads(json_str) if valide_all_data(all_data): version, data = _data_to_dict(all_data['data']) - res = self._update_status_provider.init(data, version) - if res: - self._update_status_provider.update_state(State.ok_state()) - return res + return self._update_status_provider.init(data, version) return False diff --git a/fbclient/update_processor.py b/fbclient/update_processor.py index 0689b8d..c1a6916 100644 --- a/fbclient/update_processor.py +++ b/fbclient/update_processor.py @@ -1,15 +1,18 @@ from threading import Event from fbclient.config import Config from fbclient.interfaces import DataUpdateStatusProvider, UpdateProcessor +from fbclient.status_types import State class NullUpdateProcessor(UpdateProcessor): def __init__(self, config: Config, dataUpdateStatusProvider: DataUpdateStatusProvider, ready: Event): self.__ready = ready + self.__store = dataUpdateStatusProvider def start(self): self.__ready.set() + self.__store.update_state(State.ok_state()) def stop(self): pass diff --git a/fbclient/version.py b/fbclient/version.py index 2a3eb2f..ca638cf 100644 --- a/fbclient/version.py +++ b/fbclient/version.py @@ -1 +1 @@ -VERSION = "1.1.0" +VERSION = "1.1.1" diff --git a/setup.py b/setup.py index 56d21d4..d4012cb 100644 --- a/setup.py +++ b/setup.py @@ -39,7 +39,7 @@ def parse_requirements(filename): long_description_content_type='text/markdown', install_requires=base_reqs, classifiers=[ - 'Development Status :: 4 - Beta', + 'Development Status :: 5 - Production/Stable', 'Intended Audience :: Developers', 'License :: OSI Approved :: Apache Software License', 'Operating System :: OS Independent', diff --git a/tests/test_fbclient.py b/tests/test_fbclient.py index d85bff8..031b673 100644 --- a/tests/test_fbclient.py +++ b/tests/test_fbclient.py @@ -93,15 +93,20 @@ def start(): assert not client.initialize +def test_start_and_nowait(): + with make_fb_client(NullUpdateProcessor, NullEventProcessor, start_wait=0) as client: + assert client.update_status_provider.wait_for_OKState(timeout=0.1) + assert client.initialize + + @patch.object(NullUpdateProcessor, "start") -def test_start_and_nowait(mock_start_method): +def test_start_nowait_and_timeout(mock_start_method): def start(): pass mock_start_method.side_effect = start with make_fb_client(NullUpdateProcessor, NullEventProcessor, start_wait=0) as client: - assert not client.initialize - sleep(0.1) assert not client.update_status_provider.wait_for_OKState(timeout=0.1) + assert not client.initialize @patch.object(NullUpdateProcessor, "start")