Skip to content

Commit 40711fd

Browse files
authored
feat: Parser to consume the api-versioning value from proto (#2630)
This is part one to resolve b/330980553, this pr allows read and parse api versioning from proto to service model. Changes included in this pr: - rename current apiVersion to packageVersion. This packageVersion is parsed from package name and exposed in #1075. It was intended to be used in Spring codegen, but not actually used. It is used in generating sample region tags (see details [9ec3531](9ec3531)) - exposing apiVersion from Service model. - Parser.java to parse apiVersion from `ClientProto.apiVersion` to service.
1 parent 463801c commit 40711fd

15 files changed

+421
-39
lines changed

gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/Composer.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,7 @@ static List<GapicClass> prepareExecutableSamples(List<GapicClass> clazzes) {
207207
sample ->
208208
samples.add(
209209
addRegionTagAndHeaderToSample(
210-
sample, gapicClass.apiShortName(), gapicClass.apiVersion())));
210+
sample, gapicClass.apiShortName(), gapicClass.packageVersion())));
211211
clazzesWithSamples.add(gapicClass.withSamples(samples));
212212
});
213213
return clazzesWithSamples;

gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/AbstractServiceClientClassComposer.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ public GapicClass generate(GapicContext context, Service service) {
173173
updateGapicMetadata(context, service, className, grpcRpcsToJavaMethodNames);
174174
return GapicClass.create(kind, classDef, SampleComposerUtil.handleDuplicateSamples(samples))
175175
.withApiShortName(service.apiShortName())
176-
.withApiVersion(service.apiVersion());
176+
.withPackageVersion(service.packageVersion());
177177
}
178178

