Skip to content
This repository was archived by the owner on Mar 26, 2026. It is now read-only.

Commit f33651d

Browse files
committed
wip
1 parent 3207e01 commit f33651d

File tree

6 files changed

+83
-6
lines changed

6 files changed

+83
-6
lines changed

gapic/generator/generator.py

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -269,11 +269,19 @@ def _render_template(
269269
# library. This means that the module names will need to be versioned in
270270
# import statements. For example `import google.cloud.library_v2` instead
271271
# of `import google.cloud.library`.
272+
# If default version is specified, and doesn't match the current version being generated or
273+
# `python_settings.experimental_features.unversioned_package_disabled` is set
272274
if (
273-
template_name.startswith("%namespace/%name/")
274-
and api_schema.all_library_settings[
275-
api_schema.naming.proto_package
276-
].python_settings.experimental_features.unversioned_package_disabled
275+
(
276+
template_name.startswith("%namespace/%name/")
277+
and api_schema.all_library_settings[
278+
api_schema.naming.proto_package
279+
].python_settings.experimental_features.unversioned_package_disabled
280+
) or
281+
(
282+
len(opts.default_version) > 0 and
283+
opts.default_version != api_schema.naming.version
284+
)
277285
):
278286
return answer
279287

gapic/schema/naming.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,9 @@ class Naming(abc.ABC):
4545
proto_package: str = ""
4646
_warehouse_package_name: str = ""
4747
proto_plus_deps: Tuple[str, ...] = dataclasses.field(default_factory=tuple)
48+
non_default_versions: Tuple[str, ...] = dataclasses.field(default_factory=tuple)
4849
api_description: str = ""
50+
default_version: str = ""
4951
_documentation_name: str = ""
5052
documentation_uri: str = ""
5153
release_level: str = ""
@@ -160,11 +162,21 @@ def build(
160162
package_info, _warehouse_package_name=opts.warehouse_package_name
161163
)
162164

165+
if opts.non_default_versions:
166+
package_info = dataclasses.replace(
167+
package_info, non_default_versions=opts.non_default_versions
168+
)
169+
163170
if opts.api_description:
164171
package_info = dataclasses.replace(
165172
package_info, api_description=opts.api_description
166173
)
167174

175+
if opts.default_version:
176+
package_info = dataclasses.replace(
177+
package_info, default_version=opts.default_version
178+
)
179+
168180
if opts.documentation_name:
169181
package_info = dataclasses.replace(
170182
package_info, _documentation_name=opts.documentation_name

gapic/templates/docs/index.rst.j2

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,15 @@ API Reference
1010

1111
{{ api.naming.versioned_module_name }}/services_
1212
{{ api.naming.versioned_module_name }}/types_
13-
13+
{% for api_version in api.naming.non_default_versions %}
14+
API Reference
15+
-------------
16+
.. toctree::
17+
:maxdepth: 2
18+
19+
{{ api_version }}/services_
20+
{{ api_version }}/types_
21+
{% endfor %}
1422

1523
Changelog
1624
---------

gapic/utils/options.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,9 @@ class Options:
5050
service_yaml_config: Dict[str, Any] = dataclasses.field(default_factory=dict)
5151
rest_numeric_enums: bool = False
5252
proto_plus_deps: Tuple[str, ...] = dataclasses.field(default=("",))
53+
non_default_versions: Tuple[str, ...] = dataclasses.field(default=("",))
5354
api_description: str = ""
55+
default_version: str = ""
5456
documentation_name: str = ""
5557
documentation_uri: str = ""
5658
release_level: str = ""
@@ -75,6 +77,7 @@ class Options:
7577
"rest-numeric-enums",
7678
# proto plus dependencies delineated by '+'
7779
# For example, 'google.cloud.api.v1+google.cloud.anotherapi.v2'
80+
"non-default-versions",
7881
"proto-plus-deps",
7982
"release-level", # One of ["preview", "stable"]
8083
"documentation-name",
@@ -187,6 +190,10 @@ def tweak_path(p):
187190
if old_naming:
188191
autogen_snippets = False
189192

193+
non_default_versions = tuple(opts.pop("non-default-versions", ""))
194+
if len(non_default_versions):
195+
non_default_versions = tuple(non_default_versions[0].split("+"))
196+
190197
proto_plus_deps = tuple(opts.pop("proto-plus-deps", ""))
191198
if len(proto_plus_deps):
192199
proto_plus_deps = tuple(proto_plus_deps[0].split("+"))
@@ -211,14 +218,16 @@ def tweak_path(p):
211218
transport=opts.pop("transport", ["grpc"])[0].split("+"),
212219
service_yaml_config=service_yaml_config,
213220
rest_numeric_enums=bool(opts.pop("rest-numeric-enums", False)),
214-
title=service_yaml_config.get("title", ""),
221+
non_default_versions=non_default_versions,
222+
default_version=opts.pop("default-version", [""]).pop(),
215223
documentation_name=opts.pop("documentation-name", [""]).pop(),
216224
documentation_uri=documentation_uri,
217225
api_description=api_description,
218226
proto_plus_deps=proto_plus_deps,
219227
release_level=opts.pop(
220228
"release-level", ["preview"]
221229
).pop(), # Default to "preview" unless explicitly set to "stable"
230+
title=service_yaml_config.get("title", ""),
222231
)
223232

224233
# Note: if we ever need to recursively check directories for sample

tests/unit/generator/test_options.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,35 @@ def test_options_autogen_snippets_false_for_old_naming():
225225
assert not options.autogen_snippets
226226

227227

228+
def test_options_non_default_versions():
229+
opts = Options.build("non-default-versions=")
230+
assert opts.non_default_versions == ("",)
231+
232+
opts = Options.build("non-default-versions=google.apps.script.type.calendar")
233+
assert opts.non_default_versions == ("google.apps.script.type.calendar",)
234+
235+
opts = Options.build(
236+
"non-default-versions=\
237+
google.apps.script.type.calendar+\
238+
google.apps.script.type.docs+\
239+
google.apps.script.type.drive+\
240+
google.apps.script.type.gmail+\
241+
google.apps.script.type.sheets+\
242+
google.apps.script.type.slides+\
243+
google.apps.script.type"
244+
)
245+
246+
assert opts.non_default_versions == (
247+
"google.apps.script.type.calendar",
248+
"google.apps.script.type.docs",
249+
"google.apps.script.type.drive",
250+
"google.apps.script.type.gmail",
251+
"google.apps.script.type.sheets",
252+
"google.apps.script.type.slides",
253+
"google.apps.script.type",
254+
)
255+
256+
228257
def test_options_proto_plus_deps():
229258
opts = Options.build("proto-plus-deps=")
230259
assert opts.proto_plus_deps == ("",)

tests/unit/schema/test_naming.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,17 @@ def test_cli_override_documentation_uri():
298298
assert n.documentation_uri == "https://cloud.google.com/testoverride"
299299

300300

301+
def test_cli_override_default_version():
302+
FileDesc = descriptor_pb2.FileDescriptorProto
303+
proto1 = FileDesc(package="google.translation.v1")
304+
n = naming.Naming.build(
305+
proto1,
306+
opts=Options(default_version="v1"),
307+
)
308+
assert n.default_version == "v1"
309+
310+
311+
301312
def test_build_factory():
302313
proto = descriptor_pb2.FileDescriptorProto(package="google.mollusc.v1alpha1")
303314
old = naming.Naming.build(proto, opts=Options(old_naming=True))

0 commit comments

Comments
 (0)