git.iko.soy/typeable/openapi3
on master help sign in
Merge pull request #175 from GetShopTV/QuickCheck-2.12
7a4cabfOleg Grenrus
.travis.yml+2−2
@@ -32,9 +32,9 @@ before_cache:
32
32
33matrix:
33matrix:
34 include:
34 include:
35− - compiler: "ghc-8.6.1"
35+ - compiler: "ghc-8.6.2"
36 # env: TEST=--disable-tests BENCH=--disable-benchmarks
36 # env: TEST=--disable-tests BENCH=--disable-benchmarks
37− addons: {apt: {packages: [ghc-ppa-tools,cabal-install-2.4,ghc-8.6.1], sources: [hvr-ghc]}}
37+ addons: {apt: {packages: [ghc-ppa-tools,cabal-install-2.4,ghc-8.6.2], sources: [hvr-ghc]}}
38 - compiler: "ghc-8.4.4"
38 - compiler: "ghc-8.4.4"
39 # env: TEST=--disable-tests BENCH=--disable-benchmarks
39 # env: TEST=--disable-tests BENCH=--disable-benchmarks
40 addons: {apt: {packages: [ghc-ppa-tools,cabal-install-2.4,ghc-8.4.4], sources: [hvr-ghc]}}
40 addons: {apt: {packages: [ghc-ppa-tools,cabal-install-2.4,ghc-8.4.4], sources: [hvr-ghc]}}
CHANGELOG.md+10
@@ -1,3 +1,13 @@
1+2.3.1
2+-----
3+
4+- Add a quickcheck generator for aeson Values that match a swagger schema
5+ (see [#162](https://github.com/GetShopTV/swagger2/pull/162))
6+- Add `ToParamSchema` instance for `SetCookie`
7+ (see [#173](https://github.com/GetShopTV/swagger2/pull/173))
8+- Make nullary schemas valid
9+ (see [#168](https://github.com/GetShopTV/swagger2/pull/168))
10+
12.3.0.1
112.3.0.1
2-------
12-------
3
13
src/Data/Swagger/Internal.hs+17−3
@@ -66,6 +66,7 @@ import Data.Swagger.Internal.AesonUtils (sopSwaggerGenericToEncoding)
66#endif
66#endif
67
67
68-- $setup
68-- $setup
69+-- >>> :seti -XDataKinds
69-- >>> import Data.Aeson
70-- >>> import Data.Aeson
70
71
71-- | A list of definitions that can be used in references.
72-- | A list of definitions that can be used in references.
@@ -1067,7 +1068,8 @@ instance ToJSON (ParamSchema t) => ToJSON (SwaggerItems t) where
1067 toJSON (SwaggerItemsArray []) = object
1068 toJSON (SwaggerItemsArray []) = object
1068 [ "items" .= object []
1069 [ "items" .= object []
1069 , "maxItems" .= (0 :: Int)
1070 , "maxItems" .= (0 :: Int)
1070− , "example" .= ([] :: [()]) ]
1071+ , "example" .= Array mempty
1072+ ]
1071 toJSON (SwaggerItemsArray x) = object [ "items" .= x ]
1073 toJSON (SwaggerItemsArray x) = object [ "items" .= x ]
1072
1074
1073instance ToJSON Host where
1075instance ToJSON Host where
@@ -1205,9 +1207,21 @@ instance FromJSON (SwaggerItems 'SwaggerKindParamOtherSchema) where
1205 <$> o .:? "collectionFormat"
1207 <$> o .:? "collectionFormat"
1206 <*> ((o .: "items" >>= parseJSON) <|> fail ("foo" ++ show o))
1208 <*> ((o .: "items" >>= parseJSON) <|> fail ("foo" ++ show o))
1207
1209
1210+-- |
1211+--
1212+-- >>> decode "{}" :: Maybe (SwaggerItems 'SwaggerKindSchema)
1213+-- Just (SwaggerItemsArray [])
1214+--
1215+-- >>> eitherDecode "{\"$ref\":\"#/definitions/example\"}" :: Either String (SwaggerItems 'SwaggerKindSchema)
1216+-- Right (SwaggerItemsObject (Ref (Reference {getReference = "example"})))
1217+--
1218+-- >>> eitherDecode "[{\"$ref\":\"#/definitions/example\"}]" :: Either String (SwaggerItems 'SwaggerKindSchema)
1219+-- Right (SwaggerItemsArray [Ref (Reference {getReference = "example"})])
1220+--
1208instance FromJSON (SwaggerItems 'SwaggerKindSchema) where
1221instance FromJSON (SwaggerItems 'SwaggerKindSchema) where
1222+ parseJSON js@(Object obj)
1209− parseJSON js | js == object [] = pure $ SwaggerItemsArray [] -- Nullary schema.
1223+ | null obj = pure $ SwaggerItemsArray [] -- Nullary schema.
1210− parseJSON js@(Object _) = SwaggerItemsObject <$> parseJSON js
1224+ | otherwise = SwaggerItemsObject <$> parseJSON js
1211 parseJSON js@(Array _) = SwaggerItemsArray <$> parseJSON js
1225 parseJSON js@(Array _) = SwaggerItemsArray <$> parseJSON js
1212 parseJSON _ = empty
1226 parseJSON _ = empty
1213
1227
stack.yaml+1
@@ -2,5 +2,6 @@ resolver: lts-12.10
2packages:
2packages:
3- '.'
3- '.'
4extra-deps:
4extra-deps:
5+- aeson-1.4.2.0
5- base-compat-batteries-0.10.4
6- base-compat-batteries-0.10.4
6- contravariant-1.5
7- contravariant-1.5
swagger2.cabal+5−8
@@ -1,7 +1,6 @@
1cabal-version: >=1.10
1cabal-version: >=1.10
2name: swagger2
2name: swagger2
3−version: 2.3.0.1
3+version: 2.3.1
4−x-revision: 2
5
4
6synopsis: Swagger 2.0 data model
5synopsis: Swagger 2.0 data model
7category: Web, Swagger
6category: Web, Swagger
@@ -30,11 +29,11 @@ tested-with:
30 || ==8.0.2
29 || ==8.0.2
31 || ==8.2.2
30 || ==8.2.2
32 || ==8.4.4
31 || ==8.4.4
33− || ==8.6.1
32+ || ==8.6.2
34
33
35custom-setup
34custom-setup
36 setup-depends:
35 setup-depends:
37− base, Cabal, cabal-doctest >=1.0.2 && <1.1
36+ base, Cabal, cabal-doctest >=1.0.6 && <1.1
38
37
39library
38library
40 hs-source-dirs: src
39 hs-source-dirs: src
@@ -75,7 +74,7 @@ library
75 -- other dependencies
74 -- other dependencies
76 build-depends:
75 build-depends:
77 base-compat-batteries >=0.10.4 && <0.11
76 base-compat-batteries >=0.10.4 && <0.11
78− , aeson >=1.3.1.1 && <1.5
77+ , aeson >=1.4.2.0 && <1.5
79 -- cookie 0.4.3 is needed by GHC 7.8 due to time>=1.4 constraint
78 -- cookie 0.4.3 is needed by GHC 7.8 due to time>=1.4 constraint
80 , cookie >=0.4.3 && <0.5
79 , cookie >=0.4.3 && <0.5
81 , generics-sop >=0.3.2.0 && <0.5
80 , generics-sop >=0.3.2.0 && <0.5
@@ -89,7 +88,7 @@ library
89 , unordered-containers >=0.2.9.0 && <0.3
88 , unordered-containers >=0.2.9.0 && <0.3
90 , uuid-types >=1.0.3 && <1.1
89 , uuid-types >=1.0.3 && <1.1
91 , vector >=0.12.0.1 && <0.13
90 , vector >=0.12.0.1 && <0.13
92− , QuickCheck >=2.10.1 && <2.12
91+ , QuickCheck >=2.10.1 && <2.13
93
92
94 default-language: Haskell2010
93 default-language: Haskell2010
95
94
@@ -137,8 +136,6 @@ test-suite spec
137 Data.Swagger.SchemaSpec
136 Data.Swagger.SchemaSpec
138 Data.Swagger.Schema.ValidationSpec
137 Data.Swagger.Schema.ValidationSpec
139 Data.Swagger.Schema.GeneratorSpec
138 Data.Swagger.Schema.GeneratorSpec
140−
141− Data.Aeson.QQ.Simple
142 default-language: Haskell2010
139 default-language: Haskell2010
143
140
144test-suite doctests
141test-suite doctests
test/Data/Aeson/QQ/Simple.hsdeleted−45
@@ -1,45 +0,0 @@
1−{-# LANGUAGE TemplateHaskell #-}
2−-- | Like "Data.Aeson.QQ" but without interpolation.
3−module Data.Aeson.QQ.Simple where
4−
5−import Data.Aeson
6−import Data.ByteString.Lazy.UTF8 as UTF8
7−import qualified Data.HashMap.Strict as HM
8−import qualified Data.Text as T
9−import qualified Data.Vector as V
10−import Language.Haskell.TH
11−import Language.Haskell.TH.Quote
12−import Language.Haskell.TH.Syntax (Lift (..))
13−import Prelude ()
14−import Prelude.Compat
15−
16−aesonQQ :: QuasiQuoter
17−aesonQQ = QuasiQuoter
18− { quoteExp = aesonExp
19− , quotePat = const $ error "No quotePat defined for jsonQQ"
20− , quoteType = const $ error "No quoteType defined for jsonQQ"
21− , quoteDec = const $ error "No quoteDec defined for jsonQQ"
22− }
23−
24−aesonExp :: String -> ExpQ
25−aesonExp txt =
26− case eitherDecode $ UTF8.fromString txt of
27− Left err -> error $ "Error in aesonExp: " ++ show err
28− Right val -> liftValue val
29−
30−liftValue :: Value -> ExpQ
31−liftValue (String str) = [| String $(liftText str) |]
32−liftValue Null = [| Null |]
33−liftValue (Number n) = [| Number (fromRational $(return $ LitE $ RationalL (toRational n))) |]
34−liftValue (Bool b) = [| Bool b |]
35−liftValue (Array arr) = [| Array $ V.fromList $(ListE <$> traverse liftValue (V.toList arr)) |]
36−liftValue (Object obj) = [| object $jsList |]
37− where
38− jsList :: ExpQ
39− jsList = ListE <$> traverse objs2list (HM.toList obj)
40−
41− objs2list :: (T.Text, Value) -> ExpQ
42− objs2list (key, value) = [| ($(liftText key), $(liftValue value)) |]
43−
44−liftText :: T.Text -> ExpQ
45−liftText t = [| T.pack $(lift $ T.unpack t) |]