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-10-10 17:10:58
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/ghc-shakespeare (Old)
and /work/SRC/openSUSE:Factory/.ghc-shakespeare.new.5300 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "ghc-shakespeare"
Fri Oct 10 17:10:58 2025 rev:14 rq:1310473 version:2.1.7.1
Changes:
--------
--- /work/SRC/openSUSE:Factory/ghc-shakespeare/ghc-shakespeare.changes
2025-06-11 16:28:38.605773164 +0200
+++
/work/SRC/openSUSE:Factory/.ghc-shakespeare.new.5300/ghc-shakespeare.changes
2025-10-10 17:12:50.942079505 +0200
@@ -1,0 +2,20 @@
+Wed Oct 8 16:40:27 UTC 2025 - Peter Simons <[email protected]>
+
+- Update shakespeare to version 2.1.7.1.
+ ### 2.1.7.1
+
+ * Add missing other-messages to shakespeare.cabal
[#299](https://github.com/yesodweb/shakespeare/pull/299)
+
+ ### 2.1.7
+
+ * Use ByteString’s Lift for Hamlet code generation
[#298](https://github.com/yesodweb/shakespeare/pull/298)
+
+ ### 2.1.6
+
+ * Introduce options type for i18n, add ability to stop using record types
for messages [#290](https://github.com/yesodweb/shakespeare/pull/290)
+
+ ### 2.1.5
+
+ * Add better support for `mkMessage`ing data types with
params.[#295](https://github.com/yesodweb/shakespeare/pull/295)
+
+-------------------------------------------------------------------
Old:
----
shakespeare-2.1.4.tar.gz
New:
----
shakespeare-2.1.7.1.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ ghc-shakespeare.spec ++++++
--- /var/tmp/diff_new_pack.mBDs7H/_old 2025-10-10 17:12:51.602107325 +0200
+++ /var/tmp/diff_new_pack.mBDs7H/_new 2025-10-10 17:12:51.606107494 +0200
@@ -20,7 +20,7 @@
%global pkgver %{pkg_name}-%{version}
%bcond_with tests
Name: ghc-%{pkg_name}
-Version: 2.1.4
+Version: 2.1.7.1
Release: 0
Summary: A toolkit for making compile-time interpolated templates
License: MIT
++++++ shakespeare-2.1.4.tar.gz -> shakespeare-2.1.7.1.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/shakespeare-2.1.4/ChangeLog.md
new/shakespeare-2.1.7.1/ChangeLog.md
--- old/shakespeare-2.1.4/ChangeLog.md 2025-06-05 17:55:54.000000000 +0200
+++ new/shakespeare-2.1.7.1/ChangeLog.md 2025-10-08 18:40:11.000000000
+0200
@@ -1,5 +1,22 @@
# ChangeLog for shakespeare
+### 2.1.7.1
+
+* Add missing other-messages to shakespeare.cabal
[#299](https://github.com/yesodweb/shakespeare/pull/299)
+
+### 2.1.7
+
+* Use ByteString’s Lift for Hamlet code generation
[#298](https://github.com/yesodweb/shakespeare/pull/298)
+
+### 2.1.6
+
+* Introduce options type for i18n, add ability to stop using record types for
messages [#290](https://github.com/yesodweb/shakespeare/pull/290)
+
+### 2.1.5
+
+* Add better support for `mkMessage`ing data types with
params.[#295](https://github.com/yesodweb/shakespeare/pull/295)
+
+
### 2.1.4
* [#292](https://github.com/yesodweb/shakespeare/pull/292)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/shakespeare-2.1.4/Text/Hamlet.hs
new/shakespeare-2.1.7.1/Text/Hamlet.hs
--- old/shakespeare-2.1.4/Text/Hamlet.hs 2025-06-05 17:35:51.000000000
+0200
+++ new/shakespeare-2.1.7.1/Text/Hamlet.hs 2025-10-07 18:32:43.000000000
+0200
@@ -48,6 +48,7 @@
, hamletFromString
) where
+import Text.Blaze.Internal (unsafeByteString)
import Text.Shakespeare.Base
import Text.Hamlet.Parse
import Language.Haskell.TH.Syntax hiding (Module)
@@ -55,6 +56,7 @@
import Data.Char (isUpper, isDigit)
import Data.Maybe (fromMaybe)
import Data.Text (Text, pack)
+import qualified Data.Text.Encoding as TE
import qualified Data.Text.Lazy as TL
import Text.Blaze.Html (Html, toHtml)
import Text.Blaze.Internal (preEscapedText)
@@ -263,8 +265,8 @@
contentToExp :: Env -> HamletRules -> Scope -> Content -> Q Exp
contentToExp _ hr _ (ContentRaw s) = do
- os <- [|preEscapedText . pack|]
- let s' = LitE $ StringL s
+ os <- [|unsafeByteString|]
+ s' <- lift $ TE.encodeUtf8 (pack s)
return $ hrFromHtml hr `AppE` (os `AppE` s')
contentToExp _ hr scope (ContentVar d) = do
str <- [|toHtml|]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/shakespeare-2.1.4/Text/Shakespeare/I18N.hs
new/shakespeare-2.1.7.1/Text/Shakespeare/I18N.hs
--- old/shakespeare-2.1.4/Text/Shakespeare/I18N.hs 2025-06-05
17:35:51.000000000 +0200
+++ new/shakespeare-2.1.7.1/Text/Shakespeare/I18N.hs 2025-10-07
18:32:43.000000000 +0200
@@ -4,7 +4,6 @@
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE FlexibleContexts #-}
-{-# LANGUAGE TypeSynonymInstances #-}
{-# LANGUAGE ExistentialQuantification #-}
-----------------------------------------------------------------------------
@@ -60,6 +59,15 @@
, ToMessage (..)
, SomeMessage (..)
, Lang
+
+ , mkMessageOpts
+
+ , MakeMessageOpts
+ , defMakeMessageOpts
+ , setGenType
+ , setConPrefix
+ , setTypeSuffix
+ , setUseRecordCons
) where
import Language.Haskell.TH.Syntax hiding (makeRelativeToProject)
@@ -124,8 +132,8 @@
-> FilePath -- ^ subdirectory which contains the translation files
-> Lang -- ^ default translation language
-> Q [Dec]
-mkMessage dt folder lang =
- mkMessageCommon True "Msg" "Message" dt dt folder lang
+mkMessage dt =
+ mkMessageCommon True "Msg" "Message" dt dt
-- | create 'RenderMessage' instance for an existing data-type
@@ -134,7 +142,7 @@
-> FilePath -- ^ path to translation folder
-> Lang -- ^ default language
-> Q [Dec]
-mkMessageFor master dt folder lang = mkMessageCommon False "" "" master dt
folder lang
+mkMessageFor = mkMessageCommon False "" ""
-- | create an additional set of translations for a type created by `mkMessage`
mkMessageVariant :: String -- ^ master translation data type
@@ -142,7 +150,7 @@
-> FilePath -- ^ path to translation folder
-> Lang -- ^ default language
-> Q [Dec]
-mkMessageVariant master dt folder lang = mkMessageCommon False "Msg" "Message"
master dt folder lang
+mkMessageVariant = mkMessageCommon False "Msg" "Message"
-- |used by 'mkMessage' and 'mkMessageFor' to generate a 'RenderMessage' and
possibly a message data type
mkMessageCommon :: Bool -- ^ generate a new datatype from the
constructors found in the .msg files
@@ -153,42 +161,66 @@
-> FilePath -- ^ path to translation folder
-> Lang -- ^ default lang
-> Q [Dec]
-mkMessageCommon genType prefix postfix master dt rawFolder lang = do
+mkMessageCommon genType prefix postfix =
+ mkMessageOpts opts
+ where
+ opts = defMakeMessageOpts
+ { mmGenType = genType
+ , mmConPrefix = prefix
+ , mmTypeSuffix = postfix
+ }
+
+-- | used by 'mkMessage', 'mkMessageFor' to generate a 'RenderMessage' and
possibly a message data type
+--
+-- @since 2.1.6
+mkMessageOpts :: MakeMessageOpts -- ^ options
+ -> String -- ^ base name of master datatype
+ -> String -- ^ base name of translation datatype
+ -> FilePath -- ^ path to translation folder
+ -> Lang -- ^ default lang
+ -> Q [Dec]
+mkMessageOpts opts@(MkMakeMessageOpts {mmGenType = genType, mmTypeSuffix =
postfix}) master dt rawFolder lang = do
folder <- makeRelativeToProject rawFolder
files <- qRunIO $ getDirectoryContents folder
let files' = filter (`notElem` [".", ".."]) files
- (filess, contents) <- qRunIO $ fmap (unzip . catMaybes) $ mapM (loadLang
folder) files'
+ (filess, contents) <- qRunIO $ unzip . catMaybes <$> mapM (loadLang
folder) files'
(mapM_.mapM_) addDependentFile filess
let contents' = Map.toList $ Map.fromListWith (++) contents
sdef <-
case lookup lang contents' of
Nothing -> error $ "Did not find main language file: " ++ unpack
lang
Just def -> toSDefs def
- mapM_ (checkDef sdef) $ map snd contents'
+ mapM_ (checkDef sdef . snd) contents'
let mname = mkName $ dt2 ++ postfix
- c1 <- fmap concat $ mapM (toClauses prefix dt2 ) contents'
- c2 <- mapM (sToClause prefix dt2) sdef
+ c1 <- concat <$> mapM (toClauses opts dt2 ) contents'
+ c2 <- mapM (sToClause opts dt2) sdef
c3 <- defClause
return $
( if genType
- then ((DataD [] mname [] Nothing (map (toCon dt2) sdef) []) :)
+ then (DataD [] mname [] Nothing (map (toCon opts dt2) sdef) [] :)
else id)
[ instanceD
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))
+ filter (\x -> x /= '(' && x /= ')') $ master'
+ combineArgs typeName p xs' = foldl1 AppT . (typeName
:) . fmap (VarT . mkName) . filter (not . null) $ go xs' (id, id)
+ where
+ go :: String -> ([String] -> [String], String ->
String) -> [String]
+ go [] (endList, currList) = endList [currList []]
+ go (x : xs) (endList, currList)
+ | p x = go xs (endList . (currList [] :), id)
+ | otherwise = go xs (endList, currList . (x :))
+ in ParensT (combineArgs (ConT (mkName ts)) (== ' ') us)
else ConT $ mkName master') `AppT` ConT mname)
[ FunD (mkName "renderMessage") $ c1 ++ c2 ++ [c3]
]
]
- where (dt1, cxt0) = case (parse parseName "" dt) of
+ where (dt1, cxt0) = case parse parseName "" dt of
Left err -> error $ show err
Right x -> x
dt2 = concat . take 1 $ dt1
- master' | cxt0 == [] = master
+ master' | null cxt0 = master
| otherwise = (\xss -> if length xss > 1
then '(':unwords xss ++ ")"
else concat . take 1 $ xss)
. fst $
@@ -237,27 +269,30 @@
parseContexts =
sepBy1 (many1 parseWord) (spaces >> char ',' >> return
())
-toClauses :: String -> String -> (Lang, [Def]) -> Q [Clause]
-toClauses prefix dt (lang, defs) =
+toClauses :: MakeMessageOpts -> String -> (Lang, [Def]) -> Q [Clause]
+toClauses opts@(MkMakeMessageOpts {mmConPrefix = prefix}) dt (lang, defs) =
mapM go defs
where
go def = do
a <- newName "lang"
- (pat, bod) <- mkBody dt (prefix ++ constr def) (map fst $ vars def)
(content def)
+ (pat, bod) <- mkBody opts dt (prefix ++ constr def) (map fst $ vars
def) (content def)
guard <- fmap NormalG [|$(return $ VarE a) == pack $(lift $ unpack
lang)|]
return $ Clause
[WildP, conP (mkName ":") [VarP a, WildP], pat]
(GuardedB [(guard, bod)])
[]
-mkBody :: String -- ^ datatype
+mkBody :: MakeMessageOpts
+ -> String -- ^ datatype
-> String -- ^ constructor
-> [String] -- ^ variable names
-> [Content]
-> Q (Pat, Exp)
-mkBody dt cs vs ct = do
+mkBody (MkMakeMessageOpts {mmUseRecordCons = useRecord}) dt cs vs ct = do
vp <- mapM go vs
- let pat = RecP (mkName cs) (map (varName dt *** VarP) vp)
+ let pat = if useRecord
+ then RecP (mkName cs) (map (varName dt *** VarP) vp)
+ else ConP (mkName cs) [] (map (VarP . snd) vp)
let ct' = map (fixVars vp) ct
pack' <- [|Data.Text.pack|]
tomsg <- [|toMessage|]
@@ -281,14 +316,11 @@
fixDeref vp (DerefIdent (Ident i)) = DerefIdent $ Ident $ fixIdent vp i
fixDeref vp (DerefBranch a b) = DerefBranch (fixDeref vp a) (fixDeref vp b)
fixDeref _ d = d
- fixIdent vp i =
- case lookup i vp of
- Nothing -> i
- Just y -> nameBase y
-
-sToClause :: String -> String -> SDef -> Q Clause
-sToClause prefix dt sdef = do
- (pat, bod) <- mkBody dt (prefix ++ sconstr sdef) (map fst $ svars sdef)
(scontent sdef)
+ fixIdent vp i = maybe i nameBase (lookup i vp)
+
+sToClause :: MakeMessageOpts -> String -> SDef -> Q Clause
+sToClause opts@(MkMakeMessageOpts {mmConPrefix = prefix}) dt sdef = do
+ (pat, bod) <- mkBody opts dt (prefix ++ sconstr sdef) (map fst $ svars
sdef) (scontent sdef)
return $ Clause
[WildP, conP (mkName "[]") [], pat]
(NormalB bod)
@@ -312,11 +344,15 @@
conP = ConP
#endif
-toCon :: String -> SDef -> Con
-toCon dt (SDef c vs _) =
- RecC (mkName $ "Msg" ++ c) $ map go vs
- where
- go (n, t) = (varName dt n, notStrict, ConT $ mkName t)
+toCon :: MakeMessageOpts -> String -> SDef -> Con
+toCon (MkMakeMessageOpts {mmConPrefix = prefix, mmUseRecordCons = useRecord})
dt (SDef c vs _) =
+ if useRecord
+ then RecC nm $ map goRec vs
+ else NormalC nm $ map goNorm vs
+ where
+ goRec (n, t) = (varName dt n, notStrict, ConT $ mkName t)
+ goNorm (_, t) = (notStrict, ConT $ mkName t)
+ nm = mkName $ prefix ++ c
varName :: String -> String -> Name
varName a y =
@@ -471,3 +507,59 @@
instanceD :: Cxt -> Type -> [Dec] -> Dec
instanceD = InstanceD Nothing
+
+-- | Opaque options type for 'mkMessage'
+-- This is used to pass options to the 'mkMessage' function.
+-- The options are not exposed directly to the user, but can be set using
+-- the 'set*' functions, and the default can be made using
'defMakeMessageOpts'.
+--
+-- @since 2.1.6
+data MakeMessageOpts = MkMakeMessageOpts
+-- don't export constructor so that we can freely manipulate internals
+ { mmGenType :: Bool
+ , mmConPrefix :: String
+ , mmTypeSuffix :: String
+ , mmUseRecordCons :: Bool
+ }
+
+-- | Default options for 'mkMessage' are:
+-- * @mmGenType@ = @True@
+-- * @mmConPrefix@ = @\"Msg\"@
+-- * @mmTypeSuffix@ = @\"Message\"@
+-- * @mmUseRecordCons@ = @True@
+--
+-- @since 2.1.6
+defMakeMessageOpts :: MakeMessageOpts
+defMakeMessageOpts = MkMakeMessageOpts
+ { mmGenType = True
+ , mmConPrefix = "Msg"
+ , mmTypeSuffix = "Message"
+ , mmUseRecordCons = True
+ }
+
+-- | Whether to generate a new datatype from the constructors found in the .msg
+-- files
+--
+-- @since 2.1.6
+setGenType :: Bool -> MakeMessageOpts -> MakeMessageOpts
+setGenType x opts = opts { mmGenType = x }
+
+-- | Set the prefix for the constructor names
+--
+-- @since 2.1.6
+setConPrefix :: String -> MakeMessageOpts -> MakeMessageOpts
+setConPrefix x opts = opts { mmConPrefix = x }
+
+-- | Set the suffix for the datatype name
+--
+-- @since 2.1.6
+setTypeSuffix :: String -> MakeMessageOpts -> MakeMessageOpts
+setTypeSuffix x opts = opts { mmTypeSuffix = x }
+
+-- | Set whether to use record constructors or normal constructors.
+-- If you are getting partial-fields warnings you want to remove, set this to
+-- 'False'. If you want to use record syntax, set this to 'True'.
+--
+-- @since 2.1.6
+setUseRecordCons :: Bool -> MakeMessageOpts -> MakeMessageOpts
+setUseRecordCons x opts = opts { mmUseRecordCons = x }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/shakespeare-2.1.4/other-messages/en.msg
new/shakespeare-2.1.7.1/other-messages/en.msg
--- old/shakespeare-2.1.4/other-messages/en.msg 1970-01-01 01:00:00.000000000
+0100
+++ new/shakespeare-2.1.7.1/other-messages/en.msg 2025-10-08
18:38:38.000000000 +0200
@@ -0,0 +1,29 @@
+NotAnAdminRR: You must be an administrator to access this page.
+
+WelcomeHomepageRR: Welcome to the homepage
+SeeArchiveRR: See the archive
+
+NoEntriesRR: There are no entries in the blog
+LoginToPostRR: Admins can login to post
+NewEntryRR: Post to blog
+NewEntryTitleRR: Title
+NewEntryContentRR: Content
+
+PleaseCorrectEntryRR: Your submitted entry had some errors, please correct and
try again.
+EntryCreatedRR title@Text: Your new blog post, #{title}, has been created
+
+EntryTitleRR title@Text: Blog postRR: #{title}
+CommentsHeadingRR: Comments
+NoCommentsRR: There are no comments
+AddCommentHeadingRR: Add a Comment
+LoginToCommentRR: You must be logged in to comment
+AddCommentButtonRR: Add comment
+
+CommentNameRR: Your display name
+CommentTextRR: Comment
+CommentAddedRR: Your comment has been added
+PleaseCorrectCommentRR: Your submitted comment had some errors, please correct
and try again.
+
+HomepageTitleRR: Yesod Blog Demo
+BlogArchiveTitleRR: Blog Archive
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/shakespeare-2.1.4/shakespeare.cabal
new/shakespeare-2.1.7.1/shakespeare.cabal
--- old/shakespeare-2.1.4/shakespeare.cabal 2025-06-05 17:55:56.000000000
+0200
+++ new/shakespeare-2.1.7.1/shakespeare.cabal 2025-10-08 18:40:18.000000000
+0200
@@ -1,5 +1,5 @@
name: shakespeare
-version: 2.1.4
+version: 2.1.7.1
license: MIT
license-file: LICENSE
author: Michael Snoyman <[email protected]>
@@ -22,11 +22,12 @@
build-type: Simple
homepage: http://www.yesodweb.com/book/shakespearean-templates
extra-source-files:
+ other-messages/*.msg
+ test-messages/*.msg
test/reload.txt
test/texts/*.text
test/juliuses/*.julius
test/juliuses/*.coffee
- test-messages/*.msg
test/cassiuses/*.cassius
test/cassiuses/*.lucius
test/hamlets/*.hamlet
@@ -43,7 +44,7 @@
, text >= 0.7
, process >= 1.0
, ghc-prim
- , bytestring
+ , bytestring >= 0.11.2
, directory >= 1.2
, aeson < 3
, blaze-markup
@@ -128,6 +129,7 @@
type: exitcode-stdio-1.0
ghc-options: -Wall
+ build-tool-depends: hspec-discover:hspec-discover
build-depends: base >= 4.9 && < 5
, shakespeare
, time >= 1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/shakespeare-2.1.4/test/Text/Shakespeare/I18NSpec.hs
new/shakespeare-2.1.7.1/test/Text/Shakespeare/I18NSpec.hs
--- old/shakespeare-2.1.4/test/Text/Shakespeare/I18NSpec.hs 2025-06-05
17:35:51.000000000 +0200
+++ new/shakespeare-2.1.7.1/test/Text/Shakespeare/I18NSpec.hs 2025-10-07
18:32:43.000000000 +0200
@@ -9,29 +9,49 @@
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 :: *
+class YesodSubApp master where
-newtype SubApp master = SubApp
- {
- getOrdering :: Ordering
- }
+instance YesodSubApp ()
-data Test = Test
+newtype SubApp master = SubApp master
-class Testable a where
- isTestable :: a -> Bool
+instance YesodSubApp (SubApp master)
-instance Testable Test where
- isTestable Test = True
-
-spec :: Monad m => m ()
-spec = return ()
+data Test a b
mkMessage "(YesodSubApp master) => SubApp master" "other-messages" "en"
-mkMessage "Test" "test-messages" "en"
+mkMessage "Test a b" "test-messages" "en"
+
+newtype SubAppNoRec master = SubAppNoRec master
+
+instance YesodSubApp (SubAppNoRec master)
+
+data TestNoRec
+mkMessageOpts
+ (setConPrefix "MsgNR" $ setUseRecordCons False defMakeMessageOpts)
+ "(YesodSubApp master) => SubAppNoRec master"
+ "(YesodSubApp master) => SubAppNoRec master"
+ "other-messages"
+ "en"
+
+mkMessageOpts
+ (setConPrefix "MsgNR" $ setUseRecordCons False defMakeMessageOpts)
+ "TestNoRec"
+ "TestNoRec"
+ "test-messages"
+ "en"
+
+spec :: Spec
+spec = do
+ describe "I18N" $ do
+ it "should generate messages with record constructors" $ do
+ let msg = MsgEntryCreatedRR { subAppMessageTitle = "foo" }
+ renderMessage (SubApp ()) [] msg `shouldBe` "Your new blog post, foo,
has been created"
+
+ it "should generate messages without record constructors" $ do
+ let msg = MsgNREntryCreatedRR "bar"
+ renderMessage (SubAppNoRec ()) [] msg `shouldBe` "Your new blog post,
bar, has been created"