git.iko.soy/typeable/openapi3
on master help sign in
GHC-8.4.1 support
commit0a24be9a627701ab4ad986ae2719aa9557c0ee53 authorOleg Grenrus <oleg.grenrus@iki.fi> dateTue 20 Mar 2018, 21:21 (9 years ago) parentd8f9ec5
5 files changed+191−66
.travis.yml+58−46 CHANGELOG.md+6 hackage-docs.sh+78 src/Data/Swagger/Internal.hs+47−18 swagger2.cabal+2−2
.travis.yml+58−46
@@ -1,6 +1,6 @@
11# This Travis job script has been generated by a script via
22#
3−# make_travis_yml_2.hs '--branch' 'master' 'swagger2.cabal'
3+# runghc make_travis_yml_2.hs '--branch' 'master' '--output' '.travis.yml' 'swagger2.cabal'
44#
55# For more information, see https://github.com/hvr/multi-ghc-travis
66#
@@ -28,6 +28,8 @@ before_cache:
2828 - rm -fv $HOME/.cabal/packages/hackage.haskell.org/01-index.tar
2929 - rm -fv $HOME/.cabal/packages/hackage.haskell.org/01-index.tar.idx
3030
31+ - rm -rfv $HOME/.cabal/packages/head.hackage
32+
3133matrix:
3234 include:
3335 - compiler: "ghc-7.8.4"
@@ -42,62 +44,72 @@ matrix:
4244 # env: TEST=--disable-tests BENCH=--disable-benchmarks
4345 env: HADDOCK=false
4446 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"
4651 # 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]}}
4853
4954before_install:
50− - HC=${CC}
51− - unset CC
52− - PATH=/opt/ghc/bin:/opt/ghc-ppa-tools/bin:$PATH
53− - PKGNAME='swagger2'
55+ - HC=${CC}
56+ - HCPKG=${HC/ghc/ghc-pkg}
57+ - unset CC
58+ - ROOTDIR=$(pwd)
59+ - mkdir -p $HOME/.local/bin
60+ - "PATH=/opt/ghc/bin:/opt/ghc-ppa-tools/bin:$HOME/local/bin:$PATH"
61+ - HCNUMVER=$(( $(${HC} --numeric-version|sed -E 's/([0-9]+)\.([0-9]+)\.([0-9]+).*/\1 * 10000 + \2 * 100 + \3/') ))
62+ - echo $HCNUMVER
5463
5564install:
56− - cabal --version
57− - echo "$(${HC} --version) [$(${HC} --print-project-git-commit-id 2> /dev/null || echo '?')]"
58− - BENCH=${BENCH---enable-benchmarks}
59− - TEST=${TEST---enable-tests}
60− - HADDOCK=${HADDOCK-true}
61− - INSTALLED=${INSTALLED-true}
62− - travis_retry cabal update -v
63− - sed -i 's/^jobs:/-- jobs:/' ${HOME}/.cabal/config
64− - rm -fv cabal.project.local
65− - "echo 'packages: .' > cabal.project"
66− - rm -f cabal.project.freeze
67− - cabal new-build -w ${HC} ${TEST} ${BENCH} --dep -j2 all
68− - cabal new-build -w ${HC} --disable-tests --disable-benchmarks --dep -j2 all
65+ - cabal --version
66+ - echo "$(${HC} --version) [$(${HC} --print-project-git-commit-id 2> /dev/null || echo '?')]"
67+ - BENCH=${BENCH---enable-benchmarks}
68+ - TEST=${TEST---enable-tests}
69+ - HADDOCK=${HADDOCK-true}
70+ - INSTALLED=${INSTALLED-true}
71+ - GHCHEAD=${GHCHEAD-false}
72+ - travis_retry cabal update -v
73+ - "sed -i.bak 's/^jobs:/-- jobs:/' ${HOME}/.cabal/config"
74+ - rm -fv cabal.project cabal.project.local
75+ - grep -Ev -- '^\s*--' ${HOME}/.cabal/config | grep -Ev '^\s*$'
76+ - "printf 'packages: \".\"\\n' > cabal.project"
77+ - cat cabal.project
78+ - if [ -f "./configure.ac" ]; then
79+ (cd "." && autoreconf -i);
80+ fi
81+ - rm -f cabal.project.freeze
82+ - cabal new-build -w ${HC} ${TEST} ${BENCH} --project-file="cabal.project" --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)
6986
7087# Here starts the actual work to be performed for the package under test;
7188# any command which exits with a non-zero exit code causes the build to fail.
7289script:
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
76− - cd dist/
77− - SRCTAR=(${PKGNAME}-*.tar.gz)
78− - SRC_BASENAME="${SRCTAR/%.tar.gz}"
79− - tar -xvf "./$SRC_BASENAME.tar.gz"
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"
84− # this builds all libraries and executables (without tests/benchmarks)
85− - rm -f cabal.project.freeze
86− - cabal new-build -w ${HC} --disable-tests --disable-benchmarks all
87− # this builds all libraries and executables (including tests/benchmarks)
88− # - rm -rf ./dist-newstyle
90+ # test that source-distributions can be generated
91+ - (cd "." && cabal sdist)
92+ - mv "."/dist/swagger2-*.tar.gz ${DISTDIR}/
93+ - cd ${DISTDIR} || false
94+ - find . -maxdepth 1 -name '*.tar.gz' -exec tar -xvf '{}' \;
95+ - "printf 'packages: swagger2-*/*.cabal\\n' > cabal.project"
96+ - cat cabal.project
97+ # this builds all libraries and executables (without tests/benchmarks)
98+ - cabal new-build -w ${HC} --disable-tests --disable-benchmarks all
99+
100+ # Build with installed constraints for packages in global-db
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
89102
90− # Build with installed constraints for packages in global-db
91− - if $INSTALLED; then
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;
93− else echo "Not building with installed constraints"; fi
103+ # build & run tests, build benchmarks
104+ - cabal new-build -w ${HC} ${TEST} ${BENCH} all
105+ - if [ "x$TEST" = "x--enable-tests" ]; then cabal new-test -w ${HC} ${TEST} ${BENCH} all; fi
94106
95− # build & run tests, build benchmarks
96− - cabal new-build -w ${HC} ${TEST} ${BENCH} all
97− - if [ "x$TEST" = "x--enable-tests" ]; then cabal new-test -w ${HC} ${TEST} all; fi
107+ # cabal check
108+ - (cd swagger2-* && cabal check)
98109
99− # haddock
100− - rm -rf ./dist-newstyle
101− - if $HADDOCK; then cabal new-haddock -w ${HC} --disable-tests --disable-benchmarks all; else echo "Skipping haddock generation";fi
110+ # haddock
111+ - rm -rf ./dist-newstyle
112+ - if $HADDOCK; then cabal new-haddock -w ${HC} ${TEST} ${BENCH} all; else echo "Skipping haddock generation";fi
102113
114+# REGENDATA ["--branch","master","--output",".travis.yml","swagger2.cabal"]
103115# EOF
CHANGELOG.md+6
@@ -1,3 +1,9 @@
1+next
2+----
3+
4+* Add `Semigroup` instances
5+* GHC-8.4 compatibility
6+
172.2
28---
39
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
3232import qualified Data.HashMap.Strict as HashMap
3333import Data.Map (Map)
3434import qualified Data.Map as Map
35−import Data.Monoid
35+import Data.Monoid (Monoid (..))
36+import Data.Semigroup (Semigroup (..))
3637import Data.Scientific (Scientific)
3738import Data.Set (Set)
3839import Data.String (IsString(..))
@@ -303,7 +304,7 @@ data Operation = Operation
303304 } deriving (Eq, Show, Generic, Data, Typeable)
304305
305306newtype MimeList = MimeList { getMimeList :: [MediaType] }
306− deriving (Eq, Show, Monoid, Typeable)
307+ deriving (Eq, Show, Semigroup, Monoid, Typeable)
307308
308309mimeListConstr :: Constr
309310mimeListConstr = mkConstr mimeListDataType "MimeList" ["getMimeList"] Prefix
@@ -754,7 +755,7 @@ data SecurityScheme = SecurityScheme
754755-- (that is, there is a logical AND between the schemes).
755756newtype SecurityRequirement = SecurityRequirement
756757 { 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)
758759
759760-- | Tag name.
760761type TagName = Text
@@ -805,61 +806,89 @@ newtype URL = URL { getUrl :: Text } deriving (Eq, Ord, Show, ToJSON, FromJSON,
805806-- Monoid instances
806807-- =======================================================================
807808
809+instance Semigroup Swagger where
810+ (<>) = genericMappend
808811instance Monoid Swagger where
809812 mempty = genericMempty
810− mappend = genericMappend
813+ mappend = (<>)
811814
815+instance Semigroup Info where
816+ (<>) = genericMappend
812817instance Monoid Info where
813818 mempty = genericMempty
814− mappend = genericMappend
819+ mappend = (<>)
815820
821+instance Semigroup Contact where
822+ (<>) = genericMappend
816823instance Monoid Contact where
817824 mempty = genericMempty
818− mappend = genericMappend
825+ mappend = (<>)
819826
827+instance Semigroup PathItem where
828+ (<>) = genericMappend
820829instance Monoid PathItem where
821830 mempty = genericMempty
822− mappend = genericMappend
831+ mappend = (<>)
823832
833+instance Semigroup Schema where
834+ (<>) = genericMappend
824835instance Monoid Schema where
825836 mempty = genericMempty
826− mappend = genericMappend
837+ mappend = (<>)
827838
839+instance Semigroup (ParamSchema t) where
840+ (<>) = genericMappend
828841instance Monoid (ParamSchema t) where
829842 mempty = genericMempty
830− mappend = genericMappend
843+ mappend = (<>)
831844
845+instance Semigroup Param where
846+ (<>) = genericMappend
832847instance Monoid Param where
833848 mempty = genericMempty
834− mappend = genericMappend
849+ mappend = (<>)
835850
851+instance Semigroup ParamOtherSchema where
852+ (<>) = genericMappend
836853instance Monoid ParamOtherSchema where
837854 mempty = genericMempty
838− mappend = genericMappend
855+ mappend = (<>)
839856
857+instance Semigroup Header where
858+ (<>) = genericMappend
840859instance Monoid Header where
841860 mempty = genericMempty
842− mappend = genericMappend
861+ mappend = (<>)
843862
863+instance Semigroup Responses where
864+ (<>) = genericMappend
844865instance Monoid Responses where
845866 mempty = genericMempty
846− mappend = genericMappend
867+ mappend = (<>)
847868
869+instance Semigroup Response where
870+ (<>) = genericMappend
848871instance Monoid Response where
849872 mempty = genericMempty
850− mappend = genericMappend
873+ mappend = (<>)
851874
875+instance Semigroup ExternalDocs where
876+ (<>) = genericMappend
852877instance Monoid ExternalDocs where
853878 mempty = genericMempty
854− mappend = genericMappend
879+ mappend = (<>)
855880
881+instance Semigroup Operation where
882+ (<>) = genericMappend
856883instance Monoid Operation where
857884 mempty = genericMempty
858− mappend = genericMappend
885+ mappend = (<>)
859886
887+instance Semigroup Example where
888+ (<>) = genericMappend
860889instance Monoid Example where
861890 mempty = genericMempty
862− mappend = genericMappend
891+ mappend = (<>)
863892
864893-- =======================================================================
865894-- SwaggerMonoid helper instances
@@ -893,7 +922,7 @@ instance OVERLAPPING_ SwaggerMonoid (InsOrdHashMap FilePath PathItem) where
893922
894923instance Monoid a => SwaggerMonoid (Referenced a) where
895924 swaggerMempty = Inline mempty
896− swaggerMappend (Inline x) (Inline y) = Inline (x <> y)
925+ swaggerMappend (Inline x) (Inline y) = Inline (mappend x y)
897926 swaggerMappend _ y = y
898927
899928instance SwaggerMonoid ParamAnySchema where
swagger2.cabal+2−2
@@ -21,7 +21,7 @@ extra-source-files:
2121 , examples/*.hs
2222 , include/overlapping-compat.h
2323cabal-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
2525
2626custom-setup
2727 setup-depends:
@@ -48,7 +48,7 @@ library
4848 Data.Swagger.Internal.Utils
4949 Data.Swagger.Internal.AesonUtils
5050 Data.Swagger.Internal.TypeShape
51− build-depends: base >=4.7 && <4.11
51+ build-depends: base >=4.7 && <4.12
5252 , base-compat >=0.9.1 && <0.10
5353 , aeson >=0.11.2.1
5454 , bytestring