diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 0000000..55bfb6d
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,56 @@
+# Generated from:
+# https://github.com/plone/meta/tree/2.x/src/plone/meta/default
+# See the inline comments on how to expand/tweak this configuration file
+#
+# EditorConfig Configuration file, for more details see:
+# http://EditorConfig.org
+# EditorConfig is a convention description, that could be interpreted
+# by multiple editors to enforce common coding conventions for specific
+# file types
+
+# top-most EditorConfig file:
+# Will ignore other EditorConfig files in Home directory or upper tree level.
+root = true
+
+
+[*]
+# Default settings for all files.
+# Unix-style newlines with a newline ending every file
+end_of_line = lf
+insert_final_newline = true
+trim_trailing_whitespace = true
+# Set default charset
+charset = utf-8
+# Indent style default
+indent_style = space
+# Max Line Length - a hard line wrap, should be disabled
+max_line_length = off
+
+[*.{py,cfg,ini}]
+# 4 space indentation
+indent_size = 4
+
+[*.{yml,zpt,pt,dtml,zcml,html,xml}]
+# 2 space indentation
+indent_size = 2
+
+[*.{json,jsonl,js,jsx,ts,tsx,css,less,scss}]
+# Frontend development
+# 2 space indentation
+indent_size = 2
+max_line_length = 80
+
+[{Makefile,.gitmodules}]
+# Tab indentation (no size specified, but view as 4 spaces)
+indent_style = tab
+indent_size = unset
+tab_width = unset
+
+
+##
+# Add extra configuration options in .meta.toml:
+# [editorconfig]
+# extra_lines = """
+# _your own configuration lines_
+# """
+##
diff --git a/.flake8 b/.flake8
new file mode 100644
index 0000000..ff17672
--- /dev/null
+++ b/.flake8
@@ -0,0 +1,22 @@
+# Generated from:
+# https://github.com/plone/meta/tree/2.x/src/plone/meta/default
+# See the inline comments on how to expand/tweak this configuration file
+[flake8]
+doctests = 1
+ignore =
+ # black takes care of line length
+ E501,
+ # black takes care of where to break lines
+ W503,
+ # black takes care of spaces within slicing (list[:])
+ E203,
+ # black takes care of spaces after commas
+ E231,
+
+##
+# Add extra configuration options in .meta.toml:
+# [flake8]
+# extra_lines = """
+# _your own configuration lines_
+# """
+##
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
new file mode 100644
index 0000000..8da3888
--- /dev/null
+++ b/.github/dependabot.yml
@@ -0,0 +1,11 @@
+# Generated from:
+# https://github.com/plone/meta/tree/2.x/src/plone/meta/default
+# See the inline comments on how to expand/tweak this configuration file
+version: 2
+updates:
+
+ - package-ecosystem: "github-actions"
+ directory: "/"
+ schedule:
+ # Check for updates to GitHub Actions every week
+ interval: "weekly"
diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml
deleted file mode 100644
index c288942..0000000
--- a/.github/workflows/CI.yml
+++ /dev/null
@@ -1,42 +0,0 @@
-name: CI
-
-on:
- push:
- branches-ignore:
- - "master"
-
-jobs:
- build:
- runs-on: ubuntu-latest
- strategy:
- fail-fast: false
- matrix:
- python:
- - "3.8"
- - "3.9"
- - "3.10"
- - "3.11"
- plone:
- - "6.0-latest"
-
- steps:
- - uses: actions/checkout@v2
-
- - name: Setup Plone ${{ matrix.plone }} with Python ${{ matrix.python }}
- id: setup
- uses: plone/setup-plone@v1.0.0
- with:
- python-version: ${{ matrix.python }}
- plone-version: ${{ matrix.plone }}
-
- - name: Install package
- run: |
- make VENV=off install
-
- - name: Run Lint
- run: |
- make VENV=off lint
-
- - name: Run tests
- run: |
- make VENV=off test-ignore-warnings
diff --git a/.github/workflows/meta.yml b/.github/workflows/meta.yml
new file mode 100644
index 0000000..df9c753
--- /dev/null
+++ b/.github/workflows/meta.yml
@@ -0,0 +1,59 @@
+# Generated from:
+# https://github.com/plone/meta/tree/2.x/src/plone/meta/default
+# See the inline comments on how to expand/tweak this configuration file
+name: Meta
+
+on:
+ push:
+ workflow_dispatch:
+
+##
+# To set environment variables for all jobs, add in .meta.toml:
+# [github]
+# env = """
+# debug: 1
+# image-name: 'org/image'
+# image-tag: 'latest'
+# """
+##
+
+jobs:
+ qa:
+ uses: plone/meta/.github/workflows/qa.yml@2.x
+ coverage:
+ uses: plone/meta/.github/workflows/coverage.yml@2.x
+ dependencies:
+ uses: plone/meta/.github/workflows/dependencies.yml@2.x
+ release_ready:
+ uses: plone/meta/.github/workflows/release_ready.yml@2.x
+ circular:
+ uses: plone/meta/.github/workflows/circular.yml@2.x
+
+##
+# To modify the list of default jobs being created add in .meta.toml:
+# [github]
+# jobs = [
+# "qa",
+# "coverage",
+# "dependencies",
+# "release_ready",
+# "circular",
+# ]
+##
+
+##
+# To request that some OS level dependencies get installed
+# when running tests/coverage jobs, add in .meta.toml:
+# [github]
+# os_dependencies = "git libxml2 libxslt"
+##
+
+
+##
+# Specify additional jobs in .meta.toml:
+# [github]
+# extra_lines = """
+# another:
+# uses: org/repo/.github/workflows/file.yml@main
+# """
+##
diff --git a/.github/workflows/test-matrix.yml b/.github/workflows/test-matrix.yml
new file mode 100644
index 0000000..91785f4
--- /dev/null
+++ b/.github/workflows/test-matrix.yml
@@ -0,0 +1,65 @@
+# Generated from:
+# https://github.com/plone/meta/tree/2.x/src/plone/meta/default
+# See the inline comments on how to expand/tweak this configuration file
+name: Tests
+
+on:
+ push:
+ workflow_dispatch:
+
+jobs:
+ build:
+ permissions:
+ contents: read
+ pull-requests: write
+ strategy:
+ # We want to see all failures:
+ fail-fast: false
+ matrix:
+ os:
+ - ["ubuntu", "ubuntu-latest"]
+ config:
+ # [Python version, visual name, tox env]
+ - ["3.14", "6.2 on py3.14", "py314-plone62"]
+ - ["3.10", "6.2 on py3.10", "py310-plone62"]
+
+ runs-on: ${{ matrix.os[1] }}
+ if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name
+ name: ${{ matrix.config[1] }}
+ steps:
+ - uses: actions/checkout@v6
+ with:
+ persist-credentials: false
+ - name: Install uv + caching
+ uses: astral-sh/setup-uv@v8.1.0
+ with:
+ enable-cache: true
+ cache-dependency-glob: |
+ setup.*
+ tox.ini
+ pyproject.toml
+ python-version: ${{ matrix.config[0] }}
+
+##
+# Add extra configuration options in .meta.toml:
+# [github]
+# extra_lines_after_os_dependencies = """
+# _your own configuration lines_
+# """
+##
+ - name: Initialize tox
+ # the bash one-liner below does not work on Windows
+ if: contains(matrix.os, 'ubuntu')
+ run: |
+ if [ `uvx tox list --no-desc -f init|wc -l` = 1 ]; then uvx --with tox-uv tox -e init;else true; fi
+ - name: Test
+ run: uvx --with tox-uv tox -e ${{ matrix.config[2] }}
+
+
+##
+# Add extra configuration options in .meta.toml:
+# [github]
+# extra_lines = """
+# _your own configuration lines_
+# """
+##
diff --git a/.gitignore b/.gitignore
index 99fe871..70377bd 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,28 +1,43 @@
+# Generated from:
+# https://github.com/plone/meta/tree/2.x/src/plone/meta/default
+# See the inline comments on how to expand/tweak this configuration file
+# python related
*.egg-info
-*.mo
*.pyc
-*~
-.installed.cfg
-.mr.developer.cfg
-.python-version
+*.pyo
+
+# translation related
+*.mo
+
+# tools related
+build/
.coverage
+.*project
+coverage.xml
+dist/
+docs/_build
+__pycache__/
+.tox
+.vscode/
+node_modules/
+forest.dot
+forest.json
+
+# venv / buildout related
bin/
-coverage/
develop-eggs/
-downloads/
eggs/
-htmlcov/
+.eggs/
+etc/
+.installed.cfg
include/
lib/
-library-settings.txt
-log.html
-output.xml
+lib64
+.mr.developer.cfg
parts/
-report.html
-selenium*
+pyvenv.cfg
var/
-venv/
-__pycache__
+local.cfg
# mxdev
/instance/
@@ -31,3 +46,13 @@ __pycache__
/reports/
/sources/
/venv/
+.installed.txt
+
+
+##
+# Add extra configuration options in .meta.toml:
+# [gitignore]
+# extra_lines = """
+# _your own configuration lines_
+# """
+##
diff --git a/.installed.txt b/.installed.txt
deleted file mode 100644
index e2f31a3..0000000
--- a/.installed.txt
+++ /dev/null
@@ -1,263 +0,0 @@
-AccessControl==5.7
-Acquisition==4.13
-async-generator==1.10
-attrs==22.1.0
-AuthEncoding==4.3
-Babel==2.11.0
-beautifulsoup4==4.11.1
-black==22.10.0
-borg.localrole==3.1.9
-BTrees==4.11.3
-certifi==2022.9.24
-cffi==1.15.1
-Chameleon==3.10.1
-click==8.1.3
-collective.monkeypatcher==1.2.1
-cssselect==1.2.0
-DateTime==4.7
-decorator==5.1.1
-diazo==1.5.0
-DocumentTemplate==4.1
-docutils==0.17.1
-exceptiongroup==1.0.4
-ExtensionClass==4.9
-feedparser==6.0.10
-five.customerize==2.1.0
-five.intid==1.2.6
-five.localsitemanager==3.3
-furl==2.1.3
-future==0.18.2
-h11==0.14.0
-icalendar==5.0.2
-idna==3.4
-jsonschema==4.17.0
-libvcs==0.11.1
-lxml==4.9.1
-Markdown==3.4.1
-Missing==4.2
-MultiMapping==4.1
-multipart==0.2.4
-mxdev==2.1.0
-mypy-extensions==0.4.3
-orderedmultidict==1.0.1
-outcome==1.2.0
-Paste==3.5.2
-PasteDeploy==3.0.1
-pathspec==0.10.2
-Persistence==3.6
-persistent==4.9.3
-piexif==1.1.3
-Pillow==9.3.0
-platformdirs==2.5.4
-plone.alterego==1.1.5
-plone.api==2.0.0b4
-plone.app.content==4.0.1
-plone.app.contentlisting==3.0.0b1
-plone.app.contentmenu==3.0.0b3
-plone.app.contentrules==5.0.0b2
-plone.app.contenttypes==3.0.0b2
-plone.app.customerize==1.3.12
-plone.app.dexterity==3.0.0b2
-plone.app.discussion==4.0.0
-plone.app.event==4.0.0
-plone.app.i18n==4.0.0a1
-plone.app.intid==1.1.4
-plone.app.layout==4.0.0
-plone.app.linkintegrity==3.6.1
-plone.app.locales==6.0.8
-plone.app.lockingbehavior==1.0.7
-plone.app.multilingual==6.0.0b3
-plone.app.portlets==5.0.0b2
-plone.app.querystring==2.0.0
-plone.app.redirector==3.0.0a1
-plone.app.registry==2.0.0a9
-plone.app.relationfield==3.0.0b2
-plone.app.robotframework==2.0.0b2
-plone.app.testing==7.0.0b2
-plone.app.textfield==1.3.6
-plone.app.theming==5.0.0b2
-plone.app.users==3.0.0
-plone.app.uuid==2.2.1
-plone.app.versioningbehavior==2.0.0b1
-plone.app.viewletmanager==4.0.0
-plone.app.vocabularies==5.0.0b1
-plone.app.widgets==4.0.0b1
-plone.app.workflow==5.0.0b1
-plone.app.z3cform==4.0.0b1
-plone.autoform==2.0.0a1
-plone.autoinclude==1.0.0a5
-plone.base==1.0.0b5
-plone.batching==2.0.0a1
-plone.behavior==1.4.0
-plone.browserlayer==3.0.0
-plone.caching==1.2.2
-plone.contentrules==2.1.2
-plone.dexterity==3.0.0b2
-plone.event==1.4.1
-plone.folder==3.1.0
-plone.formwidget.namedfile==3.0.0a5
-plone.formwidget.recurrence==2.1.5
-plone.i18n==5.0.0b1
-plone.indexer==1.0.7
-plone.intelligenttext==3.1.0
-plone.keyring==3.1.3
-plone.locking==2.2.5
-plone.memoize==3.0.0
-plone.namedfile==6.0.0b5
-plone.outputfilters==5.0.0
-plone.portlet.collection==4.0.0a4
-plone.portlet.static==4.0.0b1
-plone.portlets==2.3.2
-plone.protect==4.1.6
-plone.registry==1.2.1
-plone.resource==2.1.4
-plone.resourceeditor==3.0.4
-plone.rfc822==2.0.2
-plone.scale==4.0.0b5
-plone.schema==1.4.0
-plone.schemaeditor==4.0.0b2
-plone.session==4.0.0b2
-plone.staticresources==2.0.1
-plone.stringinterp==1.3.3
-plone.subrequest==2.0.0b1
-plone.supermodel==2.0.0
-plone.testing==8.0.3
-plone.theme==3.0.7
-plone.transformchain==2.0.2
-plone.uuid==1.0.6
-plone.z3cform==2.0.0b1
-plonetheme.barceloneta==3.0.0b6
-Products.BTreeFolder2==4.3
-Products.CMFCore==2.6.0
-Products.CMFDiffTool==3.3.3
-Products.CMFDynamicViewFTI==7.0.0a1
-Products.CMFEditions==4.0.0b3
-Products.CMFPlone==6.0.0rc1
-Products.CMFUid==3.4
-Products.DateRecurringIndex==3.0.1
-Products.DCWorkflow==2.6.0
-Products.ExtendedPathIndex==4.0.1
-Products.ExternalMethod==4.6
-Products.GenericSetup==2.2.0
-Products.isurlinportal==1.2.1
-Products.MailHost==4.12
-Products.MimetypesRegistry==2.1.9
--e git+https://github.com/collective/Products.PloneKeywordManager.git@76994e7123011a8a8c6e05241a28915f899ff02b#egg=Products.PloneKeywordManager
-Products.PlonePAS==7.0.0b3
-Products.PluggableAuthService==2.7.1
-Products.PluginRegistry==1.10
-Products.PortalTransforms==3.2.1
-Products.PythonScripts==4.14
-Products.Sessions==4.14
-Products.SiteErrorLog==5.6
-Products.StandardCacheManagers==4.1.1
-Products.statusmessages==5.0.5
-Products.ZCatalog==6.3
-Products.ZopeVersionControl==3.0.0
-prompt-toolkit==2.0.10
-pycparser==2.21
-pyrsistent==0.19.2
-PySocks==1.7.1
-python-dateutil==2.8.2
-python-gettext==4.1
-pytz==2022.6
-Record==3.6
-repoze.xmliter==0.6.1
-RestrictedPython==6.0
-robotframework==6.0.1
-robotframework-debuglibrary==2.3.0
-robotframework-pythonlibcore==4.0.0
-robotframework-selenium2library==3.0.0
-robotframework-seleniumlibrary==6.0.0
-robotframework-seleniumtestability==2.0.0
-robotsuite==2.3.1
-roman==3.3
-selenium==4.6.0
-sgmllib3k==1.0.0
-simplejson==3.18.0
-six==1.16.0
-sniffio==1.3.0
-sortedcontainers==2.4.0
-soupsieve==2.3.2.post1
-tomli==2.0.1
-transaction==3.0.1
-trio==0.22.0
-trio-websocket==0.9.2
-Unidecode==1.3.6
-urllib3==1.26.12
-waitress==2.1.2
-wcwidth==0.2.5
-WebOb==1.8.7
-webresource==1.1
-WebTest==3.0.0
-wrapt==1.14.1
-WSGIProxy2==0.5.1
-wsproto==1.2.0
-z3c.caching==2.2
-z3c.form==4.3
-z3c.formwidget.query==1.0.0
-z3c.objpath==1.2
-z3c.pt==3.3.1
-z3c.relationfield==0.9.0
-z3c.zcmlhook==1.1
-zc.lockfile==2.0
-zc.relation==1.1.post2
-ZConfig==3.6.0
-zdaemon==4.3
-ZEO==5.3.0
-zExceptions==4.2
-ZODB==5.8.0
-ZODB3==3.11.0
-zodbpickle==2.6
-Zope==5.7
-zope.annotation==4.8
-zope.app.locales==4.3
-zope.browser==2.4
-zope.browsermenu==4.4
-zope.browserpage==4.4.0
-zope.browserresource==4.4
-zope.cachedescriptors==4.4
-zope.component==5.0.1
-zope.componentvocabulary==2.3.0
-zope.configuration==4.4.1
-zope.container==4.10
-zope.contentprovider==4.2.1
-zope.contenttype==4.6
-zope.copy==4.2
-zope.datetime==4.3.0
-zope.deferredimport==4.4
-zope.deprecation==4.4.0
-zope.dottedname==5.0
-zope.event==4.5.0
-zope.exceptions==4.6
-zope.filerepresentation==5.0.0
-zope.globalrequest==1.6
-zope.hookable==5.4
-zope.i18n==4.9.0
-zope.i18nmessageid==5.1.1
-zope.interface==5.5.2
-zope.intid==4.4.0
-zope.keyreference==5.0.0
-zope.lifecycleevent==4.4
-zope.location==4.2
-zope.pagetemplate==4.6.0
-zope.processlifetime==2.4
-zope.proxy==4.6.1
-zope.ptresource==4.3.0
-zope.publisher==6.1.0
-zope.ramcache==2.4
-zope.schema==6.2.1
-zope.security==5.7
-zope.sendmail==5.3
-zope.sequencesort==4.2
-zope.site==4.6.1
-zope.size==4.4
-zope.structuredtext==4.4
-zope.tal==4.5
-zope.tales==5.2
-zope.testbrowser==5.6.1
-zope.testing==4.10
-zope.testrunner==5.5.1
-zope.traversing==4.4.1
-zope.viewlet==4.3
-Zope2==4.0
diff --git a/.meta.toml b/.meta.toml
new file mode 100644
index 0000000..6448ba6
--- /dev/null
+++ b/.meta.toml
@@ -0,0 +1,20 @@
+# Generated from:
+# https://github.com/plone/meta/tree/2.x/src/plone/meta/default
+# See the inline comments on how to expand/tweak this configuration file
+[meta]
+template = "default"
+commit-id = "2.9.0"
+
+[pre_commit]
+zpretty_extra_lines = """
+ exclude: .pt
+"""
+
+[tox]
+test_matrix = { "6.2" = ["*"] }
+
+[pyproject]
+dependencies_mappings = [
+ "python-Levenshtein = ['Levenshtein', ]",
+]
+dependencies_ignores = "['pdbpp', 'plone.app.discussion']"
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
new file mode 100644
index 0000000..843aaff
--- /dev/null
+++ b/.pre-commit-config.yaml
@@ -0,0 +1,95 @@
+# Generated from:
+# https://github.com/plone/meta/tree/2.x/src/plone/meta/default
+# See the inline comments on how to expand/tweak this configuration file
+ci:
+ autofix_prs: false
+ autoupdate_schedule: monthly
+
+repos:
+- repo: https://github.com/asottile/pyupgrade
+ rev: v3.21.2
+ hooks:
+ - id: pyupgrade
+ args: [--py310-plus]
+- repo: https://github.com/pycqa/isort
+ rev: 9.0.0a3
+ hooks:
+ - id: isort
+- repo: https://github.com/psf/black-pre-commit-mirror
+ rev: 26.3.1
+ hooks:
+ - id: black
+- repo: https://github.com/collective/zpretty
+ rev: 4.0.0
+ hooks:
+ - id: zpretty
+ exclude: .pt
+
+##
+# Add extra configuration options in .meta.toml:
+# [pre_commit]
+# zpretty_extra_lines = """
+# _your own configuration lines_
+# """
+##
+- repo: https://github.com/PyCQA/flake8
+ rev: 7.3.0
+ hooks:
+ - id: flake8
+
+##
+# Add extra configuration options in .meta.toml:
+# [pre_commit]
+# flake8_extra_lines = """
+# _your own configuration lines_
+# """
+##
+- repo: https://github.com/codespell-project/codespell
+ rev: v2.4.2
+ hooks:
+ - id: codespell
+ additional_dependencies:
+ - tomli
+
+##
+# Add extra configuration options in .meta.toml:
+# [pre_commit]
+# codespell_extra_lines = """
+# _your own configuration lines_
+# """
+##
+- repo: https://github.com/mgedmin/check-manifest
+ rev: "0.51"
+ hooks:
+ - id: check-manifest
+- repo: https://github.com/regebro/pyroma
+ rev: "5.0.1"
+ hooks:
+ - id: pyroma
+- repo: https://github.com/mgedmin/check-python-versions
+ rev: "0.24.2"
+ hooks:
+ - id: check-python-versions
+ args: ['--only', 'setup.cfg,tox.ini']
+- repo: https://github.com/collective/i18ndude
+ rev: "6.3.0"
+ hooks:
+ - id: i18ndude
+
+
+##
+# Add extra configuration options in .meta.toml:
+# [pre_commit]
+# i18ndude_extra_lines = """
+# _your own configuration lines_
+# """
+##
+
+
+##
+# Add extra configuration options in .meta.toml:
+# [pre_commit]
+# extra_lines = """
+# _your own configuration lines_
+# """
+##
diff --git a/CHANGES.rst b/CHANGES.rst
index 0c4185a..441d19c 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -1,12 +1,12 @@
Changelog
=========
-6.0.1 (unreleased)
-------------------
-
-- Fix for use with Plone 6.1 and no plone.app.discussion available.
- [jensens]
+.. You should *NOT* be adding new change log entries to this file.
+ You should create a file in the news directory instead.
+ For helpful instructions, please see:
+ https://github.com/plone/plone.releaser/blob/master/ADD-A-NEWS-ITEM.rst
+.. towncrier release notes start
6.0.0 (2022-12-01)
------------------
@@ -103,7 +103,7 @@ Breaking Changes:
3.0.0 (2019-03-14)
------------------
-- Fix problem with non-visible changes due to a side effect with collective.indexing beeing merged in core.
+- Fix problem with non-visible changes due to a side effect with collective.indexing being merged in core.
[jensens]
- Python 3, Plone 5.2 compatibility.
@@ -177,7 +177,7 @@ Breaking Changes:
2.0 (2013-04-24)
----------------
-- take plone.app.multilingual into acount and set Language=all on change.
+- take plone.app.multilingual into account and set Language=all on change.
[jensens]
- Use png icon as gif icon has been removed.
@@ -195,7 +195,7 @@ Breaking Changes:
file is empty. (useful for sites not having Document globally allowed)
[fRiSi]
-- Allow `Site Administrators` too access the keyword managment
+- Allow `Site Administrators` to access the keyword management
[fRiSi]
- Make installation possible for dexterity-based Documents [pysailor]
diff --git a/MANIFEST.in b/MANIFEST.in
index 97e66cb..bcd70f5 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -1,5 +1,8 @@
+global-exclude *pyc
+include setup.py
+include *.rst *.cfg
graft docs
graft src
-include *.rst *.cfg *.txt *.ini
-exclude **/__pycache__/* **/*.pyc
-exclude .coveragerc .installed.cfg Makefile *.yaml
+exclude .coveragerc
+recursive-exclude news *
+exclude news *.yml __pycache__
diff --git a/Makefile b/Makefile
deleted file mode 100644
index 33aad5f..0000000
--- a/Makefile
+++ /dev/null
@@ -1,337 +0,0 @@
-# Makefile to configure and run Plone instance
-
-##############################################################################
-# SETUP MAKE
-
-## Defensive settings for make: https://tech.davis-hansson.com/p/make/
-SHELL:=bash
-.ONESHELL:
-# for Makefile debugging purposes add -x to the .SHELLFLAGS
-.SHELLFLAGS:=-eu -o pipefail -O inherit_errexit -c
-.SILENT:
-.DELETE_ON_ERROR:
-MAKEFLAGS+=--warn-undefined-variables
-MAKEFLAGS+=--no-builtin-rules
-
-# Colors
-# OK=Green, warn=yellow, error=red
-ifeq ($(TERM),)
-# no colors if not in terminal
- MARK_COLOR=
- OK_COLOR=
- WARN_COLOR=
- ERROR_COLOR=
- NO_COLOR=
-else
- MARK_COLOR=`tput setaf 6`
- OK_COLOR=`tput setaf 2`
- WARN_COLOR=`tput setaf 3`
- ERROR_COLOR=`tput setaf 1`
- NO_COLOR=`tput sgr0`
-endif
-
-##############################################################################
-# SETTINGS AND VARIABLE
-# adjust to your project needs
-PROJECT_NAME=Products.PloneKeywordManager
-IMAGE_NAME=${PROJECT_NAME}
-CONSTRAINTS_IN=constraints.txt
-CONSTRAINTS_IN=constraints.txt
-CONSTRAINTS_MXDEV=constraints-mxdev.txt
-PIP_REQUIREMENTS_IN_FILE=requirements.txt
-ADDONBASE=./
-ADDONFOLDER=${ADDONBASE}/src
-INSTANCE_YAML=instance.yaml
-INSTANCE_FOLDER=instance
-
-PIP_PARAMS= --pre
-
-##############################################################################
-# targets and prerequisites
-# target has to be one file, otherwise step gets executes for each file separate
-PREPARE_PREREQUISITES=${PIP_REQUIREMENTS_IN_FILE} ${CONSTRAINTS_IN} sources.ini ${ADDONBASE}setup.cfg
-PREPARE_TARGET=requirements-mxdev.txt
-INSTALL_PREREQUSISTES=${PREPARE_TARGET}
-INSTALL_TARGET=.installed.txt
-INSTANCE_PREREQUISITES=${INSTALL_TARGET} ${INSTANCE_YAML}
-INSTANCE_TARGET=${INSTANCE_FOLDER}/etc/zope.ini ${INSTANCE_FOLDER}/etc/zope.conf ${INSTANCE_FOLDER}/etc/site.zcml
-TEST_PREREQUISITES=${INSTALL_TARGET}
-RUN_PREREQUISITES=${INSTANCE_TARGET}
-
-##############################################################################
-# CONVINIENCE
-
-# install and run
-.PHONY: all # full install, test and run
-all:style test run
-
-# Add the following 'help' target to your Makefile
-# And add help text after each target name starting with '\#\#'
-.PHONY: help
-help: ## This help message
- @echo "${OK_COLOR}This is the Makefile for ${WARN_COLOR}${PROJECT_NAME}${NO_COLOR}"
- @echo
- @echo "${WARN_COLOR}Additional parameters:${NO_COLOR}"
- @echo "${MARK_COLOR}PYTHON${NO_COLOR}: python interpreter to be used (default: python3)"
- @echo "${MARK_COLOR}VENV${NO_COLOR}: [on|off] wether to create a Python virtual environment or not (default: on)"
- @echo "${MARK_COLOR}VENV_FOLDER${NO_COLOR}: location of the virtual environment (default: ./venv)"
- @echo
- @echo "${WARN_COLOR}Targets:${NO_COLOR}"
- @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'
-
-##############################################################################
-# targets and prerequisites
-# target has to be one file, otherwise step gets executes for each file separate
-PREPARE_PREREQUISITES=${PIP_REQUIREMENTS_IN_FILE} ${CONSTRAINTS_IN} sources.ini ${ADDONBASE}setup.cfg
-PREPARE_TARGET=requirements-mxdev.txt
-INSTALL_PREREQUSISTES=${PREPARE_TARGET}
-INSTALL_TARGET=.installed.txt
-INSTANCE_PREREQUISITES=${INSTALL_TARGET} ${INSTANCE_YAML}
-INSTANCE_TARGET=${INSTANCE_FOLDER}/etc/zope.ini ${INSTANCE_FOLDER}/etc/zope.conf ${INSTANCE_FOLDER}/etc/site.zcml
-TEST_PREREQUISITES=${INSTALL_TARGET}
-RUN_PREREQUISITES=${INSTANCE_TARGET}
-
-##############################################################################
-# BASE
-
-SENTINELFOLDER=.make-sentinels/
-SENTINEL=${SENTINELFOLDER}ABOUT.txt
-${SENTINEL}:
- @mkdir -p ${SENTINELFOLDER}
- @echo "Sentinels for the Makefile process." > ${SENTINEL}
-
-# PYTHON, VENV, PIP
-# venv and pybin
-PYTHON?=python3
-VENV?=on
-ifeq ("${VENV}", "on")
- VENV_FOLDER?=./venv
- PYBIN=${VENV_FOLDER}/bin/
-else
- VENV_FOLDER?=
- ifneq ("${VENV_FOLDER}", "")
- PYBIN=${VENV_FOLDER}/bin/
- PYTHON=${PYBIN}python
- else
- PYBIN=
- endif
-endif
-
-# installed?
-ifeq (, $(shell which $(PYTHON) ))
- $(error "PYTHON=$(PYTHON) not found in $(PATH)")
-endif
-
-# version ok?
-PYTHON_VERSION_MIN=3.7
-PYTHON_VERSION_OK=$(shell $(PYTHON) -c 'import sys; print(int(sys.version_info[0:2] >= tuple(map(int, "$(PYTHON_VERSION_MIN)".split(".")))))' )
-
-ifeq ($(PYTHON_VERSION_OK),0)
- $(error "Need python $(PYTHON_VERSION) >= $(PYTHON_VERSION_MIN)")
-endif
-
-VENV_SENTINEL=${SENTINELFOLDER}venv.sentinel
-${VENV_SENTINEL}: ${SENTINEL}
-ifeq ("${VENV}", "on")
- @echo "$(OK_COLOR)Setup Python Virtual Environment under '${VENV_FOLDER}' $(NO_COLOR)"
- @${PYTHON} -m venv ${VENV_FOLDER}
-else
- @echo "$(OK_COLOR)Use current local or global Python: `which ${PYTHON}` $(NO_COLOR)"
-endif
- @touch ${VENV_SENTINEL}
-
-PIP_SENTINEL=${SENTINELFOLDER}pip.sentinel
-${PIP_SENTINEL}: ${VENV_SENTINEL} ${CONSTRAINTS_IN} ${SENTINEL}
- @echo "$(OK_COLOR)Install pip $(NO_COLOR)"
- @${PYBIN}pip install "pip>=22" wheel
- @touch ${PIP_SENTINEL}
-
-##############################################################################
-# MXDEV
-
-MXDEV_SENTINEL=${SENTINELFOLDER}pip-mxdev.sentinel
-${MXDEV_SENTINEL}: ${PIP_SENTINEL}
- @echo "$(OK_COLOR)Install mxdev$(NO_COLOR)"
- @${PYBIN}pip install mxdev libvcs==0.11.1
- @touch ${MXDEV_SENTINEL}
-
-.PHONY: prepare
-prepare: ${PREPARE_TARGET} ## prepare soures and dependencies
-
-${PREPARE_PREREQUISITES}:
- @touch $@
-
-${PREPARE_TARGET}: ${MXDEV_SENTINEL} ${PREPARE_PREREQUISITES}
- @echo "$(OK_COLOR)Prepare sources and dependencies$(NO_COLOR)"
- @${PYBIN}mxdev -c sources.ini
-
-.PHONY: install
-install: ${INSTALL_TARGET} ## pip install all dependencies and scripts
-
-${INSTALL_TARGET}: ${PREPARE_TARGET}
- @echo "$(OK_COLOR)Install dependencies and scripts$(NO_COLOR)"
- @${PYBIN}pip install -r ${PREPARE_TARGET} ${PIP_PARAMS}
- @${PYBIN}pip freeze >${INSTALL_TARGET}
-
-##############################################################################
-# INSTANCE
-
-COOKIECUTTER_SENTINEL=${SENTINELFOLDER}pip-cookiecutter.sentinel
-${COOKIECUTTER_SENTINEL}:
- @echo "$(OK_COLOR)Install cookiecutter$(NO_COLOR)"
- @${PYBIN}pip install git+https://github.com/cookiecutter/cookiecutter.git#egg=cookiecutter
- @touch ${COOKIECUTTER_SENTINEL}
-
-${INSTANCE_YAML}:
- @touch ${INSTANCE_YAML}
-
-.PHONY: instance
-instance: ${INSTANCE_TARGET} ## create configuration for an zope (plone) instance
-
-${INSTANCE_TARGET}: ${INSTANCE_PREREQUISITES} ${COOKIECUTTER_SENTINEL}
- @echo "$(OK_COLOR)Create Plone/Zope configuration$(NO_COLOR)"
- @${PYBIN}cookiecutter -f --no-input --config-file ${INSTANCE_YAML} https://github.com/bluedynamics/cookiecutter-zope-instance
-##############################################################################
-# TESTING
-
-TESTRUNNER_SENTINEL=${SENTINELFOLDER}pip-testrunner.sentinel
-${TESTRUNNER_SENTINEL}: ${PIP_SENTINEL}
- @echo "$(OK_COLOR)Install zope.testrunner$(NO_COLOR)"
- @${PYBIN}pip install -c ${CONSTRAINTS_MXDEV} zope.testrunner
- @touch ${TESTRUNNER_SENTINEL}
-
-.PHONY: test
-test: ${TEST_PREREQUISITES} ${TESTRUNNER_SENTINEL} ## run tests
- @echo "$(OK_COLOR)Run addon tests$(NO_COLOR)"
- @${PYBIN}zope-testrunner --auto-color --auto-progress --test-path=${ADDONFOLDER}
-
-.PHONY: test-ignore-warnings
-test-ignore-warnings: ${TEST_PREREQUISITES} ${TESTRUNNER_SENTINEL} ## run tests (hide warnins)
- @echo "$(OK_COLOR)Run addon tests$(NO_COLOR)"
- @PYTHONWARNINGS=ignore ${PYBIN}zope-testrunner --auto-color --auto-progress --test-path=${ADDONFOLDER}
-
-##############################################################################
-# CODE FORMATTING
-
-BLACK_SENTINEL=${SENTINELFOLDER}pip-black.sentinel
-${BLACK_SENTINEL}: ${PREPARE_TARGET}
- @echo "$(OK_COLOR)Install black$(NO_COLOR)"
- @${PYBIN}pip install -c ${CONSTRAINTS_MXDEV} black
- @touch ${BLACK_SENTINEL}
-
-ISORT_SENTINEL=${SENTINELFOLDER}pip-isort.sentinel
-${ISORT_SENTINEL}: ${PREPARE_TARGET}
- @echo "$(OK_COLOR)Install isort$(NO_COLOR)"
- @${PYBIN}pip install -c ${CONSTRAINTS_MXDEV} isort
- @touch ${ISORT_SENTINEL}
-
-ZPRETTY_SENTINEL=${SENTINELFOLDER}pip-zpretty.sentinel
-${ZPRETTY_SENTINEL}: ${PREPARE_TARGET}
- @echo "$(OK_COLOR)Install zpretty$(NO_COLOR)"
- @${PYBIN}pip install -c ${CONSTRAINTS_MXDEV} "zpretty>=2.2.0"
- @touch ${ZPRETTY_SENTINEL}
-
-.PHONY: apply-style-black
-apply-style-black: ${BLACK_SENTINEL} ## apply/format code style black (to Python files)
- @echo "$(OK_COLOR)Apply style black rules to code in ${ADDONFOLDER}/*$(NO_COLOR)"
- @${PYBIN}black ${ADDONFOLDER}
-
-.PHONY: apply-style-isort
-apply-style-isort: ${ISORT_SENTINEL} ## apply/format code style isort (sorted imports in Python files)
- @echo "$(OK_COLOR)Apply style isort rules to code in ${ADDONFOLDER}/*$(NO_COLOR)"
- @${PYBIN}isort ${ADDONFOLDER}
-
-.PHONY: apply-style-zpretty
-apply-style-zpretty: ${ZPRETTY_SENTINEL} ## apply/format code style zpretty (to XML/ZCML files)
- @echo "$(OK_COLOR)Apply style zpretty rules to code in ${ADDONFOLDER}/*$(NO_COLOR)"
- @find ${ADDONFOLDER} -name '*.zcml' -exec ${PYBIN}zpretty -iz {} +
- @find ${ADDONFOLDER} -name "*.xml"|grep -v locales|xargs ${PYBIN}zpretty -ix
-
-.PHONY: style ## apply code styles black, isort and zpretty
-style: apply-style-black apply-style-isort ## apply-style-zpretty
-
-.PHONY: format ## alias for "style"
-FORMATTING: style
-
-.PHONY: lint-black
-lint-black: ${BLACK_SENTINEL} ## lint code-style black (to Python files)
- @echo "$(OK_COLOR)Lint black rules to code in ${ADDONFOLDER}/*$(NO_COLOR)"
- @${PYBIN}black --check ${ADDONFOLDER}
-
-.PHONY: lint-isort
-lint-isort: ${ISORT_SENTINEL} ## lint code-style isort (sorted imports in Python files)
- @echo "$(OK_COLOR)Apply style isort rules to code in ${ADDONFOLDER}/*$(NO_COLOR)"
- @${PYBIN}isort --check-only ${ADDONFOLDER}
-
-.PHONY: lint-zpretty
-lint-zpretty: ${ZPRETTY_SENTINEL} ## lint code-style zpretty (to XML/ZCML files)
- @echo "$(OK_COLOR)Apply style zpretty rules to code in ${ADDONFOLDER}/*$(NO_COLOR)"
- @find ${ADDONFOLDER} -name '*.zcml' -exec ${PYBIN}zpretty --check -z {} +
- @find ${ADDONFOLDER} -name '*.xml'|grep -v locales|xargs ${PYBIN}zpretty --check -x
-
-.PHONY: lint ## lint all: check if complies with code-styles black, isort and zpretty
-lint: lint-black lint-isort ## lint-zpretty
-
-##############################################################################
-# RUN
-
-.PHONY: run
-run: ${RUN_PREREQUISITES} ## run/start Plone
- @echo "$(OK_COLOR)Run Plone$(NO_COLOR)"
- @${PYBIN}runwsgi -v instance/etc/zope.ini
-
-##############################################################################
-# NODE
-
-.PHONY: node
-node: # yarn install
- @echo "$(OK_COLOR)Yarn install$(NO_COLOR)"
- yarn install
-
-##############################################################################
-# CLEAN
-.PHONY: clean-venv
-clean-venv: ## remove Python virtual environment
-ifeq ("${VENV}", "on")
- @echo "$(OK_COLOR)Remove Virtualenv.$(NO_COLOR)"
- rm -rf ${VENV_FOLDER} ${SENTINELFOLDER}/pip*.sentinel ${VENV_SENTINEL}
-else:
- @echo "$(OK_WARN)No self-created Python virtualenv at '${VENV_FOLDER}'! Nothing to do.$(NO_COLOR)"
-endif
-
-.PHONY: clean-pyc
-clean-pyc: ## remove Python file artifacts
- @echo "$(OK_COLOR)Remove Python file artifacts (like byte-code) of code in current directory.$(NO_COLOR)"
- find . -name '*.py[c|o]' -delete
- find . -name '*.mo' -delete
- find . -name '*~' -exec rm -f {} +
- find . -name '__pycache__' -exec rm -fr {} +
-
-.PHONY: clean-make
-clean-make: ## remove make artifact @echo "$(OK_COLOR)Remove Plone/Zope configuration (keeps data) and sentinel files.$(NO_COLOR)"
- rm -rf ${INSTALL_PREREQUSISTES} ${INSTANCE_TARGET} ${SENTINELFOLDER}
-
-.PHONY: clean-instance
-clean-instance: ## remove instance configuration (keeps data)
- @echo "$(OK_COLOR)Remove Plone/Zope configuration (keeps data) and sentinel files.$(NO_COLOR)"
- rm -f ${INSTANCE_TARGET}
-
-.PHONY: clean-node
-clean-node: ## remove instance configuration (keeps data)
- @echo "$(OK_COLOR)Remove npm/yarn installation.$(NO_COLOR)"
- rm -rf ${ADDONBASE}/node_modules
-
-.PHONY: clean
-clean: clean-venv clean-pyc clean-make clean-instance clean-node ## clean all (except local database and pip installed packages)
-
-##############################################################################
-# DOCKER/CONTAINER
-
-# this needs a Dockerfile, which is not provided by plone-kickstarter
-.PHONY: build-image
-build-image: ## Build Docker Image
-ifneq ("$(wildcard Dockerfile)", "")
- @docker build . -t $(IMAGE_NAME) -f Dockerfile
-else
- @echo "$(ERROR_COLOR)A 'Dockerfile' is required to build an image.$(NO_COLOR)"
-endif
diff --git a/README.rst b/README.rst
index 0ffd376..63ad2f7 100644
--- a/README.rst
+++ b/README.rst
@@ -33,7 +33,7 @@ In your buildout add ``Products.PloneKeywordManager`` to your instances eggs sec
If you want similarity search add ``Products.PloneKeywordManager[Levenshtein]`` instead.
Run buildout.
-Activate it at Site Setups Add Ons page.
+Activate it at Site Setups Add-ons page.
Usage
diff --git a/constraints.txt b/constraints.txt
deleted file mode 100644
index f4f85cb..0000000
--- a/constraints.txt
+++ /dev/null
@@ -1 +0,0 @@
--c https://dist.plone.org/release/6.0.0rc1/constraints.txt
diff --git a/instance.yaml b/instance.yaml
deleted file mode 100644
index 852c62b..0000000
--- a/instance.yaml
+++ /dev/null
@@ -1,17 +0,0 @@
----
-# This is a cookiecutter configuration context file for
-#
-# cookiecutter-zope-instance
-#
-# available options are documented at
-# https://github.com/bluedynamics/cookiecutter-zope-instance/
-#
-# read also README_MAKE.md in this folder
-#
-default_context:
- wsgi_http_listen: localhost:8080
- initial_user_name: admin
- initial_user_password: admin
- load_zcml:
- package_includes: []
- db_storage: direct
diff --git a/news/+jens.feature b/news/+jens.feature
new file mode 100644
index 0000000..7430dcd
--- /dev/null
+++ b/news/+jens.feature
@@ -0,0 +1 @@
+Fix for use with Plone 6.1 and no plone.app.discussion available. [jensens]
diff --git a/news/.gitkeep b/news/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/news/3928.breaking b/news/3928.breaking
new file mode 100644
index 0000000..4fb7ad4
--- /dev/null
+++ b/news/3928.breaking
@@ -0,0 +1,2 @@
+Replace ``pkg_resources`` namespace with PEP 420 native namespace.
+Support only Plone 6.2 and Python 3.10+.
diff --git a/pyproject.toml b/pyproject.toml
new file mode 100644
index 0000000..6e4535f
--- /dev/null
+++ b/pyproject.toml
@@ -0,0 +1,171 @@
+# Generated from:
+# https://github.com/plone/meta/tree/2.x/src/plone/meta/default
+# See the inline comments on how to expand/tweak this configuration file
+[build-system]
+requires = ["setuptools>=68.2,<83", "wheel"]
+
+
+
+[tool.towncrier]
+directory = "news/"
+filename = "CHANGES.rst"
+title_format = "{version} ({project_date})"
+underlines = ["-", ""]
+
+[[tool.towncrier.type]]
+directory = "breaking"
+name = "Breaking changes:"
+showcontent = true
+
+[[tool.towncrier.type]]
+directory = "feature"
+name = "New features:"
+showcontent = true
+
+[[tool.towncrier.type]]
+directory = "bugfix"
+name = "Bug fixes:"
+showcontent = true
+
+[[tool.towncrier.type]]
+directory = "internal"
+name = "Internal:"
+showcontent = true
+
+[[tool.towncrier.type]]
+directory = "documentation"
+name = "Documentation:"
+showcontent = true
+
+[[tool.towncrier.type]]
+directory = "tests"
+name = "Tests:"
+showcontent = true
+
+##
+# Add extra configuration options in .meta.toml:
+# [pyproject]
+# towncrier_extra_lines = """
+# extra_configuration
+# """
+##
+
+[tool.isort]
+profile = "plone"
+
+##
+# Add extra configuration options in .meta.toml:
+# [pyproject]
+# isort_extra_lines = """
+# extra_configuration
+# """
+##
+
+[tool.black]
+target-version = ["py310"]
+
+##
+# Add extra configuration options in .meta.toml:
+# [pyproject]
+# black_extra_lines = """
+# extra_configuration
+# """
+##
+
+[tool.codespell]
+ignore-words-list = "discreet,assertin,thet,"
+skip = "*.po,"
+##
+# Add extra configuration options in .meta.toml:
+# [pyproject]
+# codespell_ignores = "foo,bar"
+# codespell_skip = "*.po,*.map,package-lock.json"
+##
+
+[tool.dependencychecker]
+Zope = [
+ # Zope own provided namespaces
+ 'App', 'OFS', 'Products.Five', 'Products.OFSP', 'Products.PageTemplates',
+ 'Products.SiteAccess', 'Shared', 'Testing', 'ZPublisher', 'ZTUtils',
+ 'Zope2', 'webdav', 'zmi',
+ # ExtensionClass own provided namespaces
+ 'ExtensionClass', 'ComputedAttribute', 'MethodObject',
+ # Zope dependencies
+ 'AccessControl', 'Acquisition', 'AuthEncoding', 'beautifulsoup4', 'BTrees',
+ 'cffi', 'Chameleon', 'DateTime', 'DocumentTemplate',
+ 'MultiMapping', 'multipart', 'PasteDeploy', 'Persistence', 'persistent',
+ 'pycparser', 'python-gettext', 'pytz', 'RestrictedPython', 'roman',
+ 'soupsieve', 'transaction', 'waitress', 'WebOb', 'WebTest', 'WSGIProxy2',
+ 'z3c.pt', 'zc.lockfile', 'ZConfig', 'zExceptions', 'ZODB', 'zodbpickle',
+ 'zope.annotation', 'zope.browser', 'zope.browsermenu', 'zope.browserpage',
+ 'zope.browserresource', 'zope.cachedescriptors', 'zope.component',
+ 'zope.configuration', 'zope.container', 'zope.contentprovider',
+ 'zope.contenttype', 'zope.datetime', 'zope.deferredimport',
+ 'zope.deprecation', 'zope.dottedname', 'zope.event', 'zope.exceptions',
+ 'zope.filerepresentation', 'zope.globalrequest', 'zope.hookable',
+ 'zope.i18n', 'zope.i18nmessageid', 'zope.interface', 'zope.lifecycleevent',
+ 'zope.location', 'zope.pagetemplate', 'zope.processlifetime', 'zope.proxy',
+ 'zope.ptresource', 'zope.publisher', 'zope.schema', 'zope.security',
+ 'zope.sequencesort', 'zope.site', 'zope.size', 'zope.structuredtext',
+ 'zope.tal', 'zope.tales', 'zope.testbrowser', 'zope.testing',
+ 'zope.traversing', 'zope.viewlet'
+]
+'Products.CMFCore' = [
+ 'docutils', 'five.localsitemanager', 'Missing', 'Products.BTreeFolder2',
+ 'Products.GenericSetup', 'Products.MailHost', 'Products.PythonScripts',
+ 'Products.StandardCacheManagers', 'Products.ZCatalog', 'Record',
+ 'zope.sendmail', 'Zope'
+]
+'plone.base' = [
+ 'plone.batching', 'plone.registry', 'plone.schema','plone.z3cform',
+ 'Products.CMFCore', 'Products.CMFDynamicViewFTI',
+]
+python-dateutil = ['dateutil']
+pytest-plone = ['pytest', 'zope.pytestlayer', 'plone.testing', 'plone.app.testing']
+ignore-packages = ['pdbpp', 'plone.app.discussion']
+python-Levenshtein = ['Levenshtein', ]
+
+##
+# Add extra configuration options in .meta.toml:
+# [pyproject]
+# dependencies_ignores = "['zestreleaser.towncrier']"
+# dependencies_mappings = [
+# "gitpython = ['git']",
+# "pygithub = ['github']",
+# ]
+##
+
+[tool.check-manifest]
+ignore = [
+ ".editorconfig",
+ ".flake8",
+ ".meta.toml",
+ ".pre-commit-config.yaml",
+ "dependabot.yml",
+ "mx.ini",
+ "tox.ini",
+
+]
+
+##
+# Add extra configuration options in .meta.toml:
+# [pyproject]
+# check_manifest_ignores = """
+# "*.map.js",
+# "*.pyc",
+# """
+# check_manifest_extra_lines = """
+# ignore-bad-ideas = [
+# "some/test/file/PKG-INFO",
+# ]
+# """
+##
+
+
+##
+# Add extra configuration options in .meta.toml:
+# [pyproject]
+# extra_lines = """
+# _your own configuration lines_
+# """
+##
diff --git a/requirements.txt b/requirements.txt
deleted file mode 100644
index 54fc492..0000000
--- a/requirements.txt
+++ /dev/null
@@ -1,5 +0,0 @@
--c constraints.txt
--e .[test] --install-option="--pre"
-
-# WSGI: A system for configuration of WSGI web components in declarative .ini format.
-Paste
diff --git a/setup.cfg b/setup.cfg
index f173a41..d7eb570 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -2,22 +2,23 @@
name = Products.PloneKeywordManager
description = Change, merge and delete keywords (subjects) in Plone.
long_description = file: README.rst, CHANGES.rst
-version = 6.0.1.dev0
+version = 7.0.0.dev0
classifiers =
Development Status :: 6 - Mature
Environment :: Web Environment
Framework :: Plone
- Framework :: Plone :: 6.0
+ Framework :: Plone :: 6.2
Framework :: Plone :: Addon
Intended Audience :: End Users/Desktop
Intended Audience :: System Administrators
License :: OSI Approved :: GNU General Public License v2 (GPLv2)
Operating System :: OS Independent
Programming Language :: Python
- Programming Language :: Python :: 3.8
- Programming Language :: Python :: 3.9
Programming Language :: Python :: 3.10
Programming Language :: Python :: 3.11
+ Programming Language :: Python :: 3.12
+ Programming Language :: Python :: 3.13
+ Programming Language :: Python :: 3.14
Topic :: Software Development :: Libraries :: Python Modules
keywords = plone, manage keywords subjects create merge delete
author = Maik Jabolnski, Michael Dunlap and the Plone collective
@@ -26,28 +27,23 @@ url = https://github.com/collective/Products.PloneKeywordManager
license = GNU General Public License v2 (GPLv2)
[options]
+python_requires = >= 3.10
include_package_data = True
install_requires =
+ AccessControl
plone.api
- setuptools
-namespace_packages =
- Products
-# thanks to this bug
-# https://github.com/pypa/setuptools/issues/1136
-# the following line w/o override in setup.py does not work.
-package_dir =
- = src
-packages = find:
+ plone.dexterity
+ Products.CMFCore
+ Products.CMFPlone
+ Zope
zip_safe = False
-[options.packages.find]
-where =
- src
-
[options.extras_require]
test =
+ plone.app.discussion
plone.app.testing
plone.app.contenttypes[test]
+ plone.browserlayer
Levenshtein =
python-Levenshtein
dev =
diff --git a/setup.py b/setup.py
index b024da8..6068493 100644
--- a/setup.py
+++ b/setup.py
@@ -1,4 +1,3 @@
from setuptools import setup
-
setup()
diff --git a/sources.ini b/sources.ini
deleted file mode 100644
index bacad28..0000000
--- a/sources.ini
+++ /dev/null
@@ -1,25 +0,0 @@
-[settings]
-# This is a mxdev configuration file
-#
-# available options are documented at
-# https://pypi.org/project/mxdev/
-#
-# read also README_MAKE.md in this folder
-#
-requirements-in = requirements.txt
-requirements-out = requirements-mxdev.txt
-
-# ignore own dev-package from existing constraints
-# because it is pinned in the plone-release
-ignores =
- Products.PloneKeywordManager
-
-version-overrides =
-
-# variables
-# github = git+ssh://git@github.com/
-github = git+https://github.com/
-
-# [collective.themefragments]
-# url = ${settings:github}/collective/collective.themefragments.git
-# mode = skip
diff --git a/src/Products/PloneKeywordManager/__init__.py b/src/Products/PloneKeywordManager/__init__.py
index f23ec88..8ba6c5b 100644
--- a/src/Products/PloneKeywordManager/__init__.py
+++ b/src/Products/PloneKeywordManager/__init__.py
@@ -21,6 +21,5 @@
import logging
-
keywordmanagerMessageFactory = MessageFactory("Products.PloneKeywordManager")
logger = logging.getLogger("Products.PloneKeywordManager")
diff --git a/src/Products/PloneKeywordManager/browser/prefs_keywords_view.pt b/src/Products/PloneKeywordManager/browser/prefs_keywords_view.pt
index 7accbfc..dcad528 100755
--- a/src/Products/PloneKeywordManager/browser/prefs_keywords_view.pt
+++ b/src/Products/PloneKeywordManager/browser/prefs_keywords_view.pt
@@ -1,191 +1,329 @@
-
+ xml:lang="en-US"
+ i18n:domain="Products.PloneKeywordManager"
+>
-
+
The Keyword Manager allows you to delete and rename/merge keywords in your portal. -
+ -+
Select one or more keywords, then either set a replacement keyword and click on 'Rename' to replace all selected value by this one. Click on Delete to remove selected values. -
- -