packages feed

language-dockerfile 0.2.3.0 → 0.3.0.0

raw patch · 7 files changed

+158/−39 lines, 7 filesdep +Globdep +directorydep +filepathPVP ok

version bump matches the API change (PVP)

Dependencies added: Glob, directory, filepath, transformers

API changes (from Hackage documentation)

+ Language.Dockerfile: liftIO :: MonadIO m => forall a. IO a -> m a
+ Language.Dockerfile: runDockerfileIO :: MonadIO m => EInstructionTM m t -> m (t, Dockerfile)
+ Language.Dockerfile: runDockerfileStrIO :: MonadIO m => EInstructionTM m t -> m (t, String)
+ Language.Dockerfile: toDockerfileIO :: MonadIO m => EInstructionTM m t -> m Dockerfile
+ Language.Dockerfile: toDockerfileStrIO :: MonadIO m => EInstructionTM m t -> m String
+ Language.Dockerfile.EDSL: runD :: MonadWriter [Instruction] m => EInstruction (m b) -> m b
+ Language.Dockerfile.EDSL: runDef :: MonadWriter [t] m => (t1 -> t) -> t1 -> m b -> m b
+ Language.Dockerfile.EDSL: runDef2 :: MonadWriter [t] m => (t1 -> t2 -> t) -> t1 -> t2 -> m b -> m b
+ Language.Dockerfile.EDSL: runDockerWriterIO :: (Monad m, MonadTrans t, Monad (t m), MonadWriter [Instruction] (t m), MonadIO (t m)) => EInstructionTM m a -> t m a
+ Language.Dockerfile.EDSL: runDockerfileIO :: MonadIO m => EInstructionTM m t -> m (t, Dockerfile)
+ Language.Dockerfile.EDSL: runDockerfileStrIO :: MonadIO m => EInstructionTM m t -> m (t, String)
+ Language.Dockerfile.EDSL: toDockerfileIO :: MonadIO m => EInstructionTM m t -> m Dockerfile
+ Language.Dockerfile.EDSL: toDockerfileStrIO :: MonadIO m => EInstructionTM m t -> m String
+ Language.Dockerfile.EDSL: type EInstructionTM = FreeT EInstruction
- Language.Dockerfile: add :: forall m_ayLd. MonadFree EInstruction m_ayLd => Source -> Destination -> m_ayLd ()
+ Language.Dockerfile: add :: forall m_ayNn. MonadFree EInstruction m_ayNn => Source -> Destination -> m_ayNn ()
- Language.Dockerfile: arg :: forall m_ayLS. MonadFree EInstruction m_ayLS => String -> m_ayLS ()
+ Language.Dockerfile: arg :: forall m_ayO2. MonadFree EInstruction m_ayO2 => String -> m_ayO2 ()
- Language.Dockerfile: cmdArgs :: forall m_ayLx. MonadFree EInstruction m_ayLx => Arguments -> m_ayLx ()
+ Language.Dockerfile: cmdArgs :: forall m_ayNH. MonadFree EInstruction m_ayNH => Arguments -> m_ayNH ()
- Language.Dockerfile: comment :: forall m_ayLV. MonadFree EInstruction m_ayLV => String -> m_ayLV ()
+ Language.Dockerfile: comment :: forall m_ayO5. MonadFree EInstruction m_ayO5 => String -> m_ayO5 ()
- Language.Dockerfile: copy :: forall m_ayLq. MonadFree EInstruction m_ayLq => Source -> Destination -> m_ayLq ()
+ Language.Dockerfile: copy :: forall m_ayNA. MonadFree EInstruction m_ayNA => Source -> Destination -> m_ayNA ()
- Language.Dockerfile: embed :: forall m_ayM1. MonadFree EInstruction m_ayM1 => [InstructionPos] -> m_ayM1 ()
+ Language.Dockerfile: embed :: forall m_ayOb. MonadFree EInstruction m_ayOb => [InstructionPos] -> m_ayOb ()
- Language.Dockerfile: entrypointArgs :: forall m_ayLJ. MonadFree EInstruction m_ayLJ => Arguments -> m_ayLJ ()
+ Language.Dockerfile: entrypointArgs :: forall m_ayNT. MonadFree EInstruction m_ayNT => Arguments -> m_ayNT ()
- Language.Dockerfile: env :: forall m_ayLP. MonadFree EInstruction m_ayLP => Pairs -> m_ayLP ()
+ Language.Dockerfile: env :: forall m_ayNZ. MonadFree EInstruction m_ayNZ => Pairs -> m_ayNZ ()
- Language.Dockerfile: expose :: forall m_ayLD. MonadFree EInstruction m_ayLD => [Port] -> m_ayLD ()
+ Language.Dockerfile: expose :: forall m_ayNN. MonadFree EInstruction m_ayNN => [Port] -> m_ayNN ()
- Language.Dockerfile: from :: forall m_ayKw. MonadFree EInstruction m_ayKw => EBaseImage -> m_ayKw ()
+ Language.Dockerfile: from :: forall m_ayMG. MonadFree EInstruction m_ayMG => EBaseImage -> m_ayMG ()
- Language.Dockerfile: label :: forall m_ayLk. MonadFree EInstruction m_ayLk => Pairs -> m_ayLk ()
+ Language.Dockerfile: label :: forall m_ayNu. MonadFree EInstruction m_ayNu => Pairs -> m_ayNu ()
- Language.Dockerfile: maintainer :: forall m_ayLM. MonadFree EInstruction m_ayLM => String -> m_ayLM ()
+ Language.Dockerfile: maintainer :: forall m_ayNW. MonadFree EInstruction m_ayNW => String -> m_ayNW ()
- Language.Dockerfile: onBuildRaw :: forall m_ayLY. MonadFree EInstruction m_ayLY => Instruction -> m_ayLY ()
+ Language.Dockerfile: onBuildRaw :: forall m_ayO8. MonadFree EInstruction m_ayO8 => Instruction -> m_ayO8 ()
- Language.Dockerfile: runArgs :: forall m_ayLu. MonadFree EInstruction m_ayLu => Arguments -> m_ayLu ()
+ Language.Dockerfile: runArgs :: forall m_ayNE. MonadFree EInstruction m_ayNE => Arguments -> m_ayNE ()
- Language.Dockerfile: stopSignal :: forall m_ayLn. MonadFree EInstruction m_ayLn => String -> m_ayLn ()
+ Language.Dockerfile: stopSignal :: forall m_ayNx. MonadFree EInstruction m_ayNx => String -> m_ayNx ()
- Language.Dockerfile: user :: forall m_ayLh. MonadFree EInstruction m_ayLh => String -> m_ayLh ()
+ Language.Dockerfile: user :: forall m_ayNr. MonadFree EInstruction m_ayNr => String -> m_ayNr ()
- Language.Dockerfile: volume :: forall m_ayLG. MonadFree EInstruction m_ayLG => String -> m_ayLG ()
+ Language.Dockerfile: volume :: forall m_ayNQ. MonadFree EInstruction m_ayNQ => String -> m_ayNQ ()
- Language.Dockerfile: workdir :: forall m_ayLA. MonadFree EInstruction m_ayLA => Directory -> m_ayLA ()
+ Language.Dockerfile: workdir :: forall m_ayNK. MonadFree EInstruction m_ayNK => Directory -> m_ayNK ()
- Language.Dockerfile.EDSL: add :: forall m_ayLd. MonadFree EInstruction m_ayLd => Source -> Destination -> m_ayLd ()
+ Language.Dockerfile.EDSL: add :: forall m_ayNn. MonadFree EInstruction m_ayNn => Source -> Destination -> m_ayNn ()
- Language.Dockerfile.EDSL: arg :: forall m_ayLS. MonadFree EInstruction m_ayLS => String -> m_ayLS ()
+ Language.Dockerfile.EDSL: arg :: forall m_ayO2. MonadFree EInstruction m_ayO2 => String -> m_ayO2 ()
- Language.Dockerfile.EDSL: cmdArgs :: forall m_ayLx. MonadFree EInstruction m_ayLx => Arguments -> m_ayLx ()
+ Language.Dockerfile.EDSL: cmdArgs :: forall m_ayNH. MonadFree EInstruction m_ayNH => Arguments -> m_ayNH ()
- Language.Dockerfile.EDSL: comment :: forall m_ayLV. MonadFree EInstruction m_ayLV => String -> m_ayLV ()
+ Language.Dockerfile.EDSL: comment :: forall m_ayO5. MonadFree EInstruction m_ayO5 => String -> m_ayO5 ()
- Language.Dockerfile.EDSL: copy :: forall m_ayLq. MonadFree EInstruction m_ayLq => Source -> Destination -> m_ayLq ()
+ Language.Dockerfile.EDSL: copy :: forall m_ayNA. MonadFree EInstruction m_ayNA => Source -> Destination -> m_ayNA ()
- Language.Dockerfile.EDSL: embed :: forall m_ayM1. MonadFree EInstruction m_ayM1 => [InstructionPos] -> m_ayM1 ()
+ Language.Dockerfile.EDSL: embed :: forall m_ayOb. MonadFree EInstruction m_ayOb => [InstructionPos] -> m_ayOb ()
- Language.Dockerfile.EDSL: entrypointArgs :: forall m_ayLJ. MonadFree EInstruction m_ayLJ => Arguments -> m_ayLJ ()
+ Language.Dockerfile.EDSL: entrypointArgs :: forall m_ayNT. MonadFree EInstruction m_ayNT => Arguments -> m_ayNT ()
- Language.Dockerfile.EDSL: env :: forall m_ayLP. MonadFree EInstruction m_ayLP => Pairs -> m_ayLP ()
+ Language.Dockerfile.EDSL: env :: forall m_ayNZ. MonadFree EInstruction m_ayNZ => Pairs -> m_ayNZ ()
- Language.Dockerfile.EDSL: expose :: forall m_ayLD. MonadFree EInstruction m_ayLD => [Port] -> m_ayLD ()
+ Language.Dockerfile.EDSL: expose :: forall m_ayNN. MonadFree EInstruction m_ayNN => [Port] -> m_ayNN ()
- Language.Dockerfile.EDSL: from :: forall m_ayKw. MonadFree EInstruction m_ayKw => EBaseImage -> m_ayKw ()
+ Language.Dockerfile.EDSL: from :: forall m_ayMG. MonadFree EInstruction m_ayMG => EBaseImage -> m_ayMG ()
- Language.Dockerfile.EDSL: label :: forall m_ayLk. MonadFree EInstruction m_ayLk => Pairs -> m_ayLk ()
+ Language.Dockerfile.EDSL: label :: forall m_ayNu. MonadFree EInstruction m_ayNu => Pairs -> m_ayNu ()
- Language.Dockerfile.EDSL: maintainer :: forall m_ayLM. MonadFree EInstruction m_ayLM => String -> m_ayLM ()
+ Language.Dockerfile.EDSL: maintainer :: forall m_ayNW. MonadFree EInstruction m_ayNW => String -> m_ayNW ()
- Language.Dockerfile.EDSL: onBuildRaw :: forall m_ayLY. MonadFree EInstruction m_ayLY => Instruction -> m_ayLY ()
+ Language.Dockerfile.EDSL: onBuildRaw :: forall m_ayO8. MonadFree EInstruction m_ayO8 => Instruction -> m_ayO8 ()
- Language.Dockerfile.EDSL: runArgs :: forall m_ayLu. MonadFree EInstruction m_ayLu => Arguments -> m_ayLu ()
+ Language.Dockerfile.EDSL: runArgs :: forall m_ayNE. MonadFree EInstruction m_ayNE => Arguments -> m_ayNE ()
- Language.Dockerfile.EDSL: stopSignal :: forall m_ayLn. MonadFree EInstruction m_ayLn => String -> m_ayLn ()
+ Language.Dockerfile.EDSL: stopSignal :: forall m_ayNx. MonadFree EInstruction m_ayNx => String -> m_ayNx ()
- Language.Dockerfile.EDSL: user :: forall m_ayLh. MonadFree EInstruction m_ayLh => String -> m_ayLh ()
+ Language.Dockerfile.EDSL: user :: forall m_ayNr. MonadFree EInstruction m_ayNr => String -> m_ayNr ()
- Language.Dockerfile.EDSL: volume :: forall m_ayLG. MonadFree EInstruction m_ayLG => String -> m_ayLG ()
+ Language.Dockerfile.EDSL: volume :: forall m_ayNQ. MonadFree EInstruction m_ayNQ => String -> m_ayNQ ()
- Language.Dockerfile.EDSL: workdir :: forall m_ayLA. MonadFree EInstruction m_ayLA => Directory -> m_ayLA ()
+ Language.Dockerfile.EDSL: workdir :: forall m_ayNK. MonadFree EInstruction m_ayNK => Directory -> m_ayNK ()

