Skip to content

Commit 5a44ed7

Browse files
authored
feat(librarian/swift): use discovery config (#6604)
Use the discovery configuration to generate `getOperation()` mixins in discovery-based APIs.
1 parent 3f6cfed commit 5a44ed7

4 files changed

Lines changed: 80 additions & 19 deletions

File tree

internal/librarian/swift/generate.go

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323
"github.com/googleapis/librarian/internal/command"
2424
"github.com/googleapis/librarian/internal/config"
2525
"github.com/googleapis/librarian/internal/serviceconfig"
26+
"github.com/googleapis/librarian/internal/sidekick/api"
2627
"github.com/googleapis/librarian/internal/sidekick/parser"
2728
sidekickswift "github.com/googleapis/librarian/internal/sidekick/swift"
2829
"github.com/googleapis/librarian/internal/sources"
@@ -74,8 +75,8 @@ func camelLibraryName(api string) string {
7475
return name.String()
7576
}
7677

77-
func libraryToModelConfig(library *config.Library, api *config.API, src *sources.Sources) (*parser.ModelConfig, error) {
78-
svcConfig, err := serviceconfig.Find(src.Googleapis, api.Path, config.LanguageSwift)
78+
func libraryToModelConfig(library *config.Library, apiCfg *config.API, src *sources.Sources) (*parser.ModelConfig, error) {
79+
svcConfig, err := serviceconfig.Find(src.Googleapis, apiCfg.Path, config.LanguageSwift)
7980
if err != nil {
8081
return nil, err
8182
}
@@ -89,15 +90,29 @@ func libraryToModelConfig(library *config.Library, api *config.API, src *sources
8990
specFormat = library.SpecificationFormat
9091
}
9192

92-
return &parser.ModelConfig{
93+
modelCfg := &parser.ModelConfig{
9394
Language: config.LanguageSwift,
9495
SpecificationFormat: specFormat,
9596
ServiceConfig: svcConfig.ServiceConfig,
96-
SpecificationSource: api.Path,
97+
SpecificationSource: apiCfg.Path,
9798
Source: sourceConfig,
9899
Codec: map[string]string{
99100
"copyright-year": library.CopyrightYear,
100101
"version": library.Version,
101102
},
102-
}, nil
103+
}
104+
if library.Swift != nil && library.Swift.Discovery != nil {
105+
pollers := make([]*api.Poller, len(library.Swift.Discovery.Pollers))
106+
for i, poller := range library.Swift.Discovery.Pollers {
107+
pollers[i] = &api.Poller{
108+
Prefix: poller.Prefix,
109+
MethodID: poller.MethodID,
110+
}
111+
}
112+
modelCfg.Discovery = &api.Discovery{
113+
OperationID: library.Swift.Discovery.OperationID,
114+
Pollers: pollers,
115+
}
116+
}
117+
return modelCfg, nil
103118
}

internal/librarian/swift/generate_test.go

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121

2222
"github.com/google/go-cmp/cmp"
2323
"github.com/googleapis/librarian/internal/config"
24+
"github.com/googleapis/librarian/internal/sidekick/api"
2425
"github.com/googleapis/librarian/internal/sidekick/parser"
2526
"github.com/googleapis/librarian/internal/sources"
2627
"github.com/googleapis/librarian/internal/testhelper"
@@ -207,6 +208,49 @@ func TestLibraryToModelConfig(t *testing.T) {
207208
},
208209
},
209210
},
211+
{
212+
name: "discovery config with LRO",
213+
library: &config.Library{
214+
Name: "google-cloud-compute-v1",
215+
CopyrightYear: "2038",
216+
Version: "1.2.3",
217+
Roots: []string{"discovery", "googleapis"},
218+
SpecificationFormat: config.SpecDiscovery,
219+
Swift: &config.SwiftPackage{
220+
Discovery: &config.SwiftDiscovery{
221+
OperationID: ".google.cloud.compute.v1.",
222+
Pollers: []config.SwiftPoller{
223+
{
224+
Prefix: "compute/v1/projects/{project}/zones/{zone}",
225+
MethodID: ".google.cloud.compute.v1.zoneOperations.get",
226+
},
227+
},
228+
},
229+
},
230+
},
231+
api: &config.API{
232+
Path: "discoveries/compute.v1.json",
233+
},
234+
want: &parser.ModelConfig{
235+
Language: config.LanguageSwift,
236+
SpecificationFormat: config.SpecDiscovery,
237+
SpecificationSource: "discoveries/compute.v1.json",
238+
ServiceConfig: "google/cloud/compute/v1/compute_v1.yaml",
239+
Codec: map[string]string{"copyright-year": "2038", "version": "1.2.3"},
240+
Source: &sources.SourceConfig{
241+
ActiveRoots: []string{"discovery", "googleapis"},
242+
},
243+
Discovery: &api.Discovery{
244+
OperationID: ".google.cloud.compute.v1.",
245+
Pollers: []*api.Poller{
246+
{
247+
Prefix: "compute/v1/projects/{project}/zones/{zone}",
248+
MethodID: ".google.cloud.compute.v1.zoneOperations.get",
249+
},
250+
},
251+
},
252+
},
253+
},
210254
} {
211255
t.Run(test.name, func(t *testing.T) {
212256
srcs := &sources.Sources{

internal/sidekick/api/xref.go

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -361,11 +361,11 @@ func sortOneOfFieldForExamples(f1, f2 *Field) int {
361361
}
362362

363363
func enrichMethodSamples(m *Method) {
364-
m.IsSimple = m.Pagination == nil &&
365-
!m.ClientSideStreaming && !m.ServerSideStreaming &&
366-
m.OperationInfo == nil && m.DiscoveryLro == nil
367-
368-
m.IsLRO = m.OperationInfo != nil
364+
// Methods with AIP-151 LRO annotations *OR* discovery LRO annotations are LROs.
365+
m.IsLRO = m.OperationInfo != nil || m.DiscoveryLro != nil
366+
m.IsStreaming = m.ClientSideStreaming || m.ServerSideStreaming
367+
// A simple method is not paginated, not streaming and not an LRO.
368+
m.IsSimple = m.Pagination == nil && !m.IsStreaming && !m.IsLRO
369369

370370
if m.SourceServiceID == ".google.longrunning.Operations" &&
371371
m.Name == "GetOperation" &&
@@ -381,8 +381,6 @@ func enrichMethodSamples(m *Method) {
381381

382382
m.IsList = m.OutputType != nil && m.OutputType.Pagination != nil
383383

384-
m.IsStreaming = m.ClientSideStreaming || m.ServerSideStreaming
385-
386384
if m.SampleInfo = aipStandardGetInfo(m); m.SampleInfo != nil {
387385
m.IsAIPStandardGet = true
388386
} else if m.SampleInfo = aipStandardDeleteInfo(m); m.SampleInfo != nil {

internal/sidekick/api/xref_test.go

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -672,7 +672,7 @@ func TestIsSimpleMethod(t *testing.T) {
672672
}
673673

674674
func TestIsLRO(t *testing.T) {
675-
testCases := []struct {
675+
for _, test := range []struct {
676676
name string
677677
method *Method
678678
want bool
@@ -687,12 +687,16 @@ func TestIsLRO(t *testing.T) {
687687
method: &Method{OperationInfo: &OperationInfo{}},
688688
want: true,
689689
},
690-
}
691-
for _, tc := range testCases {
692-
t.Run(tc.name, func(t *testing.T) {
693-
enrichMethodSamples(tc.method)
694-
if got := tc.method.IsLRO; got != tc.want {
695-
t.Errorf("IsLRO() = %v, want %v", got, tc.want)
690+
{
691+
name: "LRO method is discovery LRO",
692+
method: &Method{DiscoveryLro: &DiscoveryLro{}},
693+
want: true,
694+
},
695+
} {
696+
t.Run(test.name, func(t *testing.T) {
697+
enrichMethodSamples(test.method)
698+
if got := test.method.IsLRO; got != test.want {
699+
t.Errorf("IsLRO() = %v, want %v", got, test.want)
696700
}
697701
})
698702
}

0 commit comments

Comments
 (0)