The _client_handlers dictionary allowed modifications during iteration
without proper concurrency control. I added some reentrant locks to manage
concurrent access to the _global_handlers and _client_handlers data
structures.
See #326
Signed-off-by: Federico Bond <federicobond@gmail.com>
* feat: implement provider events
Signed-off-by: Federico Bond <federicobond@gmail.com>
* feat: add error_code field to EventDetails and ProviderEventDetails
Signed-off-by: Federico Bond <federicobond@gmail.com>
* fix: replace strings with postponed evaluation of annotations
Signed-off-by: Federico Bond <federicobond@gmail.com>
* feat: run handlers immediately if provider already in associated state
Signed-off-by: Federico Bond <federicobond@gmail.com>
* feat: remove unused _provider from openfeature.api
Signed-off-by: Federico Bond <federicobond@gmail.com>
* test: add some comments to test cases
Signed-off-by: Federico Bond <federicobond@gmail.com>
* test: add provider event late binding test cases
Signed-off-by: Federico Bond <federicobond@gmail.com>
* fix: fix status handlers running immediately if provider already in associated state
Signed-off-by: Federico Bond <federicobond@gmail.com>
* refactor: reuse provider property in OpenFeatureClient
Signed-off-by: Federico Bond <federicobond@gmail.com>
* refactor: move _provider_status_to_event to ProviderEvent.from_provider_status
Signed-off-by: Federico Bond <federicobond@gmail.com>
* refactor: move EventSupport class to an internal module
Signed-off-by: Federico Bond <federicobond@gmail.com>
* refactor: replace EventSupport class with module-level functions
Signed-off-by: Federico Bond <federicobond@gmail.com>
* style: fix code style
---------
Signed-off-by: Federico Bond <federicobond@gmail.com>
* fix: run error hooks if provider returns FlagResolutionDetails with non-empty error_code
Signed-off-by: Federico Bond <federicobond@gmail.com>
* refactor: extract error code to exception mapping to class variable
Signed-off-by: Federico Bond <federicobond@gmail.com>
---------
Signed-off-by: Federico Bond <federicobond@gmail.com>
* feat: implement provider status
Signed-off-by: Federico Bond <federicobond@gmail.com>
* feat: set provider status to fatal if initialize raises PROVIDER_FATAL error
Signed-off-by: Federico Bond <federicobond@gmail.com>
* feat: add a provider status accessor to clients
Signed-off-by: Federico Bond <federicobond@gmail.com>
* feat: short circuit flag resolution when provider is not ready
Signed-off-by: Federico Bond <federicobond@gmail.com>
---------
Signed-off-by: Federico Bond <federicobond@gmail.com>
* feat: add support for domains
Signed-off-by: Federico Bond <federicobond@gmail.com>
* docs: update README.md
Signed-off-by: Federico Bond <federicobond@gmail.com>
* feat: add clear_providers function to api
Signed-off-by: Federico Bond <federicobond@gmail.com>
* feat: make _get_provider function private
Signed-off-by: Federico Bond <federicobond@gmail.com>
* fix: shutdown all providers on api.shutdown
Signed-off-by: Federico Bond <federicobond@gmail.com>
* refactor: move provider dict to a ProviderRegistry class
Signed-off-by: Federico Bond <federicobond@gmail.com>
* feat: reset default provider on clear_providers and add tests
Signed-off-by: Federico Bond <federicobond@gmail.com>
* docs: update README.md
Signed-off-by: Federico Bond <federicobond@gmail.com>
---------
Signed-off-by: Federico Bond <federicobond@gmail.com>
* refactor!: simplify namespaces to make public API more pythonic
Signed-off-by: Federico Bond <federicobond@gmail.com>
Co-authored-by: Michael Beemer <beeme1mr@users.noreply.github.com>
Co-authored-by: Todd Baert <todd.baert@dynatrace.com>