json-spec-openapi 0.1.0.0 → 0.1.0.1
raw patch · 3 files changed
+92/−15 lines, 3 filesPVP: minor bump suggested
API additions: PVP suggests at least a minor version bump
API changes (from Hackage documentation)
+ Data.JsonSpec.OpenApi: instance (Data.JsonSpec.OpenApi.Internal left, Data.JsonSpec.OpenApi.Internal right) => Data.JsonSpec.OpenApi.Internal ('Data.JsonSpec.Spec.JsonEither left right)
+ Data.JsonSpec.OpenApi: instance GHC.TypeLits.KnownSymbol tag => Data.JsonSpec.OpenApi.Internal ('Data.JsonSpec.Spec.JsonTag tag)
Files
- json-spec-openapi.cabal +4/−3
- src/Data/JsonSpec/OpenApi.hs +25/−9
- test/test.hs +63/−3
json-spec-openapi.cabal view
@@ -1,11 +1,11 @@ cabal-version: 3.0 name: json-spec-openapi-version: 0.1.0.0+version: 0.1.0.1 synopsis: json-spec-openapi description: This package provides a way to produce- [`openapi3`](https://hackage.haskell.org/package/openapi3) documentation from a- [`json-spec`](https://hackage.haskell.org/package/json-spec-0.1.0.0)+ [openapi3](https://hackage.haskell.org/package/openapi3) documentation from a+ [json-spec](https://hackage.haskell.org/package/json-spec-0.1.0.0) specification. = Example@@ -62,6 +62,7 @@ common dependencies build-depends:+ , aeson >= 2.1.2.1 && < 2.2 , base >= 4.17 && < 4.18 , json-spec >= 0.1.0.0 && < 0.2 , lens >= 5.2.2 && < 5.3
src/Data/JsonSpec/OpenApi.hs view
@@ -98,21 +98,25 @@ import Control.Lens (At(at), (&), over, set)+import Data.Aeson (ToJSON(toJSON)) import Data.JsonSpec (HasJsonDecodingSpec(DecodingSpec), HasJsonEncodingSpec(EncodingSpec), Specification(JsonArray, JsonBool,- JsonDateTime, JsonInt, JsonNum, JsonObject, JsonString))+ JsonDateTime, JsonEither, JsonInt, JsonNum, JsonObject, JsonString,+ JsonTag)) import Data.OpenApi (AdditionalProperties(AdditionalPropertiesAllowed),- HasAdditionalProperties(additionalProperties),- HasFormat(format), HasItems(items), HasProperties(properties),- HasRequired(required), HasType(type_), NamedSchema(NamedSchema),- OpenApiItems(OpenApiItemsObject), OpenApiType(OpenApiArray,- OpenApiBoolean, OpenApiInteger, OpenApiNumber, OpenApiObject,- OpenApiString), Referenced(Inline), ToSchema(declareNamedSchema),- Schema)+ HasAdditionalProperties(additionalProperties), HasEnum(enum_),+ HasFormat(format), HasItems(items), HasOneOf(oneOf),+ HasProperties(properties), HasRequired(required), HasType(type_),+ NamedSchema(NamedSchema), OpenApiItems(OpenApiItemsObject),+ OpenApiType(OpenApiArray, OpenApiBoolean, OpenApiInteger,+ OpenApiNumber, OpenApiObject, OpenApiString), Referenced(Inline),+ ToSchema(declareNamedSchema), Schema) import Data.String (IsString(fromString)) import Data.Text (Text) import Data.Typeable (Proxy(Proxy), Typeable) import GHC.TypeLits (KnownSymbol, symbolVal)+import Prelude (Applicative(pure), Bool(False), Maybe(Just, Nothing),+ Monoid(mempty), ($)) {-|@@ -146,9 +150,21 @@ -} internal :: Proxy spec -> Schema+instance (KnownSymbol tag) => Internal ('JsonTag tag) where+ internal _ =+ mempty & set enum_ (Just [toJSON (sym @tag :: Text)])+ instance Internal 'JsonString where internal _ = mempty & set type_ (Just OpenApiString)+instance (Internal left, Internal right) => Internal ('JsonEither left right) where+ internal _ =+ mempty+ & set oneOf (Just+ [ Inline (internal (Proxy @left))+ , Inline (internal (Proxy @right))+ ]+ ) instance Internal 'JsonNum where internal _ = mempty & set type_ (Just OpenApiNumber)@@ -213,7 +229,7 @@ {-| Helper for defining `ToSchema` instances based on `HasJsonDecodingSpec` using @deriving via@.- + Example: > data MyType = ...
test/test.hs view
@@ -11,16 +11,18 @@ module Main (main) where import Control.Lens (At(at), (&), set)-import Data.Aeson (FromJSON, ToJSON, encode)+import Data.Aeson (FromJSON, ToJSON, encode, toJSON) import Data.JsonSpec (Field(Field), HasJsonDecodingSpec(DecodingSpec, fromJSONStructure), HasJsonEncodingSpec(EncodingSpec, toJSONStructure), SpecJSON(SpecJSON), Specification(JsonArray, JsonBool, JsonDateTime,- JsonNum, JsonObject, JsonString))+ JsonEither, JsonNum, JsonObject, JsonString, JsonTag)) import Data.JsonSpec.OpenApi (EncodingSchema, toOpenApiSchema) import Data.OpenApi (ToSchema) import Data.Proxy (Proxy(Proxy)) import Data.Text (Text) import Data.Time (UTCTime)+import Prelude (Applicative(pure), Bool(False), Maybe(Just),+ Monoid(mempty), ($), Eq, IO, Show) import Test.Hspec (describe, hspec, it, shouldBe) import qualified Data.OpenApi as OA @@ -40,6 +42,64 @@ in actual `shouldBe` expected + it "sum" $+ let+ actual :: OA.Schema+ actual =+ toOpenApiSchema (Proxy @(+ JsonEither+ (+ JsonObject+ '[ '("tag", JsonTag "a")+ , '("content", JsonString)+ ]+ )+ (+ JsonObject+ '[ '("tag", JsonTag "b")+ , '("content", JsonString)+ ]+ )+ ))++ expected :: OA.Schema+ expected =+ mempty+ & set OA.oneOf (Just+ [ OA.Inline $+ mempty+ & set OA.type_ (Just OA.OpenApiObject)+ & set OA.properties (+ mempty+ & set (at "tag") (Just (OA.Inline (+ mempty & set OA.enum_ (Just [toJSON ("a" :: Text)])+ )))+ & set (at "content") (Just (OA.Inline stringSchema))+ )+ & set OA.required ["tag", "content"]+ & set+ OA.additionalProperties+ (Just (OA.AdditionalPropertiesAllowed False))+ , OA.Inline $+ mempty+ & set OA.type_ (Just OA.OpenApiObject)+ & set OA.properties (+ mempty+ & set (at "tag") (Just (OA.Inline (+ mempty & set OA.enum_ (Just [toJSON ("b" :: Text)])+ )))+ & set (at "content") (Just (OA.Inline stringSchema))+ )+ & set OA.required ["tag", "content"]+ & set+ OA.additionalProperties+ (Just (OA.AdditionalPropertiesAllowed False))+ ]+ )+ in+ actual `shouldBe` expected++ it "object" $ let actual :: OA.Schema@@ -129,7 +189,7 @@ it "date-time" $ let actual :: OA.Schema- actual = + actual = toOpenApiSchema (Proxy @JsonDateTime) expected :: OA.Schema