language-dockerfile 0.1.2.0 → 0.2.3.0
raw patch · 7 files changed
+74/−34 lines, 7 filessetup-changedPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
- Language.Dockerfile.EDSL.Types: Cmd :: Arguments -> next -> EInstruction next
- Language.Dockerfile.EDSL.Types: Entrypoint :: Arguments -> next -> EInstruction next
- Language.Dockerfile.EDSL.Types: Run :: Arguments -> next -> EInstruction next
+ Language.Dockerfile: cmdArgs :: forall m_ayLx. MonadFree EInstruction m_ayLx => Arguments -> m_ayLx ()
+ Language.Dockerfile: entrypointArgs :: forall m_ayLJ. MonadFree EInstruction m_ayLJ => Arguments -> m_ayLJ ()
+ Language.Dockerfile: runArgs :: forall m_ayLu. MonadFree EInstruction m_ayLu => Arguments -> m_ayLu ()
+ Language.Dockerfile.EDSL: cmdArgs :: forall m_ayLx. MonadFree EInstruction m_ayLx => Arguments -> m_ayLx ()
+ Language.Dockerfile.EDSL: entrypointArgs :: forall m_ayLJ. MonadFree EInstruction m_ayLJ => Arguments -> m_ayLJ ()
+ Language.Dockerfile.EDSL: runArgs :: forall m_ayLu. MonadFree EInstruction m_ayLu => Arguments -> m_ayLu ()
+ Language.Dockerfile.EDSL.Types: CmdArgs :: Arguments -> next -> EInstruction next
+ Language.Dockerfile.EDSL.Types: EntrypointArgs :: Arguments -> next -> EInstruction next
+ Language.Dockerfile.EDSL.Types: RunArgs :: Arguments -> next -> EInstruction next
- Language.Dockerfile: cmd :: forall m_ayLx. MonadFree EInstruction m_ayLx => Arguments -> m_ayLx ()
+ Language.Dockerfile: cmd :: MonadFree EInstruction m => String -> m ()
- Language.Dockerfile: entrypoint :: forall m_ayLJ. MonadFree EInstruction m_ayLJ => Arguments -> m_ayLJ ()
+ Language.Dockerfile: entrypoint :: MonadFree EInstruction m => String -> m ()
- Language.Dockerfile: run :: forall m_ayLu. MonadFree EInstruction m_ayLu => Arguments -> m_ayLu ()
+ Language.Dockerfile: run :: MonadFree EInstruction m => String -> m ()
- Language.Dockerfile.EDSL: cmd :: forall m_ayLx. MonadFree EInstruction m_ayLx => Arguments -> m_ayLx ()
+ Language.Dockerfile.EDSL: cmd :: MonadFree EInstruction m => String -> m ()
- Language.Dockerfile.EDSL: entrypoint :: forall m_ayLJ. MonadFree EInstruction m_ayLJ => Arguments -> m_ayLJ ()
+ Language.Dockerfile.EDSL: entrypoint :: MonadFree EInstruction m => String -> m ()
- Language.Dockerfile.EDSL: run :: forall m_ayLu. MonadFree EInstruction m_ayLu => Arguments -> m_ayLu ()
+ Language.Dockerfile.EDSL: run :: MonadFree EInstruction m => String -> m ()
Files
- README.md +28/−2
- Setup.hs +2/−0
- language-dockerfile.cabal +18/−18
- src/Language/Dockerfile.hs +3/−0
- src/Language/Dockerfile/EDSL.hs +12/−3
- src/Language/Dockerfile/EDSL/Types.hs +3/−3
- test/Language/Dockerfile/EDSLSpec.hs +8/−8
README.md view
@@ -2,6 +2,8 @@ Dockerfile linter, parser, pretty-printer and embedded DSL, forked from [hadolint](https://github.com/lukasmartinelli/hadolint). +Published on Hackage as [language-dockerfile](https://hackage.haskell.org/package/language-dockerfile).+ It extends hadolint with the pretty-printer and EDSL for writting Dockerfiles in Haskell. @@ -35,7 +37,8 @@ import Language.Dockerfile main = putStr $ toDockerfileStr $ do from "node"- run (words "apt-get update")+ run "apt-get update"+ run ["apt-get", "install", "something"] -- ... ``` @@ -46,12 +49,35 @@ import Language.Dockerfile main = putStr $ toDockerfileStr $ do from "node"- run (words "apt-get update")+ run "apt-get update" [edockerfile| RUN apt-get update CMD node something.js |] -- ...+```++## Templating Dockerfiles in Haskell+```haskell+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE OverloadedStrings #-}+import Control.Monad+import Language.Dockerfile+tags = ["7.8", "7.10", "8"]+cabalSandboxBuild packageName = do+ let cabalFile = packageName ++ ".cabal"+ run "cabal sandbox init"+ run "cabal update"+ add cabalFile ("/app/" ++ cabalFile)+ run "cabal install --only-dep -j"+ add "." "/app/"+ run "cabal build"+main =+ forM_ tags $ \tag -> do+ let df = toDockerfileStr $ do+ from ("haskell" `tagged` tag)+ cabalSandboxBuild "mypackage"+ writeFile ("./examples/templating-" ++ tag ++ ".dockerfile") df ``` ## License
+ Setup.hs view
@@ -0,0 +1,2 @@+import Distribution.Simple+main = defaultMain
language-dockerfile.cabal view
@@ -3,7 +3,7 @@ -- see: https://github.com/sol/hpack name: language-dockerfile-version: 0.1.2.0+version: 0.2.3.0 synopsis: Dockerfile linter, parser, pretty-printer and embedded DSL description: Forked from @hadolint@. .@@ -15,16 +15,16 @@ - @dockerfmt@ Builds example pretty-printer usage, which reads a Dockerfile and pretty-prints it to stdout . See the <https://github.com/beijaflor-io/haskell-language-dockerfile GitHub project> for the source-code and examples. +category: Development homepage: https://github.com/beijaflor-io/language-dockerfile#readme bug-reports: https://github.com/beijaflor-io/language-dockerfile/issues-license: GPL-3-license-file: LICENSE author: Lukas Martinelli, Pedro Tacla Yamada maintainer: tacla.yamada@gmail.com copyright: Lukas Martinelli, Copyright (c) 2016, Pedro Tacla Yamada, Copyright (c) 2016-category: Development+license: GPL-3+license-file: LICENSE build-type: Simple cabal-version: >= 1.10 @@ -79,9 +79,9 @@ default-language: Haskell2010 executable dockerfmt+ main-is: DockerFmt.hs hs-source-dirs: bin- main-is: DockerFmt.hs build-depends: ShellCheck , base >=4.8 && <5@@ -103,9 +103,9 @@ default-language: Haskell2010 executable hadolint+ main-is: HadoLint.hs hs-source-dirs: bin- main-is: HadoLint.hs build-depends: ShellCheck , base >=4.8 && <5@@ -122,16 +122,16 @@ buildable: False if flag(hadolint) buildable: True- default-language: Haskell2010 other-modules: DockerFmt+ default-language: Haskell2010 test-suite hadolint-unit-tests+ type: exitcode-stdio-1.0+ main-is: Test.hs hs-source-dirs: src , test- type: exitcode-stdio-1.0- main-is: Test.hs build-depends: ShellCheck , base >=4.8 && <5@@ -147,7 +147,6 @@ , HUnit >=1.2 , test-framework , test-framework-hunit- default-language: Haskell2010 other-modules: Language.Dockerfile Language.Dockerfile.Bash@@ -166,15 +165,13 @@ Language.Dockerfile.EDSLSpec SanitySpec Spec+ default-language: Haskell2010 test-suite hspec- main-is: Spec.hs type: exitcode-stdio-1.0- other-modules:- Language.Dockerfile.EDSL.QuasiSpec- Language.Dockerfile.EDSLSpec- SanitySpec- Test+ main-is: Spec.hs+ hs-source-dirs:+ test build-depends: ShellCheck , base >=4.8 && <5@@ -190,6 +187,9 @@ , hspec , QuickCheck , language-dockerfile- hs-source-dirs:- test+ other-modules:+ Language.Dockerfile.EDSL.QuasiSpec+ Language.Dockerfile.EDSLSpec+ SanitySpec+ Test default-language: Haskell2010
src/Language/Dockerfile.hs view
@@ -26,11 +26,14 @@ , Language.Dockerfile.EDSL.stopSignal , Language.Dockerfile.EDSL.copy , Language.Dockerfile.EDSL.run+ , Language.Dockerfile.EDSL.runArgs , Language.Dockerfile.EDSL.cmd+ , Language.Dockerfile.EDSL.cmdArgs , Language.Dockerfile.EDSL.workdir , Language.Dockerfile.EDSL.expose , Language.Dockerfile.EDSL.volume , Language.Dockerfile.EDSL.entrypoint+ , Language.Dockerfile.EDSL.entrypointArgs , Language.Dockerfile.EDSL.maintainer , Language.Dockerfile.EDSL.env , Language.Dockerfile.EDSL.arg
src/Language/Dockerfile/EDSL.hs view
@@ -31,17 +31,17 @@ 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 (Cmd as n) = runDef Syntax.Cmd as 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 (Run as n) = runDef Syntax.Run as 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 (Entrypoint e n) = runDef Syntax.Entrypoint e 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@@ -86,6 +86,15 @@ digested :: String -> ByteString -> EBaseImage digested = EDigestedImage++run :: MonadFree EInstruction m => String -> m ()+run = runArgs . words++entrypoint :: MonadFree EInstruction m => String -> m ()+entrypoint = entrypointArgs . words++cmd :: MonadFree EInstruction m => String -> m ()+cmd = cmdArgs . words -- | ONBUILD Dockerfile instruction --
src/Language/Dockerfile/EDSL/Types.hs view
@@ -20,12 +20,12 @@ | Label Syntax.Pairs next | StopSignal String next | Copy Syntax.Source Syntax.Destination next- | Run Syntax.Arguments next- | Cmd Syntax.Arguments next+ | RunArgs Syntax.Arguments next+ | CmdArgs Syntax.Arguments next | Workdir Syntax.Directory next | Expose [Syntax.Port] next | Volume String next- | Entrypoint Syntax.Arguments next+ | EntrypointArgs Syntax.Arguments next | Maintainer String next | Env Syntax.Pairs next | Arg String next
test/Language/Dockerfile/EDSLSpec.hs view
@@ -12,7 +12,7 @@ it "allows us to write haskell code that represents Dockerfiles" $ do let r = map Syntax.instruction $ toDockerfile (do from "node"- cmd ["node", "-e", "'console.log(\'hey\')'"])+ cmdArgs ["node", "-e", "'console.log(\'hey\')'"]) r `shouldBe` [ Syntax.From (Syntax.UntaggedImage "node") , Syntax.Cmd ["node", "-e", "'console.log(\'hey\')'"] ]@@ -21,22 +21,22 @@ it "allows us to write haskell code that represents Dockerfiles" $ do let r = prettyPrint $ toDockerfile (do from "node"- cmd ["node", "-e", "'console.log(\'hey\')'"])+ cmdArgs ["node", "-e", "'console.log(\'hey\')'"]) r `shouldBe` unlines [ "FROM node" , "CMD node -e 'console.log(\'hey\')'" ] it "onBuild let's us nest statements" $ do- let r = prettyPrint $ toDockerfile (do+ let r = prettyPrint $ toDockerfile $ do from "node"- cmd ["node", "-e", "'console.log(\'hey\')'"]+ cmdArgs ["node", "-e", "'console.log(\'hey\')'"] onBuild $ do- run ["echo", "hello world"]- run ["echo", "hello world2"])+ run "echo \"hello world\""+ run "echo \"hello world2\"" r `shouldBe` unlines [ "FROM node" , "CMD node -e 'console.log(\'hey\')'"- , "ONBUILD RUN echo hello world"- , "ONBUILD RUN echo hello world2"+ , "ONBUILD RUN echo \"hello world\""+ , "ONBUILD RUN echo \"hello world2\"" ] it "onBuild disallows unallowed instructions" pending