Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package kf6-ktexttemplate for 
openSUSE:Factory checked in at 2026-09-11 18:00:31
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/kf6-ktexttemplate (Old)
 and      /work/SRC/openSUSE:Factory/.kf6-ktexttemplate.new.1265 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "kf6-ktexttemplate"

Fri Sep 11 18:00:31 2026 rev:31 rq:1376721 version:6.30.0

Changes:
--------
--- /work/SRC/openSUSE:Factory/kf6-ktexttemplate/kf6-ktexttemplate.changes      
2026-08-17 17:00:38.117514029 +0200
+++ 
/work/SRC/openSUSE:Factory/.kf6-ktexttemplate.new.1265/kf6-ktexttemplate.changes
    2026-09-11 18:03:05.773259381 +0200
@@ -1,0 +2,14 @@
+Tue Sep  8 09:22:33 UTC 2026 - Christophe Marin <[email protected]>
+
+- Update to 6.30.0
+  * New feature release
+  * For more details please see:
+  * https://kde.org/announcements/frameworks/6/6.30.0
+- Changes since 6.29.0:
+  * Update dependency version to 6.30.0
+  * No longer explicitly include CMakeParseArguments
+  * Make date/time filter locale-aware
+  * Make Context accessible to filters
+  * Update version to 6.30.0
+
+-------------------------------------------------------------------

Old:
----
  ktexttemplate-6.29.0.tar.xz
  ktexttemplate-6.29.0.tar.xz.sig

New:
----
  ktexttemplate-6.30.0.tar.xz
  ktexttemplate-6.30.0.tar.xz.sig

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ kf6-ktexttemplate.spec ++++++
--- /var/tmp/diff_new_pack.h0jiAI/_old  2026-09-11 18:03:06.828303502 +0200
+++ /var/tmp/diff_new_pack.h0jiAI/_new  2026-09-11 18:03:06.832303670 +0200
@@ -19,11 +19,11 @@
 %define qt6_version 6.9.0
 
 %define rname ktexttemplate
-# Full KF6 version (e.g. 6.29.0)
+# Full KF6 version (e.g. 6.30.0)
 %{!?_kf6_version: %global _kf6_version %{version}}
 %bcond_without released
 Name:           kf6-ktexttemplate
-Version:        6.29.0
+Version:        6.30.0
 Release:        0
 Summary:        String template library
 License:        LGPL-2.1-or-later

++++++ ktexttemplate-6.29.0.tar.xz -> ktexttemplate-6.30.0.tar.xz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ktexttemplate-6.29.0/CMakeLists.txt 
new/ktexttemplate-6.30.0/CMakeLists.txt
--- old/ktexttemplate-6.29.0/CMakeLists.txt     2026-08-07 22:42:58.000000000 
+0200
+++ new/ktexttemplate-6.30.0/CMakeLists.txt     2026-09-04 13:41:08.000000000 
+0200
@@ -1,10 +1,10 @@
 cmake_minimum_required(VERSION 3.29)
 
-set(KF_VERSION "6.29.0") # handled by release scripts
+set(KF_VERSION "6.30.0") # handled by release scripts
 project(KTextTemplate VERSION ${KF_VERSION})
 
 include(FeatureSummary)
-find_package(ECM 6.29.0  CONFIG)
+find_package(ECM 6.30.0  CONFIG)
 set_package_properties(ECM PROPERTIES
   TYPE REQUIRED
   DESCRIPTION "Extra CMake Modules."
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ktexttemplate-6.29.0/autotests/testfilters.cpp 
new/ktexttemplate-6.30.0/autotests/testfilters.cpp
--- old/ktexttemplate-6.29.0/autotests/testfilters.cpp  2026-08-07 
22:42:58.000000000 +0200
+++ new/ktexttemplate-6.30.0/autotests/testfilters.cpp  2026-09-04 
13:41:08.000000000 +0200
@@ -18,9 +18,12 @@
 #include "context.h"
 #include "engine.h"
 #include "ktexttemplate_paths.h"
+#include "qtlocalizer.h"
 #include "template.h"
 #include <util.h>
 
+using namespace Qt::Literals;
+
 using Dict = QHash<QString, QVariant>;
 
 Q_DECLARE_METATYPE(KTextTemplate::Error)
@@ -90,6 +93,8 @@
         QStringLiteral(KTEXTTEMPLATE_PLUGIN_PATH),
         appDirPath + QStringLiteral("/tests/") // For testtags.qs
     });
