Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

feat: AsyncIO Integration [Part 3]#29

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 ourterms of service andprivacy statement. We’ll occasionally send you account related emails.

Already on GitHub?Sign in to your account

Merged
busunkim96 merged 1 commit intogoogleapis:masterfromlidizheng:aio-part-3
Jun 4, 2020

Conversation

@lidizheng
Copy link
Contributor

Children PR of#26 and#28.

This PR includes AsyncIO version of:

  • LRO client
  • gRPC wrappers & helpers

Related#23

@googlebotgooglebot added the cla: yesThis human has signed the Contributor License Agreement. labelMay 18, 2020
@lidizhenglidizheng marked this pull request as ready for reviewMay 18, 2020 22:34
Comment on lines +237 to +270
classFakeUnaryUnaryCall(_WrappedUnaryUnaryCall):
"""Fake implementation for unary-unary RPCs.
It is a dummy object for response message. Supply the intended response
upon the initialization, and the coroutine will return the exact response
message.
"""

def__init__(self,response=object()):
self.response=response
self._future=asyncio.get_event_loop().create_future()
self._future.set_result(self.response)

def__await__(self):
response=yieldfromself._future.__await__()
returnresponse


classFakeStreamUnaryCall(_WrappedStreamUnaryCall):
"""Fake implementation for stream-unary RPCs.
It is a dummy object for response message. Supply the intended response
upon the initialization, and the coroutine will return the exact response
message.
"""

def__init__(self,response=object()):
self.response=response
self._future=asyncio.get_event_loop().create_future()
self._future.set_result(self.response)

def__await__(self):
response=yieldfromself._future.__await__()
returnresponse

asyncdefwait_for_connection(self):
pass
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

Are these intended for use by tests only? I'd prefer they be namedMock... instead ofFake... but don't feel too strongly about it.

Copy link
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

I consideredMock... naming, but they are not magic mock objects. It might misdirect users' expectation of its behavior. I'm happy to change if you have better naming.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

Let's leave it as is then.@software-dov do you have any thoughts here?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

+1 to not mock naming, although I'm a little confused as to why they don't live in the unit test file.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

I think leaving them here makes it easier for dependent libraries to use it in their own tests.

(HttpMock in the apiary library for instance)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

I think the 'correct' think to do then would be to have a testlib. I am in general not a fan of mixing test code and production code, but it's not a hill I'm willing to die on.

Copy link
ContributorAuthor

@lidizhenglidizheng left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

@busunkim96 Thank you for the suggestions. PTALA.

Comment on lines +237 to +270
classFakeUnaryUnaryCall(_WrappedUnaryUnaryCall):
"""Fake implementation for unary-unary RPCs.
It is a dummy object for response message. Supply the intended response
upon the initialization, and the coroutine will return the exact response
message.
"""

def__init__(self,response=object()):
self.response=response
self._future=asyncio.get_event_loop().create_future()
self._future.set_result(self.response)

def__await__(self):
response=yieldfromself._future.__await__()
returnresponse


classFakeStreamUnaryCall(_WrappedStreamUnaryCall):
"""Fake implementation for stream-unary RPCs.
It is a dummy object for response message. Supply the intended response
upon the initialization, and the coroutine will return the exact response
message.
"""

def__init__(self,response=object()):
self.response=response
self._future=asyncio.get_event_loop().create_future()
self._future.set_result(self.response)

def__await__(self):
response=yieldfromself._future.__await__()
returnresponse

asyncdefwait_for_connection(self):
pass
Copy link
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

I consideredMock... naming, but they are not magic mock objects. It might misdirect users' expectation of its behavior. I'm happy to change if you have better naming.

Comment on lines 42 to 45
ifclient_infoisnotNone:
user_agent_metadata= [client_info.to_grpc_metadata()]
else:
user_agent_metadata=None
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

Style nit: what about

metadata= [client_info.to_grpc_metadata()]ifclient_infoisnotNoneelseNone

?

Copy link
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

Good idea. Updated to the suggested style.

Comment on lines +237 to +270
classFakeUnaryUnaryCall(_WrappedUnaryUnaryCall):
"""Fake implementation for unary-unary RPCs.
It is a dummy object for response message. Supply the intended response
upon the initialization, and the coroutine will return the exact response
message.
"""

def__init__(self,response=object()):
self.response=response
self._future=asyncio.get_event_loop().create_future()
self._future.set_result(self.response)

def__await__(self):
response=yieldfromself._future.__await__()
returnresponse


