Skip to content

Commit 2e574a9

Browse files
authored
feat(generator): add CreateFilesFromResources (#11291)
1 parent ef8101b commit 2e574a9

4 files changed

Lines changed: 87 additions & 0 deletions

File tree

generator/internal/discovery_file.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,12 @@ class DiscoveryFile {
3636
std::string package_name, std::string version,
3737
std::vector<DiscoveryTypeVertex const*> types);
3838

39+
std::string const& file_path() const { return file_path_; }
40+
std::string const& package_name() const { return package_name_; }
41+
std::string resource_name() const {
42+
return (resource_ ? resource_->name() : "");
43+
}
44+
3945
DiscoveryFile& AddImportPath(std::string import_path) {
4046
import_paths_.insert(std::move(import_path));
4147
return *this;

generator/internal/discovery_to_proto.cc

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,23 @@ Status ProcessMethodRequestsAndResponses(
257257
return {};
258258
}
259259

260+
std::vector<DiscoveryFile> CreateFilesFromResources(
261+
std::map<std::string, DiscoveryResource> const& resources,
262+
std::string const& product_name, std::string const& version,
263+
std::string const& output_path) {
264+
std::vector<DiscoveryFile> files;
265+
files.reserve(resources.size());
266+
for (auto const& r : resources) {
267+
files.push_back(DiscoveryFile{
268+
&r.second, r.second.FormatFilePath(product_name, version, output_path),
269+
r.second.FormatPackageName(product_name, version), version,
270+
r.second.GetRequestTypesList()}
271+
.AddImportPath("/google/cloud/$product_name$/$version$/"
272+
"internal/common.proto"));
273+
}
274+
return files;
275+
}
276+
260277
Status GenerateProtosFromDiscoveryDoc(std::string const& url,
261278
std::string const&, std::string const&,
262279
std::string const&) {

generator/internal/discovery_to_proto.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#ifndef GOOGLE_CLOUD_CPP_GENERATOR_INTERNAL_DISCOVERY_TO_PROTO_H
1616
#define GOOGLE_CLOUD_CPP_GENERATOR_INTERNAL_DISCOVERY_TO_PROTO_H
1717

18+
#include "generator/internal/discovery_file.h"
1819
#include "generator/internal/discovery_resource.h"
1920
#include "generator/internal/discovery_type_vertex.h"
2021
#include "google/cloud/status_or.h"
@@ -54,6 +55,12 @@ Status ProcessMethodRequestsAndResponses(
5455
std::map<std::string, DiscoveryResource>& resources,
5556
std::map<std::string, DiscoveryTypeVertex>& types);
5657

58+
// Creates a DiscoveryFile object for each DiscoveryResource in resources.
59+
std::vector<DiscoveryFile> CreateFilesFromResources(
60+
std::map<std::string, DiscoveryResource> const& resources,
61+
std::string const& product_name, std::string const& version,
62+
std::string const& output_path);
63+
5764
Status GenerateProtosFromDiscoveryDoc(std::string const& url,
5865
std::string const& protobuf_proto_path,
5966
std::string const& googleapis_proto_path,

generator/internal/discovery_to_proto_test.cc

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ using ::testing::Eq;
3030
using ::testing::HasSubstr;
3131
using ::testing::IsEmpty;
3232
using ::testing::Key;
33+
using ::testing::SizeIs;
3334
using ::testing::UnorderedElementsAre;
3435

3536
TEST(ExtractTypesFromSchemaTest, Success) {
@@ -792,6 +793,62 @@ TEST(ProcessMethodRequestsAndResponsesTest, TypeInsertError) {
792793
HasSubstr("Unable to insert type Foos.CreateRequest")));
793794
}
794795

796+
TEST(CreateFilesFromResourcesTest, NonEmptyResources) {
797+
auto constexpr kResourceJson = R"""({
798+
"methods": {
799+
"create": {
800+
"scopes": [
801+
"https://www.googleapis.com/auth/cloud-platform"
802+
],
803+
"path": "projects/{project}/zones/{zone}/myResources/{fooId}",
804+
"httpMethod": "POST",
805+
"parameters": {
806+
"project": {
807+
"type": "string"
808+
},
809+
"zone": {
810+
"type": "string"
811+
},
812+
"fooId": {
813+
"type": "string"
814+
}
815+
},
816+
"response": {
817+
"$ref": "Operation"
818+
},
819+
"request": {
820+
"$ref": "Foo"
821+
},
822+
"parameterOrder": [
823+
"project",
824+
"zone",
825+
"fooId"
826+
]
827+
}
828+
}
829+
})""";
830+
auto const resource_json =
831+
nlohmann::json::parse(kResourceJson, nullptr, false);
832+
ASSERT_TRUE(resource_json.is_object());
833+
std::map<std::string, DiscoveryResource> resources;
834+
resources.emplace("foos", DiscoveryResource("foos", "", "", resource_json));
835+
auto result =
836+
CreateFilesFromResources(resources, "product_name", "version", "tmp");
837+
ASSERT_THAT(result, SizeIs(1));
838+
EXPECT_THAT(result.front().resource_name(), Eq("foos"));
839+
EXPECT_THAT(result.front().file_path(),
840+
Eq("tmp/google/cloud/product_name/foos/version/foos.proto"));
841+
EXPECT_THAT(result.front().package_name(),
842+
Eq("google.cloud.cpp.product_name.foos.version"));
843+
}
844+
845+
TEST(CreateFilesFromResourcesTest, EmptyResources) {
846+
std::map<std::string, DiscoveryResource> resources;
847+
auto result =
848+
CreateFilesFromResources(resources, "product_name", "version", "tmp");
849+
EXPECT_THAT(result, IsEmpty());
850+
}
851+
795852
} // namespace
796853
} // namespace generator_internal
797854
} // namespace cloud

0 commit comments

Comments
 (0)