+
+    m_engine->addDefaultLibrary(u"ktexttemplate_i18ntags"_s); // for 
with_locale for testing date/time filters
 }
 
 void TestFilters::cleanupTestCase()
@@ -107,6 +112,7 @@
     auto t = m_engine->newTemplate(input, 
QLatin1String(QTest::currentDataTag()));
 
     Context context(dict);
+    context.setLocalizer(QSharedPointer<AbstractLocalizer>(new 
QtLocalizer(QLocale(QLocale::English, QLocale::UnitedStates))));
 
     auto result = t->render(&context);
 
@@ -332,11 +338,29 @@
     dict.insert(QStringLiteral("d"), d);
 
     QTest::newRow("date01") << "{{ d|date:\"MM\" }}" << dict << 
QStringLiteral("01") << NoError;
-    QTest::newRow("date02") << QStringLiteral("{{ d|date }}") << dict << 
d.toString(QStringLiteral("MMM. d, yyyy")) << NoError;
+    QTest::newRow("date02") << QStringLiteral("{{ d|date }}") << dict << 
QLocale(u"en_US"_s).toString(d.date(), QLocale::LongFormat) << NoError;
+    QTest::newRow("date03") << "{{ d|date:\"MMMM\" }}" << dict << u"January"_s 
<< NoError;
+    QTest::newRow("date04") << "{{ d|date:\"SHORT_DATE_FORMAT\" }}" << dict << 
u"1/1/08"_s << NoError;
+    QTest::newRow("date05") << "{{ d|date:\"SHORT_DATETIME_FORMAT\" }}" << 
dict << u"1/1/08 12:00\u202fAM"_s << NoError;
 
     dict.clear();
     dict.insert(QStringLiteral("d"), QStringLiteral("fail_string"));
-    QTest::newRow("date03") << "{{ d|date:\"MM\" }}" << dict << QString() << 
NoError;
+    QTest::newRow("date06") << "{{ d|date:\"MM\" }}" << dict << QString() << 
NoError;
+
+    dict.clear();
+    dict.insert(u"d"_s, QDate{2026, 7, 14});
+    QTest::newRow("date07") << u"{% with_locale \"de_DE\" %}{{ 
d|date:\"SHORT_DATE_FORMAT\" }}{% endwith_locale %}"_s << dict << u"14.07.26"_s 
<< NoError;
+    QTest::newRow("date08") << u"{% with_locale \"de_DE\" %}{{ d|date }}{% 
endwith_locale %}"_s << dict << u"Dienstag, 14. Juli 2026"_s << NoError;
+    QTest::newRow("date09") << u"{% with_locale \"de_DE\" %}{{ 
d|date:\"DATE_FORMAT\" }}{% endwith_locale %}"_s << dict << u"Dienstag, 14. 
Juli 2026"_s
+                            << NoError;
+    QTest::newRow("date10") << u"{% with_locale \"de_DE\" %}{{ d|date:\"MMMM\" 
}}{% endwith_locale %}"_s << dict << u"Juli"_s << NoError;
+
+    dict.clear();
+    dict.insert(u"t"_s, QTime{13, 24, 56});
+    QTest::newRow("time01") << u"{{ t|time }}"_s << dict << u"1:24\u202fPM"_s 
<< NoError;
+    QTest::newRow("time02") << u"{{ t|time:\"H'h'mm\" }}"_s << dict << 
u"13h24"_s << NoError;
+    QTest::newRow("time03") << u"{% with_locale \"de_DE\" %}{{ t|time }}{% 
endwith_locale %}"_s << dict << u"13:24"_s << NoError;
+    QTest::newRow("time04") << u"{% with_locale \"de_DE\" %}{{ 
t|time:\"TIME_FORMAT\" }}{% endwith_locale %}"_s << dict << u"13:24"_s << 
NoError;
 }
 
 void TestFilters::testStringFilters_data()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/ktexttemplate-6.29.0/cmake/modules/KF6TextTemplateMacros.cmake 
