Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package ghc-shakespeare for openSUSE:Factory checked in at 2025-06-11 16:26:53 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/ghc-shakespeare (Old) and /work/SRC/openSUSE:Factory/.ghc-shakespeare.new.19631 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "ghc-shakespeare" Wed Jun 11 16:26:53 2025 rev:13 rq:1284553 version:2.1.4 Changes: -------- --- /work/SRC/openSUSE:Factory/ghc-shakespeare/ghc-shakespeare.changes 2024-08-16 12:23:52.675600519 +0200 +++ /work/SRC/openSUSE:Factory/.ghc-shakespeare.new.19631/ghc-shakespeare.changes 2025-06-11 16:28:38.605773164 +0200 @@ -1,0 +2,9 @@ +Thu Jun 5 15:56:06 UTC 2025 - Peter Simons <psim...@suse.com> + +- Update shakespeare to version 2.1.4. + Upstream has edited the change log file since the last release in + a non-trivial way, i.e. they did more than just add a new entry + at the top. You can review the file at: + http://hackage.haskell.org/package/shakespeare-2.1.4/src/ChangeLog.md + +------------------------------------------------------------------- Old: ---- shakespeare-2.1.1.tar.gz New: ---- shakespeare-2.1.4.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ ghc-shakespeare.spec ++++++ --- /var/tmp/diff_new_pack.8UPT5I/_old 2025-06-11 16:28:39.281801364 +0200 +++ /var/tmp/diff_new_pack.8UPT5I/_new 2025-06-11 16:28:39.285801531 +0200 @@ -1,7 +1,7 @@ # # spec file for package ghc-shakespeare # -# Copyright (c) 2024 SUSE LLC +# Copyright (c) 2025 SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -20,7 +20,7 @@ %global pkgver %{pkg_name}-%{version} %bcond_with tests Name: ghc-%{pkg_name} -Version: 2.1.1 +Version: 2.1.4 Release: 0 Summary: A toolkit for making compile-time interpolated templates License: MIT ++++++ shakespeare-2.1.1.tar.gz -> shakespeare-2.1.4.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/shakespeare-2.1.1/ChangeLog.md new/shakespeare-2.1.4/ChangeLog.md --- old/shakespeare-2.1.1/ChangeLog.md 2024-08-05 08:03:42.000000000 +0200 +++ new/shakespeare-2.1.4/ChangeLog.md 2025-06-05 17:55:54.000000000 +0200 @@ -1,8 +1,13 @@ # ChangeLog for shakespeare -### 2.1.1 +### 2.1.4 -* Add support for `TypeApplications` inside Shakespeare quasiquotes +* [#292](https://github.com/yesodweb/shakespeare/pull/292) + * Add support for multi-line attributes. An example use of this is [here](https://github.com/yesodweb/shakespeare/issues/291). + +### 2.1.2 + +* Add support for context parsing in mkMessage function and related ones [#282](https://github.com/yesodweb/shakespeare/issues/282). Added support for building with LTS versions of 22, 21, 20 and removed older ones. ### 2.1.0 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/shakespeare-2.1.1/Text/Hamlet/Parse.hs new/shakespeare-2.1.4/Text/Hamlet/Parse.hs --- old/shakespeare-2.1.1/Text/Hamlet/Parse.hs 2024-08-05 08:03:30.000000000 +0200 +++ new/shakespeare-2.1.4/Text/Hamlet/Parse.hs 2025-06-05 17:55:31.000000000 +0200 @@ -283,7 +283,7 @@ contentReg InContent = (ContentRaw . return) <$> noneOf "#@^\r\n" contentReg NotInQuotes = (ContentRaw . return) <$> noneOf "@^#. \t\n\r>" contentReg NotInQuotesAttr = (ContentRaw . return) <$> noneOf "@^ \t\n\r>" - contentReg InQuotes = (ContentRaw . return) <$> noneOf "#@^\"\n\r" + contentReg InQuotes = (ContentRaw . return) <$> noneOf "#@^\"" tagAttribValue notInQuotes = do cr <- (char '"' >> return InQuotes) <|> return notInQuotes fst <$> content cr diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/shakespeare-2.1.1/Text/Shakespeare/Base.hs new/shakespeare-2.1.4/Text/Shakespeare/Base.hs --- old/shakespeare-2.1.1/Text/Shakespeare/Base.hs 2024-08-05 08:03:42.000000000 +0200 +++ new/shakespeare-2.1.4/Text/Shakespeare/Base.hs 2025-06-05 17:35:51.000000000 +0200 @@ -29,7 +29,7 @@ import Language.Haskell.TH.Syntax hiding (makeRelativeToProject) import Language.Haskell.TH (appE) -import Data.Char (isUpper, isSymbol, isPunctuation, isAscii, isLower, isNumber) +import Data.Char (isUpper, isSymbol, isPunctuation, isAscii) import Data.FileEmbed (makeRelativeToProject) import Text.ParserCombinators.Parsec import Text.Parsec.Prim (Parsec) @@ -41,8 +41,6 @@ import qualified System.IO as SIO import qualified Data.Text.Lazy.IO as TIO import Control.Monad (when) -import Data.Maybe (mapMaybe) -import Data.List.NonEmpty (nonEmpty, NonEmpty ((:|))) newtype Ident = Ident String deriving (Show, Eq, Read, Data, Typeable, Ord, Lift) @@ -57,7 +55,6 @@ | DerefBranch Deref Deref | DerefList [Deref] | DerefTuple [Deref] - | DerefType String | DerefGetField Deref String -- ^ Record field access via @OverloadedRecordDot@. 'derefToExp' only supports this -- feature on compilers which support @OverloadedRecordDot@. @@ -96,7 +93,7 @@ -- See: http://www.haskell.org/onlinereport/haskell2010/haskellch2.html#x7-160002.2 isOperatorChar c - | isAscii c = c `elem` "!#$%&*+./<=>?\\^|-~:" + | isAscii c = c `elem` "!#$%&*+./<=>?@\\^|-~:" | otherwise = isSymbol c || isPunctuation c derefPrefix x = do @@ -106,7 +103,7 @@ derefInfix x = try $ do _ <- delim xs <- many $ try $ derefSingle >>= \x' -> delim >> return x' - op <- (many1 (satisfy isOperatorChar) <* lookAhead (oneOf " \t")) <?> "operator" + op <- many1 (satisfy isOperatorChar) <?> "operator" -- special handling for $, which we don't deal with when (op == "$") $ fail "don't handle $" let op' = DerefIdent $ Ident op @@ -114,21 +111,9 @@ skipMany $ oneOf " \t" return $ DerefBranch (DerefBranch op' $ foldl1 DerefBranch $ x : xs) (foldl1 DerefBranch ys) derefSingle = do - x <- derefType <|> derefTuple <|> derefList <|> derefOp <|> derefParens <|> numeric <|> fmap DerefString strLit <|> ident + x <- derefTuple <|> derefList <|> derefOp <|> derefParens <|> numeric <|> strLit <|> ident fields <- many recordDot pure $ foldl DerefGetField x fields - tyNameOrVar = liftA2 (:) (alphaNum <|> char '\'') (many (alphaNum <|> char '_' <|> char '\'')) - derefType = try $ do - _ <- char '@' >> notFollowedBy (oneOf " \t") - x <- - try tyNameOrVar - <|> try (string "()") - <|> try strLit - <|> between - (char '(') - (char ')') - (unwords <$> many ((try tyNameOrVar <|> try strLitQuoted) <* many (oneOf " \t"))) - pure $ DerefType x recordDot = do _ <- char '.' x <- lower <|> char '_' @@ -154,8 +139,11 @@ Nothing -> DerefIntegral $ read' "Integral" $ n ++ x Just z -> DerefRational $ toRational (read' "Rational" $ n ++ x ++ '.' : z :: Double) - strLitQuoted = liftA2 (:) (char '"') (many quotedChar) <> fmap pure (char '"') - strLit = char '"' *> many quotedChar <* char '"' + strLit = do + _ <- char '"' + chars <- many quotedChar + _ <- char '"' + return $ DerefString chars quotedChar = (char '\\' >> escapedChar) <|> noneOf "\"" escapedChar = let cecs = [('n', '\n'), ('r', '\r'), ('b', '\b'), ('t', '\t') @@ -185,31 +173,8 @@ expType (Ident (c:_)) = if isUpper c || c == ':' then ConE else VarE expType (Ident "") = error "Bad Ident" -strType :: String -> Type -strType t0 = case t0 of - "" -> ConT ''() - hd : tl - | all isNumber t0 -> LitT (NumTyLit (read t0)) - | isLower hd -> VarT (mkName (hd : tl)) - | otherwise -> ConT (mkName (hd : tl)) - -strTypeWords :: String -> Type -strTypeWords t = case words t of - [] -> ConT ''() - [ty] -> strType ty - ts@(ty : tys) - | not (null ty) - && head ty == '\"' - && not (null (last ts)) - && last (last ts) == '\"' -> - LitT (StrTyLit t) - | otherwise -> foldl AppT (strType ty) (map strType tys) - derefToExp :: Scope -> Deref -> Exp -derefToExp s (DerefBranch x y) = case y of - DerefBranch (DerefType t) y' -> derefToExp s x `AppTypeE` strTypeWords t `AppE` derefToExp s y' - DerefType t -> derefToExp s x `AppTypeE` strTypeWords t - _ -> derefToExp s x `AppE` derefToExp s y +derefToExp s (DerefBranch x y) = derefToExp s x `AppE` derefToExp s y derefToExp _ (DerefModulesIdent mods i@(Ident s)) = expType i $ Name (mkOccName s) (NameQ $ mkModName $ intercalate "." mods) derefToExp scope (DerefIdent i@(Ident s)) = @@ -219,7 +184,6 @@ derefToExp _ (DerefIntegral i) = LitE $ IntegerL i derefToExp _ (DerefRational r) = LitE $ RationalL r derefToExp _ (DerefString s) = LitE $ StringL s -derefToExp _ (DerefType _) = error "exposed type application" derefToExp s (DerefList ds) = ListE $ map (derefToExp s) ds derefToExp s (DerefTuple ds) = TupE $ #if MIN_VERSION_template_haskell(2,16,0) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/shakespeare-2.1.1/Text/Shakespeare/I18N.hs new/shakespeare-2.1.4/Text/Shakespeare/I18N.hs --- old/shakespeare-2.1.1/Text/Shakespeare/I18N.hs 2024-08-05 08:03:30.000000000 +0200 +++ new/shakespeare-2.1.4/Text/Shakespeare/I18N.hs 2025-06-05 17:35:51.000000000 +0200 @@ -3,6 +3,7 @@ {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE FlexibleInstances #-} +{-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE TypeSynonymInstances #-} {-# LANGUAGE ExistentialQuantification #-} @@ -62,7 +63,6 @@ ) where import Language.Haskell.TH.Syntax hiding (makeRelativeToProject) -import Control.Applicative ((<$>)) import Control.Monad (filterM, forM) import Data.Text (Text, pack, unpack) import System.Directory @@ -72,12 +72,12 @@ import qualified Data.Map as Map import qualified Data.ByteString as S import Data.Text.Encoding (decodeUtf8) -import Data.Char (isSpace, toLower, toUpper) +import Data.Char (isSpace, toLower, toUpper, isLower) import Data.Ord (comparing) import Text.Shakespeare.Base (Deref (..), Ident (..), parseHash, derefToExp) -import Text.ParserCombinators.Parsec (parse, many, eof, many1, noneOf, (<|>)) +import Text.ParserCombinators.Parsec (parse, many, eof, many1, noneOf, (<|>), + string, spaces, char, option, alphaNum, sepBy1, try) import Control.Arrow ((***)) -import Data.Monoid (mempty, mappend) import qualified Data.Text as T import Data.String (IsString (fromString)) @@ -165,22 +165,79 @@ Nothing -> error $ "Did not find main language file: " ++ unpack lang Just def -> toSDefs def mapM_ (checkDef sdef) $ map snd contents' - let mname = mkName $ dt ++ postfix - c1 <- fmap concat $ mapM (toClauses prefix dt) contents' - c2 <- mapM (sToClause prefix dt) sdef + let mname = mkName $ dt2 ++ postfix + c1 <- fmap concat $ mapM (toClauses prefix dt2 ) contents' + c2 <- mapM (sToClause prefix dt2) sdef c3 <- defClause return $ ( if genType - then ((DataD [] mname [] Nothing (map (toCon dt) sdef) []) :) + then ((DataD [] mname [] Nothing (map (toCon dt2) sdef) []) :) else id) [ instanceD - [] - (ConT ''RenderMessage `AppT` (ConT $ mkName master) `AppT` ConT mname) + cxt -- Here the parsed context should be added, otherwise [] + (ConT ''RenderMessage `AppT` (if ' ' `elem` master' + then let (ts, us) = break (== ' ') . + filter (\x -> x /= '(' && x /= ')') $ master' + us1 = filter (/= ' ') us in ParensT (ConT (mkName ts) + `AppT` VarT (mkName us1)) + else ConT $ mkName master') `AppT` ConT mname) [ FunD (mkName "renderMessage") $ c1 ++ c2 ++ [c3] ] ] + where (dt1, cxt0) = case (parse parseName "" dt) of + Left err -> error $ show err + Right x -> x + dt2 = concat . take 1 $ dt1 + master' | cxt0 == [] = master + | otherwise = (\xss -> if length xss > 1 + then '(':unwords xss ++ ")" + else concat . take 1 $ xss) . fst $ + (case parse parseName "" master of + Left err -> error $ show err + Right x -> x) + cxt = fmap (\(c:rest) -> foldl' (\acc v -> acc `AppT` nameToType v) + (ConT $ mkName c) rest) cxt0 + + nameToType :: String -> Type -- Is taken from the +-- https://hackage.haskell.org/package/yesod-core-1.6.26.0/docs/src/Yesod.Routes.Parse.html#nameToType + nameToType t = if isTvar t + then VarT $ mkName t + else ConT $ mkName t + + isTvar :: String -> Bool -- Is taken from the +-- https://hackage.haskell.org/package/yesod-core-1.6.26.0/docs/src/Yesod.Routes.Parse.html#isTvar + isTvar (h:_) = isLower h + isTvar _ = False + + parseName = do + cxt' <- option [] parseContext + args <- many parseWord + spaces + eof + return (args, cxt') + + parseWord = do + spaces + many1 alphaNum + + parseContext = try $ do + cxts <- parseParen parseContexts + spaces + _ <- string "=>" + return cxts + + parseParen p = do + spaces + _ <- try ( char '(' ) + r <- p + spaces + _ <- try ( char ')' ) + return r + + parseContexts = + sepBy1 (many1 parseWord) (spaces >> char ',' >> return ()) -toClauses :: String -> String -> (Lang, [Def]) -> Q [Clause] +toClauses :: String -> String -> (Lang, [Def]) -> Q [Clause] toClauses prefix dt (lang, defs) = mapM go defs where @@ -358,8 +415,7 @@ loadLangFile file = do bs <- S.readFile file let s = unpack $ decodeUtf8 bs - defs <- fmap catMaybes $ mapM (parseDef . T.unpack . T.strip . T.pack) $ lines s - return defs + fmap catMaybes $ mapM (parseDef . T.unpack . T.strip . T.pack) $ lines s parseDef :: String -> IO (Maybe Def) parseDef "" = return Nothing diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/shakespeare-2.1.1/shakespeare.cabal new/shakespeare-2.1.4/shakespeare.cabal --- old/shakespeare-2.1.1/shakespeare.cabal 2024-08-05 08:03:42.000000000 +0200 +++ new/shakespeare-2.1.4/shakespeare.cabal 2025-06-05 17:55:56.000000000 +0200 @@ -1,5 +1,5 @@ name: shakespeare -version: 2.1.1 +version: 2.1.4 license: MIT license-file: LICENSE author: Michael Snoyman <mich...@snoyman.com> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/shakespeare-2.1.1/test/Text/HamletSpec.hs new/shakespeare-2.1.4/test/Text/HamletSpec.hs --- old/shakespeare-2.1.1/test/Text/HamletSpec.hs 2024-08-05 08:03:30.000000000 +0200 +++ new/shakespeare-2.1.4/test/Text/HamletSpec.hs 2025-06-05 17:55:31.000000000 +0200 @@ -500,6 +500,25 @@ helper "<li ng-repeat=\"addr in msgForm.new.split(/\\\\s/)\">{{addr}}</li>\n" [hamlet|<li ng-repeat="addr in msgForm.new.split(/\\s/)">{{addr}}|] + it "Alpine.js multi-line attribute values #291" $ + helper "<div x-data=\"{\r\n search: '',\r\n\r\n items: ['foo', 'bar', 'baz'],\r\n\r\n get filteredItems() {\r\n return this.items.filter(\r\n i => i.startsWith(this.search)\r\n )\r\n }\r\n }\"></div>" + [hamlet| + $newline never + <div + x-data="{ + search: '', + + items: ['foo', 'bar', 'baz'], + + get filteredItems() { + return this.items.filter( + i => i.startsWith(this.search) + ) + } + }" + > + |] + it "runtime Hamlet with caret interpolation" $ do let toInclude render = render (5, [("hello", "world")]) let renderer x y = pack $ show (x :: Int, y :: [(Text, Text)]) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/shakespeare-2.1.1/test/Text/Shakespeare/BaseSpec.hs new/shakespeare-2.1.4/test/Text/Shakespeare/BaseSpec.hs --- old/shakespeare-2.1.1/test/Text/Shakespeare/BaseSpec.hs 2024-08-05 08:03:42.000000000 +0200 +++ new/shakespeare-2.1.4/test/Text/Shakespeare/BaseSpec.hs 2025-06-05 17:35:51.000000000 +0200 @@ -33,31 +33,6 @@ (DerefBranch (DerefIdent (Ident "+")) (DerefIdent (Ident "a"))) (DerefIdent (Ident "b")))) - it "parseDeref parse single type applications" $ do - runParser parseDeref () "" "x @y" `shouldBe` - Right - (DerefBranch - (DerefIdent (Ident "x")) - (DerefType "y")) - it "parseDeref parse unit type applications" $ do - runParser parseDeref () "" "x @()" `shouldBe` - Right - (DerefBranch - (DerefIdent (Ident "x")) - (DerefType "()")) - it "parseDeref parse compound type applications" $ do - runParser parseDeref () "" "x @(Maybe String)" `shouldBe` - Right - (DerefBranch - (DerefIdent (Ident "x")) - (DerefType "Maybe String")) - it "parseDeref parse single @ as operator" $ do - runParser parseDeref () "" "x @ y" `shouldBe` - Right - (DerefBranch - (DerefBranch (DerefIdent (Ident "@")) (DerefIdent (Ident "x"))) - (DerefIdent (Ident "y"))) - it "parseDeref parse expressions with record dot" $ do runParser parseDeref () "" "x.y" `shouldBe` Right (DerefGetField (DerefIdent (Ident "x")) "y") @@ -131,3 +106,4 @@ eShowErrors :: Either ParseError c -> c eShowErrors = either (error . show) id + diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/shakespeare-2.1.1/test/Text/Shakespeare/I18NSpec.hs new/shakespeare-2.1.4/test/Text/Shakespeare/I18NSpec.hs --- old/shakespeare-2.1.1/test/Text/Shakespeare/I18NSpec.hs 2024-08-05 08:03:30.000000000 +0200 +++ new/shakespeare-2.1.4/test/Text/Shakespeare/I18NSpec.hs 2025-06-05 17:35:51.000000000 +0200 @@ -1,16 +1,37 @@ {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE TypeFamilies #-} + module Text.Shakespeare.I18NSpec ( spec ) where import Data.Text (Text) import Text.Shakespeare.I18N +import Language.Haskell.TH.Syntax +import Test.Hspec + +class Lift master => YesodSubApp master where + data YesodSubAppData master :: * + +newtype SubApp master = SubApp + { + getOrdering :: Ordering + } + +data Test = Test + +class Testable a where + isTestable :: a -> Bool + +instance Testable Test where + isTestable Test = True spec :: Monad m => m () spec = return () -data Test = Test +mkMessage "(YesodSubApp master) => SubApp master" "other-messages" "en" mkMessage "Test" "test-messages" "en" +