ede 0.3.1.0 → 0.3.2.0
raw patch · 8 files changed
+99/−57 lines, 8 filesdep ~filepathdep ~prettyprinterPVP ok
version bump matches the API change (PVP)
Dependency ranges changed: filepath, prettyprinter
API changes (from Hackage documentation)
+ Text.EDE.Internal.Parser: blankLine :: Parser m => m (Exp Delta)
Files
- README.md +16/−1
- app/Main.hs +4/−2
- ede.cabal +10/−7
- lib/Text/EDE.hs +2/−2
- lib/Text/EDE/Internal/Parser.hs +21/−9
- test/Main.hs +30/−35
- test/resources/case.ede +12/−1
- test/resources/case.golden +4/−0
README.md view
@@ -1,6 +1,21 @@ # ED-E -[](https://travis-ci.org/brendanhay/ede)+[![MPL2][license-badge]][license]+[![Build][build-badge]][build]+[![Hackage][hackage-badge]][hackage]+[![Nix][nix-badge]][nix]+[![Cachix][cachix-badge]][cachix]++[license]: https://opensource.org/licenses/MPL-2.0+[license-badge]: https://img.shields.io/badge/license-MPL%202.0-blue.svg+[build]: https://github.com/brendanhay/ede/actions+[build-badge]: https://github.com/brendanhay/ede/workflows/build/badge.svg+[hackage]: http://hackage.haskell.org/package/ede+[hackage-badge]: https://img.shields.io/hackage/v/ede.svg+[nix]: https://nixos.org+[nix-badge]: https://img.shields.io/badge/builtwith-nix-purple.svg+[cachix]: https://amazonka.cachix.org+[cachix-badge]: https://img.shields.io/badge/cachix-amazonka-purple.svg * [Introduction](#introduction) * [Syntax](#syntax)
app/Main.hs view
@@ -15,6 +15,8 @@ import qualified Options.Applicative.Help.Pretty as Pretty import qualified System.Exit as Exit import qualified Text.EDE as EDE+import qualified Prettyprinter as PP+import qualified Prettyprinter.Render.Terminal as PP data Options = Options { templateFile :: FilePath,@@ -109,10 +111,10 @@ >>= either fail pure . Parsec.parseOnly stdinParser EDE.parseFile (templateFile options) >>= \case- EDE.Failure err -> print err >> Exit.exitFailure+ EDE.Failure err -> PP.putDoc (err <> PP.hardline) >> Exit.exitFailure EDE.Success tpl -> case EDE.render tpl ctx of- EDE.Failure err -> print err >> Exit.exitFailure+ EDE.Failure err -> PP.putDoc (err <> PP.hardline) >> Exit.exitFailure EDE.Success output -> Text.Lazy.IO.putStr output stdinParser :: Parsec.Parser Aeson.Object
ede.cabal view
@@ -1,6 +1,6 @@ cabal-version: 2.2 name: ede-version: 0.3.1.0+version: 0.3.2.0 synopsis: Templating language with similar syntax and features to Liquid or Jinja2. @@ -94,25 +94,28 @@ main-is: Main.hs ghc-options: -threaded -rtsopts -with-rtsopts=-A128m build-depends:- , aeson >=0.8+ , aeson >=0.8 , attoparsec- , bytestring >=0.10.4+ , bytestring >=0.10.4 , ede- , optparse-applicative >=0.11- , text >=1.2+ , optparse-applicative >=0.11+ , prettyprinter >=1.6+ , prettyprinter-ansi-terminal >=1.1+ , text >=1.2 -test-suite golden+test-suite tests import: base type: exitcode-stdio-1.0 hs-source-dirs: test main-is: Main.hs- ghc-options: -threaded -rtsopts -with-rtsopts=-A128m+ ghc-options: -threaded build-depends: , aeson , bifunctors , bytestring , directory , ede+ , filepath , tasty , tasty-golden , text
lib/Text/EDE.hs view
@@ -141,7 +141,7 @@ version :: Version version = Paths.version --- | Parse Lazy 'Text.Lazy.Text' into a compiled 'Template'.+-- | Parse a 'ByteString' into a compiled 'Template'. -- -- Because this function is pure and does not resolve @include@s, -- encountering an @include@ expression during parsing will result in an 'Error'.@@ -154,7 +154,7 @@ Result Template parse = Monad.join . parseWith defaultSyntax (includeMap mempty) "Text.EDE.parse" --- | Parse 'Text' into a compiled 'Template'.+-- | Parse a 'ByteString' into a compiled 'Template'. -- -- This function handles all @include@ expressions as 'FilePath's and performs -- recursive loading/parsing.
lib/Text/EDE/Internal/Parser.hs view
@@ -31,7 +31,7 @@ import Control.Comonad.Cofree (Cofree ((:<))) import Control.Lens ((%=)) import qualified Control.Lens as Lens-import Control.Monad (MonadPlus, void)+import Control.Monad (MonadPlus, void, unless) import Control.Monad.State.Strict (MonadState, StateT) import qualified Control.Monad.State.Strict as State import Control.Monad.Trans (lift)@@ -137,7 +137,10 @@ pragma :: Parser m => m () pragma = void . Trifecta.many $ do- !xs <- pragmal *> Trifecta.symbol "EDE_SYNTAX" *> Trifecta.sepBy field spaces <* trimr pragmar+ !xs <- pragmal+ *> Trifecta.symbol "EDE_SYNTAX"+ *> Trifecta.sepBy field spaces+ <* trimr pragmar mapM_ (uncurry Lens.assign) xs where@@ -161,7 +164,7 @@ document = eapp <$> Trifecta.position- <*> Trifecta.many (statement <|> inline <|> fragment)+ <*> Trifecta.many (blankLine <|> statement <|> inline <|> fragment) inline :: Parser m => m (Exp Delta) inline = Trifecta.between inlinel inliner term@@ -191,7 +194,7 @@ block :: Parser m => String -> m a -> m a block k p = Trifecta.try (multiLine (keyword k) p)- <|> singleLine (keyword k) p+ <|> singleLine (keyword k) p multiLine :: Parser m => m b -> m a -> m a multiLine s =@@ -201,6 +204,15 @@ singleLine s = Trifecta.between (Trifecta.try (blockl *> s)) blockr +blankLine :: Parser m => m (Exp Delta)+blankLine = do+ c <- Trifecta.Delta.column <$> Trifecta.position++ unless (c == 0) $+ fail "expected blank line"++ ann (ELit . String . Text.singleton <$> Trifecta.newline)+ ifelif :: Parser m => m (Exp Delta) ifelif = eif@@ -401,13 +413,13 @@ triml :: Parser m => m a -> m a triml p = do- c <- Trifecta.Delta.column <$> Trifecta.position- if c == 0- then Trifecta.spaces *> p- else fail "left whitespace removal failed"+ c <- Trifecta.Delta.column <$> Trifecta.position+ if c == 0+ then Trifecta.spaces *> p+ else fail "left whitespace removal failed" trimr :: Parser m => m a -> m a-trimr p = p <* Trifecta.spaces <* Trifecta.newline+trimr p = p <* Trifecta.newline -- <* Trifecta.newline pragmak :: Parser m => String -> m () pragmak = Trifecta.reserve pragmaStyle
test/Main.hs view
@@ -1,7 +1,7 @@ {-# LANGUAGE OverloadedStrings #-} -- Module : Main--- Copyright : (c) 2013 Brendan Hay <brendan.g.hay@gmail.com>+-- Copyright : (c) 2013-2020 Brendan Hay <brendan.g.hay@gmail.com> -- License : This Source Code Form is subject to the terms of -- the Mozilla Public License, v. 2.0. -- A copy of the MPL can be found in the LICENSE file or@@ -16,57 +16,52 @@ import qualified Data.Bifunctor as Bifunctor import qualified Data.ByteString as ByteString import qualified Data.ByteString.Lazy as ByteString.Lazy+import Data.Functor ((<&>)) import qualified Data.List as List import qualified Data.Maybe as Maybe import qualified Data.Text as Text import qualified Data.Text.Lazy.Encoding as Text.Lazy.Encoding import qualified Paths_ede as Paths import qualified System.Directory as Directory-import qualified System.IO.Unsafe as IO.Unsafe+import System.FilePath ((-<.>), (</>))+import qualified System.FilePath as FilePath import qualified Test.Tasty as Tasty import qualified Test.Tasty.Golden as Tasty.Golden import qualified Text.EDE as EDE --- FIXME: migrate to tasty's resource bracketing. main :: IO ()-main =+main = do+ resources <-+ Paths.getDataDir <&> (</> "test/resources")++ templates <-+ map (FilePath.combine resources) . filter (List.isSuffixOf ".ede")+ <$> Directory.listDirectory resources+ Tasty.defaultMain $ Tasty.testGroup "ED-E" $- IO.Unsafe.unsafePerformIO tests+ map (test resources . FilePath.normalise) templates -resources :: FilePath-resources = IO.Unsafe.unsafePerformIO Paths.getDataDir+test :: FilePath -> FilePath -> Tasty.TestTree+test dir path =+ Tasty.Golden.goldenVsStringDiff path diff (path -<.> ".golden") $ do+ (context, template) <-+ split <$> ByteString.readFile path -include :: EDE.Resolver IO-include = EDE.includeFile resources+ result <-+ EDE.parseWith+ EDE.defaultSyntax+ (EDE.includeFile dir)+ (Text.pack path)+ template -tests :: IO [Tasty.TestTree]-tests = files >>= mapM test+ EDE.result+ (error . show)+ (pure . Text.Lazy.Encoding.encodeUtf8)+ (result >>= flip EDE.render context) where- files :: IO [FilePath]- files =- map (resources ++) . filter (List.isSuffixOf ".ede")- <$> Directory.getDirectoryContents resources-- test :: FilePath -> IO Tasty.TestTree- test f = do- (bs, n) <-- (,)- <$> ByteString.readFile f- <*> pure (List.takeWhile (/= '.') f)-- let (js, src) = split bs- name = Text.pack (n ++ ".ede")-- pure . Tasty.Golden.goldenVsStringDiff n diff (n ++ ".golden") $ do- r <- EDE.parseWith EDE.defaultSyntax include name src-- EDE.result- (error . show)- (pure . Text.Lazy.Encoding.encodeUtf8)- (r >>= (`EDE.render` js))-- diff r n = ["diff", "-u", r, n]+ diff ref new =+ ["diff", "-u", ref, new] split = Bifunctor.bimap input (ByteString.drop 4)
test/resources/case.ede view
@@ -1,4 +1,4 @@-{ "var": "BiNGo!" }+{ "var": "BiNGo!", "list": ["foo", "bar", "buck"] } --- {% case var %} {% when "other" %}@@ -15,3 +15,14 @@ {% else %} El fino. {% endcase %}++ {% for item in list %}+ {% case item.value %}+ {% when "foo" %}+ FOO+ {% when "bar" %}+ BAR+ {% else %}+ BAZ+ {% endcase %}+ {% endfor %}
test/resources/case.golden view
@@ -1,3 +1,7 @@ "BiNGo!" El fino.++ FOO+ BAR+ BAZ