classFakeStreamUnaryCall(_WrappedStreamUnaryCall):
"""Fake implementation for stream-unary RPCs.
It is a dummy object for response message. Supply the intended response
upon the initialization, and the coroutine will return the exact response
message.
"""

def__init__(self,response=object()):
self.response=response
self._future=asyncio.get_event_loop().create_future()
self._future.set_result(self.response)

def__await__(self):
response=yieldfromself._future.__await__()
returnresponse

asyncdefwait_for_connection(self):
pass
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

+1 to not mock naming, although I'm a little confused as to why they don't live in the unit test file.

@lidizheng
Copy link
ContributorAuthor

@software-dov PTALA.

@busunkim96
Copy link
Contributor

@lidizheng It looks like the unit tests need to be tweaked:

func = <function _wrap_unary_errors.<locals>.error_remapped_callable at 0x7fb165893790>default_retry = <google.api_core.retry_async.AsyncRetry object at 0x7fb166304160>default_timeout = <google.api_core.timeout.ExponentialTimeout object at 0x7fb1663046d0>client_info = <google.api_core.gapic_v1.client_info.ClientInfo object at 0x7fb1664eeeb0>    def wrap_method(            func,            default_retry=None,            default_timeout=None,            client_info=client_info.DEFAULT_CLIENT_INFO,    ):        """Wrap an async RPC method with common behavior.        Returns:            Callable: A new callable that takes optional ``retry`` and ``timeout``                arguments and applies the common error mapping, retry, timeout,                and metadata behavior to the low-level RPC method.        """        func = grpc_helpers_async.wrap_errors(func)        metadata = [client_info.to_grpc_metadata()] if client_info is not None else None        return general_helpers.wraps(func)(_GapicCallable(>           func, default_retry, default_timeout, metadata=user_agent_metadata))E       NameError: name 'user_agent_metadata' is not defined

Copy link
Contributor

@software-dovsoftware-dov left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

LGTM. Just one minor optional tweak and a vote from my end that the test classes be moved into a standalone test library.

* LRO client* gRPC wrappers & helpers* With unit tests & docs
@busunkim96busunkim96 merged commit7d8d580 intogoogleapis:masterJun 4, 2020
gcf-merge-on-greenbot pushed a commit that referenced this pull requestJun 4, 2020
🤖 I have created a release \*beep\* \*boop\* ---## [1.18.0](https://www.github.com/googleapis/python-api-core/compare/v1.17.0...v1.18.0) (2020-06-04)### Features* [CBT-6 helper] Exposing Retry._deadline as a property ([#20](https://www.github.com/googleapis/python-api-core/issues/20)) ([7be1e59](https://www.github.com/googleapis/python-api-core/commit/7be1e59e9d75c112f346d2b76dce3dd60e3584a1))* add client_encryped_cert_source to ClientOptions ([#31](https://www.github.com/googleapis/python-api-core/issues/31)) ([e4eaec0](https://www.github.com/googleapis/python-api-core/commit/e4eaec0ff255114138d3715280f86d34d861a6fa))* AsyncIO Integration [Part 2] ([#28](https://www.github.com/googleapis/python-api-core/issues/28)) ([dd9b2f3](https://www.github.com/googleapis/python-api-core/commit/dd9b2f38a70e85952cc05552ec8070cdf29ddbb4)), closes [#23](https://www.github.com/googleapis/python-api-core/issues/23)* First batch of AIO integration ([#26](https://www.github.com/googleapis/python-api-core/issues/26)) ([a82f289](https://www.github.com/googleapis/python-api-core/commit/a82f2892b8f219b82e120e6ed9f4070869c28be7))* third batch of AsyncIO integration ([#29](https://www.github.com/googleapis/python-api-core/issues/29)) ([7d8d580](https://www.github.com/googleapis/python-api-core/commit/7d8d58075a92e93662747d36a2d55b5e9f0943e1))---This PR was generated with [Release Please](https://github.com/googleapis/release-please).
@busunkim96busunkim96 mentioned this pull requestJun 17, 2020
4 tasks
This was referencedMay 30, 2025
Sign up for freeto join this conversation on GitHub. Already have an account?Sign in to comment

Reviewers

2 more reviewers

@software-dovsoftware-dovsoftware-dov approved these changes

@busunkim96busunkim96busunkim96 approved these changes

Reviewers whose approvals may not affect merge requirements

Assignees

No one assigned

Labels

cla: yesThis human has signed the Contributor License Agreement.

Projects

None yet

Milestone

No milestone

Development

Successfully merging this pull request may close these issues.

4 participants

@lidizheng@busunkim96@software-dov@googlebot

[8]ページ先頭

©2009-2025 Movatter.jp