René's URL Explorer Experiment


Title: fix: Major refactoring of Polling, Retry and Timeout logic in v1 branch by parthea · Pull Request #474 · googleapis/python-api-core · GitHub

Open Graph Title: fix: Major refactoring of Polling, Retry and Timeout logic in v1 branch by parthea · Pull Request #474 · googleapis/python-api-core

X Title: fix: Major refactoring of Polling, Retry and Timeout logic in v1 branch by parthea · Pull Request #474 · googleapis/python-api-core

Description: BEGIN_COMMIT_OVERRIDE feat: Allow representing enums with their unqualified symbolic names in headers in v1 branch (#462) fix: Major refactoring of Polling, Retry and Timeout logic in v1 branch (#465) END_COMMIT_OVERRIDE Including notes from PR #462 This is in response to https://freeman.vc/notes/aws-vs-gcp-reliability-is-wildly-different, which triggered an investigation of the whole Polling/Retry/Timeout behavior in Python GAPIC clients and revealed many fundamental >flaws in its implementation. To properly describe the refactoring in this PR we need to stick to a rigorous terminology, as vague definitions of retries, timeouts, polling and related concepts seems to be the main source of the present bugs and overall >confusion among both groups: users of the library and creators of the library. Please check the updated (in this PR) documentation of the google.api_core.retry.Retry class and the google.api_core.future.polling.Polling.result>() method for the proper definitions and context. Note, the overall semantics around Polling, Retry and Timeout remains quite confusing even after refactoring (although it is now more or less rigorously defined), but it was as clean as I could make it while still maintaining >backward compatibility of the whole library. The quick summary of the changes in this PR: Properly define and fix the application of Deadline and Timeout concepts. Please check the updated documentation for the google.api_core.retry.Retry class for the actual definitions. Originally the deadline has been used >to represent timeouts conflating the two concepts. As result this PR replaces deadline arguments with timeout ones in as backward-compatible manner as possible (i.e. backward compatible in all practical applications). Properly define RPC Timeout, Retry Timeout and Polling Timeout and how a generic Timeout concept (aka Logical Timeout) is mapped to one of those depending on the context. Please check google.api_core.retry.Retry class >documentation for details. Properly define and fix the application of Retry and Polling concepts. Please check the updated documentation for google.api_core.future.polling.PollingFuture.result() for details. Separate retry and polling configurations for Polling future, as these are two different concepts (although both operating on Retry class). Originally both retry and polling configurations were controlled by a single >retry parameter, merging configuration regarding how "rpc error responses" and how "operation not completed" responses are supposed to be handled. For the following config properties - Retry (including Retry Timeout), Polling (including Polling Timeout) and RPC Timeout - fix and properly define how each of the above properties gets configured and which config >gets precedence in case of a conflict (check PollingFuture.result() method documentation for details). Each of those properties can be specified as follows: directly provided by the user for each call, specified during gapic >generation time from config values in grpc_service_config.json file (for Retry and RPC Timeout) and gapic.yaml file (for Polling Timeout), or be provided as a hard-coded basic default values in python-api-core library >itself. This alo includes fixing the per-call polling config propagation logic (the polling/retry configs supplied to PollingFuture.result() used to be ignored for actual call). Deprecate ExponentialTimeout, ConstantTimeout and related logic as those are outdated concepts and are not consistent with the other GAPIC Languages. Replace it with TimeToDeadlineTimeout to be consistent with how the >rest of the languages do it. Deprecate google.api_core.operations_v1.config as it is an outdated concept and self-inconsistent (as all gapic clients provide configuraiton in code). The configs are directly provided in code instead. Switch randomized delay calculation from delay being treated as expected value for randomized_delay to delay being treated as maximum value for randomized_delay (i.e. the new expected valud for randomized_delay is >delay / 2). See the exponential_sleep_generator() method implementation for details. This is needed to make Python implementation of retries and polling exponential backoff consistent with the rest of GAPIC languages. Also >fix the uncontrollable growth of delay value (since it is a subject of exponential growth, the delay value was quickly reaching "infinity" value, and the whole thing was not failing simply due to python being a very >forgiving language which forgives multiplying "infinity" by a number (inf * number = inf) binstead of simply overflowing to a (most likely) negative number). Also essentially rollback the https://github.com/googleapis/>python-api-core/commit/52f12af027568ddeae7fb6b1e3d2111cce1bac08 change, since that is inconsistent with the other languages and damages uniform distibution of retry delays artificially shifting their concentration towards the >end of timeout. Fix url construction in OperationsRestTransport. Without this fix the polling logic for REST transport was completely broken (is not affecting Compute client, as that one has custom LRO). Last but not least: change the default values for Polling logic to be the following: initial=1.0 (same as before), maximum=20.0 (was 60), multiplier=1.5 (was 2.0), timeout=900 (was 120, but due to timeout >resolution logic was actually None (i.e. infinity)). This, in conjunction with changed calculation of randomized delay (i.e. its expected value now being delay / 2) overall makes polling logic much less aggressive in terms of >increasing delays between each polling iteration, making LRO return much earlier for users on average, but still keeping a healthy balance between strain put on both client and server by polling and responsiveness of LROs for >user. *The design doc summarising all the changes and reasons for them is in progress. In addition to the timeout/retry fixes, this PR has some other non-related technical fixes: Fix and improve code coverage (and explicitly disables lines which are not supposed to be covered) Define Python 3.10 as the default python version used in CI. Upgrade to Sphinx 4.2.0, as it is the one supporting Python 3.10

Open Graph Description: BEGIN_COMMIT_OVERRIDE feat: Allow representing enums with their unqualified symbolic names in headers in v1 branch (#462) fix: Major refactoring of Polling, Retry and Timeout logic in v1 branch (#4...

X Description: BEGIN_COMMIT_OVERRIDE feat: Allow representing enums with their unqualified symbolic names in headers in v1 branch (#462) fix: Major refactoring of Polling, Retry and Timeout logic in v1 branch (#4...

Opengraph URL: https://github.com/googleapis/python-api-core/pull/474

X: @github

direct link

Domain: github.com

route-pattern/:user_id/:repository/pull/:id/files(.:format)
route-controllerpull_requests
route-actionfiles
fetch-noncev2:fb1fbede-6654-4c76-7a00-ca4145665fab
current-catalog-service-hashae870bc5e265a340912cde392f23dad3671a0a881730ffdadd82f2f57d81641b
request-idB1A0:1BF5E4:2C8A82:3E9F17:6A4E6A7C
html-safe-noncef2c78829df8a47977d3cd03f622234900b5dd4fea0f700760cd471912425b894
visitor-payloadeyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJCMUEwOjFCRjVFNDoyQzhBODI6M0U5RjE3OjZBNEU2QTdDIiwidmlzaXRvcl9pZCI6IjE2NjA2MjA4NTAxOTIwODM1ODAiLCJyZWdpb25fZWRnZSI6ImlhZCIsInJlZ2lvbl9yZW5kZXIiOiJpYWQifQ==
visitor-hmacfd05d2b05a43142482ec7bf1ef0a5b8d8743a7127a102962d72ae61e4e70f396
hovercard-subject-tagpull_request:1142301840
github-keyboard-shortcutsrepository,pull-request-list,pull-request-conversation,pull-request-files-changed,copilot
google-site-verificationApib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I
octolytics-urlhttps://collector.github.com/github/collect
analytics-location///pull_requests/show/files
fb:app_id1401488693436528
apple-itunes-appapp-id=1477376905, app-argument=https://github.com/googleapis/python-api-core/pull/474/files
twitter:imagehttps://avatars.githubusercontent.com/u/5184014?s=400&v=4
twitter:cardsummary_large_image
og:imagehttps://avatars.githubusercontent.com/u/5184014?s=400&v=4
og:image:altBEGIN_COMMIT_OVERRIDE feat: Allow representing enums with their unqualified symbolic names in headers in v1 branch (#462) fix: Major refactoring of Polling, Retry and Timeout logic in v1 branch (#4...
og:site_nameGitHub
og:typeobject
hostnamegithub.com
expected-hostnamegithub.com
None41b6ab3ba6d20a71766ac245b5a4a94c6fc672a9cd4da7d44c1b33ab8bf6a21c
turbo-cache-controlno-preview
diff-viewunified
go-importgithub.com/googleapis/python-api-core git https://github.com/googleapis/python-api-core.git
octolytics-dimension-user_id16785467
octolytics-dimension-user_logingoogleapis
octolytics-dimension-repository_id226992456
octolytics-dimension-repository_nwogoogleapis/python-api-core
octolytics-dimension-repository_publictrue
octolytics-dimension-repository_is_forkfalse
octolytics-dimension-repository_network_root_id226992456
octolytics-dimension-repository_network_root_nwogoogleapis/python-api-core
turbo-body-classeslogged-out env-production page-responsive full-width
disable-turbotrue
browser-stats-urlhttps://api.github.com/_private/browser/stats
browser-errors-urlhttps://api.github.com/_private/browser/errors
releasee6a744804e8e70f97b4d5a18a94dcc63db22f97a
ui-targetfull
theme-color#1e2327
color-schemelight dark

Links:

Skip to contenthttps://github.com/googleapis/python-api-core/pull/474/files#start-of-content
https://github.com/
Sign in https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fgoogleapis%2Fpython-api-core%2Fpull%2F474%2Ffiles
GitHub CopilotWrite better code with AIhttps://github.com/features/copilot
GitHub Copilot appDirect agents from issue to mergehttps://github.com/features/ai/github-app
MCP RegistryNewIntegrate external toolshttps://github.com/mcp
ActionsAutomate any workflowhttps://github.com/features/actions
CodespacesInstant dev environmentshttps://github.com/features/codespaces
IssuesPlan and track workhttps://github.com/features/issues
Code ReviewManage code changeshttps://github.com/features/code-review
GitHub Advanced SecurityFind and fix vulnerabilitieshttps://github.com/security/advanced-security
Code securitySecure your code as you buildhttps://github.com/security/advanced-security/code-security
Secret protectionStop leaks before they starthttps://github.com/security/advanced-security/secret-protection
Why GitHubhttps://github.com/why-github
Documentationhttps://docs.github.com
Bloghttps://github.blog
Changeloghttps://github.blog/changelog
Marketplacehttps://github.com/marketplace
View all featureshttps://github.com/features
Enterpriseshttps://github.com/enterprise
Small and medium teamshttps://github.com/team
Startupshttps://github.com/enterprise/startups
Nonprofitshttps://github.com/solutions/industry/nonprofits
App Modernizationhttps://github.com/solutions/use-case/app-modernization
DevSecOpshttps://github.com/solutions/use-case/devsecops
DevOpshttps://github.com/solutions/use-case/devops
CI/CDhttps://github.com/solutions/use-case/ci-cd
View all use caseshttps://github.com/solutions/use-case
Healthcarehttps://github.com/solutions/industry/healthcare
Financial serviceshttps://github.com/solutions/industry/financial-services
Manufacturinghttps://github.com/solutions/industry/manufacturing
Governmenthttps://github.com/solutions/industry/government
View all industrieshttps://github.com/solutions/industry
View all solutionshttps://github.com/solutions
AIhttps://github.com/resources/articles?topic=ai
Software Developmenthttps://github.com/resources/articles?topic=software-development
DevOpshttps://github.com/resources/articles?topic=devops
Securityhttps://github.com/resources/articles?topic=security
View all topicshttps://github.com/resources/articles
Customer storieshttps://github.com/customer-stories
Events & webinarshttps://github.com/resources/events
Ebooks & reportshttps://github.com/resources/whitepapers
Business insightshttps://github.com/solutions/executive-insights
GitHub Skillshttps://skills.github.com
Documentationhttps://docs.github.com
Customer supporthttps://support.github.com
Community forumhttps://github.com/orgs/community/discussions
Trust centerhttps://github.com/trust-center
Partnershttps://github.com/partners
View all resourceshttps://github.com/resources
GitHub SponsorsFund open source developershttps://github.com/open-source/sponsors
Security Labhttps://securitylab.github.com
Maintainer Communityhttps://maintainers.github.com
Acceleratorhttps://github.com/open-source/accelerator
GitHub Starshttps://stars.github.com
Archive Programhttps://archiveprogram.github.com
Topicshttps://github.com/topics
Trendinghttps://github.com/trending
Collectionshttps://github.com/collections
Enterprise platformAI-powered developer platformhttps://github.com/enterprise
GitHub Advanced SecurityEnterprise-grade security featureshttps://github.com/security/advanced-security
Copilot for BusinessEnterprise-grade AI featureshttps://github.com/features/copilot/copilot-business
Premium SupportEnterprise-grade 24/7 supporthttps://github.com/enterprise/premium-support
Pricinghttps://github.com/pricing
Search syntax tipshttps://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax
documentationhttps://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax
Sign in https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fgoogleapis%2Fpython-api-core%2Fpull%2F474%2Ffiles
Sign up https://github.com/signup?ref_cta=Sign+up&ref_loc=header+logged+out&ref_page=%2F%3Cuser-name%3E%2F%3Crepo-name%3E%2Fpull_requests%2Fshow%2Ffiles&source=header-repo&source_repo=googleapis%2Fpython-api-core
Reloadhttps://github.com/googleapis/python-api-core/pull/474/files
Reloadhttps://github.com/googleapis/python-api-core/pull/474/files
Reloadhttps://github.com/googleapis/python-api-core/pull/474/files
Please reload this pagehttps://github.com/googleapis/python-api-core/pull/474/files
googleapis https://github.com/googleapis
python-api-corehttps://github.com/googleapis/python-api-core
Notifications https://github.com/login?return_to=%2Fgoogleapis%2Fpython-api-core
Fork 97 https://github.com/login?return_to=%2Fgoogleapis%2Fpython-api-core
Star 144 https://github.com/login?return_to=%2Fgoogleapis%2Fpython-api-core
Code https://github.com/googleapis/python-api-core
Issues 0 https://github.com/googleapis/python-api-core/issues
Pull requests 0 https://github.com/googleapis/python-api-core/pulls
Actions https://github.com/googleapis/python-api-core/actions
Projects https://github.com/googleapis/python-api-core/projects
Security and quality 0 https://github.com/googleapis/python-api-core/security
Insights https://github.com/googleapis/python-api-core/pulse
Code https://github.com/googleapis/python-api-core
Issues https://github.com/googleapis/python-api-core/issues
Pull requests https://github.com/googleapis/python-api-core/pulls
Actions https://github.com/googleapis/python-api-core/actions
Projects https://github.com/googleapis/python-api-core/projects
Security and quality https://github.com/googleapis/python-api-core/security
Insights https://github.com/googleapis/python-api-core/pulse
partheahttps://github.com/parthea
v1https://github.com/googleapis/python-api-core/tree/v1
cherry-pick-main-into-v1https://github.com/googleapis/python-api-core/tree/cherry-pick-main-into-v1
Conversation 0 https://github.com/googleapis/python-api-core/pull/474
Commits 3 https://github.com/googleapis/python-api-core/pull/474/commits
Checks 0 https://github.com/googleapis/python-api-core/pull/474/checks
Files changed https://github.com/googleapis/python-api-core/pull/474/files
Please reload this pagehttps://github.com/googleapis/python-api-core/pull/474/files
fix: Major refactoring of Polling, Retry and Timeout logic in v1 branch https://github.com/googleapis/python-api-core/pull/474/files#top
Show all changes 3 commits https://github.com/googleapis/python-api-core/pull/474/files
e933e0f fix: Major refactoring of Polling, Retry and Timeout logic (#462) vam-google Nov 10, 2022 https://github.com/googleapis/python-api-core/pull/474/commits/e933e0ff48d84e3025b445ad442946c8fa7833c7
d4272d2 feat: Allow representing enums with their unqualified symbolic names … vchudnov-g Nov 10, 2022 https://github.com/googleapis/python-api-core/pull/474/commits/d4272d2310a7597602cb108b4a2fe82acb5f799d
6b43f1e chore(python): update release script dependencies (#472) gcf-owl-bot[bot] Dec 1, 2022 https://github.com/googleapis/python-api-core/pull/474/commits/6b43f1e692f46c7e6f7d852005144c4540349e6d
Clear filters https://github.com/googleapis/python-api-core/pull/474/files
Please reload this pagehttps://github.com/googleapis/python-api-core/pull/474/files
Please reload this pagehttps://github.com/googleapis/python-api-core/pull/474/files
docs.yml https://github.com/googleapis/python-api-core/pull/474/files#diff-9cf2000c53760d837a449f874e53f792819108d3a4bf346336d0f7d082deae2c
lint.yml https://github.com/googleapis/python-api-core/pull/474/files#diff-107e910e9f2ebfb9a741fa10b2aa7100cc1fc4f5f3aca2dfe78b905cbd73c0d2
mypy.yml https://github.com/googleapis/python-api-core/pull/474/files#diff-07730f31c368f5e0af82cb7d820dc37ae6a752a0a226f7aee9ebac72dfe41459
Dockerfile https://github.com/googleapis/python-api-core/pull/474/files#diff-83dc213be2cbc853a194c027993317fbb7e75ac023fa8cf085ce1708de64cd18
requirements.in https://github.com/googleapis/python-api-core/pull/474/files#diff-6ae92cfcd5e03fc097aec6e7a45119625053a5236b6dc231ec389d097cffe0e1
requirements.txt https://github.com/googleapis/python-api-core/pull/474/files#diff-35f2a5c851fe9bb3227641471eed3f941a7f641c5a7aae8baa751e54d4954394
extended_operation.py https://github.com/googleapis/python-api-core/pull/474/files#diff-4268ae3e8fd378206bcee0e7c3fa326f11ff465d21ac8015b351cb1a3f8d009a
async_future.py https://github.com/googleapis/python-api-core/pull/474/files#diff-4450cc8daf3047512d4b0290e0af946a261b3c05577fa5b739ca58fd25dcbbcc
polling.py https://github.com/googleapis/python-api-core/pull/474/files#diff-a3fc845863c59248124f0882040b4fef95e3d280ad848affa3be9f5003228574
config.py https://github.com/googleapis/python-api-core/pull/474/files#diff-ea54b0e8e3b1279d3f45cbdfa472a34c04f6dae09fa015236717ee3270a9c008
method.py https://github.com/googleapis/python-api-core/pull/474/files#diff-12d0331ed4c2c217c6b87a4e74a1441222081ed74c9dd3d8a59da22e5b1203fd
routing_header.py https://github.com/googleapis/python-api-core/pull/474/files#diff-a2c5eba1d391f81560683d8833d90c7729ffb1dd4b060ec5eabda5f0deedc37e
grpc_helpers.py https://github.com/googleapis/python-api-core/pull/474/files#diff-9aeb5107dac746ab0e51a30c001ca48df095ca511bc881c40ed0c5e71cf7dc73
operation.py https://github.com/googleapis/python-api-core/pull/474/files#diff-c1ade7a5b8a2a4bab262545320e61c2636bf9374247de521d02d655578e91eed
operations_async_client.py https://github.com/googleapis/python-api-core/pull/474/files#diff-5fb933dfdbad5925d83718ab80ffb1bef9c3dca9dd805f51b338d58f33a782c8
operations_client.py https://github.com/googleapis/python-api-core/pull/474/files#diff-3585680ff7459038403e6b7b371c4478bc3fb5c7ca375f8f4383f89e3bd9e425
operations_client_config.py https://github.com/googleapis/python-api-core/pull/474/files#diff-8cbff791167ee8adb175bfeb631d74dadeb386040f14c5a238169f7ba5106f73
__init__.py https://github.com/googleapis/python-api-core/pull/474/files#diff-dff51b8c0ba321205b08a86db387bf4628e140da8a4dfa9bc92a36f6e1228da4
rest.py https://github.com/googleapis/python-api-core/pull/474/files#diff-9355b210dc5d75f42434462f3f0aca13acb3bb9bbf993541d5520cb1ec32aa4e
retry.py https://github.com/googleapis/python-api-core/pull/474/files#diff-c118188be6311975226123f406396979b3dbb200e36b425824fba2aa2d675fa7
retry_async.py https://github.com/googleapis/python-api-core/pull/474/files#diff-ed08ac118b7c20706443874d0296972aac7eea464ec013ac7020eafac320adff
timeout.py https://github.com/googleapis/python-api-core/pull/474/files#diff-eb593f229f522aee48e065ac85a221f6bb5d4184189d17170ca8b16e22aa68bb
noxfile.py https://github.com/googleapis/python-api-core/pull/474/files#diff-f7a16a65f061822bcc73b8296f4dc837353d379d8d9cc5307982cb6941442835
owlbot.py https://github.com/googleapis/python-api-core/pull/474/files#diff-5ffcc5c595bdb5127f82e03dbcdb1eeb75a2633f6f44b7f640f9d7523bc0f264
test_method_async.py https://github.com/googleapis/python-api-core/pull/474/files#diff-0fe43af876ef09c7d7fb7aa997dcaa7080733f0dbd76a1cdc4bcce0e84c75a95
test_operations_async_client.py https://github.com/googleapis/python-api-core/pull/474/files#diff-0aaf887b283c9bbdd5c511736bc27ea1e6fc066b32ce89007381aef4c03d1024
test_grpc_helpers_async.py https://github.com/googleapis/python-api-core/pull/474/files#diff-674e40c61f15aa7ba281c08b5ae7d3231c02189806f9c3b53b3e9a656815d2c5
test_operation_async.py https://github.com/googleapis/python-api-core/pull/474/files#diff-f3268c9d0afdbc7da7817cf1e4e3e5cbb7e86957529e48ca3e97cd202a289c89
test_retry_async.py https://github.com/googleapis/python-api-core/pull/474/files#diff-7afe2d64bf04b5c175e625d070e4755d8a132129d96de3a5366a80fe97580edd
test_polling.py https://github.com/googleapis/python-api-core/pull/474/files#diff-7e348606c2bc11070698256e05f546f8b97332481eef78a59584d3eec0c91eee
test_method.py https://github.com/googleapis/python-api-core/pull/474/files#diff-84ee6db6f215e230ce9a40a904aa27d74ce059ee9a0ba18711008c555f234a5e
test_routing_header.py https://github.com/googleapis/python-api-core/pull/474/files#diff-95fcb8e7c734032ed4bbab559b80ed07b2fdca17fdca14faf5d5eba896070250
test_operations_client.py https://github.com/googleapis/python-api-core/pull/474/files#diff-b9ecf20afed36970c99084446f9686f9ba3b5d47371a3d152e4de85f28faa8d7
test_operations_rest_client.py https://github.com/googleapis/python-api-core/pull/474/files#diff-c0182c2ab6436bb53b49d3fb9647c04ecebca4f56f5fb8e6fbc7eb0138d6c3e1
test_bidi.py https://github.com/googleapis/python-api-core/pull/474/files#diff-13ad29d4fe411bf57b42bd870cca2c9f33a571814a74693c755e52ad9eefeb49
test_client_info.py https://github.com/googleapis/python-api-core/pull/474/files#diff-bc76737836ee76fc1393fd2807a147ee9421b32a13adf4b9cf5edf4ccab68362
test_exceptions.py https://github.com/googleapis/python-api-core/pull/474/files#diff-e621f60722938a3fc61b7bc5e62f469d2dbc76c797f06861e1cbd32665c36ca3
test_general_helpers.py https://github.com/googleapis/python-api-core/pull/474/files#diff-255090e177071491484a0756be6717fb0b8170a053b03e5a2aefad3c778374cc
test_grpc_helpers.py https://github.com/googleapis/python-api-core/pull/474/files#diff-a2ab7509503191e922431f02fd347dd02debe706b046872c0ee6f41785fd0acb
test_operation.py https://github.com/googleapis/python-api-core/pull/474/files#diff-e062fc388e40a1117a6309996e19501a47839b982e6faa65a6325bbded4f2705
test_retry.py https://github.com/googleapis/python-api-core/pull/474/files#diff-6700a5065875409f1d2b7481bc9c1f6446c347d4266a7f455883b6d9a4fe2855
test_timeout.py https://github.com/googleapis/python-api-core/pull/474/files#diff-111231c4f179ffcbda5628ab92b80c9a4cc31ea0210962f4842948953686dbfc
.github/workflows/docs.ymlhttps://github.com/googleapis/python-api-core/pull/474/files#diff-9cf2000c53760d837a449f874e53f792819108d3a4bf346336d0f7d082deae2c
View file https://github.com/googleapis/python-api-core/blob/6b43f1e692f46c7e6f7d852005144c4540349e6d/.github/workflows/docs.yml
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/googleapis/python-api-core/pull/474/{{ revealButtonHref }}
https://github.com/googleapis/python-api-core/pull/474/files#diff-9cf2000c53760d837a449f874e53f792819108d3a4bf346336d0f7d082deae2c
https://github.com/googleapis/python-api-core/pull/474/files#diff-9cf2000c53760d837a449f874e53f792819108d3a4bf346336d0f7d082deae2c
https://github.com/googleapis/python-api-core/pull/474/files#diff-9cf2000c53760d837a449f874e53f792819108d3a4bf346336d0f7d082deae2c
.github/workflows/lint.ymlhttps://github.com/googleapis/python-api-core/pull/474/files#diff-107e910e9f2ebfb9a741fa10b2aa7100cc1fc4f5f3aca2dfe78b905cbd73c0d2
View file https://github.com/googleapis/python-api-core/blob/6b43f1e692f46c7e6f7d852005144c4540349e6d/.github/workflows/lint.yml
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/googleapis/python-api-core/pull/474/{{ revealButtonHref }}
https://github.com/googleapis/python-api-core/pull/474/files#diff-107e910e9f2ebfb9a741fa10b2aa7100cc1fc4f5f3aca2dfe78b905cbd73c0d2
https://github.com/googleapis/python-api-core/pull/474/files#diff-107e910e9f2ebfb9a741fa10b2aa7100cc1fc4f5f3aca2dfe78b905cbd73c0d2
.github/workflows/mypy.ymlhttps://github.com/googleapis/python-api-core/pull/474/files#diff-07730f31c368f5e0af82cb7d820dc37ae6a752a0a226f7aee9ebac72dfe41459
View file https://github.com/googleapis/python-api-core/blob/6b43f1e692f46c7e6f7d852005144c4540349e6d/.github/workflows/mypy.yml
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/googleapis/python-api-core/pull/474/{{ revealButtonHref }}
https://github.com/googleapis/python-api-core/pull/474/files#diff-07730f31c368f5e0af82cb7d820dc37ae6a752a0a226f7aee9ebac72dfe41459
https://github.com/googleapis/python-api-core/pull/474/files#diff-07730f31c368f5e0af82cb7d820dc37ae6a752a0a226f7aee9ebac72dfe41459
.kokoro/docker/docs/Dockerfilehttps://github.com/googleapis/python-api-core/pull/474/files#diff-83dc213be2cbc853a194c027993317fbb7e75ac023fa8cf085ce1708de64cd18
View file https://github.com/googleapis/python-api-core/blob/6b43f1e692f46c7e6f7d852005144c4540349e6d/.kokoro/docker/docs/Dockerfile
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/googleapis/python-api-core/pull/474/{{ revealButtonHref }}
https://github.com/googleapis/python-api-core/pull/474/files#diff-83dc213be2cbc853a194c027993317fbb7e75ac023fa8cf085ce1708de64cd18
https://github.com/googleapis/python-api-core/pull/474/files#diff-83dc213be2cbc853a194c027993317fbb7e75ac023fa8cf085ce1708de64cd18
.kokoro/requirements.inhttps://github.com/googleapis/python-api-core/pull/474/files#diff-6ae92cfcd5e03fc097aec6e7a45119625053a5236b6dc231ec389d097cffe0e1
View file https://github.com/googleapis/python-api-core/blob/6b43f1e692f46c7e6f7d852005144c4540349e6d/.kokoro/requirements.in
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/googleapis/python-api-core/pull/474/{{ revealButtonHref }}
https://github.com/googleapis/python-api-core/pull/474/files#diff-6ae92cfcd5e03fc097aec6e7a45119625053a5236b6dc231ec389d097cffe0e1
.kokoro/requirements.txthttps://github.com/googleapis/python-api-core/pull/474/files#diff-35f2a5c851fe9bb3227641471eed3f941a7f641c5a7aae8baa751e54d4954394
View file https://github.com/googleapis/python-api-core/blob/6b43f1e692f46c7e6f7d852005144c4540349e6d/.kokoro/requirements.txt
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/googleapis/python-api-core/pull/474/{{ revealButtonHref }}
https://github.com/googleapis/python-api-core/pull/474/files#diff-35f2a5c851fe9bb3227641471eed3f941a7f641c5a7aae8baa751e54d4954394
https://github.com/googleapis/python-api-core/pull/474/files#diff-35f2a5c851fe9bb3227641471eed3f941a7f641c5a7aae8baa751e54d4954394
https://github.com/googleapis/python-api-core/pull/474/files#diff-35f2a5c851fe9bb3227641471eed3f941a7f641c5a7aae8baa751e54d4954394
https://github.com/googleapis/python-api-core/pull/474/files#diff-35f2a5c851fe9bb3227641471eed3f941a7f641c5a7aae8baa751e54d4954394
https://github.com/googleapis/python-api-core/pull/474/files#diff-35f2a5c851fe9bb3227641471eed3f941a7f641c5a7aae8baa751e54d4954394
https://github.com/googleapis/python-api-core/pull/474/files#diff-35f2a5c851fe9bb3227641471eed3f941a7f641c5a7aae8baa751e54d4954394
https://github.com/googleapis/python-api-core/pull/474/files#diff-35f2a5c851fe9bb3227641471eed3f941a7f641c5a7aae8baa751e54d4954394
https://github.com/googleapis/python-api-core/pull/474/files#diff-35f2a5c851fe9bb3227641471eed3f941a7f641c5a7aae8baa751e54d4954394
https://github.com/googleapis/python-api-core/pull/474/files#diff-35f2a5c851fe9bb3227641471eed3f941a7f641c5a7aae8baa751e54d4954394
https://github.com/googleapis/python-api-core/pull/474/files#diff-35f2a5c851fe9bb3227641471eed3f941a7f641c5a7aae8baa751e54d4954394
https://github.com/googleapis/python-api-core/pull/474/files#diff-35f2a5c851fe9bb3227641471eed3f941a7f641c5a7aae8baa751e54d4954394
https://github.com/googleapis/python-api-core/pull/474/files#diff-35f2a5c851fe9bb3227641471eed3f941a7f641c5a7aae8baa751e54d4954394
google/api_core/extended_operation.pyhttps://github.com/googleapis/python-api-core/pull/474/files#diff-4268ae3e8fd378206bcee0e7c3fa326f11ff465d21ac8015b351cb1a3f8d009a
View file https://github.com/googleapis/python-api-core/blob/6b43f1e692f46c7e6f7d852005144c4540349e6d/google/api_core/extended_operation.py
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/googleapis/python-api-core/pull/474/{{ revealButtonHref }}
https://github.com/googleapis/python-api-core/pull/474/files#diff-4268ae3e8fd378206bcee0e7c3fa326f11ff465d21ac8015b351cb1a3f8d009a
https://github.com/googleapis/python-api-core/pull/474/files#diff-4268ae3e8fd378206bcee0e7c3fa326f11ff465d21ac8015b351cb1a3f8d009a
https://github.com/googleapis/python-api-core/pull/474/files#diff-4268ae3e8fd378206bcee0e7c3fa326f11ff465d21ac8015b351cb1a3f8d009a
https://github.com/googleapis/python-api-core/pull/474/files#diff-4268ae3e8fd378206bcee0e7c3fa326f11ff465d21ac8015b351cb1a3f8d009a
https://github.com/googleapis/python-api-core/pull/474/files#diff-4268ae3e8fd378206bcee0e7c3fa326f11ff465d21ac8015b351cb1a3f8d009a
https://github.com/googleapis/python-api-core/pull/474/files#diff-4268ae3e8fd378206bcee0e7c3fa326f11ff465d21ac8015b351cb1a3f8d009a
google/api_core/future/async_future.pyhttps://github.com/googleapis/python-api-core/pull/474/files#diff-4450cc8daf3047512d4b0290e0af946a261b3c05577fa5b739ca58fd25dcbbcc
View file https://github.com/googleapis/python-api-core/blob/6b43f1e692f46c7e6f7d852005144c4540349e6d/google/api_core/future/async_future.py
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/googleapis/python-api-core/pull/474/{{ revealButtonHref }}
https://github.com/googleapis/python-api-core/pull/474/files#diff-4450cc8daf3047512d4b0290e0af946a261b3c05577fa5b739ca58fd25dcbbcc
https://github.com/googleapis/python-api-core/pull/474/files#diff-4450cc8daf3047512d4b0290e0af946a261b3c05577fa5b739ca58fd25dcbbcc
Please reload this pagehttps://github.com/googleapis/python-api-core/pull/474/files
https://github.com
Termshttps://docs.github.com/site-policy/github-terms/github-terms-of-service
Privacyhttps://docs.github.com/site-policy/privacy-policies/github-privacy-statement
Securityhttps://github.com/security
Statushttps://www.githubstatus.com/
Communityhttps://github.community/
Docshttps://docs.github.com/
Contacthttps://support.github.com?tags=dotcom-footer

Viewport: width=device-width


URLs of crawlers that visited me.