Move HsYAML-based code to new package dhall-yaml (#1514)

* Shared code for the dhall-to-yaml[-ng] executables stays in dhall-json.
* Shared tests are in dhall-yaml.

Fixes #1435.
This commit is contained in:
Simon Jakobi 2019-11-07 13:11:04 +01:00 committed by mergify[bot]
parent e931451a2b
commit cd49b65c23
38 changed files with 489 additions and 279 deletions

View File

@ -47,13 +47,14 @@ install:
script:
- export PATH="${PATH}:$(pwd)/bin"
- stack build --flag dhall-json:gpl --copy-bins --local-bin-path ./bin
- stack build --copy-bins --local-bin-path ./bin
- source .travis-functions.sh
- tar -jcvf $(mk_release_name dhall) bin/dhall
- tar -jcvf $(mk_release_name dhall-json) bin/dhall-to-json bin/dhall-to-yaml bin/json-to-dhall bin/yaml-to-dhall
- tar -jcvf $(mk_release_name dhall-json) bin/dhall-to-json bin/dhall-to-yaml bin/json-to-dhall
- tar -jcvf $(mk_release_name dhall-bash) bin/dhall-to-bash
- tar -jcvf $(mk_release_name dhall-lsp-server) bin/dhall-lsp-server
- tar -jcvf $(mk_release_name dhall-nix) bin/dhall-to-nix
- tar -jcvf $(mk_release_name dhall-yaml) bin/dhall-to-yaml-ng bin/yaml-to-dhall
- mkdir -p uploads
- mv *.tar.bz2 uploads/

View File

@ -10,6 +10,7 @@ the following packages:
* [`dhall`](./dhall) - [![Hackage](https://img.shields.io/hackage/v/dhall.svg)](https://hackage.haskell.org/package/dhall)
* [`dhall-bash`](./dhall-bash) - [![Hackage](https://img.shields.io/hackage/v/dhall-bash.svg)](https://hackage.haskell.org/package/dhall-bash)
* [`dhall-json`](./dhall-json) - [![Hackage](https://img.shields.io/hackage/v/dhall-json.svg)](https://hackage.haskell.org/package/dhall-json)
* [`dhall-yaml`](./dhall-yaml) - [![Hackage](https://img.shields.io/hackage/v/dhall-yaml.svg)](https://hackage.haskell.org/package/dhall-yaml)
* [`dhall-nix`](./dhall-nix) - [![Hackage](https://img.shields.io/hackage/v/dhall-nix.svg)](https://hackage.haskell.org/package/dhall-nix)
Navigate to each package's directory for their respective `README`s
@ -38,6 +39,7 @@ visit one of the following links:
* [https://hydra.dhall-lang.org/job/dhall-haskell/master/linux-dhall/latest](https://hydra.dhall-lang.org/job/dhall-haskell/master/linux-dhall/latest)
* [https://hydra.dhall-lang.org/job/dhall-haskell/master/linux-dhall-bash/latest](https://hydra.dhall-lang.org/job/dhall-haskell/master/linux-dhall-bash/latest)
* [https://hydra.dhall-lang.org/job/dhall-haskell/master/linux-dhall-json/latest](https://hydra.dhall-lang.org/job/dhall-haskell/master/linux-dhall-json/latest)
* [https://hydra.dhall-lang.org/job/dhall-haskell/master/linux-dhall-yaml/latest](https://hydra.dhall-lang.org/job/dhall-haskell/master/linux-dhall-yaml/latest)
* [https://hydra.dhall-lang.org/job/dhall-haskell/master/linux-dhall-nix/latest](https://hydra.dhall-lang.org/job/dhall-haskell/master/linux-dhall-nix/latest)
* [https://hydra.dhall-lang.org/job/dhall-haskell/master/linux-dhall-lsp-server/latest](https://hydra.dhall-lang.org/job/dhall-haskell/master/linux-dhall-lsp-server/latest)
@ -67,6 +69,7 @@ download image archives for each package using the following URLs:
* [https://hydra.dhall-lang.org/job/dhall-haskell/master/image-dhall/latest/download/1/docker-image-dhall.tar.gz](https://hydra.dhall-lang.org/job/dhall-haskell/master/image-dhall/latest/download/1/docker-image-dhall.tar.gz)
* [https://hydra.dhall-lang.org/job/dhall-haskell/master/image-dhall-bash/latest/download/1/docker-image-dhall-bash.tar.gz](https://hydra.dhall-lang.org/job/dhall-haskell/master/image-dhall-bash/latest/download/1/docker-image-dhall-bash.tar.gz)
* [https://hydra.dhall-lang.org/job/dhall-haskell/master/image-dhall-json/latest/download/1/docker-image-dhall-json.tar.gz](https://hydra.dhall-lang.org/job/dhall-haskell/master/image-dhall-json/latest/download/1/docker-image-dhall-json.tar.gz)
* [https://hydra.dhall-lang.org/job/dhall-haskell/master/image-dhall-yaml/latest/download/1/docker-image-dhall-yaml.tar.gz](https://hydra.dhall-lang.org/job/dhall-haskell/master/image-dhall-yaml/latest/download/1/docker-image-dhall-yaml.tar.gz)
* [https://hydra.dhall-lang.org/job/dhall-haskell/master/image-dhall-lsp-server/latest/download/1/docker-image-dhall-lsp-server.tar.gz](https://hydra.dhall-lang.org/job/dhall-haskell/master/image-dhall-lsp-server/latest/download/1/docker-image-dhall-lsp-server.tar.gz)
* [https://hydra.dhall-lang.org/job/dhall-haskell/master/image-dhall-nix/latest/download/1/docker-image-dhall-nix.tar.gz](https://hydra.dhall-lang.org/job/dhall-haskell/master/image-dhall-nix/latest/download/1/docker-image-dhall-nix.tar.gz)

View File

@ -49,14 +49,16 @@ for:
- if /I "%DEPLOY_TAG%" NEQ "" (7z a "bin\dhall-json-%DEPLOY_TAG%" "%DEPLOY_DIR%\dhall-to-json.exe")
- if /I "%DEPLOY_TAG%" NEQ "" (7z a "bin\dhall-json-%DEPLOY_TAG%" "%DEPLOY_DIR%\dhall-to-yaml.exe")
- if /I "%DEPLOY_TAG%" NEQ "" (7z a "bin\dhall-json-%DEPLOY_TAG%" "%DEPLOY_DIR%\json-to-dhall.exe")
- if /I "%DEPLOY_TAG%" NEQ "" (7z a "bin\dhall-json-%DEPLOY_TAG%" "%DEPLOY_DIR%\yaml-to-dhall.exe")
- if /I "%DEPLOY_TAG%" NEQ "" (7z a "bin\dhall-bash-%DEPLOY_TAG%" "%DEPLOY_DIR%\dhall-to-bash.exe")
- if /I "%DEPLOY_TAG%" NEQ "" (7z a "bin\dhall-lsp-server-%DEPLOY_TAG%" "%DEPLOY_DIR%\dhall-lsp-server.exe")
- if /I "%DEPLOY_TAG%" NEQ "" (7z a "bin\dhall-yaml-%DEPLOY_TAG%" "%DEPLOY_DIR%\dhall-to-yaml-ng.exe")
- if /I "%DEPLOY_TAG%" NEQ "" (7z a "bin\dhall-yaml-%DEPLOY_TAG%" "%DEPLOY_DIR%\yaml-to-dhall.exe")
test_script:
# chcp 65001 (utf-8) needed to make doctest work
- chcp 65001 && stack test dhall
- stack test dhall-json
- stack test dhall-yaml
- stack test dhall-bash
- stack test dhall-lsp-server
- stack bench dhall --benchmark-arguments "--quick --min-duration=0 --include-first-iter"
@ -79,6 +81,8 @@ artifacts:
name: dhall
- path: bin\dhall-json-%DEPLOY_TAG%
name: dhall-json
- path: bin\dhall-yaml-%DEPLOY_TAG%
name: dhall-yaml
- path: bin\dhall-bash-%DEPLOY_TAG%
name: dhall-bash
- path: bin\dhall-lsp-server-%DEPLOY_TAG%
@ -88,7 +92,7 @@ deploy:
- provider: GitHub
auth_token:
secure: Gs/tiz6Jtg/Zjd4zGHDhuSv4Y9a+zJ574LWwzOe2bvZNGX/M8XupkxdGmBpDlnOf
artifact: dhall, dhall-json, dhall-bash, dhall-lsp-server
artifact: dhall, dhall-json, dhall-yaml, dhall-bash, dhall-lsp-server
on:
APPVEYOR_REPO_TAG: true
STACK_YAML: stack.yaml

View File

@ -1 +1 @@
packages: ./dhall ./dhall-bash ./dhall-json ./dhall-lsp-server ./dhall-nix
packages: ./dhall ./dhall-bash ./dhall-json ./dhall-yaml ./dhall-lsp-server ./dhall-nix

View File

@ -13,6 +13,7 @@ in
dhall-json
dhall-lsp-server
dhall-nix
dhall-yaml
;
inherit (shared_ghcjs) dhall-try;

View File

@ -1,6 +1,3 @@
The following license applies to this package when built without the
`-fgpl` Cabal configure flag
Copyright (c) 2018 Gabriel Gonzalez
All rights reserved.

View File

@ -10,10 +10,9 @@ Full documentation here:
## Introduction
This `dhall-json` package provides a Dhall to JSON compiler and a Dhall to YAML
compiler. The reason this package is called `dhall-json` is that the Haskell
`yaml` library uses the same data structure as Haskell's `aeson` library for
JSON
This `dhall-json` package provides a Dhall to JSON compiler, and a Dhall to YAML
compiler based on that. The `dhall-to-yaml` executable is a "basic" version of
the `dhall-to-yaml-ng` executable in the `dhall-yaml` package.
## Example
@ -30,3 +29,9 @@ foo:
bar:
baz: true
```
## Development
This package's `dhall-to-yaml` and `dhall-yaml`'s `dhall-to-yaml-ng` should be
kept as closely in sync as possible. Common code for these executables lives
in this package, tests live in `dhall-yaml`.

View File

@ -4,7 +4,7 @@ Cabal-Version: >=1.8.0.2
Build-Type: Simple
Tested-With: GHC == 7.10.3, GHC == 8.4.3, GHC == 8.6.1
License: BSD3
License-Files: LICENSE.BSD3, LICENSE.GPLv3
License-File: LICENSE
Copyright: 2017 Gabriel Gonzalez
Author: Gabriel Gonzalez
Maintainer: Gabriel439@gmail.com
@ -26,24 +26,18 @@ Extra-Source-Files:
CHANGELOG.md
tasty/data/*.dhall
tasty/data/*.json
tasty/data/*.txt
tasty/data/*.yaml
Source-Repository head
Type: git
Location: https://github.com/dhall-lang/dhall-haskell/tree/master/dhall-json
Flag gpl
Description: Use GPL-licensed components like HsYAML, and enable yaml-to-dhall binary
Default: False
Manual: True
Library
Hs-Source-Dirs: src
Build-Depends:
base >= 4.8.0.0 && < 5 ,
aeson >= 1.0.0.0 && < 1.5 ,
aeson-pretty < 0.9 ,
aeson-yaml >= 1.0.4 && < 1.1 ,
bytestring < 0.11,
containers ,
dhall >= 1.27.0 && < 1.28,
@ -58,21 +52,11 @@ Library
Exposed-Modules:
Dhall.JSON
Dhall.JSONToDhall
Dhall.Yaml
if flag(gpl)
Exposed-Modules:
Dhall.YamlToDhall
Dhall.JSON.Yaml
Dhall.DhallToYaml.Main
Other-Modules:
Dhall.JSON.Util
GHC-Options: -Wall
if flag(gpl)
CPP-Options: -DGPL
Build-Depends:
HsYAML >= 0.2 && < 0.3,
HsYAML-aeson >= 0.2 && < 0.3
else
Build-Depends:
aeson-yaml >= 1.0.2 && < 1.1
Executable dhall-to-json
Hs-Source-Dirs: dhall-to-json
@ -94,13 +78,8 @@ Executable dhall-to-yaml
Hs-Source-Dirs: dhall-to-yaml
Main-Is: Main.hs
Build-Depends:
base ,
aeson ,
bytestring < 0.11,
dhall ,
dhall-json ,
optparse-applicative ,
text
base ,
dhall-json
Other-Modules:
Paths_dhall_json
GHC-Options: -Wall
@ -126,35 +105,12 @@ Executable json-to-dhall
Paths_dhall_json
GHC-Options: -Wall
Executable yaml-to-dhall
if !flag(gpl)
Buildable: False
Hs-Source-Dirs: yaml-to-dhall
Main-Is: Main.hs
Build-Depends:
base ,
aeson ,
ansi-terminal >= 0.6.3.1 && < 0.11,
bytestring < 0.11,
dhall ,
dhall-json ,
exceptions >= 0.8.3 && < 0.11,
optparse-applicative ,
prettyprinter ,
prettyprinter-ansi-terminal >= 1.1.1 && < 1.2 ,
text < 1.3
if !impl(ghc >= 8.0) && !impl(eta >= 0.8.4)
Build-Depends: semigroups == 0.18.*
Other-Modules:
Paths_dhall_json
GHC-Options: -Wall
Test-Suite tasty
Type: exitcode-stdio-1.0
Hs-Source-Dirs: tasty
Main-Is: Main.hs
Build-Depends:
base,
base ,
aeson ,
bytestring ,
dhall ,
@ -162,3 +118,4 @@ Test-Suite tasty
tasty < 1.3,
text ,
tasty-hunit >= 0.2
GHC-Options: -Wall

View File

@ -1,101 +1,8 @@
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
module Main where
import Control.Applicative (optional, (<|>))
import Control.Exception (SomeException)
import Data.Monoid ((<>))
import Dhall.JSON (parsePreservationAndOmission, parseConversion)
import Dhall.Yaml (Options(..), dhallToYaml, parseDocuments, parseQuoted)
import Options.Applicative (Parser, ParserInfo)
import qualified Control.Exception
import qualified Data.ByteString
import qualified Data.Text.IO as Text.IO
import qualified Data.Version
import qualified GHC.IO.Encoding
import qualified Options.Applicative as Options
import qualified Paths_dhall_json as Meta
import qualified System.Exit
import qualified System.IO
parseOptions :: Parser (Maybe Options)
parseOptions =
Just
<$> ( Options
<$> parseExplain
<*> Dhall.JSON.parsePreservationAndOmission
<*> parseDocuments
<*> parseQuoted
<*> Dhall.JSON.parseConversion
<*> optional parseFile
<*> optional parseOutput
)
<|> parseVersion
where
parseExplain =
Options.switch
( Options.long "explain"
<> Options.help "Explain error messages in detail"
)
parseFile =
Options.strOption
( Options.long "file"
<> Options.help "Read expression from a file instead of standard input"
<> Options.metavar "FILE"
)
parseVersion =
Options.flag'
Nothing
( Options.long "version"
<> Options.help "Display version"
)
parseOutput =
Options.strOption
( Options.long "output"
<> Options.help "Write YAML to a file instead of standard output"
<> Options.metavar "FILE"
)
parserInfo :: ParserInfo (Maybe Options)
parserInfo =
Options.info
(Options.helper <*> parseOptions)
( Options.fullDesc
<> Options.progDesc "Compile Dhall to YAML"
)
import qualified Dhall.DhallToYaml.Main
import qualified Dhall.JSON.Yaml
import qualified Paths_dhall_json as Meta
main :: IO ()
main = do
GHC.IO.Encoding.setLocaleEncoding GHC.IO.Encoding.utf8
maybeOptions <- Options.execParser parserInfo
case maybeOptions of
Nothing -> do
putStrLn (Data.Version.showVersion Meta.version)
Just options@(Options {..}) -> do
handle $ do
contents <- case file of
Nothing -> Text.IO.getContents
Just path -> Text.IO.readFile path
let write =
case output of
Nothing -> Data.ByteString.putStr
Just file_ -> Data.ByteString.writeFile file_
write =<< dhallToYaml options file contents
handle :: IO a -> IO a
handle = Control.Exception.handle handler
where
handler :: SomeException -> IO a
handler e = do
System.IO.hPutStrLn System.IO.stderr ""
System.IO.hPrint System.IO.stderr e
System.Exit.exitFailure
main = Dhall.DhallToYaml.Main.main Meta.version Dhall.JSON.Yaml.dhallToYaml

View File

@ -1,8 +0,0 @@
let
default = (import ./default.nix);
in
{ dhall-json = default.all;
inherit (default) tarball;
}

View File

@ -0,0 +1,108 @@
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{- Shared code for the @dhall-to-yaml@ and @dhall-to-yaml-ng@ executables
-}
module Dhall.DhallToYaml.Main (main) where
import Control.Applicative (optional, (<|>))
import Control.Exception (SomeException)
import Data.ByteString (ByteString)
import Data.Monoid ((<>))
import Data.Text (Text)
import Dhall.JSON (parsePreservationAndOmission, parseConversion)
import Dhall.JSON.Yaml (Options(..), parseDocuments, parseQuoted)
import Options.Applicative (Parser, ParserInfo)
import qualified Control.Exception
import qualified Data.ByteString
import qualified Data.Text.IO as Text.IO
import qualified Data.Version
import qualified GHC.IO.Encoding
import qualified Options.Applicative as Options
import qualified System.Exit
import qualified System.IO
parseOptions :: Parser (Maybe Options)
parseOptions =
Just
<$> ( Options
<$> parseExplain
<*> Dhall.JSON.parsePreservationAndOmission
<*> parseDocuments
<*> parseQuoted
<*> Dhall.JSON.parseConversion
<*> optional parseFile
<*> optional parseOutput
)
<|> parseVersion
where
parseExplain =
Options.switch
( Options.long "explain"
<> Options.help "Explain error messages in detail"
)
parseFile =
Options.strOption
( Options.long "file"
<> Options.help "Read expression from a file instead of standard input"
<> Options.metavar "FILE"
)
parseVersion =
Options.flag'
Nothing
( Options.long "version"
<> Options.help "Display version"
)
parseOutput =
Options.strOption
( Options.long "output"
<> Options.help "Write YAML to a file instead of standard output"
<> Options.metavar "FILE"
)
parserInfo :: ParserInfo (Maybe Options)
parserInfo =
Options.info
(Options.helper <*> parseOptions)
( Options.fullDesc
<> Options.progDesc "Compile Dhall to YAML"
)
main
:: Data.Version.Version
-> (Options -> Maybe FilePath -> Text -> IO ByteString)
-> IO ()
main version dhallToYaml = do
GHC.IO.Encoding.setLocaleEncoding GHC.IO.Encoding.utf8
maybeOptions <- Options.execParser parserInfo
case maybeOptions of
Nothing -> do
putStrLn (Data.Version.showVersion version)
Just options@(Options {..}) -> do
handle $ do
contents <- case file of
Nothing -> Text.IO.getContents
Just path -> Text.IO.readFile path
let write =
case output of
Nothing -> Data.ByteString.putStr
Just file_ -> Data.ByteString.writeFile file_
write =<< dhallToYaml options file contents
handle :: IO a -> IO a
handle = Control.Exception.handle handler
where
handler :: SomeException -> IO a
handler e = do
System.IO.hPutStrLn System.IO.stderr ""
System.IO.hPrint System.IO.stderr e
System.Exit.exitFailure

View File

@ -2,7 +2,12 @@
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
module Dhall.Yaml
{-| Convert Dhall to YAML via JSON
Since JSON is only a subset of YAML, the functionality offered here is more
limited than what the @dhall-yaml@ package can offer.
-}
module Dhall.JSON.Yaml
( Options(..)
, parseDocuments
, parseQuoted
@ -16,24 +21,13 @@ import Data.Monoid ((<>))
import Data.Text (Text)
import Dhall.JSON (Conversion(..), SpecialDoubleMode(..), codeToValue)
import Options.Applicative (Parser)
import Data.ByteString.Lazy (toStrict)
import qualified Data.Aeson
import qualified Data.ByteString
import qualified Data.Aeson.Yaml
import qualified Data.ByteString.Lazy
import qualified Data.Vector
import qualified Dhall
import qualified Options.Applicative
#if defined(GPL)
import qualified Data.YAML.Aeson
import qualified Data.YAML as Y
import qualified Data.YAML.Event as YE
import qualified Data.YAML.Token as YT
import qualified Data.YAML.Schema as YS
import qualified Data.Text as Text
#else
import qualified Data.Aeson.Yaml
import qualified Data.ByteString.Lazy
#endif
data Options = Options
{ explain :: Bool
@ -93,24 +87,6 @@ jsonToYaml
-> Bool
-> ByteString
jsonToYaml json documents quoted =
#if defined(GPL)
case (documents, json) of
(True, Data.Aeson.Array elems)
-> Data.ByteString.intercalate "\n---\n"
$ fmap (Data.ByteString.Lazy.toStrict. (Data.YAML.Aeson.encodeValue' schemaEncoder YT.UTF8). (:[]))
$ Data.Vector.toList elems
_ -> Data.ByteString.Lazy.toStrict (Data.YAML.Aeson.encodeValue' schemaEncoder YT.UTF8 [json])
where
style (Y.SStr s)
| "\n" `Text.isInfixOf` s =
Right (YE.untagged, YE.Literal YE.Clip YE.IndentAuto, s)
| quoted =
Right (YE.untagged, YE.SingleQuoted, s)
style s =
YS.schemaEncoderScalar Y.coreSchemaEncoder s
schemaEncoder = YS.setScalarStyle style Y.coreSchemaEncoder
#else
Data.ByteString.Lazy.toStrict $ case (documents, json) of
(True, Data.Aeson.Array elems)
-> (if quoted
@ -121,4 +97,3 @@ jsonToYaml json documents quoted =
then Data.Aeson.Yaml.encodeQuoted
else Data.Aeson.Yaml.encode
) json
#endif

View File

@ -9,7 +9,6 @@ import Dhall.JSON (Conversion(..))
import Test.Tasty (TestTree)
import qualified Data.Aeson as Aeson
import qualified Data.ByteString
import qualified Data.ByteString.Lazy
import qualified Data.Text.IO
import qualified Dhall.Core as Core
@ -18,7 +17,6 @@ import qualified Dhall.JSON
import qualified Dhall.JSONToDhall as JSONToDhall
import qualified Dhall.Parser
import qualified Dhall.TypeCheck
import qualified Dhall.Yaml
import qualified GHC.IO.Encoding
import qualified Test.Tasty
import qualified Test.Tasty.HUnit
@ -33,15 +31,6 @@ testTree :: TestTree
testTree =
Test.Tasty.testGroup "dhall-json"
[ testDhallToJSON "./tasty/data/issue48"
, testDhallToYaml
Dhall.Yaml.defaultOptions
"./tasty/data/normal"
, testDhallToYaml
Dhall.Yaml.defaultOptions
"./tasty/data/special"
, testDhallToYaml
(Dhall.Yaml.defaultOptions { Dhall.Yaml.quoted = True })
"./tasty/data/quoted"
, testJSONToDhall "./tasty/data/emptyAlternative"
, testJSONToDhall "./tasty/data/emptyObject"
, testJSONToDhall "./tasty/data/emptyList"
@ -140,19 +129,3 @@ testCustomConversionJSONToDhall conv prefix =
testJSONToDhall :: String -> TestTree
testJSONToDhall = testCustomConversionJSONToDhall JSONToDhall.defaultConversion
testDhallToYaml :: Dhall.Yaml.Options -> String -> TestTree
testDhallToYaml options prefix = Test.Tasty.HUnit.testCase prefix $ do
let inputFile = prefix <> ".dhall"
let outputFile = prefix <> ".yaml"
text <- Data.Text.IO.readFile inputFile
actualValue <- do
Dhall.Yaml.dhallToYaml options (Just inputFile) text
expectedValue <- Data.ByteString.readFile outputFile
let message = "Conversion to YAML did not generate the expected output"
Test.Tasty.HUnit.assertEqual message expectedValue actualValue

View File

@ -15,7 +15,7 @@ import qualified Data.Text.Prettyprint.Doc.Render.Text as Pretty
import qualified Dhall.Core
import qualified Dhall.Import
import qualified Dhall.JSON
import qualified Dhall.Yaml
import qualified Dhall.JSON.Yaml
import qualified Dhall.Parser
import qualified Dhall.Pretty
import qualified Dhall.TypeCheck
@ -133,7 +133,7 @@ main = do
Left exception -> do
errOutput exception
Right value -> do
let yamlBytes = Dhall.Yaml.jsonToYaml value False False
let yamlBytes = Dhall.JSON.Yaml.jsonToYaml value False False
case Data.Text.Encoding.decodeUtf8' yamlBytes of
Left exception -> do
errOutput exception

0
dhall-yaml/CHANGELOG.md Normal file
View File

View File

@ -1,7 +1,3 @@
The following license applies to this package when built with the
`-fgpl` Cabal configure flag, including the `yaml-to-dhall` executable,
which cannot be built without that flag.
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007

35
dhall-yaml/README.md Normal file
View File

@ -0,0 +1,35 @@
# `dhall-yaml`
For installation or development instructions, see:
* [`dhall-haskell` - `README`](https://github.com/dhall-lang/dhall-haskell/blob/master/README.md)
Full documentation here:
* [`dhall-yaml` instructions](https://hackage.haskell.org/package/dhall-yaml/docs/Dhall-Yaml.html)
## Introduction
This `dhall-yaml` package provides a Dhall to YAML compiler, `dhall-to-yaml-ng`,
and a tool for deriving Dhall from YAML code: `yaml-to-dhall`.
Tutorials for the analogous JSON tools are available in the `dhall-json` package:
* [`dhall-to-json`](https://hackage.haskell.org/package/dhall-json/docs/Dhall-JSON.html)
* [`json-to-dhall`](https://hackage.haskell.org/package/dhall-json/docs/Dhall-JSONToDhall.html)
## Example
```bash
$ dhall-to-yaml-ng <<< "{ foo = [1, 2, 3], bar = { baz = True } }" > example.yaml
$ cat example.yaml
bar:
baz: true
foo:
- 1
- 2
- 3
$ yaml-to-dhall '{ foo : List Natural, bar : { baz : Bool } }' < example.yaml
{ bar = { baz = True }, foo = [ 1, 2, 3 ] }
```

1
dhall-yaml/default.nix Normal file
View File

@ -0,0 +1 @@
(import ../nix/shared.nix {}).possibly-static.dhall-yaml

View File

@ -0,0 +1,8 @@
module Main where
import qualified Dhall.DhallToYaml.Main
import qualified Dhall.Yaml
import qualified Paths_dhall_yaml as Meta
main :: IO ()
main = Dhall.DhallToYaml.Main.main Meta.version Dhall.Yaml.dhallToYaml

View File

@ -0,0 +1,97 @@
Name: dhall-yaml
Version: 1.6.0
Cabal-Version: >=1.8.0.2
Build-Type: Simple
Tested-With: GHC == 7.10.3, GHC == 8.4.3, GHC == 8.6.1
License: GPL-3
License-File: LICENSE
Copyright: 2019 Gabriel Gonzalez
Author: Gabriel Gonzalez
Maintainer: Gabriel439@gmail.com
Bug-Reports: https://github.com/dhall-lang/dhall-haskell/issues
Synopsis: Convert between Dhall and YAML
Description:
Use this package if you want to convert between Dhall expressions and YAML.
You can use this package as a library or an executable:
.
* See the "Dhall.Yaml" module if you want to use this package as a library
.
* Use the @dhall-to-yaml-ng@ program from this package if you want an executable
Category: Compiler
Extra-Source-Files:
CHANGELOG.md
README.md
tasty/data/*.dhall
tasty/data/*.yaml
tasty/data/*.txt
Source-Repository head
Type: git
Location: https://github.com/dhall-lang/dhall-haskell/tree/master/dhall-yaml
Library
Hs-Source-Dirs: src
Build-Depends:
HsYAML >= 0.2 && < 0.3 ,
HsYAML-aeson >= 0.2 && < 0.3 ,
base >= 4.8.0.0 && < 5 ,
aeson >= 1.0.0.0 && < 1.5 ,
bytestring < 0.11,
dhall >= 1.27.0 && < 1.28,
dhall-json >= 1.5.0 && < 1.6 ,
optparse-applicative >= 0.14.0.0 && < 0.16,
text >= 0.11.1.0 && < 1.3 ,
vector
Exposed-Modules:
Dhall.Yaml
Dhall.YamlToDhall
GHC-Options: -Wall
Executable dhall-to-yaml-ng
Hs-Source-Dirs: dhall-to-yaml-ng
Main-Is: Main.hs
Build-Depends:
base ,
dhall-json,
dhall-yaml
Other-Modules:
Paths_dhall_yaml
GHC-Options: -Wall
Executable yaml-to-dhall
Hs-Source-Dirs: yaml-to-dhall
Main-Is: Main.hs
Build-Depends:
base ,
aeson ,
ansi-terminal >= 0.6.3.1 && < 0.11,
bytestring < 0.11,
dhall ,
dhall-json ,
dhall-yaml ,
exceptions >= 0.8.3 && < 0.11,
optparse-applicative ,
prettyprinter ,
prettyprinter-ansi-terminal >= 1.1.1 && < 1.2 ,
text < 1.3
if !impl(ghc >= 8.0) && !impl(eta >= 0.8.4)
Build-Depends: semigroups == 0.18.*
Other-Modules:
Paths_dhall_yaml
GHC-Options: -Wall
Test-Suite tasty
Type: exitcode-stdio-1.0
Hs-Source-Dirs: tasty
Main-Is: Main.hs
Build-Depends:
base ,
bytestring ,
dhall ,
dhall-json ,
dhall-yaml ,
tasty < 1.3,
tasty-expected-failure < 0.12,
text ,
tasty-hunit >= 0.2
GHC-Options: -Wall

1
dhall-yaml/shell.nix Normal file
View File

@ -0,0 +1 @@
(import ../nix/shared.nix {}).shell-dhall-yaml

View File

@ -0,0 +1,68 @@
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-| Convert Dhall to YAML
-}
module Dhall.Yaml
( Options(..)
, Dhall.JSON.Yaml.defaultOptions
, dhallToYaml
) where
import Data.ByteString (ByteString)
import Data.Text (Text)
import Dhall.JSON (SpecialDoubleMode(..), codeToValue)
import Dhall.JSON.Yaml (Options(..))
import Data.ByteString.Lazy (toStrict)
import qualified Data.Aeson
import qualified Data.ByteString
import qualified Data.Text as Text
import qualified Data.Vector
import qualified Data.YAML as Y
import qualified Data.YAML.Aeson
import qualified Data.YAML.Event as YE
import qualified Data.YAML.Schema as YS
import qualified Data.YAML.Token as YT
import qualified Dhall
import qualified Dhall.JSON.Yaml
{-| Convert a piece of 'Text' carrying a Dhall inscription to an equivalent @YAML@ 'ByteString'
-}
dhallToYaml
:: Options
-> Maybe FilePath -- ^ The source file path. If no path is given, imports
-- are resolved relative to the current directory.
-> Text -- ^ Input text.
-> IO ByteString
dhallToYaml Options{..} mFilePath code = do
let explaining = if explain then Dhall.detailed else id
json <- omission <$> explaining (codeToValue conversion UseYAMLEncoding mFilePath code)
return $ jsonToYaml json documents quoted
-- | Transform json representation into yaml
jsonToYaml
:: Data.Aeson.Value
-> Bool
-> Bool
-> ByteString
jsonToYaml json documents quoted =
case (documents, json) of
(True, Data.Aeson.Array elems)
-> Data.ByteString.intercalate "\n---\n"
$ fmap (Data.ByteString.Lazy.toStrict. (Data.YAML.Aeson.encodeValue' schemaEncoder YT.UTF8). (:[]))
$ Data.Vector.toList elems
_ -> Data.ByteString.Lazy.toStrict (Data.YAML.Aeson.encodeValue' schemaEncoder YT.UTF8 [json])
where
style (Y.SStr s)
| "\n" `Text.isInfixOf` s =
Right (YE.untagged, YE.Literal YE.Clip YE.IndentAuto, s)
| quoted =
Right (YE.untagged, YE.SingleQuoted, s)
style s =
YS.schemaEncoderScalar Y.coreSchemaEncoder s
schemaEncoder = YS.setScalarStyle style Y.coreSchemaEncoder

60
dhall-yaml/tasty/Main.hs Normal file
View File

@ -0,0 +1,60 @@
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE OverloadedLists #-}
{-# LANGUAGE RecordWildCards #-}
module Main where
import Data.Monoid ((<>))
import Dhall.JSON.Yaml (Options(..))
import Test.Tasty (TestTree)
import qualified Data.ByteString
import qualified Data.Text.IO
import qualified Dhall.JSON.Yaml
import qualified Dhall.Yaml
import qualified GHC.IO.Encoding
import qualified Test.Tasty
import qualified Test.Tasty.ExpectedFailure
import qualified Test.Tasty.HUnit
main :: IO ()
main = do
GHC.IO.Encoding.setLocaleEncoding GHC.IO.Encoding.utf8
Test.Tasty.defaultMain testTree
testTree :: TestTree
testTree =
Test.Tasty.testGroup "dhall-yaml"
[ testDhallToYaml
Dhall.JSON.Yaml.defaultOptions
"./tasty/data/normal"
, testDhallToYaml
Dhall.JSON.Yaml.defaultOptions
"./tasty/data/special"
, Test.Tasty.ExpectedFailure.ignoreTestBecause "#1516" $
testDhallToYaml
(Dhall.JSON.Yaml.defaultOptions { quoted = True })
"./tasty/data/quoted"
]
testDhallToYaml :: Options -> String -> TestTree
testDhallToYaml options prefix =
Test.Tasty.testGroup prefix
[ testCase Dhall.Yaml.dhallToYaml "HsYAML"
, testCase Dhall.JSON.Yaml.dhallToYaml "aeson-yaml"
]
where
testCase dhallToYaml s = Test.Tasty.HUnit.testCase s $ do
let inputFile = prefix <> ".dhall"
let outputFile = prefix <> ".yaml"
text <- Data.Text.IO.readFile inputFile
actualValue <- dhallToYaml options (Just inputFile) text
expectedValue <- Data.ByteString.readFile outputFile
let message = "Conversion to YAML did not generate the expected output"
Test.Tasty.HUnit.assertEqual message expectedValue actualValue

View File

@ -30,7 +30,7 @@ import qualified Options.Applicative as Options
import qualified System.Console.ANSI as ANSI
import qualified System.Exit
import qualified System.IO as IO
import qualified Paths_dhall_json as Meta
import qualified Paths_dhall_yaml as Meta
-- ---------------
-- Command options

22
nix/aeson-yaml.nix Normal file
View File

@ -0,0 +1,22 @@
{ mkDerivation, aeson, base, bytestring, stdenv, string-qq, tasty
, tasty-discover, tasty-hunit, text, unordered-containers, vector
, yaml
}:
mkDerivation {
pname = "aeson-yaml";
version = "1.0.4.0";
sha256 = "7a6ddaad23f50dc7b419707e49904ad3b5ea9fcd29d2cae0e4adaf300fbb8264";
isLibrary = true;
isExecutable = true;
libraryHaskellDepends = [
aeson base bytestring text unordered-containers vector
];
testHaskellDepends = [
aeson base bytestring string-qq tasty tasty-discover tasty-hunit
unordered-containers yaml
];
testToolDepends = [ tasty-discover ];
homepage = "https://github.com/clovyr/aeson-yaml";
description = "Output any Aeson value as YAML (pure Haskell library)";
license = stdenv.lib.licenses.bsd3;
}

View File

@ -19,6 +19,7 @@ let
"dhall-json"
"dhall-lsp-server"
"dhall-nix"
"dhall-yaml"
];
mass = function: names: haskellPackagesNew: haskellPackagesOld:
@ -167,6 +168,7 @@ let
# to ../dhall/dhall-lang/
# "dhall-lsp-server"
"dhall-nix"
"dhall-yaml"
]
# Test suite doesn't work on GHCJS or GHC 7.10.3
++ pkgsNew.lib.optional (!(compiler == "ghcjs" || compiler == "ghc7103")) "dhall"
@ -182,6 +184,7 @@ let
"dhall-json"
"dhall-lsp-server"
"dhall-nix"
"dhall-yaml"
];
failOnMissingHaddocksExtension =
@ -216,6 +219,12 @@ let
(pkgsNew.sdist ../dhall-bash)
{ };
dhall-json =
haskellPackagesNew.callCabal2nix
"dhall-json"
(pkgsNew.sdist ../dhall-json)
{ };
dhall-nix =
haskellPackagesNew.callCabal2nix
"dhall-nix"
@ -228,39 +237,11 @@ let
(pkgsNew.sdist ../dhall-lsp-server)
{ };
dhall-json =
# Replace this with
# `haskellPackagesNew.callCabal2nixWithOptions` once we
# upgrade to a newer version of Nixpkgs
let
src = pkgsNew.sdist ../dhall-json;
filter = path: type:
pkgsNew.lib.hasSuffix "dhall-json.cabal" path;
expr =
haskellPackagesNew.haskellSrc2nix {
name = "dhall-json";
src =
if pkgsNew.lib.canCleanSource src
then pkgsNew.lib.cleanSourceWith { inherit src filter; }
else src;
extraCabal2nixOptions = "-fgpl";
};
drv = haskellPackagesNew.callPackage expr {};
in
pkgsNew.haskell.lib.overrideCabal drv (old: {
inherit src;
preConfigure = ''
# Generated from ${expr}
${old.preConfigure or ""}
'';
});
dhall-yaml =
haskellPackagesNew.callCabal2nix
"dhall-yaml"
(pkgsNew.sdist ../dhall-yaml)
{ };
dhall-try =
pkgsNew.haskell.lib.overrideCabal
@ -587,6 +568,9 @@ let
dhall-nix-static =
pkgsNew.haskell.lib.statify haskellPackagesOld.dhall-nix;
dhall-yaml-static =
pkgsNew.haskell.lib.statify haskellPackagesOld.dhall-yaml;
};
in
@ -632,6 +616,7 @@ let
dhall-json = makeStaticIfPossible "dhall-json" ;
dhall-lsp-server = makeStaticIfPossible "dhall-lsp-server";
dhall-nix = makeStaticIfPossible "dhall-nix" ;
dhall-yaml = makeStaticIfPossible "dhall-yaml" ;
};
toDockerImage = name:
@ -659,6 +644,7 @@ in
tarball-dhall-json = makeTarball "dhall-json" ;
tarball-dhall-lsp-server = makeTarball "dhall-lsp-server";
tarball-dhall-nix = makeTarball "dhall-nix" ;
tarball-dhall-yaml = makeTarball "dhall-yaml" ;
inherit (pkgs) tarball-website website;
@ -670,6 +656,7 @@ in
dhall-lsp-server
dhall-nix
dhall-try
dhall-yaml
;
inherit (pkgs.releaseTools) aggregate;
@ -680,12 +667,14 @@ in
shell-dhall-lsp-server = pkgs.haskell.packages."${compiler}".dhall-lsp-server.env;
shell-dhall-nix = pkgs.haskell.packages."${compiler}".dhall-nix.env ;
shell-dhall-try = pkgs.haskell.packages."${compiler}".dhall-try.env ;
shell-dhall-yaml = pkgs.haskell.packages."${compiler}".dhall-yaml.env ;
image-dhall = toDockerImage "dhall" ;
image-dhall-bash = toDockerImage "dhall-bash" ;
image-dhall-json = toDockerImage "dhall-json" ;
image-dhall-lsp-server = toDockerImage "dhall-lsp-server";
image-dhall-nix = toDockerImage "dhall-nix" ;
image-dhall-yaml = toDockerImage "dhall-yaml" ;
test-dhall =
pkgs.mkShell

View File

@ -30,7 +30,9 @@ in
# of the compiler
shared_7_10_3.dhall
shared_7_10_3.dhall-bash
# shared_7_10_3.dhall-json
shared_7_10_3.dhall-json
# `HsYAML-aeson` requires Cabal >= 2.2
# shared_7_10_3.dhall-yaml
# `base-noprelude` depends on a specific version of `base`
# shared_7_10_3.dhall-lsp-server
# `hnix` depends on `lens-family-th`, which doesn't support GHC 7.10.3
@ -41,6 +43,7 @@ in
shared_8_6_1.dhall
shared_8_6_1.dhall-bash
shared_8_6_1.dhall-json
shared_8_6_1.dhall-yaml
# `base-noprelude` depends on a specific version of `base`
# shared_8_6_1.dhall-lsp-server
# `hnix` depends on `unix-2.7.*` and doesn't work with GHC 8.6
@ -55,12 +58,14 @@ in
shared.tarball-dhall-json
shared.tarball-dhall-lsp-server
shared.tarball-dhall-nix
shared.tarball-dhall-yaml
shared_ghcjs.tarball-website
# This is the only `dhall` build that runs the test suite
coverage.dhall
coverage.dhall-json
coverage.dhall-yaml
# Check that the package builds with HTTP support compiled out
shared.dhall-no-http
@ -79,6 +84,7 @@ in
tarball-dhall-json
tarball-dhall-lsp-server
tarball-dhall-nix
tarball-dhall-yaml
;
linux-dhall = shared_linux.possibly-static.dhall;
@ -86,6 +92,7 @@ in
linux-dhall-json = shared_linux.possibly-static.dhall-json;
linux-dhall-lsp-server = shared_linux.possibly-static.dhall-lsp-server;
linux-dhall-nix = shared_linux.possibly-static.dhall-nix;
linux-dhall-yaml = shared_linux.possibly-static.dhall-yaml;
inherit (shared_linux)
image-dhall
@ -93,5 +100,6 @@ in
image-dhall-json
image-dhall-lsp-server
image-dhall-nix
image-dhall-yaml
;
}

View File

@ -18,6 +18,7 @@ function release {
release dhall-lsp-server 1.0.2
release dhall-json 1.5.0
release dhall-yaml 1.5.0
release dhall-bash 1.0.24
release dhall-nix 1.1.9
release dhall 1.27.0

View File

@ -9,6 +9,7 @@ shared.pkgs.runCommand "dhall-shell-${shell}" {
static.dhall-json
static.dhall-bash
static.dhall-nix
static.dhall-yaml
];
shellHook = ''
echo "Dhall core tools shell"
@ -20,11 +21,13 @@ shared.pkgs.runCommand "dhall-shell-${shell}" {
echo " Overriding option completion shell flavor:"
echo " $ nix-shell --argstr shell zsh"
source <(dhall --${shell}-completion-script dhall)
source <(dhall-to-bash --${shell}-completion-script dhall-to-bash)
source <(dhall-to-nix --${shell}-completion-script dhall-to-nix)
source <(dhall-to-json --${shell}-completion-script dhall-to-json)
source <(dhall-to-yaml --${shell}-completion-script dhall-to-yaml)
source <(json-to-dhall --${shell}-completion-script json-to-dhall)
source <(dhall --${shell}-completion-script dhall)
source <(dhall-to-bash --${shell}-completion-script dhall-to-bash)
source <(dhall-to-nix --${shell}-completion-script dhall-to-nix)
source <(dhall-to-json --${shell}-completion-script dhall-to-json)
source <(dhall-to-yaml --${shell}-completion-script dhall-to-yaml)
source <(dhall-to-yaml-ng --${shell}-completion-script dhall-to-yaml-ng)
source <(json-to-dhall --${shell}-completion-script json-to-dhall)
source <(yaml-to-dhall --${shell}-completion-script yaml-to-dhall)
'';
} ""

View File

@ -5,6 +5,7 @@ packages:
- dhall-json
- dhall-nix
- dhall-lsp-server
- dhall-yaml
extra-deps:
- th-lift-instances-0.1.13@sha256:2852e468511805cb25d9e3923c9e91647d008ab4a764ec0921e5e40ff8a8e874,2625
- th-lift-0.8.0.1@sha256:cceb81b12c0580e02a7a3898b6d60cca5e1be080741f69ddde4f12210d8ba7ca,1960
@ -21,10 +22,7 @@ extra-deps:
- HsYAML-aeson-0.2.0.0@sha256:04796abfc01cffded83f37a10e6edba4f0c0a15d45bef44fc5bb4313d9c87757,1791
- ordered-containers-0.2.2@sha256:ebf2be3f592d9cf148ea6b8375f8af97148d44f82d8d04476899285e965afdbf,810
- lsp-test-0.6.1.0@sha256:df0fc403c03b6d036be13de3ff23d9951ae2506080135cd6862eded2c969a6da,3483
- aeson-yaml-1.0.2.0@sha256:c578472845478a35756131f4f4a6a929a9021aa2e494e6efe610c033e09868d0,1975
flags:
dhall-json:
gpl: true
- aeson-yaml-1.0.4.0@sha256:72d91a4a2ade87b8a4bdf73937d2c62bd2c60053df1841f8bf1e6204387959b8,1975
nix:
packages:
- ncurses