From 1a27b3434eeabff6e429af858fe6450f755a46d1 Mon Sep 17 00:00:00 2001 From: ohmayr Date: Wed, 24 Sep 2025 17:27:43 +0000 Subject: [PATCH 1/7] feat: create repo metadata from service config --- .generator/cli.py | 33 ++++++++++++++++++++++++--------- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/.generator/cli.py b/.generator/cli.py index bf9d6bf721ff..5277e4860b0f 100644 --- a/.generator/cli.py +++ b/.generator/cli.py @@ -398,22 +398,37 @@ def _create_repo_metadata_from_service_config( Dict: The content of the .repo-metadata.json file. """ full_service_config_path = f"{source}/{api_path}/{service_config_name}" + with open(full_service_config_path, "r") as f: + service_config = yaml.safe_load(f) + + publishing = service_config.get("publishing", {}) + name_pretty = service_config.get("title", "") + product_documentation = publishing.get("product_documentation", "") + api_shortname = service_config.get("name", "").split(".")[0] + distribution_name = publishing.get("library_name", library_id) + documentation = service_config.get("documentation", {}) + api_description = documentation.get("summary", "") + issue_tracker = service_config.get("new_issue_uri", "https://github.com/googleapis/google-cloud-python/issues") + + # TODO(ohmayr): Determine release level from api_path + release_level = "stable" + # TODO(https://github.com/googleapis/librarian/issues/2332): Read the api # service config to backfill `.repo-metadata.json`. return { - "api_shortname": "", - "name_pretty": "", - "product_documentation": "", - "api_description": "", - "client_documentation": "", - "issue_tracker": "", - "release_level": "", + "api_shortname": api_shortname, + "name_pretty": name_pretty, + "product_documentation": product_documentation, + "api_description": api_description, + "client_documentation": f"https://cloud.google.com/python/docs/reference/{distribution_name}/latest", + "issue_tracker": issue_tracker, + "release_level": release_level, "language": "python", "library_type": "GAPIC_AUTO", "repo": "googleapis/google-cloud-python", - "distribution_name": "", - "api_id": "", + "distribution_name": distribution_name, + "api_id": "", # This can be added later if needed } From b5b112fb007ec4d4e7ffb5bb23a94b1e0ca18667 Mon Sep 17 00:00:00 2001 From: ohmayr Date: Wed, 24 Sep 2025 17:30:08 +0000 Subject: [PATCH 2/7] cleanup --- .generator/cli.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/.generator/cli.py b/.generator/cli.py index 5277e4860b0f..da4ae360c3e0 100644 --- a/.generator/cli.py +++ b/.generator/cli.py @@ -414,8 +414,6 @@ def _create_repo_metadata_from_service_config( release_level = "stable" - # TODO(https://github.com/googleapis/librarian/issues/2332): Read the api - # service config to backfill `.repo-metadata.json`. return { "api_shortname": api_shortname, "name_pretty": name_pretty, From babbe745baac8f79aa12224bbe9da1d75cf16319 Mon Sep 17 00:00:00 2001 From: ohmayr Date: Wed, 24 Sep 2025 20:26:25 +0000 Subject: [PATCH 3/7] add missing info --- .generator/cli.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.generator/cli.py b/.generator/cli.py index da4ae360c3e0..4b04ed3f155c 100644 --- a/.generator/cli.py +++ b/.generator/cli.py @@ -401,11 +401,11 @@ def _create_repo_metadata_from_service_config( with open(full_service_config_path, "r") as f: service_config = yaml.safe_load(f) + api_id = service_config.get("name", {}) publishing = service_config.get("publishing", {}) name_pretty = service_config.get("title", "") - product_documentation = publishing.get("product_documentation", "") + product_documentation = publishing.get("documentation_uri", "") api_shortname = service_config.get("name", "").split(".")[0] - distribution_name = publishing.get("library_name", library_id) documentation = service_config.get("documentation", {}) api_description = documentation.get("summary", "") issue_tracker = service_config.get("new_issue_uri", "https://github.com/googleapis/google-cloud-python/issues") @@ -419,14 +419,14 @@ def _create_repo_metadata_from_service_config( "name_pretty": name_pretty, "product_documentation": product_documentation, "api_description": api_description, - "client_documentation": f"https://cloud.google.com/python/docs/reference/{distribution_name}/latest", + "client_documentation": f"https://cloud.google.com/python/docs/reference/{library_id}/latest", "issue_tracker": issue_tracker, "release_level": release_level, "language": "python", "library_type": "GAPIC_AUTO", "repo": "googleapis/google-cloud-python", - "distribution_name": distribution_name, - "api_id": "", # This can be added later if needed + "distribution_name": library_id, + "api_id": api_id, } From 0914078ea20ff38c9aa3538c979ce32c11d79cbf Mon Sep 17 00:00:00 2001 From: ohmayr Date: Wed, 24 Sep 2025 20:42:20 +0000 Subject: [PATCH 4/7] populate release level --- .generator/cli.py | 26 ++++++++++++++++++-------- .generator/test_cli.py | 37 ++++++++++++++++++++++++++++++++++++- 2 files changed, 54 insertions(+), 9 deletions(-) diff --git a/.generator/cli.py b/.generator/cli.py index 4b04ed3f155c..8f288b67eb86 100644 --- a/.generator/cli.py +++ b/.generator/cli.py @@ -188,9 +188,7 @@ def _get_new_library_config(request_data: Dict) -> Dict: return {} -def _add_new_library_version( - library_config: Dict -) -> None: +def _add_new_library_version(library_config: Dict) -> None: """Adds the library version to the configuration if it's not present. Args: @@ -383,6 +381,19 @@ def _clean_up_files_after_post_processing(output: str, library_id: str): os.remove(gapic_version_file) +def _determine_release_level_from_api_path(api_path: str) -> str: + """Determines the release level from the API path. + + Args: + api_path (str): The path to the API. + + Returns: + str: The release level, which can be 'alpha', 'beta', or 'stable'. + """ + version = Path(api_path).name + return next((level for level in ["beta", "alpha"] if level in version), "stable") + + def _create_repo_metadata_from_service_config( service_config_name: str, api_path: str, source: str, library_id: str ) -> Dict: @@ -408,11 +419,10 @@ def _create_repo_metadata_from_service_config( api_shortname = service_config.get("name", "").split(".")[0] documentation = service_config.get("documentation", {}) api_description = documentation.get("summary", "") - issue_tracker = service_config.get("new_issue_uri", "https://github.com/googleapis/google-cloud-python/issues") - - # TODO(ohmayr): Determine release level from api_path - release_level = "stable" - + issue_tracker = service_config.get( + "new_issue_uri", "https://github.com/googleapis/google-cloud-python/issues" + ) + release_level = _determine_release_level_from_api_path(api_path) return { "api_shortname": api_shortname, diff --git a/.generator/test_cli.py b/.generator/test_cli.py index 30ce58eef9dd..4e68a94f60e0 100644 --- a/.generator/test_cli.py +++ b/.generator/test_cli.py @@ -40,6 +40,7 @@ _create_repo_metadata_from_service_config, _determine_generator_command, _determine_library_namespace, + _determine_release_level_from_api_path, _generate_api, _generate_repo_metadata_file, _get_api_generator_options, @@ -581,6 +582,7 @@ def test_handle_generate_success( mock_clean_up_files_after_post_processing = mocker.patch( "cli._clean_up_files_after_post_processing" ) + mocker.patch("cli._generate_repo_metadata_file") handle_generate() @@ -1108,13 +1110,46 @@ def test_determine_library_namespace_success( assert namespace == expected_namespace -def test_create_repo_metadata_from_service_config(): +def test_determine_release_level_alpha(): + """Tests that the release level is alpha.""" + api_path = "google/cloud/language/v1alpha1" + release_level = _determine_release_level_from_api_path(api_path) + assert release_level == "alpha" + + +def test_determine_release_level_beta(): + """Tests that the release level is beta.""" + api_path = "google/cloud/language/v1beta1" + release_level = _determine_release_level_from_api_path(api_path) + assert release_level == "beta" + + +def test_determine_release_level_stable(): + """Tests that the release level is stable.""" + api_path = "google/cloud/language/v1" + release_level = _determine_release_level_from_api_path(api_path) + assert release_level == "stable" + + +def test_create_repo_metadata_from_service_config(mocker): """Tests the creation of .repo-metadata.json content.""" service_config_name = "service_config.yaml" api_path = "google/cloud/language/v1" source = "/source" library_id = "google-cloud-language" + mock_yaml_content = { + "name": "google.cloud.language.v1", + "title": "Cloud Natural Language API", + "publishing": { + "documentation_uri": "https://cloud.google.com/natural-language/docs" + }, + "documentation": {"summary": "A comprehensive summary."}, + "new_issue_uri": "https://example.com/issues", + } + mocker.patch("builtins.open", mocker.mock_open(read_data="")) + mocker.patch("yaml.safe_load", return_value=mock_yaml_content) + metadata = _create_repo_metadata_from_service_config( service_config_name, api_path, source, library_id ) From ffc69ddb96b65c465eea04c9c2f82545cad70855 Mon Sep 17 00:00:00 2001 From: ohmayr Date: Wed, 24 Sep 2025 20:50:36 +0000 Subject: [PATCH 5/7] address feedback --- .generator/cli.py | 6 ++++-- .generator/test_cli.py | 12 ++++++------ 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/.generator/cli.py b/.generator/cli.py index 8f288b67eb86..9b7107a0e8ab 100644 --- a/.generator/cli.py +++ b/.generator/cli.py @@ -388,10 +388,12 @@ def _determine_release_level_from_api_path(api_path: str) -> str: api_path (str): The path to the API. Returns: - str: The release level, which can be 'alpha', 'beta', or 'stable'. + str: The release level, which can be 'preview' or 'stable'. """ version = Path(api_path).name - return next((level for level in ["beta", "alpha"] if level in version), "stable") + if "beta" in version or "alpha" in version: + return "preview" + return "stable" def _create_repo_metadata_from_service_config( diff --git a/.generator/test_cli.py b/.generator/test_cli.py index 4e68a94f60e0..9d7ce49d6c4a 100644 --- a/.generator/test_cli.py +++ b/.generator/test_cli.py @@ -1110,18 +1110,18 @@ def test_determine_library_namespace_success( assert namespace == expected_namespace -def test_determine_release_level_alpha(): - """Tests that the release level is alpha.""" +def test_determine_release_level_alpha_is_preview(): + """Tests that the release level is preview for alpha versions.""" api_path = "google/cloud/language/v1alpha1" release_level = _determine_release_level_from_api_path(api_path) - assert release_level == "alpha" + assert release_level == "preview" -def test_determine_release_level_beta(): - """Tests that the release level is beta.""" +def test_determine_release_level_beta_is_preview(): + """Tests that the release level is preview for beta versions.""" api_path = "google/cloud/language/v1beta1" release_level = _determine_release_level_from_api_path(api_path) - assert release_level == "beta" + assert release_level == "preview" def test_determine_release_level_stable(): From c4b066f55025ae5bdd65e74eeda991c932cd6665 Mon Sep 17 00:00:00 2001 From: ohmayr Date: Wed, 24 Sep 2025 21:05:21 +0000 Subject: [PATCH 6/7] address feedback --- .generator/cli.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/.generator/cli.py b/.generator/cli.py index 9b7107a0e8ab..53ca01b63ad9 100644 --- a/.generator/cli.py +++ b/.generator/cli.py @@ -382,6 +382,9 @@ def _clean_up_files_after_post_processing(output: str, library_id: str): def _determine_release_level_from_api_path(api_path: str) -> str: + # TODO(https://github.com/googleapis/librarian/issues/2352): Determine if + # this logic can be used to set the release level. + # For now, we set the release_level as "preview" for newly generated clients. """Determines the release level from the API path. Args: @@ -424,7 +427,12 @@ def _create_repo_metadata_from_service_config( issue_tracker = service_config.get( "new_issue_uri", "https://github.com/googleapis/google-cloud-python/issues" ) - release_level = _determine_release_level_from_api_path(api_path) + + # TODO(https://github.com/googleapis/librarian/issues/2352): Determine if + # `_determine_release_level_from_api_path` can be used to + # set the release level. For now, we set the release_level as "preview" for + # newly generated clients. + release_level = "preview" return { "api_shortname": api_shortname, From ae991cc4b4349d7f20485a32836b79053e50ecd8 Mon Sep 17 00:00:00 2001 From: ohmayr Date: Wed, 24 Sep 2025 22:10:33 +0000 Subject: [PATCH 7/7] address feedback --- .generator/cli.py | 4 ++-- .generator/test_cli.py | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.generator/cli.py b/.generator/cli.py index 53ca01b63ad9..58e93720b17f 100644 --- a/.generator/cli.py +++ b/.generator/cli.py @@ -381,7 +381,7 @@ def _clean_up_files_after_post_processing(output: str, library_id: str): os.remove(gapic_version_file) -def _determine_release_level_from_api_path(api_path: str) -> str: +def _determine_release_level(api_path: str) -> str: # TODO(https://github.com/googleapis/librarian/issues/2352): Determine if # this logic can be used to set the release level. # For now, we set the release_level as "preview" for newly generated clients. @@ -429,7 +429,7 @@ def _create_repo_metadata_from_service_config( ) # TODO(https://github.com/googleapis/librarian/issues/2352): Determine if - # `_determine_release_level_from_api_path` can be used to + # `_determine_release_level` can be used to # set the release level. For now, we set the release_level as "preview" for # newly generated clients. release_level = "preview" diff --git a/.generator/test_cli.py b/.generator/test_cli.py index 9d7ce49d6c4a..74c060926aba 100644 --- a/.generator/test_cli.py +++ b/.generator/test_cli.py @@ -40,7 +40,7 @@ _create_repo_metadata_from_service_config, _determine_generator_command, _determine_library_namespace, - _determine_release_level_from_api_path, + _determine_release_level, _generate_api, _generate_repo_metadata_file, _get_api_generator_options, @@ -1113,21 +1113,21 @@ def test_determine_library_namespace_success( def test_determine_release_level_alpha_is_preview(): """Tests that the release level is preview for alpha versions.""" api_path = "google/cloud/language/v1alpha1" - release_level = _determine_release_level_from_api_path(api_path) + release_level = _determine_release_level(api_path) assert release_level == "preview" def test_determine_release_level_beta_is_preview(): """Tests that the release level is preview for beta versions.""" api_path = "google/cloud/language/v1beta1" - release_level = _determine_release_level_from_api_path(api_path) + release_level = _determine_release_level(api_path) assert release_level == "preview" def test_determine_release_level_stable(): """Tests that the release level is stable.""" api_path = "google/cloud/language/v1" - release_level = _determine_release_level_from_api_path(api_path) + release_level = _determine_release_level(api_path) assert release_level == "stable"