Skip to content

Commit 893f125

Browse files
feat(ns-workflows-1): add support for Source Description Object (#3403)
Refs #3392
1 parent e60194b commit 893f125

File tree

17 files changed

+322
-10
lines changed

17 files changed

+322
-10
lines changed

packages/apidom-ns-workflows-1/README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ Only fully implemented specification objects should be checked here.
187187

188188
- [ ] [Workflows Specification Object](https://github.com/OAI/sig-workflows/blob/main/versions/1.0.0.md#workflows-specification-object)
189189
- [x] [Info Object](https://github.com/OAI/sig-workflows/blob/main/versions/1.0.0.md#info-object)
190-
- [ ] [Source Description Object](https://github.com/OAI/sig-workflows/blob/main/versions/1.0.0.md#source-description-object)
190+
- [x] [Source Description Object](https://github.com/OAI/sig-workflows/blob/main/versions/1.0.0.md#source-description-object)
191191
- [ ] [Workflow Object](https://github.com/OAI/sig-workflows/blob/main/versions/1.0.0.md#workflow-object)
192192
- [ ] [Step Object](https://github.com/OAI/sig-workflows/blob/main/versions/1.0.0.md#step-object)
193193
- [ ] [Parameter Object](https://github.com/OAI/sig-workflows/blob/main/versions/1.0.0.md#parameter-object)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import { ObjectElement, StringElement, Attributes, Meta } from '@swagger-api/apidom-core';
2+
3+
class SourceDescription extends ObjectElement {
4+
constructor(content?: Record<string, unknown>, meta?: Meta, attributes?: Attributes) {
5+
super(content, meta, attributes);
6+
this.element = 'sourceDescription';
7+
}
8+
9+
get name(): StringElement | undefined {
10+
return this.get('name');
11+
}
12+
13+
set name(name: StringElement | undefined) {
14+
this.set('name', name);
15+
}
16+
17+
get url(): StringElement | undefined {
18+
return this.get('url');
19+
}
20+
21+
set url(url: StringElement | undefined) {
22+
this.set('url', url);
23+
}
24+
25+
get type(): StringElement | undefined {
26+
return this.get('type');
27+
}
28+
29+
set type(type: StringElement | undefined) {
30+
this.set('type', type);
31+
}
32+
}
33+
34+
export default SourceDescription;

packages/apidom-ns-workflows-1/src/elements/WorkflowsSpecification1.ts

+9-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { ObjectElement, Attributes, Meta } from '@swagger-api/apidom-core';
1+
import { ObjectElement, ArrayElement, Attributes, Meta } from '@swagger-api/apidom-core';
22

33
import WorkflowsSpecElement from './WorkflowsSpec';
44
import InfoElement from './Info';
@@ -26,6 +26,14 @@ class WorkflowsSpecification1 extends ObjectElement {
2626
set info(info: InfoElement | undefined) {
2727
this.set('info', info);
2828
}
29+
30+
get sourceDescriptions(): ArrayElement | undefined {
31+
return this.get('sourceDescriptions');
32+
}
33+
34+
set sourceDescriptions(sourceDescriptions: ArrayElement | undefined) {
35+
this.set('sourceDescriptions', sourceDescriptions);
36+
}
2937
}
3038

3139
export default WorkflowsSpecification1;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { ArrayElement, Attributes, Meta } from '@swagger-api/apidom-core';
2+
3+
class SourceDescriptions extends ArrayElement {
4+
static primaryClass = 'sourceDescriptions';
5+
6+
constructor(content?: Array<unknown>, meta?: Meta, attributes?: Attributes) {
7+
super(content, meta, attributes);
8+
this.classes.push(SourceDescriptions.primaryClass);
9+
}
10+
}
11+
12+
export default SourceDescriptions;

packages/apidom-ns-workflows-1/src/index.ts

+5
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ export {
2525
isWorkflowsSpecElement,
2626
isWorkflowsSpecification1Element,
2727
isInfoElement,
28+
isSourceDescriptionElement,
29+
isSourceDescriptionsElement,
2830
} from './predicates';
2931

3032
export { isWorkflowsSpecificationExtension } from './refractor/predicates';
@@ -43,4 +45,7 @@ export {
4345
WorkflowsSpecification1Element,
4446
WorkflowsSpecElement,
4547
InfoElement,
48+
SourceDescriptionElement,
4649
} from './refractor/registration';
50+
// NCE types
51+
export { default as SourceDescriptionsElement } from './elements/nces/SourceDescriptions';

packages/apidom-ns-workflows-1/src/namespace.ts

+2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { NamespacePluginOptions } from '@swagger-api/apidom-core';
33
import WorkflowsSpecification1Element from './elements/WorkflowsSpecification1';
44
import WorkflowsSpecElement from './elements/WorkflowsSpec';
55
import InfoElement from './elements/Info';
6+
import SourceDescriptionElement from './elements/SourceDescription';
67

78
const workflows1 = {
89
namespace: (options: NamespacePluginOptions) => {
@@ -11,6 +12,7 @@ const workflows1 = {
1112
base.register('workflowsSpecification1', WorkflowsSpecification1Element);
1213
base.register('workflowsSpec', WorkflowsSpecElement);
1314
base.register('info', InfoElement);
15+
base.register('sourceDescription', SourceDescriptionElement);
1416

1517
return base;
1618
},

packages/apidom-ns-workflows-1/src/predicates.ts

+24
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@ import { createPredicate } from '@swagger-api/apidom-core';
33
import WorkflowsSpecification1Element from './elements/WorkflowsSpecification1';
44
import WorkflowsSpecElement from './elements/WorkflowsSpec';
55
import InfoElement from './elements/Info';
6+
import SourceDescriptionElement from './elements/SourceDescription';
7+
// NCE types
8+
import SourceDescriptionsElement from './elements/nces/SourceDescriptions';
69

710
export const isWorkflowsSpecElement = createPredicate(
811
({ hasBasicElementProps, isElementType, primitiveEq }) => {
@@ -36,3 +39,24 @@ export const isInfoElement = createPredicate(
3639
hasClass('info', element));
3740
},
3841
);
42+
43+
export const isSourceDescriptionElement = createPredicate(
44+
({ hasBasicElementProps, isElementType, primitiveEq }) => {
45+
return (element: unknown): element is SourceDescriptionElement =>
46+
element instanceof SourceDescriptionElement ||
47+
(hasBasicElementProps(element) &&
48+
isElementType('sourceDescription', element) &&
49+
primitiveEq('object', element));
50+
},
51+
);
52+
53+
export const isSourceDescriptionsElement = createPredicate(
54+
({ hasBasicElementProps, isElementType, primitiveEq, hasClass }) => {
55+
return (element: unknown): element is SourceDescriptionsElement =>
56+
element instanceof SourceDescriptionsElement ||
57+
(hasBasicElementProps(element) &&
58+
isElementType('sourceDescriptions', element) &&
59+
primitiveEq('array', element) &&
60+
hasClass('sourceDescriptions', element));
61+
},
62+
);

packages/apidom-ns-workflows-1/src/refractor/registration.ts

+14-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import WorkflowsSpecification1Element from '../elements/WorkflowsSpecification1';
22
import WorkflowsSpecElement from '../elements/WorkflowsSpec';
33
import InfoElement from '../elements/Info';
4+
import SourceDescriptionElement from '../elements/SourceDescription';
45
import { createRefractor } from './index';
56

67
InfoElement.refract = createRefractor(['visitors', 'document', 'objects', 'Info', '$visitor']);
@@ -19,5 +20,17 @@ WorkflowsSpecification1Element.refract = createRefractor([
1920
'WorkflowsSpecification',
2021
'$visitor',
2122
]);
23+
SourceDescriptionElement.refract = createRefractor([
24+
'visitors',
25+
'document',
26+
'objects',
27+
'SourceDescription',
28+
'$visitor',
29+
]);
2230

23-
export { WorkflowsSpecification1Element, WorkflowsSpecElement, InfoElement };
31+
export {
32+
WorkflowsSpecification1Element,
33+
WorkflowsSpecElement,
34+
InfoElement,
35+
SourceDescriptionElement,
36+
};

packages/apidom-ns-workflows-1/src/refractor/specification.ts

+12
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@ import WorkflowsSpecificationVisitor from './visitors/workflows-1/index';
22
import WorkflowsSpecVisitor from './visitors/workflows-1/WorkflowsSpecVisitor';
33
import InfoVisitor from './visitors/workflows-1/info';
44
import InfoVersionVisitor from './visitors/workflows-1/info/VersionVisitor';
5+
import SourceDescriptionVisitor from './visitors/workflows-1/source-description';
6+
import SourceDescriptionUrlVisitor from './visitors/workflows-1/source-description/UrlVisitor';
7+
import SourceDescriptionsVisitor from './visitors/workflows-1/SourceDescriptionsVisitor';
58
import FallbackVisitor from './visitors/FallbackVisitor';
69
import SpecificationExtensionVisitor from './visitors/SpecificationExtensionVisitor';
710

@@ -26,6 +29,7 @@ const specification = {
2629
info: {
2730
$ref: '#/visitors/document/objects/Info',
2831
},
32+
sourceDescriptions: SourceDescriptionsVisitor,
2933
},
3034
},
3135
Info: {
@@ -37,6 +41,14 @@ const specification = {
3741
version: InfoVersionVisitor,
3842
},
3943
},
44+
SourceDescription: {
45+
$visitor: SourceDescriptionVisitor,
46+
fixedFields: {
47+
name: { $ref: '#/visitors/value' },
48+
url: SourceDescriptionUrlVisitor,
49+
type: { $ref: '#/visitors/value' },
50+
},
51+
},
4052
},
4153
extension: {
4254
$visitor: SpecificationExtensionVisitor,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import stampit from 'stampit';
2+
import { ArrayElement, Element, BREAK } from '@swagger-api/apidom-core';
3+
4+
import SourceDescriptionsElement from '../../../elements/nces/SourceDescriptions';
5+
import SpecificationVisitor from '../SpecificationVisitor';
6+
import FallbackVisitor from '../FallbackVisitor';
7+
8+
const SourceDescriptionsVisitor = stampit(SpecificationVisitor, FallbackVisitor, {
9+
init() {
10+
this.element = new SourceDescriptionsElement();
11+
},
12+
methods: {
13+
ArrayElement(arrayElement: ArrayElement) {
14+
arrayElement.forEach((item: Element): void => {
15+
const specPath = ['document', 'objects', 'SourceDescription'];
16+
const element = this.toRefractedElement(specPath, item);
17+
18+
this.element.push(element);
19+
});
20+
21+
this.copyMetaAndAttributes(arrayElement, this.element);
22+
23+
return BREAK;
24+
},
25+
},
26+
});
27+
28+
export default SourceDescriptionsVisitor;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import stampit from 'stampit';
2+
import { StringElement, BREAK, cloneDeep } from '@swagger-api/apidom-core';
3+
4+
import FallbackVisitor from '../../FallbackVisitor';
5+
6+
const UrlVisitor = stampit(FallbackVisitor, {
7+
methods: {
8+
StringElement(stringElement: StringElement) {
9+
this.element = cloneDeep(stringElement);
10+
this.element.classes.push('source-description-url');
11+
12+
return BREAK;
13+
},
14+
},
15+
});
16+
17+
export default UrlVisitor;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import stampit from 'stampit';
2+
import { always } from 'ramda';
3+
4+
import SourceDescriptionElement from '../../../../elements/SourceDescription';
5+
import FallbackVisitor from '../../FallbackVisitor';
6+
import FixedFieldsVisitor from '../../generics/FixedFieldsVisitor';
7+
8+
const SourceDescriptionVisitor = stampit(FixedFieldsVisitor, FallbackVisitor, {
9+
props: {
10+
specPath: always(['document', 'objects', 'SourceDescription']),
11+
canSupportSpecificationExtensions: true,
12+
},
13+
init() {
14+
this.element = new SourceDescriptionElement();
15+
},
16+
});
17+
18+
export default SourceDescriptionVisitor;

packages/apidom-ns-workflows-1/src/traversal/visitor.ts

+1
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,6 @@ export const getNodeType = <T extends Element>(element: T): string | undefined =
1515
export const keyMap = {
1616
WorkflowsSpecification1Element: ['content'],
1717
InfoElement: ['content'],
18+
SourceDescriptionElement: ['content'],
1819
...keyMapBase,
1920
};

packages/apidom-ns-workflows-1/test/index.ts

-7
This file was deleted.

0 commit comments

Comments
 (0)