packages feed

swagger2 1.0 → 1.1

raw patch · 9 files changed

+121/−105 lines, 9 filesPVP ok

version bump matches the API change (PVP)

API changes (from Hackage documentation)

- Data.Swagger: Items :: Maybe (CollectionFormat Items) -> ParamSchema Items -> Items
- Data.Swagger: [_headerCollectionFormat] :: Header -> Maybe (CollectionFormat Items)
- Data.Swagger: [_itemsCollectionFormat] :: Items -> Maybe (CollectionFormat Items)
- Data.Swagger: [_itemsParamSchema] :: Items -> ParamSchema Items
- Data.Swagger: [_paramOtherSchemaCollectionFormat] :: ParamOtherSchema -> Maybe (CollectionFormat Param)
- Data.Swagger: data Items
- Data.Swagger.Internal: Items :: Maybe (CollectionFormat Items) -> ParamSchema Items -> Items
- Data.Swagger.Internal: [_headerCollectionFormat] :: Header -> Maybe (CollectionFormat Items)
- Data.Swagger.Internal: [_itemsCollectionFormat] :: Items -> Maybe (CollectionFormat Items)
- Data.Swagger.Internal: [_itemsParamSchema] :: Items -> ParamSchema Items
- Data.Swagger.Internal: [_paramOtherSchemaCollectionFormat] :: ParamOtherSchema -> Maybe (CollectionFormat Param)
- Data.Swagger.Internal: data Items
- Data.Swagger.Internal: instance Data.Aeson.Types.Class.FromJSON (Data.Swagger.Internal.CollectionFormat Data.Swagger.Internal.Items)
- Data.Swagger.Internal: instance Data.Aeson.Types.Class.FromJSON (Data.Swagger.Internal.SwaggerItems t)
- Data.Swagger.Internal: instance Data.Aeson.Types.Class.FromJSON Data.Swagger.Internal.Items
- Data.Swagger.Internal: instance Data.Aeson.Types.Class.ToJSON Data.Swagger.Internal.Items
- Data.Swagger.Internal: instance Data.Data.Data Data.Swagger.Internal.Items
- Data.Swagger.Internal: instance Data.Swagger.Internal.Utils.SwaggerMonoid (Data.HashMap.Base.HashMap Data.Swagger.Internal.HeaderName Data.Swagger.Internal.Header)
- Data.Swagger.Internal: instance Data.Swagger.Internal.Utils.SwaggerMonoid (Data.HashMap.Base.HashMap Data.Swagger.Internal.HttpStatusCode (Data.Swagger.Internal.Referenced Data.Swagger.Internal.Response))
- Data.Swagger.Internal: instance Data.Swagger.Internal.Utils.SwaggerMonoid (Data.HashMap.Base.HashMap Data.Text.Internal.Text (Data.Swagger.Internal.Referenced Data.Swagger.Internal.Schema))
- Data.Swagger.Internal: instance Data.Swagger.Internal.Utils.SwaggerMonoid (Data.HashMap.Base.HashMap Data.Text.Internal.Text Data.Swagger.Internal.Param)
- Data.Swagger.Internal: instance Data.Swagger.Internal.Utils.SwaggerMonoid (Data.HashMap.Base.HashMap Data.Text.Internal.Text Data.Swagger.Internal.Response)
- Data.Swagger.Internal: instance Data.Swagger.Internal.Utils.SwaggerMonoid (Data.HashMap.Base.HashMap Data.Text.Internal.Text Data.Swagger.Internal.Schema)
- Data.Swagger.Internal: instance Data.Swagger.Internal.Utils.SwaggerMonoid (Data.HashMap.Base.HashMap Data.Text.Internal.Text Data.Swagger.Internal.SecurityScheme)
- Data.Swagger.Internal: instance Data.Typeable.Internal.Typeable t => Data.Data.Data (Data.Swagger.Internal.SwaggerItems t)
- Data.Swagger.Internal: instance GHC.Classes.Eq Data.Swagger.Internal.Items
- Data.Swagger.Internal: instance GHC.Generics.Constructor Data.Swagger.Internal.C1_0Items
- Data.Swagger.Internal: instance GHC.Generics.Datatype Data.Swagger.Internal.D1Items
- Data.Swagger.Internal: instance GHC.Generics.Generic Data.Swagger.Internal.Items
- Data.Swagger.Internal: instance GHC.Generics.Selector Data.Swagger.Internal.S1_0_0Items
- Data.Swagger.Internal: instance GHC.Generics.Selector Data.Swagger.Internal.S1_0_1Items
- Data.Swagger.Internal: instance GHC.Generics.Selector Data.Swagger.Internal.S1_0_2Header
- Data.Swagger.Internal: instance GHC.Generics.Selector Data.Swagger.Internal.S1_0_3ParamOtherSchema
- Data.Swagger.Internal: instance GHC.Show.Show Data.Swagger.Internal.Items
- Data.Swagger.Lens: headerCollectionFormat :: Lens' Header (Maybe (CollectionFormat Items))
- Data.Swagger.Lens: instance Data.Swagger.Lens.HasParamSchema Data.Swagger.Internal.Items Data.Swagger.Internal.Items
- Data.Swagger.Lens: itemsCollectionFormat :: Lens' Items (Maybe (CollectionFormat Items))
- Data.Swagger.Lens: itemsParamSchema :: Lens' Items (ParamSchema Items)
- Data.Swagger.Lens: paramOtherSchemaCollectionFormat :: Lens' ParamOtherSchema (Maybe (CollectionFormat Param))
+ Data.Swagger: type HeaderName = Text
+ Data.Swagger: type HttpStatusCode = Int
+ Data.Swagger: type TagName = Text
+ Data.Swagger.Internal: instance (Data.Aeson.Types.Class.FromJSON (Data.Swagger.Internal.CollectionFormat t), Data.Aeson.Types.Class.FromJSON (Data.Swagger.Internal.ParamSchema t)) => Data.Aeson.Types.Class.FromJSON (Data.Swagger.Internal.SwaggerItems t)
+ Data.Swagger.Internal: instance Data.Aeson.Types.Class.FromJSON (Data.Swagger.Internal.CollectionFormat t)
+ Data.Swagger.Internal: instance Data.Data.Data t => Data.Data.Data (Data.Swagger.Internal.SwaggerItems t)
+ Data.Swagger.Internal: instance GHC.Base.Monoid Data.Swagger.Internal.Example
+ Data.Swagger.Internal: instance GHC.Base.Monoid Data.Swagger.Internal.Header
+ Data.Swagger.Internal: type TagName = Text
+ Data.Swagger.Internal.ParamSchema: instance Data.Swagger.Internal.ParamSchema.ToParamSchema a => Data.Swagger.Internal.ParamSchema.ToParamSchema (Data.HashSet.HashSet a)
+ Data.Swagger.Internal.ParamSchema: instance Data.Swagger.Internal.ParamSchema.ToParamSchema a => Data.Swagger.Internal.ParamSchema.ToParamSchema (Data.Set.Base.Set a)
+ Data.Swagger.Internal.ParamSchema: instance Data.Swagger.Internal.ParamSchema.ToParamSchema a => Data.Swagger.Internal.ParamSchema.ToParamSchema [a]
+ Data.Swagger.Internal.Utils: instance (GHC.Classes.Eq k, Data.Hashable.Class.Hashable k) => Data.Swagger.Internal.Utils.SwaggerMonoid (Data.HashMap.Base.HashMap k v)
+ Data.Swagger.Internal.Utils: instance GHC.Classes.Ord k => Data.Swagger.Internal.Utils.SwaggerMonoid (Data.Map.Base.Map k v)
- Data.Swagger: Header :: Maybe Text -> Maybe (CollectionFormat Items) -> ParamSchema Header -> Header
+ Data.Swagger: Header :: Maybe Text -> ParamSchema Header -> Header
- Data.Swagger: Operation :: [Text] -> Maybe Text -> Maybe Text -> Maybe ExternalDocs -> Maybe Text -> Maybe MimeList -> Maybe MimeList -> [Referenced Param] -> Responses -> Maybe [Scheme] -> Maybe Bool -> [SecurityRequirement] -> Operation
+ Data.Swagger: Operation :: [TagName] -> Maybe Text -> Maybe Text -> Maybe ExternalDocs -> Maybe Text -> Maybe MimeList -> Maybe MimeList -> [Referenced Param] -> Responses -> Maybe [Scheme] -> Maybe Bool -> [SecurityRequirement] -> Operation
- Data.Swagger: ParamOtherSchema :: ParamLocation -> Maybe Bool -> Maybe (CollectionFormat Param) -> ParamSchema ParamOtherSchema -> ParamOtherSchema
+ Data.Swagger: ParamOtherSchema :: ParamLocation -> Maybe Bool -> ParamSchema ParamOtherSchema -> ParamOtherSchema
- Data.Swagger: SwaggerItemsPrimitive :: Items -> SwaggerItems t
+ Data.Swagger: SwaggerItemsPrimitive :: Maybe (CollectionFormat t) -> ParamSchema t -> SwaggerItems t
- Data.Swagger: Tag :: Text -> Maybe Text -> Maybe ExternalDocs -> Tag
+ Data.Swagger: Tag :: TagName -> Maybe Text -> Maybe ExternalDocs -> Tag
- Data.Swagger: [_operationTags] :: Operation -> [Text]
+ Data.Swagger: [_operationTags] :: Operation -> [TagName]
- Data.Swagger: [_tagName] :: Tag -> Text
+ Data.Swagger: [_tagName] :: Tag -> TagName
- Data.Swagger.Internal: Header :: Maybe Text -> Maybe (CollectionFormat Items) -> ParamSchema Header -> Header
+ Data.Swagger.Internal: Header :: Maybe Text -> ParamSchema Header -> Header
- Data.Swagger.Internal: Operation :: [Text] -> Maybe Text -> Maybe Text -> Maybe ExternalDocs -> Maybe Text -> Maybe MimeList -> Maybe MimeList -> [Referenced Param] -> Responses -> Maybe [Scheme] -> Maybe Bool -> [SecurityRequirement] -> Operation
+ Data.Swagger.Internal: Operation :: [TagName] -> Maybe Text -> Maybe Text -> Maybe ExternalDocs -> Maybe Text -> Maybe MimeList -> Maybe MimeList -> [Referenced Param] -> Responses -> Maybe [Scheme] -> Maybe Bool -> [SecurityRequirement] -> Operation
- Data.Swagger.Internal: ParamOtherSchema :: ParamLocation -> Maybe Bool -> Maybe (CollectionFormat Param) -> ParamSchema ParamOtherSchema -> ParamOtherSchema
+ Data.Swagger.Internal: ParamOtherSchema :: ParamLocation -> Maybe Bool -> ParamSchema ParamOtherSchema -> ParamOtherSchema
- Data.Swagger.Internal: SwaggerItemsPrimitive :: Items -> SwaggerItems t
+ Data.Swagger.Internal: SwaggerItemsPrimitive :: Maybe (CollectionFormat t) -> ParamSchema t -> SwaggerItems t
- Data.Swagger.Internal: Tag :: Text -> Maybe Text -> Maybe ExternalDocs -> Tag
+ Data.Swagger.Internal: Tag :: TagName -> Maybe Text -> Maybe ExternalDocs -> Tag
- Data.Swagger.Internal: [_operationTags] :: Operation -> [Text]
+ Data.Swagger.Internal: [_operationTags] :: Operation -> [TagName]
- Data.Swagger.Internal: [_tagName] :: Tag -> Text
+ Data.Swagger.Internal: [_tagName] :: Tag -> TagName
- Data.Swagger.Lens: _SwaggerItemsArray :: t_adFC ~ Schema => Review (SwaggerItems t_adFC) [Referenced Schema]
+ Data.Swagger.Lens: _SwaggerItemsArray :: t_adKv ~ Schema => Review (SwaggerItems t_adKv) [Referenced Schema]
- Data.Swagger.Lens: _SwaggerItemsObject :: t_adFC ~ Schema => Review (SwaggerItems t_adFC) (Referenced Schema)
+ Data.Swagger.Lens: _SwaggerItemsObject :: t_adKv ~ Schema => Review (SwaggerItems t_adKv) (Referenced Schema)
- Data.Swagger.Lens: _SwaggerItemsPrimitive :: Prism' (SwaggerItems t_adFC) Items
+ Data.Swagger.Lens: _SwaggerItemsPrimitive :: Prism' (SwaggerItems t_adKv) (Maybe (CollectionFormat t_adKv), ParamSchema t_adKv)
- Data.Swagger.Lens: operationTags :: Lens' Operation [Text]
+ Data.Swagger.Lens: operationTags :: Lens' Operation [TagName]
- Data.Swagger.Lens: paramSchemaDefault :: Lens' (ParamSchema t_adFq) (Maybe Value)
+ Data.Swagger.Lens: paramSchemaDefault :: Lens' (ParamSchema t_adKj) (Maybe Value)
- Data.Swagger.Lens: paramSchemaEnum :: Lens' (ParamSchema t_adFq) (Maybe [Value])
+ Data.Swagger.Lens: paramSchemaEnum :: Lens' (ParamSchema t_adKj) (Maybe [Value])
- Data.Swagger.Lens: paramSchemaExclusiveMaximum :: Lens' (ParamSchema t_adFq) (Maybe Bool)
+ Data.Swagger.Lens: paramSchemaExclusiveMaximum :: Lens' (ParamSchema t_adKj) (Maybe Bool)
- Data.Swagger.Lens: paramSchemaExclusiveMinimum :: Lens' (ParamSchema t_adFq) (Maybe Bool)
+ Data.Swagger.Lens: paramSchemaExclusiveMinimum :: Lens' (ParamSchema t_adKj) (Maybe Bool)
- Data.Swagger.Lens: paramSchemaFormat :: Lens' (ParamSchema t_adFq) (Maybe Format)
+ Data.Swagger.Lens: paramSchemaFormat :: Lens' (ParamSchema t_adKj) (Maybe Format)
- Data.Swagger.Lens: paramSchemaItems :: Lens' (ParamSchema t_adFq) (Maybe (SwaggerItems t_adFq))
+ Data.Swagger.Lens: paramSchemaItems :: Lens' (ParamSchema t_adKj) (Maybe (SwaggerItems t_adKj))
- Data.Swagger.Lens: paramSchemaMaxItems :: Lens' (ParamSchema t_adFq) (Maybe Integer)
+ Data.Swagger.Lens: paramSchemaMaxItems :: Lens' (ParamSchema t_adKj) (Maybe Integer)
- Data.Swagger.Lens: paramSchemaMaxLength :: Lens' (ParamSchema t_adFq) (Maybe Integer)
+ Data.Swagger.Lens: paramSchemaMaxLength :: Lens' (ParamSchema t_adKj) (Maybe Integer)
- Data.Swagger.Lens: paramSchemaMaximum :: Lens' (ParamSchema t_adFq) (Maybe Scientific)
+ Data.Swagger.Lens: paramSchemaMaximum :: Lens' (ParamSchema t_adKj) (Maybe Scientific)
- Data.Swagger.Lens: paramSchemaMinItems :: Lens' (ParamSchema t_adFq) (Maybe Integer)
+ Data.Swagger.Lens: paramSchemaMinItems :: Lens' (ParamSchema t_adKj) (Maybe Integer)
- Data.Swagger.Lens: paramSchemaMinLength :: Lens' (ParamSchema t_adFq) (Maybe Integer)
+ Data.Swagger.Lens: paramSchemaMinLength :: Lens' (ParamSchema t_adKj) (Maybe Integer)
- Data.Swagger.Lens: paramSchemaMinimum :: Lens' (ParamSchema t_adFq) (Maybe Scientific)
+ Data.Swagger.Lens: paramSchemaMinimum :: Lens' (ParamSchema t_adKj) (Maybe Scientific)
- Data.Swagger.Lens: paramSchemaMultipleOf :: Lens' (ParamSchema t_adFq) (Maybe Scientific)
+ Data.Swagger.Lens: paramSchemaMultipleOf :: Lens' (ParamSchema t_adKj) (Maybe Scientific)
- Data.Swagger.Lens: paramSchemaPattern :: Lens' (ParamSchema t_adFq) (Maybe Text)
+ Data.Swagger.Lens: paramSchemaPattern :: Lens' (ParamSchema t_adKj) (Maybe Text)
- Data.Swagger.Lens: paramSchemaType :: Lens' (ParamSchema t_adFq) (SwaggerType t_adFq)
+ Data.Swagger.Lens: paramSchemaType :: Lens' (ParamSchema t_adKj) (SwaggerType t_adKj)
- Data.Swagger.Lens: paramSchemaUniqueItems :: Lens' (ParamSchema t_adFq) (Maybe Bool)
+ Data.Swagger.Lens: paramSchemaUniqueItems :: Lens' (ParamSchema t_adKj) (Maybe Bool)
- Data.Swagger.Lens: tagName :: Lens' Tag Text
+ Data.Swagger.Lens: tagName :: Lens' Tag TagName