new/ktexttemplate-6.30.0/cmake/modules/KF6TextTemplateMacros.cmake
--- old/ktexttemplate-6.29.0/cmake/modules/KF6TextTemplateMacros.cmake  
2026-08-07 22:42:58.000000000 +0200
+++ new/ktexttemplate-6.30.0/cmake/modules/KF6TextTemplateMacros.cmake  
2026-09-04 13:41:08.000000000 +0200
@@ -1,6 +1,3 @@
-
-include(CMakeParseArguments)
-
 macro(ktexttemplate_adjust_plugin_name pluginname)
   set_target_properties(${pluginname}
     PROPERTIES PREFIX ""
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ktexttemplate-6.29.0/src/defaultfilters/datetime.cpp 
new/ktexttemplate-6.30.0/src/defaultfilters/datetime.cpp
--- old/ktexttemplate-6.29.0/src/defaultfilters/datetime.cpp    2026-08-07 
22:42:58.000000000 +0200
+++ new/ktexttemplate-6.30.0/src/defaultfilters/datetime.cpp    2026-09-04 
13:41:08.000000000 +0200
@@ -13,6 +13,8 @@
 
 #include <QDateTime>
 
+using namespace Qt::Literals;
+
 QVariant timeSince(const QDateTime &early, const QDateTime &late)
 {
     Q_ASSERT(early.isValid());
@@ -81,12 +83,26 @@
         d = QDateTime::fromString(getSafeString(input), Qt::ISODateWithMs);
     }
 
-    auto argString = getSafeString(argument);
+    const QString argString = getSafeString(argument);
 
-    if (!argString.get().isEmpty())
-        return d.toString(argString);
+    // locale-specific format constants as defined in 
https://docs.djangoproject.com/en/6.0/ref/templates/builtins/#date
+    if (argString.isEmpty() || argString == "DATE_FORMAT"_L1) {
+        return context()->localizer()->localizeDate(d.date(), 
QLocale::LongFormat);
+    }
+    if (argString == "SHORT_DATE_FORMAT"_L1) {
+        return context()->localizer()->localizeDate(d.date(), 
QLocale::ShortFormat);
+    }
+    if (argString == "DATETIME_FORMAT"_L1) {
+        return context()->localizer()->localizeDateTime(d, 
QLocale::LongFormat);
+    }
+    if (argString == "SHORT_DATETIME_FORMAT"_L1) {
+        return context()->localizer()->localizeDateTime(d, 
QLocale::ShortFormat);
+    }
 
-    return d.toString(QStringLiteral("MMM. d, yyyy"));
+    // custom format
+    Q_ASSERT(!argString.isEmpty());
+    QLocale l(context()->localizer()->currentLocale());
+    return l.toString(d, argString);
 }
 
 QVariant TimeFilter::doFilter(const QVariant &input, const QVariant &argument, 
bool autoescape) const
@@ -103,8 +119,15 @@
         d = QDateTime::fromString(getSafeString(input), Qt::ISODateWithMs);
     }
 
-    auto argString = getSafeString(argument);
-    return d.toString(argString);
+    const QString argString = getSafeString(argument);
+
+    if (argString.isEmpty() || argString == "TIME_FORMAT"_L1) {
+        return context()->localizer()->localizeTime(d.time(), 
QLocale::ShortFormat);
+    }
+
+    Q_ASSERT(!argString.isEmpty());
+    QLocale l(context()->localizer()->currentLocale());
+    return l.toString(d.time(), argString);
 }
 
 QVariant TimeSinceFilter::doFilter(const QVariant &input, const QVariant 
&argument, bool autoescape) const
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ktexttemplate-6.29.0/src/lib/engine_p.h 
new/ktexttemplate-6.30.0/src/lib/engine_p.h
--- old/ktexttemplate-6.29.0/src/lib/engine_p.h 2026-08-07 22:42:59.000000000 
+0200
+++ new/ktexttemplate-6.30.0/src/lib/engine_p.h 2026-09-04 13:41:08.000000000 
+0200
@@ -36,6 +36,9 @@
 
     void setFilters(const QHash<QString, Filter *> &filters)
     {
+        for (const auto filter : filters) {
+            filter->forgottenBaseCtorRemoveInKF7();
+        }
         m_filters = filters;
     }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ktexttemplate-6.29.0/src/lib/filter.cpp 
new/ktexttemplate-6.30.0/src/lib/filter.cpp
--- old/ktexttemplate-6.29.0/src/lib/filter.cpp 2026-08-07 22:42:59.000000000 
+0200
+++ new/ktexttemplate-6.30.0/src/lib/filter.cpp 2026-09-04 13:41:08.000000000 
+0200
@@ -11,29 +11,50 @@
 
 using namespace KTextTemplate;
 