179179
private static List<AnnotationNode> createClassAnnotations(Service service, TypeStore typeStore) {

gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/AbstractServiceSettingsClassComposer.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ public GapicClass generate(GapicContext context, Service service) {
128128
.build();
129129
return GapicClass.create(kind, classDef, SampleComposerUtil.handleDuplicateSamples(samples))
130130
.withApiShortName(service.apiShortName())
131-
.withApiVersion(service.apiVersion());
131+
.withPackageVersion(service.packageVersion());
132132
}
133133

134134
private static List<CommentStatement> createClassHeaderComments(

gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/AbstractServiceStubSettingsClassComposer.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,7 @@ public GapicClass generate(GapicContext context, Service service) {
204204
return GapicClass.create(
205205
GapicClass.Kind.STUB, classDef, SampleComposerUtil.handleDuplicateSamples(samples))
206206
.withApiShortName(service.apiShortName())
207-
.withApiVersion(service.apiVersion());
207+
.withPackageVersion(service.packageVersion());
208208
}
209209

210210
protected MethodDefinition createDefaultCredentialsProviderBuilderMethod() {

gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/GapicClass.java

+5-5
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ public enum Kind {
4343
public abstract String apiShortName();
4444

4545
// Only used for generating the region tag for samples; therefore only used in select Composers.
46-
public abstract String apiVersion();
46+
public abstract String packageVersion();
4747

4848
/**
4949
* Create a GapicClass with minimal information. This is intended to be used for GapicClasses that
@@ -76,7 +76,7 @@ static Builder builder() {
7676
return new AutoValue_GapicClass.Builder()
7777
.setSamples(Collections.emptyList())
7878
.setApiShortName("")
79-
.setApiVersion("");
79+
.setPackageVersion("");
8080
}
8181

8282
abstract Builder toBuilder();
@@ -89,8 +89,8 @@ public final GapicClass withApiShortName(String apiShortName) {
8989
return toBuilder().setApiShortName(apiShortName).build();
9090
}
9191

92-
public final GapicClass withApiVersion(String apiVersion) {
93-
return toBuilder().setApiVersion(apiVersion).build();
92+
public final GapicClass withPackageVersion(String packageVersion) {
93+
return toBuilder().setPackageVersion(packageVersion).build();
9494
}
9595

9696
@AutoValue.Builder
@@ -103,7 +103,7 @@ abstract static class Builder {
103103

104104
abstract Builder setApiShortName(String apiShortName);
105105

106-
abstract Builder setApiVersion(String apiVersion);
106+
abstract Builder setPackageVersion(String packageVersion);
107107

108108
abstract GapicClass build();
109109
}

gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/Service.java

+17-8
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@
2727
public abstract class Service {
2828
public abstract String name();
2929

30+
@Nullable
31+
public abstract String apiVersion();
32+
3033
public abstract String defaultHost();
3134

3235
public abstract ImmutableList<String> oauthScopes();
@@ -52,6 +55,10 @@ public boolean hasDescription() {
5255
return !Strings.isNullOrEmpty(description());
5356
}
5457

58+
public boolean hasApiVersion() {
59+
return !Strings.isNullOrEmpty(apiVersion());
60+
}
61+
5562
public String hostServiceName() {
5663
// Host Service Name is guaranteed to exist and be non-null and non-empty
5764
// Parser will fail if the default host is not supplied
@@ -65,9 +72,9 @@ public String apiShortName() {
6572
return "";
6673
}
6774

68-
public String apiVersion() {
75+
public String packageVersion() {
6976
if (!Strings.isNullOrEmpty(protoPakkage())) {
70-
return parseApiVersion(protoPakkage());
77+
return parsePackageVersion(protoPakkage());
7178
}
7279
return "";
7380
}
@@ -158,6 +165,8 @@ public abstract static class Builder {
158165

159166
public abstract Builder setOverriddenName(String overriddenName);
160167

168+
public abstract Builder setApiVersion(String apiVersion);
169+
161170
public abstract Builder setDefaultHost(String defaultHost);
162171

163172
public abstract Builder setOauthScopes(List<String> oauthScopes);
@@ -177,17 +186,17 @@ public abstract static class Builder {
177186
public abstract Service build();
178187
}
179188

180-
private static String parseApiVersion(String protoPackage) {
181-
// parse protoPackage for apiVersion
189+
private static String parsePackageVersion(String protoPackage) {
190+
// parse protoPackage for packageVersion
182191
String[] pakkage = protoPackage.split("\\.");
183-
String apiVersion;
192+
String packageVersion;
184193
// e.g. v1, v2, v1beta1
185194
if (pakkage[pakkage.length - 1].matches("v[0-9].*")) {
186-
apiVersion = pakkage[pakkage.length - 1];
195+
packageVersion = pakkage[pakkage.length - 1];
187196
} else {
188-
apiVersion = "";
197+
packageVersion = "";
189198
}
190-
return apiVersion;
199+
return packageVersion;
191200
}
192201

193202
// Parse the service name from the default host configured in the protos

gapic-generator-java/src/main/java/com/google/api/generator/gapic/protoparser/Parser.java

+5
Original file line numberDiff line numberDiff line change
@@ -470,6 +470,11 @@ public static List<Service> parseService(
470470
}
471471
}
472472

473+
if (serviceOptions.hasExtension(ClientProto.apiVersion)) {
474+
String apiVersion = serviceOptions.getExtension(ClientProto.apiVersion);
475+
serviceBuilder.setApiVersion(apiVersion);
476+
}
477+
473478
String serviceName = s.getName();
474479
String overriddenServiceName = serviceName;
475480
String pakkage = TypeParser.getPackage(fileDescriptor);

gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/ComposerTest.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ public class ComposerTest {
4545
GrpcServiceCallableFactoryClassComposer.instance()
4646
.generate(context, echoProtoService)
4747
.withApiShortName(echoProtoService.apiShortName())
48-
.withApiVersion(echoProtoService.apiVersion()));
48+
.withPackageVersion(echoProtoService.packageVersion()));
4949
private final Sample sample =
5050
Sample.builder()
5151
.setRegionTag(
@@ -160,7 +160,7 @@ private List<GapicClass> getTestClassListFromService(Service testService) {
160160
.generate(context, testService)
161161
.withSamples(ListofSamples)
162162
.withApiShortName(testService.apiShortName())
163-
.withApiVersion(testService.apiVersion());
163+
.withPackageVersion(testService.packageVersion());
164164
List<GapicClass> testClassList = Arrays.asList(new GapicClass[] {testClass});
165165
return testClassList;
166166
}

gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpc/ServiceClientClassComposerTest.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ public static Collection<Object[]> data() {
7272
public String apiShortNameExpected;
7373

7474
@Parameterized.Parameter(3)
75-
public String apiVersionExpected;
75+
public String packageVersionExpected;
7676

7777
@Test
7878
public void generateServiceClientClasses() {
@@ -83,6 +83,6 @@ public void generateServiceClientClasses() {
8383
Assert.assertGoldenSamples(
8484
this.getClass(), name, clazz.classDefinition().packageString(), clazz.samples());
8585
Assert.assertCodeEquals(clazz.apiShortName(), apiShortNameExpected);
86-
Assert.assertCodeEquals(clazz.apiVersion(), apiVersionExpected);
86+
Assert.assertCodeEquals(clazz.packageVersion(), packageVersionExpected);
8787
}
8888
}

gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpc/ServiceSettingsClassComposerTest.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ public static Collection<Object[]> data() {
5555
public String apiShortNameExpected;
5656

5757
@Parameterized.Parameter(3)
58-
public String apiVersionExpected;
58+
public String packageVersionExpected;
5959

6060
@Test
6161
public void generateServiceSettingsClasses() {
@@ -69,6 +69,6 @@ public void generateServiceSettingsClasses() {
6969
clazz.classDefinition().packageString(),
7070
clazz.samples());
7171
Assert.assertCodeEquals(clazz.apiShortName(), apiShortNameExpected);
72-
Assert.assertCodeEquals(clazz.apiVersion(), apiVersionExpected);
72+
Assert.assertCodeEquals(clazz.packageVersion(), packageVersionExpected);
7373
}
7474
}

gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpc/ServiceStubClassComposerTest.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ public static Collection<Object[]> data() {
4545
public String apiShortNameExpected;
4646

4747
@Parameterized.Parameter(3)
48-
public String apiVersionExpected;
48+
public String packageVersionExpected;
4949

5050
@Test
5151
public void generateServiceStubClasses() {
@@ -55,6 +55,6 @@ public void generateServiceStubClasses() {
5555
Assert.assertGoldenClass(this.getClass(), clazz, name + ".golden");
5656
Assert.assertEmptySamples(clazz.samples());
5757
Assert.assertCodeEquals(clazz.apiShortName(), apiShortNameExpected);
58-
Assert.assertCodeEquals(clazz.apiVersion(), apiVersionExpected);
58+
Assert.assertCodeEquals(clazz.packageVersion(), packageVersionExpected);
5959
}
6060
}

gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpc/ServiceStubSettingsClassComposerTest.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ public static Collection<Object[]> data() {
6767
public String apiShortNameExpected;
6868

6969
@Parameterized.Parameter(3)
70-
public String apiVersionExpected;
70+
public String packageVersionExpected;
7171

7272
@Test
7373
public void generateServiceStubSettingsClasses() {
@@ -81,6 +81,6 @@ public void generateServiceStubSettingsClasses() {
8181
clazz.classDefinition().packageString(),
8282
clazz.samples());
8383
Assert.assertCodeEquals(clazz.apiShortName(), apiShortNameExpected);
84-
Assert.assertCodeEquals(clazz.apiVersion(), apiVersionExpected);
84+
Assert.assertCodeEquals(clazz.packageVersion(), packageVersionExpected);
8585
}
8686
}

gapic-generator-java/src/test/java/com/google/api/generator/gapic/model/ServiceTest.java

+44-12
Original file line numberDiff line numberDiff line change
@@ -16,24 +16,20 @@
1616

1717
import static com.google.common.truth.Truth.assertThat;
1818
import static org.junit.Assert.assertEquals;
19+
import static org.junit.Assert.assertFalse;
20+
import static org.junit.Assert.assertNull;
21+
import static org.junit.Assert.assertTrue;
1922

2023
import com.google.api.generator.engine.ast.TypeNode;
2124
import com.google.common.collect.ImmutableList;
2225
import com.google.common.collect.ImmutableSet;
2326
import java.util.Arrays;
27+
import org.junit.Before;
2428
import org.junit.Test;
2529

2630
public class ServiceTest {
2731
private static final String SHOWCASE_PACKAGE_NAME = "com.google.showcase.v1beta1";
28-
private static final Service.Builder testServiceBuilder =
29-
Service.builder()
30-
.setName("Echo")
31-
.setDefaultHost("localhost:7469")
32-
.setOauthScopes(Arrays.asList("https://www.googleapis.com/auth/cloud-platform"))
33-
.setPakkage(SHOWCASE_PACKAGE_NAME)
34-
.setProtoPakkage(SHOWCASE_PACKAGE_NAME)
35-
.setOriginalJavaPackage(SHOWCASE_PACKAGE_NAME)
36-
.setOverriddenName("Echo");
32+
private Service.Builder testServiceBuilder;
3733

3834
private static final Method.Builder testMethodBuilder =
3935
Method.builder()
@@ -50,6 +46,19 @@ public class ServiceTest {
5046
.setIsAsteriskBody(false)
5147
.setHttpVerb(HttpBindings.HttpVerb.GET);
5248

49+
@Before
50+
public void init() {
51+
testServiceBuilder =
52+
Service.builder()
53+
.setName("Echo")
54+
.setDefaultHost("localhost:7469")
55+
.setOauthScopes(Arrays.asList("https://www.googleapis.com/auth/cloud-platform"))
56+
.setPakkage(SHOWCASE_PACKAGE_NAME)
57+
.setProtoPakkage(SHOWCASE_PACKAGE_NAME)
58+
.setOriginalJavaPackage(SHOWCASE_PACKAGE_NAME)
59+
.setOverriddenName("Echo");
60+
}
61+
5362
@Test
5463
public void apiShortName_shouldReturnApiShortNameIfHostContainsRegionalEndpoint() {
5564
String defaultHost = "us-east1-pubsub.googleapis.com";
@@ -79,17 +88,40 @@ public void apiShortName_shouldReturnHostIfNoPeriods() {
7988
}
8089

8190
@Test
82-
public void apiVersion_shouldReturnVersionIfMatch() {
91+
public void packageVersion_shouldReturnVersionIfMatch() {
8392
String protoPackage = "com.google.showcase.v1";
8493
Service testService = testServiceBuilder.setProtoPakkage(protoPackage).build();
85-
assertEquals("v1", testService.apiVersion());
94+
assertEquals("v1", testService.packageVersion());
8695
}
8796

8897
@Test
89-
public void apiVersion_shouldReturnEmptyIfNoMatch() {
98+
public void packageVersion_shouldReturnEmptyIfNoMatch() {
9099
String protoPackage = "com.google.showcase";
91100
Service testService = testServiceBuilder.setProtoPakkage(protoPackage).build();
101+
assertEquals("", testService.packageVersion());
102+
}
103+
104+
@Test
105+
public void apiVersion_shouldReturnApiVersion() {
106+
String apiVersion = "v1_20230601";
107+
Service testService = testServiceBuilder.setApiVersion(apiVersion).build();
108+
assertTrue(testService.hasApiVersion());
109+
assertEquals(apiVersion, testService.apiVersion());
110+
}
111+
112+
@Test
113+
public void apiVersion_shouldReturnNoApiVersionWhenNull() {
114+
Service testService = testServiceBuilder.build();
115+
assertNull(testService.apiVersion());
116+
assertFalse(testService.hasApiVersion());
117+
}
118+
119+
@Test
120+
public void apiVersion_shouldReturnNoApiVersionWhenEmpty() {
121+
String apiVersion = "";
122+
Service testService = testServiceBuilder.setApiVersion(apiVersion).build();
92123
assertEquals("", testService.apiVersion());
124+
assertFalse(testService.hasApiVersion());
93125
}
94126

95127
@Test

0 commit comments

Comments
 (0)