packages feed

heist-aeson 0.1 → 0.2

raw patch · 14 files changed

+145/−3 lines, 14 filesPVP ok

version bump matches the API change (PVP)

API changes (from Hackage documentation)

Files

heist-aeson.cabal view
@@ -7,7 +7,7 @@ -- The package version. See the Haskell package versioning policy -- (http://www.haskell.org/haskellwiki/Package_versioning_policy) for -- standards guiding when and how versions should be incremented.-Version:             0.1+Version:             0.2  -- A short (one-line) description of the package. Synopsis:            Use JSON directly from Heist templates.@@ -37,10 +37,13 @@  -- Extra files to be distributed with the package, such as examples or -- a README.--- Extra-source-files:  +Extra-source-files:  tests/runTests.hs+                     tests/*.tpl+                     tests/*.json+                     tests/*.expected  -- Constraint on the version of Cabal needed to build this package.-Cabal-version:       >=1.2+Cabal-version:       >=1.6   Library
+ tests/access.expected view
@@ -0,0 +1,6 @@+value+Third level+<attr attribute='Third level'></attr>++  Third level+
+ tests/access.json view
@@ -0,0 +1,2 @@+{"key": "value"+,"level1": {"level2": {"level3": "Third level"}}}
+ tests/access.tpl view
@@ -0,0 +1,6 @@+<val:key/>+<val:level1.level2.level3/>+<attr attribute="$(val:level1.level2.level3)"/>+<json:section key="level1.level2">+  <val:level3/>+</json:section>
+ tests/loop.expected view
@@ -0,0 +1,13 @@+<html>++  <ul>+    +      <li>One</li>+    +      <li>Two</li>+    +      <li>Three</li>+    +  </ul>++</html>
+ tests/loop.json view
@@ -0,0 +1,1 @@+{"loop": ["One", "Two", "Three"]}
+ tests/loop.tpl view
@@ -0,0 +1,9 @@+<html>+<json:section key="loop">+  <ul>+    <json:repeated key="@">+      <li><val:self/></li>+    </json:repeated>+  </ul>+</json:section>+</html>
+ tests/runTests.hs view
@@ -0,0 +1,68 @@+module Main ( main ) where++import Text.Templating.Heist.Aeson+import Text.Templating.Heist+import System.Directory+import System.FilePath+import System.Exit+import System.IO+import Data.Aeson+import Data.Attoparsec+import Blaze.ByteString.Builder+import Control.Monad+import qualified Data.ByteString.Char8 as Strict++main :: IO ()+main = runTests++runTests :: IO ()+runTests+    = do tests <- findTests+         ets <- loadTemplates "." $ addHeistAeson $ emptyTemplateState "."+         let ts = either error id ets+         results <- mapM (executeTest ts) tests+         unless (and results) $ exitWith (ExitFailure 1)++data Test = Test { testName :: String+                 , testJson :: FilePath+                 , testTemplate :: FilePath+                 , testExpected :: FilePath }++-- Find all tests (.tpl, .json, .expected triplets) in the current directory.+findTests :: IO [Test]+findTests = do files <- getDirectoryContents "."+               return [ Test { testName = takeBaseName file+                             , testJson = json+                             , testTemplate = file+                             , testExpected = expected }+                        | file <- files+                      , takeExtension file == ".tpl"+                      , json <- filter (== replaceExtension file "json") files+                      , expected <- filter (== replaceExtension file "expected") files ]+++executeTest :: JsonState IO -> Test -> IO Bool+executeTest state test = do+    putStr (testName test ++ ": ")+    hFlush stdout+    jsonTxt <- Strict.readFile (testJson test)+    case eitherResult (parse json jsonTxt) of+      Left errMsg     -> do putStrLn "FAILED"+                            hPutStrLn stderr $ "Failed to parse json: " ++ errMsg+                            return False+      Right jsonValue -> do+        result  <- renderJsonTemplate state (Strict.pack $ testName test) jsonValue+        case result of+          Nothing -> do putStrLn "FAILED"+                        hPutStrLn stderr $ "Failed to parse template"+                        return False+          Just (t, mime) -> do+            expected <- Strict.readFile (testExpected test)+            if expected == toByteString t+               then do putStrLn "OK"+                       return True+               else do putStrLn "FAILED"+                       let outFile = addExtension (testName test) "out"+                       hPutStrLn stderr $ "Generated data doesn't match expected result. Data written to " ++ outFile+                       Strict.writeFile outFile (toByteString t)+                       return False
+ tests/scope.expected view
@@ -0,0 +1,6 @@+value++  value+  <val:outer.inner></val:outer.inner>++<val:inner></val:inner>
+ tests/scope.json view
@@ -0,0 +1,1 @@+{"outer": {"inner": "value"}}
+ tests/scope.tpl view
@@ -0,0 +1,6 @@+<val:outer.inner/>+<json:section key="outer">+  <val:inner/>+  <val:outer.inner/>+</json:section>+<val:inner/>
+ tests/section.expected view
@@ -0,0 +1,9 @@+<div>+  +    No songs available.+  +  +    Username: Lemmih+  +  +</div>
+ tests/section.json view
@@ -0,0 +1,1 @@+{"user": { "name": "Lemmih" }}
+ tests/section.tpl view
@@ -0,0 +1,11 @@+<div>+  <json:no-section key="songs">+    No songs available.+  </json:no-section>+  <json:section key="user">+    Username: <val:name/>+  </json:section>+  <json:no-section key="user">+    No user info available.+  </json:no-section>+</div>