language-docker 9.1.1 → 9.1.2
raw patch · 5 files changed
+75/−51 lines, 5 files
Files
- language-docker.cabal +2/−2
- src/Language/Docker/Parser.hs +8/−4
- src/Language/Docker/Parser/Copy.hs +1/−1
- test/Language/Docker/IntegrationSpec.hs +32/−18
- test/Language/Docker/ParserSpec.hs +32/−26
language-docker.cabal view
@@ -4,10 +4,10 @@ -- -- see: https://github.com/sol/hpack ----- hash: ba9067e3ceb04237246263c98a2c1d9e876839f8212ee319e48c05670b47861f+-- hash: ae482d4758686e114cb8d504d57ff8a1de39b6262598d3823f9b1b195035e9b0 name: language-docker-version: 9.1.1+version: 9.1.2 synopsis: Dockerfile parser, pretty-printer and embedded DSL description: All functions for parsing and pretty-printing Dockerfiles are exported through @Language.Docker@. For more fine-grained operations look for specific modules that implement a certain functionality. See the <https://github.com/hadolint/language-docker GitHub project> for the source-code and examples.
src/Language/Docker/Parser.hs view
@@ -20,7 +20,7 @@ contents :: Parser a -> Parser a contents p = do- void $ takeWhileP Nothing isSpaceNl+ void $ takeWhileP Nothing (\c -> c == '\r' || c == '\n' || c == ' ' || c == '\t') r <- p eof return r@@ -34,15 +34,19 @@ return $ InstructionPos i (T.pack . sourceName $ pos) (unPos . sourceLine $ pos) parseText :: Text -> Either Error Dockerfile-parseText = parse (contents dockerfile) "<string>"+parseText = parse (contents dockerfile) "<string>" . dos2unix parseFile :: FilePath -> IO (Either Error Dockerfile) parseFile file = doParse <$> B.readFile file where- doParse = parse (contents dockerfile) file . E.decodeUtf8With E.lenientDecode+ doParse = parse (contents dockerfile) file . dos2unix . E.decodeUtf8With E.lenientDecode -- | Reads the standard input until the end and parses the contents as a Dockerfile parseStdin :: IO (Either Error Dockerfile) parseStdin = doParse <$> B.getContents where- doParse = parse (contents dockerfile) "/dev/stdin" . E.decodeUtf8With E.lenientDecode+ doParse = parse (contents dockerfile) "/dev/stdin" . dos2unix . E.decodeUtf8With E.lenientDecode++-- | Changes crlf line endings to simple line endings+dos2unix :: T.Text -> T.Text+dos2unix = T.replace "\r\n" "\n"
src/Language/Docker/Parser/Copy.hs view
@@ -59,7 +59,7 @@ _ -> return $ constr (SourcePath <$> fromList (init paths)) (TargetPath $ last paths) where spaceSeparated =- anyUnless (== ' ') `sepEndBy1` (try requiredWhitespace <?> "at least another file path")+ someUnless "a file" (== ' ') `sepEndBy1` (try requiredWhitespace <?> "at least another file path") stringList = brackets $ commaSep stringLiteral unexpectedFlag :: Text -> Text -> Parser a
test/Language/Docker/IntegrationSpec.hs view
@@ -1,29 +1,43 @@-{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE OverloadedLists #-}+{-# LANGUAGE OverloadedStrings #-}+ module Language.Docker.IntegrationSpec where +import qualified Data.Text as Text+import qualified Data.Text.IO+import qualified Data.Text.Lazy.IO as L import Language.Docker.Parser-import Language.Docker.Syntax import Language.Docker.PrettyPrint (prettyPrint)-import qualified Data.Text.Lazy.IO as L-- import Test.HUnit hiding (Label) import Test.Hspec import Text.Megaparsec hiding (Label)-import qualified Data.Text as Text spec :: Spec spec = do- describe "1" $ do- it "no erors" $ do- parsed <- parseFile "test/fixtures/1.Dockerfile"- case parsed of- Right a -> L.putStr $ prettyPrint a- Left err -> assertFailure $ errorBundlePretty err- describe "2" $ do- it "no erors" $ do- parsed <- parseFile "test/fixtures/2.Dockerfile"- case parsed of- Right a -> L.putStr $ prettyPrint a- Left err -> assertFailure $ errorBundlePretty err+ describe "first" $ do+ it "no erors" $ do+ parsed <- parseFile "test/fixtures/1.Dockerfile"+ case parsed of+ Right a -> L.putStr $ prettyPrint a+ Left err -> assertFailure $ errorBundlePretty err++ describe "second" $ do+ it "no erors" $ do+ parsed <- parseFile "test/fixtures/2.Dockerfile"+ case parsed of+ Right a -> L.putStr $ prettyPrint a+ Left err -> assertFailure $ errorBundlePretty err++ describe "first clrf" $ do+ it "no erors" $ do+ contents <- Data.Text.IO.readFile "test/fixtures/1.Dockerfile"+ case parseText (Text.replace "\n" "\r\n" contents) of+ Right _ -> return ()+ Left err -> assertFailure $ errorBundlePretty err++ describe "second clrf" $ do+ it "no erors" $ do+ contents <- Data.Text.IO.readFile "test/fixtures/2.Dockerfile"+ case parseText (Text.replace "\n" "\r\n" contents) of+ Right _ -> return ()+ Left err -> assertFailure $ errorBundlePretty err
test/Language/Docker/ParserSpec.hs view
@@ -214,56 +214,56 @@ assertAst "CMD true \\\n && true" [Cmd "true && true"] it "quoted command params" $ assertAst "CMD [\"echo\", \"1\"]" [Cmd ["echo", "1"]] it "Parses commas correctly" $ assertAst "CMD [ \"echo\" ,\"-e\" , \"1\"]" [Cmd ["echo", "-e", "1"]]- describe "parse SHELL"- $ it "quoted shell params"- $ assertAst "SHELL [\"/bin/bash\", \"-c\"]" [Shell ["/bin/bash", "-c"]]+ describe "parse SHELL" $+ it "quoted shell params" $+ assertAst "SHELL [\"/bin/bash\", \"-c\"]" [Shell ["/bin/bash", "-c"]] describe "parse HEALTHCHECK" $ do it "parse healthcheck with interval" $ assertAst "HEALTHCHECK --interval=5m \\\nCMD curl -f http://localhost/"- [ Healthcheck- $ Check- $ CheckArgs "curl -f http://localhost/" (Just 300) Nothing Nothing Nothing+ [ Healthcheck $+ Check $+ CheckArgs "curl -f http://localhost/" (Just 300) Nothing Nothing Nothing ] it "parse healthcheck with retries" $ assertAst "HEALTHCHECK --retries=10 CMD curl -f http://localhost/"- [ Healthcheck- $ Check- $ CheckArgs "curl -f http://localhost/" Nothing Nothing Nothing (Just $ Retries 10)+ [ Healthcheck $+ Check $+ CheckArgs "curl -f http://localhost/" Nothing Nothing Nothing (Just $ Retries 10) ] it "parse healthcheck with timeout" $ assertAst "HEALTHCHECK --timeout=10s CMD curl -f http://localhost/"- [ Healthcheck- $ Check- $ CheckArgs "curl -f http://localhost/" Nothing (Just 10) Nothing Nothing+ [ Healthcheck $+ Check $+ CheckArgs "curl -f http://localhost/" Nothing (Just 10) Nothing Nothing ] it "parse healthcheck with start-period" $ assertAst "HEALTHCHECK --start-period=2m CMD curl -f http://localhost/"- [ Healthcheck- $ Check- $ CheckArgs "curl -f http://localhost/" Nothing Nothing (Just 120) Nothing+ [ Healthcheck $+ Check $+ CheckArgs "curl -f http://localhost/" Nothing Nothing (Just 120) Nothing ] it "parse healthcheck with all flags" $ assertAst "HEALTHCHECK --start-period=2s --timeout=1m --retries=3 --interval=5s CMD curl -f http://localhost/"- [ Healthcheck- $ Check- $ CheckArgs- "curl -f http://localhost/"- (Just 5)- (Just 60)- (Just 2)- (Just $ Retries 3)+ [ Healthcheck $+ Check $+ CheckArgs+ "curl -f http://localhost/"+ (Just 5)+ (Just 60)+ (Just 2)+ (Just $ Retries 3) ] it "parse healthcheck with no flags" $ assertAst "HEALTHCHECK CMD curl -f http://localhost/"- [ Healthcheck- $ Check- $ CheckArgs "curl -f http://localhost/" Nothing Nothing Nothing Nothing+ [ Healthcheck $+ Check $+ CheckArgs "curl -f http://localhost/" Nothing Nothing Nothing Nothing ] describe "parse MAINTAINER" $ do it "maintainer of untagged scratch image" $@@ -456,6 +456,12 @@ in assertAst file [ Copy $ CopyArgs (fmap SourcePath ["C:\\\\go"]) (TargetPath "C:\\\\go") NoChown NoSource+ ]+ it "does not get confused with trailing whitespace" $+ let file = Text.unlines ["COPY a b "]+ in assertAst+ file+ [ Copy $ CopyArgs [SourcePath "a"] (TargetPath "b") NoChown NoSource ] describe "RUN with experimental flags" $ do it "--mount=type=bind and target" $