Repository navigation
Update tufin/oasdiff Docker tag to v1.37.0 - #14
Open
renovate[bot] wants to merge 1 commit into
Open
renovate[bot] wants to merge 1 commit into
renovate[bot] wants to merge 1 commit into
Conversation
renovate
Bot
force-pushed
the
renovate/tufin-oasdiff-1.x
branch
from
May 5, 2026 23:32
adf49c3 to
eb271f0
Compare
renovate
Bot
force-pushed
the
renovate/tufin-oasdiff-1.x
branch
from
May 10, 2026 18:32
eb271f0 to
006afee
Compare
renovate
Bot
force-pushed
the
renovate/tufin-oasdiff-1.x
branch
from
May 24, 2026 22:37
006afee to
a338e6c
Compare
renovate
Bot
force-pushed
the
renovate/tufin-oasdiff-1.x
branch
from
May 28, 2026 22:28
a338e6c to
2fed4d1
Compare
renovate
Bot
force-pushed
the
renovate/tufin-oasdiff-1.x
branch
from
May 30, 2026 14:47
2fed4d1 to
33f9de3
Compare
renovate
Bot
force-pushed
the
renovate/tufin-oasdiff-1.x
branch
from
May 30, 2026 22:45
33f9de3 to
1255989
Compare
renovate
Bot
force-pushed
the
renovate/tufin-oasdiff-1.x
branch
from
June 4, 2026 19:33
1255989 to
18b7844
Compare
renovate
Bot
force-pushed
the
renovate/tufin-oasdiff-1.x
branch
from
June 4, 2026 23:40
18b7844 to
bc09522
Compare
renovate
Bot
force-pushed
the
renovate/tufin-oasdiff-1.x
branch
from
June 6, 2026 10:44
bc09522 to
3e64862
Compare
renovate
Bot
force-pushed
the
renovate/tufin-oasdiff-1.x
branch
from
June 8, 2026 12:58
3e64862 to
f1c4256
Compare
renovate
Bot
force-pushed
the
renovate/tufin-oasdiff-1.x
branch
from
June 9, 2026 12:57
f1c4256 to
4e8ba3c
Compare
renovate
Bot
force-pushed
the
renovate/tufin-oasdiff-1.x
branch
from
June 13, 2026 23:42
4e8ba3c to
ddb2c70
Compare
renovate
Bot
force-pushed
the
renovate/tufin-oasdiff-1.x
branch
from
June 14, 2026 22:37
ddb2c70 to
5cc01f7
Compare
renovate
Bot
force-pushed
the
renovate/tufin-oasdiff-1.x
branch
from
June 21, 2026 14:41
5cc01f7 to
dbdb65c
Compare
renovate
Bot
force-pushed
the
renovate/tufin-oasdiff-1.x
branch
from
July 22, 2026 22:28
8366623 to
005e929
Compare
renovate
Bot
force-pushed
the
renovate/tufin-oasdiff-1.x
branch
from
July 24, 2026 12:50
005e929 to
fc8b039
Compare
renovate
Bot
force-pushed
the
renovate/tufin-oasdiff-1.x
branch
from
July 27, 2026 11:58
fc8b039 to
cb54622
Compare
renovate
Bot
force-pushed
the
renovate/tufin-oasdiff-1.x
branch
from
July 30, 2026 23:46
cb54622 to
138d8d3
Compare
renovate
Bot
force-pushed
the
renovate/tufin-oasdiff-1.x
branch
from
August 6, 2026 16:07
138d8d3 to
1e99f31
Compare
renovate
Bot
force-pushed
the
renovate/tufin-oasdiff-1.x
branch
from
August 16, 2026 15:15
1e99f31 to
0cb993f
Compare
renovate
Bot
force-pushed
the
renovate/tufin-oasdiff-1.x
branch
from
August 31, 2026 03:42
0cb993f to
2a943f7
Compare
renovate
Bot
force-pushed
the
renovate/tufin-oasdiff-1.x
branch
from
September 5, 2026 11:06
2a943f7 to
649d295
Compare
renovate
Bot
force-pushed
the
renovate/tufin-oasdiff-1.x
branch
from
September 13, 2026 14:57
649d295 to
70eb7a8
Compare
renovate
Bot
force-pushed
the
renovate/tufin-oasdiff-1.x
branch
from
September 15, 2026 22:54
70eb7a8 to
ee28ef3
Compare
renovate
Bot
force-pushed
the
renovate/tufin-oasdiff-1.x
branch
from
October 1, 2026 18:46
ee28ef3 to
c381303
Compare
renovate
Bot
force-pushed
the
renovate/tufin-oasdiff-1.x
branch
from
October 19, 2026 02:47
c381303 to
83d073f
Compare
renovate
Bot
force-pushed
the
renovate/tufin-oasdiff-1.x
branch
from
October 21, 2026 21:28
83d073f to
fc68f83
Compare
renovate
Bot
force-pushed
the
renovate/tufin-oasdiff-1.x
branch
from
October 28, 2026 21:47
fc68f83 to
89d5cb3
Compare
renovate
Bot
force-pushed
the
renovate/tufin-oasdiff-1.x
branch
from
November 7, 2026 18:53
89d5cb3 to
250fe26
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Note
This PR body was truncated due to platform limits.
This PR contains the following updates:
v1.15.0→v1.37.0Release Notes
oasdiff/oasdiff (tufin/oasdiff)
v1.37.0Compare Source
Nine new checks, correct severities in
oasdiff checks validate, and localized messages that print their valuesMoving a deprecated resource's sunset date earlier is now reported, for endpoints, parameters and properties alike, which the deprecation docs have described for years and the code did not do.
oasdiff validateflags a schema that no payload can satisfy. Localized output no longer prints%!(EXTRA ...)in Spanish, Russian and Portuguese.Detection rules
Nine new ids. A spec that moves a sunset date earlier, or deletes a deprecated property's sunset date, will report where it did not before.
A sunset date moved earlier is breaking (#1397, thanks @BogdanYarotsky for the report in #1363).
api-sunset-date-changed-earlier,request-parameter-sunset-date-changed-earlier,request-property-sunset-date-changed-earlierandresponse-property-sunset-date-changed-earlierare new, aterror. Until now the move was reported only when the new date fell inside the deprecation grace period, so with no--deprecation-days-*configured any future date passed silently, even thoughapi-sunset-date-changed-too-smallclaimed the new date "must be not earlier than" the old one. The grace period now decides which id reports the move rather than whether it is reported at all:*-changed-too-smallwhen the new date is inside the period,*-changed-earlierwhen it is not. The finding explains itself, since an error with no policy configured is surprising: the date clients were given has been withdrawn, and oasdiff treats a publishedx-sunsetdate as a commitment whether or not a policy is set./checks/<id>documents how to downgrade it.A deprecated property's sunset date, deleted or moved too close (#1359, thanks @BogdanYarotsky).
request-property-sunset-deleted,request-property-sunset-date-changed-too-small,response-property-sunset-deletedandresponse-property-sunset-date-changed-too-smallare new, aterror. Properties now get the sunset checks parameters already had. Fixes #1315.validatereports a schema that can accept no payload (#1396, found while reviewing @pfeurean's report in #1383, which is still open).required-property-forbidden, a warning:additionalProperties: falseallows only the properties a schema declares, so requiring one it does not declare leaves a schema no object can satisfy. The document violates no MUST, which is why a parser accepts it andvalidatehad nothing to say.Two changes to what the sunset checks report (#1390). An
x-sunsetdate that cannot be parsed in the base spec is no longer reported when the revision replaces it with a valid one: clients had no date to rely on, and the unparseable value is already an error in the revision that introduced it. And a deleted or unparseable sunset date is now reported even whenx-stability-leveldoes not parse, which was already true for endpoints and parameters and is now true for properties. The three checks share one body, so the three families cannot drift apart again.Messages
A value that cannot be parsed is reported as the value (#1391, #1393). Six ids built an English sentence in Go and passed it as a message argument, so Spanish, Russian and Portuguese each carried a nested English one, and the value inside it was never delimited: an empty
x-sunsetended the message at a colon, a value of one space was invisible, and a valid date padded with a space read as valid. The value is now the argument, quoted, and the sentence belongs to the template in every language. Affectsapi-deprecated-sunset-parse,api-path-sunset-parse,request-parameter-sunset-parse,request-property-deprecated-sunset-invalid,response-property-deprecated-sunset-invalidandapi-invalid-stability-level.30 localized messages printed
%!(EXTRA ...)(#1392). A message with fewer format verbs than the English one appended Go's error marker to its own text, so in Spanish a deprecated parameter readparámetro de solicitud deprecado%!(EXTRA string=query, string=id). Fifteen messages ines, eight inpt-brand seven inruare fixed, and a test now formats every message in every locale and fails on any%!in the result.APIis capitalized in the 50 messages that spelled it as a word (#1397), and the allOf disclaimer is worded for every change it attaches to (#1378).validateoasdiff checks validatelisted seven rules at the wrong severity (#1395).minimum-exceeds-maximum,min-length-exceeds-max-length,min-items-exceeds-max-items,min-properties-exceeds-max-properties,min-contains-exceeds-max-contains,enum-emptyandconst-not-in-enumwere listed as errors while the findings came out as warnings. The lint now reads its level from the same registry the listing does, so the two cannot disagree again. No finding changes level.Go API
STABILITY_*constants are removed (#1394).STABILITY_DRAFT,STABILITY_ALPHA,STABILITY_BETAandSTABILITY_STABLEhave been aliases ofStabilityDraftand friends since v1.20.0. The replacement is a rename at the call site, with no behaviour change.Upgrading
Change fingerprints move for the six ids whose argument changed, so a tool that carries review state by fingerprint, including the oasdiff Pro review, will show those findings once as new. Findings of other ids are unaffected.
If one of the eight new checker ids reports on a spec you consider correct,
--severity-levelsdowngrades any of them individually, and each one has a page on oasdiff.com that explains the mechanism. The newvalidaterule is different:validatehas no--severity-levels, sorequired-property-forbiddenis a warning that--fail-on ERRalready ignores.v1.36.0Compare Source
Source locations for JSON specs, correct severity for added request allOf branches, and
--exclude-elements tagsJSON specs now report line and column on every finding, the same as YAML specs, which took a new YAML decoder in kin-openapi to reach. Adding an
allOfbranch to a request is reported as an error again. Sunset and parameter deprecation findings point at the right line,oasdiff validateoutput comes out in the same order on every run, andoasdiff diffcan now ignore tags.CLI changes
Source locations
in schema "A"suffix to tell components apart, and that suffix is gone.conflicting-pathsandinfo-requiredalso gained a line they used to lack. One limitation: positions are only as fine as the document's line breaks, so a minified spec, the whole document on one line, reports every change on line 1, with a column that is still exact. Source location tracking has the detail. Known regression: on some changes theendColumnnow includes trailing whitespace on the line. Start positions are unchanged. Closes #1128.x-sunset(#1371). Six ids put their annotation on thedeprecatedfield instead of the date they complain about:api-deprecated-sunset-parse,api-sunset-date-too-small,request-property-deprecated-sunset-invalid,request-property-sunset-date-too-small,response-property-deprecated-sunset-invalidandresponse-property-sunset-date-too-small. They now point atx-sunset.*-deprecated-sunset-missingand*-reactivatedstill point atdeprecated, because those findings are about that field. When a sunset date fails to parse on only one side, the finding now carries a location for that side only.deprecatedfield (#1367). The check looked fordeprecatedin the parameter's schema. The annotation therefore landed on the operation line, or had no location at all when the schema also changed in that revision. Fixes #1362.Detection rules
allOfbranch is an error again (#1375, thanks @mvanhorn).request-body-all-of-addedandrequest-property-all-of-addedwere lowered to warnings, with a comment saying another branch might still keep a constraint that was dropped. Adding a branch to anallOfcan only narrow what a request may send, so the comment did not apply. Both ids now report at their declared error level, without the comment. Fixes #1308.validateoasdiff validatenow checks an operation's callbacks, which it never did before. A spec with an invalid example inside acallbacks:block can now failvalidatewhere it used to pass.multiple-of-not-positiveis renamed toschema-multiple-of-not-positive(#1384). AmultipleOfof zero or less used to produce two findings for one problem. The duplicate is gone. The surviving finding has a new id and points at the samemultipleOf:line. Machine output that matches on the old id needs to be updated.diff--exclude-elements tags(#1364). This value drops tag changes fromdiffandsummaryin both places tags appear: the tags an operation is listed under, and the document's top-level tag definitions. Moving an operation between tags no longer shows up as a change.changelogandbreakingare unaffected. Fixes #1337.Docker
rev:pathsyntax failed inside the container. The image now trusts mounted repositories.docs/DOCKER.mdhas a new section on running the image as a non-root user with--user.Misc
/(#1365). A finding inside anallOf,anyOforoneOfbranch now names it asnickname/allOf[subschema #​2]instead ofnickname/allOf[subschema #​2]/. Because the name is part of the finding, fingerprints change for findings inside a subschema, and a stored approval keyed on one of them will be requested once more.flattenrejects an explicitenum: []that conflicts with otherallOfbranches (#1369). An empty enum was treated as no enum, so the flattened schema accepted values the original rejects. It now fails with the existing enum-conflict error. Fixes #1262.--match-path,--unmatch-pathor--filter-extensionpattern now names the flag in its error.--match-pathand--unmatch-pathused to share one message. Each pattern is also compiled once per diff instead of once per path pair.Go package changes
checker/locationandchecker/schemawalkare now internal (#1381). They moved underchecker/internaland can no longer be imported. Usechecker.Sourceto build a source location, for example&checker.Source{File: "base.yaml", Line: 10, Column: 5}.WithSources,GetBaseSource,GetRevisionSourceand theBaseSource/RevisionSourcefields are unchanged.diff.ExcludeTagsOptionandIsExcludeTags(#1364). Library support for the newtagsvalue of--exclude-elements.load.IsExternalRefDisallowedmatches a typed error (#1384). It now detects kin-openapi's*openapi3.DisallowedExternalRefErrorwitherrors.Asinstead of matching the message text.github.com/oasdiff/yamlandgithub.com/oasdiff/yaml3are no longer dependencies (#1384).v1.35.0Compare Source
Deterministic diff output, a sunset-aware deprecation lifecycle, and the OAuth flows that were never checked
oasdiff diffnow returns the same output on every run of the same comparison. Removing a deprecated request or response property follows itsx-sunsetdate instead of reporting a plain removal. The OAuth security checks cover all four flows rather than onlyimplicit, and compare URLs by meaning. Two crashes are fixed. This is the same code asv1.35.0-rc.1.CLI changes
Deterministic output
diffreturns the same output on every run (#1335). Parts of the diff were built by ranging over a map, and Go randomizes map iteration, so the order of added, deleted and modified entries moved between runs of the same comparison. Every map-based diff now goes through one helper that returns sorted lists, paths are listed by path then method,requiredandtypelists are sorted, the YAMLendpointssection is sorted, and an added and deleted media type that are equivalent are paired the same way every run. A new test compares 284 fixture pairs ten times each and requires identical JSON and YAML.--include-path-params. Thex-since-dateerror got the same treatment.Deprecation
x-sunsetreportsrequest-property-removed-with-deprecationorresponse-required-property-removed-with-deprecationat info, removing one before its sunset date reportsrequest-property-removed-before-sunsetorresponse-required-property-removed-before-sunsetat error, and removing one after its sunset date is not reported. A sunset date that cannot be parsed keeps the plain removal id, since the deprecation checks already report the bad date.Security schemes
implicitflow, so changes toauthorizationCode,passwordandclientCredentialswere never reported: moving anauthorizationCodeflow's URLs to another host and dropping one of its scopes gave "No changes to report". Every URL and scope finding now names its flow, since the same scope can appear in two flows of one scheme, andapi-security-component-oauth-refresh-url-changedis new.https://Login.Example.com:443/tokenandhttps://login.example.com/tokenare no longer reported as a change. The comparison follows RFC 3986: case in the scheme and host, a default port, an empty path, and percent-encoding of unreserved characters are all equivalent. The four URL checks now share one level,warning, with a comment explaining the verdict;api-security-component-openid-connect-url-changedwas an error, and the authorization and token URL checks were info.Crashes
x-extensible-enumwith numeric values no longer panics (#1343). An integer parameter or property written asx-extensible-enum: [1, 2]crashedbreakingandchangelogwhen a value was removed, because the items were read as strings. A removed number is now reported like any other removed value.diff,breaking,changelogandsummaryare all fixed, and each change is reported once, where the callback is first compared.External
$refs$ref(#1354). With--allow-external-refs=false, a refused$refexited 123 when oasdiff's own reader was installed, which--opendoes, and 102 otherwise, so a CI step keying off the code could not reliably offer the remedy. Both paths now exit 123, and the two forms of the refusal are recognized by one predicate.--openinstalls now refuses an external$refbefore any read, and a call site that does not name a document gets the policy rather than silently getting none. The fix itself shipped in v1.34.1 and is published as GHSA-6h5x-f3qr-cp23; what is new here is that the reader fails closed.Misc
Go package changes
load.IsExternalRefDisallowed(err)(#1354). Answers for both refusal paths, oasdiff's reader and kin-openapi's own check, so a caller no longer has to match either form. The kin match is pinned by a test that runs the real loader, so a wording change upstream fails the test rather than silently reverting the behaviour.utils.StringSet.ToStringListreturns sorted values (#1335). This is what makes string-list diffs such asrequiredandtypedeterministic; a caller that relied on the previous arbitrary order now gets a stable one.RequestPropertyRemovedWithDeprecationId,RequestPropertyRemovedBeforeSunsetId,ResponseRequiredPropertyRemovedWithDeprecationId,ResponseRequiredPropertyRemovedBeforeSunsetId. Machine-readable output gains these ids, so a consumer matching on removal ids should expect them.v1.34.1Compare Source
A security patch, cut from v1.34.0 with this change alone. If you run
--open, or use the GitHub Action, upgrade.CLI changes
--allow-external-refs=falseis now enforced when--openis passed (#1347).--openinstalls a reader that captures the text of every file the loader reads, so the review can be sliced into per-endpoint blocks. kin-openapi checks the external-refs setting only when no custom reader is installed, and hands the policy to the reader when there is one, so the setting had no effect on file, URL and glob sources: a spec with an external$refcould read any local file or reach any URL, and the full bytes of what it read went into the review bundle. Refusing now returns the existingExternalRefError(exit code 123), the same as the git-revision path, and--allow-external-refs=trueis unaffected. Reported by Zachariah Mithani (AploSec). See GHSA-6h5x-f3qr-cp23; GitHub Action users should read GHSA-6h8r-wgc5-q3xv, where the affected combination is the default configuration.Go package changes
load.NewSpecInfoWithCaptureandload.NewSpecInfoFromGlobWithCaptureapply the external-refs policy before reading. A caller that setIsExternalRefsAllowed=falseand loaded through either of them was not getting that setting honoured; a refused$refnow returns*load.ExternalRefError. No exported signature changes.v1.34.0Compare Source
Security checks, one finding per shared-schema change, faster large specs
Security requirements are now compared by the access they grant: securing an anonymous endpoint, replacing a top-level requirement and changing how a security scheme sends credentials are all reported as breaking. A change in a schema that many properties reference is reported once, naming the schema, which cuts the output on large specs by up to 97%. Large specs compare much faster, and several sources of run-to-run differences in the output are gone.
This release includes everything tested in the v1.33.1 release candidates. Thanks @victorrentea for reporting five of the detection gaps fixed here (#1280, #1281, #1282, #1283, #1284), @ttyS15 for the shared-schema traversal fix (#1263), @bram96 for the
--flatten-allofreport and for testing the release candidate on a full spec (#1279), and @dreaded369 for thevalidatereport (#1304).CLI changes
Security
securityit inherits, is now reported asapi-security-anonymous-access-removed(error), naming what the endpoint now accepts. Making a secured operation anonymous isapi-security-anonymous-access-added(info), instead of the previousapi-security-removederror. Operations that switch between inheriting the top-levelsecurityand declaring their own, includingsecurity: [], are compared using the security actually in effect.securitylist was always reported at info, sobreakingpassed although every inheriting operation now rejects existing clients. Each inheriting operation now getsapi-security-removed,api-security-added,api-security-scope-addedorapi-security-scope-removedat its declared level, with a comment saying the endpoint inherits the API's top-level security requirements. Theapi-global-security-*findings now appear only when no operation inherits the list, at info. These findings have new ids and paths, so their fingerprints change.api-security-component-api-key-name-changed,api-security-component-api-key-in-changed,api-security-component-http-scheme-changed(compared case-insensitively) andapi-security-component-openid-connect-url-changed.api-security-component-bearer-format-changedis info, sincebearerFormatis a hint. When the scheme'stypechanges, only the type change is reported.api-security-component-type-changedis now an error (#1288), so changing a security scheme's type failsoasdiff breaking. Use--severity-levelsto set it back to info.apiKeyscheme sent in a header fromX-API-Keytox-api-keyis no longer reported, matching other header names.--case-insensitive-headers=falseturns this off.Shared schemas
(shared schema: Shared, also at third/shared/id, fourth/shared/id and 1 more). On the Microsoft Graph description, 713,875 findings between two releases become 18,953.sharedSchemafield in JSON and YAML output (#1273):name,propertiesandcount, orcyclicwhen a cycle makes the count unbounded.--err-ignoreor--warn-ignoreline copied from the old text no longer matches it.Detection rules
writeOnlyis now an error, the same as removing it. In OpenAPI 3.0, a required request property that stops beingreadOnlyis an error, because 3.0 appliedrequiredto it in responses only; in 3.1 and later it is reported as the newrequest-required-property-became-not-read-only-in-openapi-31at info, since clients already had to send it. A request property becomingreadOnlyis now a warning, with a comment saying the spec lets the server either ignore or reject it.enumkeyword was reported as each value removed, which inverted the verdict: it is now info on requests (request-property-became-not-enumand the parameter and body variants) and an error on responses (response-property-became-not-enum,response-mediatype-became-not-enum), since the server may now return values the old enum excluded. Adding an enum to an unconstrained response property isresponse-property-became-enum(info) instead of one error per value.response-mediatype-enum-value-added(error); it was not reported at all. Adding an enum to a response body (response-mediatype-became-enum) and adding a value to a request body enum (request-body-enum-value-added) are reported at info.dateortimetodate-timeis breaking (#1285, fixes #1281). It was treated as a widening, but a validdateis not a validdate-time, so on a request the change rejects every value that was valid before. It is now reported as a format change.oneOf: [{type: "null"}, X]wrapper from a header parameter, or a property of one, also reportednew-required-request-header-property,request-header-property-became-requiredandrequest-header-property-became-enum. Onlyrequest-parameter-became-not-nullableis reported now, as for query parameters.Large specs and stable output
breakingon the Microsoft Graph description went from 152 to 24 seconds. A chain of shared schemas, each referenced twice, no longer makesbreakingslow down exponentially with its depth (#1263).--flatten-allofgives the same result on every run (#1287, fixes #1279). AnallOfwhose subschemas had their ownallOfcould be merged in an order that changed from run to run, so two identical copies of a spec were sometimes reported as different.Misc
validatekeeps the same defect in different components apart in a JSON spec (#1312, fixes #1304). A JSON spec has no line numbers, so the same defect in several components was reported once. Each component now gets its own finding, naming the component. The fingerprints of components-rooted findings change, for YAML specs too.oasdiff diffshows an operation declaring or dropping its own security list (#1290), aslistAdded/listDeleted, sosecurity: []appearing or disappearing is no longer invisible.Go package changes
checker/location(#1267).checker.NewSource,checker.ParameterSources,checker.SchemaFieldSourcesand the other exported location helpers are now inchecker/location.checker.Sourceremains as an alias.checker/schemawalk(#1269), withWalker.Walk,ModifiedProperties,AddedProperties,DeletedPropertiesandPropertyFullName.ApiChange.WithSchematakes the root schema and property path as well as the node (#1273).ApiChange.GetSharedSchemareturns the new shared schema detail.SchemaDiff.BaseComponentandRevisionComponenthold thecomponents.schemasname, including for a$refwith a description override. They are not part of the diff output.openapiversion, none of them in the output.CheckBackwardCompatibilityfilters this context on a copy, so the caller's diff is not modified.v1.33.0Compare Source
Recursive schemas: fast, deterministic, and no longer repeated per path
v1.32.0 could run for hours on a spec whose schemas reference each other in cycles, and v1.32.1 fixed that by returning to v1.31.0's cycle handling, which gave up the deterministic output v1.32.0 had introduced. This release reworks the handling so that both hold at once, on the two specs reported in #1252 and on everything else.
Thanks @simonbility for the report and the specs, @philippnagel for the second spec and for testing the release candidate against it, and @BigMichi1 for the determinism report that started this.
CLI changes
Recursive schemas
--flatten-allof(#1254, fixes #1252). The two specs reported there are the measure: one needed--flatten-allofand ran for hours, the other has 134 schemas referencing each other in a single cycle and never finished at all. Both now complete in about a second, including the combination v1.32.1 could not do.--flatten-allofkeeps one copy of each schema. It used to copy a schema once for every place that referenced it: one reported spec grew from 5,195 schema objects to 3.5 million in memory. The flattened output is unchanged, and flattening it now takes milliseconds rather than seconds.$ref-to-inline refactor inside a cycle is recognized as a refactor, the same as one outside a cycle.Upgrading from v1.32.1
circularReffield is removed fromdiff --format json|yamloutput again, as in v1.32.0: cyclic-reference mismatches appear as ordinary field-level diffs, which say more. v1.32.1 had restored it along with v1.31.0's cycle handling.Go package changes
diff.SchemaDiff.CircularRefDiffis removed again (#1254), together with the ref-string circular guard, as in v1.32.0. v1.32.1 had restored both.flatten/allof.MergeSpecmerges a document with one state (#1254), so a schema referenced from several places stays one object after the merge.v1.32.1Compare Source
Fixes the v1.32.0 hang on cyclic schemas
v1.32.0 can run for hours on a spec whose schemas reference each other in cycles (#1252, two reports within a day). This release reverts the two v1.32.0 changes to cycle handling in the diff, so recursive schemas are handled exactly as in v1.31.0, and keeps everything else from v1.32.0. A rewrite of the cycle handling that fixes the hang and the non-determinism together (#1254) follows as a pre-release.
CLI changes
Cyclic schemas
--flatten-allof, and one with 134 schemas on a single reference cycle that hung with no flag at all. One limit of v1.31.0 comes back with it: that second spec still does not finish with--flatten-allof; #1254 fixes that too. Specs without cycles are unaffected; on a large real-world spec the changelog is identical, line for line, to both v1.31.0's and v1.32.0's. Thanks @mako365-philippnagel for the second spec.circularReffield is back indiff --format json/yamloutput, exactly as in v1.31.0. And the non-deterministic structured output for a schema that takes part in more than one reference cycle (#1230), which v1.32.0 had fixed, is back until #1254 ships; identical inputs can again produce one of two outputs for such schemas.checkscommandoasdiff checks changelog --id <check-id>shows one check (the full record in json/yaml; the flag shell-completes to the catalog ids, and an unknown id is an error).--location <string>keeps the checks whose claimed location contains the string, on the listing and oncoveragealike. Generated rules are marked as such in the listing.--helpand the README (#1250): compare two specs (breaking,changelog,diff,summary), process a single spec (validate,upgrade,flatten), git integration (breaking-files,git-diff-driver), reference (checks,schema). No behavior change.Docs
oasdiff checksand its six tags (read-only,write-only,sanctioned,non-success,has-default,negotiated), each defined in contract terms.Go package changes
diff.SchemaDiff.CircularRefDiffis back (#1255), with the ref-string circular guard that powers it, as in v1.31.0. Code written against v1.32.0 that relied on the field being absent sees it again; it is removed once more by #1254.v1.32.0Compare Source
56 new checks, cycle-proof diff and flatten
The generated-rule engine now covers every increase and decrease of every bound keyword (catalog: 699 to 755 checks), and recursive schemas are handled end to end: no more stack overflows in diff or flatten, deterministic structured output, and flattened recursion that always serializes under stable names.
CLI changes
Detection rules
maxProperties/minProperties/minContains/maxContainscoverage, and the widening response directions (for exampleresponse-body-max-decreased) are reported at info level.multipleOfis deliberately excluded: numeric order does not decide its effect, so it keeps its dedicated changed/generalized/specialized checks.exclusiveMaximum: falsetotrueused to report nothing (it is a breaking set), addingexclusiveMaximum: falsewas reported as breaking (it changes nothing, false means not exclusive), and the false-to-true transition could be misreported as a value increase.allOfcarry the disclaimer (#1229). Existence changes insideallOfbranches now get the same warning cap and--flatten-allofhint as other findings there, and a schema that itself has anallOfis recognized by presence rather than only when theallOfchanged.oasdiff checksshows each rule's guards (#1227). A GUARDS column and a--tagsdimension expose the read-only / write-only guards, so a verdict downgraded by a guard is explained by the catalog instead of looking like a bug.Recursive schemas: no crashes, deterministic output, serializable flatten
$ref(for example after--flatten-allofmerges a recursive component) are cut safely at the point of re-entry, whatever shape the cycle has.oasdiff flattenof recursiveallOfmerges always serializes (#1233, #1240, #1245). A cycle keeps its$refwhere one exists, a set that merges to a single schema reuses that schema with its name, and a genuinely anonymous merged cycle is hoisted intocomponents.schemasunder a name built from the merged component names (AllOfMerged_NodeA_NodeB), so the same cycle keeps the same name in every revision. Documented in docs/ALLOF.md (#1244).allOfof the named cycle and the merged remaining constraints instead of silently dropping them, which could previously hide breaking changes in the flattened comparison.--format json/yamloutputs at random; identical inputs now produce identical bytes, and the output is also more complete, each cycle edge carrying its own diff. Diffs of such schemas change once when you upgrade.circularRefoutput field is removed (#1238). Cyclic-reference mismatches now appear as ordinary field-level diffs, which say strictly more; a pure rename of a cyclic$refis no longer reported, matching how non-cyclic$refrenames behave.Validate
readOnlyon a schema reachable only from requests, orwriteOnlyonly from responses, can never take effect;oasdiff validatenow flags both, walking webhooks and callbacks too.Misc
Configuration
📅 Schedule: (in timezone Etc/UTC)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
This PR was generated by Mend Renovate. View the repository job log.