git.iko.soy/typeable/swagger2
on master help sign in
Merge remote-tracking branch 'origin/master' into 87_add_instance_for_TimeOfDay
78dd024anneloreegger
@@ -1 +1,2 @@
1:set -itest -isrc -optP-include -optP.stack-work/dist/x86_64-linux/Cabal-1.24.2.0/build/autogen/cabal_macros.h -optP-I -optPinclude
1:set -itest -isrc -optP-include -optP.stack-work/dist/x86_64-linux/Cabal-1.24.2.0/build/autogen/cabal_macros.h -optP-I -optPinclude
2+:set -hide-package base-compat-0.10.4
.travis.yml+28−37
@@ -4,7 +4,7 @@
4#
4#
5# For more information, see https://github.com/haskell-CI/haskell-ci
5# For more information, see https://github.com/haskell-CI/haskell-ci
6#
6#
7−# version: 0.3.20190429
7+# version: 0.5.20190908
8#
8#
9language: c
9language: c
10dist: xenial
10dist: xenial
@@ -31,30 +31,29 @@ matrix:
31 include:
31 include:
32 - compiler: ghc-8.8.1
32 - compiler: ghc-8.8.1
33 addons: {"apt":{"sources":["hvr-ghc"],"packages":["ghc-8.8.1","cabal-install-3.0"]}}
33 addons: {"apt":{"sources":["hvr-ghc"],"packages":["ghc-8.8.1","cabal-install-3.0"]}}
34− env: GHCHEAD=true
35 - compiler: ghc-8.6.5
34 - compiler: ghc-8.6.5
36− addons: {"apt":{"sources":["hvr-ghc"],"packages":["ghc-8.6.5","cabal-install-2.4"]}}
35+ addons: {"apt":{"sources":["hvr-ghc"],"packages":["ghc-8.6.5","cabal-install-3.0"]}}
37 - compiler: ghc-8.4.4
36 - compiler: ghc-8.4.4
38− addons: {"apt":{"sources":["hvr-ghc"],"packages":["ghc-8.4.4","cabal-install-2.4"]}}
37+ addons: {"apt":{"sources":["hvr-ghc"],"packages":["ghc-8.4.4","cabal-install-3.0"]}}
39 - compiler: ghc-8.2.2
38 - compiler: ghc-8.2.2
40− addons: {"apt":{"sources":["hvr-ghc"],"packages":["ghc-8.2.2","cabal-install-2.4"]}}
39+ addons: {"apt":{"sources":["hvr-ghc"],"packages":["ghc-8.2.2","cabal-install-3.0"]}}
41 - compiler: ghc-8.0.2
40 - compiler: ghc-8.0.2
42− addons: {"apt":{"sources":["hvr-ghc"],"packages":["ghc-8.0.2","cabal-install-2.4"]}}
41+ addons: {"apt":{"sources":["hvr-ghc"],"packages":["ghc-8.0.2","cabal-install-3.0"]}}
43 - compiler: ghc-7.10.3
42 - compiler: ghc-7.10.3
44− addons: {"apt":{"sources":["hvr-ghc"],"packages":["ghc-7.10.3","cabal-install-2.4"]}}
43+ addons: {"apt":{"sources":["hvr-ghc"],"packages":["ghc-7.10.3","cabal-install-3.0"]}}
45 - compiler: ghc-7.8.4
44 - compiler: ghc-7.8.4
46− addons: {"apt":{"sources":["hvr-ghc"],"packages":["ghc-7.8.4","cabal-install-2.4"]}}
45+ addons: {"apt":{"sources":["hvr-ghc"],"packages":["ghc-7.8.4","cabal-install-3.0"]}}
47− allow_failures:
48− - compiler: ghc-8.8.1
49before_install:
46before_install:
50 - HC=$(echo "/opt/$CC/bin/ghc" | sed 's/-/\//')
47 - HC=$(echo "/opt/$CC/bin/ghc" | sed 's/-/\//')
48+ - WITHCOMPILER="-w $HC"
49+ - HADDOCK=$(echo "/opt/$CC/bin/haddock" | sed 's/-/\//')
51 - HCPKG="$HC-pkg"
50 - HCPKG="$HC-pkg"
52 - unset CC
51 - unset CC
53 - CABAL=/opt/ghc/bin/cabal
52 - CABAL=/opt/ghc/bin/cabal
54 - CABALHOME=$HOME/.cabal
53 - CABALHOME=$HOME/.cabal
55 - export PATH="$CABALHOME/bin:$PATH"
54 - export PATH="$CABALHOME/bin:$PATH"
56 - TOP=$(pwd)
55 - TOP=$(pwd)
57− - HCNUMVER=$(( $(${HC} --numeric-version|sed -E 's/([0-9]+)\.([0-9]+)\.([0-9]+).*/\1 * 10000 + \2 * 100 + \3/') ))
56+ - "HCNUMVER=$(${HC} --numeric-version|perl -ne '/^(\\d+)\\.(\\d+)\\.(\\d+)(\\.(\\d+))?$/; print(10000 * $1 + 100 * $2 + ($3 == 0 ? $5 != 1 : $3))')"
58 - echo $HCNUMVER
57 - echo $HCNUMVER
59 - CABAL="$CABAL -vnormal+nowrap+markoutput"
58 - CABAL="$CABAL -vnormal+nowrap+markoutput"
60 - set -o pipefail
59 - set -o pipefail
@@ -81,11 +80,12 @@ install:
81 - echo "$(${HC} --version) [$(${HC} --print-project-git-commit-id 2> /dev/null || echo '?')]"
80 - echo "$(${HC} --version) [$(${HC} --print-project-git-commit-id 2> /dev/null || echo '?')]"
82 - TEST=--enable-tests
81 - TEST=--enable-tests
83 - BENCH=--enable-benchmarks
82 - BENCH=--enable-benchmarks
84− - GHCHEAD=${GHCHEAD-false}
83+ - HEADHACKAGE=false
85 - rm -f $CABALHOME/config
84 - rm -f $CABALHOME/config
86 - |
85 - |
87 echo "verbose: normal +nowrap +markoutput" >> $CABALHOME/config
86 echo "verbose: normal +nowrap +markoutput" >> $CABALHOME/config
88 echo "remote-build-reporting: anonymous" >> $CABALHOME/config
87 echo "remote-build-reporting: anonymous" >> $CABALHOME/config
88+ echo "write-ghc-environment-files: always" >> $CABALHOME/config
89 echo "remote-repo-cache: $CABALHOME/packages" >> $CABALHOME/config
89 echo "remote-repo-cache: $CABALHOME/packages" >> $CABALHOME/config
90 echo "logs-dir: $CABALHOME/logs" >> $CABALHOME/config
90 echo "logs-dir: $CABALHOME/logs" >> $CABALHOME/config
91 echo "world-file: $CABALHOME/world" >> $CABALHOME/config
91 echo "world-file: $CABALHOME/world" >> $CABALHOME/config
@@ -99,17 +99,8 @@ install:
99 echo "repository hackage.haskell.org" >> $CABALHOME/config
99 echo "repository hackage.haskell.org" >> $CABALHOME/config
100 echo " url: http://hackage.haskell.org/" >> $CABALHOME/config
100 echo " url: http://hackage.haskell.org/" >> $CABALHOME/config
101 - |
101 - |
102− if $GHCHEAD; then
102+ echo "program-default-options" >> $CABALHOME/config
103− echo "allow-newer: $($HCPKG list --simple-output | sed -E 's/([a-zA-Z-]+)-[0-9.]+/*:\1/g')" >> $CABALHOME/config
103+ echo " ghc-options: $GHCJOBS +RTS -M6G -RTS" >> $CABALHOME/config
104−
105− echo "repository head.hackage" >> $CABALHOME/config
106− echo " url: http://head.hackage.haskell.org/" >> $CABALHOME/config
107− echo " secure: True" >> $CABALHOME/config
108− echo " root-keys: 07c59cb65787dedfaef5bd5f987ceb5f7e5ebf88b904bbd4c5cbdeb2ff71b740" >> $CABALHOME/config
109− echo " 2e8555dde16ebd8df076f1a8ef13b8f14c66bad8eafefd7d9e37d0ed711821fb" >> $CABALHOME/config
110− echo " 8f79fd2389ab2967354407ec852cbe73f2e8635793ac446d09461ffb99527f6e" >> $CABALHOME/config
111− echo " key-threshold: 3" >> $CABALHOME/config
112− fi
113 - cat $CABALHOME/config
104 - cat $CABALHOME/config
114 - rm -fv cabal.project cabal.project.local cabal.project.freeze
105 - rm -fv cabal.project cabal.project.local cabal.project.freeze
115 - travis_retry ${CABAL} v2-update -v
106 - travis_retry ${CABAL} v2-update -v
@@ -117,18 +108,17 @@ install:
117 - rm -rf cabal.project cabal.project.local cabal.project.freeze
108 - rm -rf cabal.project cabal.project.local cabal.project.freeze
118 - touch cabal.project
109 - touch cabal.project
119 - |
110 - |
120− echo 'packages: "."' >> cabal.project
111+ echo "packages: ." >> cabal.project
121 - |
112 - |
122− echo "write-ghc-environment-files: always" >> cabal.project
123 - "for pkg in $($HCPKG list --simple-output); do echo $pkg | sed 's/-[^-]*$//' | (grep -vE -- '^(swagger2)$' || true) | sed 's/^/constraints: /' | sed 's/$/ installed/' >> cabal.project.local; done"
113 - "for pkg in $($HCPKG list --simple-output); do echo $pkg | sed 's/-[^-]*$//' | (grep -vE -- '^(swagger2)$' || true) | sed 's/^/constraints: /' | sed 's/$/ installed/' >> cabal.project.local; done"
124 - cat cabal.project || true
114 - cat cabal.project || true
125 - cat cabal.project.local || true
115 - cat cabal.project.local || true
126 - if [ -f "./configure.ac" ]; then (cd "." && autoreconf -i); fi
116 - if [ -f "./configure.ac" ]; then (cd "." && autoreconf -i); fi
127− - ${CABAL} v2-freeze -w ${HC} ${TEST} ${BENCH} | color_cabal_output
117+ - ${CABAL} v2-freeze $WITHCOMPILER ${TEST} ${BENCH} | color_cabal_output
128 - "cat cabal.project.freeze | sed -E 's/^(constraints: *| *)//' | sed 's/any.//'"
118 - "cat cabal.project.freeze | sed -E 's/^(constraints: *| *)//' | sed 's/any.//'"
129 - rm cabal.project.freeze
119 - rm cabal.project.freeze
130− - ${CABAL} v2-build -w ${HC} ${TEST} ${BENCH} --dep -j2 all | color_cabal_output
120+ - ${CABAL} v2-build $WITHCOMPILER ${TEST} ${BENCH} --dep -j2 all | color_cabal_output
131− - ${CABAL} v2-build -w ${HC} --disable-tests --disable-benchmarks --dep -j2 all | color_cabal_output
121+ - ${CABAL} v2-build $WITHCOMPILER --disable-tests --disable-benchmarks --dep -j2 all | color_cabal_output
132script:
122script:
133 - DISTDIR=$(mktemp -d /tmp/dist-test.XXXX)
123 - DISTDIR=$(mktemp -d /tmp/dist-test.XXXX)
134 # Packaging...
124 # Packaging...
@@ -136,32 +126,33 @@ script:
136 # Unpacking...
126 # Unpacking...
137 - mv dist-newstyle/sdist/*.tar.gz ${DISTDIR}/
127 - mv dist-newstyle/sdist/*.tar.gz ${DISTDIR}/
138 - cd ${DISTDIR} || false
128 - cd ${DISTDIR} || false
139− - find . -maxdepth 1 -name '*.tar.gz' -exec tar -xvf '{}' \;
129+ - find . -maxdepth 1 -type f -name '*.tar.gz' -exec tar -xvf '{}' \;
130+ - find . -maxdepth 1 -type f -name '*.tar.gz' -exec rm '{}' \;
131+ - PKGDIR_swagger2="$(find . -maxdepth 1 -type d -regex '.*/swagger2-[0-9.]*')"
140 # Generate cabal.project
132 # Generate cabal.project
141 - rm -rf cabal.project cabal.project.local cabal.project.freeze
133 - rm -rf cabal.project cabal.project.local cabal.project.freeze
142 - touch cabal.project
134 - touch cabal.project
143 - |
135 - |
144− echo 'packages: "swagger2-*/*.cabal"' >> cabal.project
136+ echo "packages: ${PKGDIR_swagger2}" >> cabal.project
145 - |
137 - |
146− echo "write-ghc-environment-files: always" >> cabal.project
147 - "for pkg in $($HCPKG list --simple-output); do echo $pkg | sed 's/-[^-]*$//' | (grep -vE -- '^(swagger2)$' || true) | sed 's/^/constraints: /' | sed 's/$/ installed/' >> cabal.project.local; done"
138 - "for pkg in $($HCPKG list --simple-output); do echo $pkg | sed 's/-[^-]*$//' | (grep -vE -- '^(swagger2)$' || true) | sed 's/^/constraints: /' | sed 's/$/ installed/' >> cabal.project.local; done"
148 - cat cabal.project || true
139 - cat cabal.project || true
149 - cat cabal.project.local || true
140 - cat cabal.project.local || true
150 # Building...
141 # Building...
151 # this builds all libraries and executables (without tests/benchmarks)
142 # this builds all libraries and executables (without tests/benchmarks)
152− - ${CABAL} v2-build -w ${HC} --disable-tests --disable-benchmarks all | color_cabal_output
143+ - ${CABAL} v2-build $WITHCOMPILER --disable-tests --disable-benchmarks all | color_cabal_output
153 # Building with tests and benchmarks...
144 # Building with tests and benchmarks...
154 # build & run tests, build benchmarks
145 # build & run tests, build benchmarks
155− - ${CABAL} v2-build -w ${HC} ${TEST} ${BENCH} all | color_cabal_output
146+ - ${CABAL} v2-build $WITHCOMPILER ${TEST} ${BENCH} all | color_cabal_output
156 # Testing...
147 # Testing...
157− - ${CABAL} v2-test -w ${HC} ${TEST} ${BENCH} all | color_cabal_output
148+ - ${CABAL} v2-test $WITHCOMPILER ${TEST} ${BENCH} all | color_cabal_output
158 # cabal check...
149 # cabal check...
159− - (cd swagger2-* && ${CABAL} -vnormal check)
150+ - (cd ${PKGDIR_swagger2} && ${CABAL} -vnormal check)
160 # haddock...
151 # haddock...
161− - if [ $HCNUMVER -ge 80400 ] ; then ${CABAL} v2-haddock -w ${HC} ${TEST} ${BENCH} all | color_cabal_output ; fi
152+ - if [ $HCNUMVER -ge 80400 ] ; then ${CABAL} v2-haddock $WITHCOMPILER --with-haddock $HADDOCK ${TEST} ${BENCH} all | color_cabal_output ; fi
162 # Building without installed constraints for packages in global-db...
153 # Building without installed constraints for packages in global-db...
163 - rm -f cabal.project.local
154 - rm -f cabal.project.local
164− - ${CABAL} v2-build -w ${HC} --disable-tests --disable-benchmarks all | color_cabal_output
155+ - ${CABAL} v2-build $WITHCOMPILER --disable-tests --disable-benchmarks all | color_cabal_output
165
156
166# REGENDATA ["--branches","master","--haddock-jobs=>=8.4","--output",".travis.yml","swagger2.cabal"]
157# REGENDATA ["--branches","master","--haddock-jobs=>=8.4","--output",".travis.yml","swagger2.cabal"]
167# EOF
158# EOF
src/Data/Swagger/Internal/Schema/Validation.hs+92−6
@@ -22,23 +22,27 @@
22-- Validate JSON values with Swagger Schema.
22-- Validate JSON values with Swagger Schema.
23module Data.Swagger.Internal.Schema.Validation where
23module Data.Swagger.Internal.Schema.Validation where
24
24
25+import Prelude ()
26+import Prelude.Compat
27+
25import Control.Applicative
28import Control.Applicative
26import Control.Lens
29import Control.Lens
27import Control.Monad (when)
30import Control.Monad (when)
28
31
29import Data.Aeson hiding (Result)
32import Data.Aeson hiding (Result)
33+import Data.Aeson.Encode.Pretty (encodePretty)
30import Data.Foldable (for_, sequenceA_,
34import Data.Foldable (for_, sequenceA_,
31 traverse_)
35 traverse_)
32import Data.HashMap.Strict (HashMap)
36import Data.HashMap.Strict (HashMap)
33import qualified Data.HashMap.Strict as HashMap
37import qualified Data.HashMap.Strict as HashMap
34import qualified Data.HashMap.Strict.InsOrd as InsOrdHashMap
38import qualified Data.HashMap.Strict.InsOrd as InsOrdHashMap
35import qualified "unordered-containers" Data.HashSet as HashSet
39import qualified "unordered-containers" Data.HashSet as HashSet
36−import Data.List (intercalate)
37−import Data.Monoid
38import Data.Proxy
40import Data.Proxy
39import Data.Scientific (Scientific, isInteger)
41import Data.Scientific (Scientific, isInteger)
40import Data.Text (Text)
42import Data.Text (Text)
41import qualified Data.Text as Text
43import qualified Data.Text as Text
44+import qualified Data.Text.Lazy as TL
45+import qualified Data.Text.Lazy.Encoding as TL
42import Data.Vector (Vector)
46import Data.Vector (Vector)
43import qualified Data.Vector as Vector
47import qualified Data.Vector as Vector
44
48
@@ -54,18 +58,101 @@ import Data.Swagger.Lens
54--
58--
55-- /NOTE:/ @'validateToJSON'@ does not perform string pattern validation.
59-- /NOTE:/ @'validateToJSON'@ does not perform string pattern validation.
56-- See @'validateToJSONWithPatternChecker'@.
60-- See @'validateToJSONWithPatternChecker'@.
61+--
62+-- See 'renderValidationErrors' on how the output is structured.
63+validatePrettyToJSON :: forall a. (ToJSON a, ToSchema a) => a -> Maybe String
64+validatePrettyToJSON = renderValidationErrors validateToJSON
65+
66+-- | Variant of 'validatePrettyToJSON' with typed output.
57validateToJSON :: forall a. (ToJSON a, ToSchema a) => a -> [ValidationError]
67validateToJSON :: forall a. (ToJSON a, ToSchema a) => a -> [ValidationError]
58validateToJSON = validateToJSONWithPatternChecker (\_pattern _str -> True)
68validateToJSON = validateToJSONWithPatternChecker (\_pattern _str -> True)
59
69
60-- | Validate @'ToJSON'@ instance matches @'ToSchema'@ for a given value and pattern checker.
70-- | Validate @'ToJSON'@ instance matches @'ToSchema'@ for a given value and pattern checker.
61-- This can be used with QuickCheck to ensure those instances are coherent.
71-- This can be used with QuickCheck to ensure those instances are coherent.
62--
72--
63−-- For validation without patterns see @'validateToJSON'@.
73+-- For validation without patterns see @'validateToJSON'@. See also:
74+-- 'renderValidationErrors'.
64validateToJSONWithPatternChecker :: forall a. (ToJSON a, ToSchema a) => (Pattern -> Text -> Bool) -> a -> [ValidationError]
75validateToJSONWithPatternChecker :: forall a. (ToJSON a, ToSchema a) => (Pattern -> Text -> Bool) -> a -> [ValidationError]
65validateToJSONWithPatternChecker checker = validateJSONWithPatternChecker checker defs sch . toJSON
76validateToJSONWithPatternChecker checker = validateJSONWithPatternChecker checker defs sch . toJSON
66 where
77 where
67 (defs, sch) = runDeclare (declareSchema (Proxy :: Proxy a)) mempty
78 (defs, sch) = runDeclare (declareSchema (Proxy :: Proxy a)) mempty
68
79
80+-- | Pretty print validation errors
81+-- together with actual JSON and Swagger Schema
82+-- (using 'encodePretty').
83+--
84+-- >>> import Data.Aeson as Aeson
85+-- >>> import Data.Foldable (traverse_)
86+-- >>> import GHC.Generics
87+-- >>> data Phone = Phone { value :: String } deriving (Generic)
88+-- >>> data Person = Person { name :: String, phone :: Phone } deriving (Generic)
89+-- >>> instance ToJSON Person where toJSON p = object [ "name" Aeson..= name p ]
90+-- >>> instance ToSchema Phone
91+-- >>> instance ToSchema Person
92+-- >>> let person = Person { name = "John", phone = Phone "123456" }
93+-- >>> traverse_ putStrLn $ renderValidationErrors validateToJSON person
94+-- Validation against the schema fails:
95+-- * property "phone" is required, but not found in "{\"name\":\"John\"}"
96+-- <BLANKLINE>
97+-- JSON value:
98+-- {
99+-- "name": "John"
100+-- }
101+-- <BLANKLINE>
102+-- Swagger Schema:
103+-- {
104+-- "required": [
105+-- "name",
106+-- "phone"
107+-- ],
108+-- "type": "object",
109+-- "properties": {
110+-- "phone": {
111+-- "$ref": "#/definitions/Phone"
112+-- },
113+-- "name": {
114+-- "type": "string"
115+-- }
116+-- }
117+-- }
118+-- <BLANKLINE>
119+-- Swagger Description Context:
120+-- {
121+-- "Phone": {
122+-- "required": [
123+-- "value"
124+-- ],
125+-- "type": "object",
126+-- "properties": {
127+-- "value": {
128+-- "type": "string"
129+-- }
130+-- }
131+-- }
132+-- }
133+-- <BLANKLINE>
134+renderValidationErrors
135+ :: forall a. (ToJSON a, ToSchema a)
136+ => (a -> [ValidationError]) -> a -> Maybe String
137+renderValidationErrors f x =
138+ case f x of
139+ [] -> Nothing
140+ errors -> Just $ unlines
141+ [ "Validation against the schema fails:"
142+ , unlines (map (" * " ++) errors)
143+ , "JSON value:"
144+ , ppJSONString (toJSON x)
145+ , ""
146+ , "Swagger Schema:"
147+ , ppJSONString (toJSON schema_)
148+ , ""
149+ , "Swagger Description Context:"
150+ , ppJSONString (toJSON refs_)
151+ ]
152+ where
153+ ppJSONString = TL.unpack . TL.decodeUtf8 . encodePretty
154+ (refs_, schema_) = runDeclare (declareSchema (Proxy :: Proxy a)) mempty
155+
69-- | Validate JSON @'Value'@ against Swagger @'Schema'@.
156-- | Validate JSON @'Value'@ against Swagger @'Schema'@.
70--
157--
71-- prop> validateJSON mempty (toSchema (Proxy :: Proxy Int)) (toJSON (x :: Int)) == []
158-- prop> validateJSON mempty (toSchema (Proxy :: Proxy Int)) (toJSON (x :: Int)) == []
@@ -397,7 +484,7 @@ validateSchemaType value = withSchema $ \sch ->
397 (Nothing, String s) -> sub_ paramSchema (validateString s)
484 (Nothing, String s) -> sub_ paramSchema (validateString s)
398 (Nothing, Array xs) -> sub_ paramSchema (validateArray xs)
485 (Nothing, Array xs) -> sub_ paramSchema (validateArray xs)
399 (Nothing, Object o) -> validateObject o
486 (Nothing, Object o) -> validateObject o
400− param@(t, _) -> invalid $ "expected JSON value of type " ++ showType param
487+ bad -> invalid $ "expected JSON value of type " ++ showType bad
401
488
402validateParamSchemaType :: Value -> Validation (ParamSchema t) ()
489validateParamSchemaType :: Value -> Validation (ParamSchema t) ()
403validateParamSchemaType value = withSchema $ \sch ->
490validateParamSchemaType value = withSchema $ \sch ->
@@ -412,8 +499,7 @@ validateParamSchemaType value = withSchema $ \sch ->
412 (Nothing, Number n) -> validateNumber n
499 (Nothing, Number n) -> validateNumber n
413 (Nothing, String s) -> validateString s
500 (Nothing, String s) -> validateString s
414 (Nothing, Array xs) -> validateArray xs
501 (Nothing, Array xs) -> validateArray xs
415− (t, _) -> invalid $ "expected JSON value of type " ++ show t
416− param@(t, _) -> invalid $ "expected JSON value of type " ++ showType param
502+ bad -> invalid $ "expected JSON value of type " ++ showType bad
417
503
418showType :: (Maybe (SwaggerType t), Value) -> String
504showType :: (Maybe (SwaggerType t), Value) -> String
419showType (Just type_, _) = show type_
505showType (Just type_, _) = show type_
src/Data/Swagger/Schema/Validation.hs+2
@@ -19,8 +19,10 @@ module Data.Swagger.Schema.Validation (
19 ValidationError,
19 ValidationError,
20
20
21 -- ** Using 'ToJSON' and 'ToSchema'
21 -- ** Using 'ToJSON' and 'ToSchema'
22+ validatePrettyToJSON,
22 validateToJSON,
23 validateToJSON,
23 validateToJSONWithPatternChecker,
24 validateToJSONWithPatternChecker,
25+ renderValidationErrors,
24
26
25 -- ** Using 'Value' and 'Schema'
27 -- ** Using 'Value' and 'Schema'
26 validateJSON,
28 validateJSON,
swagger2.cabal+6−4
@@ -1,6 +1,7 @@
1cabal-version: >=1.10
1cabal-version: >=1.10
2name: swagger2
2name: swagger2
3version: 2.4
3version: 2.4
4+x-revision: 1
4
5
5synopsis: Swagger 2.0 data model
6synopsis: Swagger 2.0 data model
6category: Web, Swagger
7category: Web, Swagger
@@ -61,10 +62,11 @@ library
61
62
62 -- GHC boot libraries
63 -- GHC boot libraries
63 build-depends:
64 build-depends:
64− base >=4.7 && <4.13
65+ base >=4.7 && <4.14
66+ , aeson-pretty >=0.8.7 && <0.9
65 , bytestring >=0.10.4.0 && <0.11
67 , bytestring >=0.10.4.0 && <0.11
66 , containers >=0.5.5.1 && <0.7
68 , containers >=0.5.5.1 && <0.7
67− , template-haskell >=2.9.0.0 && <2.15
69+ , template-haskell >=2.9.0.0 && <2.16
68 , time >=1.4.2 && <1.10
70 , time >=1.4.2 && <1.10
69 , transformers >=0.3.0.0 && <0.6
71 , transformers >=0.3.0.0 && <0.6
70
72
@@ -74,7 +76,7 @@ library
74
76
75 -- other dependencies
77 -- other dependencies
76 build-depends:
78 build-depends:
77− base-compat-batteries >=0.10.4 && <0.11
79+ base-compat-batteries >=0.10.4 && <0.12
78 , aeson >=1.4.2.0 && <1.5
80 , aeson >=1.4.2.0 && <1.5
79 -- cookie 0.4.3 is needed by GHC 7.8 due to time>=1.4 constraint
81 -- cookie 0.4.3 is needed by GHC 7.8 due to time>=1.4 constraint
80 , cookie >=0.4.3 && <0.5
82 , cookie >=0.4.3 && <0.5
@@ -82,7 +84,7 @@ library
82 , hashable >=1.2.7.0 && <1.4
84 , hashable >=1.2.7.0 && <1.4
83 , http-media >=0.7.1.2 && <0.9
85 , http-media >=0.7.1.2 && <0.9
84 , insert-ordered-containers >=0.2.2 && <0.3
86 , insert-ordered-containers >=0.2.2 && <0.3
85− , lens >=4.16.1 && <4.18
87+ , lens >=4.16.1 && <4.19
86 , network >=2.6.3.5 && <3.2
88 , network >=2.6.3.5 && <3.2
87 , scientific >=0.3.6.2 && <0.4
89 , scientific >=0.3.6.2 && <0.4
88 , transformers-compat >=0.3 && <0.7
90 , transformers-compat >=0.3 && <0.7
test/Data/Swagger/CommonTestTypes.hs−2
@@ -18,8 +18,6 @@ import qualified Data.Text as Text
18import GHC.Generics
18import GHC.Generics
19
19
20import Data.Swagger
20import Data.Swagger
21−import Data.Swagger.Declare
22−import Data.Swagger.Internal (SwaggerKind (..))
23
21
24-- ========================================================================
22-- ========================================================================
25-- Unit type
23-- Unit type
test/Data/Swagger/SchemaSpec.hs+1−8
@@ -1,25 +1,18 @@
1{-# LANGUAGE DeriveGeneric #-}
1{-# LANGUAGE DeriveGeneric #-}
2−{-# LANGUAGE DataKinds #-}
3{-# LANGUAGE ScopedTypeVariables #-}
2{-# LANGUAGE ScopedTypeVariables #-}
4{-# LANGUAGE TemplateHaskell #-}
3{-# LANGUAGE TemplateHaskell #-}
5{-# LANGUAGE QuasiQuotes #-}
4{-# LANGUAGE QuasiQuotes #-}
6−{-# LANGUAGE OverloadedStrings #-}
7module Data.Swagger.SchemaSpec where
5module Data.Swagger.SchemaSpec where
8
6
9import Prelude ()
7import Prelude ()
10import Prelude.Compat
8import Prelude.Compat
11
9
12import Control.Lens ((^.))
10import Control.Lens ((^.))
13−import Data.Aeson (Value, ToJSON(..), ToJSONKey(..), Value(Object), Value(String))
11+import Data.Aeson (Value)
14−import Data.Aeson.Types (toJSONKeyText)
15−import Data.Aeson.QQ.Simple
16−import Data.Char
17import qualified Data.HashMap.Strict.InsOrd as InsOrdHashMap
12import qualified Data.HashMap.Strict.InsOrd as InsOrdHashMap
18import Data.Proxy
13import Data.Proxy
19import Data.Set (Set)
14import Data.Set (Set)
20−import Data.Map (Map)
21import qualified Data.Text as Text
15import qualified Data.Text as Text
22−import GHC.Generics
23
16
24import Data.Swagger
17import Data.Swagger
25import Data.Swagger.Declare
18import Data.Swagger.Declare