travis-meta-yaml 0.0.1.1 → 0.1.0.0
raw patch · 14 files changed
+360/−81 lines, 14 filesdep +unordered-containersPVP ok
version bump matches the API change (PVP)
Dependencies added: unordered-containers
API changes (from Hackage documentation)
+ Data.Aeson.Merge: merge :: Value -> Value -> Value
Files
- .travis.meta.yml +3/−33
- .travis.yml +19/−20
- README.md +57/−3
- cli/Main.hs +8/−4
- data/language-haskell-multi-ghc.yml +28/−0
- data/language-haskell-stack.yml +33/−0
- fixtures/multi-ghc-processed.yml +49/−0
- fixtures/multi-ghc.yml +7/−0
- fixtures/multi-processed.yml +42/−0
- fixtures/multi.yml +38/−0
- src/Data/Aeson/Merge.hs +15/−0
- src/Travis/Meta.hs +27/−3
- tests/Tests.hs +14/−10
- travis-meta-yaml.cabal +20/−8
.travis.meta.yml view
@@ -1,35 +1,5 @@-# NB: don't set `language: haskell` here--sudo: false+language: haskell-stack env:- - CABALVER=1.18 GHCVER=7.8.4- - CABALVER=1.22 GHCVER=7.10.1- - CABALVER=1.22 GHCVER=head--addons:- apt:- sources:- - hvr-ghc- packages:- - cabal-install-$CABALVER- - ghc-$GHCVER--matrix:- allow_failures:- - env: CABALVER=1.22 GHCVER=head--before_install:- # ghc- - export PATH=/opt/ghc/$GHCVER/bin:/opt/cabal/$CABALVER/bin:$PATH- # versions- - echo "$(ghc --version) [$(ghc --print-project-git-commit-id 2> /dev/null || echo '?')]"- - cabal --version--install:- - cabal update- - cabal install -j2 --only-dependencies --enable-tests--script:- - cabal configure --enable-tests- - cabal test -j2+ - GHCVER=7.8.4 STACKYAML=stack-7.8.yaml+ - GHCVER=7.10.1 STACKYAML=stack-7.10.yaml
.travis.yml view
@@ -1,40 +1,39 @@ script:-- cabal configure --enable-tests-- cabal test -j2+- stack +RTS -N2 -RTS --no-terminal --skip-ghc-check --stack-yaml $STACKYAML test matrix: include:- - env: CABALVER=1.18 GHCVER=7.8.4+ - env: GHCVER=7.8.4 STACKYAML=stack-7.8.yaml addons: apt: sources: - hvr-ghc packages:- - cabal-install-1.18 - ghc-7.8.4- - env: CABALVER=1.22 GHCVER=7.10.1+ - libgmp-dev+ - env: GHCVER=7.10.1 STACKYAML=stack-7.10.yaml addons: apt: sources: - hvr-ghc packages:- - cabal-install-1.22 - ghc-7.10.1- - env: CABALVER=1.22 GHCVER=head- addons:- apt:- sources:- - hvr-ghc- packages:- - cabal-install-1.22- - ghc-head- allow_failures:- - env: CABALVER=1.22 GHCVER=head+ - libgmp-dev install:-- cabal update-- cabal install -j2 --only-dependencies --enable-tests+- stack +RTS -N2 -RTS --no-terminal --skip-ghc-check --stack-yaml $STACKYAML setup+- stack +RTS -N2 -RTS --no-terminal --skip-ghc-check --stack-yaml $STACKYAML test+ --only-snapshot+cache:+ directories:+ - ~/.stack+ apt: true before_install:-- export PATH=/opt/ghc/$GHCVER/bin:/opt/cabal/$CABALVER/bin:$PATH+- export PATH=/opt/ghc/$GHCVER/bin:$PATH+- export PATH=~/.local/bin:$PATH+- if [ ! -e ~/.local/bin/stack ]; then mkdir -p ~/.local/bin; travis_retry curl -L+ https://github.com/commercialhaskell/stack/releases/download/v0.1.2.0/stack-0.1.2.0-x86_64-linux.gz+ | gunzip > ~/.local/bin/stack; chmod a+x ~/.local/bin/stack; fi - echo "$(ghc --version) [$(ghc --print-project-git-commit-id 2> /dev/null || echo '?')]"-- cabal --version+- stack +RTS -N2 -RTS --version+language: c sudo: false
README.md view
@@ -5,8 +5,62 @@ ## Motivation -Turn+```+language: haskell-stack +env:+ - GHCVER=7.8.4 STACKYAML=stack-7.8.4.yaml+ - GHCVER=7.10.1 STACKYAML=stack-7.10.yaml+```++into++```+script:+- stack +RTS -N2 -RTS --no-terminal --skip-ghc-check --stack-yaml $STACKYAML test+matrix:+ include:+ - env: GHCVER=7.8.4 STACKYAML=stack-7.8.4.yaml+ addons:+ apt:+ sources:+ - hvr-ghc+ packages:+ - ghc-7.8.4+ - libgmp-dev+ - env: GHCVER=7.10.1 STACKYAML=stack-7.10.yaml+ addons:+ apt:+ sources:+ - hvr-ghc+ packages:+ - ghc-7.10.1+ - libgmp-dev+install:+- stack +RTS -N2 -RTS --no-terminal --skip-ghc-check --stack-yaml $STACKYAML setup+- stack +RTS -N2 -RTS --no-terminal --skip-ghc-check --stack-yaml $STACKYAML test+ --only-snapshot+cache:+ directories:+ - ~/.stack+ apt: true+before_install:+- export PATH=/opt/ghc/$GHCVER/bin:$PATH+- export PATH=~/.local/bin:$PATH+- if [ ! -e ~/.local/bin/stack ]; then mkdir -p ~/.local/bin; travis_retry curl -L+ https://github.com/commercialhaskell/stack/releases/download/v0.1.2.0/stack-0.1.2.0-x86_64-linux.gz+ | gunzip > ~/.local/bin/stack; chmod a+x ~/.local/bin/stack; fi+- echo "$(ghc --version) [$(ghc --print-project-git-commit-id 2> /dev/null || echo+ '?')]"+- stack +RTS -N2 -RTS --version+language: c+sudo: false+```++## Features++Interpolate environment variables into `addons` in `matrix.include`:+ ```yaml env: - CABALVER=1.18 GHCVER=7.8.4@@ -59,6 +113,6 @@ - env: CABALVER=1.22 GHCVER=head ``` -## Features+### Other -Currently only expanding of `addons.apt`. Any feature requests are welcome.+Any feature requests are welcome.
cli/Main.hs view
@@ -11,13 +11,17 @@ sample :: Parser Opts sample = Opts- <$> strArgument- ( metavar "SOURCE"+ <$> strOption+ ( short 'i'+ <> long "input"+ <> metavar "SOURCE" <> value ".travis.meta.yml" <> showDefault <> help "Source, travis meta file" )- <*> strArgument- ( metavar "TARGET"+ <*> strOption+ ( short 'o'+ <> long "output"+ <> metavar "TARGET" <> value ".travis.yml" <> showDefault <> help "Target, travis yaml" )
+ data/language-haskell-multi-ghc.yml view
@@ -0,0 +1,28 @@+language: c+sudo: false++cache:+ apt: true++addons:+ apt:+ sources:+ - hvr-ghc+ packages:+ - cabal-install-$CABALVER+ - ghc-$GHCVER++before_install:+ # ghc+ - export PATH=/opt/ghc/$GHCVER/bin:/opt/cabal/$CABALVER/bin:$PATH+ # versions+ - echo "$(ghc --version) [$(ghc --print-project-git-commit-id 2> /dev/null || echo '?')]"+ - cabal --version++install:+ - cabal update+ - cabal install -j2 --only-dependencies --enable-tests++script:+ - cabal configure --enable-tests+ - cabal test -j2
+ data/language-haskell-stack.yml view
@@ -0,0 +1,33 @@+# NB: don't set `language: haskell` here+language: c+sudo: false++cache:+ apt: true+ directories:+ - ~/.stack++addons:+ apt:+ sources:+ - hvr-ghc+ packages:+ - ghc-$GHCVER+ - libgmp-dev++before_install:+ # ghc+ - export PATH=/opt/ghc/$GHCVER/bin:$PATH+ # stack+ - export PATH=~/.local/bin:$PATH+ - if [ ! -e ~/.local/bin/stack ]; then mkdir -p ~/.local/bin; travis_retry curl -L https://github.com/commercialhaskell/stack/releases/download/v0.1.2.0/stack-0.1.2.0-x86_64-linux.gz | gunzip > ~/.local/bin/stack; chmod a+x ~/.local/bin/stack; fi+ # version+ - echo "$(ghc --version) [$(ghc --print-project-git-commit-id 2> /dev/null || echo '?')]"+ - stack +RTS -N2 -RTS --version++install:+ - stack +RTS -N2 -RTS --no-terminal --skip-ghc-check --stack-yaml $STACKYAML setup+ - stack +RTS -N2 -RTS --no-terminal --skip-ghc-check --stack-yaml $STACKYAML test --only-snapshot++script:+ - stack +RTS -N2 -RTS --no-terminal --skip-ghc-check --stack-yaml $STACKYAML test
+ fixtures/multi-ghc-processed.yml view
@@ -0,0 +1,49 @@+script:+- cabal configure --enable-tests+- cabal test -j2+matrix:+ include:+ - env: GHCVER=7.8.4 CABALVER=1.18+ addons:+ apt:+ sources:+ - hvr-ghc+ packages:+ - cabal-install-1.18+ - ghc-7.8.4+ - env: GHCVER=7.10.1 CABALVER=1.22+ addons:+ apt:+ sources:+ - hvr-ghc+ packages:+ - cabal-install-1.22+ - ghc-7.10.1+ - env: GHCVER=7.10.2 CABALVER=1.22+ addons:+ apt:+ sources:+ - hvr-ghc+ packages:+ - cabal-install-1.22+ - ghc-7.10.2+ - env: GHCVER=head CABALVER=1.23+ addons:+ apt:+ sources:+ - hvr-ghc+ packages:+ - cabal-install-1.23+ - ghc-head+install:+- cabal update+- cabal install -j2 --only-dependencies --enable-tests+cache:+ apt: true+before_install:+- export PATH=/opt/ghc/$GHCVER/bin:/opt/cabal/$CABALVER/bin:$PATH+- echo "$(ghc --version) [$(ghc --print-project-git-commit-id 2> /dev/null || echo+ '?')]"+- cabal --version+language: c+sudo: false
+ fixtures/multi-ghc.yml view
@@ -0,0 +1,7 @@+language: haskell-multi-ghc++env:+ - GHCVER=7.8.4 CABALVER=1.18+ - GHCVER=7.10.1 CABALVER=1.22+ - GHCVER=7.10.2 CABALVER=1.22+ - GHCVER=head CABALVER=1.23
+ fixtures/multi-processed.yml view
@@ -0,0 +1,42 @@+script:+- cabal configure --enable-tests+- cabal test -j2+matrix:+ include:+ - env: CABALVER=1.18 GHCVER=7.8.4+ addons:+ apt:+ sources:+ - hvr-ghc+ packages:+ - cabal-install-1.18+ - ghc-7.8.4+ - env: CABALVER=1.22 GHCVER=7.10.1+ addons:+ apt:+ sources:+ - hvr-ghc+ packages:+ - cabal-install-1.22+ - ghc-7.10.1+ - env: CABALVER=1.22 GHCVER=head+ addons:+ apt:+ sources:+ - hvr-ghc+ packages:+ - cabal-install-1.22+ - ghc-head+ allow_failures:+ - env: CABALVER=1.22 GHCVER=head+install:+- cabal update+- cabal install -j2 --only-dependencies --enable-tests+cache:+ apt: true+before_install:+- export PATH=/opt/ghc/$GHCVER/bin:/opt/cabal/$CABALVER/bin:$PATH+- echo "$(ghc --version) [$(ghc --print-project-git-commit-id 2> /dev/null || echo+ '?')]"+- cabal --version+sudo: false
+ fixtures/multi.yml view
@@ -0,0 +1,38 @@+# NB: don't set `language: haskell` here++sudo: false++env:+ - CABALVER=1.18 GHCVER=7.8.4+ - CABALVER=1.22 GHCVER=7.10.1+ - CABALVER=1.22 GHCVER=head++cache:+ apt: true++addons:+ apt:+ sources:+ - hvr-ghc+ packages:+ - cabal-install-$CABALVER+ - ghc-$GHCVER++matrix:+ allow_failures:+ - env: CABALVER=1.22 GHCVER=head++before_install:+ # ghc+ - export PATH=/opt/ghc/$GHCVER/bin:/opt/cabal/$CABALVER/bin:$PATH+ # versions+ - echo "$(ghc --version) [$(ghc --print-project-git-commit-id 2> /dev/null || echo '?')]"+ - cabal --version++install:+ - cabal update+ - cabal install -j2 --only-dependencies --enable-tests++script:+ - cabal configure --enable-tests+ - cabal test -j2
+ src/Data/Aeson/Merge.hs view
@@ -0,0 +1,15 @@+-- |+-- Module : Data.Aeson.Merge+-- Description : Simple 'Value' merge.+-- Copyright : (c) Oleg Grenrus, 2005+-- License : BSD3+-- Maintainer : Oleg Grenrus <oleg.grenrus@iki.fi>+module Data.Aeson.Merge (merge) where++import Data.Aeson.Types+import Data.HashMap.Strict as HM++-- | A bit like <http://underscorejs.org/#extend _.extend>, but pure, left-bias and recursive.+merge :: Value -> Value -> Value+merge (Object a) (Object b) = Object (HM.unionWith merge a b)+merge a _b = a
src/Travis/Meta.hs view
@@ -1,5 +1,11 @@ {-# LANGUAGE OverloadedStrings #-}-{-# LANGUAGE RankNTypes #-}+{-# LANGUAGE TemplateHaskell #-}+-- |+-- Module : Travis.Meta+-- Description : Travis preprocessor+-- Copyright : (c) Oleg Grenrus, 2005+-- License : BSD3+-- Maintainer : Oleg Grenrus <oleg.grenrus@iki.fi> module Travis.Meta ( -- * High level preprocessIO@@ -13,10 +19,12 @@ import Control.Lens import Control.Monad hiding (sequence)-import Data.Aeson.Types import Data.Aeson.Lens+import Data.Aeson.Merge+import Data.Aeson.Types import Data.ByteString as BS import Data.Char+import Data.FileEmbed import Data.Maybe import Data.Monoid import Data.Text as T@@ -65,7 +73,10 @@ hoist (Just a) = Right a preprocessYaml :: Value -> Either String Value-preprocessYaml v = do+preprocessYaml = preprocessYaml' . processLanguage ++preprocessYaml' :: Value -> Either String Value+preprocessYaml' v = do assertNoMatrixInclude v matrixInclude <- buildMatrixInclude v let v' = v & _Object . at "env" .~ Nothing@@ -74,6 +85,13 @@ & key "matrix" . _Object . at "include" ?~ matrixInclude return v' +processLanguage :: Value -> Value+processLanguage v =+ case v ^? key "language" . _String of+ Just t | t == "haskell-stack" -> merge (v & _Object . at "language" .~ Nothing) stackTemplate+ | t == "haskell-multi-ghc" -> merge (v & _Object . at "language" .~ Nothing) multiGhcTemplate+ _ -> v+ buildMatrixInclude :: Value -> Either String Value buildMatrixInclude v = toJSON <$> mk `traverse` envs where addons = v ^? key "addons"@@ -103,3 +121,9 @@ -- Right v <- decodeEither <$> BS.readFile ".travis.meta.yml" :: IO (Either String Value) -- BS.putStr $ encode $ preprocessYaml v++stackTemplate :: Value+stackTemplate = fromJust $ decode $(embedFile "data/language-haskell-stack.yml")++multiGhcTemplate :: Value+multiGhcTemplate = fromJust $ decode $(embedFile "data/language-haskell-multi-ghc.yml")
tests/Tests.hs view
@@ -2,6 +2,7 @@ {-# LANGUAGE RankNTypes #-} module Main (main) where +import Data.ByteString import Data.Either.Extra import Data.FileEmbed import Data.Yaml@@ -15,20 +16,23 @@ tests :: TestTree tests = testGroup "Tests"- [ selfTest- , withoutMatrix+ [ fixtures , errorCases ] -selfTest :: TestTree-selfTest = testProperty "Self test" $ once $ actual === processed- where actual = decodeEither $(embedFile ".travis.yml")- processed = preprocessYaml =<< decodeEither $(embedFile ".travis.meta.yml")+fixtures :: TestTree+fixtures = testGroup "Fixtures"+ [ f "self" $(embedFile ".travis.yml") $(embedFile ".travis.meta.yml")+ , f "with matrix" $(embedFile "fixtures/multi-processed.yml") $(embedFile "fixtures/multi.yml")+ , f "without matrix" $(embedFile "fixtures/without-matrix-processed.yml") $(embedFile "fixtures/without-matrix.yml")+ , f "multi-ghc" $(embedFile "fixtures/multi-ghc-processed.yml") $(embedFile "fixtures/multi-ghc.yml")+ ]+ where f = fixture -withoutMatrix :: TestTree-withoutMatrix = testProperty "Self test without matrix" $ once $ actual === processed- where actual = decodeEither $(embedFile "fixtures/without-matrix-processed.yml")- processed = preprocessYaml =<< decodeEither $(embedFile "fixtures/without-matrix.yml")+fixture :: String -> ByteString -> ByteString -> TestTree+fixture name metaBS processedBS = testProperty name $ once $ actual === processed+ where actual = decodeEither metaBS+ processed = preprocessYaml =<< decodeEither processedBS errorCases :: TestTree errorCases = testGroup "Error cases"
travis-meta-yaml.cabal view
@@ -3,7 +3,7 @@ -- see: https://github.com/sol/hpack name: travis-meta-yaml-version: 0.0.1.1+version: 0.1.0.0 synopsis: .travis.yml preprocessor description: .travis.yml preprocessor category: Development@@ -19,7 +19,13 @@ extra-source-files: .travis.meta.yml .travis.yml+ data/language-haskell-multi-ghc.yml+ data/language-haskell-stack.yml fixtures/matrix-include.yml+ fixtures/multi-ghc-processed.yml+ fixtures/multi-ghc.yml+ fixtures/multi-processed.yml+ fixtures/multi.yml fixtures/without-matrix-processed.yml fixtures/without-matrix.yml README.md@@ -36,12 +42,15 @@ base >=4.7 && <4.9 , aeson , bytestring- , lens-aeson+ , file-embed , lens- , text+ , lens-aeson , regex-applicative+ , text+ , unordered-containers , yaml exposed-modules:+ Data.Aeson.Merge Travis.Meta default-language: Haskell2010 @@ -54,10 +63,12 @@ base >=4.7 && <4.9 , aeson , bytestring- , lens-aeson+ , file-embed , lens- , text+ , lens-aeson , regex-applicative+ , text+ , unordered-containers , yaml , travis-meta-yaml , optparse-applicative@@ -73,13 +84,14 @@ base >=4.7 && <4.9 , aeson , bytestring- , lens-aeson+ , file-embed , lens- , text+ , lens-aeson , regex-applicative+ , text+ , unordered-containers , yaml , extra- , file-embed , travis-meta-yaml , tasty , tasty-quickcheck