naive oneOf

displayed similar to tuple
sample only the first option
This commit is contained in:
eitanya 2017-03-14 09:12:09 +02:00
parent f7c6b8e980
commit f1ac3c918d
6 changed files with 50 additions and 2 deletions

1
.gitignore vendored
View File

@ -37,3 +37,4 @@ compiled
/coverage
.ghpages-tmp
stats.json
/nbproject

View File

@ -41,6 +41,19 @@
</template>
</div>
</template>
<template ngSwitchCase="oneOf">
<div class="params-wrap params-oneOf array-tuple">
<template ngFor [ngForOf]="schema.oneOf" let-item="$implicit" let-idx="index" [ngForTrackBy]="trackByIdx">
<div class="tuple-item">
<span class="tuple-item-index"> [{{idx}}]: </span>
<json-schema class="nested-schema" [pointer]="item._pointer"
[absolutePointer]="item._pointer"
[nestOdd]="!nestOdd" [isRequestSchema]="isRequestSchema">
</json-schema>
</div>
</template>
</div>
</template>
<template ngSwitchCase="array">
<json-schema class="nested-schema" [pointer]="schema._pointer"
[nestOdd]="!nestOdd" [isRequestSchema]="isRequestSchema"> </json-schema>

View File

@ -127,6 +127,12 @@ table {
font-family: monospace;
}
.params-wrap.params-oneOf:before {
content: "oneOf [";
padding-top: 1em;
font-family: monospace;
}
.params-wrap.params-array:before {
content: "Array [";
padding-top: 1em;

View File

@ -65,7 +65,12 @@ export class SchemaSample extends BaseComponent implements OnInit {
return;
}
try {
sample = OpenAPISampler.sample(this.componentSchema, {
let schemaForSampler = this.componentSchema;
if (this.componentSchema.oneOf) {
schemaForSampler = this.componentSchema.oneOf[0];
}
sample = OpenAPISampler.sample(schemaForSampler, {
skipReadOnly: this.skipReadOnly
});
} catch(e) {

View File

@ -94,6 +94,20 @@ const injectors = {
injectTo._widgetType = 'object';
}
},
oneOf: {
check: (propertySchema) => propertySchema.oneOf,
inject: (injectTo, propertySchema = injectTo, propPointer) => {
injectTo._isTuple = true;
injectTo._displayType = '';
let itemsPtr = JsonPointer.join(propertySchema._pointer || propPointer, ['oneOf']);
for (let i=0; i < propertySchema.oneOf.length; i++) {
let itemSchema = propertySchema.oneOf[i];
itemSchema._pointer = itemSchema._pointer || JsonPointer.join(itemsPtr, [i.toString()]);
}
injectTo._widgetType = 'oneOf';
}
},
noType: {
check: (propertySchema) => !propertySchema.type,
inject: (injectTo) => {
@ -110,7 +124,7 @@ const injectors = {
return (!propertySchema.properties || !Object.keys(propertySchema.properties).length)
&& (typeof propertySchema.additionalProperties !== 'object');
}
return (propertySchema.type !== 'array') && propertySchema.type;
return (propertySchema.type !== 'array') && (propertySchema.type !== 'oneOf') && propertySchema.type;
},
inject: (injectTo, propertySchema = injectTo) => {
injectTo.isTrivial = true;

View File

@ -13,6 +13,7 @@ interface Reference {
interface Schema {
properties: any;
allOf: any;
oneOf: any;
items: any;
additionalProperties: any;
}
@ -36,6 +37,9 @@ export class SchemaNormalizer {
resolved = Object.assign({}, resolved);
AllOfMerger.merge(resolved, resolved.allOf);
}
if (resolved.oneOf) {
resolved.type = 'oneOf';
}
return resolved;
});
if (opts.resolved && !hasPtr) this._dereferencer.exit(ptr);
@ -74,6 +78,11 @@ class SchemaWalker {
SchemaWalker.walkEach(obj.allOf, ptr, visitor);
}
if (obj.oneOf) {
let ptr = JsonPointer.join(pointer, ['oneOf']);
SchemaWalker.walkEach(obj.oneOf, ptr, visitor);
}
if (obj.items) {
let ptr = JsonPointer.join(pointer, ['items']);
if (Array.isArray(obj.items)) {