From 4a762ec43e54b03cea73f1c35f6423834ca465cb Mon Sep 17 00:00:00 2001 From: Gil Forcada Codinachs Date: Wed, 17 Jun 2026 12:28:41 +0200 Subject: [PATCH 01/17] cleanup: remove old files --- .github/workflows/CI.yml | 42 ----- .installed.txt | 263 ------------------------------ Makefile | 337 --------------------------------------- constraints.txt | 1 - instance.yaml | 17 -- requirements.txt | 5 - sources.ini | 25 --- 7 files changed, 690 deletions(-) delete mode 100644 .github/workflows/CI.yml delete mode 100644 .installed.txt delete mode 100644 Makefile delete mode 100644 constraints.txt delete mode 100644 instance.yaml delete mode 100644 requirements.txt delete mode 100644 sources.ini 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/.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/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/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/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/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 From d5454c89bde713c5d7fb2794c681525828a61b66 Mon Sep 17 00:00:00 2001 From: Gil Forcada Codinachs Date: Wed, 17 Jun 2026 11:52:19 +0200 Subject: [PATCH 02/17] Configuring with plone.meta --- .editorconfig | 56 +++++++ .flake8 | 22 +++ .github/dependabot.yml | 11 ++ .github/workflows/meta.yml | 59 +++++++ .github/workflows/test-matrix.yml | 65 ++++++++ .gitignore | 55 +++++-- .meta.toml | 20 +++ .pre-commit-config.yaml | 95 +++++++++++ news/.gitkeep | 0 pyproject.toml | 171 ++++++++++++++++++++ tox.ini | 252 ++++++++++++++++++++++++++++-- 11 files changed, 774 insertions(+), 32 deletions(-) create mode 100644 .editorconfig create mode 100644 .flake8 create mode 100644 .github/dependabot.yml create mode 100644 .github/workflows/meta.yml create mode 100644 .github/workflows/test-matrix.yml create mode 100644 .meta.toml create mode 100644 .pre-commit-config.yaml create mode 100644 news/.gitkeep create mode 100644 pyproject.toml 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/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/.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..d90e2ae --- /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.py,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/news/.gitkeep b/news/.gitkeep new file mode 100644 index 0000000..e69de29 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/tox.ini b/tox.ini index 43a5684..8b63056 100644 --- a/tox.ini +++ b/tox.ini @@ -1,23 +1,241 @@ -# tox (https://tox.readthedocs.io/) is a tool for running tests -# in multiple virtualenvs. This configuration file will run the -# test suite on all supported python versions. To use it, "pip install tox" -# and then run "tox" from this directory. - +# 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 [tox] -minversion = 3.18 +# We need 4.4.0 for constrain_package_deps. +min_version = 4.4.0 envlist = - plone52-py{36,37,38} - plone60-py{37,38,39} + lint + test + py314-plone62 + py313-plone62 + py312-plone62 + py311-plone62 + py310-plone62 + dependencies + + +## +# Add extra configuration options in .meta.toml: +# - to specify a custom testing combination of Plone and python versions, use `test_matrix` +# Use ["*"] to use all supported Python versions for this Plone version. +# - to disable the test matrix entirely, set `use_test_matrix = false` +# - to specify extra custom environments, use `envlist_lines` +# - to specify extra `tox` top-level options, use `config_lines` +# [tox] +# test_matrix = {"6.2" = ["3.13", "3.12"], "6.1" = ["*"]} +# envlist_lines = """ +# my_other_environment +# """ +# config_lines = """ +# my_extra_top_level_tox_configuration_lines +# """ +## + +[testenv:init] +description = Prepare environment +skip_install = true +allowlist_externals = + echo +commands = + echo "Initial setup complete" + +[testenv:format] +description = automatically reformat code +skip_install = true +deps = + pre-commit +commands = + pre-commit run -a pyupgrade + pre-commit run -a isort + pre-commit run -a black + pre-commit run -a zpretty + +[testenv:lint] +description = run linters that will help improve the code style +skip_install = true +deps = + pre-commit +commands = + pre-commit run -a + +[testenv:dependencies] +description = check if the package defines all its dependencies +skip_install = true +deps = + build + z3c.dependencychecker==3.0 +commands = + python -m build --wheel + dependencychecker + +[testenv:dependencies-graph] +description = generate a graph out of the dependencies of the package +skip_install = false +allowlist_externals = + sh +deps = + pipdeptree==2.5.1 + graphviz # optional dependency of pipdeptree +commands = + sh -c 'pipdeptree --exclude setuptools,wheel,pipdeptree,zope.interface,zope.component --graph-output svg > dependencies.svg' + + +[test_runner] +deps = zope.testrunner +test = + zope-testrunner --all --test-path={toxinidir}/src -s Products.PloneKeywordManager {posargs} +coverage = + coverage run --branch --source Products.PloneKeywordManager {envbindir}/zope-testrunner --quiet --all --test-path={toxinidir}/src -s Products.PloneKeywordManager {posargs} + coverage report -m --format markdown + coverage xml + coverage html + +[base] +description = shared configuration for tests and coverage +use_develop = true +skip_install = false +constrain_package_deps = true +set_env = + ROBOT_BROWSER=headlesschrome + +## +# Specify extra test environment variables in .meta.toml: +# [tox] +# test_environment_variables = """ +# PIP_EXTRA_INDEX_URL=https://my-pypi.my-server.com/ +# """ +# +# Set constrain_package_deps .meta.toml: +# [tox] +# constrain_package_deps = false +## +deps = + {[test_runner]deps} + plone62: -c https://dist.plone.org/release/6.2-dev/constraints.txt + +## +# Specify additional deps in .meta.toml: +# [tox] +# test_deps_additional = """ +# -esources/plonegovbr.portal_base[test] +# """ +# +# Specify a custom constraints file in .meta.toml: +# [tox] +# constraints_file = "https://my-server.com/constraints.txt" +## +extras = + test + + +## +# Add extra configuration options in .meta.toml: +# [tox] +# skip_test_extra = true +# test_extras = """ +# tests +# widgets +# """ +# +# Add extra configuration options in .meta.toml: +# [tox] +# testenv_options = """ +# basepython = /usr/bin/python3.8 +# """ +## + +[testenv:test] +description = run the distribution tests +use_develop = {[base]use_develop} +skip_install = {[base]skip_install} +constrain_package_deps = {[base]constrain_package_deps} +set_env = {[base]set_env} +deps = + {[test_runner]deps} + -c https://dist.plone.org/release/6.2-dev/constraints.txt + +commands = {[test_runner]test} +extras = {[base]extras} + [testenv] -# We do not install with pip, but with buildout: -usedevelop = false +description = run the distribution tests (generative environments) +use_develop = {[base]use_develop} +skip_install = {[base]skip_install} +constrain_package_deps = {[base]constrain_package_deps} +set_env = {[base]set_env} +deps = {[base]deps} +commands = {[test_runner]test} +extras = {[base]extras} + + +[testenv:coverage] +description = get a test coverage report +use_develop = {[base]use_develop} +skip_install = {[base]skip_install} +constrain_package_deps = {[base]constrain_package_deps} +set_env = {[base]set_env} +deps = + {[test_runner]deps} + coverage + -c https://dist.plone.org/release/6.2-dev/constraints.txt + +commands = {[test_runner]coverage} +extras = {[base]extras} + + +[testenv:release-check] +description = ensure that the distribution is ready to release skip_install = true -commands_pre = - plone52: pip install -r requirements52.txt - plone52: {envbindir}/buildout -Nc {toxinidir}/test_plone52.cfg buildout:directory={envdir} buildout:develop={toxinidir} install test - plone60: pip install -r requirements60.txt - plone60: {envbindir}/buildout -Nc {toxinidir}/test_plone60.cfg buildout:directory={envdir} buildout:develop={toxinidir} install test +deps = + twine + build + towncrier + -c https://dist.plone.org/release/6.2-dev/constraints.txt commands = - coverage run {envbindir}/test - coverage html --directory=parts/test/coverage \ No newline at end of file + # fake version to not have to install the package + # we build the change log as news entries might break + # the README that is displayed on PyPI + towncrier build --version=100.0.0 --yes + python -m build --sdist + twine check dist/* + +[testenv:circular] +description = ensure there are no cyclic dependencies +use_develop = true +skip_install = false +# Here we must always constrain the package deps to what is already installed, +# otherwise we simply get the latest from PyPI, which may not work. +constrain_package_deps = true +set_env = + +## +# Specify extra test environment variables in .meta.toml: +# [tox] +# test_environment_variables = """ +# PIP_EXTRA_INDEX_URL=https://my-pypi.my-server.com/ +# """ +## +allowlist_externals = + sh +deps = + pipdeptree + pipforester + -c https://dist.plone.org/release/6.2-dev/constraints.txt +commands = + # Generate the full dependency tree + sh -c 'pipdeptree -j > forest.json' + # Generate a DOT graph with the circular dependencies, if any + pipforester -i forest.json -o forest.dot --cycles + # Report if there are any circular dependencies, i.e. error if there are any + pipforester -i forest.json --check-cycles -o /dev/null + + +## +# Add extra configuration options in .meta.toml: +# [tox] +# extra_lines = """ +# _your own configuration lines_ +# """ +## From cb900b79d4bdaec552dd8d81adecfa3da1710d28 Mon Sep 17 00:00:00 2001 From: Gil Forcada Codinachs Date: Wed, 17 Jun 2026 12:23:05 +0200 Subject: [PATCH 03/17] fix: towncrier --- CHANGES.rst | 10 +++++----- news/+jens.feature | 1 + 2 files changed, 6 insertions(+), 5 deletions(-) create mode 100644 news/+jens.feature diff --git a/CHANGES.rst b/CHANGES.rst index 0c4185a..f769a41 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) ------------------ 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] From 135bf35fcccb2816643da42b6b3ad3f3e72d4b74 Mon Sep 17 00:00:00 2001 From: Gil Forcada Codinachs Date: Wed, 17 Jun 2026 12:20:57 +0200 Subject: [PATCH 04/17] Bumped version for breaking release. --- setup.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.cfg b/setup.cfg index f173a41..da9ee0d 100644 --- a/setup.cfg +++ b/setup.cfg @@ -2,7 +2,7 @@ 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 From 07e6152998e2b55c5443515145064939fd7e824f Mon Sep 17 00:00:00 2001 From: Gil Forcada Codinachs Date: Wed, 17 Jun 2026 12:20:57 +0200 Subject: [PATCH 05/17] Switch to PEP 420 native namespace. --- news/3928.breaking | 2 ++ setup.cfg | 13 ------------- src/Products/__init__.py | 1 - 3 files changed, 2 insertions(+), 14 deletions(-) create mode 100644 news/3928.breaking delete mode 100644 src/Products/__init__.py 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/setup.cfg b/setup.cfg index da9ee0d..f9106d3 100644 --- a/setup.cfg +++ b/setup.cfg @@ -29,21 +29,8 @@ license = GNU General Public License v2 (GPLv2) include_package_data = True install_requires = 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: zip_safe = False -[options.packages.find] -where = - src - [options.extras_require] test = plone.app.testing diff --git a/src/Products/__init__.py b/src/Products/__init__.py deleted file mode 100644 index 5284146..0000000 --- a/src/Products/__init__.py +++ /dev/null @@ -1 +0,0 @@ -__import__("pkg_resources").declare_namespace(__name__) From 87e5c6846a1c0f1dcc7b5145f938395f65df86a3 Mon Sep 17 00:00:00 2001 From: Gil Forcada Codinachs Date: Wed, 17 Jun 2026 12:28:50 +0200 Subject: [PATCH 06/17] chore: update trove classifiers --- setup.cfg | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/setup.cfg b/setup.cfg index f9106d3..8aff62d 100644 --- a/setup.cfg +++ b/setup.cfg @@ -7,17 +7,18 @@ 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 From bd81ecc6f368fef91da5910d83b5e50a7e8ae754 Mon Sep 17 00:00:00 2001 From: Gil Forcada Codinachs Date: Wed, 17 Jun 2026 12:34:45 +0200 Subject: [PATCH 07/17] chore: adjust dependencies --- setup.cfg | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/setup.cfg b/setup.cfg index 8aff62d..d943a9d 100644 --- a/setup.cfg +++ b/setup.cfg @@ -29,13 +29,20 @@ license = GNU General Public License v2 (GPLv2) [options] include_package_data = True install_requires = + AccessControl plone.api + plone.dexterity + Products.CMFCore + Products.CMFPlone + Zope zip_safe = False [options.extras_require] test = + plone.app.discussion plone.app.testing plone.app.contenttypes[test] + plone.browserlayer Levenshtein = python-Levenshtein dev = From 09f33fd7fb66e31bef75e763528d4811c6455818 Mon Sep 17 00:00:00 2001 From: Gil Forcada Codinachs Date: Wed, 17 Jun 2026 12:38:46 +0200 Subject: [PATCH 08/17] fix(tests): install plone.app.discussion --- src/Products/PloneKeywordManager/testing.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Products/PloneKeywordManager/testing.py b/src/Products/PloneKeywordManager/testing.py index 238cb08..80583fd 100644 --- a/src/Products/PloneKeywordManager/testing.py +++ b/src/Products/PloneKeywordManager/testing.py @@ -18,6 +18,7 @@ def setUpZope(self, app, configurationContext): self.loadZCML(package=Products.PloneKeywordManager) def setUpPloneSite(self, portal): + applyProfile(portal, "plone.app.discussion:default") applyProfile(portal, "Products.PloneKeywordManager:default") From d2a7ed89ac249f8ea75061a13eab0caa5ef43300 Mon Sep 17 00:00:00 2001 From: Gil Forcada Codinachs Date: Wed, 17 Jun 2026 11:54:39 +0200 Subject: [PATCH 09/17] chore: pyupgrade --- src/Products/PloneKeywordManager/tool.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Products/PloneKeywordManager/tool.py b/src/Products/PloneKeywordManager/tool.py index 2124451..a675897 100644 --- a/src/Products/PloneKeywordManager/tool.py +++ b/src/Products/PloneKeywordManager/tool.py @@ -40,7 +40,7 @@ class KeywordManager: manage_options = ({"label": "Overview", "action": "manage_overview"},) def _getFullIndexList(self, indexName): - idxs = set([indexName]).union(config.ALWAYS_REINDEX) + idxs = {indexName}.union(config.ALWAYS_REINDEX) return list(idxs) @security.protected(config.MANAGE_KEYWORDS_PERMISSION) From 60af52714df8c77c6f73529ea3d7fc5530ecbb1b Mon Sep 17 00:00:00 2001 From: Gil Forcada Codinachs Date: Wed, 17 Jun 2026 11:54:52 +0200 Subject: [PATCH 10/17] chore: isort --- setup.py | 1 - src/Products/PloneKeywordManager/__init__.py | 1 - src/Products/PloneKeywordManager/tool.py | 1 - src/Products/PloneKeywordManager/upgrades.py | 1 - 4 files changed, 4 deletions(-) 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/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/tool.py b/src/Products/PloneKeywordManager/tool.py index a675897..7aa2d23 100644 --- a/src/Products/PloneKeywordManager/tool.py +++ b/src/Products/PloneKeywordManager/tool.py @@ -11,7 +11,6 @@ from Products.PloneKeywordManager.interfaces import IKeywordManager from zope import interface - try: from plone.app.discussion.interfaces import IComment except ImportError: diff --git a/src/Products/PloneKeywordManager/upgrades.py b/src/Products/PloneKeywordManager/upgrades.py index 23ae79d..09658f3 100644 --- a/src/Products/PloneKeywordManager/upgrades.py +++ b/src/Products/PloneKeywordManager/upgrades.py @@ -1,7 +1,6 @@ from plone import api from Products.PloneKeywordManager import logger - default_profile = "profile-Products.PloneKeywordManager:default" uninstall_profile = "profile-Products.PloneKeywordManager:uninstall" From 58a6a6a86ddf676c6cebf4995363a8c0154b16e0 Mon Sep 17 00:00:00 2001 From: Gil Forcada Codinachs Date: Wed, 17 Jun 2026 11:55:21 +0200 Subject: [PATCH 11/17] chore: zpretty --- .../browser/prefs_keywords_view.pt | 428 ++++++++++++------ .../PloneKeywordManager/configure.zcml | 4 +- .../profiles/default/browserlayer.xml | 9 +- .../profiles/default/metadata.xml | 2 +- .../profiles/default/rolemap.xml | 11 +- .../profiles/uninstall/browserlayer.xml | 10 +- .../profiles/uninstall/metadata.xml | 4 +- .../PloneKeywordManager/upgrades.zcml | 52 ++- 8 files changed, 331 insertions(+), 189 deletions(-) diff --git a/src/Products/PloneKeywordManager/browser/prefs_keywords_view.pt b/src/Products/PloneKeywordManager/browser/prefs_keywords_view.pt index 7accbfc..7eb20f8 100755 --- a/src/Products/PloneKeywordManager/browser/prefs_keywords_view.pt +++ b/src/Products/PloneKeywordManager/browser/prefs_keywords_view.pt @@ -1,191 +1,327 @@ - + xml:lang="en-US" + i18n:domain="Products.PloneKeywordManager" +> - - - - + + + -
+ " + > -

