language-dockerfile 0.3.2.0 → 0.3.3.0
raw patch · 12 files changed
+84/−16 lines, 12 filesdep +process
Dependencies added: process
Files
- language-dockerfile.cabal +6/−1
- src/Language/Dockerfile.hs +3/−1
- src/Language/Dockerfile/EDSL.hs +6/−0
- src/Language/Dockerfile/EDSL/Types.hs +2/−2
- src/Language/Dockerfile/Parser.hs +6/−6
- src/Language/Dockerfile/PrettyPrint.hs +4/−1
- src/Language/Dockerfile/Rules.hs +1/−1
- src/Language/Dockerfile/Syntax.hs +19/−2
- src/Language/Dockerfile/Syntax/Lift.hs +1/−0
- test/Language/Dockerfile/EDSL/QuasiSpec.hs +2/−2
- test/Language/Dockerfile/ExamplesSpec.hs +20/−0
- test/Language/Dockerfile/ParserSpec.hs +14/−0
language-dockerfile.cabal view
@@ -3,7 +3,7 @@ -- see: https://github.com/sol/hpack name: language-dockerfile-version: 0.3.2.0+version: 0.3.3.0 synopsis: Dockerfile linter, parser, pretty-printer and embedded DSL description: Forked from @hadolint@. .@@ -170,6 +170,8 @@ Language.Dockerfile.EDSL.PluginsSpec Language.Dockerfile.EDSL.QuasiSpec Language.Dockerfile.EDSLSpec+ Language.Dockerfile.ExamplesSpec+ Language.Dockerfile.ParserSpec SanitySpec Spec default-language: Haskell2010@@ -198,10 +200,13 @@ , Glob , directory , filepath+ , process other-modules: Language.Dockerfile.EDSL.PluginsSpec Language.Dockerfile.EDSL.QuasiSpec Language.Dockerfile.EDSLSpec+ Language.Dockerfile.ExamplesSpec+ Language.Dockerfile.ParserSpec SanitySpec Test default-language: Haskell2010
src/Language/Dockerfile.hs view
@@ -38,6 +38,8 @@ , Language.Dockerfile.EDSL.cmdArgs , Language.Dockerfile.EDSL.workdir , Language.Dockerfile.EDSL.expose+ , Language.Dockerfile.EDSL.ports+ , Language.Dockerfile.EDSL.port , Language.Dockerfile.EDSL.volume , Language.Dockerfile.EDSL.entrypoint , Language.Dockerfile.EDSL.entrypointArgs@@ -62,7 +64,7 @@ , Language.Dockerfile.Syntax.BaseImage(..) , Language.Dockerfile.Syntax.Image , Language.Dockerfile.Syntax.Tag- , Language.Dockerfile.Syntax.Port+ , Language.Dockerfile.Syntax.Ports , Language.Dockerfile.Syntax.Directory , Language.Dockerfile.Syntax.Source , Language.Dockerfile.Syntax.Destination
src/Language/Dockerfile/EDSL.hs view
@@ -103,6 +103,12 @@ digested :: String -> ByteString -> EBaseImage digested = EDigestedImage +ports :: [Integer] -> Syntax.Ports+ports = Syntax.Ports++port :: Integer -> Syntax.Ports+port = Syntax.Ports . (:[])+ run :: MonadFree EInstruction m => String -> m () run = runArgs . words
src/Language/Dockerfile/EDSL/Types.hs view
@@ -2,7 +2,7 @@ module Language.Dockerfile.EDSL.Types where -import Data.ByteString.Char8 (ByteString)+import Data.ByteString.Char8 (ByteString) import Data.String import qualified Language.Dockerfile.Syntax as Syntax @@ -23,7 +23,7 @@ | RunArgs Syntax.Arguments next | CmdArgs Syntax.Arguments next | Workdir Syntax.Directory next- | Expose [Syntax.Port] next+ | Expose Syntax.Ports next | Volume String next | EntrypointArgs Syntax.Arguments next | Maintainer String next
src/Language/Dockerfile/Parser.hs view
@@ -1,11 +1,10 @@ module Language.Dockerfile.Parser where -import Text.Parsec hiding (label)-import Text.Parsec.String (Parser)- import Control.Monad (void) import Data.ByteString.Char8 (pack)-+import Data.String+import Text.Parsec hiding (label)+import Text.Parsec.String (Parser) import qualified Text.Parsec.Token as Token import Language.Dockerfile.Lexer@@ -136,8 +135,9 @@ expose :: Parser Instruction expose = do reserved "EXPOSE"- ports <- many natural- return $ Expose ports+ sports <- untilEol+ let port = fromString sports+ return $ Expose port run :: Parser Instruction run = do
src/Language/Dockerfile/PrettyPrint.hs view
@@ -73,9 +73,12 @@ Workdir w -> do text "WORKDIR" text w- Expose ps -> do+ Expose (Ports ps) -> do text "EXPOSE" hsep (map (text . show) ps)+ Expose (PortStr p) -> do+ text "EXPOSE"+ text p Volume dir -> do text "VOLUME" text dir
src/Language/Dockerfile/Rules.hs view
@@ -229,7 +229,7 @@ where code = "DL3011" severity = ErrorC message = "Valid UNIX ports range from 0 to 65535"- check (Expose ports) = and [p <= 65535 | p <- ports]+ check (Expose (Ports ports)) = and [p <= 65535 | p <- ports] check _ = True maintainerAddress = instructionRule code severity message check
src/Language/Dockerfile/Syntax.hs view
@@ -1,10 +1,27 @@ module Language.Dockerfile.Syntax where import Data.ByteString.Char8 (ByteString)+import Data.Maybe+import Data.String+import Text.Read type Image = String type Tag = String-type Port = Integer++data Ports = Ports [Integer]+ | PortStr String+ deriving(Show, Eq, Ord)++instance IsString Ports where+ fromString p = case readMaybe p of+ Just i -> Ports [i]+ Nothing ->+ let rs = map readMaybe (words p)+ in if all isJust rs+ then Ports (catMaybes rs)+ else PortStr p++ type Directory = String data BaseImage@@ -31,7 +48,7 @@ | Run Arguments | Cmd Arguments | Workdir Directory- | Expose [Port]+ | Expose Ports | Volume String | Entrypoint Arguments | Maintainer String
src/Language/Dockerfile/Syntax/Lift.hs view
@@ -8,6 +8,7 @@ import Language.Dockerfile.Syntax +deriveLift ''Ports deriveLift ''BaseImage deriveLift ''Instruction deriveLift ''InstructionPos
test/Language/Dockerfile/EDSL/QuasiSpec.hs view
@@ -26,14 +26,14 @@ it "lets us use parsed dockerfiles seamlessly in our DSL" $ do let d = do from "node"- expose [8080]+ expose "8080" [edockerfile| RUN apt-get update CMD node something.js |] df = map instruction (toDockerfile d) df `shouldBe` [ From (UntaggedImage "node")- , Expose [8080]+ , Expose (Ports [8080]) , Run ["apt-get", "update"] , Cmd ["node", "something.js"] ]
+ test/Language/Dockerfile/ExamplesSpec.hs view
@@ -0,0 +1,20 @@+module Language.Dockerfile.ExamplesSpec where++import Control.Monad+import Data.Monoid+import System.Directory+import System.FilePath+import System.FilePath.Glob+import System.Process+import Test.Hspec++stackRunGhc e = callProcess "stack" ["runghc", e]++spec :: Spec+spec = do+ cwd <- runIO getCurrentDirectory+ exampleSources <- runIO $ glob "./examples/*.hs"+ forM_ exampleSources $ \exampleSource -> do+ let exampleSource' = makeRelative cwd exampleSource+ describe exampleSource $ it ("stack runghc " <> exampleSource') $+ stackRunGhc exampleSource
+ test/Language/Dockerfile/ParserSpec.hs view
@@ -0,0 +1,14 @@+module Language.Dockerfile.ParserSpec+ where++import Language.Dockerfile.Parser+import Language.Dockerfile.Syntax+import Test.Hspec+import Text.Parsec++spec :: Spec+spec =+ describe "expose" $ do+ it "should handle number ports" $ do+ let content = "EXPOSE 8080"+ parse expose "" content `shouldBe` Right (Expose (Ports [8080]))