Skip to content
This repository was archived by the owner on Nov 8, 2024. It is now read-only.

Commit fd88e58

Browse files
klokanekylef
authored andcommitted
feat: Improved openapi.version handling
Closes #32
1 parent 5091afa commit fd88e58

File tree

3 files changed

+46
-4
lines changed

3 files changed

+46
-4
lines changed

packages/fury-adapter-oas3-parser/STATUS.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ Key:
1515

1616
| Field Name | Support |
1717
|:--|:--|
18-
| openapi | [~](https://github.com/apiaryio/fury-adapter-parser-oas3/issues/32) |
18+
| openapi | |
1919
| info | [~](https://github.com/apiaryio/fury-adapter-parser-oas3/issues/30) |
2020
| servers | [](https://github.com/apiaryio/fury-adapter-parser-oas3/issues/24) |
2121
| paths | ~ |

packages/fury-adapter-oas3-parser/lib/parser/openapi.js

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,33 @@
11
const R = require('ramda');
2-
const { createError } = require('../elements');
2+
const { createError, createWarning } = require('../elements');
33
const { isString } = require('../predicates');
44

5+
const semanticVersionRE = /^(\d+)\.(\d+).(\d+)$/;
6+
7+
const supportedMinorVersion = 0;
8+
const supportedMajorVersion = 3;
9+
510
// Parse the OpenAPI Version member
611
function parseOpenAPI(minim, openapi) {
712
if (!isString(openapi.value)) {
813
return new minim.elements.ParseResult([createError(minim, 'OpenAPI version is not a string', openapi.value)]);
914
}
1015

11-
if (openapi.value.toValue() !== '3.0.0') {
16+
const versionInfo = openapi.value.toValue().match(semanticVersionRE);
17+
18+
if (versionInfo === null) {
19+
return new minim.elements.ParseResult([createError(minim, `OpenAPI version does not contain valid semantic version string '${openapi.value.toValue()}'`, openapi.value)]);
20+
}
21+
22+
if (parseInt(versionInfo[1], 10) !== supportedMajorVersion) {
1223
return new minim.elements.ParseResult([createError(minim, `Unsupported OpenAPI version '${openapi.value.toValue()}'`, openapi.value)]);
1324
}
1425

26+
if (parseInt(versionInfo[2], 10) > supportedMinorVersion) {
27+
return new minim.elements.ParseResult([createWarning(minim, `Version '${openapi.value.toValue()}' is not fully supported`, openapi.value)]);
28+
}
29+
30+
1531
return new minim.elements.ParseResult([]);
1632
}
1733

packages/fury-adapter-oas3-parser/test/parser/openapi-test.js

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,16 @@ describe('#parseOpenAPI', () => {
1515
expect(parseResult.errors.getValue(0)).to.equal('OpenAPI version is not a string');
1616
});
1717

18-
it('fails to parse unknown version', () => {
18+
it('fails to parse non valid semantic version', () => {
19+
const openapi = new minim.elements.Member('openapi', '3.0');
20+
21+
const parseResult = parseOpenAPI(minim, openapi);
22+
expect(parseResult).to.be.instanceof(minim.elements.ParseResult);
23+
expect(parseResult.errors.length).to.equal(1);
24+
expect(parseResult.errors.getValue(0)).to.equal("OpenAPI version does not contain valid semantic version string '3.0'");
25+
});
26+
27+
it('fails to parse unknown major version', () => {
1928
const openapi = new minim.elements.Member('openapi', '4.0.0');
2029

2130
const parseResult = parseOpenAPI(minim, openapi);
@@ -31,4 +40,21 @@ describe('#parseOpenAPI', () => {
3140
expect(parseResult).to.be.instanceof(minim.elements.ParseResult);
3241
expect(parseResult.isEmpty).to.be.true;
3342
});
43+
44+
it('allows openapi patch version 3.0.11', () => {
45+
const openapi = new minim.elements.Member('openapi', '3.0.11');
46+
47+
const parseResult = parseOpenAPI(minim, openapi);
48+
expect(parseResult).to.be.instanceof(minim.elements.ParseResult);
49+
expect(parseResult.isEmpty).to.be.true;
50+
});
51+
52+
it('warns for unsuported minor versions', () => {
53+
const openapi = new minim.elements.Member('openapi', '3.1.0');
54+
55+
const parseResult = parseOpenAPI(minim, openapi);
56+
expect(parseResult).to.be.instanceof(minim.elements.ParseResult);
57+
expect(parseResult.warnings.length).to.equal(1);
58+
expect(parseResult.warnings.getValue(0)).to.equal("Version '3.1.0' is not fully supported");
59+
});
3460
});

0 commit comments

Comments
 (0)