Skip to content

Commit 2ad5ca2

Browse files
authored
refactor: cleanup and boost dependency reqs in generated clients (#1018)
Boost Proto-Plus dependency to 1.19.4 Boost common protos dependency to 1.53.0 Boost Google API core requirement to 2.1.0 and (transitively) Google Auth to 1.25.0 Remove logic for handling older auth library versions
1 parent c4ae5cf commit 2ad5ca2

35 files changed

Lines changed: 71 additions & 798 deletions

File tree

packages/gapic-generator/gapic/ads-templates/noxfile.py.j2

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import os
77
import nox # type: ignore
88

99

10-
@nox.session(python=['3.7', '3.8'])
10+
@nox.session(python=['3.7', '3.8', '3.9'])
1111
def unit(session):
1212
"""Run the unit test suite."""
1313

@@ -25,7 +25,7 @@ def unit(session):
2525
)
2626

2727

28-
@nox.session(python=['3.7', '3.8'])
28+
@nox.session(python=['3.7', '3.8', '3.9'])
2929
def mypy(session):
3030
"""Run the type checker."""
3131
session.install('mypy')

packages/gapic-generator/gapic/ads-templates/setup.py.j2

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,15 @@ setuptools.setup(
1717
platforms='Posix; MacOS X; Windows',
1818
include_package_data=True,
1919
install_requires=(
20-
'google-api-core >= 1.22.2, < 3.0.0dev',
21-
'googleapis-common-protos >= 1.5.8',
20+
{# TODO(dovs): remove when 1.x deprecation is complete #}
21+
{% if 'rest' in opts.transport %}
22+
'google-api-core[grpc] >= 2.1.0, < 3.0.0dev',
23+
{% else %}
24+
'google-api-core[grpc] >= 1.28.0, < 3.0.0dev',
25+
{% endif %}
26+
'googleapis-common-protos >= 1.53.0',
2227
'grpcio >= 1.10.0',
23-
'proto-plus >= 1.15.0',
28+
'proto-plus >= 1.19.4',
2429
{% if api.requires_package(('google', 'iam', 'v1')) %}
2530
'grpc-google-iam-v1',
2631
{% endif %}
@@ -38,6 +43,7 @@ setuptools.setup(
3843
'Operating System :: OS Independent',
3944
'Programming Language :: Python :: 3.7',
4045
'Programming Language :: Python :: 3.8',
46+
'Programming Language :: Python :: 3.9',
4147
'Topic :: Internet',
4248
'Topic :: Software Development :: Libraries :: Python Modules',
4349
],

packages/gapic-generator/gapic/templates/%namespace/%name_%version/%sub/services/%service/transports/base.py.j2

Lines changed: 1 addition & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
import abc
66
from typing import Awaitable, Callable, Dict, Optional, Sequence, Union
7-
import packaging.version
87
import pkg_resources
98

109
import google.auth # type: ignore
@@ -38,15 +37,6 @@ try:
3837
except pkg_resources.DistributionNotFound:
3938
DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo()
4039

41-
try:
42-
# google.auth.__version__ was added in 1.26.0
43-
_GOOGLE_AUTH_VERSION = google.auth.__version__
44-
except AttributeError:
45-
try: # try pkg_resources if it is available
46-
_GOOGLE_AUTH_VERSION = pkg_resources.get_distribution("google-auth").version
47-
except pkg_resources.DistributionNotFound: # pragma: NO COVER
48-
_GOOGLE_AUTH_VERSION = None
49-
5040

5141
class {{ service.name }}Transport(abc.ABC):
5242
"""Abstract transport class for {{ service.name }}."""
@@ -99,7 +89,7 @@ class {{ service.name }}Transport(abc.ABC):
9989
host += ':443'
10090
self._host = host
10191

102-
scopes_kwargs = self._get_scopes_kwargs(self._host, scopes)
92+
scopes_kwargs = {"scopes": scopes, "default_scopes": self.AUTH_SCOPES}
10393

10494
# Save the scopes.
10595
self._scopes = scopes
@@ -127,28 +117,6 @@ class {{ service.name }}Transport(abc.ABC):
127117
self._credentials = credentials
128118

129119

130-
# TODO(busunkim): This method is in the base transport
131-
# to avoid duplicating code across the transport classes. These functions
132-
# should be deleted once the minimum required versions of google-auth is increased.
133-
134-
# TODO: Remove this function once google-auth >= 1.25.0 is required
135-
@classmethod
136-
def _get_scopes_kwargs(cls, host: str, scopes: Optional[Sequence[str]]) -> Dict[str, Optional[Sequence[str]]]:
137-
"""Returns scopes kwargs to pass to google-auth methods depending on the google-auth version"""
138-
139-
scopes_kwargs = {}
140-
141-
if _GOOGLE_AUTH_VERSION and (
142-
packaging.version.parse(_GOOGLE_AUTH_VERSION)
143-
>= packaging.version.parse("1.25.0")
144-
):
145-
scopes_kwargs = {"scopes": scopes, "default_scopes": cls.AUTH_SCOPES}
146-
else:
147-
scopes_kwargs = {"scopes": scopes or cls.AUTH_SCOPES}
148-
149-
return scopes_kwargs
150-
151-
152120
def _prep_wrapped_messages(self, client_info):
153121
# Precompute the wrapped methods.
154122
self._wrapped_methods = {

packages/gapic-generator/gapic/templates/%namespace/%name_%version/%sub/services/%service/transports/grpc_asyncio.py.j2

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ from google.api_core import operations_v1 # type: ignore
1212
{% endif %}
1313
from google.auth import credentials as ga_credentials # type: ignore
1414
from google.auth.transport.grpc import SslCredentials # type: ignore
15-
import packaging.version
1615

1716
import grpc # type: ignore
1817
from grpc.experimental import aio # type: ignore

packages/gapic-generator/gapic/templates/noxfile.py.j2

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ def unit(session):
4444
)
4545

4646

47-
@nox.session(python='3.7')
47+
@nox.session(python='3.9')
4848
def cover(session):
4949
"""Run the final coverage report.
5050
This outputs the coverage report aggregating coverage from the unit
@@ -56,7 +56,7 @@ def cover(session):
5656
session.run("coverage", "erase")
5757

5858

59-
@nox.session(python=['3.6', '3.7'])
59+
@nox.session(python=['3.6', '3.7', '3.8', '3.9'])
6060
def mypy(session):
6161
"""Run the type checker."""
6262
session.install('mypy', 'types-pkg_resources')
@@ -103,7 +103,7 @@ def check_lower_bounds(session):
103103
str(LOWER_BOUND_CONSTRAINTS_FILE),
104104
)
105105

106-
@nox.session(python='3.6')
106+
@nox.session(python='3.9')
107107
def docs(session):
108108
"""Build the docs for this library."""
109109

packages/gapic-generator/gapic/templates/setup.py.j2

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,17 @@ setuptools.setup(
2727
platforms='Posix; MacOS X; Windows',
2828
include_package_data=True,
2929
install_requires=(
30-
'google-api-core[grpc] >= 1.27.0, < 3.0.0dev',
30+
{# TODO(dovs): remove when 1.x deprecation is complete #}
31+
{% if 'rest' in opts.transport %}
32+
'google-api-core[grpc] >= 2.1.0, < 3.0.0dev',
33+
{% else %}
34+
'google-api-core[grpc] >= 1.28.0, < 3.0.0dev',
35+
{% endif %}
3136
'libcst >= 0.2.5',
32-
'proto-plus >= 1.15.0',
33-
'packaging >= 14.3',
34-
{%- if api.requires_package(('google', 'iam', 'v1')) or opts.add_iam_methods %}
37+
'proto-plus >= 1.19.4',
38+
{% if api.requires_package(('google', 'iam', 'v1')) or opts.add_iam_methods %}
3539
'grpc-google-iam-v1 >= 0.12.3, < 0.13dev',
36-
{%- endif %}
40+
{% endif %}
3741
),
3842
python_requires='>=3.6',
3943
classifiers=[
@@ -44,7 +48,6 @@ setuptools.setup(
4448
'Programming Language :: Python :: 3.7',
4549
'Programming Language :: Python :: 3.8',
4650
'Programming Language :: Python :: 3.9',
47-
'Programming Language :: Python :: 3.10',
4851
'Topic :: Internet',
4952
'Topic :: Software Development :: Libraries :: Python Modules',
5053
],

packages/gapic-generator/gapic/templates/tests/unit/gapic/%name_%version/%sub/test_%service.py.j2

Lines changed: 1 addition & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
import os
66
import mock
7-
import packaging.version
87

98
import grpc
109
from grpc.experimental import aio
@@ -28,7 +27,7 @@ from {{ (api.naming.module_namespace + (api.naming.versioned_module_name,) + ser
2827
from {{ (api.naming.module_namespace + (api.naming.versioned_module_name,) + service.meta.address.subpackage)|join(".") }}.services.{{ service.name|snake_case }} import {{ service.async_client_name }}
2928
{% endif %}
3029
from {{ (api.naming.module_namespace + (api.naming.versioned_module_name,) + service.meta.address.subpackage)|join(".") }}.services.{{ service.name|snake_case }} import transports
31-
from {{ (api.naming.module_namespace + (api.naming.versioned_module_name,) + service.meta.address.subpackage)|join(".") }}.services.{{ service.name|snake_case }}.transports.base import _GOOGLE_AUTH_VERSION
30+
3231
from google.api_core import client_options
3332
from google.api_core import exceptions as core_exceptions
3433
from google.api_core import grpc_helpers
@@ -55,19 +54,6 @@ from google.iam.v1 import policy_pb2 # type: ignore
5554
{% endfilter %}
5655

5756

58-
# TODO(busunkim): Once google-auth >= 1.25.0 is required transitively
59-
# through google-api-core:
60-
# - Delete the auth "less than" test cases
61-
# - Delete these pytest markers (Make the "greater than or equal to" tests the default).
62-
requires_google_auth_lt_1_25_0 = pytest.mark.skipif(
63-
packaging.version.parse(_GOOGLE_AUTH_VERSION) >= packaging.version.parse("1.25.0"),
64-
reason="This test requires google-auth < 1.25.0",
65-
)
66-
requires_google_auth_gte_1_25_0 = pytest.mark.skipif(
67-
packaging.version.parse(_GOOGLE_AUTH_VERSION) < packaging.version.parse("1.25.0"),
68-
reason="This test requires google-auth >= 1.25.0",
69-
)
70-
7157
def client_cert_source_callback():
7258
return b"cert bytes", b"key bytes"
7359

@@ -1527,7 +1513,6 @@ def test_{{ service.name|snake_case }}_base_transport():
15271513
{% endif %}
15281514

15291515

1530-
@requires_google_auth_gte_1_25_0
15311516
def test_{{ service.name|snake_case }}_base_transport_with_credentials_file():
15321517
# Instantiate the base transport with a credentials file
15331518
with mock.patch.object(google.auth, 'load_credentials_from_file', autospec=True) as load_creds, mock.patch('{{ (api.naming.module_namespace + (api.naming.versioned_module_name,) + service.meta.address.subpackage)|join(".") }}.services.{{ service.name|snake_case }}.transports.{{ service.name }}Transport._prep_wrapped_messages') as Transport:
@@ -1547,25 +1532,6 @@ def test_{{ service.name|snake_case }}_base_transport_with_credentials_file():
15471532
)
15481533

15491534

1550-
@requires_google_auth_lt_1_25_0
1551-
def test_{{ service.name|snake_case }}_base_transport_with_credentials_file_old_google_auth():
1552-
# Instantiate the base transport with a credentials file
1553-
with mock.patch.object(google.auth, 'load_credentials_from_file', autospec=True) as load_creds, mock.patch('{{ (api.naming.module_namespace + (api.naming.versioned_module_name,) + service.meta.address.subpackage)|join(".") }}.services.{{ service.name|snake_case }}.transports.{{ service.name }}Transport._prep_wrapped_messages') as Transport:
1554-
Transport.return_value = None
1555-
load_creds.return_value = (ga_credentials.AnonymousCredentials(), None)
1556-
transport = transports.{{ service.name }}Transport(
1557-
credentials_file="credentials.json",
1558-
quota_project_id="octopus",
1559-
)
1560-
load_creds.assert_called_once_with("credentials.json", scopes=(
1561-
{% for scope in service.oauth_scopes %}
1562-
'{{ scope }}',
1563-
{% endfor %}
1564-
),
1565-
quota_project_id="octopus",
1566-
)
1567-
1568-
15691535
def test_{{ service.name|snake_case }}_base_transport_with_adc():
15701536
# Test the default credentials are used if credentials and credentials_file are None.
15711537
with mock.patch.object(google.auth, 'default', autospec=True) as adc, mock.patch('{{ (api.naming.module_namespace + (api.naming.versioned_module_name,) + service.meta.address.subpackage)|join(".") }}.services.{{ service.name|snake_case }}.transports.{{ service.name }}Transport._prep_wrapped_messages') as Transport:
@@ -1575,7 +1541,6 @@ def test_{{ service.name|snake_case }}_base_transport_with_adc():
15751541
adc.assert_called_once()
15761542

15771543

1578-
@requires_google_auth_gte_1_25_0
15791544
def test_{{ service.name|snake_case }}_auth_adc():
15801545
# If no credentials are provided, we should use ADC credentials.
15811546
with mock.patch.object(google.auth, 'default', autospec=True) as adc:
@@ -1591,21 +1556,6 @@ def test_{{ service.name|snake_case }}_auth_adc():
15911556
)
15921557

15931558

1594-
@requires_google_auth_lt_1_25_0
1595-
def test_{{ service.name|snake_case }}_auth_adc_old_google_auth():
1596-
# If no credentials are provided, we should use ADC credentials.
1597-
with mock.patch.object(google.auth, 'default', autospec=True) as adc:
1598-
adc.return_value = (ga_credentials.AnonymousCredentials(), None)
1599-
{{ service.client_name }}()
1600-
adc.assert_called_once_with(
1601-
scopes=(
1602-
{%- for scope in service.oauth_scopes %}
1603-
'{{ scope }}',
1604-
{%- endfor %}),
1605-
quota_project_id=None,
1606-
)
1607-
1608-
16091559
{% if 'grpc' in opts.transport %}
16101560
@pytest.mark.parametrize(
16111561
"transport_class",
@@ -1614,7 +1564,6 @@ def test_{{ service.name|snake_case }}_auth_adc_old_google_auth():
16141564
transports.{{ service.name }}GrpcAsyncIOTransport,
16151565
],
16161566
)
1617-
@requires_google_auth_gte_1_25_0
16181567
def test_{{ service.name|snake_case }}_transport_auth_adc(transport_class):
16191568
# If credentials and host are not provided, the transport class should use
16201569
# ADC credentials.
@@ -1631,26 +1580,6 @@ def test_{{ service.name|snake_case }}_transport_auth_adc(transport_class):
16311580
)
16321581

16331582

1634-
@pytest.mark.parametrize(
1635-
"transport_class",
1636-
[
1637-
transports.{{ service.name }}GrpcTransport,
1638-
transports.{{ service.name }}GrpcAsyncIOTransport,
1639-
],
1640-
)
1641-
@requires_google_auth_lt_1_25_0
1642-
def test_{{ service.name|snake_case }}_transport_auth_adc_old_google_auth(transport_class):
1643-
# If credentials and host are not provided, the transport class should use
1644-
# ADC credentials.
1645-
with mock.patch.object(google.auth, "default", autospec=True) as adc:
1646-
adc.return_value = (ga_credentials.AnonymousCredentials(), None)
1647-
transport_class(quota_project_id="octopus")
1648-
adc.assert_called_once_with(scopes=(
1649-
{% for scope in service.oauth_scopes %}
1650-
'{{ scope }}',
1651-
{% endfor %}),
1652-
quota_project_id="octopus",
1653-
)
16541583

16551584

16561585
@pytest.mark.parametrize(

0 commit comments

Comments
 (0)