diff --git a/tools/cli/internal/changelog/merge.go b/tools/cli/internal/changelog/merge.go index 3584308607..0c6e8ba3dd 100644 --- a/tools/cli/internal/changelog/merge.go +++ b/tools/cli/internal/changelog/merge.go @@ -204,8 +204,7 @@ func (m *Changelog) newPathsFromDeprecatedChanges( } func (m *Changelog) newOasDiffEntries() ([]*outputfilter.OasDiffEntry, error) { - // CLOUDP-267267: @Todo need to add the logic to hide from exceptions - diffResult, err := m.OasDiff.NewDiffResult() + diffResult, err := m.OasDiff.GetFlattenedDiff(m.Base, m.Revision) if err != nil { return nil, err } diff --git a/tools/cli/internal/openapi/oasdiff.go b/tools/cli/internal/openapi/oasdiff.go index 01c844221c..212c88f097 100644 --- a/tools/cli/internal/openapi/oasdiff.go +++ b/tools/cli/internal/openapi/oasdiff.go @@ -22,7 +22,6 @@ import ( "github.com/getkin/kin-openapi/openapi3" "github.com/mongodb/openapi/tools/cli/internal/openapi/errors" "github.com/tufin/oasdiff/diff" - "github.com/tufin/oasdiff/flatten/allof" "github.com/tufin/oasdiff/load" ) @@ -30,51 +29,10 @@ type OasDiff struct { base *load.SpecInfo external *load.SpecInfo config *diff.Config - specDiff *diff.Diff + result *OasDiffResult parser Parser } -type OasDiffResult struct { - Report *diff.Diff - SourceMap *diff.OperationsSourcesMap - SpecInfoPair *load.SpecInfoPair -} - -func (o OasDiff) NewDiffResult() (*OasDiffResult, error) { - flattenBaseSpec, err := allof.MergeSpec(o.base.Spec) - if err != nil { - return nil, err - } - - baseSpecInfo := &load.SpecInfo{ - Spec: flattenBaseSpec, - Url: o.base.Url, - Version: o.base.GetVersion(), - } - - flattenExternalSpec, err := allof.MergeSpec(o.external.Spec) - if err != nil { - return nil, err - } - - externalSpecInfo := &load.SpecInfo{ - Spec: flattenExternalSpec, - Url: o.external.Url, - Version: o.external.GetVersion(), - } - - diffReport, operationsSources, err := diff.GetWithOperationsSourcesMap(o.config, baseSpecInfo, externalSpecInfo) - if err != nil { - return nil, err - } - - return &OasDiffResult{ - Report: diffReport, - SourceMap: operationsSources, - SpecInfoPair: load.NewSpecInfoPair(baseSpecInfo, externalSpecInfo), - }, nil -} - func (o OasDiff) mergeSpecIntoBase() (*load.SpecInfo, error) { if o.external == nil || o.external.Spec == nil { return o.base, nil @@ -403,17 +361,17 @@ func (o OasDiff) mergeSchemas() error { } func (o OasDiff) areParamsIdentical(paramName string) bool { - _, ok := o.specDiff.ParametersDiff.Modified[paramName] + _, ok := o.result.Report.ParametersDiff.Modified[paramName] return !ok } func (o OasDiff) areResponsesIdentical(name string) bool { - _, ok := o.specDiff.ResponsesDiff.Modified[name] + _, ok := o.result.Report.ResponsesDiff.Modified[name] return !ok } func (o OasDiff) areSchemaIdentical(name string) bool { - _, ok := o.specDiff.SchemasDiff.Modified[name] + _, ok := o.result.Report.SchemasDiff.Modified[name] return !ok } diff --git a/tools/cli/internal/openapi/oasdiff_result.go b/tools/cli/internal/openapi/oasdiff_result.go new file mode 100644 index 0000000000..9b7d370c5e --- /dev/null +++ b/tools/cli/internal/openapi/oasdiff_result.go @@ -0,0 +1,80 @@ +// 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 openapi + +import ( + "github.com/tufin/oasdiff/diff" + "github.com/tufin/oasdiff/flatten/allof" + "github.com/tufin/oasdiff/load" +) + +type OasDiffResult struct { + Report *diff.Diff + SourceMap *diff.OperationsSourcesMap + SpecInfoPair *load.SpecInfoPair + Config *diff.Config +} + +// GetSimpleDiff returns the diff between two OpenAPI specs. +func (o OasDiff) GetSimpleDiff(base, revision *load.SpecInfo) (*OasDiffResult, error) { + diffReport, err := diff.Get(o.config, base.Spec, revision.Spec) + if err != nil { + return nil, err + } + + return &OasDiffResult{ + Report: diffReport, + SourceMap: nil, + SpecInfoPair: load.NewSpecInfoPair(base, revision), + Config: o.config, + }, nil +} + +// GetFlattenedDiff returns the diff between two OpenAPI specs after flattening them. +func (o OasDiff) GetFlattenedDiff(base, revision *load.SpecInfo) (*OasDiffResult, error) { + flattenBaseSpec, err := allof.MergeSpec(base.Spec) + if err != nil { + return nil, err + } + + baseSpecInfo := &load.SpecInfo{ + Spec: flattenBaseSpec, + Url: base.Url, + Version: base.GetVersion(), + } + + flattenExternalSpec, err := allof.MergeSpec(revision.Spec) + if err != nil { + return nil, err + } + + revisionSpecInfo := &load.SpecInfo{ + Spec: flattenExternalSpec, + Url: revision.Url, + Version: revision.GetVersion(), + } + + diffReport, operationsSources, err := diff.GetWithOperationsSourcesMap(o.config, baseSpecInfo, revisionSpecInfo) + if err != nil { + return nil, err + } + + return &OasDiffResult{ + Report: diffReport, + SourceMap: operationsSources, + SpecInfoPair: load.NewSpecInfoPair(baseSpecInfo, revisionSpecInfo), + Config: o.config, + }, nil +} diff --git a/tools/cli/internal/openapi/oasdiff_test.go b/tools/cli/internal/openapi/oasdiff_test.go index 18f7a3a960..1b5c2caa9e 100644 --- a/tools/cli/internal/openapi/oasdiff_test.go +++ b/tools/cli/internal/openapi/oasdiff_test.go @@ -585,7 +585,9 @@ func TestOasDiff_mergeResponses(t *testing.T) { o := OasDiff{ base: tc.inputBase, external: tc.inputExternal, - specDiff: tc.diff, + result: &OasDiffResult{ + Report: tc.diff, + }, } tc.wantErr(t, o.mergeResponses()) }) @@ -807,7 +809,9 @@ func TestOasDiff_mergeSchemas(t *testing.T) { o := OasDiff{ base: tc.inputBase, external: tc.inputExternal, - specDiff: tc.diff, + result: &OasDiffResult{ + Report: tc.diff, + }, } tc.wantErr(t, o.mergeSchemas()) }) diff --git a/tools/cli/internal/openapi/openapi.go b/tools/cli/internal/openapi/openapi.go index 910b07a43f..30c193172d 100644 --- a/tools/cli/internal/openapi/openapi.go +++ b/tools/cli/internal/openapi/openapi.go @@ -50,13 +50,12 @@ func (o *OasDiff) MergeOpenAPISpecs(paths []string) (*Spec, error) { return nil, err } - specDiff, err := diff.Get(o.config, o.base.Spec, spec.Spec) + o.result, err = o.GetSimpleDiff(o.base, spec) if err != nil { log.Fatalf("error in calculating the diff of the specs: %s", err) return nil, err } - o.specDiff = specDiff o.external = spec o.base, err = o.mergeSpecIntoBase() if err != nil {