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" +> - - - - + + + -
+ " + > -

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/browser/prefs_keywords_view.py b/src/Products/PloneKeywordManager/browser/prefs_keywords_view.py index 356bfac..5c538ca 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): """ @@ -78,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 """ @@ -105,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. 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/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") 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 2124451..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 @@ -11,7 +10,6 @@ from Products.PloneKeywordManager.interfaces import IKeywordManager from zope import interface - try: from plone.app.discussion.interfaces import IComment except ImportError: @@ -40,7 +38,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) 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" 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" + > - + - - + + - - + + 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__) 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_ +# """ +##