Skip to content

Commit

Permalink
Merge pull request #54 from hadolint/improved-parser
Browse files Browse the repository at this point in the history
Parser rewrite
  • Loading branch information
lorenzo committed Jun 2, 2020
2 parents 8858f5b + b16e62d commit 9983e86
Show file tree
Hide file tree
Showing 46 changed files with 2,385 additions and 2,508 deletions.
7 changes: 0 additions & 7 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,6 @@ matrix:
# Nightly builds are allowed to fail
- env: ARGS="--resolver nightly"

# Build on OS X in addition to Linux
- env: ARGS="--resolver lts"
os: osx

- env: ARGS="--resolver nightly"
os: osx

- env:
- PURPOSE="Integration tests"
- ARGS=""
Expand Down
3 changes: 0 additions & 3 deletions Dockerfile

This file was deleted.

97 changes: 2 additions & 95 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,6 @@ 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)
- [Using IO in the DSL](#using-io-in-the-dsl)

## Parsing files

Expand All @@ -35,98 +31,9 @@ main = do
print (parseString c)
```

## Pretty-printing files
## Create Dockerfiles

```haskell
import Language.Docker
main = do
Right d <- parseFile "./Dockerfile"
putStr (prettyPrint d)
```

## Writing Dockerfiles in Haskell

```haskell
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE OverloadedLists #-}
import Language.Docker

main = putDockerfileStr $ do
from "node"
run "apt-get update"
run ["apt-get", "install", "something"]
-- ...
```

## Using the QuasiQuoter

```haskell
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes #-}
import Language.Docker
main = putDockerfileStr $ do
from "node"
run "apt-get update"
[edockerfile|
RUN apt-get update
CMD node something.js
|]
-- ...
```

## Templating Dockerfiles in Haskell

```haskell
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE OverloadedLists #-}
import Control.Monad
import Language.Docker
import Data.String (fromString)
import qualified Data.Text.Lazy.IO as L

tags = ["7.8", "7.10", "8"]
cabalSandboxBuild packageName = do
let cabalFile = packageName ++ ".cabal"
run "cabal sandbox init"
run "cabal update"
add [fromString cabalFile] (fromString $ "/app/" ++ cabalFile)
run "cabal install --only-dep -j"
add "." "/app/"
run "cabal build"
main =
forM_ tags $ \tag -> do
let df = toDockerfileText $ do
from ("haskell" `tagged` tag)
cabalSandboxBuild "mypackage"
L.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 #-}
{-# LANGUAGE OverloadedLists #-}
import Language.Docker
import qualified System.Directory as Directory
import qualified System.FilePath as FilePath
import qualified System.FilePath.Glob as Glob
import Data.List.NonEmpty (fromList)
import qualified Data.Text.Lazy.IO as L

main = do
str <- toDockerfileTextIO $ do
fs <- liftIO $ do
cwd <- Directory.getCurrentDirectory
fs <- Glob.glob "./test/*.hs"
let relativeFiles = map (FilePath.makeRelative cwd) fs
return (fromList relativeFiles)
from "ubuntu"
copy $ (toSources fs) `to` "/app/"
L.putStr str
```
Use the [dockerfile-creator package](https://github.com/hadolint/dockerfile-creator)

[hackage-img]: https://img.shields.io/hackage/v/language-docker.svg
[hackage]: https://hackage.haskell.org/package/language-docker
Expand Down
37 changes: 0 additions & 37 deletions examples/complex.hs

This file was deleted.

14 changes: 0 additions & 14 deletions examples/edsl-quasi.hs

This file was deleted.

11 changes: 0 additions & 11 deletions examples/edsl.hs

This file was deleted.

5 changes: 0 additions & 5 deletions examples/parse-string.hs

This file was deleted.

4 changes: 0 additions & 4 deletions examples/parse.hs

This file was deleted.

6 changes: 0 additions & 6 deletions examples/pretty-print.hs

This file was deleted.

7 changes: 0 additions & 7 deletions examples/templating-7.10.dockerfile

This file was deleted.

7 changes: 0 additions & 7 deletions examples/templating-7.8.dockerfile

This file was deleted.

7 changes: 0 additions & 7 deletions examples/templating-8.dockerfile

This file was deleted.

29 changes: 0 additions & 29 deletions examples/templating.hs

This file was deleted.

5 changes: 0 additions & 5 deletions examples/test-dockerfile.dockerfile

This file was deleted.

14 changes: 0 additions & 14 deletions examples/test-dockerfile.hs

This file was deleted.

4 changes: 1 addition & 3 deletions integration-tests/parse_files.sh
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,7 @@ set -o nounset

readonly CWD="$PWD"
readonly TESTS_DIR="integration-tests/Dockerfiles"
BLACKLIST="./Dockerfiles/dockerfiles/nylas/sync-engine/Dockerfile"
BLACKLIST=$BLACKLIST" ./Dockerfiles/docker-images/OracleWebLogic/samples/12212-domain/Dockerfile"
BLACKLIST=$BLACKLIST" ./Dockerfiles/docker-images/OracleWebLogic/samples/12213-domain/Dockerfile"
BLACKLIST=""

function git_clone() {
local git_url="$1"
Expand Down
90 changes: 90 additions & 0 deletions language-docker.cabal
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
cabal-version: 1.12

-- This file has been generated from package.yaml by hpack version 0.31.2.
--
-- see: https://github.com/sol/hpack
--
-- hash: 4064f903443322af4bc07da09abc22ee61ae143bfcffb403add7b327cd7b13dd

name: language-docker
version: 9.0.0
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.
category: Development
homepage: https://github.com/hadolint/language-docker#readme
bug-reports: https://github.com/hadolint/language-docker/issues
author: Lukas Martinelli,
Pedro Tacla Yamada,
José Lorenzo Rodríguez
maintainer: [email protected]
copyright: Lukas Martinelli, Copyright (c) 2016,
Pedro Tacla Yamada, Copyright (c) 2016,
José Lorenzo Rodríguez, Copyright (c) 2017
license: GPL-3
license-file: LICENSE
build-type: Simple
extra-source-files:
README.md

source-repository head
type: git
location: https://github.com/hadolint/language-docker

library
exposed-modules:
Language.Docker
Language.Docker.Parser
Language.Docker.PrettyPrint
Language.Docker.Syntax
other-modules:
Language.Docker.Parser.Arguments
Language.Docker.Parser.Cmd
Language.Docker.Parser.Copy
Language.Docker.Parser.Expose
Language.Docker.Parser.From
Language.Docker.Parser.Healthcheck
Language.Docker.Parser.Instruction
Language.Docker.Parser.Pairs
Language.Docker.Parser.Prelude
Language.Docker.Parser.Run
Paths_language_docker
hs-source-dirs:
src
ghc-options: -Wall -Wcompat -Wincomplete-record-updates -Wincomplete-uni-patterns -Wredundant-constraints -fno-warn-unused-do-bind -fno-warn-orphans
build-depends:
base >=4.13 && <5
, bytestring >=0.10
, containers
, data-default-class
, megaparsec >=8.0
, prettyprinter
, split >=0.2
, text
, time
default-language: Haskell2010

test-suite hspec
type: exitcode-stdio-1.0
main-is: Spec.hs
other-modules:
Language.Docker.IntegrationSpec
Language.Docker.ParserSpec
Paths_language_docker
hs-source-dirs:
test
build-depends:
HUnit >=1.2
, QuickCheck
, base >=4.13 && <5
, bytestring >=0.10
, containers
, data-default-class
, hspec
, language-docker
, megaparsec >=8.0
, prettyprinter
, split >=0.2
, text
, time
default-language: Haskell2010
Loading

0 comments on commit 9983e86

Please sign in to comment.