Keyword Manager

+

Keyword Manager

-

+

The Keyword Manager allows you to delete and rename/merge keywords in your portal. -

+

-
-
+
+
-
- -
+ +
-
-
- +
+ + -
-
+ +
+ +
+ +
+ + + + + +

+ Keyword assignments +

+ + + + + -
- - - - - - - -

- Keyword assignments -

- - - - - - -

+

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. -

- -
-
- -
- - - - - - - - -
-
-
-
- +

-
-
-
- - +
+
+ +
+ + + + + + + + +
+ +
+
-
+ -
- -
-
- - - + + - -
+ +
No content in this site has any keywords assigned yet, so there's nothing to manage at this time. (To assign keywords to a piece of content, use the item's "Categorization" tab while editing.) +
+
-
-
-
- +
+ diff --git a/src/Products/PloneKeywordManager/configure.zcml b/src/Products/PloneKeywordManager/configure.zcml index c17db84..cc11d20 100644 --- a/src/Products/PloneKeywordManager/configure.zcml +++ b/src/Products/PloneKeywordManager/configure.zcml @@ -35,7 +35,5 @@ factory=".setuphandlers.HiddenProfiles" name="PloneKeywordManager-hiddenprofiles" /> - + diff --git a/src/Products/PloneKeywordManager/profiles/default/browserlayer.xml b/src/Products/PloneKeywordManager/profiles/default/browserlayer.xml index 3879fc7..7fd0070 100644 --- a/src/Products/PloneKeywordManager/profiles/default/browserlayer.xml +++ b/src/Products/PloneKeywordManager/profiles/default/browserlayer.xml @@ -1,5 +1,6 @@ - + - - \ No newline at end of file + + diff --git a/src/Products/PloneKeywordManager/profiles/default/metadata.xml b/src/Products/PloneKeywordManager/profiles/default/metadata.xml index f073928..0bf4e0e 100644 --- a/src/Products/PloneKeywordManager/profiles/default/metadata.xml +++ b/src/Products/PloneKeywordManager/profiles/default/metadata.xml @@ -1,4 +1,4 @@ - + 6000 Keyword manager diff --git a/src/Products/PloneKeywordManager/profiles/default/rolemap.xml b/src/Products/PloneKeywordManager/profiles/default/rolemap.xml index b9022d7..1b0f002 100644 --- a/src/Products/PloneKeywordManager/profiles/default/rolemap.xml +++ b/src/Products/PloneKeywordManager/profiles/default/rolemap.xml @@ -1,10 +1,11 @@ - + - - - + + + diff --git a/src/Products/PloneKeywordManager/profiles/uninstall/browserlayer.xml b/src/Products/PloneKeywordManager/profiles/uninstall/browserlayer.xml index 3e8f08b..c5a89ac 100644 --- a/src/Products/PloneKeywordManager/profiles/uninstall/browserlayer.xml +++ b/src/Products/PloneKeywordManager/profiles/uninstall/browserlayer.xml @@ -1,5 +1,7 @@ - + - - \ No newline at end of file + + diff --git a/src/Products/PloneKeywordManager/profiles/uninstall/metadata.xml b/src/Products/PloneKeywordManager/profiles/uninstall/metadata.xml index 6dd0511..46df4e5 100644 --- a/src/Products/PloneKeywordManager/profiles/uninstall/metadata.xml +++ b/src/Products/PloneKeywordManager/profiles/uninstall/metadata.xml @@ -1,5 +1,5 @@ - + 1 Keyword manager - \ No newline at end of file + diff --git a/src/Products/PloneKeywordManager/upgrades.zcml b/src/Products/PloneKeywordManager/upgrades.zcml index 327320a..57c9977 100644 --- a/src/Products/PloneKeywordManager/upgrades.zcml +++ b/src/Products/PloneKeywordManager/upgrades.zcml @@ -1,32 +1,36 @@ + i18n_domain="Products.PloneKeywordManager" + > - + - - + + - - + + From 6087b23b193e56cabbc447c79709344737c2cbb0 Mon Sep 17 00:00:00 2001 From: Gil Forcada Codinachs Date: Wed, 17 Jun 2026 12:18:35 +0200 Subject: [PATCH 12/17] chore: flake8 --- src/Products/PloneKeywordManager/browser/prefs_keywords_view.py | 2 -- src/Products/PloneKeywordManager/tests/test_setup.py | 1 - src/Products/PloneKeywordManager/tool.py | 1 - 3 files changed, 4 deletions(-) diff --git a/src/Products/PloneKeywordManager/browser/prefs_keywords_view.py b/src/Products/PloneKeywordManager/browser/prefs_keywords_view.py index 356bfac..a1f933e 100644 --- a/src/Products/PloneKeywordManager/browser/prefs_keywords_view.py +++ b/src/Products/PloneKeywordManager/browser/prefs_keywords_view.py @@ -9,8 +9,6 @@ from zope.component import getUtility from ZTUtils import make_query -import json - class PrefsKeywordsView(BrowserView): """ diff --git a/src/Products/PloneKeywordManager/tests/test_setup.py b/src/Products/PloneKeywordManager/tests/test_setup.py index b24efb2..fcb071c 100644 --- a/src/Products/PloneKeywordManager/tests/test_setup.py +++ b/src/Products/PloneKeywordManager/tests/test_setup.py @@ -52,7 +52,6 @@ def getSite(self): self.assertNotIn("keywords", self.portal.objectIds()) context = FakeContext() importKeywords(context) - catalog = api.portal.get_tool("portal_catalog") self.assertIn("keywords", self.portal.objectIds()) keywords_on_obj = self.portal.keywords.Subject() for keyword in new_keywords: diff --git a/src/Products/PloneKeywordManager/tool.py b/src/Products/PloneKeywordManager/tool.py index 7aa2d23..2c29c64 100644 --- a/src/Products/PloneKeywordManager/tool.py +++ b/src/Products/PloneKeywordManager/tool.py @@ -2,7 +2,6 @@ # See also LICENSE.txt from AccessControl import ClassSecurityInfo from Acquisition import aq_base -from operator import itemgetter from plone import api from plone.dexterity.interfaces import IDexterityContent from Products.CMFCore.indexing import processQueue From 1846cdb79c31b93f011b32259c625b60d84ae63e Mon Sep 17 00:00:00 2001 From: Gil Forcada Codinachs Date: Wed, 17 Jun 2026 12:54:57 +0200 Subject: [PATCH 13/17] chore: typos --- CHANGES.rst | 6 +++--- README.rst | 2 +- .../PloneKeywordManager/browser/prefs_keywords_view.py | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index f769a41..441d19c 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -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/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/src/Products/PloneKeywordManager/browser/prefs_keywords_view.py b/src/Products/PloneKeywordManager/browser/prefs_keywords_view.py index a1f933e..5c538ca 100644 --- a/src/Products/PloneKeywordManager/browser/prefs_keywords_view.py +++ b/src/Products/PloneKeywordManager/browser/prefs_keywords_view.py @@ -76,7 +76,7 @@ def getKeywords(self, indexName, b_start=0, b_size=30): def getNumObjects(self, keyword, indexName): """ - return the number of indexed objects with the specificed keyword + return the number of indexed objects with the specified keyword :param keyword: string :return: int """ @@ -103,7 +103,7 @@ def changeKeywords(self, keywords, changeto, field): we search for all objects with the keywords 'foo', 'foo1', or 'foo_' in the subject field we remove these keywords from the field 'subject' - we then add the keyword 'Foo' (if it didn't alreay exist) to the subject field. + we then add the keyword 'Foo' (if it didn't already exist) to the subject field. we save all those objects. we should also rebuild the index, but hey... that's work. From 0c6862615f8f72eecaf3b1e8a91537cce422546b Mon Sep 17 00:00:00 2001 From: Gil Forcada Codinachs Date: Wed, 17 Jun 2026 12:57:10 +0200 Subject: [PATCH 14/17] chore: adjust MANIFEST --- MANIFEST.in | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) 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__ From c6af36dbcb494eeb82f4901c2cd2eb441f2133db Mon Sep 17 00:00:00 2001 From: Gil Forcada Codinachs Date: Wed, 17 Jun 2026 13:00:14 +0200 Subject: [PATCH 15/17] fix: state minimum python --- setup.cfg | 1 + 1 file changed, 1 insertion(+) diff --git a/setup.cfg b/setup.cfg index d943a9d..d7eb570 100644 --- a/setup.cfg +++ b/setup.cfg @@ -27,6 +27,7 @@ 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 From 66ea2189c39a47f361732153c772cc6393e340b4 Mon Sep 17 00:00:00 2001 From: Gil Forcada Codinachs Date: Wed, 17 Jun 2026 13:00:58 +0200 Subject: [PATCH 16/17] fix: adjust check-python-versions config --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index d90e2ae..843aaff 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -70,7 +70,7 @@ repos: rev: "0.24.2" hooks: - id: check-python-versions - args: ['--only', 'setup.py,tox.ini'] + args: ['--only', 'setup.cfg,tox.ini'] - repo: https://github.com/collective/i18ndude rev: "6.3.0" hooks: From aaf93bfb676d1d77f746c122fb27c692e5f1e250 Mon Sep 17 00:00:00 2001 From: Gil Forcada Codinachs Date: Wed, 17 Jun 2026 14:10:00 +0200 Subject: [PATCH 17/17] chore: adjust i18n --- src/Products/PloneKeywordManager/browser/prefs_keywords_view.pt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Products/PloneKeywordManager/browser/prefs_keywords_view.pt b/src/Products/PloneKeywordManager/browser/prefs_keywords_view.pt index 7eb20f8..dcad528 100755 --- a/src/Products/PloneKeywordManager/browser/prefs_keywords_view.pt +++ b/src/Products/PloneKeywordManager/browser/prefs_keywords_view.pt @@ -290,6 +290,7 @@ title="Rename" type="submit" i18n:attributes="value; title" + i18n:translate="" >replace / rename selected keyword(s)
@@ -303,6 +304,7 @@ title="Delete" type="submit" i18n:attributes="value; title" + i18n:translate="" >Delete selected keywords