-Filter::~Filter() = default;
+class KTextTemplate::FilterPrivate
+{
+public:
+    OutputStream *m_stream = nullptr;
+    Context *m_context = nullptr;
+};
+
+Filter::Filter() = default;
+Filter::~Filter()
+{
+    delete d_ptr;
+}
+
+void Filter::forgottenBaseCtorRemoveInKF7()
+{
+    d_ptr = nullptr;
+}
 
 void Filter::setStream(KTextTemplate::OutputStream *stream)
 {
-    m_stream = stream;
+    if (!d_ptr) {
+        d_ptr = new FilterPrivate;
+    }
+    d_ptr->m_stream = stream;
 }
 
 SafeString Filter::escape(const QString &input) const
 {
-    return m_stream->escape(input);
+    return d_ptr->m_stream->escape(input);
 }
 
 SafeString Filter::escape(const SafeString &input) const
 {
-    if (input.isSafe())
-        return {m_stream->escape(input), SafeString::IsSafe};
-    return m_stream->escape(input);
+    if (input.isSafe()) {
+        return {d_ptr->m_stream->escape(input), SafeString::IsSafe};
+    }
+    return d_ptr->m_stream->escape(input);
 }
 
 SafeString Filter::conditionalEscape(const SafeString &input) const
 {
-    if (!input.isSafe())
-        return m_stream->escape(input);
+    if (!input.isSafe()) {
+        return d_ptr->m_stream->escape(input);
+    }
     return input;
 }
 
@@ -41,3 +62,16 @@
 {
     return false;
 }
+
+Context *Filter::context() const
+{
+    return d_ptr ? d_ptr->m_context : nullptr;
+}
+
+void Filter::setContext(KTextTemplate::Context *context)
+{
+    if (!d_ptr) {
+        d_ptr = new FilterPrivate;
+    }
+    d_ptr->m_context = context;
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ktexttemplate-6.29.0/src/lib/filter.h 
new/ktexttemplate-6.30.0/src/lib/filter.h
--- old/ktexttemplate-6.29.0/src/lib/filter.h   2026-08-07 22:42:59.000000000 
+0200
+++ new/ktexttemplate-6.30.0/src/lib/filter.h   2026-09-04 13:41:08.000000000 
+0200
@@ -12,6 +12,7 @@
 #ifndef KTEXTTEMPLATE_FILTER_H
 #define KTEXTTEMPLATE_FILTER_H
 
+#include "context.h"
 #include "ktexttemplate_export.h"
 #include "outputstream.h"
 #include "safestring.h"
@@ -23,6 +24,10 @@
 namespace KTextTemplate
 {
 
+class FilterExpression;
+class FilterPrivate;
+class ScriptableLibraryContainer;
+
 /*!
   \class KTextTemplate::Filter
   \inheaderfile KTextTemplate/Filter
@@ -46,6 +51,7 @@
 class KTEXTTEMPLATE_EXPORT Filter
 {
 public:
+    explicit Filter();
     virtual ~Filter();
 
     /*!
@@ -58,35 +64,56 @@
       Escapes and returns \a input. The OutputStream::escape method is used to
       escape \a input.
     */
-    SafeString escape(const QString &input) const;
+    [[nodiscard]] SafeString escape(const QString &input) const;
 
     /*!
       Escapes and returns \a input. The OutputStream::escape method is used to
       escape \a input.
     */
-    SafeString escape(const SafeString &input) const;
+    [[nodiscard]] SafeString escape(const SafeString &input) const;
 
     /*!
       Escapes \a input if not already safe from further escaping and returns 
it.
       The OutputStream::escape method is used to escape \a input.
     */
-    SafeString conditionalEscape(const SafeString &input) const;
+    [[nodiscard]] SafeString conditionalEscape(const SafeString &input) const;
 
+    // TODO KF7: pass context as an argument to doFilter, rather than holding 
it temporarily as a member
     /*!
       Reimplement to filter \a input given \a argument.
 
       \a autoescape determines whether the autoescape feature is currently on 
or
       off. Most filters will not use this.
     */
-    virtual QVariant doFilter(const QVariant &input, const QVariant &argument 
= {}, bool autoescape = {}) const = 0;
+    [[nodiscard]] virtual QVariant doFilter(const QVariant &input, const 
QVariant &argument = {}, bool autoescape = {}) const = 0;
 
     /*!
       Reimplement to return whether this filter is safe.
     */
-    virtual bool isSafe() const;
+    [[nodiscard]] virtual bool isSafe() const;
+
+    /*!
+       The context in which the filter is evaluated.
+       \warning Calling this is only valid from within doFilter itself!
+    */
+    [[nodiscard]] Context *context() const;
 
 private:
-    OutputStream *m_stream;
+    Q_DISABLE_COPY(Filter)
+    // TODO KF7 remove this
+    // this is needed as prior to KF 6.29 what became d below was uninitialized
+    // and the default ctor was inline, ie. older external subclasses would 
leave us
+    // with an uninitialized member variable here
+    friend class ParserPrivate;
+    friend class ScriptableLibraryContainer;
+    KTEXTTEMPLATE_NO_EXPORT void forgottenBaseCtorRemoveInKF7();
+
+    // TODO KF7 remove this if Context becomes an argument to doFilter
+    friend class FilterExpression;
+    KTEXTTEMPLATE_NO_EXPORT void setContext(Context *context);
+
+    // can become a std::unique_ptr in KF7, but not before due to the above 
issue
+    FilterPrivate *d_ptr = nullptr;
 };
 }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ktexttemplate-6.29.0/src/lib/filterexpression.cpp 
