Skip to content

Commit 31d6323

Browse files
point to components instead of embedding in diff (#725)
1 parent 685f943 commit 31d6323

File tree

8 files changed

+87
-51
lines changed

8 files changed

+87
-51
lines changed

checker/check_components_schemas_removed.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,11 @@ const (
1111

1212
func APIComponentsSchemaRemovedCheck(diffReport *diff.Diff, operationsSources *diff.OperationsSourcesMap, config *Config) Changes {
1313
result := make(Changes, 0)
14+
15+
if diffReport.ComponentsDiff == nil {
16+
return result
17+
}
18+
1419
if diffReport.ComponentsDiff.SchemasDiff == nil {
1520
return result
1621
}

checker/check_components_security_updated.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,11 @@ func checkOAuthUpdates(updatedSecurity *diff.SecuritySchemeDiff, updatedSecurity
8181

8282
func APIComponentsSecurityUpdatedCheck(diffReport *diff.Diff, operationsSources *diff.OperationsSourcesMap, config *Config) Changes {
8383
result := make(Changes, 0)
84+
85+
if diffReport.ComponentsDiff == nil {
86+
return result
87+
}
88+
8489
if diffReport.ComponentsDiff.SecuritySchemesDiff == nil {
8590
return result
8691
}

data/version/base.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
openapi: 3.0.3
2+
info:
3+
version: 0.0.0

data/version/revision.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
openapi: 3.0.3
2+
info:
3+
version: 0.0.1

diff/components_diff.go

Lines changed: 29 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -17,66 +17,78 @@ type ComponentsDiff struct {
1717
CallbacksDiff *CallbacksDiff `json:"callbacks,omitempty" yaml:"callbacks,omitempty"`
1818
}
1919

20-
func getComponentsDiff(config *Config, state *state, pComponents1, pComponents2 *openapi3.Components) (ComponentsDiff, error) {
20+
// Empty indicates whether a change was found in this element
21+
func (diff *ComponentsDiff) Empty() bool {
22+
return diff == nil || *diff == ComponentsDiff{}
23+
}
24+
25+
func getComponentsDiff(config *Config, state *state, pComponents1, pComponents2 *openapi3.Components) (*ComponentsDiff, error) {
2126
if pComponents1 == nil && pComponents2 == nil {
22-
return ComponentsDiff{}, nil
27+
return nil, nil
2328
}
24-
components1 := derefComponents(pComponents1)
25-
components2 := derefComponents(pComponents2)
26-
return getComponentsDiffInternal(config, state, components1, components2)
27-
}
2829

29-
func getComponentsDiffInternal(config *Config, state *state, s1, s2 openapi3.Components) (ComponentsDiff, error) {
30+
diff, err := getComponentsDiffInternal(config, state, derefComponents(pComponents1), derefComponents(pComponents2))
31+
if err != nil {
32+
return nil, err
33+
}
34+
35+
if diff.Empty() {
36+
return nil, nil
37+
}
38+
39+
return diff, nil
40+
}
3041

42+
func getComponentsDiffInternal(config *Config, state *state, s1, s2 openapi3.Components) (*ComponentsDiff, error) {
3143
result := ComponentsDiff{}
3244
var err error
3345

3446
result.SchemasDiff, err = getSchemasDiff(config, state, s1.Schemas, s2.Schemas)
3547
if err != nil {
36-
return result, err
48+
return nil, err
3749
}
3850

3951
result.ParametersDiff, err = getParametersDiff(config, state, s1.Parameters, s2.Parameters)
4052
if err != nil {
41-
return result, err
53+
return nil, err
4254
}
4355

4456
result.HeadersDiff, err = getHeadersDiff(config, state, s1.Headers, s2.Headers)
4557
if err != nil {
46-
return result, err
58+
return nil, err
4759
}
4860

4961
result.RequestBodiesDiff, err = getRequestBodiesDiff(config, state, s1.RequestBodies, s2.RequestBodies)
5062
if err != nil {
51-
return result, err
63+
return nil, err
5264
}
5365

5466
result.ResponsesDiff, err = getResponsesDiff(config, state, responseBodiesToResponses(s1.Responses), responseBodiesToResponses(s2.Responses))
5567
if err != nil {
56-
return result, err
68+
return nil, err
5769
}
5870

5971
result.SecuritySchemesDiff, err = getSecuritySchemesDiff(config, s1.SecuritySchemes, s2.SecuritySchemes)
6072
if err != nil {
61-
return result, err
73+
return nil, err
6274
}
6375

6476
result.ExamplesDiff, err = getExamplesDiff(config, s1.Examples, s2.Examples)
6577
if err != nil {
66-
return result, err
78+
return nil, err
6779
}
6880

6981
result.LinksDiff, err = getLinksDiff(config, s1.Links, s2.Links)
7082
if err != nil {
71-
return result, err
83+
return nil, err
7284
}
7385

7486
result.CallbacksDiff, err = getCallbacksDiff(config, state, s1.Callbacks, s2.Callbacks)
7587
if err != nil {
76-
return result, err
88+
return nil, err
7789
}
7890

79-
return result, nil
91+
return &result, nil
8092
}
8193

8294
func derefComponents(components *openapi3.Components) openapi3.Components {

diff/diff.go

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,7 @@ type Diff struct {
2727
ServersDiff *ServersDiff `json:"servers,omitempty" yaml:"servers,omitempty"`
2828
TagsDiff *TagsDiff `json:"tags,omitempty" yaml:"tags,omitempty"`
2929
ExternalDocsDiff *ExternalDocsDiff `json:"externalDocs,omitempty" yaml:"externalDocs,omitempty"`
30-
31-
ComponentsDiff `json:"components,omitempty" yaml:"components,omitempty"`
30+
ComponentsDiff *ComponentsDiff `json:"components,omitempty" yaml:"components,omitempty"`
3231
}
3332

3433
type OperationsSourcesMap map[*openapi3.Operation]string
@@ -291,7 +290,8 @@ func getDiffInternal(config *Config, state *state, s1, s2 *openapi3.T) (*Diff, e
291290
return nil, err
292291
}
293292

294-
if result.ComponentsDiff, err = getComponentsDiff(config, state, s1.Components, s2.Components); err != nil {
293+
result.ComponentsDiff, err = getComponentsDiff(config, state, s1.Components, s2.Components)
294+
if err != nil {
295295
return nil, err
296296
}
297297

@@ -316,15 +316,17 @@ func (diff *Diff) GetSummary() *Summary {
316316
summary.add(diff.TagsDiff, TagsDetail)
317317

318318
// components
319-
summary.add(diff.SchemasDiff, SchemasDetail)
320-
summary.add(diff.ParametersDiff, ParametersDetail)
321-
summary.add(diff.HeadersDiff, HeadersDetail)
322-
summary.add(diff.RequestBodiesDiff, RequestBodiesDetail)
323-
summary.add(diff.ResponsesDiff, ResponsesDetail)
324-
summary.add(diff.SecuritySchemesDiff, SecuritySchemesDetail)
325-
summary.add(diff.ExamplesDiff, ExamplesDetail)
326-
summary.add(diff.LinksDiff, LinksDetail)
327-
summary.add(diff.CallbacksDiff, CallbacksDetail)
319+
if diff.ComponentsDiff != nil {
320+
summary.add(diff.ComponentsDiff.SchemasDiff, SchemasDetail)
321+
summary.add(diff.ComponentsDiff.ParametersDiff, ParametersDetail)
322+
summary.add(diff.ComponentsDiff.HeadersDiff, HeadersDetail)
323+
summary.add(diff.ComponentsDiff.RequestBodiesDiff, RequestBodiesDetail)
324+
summary.add(diff.ComponentsDiff.ResponsesDiff, ResponsesDetail)
325+
summary.add(diff.ComponentsDiff.SecuritySchemesDiff, SecuritySchemesDetail)
326+
summary.add(diff.ComponentsDiff.ExamplesDiff, ExamplesDetail)
327+
summary.add(diff.ComponentsDiff.LinksDiff, LinksDetail)
328+
summary.add(diff.ComponentsDiff.CallbacksDiff, CallbacksDetail)
329+
}
328330

329331
// special
330332
summary.add(diff.EndpointsDiff, EndpointsDetail)

diff/diff_test.go

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -361,25 +361,25 @@ func TestParamDeletedFromPathItem(t *testing.T) {
361361

362362
func TestHeaderAdded(t *testing.T) {
363363
require.Contains(t,
364-
d(t, diff.NewConfig(), 5, 1).HeadersDiff.Added,
364+
d(t, diff.NewConfig(), 5, 1).ComponentsDiff.HeadersDiff.Added,
365365
"new")
366366
}
367367

368368
func TestHeaderDeleted(t *testing.T) {
369369
require.Contains(t,
370-
d(t, diff.NewConfig(), 1, 5).HeadersDiff.Deleted,
370+
d(t, diff.NewConfig(), 1, 5).ComponentsDiff.HeadersDiff.Deleted,
371371
"new")
372372
}
373373

374374
func TestRequestBodyModified(t *testing.T) {
375375
dd := d(t, diff.NewConfig(), 1, 3)
376376

377377
require.True(t,
378-
dd.RequestBodiesDiff.Modified["reuven"].ContentDiff.MediaTypeModified["application/json"].SchemaDiff.PropertiesDiff.Modified["meter_value"].TypeDiff.Deleted.Is("number"),
378+
dd.ComponentsDiff.RequestBodiesDiff.Modified["reuven"].ContentDiff.MediaTypeModified["application/json"].SchemaDiff.PropertiesDiff.Modified["meter_value"].TypeDiff.Deleted.Is("number"),
379379
)
380380

381381
require.True(t,
382-
dd.RequestBodiesDiff.Modified["reuven"].ContentDiff.MediaTypeModified["application/json"].SchemaDiff.PropertiesDiff.Modified["meter_value"].TypeDiff.Added.Is("integer"),
382+
dd.ComponentsDiff.RequestBodiesDiff.Modified["reuven"].ContentDiff.MediaTypeModified["application/json"].SchemaDiff.PropertiesDiff.Modified["meter_value"].TypeDiff.Added.Is("integer"),
383383
)
384384
}
385385

@@ -388,21 +388,21 @@ func TestHeaderModifiedSchema(t *testing.T) {
388388

389389
require.Equal(t,
390390
false,
391-
dd.HeadersDiff.Modified["test"].SchemaDiff.AdditionalPropertiesAllowedDiff.From)
391+
dd.ComponentsDiff.HeadersDiff.Modified["test"].SchemaDiff.AdditionalPropertiesAllowedDiff.From)
392392

393393
require.Equal(t,
394394
true,
395-
dd.HeadersDiff.Modified["test"].SchemaDiff.AdditionalPropertiesAllowedDiff.To)
395+
dd.ComponentsDiff.HeadersDiff.Modified["test"].SchemaDiff.AdditionalPropertiesAllowedDiff.To)
396396
}
397397

398398
func TestHeaderModifiedContent(t *testing.T) {
399399
dd := d(t, diff.NewConfig(), 5, 1)
400400

401401
require.True(t,
402-
dd.HeadersDiff.Modified["testc"].ContentDiff.MediaTypeModified["application/json"].SchemaDiff.TypeDiff.Deleted.Is("string"))
402+
dd.ComponentsDiff.HeadersDiff.Modified["testc"].ContentDiff.MediaTypeModified["application/json"].SchemaDiff.TypeDiff.Deleted.Is("string"))
403403

404404
require.True(t,
405-
dd.HeadersDiff.Modified["testc"].ContentDiff.MediaTypeModified["application/json"].SchemaDiff.TypeDiff.Added.Is("object"))
405+
dd.ComponentsDiff.HeadersDiff.Modified["testc"].ContentDiff.MediaTypeModified["application/json"].SchemaDiff.TypeDiff.Added.Is("object"))
406406
}
407407

408408
func TestResponseContentModified(t *testing.T) {
@@ -449,13 +449,13 @@ func TestSchemaDiff_AddedRequestBody(t *testing.T) {
449449

450450
func TestSchemaDiff_AddedSchemas(t *testing.T) {
451451
require.Contains(t,
452-
d(t, diff.NewConfig(), 1, 5).SchemasDiff.Added,
452+
d(t, diff.NewConfig(), 1, 5).ComponentsDiff.SchemasDiff.Added,
453453
"requests")
454454
}
455455

456456
func TestSchemaDiff_DeletedSchemas(t *testing.T) {
457457
require.Contains(t,
458-
d(t, diff.NewConfig(), 5, 1).SchemasDiff.Deleted,
458+
d(t, diff.NewConfig(), 5, 1).ComponentsDiff.SchemasDiff.Deleted,
459459
"requests")
460460
}
461461

@@ -464,34 +464,34 @@ func TestSchemaDiff_ModifiedSchemas(t *testing.T) {
464464

465465
require.Equal(t,
466466
true,
467-
dd.SchemasDiff.Modified["network-policies"].AdditionalPropertiesAllowedDiff.From)
467+
dd.ComponentsDiff.SchemasDiff.Modified["network-policies"].AdditionalPropertiesAllowedDiff.From)
468468

469469
require.Equal(t,
470470
false,
471-
dd.SchemasDiff.Modified["network-policies"].AdditionalPropertiesAllowedDiff.To)
471+
dd.ComponentsDiff.SchemasDiff.Modified["network-policies"].AdditionalPropertiesAllowedDiff.To)
472472
}
473473

474474
func TestSchemaDiff_ModifiedSchemasOldNil(t *testing.T) {
475475
dd := d(t, diff.NewConfig(), 1, 5)
476476

477477
require.Equal(t,
478478
nil,
479-
dd.SchemasDiff.Modified["rules"].AdditionalPropertiesAllowedDiff.From)
479+
dd.ComponentsDiff.SchemasDiff.Modified["rules"].AdditionalPropertiesAllowedDiff.From)
480480

481481
require.Equal(t,
482482
false,
483-
dd.SchemasDiff.Modified["rules"].AdditionalPropertiesAllowedDiff.To)
483+
dd.ComponentsDiff.SchemasDiff.Modified["rules"].AdditionalPropertiesAllowedDiff.To)
484484
}
485485

486486
func TestSchemaDiff_ModifiedSchemasNewNil(t *testing.T) {
487487
dd := d(t, diff.NewConfig(), 5, 1)
488488

489489
require.Equal(t,
490490
false,
491-
dd.SchemasDiff.Modified["rules"].AdditionalPropertiesAllowedDiff.From)
491+
dd.ComponentsDiff.SchemasDiff.Modified["rules"].AdditionalPropertiesAllowedDiff.From)
492492

493493
require.Nil(t,
494-
dd.SchemasDiff.Modified["rules"].AdditionalPropertiesAllowedDiff.To)
494+
dd.ComponentsDiff.SchemasDiff.Modified["rules"].AdditionalPropertiesAllowedDiff.To)
495495
}
496496

497497
func TestSummary(t *testing.T) {
@@ -657,12 +657,12 @@ func TestCircularSchemaRefs(t *testing.T) {
657657
dd, err := diff.Get(diff.NewConfig(), s1, s2)
658658
require.NoError(t, err)
659659

660-
require.Contains(t, dd.SchemasDiff.Modified, "circular1")
661-
require.NotContains(t, dd.SchemasDiff.Modified, "circular2")
662-
require.Contains(t, dd.SchemasDiff.Modified, "circular3")
663-
require.NotContains(t, dd.SchemasDiff.Modified, "circular4")
664-
require.Contains(t, dd.SchemasDiff.Modified, "circular5")
665-
require.Contains(t, dd.SchemasDiff.Modified, "circular6")
660+
require.Contains(t, dd.ComponentsDiff.SchemasDiff.Modified, "circular1")
661+
require.NotContains(t, dd.ComponentsDiff.SchemasDiff.Modified, "circular2")
662+
require.Contains(t, dd.ComponentsDiff.SchemasDiff.Modified, "circular3")
663+
require.NotContains(t, dd.ComponentsDiff.SchemasDiff.Modified, "circular4")
664+
require.Contains(t, dd.ComponentsDiff.SchemasDiff.Modified, "circular5")
665+
require.Contains(t, dd.ComponentsDiff.SchemasDiff.Modified, "circular6")
666666
}
667667

668668
func TestCallbacks(t *testing.T) {

internal/run_test.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -366,3 +366,9 @@ func Test_Changelog_WithUnmatchPath(t *testing.T) {
366366
func Test_JsonWithExcludeElements(t *testing.T) {
367367
require.Zero(t, internal.Run(cmdToArgs("oasdiff diff --format json --exclude-elements=description,title,summary ../data/description/spec1.yml ../data/description/spec2.yml --fail-on-diff"), io.Discard, io.Discard))
368368
}
369+
370+
func Test_EmptyComponentsOmitted(t *testing.T) {
371+
var stdout bytes.Buffer
372+
require.Zero(t, internal.Run(cmdToArgs("oasdiff diff ../data/version/base.yaml ../data/version/revision.yaml -f json"), &stdout, io.Discard))
373+
require.Equal(t, "{\"info\":{\"version\":{\"from\":\"0.0.0\",\"to\":\"0.0.1\"}}}\n", stdout.String())
374+
}

0 commit comments

Comments
 (0)