From 3e901336643b988ae45ae86c485005b8865e6e04 Mon Sep 17 00:00:00 2001 From: Dimitar Nanov Date: Sun, 8 Dec 2019 11:54:07 +0200 Subject: [PATCH] feat: display `multipleOf` constrains (#1065) --- demo/openapi.yaml | 1 + src/utils/__tests__/openapi.test.ts | 21 ++++++++++++++++++--- src/utils/openapi.ts | 16 ++++++++++++++++ 3 files changed, 35 insertions(+), 3 deletions(-) diff --git a/demo/openapi.yaml b/demo/openapi.yaml index d10fdf73..c34740ee 100644 --- a/demo/openapi.yaml +++ b/demo/openapi.yaml @@ -738,6 +738,7 @@ components: type: number description: Average amount of honey produced per day in ounces example: 3.14 + multipleOf: .01 required: - honeyPerDay Id: diff --git a/src/utils/__tests__/openapi.test.ts b/src/utils/__tests__/openapi.test.ts index 244ab63c..bcdfb193 100644 --- a/src/utils/__tests__/openapi.test.ts +++ b/src/utils/__tests__/openapi.test.ts @@ -333,7 +333,8 @@ describe('Utils', () => { const itemConstraintSchema = ( min: number | undefined = undefined, max: number | undefined = undefined, - ) => ({ type: 'array', minItems: min, maxItems: max }); + multipleOf: number | undefined = undefined, + ) => ({ type: 'array', minItems: min, maxItems: max, multipleOf }); it('should not have a humanized constraint without schema constraints', () => { expect(humanizeConstraints(itemConstraintSchema())).toHaveLength(0); @@ -355,9 +356,21 @@ describe('Utils', () => { expect(humanizeConstraints(itemConstraintSchema(7, 7))).toContain('7 items'); }); - it('should have a humazined constraint when justMinItems is set, and it is equal to 1', () => { + it('should have a humanized constraint when justMinItems is set, and it is equal to 1', () => { expect(humanizeConstraints(itemConstraintSchema(1))).toContain('non-empty'); }); + + it('should have a humanized constraint when multipleOf is set, and it is in format of /^0\\.0*1$/', () => { + expect(humanizeConstraints(itemConstraintSchema(undefined, undefined, 0.01))).toContain( + 'decimal places <= 2', + ); + }); + + it('should have a humanized constraint when multipleOf is set, and it is in format other than /^0\\.0*1$/', () => { + expect(humanizeConstraints(itemConstraintSchema(undefined, undefined, 0.5))).toContain( + 'multiple of 0.5', + ); + }); }); describe('OpenAPI pluralizeType', () => { @@ -387,7 +400,9 @@ describe('Utils', () => { expect(pluralizeType('objects (Pet)')).toEqual('objects (Pet)'); expect(pluralizeType('strings ')).toEqual('strings '); expect(pluralizeType('objects or strings')).toEqual('objects or strings'); - expect(pluralizeType('objects (Pet) or numbers ')).toEqual('objects (Pet) or numbers '); + expect(pluralizeType('objects (Pet) or numbers ')).toEqual( + 'objects (Pet) or numbers ', + ); }); }); diff --git a/src/utils/openapi.ts b/src/utils/openapi.ts index 2836cfed..e9657547 100644 --- a/src/utils/openapi.ts +++ b/src/utils/openapi.ts @@ -368,6 +368,17 @@ export function isNamedDefinition(pointer?: string): boolean { return /^#\/components\/schemas\/[^\/]+$/.test(pointer || ''); } +function humanizeMultipleOfConstraint(multipleOf: number | undefined): string | undefined { + if (multipleOf === undefined) { + return; + } + const strigifiedMultipleOf = multipleOf.toString(10); + if (!/^0\.0*1$/.test(strigifiedMultipleOf)) { + return `multiple of ${strigifiedMultipleOf}`; + } + return `decimal places <= ${strigifiedMultipleOf.split('.')[1].length}`; +} + function humanizeRangeConstraint( description: string, min: number | undefined, @@ -406,6 +417,11 @@ export function humanizeConstraints(schema: OpenAPISchema): string[] { res.push(arrayRange); } + const multipleOfConstraint = humanizeMultipleOfConstraint(schema.multipleOf); + if (multipleOfConstraint !== undefined) { + res.push(multipleOfConstraint); + } + let numberRange; if (schema.minimum !== undefined && schema.maximum !== undefined) { numberRange = schema.exclusiveMinimum ? '( ' : '[ ';