json-spec-openapi 1.2.0.4 → 1.3.0.0
raw patch · 5 files changed
+58/−21 lines, 5 filesdep ~json-specPVP ok
version bump matches the API change (PVP)
Dependency ranges changed: json-spec
API changes (from Hackage documentation)
+ Data.JsonSpec.OpenApi: instance Data.JsonSpec.OpenApi.Refable defs spec => Data.JsonSpec.OpenApi.Inlineable defs ('Data.JsonSpec.Spec.JsonDict spec)
Files
- CHANGELOG.md +5/−0
- json-spec-openapi.cabal +2/−2
- src/Data/JsonSpec/OpenApi.hs +21/−10
- src/Data/JsonSpec/OpenApi/Rename.hs +4/−2
- test/test.hs +26/−7
CHANGELOG.md view
@@ -2,6 +2,11 @@ All notable changes to this project will be documented in this file. +## 1.3.0.0++- Support `JsonDict` from `json-spec` 1.4, generating OpenAPI object schemas+ with typed `additionalProperties`.+ ## 1.2.0.4 - Relaxed the upper bound on `time` to allow `time-1.15`.
json-spec-openapi.cabal view
@@ -1,6 +1,6 @@ cabal-version: 3.0 name: json-spec-openapi-version: 1.2.0.4+version: 1.3.0.0 synopsis: json-spec-openapi description: This package provides a way to produce@@ -64,7 +64,7 @@ build-depends: , aeson >= 2.2.1.0 && < 2.3 , base >= 4.19.2.0 && < 4.23- , json-spec >= 1.3.0.0 && < 1.4+ , json-spec >= 1.4.0.0 && < 1.5 , lens >= 5.2.3 && < 5.4 , openapi3 >= 3.2.5 && < 3.3 , text >= 2.1 && < 2.2
src/Data/JsonSpec/OpenApi.hs view
@@ -131,7 +131,6 @@ SchemaModifier(..), ) where - import Control.Lens (At(at), (&), over, set) import Data.Aeson (ToJSON(toJSON)) import Data.Functor.Identity (Identity(runIdentity))@@ -139,16 +138,17 @@ ( FieldSpec(Optional, Required), HasJsonDecodingSpec(DecodingSpec) , HasJsonEncodingSpec(EncodingSpec) , Specification- ( JsonAnnotated, JsonArray, JsonBool, JsonDateTime, JsonEither, JsonInt- , JsonLet, JsonNullable, JsonNum, JsonObject, JsonRaw, JsonRef, JsonString- , JsonTag+ ( JsonAnnotated, JsonArray, JsonBool, JsonDateTime, JsonDict, JsonEither+ , JsonInt, JsonLet, JsonNullable, JsonNum, JsonObject, JsonRaw, JsonRef+ , JsonString, JsonTag ) ) import Data.JsonSpec.OpenApi.Rename (Rename)+import Data.Kind (Type) import Data.OpenApi- ( AdditionalProperties(AdditionalPropertiesAllowed)- , HasAdditionalProperties(additionalProperties)- , HasEnum(enum_), HasFormat(format), HasItems(items), HasOneOf(oneOf)+ ( AdditionalProperties(AdditionalPropertiesAllowed, AdditionalPropertiesSchema)+ , HasAdditionalProperties(additionalProperties), HasEnum(enum_)+ , HasFormat(format), HasItems(items), HasOneOf(oneOf) , HasProperties(properties), HasRequired(required), HasType(type_) , NamedSchema(NamedSchema), OpenApiItems(OpenApiItemsObject) , OpenApiType@@ -161,19 +161,17 @@ import Data.OpenApi.Declare (DeclareT(runDeclareT), MonadDeclare(declare)) import Data.String (IsString(fromString)) import Data.Text (Text)-import Data.Kind (Type) import Data.Typeable (Proxy(Proxy), Typeable) import GHC.TypeError (ErrorMessage((:$$:), (:<>:)), Unsatisfiable, unsatisfiable) import GHC.TypeLits (KnownSymbol, Symbol, symbolVal) import Prelude- ( Applicative(pure, (<*>)), Bool(False), Functor(fmap), Maybe(Just, Nothing)+ ( Applicative((<*>), pure), Bool(False), Functor(fmap), Maybe(Just, Nothing) , Monoid(mempty), ($), (.), (<$>), id ) import qualified Data.HashMap.Strict.InsOrd.Compat as HMI import qualified Data.OpenApi as OA import qualified GHC.TypeError as TE - {-| Convert a 'Specification' into an OpenApi 'Schema'. The type class 'Schemaable' is an internal and opaque implementation detail and not@@ -341,6 +339,19 @@ mempty & set type_ (Just OpenApiArray) & set items (Just (OpenApiItemsObject elementSchema))+instance {- Inlineable defs (JsonDict spec) -}+ (Refable defs spec)+ =>+ Inlineable defs (JsonDict spec)+ where+ inlineable = do+ valueSchema <- refable @defs @spec+ pure $+ mempty+ & set type_ (Just OpenApiObject)+ & set+ additionalProperties+ (Just (AdditionalPropertiesSchema valueSchema)) instance Inlineable defs JsonBool where inlineable = pure $
src/Data/JsonSpec/OpenApi/Rename.hs view
@@ -11,7 +11,7 @@ import Data.JsonSpec ( FieldSpec(Optional, Required) , Specification- ( JsonArray, JsonBool, JsonDateTime, JsonEither, JsonInt, JsonLet+ ( JsonArray, JsonBool, JsonDateTime, JsonDict, JsonEither, JsonInt, JsonLet , JsonNullable, JsonNum, JsonObject, JsonRaw, JsonRef, JsonString, JsonTag ) )@@ -19,7 +19,6 @@ import GHC.TypeLits (type (+), AppendSymbol, Nat, Symbol) import qualified GHC.TypeError as TE - {-| Resolve OpenApi name conflicts. @@ -116,6 +115,9 @@ FoldRename global active (JsonArray spec) = MapSpec JsonArray (FoldRename global active spec)++ FoldRename global active (JsonDict spec) =+ MapSpec JsonDict (FoldRename global active spec) FoldRename global active (JsonObject fields) = RenameObject global active fields
test/test.hs view
@@ -21,29 +21,28 @@ , HasJsonDecodingSpec(DecodingSpec, fromJSONStructure) , HasJsonEncodingSpec(EncodingSpec, toJSONStructure), SpecJSON(SpecJSON) , Specification- ( JsonAnnotated, JsonArray, JsonBool, JsonDateTime, JsonEither, JsonInt- , JsonLet, JsonNullable, JsonNum, JsonObject, JsonRaw, JsonRef, JsonString- , JsonTag+ ( JsonAnnotated, JsonArray, JsonBool, JsonDateTime, JsonDict, JsonEither+ , JsonInt, JsonLet, JsonNullable, JsonNum, JsonObject, JsonRaw, JsonRef+ , JsonString, JsonTag ) , (:::), (::?), unField ) import Data.JsonSpec.OpenApi- ( EncodingSchema, Rename, SchemaModifier(modifySchema), toOpenApiSchema+ ( SchemaModifier(modifySchema), EncodingSchema, Rename, toOpenApiSchema ) import Data.OpenApi (Definitions, ToSchema) import Data.Proxy (Proxy(Proxy)) import Data.Text (Text) import Data.Time (UTCTime) import Prelude- ( Applicative(pure), Bool(False), Eq, Functor(fmap), Int, IO, Maybe(Just)- , Monoid(mempty), Show, ($), (.)+ ( Applicative(pure), Bool(False), Functor(fmap), Maybe(Just), Monoid(mempty)+ , ($), (.), Eq, IO, Int, Show ) import Test.Hspec (describe, hspec, it, shouldBe) import qualified Data.Aeson as Aeson import qualified Data.HashMap.Strict.InsOrd.Compat as HMI import qualified Data.OpenApi as OA - main :: IO () main = hspec $ do@@ -210,6 +209,26 @@ )) ) + in+ actual `shouldBe` expected++ it "dict" $+ let+ actual :: (Definitions OA.Schema, OA.Schema)+ actual =+ toOpenApiSchema (Proxy @(JsonDict JsonInt))++ expected :: (Definitions OA.Schema, OA.Schema)+ expected =+ ( mempty+ , mempty+ & set OA.type_ (Just OA.OpenApiObject)+ & set+ OA.additionalProperties+ (Just (+ OA.AdditionalPropertiesSchema (OA.Inline intSchema)+ ))+ ) in actual `shouldBe` expected