new/ktexttemplate-6.30.0/src/lib/filterexpression.cpp
--- old/ktexttemplate-6.29.0/src/lib/filterexpression.cpp       2026-08-07 
22:42:59.000000000 +0200
+++ new/ktexttemplate-6.30.0/src/lib/filterexpression.cpp       2026-09-04 
13:41:08.000000000 +0200
@@ -203,7 +203,9 @@
 
         const auto varString = getSafeString(var);
 
+        filter->setContext(c);
         var = filter->doFilter(var, arg, c->autoEscape());
+        filter->setContext(nullptr);
 
         if (var.userType() == qMetaTypeId<KTextTemplate::SafeString>() || 
var.userType() == qMetaTypeId<QString>()) {
             if (filter->isSafe() && varString.isSafe()) {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ktexttemplate-6.29.0/src/lib/parser.cpp 
new/ktexttemplate-6.30.0/src/lib/parser.cpp
--- old/ktexttemplate-6.29.0/src/lib/parser.cpp 2026-08-07 22:42:59.000000000 
+0200
+++ new/ktexttemplate-6.30.0/src/lib/parser.cpp 2026-09-04 13:41:08.000000000 
+0200
@@ -65,10 +65,11 @@
         nodeIt.value()->setEngine(engine);
         m_nodeFactories.insert(nodeIt.key(), nodeIt.value());
     }
-    auto filters = library->filters();
-    for (auto filterIt = filters.begin(), filterEnd = filters.end(); filterIt 
!= filterEnd; ++filterIt) {
-        auto f = QSharedPointer<Filter>(filterIt.value());
-        m_filters.insert(filterIt.key(), f);
+    const auto filters = library->filters();
+    for (const auto filterIt : filters.asKeyValueRange()) {
+        filterIt.second->forgottenBaseCtorRemoveInKF7();
+        auto f = QSharedPointer<Filter>(filterIt.second);
+        m_filters.insert(filterIt.first, f);
     }
 }
 

++++++ ktexttemplate-6.29.0.tar.xz.sig -> ktexttemplate-6.30.0.tar.xz.sig ++++++
--- 
/work/SRC/openSUSE:Factory/kf6-ktexttemplate/ktexttemplate-6.29.0.tar.xz.sig    
    2026-08-17 17:00:38.273519541 +0200
+++ 
/work/SRC/openSUSE:Factory/.kf6-ktexttemplate.new.1265/ktexttemplate-6.30.0.tar.xz.sig
      2026-09-11 18:03:06.156275399 +0200
@@ -1,7 +1,7 @@
 -----BEGIN PGP SIGNATURE-----
 
-iHUEABYKAB0WIQSQqWisqEU3zCe5nq8sjfWHptSqwQUCanZDVAAKCRAsjfWHptSq
-wdKWAQD5YxeGlAa4lpx2i3+adc/q2GBMY/17VGDwQqHdjIEEFQEAnBI2rfMuoPC0
-LaWhFU/ruYs13kXpcADFsj0JyopiIAg=
-=SLQz
+iHUEABYKAB0WIQSQqWisqEU3zCe5nq8sjfWHptSqwQUCapquVAAKCRAsjfWHptSq
+wf2AAP4rT93TyIBLGe1Nsa+l3xp/rh4SSaAitZ2m/o2GG6KMYwEAwnh0IvWh/ffm
+u7LljdLQQH912M/mWxPDl45O/bXubQk=
+=dCcK
 -----END PGP SIGNATURE-----

Reply via email to