Files

README.md view
@@ -7,6 +7,14 @@ It extends hadolint with the pretty-printer and EDSL for writting Dockerfiles in Haskell. +- [Parsing files](#parsing-files)+- [Parsing strings](#parsing-strings)+- [Pretty-printing files](#pretty-printing-files)+- [Writing Dockerfiles in Haskell](#writing-dockerfiles-in-haskell)+- [Using the QuasiQuoter](#using-the-quasiquoter)+- [Templating Dockerfiles in Haskell](#templating-dockerfiles-in-haskell)+- [Templating Dockerfiles in Haskell](#templating-dockerfiles-in-haskell)+ ## Parsing files ```haskell import Language.Dockerfile@@ -78,6 +86,27 @@             from ("haskell" `tagged` tag)             cabalSandboxBuild "mypackage"         writeFile ("./examples/templating-" ++ tag ++ ".dockerfile") df+```++## Using IO in the DSL+By default the DSL runs in the `Identity` monad. By running in IO we can+support more features like file globbing:++```haskell+{-# LANGUAGE OverloadedStrings #-}+import           Language.Dockerfile+import qualified System.Directory     as Directory+import qualified System.FilePath      as FilePath+import qualified System.FilePath.Glob as Glob+main = do+    str <- toDockerfileStrIO $ do+        fs <- liftIO $ do+            cwd <- Directory.getCurrentDirectory+            fs <- Glob.glob "./test/*.hs"+            return (map (FilePath.makeRelative cwd) fs)+        from "ubuntu"+        mapM_ (\f -> add f ("/app/" ++ FilePath.takeFileName f)) fs+    putStr str ```  ## License
language-dockerfile.cabal view
@@ -1,9 +1,9 @@--- This file has been generated from package.yaml by hpack version 0.14.1.+-- This file has been generated from package.yaml by hpack version 0.14.0. -- -- see: https://github.com/sol/hpack  name:           language-dockerfile-version:        0.2.3.0+version:        0.3.0.0 synopsis:       Dockerfile linter, parser, pretty-printer and embedded DSL description:     Forked from @hadolint@.                 .@@ -57,6 +57,7 @@     , split >=0.2     , free     , mtl+    , transformers     , template-haskell     , th-lift     , th-lift-instances@@ -75,6 +76,7 @@       Language.Dockerfile.EDSL.Quasi       Language.Dockerfile.EDSL.Types   other-modules:+      Language.Dockerfile.EDSL.Plugins       Paths_language_dockerfile   default-language: Haskell2010 @@ -91,6 +93,7 @@     , split >=0.2     , free     , mtl+    , transformers     , template-haskell     , th-lift     , th-lift-instances@@ -115,6 +118,7 @@     , split >=0.2     , free     , mtl+    , transformers     , template-haskell     , th-lift     , th-lift-instances@@ -141,6 +145,7 @@     , split >=0.2     , free     , mtl+    , transformers     , template-haskell     , th-lift     , th-lift-instances@@ -151,6 +156,7 @@       Language.Dockerfile       Language.Dockerfile.Bash       Language.Dockerfile.EDSL+      Language.Dockerfile.EDSL.Plugins       Language.Dockerfile.EDSL.Quasi       Language.Dockerfile.EDSL.Types       Language.Dockerfile.FormatCheck@@ -161,6 +167,7 @@       Language.Dockerfile.Rules       Language.Dockerfile.Syntax       Language.Dockerfile.Syntax.Lift+      Language.Dockerfile.EDSL.PluginsSpec       Language.Dockerfile.EDSL.QuasiSpec       Language.Dockerfile.EDSLSpec       SanitySpec@@ -181,13 +188,18 @@     , split >=0.2     , free     , mtl+    , transformers     , template-haskell     , th-lift     , th-lift-instances     , hspec     , QuickCheck     , language-dockerfile+    , Glob+    , directory+    , filepath   other-modules:+      Language.Dockerfile.EDSL.PluginsSpec       Language.Dockerfile.EDSL.QuasiSpec       Language.Dockerfile.EDSLSpec       SanitySpec
src/Language/Dockerfile.hs view
@@ -12,6 +12,13 @@       -- * Writting Dockerfiles (@Language.Dockerfile.EDSL@)     , Language.Dockerfile.EDSL.toDockerfileStr     , Language.Dockerfile.EDSL.toDockerfile++    , Language.Dockerfile.EDSL.toDockerfileStrIO+    , Language.Dockerfile.EDSL.toDockerfileIO+    , Language.Dockerfile.EDSL.runDockerfileIO+    , Language.Dockerfile.EDSL.runDockerfileStrIO+    , Control.Monad.IO.Class.liftIO+     , Language.Dockerfile.EDSL.from        -- ** Constructing base images@@ -74,6 +81,7 @@     )   where +import qualified Control.Monad.IO.Class import qualified Language.Dockerfile.EDSL import qualified Language.Dockerfile.EDSL.Quasi import qualified Language.Dockerfile.EDSL.Types
src/Language/Dockerfile/EDSL.hs view
@@ -8,8 +8,10 @@ -- import           Data.List                      (isInfixOf) import           Control.Monad.Free import           Control.Monad.Free.TH+import           Control.Monad.Identity          (Identity)+import           Control.Monad.Trans.Free        (FreeT, iterTM, runFreeT) import           Control.Monad.Writer-import           Data.ByteString                (ByteString)+import           Data.ByteString                 (ByteString)  import qualified Language.Dockerfile.PrettyPrint as PrettyPrint import qualified Language.Dockerfile.Syntax      as Syntax@@ -17,6 +19,7 @@ import           Language.Dockerfile.EDSL.Types  type EInstructionM = Free EInstruction+type EInstructionTM = FreeT EInstruction  makeFree ''EInstruction @@ -24,33 +27,46 @@     :: (MonadWriter [Syntax.Instruction] m)     => EInstructionM a -> m a runDockerWriter = iterM runD-  where-    runDef f a n = tell [ f a ] >> n-    runDef2 f a b n = tell [ f a b ] >> n-    runD (From bi n) = case bi of-        EUntaggedImage bi' -> runDef Syntax.From (Syntax.UntaggedImage bi') n-        ETaggedImage bi' tg -> runDef Syntax.From (Syntax.TaggedImage bi' tg) n-        EDigestedImage bi' d -> runDef Syntax.From (Syntax.DigestedImage bi' d) n-    runD (CmdArgs as n) = runDef Syntax.Cmd as n-    runD (Add s d n) = runDef2 Syntax.Add s d n-    runD (User u n) = runDef Syntax.User u n-    runD (Label ps n) = runDef Syntax.Label ps n-    runD (StopSignal s n) = runDef Syntax.Stopsignal s n-    runD (Copy s d n) = runDef2 Syntax.Copy s d n-    runD (RunArgs as n) = runDef Syntax.Run as n-    runD (Workdir d n) = runDef Syntax.Workdir d n-    runD (Expose ps n) = runDef Syntax.Expose ps n-    runD (Volume v n) = runDef Syntax.Volume v n-    runD (EntrypointArgs e n) = runDef Syntax.Entrypoint e n-    runD (Maintainer m n) = runDef Syntax.Maintainer m n-    runD (Env ps n) = runDef Syntax.Env ps n-    runD (Arg s n) = runDef Syntax.Arg s n-    runD (Comment c n) = runDef Syntax.Comment c n-    runD (OnBuildRaw i n) = runDef Syntax.OnBuild i n-    runD (Embed is n) = do-        tell (map Syntax.instruction is)-        n +runDockerWriterIO ::+    ( Monad m+    , MonadTrans t+    , Monad (t m)+    , MonadWriter [Syntax.Instruction] (t m)+    , MonadIO (t m)+    ) => EInstructionTM m a -> t m a+runDockerWriterIO = iterTM runD++runDef :: MonadWriter [t] m => (t1 -> t) -> t1 -> m b -> m b+runDef f a n = tell [ f a ] >> n+runDef2 :: MonadWriter [t] m => (t1 -> t2 -> t) -> t1 -> t2 -> m b -> m b+runDef2 f a b n = tell [ f a b ] >> n++runD :: MonadWriter [Syntax.Instruction] m => EInstruction (m b) -> m b+runD (From bi n) = case bi of+    EUntaggedImage bi' -> runDef Syntax.From (Syntax.UntaggedImage bi') n+    ETaggedImage bi' tg -> runDef Syntax.From (Syntax.TaggedImage bi' tg) n+    EDigestedImage bi' d -> runDef Syntax.From (Syntax.DigestedImage bi' d) n+runD (CmdArgs as n) = runDef Syntax.Cmd as n+runD (Add s d n) = runDef2 Syntax.Add s d n+runD (User u n) = runDef Syntax.User u n+runD (Label ps n) = runDef Syntax.Label ps n+runD (StopSignal s n) = runDef Syntax.Stopsignal s n+runD (Copy s d n) = runDef2 Syntax.Copy s d n+runD (RunArgs as n) = runDef Syntax.Run as n+runD (Workdir d n) = runDef Syntax.Workdir d n+runD (Expose ps n) = runDef Syntax.Expose ps n+runD (Volume v n) = runDef Syntax.Volume v n+runD (EntrypointArgs e n) = runDef Syntax.Entrypoint e n+runD (Maintainer m n) = runDef Syntax.Maintainer m n+runD (Env ps n) = runDef Syntax.Env ps n+runD (Arg s n) = runDef Syntax.Arg s n+runD (Comment c n) = runDef Syntax.Comment c n+runD (OnBuildRaw i n) = runDef Syntax.OnBuild i n+runD (Embed is n) = do+    tell (map Syntax.instruction is)+    n+ instructionPos :: Syntax.Instruction -> Syntax.InstructionPos instructionPos i = Syntax.InstructionPos i "" 0 @@ -61,7 +77,7 @@     let (_, w) = runWriter (runDockerWriter e)     in map instructionPos w --- | Runs the Dockerfile EDSL and returns a 'String' using+-- | runs the Dockerfile EDSL and returns a 'String' using -- 'Language.Dockerfile.PrettyPrint' -- -- @@@ -114,12 +130,22 @@   -> m () onBuild b = mapM_ (onBuildRaw . Syntax.instruction) (toDockerfile b) --- dockerIgnore :: String -> IO ()--- dockerIgnore str = do---     let str' = str ++ "\n"---     -- TODO - Use projectroot---     di <- readFile "./.dockerignore" `catch` (\(SomeException _) -> return "")---     unless (str' `isInfixOf` di) $---         appendFile "./.dockerignore" str'--- dockerBuild :: FilePath -> IO ()--- dockerBuild _dir = undefined+-- | A version of 'toDockerfile' which allows IO actions+toDockerfileIO :: MonadIO m => EInstructionTM m t -> m Syntax.Dockerfile+toDockerfileIO e = liftM snd (runDockerfileIO e)++-- | A version of 'toDockerfileStr' which allows IO actions+toDockerfileStrIO :: MonadIO m => EInstructionTM m t -> m String+toDockerfileStrIO e = liftM snd (runDockerfileStrIO e)++-- | Just runs the EDSL's writer monad+runDockerfileIO :: MonadIO m => EInstructionTM m t -> m (t, Syntax.Dockerfile)+runDockerfileIO e = do+    (r, w) <- runWriterT (runDockerWriterIO e)+    return (r, map instructionPos w)++-- | Runs the EDSL's writer monad and pretty-prints the result+runDockerfileStrIO :: MonadIO m => EInstructionTM m t -> m (t, String)+runDockerfileStrIO e = do+    (r, w) <- runDockerfileIO e+    return (r, PrettyPrint.prettyPrint w)
+ src/Language/Dockerfile/EDSL/Plugins.hs view
@@ -0,0 +1,5 @@+module Language.Dockerfile.EDSL.Plugins+  where++import           Language.Dockerfile.EDSL+
+ test/Language/Dockerfile/EDSL/PluginsSpec.hs view
@@ -0,0 +1,19 @@+module Language.Dockerfile.EDSL.PluginsSpec+  where++-- import           Language.Dockerfile.EDSL+-- import           Language.Dockerfile.EDSL.Plugins+import           Test.Hspec++spec =+    describe "listPlugins" $+        it "lists docker images matching language-dockerfile-*" pending+            -- str <- toDockerFileStrIO $ do+            --     ds <- liftIO (glob "./test/*.hs")+            --     from "ubuntu"+            --     mapM_ add ds+            -- str `shouldBe` unlines [ "FROM ubuntu"+            --                        , "ADD Spec.hs"+            --                        , "ADD SanitySpec.hs"+            --                        , "ADD Test.hs"+            --                        ]
test/Language/Dockerfile/EDSLSpec.hs view
@@ -1,9 +1,13 @@ {-# LANGUAGE OverloadedStrings #-} module Language.Dockerfile.EDSLSpec where +import           Control.Monad.IO.Class import           Language.Dockerfile.EDSL import           Language.Dockerfile.PrettyPrint import qualified Language.Dockerfile.Syntax      as Syntax+import           System.Directory+import           System.FilePath+import           System.FilePath.Glob import           Test.Hspec  spec :: Spec@@ -40,3 +44,19 @@                                  ]          it "onBuild disallows unallowed instructions" pending++    describe "toDockerfileStrIO" $+        it "let's us run in the IO monad" $ do+            -- TODO - "glob" is a really useful combinator+            str <- toDockerfileStrIO $ do+                fs <- liftIO $ do+                    cwd <- getCurrentDirectory+                    fs <- glob "./test/*.hs"+                    return (map (makeRelative cwd) fs)+                from "ubuntu"+                mapM_ (\f -> add f ("/app/" ++ takeFileName f)) fs+            str `shouldBe` unlines [ "FROM ubuntu"+                                   , "ADD ./test/SanitySpec.hs /app/SanitySpec.hs"+                                   , "ADD ./test/Spec.hs /app/Spec.hs"+                                   , "ADD ./test/Test.hs /app/Test.hs"+                                   ]