From 634ae41219f2b5d93050fbfc8bffb7dc642d7b9c Mon Sep 17 00:00:00 2001 From: Bianca Lisle Date: Thu, 20 Feb 2025 15:40:59 +0000 Subject: [PATCH 1/6] update --- tools/cli/internal/apiversion/version.go | 14 +------- tools/cli/internal/cli/usage/usage.go | 2 +- tools/cli/internal/cli/versions/versions.go | 33 ++++++++++++------- .../internal/cli/versions/versions_test.go | 14 ++++---- 4 files changed, 30 insertions(+), 33 deletions(-) diff --git a/tools/cli/internal/apiversion/version.go b/tools/cli/internal/apiversion/version.go index cc28c648ea..80413abfd1 100644 --- a/tools/cli/internal/apiversion/version.go +++ b/tools/cli/internal/apiversion/version.go @@ -32,10 +32,7 @@ type APIVersion struct { } const ( - dateFormat = "2006-01-02" - StableStabilityLevel = "stable" - PreviewStabilityLevel = "preview" - PrivatePreviewStabilityLevel = "private-preview" + dateFormat = "2006-01-02" ) var contentPattern = regexp.MustCompile(`application/vnd\.atlas\.((\d{4})-(\d{2})-(\d{2})|preview)\+(.+)`) @@ -175,15 +172,6 @@ func (v *APIVersion) IsPublicPreview() bool { return v.IsPreview() && !v.IsPrivatePreview() } -func IsPreviewSabilityLevel(value string) bool { - // we also need string match given private preview versions like "private-preview-" - return strings.EqualFold(value, PreviewStabilityLevel) || strings.Contains(value, PreviewStabilityLevel) -} - -func IsStableSabilityLevel(value string) bool { - return strings.EqualFold(value, StableStabilityLevel) -} - func FindMatchesFromContentType(contentType string) []string { return contentPattern.FindStringSubmatch(contentType) } diff --git a/tools/cli/internal/cli/usage/usage.go b/tools/cli/internal/cli/usage/usage.go index 43fc6a365b..8dc166a582 100644 --- a/tools/cli/internal/cli/usage/usage.go +++ b/tools/cli/internal/cli/usage/usage.go @@ -37,5 +37,5 @@ const ( SlackChannelID = "Slack Channel ID." From = "Date in the format YYYY-MM-DD that indicates the start of a date range" To = "Date in the format YYYY-MM-DD that indicates the end of a date range" - StabilityLevel = "Stability level related to the API Version. Valid values: [STABLE, PREVIEW]" + StabilityLevel = "Stability level related to the API Version. Valid values: [STABLE, PUBLIC-PREVIEW, PRIVATE-PREVIEW]" ) diff --git a/tools/cli/internal/cli/versions/versions.go b/tools/cli/internal/cli/versions/versions.go index 43f7e57355..0c0267b860 100644 --- a/tools/cli/internal/cli/versions/versions.go +++ b/tools/cli/internal/cli/versions/versions.go @@ -35,7 +35,7 @@ type Opts struct { outputPath string format string env string - stabilityLevel string + stabilityLevel []string } func (o *Opts) Run() error { @@ -70,18 +70,24 @@ func (o *Opts) Run() error { } func (o *Opts) filterStabilityLevelVersions(apiVersions []string) []string { - if o.stabilityLevel == "" || apiVersions == nil { + if o.stabilityLevel == nil || len(o.stabilityLevel) == 0 || apiVersions == nil { return apiVersions } var out []string for _, v := range apiVersions { - if (apiversion.IsStableSabilityLevel(o.stabilityLevel)) && !apiversion.IsPreviewSabilityLevel(v) { - out = append(out, v) - } - - if (apiversion.IsPreviewSabilityLevel(o.stabilityLevel)) && apiversion.IsPreviewSabilityLevel(v) { - out = append(out, v) + for _, stabilityLevel := range o.stabilityLevel { + if (apiversion.IsStableSabilityLevel(stabilityLevel)) && !apiversion.IsPreviewSabilityLevel(v) { + out = append(out, v) + } + + if (apiversion.IsPrivatePreviewSabilityLevel(stabilityLevel)) && apiversion.IsPrivatePreviewSabilityLevel(v) { + out = append(out, v) + } + + if (apiversion.IsPublicPreviewSabilityLevel(stabilityLevel)) && apiversion.IsPublicPreviewSabilityLevel(v) { + out = append(out, v) + } } } @@ -112,9 +118,12 @@ func (o *Opts) versionsAsBytes(versions []string) ([]byte, error) { } func (o *Opts) PreRunE(_ []string) error { - o.stabilityLevel = strings.ToLower(o.stabilityLevel) - if o.stabilityLevel != "" && o.stabilityLevel != apiversion.PreviewStabilityLevel && o.stabilityLevel != apiversion.StableStabilityLevel { - return fmt.Errorf("stability level must be %q or %q, got %q", apiversion.PreviewStabilityLevel, apiversion.StableStabilityLevel, o.stabilityLevel) + for i, v := range o.stabilityLevel { + o.stabilityLevel[i] = strings.ToLower(v) + + if err := apiversion.ValidateStabilityLevel(o.stabilityLevel[i]); err != nil { + return err + } } if o.basePath == "" { @@ -154,7 +163,7 @@ func Builder() *cobra.Command { cmd.Flags().StringVarP(&opts.basePath, flag.Spec, flag.SpecShort, "", usage.Spec) cmd.Flags().StringVar(&opts.env, flag.Environment, "", usage.Environment) - cmd.Flags().StringVarP(&opts.stabilityLevel, flag.StabilityLevel, flag.StabilityLevelShort, "", usage.StabilityLevel) + cmd.Flags().StringArrayP(flag.StabilityLevel, flag.StabilityLevelShort, opts.stabilityLevel, usage.StabilityLevel) cmd.Flags().StringVarP(&opts.outputPath, flag.Output, flag.OutputShort, "", usage.Output) cmd.Flags().StringVarP(&opts.format, flag.Format, flag.FormatShort, "json", usage.Format) return cmd diff --git a/tools/cli/internal/cli/versions/versions_test.go b/tools/cli/internal/cli/versions/versions_test.go index df5c27a288..351b1ada7a 100644 --- a/tools/cli/internal/cli/versions/versions_test.go +++ b/tools/cli/internal/cli/versions/versions_test.go @@ -82,7 +82,7 @@ func TestVersion_RunStabilityLevelPreviewAndPrivatePreview(t *testing.T) { outputPath: "foas.json", fs: fs, env: "staging", - stabilityLevel: "PREVIEW", + stabilityLevel: []string{"PREVIEW"}, } require.NoError(t, opts.Run()) @@ -102,7 +102,7 @@ func TestVersion_PreviewAndPublicPreview(t *testing.T) { outputPath: "foas.json", fs: fs, env: "staging", - stabilityLevel: "PREVIEW", + stabilityLevel: []string{"private-preview", "public-preview"}, } require.NoError(t, opts.Run()) @@ -122,7 +122,7 @@ func TestVersion_RunStabilityLevelStable(t *testing.T) { outputPath: "foas.json", fs: fs, env: "staging", - stabilityLevel: "STABLE", + stabilityLevel: []string{"STABLE"}, } require.NoError(t, opts.Run()) @@ -189,18 +189,18 @@ func TestVersion_PreRun(t *testing.T) { basePath: "base", outputPath: "output.yaml", format: "yaml", - stabilityLevel: "invalid", + stabilityLevel: []string{"invalid"}, } err := opts.PreRunE(nil) require.Error(t, err) - assert.Contains(t, err.Error(), "stability level must be") + assert.Contains(t, err.Error(), "invalid stability level value m") }) t.Run("ValidStabilityLevelPreview", func(t *testing.T) { opts := &Opts{ basePath: "base", outputPath: "output.yaml", format: "yaml", - stabilityLevel: "preview", + stabilityLevel: []string{"PREVIEW"}, } err := opts.PreRunE(nil) require.NoError(t, err) @@ -211,7 +211,7 @@ func TestVersion_PreRun(t *testing.T) { basePath: "base", outputPath: "output.yaml", format: "yaml", - stabilityLevel: "PREVIEW", + stabilityLevel: []string{"PREVIEW"}, } err := opts.PreRunE(nil) require.NoError(t, err) From 808949fa629d8eafa4f0841b6708e8ce78171514 Mon Sep 17 00:00:00 2001 From: Bianca Lisle Date: Thu, 20 Feb 2025 15:51:19 +0000 Subject: [PATCH 2/6] update --- .../cli/internal/apiversion/stabilitylevel.go | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 tools/cli/internal/apiversion/stabilitylevel.go diff --git a/tools/cli/internal/apiversion/stabilitylevel.go b/tools/cli/internal/apiversion/stabilitylevel.go new file mode 100644 index 0000000000..b9c433848a --- /dev/null +++ b/tools/cli/internal/apiversion/stabilitylevel.go @@ -0,0 +1,58 @@ +// Copyright 2024 MongoDB Inc +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package apiversion + +import ( + "fmt" + "strings" +) + +const ( + StableStabilityLevel = "stable" + PreviewStabilityLevel = "preview" + PrivatePreviewStabilityLevel = "private-preview" +) + +var supportedValues = []string{StableStabilityLevel, PreviewStabilityLevel, PrivatePreviewStabilityLevel} + +// IsPreviewSabilityLevel checks if the version is a preview version, public or private. +func IsPreviewSabilityLevel(value string) bool { + // we also need string match given private preview versions like "private-preview-" + return IsPrivatePreviewSabilityLevel(value) || IsPublicPreviewSabilityLevel(value) +} + +// IsPrivatePreviewSabilityLevel checks if the version is a private preview version. +func IsPrivatePreviewSabilityLevel(value string) bool { + return strings.Contains(value, PrivatePreviewStabilityLevel) +} + +// IsPublicPreviewSabilityLevel checks if the version is a public preview version. +func IsPublicPreviewSabilityLevel(value string) bool { + return strings.EqualFold(value, PreviewStabilityLevel) +} + +// IsStableSabilityLevel checks if the version is a stable version. +func IsStableSabilityLevel(value string) bool { + return strings.EqualFold(value, StableStabilityLevel) +} + +// IsValidStabilityLevel checks if the version is a valid stability level. +func ValidateStabilityLevel(value string) error { + if IsStableSabilityLevel(value) || IsPreviewSabilityLevel(value) { + return nil + } + + return fmt.Errorf("invalid stability level value must be in %q, got %q", supportedValues, value) +} From 08fa3bcc0d95eb0e106a22313b0f7d8f9dd0edc9 Mon Sep 17 00:00:00 2001 From: Bianca Lisle Date: Thu, 20 Feb 2025 16:11:50 +0000 Subject: [PATCH 3/6] Update --- tools/cli/internal/apiversion/stabilitylevel.go | 7 ++++--- tools/cli/internal/cli/versions/versions.go | 7 +++++-- tools/cli/internal/cli/versions/versions_test.go | 4 ++-- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/tools/cli/internal/apiversion/stabilitylevel.go b/tools/cli/internal/apiversion/stabilitylevel.go index b9c433848a..1555d6e34a 100644 --- a/tools/cli/internal/apiversion/stabilitylevel.go +++ b/tools/cli/internal/apiversion/stabilitylevel.go @@ -23,9 +23,10 @@ const ( StableStabilityLevel = "stable" PreviewStabilityLevel = "preview" PrivatePreviewStabilityLevel = "private-preview" + PublicPreviewSabilityLevel = "public-preview" ) -var supportedValues = []string{StableStabilityLevel, PreviewStabilityLevel, PrivatePreviewStabilityLevel} +var supportedValues = []string{StableStabilityLevel, PublicPreviewSabilityLevel, PrivatePreviewStabilityLevel} // IsPreviewSabilityLevel checks if the version is a preview version, public or private. func IsPreviewSabilityLevel(value string) bool { @@ -35,12 +36,12 @@ func IsPreviewSabilityLevel(value string) bool { // IsPrivatePreviewSabilityLevel checks if the version is a private preview version. func IsPrivatePreviewSabilityLevel(value string) bool { - return strings.Contains(value, PrivatePreviewStabilityLevel) + return strings.Contains(strings.ToLower(value), PrivatePreviewStabilityLevel) } // IsPublicPreviewSabilityLevel checks if the version is a public preview version. func IsPublicPreviewSabilityLevel(value string) bool { - return strings.EqualFold(value, PreviewStabilityLevel) + return strings.EqualFold(value, PublicPreviewSabilityLevel) || strings.EqualFold(value, PreviewStabilityLevel) } // IsStableSabilityLevel checks if the version is a stable version. diff --git a/tools/cli/internal/cli/versions/versions.go b/tools/cli/internal/cli/versions/versions.go index 0c0267b860..d2d884500c 100644 --- a/tools/cli/internal/cli/versions/versions.go +++ b/tools/cli/internal/cli/versions/versions.go @@ -70,7 +70,7 @@ func (o *Opts) Run() error { } func (o *Opts) filterStabilityLevelVersions(apiVersions []string) []string { - if o.stabilityLevel == nil || len(o.stabilityLevel) == 0 || apiVersions == nil { + if len(o.stabilityLevel) == 0 || apiVersions == nil { return apiVersions } @@ -91,6 +91,9 @@ func (o *Opts) filterStabilityLevelVersions(apiVersions []string) []string { } } + if len(out) == 0 { + return []string{} + } return out } @@ -163,7 +166,7 @@ func Builder() *cobra.Command { cmd.Flags().StringVarP(&opts.basePath, flag.Spec, flag.SpecShort, "", usage.Spec) cmd.Flags().StringVar(&opts.env, flag.Environment, "", usage.Environment) - cmd.Flags().StringArrayP(flag.StabilityLevel, flag.StabilityLevelShort, opts.stabilityLevel, usage.StabilityLevel) + cmd.Flags().StringArrayVar(&opts.stabilityLevel, flag.StabilityLevel, nil, usage.StabilityLevel) cmd.Flags().StringVarP(&opts.outputPath, flag.Output, flag.OutputShort, "", usage.Output) cmd.Flags().StringVarP(&opts.format, flag.Format, flag.FormatShort, "json", usage.Format) return cmd diff --git a/tools/cli/internal/cli/versions/versions_test.go b/tools/cli/internal/cli/versions/versions_test.go index 351b1ada7a..48fae173ea 100644 --- a/tools/cli/internal/cli/versions/versions_test.go +++ b/tools/cli/internal/cli/versions/versions_test.go @@ -82,7 +82,7 @@ func TestVersion_RunStabilityLevelPreviewAndPrivatePreview(t *testing.T) { outputPath: "foas.json", fs: fs, env: "staging", - stabilityLevel: []string{"PREVIEW"}, + stabilityLevel: []string{"private-preview"}, } require.NoError(t, opts.Run()) @@ -102,7 +102,7 @@ func TestVersion_PreviewAndPublicPreview(t *testing.T) { outputPath: "foas.json", fs: fs, env: "staging", - stabilityLevel: []string{"private-preview", "public-preview"}, + stabilityLevel: []string{"public-preview"}, } require.NoError(t, opts.Run()) From 6feed2e81eab65c47dd9d9c6341493dd395fb3e1 Mon Sep 17 00:00:00 2001 From: Bianca Lisle Date: Thu, 20 Feb 2025 16:58:09 +0000 Subject: [PATCH 4/6] Fix tests --- tools/cli/internal/apiversion/stabilitylevel.go | 1 - tools/cli/internal/apiversion/version.go | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/tools/cli/internal/apiversion/stabilitylevel.go b/tools/cli/internal/apiversion/stabilitylevel.go index 1555d6e34a..167b066ef2 100644 --- a/tools/cli/internal/apiversion/stabilitylevel.go +++ b/tools/cli/internal/apiversion/stabilitylevel.go @@ -30,7 +30,6 @@ var supportedValues = []string{StableStabilityLevel, PublicPreviewSabilityLevel, // IsPreviewSabilityLevel checks if the version is a preview version, public or private. func IsPreviewSabilityLevel(value string) bool { - // we also need string match given private preview versions like "private-preview-" return IsPrivatePreviewSabilityLevel(value) || IsPublicPreviewSabilityLevel(value) } diff --git a/tools/cli/internal/apiversion/version.go b/tools/cli/internal/apiversion/version.go index 80413abfd1..3329697be9 100644 --- a/tools/cli/internal/apiversion/version.go +++ b/tools/cli/internal/apiversion/version.go @@ -104,7 +104,7 @@ func withContent(contentType string) Option { // WithFullContent returns an Option to generate a new APIVersion given the contentType and contentValue. func WithFullContent(contentType string, contentValue *openapi3.MediaType) Option { return func(v *APIVersion) error { - if !IsPreviewSabilityLevel(contentType) { + if !strings.Contains(contentType, PreviewStabilityLevel) { return withContent(contentType)(v) } From 2bd0dd5e7d4bb44c481c6b9ad6f8c8b61122ae2c Mon Sep 17 00:00:00 2001 From: Bianca Lisle <40155621+blva@users.noreply.github.com> Date: Thu, 20 Feb 2025 17:06:48 +0000 Subject: [PATCH 5/6] Update tools/cli/internal/apiversion/stabilitylevel.go Co-authored-by: Andrea Angiolillo --- tools/cli/internal/apiversion/stabilitylevel.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/cli/internal/apiversion/stabilitylevel.go b/tools/cli/internal/apiversion/stabilitylevel.go index 167b066ef2..dcbc39f1f8 100644 --- a/tools/cli/internal/apiversion/stabilitylevel.go +++ b/tools/cli/internal/apiversion/stabilitylevel.go @@ -1,4 +1,4 @@ -// Copyright 2024 MongoDB Inc +// Copyright 2025 MongoDB Inc // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. From a46ae6374b6501469d81e166fdb82e28b3881747 Mon Sep 17 00:00:00 2001 From: Bianca Lisle <40155621+blva@users.noreply.github.com> Date: Thu, 20 Feb 2025 17:12:35 +0000 Subject: [PATCH 6/6] Update tools/cli/internal/apiversion/stabilitylevel.go Co-authored-by: Andrea Angiolillo --- tools/cli/internal/apiversion/stabilitylevel.go | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/cli/internal/apiversion/stabilitylevel.go b/tools/cli/internal/apiversion/stabilitylevel.go index dcbc39f1f8..e988b5cae8 100644 --- a/tools/cli/internal/apiversion/stabilitylevel.go +++ b/tools/cli/internal/apiversion/stabilitylevel.go @@ -49,6 +49,7 @@ func IsStableSabilityLevel(value string) bool { } // IsValidStabilityLevel checks if the version is a valid stability level. +// ValidateStabilityLevel checks if the version is a valid stability level. func ValidateStabilityLevel(value string) error { if IsStableSabilityLevel(value) || IsPreviewSabilityLevel(value) { return nil