Skip to content

Commit 461fcea

Browse files
committed
Version creation now needs contentValue
1 parent cf9c91b commit 461fcea

File tree

4 files changed

+107
-15
lines changed

4 files changed

+107
-15
lines changed

tools/cli/internal/apiversion/version.go

Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,21 @@ func WithContent(contentType string) Option {
104104
}
105105
}
106106

107+
func WithFullContent(contentType string, contentValue *openapi3.MediaType) Option {
108+
return func(v *APIVersion) error {
109+
if !IsPreviewSabilityLevel(contentType) {
110+
return WithContent(contentType)(v)
111+
}
112+
113+
name, _ := GetPreviewVersionName(contentValue)
114+
if name != "" {
115+
return WithVersion(name)(v)
116+
}
117+
118+
return WithContent(contentType)(v)
119+
}
120+
}
121+
107122
func DateFromVersion(version string) (time.Time, error) {
108123
if IsPreviewSabilityLevel(version) {
109124
return time.Now(), nil
@@ -112,7 +127,7 @@ func DateFromVersion(version string) (time.Time, error) {
112127
}
113128

114129
func (v *APIVersion) Equal(v2 *APIVersion) bool {
115-
return v.version == v2.version
130+
return strings.EqualFold(v.version, v2.version)
116131
}
117132

118133
func (v *APIVersion) GreaterThan(v2 *APIVersion) bool {
@@ -155,9 +170,13 @@ func (v *APIVersion) IsPrivatePreview() bool {
155170
return strings.Contains(v.version, PrivatePreviewStabilityLevel)
156171
}
157172

173+
func (v *APIVersion) IsPublicPreview() bool {
174+
return v.IsPreview() && !v.IsPrivatePreview()
175+
}
176+
158177
func IsPreviewSabilityLevel(value string) bool {
159178
// we also need string match given private preview versions like "private-preview-<name>"
160-
return strings.EqualFold(value, PreviewStabilityLevel) || strings.Contains(value, PrivatePreviewStabilityLevel)
179+
return strings.EqualFold(value, PreviewStabilityLevel) || strings.Contains(value, PreviewStabilityLevel)
161180
}
162181

163182
func IsStableSabilityLevel(value string) bool {
@@ -211,7 +230,7 @@ func FindLatestContentVersionMatched(op *openapi3.Operation, requestedVersion *A
211230
}
212231

213232
for contentType, contentValue := range response.Value.Content {
214-
contentVersion, err := New(WithContent(contentType))
233+
contentVersion, err := New(WithFullContent(contentType, contentValue))
215234
if err != nil {
216235
log.Printf("Ignoring invalid content type: %q", contentType)
217236
continue
@@ -221,9 +240,9 @@ func FindLatestContentVersionMatched(op *openapi3.Operation, requestedVersion *A
221240
return contentVersion
222241
}
223242

224-
if contentVersion.ExactMatchOnly() || requestedVersion.ExactMatchOnly() {
243+
if requestedVersion.ExactMatchOnly() {
225244
// for private preview, we will need to match with "preview" and x-xgen-preview name extension
226-
if requestedVersion.IsPrivatePreview() && PrivatePreviewContentMatch(contentValue, requestedVersion) {
245+
if privatePreviewContentMatch(contentVersion, contentValue, requestedVersion) {
227246
return contentVersion
228247
}
229248
continue
@@ -246,10 +265,16 @@ func FindLatestContentVersionMatched(op *openapi3.Operation, requestedVersion *A
246265
return latestVersionMatch
247266
}
248267

249-
func PrivatePreviewContentMatch(contentValue *openapi3.MediaType, requestedVersion *APIVersion) bool {
268+
func privatePreviewContentMatch(contentVersion *APIVersion, contentValue *openapi3.MediaType, requestedVersion *APIVersion) bool {
269+
log.Printf("trying to match in case one of the versions is private preview")
270+
if !contentVersion.IsPrivatePreview() && !requestedVersion.IsPrivatePreview() {
271+
return false
272+
}
273+
250274
name, err := GetPreviewVersionName(contentValue)
251275
if err != nil {
252-
log.Printf("failed to parse preview version name: %v", err)
276+
log.Printf("failed to parse preview version name for content=%v err=%v", contentVersion.version, err)
277+
return false
253278
}
254279

255280
return strings.EqualFold(name, requestedVersion.version)
@@ -266,6 +291,7 @@ func Sort(versions []*APIVersion) {
266291
}
267292
}
268293

294+
// GetPreviewVersionName returns the preview version name.
269295
func GetPreviewVersionName(contentTypeValue *openapi3.MediaType) (name string, err error) {
270296
public, name, err := parsePreviewExtensionData(contentTypeValue)
271297
if err != nil {

tools/cli/internal/apiversion/version_test.go

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,56 @@ func TestNewAPIVersionFromContentType(t *testing.T) {
163163
}
164164
}
165165

166+
func TestApiVersion_WithFullContent(t *testing.T) {
167+
testCases := []struct {
168+
name string
169+
contentType string
170+
contentValue *openapi3.MediaType
171+
expectedMatch string
172+
wantErr bool
173+
}{
174+
{
175+
name: "json",
176+
contentType: "application/vnd.atlas.2023-01-01+json",
177+
contentValue: &openapi3.MediaType{},
178+
expectedMatch: "2023-01-01",
179+
wantErr: false,
180+
},
181+
{
182+
name: "preview",
183+
contentType: "application/vnd.atlas.preview+json",
184+
contentValue: &openapi3.MediaType{},
185+
expectedMatch: "preview",
186+
wantErr: false,
187+
},
188+
{
189+
name: "private-preview",
190+
contentType: "application/vnd.atlas.preview+json",
191+
contentValue: &openapi3.MediaType{
192+
Extensions: map[string]interface{}{
193+
"x-xgen-preview": map[string]interface{}{
194+
"name": "feature",
195+
},
196+
},
197+
},
198+
expectedMatch: "private-preview-feature",
199+
wantErr: false,
200+
},
201+
}
202+
203+
for _, tt := range testCases {
204+
t.Run(tt.name, func(t *testing.T) {
205+
t.Parallel()
206+
version, err := New(WithFullContent(tt.contentType, tt.contentValue))
207+
if tt.wantErr {
208+
assert.Error(t, err)
209+
} else {
210+
assert.Equal(t, tt.expectedMatch, version.String())
211+
}
212+
})
213+
}
214+
}
215+
166216
func TestApiVersion_GreaterThan(t *testing.T) {
167217
testCases := []struct {
168218
name string
@@ -445,6 +495,11 @@ func TestFindLatestContentVersionMatched(t *testing.T) {
445495
targetVersion: "preview",
446496
expectedMatch: "preview",
447497
},
498+
{
499+
name: "exact match private-preview-feature",
500+
targetVersion: "private-preview-feature",
501+
expectedMatch: "private-preview-feature",
502+
},
448503
{
449504
name: "exact match 2023-11-15",
450505
targetVersion: "2023-11-15",

tools/cli/internal/openapi/filter/extension.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -256,8 +256,8 @@ func getVersionsInContentType(content map[string]*openapi3.MediaType) (
256256
contentsInVersion = make(map[string]*openapi3.MediaType)
257257
versionsInContentType := make(map[string]*apiversion.APIVersion)
258258

259-
for contentType := range content {
260-
v, err := apiversion.New(apiversion.WithContent(contentType))
259+
for contentType, contentValue := range content {
260+
v, err := apiversion.New(apiversion.WithFullContent(contentType, contentValue))
261261
if err != nil {
262262
log.Printf("Ignoring invalid content type: %s", contentType)
263263
continue

tools/cli/internal/openapi/filter/versioning.go

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ func filterLatestVersionedContent(content map[string]*openapi3.MediaType, latest
195195
latestContent := openapi3.Content{}
196196

197197
for contentType, mediaType := range content {
198-
contentVersion, err := apiversion.New(apiversion.WithContent(contentType))
198+
contentVersion, err := apiversion.New(apiversion.WithFullContent(contentType, mediaType))
199199
if err != nil {
200200
log.Printf("Ignoring invalid content type: %s", contentType)
201201
continue
@@ -234,13 +234,24 @@ func filterContentExactMatch(content map[string]*openapi3.MediaType, version *ap
234234

235235
filteredContent := make(map[string]*openapi3.MediaType)
236236
for contentType, mediaType := range content {
237-
contentVersion, err := apiversion.New(apiversion.WithContent(contentType))
237+
contentVersion, err := apiversion.New(apiversion.WithFullContent(contentType, mediaType))
238238
if err != nil {
239239
log.Printf("Ignoring invalid content type: %s", contentType)
240240
continue
241241
}
242242

243+
if version.IsPrivatePreview() && !contentVersion.IsPrivatePreview() {
244+
continue
245+
}
246+
247+
if !version.IsPrivatePreview() && contentVersion.IsPrivatePreview() {
248+
continue
249+
}
250+
243251
if contentVersion.Equal(version) {
252+
if version.IsPreview() {
253+
log.Printf("Found preview content: %s matching with %s", contentType, version.String())
254+
}
244255
updateSingleMediaTypeExtension(mediaType, contentVersion)
245256
filteredContent[contentType] = mediaType
246257
}
@@ -263,8 +274,8 @@ func updateSingleMediaTypeExtension(m *openapi3.MediaType, version *apiversion.A
263274
// getDeprecatedVersionsPerContent returns the deprecated versions for a given content type.
264275
func getDeprecatedVersionsPerContent(content map[string]*openapi3.MediaType, version *apiversion.APIVersion) []*apiversion.APIVersion {
265276
versionsInContentType := make(map[string]*apiversion.APIVersion)
266-
for contentType := range content {
267-
v, err := apiversion.New(apiversion.WithContent(contentType))
277+
for contentType, contentValue := range content {
278+
v, err := apiversion.New(apiversion.WithFullContent(contentType, contentValue))
268279
if err != nil {
269280
log.Printf("Ignoring invalid content type: %s", contentType)
270281
continue
@@ -286,8 +297,8 @@ func isVersionedContent(content map[string]*openapi3.MediaType) bool {
286297
return false
287298
}
288299

289-
for contentType := range content {
290-
if _, err := apiversion.New(apiversion.WithContent(contentType)); err == nil {
300+
for contentType, contentValue := range content {
301+
if _, err := apiversion.New(apiversion.WithFullContent(contentType, contentValue)); err == nil {
291302
log.Printf("Found versioned content: %s", contentType)
292303
return true
293304
}

0 commit comments

Comments
 (0)