Files

CHANGELOG.md view
@@ -1,3 +1,17 @@+1.1+---+* Major changes:+    * Put `CollectionFormat` in one place (see [`3cc860d`](https://github.com/GetShopTV/swagger2/commit/3cc860dd3f002ab984f4d0e4ce1d1799f985832e)).++* Minor changes:+    * Use Swagger formats for `Int32`, `Int64`, `Float`, `Double`, `Day` and `ZonedTime` (see [#32](https://github.com/GetShopTV/swagger2/pull/32));+    * Export `HeaderName`, `TagName`, `HttpStatusCode` type synonyms;+    * Add `ToParamSchema` instances for `[a]`, `Set a` and `HashSet a`;+    * Add `Monoid` instances for `Header` and `Example`.++* Fixes:+    * Use overwrite strategy for `HashMap` `SwaggerMonoid` instances by default.+ 1.0 --- * Major changes:
src/Data/Swagger.hs view
@@ -38,8 +38,9 @@   PathItem(..),    -- ** Operations-  Tag(..),   Operation(..),+  Tag(..),+  TagName,    -- ** Types and formats   SwaggerType(..),@@ -52,8 +53,8 @@   ParamOtherSchema(..),   ParamLocation(..),   ParamName,-  Items(..),   Header(..),+  HeaderName,   Example(..),    -- ** Schemas@@ -65,6 +66,7 @@   -- ** Responses   Responses(..),   Response(..),+  HttpStatusCode,    -- ** Security   SecurityScheme(..),
src/Data/Swagger/Internal.hs view
@@ -211,7 +211,7 @@ data Operation = Operation   { -- | A list of tags for API documentation control.     -- Tags can be used for logical grouping of operations by resources or any other qualifier.-    _operationTags :: [Text]+    _operationTags :: [TagName]      -- | A short summary of what the operation does.     -- For maximum readability in the swagger-ui, this field SHOULD be less than 120 characters.@@ -319,15 +319,21 @@     -- Default value is @False@.   , _paramOtherSchemaAllowEmptyValue :: Maybe Bool -    -- | Determines the format of the array if @'ParamArray'@ is used.-    -- Default value is csv.-  , _paramOtherSchemaCollectionFormat :: Maybe (CollectionFormat Param)-   , _paramOtherSchemaParamSchema :: ParamSchema ParamOtherSchema   } deriving (Eq, Show, Generic, Data, Typeable) +-- | Items for @'SwaggerArray'@ schemas.+--+-- @'SwaggerItemsPrimitive'@ should be used only for query params, headers and path pieces.+-- The @'CollectionFormat' t@ parameter specifies how elements of an array should be displayed.+-- Note that @fmt@ in @'SwaggerItemsPrimitive' fmt schema@ specifies format for elements of type @schema@.+-- This is different from the original Swagger's <http://swagger.io/specification/#itemsObject Items Object>.+--+-- @'SwaggerItemsObject'@ should be used to specify homogenous array @'Schema'@s.+--+-- @'SwaggerItemsArray'@ should be used to specify tuple @'Schema'@s. data SwaggerItems t where-  SwaggerItemsPrimitive :: Items               -> SwaggerItems t+  SwaggerItemsPrimitive :: Maybe (CollectionFormat t) -> ParamSchema t -> SwaggerItems t   SwaggerItemsObject    :: Referenced Schema   -> SwaggerItems Schema   SwaggerItemsArray     :: [Referenced Schema] -> SwaggerItems Schema @@ -341,9 +347,9 @@ swaggerItemsDataType :: DataType swaggerItemsDataType = mkDataType "Data.Swagger.SwaggerItems" [swaggerItemsPrimitiveConstr] -instance {-# OVERLAPPABLE #-} Typeable t => Data (SwaggerItems t) where+instance {-# OVERLAPPABLE #-} Data t => Data (SwaggerItems t) where   gunfold k z c = case constrIndex c of-    1 -> k (z SwaggerItemsPrimitive)+    1 -> k (k (z SwaggerItemsPrimitive))     _ -> error $ "Data.Data.gunfold: Constructor " ++ show c ++ " is not of type (SwaggerItems t)."   toConstr _ = swaggerItemsPrimitiveConstr   dataTypeOf _ = swaggerItemsDataType@@ -508,7 +514,7 @@  data Xml = Xml   { -- | Replaces the name of the element/attribute used for the described schema property.-    -- When defined within the @'Items'@ (items), it will affect the name of the individual XML elements within the list.+    -- When defined within the @'SwaggerItems'@ (items), it will affect the name of the individual XML elements within the list.     -- When defined alongside type being array (outside the items),     -- it will affect the wrapping element and only if wrapped is true.     -- If wrapped is false, it will be ignored.@@ -534,14 +540,6 @@   , _xmlWrapped :: Maybe Bool   } deriving (Eq, Show, Generic, Data, Typeable) -data Items = Items-  { -- | Determines the format of the array if type array is used.-    -- Default value is @'ItemsCollectionCSV'@.-    _itemsCollectionFormat :: Maybe (CollectionFormat Items)--  , _itemsParamSchema :: ParamSchema Items-  } deriving (Eq, Show, Generic, Data, Typeable)- -- | A container for the expected responses of an operation. -- The container maps a HTTP response code to the expected response. -- It is not expected from the documentation to necessarily cover all possible HTTP response codes,@@ -585,10 +583,6 @@   { -- | A short description of the header.     _headerDescription :: Maybe Text -    -- | Determines the format of the array if type array is used.-    -- Default value is @'ItemsCollectionCSV'@.-  , _headerCollectionFormat :: Maybe (CollectionFormat Items)-   , _headerParamSchema :: ParamSchema Header   } deriving (Eq, Show, Generic, Data, Typeable) @@ -664,11 +658,14 @@   { getSecurityRequirement :: HashMap Text [Text]   } deriving (Eq, Read, Show, Monoid, ToJSON, FromJSON, Data, Typeable) +-- | Tag name.+type TagName = Text+ -- | Allows adding meta data to a single tag that is used by @Operation@. -- It is not mandatory to have a @Tag@ per tag used there. data Tag = Tag   { -- | The name of the tag.-    _tagName :: Text+    _tagName :: TagName      -- | A short description for the tag.     -- GFM syntax can be used for rich text representation.@@ -736,6 +733,10 @@   mempty = genericMempty   mappend = genericMappend +instance Monoid Header where+  mempty = genericMempty+  mappend = genericMappend+ instance Monoid Responses where   mempty = genericMempty   mappend = genericMappend@@ -752,6 +753,10 @@   mempty = genericMempty   mappend = genericMappend +instance Monoid Example where+  mempty = genericMempty+  mappend = genericMappend+ -- ======================================================================= -- SwaggerMonoid helper instances -- =======================================================================@@ -779,43 +784,15 @@   swaggerMempty = ParamQuery   swaggerMappend _ y = y -instance SwaggerMonoid (HashMap Text Schema) where+instance SwaggerMonoid (HashMap FilePath PathItem) where   swaggerMempty = HashMap.empty   swaggerMappend = HashMap.unionWith mappend -instance SwaggerMonoid (HashMap Text (Referenced Schema)) where-  swaggerMempty = HashMap.empty-  swaggerMappend = HashMap.unionWith swaggerMappend- instance Monoid a => SwaggerMonoid (Referenced a) where   swaggerMempty = Inline mempty   swaggerMappend (Inline x) (Inline y) = Inline (x <> y)   swaggerMappend _ y = y -instance SwaggerMonoid (HashMap Text Param) where-  swaggerMempty = HashMap.empty-  swaggerMappend = HashMap.unionWith mappend--instance SwaggerMonoid (HashMap Text Response) where-  swaggerMempty = HashMap.empty-  swaggerMappend = flip HashMap.union--instance SwaggerMonoid (HashMap Text SecurityScheme) where-  swaggerMempty = HashMap.empty-  swaggerMappend = flip HashMap.union--instance SwaggerMonoid (HashMap FilePath PathItem) where-  swaggerMempty = HashMap.empty-  swaggerMappend = HashMap.unionWith mappend--instance SwaggerMonoid (HashMap HeaderName Header) where-  swaggerMempty = HashMap.empty-  swaggerMappend = flip HashMap.union--instance SwaggerMonoid (HashMap HttpStatusCode (Referenced Response)) where-  swaggerMempty = HashMap.empty-  swaggerMappend = flip HashMap.union- instance SwaggerMonoid ParamAnySchema where   swaggerMempty = ParamOther swaggerMempty   swaggerMappend (ParamBody x) (ParamBody y) = ParamBody (swaggerMappend x y)@@ -934,13 +911,12 @@ instance ToJSON Header where   toJSON = genericToJSONWithSub "paramSchema" (jsonPrefix "header") -instance ToJSON Items where-  toJSON = genericToJSONWithSub "paramSchema" (jsonPrefix "items")- instance ToJSON (SwaggerItems t) where-  toJSON (SwaggerItemsPrimitive x) = toJSON x-  toJSON (SwaggerItemsObject    x) = toJSON x-  toJSON (SwaggerItemsArray     x) = toJSON x+  toJSON (SwaggerItemsPrimitive fmt schema) = object+    [ "collectionFormat" .= fmt+    , "items"            .= schema ]+  toJSON (SwaggerItemsObject x) = object [ "items" .= x ]+  toJSON (SwaggerItemsArray  x) = object [ "items" .= x ]  instance ToJSON Host where   toJSON (Host host mport) = toJSON $@@ -1009,7 +985,7 @@   toJSON CollectionMulti = "multi"  instance ToJSON (ParamSchema t) where-  toJSON = genericToJSON (jsonPrefix "paramSchema")+  toJSON = omitEmpties . genericToJSONWithSub "items" (jsonPrefix "paramSchema")  -- ======================================================================= -- Manual FromJSON instances@@ -1068,11 +1044,10 @@ instance FromJSON Header where   parseJSON = genericParseJSONWithSub "paramSchema" (jsonPrefix "header") -instance FromJSON Items where-  parseJSON = genericParseJSONWithSub "paramSchema" (jsonPrefix "items")--instance {-# OVERLAPPABLE #-} FromJSON (SwaggerItems t) where-  parseJSON js = SwaggerItemsPrimitive <$> parseJSON js+instance {-# OVERLAPPABLE #-} (FromJSON (CollectionFormat t), FromJSON (ParamSchema t)) => FromJSON (SwaggerItems t) where+  parseJSON (Object o) = SwaggerItemsPrimitive+    <$> o .:? "collectionFormat"+    <*> (o .: "items" >>= parseJSON)  instance {-# OVERLAPPING #-} FromJSON (SwaggerItems Schema) where   parseJSON js@(Object _) = SwaggerItemsObject <$> parseJSON js@@ -1166,16 +1141,17 @@ instance {-# OVERLAPPABLE #-} FromJSON (SwaggerType t) where   parseJSON = parseOneOf [SwaggerString, SwaggerInteger, SwaggerNumber, SwaggerBoolean, SwaggerArray] +instance {-# OVERLAPPABLE #-} FromJSON (CollectionFormat t) where+  parseJSON = parseOneOf [CollectionCSV, CollectionSSV, CollectionTSV, CollectionPipes]+ instance FromJSON (CollectionFormat Param) where   parseJSON = parseOneOf [CollectionCSV, CollectionSSV, CollectionTSV, CollectionPipes, CollectionMulti] -instance FromJSON (CollectionFormat Items) where-  parseJSON = parseOneOf [CollectionCSV, CollectionSSV, CollectionTSV, CollectionPipes]- -- NOTE: The constraints @FromJSON (SwaggerType t)@ and -- @FromJSON (SwaggerItems t)@ are necessary here! -- Without the constraint the general instance will be used -- that only accepts common types (i.e. NOT object, null or file) -- and primitive array items. instance (FromJSON (SwaggerType t), FromJSON (SwaggerItems t)) => FromJSON (ParamSchema t) where-  parseJSON = genericParseJSON (jsonPrefix "ParamSchema")+  parseJSON = genericParseJSONWithSub "items" (jsonPrefix "ParamSchema")+
src/Data/Swagger/Internal/ParamSchema.hs view
@@ -3,6 +3,7 @@ {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE KindSignatures #-} {-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE PackageImports #-} {-# LANGUAGE PolyKinds #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TypeOperators #-}@@ -15,7 +16,9 @@ import GHC.Generics  import Data.Int+import "unordered-containers" Data.HashSet (HashSet) import Data.Monoid+import Data.Set (Set) import Data.Scientific import qualified Data.Text as T import qualified Data.Text.Lazy as TL@@ -82,9 +85,13 @@ instance ToParamSchema Int    where toParamSchema = toParamSchemaBoundedIntegral instance ToParamSchema Int8   where toParamSchema = toParamSchemaBoundedIntegral instance ToParamSchema Int16  where toParamSchema = toParamSchemaBoundedIntegral-instance ToParamSchema Int32  where toParamSchema = toParamSchemaBoundedIntegral-instance ToParamSchema Int64  where toParamSchema = toParamSchemaBoundedIntegral +instance ToParamSchema Int32 where+  toParamSchema proxy = toParamSchemaBoundedIntegral proxy & schemaFormat ?~ "int32"++instance ToParamSchema Int64 where+  toParamSchema proxy = toParamSchemaBoundedIntegral proxy & schemaFormat ?~ "int64"+ instance ToParamSchema Word   where toParamSchema = toParamSchemaBoundedIntegral instance ToParamSchema Word8  where toParamSchema = toParamSchemaBoundedIntegral instance ToParamSchema Word16 where toParamSchema = toParamSchemaBoundedIntegral@@ -111,21 +118,23 @@   toParamSchema _ = mempty & schemaType .~ SwaggerNumber  instance ToParamSchema Double where-  toParamSchema _ = mempty & schemaType .~ SwaggerNumber+  toParamSchema _ = mempty+    & schemaType   .~ SwaggerNumber+    & schemaFormat ?~ "double"  instance ToParamSchema Float where-  toParamSchema _ = mempty & schemaType .~ SwaggerNumber+  toParamSchema _ = mempty+    & schemaType   .~ SwaggerNumber+    & schemaFormat ?~ "float"  timeParamSchema :: String -> ParamSchema t timeParamSchema format = mempty   & schemaType      .~ SwaggerString   & schemaFormat    ?~ T.pack format --- |--- >>> toParamSchema (Proxy :: Proxy Day) ^. schemaFormat--- Just "yyyy-mm-dd"+-- | Format @"date"@ corresponds to @yyyy-mm-dd@ format. instance ToParamSchema Day where-  toParamSchema _ = timeParamSchema "yyyy-mm-dd"+  toParamSchema _ = timeParamSchema "date"  -- | -- >>> toParamSchema (Proxy :: Proxy LocalTime) ^. schemaFormat@@ -161,6 +170,18 @@ instance ToParamSchema a => ToParamSchema (First a)   where toParamSchema _ = toParamSchema (Proxy :: Proxy a) instance ToParamSchema a => ToParamSchema (Last a)    where toParamSchema _ = toParamSchema (Proxy :: Proxy a) instance ToParamSchema a => ToParamSchema (Dual a)    where toParamSchema _ = toParamSchema (Proxy :: Proxy a)++instance ToParamSchema a => ToParamSchema [a] where+  toParamSchema _ = mempty+    & schemaType  .~ SwaggerArray+    & schemaItems ?~ SwaggerItemsPrimitive Nothing (toParamSchema (Proxy :: Proxy a))++instance ToParamSchema a => ToParamSchema (Set a) where+  toParamSchema _ = toParamSchema (Proxy :: Proxy [a])+    & schemaUniqueItems ?~ True++instance ToParamSchema a => ToParamSchema (HashSet a) where+  toParamSchema _ = toParamSchema (Proxy :: Proxy (Set a))  -- | -- >>> encode $ toParamSchema (Proxy :: Proxy ())
src/Data/Swagger/Internal/Schema.hs view
@@ -128,7 +128,7 @@ -- (Nothing,"{\"type\":\"string\"}") -- -- >>> encode <$> toNamedSchema (Proxy :: Proxy Day)--- (Just "Day","{\"format\":\"yyyy-mm-dd\",\"type\":\"string\"}")+-- (Just "Day","{\"format\":\"date\",\"type\":\"string\"}") toNamedSchema :: ToSchema a => proxy a -> NamedSchema toNamedSchema = undeclare . declareNamedSchema @@ -228,7 +228,7 @@ -- | Convert a type into a schema without references. -- -- >>> encode $ toInlinedSchema (Proxy :: Proxy [Day])--- "{\"items\":{\"format\":\"yyyy-mm-dd\",\"type\":\"string\"},\"type\":\"array\"}"+-- "{\"items\":{\"format\":\"date\",\"type\":\"string\"},\"type\":\"array\"}" -- -- __WARNING:__ @'toInlinedSchema'@ will produce infinite schema -- when inlining recursive schemas.@@ -305,11 +305,9 @@   & schemaType .~ SwaggerString   & schemaFormat ?~ format --- |--- >>> toSchema (Proxy :: Proxy Day) ^. schemaFormat--- Just "yyyy-mm-dd"+-- | Format @"date"@ corresponds to @yyyy-mm-dd@ format. instance ToSchema Day where-  declareNamedSchema _ = pure $ named "Day" (timeSchema "yyyy-mm-dd")+  declareNamedSchema _ = pure $ named "Day" (timeSchema "date")  -- | -- >>> toSchema (Proxy :: Proxy LocalTime) ^. schemaFormat@@ -317,11 +315,9 @@ instance ToSchema LocalTime where   declareNamedSchema _ = pure $ named "LocalTime" (timeSchema "yyyy-mm-ddThh:MM:ss") --- |--- >>> toSchema (Proxy :: Proxy ZonedTime) ^. schemaFormat--- Just "yyyy-mm-ddThh:MM:ss(Z|+hh:MM)"+-- | Format @"date"@ corresponds to @yyyy-mm-ddThh:MM:ss(Z|+hh:MM)@ format. instance ToSchema ZonedTime where-  declareNamedSchema _ = pure $ named "ZonedTime" $ timeSchema "yyyy-mm-ddThh:MM:ss(Z|+hh:MM)"+  declareNamedSchema _ = pure $ named "ZonedTime" $ timeSchema "date-time"  instance ToSchema NominalDiffTime where   declareNamedSchema _ = declareNamedSchema (Proxy :: Proxy Integer)
src/Data/Swagger/Internal/Utils.hs view
@@ -1,5 +1,6 @@ {-# LANGUAGE DefaultSignatures #-} {-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE TypeOperators #-}@@ -14,6 +15,7 @@ import Data.Hashable (Hashable) import Data.HashMap.Strict (HashMap) import qualified Data.HashMap.Strict as HashMap+import Data.Map (Map) import Data.Monoid import Data.Text (Text) import GHC.Generics@@ -66,14 +68,17 @@ genericToJSONWithSub sub opts x =   case genericToJSON opts x of     Object o ->-      let so = HashMap.lookupDefault (error "impossible") sub o-      in Object (HashMap.delete sub o) <+> so+      case HashMap.lookup sub o of+        Just so -> Object (HashMap.delete sub o) <+> so+        Nothing -> Object o -- no subjson, leaving object as is     _ -> error "genericToJSONWithSub: subjson is not an object"  genericParseJSONWithSub :: (Generic a, GFromJSON (Rep a)) => Text -> Options -> Value -> Parser a-genericParseJSONWithSub sub opts (Object o) = genericParseJSON opts js+genericParseJSONWithSub sub opts js@(Object o)+    = genericParseJSON opts js    -- try without subjson+  <|> genericParseJSON opts js'   -- try with subjson   where-    js = Object (HashMap.insert sub (Object o) o)+    js' = Object (HashMap.insert sub (Object o) o) genericParseJSONWithSub _ _ _ = error "genericParseJSONWithSub: given json is not an object"  (<+>) :: Value -> Value -> Value@@ -119,6 +124,11 @@   swaggerMappend = mappend  instance SwaggerMonoid [a]+instance Ord k => SwaggerMonoid (Map k v)++instance {-# OVERLAPPABLE #-} (Eq k, Hashable k) => SwaggerMonoid (HashMap k v) where+  swaggerMempty = mempty+  swaggerMappend = HashMap.unionWith (\_old new -> new)  instance SwaggerMonoid Text where   swaggerMempty = mempty
src/Data/Swagger/Lens.hs view
@@ -38,8 +38,6 @@ makePrisms ''ParamAnySchema -- ** 'ParamOtherSchema' lenses makeLenses ''ParamOtherSchema--- ** 'Items' lenses-makeLenses ''Items -- ** 'Header' lenses makeLenses ''Header -- ** 'Schema' lenses@@ -86,7 +84,6 @@  instance HasParamSchema Schema Schema where parameterSchema = schemaParamSchema instance HasParamSchema ParamOtherSchema ParamOtherSchema where parameterSchema = paramOtherSchemaParamSchema-instance HasParamSchema Items Items where parameterSchema = itemsParamSchema instance HasParamSchema Header Header where parameterSchema = headerParamSchema instance HasParamSchema (ParamSchema t) t where parameterSchema = id 
swagger2.cabal view
@@ -1,5 +1,5 @@ name:                swagger2-version:             1.0+version:             1.1 synopsis:            Swagger 2.0 data model description:         Please see README.md homepage:            https://github.com/GetShopTV/swagger2
test/Data/Swagger/SchemaSpec.hs view
@@ -152,8 +152,8 @@   "type": "object",   "properties":     {-      "x": { "type": "number" },-      "y": { "type": "number" }+      "x": { "type": "number", "format": "double" },+      "y": { "type": "number", "format": "double" }     },   "required": ["x", "y"] }@@ -458,8 +458,8 @@                   "type": "object",                   "properties":                     {-                      "x": { "type": "number" },-                      "y": { "type": "number" }+                      "x": { "type": "number", "format": "double" },+                      "y": { "type": "number", "format": "double" }                     },                   "required": ["x", "y"]                 }@@ -477,8 +477,8 @@                   "type": "object",                   "properties":                     {-                      "x": { "type": "number" },-                      "y": { "type": "number" }+                      "x": { "type": "number", "format": "double" },+                      "y": { "type": "number", "format": "double" }                     },                   "required": ["x", "y"]                 }@@ -545,9 +545,9 @@   "type": "object",   "properties":     {-      "LightFreq": { "type": "number" },+      "LightFreq": { "type": "number", "format": "double" },       "LightColor": { "$ref": "#/definitions/Color" },-      "LightWaveLength": { "type": "number" }+      "LightWaveLength": { "type": "number", "format": "double" }     },   "maxProperties": 1,   "minProperties": 1@@ -560,13 +560,13 @@   "type": "object",   "properties":     {-      "LightFreq": { "type": "number" },+      "LightFreq": { "type": "number", "format": "double" },       "LightColor":         {           "type": "string",           "enum": ["Red", "Green", "Blue"]         },-      "LightWaveLength": { "type": "number" }+      "LightWaveLength": { "type": "number", "format": "double" }     },   "maxProperties": 1,   "minProperties": 1