-
Notifications
You must be signed in to change notification settings - Fork 19
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat: Add async functionality to providers #413
base: main
Are you sure you want to change the base?
feat: Add async functionality to providers #413
Conversation
c003a56
to
4ec15be
Compare
Codecov ReportAttention: Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## main #413 +/- ##
==========================================
+ Coverage 97.55% 97.72% +0.16%
==========================================
Files 31 32 +1
Lines 1393 1629 +236
==========================================
+ Hits 1359 1592 +233
- Misses 34 37 +3
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Sentry. |
Hey @leohoare, this looks good so far. Could you please add tests covering async providers with sync client calls and vise versa? Thanks for your hard work on this. 🍻 |
86c64df
to
bb9a4e6
Compare
Thanks @beeme1mr, I've added some tests and addressed the coverage issues. One thing to note is sync methods are always enforced on async providers. Is this clear enough from the documentation? |
5142300
to
5d34cd8
Compare
Sorry, I didn't get a chance to look at this today. It's on my to-do for tomorrow. |
No rush, I'll be off grid over the weekend anyway. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hey @leohoare, this looks good from what I can tell but I wouldn't consider myself a Python expert.
I see you have tests but would you mind also enumerating the expected behavior for the following scenarios?
- performing an async evaluation on a synonymous provider
- performing a sync evaluation on an async provider that implements the AbstractProvider
I believe I understand how everything will behave but I'd like to confirm.
Also, could someone with more Python experience please weigh in when you have a moment? FYI, @aepfli @guidobrei @federicobond @jamescarr @lukas-reining @toddbaert
Do you mean explain the scenarios or update the tests?
If async evaluation is not implemented, it will fall back to calling the synchronous function.
a provider that implements async calls is forced to implement sync functions.
If the provider chooses to only implement async functions and throw an error on the sync functions.
We're essentially offloading the decision to the provider on how to handle async/sync calls. Implementing the async calls is optional and defaults to sync when not implemented. |
3db8642
to
e51451d
Compare
Signed-off-by: leohoare <[email protected]>
Signed-off-by: leohoare <[email protected]>
Signed-off-by: leohoare <[email protected]>
… imports) Signed-off-by: leohoare <[email protected]>
Missed auto format Signed-off-by: Leo <[email protected]> Signed-off-by: leohoare <[email protected]>
e51451d
to
72d69d5
Compare
Sorry keep forgetting to sign-off the commits -.- |
I've approved because I'm good with the approach. Hopefully others with more Python experience can also provide some thoughts. |
Sorry for the late reply, I have been on vacation. Will have a look in the next 1 or 2 days :) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This looks good to me! I think we should mention the fallback mechanism in the documentation to avoid confusion. Users might expect asynchronous execution when calling those async functions, but they actually get synchronous function execution.
Signed-off-by: leohoare <[email protected]>
…terhooks and update readme with async doco Signed-off-by: leohoare <[email protected]>
I've updated the readme to include the suggestion @ChihweiLHBird, as well a general usage code block. @chrfwow due to the refactoring required in this PR, some of your recent merge had to be moved. |
Signed-off-by: leohoare <[email protected]>
Signed-off-by: leohoare <[email protected]>
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The changes of my latest additions seem fine so far, but I have a few other questions
@@ -295,54 +461,224 @@ def evaluate_flag_details( # noqa: PLR0915 | |||
reversed_merged_hooks = merged_hooks[:] | |||
reversed_merged_hooks.reverse() | |||
|
|||
return provider, hook_context, hook_hints, merged_hooks, reversed_merged_hooks | |||
|
|||
def _assert_provider_status( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
From the function name _assert_provider_status
I would expect the function to throw an error when the provider is not ready. I would not expect the function to have any side effects like invoking hooks.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
How about _validate_provider_status
? or do you have any other suggestions?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Wouldn't it be possible to just throw the proper exception (both ProviderNotReadyError
and ProviderFatalError
are instances of OpenFeatureError
, so the exception handling should work)? This function is called inside the try catch block, so the error hooks will also be called this way.
If not, I would go for a name like _handle_provider_not_ready
, but I don't like that name either
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This code previously wasn't in the try catch. Although with your refactor, we should be able to throw exceptions here now.
I'll look into this today.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Good catch, this simplified the logic a lot.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nice work, just added a few comments
Greets everyone! I'd like to get this merged by the end of the week if possible. Please leave you feedback ASAP if you have any concerns. Thanks! @leohoare, thanks for you hard work and patience. It's important that we have consensus when making changes to the public APIs. So changes like this tend to take a while. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks good to me, left one question :)
Thank you very much!
README.md
Outdated
@@ -109,6 +109,7 @@ print("Value: " + str(flag_value)) | |||
| ✅ | [Eventing](#eventing) | React to state changes in the provider or flag management system. | | |||
| ✅ | [Shutdown](#shutdown) | Gracefully clean up a provider during application shutdown. | | |||
| ✅ | [Transaction Context Propagation](#transaction-context-propagation) | Set a specific [evaluation context](/docs/reference/concepts/evaluation-context) for a transaction (e.g. an HTTP request or a thread) | | |||
| ✅ | [Asynchronous Feature Retrieval](#asynchronous-feature-retrieval) | Evaluate flags in an asychronous context. | |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Not sure if we should add this here.
For JS we do not consider this as a feature and the feature list generally lists features that are "explicitly specified".
So for consistency I think it would make sense to leave it out or alternatively add it to the JS SDK readme.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@lukas-reining fair call, I'll leave it out.
Just the row in the table or the section Asynchronous Feature Retrieval
as well?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I would say only in the table.
Having it in the README can make sense to me :)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I would say only in the table.
Having it in the README can make sense to me :)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Alright, I've removed the row from the table.
Signed-off-by: leohoare <[email protected]>
Signed-off-by: leohoare <[email protected]>
This PR
Adds the ability for open feature providers to use async methods
It extends the single client and attempts to refactor some code
Related Issues
#284
#383
#385
Follow-up Tasks & TODOS