git.iko.soy/typeable/openapi3
on master help sign in
GHC-8.4.1 support
0a24be9Oleg Grenrus
.travis.yml+58−46
@@ -1,6 +1,6 @@
1# This Travis job script has been generated by a script via
1# This Travis job script has been generated by a script via
2#
2#
3−# make_travis_yml_2.hs '--branch' 'master' 'swagger2.cabal'
3+# runghc make_travis_yml_2.hs '--branch' 'master' '--output' '.travis.yml' 'swagger2.cabal'
4#
4#
5# For more information, see https://github.com/hvr/multi-ghc-travis
5# For more information, see https://github.com/hvr/multi-ghc-travis
6#
6#
@@ -28,6 +28,8 @@ before_cache:
28 - rm -fv $HOME/.cabal/packages/hackage.haskell.org/01-index.tar
28 - rm -fv $HOME/.cabal/packages/hackage.haskell.org/01-index.tar
29 - rm -fv $HOME/.cabal/packages/hackage.haskell.org/01-index.tar.idx
29 - rm -fv $HOME/.cabal/packages/hackage.haskell.org/01-index.tar.idx
30
30
31+ - rm -rfv $HOME/.cabal/packages/head.hackage
32+
31matrix:
33matrix:
32 include:
34 include:
33 - compiler: "ghc-7.8.4"
35 - compiler: "ghc-7.8.4"
@@ -42,62 +44,72 @@ matrix:
42 # env: TEST=--disable-tests BENCH=--disable-benchmarks
44 # env: TEST=--disable-tests BENCH=--disable-benchmarks
43 env: HADDOCK=false
45 env: HADDOCK=false
44 addons: {apt: {packages: [ghc-ppa-tools,cabal-install-head,ghc-8.0.2], sources: [hvr-ghc]}}
46 addons: {apt: {packages: [ghc-ppa-tools,cabal-install-head,ghc-8.0.2], sources: [hvr-ghc]}}
45− - compiler: "ghc-8.2.1"
47+ - compiler: "ghc-8.2.2"
48+ # env: TEST=--disable-tests BENCH=--disable-benchmarks
49+ addons: {apt: {packages: [ghc-ppa-tools,cabal-install-head,ghc-8.2.2], sources: [hvr-ghc]}}
50+ - compiler: "ghc-8.4.1"
46 # env: TEST=--disable-tests BENCH=--disable-benchmarks
51 # env: TEST=--disable-tests BENCH=--disable-benchmarks
47− addons: {apt: {packages: [ghc-ppa-tools,cabal-install-head,ghc-8.2.1], sources: [hvr-ghc]}}
52+ addons: {apt: {packages: [ghc-ppa-tools,cabal-install-head,ghc-8.4.1], sources: [hvr-ghc]}}
48
53
49before_install:
54before_install:
50− - HC=${CC}
55+ - HC=${CC}
56+ - HCPKG=${HC/ghc/ghc-pkg}
51− - unset CC
57+ - unset CC
58+ - ROOTDIR=$(pwd)
59+ - mkdir -p $HOME/.local/bin
52− - PATH=/opt/ghc/bin:/opt/ghc-ppa-tools/bin:$PATH
60+ - "PATH=/opt/ghc/bin:/opt/ghc-ppa-tools/bin:$HOME/local/bin:$PATH"
53− - PKGNAME='swagger2'
61+ - HCNUMVER=$(( $(${HC} --numeric-version|sed -E 's/([0-9]+)\.([0-9]+)\.([0-9]+).*/\1 * 10000 + \2 * 100 + \3/') ))
62+ - echo $HCNUMVER
54
63
55install:
64install:
56− - cabal --version
65+ - cabal --version
57− - echo "$(${HC} --version) [$(${HC} --print-project-git-commit-id 2> /dev/null || echo '?')]"
66+ - echo "$(${HC} --version) [$(${HC} --print-project-git-commit-id 2> /dev/null || echo '?')]"
58− - BENCH=${BENCH---enable-benchmarks}
67+ - BENCH=${BENCH---enable-benchmarks}
59− - TEST=${TEST---enable-tests}
68+ - TEST=${TEST---enable-tests}
60− - HADDOCK=${HADDOCK-true}
69+ - HADDOCK=${HADDOCK-true}
61− - INSTALLED=${INSTALLED-true}
70+ - INSTALLED=${INSTALLED-true}
71+ - GHCHEAD=${GHCHEAD-false}
62− - travis_retry cabal update -v
72+ - travis_retry cabal update -v
63− - sed -i 's/^jobs:/-- jobs:/' ${HOME}/.cabal/config
73+ - "sed -i.bak 's/^jobs:/-- jobs:/' ${HOME}/.cabal/config"
64− - rm -fv cabal.project.local
74+ - rm -fv cabal.project cabal.project.local
75+ - grep -Ev -- '^\s*--' ${HOME}/.cabal/config | grep -Ev '^\s*$'
65− - "echo 'packages: .' > cabal.project"
76+ - "printf 'packages: \".\"\\n' > cabal.project"
77+ - cat cabal.project
78+ - if [ -f "./configure.ac" ]; then
79+ (cd "." && autoreconf -i);
80+ fi
66− - rm -f cabal.project.freeze
81+ - rm -f cabal.project.freeze
67− - cabal new-build -w ${HC} ${TEST} ${BENCH} --dep -j2 all
82+ - cabal new-build -w ${HC} ${TEST} ${BENCH} --project-file="cabal.project" --dep -j2 all
68− - cabal new-build -w ${HC} --disable-tests --disable-benchmarks --dep -j2 all
83+ - cabal new-build -w ${HC} --disable-tests --disable-benchmarks --project-file="cabal.project" --dep -j2 all
84+ - rm -rf .ghc.environment.* "."/dist
85+ - DISTDIR=$(mktemp -d /tmp/dist-test.XXXX)
69
86
70# Here starts the actual work to be performed for the package under test;
87# Here starts the actual work to be performed for the package under test;
71# any command which exits with a non-zero exit code causes the build to fail.
88# any command which exits with a non-zero exit code causes the build to fail.
72script:
89script:
73− - if [ -f configure.ac ]; then autoreconf -i; fi
74− - rm -rf .ghc.environment.* dist/
75− - cabal sdist # test that a source-distribution can be generated
90+ # test that source-distributions can be generated
76− - cd dist/
91+ - (cd "." && cabal sdist)
77− - SRCTAR=(${PKGNAME}-*.tar.gz)
92+ - mv "."/dist/swagger2-*.tar.gz ${DISTDIR}/
78− - SRC_BASENAME="${SRCTAR/%.tar.gz}"
93+ - cd ${DISTDIR} || false
79− - tar -xvf "./$SRC_BASENAME.tar.gz"
94+ - find . -maxdepth 1 -name '*.tar.gz' -exec tar -xvf '{}' \;
80− - cd "$SRC_BASENAME/"
81−## from here on, CWD is inside the extracted source-tarball
82− - rm -fv cabal.project.local
83− - "echo 'packages: .' > cabal.project"
95+ - "printf 'packages: swagger2-*/*.cabal\\n' > cabal.project"
96+ - cat cabal.project
84− # this builds all libraries and executables (without tests/benchmarks)
97+ # this builds all libraries and executables (without tests/benchmarks)
85− - rm -f cabal.project.freeze
98+ - cabal new-build -w ${HC} --disable-tests --disable-benchmarks all
86− - cabal new-build -w ${HC} --disable-tests --disable-benchmarks all
99+
87− # this builds all libraries and executables (including tests/benchmarks)
100+ # Build with installed constraints for packages in global-db
88− # - rm -rf ./dist-newstyle
101+ - if $INSTALLED; then echo cabal new-build -w ${HC} --disable-tests --disable-benchmarks $(${HCPKG} list --global --simple-output --names-only | sed 's/\([a-zA-Z0-9-]\{1,\}\) */--constraint="\1 installed" /g') all | sh; else echo "Not building with installed constraints"; fi
89
102
90− # Build with installed constraints for packages in global-db
103+ # build & run tests, build benchmarks
91− - if $INSTALLED; then
104+ - cabal new-build -w ${HC} ${TEST} ${BENCH} all
92− ghc-pkg list --simple-output --names-only | sed -r 's/([a-zA-Z0-9-]+*) */--constraint=\1 installed;/g' | sed 's/;$/;all/' | xargs -d ';' cabal new-build -w ${HC} --disable-tests --disable-benchmarks;
105+ - if [ "x$TEST" = "x--enable-tests" ]; then cabal new-test -w ${HC} ${TEST} ${BENCH} all; fi
93− else echo "Not building with installed constraints"; fi
94
106
95− # build & run tests, build benchmarks
107+ # cabal check
96− - cabal new-build -w ${HC} ${TEST} ${BENCH} all
108+ - (cd swagger2-* && cabal check)
97− - if [ "x$TEST" = "x--enable-tests" ]; then cabal new-test -w ${HC} ${TEST} all; fi
98
109
99− # haddock
110+ # haddock
100− - rm -rf ./dist-newstyle
111+ - rm -rf ./dist-newstyle
101− - if $HADDOCK; then cabal new-haddock -w ${HC} --disable-tests --disable-benchmarks all; else echo "Skipping haddock generation";fi
112+ - if $HADDOCK; then cabal new-haddock -w ${HC} ${TEST} ${BENCH} all; else echo "Skipping haddock generation";fi
102
113
114+# REGENDATA ["--branch","master","--output",".travis.yml","swagger2.cabal"]
103# EOF
115# EOF
CHANGELOG.md+6
@@ -1,3 +1,9 @@
1+next
2+----
3+
4+* Add `Semigroup` instances
5+* GHC-8.4 compatibility
6+
12.2
72.2
2---
8---
3
9
hackage-docs.shnew file+78
@@ -0,0 +1,78 @@
1+#!/bin/bash
2+set -e
3+
4+# This if stack-enabled fork of https://github.com/ekmett/lens/blob/master/scripts/hackage-docs.sh
5+
6+if [ "$#" -ne 1 ]; then
7+ echo "Usage: scripts/hackage-docs.sh HACKAGE_USER"
8+ exit 1
9+fi
10+
11+user=$1
12+
13+cabal_file=$(find . -maxdepth 1 -name "*.cabal" -print -quit)
14+if [ ! -f "$cabal_file" ]; then
15+ echo "Run this script in the top-level package directory"
16+ exit 1
17+fi
18+
19+pkg=$(awk -F ":[[:space:]]*" 'tolower($1)=="name" { print $2 }' < "$cabal_file")
20+ver=$(awk -F ":[[:space:]]*" 'tolower($1)=="version" { print $2 }' < "$cabal_file")
21+
22+if [ -z "$pkg" ]; then
23+ echo "Unable to determine package name"
24+ exit 1
25+fi
26+
27+if [ -z "$ver" ]; then
28+ echo "Unable to determine package version"
29+ exit 1
30+fi
31+
32+echo "Detected package: $pkg-$ver"
33+
34+dir=$(mktemp -d build-docs.XXXXXX)
35+trap 'rm -r "$dir"' EXIT
36+
37+export PATH=$(stack path --bin-path)
38+
39+ghc --version
40+cabal --version
41+stack --version
42+
43+if haddock --hyperlinked-source >/dev/null
44+then
45+ echo "Using fancy hyperlinked source"
46+ HYPERLINK_FLAG="--haddock-option=--hyperlinked-source"
47+else
48+ echo "Using boring hyperlinked source"
49+ HYPERLINK_FLAG="--hyperlink-source"
50+fi
51+
52+# Cabal dist in temporary location
53+builddir=$dir/dist
54+
55+# Build dependencies haddocks with stack, so we get links
56+stack haddock --only-dependencies
57+
58+# Configure using stack databases
59+snapshotpkgdb=$(stack path --snapshot-pkg-db)
60+localpkgdb=$(stack path --local-pkg-db)
61+cabal configure -v2 --builddir=$builddir --package-db=clear --package-db=global --package-db=$snapshotpkgdb --package-db=$localpkgdb
62+
63+# Build Hadckage compatible docs
64+cabal haddock -v2 --builddir=$builddir $HYPERLINK_FLAG --html-location='/package/$pkg-$version/docs' --contents-location='/package/$pkg-$version'
65+
66+# Copy into right directory
67+cp -R $builddir/doc/html/$pkg/ $dir/$pkg-$ver-docs
68+
69+# Tar and gzip
70+tar cvz -C $dir --format=ustar -f $dir/$pkg-$ver-docs.tar.gz $pkg-$ver-docs
71+
72+# Upload
73+curl -X PUT \
74+ -H 'Content-Type: application/x-tar' \
75+ -H 'Content-Encoding: gzip' \
76+ -u "$user" \
77+ --data-binary "@$dir/$pkg-$ver-docs.tar.gz" \
78+ "https://hackage.haskell.org/package/$pkg-$ver/docs"
src/Data/Swagger/Internal.hs+47−18
@@ -32,7 +32,8 @@ import Data.Data (Data(..), Typeable, mkConstr, mkDataT
32import qualified Data.HashMap.Strict as HashMap
32import qualified Data.HashMap.Strict as HashMap
33import Data.Map (Map)
33import Data.Map (Map)
34import qualified Data.Map as Map
34import qualified Data.Map as Map
35−import Data.Monoid
35+import Data.Monoid (Monoid (..))
36+import Data.Semigroup (Semigroup (..))
36import Data.Scientific (Scientific)
37import Data.Scientific (Scientific)
37import Data.Set (Set)
38import Data.Set (Set)
38import Data.String (IsString(..))
39import Data.String (IsString(..))
@@ -303,7 +304,7 @@ data Operation = Operation
303 } deriving (Eq, Show, Generic, Data, Typeable)
304 } deriving (Eq, Show, Generic, Data, Typeable)
304
305
305newtype MimeList = MimeList { getMimeList :: [MediaType] }
306newtype MimeList = MimeList { getMimeList :: [MediaType] }
306− deriving (Eq, Show, Monoid, Typeable)
307+ deriving (Eq, Show, Semigroup, Monoid, Typeable)
307
308
308mimeListConstr :: Constr
309mimeListConstr :: Constr
309mimeListConstr = mkConstr mimeListDataType "MimeList" ["getMimeList"] Prefix
310mimeListConstr = mkConstr mimeListDataType "MimeList" ["getMimeList"] Prefix
@@ -754,7 +755,7 @@ data SecurityScheme = SecurityScheme
754-- (that is, there is a logical AND between the schemes).
755-- (that is, there is a logical AND between the schemes).
755newtype SecurityRequirement = SecurityRequirement
756newtype SecurityRequirement = SecurityRequirement
756 { getSecurityRequirement :: InsOrdHashMap Text [Text]
757 { getSecurityRequirement :: InsOrdHashMap Text [Text]
757− } deriving (Eq, Read, Show, Monoid, ToJSON, FromJSON, Data, Typeable)
758+ } deriving (Eq, Read, Show, Semigroup, Monoid, ToJSON, FromJSON, Data, Typeable)
758
759
759-- | Tag name.
760-- | Tag name.
760type TagName = Text
761type TagName = Text
@@ -805,61 +806,89 @@ newtype URL = URL { getUrl :: Text } deriving (Eq, Ord, Show, ToJSON, FromJSON,
805-- Monoid instances
806-- Monoid instances
806-- =======================================================================
807-- =======================================================================
807
808
809+instance Semigroup Swagger where
810+ (<>) = genericMappend
808instance Monoid Swagger where
811instance Monoid Swagger where
809 mempty = genericMempty
812 mempty = genericMempty
810− mappend = genericMappend
813+ mappend = (<>)
811
814
815+instance Semigroup Info where
816+ (<>) = genericMappend
812instance Monoid Info where
817instance Monoid Info where
813 mempty = genericMempty
818 mempty = genericMempty
814− mappend = genericMappend
819+ mappend = (<>)
815
820
821+instance Semigroup Contact where
822+ (<>) = genericMappend
816instance Monoid Contact where
823instance Monoid Contact where
817 mempty = genericMempty
824 mempty = genericMempty
818− mappend = genericMappend
825+ mappend = (<>)
819
826
827+instance Semigroup PathItem where
828+ (<>) = genericMappend
820instance Monoid PathItem where
829instance Monoid PathItem where
821 mempty = genericMempty
830 mempty = genericMempty
822− mappend = genericMappend
831+ mappend = (<>)
823
832
833+instance Semigroup Schema where
834+ (<>) = genericMappend
824instance Monoid Schema where
835instance Monoid Schema where
825 mempty = genericMempty
836 mempty = genericMempty
826− mappend = genericMappend
837+ mappend = (<>)
827
838
839+instance Semigroup (ParamSchema t) where
840+ (<>) = genericMappend
828instance Monoid (ParamSchema t) where
841instance Monoid (ParamSchema t) where
829 mempty = genericMempty
842 mempty = genericMempty
830− mappend = genericMappend
843+ mappend = (<>)
831
844
845+instance Semigroup Param where
846+ (<>) = genericMappend
832instance Monoid Param where
847instance Monoid Param where
833 mempty = genericMempty
848 mempty = genericMempty
834− mappend = genericMappend
849+ mappend = (<>)
835
850
851+instance Semigroup ParamOtherSchema where
852+ (<>) = genericMappend
836instance Monoid ParamOtherSchema where
853instance Monoid ParamOtherSchema where
837 mempty = genericMempty
854 mempty = genericMempty
838− mappend = genericMappend
855+ mappend = (<>)
839
856
857+instance Semigroup Header where
858+ (<>) = genericMappend
840instance Monoid Header where
859instance Monoid Header where
841 mempty = genericMempty
860 mempty = genericMempty
842− mappend = genericMappend
861+ mappend = (<>)
843
862
863+instance Semigroup Responses where
864+ (<>) = genericMappend
844instance Monoid Responses where
865instance Monoid Responses where
845 mempty = genericMempty
866 mempty = genericMempty
846− mappend = genericMappend
867+ mappend = (<>)
847
868
869+instance Semigroup Response where
870+ (<>) = genericMappend
848instance Monoid Response where
871instance Monoid Response where
849 mempty = genericMempty
872 mempty = genericMempty
850− mappend = genericMappend
873+ mappend = (<>)
851
874
875+instance Semigroup ExternalDocs where
876+ (<>) = genericMappend
852instance Monoid ExternalDocs where
877instance Monoid ExternalDocs where
853 mempty = genericMempty
878 mempty = genericMempty
854− mappend = genericMappend
879+ mappend = (<>)
855
880
881+instance Semigroup Operation where
882+ (<>) = genericMappend
856instance Monoid Operation where
883instance Monoid Operation where
857 mempty = genericMempty
884 mempty = genericMempty
858− mappend = genericMappend
885+ mappend = (<>)
859
886
887+instance Semigroup Example where
888+ (<>) = genericMappend
860instance Monoid Example where
889instance Monoid Example where
861 mempty = genericMempty
890 mempty = genericMempty
862− mappend = genericMappend
891+ mappend = (<>)
863
892
864-- =======================================================================
893-- =======================================================================
865-- SwaggerMonoid helper instances
894-- SwaggerMonoid helper instances
@@ -893,7 +922,7 @@ instance OVERLAPPING_ SwaggerMonoid (InsOrdHashMap FilePath PathItem) where
893
922
894instance Monoid a => SwaggerMonoid (Referenced a) where
923instance Monoid a => SwaggerMonoid (Referenced a) where
895 swaggerMempty = Inline mempty
924 swaggerMempty = Inline mempty
896− swaggerMappend (Inline x) (Inline y) = Inline (x <> y)
925+ swaggerMappend (Inline x) (Inline y) = Inline (mappend x y)
897 swaggerMappend _ y = y
926 swaggerMappend _ y = y
898
927
899instance SwaggerMonoid ParamAnySchema where
928instance SwaggerMonoid ParamAnySchema where
swagger2.cabal+2−2
@@ -21,7 +21,7 @@ extra-source-files:
21 , examples/*.hs
21 , examples/*.hs
22 , include/overlapping-compat.h
22 , include/overlapping-compat.h
23cabal-version: >=1.10
23cabal-version: >=1.10
24−tested-with: GHC==7.8.4, GHC==7.10.3, GHC==8.0.2, GHC==8.2.1
24+tested-with: GHC==7.8.4, GHC==7.10.3, GHC==8.0.2, GHC==8.2.2, GHC==8.4.1
25
25
26custom-setup
26custom-setup
27 setup-depends:
27 setup-depends:
@@ -48,7 +48,7 @@ library
48 Data.Swagger.Internal.Utils
48 Data.Swagger.Internal.Utils
49 Data.Swagger.Internal.AesonUtils
49 Data.Swagger.Internal.AesonUtils
50 Data.Swagger.Internal.TypeShape
50 Data.Swagger.Internal.TypeShape
51− build-depends: base >=4.7 && <4.11
51+ build-depends: base >=4.7 && <4.12
52 , base-compat >=0.9.1 && <0.10
52 , base-compat >=0.9.1 && <0.10
53 , aeson >=0.11.2.1
53 , aeson >=0.11.2.1
54 , bytestring
54 , bytestring