Skip to content

Commit fce4096

Browse files
feat(ns-workflows-1): add support for Workflow Object (#3492)
Refs #3392
1 parent c35931d commit fce4096

File tree

18 files changed

+447
-7
lines changed

18 files changed

+447
-7
lines changed

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ Only fully implemented specification objects should be checked here.
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)
190190
- [x] [Source Description Object](https://github.com/OAI/sig-workflows/blob/main/versions/1.0.0.md#source-description-object)
191-
- [ ] [Workflow Object](https://github.com/OAI/sig-workflows/blob/main/versions/1.0.0.md#workflow-object)
191+
- [x] [Workflow Object](https://github.com/OAI/sig-workflows/blob/main/versions/1.0.0.md#workflow-object)
192192
- [x] [Step Object](https://github.com/OAI/sig-workflows/blob/main/versions/1.0.0.md#step-object)
193193
- [x] [Parameter Object](https://github.com/OAI/sig-workflows/blob/main/versions/1.0.0.md#parameter-object)
194194
- [x] [Success Action Object](https://github.com/OAI/sig-workflows/blob/main/versions/1.0.0.md#success-action-object)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
import {
2+
ObjectElement,
3+
ArrayElement,
4+
StringElement,
5+
Attributes,
6+
Meta,
7+
} from '@swagger-api/apidom-core';
8+
9+
import JSONSchemaElement from './JSONSchema';
10+
11+
class Workflow extends ObjectElement {
12+
constructor(content?: Record<string, unknown>, meta?: Meta, attributes?: Attributes) {
13+
super(content, meta, attributes);
14+
this.element = 'workflow';
15+
}
16+
17+
get workflowId(): StringElement | undefined {
18+
return this.get('workflowId');
19+
}
20+
21+
set workflowId(workflowId: StringElement | undefined) {
22+
this.set('workflowId', workflowId);
23+
}
24+
25+
get summary(): StringElement | undefined {
26+
return this.get('summary');
27+
}
28+
29+
set summary(summary: StringElement | undefined) {
30+
this.set('summary', summary);
31+
}
32+
33+
get description(): StringElement | undefined {
34+
return this.get('description');
35+
}
36+
37+
set description(description: StringElement | undefined) {
38+
this.set('description', description);
39+
}
40+
41+
get inputs(): JSONSchemaElement | undefined {
42+
return this.get('inputs');
43+
}
44+
45+
set inputs(inputs: JSONSchemaElement | undefined) {
46+
this.set('inputs', inputs);
47+
}
48+
49+
get steps(): ArrayElement | undefined {
50+
return this.get('steps');
51+
}
52+
53+
set steps(steps: ArrayElement | undefined) {
54+
this.set('steps', steps);
55+
}
56+
57+
get outputs(): ObjectElement | undefined {
58+
return this.get('outputs');
59+
}
60+
61+
set outputs(outputs: ObjectElement | undefined) {
62+
this.set('outputs', outputs);
63+
}
64+
}
65+
66+
export default Workflow;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { ObjectElement, Attributes, Meta } from '@swagger-api/apidom-core';
2+
3+
class WorkflowOutputs extends ObjectElement {
4+
static primaryClass = 'workflow-outputs';
5+
6+
constructor(content?: Record<string, unknown>, meta?: Meta, attributes?: Attributes) {
7+
super(content, meta, attributes);
8+
this.classes.push(WorkflowOutputs.primaryClass);
9+
}
10+
}
11+
12+
export default WorkflowOutputs;
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 WorkflowSteps extends ArrayElement {
4+
static primaryClass = 'workflow-steps';
5+
6+
constructor(content?: Array<unknown>, meta?: Meta, attributes?: Attributes) {
7+
super(content, meta, attributes);
8+
this.classes.push(WorkflowSteps.primaryClass);
9+
}
10+
}
11+
12+
export default WorkflowSteps;

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

+6
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@ export {
2727
isInfoElement,
2828
isSourceDescriptionElement,
2929
isSourceDescriptionsElement,
30+
isWorkflowElement,
31+
isWorkflowStepsElement,
32+
isWorkflowOutputsElement,
3033
isStepElement,
3134
isStepParametersElement,
3235
isStepDependsOnElement,
@@ -62,6 +65,7 @@ export {
6265
WorkflowsSpecElement,
6366
InfoElement,
6467
SourceDescriptionElement,
68+
WorkflowElement,
6569
StepElement,
6670
ParameterElement,
6771
SuccessActionElement,
@@ -73,6 +77,8 @@ export {
7377
} from './refractor/registration';
7478
// NCE types
7579
export { default as SourceDescriptionsElement } from './elements/nces/SourceDescriptions';
80+
export { default as WorkflowStepsElement } from './elements/nces/WorkflowSteps';
81+
export { default as WorkflowOutputsElement } from './elements/nces/WorkflowOutputs';
7682
export { default as StepParametersElement } from './elements/nces/StepParameters';
7783
export { default as StepDependsOnElement } from './elements/nces/StepDependsOn';
7884
export { default as StepSuccessCriteriaElement } from './elements/nces/StepSuccessCriteria';

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

+2
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import WorkflowsSpecification1Element from './elements/WorkflowsSpecification1';
44
import WorkflowsSpecElement from './elements/WorkflowsSpec';
55
import InfoElement from './elements/Info';
66
import SourceDescriptionElement from './elements/SourceDescription';
7+
import WorkflowElement from './elements/Workflow';
78
import StepElement from './elements/Step';
89
import ParameterElement from './elements/Parameter';
910
import SuccessActionElement from './elements/SuccessAction';
@@ -21,6 +22,7 @@ const workflows1 = {
2122
base.register('workflowsSpec', WorkflowsSpecElement);
2223
base.register('info', InfoElement);
2324
base.register('sourceDescription', SourceDescriptionElement);
25+
base.register('workflow', WorkflowElement);
2426
base.register('step', StepElement);
2527
base.register('parameter', ParameterElement);
2628
base.register('successAction', SuccessActionElement);

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

+35
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import WorkflowsSpecification1Element from './elements/WorkflowsSpecification1';
44
import WorkflowsSpecElement from './elements/WorkflowsSpec';
55
import InfoElement from './elements/Info';
66
import SourceDescriptionElement from './elements/SourceDescription';
7+
import WorkflowElement from './elements/Workflow';
78
import StepElement from './elements/Step';
89
import ParameterElement from './elements/Parameter';
910
import SuccessActionElement from './elements/SuccessAction';
@@ -14,6 +15,8 @@ import ReferenceElement from './elements/Reference';
1415
import JSONSchemaElement from './elements/JSONSchema';
1516
// NCE types
1617
import SourceDescriptionsElement from './elements/nces/SourceDescriptions';
18+
import WorkflowStepsElement from './elements/nces/WorkflowSteps';
19+
import WorkflowOutputsElement from './elements/nces/WorkflowOutputs';
1720
import StepParametersElement from './elements/nces/StepParameters';
1821
import StepDependsOnElement from './elements/nces/StepDependsOn';
1922
import StepSuccessCriteriaElement from './elements/nces/StepSuccessCriteria';
@@ -77,6 +80,38 @@ export const isSourceDescriptionsElement = createPredicate(
7780
},
7881
);
7982

83+
export const isWorkflowStepsElement = createPredicate(
84+
({ hasBasicElementProps, isElementType, primitiveEq, hasClass }) => {
85+
return (element: unknown): element is WorkflowStepsElement =>
86+
element instanceof WorkflowStepsElement ||
87+
(hasBasicElementProps(element) &&
88+
isElementType('array', element) &&
89+
primitiveEq('array', element) &&
90+
hasClass('workflow-steps', element));
91+
},
92+
);
93+
94+
export const isWorkflowOutputsElement = createPredicate(
95+
({ hasBasicElementProps, isElementType, primitiveEq, hasClass }) => {
96+
return (element: unknown): element is WorkflowOutputsElement =>
97+
element instanceof WorkflowOutputsElement ||
98+
(hasBasicElementProps(element) &&
99+
isElementType('array', element) &&
100+
primitiveEq('array', element) &&
101+
hasClass('workflow-outputs', element));
102+
},
103+
);
104+
105+
export const isWorkflowElement = createPredicate(
106+
({ hasBasicElementProps, isElementType, primitiveEq }) => {
107+
return (element: unknown): element is WorkflowElement =>
108+
element instanceof WorkflowElement ||
109+
(hasBasicElementProps(element) &&
110+
isElementType('workflow', element) &&
111+
primitiveEq('object', element));
112+
},
113+
);
114+
80115
export const isStepOnSuccessElement = createPredicate(
81116
({ hasBasicElementProps, isElementType, primitiveEq, hasClass }) => {
82117
return (element: unknown): element is StepOnSuccessElement =>

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

+9
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import WorkflowsSpecification1Element from '../elements/WorkflowsSpecification1'
22
import WorkflowsSpecElement from '../elements/WorkflowsSpec';
33
import InfoElement from '../elements/Info';
44
import SourceDescriptionElement from '../elements/SourceDescription';
5+
import WorkflowElement from '../elements/Workflow';
56
import StepElement from '../elements/Step';
67
import ParameterElement from '../elements/Parameter';
78
import SuccessActionElement from '../elements/SuccessAction';
@@ -35,6 +36,13 @@ SourceDescriptionElement.refract = createRefractor([
3536
'SourceDescription',
3637
'$visitor',
3738
]);
39+
WorkflowElement.refract = createRefractor([
40+
'visitors',
41+
'document',
42+
'objects',
43+
'Workflow',
44+
'$visitor',
45+
]);
3846
StepElement.refract = createRefractor(['visitors', 'document', 'objects', 'Step', '$visitor']);
3947
ParameterElement.refract = createRefractor([
4048
'visitors',
@@ -91,6 +99,7 @@ export {
9199
WorkflowsSpecElement,
92100
InfoElement,
93101
SourceDescriptionElement,
102+
WorkflowElement,
94103
StepElement,
95104
ParameterElement,
96105
SuccessActionElement,

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

+14
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ import InfoVisitor from './visitors/workflows-1/info';
77
import InfoVersionVisitor from './visitors/workflows-1/info/VersionVisitor';
88
import SourceDescriptionVisitor from './visitors/workflows-1/source-description';
99
import SourceDescriptionUrlVisitor from './visitors/workflows-1/source-description/UrlVisitor';
10+
import WorkflowVisitor from './visitors/workflows-1/workflow';
11+
import WorkflowStepsVisitor from './visitors/workflows-1/workflow/StepsVisitor';
12+
import workflowOutputsVisitor from './visitors/workflows-1/workflow/OutputsVisitor';
1013
import StepVisitor from './visitors/workflows-1/step';
1114
import StepOutputsVisitor from './visitors/workflows-1/step/OutputsVisitor';
1215
import StepParametersVisitor from './visitors/workflows-1/step/ParametersVisitor';
@@ -77,6 +80,17 @@ const specification = {
7780
type: { $ref: '#/visitors/value' },
7881
},
7982
},
83+
Workflow: {
84+
$visitor: WorkflowVisitor,
85+
fixedFields: {
86+
workflowId: { $ref: '#/visitors/value' },
87+
summary: { $ref: '#/visitors/value' },
88+
description: { $ref: '#/visitors/value' },
89+
inputs: JSONSchemaVisitor,
90+
steps: WorkflowStepsVisitor,
91+
outputs: workflowOutputsVisitor,
92+
},
93+
},
8094
Step: {
8195
$visitor: StepVisitor,
8296
fixedFields: {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import stampit from 'stampit';
2+
import { always } from 'ramda';
3+
4+
import MapVisitor from '../../generics/MapVisitor';
5+
import FallbackVisitor from '../../FallbackVisitor';
6+
import WorkflowOutputsElement from '../../../../elements/nces/WorkflowOutputs';
7+
8+
const OutputsVisitor = stampit(MapVisitor, FallbackVisitor, {
9+
props: {
10+
specPath: always(['value']),
11+
},
12+
init() {
13+
this.element = new WorkflowOutputsElement();
14+
},
15+
});
16+
17+
export default OutputsVisitor;
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 WorkflowStepsElement from '../../../../elements/nces/WorkflowSteps';
5+
import SpecificationVisitor from '../../SpecificationVisitor';
6+
import FallbackVisitor from '../../FallbackVisitor';
7+
8+
const StepsVisitor = stampit(SpecificationVisitor, FallbackVisitor, {
9+
init() {
10+
this.element = new WorkflowStepsElement();
11+
},
12+
methods: {
13+
ArrayElement(arrayElement: ArrayElement) {
14+
arrayElement.forEach((item: Element): void => {
15+
const specPath = ['document', 'objects', 'Step'];
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 StepsVisitor;
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 WorkflowElement from '../../../../elements/Workflow';
5+
import FallbackVisitor from '../../FallbackVisitor';
6+
import FixedFieldsVisitor from '../../generics/FixedFieldsVisitor';
7+
8+
const WorkflowVisitor = stampit(FixedFieldsVisitor, FallbackVisitor, {
9+
props: {
10+
specPath: always(['document', 'objects', 'Workflow']),
11+
canSupportSpecificationExtensions: true,
12+
},
13+
init() {
14+
this.element = new WorkflowElement();
15+
},
16+
});
17+
18+
export default WorkflowVisitor;

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

+1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ export const keyMap = {
1616
WorkflowsSpecification1Element: ['content'],
1717
InfoElement: ['content'],
1818
SourceDescriptionElement: ['content'],
19+
WorkflowElement: ['content'],
1920
StepElement: ['content'],
2021
ParameterElement: ['content'],
2122
SuccessActionElement: ['content'],

0 commit comments

Comments
 (0)