shakespeare-text 0.10.2 → 0.10.3
raw patch · 8 files changed
+175/−170 lines, 8 filesdep ~hspecdep ~shakespearePVP ok
version bump matches the API change (PVP)
Dependency ranges changed: hspec, shakespeare
API changes (from Hackage documentation)
Files
- shakespeare-text.cabal +8/−7
- test.hs +5/−0
- test/ShakespeareTextTest.hs +156/−0
- test/external1.text +0/−5
- test/external2.text +0/−1
- test/main.hs +0/−157
- test/texts/external1.text +5/−0
- test/texts/external2.text +1/−0
shakespeare-text.cabal view
@@ -1,5 +1,5 @@ name: shakespeare-text-version: 0.10.2+version: 0.10.3 license: BSD3 license-file: LICENSE author: Greg Weber <greg@gregweber.info>@@ -25,13 +25,14 @@ build-type: Simple homepage: http://www.yesodweb.com/book/templates extra-source-files:- test/external1.text- test/external2.text- test/main.hs+ test/texts/external1.text+ test/texts/external2.text+ test/ShakespeareTextTest.hs+ test.hs library build-depends: base >= 4 && < 5- , shakespeare >= 0.10+ , shakespeare >= 0.10 && < 0.11 , template-haskell , text >= 0.7 && < 0.12 @@ -40,7 +41,7 @@ test-suite test hs-source-dirs: test- main-is: main.hs+ main-is: ../test.hs type: exitcode-stdio-1.0 ghc-options: -Wall@@ -48,7 +49,7 @@ shakespeare-text >= 0.10 && < 0.11 , base >= 4 && < 5 , HUnit- , hspec >= 0.8 && < 0.9+ , hspec >= 0.8 && < 0.10 , text >= 0.7 && < 0.12
+ test.hs view
@@ -0,0 +1,5 @@+import ShakespeareTextTest (specs)+import Test.Hspec++main :: IO ()+main = hspecX $ descriptions [specs]
+ test/ShakespeareTextTest.hs view
@@ -0,0 +1,156 @@+{-# LANGUAGE QuasiQuotes #-} +{-# LANGUAGE TemplateHaskell #-} +module ShakespeareTextTest (specs) where + +import Test.HUnit hiding (Test) +import Test.Hspec +import Test.Hspec.HUnit () + +import Prelude hiding (reverse) +import Text.Shakespeare.Text +import Data.List (intercalate) +import qualified Data.Text.Lazy as TL +import qualified Data.List +import qualified Data.List as L +import Data.Text (Text, pack, unpack) +import Data.Monoid (mappend) + +specs :: [Spec] +specs = describe "shakespeare-text" + [ it "text" $ do + let var = "var" + let urlp = (Home, [(pack "p", pack "q")]) + flip telper [text|שלום +#{var} +@{Home} +@?{urlp} +^{jmixin} +|] $ intercalate "\r\n" + [ "שלום" + , var + , "url" + , "url?p=q" + , "var x;" + ] ++ "\r\n" + + + , it "textFile" $ do + let var = "var" + let urlp = (Home, [(pack "p", pack "q")]) + flip telper $(textFile "test/texts/external1.text") $ unlines + [ "שלום" + , var + , "url" + , "url?p=q" + , "var x;" + ] + + + , it "textFileDebug" $ do + let var = "var" + let urlp = (Home, [(pack "p", pack "q")]) + flip telper $(textFileDebug "test/texts/external1.text") $ unlines + [ "שלום" + , var + , "url" + , "url?p=q" + , "var x;" + ] + +{- TODO + , it "textFileDebugChange" $ do + let var = "somevar" + test result = telper result $(textFileDebug "test/texts/external2.text") + writeFile "test/texts/external2.text" "var #{var} = 1;" + test "var somevar = 1;" + writeFile "test/texts/external2.text" "var #{var} = 2;" + test "var somevar = 2;" + writeFile "test/texts/external2.text" "var #{var} = 1;" + -} + + + , it "text module names" $ + let foo = "foo" + double = 3.14 :: Double + int = -5 :: Int in + telper "oof oof 3.14 -5" + [text|#{Data.List.reverse foo} #{L.reverse foo} #{show double} #{show int}|] + + , it "stext module names" $ + let foo = "foo" + double = 3.14 :: Double + int = -5 :: Int in + simpT "oof oof 3.14 -5" + [stext|#{Data.List.reverse foo} #{L.reverse foo} #{show double} #{show int}|] + + , it "single dollar at and caret" $ do + telper "$@^" [text|$@^|] + telper "#{@{^{" [text|#\{@\{^\{|] + + , it "single dollar at and caret" $ do + simpT "$@^" [stext|$@^|] + simpT "#{@{^{" [stext|#\{@\{^\{|] + + , it "dollar operator" $ do + let val = (1 :: Int, (2 :: Int, 3 :: Int)) + telper "2" [text|#{ show $ fst $ snd val }|] + telper "2" [text|#{ show $ fst $ snd $ val}|] + + , it "dollar operator" $ do + let val = (1 :: Int, (2 :: Int, 3 :: Int)) + simpT "2" [stext|#{ show $ fst $ snd val }|] + simpT "2" [stext|#{ show $ fst $ snd $ val}|] + ] + +simpT :: String -> TL.Text -> Assertion +simpT a b = pack a @=? TL.toStrict b + + +data Url = Home | Sub SubUrl +data SubUrl = SubUrl +render :: Url -> [(Text, Text)] -> Text +render Home qs = pack "url" `mappend` showParams qs +render (Sub SubUrl) qs = pack "suburl" `mappend` showParams qs + +showParams :: [(Text, Text)] -> Text +showParams [] = pack "" +showParams z = + pack $ '?' : intercalate "&" (map go z) + where + go (x, y) = go' x ++ '=' : go' y + go' = concatMap encodeUrlChar . unpack + +-- | Taken straight from web-encodings; reimplemented here to avoid extra +-- dependencies. +encodeUrlChar :: Char -> String +encodeUrlChar c + -- List of unreserved characters per RFC 3986 + -- Gleaned from http://en.wikipedia.org/wiki/Percent-encoding + | 'A' <= c && c <= 'Z' = [c] + | 'a' <= c && c <= 'z' = [c] + | '0' <= c && c <= '9' = [c] +encodeUrlChar c@'-' = [c] +encodeUrlChar c@'_' = [c] +encodeUrlChar c@'.' = [c] +encodeUrlChar c@'~' = [c] +encodeUrlChar ' ' = "+" +encodeUrlChar y = + let (a, c) = fromEnum y `divMod` 16 + b = a `mod` 16 + showHex' x + | x < 10 = toEnum $ x + (fromEnum '0') + | x < 16 = toEnum $ x - 10 + (fromEnum 'A') + | otherwise = error $ "Invalid argument to showHex: " ++ show x + in ['%', showHex' b, showHex' c] + + + + +jmixin :: TextUrl url +jmixin = [text|var x;|] + +telper :: String -> TextUrl Url -> Assertion +telper res h = pack res @=? TL.toStrict (renderTextUrl render h) + +instance Show Url where + show _ = "FIXME remove this instance show Url"
− test/external1.text
@@ -1,5 +0,0 @@-שלום-#{var}-@{Home}-@?{urlp}-^{jmixin}
− test/external2.text
@@ -1,1 +0,0 @@-var #{var} = 2;
− test/main.hs
@@ -1,157 +0,0 @@-{-# LANGUAGE QuasiQuotes #-} -{-# LANGUAGE TemplateHaskell #-} -import Test.HUnit hiding (Test) -import Test.Hspec -import Test.Hspec.HUnit () - -import Prelude hiding (reverse) -import Text.Shakespeare.Text -import Data.List (intercalate) -import qualified Data.Text.Lazy as TL -import qualified Data.List -import qualified Data.List as L -import Data.Text (Text, pack, unpack) -import Data.Monoid (mappend) - -main :: IO () -main = hspecX $ descriptions [specs] - -specs :: [Spec] -specs = describe "shakespeare-text" - [ it "text" $ do - let var = "var" - let urlp = (Home, [(pack "p", pack "q")]) - flip telper [text|שלום -#{var} -@{Home} -@?{urlp} -^{jmixin} -|] $ intercalate "\r\n" - [ "שלום" - , var - , "url" - , "url?p=q" - , "var x;" - ] ++ "\r\n" - - - , it "textFile" $ do - let var = "var" - let urlp = (Home, [(pack "p", pack "q")]) - flip telper $(textFile "test/external1.text") $ unlines - [ "שלום" - , var - , "url" - , "url?p=q" - , "var x;" - ] - - - , it "textFileDebug" $ do - let var = "var" - let urlp = (Home, [(pack "p", pack "q")]) - flip telper $(textFileDebug "test/external1.text") $ unlines - [ "שלום" - , var - , "url" - , "url?p=q" - , "var x;" - ] - -{- TODO - , it "textFileDebugChange" $ do - let var = "somevar" - test result = telper result $(textFileDebug "test/external2.text") - writeFile "test/external2.text" "var #{var} = 1;" - test "var somevar = 1;" - writeFile "test/external2.text" "var #{var} = 2;" - test "var somevar = 2;" - writeFile "test/external2.text" "var #{var} = 1;" - -} - - - , it "text module names" $ - let foo = "foo" - double = 3.14 :: Double - int = -5 :: Int in - telper "oof oof 3.14 -5" - [text|#{Data.List.reverse foo} #{L.reverse foo} #{show double} #{show int}|] - - , it "stext module names" $ - let foo = "foo" - double = 3.14 :: Double - int = -5 :: Int in - simpT "oof oof 3.14 -5" - [stext|#{Data.List.reverse foo} #{L.reverse foo} #{show double} #{show int}|] - - , it "single dollar at and caret" $ do - telper "$@^" [text|$@^|] - telper "#{@{^{" [text|#\{@\{^\{|] - - , it "single dollar at and caret" $ do - simpT "$@^" [stext|$@^|] - simpT "#{@{^{" [stext|#\{@\{^\{|] - - , it "dollar operator" $ do - let val = (1 :: Int, (2 :: Int, 3 :: Int)) - telper "2" [text|#{ show $ fst $ snd val }|] - telper "2" [text|#{ show $ fst $ snd $ val}|] - - , it "dollar operator" $ do - let val = (1 :: Int, (2 :: Int, 3 :: Int)) - simpT "2" [stext|#{ show $ fst $ snd val }|] - simpT "2" [stext|#{ show $ fst $ snd $ val}|] - ] - -simpT :: String -> TL.Text -> Assertion -simpT a b = pack a @=? TL.toStrict b - - -data Url = Home | Sub SubUrl -data SubUrl = SubUrl -render :: Url -> [(Text, Text)] -> Text -render Home qs = pack "url" `mappend` showParams qs -render (Sub SubUrl) qs = pack "suburl" `mappend` showParams qs - -showParams :: [(Text, Text)] -> Text -showParams [] = pack "" -showParams z = - pack $ '?' : intercalate "&" (map go z) - where - go (x, y) = go' x ++ '=' : go' y - go' = concatMap encodeUrlChar . unpack - --- | Taken straight from web-encodings; reimplemented here to avoid extra --- dependencies. -encodeUrlChar :: Char -> String -encodeUrlChar c - -- List of unreserved characters per RFC 3986 - -- Gleaned from http://en.wikipedia.org/wiki/Percent-encoding - | 'A' <= c && c <= 'Z' = [c] - | 'a' <= c && c <= 'z' = [c] - | '0' <= c && c <= '9' = [c] -encodeUrlChar c@'-' = [c] -encodeUrlChar c@'_' = [c] -encodeUrlChar c@'.' = [c] -encodeUrlChar c@'~' = [c] -encodeUrlChar ' ' = "+" -encodeUrlChar y = - let (a, c) = fromEnum y `divMod` 16 - b = a `mod` 16 - showHex' x - | x < 10 = toEnum $ x + (fromEnum '0') - | x < 16 = toEnum $ x - 10 + (fromEnum 'A') - | otherwise = error $ "Invalid argument to showHex: " ++ show x - in ['%', showHex' b, showHex' c] - - - - -jmixin :: TextUrl url -jmixin = [text|var x;|] - -telper :: String -> TextUrl Url -> Assertion -telper res h = pack res @=? TL.toStrict (renderTextUrl render h) - -instance Show Url where - show _ = "FIXME remove this instance show Url"
+ test/texts/external1.text view
@@ -0,0 +1,5 @@+שלום+#{var}+@{Home}+@?{urlp}+^{jmixin}
+ test/texts/external2.text view
@@ -0,0 +1,1 @@+var #{var} = 2;