From cebc24e30b00e930114961f655d5a64fd21e55d0 Mon Sep 17 00:00:00 2001 From: Bianca Lisle Date: Thu, 6 Feb 2025 14:54:09 +0000 Subject: [PATCH 1/4] CLOUDP-297221: Add preview support to split command --- tools/cli/internal/apiversion/version.go | 9 +++++++++ tools/cli/internal/apiversion/version_test.go | 12 ++++++++++++ 2 files changed, 21 insertions(+) diff --git a/tools/cli/internal/apiversion/version.go b/tools/cli/internal/apiversion/version.go index 1450b318c4..f3aaa15d5d 100644 --- a/tools/cli/internal/apiversion/version.go +++ b/tools/cli/internal/apiversion/version.go @@ -18,6 +18,7 @@ import ( "fmt" "log" "regexp" + "strings" "time" "github.com/getkin/kin-openapi/openapi3" @@ -54,6 +55,13 @@ func New(opts ...Option) (*APIVersion, error) { // WithVersion sets the version on the APIVersion. func WithVersion(version string) Option { return func(v *APIVersion) error { + if strings.EqualFold(version, PreviewStabilityLevel) { + v.version = version + v.stabilityVersion = PreviewStabilityLevel + v.versionDate = time.Now() // make preview look like the latest version + return nil + } + versionDate, err := DateFromVersion(version) if err != nil { return err @@ -87,6 +95,7 @@ func WithContent(contentType string) Option { v.stabilityVersion = StableStabilityLevel if version == PreviewStabilityLevel { v.stabilityVersion = PreviewStabilityLevel + v.versionDate = time.Now() // make preview look like the latest version return nil } diff --git a/tools/cli/internal/apiversion/version_test.go b/tools/cli/internal/apiversion/version_test.go index fbde00ece7..b35f615f4d 100644 --- a/tools/cli/internal/apiversion/version_test.go +++ b/tools/cli/internal/apiversion/version_test.go @@ -48,6 +48,12 @@ func TestParseVersion(t *testing.T) { expectedMatch: "2030-02-20", wantErr: false, }, + { + name: "preview", + contentType: "application/vnd.atlas.preview+json", + expectedMatch: "preview", + wantErr: false, + }, { name: "invalid", contentType: "application/vnd.test.2023-01-01", @@ -94,6 +100,12 @@ func TestNewAPIVersionFromContentType(t *testing.T) { expectedMatch: "2030-02-20", wantErr: false, }, + { + name: "preview", + contentType: "application/vnd.atlas.preview+json", + expectedMatch: "preview", + wantErr: false, + }, { name: "invalid", contentType: "application/vnd.test.2023-01-01", From 8391f44ea31778aabc62323a0afb88507ddf80ff Mon Sep 17 00:00:00 2001 From: Bianca Lisle Date: Thu, 6 Feb 2025 17:24:11 +0000 Subject: [PATCH 2/4] Update --- tools/cli/internal/apiversion/version.go | 68 ++++++++++++------- tools/cli/internal/apiversion/version_test.go | 20 +++++- 2 files changed, 61 insertions(+), 27 deletions(-) diff --git a/tools/cli/internal/apiversion/version.go b/tools/cli/internal/apiversion/version.go index f3aaa15d5d..f77bc3b727 100644 --- a/tools/cli/internal/apiversion/version.go +++ b/tools/cli/internal/apiversion/version.go @@ -32,8 +32,8 @@ type APIVersion struct { const ( dateFormat = "2006-01-02" - StableStabilityLevel = "STABLE" - PreviewStabilityLevel = "PREVIEW" + StableStabilityLevel = "stable" + PreviewStabilityLevel = "preview" ) var contentPattern = regexp.MustCompile(`application/vnd\.atlas\.((\d{4})-(\d{2})-(\d{2})|preview)\+(.+)`) @@ -52,23 +52,26 @@ func New(opts ...Option) (*APIVersion, error) { return version, nil } +func (v *APIVersion) newVersion(version string, date time.Time) { + v.version = version + v.stabilityVersion = StableStabilityLevel + v.versionDate = date + + if IsPreviewVersion(version) { + v.versionDate = time.Now() + v.stabilityVersion = PreviewStabilityLevel + } +} + // WithVersion sets the version on the APIVersion. func WithVersion(version string) Option { return func(v *APIVersion) error { - if strings.EqualFold(version, PreviewStabilityLevel) { - v.version = version - v.stabilityVersion = PreviewStabilityLevel - v.versionDate = time.Now() // make preview look like the latest version - return nil - } - versionDate, err := DateFromVersion(version) if err != nil { return err } - v.version = version - v.versionDate = versionDate + v.newVersion(version, versionDate) return nil } } @@ -76,9 +79,7 @@ func WithVersion(version string) Option { // WithDate sets the version on the APIVersion. func WithDate(date time.Time) Option { return func(v *APIVersion) error { - v.version = date.Format(dateFormat) - v.versionDate = date - v.stabilityVersion = StableStabilityLevel + v.newVersion(date.Format(dateFormat), date) return nil } } @@ -91,23 +92,20 @@ func WithContent(contentType string) Option { return err } - v.version = version - v.stabilityVersion = StableStabilityLevel - if version == PreviewStabilityLevel { - v.stabilityVersion = PreviewStabilityLevel - v.versionDate = time.Now() // make preview look like the latest version - return nil - } - - v.versionDate, err = DateFromVersion(version) + versionDate, err := DateFromVersion(version) if err != nil { return err } + + v.newVersion(version, versionDate) return nil } } func DateFromVersion(version string) (time.Time, error) { + if IsPreviewVersion(version) { + return time.Now(), nil + } return time.Parse(dateFormat, version) } @@ -139,6 +137,18 @@ func (v *APIVersion) Date() time.Time { return v.versionDate } +func (v *APIVersion) StabilityLevel() string { + return v.stabilityVersion +} + +func (v *APIVersion) ExactMatchOnly() bool { + return v.stabilityVersion == PreviewStabilityLevel +} + +func IsPreviewVersion(version string) bool { + return strings.EqualFold(version, PreviewStabilityLevel) +} + func FindMatchesFromContentType(contentType string) []string { return contentPattern.FindStringSubmatch(contentType) } @@ -169,6 +179,7 @@ func FindLatestContentVersionMatched(op *openapi3.Operation, requestedVersion *A op response: "200": content: application/vnd.atlas.2023-01-01+json + content: application/vnd.atlas.preview+json "201": content: application/vnd.atlas.2023-12-01+json content: application/vnd.atlas.2025-01-01+json @@ -190,14 +201,19 @@ func FindLatestContentVersionMatched(op *openapi3.Operation, requestedVersion *A log.Printf("Ignoring invalid content type: %q", contentType) continue } - if contentVersion.GreaterThan(requestedVersion) { - continue - } if contentVersion.Equal(requestedVersion) { return contentVersion } + if contentVersion.ExactMatchOnly() || requestedVersion.ExactMatchOnly() { + continue + } + + if contentVersion.GreaterThan(requestedVersion) { + continue + } + if latestVersionMatch == nil || contentVersion.GreaterThan(latestVersionMatch) { latestVersionMatch = contentVersion } diff --git a/tools/cli/internal/apiversion/version_test.go b/tools/cli/internal/apiversion/version_test.go index b35f615f4d..d518949dc6 100644 --- a/tools/cli/internal/apiversion/version_test.go +++ b/tools/cli/internal/apiversion/version_test.go @@ -49,11 +49,23 @@ func TestParseVersion(t *testing.T) { wantErr: false, }, { - name: "preview", + name: "preview_json", contentType: "application/vnd.atlas.preview+json", expectedMatch: "preview", wantErr: false, }, + { + name: "preview_yaml", + contentType: "application/vnd.atlas.preview+yaml", + expectedMatch: "preview", + wantErr: false, + }, + { + name: "preview_csv", + contentType: "application/vnd.atlas.preview+csv", + expectedMatch: "preview", + wantErr: false, + }, { name: "invalid", contentType: "application/vnd.test.2023-01-01", @@ -428,6 +440,11 @@ func TestFindLatestContentVersionMatched(t *testing.T) { targetVersion: "2023-01-01", expectedMatch: "2023-01-01", }, + { + name: "exact match preview", + targetVersion: "preview", + expectedMatch: "preview", + }, { name: "exact match 2023-11-15", targetVersion: "2023-11-15", @@ -482,6 +499,7 @@ func oasOperationAllVersions() *openapi3.Operation { responses.Set("200", &openapi3.ResponseRef{ Value: &openapi3.Response{ Content: map[string]*openapi3.MediaType{ + "application/vnd.atlas.preview+json": {}, "application/vnd.atlas.2023-01-01+json": {}, "application/vnd.atlas.2023-01-01+csv": {}, "application/vnd.atlas.2023-02-01+json": {}, From 81b0af8ea274c4ed49704e2ed45a24cfafb182b2 Mon Sep 17 00:00:00 2001 From: Bianca Lisle Date: Thu, 6 Feb 2025 17:26:18 +0000 Subject: [PATCH 3/4] Update --- tools/cli/internal/apiversion/version.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/cli/internal/apiversion/version.go b/tools/cli/internal/apiversion/version.go index f77bc3b727..11385b0c56 100644 --- a/tools/cli/internal/apiversion/version.go +++ b/tools/cli/internal/apiversion/version.go @@ -58,7 +58,7 @@ func (v *APIVersion) newVersion(version string, date time.Time) { v.versionDate = date if IsPreviewVersion(version) { - v.versionDate = time.Now() + v.versionDate = time.Now().AddDate(10, 0, 0) // set preview date to the future v.stabilityVersion = PreviewStabilityLevel } } From e801e4c4e2662b3aceba26dd01b89a9c8d879a82 Mon Sep 17 00:00:00 2001 From: Bianca Lisle Date: Thu, 6 Feb 2025 17:44:02 +0000 Subject: [PATCH 4/4] Fix test --- tools/cli/internal/apiversion/version.go | 18 +++++++++++++----- tools/cli/internal/cli/versions/versions.go | 4 ++-- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/tools/cli/internal/apiversion/version.go b/tools/cli/internal/apiversion/version.go index 11385b0c56..72fe4b8a99 100644 --- a/tools/cli/internal/apiversion/version.go +++ b/tools/cli/internal/apiversion/version.go @@ -57,7 +57,7 @@ func (v *APIVersion) newVersion(version string, date time.Time) { v.stabilityVersion = StableStabilityLevel v.versionDate = date - if IsPreviewVersion(version) { + if IsPreviewSabilityLevel(version) { v.versionDate = time.Now().AddDate(10, 0, 0) // set preview date to the future v.stabilityVersion = PreviewStabilityLevel } @@ -103,7 +103,7 @@ func WithContent(contentType string) Option { } func DateFromVersion(version string) (time.Time, error) { - if IsPreviewVersion(version) { + if IsPreviewSabilityLevel(version) { return time.Now(), nil } return time.Parse(dateFormat, version) @@ -142,11 +142,19 @@ func (v *APIVersion) StabilityLevel() string { } func (v *APIVersion) ExactMatchOnly() bool { - return v.stabilityVersion == PreviewStabilityLevel + return v.IsPreview() } -func IsPreviewVersion(version string) bool { - return strings.EqualFold(version, PreviewStabilityLevel) +func (v *APIVersion) IsPreview() bool { + return IsPreviewSabilityLevel(v.version) +} + +func IsPreviewSabilityLevel(value string) bool { + return strings.EqualFold(value, PreviewStabilityLevel) +} + +func IsStableSabilityLevel(value string) bool { + return strings.EqualFold(value, StableStabilityLevel) } func FindMatchesFromContentType(contentType string) []string { diff --git a/tools/cli/internal/cli/versions/versions.go b/tools/cli/internal/cli/versions/versions.go index 311e16468f..c09b3235e2 100644 --- a/tools/cli/internal/cli/versions/versions.go +++ b/tools/cli/internal/cli/versions/versions.go @@ -76,11 +76,11 @@ func (o *Opts) filterStabilityLevelVersions(apiVersions []string) []string { var out []string for _, v := range apiVersions { - if o.stabilityLevel == apiversion.PreviewStabilityLevel && strings.Contains(v, "preview") { + if (apiversion.IsStableSabilityLevel(o.stabilityLevel)) && !apiversion.IsPreviewSabilityLevel(v) { out = append(out, v) } - if o.stabilityLevel == apiversion.StableStabilityLevel && !strings.Contains(v, "preview") { + if (apiversion.IsPreviewSabilityLevel(o.stabilityLevel)) && apiversion.IsPreviewSabilityLevel(v) { out = append(out, v) } }