From e2f34ed23f357b49d9c034816aaed95a02179c7b Mon Sep 17 00:00:00 2001 From: Janus Troelsen Date: Fri, 19 Apr 2024 09:45:07 -0600 Subject: [PATCH] Document additionalProperties bug, fix parens on mapOf Co-authored-by: Owen --- .../src/Fleece/CodeGenUtil/HaskellCode.hs | 4 ++-- ...JustAdditionalPropertiesNullableBoolean.hs | 19 +++++++++++++++++++ ...AdditionalPropertiesNullableBooleanItem.hs | 16 ++++++++++++++++ ...tAdditionalPropertiesNullableBooleanRef.hs | 19 +++++++++++++++++++ .../TestCases/Types/NullableBoolean.hs | 16 ++++++++++++++++ .../examples/test-cases/test-cases.cabal | 4 ++++ .../examples/test-cases/test-cases.yaml | 18 ++++++++++++++++++ .../json-fleece-openapi3.cabal | 4 ++++ 8 files changed, 98 insertions(+), 2 deletions(-) create mode 100644 json-fleece-openapi3/examples/test-cases/TestCases/Types/JustAdditionalPropertiesNullableBoolean.hs create mode 100644 json-fleece-openapi3/examples/test-cases/TestCases/Types/JustAdditionalPropertiesNullableBooleanItem.hs create mode 100644 json-fleece-openapi3/examples/test-cases/TestCases/Types/JustAdditionalPropertiesNullableBooleanRef.hs create mode 100644 json-fleece-openapi3/examples/test-cases/TestCases/Types/NullableBoolean.hs diff --git a/json-fleece-codegen-util/src/Fleece/CodeGenUtil/HaskellCode.hs b/json-fleece-codegen-util/src/Fleece/CodeGenUtil/HaskellCode.hs index 7087ae9..f91a250 100644 --- a/json-fleece-codegen-util/src/Fleece/CodeGenUtil/HaskellCode.hs +++ b/json-fleece-codegen-util/src/Fleece/CodeGenUtil/HaskellCode.hs @@ -440,9 +440,9 @@ mapOf keyName itemName = "(" <> typeNameToCodeDefaultQualification mapType <> " " - <> keyName + <> guardParens keyName <> " " - <> itemName + <> guardParens itemName <> ")" union :: TypeExpression diff --git a/json-fleece-openapi3/examples/test-cases/TestCases/Types/JustAdditionalPropertiesNullableBoolean.hs b/json-fleece-openapi3/examples/test-cases/TestCases/Types/JustAdditionalPropertiesNullableBoolean.hs new file mode 100644 index 0000000..ff7fd05 --- /dev/null +++ b/json-fleece-openapi3/examples/test-cases/TestCases/Types/JustAdditionalPropertiesNullableBoolean.hs @@ -0,0 +1,19 @@ +{-# LANGUAGE NoImplicitPrelude #-} + +module TestCases.Types.JustAdditionalPropertiesNullableBoolean + ( JustAdditionalPropertiesNullableBoolean(..) + , justAdditionalPropertiesNullableBooleanSchema + ) where + +import qualified Data.Map as Map +import qualified Data.Text as T +import qualified Fleece.Core as FC +import Prelude (Eq, Show) +import qualified TestCases.Types.JustAdditionalPropertiesNullableBooleanItem as JustAdditionalPropertiesNullableBooleanItem + +newtype JustAdditionalPropertiesNullableBoolean = JustAdditionalPropertiesNullableBoolean (Map.Map T.Text JustAdditionalPropertiesNullableBooleanItem.JustAdditionalPropertiesNullableBooleanItem) + deriving (Show, Eq) + +justAdditionalPropertiesNullableBooleanSchema :: FC.Fleece schema => schema JustAdditionalPropertiesNullableBoolean +justAdditionalPropertiesNullableBooleanSchema = + FC.coerceSchema (FC.map JustAdditionalPropertiesNullableBooleanItem.justAdditionalPropertiesNullableBooleanItemSchema) \ No newline at end of file diff --git a/json-fleece-openapi3/examples/test-cases/TestCases/Types/JustAdditionalPropertiesNullableBooleanItem.hs b/json-fleece-openapi3/examples/test-cases/TestCases/Types/JustAdditionalPropertiesNullableBooleanItem.hs new file mode 100644 index 0000000..410af37 --- /dev/null +++ b/json-fleece-openapi3/examples/test-cases/TestCases/Types/JustAdditionalPropertiesNullableBooleanItem.hs @@ -0,0 +1,16 @@ +{-# LANGUAGE NoImplicitPrelude #-} + +module TestCases.Types.JustAdditionalPropertiesNullableBooleanItem + ( JustAdditionalPropertiesNullableBooleanItem(..) + , justAdditionalPropertiesNullableBooleanItemSchema + ) where + +import qualified Fleece.Core as FC +import Prelude (Bool, Eq, Show) + +newtype JustAdditionalPropertiesNullableBooleanItem = JustAdditionalPropertiesNullableBooleanItem Bool + deriving (Show, Eq) + +justAdditionalPropertiesNullableBooleanItemSchema :: FC.Fleece schema => schema JustAdditionalPropertiesNullableBooleanItem +justAdditionalPropertiesNullableBooleanItemSchema = + FC.coerceSchema FC.boolean \ No newline at end of file diff --git a/json-fleece-openapi3/examples/test-cases/TestCases/Types/JustAdditionalPropertiesNullableBooleanRef.hs b/json-fleece-openapi3/examples/test-cases/TestCases/Types/JustAdditionalPropertiesNullableBooleanRef.hs new file mode 100644 index 0000000..9d131ff --- /dev/null +++ b/json-fleece-openapi3/examples/test-cases/TestCases/Types/JustAdditionalPropertiesNullableBooleanRef.hs @@ -0,0 +1,19 @@ +{-# LANGUAGE NoImplicitPrelude #-} + +module TestCases.Types.JustAdditionalPropertiesNullableBooleanRef + ( JustAdditionalPropertiesNullableBooleanRef(..) + , justAdditionalPropertiesNullableBooleanRefSchema + ) where + +import qualified Data.Map as Map +import qualified Data.Text as T +import qualified Fleece.Core as FC +import Prelude (Either, Eq, Show) +import qualified TestCases.Types.NullableBoolean as NullableBoolean + +newtype JustAdditionalPropertiesNullableBooleanRef = JustAdditionalPropertiesNullableBooleanRef (Map.Map T.Text (Either FC.Null NullableBoolean.NullableBoolean)) + deriving (Show, Eq) + +justAdditionalPropertiesNullableBooleanRefSchema :: FC.Fleece schema => schema JustAdditionalPropertiesNullableBooleanRef +justAdditionalPropertiesNullableBooleanRefSchema = + FC.coerceSchema (FC.map (FC.nullable NullableBoolean.nullableBooleanSchema)) \ No newline at end of file diff --git a/json-fleece-openapi3/examples/test-cases/TestCases/Types/NullableBoolean.hs b/json-fleece-openapi3/examples/test-cases/TestCases/Types/NullableBoolean.hs new file mode 100644 index 0000000..deaea3c --- /dev/null +++ b/json-fleece-openapi3/examples/test-cases/TestCases/Types/NullableBoolean.hs @@ -0,0 +1,16 @@ +{-# LANGUAGE NoImplicitPrelude #-} + +module TestCases.Types.NullableBoolean + ( NullableBoolean(..) + , nullableBooleanSchema + ) where + +import qualified Fleece.Core as FC +import Prelude (Bool, Eq, Show) + +newtype NullableBoolean = NullableBoolean Bool + deriving (Show, Eq) + +nullableBooleanSchema :: FC.Fleece schema => schema NullableBoolean +nullableBooleanSchema = + FC.coerceSchema FC.boolean \ No newline at end of file diff --git a/json-fleece-openapi3/examples/test-cases/test-cases.cabal b/json-fleece-openapi3/examples/test-cases/test-cases.cabal index 35c2808..c788356 100644 --- a/json-fleece-openapi3/examples/test-cases/test-cases.cabal +++ b/json-fleece-openapi3/examples/test-cases/test-cases.cabal @@ -104,6 +104,9 @@ library TestCases.Types.FieldTestCases.OptionalNullableField TestCases.Types.FieldTestCases.RequiredField TestCases.Types.FieldTestCases.RequiredNullableField + TestCases.Types.JustAdditionalPropertiesNullableBoolean + TestCases.Types.JustAdditionalPropertiesNullableBooleanItem + TestCases.Types.JustAdditionalPropertiesNullableBooleanRef TestCases.Types.JustAdditionalPropertiesSchemaInline TestCases.Types.JustAdditionalPropertiesSchemaInlineItem TestCases.Types.JustAdditionalPropertiesSchemaRef @@ -150,6 +153,7 @@ library TestCases.Types.NameConflicts.Then TestCases.Types.NameConflicts.Type TestCases.Types.NameConflicts.Where + TestCases.Types.NullableBoolean TestCases.Types.Num2SchemaStartingWithNumber TestCases.Types.OneOfWithNullable TestCases.Types.ReferenceOneOf diff --git a/json-fleece-openapi3/examples/test-cases/test-cases.yaml b/json-fleece-openapi3/examples/test-cases/test-cases.yaml index c2d9634..11e7888 100644 --- a/json-fleece-openapi3/examples/test-cases/test-cases.yaml +++ b/json-fleece-openapi3/examples/test-cases/test-cases.yaml @@ -716,6 +716,24 @@ components: description: An object with just additionalProperties = true additionalProperties: true + # This test is broken, since the nullability is not considered + JustAdditionalPropertiesNullableBoolean: + type: object + description: An object with a nullable boolean + additionalProperties: + type: boolean + nullable: true + + JustAdditionalPropertiesNullableBooleanRef: + type: object + description: An object with a ref to a nullable boolean + additionalProperties: + $ref: '#/components/schemas/NullableBoolean' + + NullableBoolean: + nullable: true + type: boolean + JustAdditionalPropertiesSchemaRef: type: object description: An object with just additionalProperties as a schema ref diff --git a/json-fleece-openapi3/json-fleece-openapi3.cabal b/json-fleece-openapi3/json-fleece-openapi3.cabal index 16bae5f..eadb08e 100644 --- a/json-fleece-openapi3/json-fleece-openapi3.cabal +++ b/json-fleece-openapi3/json-fleece-openapi3.cabal @@ -1951,6 +1951,9 @@ extra-source-files: examples/test-cases/TestCases/Types/FieldTestCases/OptionalNullableField.hs examples/test-cases/TestCases/Types/FieldTestCases/RequiredField.hs examples/test-cases/TestCases/Types/FieldTestCases/RequiredNullableField.hs + examples/test-cases/TestCases/Types/JustAdditionalPropertiesNullableBoolean.hs + examples/test-cases/TestCases/Types/JustAdditionalPropertiesNullableBooleanItem.hs + examples/test-cases/TestCases/Types/JustAdditionalPropertiesNullableBooleanRef.hs examples/test-cases/TestCases/Types/JustAdditionalPropertiesSchemaInline.hs examples/test-cases/TestCases/Types/JustAdditionalPropertiesSchemaInlineItem.hs examples/test-cases/TestCases/Types/JustAdditionalPropertiesSchemaRef.hs @@ -1997,6 +2000,7 @@ extra-source-files: examples/test-cases/TestCases/Types/NameConflicts/Then.hs examples/test-cases/TestCases/Types/NameConflicts/Type.hs examples/test-cases/TestCases/Types/NameConflicts/Where.hs + examples/test-cases/TestCases/Types/NullableBoolean.hs examples/test-cases/TestCases/Types/Num2SchemaStartingWithNumber.hs examples/test-cases/TestCases/Types/OneOfWithNullable.hs examples/test-cases/TestCases/Types/ReferenceOneOf.hs