Skip to content

Commit

Permalink
feat(OpenApi3.1): add fixed and mixed fields generic visitors
Browse files Browse the repository at this point in the history
Closes #91
  • Loading branch information
char0n committed Sep 8, 2020
1 parent 21dcbcc commit 666ba12
Show file tree
Hide file tree
Showing 19 changed files with 134 additions and 74 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -216,7 +216,9 @@ const specification = {
},
Responses: {
$visitor: ResponsesVisitor,
fields: {},
fields: {
default: ExternalDocumentationDescriptionVisitor,
},
},
Callback: {
$visitor: CallbackVisitor,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
import stampit from 'stampit';
import { noop } from 'ramda-adjunct';

import SpecificationVisitor from '../SpecificationVisitor';
import { isOpenApiExtension } from '../../predicates';
import { visit, BREAK } from '..';

const FixedFieldsJsonObjectVisitor = stampit(SpecificationVisitor, {
props: {
specPath: [],
specPath: noop,
ignoredFields: [],
canSupportSpecificationExtensions: true,
},
Expand All @@ -24,14 +25,15 @@ const FixedFieldsJsonObjectVisitor = stampit(SpecificationVisitor, {
},
methods: {
object(objectNode) {
const fields = this.retrieveFields(this.specPath);
const specPath = this.specPath(objectNode);
const fields = this.retrieveFields(specPath);

objectNode.properties.forEach((propertyNode: any) => {
const keyName = propertyNode.key.value;

if (fields.includes(keyName) && !this.ignoredFields.includes(keyName)) {
const visitor = this.retrieveVisitorInstance([
...this.specPath,
...specPath,
'fields',
propertyNode.key.value,
]);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,61 +1,11 @@
import stampit from 'stampit';
import { noop } from 'ramda-adjunct';
import { isNonEmptyString } from 'ramda-adjunct';

import SpecificationVisitor from '../SpecificationVisitor';
import { isOpenApiExtension } from '../../predicates';
import { visit, BREAK } from '..';
import PatternedFieldsJsonObjectVisitor from './PatternedFieldsJsonObjectVisitor';

const MapJsonObjectVisitor = stampit(SpecificationVisitor, {
const MapJsonObjectVisitor = stampit(PatternedFieldsJsonObjectVisitor, {
props: {
specPath: noop,
ignoredFields: [],
canSupportSpecificationExtensions: false,
},
init({
// @ts-ignore
specPath = this.specPath,
// @ts-ignore
ignoredFields = this.ignoredFields,
// @ts-ignore
canSupportSpecificationExtensions = this.canSupportSpecificationExtensions,
} = {}) {
this.specPath = specPath;
this.ignoredFields = ignoredFields;
this.canSupportSpecificationExtensions = canSupportSpecificationExtensions;
},
methods: {
object(objectNode) {
objectNode.properties.forEach((propertyNode: any) => {
const keyName = propertyNode.key.value;

if (!this.ignoredFields.includes(keyName)) {
const specPath = this.specPath(propertyNode.value);
const visitor = this.retrieveVisitorInstance(specPath);
const keyElement = new this.namespace.elements.String(keyName);
const { MemberElement } = this.namespace.elements.Element.prototype;

visit(propertyNode, visitor);

const memberElement = this.maybeAddSourceMap(
propertyNode,
new MemberElement(
this.maybeAddSourceMap(propertyNode.key, keyElement),
visitor.element,
),
);

this.element.content.push(memberElement);
} else if (this.canSupportSpecificationExtensions && isOpenApiExtension({}, propertyNode)) {
const visitor = this.retrieveVisitorInstance(['document', 'extension']);
visit(propertyNode, visitor);
this.element.content.push(visitor.element);
}
});

this.maybeAddSourceMap(objectNode, this.element);

return BREAK;
},
fieldPatternPredicate: isNonEmptyString,
},
});

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import stampit from 'stampit';

import { BREAK } from '..';
import FixedFieldsJsonObjectVisitor from './FixedFieldsJsonObjectVisitor';
import PatternedFieldsJsonObjectVisitor from './PatternedFieldsJsonObjectVisitor';

const MixedFieldsJsonObjectVisitor = stampit(
FixedFieldsJsonObjectVisitor,
PatternedFieldsJsonObjectVisitor,
{
methods: {
object(objectNode) {
// @ts-ignore
FixedFieldsJsonObjectVisitor.compose.methods.object.call(this, objectNode);
// @ts-ignore
PatternedFieldsJsonObjectVisitor.compose.methods.object.call(this, objectNode);

return BREAK;
},
},
},
);

export default MixedFieldsJsonObjectVisitor;
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
import stampit from 'stampit';
import { F as stubFalse } from 'ramda';
import { noop } from 'ramda-adjunct';

import SpecificationVisitor from '../SpecificationVisitor';
import { isOpenApiExtension } from '../../predicates';
import { visit, BREAK } from '..';

const PatternedFieldsJsonObjectVisitor = stampit(SpecificationVisitor, {
props: {
fieldPatternPredicate: stubFalse,
specPath: noop,
ignoredFields: [],
canSupportSpecificationExtensions: false,
},
init({
// @ts-ignore
specPath = this.specPath,
// @ts-ignore
ignoredFields = this.ignoredFields,
// @ts-ignore
canSupportSpecificationExtensions = this.canSupportSpecificationExtensions,
} = {}) {
this.specPath = specPath;
this.ignoredFields = ignoredFields;
this.canSupportSpecificationExtensions = canSupportSpecificationExtensions;
},
methods: {
object(objectNode) {
objectNode.properties.forEach((propertyNode: any) => {
const keyName = propertyNode.key.value;

if (this.canSupportSpecificationExtensions && isOpenApiExtension({}, propertyNode)) {
const visitor = this.retrieveVisitorInstance(['document', 'extension']);
visit(propertyNode, visitor);
this.element.content.push(visitor.element);
} else if (!this.ignoredFields.includes(keyName) && this.fieldPatternPredicate(keyName)) {
const specPath = this.specPath(propertyNode.value);
const visitor = this.retrieveVisitorInstance(specPath);
const keyElement = new this.namespace.elements.String(keyName);
const { MemberElement } = this.namespace.elements.Element.prototype;

visit(propertyNode, visitor);

const memberElement = this.maybeAddSourceMap(
propertyNode,
new MemberElement(
this.maybeAddSourceMap(propertyNode.key, keyElement),
visitor.element,
),
);

this.element.content.push(memberElement);
}
});

this.maybeAddSourceMap(objectNode, this.element);

return BREAK;
},
},
});

export default PatternedFieldsJsonObjectVisitor;
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
import stampit from 'stampit';
import { always } from 'ramda';

import FixedFieldsJsonObjectVisitor from '../../generics/FixedFieldsJsonObjectVisitor';

const CallbackVisitor = stampit(FixedFieldsJsonObjectVisitor, {
props: {
specPath: ['document', 'objects', 'Callback'],
specPath: always(['document', 'objects', 'Callback']),
},
init() {
this.element = new this.namespace.elements.Callback();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
import stampit from 'stampit';
import { always } from 'ramda';

import FixedFieldsJsonObjectVisitor from '../../generics/FixedFieldsJsonObjectVisitor';

const ComponentsVisitor = stampit(FixedFieldsJsonObjectVisitor, {
props: {
specPath: ['document', 'objects', 'Components'],
specPath: always(['document', 'objects', 'Components']),
},
init() {
this.element = new this.namespace.elements.Components();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
import stampit from 'stampit';
import { always } from 'ramda';

import FixedFieldsJsonObjectVisitor from '../../generics/FixedFieldsJsonObjectVisitor';

const ContactVisitor = stampit(FixedFieldsJsonObjectVisitor, {
props: {
specPath: ['document', 'objects', 'Contact'],
specPath: always(['document', 'objects', 'Contact']),
},
init() {
this.element = new this.namespace.elements.License();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
import stampit from 'stampit';
import { always } from 'ramda';

import FixedFieldsJsonObjectVisitor from '../../generics/FixedFieldsJsonObjectVisitor';

const ExternalDocumentationVisitor = stampit(FixedFieldsJsonObjectVisitor, {
props: {
specPath: ['document', 'objects', 'ExternalDocumentation'],
specPath: always(['document', 'objects', 'ExternalDocumentation']),
},
init() {
this.element = new this.namespace.elements.ExternalDocumentation();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
import stampit from 'stampit';
import { always } from 'ramda';

import FixedFieldsJsonObjectVisitor from '../generics/FixedFieldsJsonObjectVisitor';

const OpenApi3_1Visitor = stampit(FixedFieldsJsonObjectVisitor, {
props: {
specPath: ['document', 'objects', 'OpenApi'],
specPath: always(['document', 'objects', 'OpenApi']),
},
init() {
this.element = new this.namespace.elements.OpenApi3_1();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
import stampit from 'stampit';
import { always } from 'ramda';

import FixedFieldsJsonObjectVisitor from '../../generics/FixedFieldsJsonObjectVisitor';

const InfoVisitor = stampit(FixedFieldsJsonObjectVisitor, {
props: {
specPath: ['document', 'objects', 'Info'],
specPath: always(['document', 'objects', 'Info']),
},
init() {
this.element = new this.namespace.elements.Info();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
import stampit from 'stampit';
import { always } from 'ramda';

import FixedFieldsJsonObjectVisitor from '../../generics/FixedFieldsJsonObjectVisitor';

const LicenseVisitor = stampit(FixedFieldsJsonObjectVisitor, {
props: {
specPath: ['document', 'objects', 'License'],
specPath: always(['document', 'objects', 'License']),
},
init() {
this.element = new this.namespace.elements.License();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
import stampit from 'stampit';
import { always } from 'ramda';

import FixedFieldsJsonObjectVisitor from '../../generics/FixedFieldsJsonObjectVisitor';

const OperationVisitor = stampit(FixedFieldsJsonObjectVisitor, {
props: {
specPath: ['document', 'objects', 'Operation'],
specPath: always(['document', 'objects', 'Operation']),
},
init() {
this.element = new this.namespace.elements.Operation();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
import stampit from 'stampit';
import { StringElement } from 'minim';
import { always } from 'ramda';
import { isOperationElement, OperationElement } from 'apidom-ns-openapi3-1';

import FixedFieldsJsonObjectVisitor from '../../generics/FixedFieldsJsonObjectVisitor';

const PathItemVisitor = stampit(FixedFieldsJsonObjectVisitor, {
props: {
specPath: ['document', 'objects', 'PathItem'],
specPath: always(['document', 'objects', 'PathItem']),
},
init() {
this.element = new this.namespace.elements.PathItem();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
import stampit from 'stampit';
import { always } from 'ramda';

import FixedFieldsJsonObjectVisitor from '../../generics/FixedFieldsJsonObjectVisitor';

const ReferenceVisitor = stampit(FixedFieldsJsonObjectVisitor, {
props: {
specPath: ['document', 'objects', 'Reference'],
specPath: always(['document', 'objects', 'Reference']),
},
init() {
this.element = new this.namespace.elements.Reference();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
import stampit from 'stampit';
import { always } from 'ramda';

import FixedFieldsJsonObjectVisitor from '../../generics/FixedFieldsJsonObjectVisitor';

const RequestBodyVisitor = stampit(FixedFieldsJsonObjectVisitor, {
props: {
specPath: ['document', 'objects', 'RequestBody'],
specPath: always(['document', 'objects', 'RequestBody']),
},
init() {
this.element = new this.namespace.elements.RequestBody();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
import stampit from 'stampit';
import { always, test } from 'ramda';

import FixedFieldsJsonObjectVisitor from '../../generics/FixedFieldsJsonObjectVisitor';
import MixedFieldsJsonObjectVisitor from '../../generics/MixedFieldsJsonObjectVisitor';

const ResponsesVisitor = stampit(FixedFieldsJsonObjectVisitor, {
const ResponsesVisitor = stampit(MixedFieldsJsonObjectVisitor, {
props: {
specPath: ['document', 'objects', 'Responses'],
specPath: always(['document', 'objects', 'Responses']),
fieldPatternPredicate: test(/^\d{3}$/),
canSupportSpecificationExtensions: true,
},
init() {
this.element = new this.namespace.elements.Responses();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
import stampit from 'stampit';
import { always } from 'ramda';

import FixedFieldsJsonObjectVisitor from '../../generics/FixedFieldsJsonObjectVisitor';

const ServerVariableVisitor = stampit(FixedFieldsJsonObjectVisitor, {
props: {
specPath: ['document', 'objects', 'ServerVariable'],
specPath: always(['document', 'objects', 'ServerVariable']),
canSupportSpecificationExtensions: true,
},
init() {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
import stampit from 'stampit';
import { always } from 'ramda';

import FixedFieldsJsonObjectVisitor from '../../generics/FixedFieldsJsonObjectVisitor';

const ServerVisitor = stampit(FixedFieldsJsonObjectVisitor, {
props: {
specPath: ['document', 'objects', 'Server'],
specPath: always(['document', 'objects', 'Server']),
},
init() {
this.element = new this.namespace.elements.Server();
Expand Down

0 comments on commit 666ba12

Please sign in to comment.