Skip to content

Commit 8dae3c6

Browse files
authored
feat(internal/librarian/java): add support for NoRestNumericEnums in Java generation (#4341)
Java generation to respect `no_rest_numeric_enums` set in librarian config (parsed from BUILD.bazel in [migrate](#4335)), and pass down argument to java generator. For #4062
1 parent 5bfb1b8 commit 8dae3c6

2 files changed

Lines changed: 38 additions & 9 deletions

File tree

internal/librarian/java/generate.go

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,8 @@ func generateAPI(ctx context.Context, api *config.API, library *config.Library,
8888
return fmt.Errorf("failed to create directory %s: %w", dir, err)
8989
}
9090
}
91-
protocOptions, err := createProtocOptions(api, library, googleapisDir, protoDir, grpcDir, gapicDir)
91+
javaAPI := findJavaAPI(library, api)
92+
protocOptions, err := createProtocOptions(api, javaAPI, library, googleapisDir, protoDir, grpcDir, gapicDir)
9293
if err != nil {
9394
return fmt.Errorf("failed to create protoc options: %w", err)
9495
}
@@ -187,7 +188,7 @@ func buildLicenseText(year int) string {
187188
return b.String()
188189
}
189190

190-
func createProtocOptions(api *config.API, library *config.Library, googleapisDir, protoDir, grpcDir, gapicDir string) ([]string, error) {
191+
func createProtocOptions(api *config.API, javaAPI *config.JavaAPI, library *config.Library, googleapisDir, protoDir, grpcDir, gapicDir string) ([]string, error) {
191192
args := []string{
192193
// --java_out generates standard Protocol Buffer Java classes.
193194
fmt.Sprintf("--java_out=%s", protoDir),
@@ -215,21 +216,22 @@ func createProtocOptions(api *config.API, library *config.Library, googleapisDir
215216
gapicOpts = append(gapicOpts, gapicOpt("api-service-config", filepath.Join(googleapisDir, apiCfg.ServiceConfig)))
216217
}
217218

218-
gc, err := serviceconfig.FindGRPCServiceConfig(googleapisDir, api.Path)
219+
grpcServiceConfig, err := serviceconfig.FindGRPCServiceConfig(googleapisDir, api.Path)
219220
if err != nil {
220221
return nil, fmt.Errorf("failed to find grpc service config: %w", err)
221222
}
222-
if gc != "" {
223+
if grpcServiceConfig != "" {
223224
// grpc-service-config specifies the retry and timeout settings for the gRPC client.
224-
gapicOpts = append(gapicOpts, gapicOpt("grpc-service-config", filepath.Join(googleapisDir, gc)))
225+
gapicOpts = append(gapicOpts, gapicOpt("grpc-service-config", filepath.Join(googleapisDir, grpcServiceConfig)))
225226
}
226227
// transport specifies whether to generate gRPC, REST, or both types of clients.
227228
gapicOpts = append(gapicOpts, gapicOpt("transport", transport))
229+
228230
// rest-numeric-enums ensures that enums in REST requests are encoded as numbers
229231
// rather than strings.
230-
// TODO(https://github.com/googleapis/librarian/issues/4130):
231-
// assign this according to config
232-
gapicOpts = append(gapicOpts, "rest-numeric-enums")
232+
if javaAPI == nil || !javaAPI.NoRestNumericEnums {
233+
gapicOpts = append(gapicOpts, "rest-numeric-enums")
234+
}
233235

234236
// --java_gapic_out invokes the GAPIC generator.
235237
// The "metadata:" prefix is a parameter that tells the generator to include
@@ -391,3 +393,15 @@ func collectJavaFiles(root string) ([]string, error) {
391393
})
392394
return files, err
393395
}
396+
397+
func findJavaAPI(library *config.Library, api *config.API) *config.JavaAPI {
398+
if library.Java == nil {
399+
return nil
400+
}
401+
for _, ja := range library.Java.JavaAPIs {
402+
if ja.Path == api.Path {
403+
return ja
404+
}
405+
}
406+
return nil
407+
}

internal/librarian/java/generate_test.go

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ func TestCreateProtocOptions(t *testing.T) {
3737
for _, test := range []struct {
3838
name string
3939
api *config.API
40+
javaAPI *config.JavaAPI
4041
library *config.Library
4142
expected []string
4243
wantErr bool
@@ -64,10 +65,24 @@ func TestCreateProtocOptions(t *testing.T) {
6465
"--java_gapic_opt=metadata,api-service-config=../../testdata/googleapis/google/cloud/secretmanager/v1/secretmanager_v1.yaml,grpc-service-config=../../testdata/googleapis/google/cloud/secretmanager/v1/secretmanager_grpc_service_config.json,transport=rest,rest-numeric-enums",
6566
},
6667
},
68+
{
69+
name: "no rest numeric enum case",
70+
api: &config.API{Path: "google/cloud/secretmanager/v1"},
71+
library: &config.Library{},
72+
javaAPI: &config.JavaAPI{
73+
NoRestNumericEnums: true,
74+
},
75+
expected: []string{
76+
"--java_out=proto-out",
77+
"--java_grpc_out=grpc-out",
78+
"--java_gapic_out=metadata:gapic-out",
79+
"--java_gapic_opt=metadata,api-service-config=../../testdata/googleapis/google/cloud/secretmanager/v1/secretmanager_v1.yaml,grpc-service-config=../../testdata/googleapis/google/cloud/secretmanager/v1/secretmanager_grpc_service_config.json,transport=grpc+rest",
80+
},
81+
},
6782
} {
6883
t.Run(test.name, func(t *testing.T) {
6984
t.Parallel()
70-
got, err := createProtocOptions(test.api, test.library, googleapisDir, "proto-out", "grpc-out", "gapic-out")
85+
got, err := createProtocOptions(test.api, test.javaAPI, test.library, googleapisDir, "proto-out", "grpc-out", "gapic-out")
7186
if (err != nil) != test.wantErr {
7287
t.Fatalf("createProtocOptions() error = %v, wantErr %v", err, test.wantErr)
7388
}

0 commit comments

Comments
 (0)