From 5c63e82be5430366df6ab178c9a314b5e724218e Mon Sep 17 00:00:00 2001 From: gforcada Date: Thu, 19 Oct 2023 10:07:36 +0200 Subject: [PATCH] [fc] Repository: plone.app.robotframework Branch: refs/heads/master Date: 2023-10-15T18:28:12+02:00 Author: Gil Forcada Codinachs (gforcada) Commit: https://github.com/plone/plone.app.robotframework/commit/ab81e06055b0f7800c9970328c87596329218d90 Configuring with plone/meta Files changed: A .editorconfig A .flake8 A .github/workflows/meta.yml A .meta.toml A .pre-commit-config.yaml A news/434550cc.internal A tox.ini M .gitignore M pyproject.toml D setup.cfg Repository: plone.app.robotframework Branch: refs/heads/master Date: 2023-10-15T18:28:12+02:00 Author: Gil Forcada Codinachs (gforcada) Commit: https://github.com/plone/plone.app.robotframework/commit/9742811d44b3cecb70306c9039a81246dec31d36 chore: drop old files Files changed: D buildout.cfg D docs.cfg D requirements.txt Repository: plone.app.robotframework Branch: refs/heads/master Date: 2023-10-15T18:28:12+02:00 Author: Gil Forcada Codinachs (gforcada) Commit: https://github.com/plone/plone.app.robotframework/commit/edafb601f848ade2c3af0e40d3cd85c4382775a8 chore: pyupgrade Files changed: M src/plone/app/robotframework/server.py Repository: plone.app.robotframework Branch: refs/heads/master Date: 2023-10-15T18:28:12+02:00 Author: Gil Forcada Codinachs (gforcada) Commit: https://github.com/plone/plone.app.robotframework/commit/11aea772398106c0a58e077854c1c1ed6c419fe4 chore: isort Files changed: M src/plone/app/robotframework/testing.py Repository: plone.app.robotframework Branch: refs/heads/master Date: 2023-10-15T18:28:12+02:00 Author: Gil Forcada Codinachs (gforcada) Commit: https://github.com/plone/plone.app.robotframework/commit/6954b93d9abd25d2ed1e2cf3c6409f77f2b1aaae chore: black Files changed: M src/plone/app/robotframework/reload.py M src/plone/app/robotframework/remote.py M src/plone/app/robotframework/saucelabs.py M src/plone/app/robotframework/server.py M src/plone/app/robotframework/testing.py M src/plone/app/robotframework/tests/test_content.py Repository: plone.app.robotframework Branch: refs/heads/master Date: 2023-10-15T18:28:12+02:00 Author: Gil Forcada Codinachs (gforcada) Commit: https://github.com/plone/plone.app.robotframework/commit/63c61ab607b5d553b0f21458773c64a5d7e4ef46 chore: zpretty Files changed: M docs/source/libdoc/python_debugging.html M docs/source/libdoc/python_layoutmath.html M docs/source/libdoc/python_saucelabs.html M docs/source/libdoc/python_zope2server.html M docs/source/libdoc/remote_autologin.html M docs/source/libdoc/remote_content.html M docs/source/libdoc/remote_genericsetup.html M docs/source/libdoc/remote_i18n.html M docs/source/libdoc/remote_mockmailhost.html M docs/source/libdoc/remote_quickinstaller.html M docs/source/libdoc/remote_users.html M docs/source/libdoc/remote_zope2server.html M docs/source/libdoc/selenium.html M docs/source/libdoc/user_keywords.html M docs/source/libdoc/user_saucelabs.html M docs/source/libdoc/user_selenium.html M docs/source/libdoc/user_server.html Repository: plone.app.robotframework Branch: refs/heads/master Date: 2023-10-15T18:28:12+02:00 Author: Gil Forcada Codinachs (gforcada) Commit: https://github.com/plone/plone.app.robotframework/commit/5189df595412fd1223eb82fde180f0a98353527b feat: codespell Files changed: M CHANGES.rst M docs/source/happy.rst M docs/source/keywords.rst M docs/source/remote.rst M docs/source/robot.rst M src/plone/app/robotframework/content.py M src/plone/app/robotframework/i18n.py M src/plone/app/robotframework/robotentrypoints.py M src/plone/app/robotframework/server.py M src/plone/app/robotframework/users.py Repository: plone.app.robotframework Branch: refs/heads/master Date: 2023-10-15T18:28:13+02:00 Author: Gil Forcada Codinachs (gforcada) Commit: https://github.com/plone/plone.app.robotframework/commit/7aa057388618e4d2ec75ce10ce59af4dded3fae9 feat: flake8 Files changed: M docs/source/conf.py Repository: plone.app.robotframework Branch: refs/heads/master Date: 2023-10-15T18:28:13+02:00 Author: Gil Forcada Codinachs (gforcada) Commit: https://github.com/plone/plone.app.robotframework/commit/151dc374970c3295ebe33db797da72a23e57ed68 feat: declare dependencies Files changed: M setup.py Repository: plone.app.robotframework Branch: refs/heads/master Date: 2023-10-19T10:07:36+02:00 Author: Gil Forcada Codinachs (gforcada) Commit: https://github.com/plone/plone.app.robotframework/commit/b99da570c0649cd308837058768e83e77bb1cb88 Merge pull request #145 from plone/config-with-default-template-78bb80ce Config with default template Files changed: A .editorconfig A .flake8 A .github/workflows/meta.yml A .meta.toml A .pre-commit-config.yaml A news/434550cc.internal A tox.ini M .gitignore M CHANGES.rst M docs/source/conf.py M docs/source/happy.rst M docs/source/keywords.rst M docs/source/libdoc/python_debugging.html M docs/source/libdoc/python_layoutmath.html M docs/source/libdoc/python_saucelabs.html M docs/source/libdoc/python_zope2server.html M docs/source/libdoc/remote_autologin.html M docs/source/libdoc/remote_content.html M docs/source/libdoc/remote_genericsetup.html M docs/source/libdoc/remote_i18n.html M docs/source/libdoc/remote_mockmailhost.html M docs/source/libdoc/remote_quickinstaller.html M docs/source/libdoc/remote_users.html M docs/source/libdoc/remote_zope2server.html M docs/source/libdoc/selenium.html M docs/source/libdoc/user_keywords.html M docs/source/libdoc/user_saucelabs.html M docs/source/libdoc/user_selenium.html M docs/source/libdoc/user_server.html M docs/source/remote.rst M docs/source/robot.rst M pyproject.toml M setup.py M src/plone/app/robotframework/content.py M src/plone/app/robotframework/i18n.py M src/plone/app/robotframework/reload.py M src/plone/app/robotframework/remote.py M src/plone/app/robotframework/robotentrypoints.py M src/plone/app/robotframework/saucelabs.py M src/plone/app/robotframework/server.py M src/plone/app/robotframework/testing.py M src/plone/app/robotframework/tests/test_content.py M src/plone/app/robotframework/users.py D buildout.cfg D docs.cfg D requirements.txt D setup.cfg --- last_commit.txt | 337 ++++++++++++++++++------------------------------ 1 file changed, 127 insertions(+), 210 deletions(-) diff --git a/last_commit.txt b/last_commit.txt index 81476a6801..c5ad317276 100644 --- a/last_commit.txt +++ b/last_commit.txt @@ -1,10 +1,10 @@ -Repository: plone.app.content +Repository: plone.app.robotframework Branch: refs/heads/master -Date: 2023-10-18T11:30:23+02:00 +Date: 2023-10-15T18:28:12+02:00 Author: Gil Forcada Codinachs (gforcada) -Commit: https://github.com/plone/plone.app.content/commit/5c52022143bd6da9697dc8f6ce3f23bfd1922aee +Commit: https://github.com/plone/plone.app.robotframework/commit/ab81e06055b0f7800c9970328c87596329218d90 Configuring with plone/meta @@ -14,249 +14,175 @@ A .flake8 A .github/workflows/meta.yml A .meta.toml A .pre-commit-config.yaml -A news/5cdbd962.internal +A news/434550cc.internal A tox.ini M .gitignore M pyproject.toml D setup.cfg -b'diff --git a/.editorconfig b/.editorconfig\nnew file mode 100644\nindex 0000000..8ae05aa\n--- /dev/null\n+++ b/.editorconfig\n@@ -0,0 +1,54 @@\n+# Generated from:\n+# https://github.com/plone/meta/tree/master/config/default\n+# See the inline comments on how to expand/tweak this configuration file\n+#\n+# EditorConfig Configuration file, for more details see:\n+# http://EditorConfig.org\n+# EditorConfig is a convention description, that could be interpreted\n+# by multiple editors to enforce common coding conventions for specific\n+# file types\n+\n+# top-most EditorConfig file:\n+# Will ignore other EditorConfig files in Home directory or upper tree level.\n+root = true\n+\n+\n+[*] # For All Files\n+# Unix-style newlines with a newline ending every file\n+end_of_line = lf\n+insert_final_newline = true\n+trim_trailing_whitespace = true\n+# Set default charset\n+charset = utf-8\n+# Indent style default\n+indent_style = space\n+# Max Line Length - a hard line wrap, should be disabled\n+max_line_length = off\n+\n+[*.{py,cfg,ini}]\n+# 4 space indentation\n+indent_size = 4\n+\n+[*.{yml,zpt,pt,dtml,zcml}]\n+# 2 space indentation\n+indent_size = 2\n+\n+[*.{json,jsonl,js,jsx,ts,tsx,css,less,scss,html}] # Frontend development\n+# 2 space indentation\n+indent_size = 2\n+max_line_length = 80\n+\n+[{Makefile,.gitmodules}]\n+# Tab indentation (no size specified, but view as 4 spaces)\n+indent_style = tab\n+indent_size = unset\n+tab_width = unset\n+\n+\n+##\n+# Add extra configuration options in .meta.toml:\n+# [editorconfig]\n+# extra_lines = """\n+# _your own configuration lines_\n+# """\n+##\ndiff --git a/.flake8 b/.flake8\nnew file mode 100644\nindex 0000000..7ef4f64\n--- /dev/null\n+++ b/.flake8\n@@ -0,0 +1,22 @@\n+# Generated from:\n+# https://github.com/plone/meta/tree/master/config/default\n+# See the inline comments on how to expand/tweak this configuration file\n+[flake8]\n+doctests = 1\n+ignore =\n+ # black takes care of line length\n+ E501,\n+ # black takes care of where to break lines\n+ W503,\n+ # black takes care of spaces within slicing (list[:])\n+ E203,\n+ # black takes care of spaces after commas\n+ E231,\n+\n+##\n+# Add extra configuration options in .meta.toml:\n+# [flake8]\n+# extra_lines = """\n+# _your own configuration lines_\n+# """\n+##\ndiff --git a/.github/workflows/meta.yml b/.github/workflows/meta.yml\nnew file mode 100644\nindex 0000000..aa2345c\n--- /dev/null\n+++ b/.github/workflows/meta.yml\n@@ -0,0 +1,70 @@\n+# Generated from:\n+# https://github.com/plone/meta/tree/master/config/default\n+# See the inline comments on how to expand/tweak this configuration file\n+name: Meta\n+on:\n+ push:\n+ branches:\n+ - master\n+ - main\n+ pull_request:\n+ branches:\n+ - master\n+ - main\n+ workflow_dispatch:\n+\n+##\n+# To set environment variables for all jobs, add in .meta.toml:\n+# [github]\n+# env = """\n+# debug: 1\n+# image-name: \'org/image\'\n+# image-tag: \'latest\'\n+# """\n+##\n+\n+jobs:\n+ qa:\n+ uses: plone/meta/.github/workflows/qa.yml@main\n+ test:\n+ uses: plone/meta/.github/workflows/test.yml@main\n+ coverage:\n+ uses: plone/meta/.github/workflows/coverage.yml@main\n+ dependencies:\n+ uses: plone/meta/.github/workflows/dependencies.yml@main\n+ release_ready:\n+ uses: plone/meta/.github/workflows/release_ready.yml@main\n+\n+# TODO: enable the circular dependencies check once the circular\n+# dependency with plone.app.dexterity is fixed.\n+# See https://github.com/plone/Products.CMFPlone/issues/3858\n+\n+##\n+# To modify the list of default jobs being created add in .meta.toml:\n+# [github]\n+# jobs = [\n+# "qa",\n+# "test",\n+# "coverage",\n+# "dependencies",\n+# "release_ready",\n+# "circular",\n+# ]\n+##\n+\n+##\n+# To request that some OS level dependencies get installed\n+# when running tests/coverage jobs, add in .meta.toml:\n+# [github]\n+# os_dependencies = "git libxml2 libxslt"\n+##\n+\n+\n+##\n+# Specify additional jobs in .meta.toml:\n+# [github]\n+# extra_lines = """\n+# another:\n+# uses: org/repo/.github/workflows/file.yml@main\n+# """\n+##\ndiff --git a/.gitignore b/.gitignore\nindex d12b524..503e47c 100644\n--- a/.gitignore\n+++ b/.gitignore\n@@ -1,23 +1,55 @@\n-/develop-eggs\n-/eggs\n-/fake-eggs\n-/bin\n-/parts\n-/downloads\n-/var\n-/build\n-/dist\n-/local.cfg\n-/*.egg-info\n-/.installed.cfg\n-/.mr.developer.cfg\n+# Generated from:\n+# https://github.com/plone/meta/tree/master/config/default\n+# See the inline comments on how to expand/tweak this configuration file\n+# python related\n+*.egg-info\n *.pyc\n-/.Python\n-/include\n-/lib\n-/src/*\n+*.pyo\n+\n+# translation related\n *.mo\n-/.coverage\n+\n+# tools related\n+build/\n+.coverage\n+.*project\n coverage.xml\n-zptlint.log\n-.DS_Store\n+dist/\n+docs/_build\n+__pycache__/\n+.tox\n+.vscode/\n+node_modules/\n+\n+# venv / buildout related\n+bin/\n+develop-eggs/\n+eggs/\n+.eggs/\n+etc/\n+.installed.cfg\n+include/\n+lib/\n+lib64\n+.mr.developer.cfg\n+parts/\n+pyvenv.cfg\n+var/\n+\n+# mxdev\n+/instance/\n+/.make-sentinels/\n+/*-mxdev.txt\n+/reports/\n+/sources/\n+/venv/\n+.installed.txt\n+\n+\n+##\n+# Add extra configuration options in .meta.toml:\n+# [gitignore]\n+# extra_lines = """\n+# _your own configuration lines_\n+# """\n+##\ndiff --git a/.meta.toml b/.meta.toml\nnew file mode 100644\nindex 0000000..d5d5bc4\n--- /dev/null\n+++ b/.meta.toml\n@@ -0,0 +1,26 @@\n+# Generated from:\n+# https://github.com/plone/meta/tree/master/config/default\n+# See the inline comments on how to expand/tweak this configuration file\n+[meta]\n+template = "default"\n+commit-id = "68cda6e4"\n+\n+[github]\n+jobs = [\n+ "qa",\n+ "test",\n+ "coverage",\n+ "dependencies",\n+ "release_ready",\n+ ]\n+\n+[pre_commit]\n+zpretty_extra_lines = """\n+ exclude: plone/app/content/browser/contents/templates\n+"""\n+i18ndude_extra_lines = """\n+ exclude: plone/app/content/browser/contents\n+"""\n+\n+[pyproject]\n+dependencies_ignores = "[\'tus\', ]"\ndiff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml\nnew file mode 100644\nindex 0000000..fac5190\n--- /dev/null\n+++ b/.pre-commit-config.yaml\n@@ -0,0 +1,96 @@\n+# Generated from:\n+# https://github.com/plone/meta/tree/master/config/default\n+# See the inline comments on how to expand/tweak this configuration file\n+ci:\n+ autofix_prs: false\n+ autoupdate_schedule: monthly\n+\n+repos:\n+- repo: https://github.com/asottile/pyupgrade\n+ rev: v3.14.0\n+ hooks:\n+ - id: pyupgrade\n+ args: [--py38-plus]\n+- repo: https://github.com/pycqa/isort\n+ rev: 5.12.0\n+ hooks:\n+ - id: isort\n+- repo: https://github.com/psf/black\n+ rev: 23.9.1\n+ hooks:\n+ - id: black\n+- repo: https://github.com/collective/zpretty\n+ rev: 3.1.0\n+ hooks:\n+ - id: zpretty\n+ exclude: plone/app/content/browser/contents/templates\n+\n+##\n+# Add extra configuration options in .meta.toml:\n+# [pre_commit]\n+# zpretty_extra_lines = """\n+# _your own configuration lines_\n+# """\n+##\n+- repo: https://github.com/PyCQA/flake8\n+ rev: 6.1.0\n+ hooks:\n+ - id: flake8\n+\n+##\n+# Add extra configuration options in .meta.toml:\n+# [pre_commit]\n+# flake8_extra_lines = """\n+# _your own configuration lines_\n+# """\n+##\n+- repo: https://github.com/codespell-project/codespell\n+ rev: v2.2.6\n+ hooks:\n+ - id: codespell\n+ additional_dependencies:\n+ - tomli\n+\n+##\n+# Add extra configuration options in .meta.toml:\n+# [pre_commit]\n+# codespell_extra_lines = """\n+# _your own configuration lines_\n+# """\n+##\n+- repo: https://github.com/mgedmin/check-manifest\n+ rev: "0.49"\n+ hooks:\n+ - id: check-manifest\n+- repo: https://github.com/regebro/pyroma\n+ rev: "4.2"\n+ hooks:\n+ - id: pyroma\n+- repo: https://github.com/mgedmin/check-python-versions\n+ rev: "0.21.3"\n+ hooks:\n+ - id: check-python-versions\n+ args: [\'--only\', \'setup.py,pyproject.toml\']\n+- repo: https://github.com/collective/i18ndude\n+ rev: "6.1.0"\n+ hooks:\n+ - id: i18ndude\n+ exclude: plone/app/content/browser/contents\n+\n+\n+##\n+# Add extra configuration options in .meta.toml:\n+# [pre_commit]\n+# i18ndude_extra_lines = """\n+# _your own configuration lines_\n+# """\n+##\n+\n+\n+##\n+# Add extra configuration options in .meta.toml:\n+# [pre_commit]\n+# extra_lines = """\n+# _your own configuration lines_\n+# """\n+##\ndiff --git a/news/5cdbd962.internal b/news/5cdbd962.internal\nnew file mode 100644\nindex 0000000..c08f539\n--- /dev/null\n+++ b/news/5cdbd962.internal\n@@ -0,0 +1,2 @@\n+Update configuration files.\n+[plone devs]\ndiff --git a/pyproject.toml b/pyproject.toml\nindex 05b615d..0e84fbc 100644\n--- a/pyproject.toml\n+++ b/pyproject.toml\n@@ -1,6 +1,9 @@\n+# Generated from:\n+# https://github.com/plone/meta/tree/master/config/default\n+# See the inline comments on how to expand/tweak this configuration file\n [tool.towncrier]\n-filename = "CHANGES.rst"\n directory = "news/"\n+filename = "CHANGES.rst"\n title_format = "{version} ({project_date})"\n underlines = ["-", ""]\n \n@@ -18,3 +21,137 @@ showcontent = true\n directory = "bugfix"\n name = "Bug fixes:"\n showcontent = true\n+\n+[[tool.towncrier.type]]\n+directory = "internal"\n+name = "Internal:"\n+showcontent = true\n+\n+[[tool.towncrier.type]]\n+directory = "documentation"\n+name = "Documentation:"\n+showcontent = true\n+\n+[[tool.towncrier.type]]\n+directory = "tests"\n+name = "Tests"\n+showcontent = true\n+\n+##\n+# Add extra configuration options in .meta.toml:\n+# [pyproject]\n+# towncrier_extra_lines = """\n+# extra_configuration\n+# """\n+##\n+\n+[tool.isort]\n+profile = "plone"\n+\n+##\n+# Add extra configuration options in .meta.toml:\n+# [pyproject]\n+# isort_extra_lines = """\n+# extra_configuration\n+# """\n+##\n+\n+[tool.black]\n+target-version = ["py38"]\n+\n+##\n+# Add extra configuration options in .meta.toml:\n+# [pyproject]\n+# black_extra_lines = """\n+# extra_configuration\n+# """\n+##\n+\n+[tool.codespell]\n+ignore-words-list = "discreet,"\n+skip = "*.po,"\n+##\n+# Add extra configuration options in .meta.toml:\n+# [pyproject]\n+# codespell_ignores = "foo,bar"\n+# codespell_skip = "*.po,*.map,package-lock.json"\n+##\n+\n+[tool.dependencychecker]\n+Zope = [\n+ # Zope own provided namespaces\n+ \'App\', \'OFS\', \'Products.Five\', \'Products.OFSP\', \'Products.PageTemplates\',\n+ \'Products.SiteAccess\', \'Shared\', \'Testing\', \'ZPublisher\', \'ZTUtils\',\n+ \'Zope2\', \'webdav\', \'zmi\',\n+ # ExtensionClass own provided namespaces\n+ \'ExtensionClass\', \'ComputedAttribute\', \'MethodObject\',\n+ # Zope dependencies\n+ \'AccessControl\', \'Acquisition\', \'AuthEncoding\', \'beautifulsoup4\', \'BTrees\',\n+ \'cffi\', \'Chameleon\', \'DateTime\', \'DocumentTemplate\',\n+ \'MultiMapping\', \'multipart\', \'PasteDeploy\', \'Persistence\', \'persistent\',\n+ \'pycparser\', \'python-gettext\', \'pytz\', \'RestrictedPython\', \'roman\',\n+ \'soupsieve\', \'transaction\', \'waitress\', \'WebOb\', \'WebTest\', \'WSGIProxy2\',\n+ \'z3c.pt\', \'zc.lockfile\', \'ZConfig\', \'zExceptions\', \'ZODB\', \'zodbpickle\',\n+ \'zope.annotation\', \'zope.browser\', \'zope.browsermenu\', \'zope.browserpage\',\n+ \'zope.browserresource\', \'zope.cachedescriptors\', \'zope.component\',\n+ \'zope.configuration\', \'zope.container\', \'zope.contentprovider\',\n+ \'zope.contenttype\', \'zope.datetime\', \'zope.deferredimport\',\n+ \'zope.deprecation\', \'zope.dottedname\', \'zope.event\', \'zope.exceptions\',\n+ \'zope.filerepresentation\', \'zope.globalrequest\', \'zope.hookable\',\n+ \'zope.i18n\', \'zope.i18nmessageid\', \'zope.interface\', \'zope.lifecycleevent\',\n+ \'zope.location\', \'zope.pagetemplate\', \'zope.processlifetime\', \'zope.proxy\',\n+ \'zope.ptresource\', \'zope.publisher\', \'zope.schema\', \'zope.security\',\n+ \'zope.sequencesort\', \'zope.site\', \'zope.size\', \'zope.structuredtext\',\n+ \'zope.tal\', \'zope.tales\', \'zope.testbrowser\', \'zope.testing\',\n+ \'zope.traversing\', \'zope.viewlet\'\n+]\n+\'Products.CMFCore\' = [\n+ \'docutils\', \'five.localsitemanager\', \'Missing\', \'Products.BTreeFolder2\',\n+ \'Products.GenericSetup\', \'Products.MailHost\', \'Products.PythonScripts\',\n+ \'Products.StandardCacheManagers\', \'Products.ZCatalog\', \'Record\',\n+ \'zope.sendmail\', \'Zope\'\n+]\n+\'plone.base\' = [\n+ \'plone.batching\', \'plone.registry\', \'plone.schema\',\'plone.z3cform\',\n+ \'Products.CMFCore\', \'Products.CMFDynamicViewFTI\',\n+]\n+python-dateutil = [\'dateutil\']\n+ignore-packages = [\'tus\', ]\n+\n+##\n+# Add extra configuration options in .meta.toml:\n+# [pyproject]\n+# dependencies_ignores = "[\'zestreleaser.towncrier\']"\n+# dependencies_mappings = [\n+# "gitpython = [\'git\']",\n+# "pygithub = [\'github\']",\n+# ]\n+##\n+\n+[tool.check-manifest]\n+ignore = [\n+ ".editorconfig",\n+ ".meta.toml",\n+ ".pre-commit-config.yaml",\n+ "tox.ini",\n+ ".flake8",\n+ "mx.ini",\n+\n+]\n+##\n+# Add extra configuration options in .meta.toml:\n+# [pyproject]\n+# check_manifest_ignores = """\n+# "*.map.js",\n+# "*.pyc",\n+# """\n+##\n+\n+\n+##\n+# Add extra configuration options in .meta.toml:\n+# [pyproject]\n+# extra_lines = """\n+# _your own configuration lines_\n+# """\n+##\ndiff --git a/setup.cfg b/setup.cfg\ndeleted file mode 100644\nindex 3e076fd..0000000\n--- a/setup.cfg\n+++ /dev/null\n@@ -1,9 +0,0 @@\n-[bdist_wheel]\n-universal = 0\n-\n-[isort]\n-# black compatible Plone isort rules:\n-profile = black\n-force_alphabetical_sort = True\n-force_single_line = True\n-lines_after_imports = 2\ndiff --git a/tox.ini b/tox.ini\nnew file mode 100644\nindex 0000000..cbb3425\n--- /dev/null\n+++ b/tox.ini\n@@ -0,0 +1,208 @@\n+# Generated from:\n+# https://github.com/plone/meta/tree/master/config/default\n+# See the inline comments on how to expand/tweak this configuration file\n+[tox]\n+# We need 4.4.0 for constrain_package_deps.\n+min_version = 4.4.0\n+envlist =\n+ lint\n+ test\n+ dependencies\n+\n+\n+##\n+# Add extra configuration options in .meta.toml:\n+# [tox]\n+# envlist_lines = """\n+# my_other_environment\n+# """\n+# config_lines = """\n+# my_extra_top_level_tox_configuration_lines\n+# """\n+##\n+\n+[testenv]\n+skip_install = true\n+allowlist_externals =\n+ echo\n+ false\n+# Make sure typos like `tox -e formaat` are caught instead of silently doing nothing.\n+# See https://github.com/tox-dev/tox/issues/2858.\n+commands =\n+ echo "Unrecognized environment name {envname}"\n+ false\n+\n+[testenv:init]\n+description = Prepare environment\n+skip_install = true\n+commands =\n+ echo "Initial setup complete"\n+\n+\n+[testenv:format]\n+description = automatically reformat code\n+skip_install = true\n+deps =\n+ pre-commit\n+commands =\n+ pre-commit run -a pyupgrade\n+ pre-commit run -a isort\n+ pre-commit run -a black\n+ pre-commit run -a zpretty\n+\n+[testenv:lint]\n+description = run linters that will help improve the code style\n+skip_install = true\n+deps =\n+ pre-commit\n+commands =\n+ pre-commit run -a\n+\n+[testenv:dependencies]\n+description = check if the package defines all its dependencies\n+skip_install = true\n+deps =\n+ build\n+ z3c.dependencychecker==2.11\n+commands =\n+ python -m build --sdist --no-isolation\n+ dependencychecker\n+\n+[testenv:dependencies-graph]\n+description = generate a graph out of the dependencies of the package\n+skip_install = false\n+allowlist_externals =\n+ sh\n+deps =\n+ pipdeptree==2.5.1\n+ graphviz # optional dependency of pipdeptree\n+commands =\n+ sh -c \'pipdeptree --exclude setuptools,wheel,pipdeptree,zope.interface,zope.component --graph-output svg > dependencies.svg\'\n+\n+[testenv:test]\n+description = run the distribution tests\n+use_develop = true\n+skip_install = false\n+constrain_package_deps = true\n+set_env =\n+ ROBOT_BROWSER=headlesschrome\n+\n+##\n+# Specify extra test environment variables in .meta.toml:\n+# [tox]\n+# test_environment_variables = """\n+# PIP_EXTRA_INDEX_URL=https://my-pypi.my-server.com/\n+# """\n+#\n+# Set constrain_package_deps .meta.toml:\n+# [tox]\n+# constrain_package_deps = "false"\n+##\n+deps =\n+ zope.testrunner\n+ -c https://dist.plone.org/release/6.0-dev/constraints.txt\n+ \n+##\n+# Specify additional deps in .meta.toml:\n+# [tox]\n+# test_deps_additional = "-esources/plonegovbr.portal_base[test]"\n+#\n+# Specify a custom constraints file in .meta.toml:\n+# [tox]\n+# constraints_file = "https://my-server.com/constraints.txt"\n+##\n+commands =\n+ zope-testrunner --all --test-path={toxinidir} -s plone.app.content {posargs}\n+extras =\n+ test\n+\n+##\n+# Add extra configuration options in .meta.toml:\n+# [tox]\n+# test_extras = """\n+# tests\n+# widgets\n+# """\n+##\n+\n+[testenv:coverage]\n+description = get a test coverage report\n+use_develop = true\n+skip_install = false\n+constrain_package_deps = true\n+set_env =\n+ ROBOT_BROWSER=headlesschrome\n+\n+##\n+# Specify extra test environment variables in .meta.toml:\n+# [tox]\n+# test_environment_variables = """\n+# PIP_EXTRA_INDEX_URL=https://my-pypi.my-server.com/\n+# """\n+##\n+deps =\n+ coverage\n+ zope.testrunner\n+ -c https://dist.plone.org/release/6.0-dev/constraints.txt\n+ \n+commands =\n+ coverage run --branch --source plone.app.content {envbindir}/zope-testrunner --quiet --all --test-path={toxinidir} -s plone.app.content {posargs}\n+ coverage report -m --format markdown\n+ coverage xml\n+extras =\n+ test\n+\n+\n+[testenv:release-check]\n+description = ensure that the distribution is ready to release\n+skip_install = true\n+deps =\n+ twine\n+ build\n+ towncrier\n+ -c https://dist.plone.org/release/6.0-dev/constraints.txt\n+ \n+commands =\n+ # fake version to not have to install the package\n+ # we build the change log as news entries might break\n+ # the README that is displayed on PyPI\n+ towncrier build --version=100.0.0 --yes\n+ python -m build --sdist --no-isolation\n+ twine check dist/*\n+\n+[testenv:circular]\n+description = ensure there are no cyclic dependencies\n+use_develop = true\n+skip_install = false\n+set_env =\n+\n+##\n+# Specify extra test environment variables in .meta.toml:\n+# [tox]\n+# test_environment_variables = """\n+# PIP_EXTRA_INDEX_URL=https://my-pypi.my-server.com/\n+# """\n+##\n+allowlist_externals =\n+ sh\n+deps =\n+ pipdeptree\n+ pipforester\n+ -c https://dist.plone.org/release/6.0-dev/constraints.txt\n+ \n+commands =\n+ # Generate the full dependency tree\n+ sh -c \'pipdeptree -j > forest.json\'\n+ # Generate a DOT graph with the circular dependencies, if any\n+ pipforester -i forest.json -o forest.dot --cycles\n+ # Report if there are any circular dependencies, i.e. error if there are any\n+ pipforester -i forest.json --check-cycles -o /dev/null\n+\n+\n+##\n+# Add extra configuration options in .meta.toml:\n+# [tox]\n+# extra_lines = """\n+# _your own configuration lines_\n+# """\n+##\n' +b'diff --git a/.editorconfig b/.editorconfig\nnew file mode 100644\nindex 00000000..8ae05aaa\n--- /dev/null\n+++ b/.editorconfig\n@@ -0,0 +1,54 @@\n+# Generated from:\n+# https://github.com/plone/meta/tree/master/config/default\n+# See the inline comments on how to expand/tweak this configuration file\n+#\n+# EditorConfig Configuration file, for more details see:\n+# http://EditorConfig.org\n+# EditorConfig is a convention description, that could be interpreted\n+# by multiple editors to enforce common coding conventions for specific\n+# file types\n+\n+# top-most EditorConfig file:\n+# Will ignore other EditorConfig files in Home directory or upper tree level.\n+root = true\n+\n+\n+[*] # For All Files\n+# Unix-style newlines with a newline ending every file\n+end_of_line = lf\n+insert_final_newline = true\n+trim_trailing_whitespace = true\n+# Set default charset\n+charset = utf-8\n+# Indent style default\n+indent_style = space\n+# Max Line Length - a hard line wrap, should be disabled\n+max_line_length = off\n+\n+[*.{py,cfg,ini}]\n+# 4 space indentation\n+indent_size = 4\n+\n+[*.{yml,zpt,pt,dtml,zcml}]\n+# 2 space indentation\n+indent_size = 2\n+\n+[*.{json,jsonl,js,jsx,ts,tsx,css,less,scss,html}] # Frontend development\n+# 2 space indentation\n+indent_size = 2\n+max_line_length = 80\n+\n+[{Makefile,.gitmodules}]\n+# Tab indentation (no size specified, but view as 4 spaces)\n+indent_style = tab\n+indent_size = unset\n+tab_width = unset\n+\n+\n+##\n+# Add extra configuration options in .meta.toml:\n+# [editorconfig]\n+# extra_lines = """\n+# _your own configuration lines_\n+# """\n+##\ndiff --git a/.flake8 b/.flake8\nnew file mode 100644\nindex 00000000..590eb044\n--- /dev/null\n+++ b/.flake8\n@@ -0,0 +1,24 @@\n+# Generated from:\n+# https://github.com/plone/meta/tree/master/config/default\n+# See the inline comments on how to expand/tweak this configuration file\n+[flake8]\n+doctests = 1\n+ignore =\n+ # black takes care of line length\n+ E501,\n+ # black takes care of where to break lines\n+ W503,\n+ # black takes care of spaces within slicing (list[:])\n+ E203,\n+ # black takes care of spaces after commas\n+ E231,\n+per-file-ignores =\n+ src/plone/app/robotframework/__init__.py:F401\n+\n+##\n+# Add extra configuration options in .meta.toml:\n+# [flake8]\n+# extra_lines = """\n+# _your own configuration lines_\n+# """\n+##\ndiff --git a/.github/workflows/meta.yml b/.github/workflows/meta.yml\nnew file mode 100644\nindex 00000000..d13f706c\n--- /dev/null\n+++ b/.github/workflows/meta.yml\n@@ -0,0 +1,66 @@\n+# Generated from:\n+# https://github.com/plone/meta/tree/master/config/default\n+# See the inline comments on how to expand/tweak this configuration file\n+name: Meta\n+on:\n+ push:\n+ branches:\n+ - master\n+ - main\n+ pull_request:\n+ branches:\n+ - master\n+ - main\n+ workflow_dispatch:\n+\n+##\n+# To set environment variables for all jobs, add in .meta.toml:\n+# [github]\n+# env = """\n+# debug: 1\n+# image-name: \'org/image\'\n+# image-tag: \'latest\'\n+# """\n+##\n+\n+jobs:\n+ qa:\n+ uses: plone/meta/.github/workflows/qa.yml@main\n+ dependencies:\n+ uses: plone/meta/.github/workflows/dependencies.yml@main\n+ release_ready:\n+ uses: plone/meta/.github/workflows/release_ready.yml@main\n+\n+#TODO: remove the tests and coverage, as they fail on GHA for now.\n+# Removed the circular dependency check as well,\n+# due to plone.app.multilingual and Products.CMFPlone having a circular dependency.\n+\n+##\n+# To modify the list of default jobs being created add in .meta.toml:\n+# [github]\n+# jobs = [\n+# "qa",\n+# "test",\n+# "coverage",\n+# "dependencies",\n+# "release_ready",\n+# "circular",\n+# ]\n+##\n+\n+##\n+# To request that some OS level dependencies get installed\n+# when running tests/coverage jobs, add in .meta.toml:\n+# [github]\n+# os_dependencies = "git libxml2 libxslt"\n+##\n+\n+\n+##\n+# Specify additional jobs in .meta.toml:\n+# [github]\n+# extra_lines = """\n+# another:\n+# uses: org/repo/.github/workflows/file.yml@main\n+# """\n+##\ndiff --git a/.gitignore b/.gitignore\nindex 855b1cab..503e47c5 100644\n--- a/.gitignore\n+++ b/.gitignore\n@@ -1,25 +1,55 @@\n-syntax: glob\n+# Generated from:\n+# https://github.com/plone/meta/tree/master/config/default\n+# See the inline comments on how to expand/tweak this configuration file\n+# python related\n *.egg-info\n-*.mo\n-*.swp\n *.pyc\n-*.py.bak\n-.DS_Store\n-.idea\n+*.pyo\n+\n+# translation related\n+*.mo\n+\n+# tools related\n+build/\n+.coverage\n+.*project\n+coverage.xml\n+dist/\n+docs/_build\n+__pycache__/\n+.tox\n+.vscode/\n+node_modules/\n+\n+# venv / buildout related\n+bin/\n+develop-eggs/\n+eggs/\n+.eggs/\n+etc/\n .installed.cfg\n+include/\n+lib/\n+lib64\n .mr.developer.cfg\n-.ropeproject\n-bin\n-buildout-cache\n-develop-eggs\n-dist\n-docs/make.bat\n-docs/Makefile\n-etc\n-include\n-lib\n-local\n-parts\n-pip-selfcheck.json\n-var\n+parts/\n+pyvenv.cfg\n+var/\n+\n+# mxdev\n+/instance/\n+/.make-sentinels/\n+/*-mxdev.txt\n+/reports/\n+/sources/\n+/venv/\n+.installed.txt\n+\n \n+##\n+# Add extra configuration options in .meta.toml:\n+# [gitignore]\n+# extra_lines = """\n+# _your own configuration lines_\n+# """\n+##\ndiff --git a/.meta.toml b/.meta.toml\nnew file mode 100644\nindex 00000000..de2bf65b\n--- /dev/null\n+++ b/.meta.toml\n@@ -0,0 +1,27 @@\n+# Generated from:\n+# https://github.com/plone/meta/tree/master/config/default\n+# See the inline comments on how to expand/tweak this configuration file\n+[meta]\n+template = "default"\n+commit-id = "68cda6e4"\n+\n+[flake8]\n+extra_lines = """\n+per-file-ignores =\n+ src/plone/app/robotframework/__init__.py:F401\n+"""\n+\n+[pyproject]\n+codespell_ignores = "ot,nin,"\n+dependencies_ignores = "[\'robotide\', \'collective.js.speakjs\', \'watchdog\', \'robotframework-debuglibrary\', \'robotframework-ride\', \'robotframework-selenium2library\', \'robotframework-seleniumtestability\', \'sphinxcontrib-robotdoc\', \'robotsuite\', \'robotframework-browser\' ]"\n+dependencies_mappings = [\n+ "Pillow = [\'PIL\']",\n+ "robotframework = [\'robot\']",\n+ ]\n+\n+[github]\n+jobs = [\n+ "qa",\n+ "dependencies",\n+ "release_ready",\n+ ]\ndiff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml\nnew file mode 100644\nindex 00000000..b6eb0432\n--- /dev/null\n+++ b/.pre-commit-config.yaml\n@@ -0,0 +1,94 @@\n+# Generated from:\n+# https://github.com/plone/meta/tree/master/config/default\n+# See the inline comments on how to expand/tweak this configuration file\n+ci:\n+ autofix_prs: false\n+ autoupdate_schedule: monthly\n+\n+repos:\n+- repo: https://github.com/asottile/pyupgrade\n+ rev: v3.14.0\n+ hooks:\n+ - id: pyupgrade\n+ args: [--py38-plus]\n+- repo: https://github.com/pycqa/isort\n+ rev: 5.12.0\n+ hooks:\n+ - id: isort\n+- repo: https://github.com/psf/black\n+ rev: 23.9.1\n+ hooks:\n+ - id: black\n+- repo: https://github.com/collective/zpretty\n+ rev: 3.1.0\n+ hooks:\n+ - id: zpretty\n+\n+##\n+# Add extra configuration options in .meta.toml:\n+# [pre_commit]\n+# zpretty_extra_lines = """\n+# _your own configuration lines_\n+# """\n+##\n+- repo: https://github.com/PyCQA/flake8\n+ rev: 6.1.0\n+ hooks:\n+ - id: flake8\n+\n+##\n+# Add extra configuration options in .meta.toml:\n+# [pre_commit]\n+# flake8_extra_lines = """\n+# _your own configuration lines_\n+# """\n+##\n+- repo: https://github.com/codespell-project/codespell\n+ rev: v2.2.6\n+ hooks:\n+ - id: codespell\n+ additional_dependencies:\n+ - tomli\n+\n+##\n+# Add extra configuration options in .meta.toml:\n+# [pre_commit]\n+# codespell_extra_lines = """\n+# _your own configuration lines_\n+# """\n+##\n+- repo: https://github.com/mgedmin/check-manifest\n+ rev: "0.49"\n+ hooks:\n+ - id: check-manifest\n+- repo: https://github.com/regebro/pyroma\n+ rev: "4.2"\n+ hooks:\n+ - id: pyroma\n+- repo: https://github.com/mgedmin/check-python-versions\n+ rev: "0.21.3"\n+ hooks:\n+ - id: check-python-versions\n+ args: [\'--only\', \'setup.py,pyproject.toml\']\n+- repo: https://github.com/collective/i18ndude\n+ rev: "6.1.0"\n+ hooks:\n+ - id: i18ndude\n+\n+\n+##\n+# Add extra configuration options in .meta.toml:\n+# [pre_commit]\n+# i18ndude_extra_lines = """\n+# _your own configuration lines_\n+# """\n+##\n+\n+\n+##\n+# Add extra configuration options in .meta.toml:\n+# [pre_commit]\n+# extra_lines = """\n+# _your own configuration lines_\n+# """\n+##\ndiff --git a/news/434550cc.internal b/news/434550cc.internal\nnew file mode 100644\nindex 00000000..c08f5399\n--- /dev/null\n+++ b/news/434550cc.internal\n@@ -0,0 +1,2 @@\n+Update configuration files.\n+[plone devs]\ndiff --git a/pyproject.toml b/pyproject.toml\nindex 05b615de..4a596000 100644\n--- a/pyproject.toml\n+++ b/pyproject.toml\n@@ -1,6 +1,9 @@\n+# Generated from:\n+# https://github.com/plone/meta/tree/master/config/default\n+# See the inline comments on how to expand/tweak this configuration file\n [tool.towncrier]\n-filename = "CHANGES.rst"\n directory = "news/"\n+filename = "CHANGES.rst"\n title_format = "{version} ({project_date})"\n underlines = ["-", ""]\n \n@@ -18,3 +21,139 @@ showcontent = true\n directory = "bugfix"\n name = "Bug fixes:"\n showcontent = true\n+\n+[[tool.towncrier.type]]\n+directory = "internal"\n+name = "Internal:"\n+showcontent = true\n+\n+[[tool.towncrier.type]]\n+directory = "documentation"\n+name = "Documentation:"\n+showcontent = true\n+\n+[[tool.towncrier.type]]\n+directory = "tests"\n+name = "Tests"\n+showcontent = true\n+\n+##\n+# Add extra configuration options in .meta.toml:\n+# [pyproject]\n+# towncrier_extra_lines = """\n+# extra_configuration\n+# """\n+##\n+\n+[tool.isort]\n+profile = "plone"\n+\n+##\n+# Add extra configuration options in .meta.toml:\n+# [pyproject]\n+# isort_extra_lines = """\n+# extra_configuration\n+# """\n+##\n+\n+[tool.black]\n+target-version = ["py38"]\n+\n+##\n+# Add extra configuration options in .meta.toml:\n+# [pyproject]\n+# black_extra_lines = """\n+# extra_configuration\n+# """\n+##\n+\n+[tool.codespell]\n+ignore-words-list = "discreet,ot,nin,"\n+skip = "*.po,"\n+##\n+# Add extra configuration options in .meta.toml:\n+# [pyproject]\n+# codespell_ignores = "foo,bar"\n+# codespell_skip = "*.po,*.map,package-lock.json"\n+##\n+\n+[tool.dependencychecker]\n+Zope = [\n+ # Zope own provided namespaces\n+ \'App\', \'OFS\', \'Products.Five\', \'Products.OFSP\', \'Products.PageTemplates\',\n+ \'Products.SiteAccess\', \'Shared\', \'Testing\', \'ZPublisher\', \'ZTUtils\',\n+ \'Zope2\', \'webdav\', \'zmi\',\n+ # ExtensionClass own provided namespaces\n+ \'ExtensionClass\', \'ComputedAttribute\', \'MethodObject\',\n+ # Zope dependencies\n+ \'AccessControl\', \'Acquisition\', \'AuthEncoding\', \'beautifulsoup4\', \'BTrees\',\n+ \'cffi\', \'Chameleon\', \'DateTime\', \'DocumentTemplate\',\n+ \'MultiMapping\', \'multipart\', \'PasteDeploy\', \'Persistence\', \'persistent\',\n+ \'pycparser\', \'python-gettext\', \'pytz\', \'RestrictedPython\', \'roman\',\n+ \'soupsieve\', \'transaction\', \'waitress\', \'WebOb\', \'WebTest\', \'WSGIProxy2\',\n+ \'z3c.pt\', \'zc.lockfile\', \'ZConfig\', \'zExceptions\', \'ZODB\', \'zodbpickle\',\n+ \'zope.annotation\', \'zope.browser\', \'zope.browsermenu\', \'zope.browserpage\',\n+ \'zope.browserresource\', \'zope.cachedescriptors\', \'zope.component\',\n+ \'zope.configuration\', \'zope.container\', \'zope.contentprovider\',\n+ \'zope.contenttype\', \'zope.datetime\', \'zope.deferredimport\',\n+ \'zope.deprecation\', \'zope.dottedname\', \'zope.event\', \'zope.exceptions\',\n+ \'zope.filerepresentation\', \'zope.globalrequest\', \'zope.hookable\',\n+ \'zope.i18n\', \'zope.i18nmessageid\', \'zope.interface\', \'zope.lifecycleevent\',\n+ \'zope.location\', \'zope.pagetemplate\', \'zope.processlifetime\', \'zope.proxy\',\n+ \'zope.ptresource\', \'zope.publisher\', \'zope.schema\', \'zope.security\',\n+ \'zope.sequencesort\', \'zope.site\', \'zope.size\', \'zope.structuredtext\',\n+ \'zope.tal\', \'zope.tales\', \'zope.testbrowser\', \'zope.testing\',\n+ \'zope.traversing\', \'zope.viewlet\'\n+]\n+\'Products.CMFCore\' = [\n+ \'docutils\', \'five.localsitemanager\', \'Missing\', \'Products.BTreeFolder2\',\n+ \'Products.GenericSetup\', \'Products.MailHost\', \'Products.PythonScripts\',\n+ \'Products.StandardCacheManagers\', \'Products.ZCatalog\', \'Record\',\n+ \'zope.sendmail\', \'Zope\'\n+]\n+\'plone.base\' = [\n+ \'plone.batching\', \'plone.registry\', \'plone.schema\',\'plone.z3cform\',\n+ \'Products.CMFCore\', \'Products.CMFDynamicViewFTI\',\n+]\n+python-dateutil = [\'dateutil\']\n+ignore-packages = [\'robotide\', \'collective.js.speakjs\', \'watchdog\', \'robotframework-debuglibrary\', \'robotframework-ride\', \'robotframework-selenium2library\', \'robotframework-seleniumtestability\', \'sphinxcontrib-robotdoc\', \'robotsuite\', \'robotframework-browser\' ]\n+Pillow = [\'PIL\']\n+robotframework = [\'robot\']\n+\n+##\n+# Add extra configuration options in .meta.toml:\n+# [pyproject]\n+# dependencies_ignores = "[\'zestreleaser.towncrier\']"\n+# dependencies_mappings = [\n+# "gitpython = [\'git\']",\n+# "pygithub = [\'github\']",\n+# ]\n+##\n+\n+[tool.check-manifest]\n+ignore = [\n+ ".editorconfig",\n+ ".meta.toml",\n+ ".pre-commit-config.yaml",\n+ "tox.ini",\n+ ".flake8",\n+ "mx.ini",\n+\n+]\n+##\n+# Add extra configuration options in .meta.toml:\n+# [pyproject]\n+# check_manifest_ignores = """\n+# "*.map.js",\n+# "*.pyc",\n+# """\n+##\n+\n+\n+##\n+# Add extra configuration options in .meta.toml:\n+# [pyproject]\n+# extra_lines = """\n+# _your own configuration lines_\n+# """\n+##\ndiff --git a/setup.cfg b/setup.cfg\ndeleted file mode 100644\nindex 4f3a3e25..00000000\n--- a/setup.cfg\n+++ /dev/null\n@@ -1,14 +0,0 @@\n-[check-manifest]\n-ignore =\n- *.cfg\n- requirements.txt\n-\n-[isort]\n-profile = black\n-force_alphabetical_sort = True\n-force_single_line = True\n-lines_after_imports = 2\n-\n-[bdist_wheel]\n-# Py3 only\n-universal = 0\ndiff --git a/tox.ini b/tox.ini\nnew file mode 100644\nindex 00000000..0cb1d9e0\n--- /dev/null\n+++ b/tox.ini\n@@ -0,0 +1,210 @@\n+# Generated from:\n+# https://github.com/plone/meta/tree/master/config/default\n+# See the inline comments on how to expand/tweak this configuration file\n+[tox]\n+# We need 4.4.0 for constrain_package_deps.\n+min_version = 4.4.0\n+envlist =\n+ lint\n+ test\n+ dependencies\n+\n+\n+##\n+# Add extra configuration options in .meta.toml:\n+# [tox]\n+# envlist_lines = """\n+# my_other_environment\n+# """\n+# config_lines = """\n+# my_extra_top_level_tox_configuration_lines\n+# """\n+##\n+\n+[testenv]\n+skip_install = true\n+allowlist_externals =\n+ echo\n+ false\n+# Make sure typos like `tox -e formaat` are caught instead of silently doing nothing.\n+# See https://github.com/tox-dev/tox/issues/2858.\n+commands =\n+ echo "Unrecognized environment name {envname}"\n+ false\n+\n+[testenv:init]\n+description = Prepare environment\n+skip_install = true\n+commands =\n+ echo "Initial setup complete"\n+\n+\n+[testenv:format]\n+description = automatically reformat code\n+skip_install = true\n+deps =\n+ pre-commit\n+commands =\n+ pre-commit run -a pyupgrade\n+ pre-commit run -a isort\n+ pre-commit run -a black\n+ pre-commit run -a zpretty\n+\n+[testenv:lint]\n+description = run linters that will help improve the code style\n+skip_install = true\n+deps =\n+ pre-commit\n+commands =\n+ pre-commit run -a\n+\n+[testenv:dependencies]\n+description = check if the package defines all its dependencies\n+skip_install = true\n+deps =\n+ build\n+ z3c.dependencychecker==2.11\n+commands =\n+ python -m build --sdist --no-isolation\n+ dependencychecker\n+\n+[testenv:dependencies-graph]\n+description = generate a graph out of the dependencies of the package\n+skip_install = false\n+allowlist_externals =\n+ sh\n+deps =\n+ pipdeptree==2.5.1\n+ graphviz # optional dependency of pipdeptree\n+commands =\n+ sh -c \'pipdeptree --exclude setuptools,wheel,pipdeptree,zope.interface,zope.component --graph-output svg > dependencies.svg\'\n+\n+[testenv:test]\n+description = run the distribution tests\n+use_develop = true\n+skip_install = false\n+constrain_package_deps = true\n+set_env =\n+ ROBOT_BROWSER=headlesschrome\n+\n+##\n+# Specify extra test environment variables in .meta.toml:\n+# [tox]\n+# test_environment_variables = """\n+# PIP_EXTRA_INDEX_URL=https://my-pypi.my-server.com/\n+# """\n+#\n+# Set constrain_package_deps .meta.toml:\n+# [tox]\n+# constrain_package_deps = "false"\n+##\n+deps =\n+ zope.testrunner\n+ -c https://dist.plone.org/release/6.0-dev/constraints.txt\n+ \n+##\n+# Specify additional deps in .meta.toml:\n+# [tox]\n+# test_deps_additional = "-esources/plonegovbr.portal_base[test]"\n+#\n+# Specify a custom constraints file in .meta.toml:\n+# [tox]\n+# constraints_file = "https://my-server.com/constraints.txt"\n+##\n+commands =\n+ rfbrowser init\n+ zope-testrunner --all --test-path={toxinidir}/src -s plone.app.robotframework {posargs}\n+extras =\n+ test\n+\n+##\n+# Add extra configuration options in .meta.toml:\n+# [tox]\n+# test_extras = """\n+# tests\n+# widgets\n+# """\n+##\n+\n+[testenv:coverage]\n+description = get a test coverage report\n+use_develop = true\n+skip_install = false\n+constrain_package_deps = true\n+set_env =\n+ ROBOT_BROWSER=headlesschrome\n+\n+##\n+# Specify extra test environment variables in .meta.toml:\n+# [tox]\n+# test_environment_variables = """\n+# PIP_EXTRA_INDEX_URL=https://my-pypi.my-server.com/\n+# """\n+##\n+deps =\n+ coverage\n+ zope.testrunner\n+ -c https://dist.plone.org/release/6.0-dev/constraints.txt\n+ \n+commands =\n+ rfbrowser init\n+ coverage run --branch --source plone.app.robotframework {envbindir}/zope-testrunner --quiet --all --test-path={toxinidir}/src -s plone.app.robotframework {posargs}\n+ coverage report -m --format markdown\n+ coverage xml\n+extras =\n+ test\n+\n+\n+[testenv:release-check]\n+description = ensure that the distribution is ready to release\n+skip_install = true\n+deps =\n+ twine\n+ build\n+ towncrier\n+ -c https://dist.plone.org/release/6.0-dev/constraints.txt\n+ \n+commands =\n+ # fake version to not have to install the package\n+ # we build the change log as news entries might break\n+ # the README that is displayed on PyPI\n+ towncrier build --version=100.0.0 --yes\n+ python -m build --sdist --no-isolation\n+ twine check dist/*\n+\n+[testenv:circular]\n+description = ensure there are no cyclic dependencies\n+use_develop = true\n+skip_install = false\n+set_env =\n+\n+##\n+# Specify extra test environment variables in .meta.toml:\n+# [tox]\n+# test_environment_variables = """\n+# PIP_EXTRA_INDEX_URL=https://my-pypi.my-server.com/\n+# """\n+##\n+allowlist_externals =\n+ sh\n+deps =\n+ pipdeptree\n+ pipforester\n+ -c https://dist.plone.org/release/6.0-dev/constraints.txt\n+ \n+commands =\n+ # Generate the full dependency tree\n+ sh -c \'pipdeptree -j > forest.json\'\n+ # Generate a DOT graph with the circular dependencies, if any\n+ pipforester -i forest.json -o forest.dot --cycles\n+ # Report if there are any circular dependencies, i.e. error if there are any\n+ pipforester -i forest.json --check-cycles -o /dev/null\n+\n+\n+##\n+# Add extra configuration options in .meta.toml:\n+# [tox]\n+# extra_lines = """\n+# _your own configuration lines_\n+# """\n+##\n' -Repository: plone.app.content +Repository: plone.app.robotframework Branch: refs/heads/master -Date: 2023-10-18T11:30:23+02:00 +Date: 2023-10-15T18:28:12+02:00 Author: Gil Forcada Codinachs (gforcada) -Commit: https://github.com/plone/plone.app.content/commit/5038b5390dcf346691b8b1149e55ba156ac34b6e +Commit: https://github.com/plone/plone.app.robotframework/commit/9742811d44b3cecb70306c9039a81246dec31d36 -chore: pyupgrade +chore: drop old files Files changed: -M plone/app/content/tests/test_actions.py +D buildout.cfg +D docs.cfg +D requirements.txt -b'diff --git a/plone/app/content/tests/test_actions.py b/plone/app/content/tests/test_actions.py\nindex 62108fd..a9bd5b3 100644\n--- a/plone/app/content/tests/test_actions.py\n+++ b/plone/app/content/tests/test_actions.py\n@@ -37,7 +37,7 @@ def setUp(self):\n self.browser = Browser(self.layer["app"])\n self.browser.handleErrors = False\n self.browser.addHeader(\n- "Authorization", "Basic {}:{}".format(TEST_USER_NAME, TEST_USER_PASSWORD)\n+ "Authorization", f"Basic {TEST_USER_NAME}:{TEST_USER_PASSWORD}"\n )\n \n def tearDown(self):\n@@ -124,7 +124,7 @@ def prepare_for_acquisition_tests(self):\n browser_2 = Browser(self.layer["app"])\n browser_2.handleErrors = False\n browser_2.addHeader(\n- "Authorization", "Basic {}:{}".format(TEST_USER_NAME, TEST_USER_PASSWORD)\n+ "Authorization", f"Basic {TEST_USER_NAME}:{TEST_USER_PASSWORD}"\n )\n \n # return the id of the root page, the nested page itself, and the\n' +b'diff --git a/buildout.cfg b/buildout.cfg\ndeleted file mode 100644\nindex 3026c2e..0000000\n--- a/buildout.cfg\n+++ /dev/null\n@@ -1,59 +0,0 @@\n-[buildout]\n-extends =\n- https://raw.githubusercontent.com/collective/buildout.plonetest/master/test-5.1.x.cfg\n- versions.cfg\n-parts +=\n- docs\n- libdoc\n- robot\n-package-name = plone.app.robotframework\n-package-extras = [test,speak]\n-test-eggs = Pillow\n-develop = .\n-versions = versions\n-\n-[versions]\n-setuptools =\n-zc.buildout =\n-plone.app.robotframework =\n-\n-[instance]\n-zcml =\n-\n-[docs]\n-recipe = collective.recipe.sphinxbuilder\n-eggs =\n- Pillow\n- plone.app.robotframework [docs]\n-\n-[libdoc]\n-recipe = zc.recipe.egg\n-eggs = plone.app.robotframework [docs]\n-entry-points = libdoc=robot.libdoc:libdoc_cli\n-scripts = libdoc\n-arguments = sys.argv[1:]\n-\n-[environment]\n-zope_i18n_compile_mo_files = true\n-ROBOT_SELENIUM2LIBRARY_RUN_ON_FAILURE = Capture page screenshot and log source\n-\n-[test]\n-environment = environment\n-\n-[robot]\n-recipe = zc.recipe.egg\n-eggs =\n- Pillow\n- plone.app.robotframework [test,ride,speak,reload,debug]\n-\n-[nix]\n-recipe = collective.recipe.nix\n-name = default\n-eggs =\n- ${test:eggs}\n- ${robot:eggs}\n-nixpkgs =\n- watchdog=pythonPackages.watchdog\n- zc.buildout=pythonPackages.zc_buildout_nix\n-outputs = default.nix\n-allow-from-cache = true\ndiff --git a/docs.cfg b/docs.cfg\ndeleted file mode 100644\nindex 5275a2b..0000000\n--- a/docs.cfg\n+++ /dev/null\n@@ -1,7 +0,0 @@\n-[buildout]\n-parts = sphinxbuilder\n-index = http://pypi.python.org/simple\n-\n-[sphinxbuilder]\n-recipe = collective.recipe.sphinxbuilder\n-eggs = sphinxcontrib-robotdoc\ndiff --git a/requirements.txt b/requirements.txt\ndeleted file mode 100644\nindex bba2416..0000000\n--- a/requirements.txt\n+++ /dev/null\n@@ -1,2 +0,0 @@\n-setuptools==33.1.1\n-zc.buildout==2.12.1\n' -Repository: plone.app.content +Repository: plone.app.robotframework Branch: refs/heads/master -Date: 2023-10-18T11:30:24+02:00 +Date: 2023-10-15T18:28:12+02:00 Author: Gil Forcada Codinachs (gforcada) -Commit: https://github.com/plone/plone.app.content/commit/feb7a04953c4ee3d6df05484a15ec8d21c260a2d +Commit: https://github.com/plone/plone.app.robotframework/commit/edafb601f848ade2c3af0e40d3cd85c4382775a8 -chore: isort +chore: pyupgrade Files changed: -M plone/app/content/tests/test_actions.py -M plone/app/content/utils.py - -b"diff --git a/plone/app/content/tests/test_actions.py b/plone/app/content/tests/test_actions.py\nindex a9bd5b3..121b9e3 100644\n--- a/plone/app/content/tests/test_actions.py\n+++ b/plone/app/content/tests/test_actions.py\n@@ -8,7 +8,8 @@\n from plone.locking.interfaces import ILockable\n from plone.testing.zope import Browser\n from z3c.form.interfaces import IFormLayer\n-from zExceptions import Unauthorized, NotFound\n+from zExceptions import NotFound\n+from zExceptions import Unauthorized\n from zope.component import getMultiAdapter\n from zope.interface import alsoProvides\n \ndiff --git a/plone/app/content/utils.py b/plone/app/content/utils.py\nindex d61cf02..a6131bb 100644\n--- a/plone/app/content/utils.py\n+++ b/plone/app/content/utils.py\n@@ -8,6 +8,7 @@\n # use simplejson because it's ahead of stdlib and supports more types\n import simplejson\n \n+\n try:\n from z3c.relationfield.relation import RelationValue\n except ImportError:\n" - -Repository: plone.app.content - - -Branch: refs/heads/master -Date: 2023-10-18T11:30:24+02:00 -Author: Gil Forcada Codinachs (gforcada) -Commit: https://github.com/plone/plone.app.content/commit/a61a7d2335b0d24b15cae9d9422b376a948177e6 +M src/plone/app/robotframework/server.py -chore: black +b'diff --git a/src/plone/app/robotframework/server.py b/src/plone/app/robotframework/server.py\nindex 0015186..55b8b4f 100644\n--- a/src/plone/app/robotframework/server.py\n+++ b/src/plone/app/robotframework/server.py\n@@ -321,7 +321,7 @@ def zodb_setup(self, layer_dotted_name=None):\n if HAS_VERBOSE_CONSOLE:\n print(\n WAIT(\n- "Test set up {}.{}".format(layer.__module__, layer.__name__)\n+ f"Test set up {layer.__module__}.{layer.__name__}"\n )\n )\n layer.testSetUp()\n' -Files changed: -M plone/app/content/browser/actions.py -M plone/app/content/browser/constraintypes.py -M plone/app/content/browser/content_status_history.py -M plone/app/content/browser/contents/__init__.py -M plone/app/content/browser/contents/copy.py -M plone/app/content/browser/contents/cut.py -M plone/app/content/browser/contents/delete.py -M plone/app/content/browser/contents/paste.py -M plone/app/content/browser/contents/properties.py -M plone/app/content/browser/contents/rename.py -M plone/app/content/browser/contents/tags.py -M plone/app/content/browser/contents/workflow.py -M plone/app/content/browser/i18n.py -M plone/app/content/browser/selection.py -M plone/app/content/testing.py -M plone/app/content/tests/test_adding.py -M plone/app/content/tests/test_content_status_modify.py -M plone/app/content/tests/test_folder.py -M plone/app/content/tests/test_namechooser_unit.py -M plone/app/content/tests/test_non_ascii_characters_in_workflow_state.py -M plone/app/content/tests/test_selectdefaultpage.py -M plone/app/content/tests/test_widgets.py - -b'diff --git a/plone/app/content/browser/actions.py b/plone/app/content/browser/actions.py\nindex b939b34..6f16e53 100644\n--- a/plone/app/content/browser/actions.py\n+++ b/plone/app/content/browser/actions.py\n@@ -38,7 +38,6 @@ def is_locked(self):\n \n \n class DeleteConfirmationForm(form.Form, LockingBase):\n-\n fields = field.Fields()\n template = ViewPageTemplateFile("templates/delete_confirmation.pt")\n enableCSRFProtection = True\n@@ -140,7 +139,6 @@ class IRenameForm(Interface):\n \n \n class RenameForm(form.Form):\n-\n fields = field.Fields(IRenameForm)\n template = ViewPageTemplateFile("templates/object_rename.pt")\n enableCSRFProtection = True\ndiff --git a/plone/app/content/browser/constraintypes.py b/plone/app/content/browser/constraintypes.py\nindex 6d8fd04..1074660 100644\n--- a/plone/app/content/browser/constraintypes.py\n+++ b/plone/app/content/browser/constraintypes.py\n@@ -61,7 +61,6 @@ def __call__(self, context):\n \n \n class IConstrainForm(Interface):\n-\n constrain_types_mode = Choice(\n title=_("label_type_restrictions", default="Type restrictions"),\n description=_(\n@@ -140,7 +139,6 @@ def secondary_types(self):\n \n \n class ConstrainsFormView(AutoExtensibleForm, form.EditForm):\n-\n schema = IConstrainForm\n label = _(\n "heading_set_content_type_restrictions",\ndiff --git a/plone/app/content/browser/content_status_history.py b/plone/app/content/browser/content_status_history.py\nindex b2882b9..d181077 100644\n--- a/plone/app/content/browser/content_status_history.py\n+++ b/plone/app/content/browser/content_status_history.py\n@@ -48,7 +48,6 @@ class ContentStatusHistoryDatesForm(form.Form):\n \n \n class ContentStatusHistoryView(BrowserView):\n-\n template = ViewPageTemplateFile("templates/content_status_history.pt")\n \n def __init__(self, context, request):\n@@ -66,9 +65,8 @@ def __call__(\n effective_date=None,\n expiration_date=None,\n include_children=False,\n- *args\n+ *args,\n ):\n-\n data = self.dates_form.extractData()\n if self.request.get("form.widgets.effective_date-calendar", None) and data:\n effective_date = data[0]["effective_date"].strftime("%Y-%m-%d %H:%M")\ndiff --git a/plone/app/content/browser/contents/__init__.py b/plone/app/content/browser/contents/__init__.py\nindex eaafd1c..d122c6f 100644\n--- a/plone/app/content/browser/contents/__init__.py\n+++ b/plone/app/content/browser/contents/__init__.py\n@@ -26,7 +26,6 @@\n \n \n class ContentsBaseAction(BrowserView):\n-\n success_msg = _("Success")\n failure_msg = _("Failure")\n required_obj_permission = None\n@@ -293,7 +292,6 @@ def __call__(self):\n \n \n class ContextInfo(BrowserView):\n-\n attributes = [\n "CreationDate",\n "Creator",\ndiff --git a/plone/app/content/browser/contents/copy.py b/plone/app/content/browser/contents/copy.py\nindex 015b995..4259bd7 100644\n--- a/plone/app/content/browser/contents/copy.py\n+++ b/plone/app/content/browser/contents/copy.py\n@@ -10,7 +10,6 @@\n \n @implementer(IStructureAction)\n class CopyAction:\n-\n order = 2\n \n def __init__(self, context, request):\ndiff --git a/plone/app/content/browser/contents/cut.py b/plone/app/content/browser/contents/cut.py\nindex e785931..d723330 100644\n--- a/plone/app/content/browser/contents/cut.py\n+++ b/plone/app/content/browser/contents/cut.py\n@@ -11,7 +11,6 @@\n \n @implementer(IStructureAction)\n class CutAction:\n-\n order = 1\n \n def __init__(self, context, request):\ndiff --git a/plone/app/content/browser/contents/delete.py b/plone/app/content/browser/contents/delete.py\nindex 5adac14..8eb6018 100644\n--- a/plone/app/content/browser/contents/delete.py\n+++ b/plone/app/content/browser/contents/delete.py\n@@ -16,7 +16,6 @@\n \n @implementer(IStructureAction)\n class DeleteAction:\n-\n template = ViewPageTemplateFile("templates/delete.pt")\n order = 4\n \ndiff --git a/plone/app/content/browser/contents/paste.py b/plone/app/content/browser/contents/paste.py\nindex 0250760..52c0965 100644\n--- a/plone/app/content/browser/contents/paste.py\n+++ b/plone/app/content/browser/contents/paste.py\n@@ -9,7 +9,6 @@\n \n @implementer(IStructureAction)\n class PasteAction:\n-\n order = 3\n \n def __init__(self, context, request):\ndiff --git a/plone/app/content/browser/contents/properties.py b/plone/app/content/browser/contents/properties.py\nindex aba4725..2395825 100644\n--- a/plone/app/content/browser/contents/properties.py\n+++ b/plone/app/content/browser/contents/properties.py\n@@ -20,7 +20,6 @@\n \n @implementer(IStructureAction)\n class PropertiesAction:\n-\n template = ViewPageTemplateFile("templates/properties.pt")\n order = 8\n \n@@ -54,7 +53,6 @@ class PropertiesActionView(ContentsBaseAction):\n required_obj_permission = "Modify portal content"\n \n def __call__(self):\n-\n if self.request.form.get("render") == "yes":\n lang_factory = getUtility(\n IVocabularyFactory, "plone.app.vocabularies.SupportedContentLanguages"\n@@ -95,7 +93,6 @@ def __call__(self):\n return super().__call__()\n \n def action(self, obj, bypass_recurse=False):\n-\n if check_default_page_via_view(obj, self.request):\n self.action(obj.aq_parent, bypass_recurse=True)\n recurse = self.recurse and not bypass_recurse\ndiff --git a/plone/app/content/browser/contents/rename.py b/plone/app/content/browser/contents/rename.py\nindex 25ad37f..eb2a9d4 100644\n--- a/plone/app/content/browser/contents/rename.py\n+++ b/plone/app/content/browser/contents/rename.py\n@@ -23,7 +23,6 @@\n \n @implementer(IStructureAction)\n class RenameAction:\n-\n template = ViewPageTemplateFile("templates/rename.pt")\n order = 5\n \ndiff --git a/plone/app/content/browser/contents/tags.py b/plone/app/content/browser/contents/tags.py\nindex 01e8f14..fe18d20 100644\n--- a/plone/app/content/browser/contents/tags.py\n+++ b/plone/app/content/browser/contents/tags.py\n@@ -9,7 +9,6 @@\n \n @implementer(IStructureAction)\n class TagsAction:\n-\n template = ViewPageTemplateFile("templates/tags.pt")\n order = 6\n \ndiff --git a/plone/app/content/browser/contents/workflow.py b/plone/app/content/browser/contents/workflow.py\nindex a2a90a0..8b5a5bb 100644\n--- a/plone/app/content/browser/contents/workflow.py\n+++ b/plone/app/content/browser/contents/workflow.py\n@@ -14,7 +14,6 @@\n \n @implementer(IStructureAction)\n class WorkflowAction:\n-\n template = ViewPageTemplateFile("templates/workflow.pt")\n order = 7\n \ndiff --git a/plone/app/content/browser/i18n.py b/plone/app/content/browser/i18n.py\nindex 415508a..ebabfc1 100644\n--- a/plone/app/content/browser/i18n.py\n+++ b/plone/app/content/browser/i18n.py\n@@ -35,7 +35,6 @@ def _gettext_catalog(self, domain, language):\n return _catalog\n \n def __call__(self, domain=None, language=None):\n-\n if domain is None:\n catalog = {}\n else:\ndiff --git a/plone/app/content/browser/selection.py b/plone/app/content/browser/selection.py\nindex 1d5a732..aaf5c56 100644\n--- a/plone/app/content/browser/selection.py\n+++ b/plone/app/content/browser/selection.py\n@@ -49,7 +49,9 @@ def __call__(self):\n self.request.response.redirect(context_view_url)\n \n if self.request.form.get("form.button.Save") and not template_id:\n- IStatusMessage(self.request).add("Please select a template.", type="warning")\n+ IStatusMessage(self.request).add(\n+ "Please select a template.", type="warning"\n+ )\n \n if self.request.form.get("form.button.Save") and template_id:\n # Make sure this is a valid template\ndiff --git a/plone/app/content/testing.py b/plone/app/content/testing.py\nindex b5a85ce..20d1670 100644\n--- a/plone/app/content/testing.py\n+++ b/plone/app/content/testing.py\n@@ -45,7 +45,6 @@ def ExampleFunctionVocabulary(context, query=None):\n \n \n class PloneAppContent(PloneSandboxLayer):\n-\n defaultBases = (PLONE_FIXTURE,)\n \n USER_NAME = "johndoe"\ndiff --git a/plone/app/content/tests/test_adding.py b/plone/app/content/tests/test_adding.py\nindex b5b9bfb..b813c5e 100644\n--- a/plone/app/content/tests/test_adding.py\n+++ b/plone/app/content/tests/test_adding.py\n@@ -5,7 +5,6 @@\n \n \n class AddingTests(unittest.TestCase):\n-\n layer = PLONE_APP_CONTENT_INTEGRATION_TESTING\n \n def setUp(self):\ndiff --git a/plone/app/content/tests/test_content_status_modify.py b/plone/app/content/tests/test_content_status_modify.py\nindex e1e782e..7b53a48 100644\n--- a/plone/app/content/tests/test_content_status_modify.py\n+++ b/plone/app/content/tests/test_content_status_modify.py\n@@ -124,7 +124,6 @@ def testEditorCanSubmitButNotPublish(self):\n \n \n class TestContentStatusModifyFunctional(unittest.TestCase):\n-\n layer = PLONE_APP_CONTENT_DX_FUNCTIONAL_TESTING\n \n def setUp(self):\ndiff --git a/plone/app/content/tests/test_folder.py b/plone/app/content/tests/test_folder.py\nindex 01d2764..eef41bf 100644\n--- a/plone/app/content/tests/test_folder.py\n+++ b/plone/app/content/tests/test_folder.py\n@@ -51,7 +51,6 @@ def setUp(self):\n \n \n class DXBaseTest(BaseTest):\n-\n layer = PLONE_APP_CONTENT_DX_INTEGRATION_TESTING\n \n def setUp(self):\n@@ -126,7 +125,6 @@ def testCreators(self):\n \n \n class WorkflowTest(BaseTest):\n-\n layer = PLONE_APP_CONTENT_DX_FUNCTIONAL_TESTING\n \n def convertDateTimeToIndexRepr(self, date):\n@@ -166,7 +164,6 @@ def testStateChange(self):\n \n \n class RenameTest(BaseTest):\n-\n layer = PLONE_APP_CONTENT_DX_INTEGRATION_TESTING\n \n def test_folder_rename_objects(self):\n@@ -204,7 +201,6 @@ def test_default_page_updated_on_rename_objects(self):\n \n \n class ContextInfoTest(BaseTest):\n-\n layer = PLONE_APP_CONTENT_DX_INTEGRATION_TESTING\n \n def testStateChange(self):\ndiff --git a/plone/app/content/tests/test_namechooser_unit.py b/plone/app/content/tests/test_namechooser_unit.py\nindex ec3df75..d9d3f66 100644\n--- a/plone/app/content/tests/test_namechooser_unit.py\n+++ b/plone/app/content/tests/test_namechooser_unit.py\n@@ -13,7 +13,6 @@\n \n \n class NameChooserTest(unittest.TestCase):\n-\n layer = PLONE_APP_CONTENT_INTEGRATION_TESTING\n \n def setUp(self):\ndiff --git a/plone/app/content/tests/test_non_ascii_characters_in_workflow_state.py b/plone/app/content/tests/test_non_ascii_characters_in_workflow_state.py\nindex 386e069..cef6398 100644\n--- a/plone/app/content/tests/test_non_ascii_characters_in_workflow_state.py\n+++ b/plone/app/content/tests/test_non_ascii_characters_in_workflow_state.py\n@@ -11,7 +11,6 @@\n \n \n class TestNonAsciiCharactersWorkflow(unittest.TestCase):\n-\n layer = PLONE_APP_CONTENT_NON_ASCII_INTEGRATION_TESTING\n \n def setUp(self):\ndiff --git a/plone/app/content/tests/test_selectdefaultpage.py b/plone/app/content/tests/test_selectdefaultpage.py\nindex 3af4f1c..ff3a285 100644\n--- a/plone/app/content/tests/test_selectdefaultpage.py\n+++ b/plone/app/content/tests/test_selectdefaultpage.py\n@@ -28,12 +28,13 @@\n \n \n class SelectDefaultPageDXTestCase(unittest.TestCase):\n-\n layer = PLONE_APP_CONTENT_DX_FUNCTIONAL_TESTING\n \n def setUp(self):\n self.portal = self.layer["portal"]\n- self.portal.acl_users.userFolderAddUser("editor", TEST_USER_PASSWORD, ["Editor"], [])\n+ self.portal.acl_users.userFolderAddUser(\n+ "editor", TEST_USER_PASSWORD, ["Editor"], []\n+ )\n \n self._create_structure()\n transaction.commit()\ndiff --git a/plone/app/content/tests/test_widgets.py b/plone/app/content/tests/test_widgets.py\nindex c357713..d87b619 100644\n--- a/plone/app/content/tests/test_widgets.py\n+++ b/plone/app/content/tests/test_widgets.py\n@@ -69,7 +69,6 @@ def _disable_permission_checker(context):\n \n \n class BrowserTest(unittest.TestCase):\n-\n layer = PLONE_APP_CONTENT_DX_INTEGRATION_TESTING\n \n def setUp(self):\n@@ -664,7 +663,6 @@ def testGetMimeIcon(self):\n \n \n class FunctionalBrowserTest(unittest.TestCase):\n-\n layer = PLONE_APP_CONTENT_DX_FUNCTIONAL_TESTING\n \n def setUp(self):\n' - -Repository: plone.app.content +Repository: plone.app.robotframework Branch: refs/heads/master -Date: 2023-10-18T11:30:24+02:00 +Date: 2023-10-15T18:28:12+02:00 Author: Gil Forcada Codinachs (gforcada) -Commit: https://github.com/plone/plone.app.content/commit/7b413b1b64d969e54f40d956c185864cda7cff16 +Commit: https://github.com/plone/plone.app.robotframework/commit/11aea772398106c0a58e077854c1c1ed6c419fe4 -feat: pyroma +chore: isort Files changed: -M setup.py +M src/plone/app/robotframework/testing.py -b'diff --git a/setup.py b/setup.py\nindex fc1f142..9a43d8b 100644\n--- a/setup.py\n+++ b/setup.py\n@@ -38,6 +38,7 @@\n namespace_packages=["plone", "plone.app"],\n include_package_data=True,\n zip_safe=False,\n+ python_requires=">=3.8",\n extras_require=dict(\n test=[\n "plone.app.contenttypes",\n' +b'diff --git a/src/plone/app/robotframework/testing.py b/src/plone/app/robotframework/testing.py\nindex 7086070..744ac34 100644\n--- a/src/plone/app/robotframework/testing.py\n+++ b/src/plone/app/robotframework/testing.py\n@@ -18,8 +18,8 @@\n from plone.app.testing import ploneSite\n from plone.testing import Layer\n from plone.testing import zope as zope_testing\n-from plone.testing.zope import WSGIServer\n from plone.testing.zope import WSGI_SERVER_FIXTURE\n+from plone.testing.zope import WSGIServer\n from Products.MailHost.interfaces import IMailHost\n from robot.libraries.BuiltIn import BuiltIn\n from webtest.http import StopableWSGIServer\n' -Repository: plone.app.content +Repository: plone.app.robotframework Branch: refs/heads/master -Date: 2023-10-18T11:30:24+02:00 +Date: 2023-10-15T18:28:12+02:00 Author: Gil Forcada Codinachs (gforcada) -Commit: https://github.com/plone/plone.app.content/commit/8485180a1e08004ac7463e9dd8e7063417798086 +Commit: https://github.com/plone/plone.app.robotframework/commit/6954b93d9abd25d2ed1e2cf3c6409f77f2b1aaae -feat: flake8 +chore: black Files changed: -M plone/app/content/browser/constraintypes.py -M plone/app/content/browser/contents/properties.py +M src/plone/app/robotframework/reload.py +M src/plone/app/robotframework/remote.py +M src/plone/app/robotframework/saucelabs.py +M src/plone/app/robotframework/server.py +M src/plone/app/robotframework/testing.py +M src/plone/app/robotframework/tests/test_content.py -b'diff --git a/plone/app/content/browser/constraintypes.py b/plone/app/content/browser/constraintypes.py\nindex 1074660..1b83a09 100644\n--- a/plone/app/content/browser/constraintypes.py\n+++ b/plone/app/content/browser/constraintypes.py\n@@ -1,5 +1,4 @@\n from plone.autoform.form import AutoExtensibleForm\n-from plone.base import PloneMessageFactory as _\n from plone.base.interfaces import ISelectableConstrainTypes\n from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile\n from z3c.form import button\ndiff --git a/plone/app/content/browser/contents/properties.py b/plone/app/content/browser/contents/properties.py\nindex 2395825..c51e8a7 100644\n--- a/plone/app/content/browser/contents/properties.py\n+++ b/plone/app/content/browser/contents/properties.py\n@@ -5,9 +5,7 @@\n from plone.app.widgets.utils import get_datetime_options\n from plone.base import PloneMessageFactory as _\n from plone.base.defaultpage import check_default_page_via_view\n-from plone.dexterity.interfaces import IDexterityContent\n from Products.CMFCore.interfaces._content import IFolderish\n-from Products.CMFCore.utils import getToolByName\n from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile\n from zope.component import getUtility\n from zope.component.hooks import getSite\n' +b'diff --git a/src/plone/app/robotframework/reload.py b/src/plone/app/robotframework/reload.py\nindex 201aa65..614b882 100644\n--- a/src/plone/app/robotframework/reload.py\n+++ b/src/plone/app/robotframework/reload.py\n@@ -19,7 +19,6 @@ def ERROR(msg):\n \n \n class Watcher(FileSystemEventHandler):\n-\n allowed_extensions = {"po", "pt", "py", "xml", "csv", "zcml"}\n \n def __init__(self, paths, forkloop, minimum_wait=2.0):\n@@ -74,7 +73,6 @@ def on_any_event(self, event):\n \n class ForkLoop:\n def __init__(self):\n-\n self.fork = True # Must be \'True\' to create new child on start\n self.active = False\n self.pause = False\ndiff --git a/src/plone/app/robotframework/remote.py b/src/plone/app/robotframework/remote.py\nindex 2967001..e210e16 100644\n--- a/src/plone/app/robotframework/remote.py\n+++ b/src/plone/app/robotframework/remote.py\n@@ -51,7 +51,6 @@ def run_keyword(self, name, args, kwargs={}):\n \n \n class RemoteLibraryLayer(Layer):\n-\n defaultBases = (PLONE_FIXTURE,)\n libraryBases = ()\n \ndiff --git a/src/plone/app/robotframework/saucelabs.py b/src/plone/app/robotframework/saucelabs.py\nindex 59c92cb..978327b 100644\n--- a/src/plone/app/robotframework/saucelabs.py\n+++ b/src/plone/app/robotframework/saucelabs.py\n@@ -13,12 +13,7 @@\n class SauceLabs:\n def report_sauce_status(self, name, status, tags=[], remote_url=""):\n """Report test status and tags to SauceLabs"""\n- job_id = (\n- BuiltIn()\n- .get_library_instance("Selenium2Library")\n- .driver\n- .session_id\n- )\n+ job_id = BuiltIn().get_library_instance("Selenium2Library").driver.session_id\n \n if USERNAME_ACCESS_KEY.match(remote_url):\n username, access_key = USERNAME_ACCESS_KEY.findall(remote_url)[0][1:]\ndiff --git a/src/plone/app/robotframework/server.py b/src/plone/app/robotframework/server.py\nindex 55b8b4f..c21ba8b 100644\n--- a/src/plone/app/robotframework/server.py\n+++ b/src/plone/app/robotframework/server.py\n@@ -47,7 +47,6 @@ def READY(msg):\n \n \n def start(zope_layer_dotted_name):\n-\n print(WAIT("Starting Zope robot server"))\n \n zsl = Zope2Server()\n@@ -98,7 +97,6 @@ def start_reload(\n preload_layer_dotted_name="plone.app.testing.PLONE_FIXTURE",\n extensions=None,\n ):\n-\n print(WAIT("Starting Zope robot server"))\n \n zsl = Zope2Server()\n@@ -231,7 +229,6 @@ def server():\n \n \n class RobotListener:\n-\n ROBOT_LISTENER_API_VERSION = 2\n \n def __init__(self):\n@@ -249,7 +246,6 @@ def end_test(self, name, attrs):\n \n \n class Zope2Server:\n-\n stop_zope_server_lazy = False # trigger lazy Zope2Server shutdown\n stop_zope_server_layer = None # sticky layer for lazy shutdown\n \n@@ -319,11 +315,7 @@ def zodb_setup(self, layer_dotted_name=None):\n for layer in layers:\n if hasattr(layer, "testSetUp"):\n if HAS_VERBOSE_CONSOLE:\n- print(\n- WAIT(\n- f"Test set up {layer.__module__}.{layer.__name__}"\n- )\n- )\n+ print(WAIT(f"Test set up {layer.__module__}.{layer.__name__}"))\n layer.testSetUp()\n if HAS_VERBOSE_CONSOLE:\n print(READY("Test set up"))\ndiff --git a/src/plone/app/robotframework/testing.py b/src/plone/app/robotframework/testing.py\nindex 744ac34..6e3a191 100644\n--- a/src/plone/app/robotframework/testing.py\n+++ b/src/plone/app/robotframework/testing.py\n@@ -56,7 +56,6 @@ def tearDown(self):\n \n \n class SimplePublicationWithTypesLayer(Layer):\n-\n defaultBases = (SIMPLE_PUBLICATION_FIXTURE,)\n \n def setUp(self):\n@@ -207,7 +206,6 @@ def _get_robot_variable(self, name):\n return filter(bool, [s.strip() for s in candidates])\n \n def setUpZope(self, app, configurationContext):\n-\n # This installs the VHM in the Zope root, so we can have VHM support too\n AppInitializer(app).install_virtual_hosting()\n \n@@ -294,26 +292,22 @@ def __nonzero__(x):\n \n \n class WSGIServerSingleThreaded(WSGIServer):\n-\n def setUpServer(self):\n- """Create a single threaded WSGI server instance and save it in self.server.\n- """\n+ """Create a single threaded WSGI server instance and save it in self.server."""\n app = self.make_wsgi_app()\n- kwargs = {\'clear_untrusted_proxy_headers\': False,\n- \'threads\': 1}\n+ kwargs = {"clear_untrusted_proxy_headers": False, "threads": 1}\n if self.host is not None:\n- kwargs[\'host\'] = self.host\n+ kwargs["host"] = self.host\n if self.port is not None:\n- kwargs[\'port\'] = int(self.port)\n+ kwargs["port"] = int(self.port)\n self.server = StopableWSGIServer.create(app, **kwargs)\n # If we dynamically set the host/port, we want to reset it to localhost\n # Otherwise this will depend on, for example, the local network setup\n- if self.host in (None, \'0.0.0.0\', \'127.0.0.1\', \'localhost\'):\n- self.server.effective_host = \'localhost\'\n+ if self.host in (None, "0.0.0.0", "127.0.0.1", "localhost"):\n+ self.server.effective_host = "localhost"\n # Refresh the hostname and port in case we dynamically picked them\n- self[\'host\'] = self.host = self.server.effective_host\n- self[\'port\'] = self.port = int(self.server.effective_port)\n-\n+ self["host"] = self.host = self.server.effective_host\n+ self["port"] = self.port = int(self.server.effective_port)\n \n \n WSGI_SERVER_SINGLE_THREADED_FIXTURE = WSGIServerSingleThreaded()\n@@ -332,7 +326,6 @@ def setUpServer(self):\n if HAS_SPEAKJS:\n \n class SpeakJSLayer(Layer):\n-\n defaultBases = (PLONE_FIXTURE,)\n \n def setUp(self):\ndiff --git a/src/plone/app/robotframework/tests/test_content.py b/src/plone/app/robotframework/tests/test_content.py\nindex 9052b24..516878e 100644\n--- a/src/plone/app/robotframework/tests/test_content.py\n+++ b/src/plone/app/robotframework/tests/test_content.py\n@@ -7,7 +7,6 @@\n \n \n class TestCreateContent(unittest.TestCase):\n-\n layer = PLONE_ROBOT_INTEGRATION_TESTING\n \n def setUp(self):\n@@ -50,7 +49,6 @@ def test_create_content_updates_catalog(self):\n \n \n class TestGlobalAllow(unittest.TestCase):\n-\n layer = PLONE_ROBOT_INTEGRATION_TESTING\n \n def setUp(self):\n' -Repository: plone.app.content +Repository: plone.app.robotframework Branch: refs/heads/master -Date: 2023-10-18T11:30:24+02:00 +Date: 2023-10-15T18:28:12+02:00 Author: Gil Forcada Codinachs (gforcada) -Commit: https://github.com/plone/plone.app.content/commit/97fcfbf3f42e0742c4c2fa0803a30321ccfab7d9 +Commit: https://github.com/plone/plone.app.robotframework/commit/63c61ab607b5d553b0f21458773c64a5d7e4ef46 -feat: codespell +chore: zpretty Files changed: -M CHANGES.rst -M plone/app/content/browser/constraintypes.pt -M plone/app/content/browser/contents/__init__.py -M plone/app/content/browser/interfaces.py -M plone/app/content/browser/table.txt -M plone/app/content/browser/vocabulary.py -M plone/app/content/namechooser.py -M plone/app/content/tests/test_contents.py - -b'diff --git a/CHANGES.rst b/CHANGES.rst\nindex 531f0ce..ac89afd 100644\n--- a/CHANGES.rst\n+++ b/CHANGES.rst\n@@ -210,7 +210,7 @@ Bug fixes:\n Bug fixes:\n \n \n-- Call fileUpload view explict with @@ to avoid possible plone.rest clashes.\n+- Call fileUpload view explicit with @@ to avoid possible plone.rest clashes.\n [jensens] (#225)\n \n \n@@ -552,7 +552,7 @@ Bug fixes:\n [thet]\n \n - Fix issue where some actions (copy, delete, paste) on contents view did not\n- work if there were any private (innaccessible for the current user) levels the\n+ work if there were any private (inaccessible for the current user) levels the\n current path\n [datakurre]\n \n@@ -908,7 +908,7 @@ Fixes:\n - When clicking cancel on the delete_confirmation got to the view_url.\n [ale-rt]\n \n-- Fix deletion of objects with unicode charaters in the title.\n+- Fix deletion of objects with unicode characters in the title.\n [cillianderoiste]\n \n \n@@ -988,7 +988,7 @@ Fixes:\n - Translate folder contents add menu\n [vangheem]\n \n-- use same columns title in results and in displayed colums configuration\n+- use same columns title in results and in displayed columns configuration\n [vincent]\n \n \ndiff --git a/plone/app/content/browser/constraintypes.pt b/plone/app/content/browser/constraintypes.pt\nindex ead1a96..d2d50c1 100644\n--- a/plone/app/content/browser/constraintypes.pt\n+++ b/plone/app/content/browser/constraintypes.pt\n@@ -11,10 +11,10 @@\n (function($){\n // Custom form constraints for constrain form\n $(document).ready(function(){\n- var prefered = $(".current_prefer_form"),\n+ var preferred = $(".current_prefer_form"),\n allowed = $(".current_allow_form"),\n constrain_mode = $(".constrain_types_mode_form"),\n- prefered_field = prefered.parents(\'.field\'),\n+ preferred_field = preferred.parents(\'.field\'),\n allowed_field = allowed.parents(\'.field\'),\n ACQUIRE = -1,\n DISABLED = 0,\n@@ -22,15 +22,15 @@\n function updateVisibility(){\n var mode = constrain_mode.val();\n if(mode == ENABLED){\n- prefered_field.show();\n+ preferred_field.show();\n allowed_field.show();\n }else{\n- prefered_field.hide();\n+ preferred_field.hide();\n allowed_field.hide();\n }\n }\n function updateSelectable(){\n- prefered.each(function(){\n+ preferred.each(function(){\n var allowed_id = this.id.replace(\'allowed\', \'secondary\'),\n allowed_item = allowed_field.find("#" + allowed_id);\n if (this.checked){\n@@ -43,7 +43,7 @@\n }\n constrain_mode.change(updateVisibility);\n updateVisibility();\n- prefered_field.change(updateSelectable);\n+ preferred_field.change(updateSelectable);\n updateSelectable();\n })\n }(jQuery));\ndiff --git a/plone/app/content/browser/contents/__init__.py b/plone/app/content/browser/contents/__init__.py\nindex d122c6f..66b8f22 100644\n--- a/plone/app/content/browser/contents/__init__.py\n+++ b/plone/app/content/browser/contents/__init__.py\n@@ -182,7 +182,7 @@ def get_thumb_scale(self):\n registry = getUtility(IRegistry)\n settings = registry.forInterface(ISiteSchema, prefix="plone", check=False)\n if settings.no_thumbs_tables:\n- # thumbs to be supressed\n+ # thumbs to be suppressed\n return None\n thumb_scale_table = settings.thumb_scale_table\n return thumb_scale_table\ndiff --git a/plone/app/content/browser/interfaces.py b/plone/app/content/browser/interfaces.py\nindex 4cdfc35..5f300c3 100644\n--- a/plone/app/content/browser/interfaces.py\n+++ b/plone/app/content/browser/interfaces.py\n@@ -2,7 +2,7 @@\n \n \n class IFolderContentsView(Interface):\n- """Interface, which provides methods for folder contens"""\n+ """Interface, which provides methods for folder contents"""\n \n def test(a, b, c):\n """A simple replacement of python\'s test."""\ndiff --git a/plone/app/content/browser/table.txt b/plone/app/content/browser/table.txt\nindex f333787..ae906a2 100644\n--- a/plone/app/content/browser/table.txt\n+++ b/plone/app/content/browser/table.txt\n@@ -3,7 +3,7 @@ Table\n =====\n \n The table class can render a table like used in the folder contents view. It is\n-abstracted into a seperate class for reuse with other views like the review\n+abstracted into a separate class for reuse with other views like the review\n list.\n \n A table can be parameterized at creation time.\n@@ -31,11 +31,11 @@ One of the table\'s main virtues is that it batches. A template can use the\n True\n \n The table automatically adds keys for making layout easier. One of these is\n-indication wheter an item is `checked`.\n+indication whether an item is `checked`.\n \n >>> list(table.batch)[0][\'checked\']\n \n-Wheter or not an item is checked depends on request variables. If either the\n+Whether or not an item is checked depends on request variables. If either the\n whole batch or the current screen is selected the item we be marked as checked.\n Below we will demonstrate this by selecting the items on screen.\n \n@@ -129,8 +129,8 @@ The same goes for selecting the screen and the whole batch.\n \'http://plone/view?pagenumber=1&pagesize=20&select=all\'\n \n A template may want to display only one of these urls at the same time.\n-Therefore the table has a boolean property to query wheter or not to show the\n-select all option. The display of this depends on wheter the whole batch is\n+Therefore the table has a boolean property to query whether or not to show the\n+select all option. The display of this depends on whether the whole batch is\n selected (don\'t show) or the screen has not been selected (don\'t show then).\n \n >>> table = Table({}, base_url, view_url, items=items)\ndiff --git a/plone/app/content/browser/vocabulary.py b/plone/app/content/browser/vocabulary.py\nindex f7693cd..822eb60 100644\n--- a/plone/app/content/browser/vocabulary.py\n+++ b/plone/app/content/browser/vocabulary.py\n@@ -139,7 +139,7 @@ def __call__(self):\n sort_on: index,\n sort_order: (asc|reversed)\n }\n- attributes: comma seperated, or json object list\n+ attributes: comma separated, or json object list\n batch: {\n page: 1-based page of results,\n size: size of paged results\n@@ -183,7 +183,7 @@ def __call__(self):\n if batch and ("size" not in batch or "page" not in batch):\n batch = None # batching not providing correct options\n if batch:\n- # must be slicable for batching support\n+ # must be sliceable for batching support\n page = int(batch["page"])\n size = int(batch["size"])\n if size > MAX_BATCH_SIZE:\ndiff --git a/plone/app/content/namechooser.py b/plone/app/content/namechooser.py\nindex c16633b..0d9fe5e 100644\n--- a/plone/app/content/namechooser.py\n+++ b/plone/app/content/namechooser.py\n@@ -83,7 +83,7 @@ def _findUniqueName(self, name, obj):\n return new_name\n \n raise ValueError(\n- "Cannot find a unique name based on %s after %d attemps."\n+ "Cannot find a unique name based on %s after %d attempts."\n % (\n name,\n ATTEMPTS,\ndiff --git a/plone/app/content/tests/test_contents.py b/plone/app/content/tests/test_contents.py\nindex f7402fa..80ba2ec 100644\n--- a/plone/app/content/tests/test_contents.py\n+++ b/plone/app/content/tests/test_contents.py\n@@ -90,8 +90,8 @@ def setUp(self):\n @mock.patch(\n "plone.app.content.browser.contents.ContentsBaseAction.protect", lambda x: True\n ) # noqa\n- def test_delete_success_with_private_anchestor(self):\n- """Delete content item from a folder with private anchestor"""\n+ def test_delete_success_with_private_ancestor(self):\n+ """Delete content item from a folder with private ancestor"""\n # Create test content /it1/it2/it3\n self.portal.invokeFactory("type1", id="it1", title="Item 1")\n self.portal.it1.invokeFactory("type1", id="it2", title="Item 2")\n@@ -222,8 +222,8 @@ def test_paste_fail_constraint(self):\n @mock.patch(\n "plone.app.content.browser.contents.ContentsBaseAction.protect", lambda x: True\n ) # noqa\n- def test_paste_success_with_private_anchestor(self):\n- """Copy content item and paste into a folder with private anchestor"""\n+ def test_paste_success_with_private_ancestor(self):\n+ """Copy content item and paste into a folder with private ancestor"""\n # Create test content /it2/it3\n self.portal.invokeFactory("type1", id="it2", title="Item 2")\n self.portal.it2.invokeFactory("type1", id="it3", title="Item 3")\n@@ -274,8 +274,8 @@ def setUp(self):\n @mock.patch(\n "plone.app.content.browser.contents.ContentsBaseAction.protect", lambda x: True\n ) # noqa\n- def test_rename_success_with_private_anchestor(self):\n- """Rename content item from a folder with private anchestor"""\n+ def test_rename_success_with_private_ancestor(self):\n+ """Rename content item from a folder with private ancestor"""\n # Create test content /it1/it2/it3\n self.portal.invokeFactory("type1", id="it1", title="Item 1")\n self.portal.it1.invokeFactory("type1", id="it2", title="Item 2")\n' - -Repository: plone.app.content +M docs/source/libdoc/python_debugging.html +M docs/source/libdoc/python_layoutmath.html +M docs/source/libdoc/python_saucelabs.html +M docs/source/libdoc/python_zope2server.html +M docs/source/libdoc/remote_autologin.html +M docs/source/libdoc/remote_content.html +M docs/source/libdoc/remote_genericsetup.html +M docs/source/libdoc/remote_i18n.html +M docs/source/libdoc/remote_mockmailhost.html +M docs/source/libdoc/remote_quickinstaller.html +M docs/source/libdoc/remote_users.html +M docs/source/libdoc/remote_zope2server.html +M docs/source/libdoc/selenium.html +M docs/source/libdoc/user_keywords.html +M docs/source/libdoc/user_saucelabs.html +M docs/source/libdoc/user_selenium.html +M docs/source/libdoc/user_server.html + +b'diff --git a/docs/source/libdoc/python_debugging.html b/docs/source/libdoc/python_debugging.html\nindex 0da14491..840b74cb 100644\n--- a/docs/source/libdoc/python_debugging.html\n+++ b/docs/source/libdoc/python_debugging.html\n@@ -1,13 +1,28 @@\n \n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n+ \n-\n+ \n-\n+ \n-\n-\n+ \n-\n+ \n-\n+ \n-\n+ \n-\n-\n-\n+ \n+ \n+ \n+ \n \n-
\n-

Opening library documentation failed

\n-
    \n-
  • Verify that you have JavaScript enabled in your browser.
  • \n-
  • Make sure you are using a modern enough browser. Firefox 3.5, IE 8, or equivalent is required, newer browsers are recommended.
  • \n-
  • Check are there messages in your browser\'s JavaScript error log. Please report the problem if you suspect you have encountered a bug.
  • \n-
\n-
\n+
\n+

Opening library documentation failed

\n+
    \n+
  • Verify that you have\n+ JavaScript enabled\n+ in your browser.
  • \n+
  • Make sure you are using a\n+ modern enough browser. Firefox 3.5, IE 8, or equivalent is required, newer browsers are recommended.
  • \n+
  • Check are there messages in your browser\'s\n+ JavaScript error log. Please report the problem if you suspect you have encountered a bug.
  • \n+
\n+
\n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n \n-\n+ \n \n-\n+ \n \ndiff --git a/docs/source/libdoc/python_layoutmath.html b/docs/source/libdoc/python_layoutmath.html\nindex 97356fed..d672ecc2 100644\n--- a/docs/source/libdoc/python_layoutmath.html\n+++ b/docs/source/libdoc/python_layoutmath.html\n@@ -1,13 +1,28 @@\n \n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n+ \n-\n+ \n-\n+ \n-\n-\n+ \n-\n+ \n-\n+ \n-\n+ \n-\n-\n-\n+ \n+ \n+ \n+ \n \n-
\n-

Opening library documentation failed

\n-
    \n-
  • Verify that you have JavaScript enabled in your browser.
  • \n-
  • Make sure you are using a modern enough browser. Firefox 3.5, IE 8, or equivalent is required, newer browsers are recommended.
  • \n-
  • Check are there messages in your browser\'s JavaScript error log. Please report the problem if you suspect you have encountered a bug.
  • \n-
\n-
\n+
\n+

Opening library documentation failed

\n+
    \n+
  • Verify that you have\n+ JavaScript enabled\n+ in your browser.
  • \n+
  • Make sure you are using a\n+ modern enough browser. Firefox 3.5, IE 8, or equivalent is required, newer browsers are recommended.
  • \n+
  • Check are there messages in your browser\'s\n+ JavaScript error log. Please report the problem if you suspect you have encountered a bug.
  • \n+
\n+
\n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n \n-\n+ \n \n-\n+ \n \ndiff --git a/docs/source/libdoc/python_saucelabs.html b/docs/source/libdoc/python_saucelabs.html\nindex e31f6d15..47c85ae8 100644\n--- a/docs/source/libdoc/python_saucelabs.html\n+++ b/docs/source/libdoc/python_saucelabs.html\n@@ -1,13 +1,28 @@\n \n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n+ \n-\n+ \n-\n+ \n-\n-\n+ \n-\n+ \n-\n+ \n-\n+ \n-\n-\n-\n+ \n+ \n+ \n+ \n \n-
\n-

Opening library documentation failed

\n-
    \n-
  • Verify that you have JavaScript enabled in your browser.
  • \n-
  • Make sure you are using a modern enough browser. Firefox 3.5, IE 8, or equivalent is required, newer browsers are recommended.
  • \n-
  • Check are there messages in your browser\'s JavaScript error log. Please report the problem if you suspect you have encountered a bug.
  • \n-
\n-
\n+
\n+

Opening library documentation failed

\n+
    \n+
  • Verify that you have\n+ JavaScript enabled\n+ in your browser.
  • \n+
  • Make sure you are using a\n+ modern enough browser. Firefox 3.5, IE 8, or equivalent is required, newer browsers are recommended.
  • \n+
  • Check are there messages in your browser\'s\n+ JavaScript error log. Please report the problem if you suspect you have encountered a bug.
  • \n+
\n+
\n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n \n-\n+ \n \n-\n+ \n \ndiff --git a/docs/source/libdoc/python_zope2server.html b/docs/source/libdoc/python_zope2server.html\nindex 634cac2e..1576c859 100644\n--- a/docs/source/libdoc/python_zope2server.html\n+++ b/docs/source/libdoc/python_zope2server.html\n@@ -1,13 +1,28 @@\n \n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n+ \n-\n+ \n-\n+ \n-\n-\n+ \n-\n+ \n-\n+ \n-\n+ \n-\n-\n-\n+ \n+ \n+ \n+ \n \n-
\n-

Opening library documentation failed

\n-
    \n-
  • Verify that you have JavaScript enabled in your browser.
  • \n-
  • Make sure you are using a modern enough browser. Firefox 3.5, IE 8, or equivalent is required, newer browsers are recommended.
  • \n-
  • Check are there messages in your browser\'s JavaScript error log. Please report the problem if you suspect you have encountered a bug.
  • \n-
\n-
\n+
\n+

Opening library documentation failed

\n+
    \n+
  • Verify that you have\n+ JavaScript enabled\n+ in your browser.
  • \n+
  • Make sure you are using a\n+ modern enough browser. Firefox 3.5, IE 8, or equivalent is required, newer browsers are recommended.
  • \n+
  • Check are there messages in your browser\'s\n+ JavaScript error log. Please report the problem if you suspect you have encountered a bug.
  • \n+
\n+
\n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n \n-\n+ \n \n-\n+ \n \ndiff --git a/docs/source/libdoc/remote_autologin.html b/docs/source/libdoc/remote_autologin.html\nindex 673199cb..113d195b 100644\n--- a/docs/source/libdoc/remote_autologin.html\n+++ b/docs/source/libdoc/remote_autologin.html\n@@ -1,13 +1,28 @@\n \n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n+ \n-\n+ \n-\n+ \n-\n-\n+ \n-\n+ \n-\n+ \n-\n+ \n-\n-\n-\n+ \n+ \n+ \n+ \n \n-
\n-

Opening library documentation failed

\n-
    \n-
  • Verify that you have JavaScript enabled in your browser.
  • \n-
  • Make sure you are using a modern enough browser. Firefox 3.5, IE 8, or equivalent is required, newer browsers are recommended.
  • \n-
  • Check are there messages in your browser\'s JavaScript error log. Please report the problem if you suspect you have encountered a bug.
  • \n-
\n-
\n+
\n+

Opening library documentation failed

\n+
    \n+
  • Verify that you have\n+ JavaScript enabled\n+ in your browser.
  • \n+
  • Make sure you are using a\n+ modern enough browser. Firefox 3.5, IE 8, or equivalent is required, newer browsers are recommended.
  • \n+
  • Check are there messages in your browser\'s\n+ JavaScript error log. Please report the problem if you suspect you have encountered a bug.
  • \n+
\n+
\n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n \n-\n+ \n \n-\n+ \n \ndiff --git a/docs/source/libdoc/remote_content.html b/docs/source/libdoc/remote_content.html\nindex c19ccbfc..16452ddb 100644\n--- a/docs/source/libdoc/remote_content.html\n+++ b/docs/source/libdoc/remote_content.html\n@@ -1,13 +1,28 @@\n \n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n+ \n-\n+ \n-\n+ \n-\n-\n+ \n-\n+ \n-\n+ \n-\n+ \n-\n-\n-\n+ \n+ \n+ \n+ \n \n-
\n-

Opening library documentation failed

\n-
    \n-
  • Verify that you have JavaScript enabled in your browser.
  • \n-
  • Make sure you are using a modern enough browser. Firefox 3.5, IE 8, or equivalent is required, newer browsers are recommended.
  • \n-
  • Check are there messages in your browser\'s JavaScript error log. Please report the problem if you suspect you have encountered a bug.
  • \n-
\n-
\n+
\n+

Opening library documentation failed

\n+
    \n+
  • Verify that you have\n+ JavaScript enabled\n+ in your browser.
  • \n+
  • Make sure you are using a\n+ modern enough browser. Firefox 3.5, IE 8, or equivalent is required, newer browsers are recommended.
  • \n+
  • Check are there messages in your browser\'s\n+ JavaScript error log. Please report the problem if you suspect you have encountered a bug.
  • \n+
\n+
\n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n \n-\n+ \n \n-\n+ \n \ndiff --git a/docs/source/libdoc/remote_genericsetup.html b/docs/source/libdoc/remote_genericsetup.html\nindex 5a478d02..b3d4b7bd 100644\n--- a/docs/source/libdoc/remote_genericsetup.html\n+++ b/docs/source/libdoc/remote_genericsetup.html\n@@ -1,13 +1,28 @@\n \n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n+ \n-\n+ \n-\n+ \n-\n-\n+ \n-\n+ \n-\n+ \n-\n+ \n-\n-\n-\n+ \n+ \n+ \n+ \n \n-
\n-

Opening library documentation failed

\n-
    \n-
  • Verify that you have JavaScript enabled in your browser.
  • \n-
  • Make sure you are using a modern enough browser. Firefox 3.5, IE 8, or equivalent is required, newer browsers are recommended.
  • \n-
  • Check are there messages in your browser\'s JavaScript error log. Please report the problem if you suspect you have encountered a bug.
  • \n-
\n-
\n+
\n+

Opening library documentation failed

\n+
    \n+
  • Verify that you have\n+ JavaScript enabled\n+ in your browser.
  • \n+
  • Make sure you are using a\n+ modern enough browser. Firefox 3.5, IE 8, or equivalent is required, newer browsers are recommended.
  • \n+
  • Check are there messages in your browser\'s\n+ JavaScript error log. Please report the problem if you suspect you have encountered a bug.
  • \n+
\n+
\n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n \n-\n+ \n \n-\n+ \n \ndiff --git a/docs/source/libdoc/remote_i18n.html b/docs/source/libdoc/remote_i18n.html\nindex 970e0b4a..6efb53ea 100644\n--- a/docs/source/libdoc/remote_i18n.html\n+++ b/docs/source/libdoc/remote_i18n.html\n@@ -1,13 +1,28 @@\n \n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n+ \n-\n+ \n-\n+ \n-\n-\n+ \n-\n+ \n-\n+ \n-\n+ \n-\n-\n-\n+ \n+ \n+ \n+ \n \n-
\n-

Opening library documentation failed

\n-
    \n-
  • Verify that you have JavaScript enabled in your browser.
  • \n-
  • Make sure you are using a modern enough browser. Firefox 3.5, IE 8, or equivalent is required, newer browsers are recommended.
  • \n-
  • Check are there messages in your browser\'s JavaScript error log. Please report the problem if you suspect you have encountered a bug.
  • \n-
\n-
\n+
\n+

Opening library documentation failed

\n+
    \n+
  • Verify that you have\n+ JavaScript enabled\n+ in your browser.
  • \n+
  • Make sure you are using a\n+ modern enough browser. Firefox 3.5, IE 8, or equivalent is required, newer browsers are recommended.
  • \n+
  • Check are there messages in your browser\'s\n+ JavaScript error log. Please report the problem if you suspect you have encountered a bug.
  • \n+
\n+
\n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n \n-\n+ \n \n-\n+ \n \ndiff --git a/docs/source/libdoc/remote_mockmailhost.html b/docs/source/libdoc/remote_mockmailhost.html\nindex 962eb517..1ed80700 100644\n--- a/docs/source/libdoc/remote_mockmailhost.html\n+++ b/docs/source/libdoc/remote_mockmailhost.html\n@@ -1,13 +1,28 @@\n \n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n+ \n-\n+ \n-\n+ \n-\n-\n+ \n-\n+ \n-\n+ \n-\n+ \n-\n-\n-\n+ \n+ \n+ \n+ \n \n-
\n-

Opening library documentation failed

\n-
    \n-
  • Verify that you have JavaScript enabled in your browser.
  • \n-
  • Make sure you are using a modern enough browser. Firefox 3.5, IE 8, or equivalent is required, newer browsers are recommended.
  • \n-
  • Check are there messages in your browser\'s JavaScript error log. Please report the problem if you suspect you have encountered a bug.
  • \n-
\n-
\n+
\n+

Opening library documentation failed

\n+
    \n+
  • Verify that you have\n+ JavaScript enabled\n+ in your browser.
  • \n+
  • Make sure you are using a\n+ modern enough browser. Firefox 3.5, IE 8, or equivalent is required, newer browsers are recommended.
  • \n+
  • Check are there messages in your browser\'s\n+ JavaScript error log. Please report the problem if you suspect you have encountered a bug.
  • \n+
\n+
\n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n \n-\n+ \n \n-\n+ \n \ndiff --git a/docs/source/libdoc/remote_quickinstaller.html b/docs/source/libdoc/remote_quickinstaller.html\nindex fd713c5e..58085bd4 100644\n--- a/docs/source/libdoc/remote_quickinstaller.html\n+++ b/docs/source/libdoc/remote_quickinstaller.html\n@@ -1,13 +1,28 @@\n \n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n+ \n-\n+ \n-\n+ \n-\n-\n+ \n-\n+ \n-\n+ \n-\n+ \n-\n-\n-\n+ \n+ \n+ \n+ \n \n-
\n-

Opening library documentation failed

\n-
    \n-
  • Verify that you have JavaScript enabled in your browser.
  • \n-
  • Make sure you are using a modern enough browser. Firefox 3.5, IE 8, or equivalent is required, newer browsers are recommended.
  • \n-
  • Check are there messages in your browser\'s JavaScript error log. Please report the problem if you suspect you have encountered a bug.
  • \n-
\n-
\n+
\n+

Opening library documentation failed

\n+
    \n+
  • Verify that you have\n+ JavaScript enabled\n+ in your browser.
  • \n+
  • Make sure you are using a\n+ modern enough browser. Firefox 3.5, IE 8, or equivalent is required, newer browsers are recommended.
  • \n+
  • Check are there messages in your browser\'s\n+ JavaScript error log. Please report the problem if you suspect you have encountered a bug.
  • \n+
\n+
\n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n \n-\n+ \n \n-\n+ \n \ndiff --git a/docs/source/libdoc/remote_users.html b/docs/source/libdoc/remote_users.html\nindex fef16e93..ca10bc10 100644\n--- a/docs/source/libdoc/remote_users.html\n+++ b/docs/source/libdoc/remote_users.html\n@@ -1,13 +1,28 @@\n \n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n+ \n-\n+ \n-\n+ \n-\n-\n+ \n-\n+ \n-\n+ \n-\n+ \n-\n-\n-\n+ \n+ \n+ \n+ \n \n-
\n-

Opening library documentation failed

\n-
    \n-
  • Verify that you have JavaScript enabled in your browser.
  • \n-
  • Make sure you are using a modern enough browser. Firefox 3.5, IE 8, or equivalent is required, newer browsers are recommended.
  • \n-
  • Check are there messages in your browser\'s JavaScript error log. Please report the problem if you suspect you have encountered a bug.
  • \n-
\n-
\n+
\n+

Opening library documentation failed

\n+
    \n+
  • Verify that you have\n+ JavaScript enabled\n+ in your browser.
  • \n+
  • Make sure you are using a\n+ modern enough browser. Firefox 3.5, IE 8, or equivalent is required, newer browsers are recommended.
  • \n+
  • Check are there messages in your browser\'s\n+ JavaScript error log. Please report the problem if you suspect you have encountered a bug.
  • \n+
\n+
\n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n \n-\n+ \n \n-\n+ \n \ndiff --git a/docs/source/libdoc/remote_zope2server.html b/docs/source/libdoc/remote_zope2server.html\nindex e4c539fe..829dc641 100644\n--- a/docs/source/libdoc/remote_zope2server.html\n+++ b/docs/source/libdoc/remote_zope2server.html\n@@ -1,13 +1,28 @@\n \n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n+ \n-\n+ \n-\n+ \n-\n-\n+ \n-\n+ \n-\n+ \n-\n+ \n-\n-\n-\n+ \n+ \n+ \n+ \n \n-
\n-

Opening library documentation failed

\n-
    \n-
  • Verify that you have JavaScript enabled in your browser.
  • \n-
  • Make sure you are using a modern enough browser. Firefox 3.5, IE 8, or equivalent is required, newer browsers are recommended.
  • \n-
  • Check are there messages in your browser\'s JavaScript error log. Please report the problem if you suspect you have encountered a bug.
  • \n-
\n-
\n+
\n+

Opening library documentation failed

\n+
    \n+
  • Verify that you have\n+ JavaScript enabled\n+ in your browser.
  • \n+
  • Make sure you are using a\n+ modern enough browser. Firefox 3.5, IE 8, or equivalent is required, newer browsers are recommended.
  • \n+
  • Check are there messages in your browser\'s\n+ JavaScript error log. Please report the problem if you suspect you have encountered a bug.
  • \n+
\n+
\n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n \n-\n+ \n \n-\n+ \n \ndiff --git a/docs/source/libdoc/selenium.html b/docs/source/libdoc/selenium.html\nindex 55c01242..f82b307f 100644\n--- a/docs/source/libdoc/selenium.html\n+++ b/docs/source/libdoc/selenium.html\n@@ -1,13 +1,28 @@\n \n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n+ \n-\n+ \n-\n+ \n-\n-\n+ \n-\n+ \n-\n-\n-\n+ \n+ \n+ \n+ \n \n-
\n-

Opening library documentation failed

\n-
    \n-
  • Verify that you have JavaScript enabled in your browser.
  • \n-
  • Make sure you are using a modern enough browser. Firefox 3.5, IE 8, or equivalent is required, newer browsers are recommended.
  • \n-
  • Check are there messages in your browser\'s JavaScript error log. Please report the problem if you suspect you have encountered a bug.
  • \n-
\n-
\n+
\n+

Opening library documentation failed

\n+
    \n+
  • Verify that you have\n+ JavaScript enabled\n+ in your browser.
  • \n+
  • Make sure you are using a\n+ modern enough browser. Firefox 3.5, IE 8, or equivalent is required, newer browsers are recommended.
  • \n+
  • Check are there messages in your browser\'s\n+ JavaScript error log. Please report the problem if you suspect you have encountered a bug.
  • \n+
\n+
\n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n-\n+ \n+ \n \n-\n+ \n \ndiff --git a/docs/source/libdoc/user_keywords.html b/docs/source/libdoc/user_keywords.html\nindex 990f5417..27abf9cf 100644\n--- a/docs/source/libdoc/user_keywords.html\n+++ b/docs/source/libdoc/user_keywords.html\n@@ -1,13 +1,28 @@\n \n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n+ \n-\n+ \n-\n+ \n-\n-\n+ \n-\n+ \n-\n+ \n-\n+ \n-\n-\n-\n+ \n+ \n+ \n+ \n \n-
\n-

Opening library documentation failed

\n-
    \n-
  • Verify that you have JavaScript enabled in your browser.
  • \n-
  • Make sure you are using a modern enough browser. Firefox 3.5, IE 8, or equivalent is required, newer browsers are recommended.
  • \n-
  • Check are there messages in your browser\'s JavaScript error log. Please report the problem if you suspect you have encountered a bug.
  • \n-
\n-
\n+
\n+

Opening library documentation failed

\n+
    \n+
  • Verify that you have\n+ JavaScript enabled\n+ in your browser.
  • \n+
  • Make sure you are using a\n+ modern enough browser. Firefox 3.5, IE 8, or equivalent is required, newer browsers are recommended.
  • \n+
  • Check are there messages in your browser\'s\n+ JavaScript error log. Please report the problem if you suspect you have encountered a bug.
  • \n+
\n+
\n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n \n-\n+ \n \n-\n+ \n \ndiff --git a/docs/source/libdoc/user_saucelabs.html b/docs/source/libdoc/user_saucelabs.html\nindex c3356ea6..66b25d38 100644\n--- a/docs/source/libdoc/user_saucelabs.html\n+++ b/docs/source/libdoc/user_saucelabs.html\n@@ -1,13 +1,28 @@\n \n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n+ \n-\n+ \n-\n+ \n-\n-\n+ \n-\n+ \n-\n+ \n-\n+ \n-\n-\n-\n+ \n+ \n+ \n+ \n \n-
\n-

Opening library documentation failed

\n-
    \n-
  • Verify that you have JavaScript enabled in your browser.
  • \n-
  • Make sure you are using a modern enough browser. Firefox 3.5, IE 8, or equivalent is required, newer browsers are recommended.
  • \n-
  • Check are there messages in your browser\'s JavaScript error log. Please report the problem if you suspect you have encountered a bug.
  • \n-
\n-
\n+
\n+

Opening library documentation failed

\n+
    \n+
  • Verify that you have\n+ JavaScript enabled\n+ in your browser.
  • \n+
  • Make sure you are using a\n+ modern enough browser. Firefox 3.5, IE 8, or equivalent is required, newer browsers are recommended.
  • \n+
  • Check are there messages in your browser\'s\n+ JavaScript error log. Please report the problem if you suspect you have encountered a bug.
  • \n+
\n+
\n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n \n-\n+ \n \n-\n+ \n \ndiff --git a/docs/source/libdoc/user_selenium.html b/docs/source/libdoc/user_selenium.html\nindex 3b8b8f11..280a3f0a 100644\n--- a/docs/source/libdoc/user_selenium.html\n+++ b/docs/source/libdoc/user_selenium.html\n@@ -1,13 +1,28 @@\n \n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n+ \n-\n+ \n-\n+ \n-\n-\n+ \n-\n+ \n-\n+ \n-\n+ \n-\n-\n-\n+ \n+ \n+ \n+ \n \n-
\n-

Opening library documentation failed

\n-
    \n-
  • Verify that you have JavaScript enabled in your browser.
  • \n-
  • Make sure you are using a modern enough browser. Firefox 3.5, IE 8, or equivalent is required, newer browsers are recommended.
  • \n-
  • Check are there messages in your browser\'s JavaScript error log. Please report the problem if you suspect you have encountered a bug.
  • \n-
\n-
\n+
\n+

Opening library documentation failed

\n+
    \n+
  • Verify that you have\n+ JavaScript enabled\n+ in your browser.
  • \n+
  • Make sure you are using a\n+ modern enough browser. Firefox 3.5, IE 8, or equivalent is required, newer browsers are recommended.
  • \n+
  • Check are there messages in your browser\'s\n+ JavaScript error log. Please report the problem if you suspect you have encountered a bug.
  • \n+
\n+
\n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n \n-\n+ \n \n-\n+ \n \ndiff --git a/docs/source/libdoc/user_server.html b/docs/source/libdoc/user_server.html\nindex 523d80e5..7624256a 100644\n--- a/docs/source/libdoc/user_server.html\n+++ b/docs/source/libdoc/user_server.html\n@@ -1,13 +1,28 @@\n \n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n+ \n-\n+ \n-\n+ \n-\n-\n+ \n-\n+ \n-\n+ \n-\n+ \n-\n-\n-\n+ \n+ \n+ \n+ \n \n-
\n-

Opening library documentation failed

\n-
    \n-
  • Verify that you have JavaScript enabled in your browser.
  • \n-
  • Make sure you are using a modern enough browser. Firefox 3.5, IE 8, or equivalent is required, newer browsers are recommended.
  • \n-
  • Check are there messages in your browser\'s JavaScript error log. Please report the problem if you suspect you have encountered a bug.
  • \n-
\n-
\n+
\n+

Opening library documentation failed

\n+
    \n+
  • Verify that you have\n+ JavaScript enabled\n+ in your browser.
  • \n+
  • Make sure you are using a\n+ modern enough browser. Firefox 3.5, IE 8, or equivalent is required, newer browsers are recommended.
  • \n+
  • Check are there messages in your browser\'s\n+ JavaScript error log. Please report the problem if you suspect you have encountered a bug.
  • \n+
\n+
\n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n \n-\n+ \n \n-\n+ \n \n' + +Repository: plone.app.robotframework Branch: refs/heads/master -Date: 2023-10-18T11:30:24+02:00 +Date: 2023-10-15T18:28:12+02:00 Author: Gil Forcada Codinachs (gforcada) -Commit: https://github.com/plone/plone.app.content/commit/b40b27fc33a140fe292da1aba5e73a9f2fcffd99 +Commit: https://github.com/plone/plone.app.robotframework/commit/5189df595412fd1223eb82fde180f0a98353527b -feat: declare dependencies +feat: codespell Files changed: -M setup.py +M CHANGES.rst +M docs/source/happy.rst +M docs/source/keywords.rst +M docs/source/remote.rst +M docs/source/robot.rst +M src/plone/app/robotframework/content.py +M src/plone/app/robotframework/i18n.py +M src/plone/app/robotframework/robotentrypoints.py +M src/plone/app/robotframework/server.py +M src/plone/app/robotframework/users.py -b'diff --git a/setup.py b/setup.py\nindex 9a43d8b..5936c5b 100644\n--- a/setup.py\n+++ b/setup.py\n@@ -41,21 +41,39 @@\n python_requires=">=3.8",\n extras_require=dict(\n test=[\n- "plone.app.contenttypes",\n+ "plone.app.contenttypes[test]",\n "plone.app.testing",\n+ "plone.dexterity",\n+ "plone.namedfile",\n+ "plone.testing",\n+ "zope.annotation",\n+ "Products.GenericSetup",\n ]\n ),\n install_requires=[\n+ "plone.app.dexterity",\n+ "plone.app.layout",\n+ "plone.app.querystring",\n+ "plone.app.uuid",\n+ "plone.app.vocabularies>4.1.2",\n "plone.app.widgets",\n+ "plone.app.z3cform",\n+ "plone.autoform",\n "plone.base",\n "plone.i18n",\n+ "plone.folder",\n+ "plone.locking",\n "plone.memoize",\n "plone.protect",\n+ "plone.supermodel",\n+ "plone.uuid",\n+ "Missing",\n+ "Products.MimetypesRegistry",\n+ "Products.PortalTransforms",\n "Products.statusmessages",\n- "Products.CMFDynamicViewFTI", # required for cmf.ModifyViewTemplate\n- "plone.app.vocabularies>4.1.2",\n- "setuptools",\n "simplejson",\n+ "z3c.relationfield",\n "z3c.form",\n+ "zope.browsermenu",\n ],\n )\n' +b'diff --git a/CHANGES.rst b/CHANGES.rst\nindex 0163e8e..a1cd163 100644\n--- a/CHANGES.rst\n+++ b/CHANGES.rst\n@@ -585,7 +585,7 @@ Fixes:\n ------------------\n \n - Add a new command-line option for robot-server to start Zope in debug-mode\n- (useage: bin/robot-server -d or bin/robot-server --debug-mode)\n+ (usage: bin/robot-server -d or bin/robot-server --debug-mode)\n [datakurre]\n - Change robot LISTENER_PORT (used in communication between bin/robot-server\n and bin/robot via robotframework) to default port 49999 instead of 10001\n@@ -676,7 +676,7 @@ Fixes:\n 0.7.1 (2014-02-08)\n ------------------\n \n-- Add ignored Sphinx-directives to pybot to make it easier to run pybot agains\n+- Add ignored Sphinx-directives to pybot to make it easier to run pybot against\n Sphinx documentation\n [datakurre]\n - Update libdoc-generated documentations\n@@ -825,7 +825,7 @@ This is Arnhem Sprint preview release of 0.7.0.\n 0.6.0 (2013-04-30)\n ------------------\n \n-- Add verbose console outout for robot-server for test setup and teardown\n+- Add verbose console output for robot-server for test setup and teardown\n [datakurre]\n - Documentation update\n [datakurre, Silvio Tomatis]\n@@ -892,7 +892,7 @@ This is Arnhem Sprint preview release of 0.7.0.\n ------------------\n \n - PLOG2013 development release.\n-- Define dedicated re-usable AUTOLOGIN_ROBOT_FIXTURE\n+- Define dedicated reusable AUTOLOGIN_ROBOT_FIXTURE\n - Drop BBB for plone.act\n - Drop entrypoints for pure pybot and rebot to make it easier to use them pure\n without extra dependencies by installing robotentrypoints-package\ndiff --git a/docs/source/happy.rst b/docs/source/happy.rst\nindex 5fd8002..f21e291 100644\n--- a/docs/source/happy.rst\n+++ b/docs/source/happy.rst\n@@ -398,7 +398,7 @@ execution* keyword, you can pause the test at any point to make it possible to\n figure out what to do next.\n (Dialogs depend on `TkInter-library `_.)\n \n-.. note:: Be sure to remove *Import libary* and *Pause execution*\n+.. note:: Be sure to remove *Import library* and *Pause execution*\n keyword calls before committing your tests to avoid pausing your\n tests on CI.\n \ndiff --git a/docs/source/keywords.rst b/docs/source/keywords.rst\nindex c18883e..d838e52 100644\n--- a/docs/source/keywords.rst\n+++ b/docs/source/keywords.rst\n@@ -10,7 +10,7 @@ Selenium2Library Keywords\n \n Selenium2Library is a web testing library for Robot Framework. It provides you\n with several low-level keywords to access certain elements of a web page, to\n-conduct actions on a web page and to test if a page met certain acceptance critera.\n+conduct actions on a web page and to test if a page met certain acceptance criteria.\n \n \n First Example\ndiff --git a/docs/source/remote.rst b/docs/source/remote.rst\nindex 1284b91..46f9988 100644\n--- a/docs/source/remote.rst\n+++ b/docs/source/remote.rst\n@@ -6,7 +6,7 @@ test environment for the actual tests-clauses (*When* and *Then*).\n \n Because Given-clauses are not really part of the actual test, it is not\n necessary to run them through Selenium (using Selenium2Library), but it would\n-be faster to write custon Python keywords for them.\n+be faster to write custom Python keywords for them.\n \n **plone.act** includes an example, how to a robot\n `remote library `_,\ndiff --git a/docs/source/robot.rst b/docs/source/robot.rst\nindex 0729d50..4210d2e 100644\n--- a/docs/source/robot.rst\n+++ b/docs/source/robot.rst\n@@ -49,7 +49,7 @@ Each test suite may contain one to four different parts:\n calling test keywords.\n \n **Keywords**\n- Is used to define new user keywords, which may re-use existing keywords\n+ Is used to define new user keywords, which may reuse existing keywords\n from imported libraries or resource files.\n \n \n@@ -132,14 +132,14 @@ Remote-library approach provides the following benefits when testing Plone:\n Resource files\n --------------\n \n-Resource files provide a re-usable way to abstract your test suites. To put\n+Resource files provide a reusable way to abstract your test suites. To put\n it simply, resources files are just like all the other ``.robot``-files, but\n they should not contain ``*** Test Cases ***`` certain ``*** Settings ***``\n commands (*Suite Setup*, *Suite Teardown*, *Test Setup* or *Test Teardown*).\n \n Resource files are the perfect way to import common libraries (with *Library*\n command in ```*** Settings ***``), define global ``*** Variables ***`` and\n-define re-usable common ```*** Keywords ***```. Resource files are included\n+define reusable common ```*** Keywords ***```. Resource files are included\n in a test suite with *Resource*-command in ```*** Settings ***``:\n \n .. code-block:: robotframework\ndiff --git a/src/plone/app/robotframework/content.py b/src/plone/app/robotframework/content.py\nindex 31459b2..75d6cc8 100644\n--- a/src/plone/app/robotframework/content.py\n+++ b/src/plone/app/robotframework/content.py\n@@ -224,7 +224,7 @@ def fire_transition(self, content, action):\n """Fire workflow action for content"""\n disableCSRFProtection()\n # It should be ok to use unrestricted-methods, because workflow\n- # transition guard should proctect unprivileged transition:\n+ # transition guard should protect unprivileged transition:\n pc = getToolByName(self, "portal_catalog")\n results = pc.unrestrictedSearchResults(UID=content)\n obj = results[0]._unrestrictedGetObject()\ndiff --git a/src/plone/app/robotframework/i18n.py b/src/plone/app/robotframework/i18n.py\nindex 2af6f82..73d132a 100644\n--- a/src/plone/app/robotframework/i18n.py\n+++ b/src/plone/app/robotframework/i18n.py\n@@ -21,7 +21,7 @@ def set_default_language(self, language=None):\n \n def translate(self, msgid, *args, **kwargs):\n """Return localized string for given msgid"""\n- # FIXME: we are alrady using robotframework = 3.0\n+ # FIXME: we are already using robotframework = 3.0\n # XXX: Because kwargs are only supported with robotframework >= 2.8.3,\n # we must parse them here to support robotframework < 2.8.3.\n for arg in [x for x in args if "=" in x]:\ndiff --git a/src/plone/app/robotframework/robotentrypoints.py b/src/plone/app/robotframework/robotentrypoints.py\nindex 71357d5..8159b32 100644\n--- a/src/plone/app/robotframework/robotentrypoints.py\n+++ b/src/plone/app/robotframework/robotentrypoints.py\n@@ -69,7 +69,7 @@ def ride():\n \n plone.app.robotframework[ride,reload]\n \n-Remember that ride must be lauched with system python with\n+Remember that ride must be launched with system python with\n wxPython installed, like:\n \n /usr/bin/python bin/ride\ndiff --git a/src/plone/app/robotframework/server.py b/src/plone/app/robotframework/server.py\nindex c21ba8b..6f8205e 100644\n--- a/src/plone/app/robotframework/server.py\n+++ b/src/plone/app/robotframework/server.py\n@@ -300,7 +300,7 @@ def stop_zope_server(self, force=False):\n if not self.stop_zope_server_lazy or force:\n tear_down()\n else:\n- # With lazy stop, the layer is saved to enable Zope2Server re-use\n+ # With lazy stop, the layer is saved to enable Zope2Server reuse\n # within the same process, until tear_down is called explicitly.\n Zope2Server.stop_zope_server_layer = self.zope_layer\n self.zope_layer = None\ndiff --git a/src/plone/app/robotframework/users.py b/src/plone/app/robotframework/users.py\nindex 537e34e..2611968 100644\n--- a/src/plone/app/robotframework/users.py\n+++ b/src/plone/app/robotframework/users.py\n@@ -11,7 +11,7 @@ class Users(RemoteLibrary):\n def create_user(self, *args, **kwargs):\n """Create user with given details and return its id"""\n disableCSRFProtection()\n- # FIXME: we are alrady using robotframework = 3.0\n+ # FIXME: we are already using robotframework = 3.0\n # XXX: Because kwargs are only supported with robotframework >= 2.8.3,\n # we must parse them here to support robotframework < 2.8.3.\n for arg in [x for x in args if "=" in x]:\n' -Repository: plone.app.content +Repository: plone.app.robotframework Branch: refs/heads/master -Date: 2023-10-18T11:30:24+02:00 +Date: 2023-10-15T18:28:13+02:00 Author: Gil Forcada Codinachs (gforcada) -Commit: https://github.com/plone/plone.app.content/commit/90fa015eb39abae377a53bd953f49de06fccdc30 +Commit: https://github.com/plone/plone.app.robotframework/commit/7aa057388618e4d2ec75ce10ce59af4dded3fae9 -feat: i18ndude +feat: flake8 Files changed: -M plone/app/content/browser/templates/content_status_history.pt +M docs/source/conf.py -b'diff --git a/plone/app/content/browser/templates/content_status_history.pt b/plone/app/content/browser/templates/content_status_history.pt\nindex 6edd7a9..05dbd29 100644\n--- a/plone/app/content/browser/templates/content_status_history.pt\n+++ b/plone/app/content/browser/templates/content_status_history.pt\n@@ -25,8 +25,8 @@\n \n \n
\n- Note\n- This form is used in two different ways - from folder_contents,\n+ Note\n+ This form is used in two different ways - from folder_contents,\n allowing you to publish several things at once, and from the state\n drop-down. In the first case, the \'paths\' request parameter is set;\n in the second case, giving the relative paths to the content object\n' +b"diff --git a/docs/source/conf.py b/docs/source/conf.py\nindex 7743766..0f15e1e 100644\n--- a/docs/source/conf.py\n+++ b/docs/source/conf.py\n@@ -10,10 +10,6 @@\n # All configuration values have a default; values that are commented out\n # serve to show the default.\n \n-import os\n-import sys\n-\n-\n # If extensions (or modules to document with autodoc) are in another directory,\n # add these directories to sys.path here. If the directory is relative to the\n # documentation root, use os.path.abspath to make it absolute, like shown here.\n@@ -172,11 +168,11 @@\n \n latex_elements = {\n # The paper size ('letterpaper' or 'a4paper').\n- #'papersize': 'letterpaper',\n+ # 'papersize': 'letterpaper',\n # The font size ('10pt', '11pt' or '12pt').\n- #'pointsize': '10pt',\n+ # 'pointsize': '10pt',\n # Additional stuff for the LaTeX preamble.\n- #'preamble': '',\n+ # 'preamble': '',\n }\n \n # Grouping the document tree into LaTeX files. List of tuples\n" -Repository: plone.app.content +Repository: plone.app.robotframework Branch: refs/heads/master -Date: 2023-10-18T11:30:24+02:00 +Date: 2023-10-15T18:28:13+02:00 Author: Gil Forcada Codinachs (gforcada) -Commit: https://github.com/plone/plone.app.content/commit/b676160c3017d7bfd6afaa1826069ba685eb8046 +Commit: https://github.com/plone/plone.app.robotframework/commit/151dc374970c3295ebe33db797da72a23e57ed68 -fix: break circular dependency - -With `plone.app.layout` +feat: declare dependencies Files changed: -M plone/app/content/browser/configure.zcml -M plone/app/content/browser/vocabulary.py M setup.py -b'diff --git a/plone/app/content/browser/configure.zcml b/plone/app/content/browser/configure.zcml\nindex b69207b..8c9ce6e 100644\n--- a/plone/app/content/browser/configure.zcml\n+++ b/plone/app/content/browser/configure.zcml\n@@ -182,13 +182,13 @@\n \n \n \n 4.1.2",\n' - -Repository: plone.app.content - - -Branch: refs/heads/master -Date: 2023-10-18T11:30:24+02:00 -Author: Gil Forcada Codinachs (gforcada) -Commit: https://github.com/plone/plone.app.content/commit/1fb49faceb9a0c8e6a445aac82f94ed6b5e9be01 - -chore: zpretty XML/ZCML - -Files changed: -M plone/app/content/browser/configure.zcml -M plone/app/content/browser/contents/configure.zcml -M plone/app/content/configure.zcml -M plone/app/content/tests/profiles/non-ascii-workflow-profile/workflows.xml -M plone/app/content/tests/profiles/non-ascii-workflow-profile/workflows/non-ascii-workflow/definition.xml -M plone/app/content/tests/profiles/non-ascii-workflow.zcml - -b'diff --git a/plone/app/content/browser/configure.zcml b/plone/app/content/browser/configure.zcml\nindex 8c9ce6e6..f2762e98 100644\n--- a/plone/app/content/browser/configure.zcml\n+++ b/plone/app/content/browser/configure.zcml\n@@ -1,204 +1,213 @@\n \n-\n- \n- \n-\n- \n- \n-\n- \n- \n-\n- \n-\n- \n- \n-\n- \n-\n- \n-\n- \n- \n-\n- \n- \n- \n- \n-\n- \n- \n-\n- \n- \n-\n- \n-\n- \n- \n-\n- \n- \n-\n- \n-\n- \n-\n- \n- \n-\n- \n-\n- \n-\n- \n-\n- \n-\n-\n- \n-\n- \n-\n- \n-\n- \n-\n- \n-\n- \n+ xmlns:five="http://namespaces.zope.org/five"\n+ >\n+\n+ \n+ \n+\n+ \n+ \n+\n+ \n+ \n+\n+ \n+\n+ \n+ \n+\n+ \n+\n+ \n+\n+ \n+ \n+\n+ \n+ \n+ \n+ \n+\n+ \n+ \n+\n+ \n+ \n+\n+ \n+\n+ \n+ \n+\n+ \n+ \n+\n+ \n+\n+ \n+\n+ \n+ \n+\n+ \n+\n+ \n+\n+ \n+\n+ \n+\n+\n+ \n+\n+ \n+\n+ \n+\n+ \n+\n+ \n+\n+ \n \n \ndiff --git a/plone/app/content/browser/contents/configure.zcml b/plone/app/content/browser/contents/configure.zcml\nindex d6773cb5..931d4b90 100644\n--- a/plone/app/content/browser/contents/configure.zcml\n+++ b/plone/app/content/browser/contents/configure.zcml\n@@ -1,123 +1,140 @@\n \n+ >\n \n \n+ name="folder_contents"\n+ for="Products.CMFCore.interfaces._content.IFolderish"\n+ class=".FolderContentsView"\n+ template="templates/folder_contents.pt"\n+ permission="cmf.ListFolderContents"\n+ />\n \n \n+ name="fc-contextInfo"\n+ for="Products.CMFCore.interfaces._content.IFolderish"\n+ class=".ContextInfo"\n+ permission="cmf.ListFolderContents"\n+ />\n \n \n+ name="fc-setDefaultPage"\n+ for="Products.CMFCore.interfaces._content.IFolderish"\n+ class=".defaultpage.SetDefaultPageActionView"\n+ permission="cmf.ModifyPortalContent"\n+ />\n \n \n+ name="fc-itemOrder"\n+ for="Products.CMFCore.interfaces._content.IFolderish"\n+ class=".rearrange.ItemOrderActionView"\n+ permission="cmf.ModifyPortalContent"\n+ />\n \n \n+ name="fc-rearrange"\n+ for="Products.CMFCore.interfaces._content.IFolderish"\n+ class=".rearrange.RearrangeActionView"\n+ permission="cmf.ModifyPortalContent"\n+ />\n \n \n \n- \n+ name="fc-rename"\n+ for="Products.CMFCore.interfaces._content.IFolderish"\n+ class=".rename.RenameActionView"\n+ permission="cmf.ListFolderContents"\n+ />\n+ \n \n \n- \n+ name="fc-tags"\n+ for="Products.CMFCore.interfaces._content.IFolderish"\n+ class=".tags.TagsActionView"\n+ permission="cmf.ListFolderContents"\n+ />\n+ \n \n \n- \n+ name="fc-delete"\n+ for="Products.CMFCore.interfaces._content.IFolderish"\n+ class=".delete.DeleteActionView"\n+ permission="cmf.ListFolderContents"\n+ />\n+ \n \n \n- \n+ name="fc-workflow"\n+ for="Products.CMFCore.interfaces._content.IFolderish"\n+ class=".workflow.WorkflowActionView"\n+ permission="cmf.ListFolderContents"\n+ />\n+ \n \n \n- \n+ name="fc-properties"\n+ for="Products.CMFCore.interfaces._content.IFolderish"\n+ class=".properties.PropertiesActionView"\n+ permission="cmf.ListFolderContents"\n+ />\n+ \n \n \n- \n+ name="fc-copy"\n+ for="Products.CMFCore.interfaces._content.IFolderish"\n+ class=".copy.CopyActionView"\n+ permission="cmf.ListFolderContents"\n+ />\n+ \n \n \n- \n+ name="fc-cut"\n+ for="Products.CMFCore.interfaces._content.IFolderish"\n+ class=".cut.CutActionView"\n+ permission="cmf.ListFolderContents"\n+ />\n+ \n \n \n- \n+ name="fc-paste"\n+ for="Products.CMFCore.interfaces._content.IFolderish"\n+ class=".paste.PasteActionView"\n+ permission="cmf.ListFolderContents"\n+ />\n+ \n \ndiff --git a/plone/app/content/configure.zcml b/plone/app/content/configure.zcml\nindex 60466f64..615fd613 100644\n--- a/plone/app/content/configure.zcml\n+++ b/plone/app/content/configure.zcml\n@@ -1,23 +1,24 @@\n \n+ xmlns:plone="http://namespaces.plone.org/plone"\n+ >\n \n- \n- \n+ \n+ \n \n- \n- \n+ \n \n- \n- \n+ \n+ \n \n \ndiff --git a/plone/app/content/tests/profiles/non-ascii-workflow-profile/workflows.xml b/plone/app/content/tests/profiles/non-ascii-workflow-profile/workflows.xml\nindex 12fd9c2e..8f49355d 100644\n--- a/plone/app/content/tests/profiles/non-ascii-workflow-profile/workflows.xml\n+++ b/plone/app/content/tests/profiles/non-ascii-workflow-profile/workflows.xml\n@@ -1,6 +1,10 @@\n-\n-\n+\n+\n \n- \n+ \n \n \ndiff --git a/plone/app/content/tests/profiles/non-ascii-workflow-profile/workflows/non-ascii-workflow/definition.xml b/plone/app/content/tests/profiles/non-ascii-workflow-profile/workflows/non-ascii-workflow/definition.xml\nindex 308dc6a3..cbd432e7 100644\n--- a/plone/app/content/tests/profiles/non-ascii-workflow-profile/workflows/non-ascii-workflow/definition.xml\n+++ b/plone/app/content/tests/profiles/non-ascii-workflow-profile/workflows/non-ascii-workflow/definition.xml\n@@ -1,55 +1,72 @@\n-\n+\n \n+ state_variable="review_state"\n+ title="Workflow for non-ascii characters"\n+ workflow_id="non-ascii-workflow"\n+ i18n:attributes="title"\n+ i18n:domain="plone.app.content.tests"\n+>\n \n- View\n+ View\n \n- \n- \n- \n- Manager\n- \n- \n+ \n+ \n+ \n+ Manager\n+ \n+ \n \n- \n- \n- \n- Manager\n- \n- \n+ \n+ \n+ \n+ Manager\n+ \n+ \n \n- \n- To \xc3\x84fter!\n- \n- Modify portal content\n- \n- \n+ \n+ To \xc3\x84fter!\n+ \n+ Modify portal content\n+ \n+ \n \n- \n- To \xc3\x8fnitial!\n- \n- Modify portal content\n- \n- \n+ \n+ To \xc3\x8fnitial!\n+ \n+ Modify portal content\n+ \n+ \n \n \ndiff --git a/plone/app/content/tests/profiles/non-ascii-workflow.zcml b/plone/app/content/tests/profiles/non-ascii-workflow.zcml\nindex 1f2ac79a..5b84eb18 100644\n--- a/plone/app/content/tests/profiles/non-ascii-workflow.zcml\n+++ b/plone/app/content/tests/profiles/non-ascii-workflow.zcml\n@@ -1,14 +1,15 @@\n \n+ i18n_domain="plone.app.content.tests"\n+ >\n \n- \n+ \n \n \n' - -Repository: plone.app.content - - -Branch: refs/heads/master -Date: 2023-10-18T11:30:24+02:00 -Author: Gil Forcada Codinachs (gforcada) -Commit: https://github.com/plone/plone.app.content/commit/e0d3862965b1510b22f90fac5932108e8bbb58ec - -chore: zpretty PT - -Files changed: -M plone/app/content/browser/constraintypes.pt -M plone/app/content/browser/folderfactories.pt -M plone/app/content/browser/full_review_list.pt -M plone/app/content/browser/table.pt - -b'diff --git a/plone/app/content/browser/constraintypes.pt b/plone/app/content/browser/constraintypes.pt\nindex d2d50c1..2cb548d 100644\n--- a/plone/app/content/browser/constraintypes.pt\n+++ b/plone/app/content/browser/constraintypes.pt\n@@ -1,13 +1,17 @@\n-\n- \n-
\n- \n-
\n+ \n+ \n \n- \n+ \n \n \n \n \n \n-

Title

\n+

Title

\n \n \n \n@@ -64,4 +70,3 @@\n
\n \n \n-\ndiff --git a/plone/app/content/browser/folderfactories.pt b/plone/app/content/browser/folderfactories.pt\nindex 7767a65..c2305f5 100644\n--- a/plone/app/content/browser/folderfactories.pt\n+++ b/plone/app/content/browser/folderfactories.pt\n@@ -1,74 +1,104 @@\n-\n+ xml:lang="en"\n+ i18n:domain="plone"\n+>\n \n-\n+ \n \n-\n+ tal:define="\n+ dummy python:request.set(\'disable_border\',1);\n+ disable_column_one python:request.set(\'disable_plone.leftcolumn\',1);\n+ disable_column_two python:request.set(\'disable_plone.rightcolumn\',1);\n+ "\n+ />\n+ \n \n-\n+ \n \n-\n+ \n \n-

Add new item

\n+

Add new item

\n \n-
\n+
\n Select the type of item you want to add to your folder.\n-
\n+
\n \n-
\n+
\n

\n- \n+ \n Click to configure what type of items can be added here…\n- \n+ \n

\n \n \n \n-
\n+ \n \n-
    \n- \n-
  • \n- \n- \n- Type description\n-
  • \n-
    \n-
\n+
    \n+ \n+
  • \n+ \n+ \n+ Type description\n+
  • \n+
    \n+
\n \n-
\n- \n-
\n-
\n+
\n+ \n+
\n+ \n
\n-
\n+
\n \n-
\n+
\n \n-\n+ \n \ndiff --git a/plone/app/content/browser/full_review_list.pt b/plone/app/content/browser/full_review_list.pt\nindex 25549e7..8fd2c8e 100644\n--- a/plone/app/content/browser/full_review_list.pt\n+++ b/plone/app/content/browser/full_review_list.pt\n@@ -1,31 +1,40 @@\n-\n+ xml:lang="en"\n+ i18n:domain="plone"\n+>\n \n-\n+ \n \n-\n- \n-

Full review list:

\n+ \n+ \n+

Full review list:

\n \n-
\n-
\n-
\n- \n+
\n+ \n+
\n+ \n \n-
\n+
\n \n-
\n-\n+
\n+ \n \ndiff --git a/plone/app/content/browser/table.pt b/plone/app/content/browser/table.pt\nindex 5a79f19..939d107 100644\n--- a/plone/app/content/browser/table.pt\n+++ b/plone/app/content/browser/table.pt\n@@ -1,175 +1,303 @@\n
\n- \n- \n- \n- \n- \n+ i18n:domain="plone"\n+>\n+ \n+ \n+ \n+ \n+ \n \n- \n+ tal:attributes="\n+ value item/path|item/id|item/getId;\n+ "\n+ />\n \n \n

\n+ i18n:translate="description_no_visible_items_add_paste"\n+ >\n This folder has no visible items. To add content, press the\n add button, or paste content from another location.\n

\n \n \n+ tal:define="\n+ nosortclass view/get_nosort_class;\n+ "\n+ >\n \n-
\n+
\n \n-
\n+
\n \n+ >\n \n \n- \n+ \n \n \n- \n \n \n- \n \n \n \n \n \n+ tal:condition="view/show_select_column"\n+ > \n \n+ id="foldercontents-title-column"\n+ > Title \n \n+ tal:condition="view/show_size_column"\n+ > Size \n \n+ tal:condition="view/show_modified_column"\n+ > Modified \n \n+ tal:condition="view/show_status_column"\n+ > State \n \n \n \n \n \n \n- \n+ \n \n- \n- \n \n \n \n- \n \n \n@@ -177,30 +305,47 @@\n \n \n \n- \n \n \n- \n \n \n \n
Select: AllSelect:\n+ All
\n- \n- All items on this\n+ \n+ \n+ All\n+ \n+ items on this\n page are selected.\n \n- Select all\n- items in this folder.\n+ Select all\n+ \n+ items in this folder.\n
\n- \n- All items in this folder\n+ \n+ \n+ All\n+ \n+ items in this folder\n are selected.\n \n- Clear selection\n+ Clear selection\n
\n+ tal:condition="view/show_sort_column"\n+ >\n   Title  Size  Modified  State 
\n- \n- \n+ \n+ \n+ \n ▲\n- \n+ \n  \n- \n+ \n ▼\n- \n- \n+ \n+ \n \n- \n+ \n+ \n- \n- \n- \n- \n- \n- \n+ \n+ \n+ \n+ \n ■\n- \n- \n+ \n+ \n \n expired\n+ i18n:translate="time_expired"\n+ >expired\n \n-   \n+ \n+  \n+ \n size \n+ tal:attributes="\n+ class item/state_class|nothing;\n+ "\n+ >\n+ size\n+ \n \n+ tal:attributes="\n+ class string:${state_class} ${modified_sortable};\n+ "\n+ >\n 08/19/2001 03:01 AM\n \n- \n+ tal:attributes="\n+ class item/state_class|nothing;\n+ "\n+ i18n:translate=""\n+ >\n  \n
\n- \n+ Show all items\n+ >Show all items\n
\n- \n+ Show batched\n+ >Show batched\n
\n-
\n+
\n \n \n+ />\n \n \n
\n' - -Repository: plone.app.content - - -Branch: refs/heads/master -Date: 2023-10-18T11:30:24+02:00 -Author: Gil Forcada Codinachs (gforcada) -Commit: https://github.com/plone/plone.app.content/commit/756ade3e4a6e1baed6e4dfaa4b7c45a1baac75e5 - -chore: zpretty PT - -Files changed: -M plone/app/content/browser/templates/content_status_history.pt -M plone/app/content/browser/templates/delete_confirmation.pt -M plone/app/content/browser/templates/object_rename.pt -M plone/app/content/browser/templates/select_default_page.pt -M plone/app/content/browser/templates/select_default_view.pt - -b'diff --git a/plone/app/content/browser/templates/content_status_history.pt b/plone/app/content/browser/templates/content_status_history.pt\nindex 05dbd29..ed967dd 100644\n--- a/plone/app/content/browser/templates/content_status_history.pt\n+++ b/plone/app/content/browser/templates/content_status_history.pt\n@@ -1,384 +1,529 @@\n-\n+ xml:lang="en"\n+ i18n:domain="plone"\n+>\n \n \n- \n+ \n \n \n \n- \n+ \n \n- \n+ \n+ tal:attributes="\n+ src string:${portal_url}/jscalendar/calendar-en.js;\n+ "\n+ >\n \n \n \n \n \n-
\n+
\n Note\n This form is used in two different ways - from folder_contents,\n allowing you to publish several things at once, and from the state\n drop-down. In the first case, the \'paths\' request parameter is set;\n in the second case, giving the relative paths to the content object\n to manipulate; in the second case, this parameter is omitted and the\n- path of the context is used.\n+ path of the context is used.\n
\n \n \n- \n+ \n \n+ tal:replace="view/redirect_to_referrer"\n+ />\n \n

Publishing process

\n+ i18n:translate="heading_publishing_process"\n+ >Publishing process\n \n-
\n+
\n An item\'s status (also called its review state) determines who\n can see it. Another way to control the visibility of an item is\n- with its Publishing Date. An item is not publicly\n+ with its\n+ Publishing Date. An item is not publicly\n searchable before its publishing date. This will prevent the item\n from showing up in portlets and folder listings, although the item\n will still be available if accessed directly via its URL.\n
\n \n
\n-
\n-\n-
\n- \n-
Validation error output
\n-
\n- \n- \n- \n- \n- \n- \n+ \n+ \n+ \n+ \n+\n+
\n- \n- \n+ \n+\n+
\n+ \n+
Validation error output
\n+
\n+ \n+ \n+ \n+ \n+ \n+ \n- \n+ \n- \n+ \n- \n+ \n- \n- \n- \n-\n- \n- \n- \n- \n-\n- \n- \n+ \n+ \n+\n+ \n+ \n+ \n+ \n+\n+ \n+ \n-\n- \n- \n+\n+ \n+ \n- \n- \n- \n- \n- \n-\n-
\n+ \n+ \n Title\n- \n+ \n Size\n- \n+ \n Modified\n- \n+ \n State\n-
\n- \n- \n- \n-\n- \n- \n- \n- \n-
\n+ \n+ \n+ \n+\n+ \n+ \n+ \n+ \n+ \n- \n- \n-\n- expired\n- \n-   \n- size \n- \n+ \n+ \n+ \n+\n+ expired\n+ \n+ \n+  \n+ \n+ \n+ size\n+ \n+ \n 08/19/2001 03:01 AM\n- \n- \n-  \n-
\n-
\n-
\n-\n-
\n-\n- \n-
\n+ \n+  \n+
\n+
\n+
\n+\n+
\n+\n+ \n+ \n+ \n \n-
\n+
\n If checked, this will attempt to modify the status of all content\n in any selected folders and their subfolders.\n-
\n-\n-
\n-\n-
\n- \n-
\n+
\n+\n+
\n+\n+
\n+ \n+
\n The date when the item will be published. If no date is selected the\n item will be published immediately.\n-
\n-\n-
Validation error output
\n-\n-
\n-\n-
\n+
\n+\n+
Validation error output
\n+\n+
\n+\n+
\n calendar pop-up\n-
\n-\n-
\n
\n \n-
\n- \n-
\n+
\n+
\n+\n+
\n+ \n+
\n The date when the item expires. This will automatically\n make the item invisible for others at the given date.\n If no date is chosen, it will never expire.\n-
\n-\n-
Validation error output
\n-\n-
\n-
\n-\n-
\n+
\n+\n+
Validation error output
\n+\n+
\n+
\n+\n+
\n calendar pop-up\n-
\n-
\n
\n
\n+
\n+
\n \n-
\n- \n+
\n+ \n \n-
\n+
\n Will be added to the publishing history. If multiple\n items are selected, this comment will be attached to all\n of them.\n-
\n- \n-
\n-\n-
\n- \n-
\n+
\n+ \n+
\n+\n+
\n+ \n+
\n Select the transition to be used for modifying the items state.\n-
\n-\n-
\n-\n-
\n- Error\n-
\n-
\n+
\n+\n+
\n+\n+
\n+ Error\n+
\n+
\n \n- \n+ \n For usability we will want to signify what state we are\n currently in. DCWorkflow only returns what transitions are\n available. But we want to visually represent what *state* we\n are currently in along with possible transitions.\n- \n-\n- \n- \n-
\n-\n- \n- \n- \n-
\n-
\n-\n-
\n-\n-
\n-\n-
\n- \n- \n- \n-
\n-\n- \n- \n- \n- \n+ \n+\n+ \n+ \n+
\n+\n+ \n+ \n+ \n+
\n+
\n+\n+
\n+\n+
\n+\n+
\n+ \n+ \n+ \n+
\n+\n+ \n+ \n+ \n+ \n
\n \n \ndiff --git a/plone/app/content/browser/templates/delete_confirmation.pt b/plone/app/content/browser/templates/delete_confirmation.pt\nindex f9348d6..29241d5 100644\n--- a/plone/app/content/browser/templates/delete_confirmation.pt\n+++ b/plone/app/content/browser/templates/delete_confirmation.pt\n@@ -1,55 +1,73 @@\n-\n+ xml:lang="en"\n+ i18n:domain="plone"\n+>\n \n- \n+ \n \n- \n+ \n \n- \n+ \n \n-

\n+

\n This item can not be deleted because it is currently locked by another user.\n-

\n+ \n \n- \n-

\n- \n+ \n+

\n+ \n Do you really want to delete this folder and all its contents?\n- \n- \n- (This will delete a total of 22 items.)\n- \n-

\n-\n-

\n+ \n+ \n+ (This will delete a total of\n+ 22\n+ items.)\n+ \n+

\n+\n+

\n Do you really want to delete this item?\n-

\n-
\n+

\n+
\n \n-
\n- \n- \n+
\n+ \n+ \n \n-
    \n-
  • The item title (ID)
  • \n-
\n+
    \n+
  • The item title (ID)
  • \n+
\n \n-
\n-
\n+ \n+
\n \n-
\n- \n+
\n+ \n \ndiff --git a/plone/app/content/browser/templates/object_rename.pt b/plone/app/content/browser/templates/object_rename.pt\nindex 9c95d7b..e951e4f 100644\n--- a/plone/app/content/browser/templates/object_rename.pt\n+++ b/plone/app/content/browser/templates/object_rename.pt\n@@ -1,28 +1,35 @@\n-\n+ xml:lang="en"\n+ i18n:domain="plone"\n+>\n \n- \n+ \n \n- \n+ \n \n- \n+ \n \n-
\n+
\n \n-

Rename item

\n+

Rename item

\n \n-
\n-
\n-
\n+
\n+ \n+
\n \n-
\n- \n+
\n+
\n \n- \n+ \n \ndiff --git a/plone/app/content/browser/templates/select_default_page.pt b/plone/app/content/browser/templates/select_default_page.pt\nindex 6686c39..302fbd1 100644\n--- a/plone/app/content/browser/templates/select_default_page.pt\n+++ b/plone/app/content/browser/templates/select_default_page.pt\n@@ -1,91 +1,124 @@\n-\n+ xml:lang="en"\n+ i18n:domain="plone"\n+>\n \n-\n+ \n \n \n \n \n

Select default page

\n+ i18n:translate="heading_select_default_page"\n+ >Select default page\n \n-
\n+
\n Please select item which will be displayed as the default page of the\n folder.\n
\n
\n-
\n+ \n \n- \n+ \n \n- \n- \n-
\n- \n-
\n- \n-
\n+
\n Item Description\n-
\n-
\n+ \n+ \n \n-
\n+ \n \n
\n \n+ name="form.buttons.Save"\n+ type="submit"\n+ value="Save"\n+ i18n:attributes="value label_save;"\n+ i18n:translate="label_save"\n+ >Save\n \n+ name="form.buttons.Cancel"\n+ type="submit"\n+ value="Cancel"\n+ i18n:attributes="value label_cancel;"\n+ i18n:translate="label_cancel"\n+ >Cancel\n
\n \n-
\n+ \n \n
\n There are no items in this folder that can be selected as\n a default view page.\n
\n
\n- \n+ \n
\n
\n-
\n+ \n \n-
\n+ \n
\n \n \ndiff --git a/plone/app/content/browser/templates/select_default_view.pt b/plone/app/content/browser/templates/select_default_view.pt\nindex 6776969..b7ccdbb 100644\n--- a/plone/app/content/browser/templates/select_default_view.pt\n+++ b/plone/app/content/browser/templates/select_default_view.pt\n@@ -1,89 +1,131 @@\n-\n+ xml:lang="en"\n+ i18n:domain="plone"\n+>\n \n-\n+ \n \n \n \n \n \n

Select default view

\n+ i18n:translate="heading_select_default_view"\n+ >Select default view\n \n-
\n+
\n Please select which template should be used as the default view of the\n folder.\n
\n \n
\n-
\n+ \n \n- \n+ \n \n-
\n- \n- \n- \n-
\n \n-
\n- \n- \n-
\n+
\n+ \n+ \n+
\n \n-
\n+ \n
\n \n \n' +b'diff --git a/setup.py b/setup.py\nindex a78eeb3..c578ea7 100644\n--- a/setup.py\n+++ b/setup.py\n@@ -49,14 +49,20 @@ def read(filename):\n entry_points = dict(console_scripts=console_scripts)\n \n install_requires = [\n- "Products.CMFCore",\n+ "Pillow",\n "Products.CMFPlone",\n- "Products.MailHost",\n "Products.PlonePAS >= 5.0.1",\n "Products.PluggableAuthService",\n "babel",\n+ "docutils",\n "plone.app.testing",\n+ "plone.app.textfield",\n "plone.base",\n+ "plone.dexterity",\n+ "plone.i18n",\n+ "plone.namedfile",\n+ "plone.protect",\n+ "plone.registry",\n "plone.testing",\n "plone.uuid",\n "robotframework",\n@@ -66,19 +72,23 @@ def read(filename):\n "robotsuite", # not a direct dependency, but required for convenience\n "selenium",\n "setuptools",\n+ "z3c.form",\n+ "z3c.relationfield",\n "zope.component",\n- "zope.configuration",\n "zope.i18n",\n+ "zope.intid",\n "zope.schema",\n "zope.testrunner",\n ]\n \n test_requires = [\n- "plone.app.dexterity",\n+ "Products.MailHost",\n "plone.app.textfield",\n "plone.dexterity",\n "robotsuite",\n+ "webtest",\n "z3c.form",\n+ "zope.configuration",\n ]\n \n debug_requires = [\n' -Repository: plone.app.content +Repository: plone.app.robotframework Branch: refs/heads/master -Date: 2023-10-19T10:06:11+02:00 +Date: 2023-10-19T10:07:36+02:00 Author: Gil Forcada Codinachs (gforcada) -Commit: https://github.com/plone/plone.app.content/commit/11bb056dc8d7d9a045be6f2fba8fa8f383dce812 +Commit: https://github.com/plone/plone.app.robotframework/commit/b99da570c0649cd308837058768e83e77bb1cb88 -Merge pull request #262 from plone/config-with-default-template-7150e786 +Merge pull request #145 from plone/config-with-default-template-78bb80ce Config with default template @@ -266,57 +192,48 @@ A .flake8 A .github/workflows/meta.yml A .meta.toml A .pre-commit-config.yaml -A news/5cdbd962.internal +A news/434550cc.internal A tox.ini M .gitignore M CHANGES.rst -M plone/app/content/browser/actions.py -M plone/app/content/browser/configure.zcml -M plone/app/content/browser/constraintypes.pt -M plone/app/content/browser/constraintypes.py -M plone/app/content/browser/content_status_history.py -M plone/app/content/browser/contents/__init__.py -M plone/app/content/browser/contents/configure.zcml -M plone/app/content/browser/contents/copy.py -M plone/app/content/browser/contents/cut.py -M plone/app/content/browser/contents/delete.py -M plone/app/content/browser/contents/paste.py -M plone/app/content/browser/contents/properties.py -M plone/app/content/browser/contents/rename.py -M plone/app/content/browser/contents/tags.py -M plone/app/content/browser/contents/workflow.py -M plone/app/content/browser/folderfactories.pt -M plone/app/content/browser/full_review_list.pt -M plone/app/content/browser/i18n.py -M plone/app/content/browser/interfaces.py -M plone/app/content/browser/selection.py -M plone/app/content/browser/table.pt -M plone/app/content/browser/table.txt -M plone/app/content/browser/templates/content_status_history.pt -M plone/app/content/browser/templates/delete_confirmation.pt -M plone/app/content/browser/templates/object_rename.pt -M plone/app/content/browser/templates/select_default_page.pt -M plone/app/content/browser/templates/select_default_view.pt -M plone/app/content/browser/vocabulary.py -M plone/app/content/configure.zcml -M plone/app/content/namechooser.py -M plone/app/content/testing.py -M plone/app/content/tests/profiles/non-ascii-workflow-profile/workflows.xml -M plone/app/content/tests/profiles/non-ascii-workflow-profile/workflows/non-ascii-workflow/definition.xml -M plone/app/content/tests/profiles/non-ascii-workflow.zcml -M plone/app/content/tests/test_actions.py -M plone/app/content/tests/test_adding.py -M plone/app/content/tests/test_content_status_modify.py -M plone/app/content/tests/test_contents.py -M plone/app/content/tests/test_folder.py -M plone/app/content/tests/test_namechooser_unit.py -M plone/app/content/tests/test_non_ascii_characters_in_workflow_state.py -M plone/app/content/tests/test_selectdefaultpage.py -M plone/app/content/tests/test_widgets.py -M plone/app/content/utils.py +M docs/source/conf.py +M docs/source/happy.rst +M docs/source/keywords.rst +M docs/source/libdoc/python_debugging.html +M docs/source/libdoc/python_layoutmath.html +M docs/source/libdoc/python_saucelabs.html +M docs/source/libdoc/python_zope2server.html +M docs/source/libdoc/remote_autologin.html +M docs/source/libdoc/remote_content.html +M docs/source/libdoc/remote_genericsetup.html +M docs/source/libdoc/remote_i18n.html +M docs/source/libdoc/remote_mockmailhost.html +M docs/source/libdoc/remote_quickinstaller.html +M docs/source/libdoc/remote_users.html +M docs/source/libdoc/remote_zope2server.html +M docs/source/libdoc/selenium.html +M docs/source/libdoc/user_keywords.html +M docs/source/libdoc/user_saucelabs.html +M docs/source/libdoc/user_selenium.html +M docs/source/libdoc/user_server.html +M docs/source/remote.rst +M docs/source/robot.rst M pyproject.toml M setup.py +M src/plone/app/robotframework/content.py +M src/plone/app/robotframework/i18n.py +M src/plone/app/robotframework/reload.py +M src/plone/app/robotframework/remote.py +M src/plone/app/robotframework/robotentrypoints.py +M src/plone/app/robotframework/saucelabs.py +M src/plone/app/robotframework/server.py +M src/plone/app/robotframework/testing.py +M src/plone/app/robotframework/tests/test_content.py +M src/plone/app/robotframework/users.py +D buildout.cfg +D docs.cfg +D requirements.txt D setup.cfg -b'diff --git a/.editorconfig b/.editorconfig\nnew file mode 100644\nindex 00000000..8ae05aaa\n--- /dev/null\n+++ b/.editorconfig\n@@ -0,0 +1,54 @@\n+# Generated from:\n+# https://github.com/plone/meta/tree/master/config/default\n+# See the inline comments on how to expand/tweak this configuration file\n+#\n+# EditorConfig Configuration file, for more details see:\n+# http://EditorConfig.org\n+# EditorConfig is a convention description, that could be interpreted\n+# by multiple editors to enforce common coding conventions for specific\n+# file types\n+\n+# top-most EditorConfig file:\n+# Will ignore other EditorConfig files in Home directory or upper tree level.\n+root = true\n+\n+\n+[*] # For All Files\n+# Unix-style newlines with a newline ending every file\n+end_of_line = lf\n+insert_final_newline = true\n+trim_trailing_whitespace = true\n+# Set default charset\n+charset = utf-8\n+# Indent style default\n+indent_style = space\n+# Max Line Length - a hard line wrap, should be disabled\n+max_line_length = off\n+\n+[*.{py,cfg,ini}]\n+# 4 space indentation\n+indent_size = 4\n+\n+[*.{yml,zpt,pt,dtml,zcml}]\n+# 2 space indentation\n+indent_size = 2\n+\n+[*.{json,jsonl,js,jsx,ts,tsx,css,less,scss,html}] # Frontend development\n+# 2 space indentation\n+indent_size = 2\n+max_line_length = 80\n+\n+[{Makefile,.gitmodules}]\n+# Tab indentation (no size specified, but view as 4 spaces)\n+indent_style = tab\n+indent_size = unset\n+tab_width = unset\n+\n+\n+##\n+# Add extra configuration options in .meta.toml:\n+# [editorconfig]\n+# extra_lines = """\n+# _your own configuration lines_\n+# """\n+##\ndiff --git a/.flake8 b/.flake8\nnew file mode 100644\nindex 00000000..7ef4f64d\n--- /dev/null\n+++ b/.flake8\n@@ -0,0 +1,22 @@\n+# Generated from:\n+# https://github.com/plone/meta/tree/master/config/default\n+# See the inline comments on how to expand/tweak this configuration file\n+[flake8]\n+doctests = 1\n+ignore =\n+ # black takes care of line length\n+ E501,\n+ # black takes care of where to break lines\n+ W503,\n+ # black takes care of spaces within slicing (list[:])\n+ E203,\n+ # black takes care of spaces after commas\n+ E231,\n+\n+##\n+# Add extra configuration options in .meta.toml:\n+# [flake8]\n+# extra_lines = """\n+# _your own configuration lines_\n+# """\n+##\ndiff --git a/.github/workflows/meta.yml b/.github/workflows/meta.yml\nnew file mode 100644\nindex 00000000..aa2345cf\n--- /dev/null\n+++ b/.github/workflows/meta.yml\n@@ -0,0 +1,70 @@\n+# Generated from:\n+# https://github.com/plone/meta/tree/master/config/default\n+# See the inline comments on how to expand/tweak this configuration file\n+name: Meta\n+on:\n+ push:\n+ branches:\n+ - master\n+ - main\n+ pull_request:\n+ branches:\n+ - master\n+ - main\n+ workflow_dispatch:\n+\n+##\n+# To set environment variables for all jobs, add in .meta.toml:\n+# [github]\n+# env = """\n+# debug: 1\n+# image-name: \'org/image\'\n+# image-tag: \'latest\'\n+# """\n+##\n+\n+jobs:\n+ qa:\n+ uses: plone/meta/.github/workflows/qa.yml@main\n+ test:\n+ uses: plone/meta/.github/workflows/test.yml@main\n+ coverage:\n+ uses: plone/meta/.github/workflows/coverage.yml@main\n+ dependencies:\n+ uses: plone/meta/.github/workflows/dependencies.yml@main\n+ release_ready:\n+ uses: plone/meta/.github/workflows/release_ready.yml@main\n+\n+# TODO: enable the circular dependencies check once the circular\n+# dependency with plone.app.dexterity is fixed.\n+# See https://github.com/plone/Products.CMFPlone/issues/3858\n+\n+##\n+# To modify the list of default jobs being created add in .meta.toml:\n+# [github]\n+# jobs = [\n+# "qa",\n+# "test",\n+# "coverage",\n+# "dependencies",\n+# "release_ready",\n+# "circular",\n+# ]\n+##\n+\n+##\n+# To request that some OS level dependencies get installed\n+# when running tests/coverage jobs, add in .meta.toml:\n+# [github]\n+# os_dependencies = "git libxml2 libxslt"\n+##\n+\n+\n+##\n+# Specify additional jobs in .meta.toml:\n+# [github]\n+# extra_lines = """\n+# another:\n+# uses: org/repo/.github/workflows/file.yml@main\n+# """\n+##\ndiff --git a/.gitignore b/.gitignore\nindex d12b524c..503e47c5 100644\n--- a/.gitignore\n+++ b/.gitignore\n@@ -1,23 +1,55 @@\n-/develop-eggs\n-/eggs\n-/fake-eggs\n-/bin\n-/parts\n-/downloads\n-/var\n-/build\n-/dist\n-/local.cfg\n-/*.egg-info\n-/.installed.cfg\n-/.mr.developer.cfg\n+# Generated from:\n+# https://github.com/plone/meta/tree/master/config/default\n+# See the inline comments on how to expand/tweak this configuration file\n+# python related\n+*.egg-info\n *.pyc\n-/.Python\n-/include\n-/lib\n-/src/*\n+*.pyo\n+\n+# translation related\n *.mo\n-/.coverage\n+\n+# tools related\n+build/\n+.coverage\n+.*project\n coverage.xml\n-zptlint.log\n-.DS_Store\n+dist/\n+docs/_build\n+__pycache__/\n+.tox\n+.vscode/\n+node_modules/\n+\n+# venv / buildout related\n+bin/\n+develop-eggs/\n+eggs/\n+.eggs/\n+etc/\n+.installed.cfg\n+include/\n+lib/\n+lib64\n+.mr.developer.cfg\n+parts/\n+pyvenv.cfg\n+var/\n+\n+# mxdev\n+/instance/\n+/.make-sentinels/\n+/*-mxdev.txt\n+/reports/\n+/sources/\n+/venv/\n+.installed.txt\n+\n+\n+##\n+# Add extra configuration options in .meta.toml:\n+# [gitignore]\n+# extra_lines = """\n+# _your own configuration lines_\n+# """\n+##\ndiff --git a/.meta.toml b/.meta.toml\nnew file mode 100644\nindex 00000000..d5d5bc47\n--- /dev/null\n+++ b/.meta.toml\n@@ -0,0 +1,26 @@\n+# Generated from:\n+# https://github.com/plone/meta/tree/master/config/default\n+# See the inline comments on how to expand/tweak this configuration file\n+[meta]\n+template = "default"\n+commit-id = "68cda6e4"\n+\n+[github]\n+jobs = [\n+ "qa",\n+ "test",\n+ "coverage",\n+ "dependencies",\n+ "release_ready",\n+ ]\n+\n+[pre_commit]\n+zpretty_extra_lines = """\n+ exclude: plone/app/content/browser/contents/templates\n+"""\n+i18ndude_extra_lines = """\n+ exclude: plone/app/content/browser/contents\n+"""\n+\n+[pyproject]\n+dependencies_ignores = "[\'tus\', ]"\ndiff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml\nnew file mode 100644\nindex 00000000..fac51902\n--- /dev/null\n+++ b/.pre-commit-config.yaml\n@@ -0,0 +1,96 @@\n+# Generated from:\n+# https://github.com/plone/meta/tree/master/config/default\n+# See the inline comments on how to expand/tweak this configuration file\n+ci:\n+ autofix_prs: false\n+ autoupdate_schedule: monthly\n+\n+repos:\n+- repo: https://github.com/asottile/pyupgrade\n+ rev: v3.14.0\n+ hooks:\n+ - id: pyupgrade\n+ args: [--py38-plus]\n+- repo: https://github.com/pycqa/isort\n+ rev: 5.12.0\n+ hooks:\n+ - id: isort\n+- repo: https://github.com/psf/black\n+ rev: 23.9.1\n+ hooks:\n+ - id: black\n+- repo: https://github.com/collective/zpretty\n+ rev: 3.1.0\n+ hooks:\n+ - id: zpretty\n+ exclude: plone/app/content/browser/contents/templates\n+\n+##\n+# Add extra configuration options in .meta.toml:\n+# [pre_commit]\n+# zpretty_extra_lines = """\n+# _your own configuration lines_\n+# """\n+##\n+- repo: https://github.com/PyCQA/flake8\n+ rev: 6.1.0\n+ hooks:\n+ - id: flake8\n+\n+##\n+# Add extra configuration options in .meta.toml:\n+# [pre_commit]\n+# flake8_extra_lines = """\n+# _your own configuration lines_\n+# """\n+##\n+- repo: https://github.com/codespell-project/codespell\n+ rev: v2.2.6\n+ hooks:\n+ - id: codespell\n+ additional_dependencies:\n+ - tomli\n+\n+##\n+# Add extra configuration options in .meta.toml:\n+# [pre_commit]\n+# codespell_extra_lines = """\n+# _your own configuration lines_\n+# """\n+##\n+- repo: https://github.com/mgedmin/check-manifest\n+ rev: "0.49"\n+ hooks:\n+ - id: check-manifest\n+- repo: https://github.com/regebro/pyroma\n+ rev: "4.2"\n+ hooks:\n+ - id: pyroma\n+- repo: https://github.com/mgedmin/check-python-versions\n+ rev: "0.21.3"\n+ hooks:\n+ - id: check-python-versions\n+ args: [\'--only\', \'setup.py,pyproject.toml\']\n+- repo: https://github.com/collective/i18ndude\n+ rev: "6.1.0"\n+ hooks:\n+ - id: i18ndude\n+ exclude: plone/app/content/browser/contents\n+\n+\n+##\n+# Add extra configuration options in .meta.toml:\n+# [pre_commit]\n+# i18ndude_extra_lines = """\n+# _your own configuration lines_\n+# """\n+##\n+\n+\n+##\n+# Add extra configuration options in .meta.toml:\n+# [pre_commit]\n+# extra_lines = """\n+# _your own configuration lines_\n+# """\n+##\ndiff --git a/CHANGES.rst b/CHANGES.rst\nindex 531f0cee..ac89afd5 100644\n--- a/CHANGES.rst\n+++ b/CHANGES.rst\n@@ -210,7 +210,7 @@ Bug fixes:\n Bug fixes:\n \n \n-- Call fileUpload view explict with @@ to avoid possible plone.rest clashes.\n+- Call fileUpload view explicit with @@ to avoid possible plone.rest clashes.\n [jensens] (#225)\n \n \n@@ -552,7 +552,7 @@ Bug fixes:\n [thet]\n \n - Fix issue where some actions (copy, delete, paste) on contents view did not\n- work if there were any private (innaccessible for the current user) levels the\n+ work if there were any private (inaccessible for the current user) levels the\n current path\n [datakurre]\n \n@@ -908,7 +908,7 @@ Fixes:\n - When clicking cancel on the delete_confirmation got to the view_url.\n [ale-rt]\n \n-- Fix deletion of objects with unicode charaters in the title.\n+- Fix deletion of objects with unicode characters in the title.\n [cillianderoiste]\n \n \n@@ -988,7 +988,7 @@ Fixes:\n - Translate folder contents add menu\n [vangheem]\n \n-- use same columns title in results and in displayed colums configuration\n+- use same columns title in results and in displayed columns configuration\n [vincent]\n \n \ndiff --git a/news/5cdbd962.internal b/news/5cdbd962.internal\nnew file mode 100644\nindex 00000000..c08f5399\n--- /dev/null\n+++ b/news/5cdbd962.internal\n@@ -0,0 +1,2 @@\n+Update configuration files.\n+[plone devs]\ndiff --git a/plone/app/content/browser/actions.py b/plone/app/content/browser/actions.py\nindex b939b341..6f16e535 100644\n--- a/plone/app/content/browser/actions.py\n+++ b/plone/app/content/browser/actions.py\n@@ -38,7 +38,6 @@ def is_locked(self):\n \n \n class DeleteConfirmationForm(form.Form, LockingBase):\n-\n fields = field.Fields()\n template = ViewPageTemplateFile("templates/delete_confirmation.pt")\n enableCSRFProtection = True\n@@ -140,7 +139,6 @@ class IRenameForm(Interface):\n \n \n class RenameForm(form.Form):\n-\n fields = field.Fields(IRenameForm)\n template = ViewPageTemplateFile("templates/object_rename.pt")\n enableCSRFProtection = True\ndiff --git a/plone/app/content/browser/configure.zcml b/plone/app/content/browser/configure.zcml\nindex b69207b9..f2762e98 100644\n--- a/plone/app/content/browser/configure.zcml\n+++ b/plone/app/content/browser/configure.zcml\n@@ -1,204 +1,213 @@\n \n-\n- \n- \n-\n- \n- \n-\n- \n- \n-\n- \n-\n- \n- \n-\n- \n-\n- \n-\n- \n- \n-\n- \n- \n- \n- \n-\n- \n- \n-\n- \n- \n-\n- \n-\n- \n- \n-\n- \n- \n-\n- \n-\n- \n-\n- \n- \n-\n- \n-\n- \n-\n- \n-\n- \n-\n-\n- \n-\n- \n-\n- \n-\n- \n-\n- \n-\n- \n+ xmlns:five="http://namespaces.zope.org/five"\n+ >\n+\n+ \n+ \n+\n+ \n+ \n+\n+ \n+ \n+\n+ \n+\n+ \n+ \n+\n+ \n+\n+ \n+\n+ \n+ \n+\n+ \n+ \n+ \n+ \n+\n+ \n+ \n+\n+ \n+ \n+\n+ \n+\n+ \n+ \n+\n+ \n+ \n+\n+ \n+\n+ \n+\n+ \n+ \n+\n+ \n+\n+ \n+\n+ \n+\n+ \n+\n+\n+ \n+\n+ \n+\n+ \n+\n+ \n+\n+ \n+\n+ \n \n \ndiff --git a/plone/app/content/browser/constraintypes.pt b/plone/app/content/browser/constraintypes.pt\nindex ead1a965..2cb548d3 100644\n--- a/plone/app/content/browser/constraintypes.pt\n+++ b/plone/app/content/browser/constraintypes.pt\n@@ -1,20 +1,24 @@\n-\n- \n-
\n- \n-
\n+ \n+
\n \n- \n+ \n \n \n \n \n \n-

Title

\n+

Title

\n \n \n \n@@ -64,4 +70,3 @@\n
\n \n \n-\ndiff --git a/plone/app/content/browser/constraintypes.py b/plone/app/content/browser/constraintypes.py\nindex 6d8fd04d..1b83a091 100644\n--- a/plone/app/content/browser/constraintypes.py\n+++ b/plone/app/content/browser/constraintypes.py\n@@ -1,5 +1,4 @@\n from plone.autoform.form import AutoExtensibleForm\n-from plone.base import PloneMessageFactory as _\n from plone.base.interfaces import ISelectableConstrainTypes\n from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile\n from z3c.form import button\n@@ -61,7 +60,6 @@ def __call__(self, context):\n \n \n class IConstrainForm(Interface):\n-\n constrain_types_mode = Choice(\n title=_("label_type_restrictions", default="Type restrictions"),\n description=_(\n@@ -140,7 +138,6 @@ def secondary_types(self):\n \n \n class ConstrainsFormView(AutoExtensibleForm, form.EditForm):\n-\n schema = IConstrainForm\n label = _(\n "heading_set_content_type_restrictions",\ndiff --git a/plone/app/content/browser/content_status_history.py b/plone/app/content/browser/content_status_history.py\nindex b2882b97..d1810771 100644\n--- a/plone/app/content/browser/content_status_history.py\n+++ b/plone/app/content/browser/content_status_history.py\n@@ -48,7 +48,6 @@ class ContentStatusHistoryDatesForm(form.Form):\n \n \n class ContentStatusHistoryView(BrowserView):\n-\n template = ViewPageTemplateFile("templates/content_status_history.pt")\n \n def __init__(self, context, request):\n@@ -66,9 +65,8 @@ def __call__(\n effective_date=None,\n expiration_date=None,\n include_children=False,\n- *args\n+ *args,\n ):\n-\n data = self.dates_form.extractData()\n if self.request.get("form.widgets.effective_date-calendar", None) and data:\n effective_date = data[0]["effective_date"].strftime("%Y-%m-%d %H:%M")\ndiff --git a/plone/app/content/browser/contents/__init__.py b/plone/app/content/browser/contents/__init__.py\nindex eaafd1c1..66b8f221 100644\n--- a/plone/app/content/browser/contents/__init__.py\n+++ b/plone/app/content/browser/contents/__init__.py\n@@ -26,7 +26,6 @@\n \n \n class ContentsBaseAction(BrowserView):\n-\n success_msg = _("Success")\n failure_msg = _("Failure")\n required_obj_permission = None\n@@ -183,7 +182,7 @@ def get_thumb_scale(self):\n registry = getUtility(IRegistry)\n settings = registry.forInterface(ISiteSchema, prefix="plone", check=False)\n if settings.no_thumbs_tables:\n- # thumbs to be supressed\n+ # thumbs to be suppressed\n return None\n thumb_scale_table = settings.thumb_scale_table\n return thumb_scale_table\n@@ -293,7 +292,6 @@ def __call__(self):\n \n \n class ContextInfo(BrowserView):\n-\n attributes = [\n "CreationDate",\n "Creator",\ndiff --git a/plone/app/content/browser/contents/configure.zcml b/plone/app/content/browser/contents/configure.zcml\nindex d6773cb5..931d4b90 100644\n--- a/plone/app/content/browser/contents/configure.zcml\n+++ b/plone/app/content/browser/contents/configure.zcml\n@@ -1,123 +1,140 @@\n \n+ >\n \n \n+ name="folder_contents"\n+ for="Products.CMFCore.interfaces._content.IFolderish"\n+ class=".FolderContentsView"\n+ template="templates/folder_contents.pt"\n+ permission="cmf.ListFolderContents"\n+ />\n \n \n+ name="fc-contextInfo"\n+ for="Products.CMFCore.interfaces._content.IFolderish"\n+ class=".ContextInfo"\n+ permission="cmf.ListFolderContents"\n+ />\n \n \n+ name="fc-setDefaultPage"\n+ for="Products.CMFCore.interfaces._content.IFolderish"\n+ class=".defaultpage.SetDefaultPageActionView"\n+ permission="cmf.ModifyPortalContent"\n+ />\n \n \n+ name="fc-itemOrder"\n+ for="Products.CMFCore.interfaces._content.IFolderish"\n+ class=".rearrange.ItemOrderActionView"\n+ permission="cmf.ModifyPortalContent"\n+ />\n \n \n+ name="fc-rearrange"\n+ for="Products.CMFCore.interfaces._content.IFolderish"\n+ class=".rearrange.RearrangeActionView"\n+ permission="cmf.ModifyPortalContent"\n+ />\n \n \n \n- \n+ name="fc-rename"\n+ for="Products.CMFCore.interfaces._content.IFolderish"\n+ class=".rename.RenameActionView"\n+ permission="cmf.ListFolderContents"\n+ />\n+ \n \n \n- \n+ name="fc-tags"\n+ for="Products.CMFCore.interfaces._content.IFolderish"\n+ class=".tags.TagsActionView"\n+ permission="cmf.ListFolderContents"\n+ />\n+ \n \n \n- \n+ name="fc-delete"\n+ for="Products.CMFCore.interfaces._content.IFolderish"\n+ class=".delete.DeleteActionView"\n+ permission="cmf.ListFolderContents"\n+ />\n+ \n \n \n- \n+ name="fc-workflow"\n+ for="Products.CMFCore.interfaces._content.IFolderish"\n+ class=".workflow.WorkflowActionView"\n+ permission="cmf.ListFolderContents"\n+ />\n+ \n \n \n- \n+ name="fc-properties"\n+ for="Products.CMFCore.interfaces._content.IFolderish"\n+ class=".properties.PropertiesActionView"\n+ permission="cmf.ListFolderContents"\n+ />\n+ \n \n \n- \n+ name="fc-copy"\n+ for="Products.CMFCore.interfaces._content.IFolderish"\n+ class=".copy.CopyActionView"\n+ permission="cmf.ListFolderContents"\n+ />\n+ \n \n \n- \n+ name="fc-cut"\n+ for="Products.CMFCore.interfaces._content.IFolderish"\n+ class=".cut.CutActionView"\n+ permission="cmf.ListFolderContents"\n+ />\n+ \n \n \n- \n+ name="fc-paste"\n+ for="Products.CMFCore.interfaces._content.IFolderish"\n+ class=".paste.PasteActionView"\n+ permission="cmf.ListFolderContents"\n+ />\n+ \n \ndiff --git a/plone/app/content/browser/contents/copy.py b/plone/app/content/browser/contents/copy.py\nindex 015b995d..4259bd7b 100644\n--- a/plone/app/content/browser/contents/copy.py\n+++ b/plone/app/content/browser/contents/copy.py\n@@ -10,7 +10,6 @@\n \n @implementer(IStructureAction)\n class CopyAction:\n-\n order = 2\n \n def __init__(self, context, request):\ndiff --git a/plone/app/content/browser/contents/cut.py b/plone/app/content/browser/contents/cut.py\nindex e785931f..d7233305 100644\n--- a/plone/app/content/browser/contents/cut.py\n+++ b/plone/app/content/browser/contents/cut.py\n@@ -11,7 +11,6 @@\n \n @implementer(IStructureAction)\n class CutAction:\n-\n order = 1\n \n def __init__(self, context, request):\ndiff --git a/plone/app/content/browser/contents/delete.py b/plone/app/content/browser/contents/delete.py\nindex 5adac14a..8eb6018e 100644\n--- a/plone/app/content/browser/contents/delete.py\n+++ b/plone/app/content/browser/contents/delete.py\n@@ -16,7 +16,6 @@\n \n @implementer(IStructureAction)\n class DeleteAction:\n-\n template = ViewPageTemplateFile("templates/delete.pt")\n order = 4\n \ndiff --git a/plone/app/content/browser/contents/paste.py b/plone/app/content/browser/contents/paste.py\nindex 0250760d..52c09653 100644\n--- a/plone/app/content/browser/contents/paste.py\n+++ b/plone/app/content/browser/contents/paste.py\n@@ -9,7 +9,6 @@\n \n @implementer(IStructureAction)\n class PasteAction:\n-\n order = 3\n \n def __init__(self, context, request):\ndiff --git a/plone/app/content/browser/contents/properties.py b/plone/app/content/browser/contents/properties.py\nindex aba47250..c51e8a70 100644\n--- a/plone/app/content/browser/contents/properties.py\n+++ b/plone/app/content/browser/contents/properties.py\n@@ -5,9 +5,7 @@\n from plone.app.widgets.utils import get_datetime_options\n from plone.base import PloneMessageFactory as _\n from plone.base.defaultpage import check_default_page_via_view\n-from plone.dexterity.interfaces import IDexterityContent\n from Products.CMFCore.interfaces._content import IFolderish\n-from Products.CMFCore.utils import getToolByName\n from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile\n from zope.component import getUtility\n from zope.component.hooks import getSite\n@@ -20,7 +18,6 @@\n \n @implementer(IStructureAction)\n class PropertiesAction:\n-\n template = ViewPageTemplateFile("templates/properties.pt")\n order = 8\n \n@@ -54,7 +51,6 @@ class PropertiesActionView(ContentsBaseAction):\n required_obj_permission = "Modify portal content"\n \n def __call__(self):\n-\n if self.request.form.get("render") == "yes":\n lang_factory = getUtility(\n IVocabularyFactory, "plone.app.vocabularies.SupportedContentLanguages"\n@@ -95,7 +91,6 @@ def __call__(self):\n return super().__call__()\n \n def action(self, obj, bypass_recurse=False):\n-\n if check_default_page_via_view(obj, self.request):\n self.action(obj.aq_parent, bypass_recurse=True)\n recurse = self.recurse and not bypass_recurse\ndiff --git a/plone/app/content/browser/contents/rename.py b/plone/app/content/browser/contents/rename.py\nindex 25ad37f0..eb2a9d45 100644\n--- a/plone/app/content/browser/contents/rename.py\n+++ b/plone/app/content/browser/contents/rename.py\n@@ -23,7 +23,6 @@\n \n @implementer(IStructureAction)\n class RenameAction:\n-\n template = ViewPageTemplateFile("templates/rename.pt")\n order = 5\n \ndiff --git a/plone/app/content/browser/contents/tags.py b/plone/app/content/browser/contents/tags.py\nindex 01e8f141..fe18d205 100644\n--- a/plone/app/content/browser/contents/tags.py\n+++ b/plone/app/content/browser/contents/tags.py\n@@ -9,7 +9,6 @@\n \n @implementer(IStructureAction)\n class TagsAction:\n-\n template = ViewPageTemplateFile("templates/tags.pt")\n order = 6\n \ndiff --git a/plone/app/content/browser/contents/workflow.py b/plone/app/content/browser/contents/workflow.py\nindex a2a90a0b..8b5a5bb3 100644\n--- a/plone/app/content/browser/contents/workflow.py\n+++ b/plone/app/content/browser/contents/workflow.py\n@@ -14,7 +14,6 @@\n \n @implementer(IStructureAction)\n class WorkflowAction:\n-\n template = ViewPageTemplateFile("templates/workflow.pt")\n order = 7\n \ndiff --git a/plone/app/content/browser/folderfactories.pt b/plone/app/content/browser/folderfactories.pt\nindex 7767a653..c2305f58 100644\n--- a/plone/app/content/browser/folderfactories.pt\n+++ b/plone/app/content/browser/folderfactories.pt\n@@ -1,74 +1,104 @@\n-\n+ xml:lang="en"\n+ i18n:domain="plone"\n+>\n \n-\n+ \n \n-\n+ tal:define="\n+ dummy python:request.set(\'disable_border\',1);\n+ disable_column_one python:request.set(\'disable_plone.leftcolumn\',1);\n+ disable_column_two python:request.set(\'disable_plone.rightcolumn\',1);\n+ "\n+ />\n+ \n \n-\n+ \n \n-\n+ \n \n-

Add new item

\n+

Add new item

\n \n-
\n+
\n Select the type of item you want to add to your folder.\n-
\n+
\n \n-
\n+
\n

\n- \n+ \n Click to configure what type of items can be added here…\n- \n+ \n

\n \n \n \n-
\n+ \n \n-
    \n- \n-
  • \n- \n- \n- Type description\n-
  • \n-
    \n-
\n+
    \n+ \n+
  • \n+ \n+ \n+ Type description\n+
  • \n+
    \n+
\n \n-
\n- \n-
\n-
\n+
\n+ \n+
\n+ \n
\n-
\n+
\n \n-
\n+
\n \n-\n+ \n \ndiff --git a/plone/app/content/browser/full_review_list.pt b/plone/app/content/browser/full_review_list.pt\nindex 25549e75..8fd2c8ec 100644\n--- a/plone/app/content/browser/full_review_list.pt\n+++ b/plone/app/content/browser/full_review_list.pt\n@@ -1,31 +1,40 @@\n-\n+ xml:lang="en"\n+ i18n:domain="plone"\n+>\n \n-\n+ \n \n-\n- \n-

Full review list:

\n+ \n+ \n+

Full review list:

\n \n-
\n-
\n-
\n- \n+
\n+ \n+
\n+ \n \n-
\n+
\n \n-
\n-\n+
\n+ \n \ndiff --git a/plone/app/content/browser/i18n.py b/plone/app/content/browser/i18n.py\nindex 415508af..ebabfc1a 100644\n--- a/plone/app/content/browser/i18n.py\n+++ b/plone/app/content/browser/i18n.py\n@@ -35,7 +35,6 @@ def _gettext_catalog(self, domain, language):\n return _catalog\n \n def __call__(self, domain=None, language=None):\n-\n if domain is None:\n catalog = {}\n else:\ndiff --git a/plone/app/content/browser/interfaces.py b/plone/app/content/browser/interfaces.py\nindex 4cdfc356..5f300c3e 100644\n--- a/plone/app/content/browser/interfaces.py\n+++ b/plone/app/content/browser/interfaces.py\n@@ -2,7 +2,7 @@\n \n \n class IFolderContentsView(Interface):\n- """Interface, which provides methods for folder contens"""\n+ """Interface, which provides methods for folder contents"""\n \n def test(a, b, c):\n """A simple replacement of python\'s test."""\ndiff --git a/plone/app/content/browser/selection.py b/plone/app/content/browser/selection.py\nindex 1d5a7327..aaf5c566 100644\n--- a/plone/app/content/browser/selection.py\n+++ b/plone/app/content/browser/selection.py\n@@ -49,7 +49,9 @@ def __call__(self):\n self.request.response.redirect(context_view_url)\n \n if self.request.form.get("form.button.Save") and not template_id:\n- IStatusMessage(self.request).add("Please select a template.", type="warning")\n+ IStatusMessage(self.request).add(\n+ "Please select a template.", type="warning"\n+ )\n \n if self.request.form.get("form.button.Save") and template_id:\n # Make sure this is a valid template\ndiff --git a/plone/app/content/browser/table.pt b/plone/app/content/browser/table.pt\nindex 5a79f199..939d107e 100644\n--- a/plone/app/content/browser/table.pt\n+++ b/plone/app/content/browser/table.pt\n@@ -1,175 +1,303 @@\n
\n- \n- \n- \n- \n- \n+ i18n:domain="plone"\n+>\n+ \n+ \n+ \n+ \n+ \n \n- \n+ tal:attributes="\n+ value item/path|item/id|item/getId;\n+ "\n+ />\n \n \n

\n+ i18n:translate="description_no_visible_items_add_paste"\n+ >\n This folder has no visible items. To add content, press the\n add button, or paste content from another location.\n

\n \n \n+ tal:define="\n+ nosortclass view/get_nosort_class;\n+ "\n+ >\n \n-
\n+
\n \n-
\n+
\n \n+ >\n \n \n- \n+ \n \n \n- \n \n \n- \n \n \n \n \n \n+ tal:condition="view/show_select_column"\n+ > \n \n+ id="foldercontents-title-column"\n+ > Title \n \n+ tal:condition="view/show_size_column"\n+ > Size \n \n+ tal:condition="view/show_modified_column"\n+ > Modified \n \n+ tal:condition="view/show_status_column"\n+ > State \n \n \n \n \n \n \n- \n+ \n \n- \n- \n \n \n \n- \n \n \n@@ -177,30 +305,47 @@\n \n \n \n- \n \n \n- \n \n \n \n
Select: AllSelect:\n+ All
\n- \n- All items on this\n+ \n+ \n+ All\n+ \n+ items on this\n page are selected.\n \n- Select all\n- items in this folder.\n+ Select all\n+ \n+ items in this folder.\n
\n- \n- All items in this folder\n+ \n+ \n+ All\n+ \n+ items in this folder\n are selected.\n \n- Clear selection\n+ Clear selection\n
\n+ tal:condition="view/show_sort_column"\n+ >\n   Title  Size  Modified  State 
\n- \n- \n+ \n+ \n+ \n ▲\n- \n+ \n  \n- \n+ \n ▼\n- \n- \n+ \n+ \n \n- \n+ \n+ \n- \n- \n- \n- \n- \n- \n+ \n+ \n+ \n+ \n ■\n- \n- \n+ \n+ \n \n expired\n+ i18n:translate="time_expired"\n+ >expired\n \n-   \n+ \n+  \n+ \n size \n+ tal:attributes="\n+ class item/state_class|nothing;\n+ "\n+ >\n+ size\n+ \n \n+ tal:attributes="\n+ class string:${state_class} ${modified_sortable};\n+ "\n+ >\n 08/19/2001 03:01 AM\n \n- \n+ tal:attributes="\n+ class item/state_class|nothing;\n+ "\n+ i18n:translate=""\n+ >\n  \n
\n- \n+ Show all items\n+ >Show all items\n
\n- \n+ Show batched\n+ >Show batched\n
\n-
\n+
\n \n \n+ />\n \n \n
\ndiff --git a/plone/app/content/browser/table.txt b/plone/app/content/browser/table.txt\nindex f3337872..ae906a27 100644\n--- a/plone/app/content/browser/table.txt\n+++ b/plone/app/content/browser/table.txt\n@@ -3,7 +3,7 @@ Table\n =====\n \n The table class can render a table like used in the folder contents view. It is\n-abstracted into a seperate class for reuse with other views like the review\n+abstracted into a separate class for reuse with other views like the review\n list.\n \n A table can be parameterized at creation time.\n@@ -31,11 +31,11 @@ One of the table\'s main virtues is that it batches. A template can use the\n True\n \n The table automatically adds keys for making layout easier. One of these is\n-indication wheter an item is `checked`.\n+indication whether an item is `checked`.\n \n >>> list(table.batch)[0][\'checked\']\n \n-Wheter or not an item is checked depends on request variables. If either the\n+Whether or not an item is checked depends on request variables. If either the\n whole batch or the current screen is selected the item we be marked as checked.\n Below we will demonstrate this by selecting the items on screen.\n \n@@ -129,8 +129,8 @@ The same goes for selecting the screen and the whole batch.\n \'http://plone/view?pagenumber=1&pagesize=20&select=all\'\n \n A template may want to display only one of these urls at the same time.\n-Therefore the table has a boolean property to query wheter or not to show the\n-select all option. The display of this depends on wheter the whole batch is\n+Therefore the table has a boolean property to query whether or not to show the\n+select all option. The display of this depends on whether the whole batch is\n selected (don\'t show) or the screen has not been selected (don\'t show then).\n \n >>> table = Table({}, base_url, view_url, items=items)\ndiff --git a/plone/app/content/browser/templates/content_status_history.pt b/plone/app/content/browser/templates/content_status_history.pt\nindex 6edd7a9d..ed967ddf 100644\n--- a/plone/app/content/browser/templates/content_status_history.pt\n+++ b/plone/app/content/browser/templates/content_status_history.pt\n@@ -1,384 +1,529 @@\n-\n+ xml:lang="en"\n+ i18n:domain="plone"\n+>\n \n \n- \n+ \n \n \n \n- \n+ \n \n- \n+ \n+ tal:attributes="\n+ src string:${portal_url}/jscalendar/calendar-en.js;\n+ "\n+ >\n \n \n \n \n \n-
\n- Note\n- This form is used in two different ways - from folder_contents,\n+
\n+ Note\n+ This form is used in two different ways - from folder_contents,\n allowing you to publish several things at once, and from the state\n drop-down. In the first case, the \'paths\' request parameter is set;\n in the second case, giving the relative paths to the content object\n to manipulate; in the second case, this parameter is omitted and the\n- path of the context is used.\n+ path of the context is used.\n
\n \n \n- \n+ \n \n+ tal:replace="view/redirect_to_referrer"\n+ />\n \n

Publishing process

\n+ i18n:translate="heading_publishing_process"\n+ >Publishing process\n \n-
\n+
\n An item\'s status (also called its review state) determines who\n can see it. Another way to control the visibility of an item is\n- with its Publishing Date. An item is not publicly\n+ with its\n+ Publishing Date. An item is not publicly\n searchable before its publishing date. This will prevent the item\n from showing up in portlets and folder listings, although the item\n will still be available if accessed directly via its URL.\n
\n \n
\n-
\n-\n-
\n- \n-
Validation error output
\n-
\n- \n- \n- \n- \n- \n- \n+ \n+ \n+ \n+ \n+\n+
\n- \n- \n+ \n+\n+
\n+ \n+
Validation error output
\n+
\n+ \n+ \n+ \n+ \n+ \n+ \n- \n+ \n- \n+ \n- \n+ \n- \n- \n- \n-\n- \n- \n- \n- \n-\n- \n- \n+ \n+ \n+\n+ \n+ \n+ \n+ \n+\n+ \n+ \n-\n- \n- \n+\n+ \n+ \n- \n- \n- \n- \n- \n-\n-
\n+ \n+ \n Title\n- \n+ \n Size\n- \n+ \n Modified\n- \n+ \n State\n-
\n- \n- \n- \n-\n- \n- \n- \n- \n-
\n+ \n+ \n+ \n+\n+ \n+ \n+ \n+ \n+ \n- \n- \n-\n- expired\n- \n-   \n- size \n- \n+ \n+ \n+ \n+\n+ expired\n+ \n+ \n+  \n+ \n+ \n+ size\n+ \n+ \n 08/19/2001 03:01 AM\n- \n- \n-  \n-
\n-
\n-
\n-\n-
\n-\n- \n-
\n+ \n+  \n+
\n+
\n+
\n+\n+
\n+\n+ \n+ \n+ \n \n-
\n+
\n If checked, this will attempt to modify the status of all content\n in any selected folders and their subfolders.\n-
\n-\n-
\n-\n-
\n- \n-
\n+
\n+\n+
\n+\n+
\n+ \n+
\n The date when the item will be published. If no date is selected the\n item will be published immediately.\n-
\n-\n-
Validation error output
\n-\n-
\n-\n-
\n+
\n+\n+
Validation error output
\n+\n+
\n+\n+
\n calendar pop-up\n-
\n-\n-
\n
\n \n-
\n- \n-
\n+
\n+
\n+\n+
\n+ \n+
\n The date when the item expires. This will automatically\n make the item invisible for others at the given date.\n If no date is chosen, it will never expire.\n-
\n-\n-
Validation error output
\n-\n-
\n-
\n-\n-
\n+
\n+\n+
Validation error output
\n+\n+
\n+
\n+\n+
\n calendar pop-up\n-
\n-
\n
\n
\n+
\n+
\n \n-
\n- \n+
\n+ \n \n-
\n+
\n Will be added to the publishing history. If multiple\n items are selected, this comment will be attached to all\n of them.\n-
\n- \n-
\n-\n-
\n- \n-
\n+
\n+ \n+
\n+\n+
\n+ \n+
\n Select the transition to be used for modifying the items state.\n-
\n-\n-
\n-\n-
\n- Error\n-
\n-
\n+
\n+\n+
\n+\n+
\n+ Error\n+
\n+
\n \n- \n+ \n For usability we will want to signify what state we are\n currently in. DCWorkflow only returns what transitions are\n available. But we want to visually represent what *state* we\n are currently in along with possible transitions.\n- \n-\n- \n- \n-
\n-\n- \n- \n- \n-
\n-
\n-\n-
\n-\n-
\n-\n-
\n- \n- \n- \n-
\n-\n- \n- \n- \n- \n+ \n+\n+ \n+ \n+
\n+\n+ \n+ \n+ \n+
\n+
\n+\n+
\n+\n+
\n+\n+
\n+ \n+ \n+ \n+
\n+\n+ \n+ \n+ \n+ \n
\n \n \ndiff --git a/plone/app/content/browser/templates/delete_confirmation.pt b/plone/app/content/browser/templates/delete_confirmation.pt\nindex f9348d69..29241d53 100644\n--- a/plone/app/content/browser/templates/delete_confirmation.pt\n+++ b/plone/app/content/browser/templates/delete_confirmation.pt\n@@ -1,55 +1,73 @@\n-\n+ xml:lang="en"\n+ i18n:domain="plone"\n+>\n \n- \n+ \n \n- \n+ \n \n- \n+ \n \n-

\n+

\n This item can not be deleted because it is currently locked by another user.\n-

\n+ \n \n- \n-

\n- \n+ \n+

\n+ \n Do you really want to delete this folder and all its contents?\n- \n- \n- (This will delete a total of 22 items.)\n- \n-

\n-\n-

\n+ \n+ \n+ (This will delete a total of\n+ 22\n+ items.)\n+ \n+

\n+\n+

\n Do you really want to delete this item?\n-

\n-
\n+

\n+
\n \n-
\n- \n- \n+
\n+ \n+ \n \n-
    \n-
  • The item title (ID)
  • \n-
\n+
    \n+
  • The item title (ID)
  • \n+
\n \n-
\n-
\n+ \n+
\n \n-
\n- \n+
\n+ \n \ndiff --git a/plone/app/content/browser/templates/object_rename.pt b/plone/app/content/browser/templates/object_rename.pt\nindex 9c95d7b8..e951e4f3 100644\n--- a/plone/app/content/browser/templates/object_rename.pt\n+++ b/plone/app/content/browser/templates/object_rename.pt\n@@ -1,28 +1,35 @@\n-\n+ xml:lang="en"\n+ i18n:domain="plone"\n+>\n \n- \n+ \n \n- \n+ \n \n- \n+ \n \n-
\n+
\n \n-

Rename item

\n+

Rename item

\n \n-
\n-
\n-
\n+
\n+ \n+
\n \n-
\n- \n+
\n+
\n \n- \n+ \n \ndiff --git a/plone/app/content/browser/templates/select_default_page.pt b/plone/app/content/browser/templates/select_default_page.pt\nindex 6686c398..302fbd13 100644\n--- a/plone/app/content/browser/templates/select_default_page.pt\n+++ b/plone/app/content/browser/templates/select_default_page.pt\n@@ -1,91 +1,124 @@\n-\n+ xml:lang="en"\n+ i18n:domain="plone"\n+>\n \n-\n+ \n \n \n \n \n

Select default page

\n+ i18n:translate="heading_select_default_page"\n+ >Select default page\n \n-
\n+
\n Please select item which will be displayed as the default page of the\n folder.\n
\n
\n-
\n+ \n \n- \n+ \n \n- \n- \n-
\n- \n-
\n- \n-
\n+
\n Item Description\n-
\n-
\n+ \n+ \n \n-
\n+ \n \n
\n \n+ name="form.buttons.Save"\n+ type="submit"\n+ value="Save"\n+ i18n:attributes="value label_save;"\n+ i18n:translate="label_save"\n+ >Save\n \n+ name="form.buttons.Cancel"\n+ type="submit"\n+ value="Cancel"\n+ i18n:attributes="value label_cancel;"\n+ i18n:translate="label_cancel"\n+ >Cancel\n
\n \n-
\n+ \n \n
\n There are no items in this folder that can be selected as\n a default view page.\n
\n
\n- \n+ \n
\n
\n-
\n+ \n \n-
\n+ \n
\n \n \ndiff --git a/plone/app/content/browser/templates/select_default_view.pt b/plone/app/content/browser/templates/select_default_view.pt\nindex 6776969c..b7ccdbb9 100644\n--- a/plone/app/content/browser/templates/select_default_view.pt\n+++ b/plone/app/content/browser/templates/select_default_view.pt\n@@ -1,89 +1,131 @@\n-\n+ xml:lang="en"\n+ i18n:domain="plone"\n+>\n \n-\n+ \n \n \n \n \n \n

Select default view

\n+ i18n:translate="heading_select_default_view"\n+ >Select default view\n \n-
\n+
\n Please select which template should be used as the default view of the\n folder.\n
\n \n
\n-
\n+ \n \n- \n+ \n \n-
\n- \n- \n- \n-
\n \n-
\n- \n- \n-
\n+
\n+ \n+ \n+
\n \n-
\n+ \n
\n \n \ndiff --git a/plone/app/content/browser/vocabulary.py b/plone/app/content/browser/vocabulary.py\nindex f7693cd7..9464947e 100644\n--- a/plone/app/content/browser/vocabulary.py\n+++ b/plone/app/content/browser/vocabulary.py\n@@ -3,12 +3,12 @@\n from logging import getLogger\n from plone.app.content.utils import json_dumps\n from plone.app.content.utils import json_loads\n-from plone.app.layout.navigation.interfaces import INavigationRoot\n-from plone.app.layout.navigation.root import getNavigationRoot\n from plone.app.querystring import queryparser\n from plone.app.z3cform.interfaces import IFieldPermissionChecker\n from plone.autoform.interfaces import WRITE_PERMISSIONS_KEY\n from plone.base import PloneMessageFactory as _\n+from plone.base.interfaces.siteroot import INavigationRoot\n+from plone.base.navigationroot import get_navigation_root\n from plone.base.utils import safe_text\n from plone.memoize.view import memoize\n from plone.supermodel.utils import mergedTaggedValueDict\n@@ -125,7 +125,7 @@ def get_translated_ignored(self):\n return TRANSLATED_IGNORED\n \n def get_base_path(self, context):\n- return getNavigationRoot(context)\n+ return get_navigation_root(context)\n \n def __call__(self):\n """\n@@ -139,7 +139,7 @@ def __call__(self):\n sort_on: index,\n sort_order: (asc|reversed)\n }\n- attributes: comma seperated, or json object list\n+ attributes: comma separated, or json object list\n batch: {\n page: 1-based page of results,\n size: size of paged results\n@@ -183,7 +183,7 @@ def __call__(self):\n if batch and ("size" not in batch or "page" not in batch):\n batch = None # batching not providing correct options\n if batch:\n- # must be slicable for batching support\n+ # must be sliceable for batching support\n page = int(batch["page"])\n size = int(batch["size"])\n if size > MAX_BATCH_SIZE:\ndiff --git a/plone/app/content/configure.zcml b/plone/app/content/configure.zcml\nindex 60466f64..615fd613 100644\n--- a/plone/app/content/configure.zcml\n+++ b/plone/app/content/configure.zcml\n@@ -1,23 +1,24 @@\n \n+ xmlns:plone="http://namespaces.plone.org/plone"\n+ >\n \n- \n- \n+ \n+ \n \n- \n- \n+ \n \n- \n- \n+ \n+ \n \n \ndiff --git a/plone/app/content/namechooser.py b/plone/app/content/namechooser.py\nindex c16633b1..0d9fe5ed 100644\n--- a/plone/app/content/namechooser.py\n+++ b/plone/app/content/namechooser.py\n@@ -83,7 +83,7 @@ def _findUniqueName(self, name, obj):\n return new_name\n \n raise ValueError(\n- "Cannot find a unique name based on %s after %d attemps."\n+ "Cannot find a unique name based on %s after %d attempts."\n % (\n name,\n ATTEMPTS,\ndiff --git a/plone/app/content/testing.py b/plone/app/content/testing.py\nindex b5a85ce1..20d1670b 100644\n--- a/plone/app/content/testing.py\n+++ b/plone/app/content/testing.py\n@@ -45,7 +45,6 @@ def ExampleFunctionVocabulary(context, query=None):\n \n \n class PloneAppContent(PloneSandboxLayer):\n-\n defaultBases = (PLONE_FIXTURE,)\n \n USER_NAME = "johndoe"\ndiff --git a/plone/app/content/tests/profiles/non-ascii-workflow-profile/workflows.xml b/plone/app/content/tests/profiles/non-ascii-workflow-profile/workflows.xml\nindex 12fd9c2e..8f49355d 100644\n--- a/plone/app/content/tests/profiles/non-ascii-workflow-profile/workflows.xml\n+++ b/plone/app/content/tests/profiles/non-ascii-workflow-profile/workflows.xml\n@@ -1,6 +1,10 @@\n-\n-\n+\n+\n \n- \n+ \n \n \ndiff --git a/plone/app/content/tests/profiles/non-ascii-workflow-profile/workflows/non-ascii-workflow/definition.xml b/plone/app/content/tests/profiles/non-ascii-workflow-profile/workflows/non-ascii-workflow/definition.xml\nindex 308dc6a3..cbd432e7 100644\n--- a/plone/app/content/tests/profiles/non-ascii-workflow-profile/workflows/non-ascii-workflow/definition.xml\n+++ b/plone/app/content/tests/profiles/non-ascii-workflow-profile/workflows/non-ascii-workflow/definition.xml\n@@ -1,55 +1,72 @@\n-\n+\n \n+ state_variable="review_state"\n+ title="Workflow for non-ascii characters"\n+ workflow_id="non-ascii-workflow"\n+ i18n:attributes="title"\n+ i18n:domain="plone.app.content.tests"\n+>\n \n- View\n+ View\n \n- \n- \n- \n- Manager\n- \n- \n+ \n+ \n+ \n+ Manager\n+ \n+ \n \n- \n- \n- \n- Manager\n- \n- \n+ \n+ \n+ \n+ Manager\n+ \n+ \n \n- \n- To \xc3\x84fter!\n- \n- Modify portal content\n- \n- \n+ \n+ To \xc3\x84fter!\n+ \n+ Modify portal content\n+ \n+ \n \n- \n- To \xc3\x8fnitial!\n- \n- Modify portal content\n- \n- \n+ \n+ To \xc3\x8fnitial!\n+ \n+ Modify portal content\n+ \n+ \n \n \ndiff --git a/plone/app/content/tests/profiles/non-ascii-workflow.zcml b/plone/app/content/tests/profiles/non-ascii-workflow.zcml\nindex 1f2ac79a..5b84eb18 100644\n--- a/plone/app/content/tests/profiles/non-ascii-workflow.zcml\n+++ b/plone/app/content/tests/profiles/non-ascii-workflow.zcml\n@@ -1,14 +1,15 @@\n \n+ i18n_domain="plone.app.content.tests"\n+ >\n \n- \n+ \n \n \ndiff --git a/plone/app/content/tests/test_actions.py b/plone/app/content/tests/test_actions.py\nindex 62108fda..121b9e33 100644\n--- a/plone/app/content/tests/test_actions.py\n+++ b/plone/app/content/tests/test_actions.py\n@@ -8,7 +8,8 @@\n from plone.locking.interfaces import ILockable\n from plone.testing.zope import Browser\n from z3c.form.interfaces import IFormLayer\n-from zExceptions import Unauthorized, NotFound\n+from zExceptions import NotFound\n+from zExceptions import Unauthorized\n from zope.component import getMultiAdapter\n from zope.interface import alsoProvides\n \n@@ -37,7 +38,7 @@ def setUp(self):\n self.browser = Browser(self.layer["app"])\n self.browser.handleErrors = False\n self.browser.addHeader(\n- "Authorization", "Basic {}:{}".format(TEST_USER_NAME, TEST_USER_PASSWORD)\n+ "Authorization", f"Basic {TEST_USER_NAME}:{TEST_USER_PASSWORD}"\n )\n \n def tearDown(self):\n@@ -124,7 +125,7 @@ def prepare_for_acquisition_tests(self):\n browser_2 = Browser(self.layer["app"])\n browser_2.handleErrors = False\n browser_2.addHeader(\n- "Authorization", "Basic {}:{}".format(TEST_USER_NAME, TEST_USER_PASSWORD)\n+ "Authorization", f"Basic {TEST_USER_NAME}:{TEST_USER_PASSWORD}"\n )\n \n # return the id of the root page, the nested page itself, and the\ndiff --git a/plone/app/content/tests/test_adding.py b/plone/app/content/tests/test_adding.py\nindex b5b9bfb4..b813c5e8 100644\n--- a/plone/app/content/tests/test_adding.py\n+++ b/plone/app/content/tests/test_adding.py\n@@ -5,7 +5,6 @@\n \n \n class AddingTests(unittest.TestCase):\n-\n layer = PLONE_APP_CONTENT_INTEGRATION_TESTING\n \n def setUp(self):\ndiff --git a/plone/app/content/tests/test_content_status_modify.py b/plone/app/content/tests/test_content_status_modify.py\nindex e1e782e0..7b53a48c 100644\n--- a/plone/app/content/tests/test_content_status_modify.py\n+++ b/plone/app/content/tests/test_content_status_modify.py\n@@ -124,7 +124,6 @@ def testEditorCanSubmitButNotPublish(self):\n \n \n class TestContentStatusModifyFunctional(unittest.TestCase):\n-\n layer = PLONE_APP_CONTENT_DX_FUNCTIONAL_TESTING\n \n def setUp(self):\ndiff --git a/plone/app/content/tests/test_contents.py b/plone/app/content/tests/test_contents.py\nindex f7402fac..80ba2ecd 100644\n--- a/plone/app/content/tests/test_contents.py\n+++ b/plone/app/content/tests/test_contents.py\n@@ -90,8 +90,8 @@ def setUp(self):\n @mock.patch(\n "plone.app.content.browser.contents.ContentsBaseAction.protect", lambda x: True\n ) # noqa\n- def test_delete_success_with_private_anchestor(self):\n- """Delete content item from a folder with private anchestor"""\n+ def test_delete_success_with_private_ancestor(self):\n+ """Delete content item from a folder with private ancestor"""\n # Create test content /it1/it2/it3\n self.portal.invokeFactory("type1", id="it1", title="Item 1")\n self.portal.it1.invokeFactory("type1", id="it2", title="Item 2")\n@@ -222,8 +222,8 @@ def test_paste_fail_constraint(self):\n @mock.patch(\n "plone.app.content.browser.contents.ContentsBaseAction.protect", lambda x: True\n ) # noqa\n- def test_paste_success_with_private_anchestor(self):\n- """Copy content item and paste into a folder with private anchestor"""\n+ def test_paste_success_with_private_ancestor(self):\n+ """Copy content item and paste into a folder with private ancestor"""\n # Create test content /it2/it3\n self.portal.invokeFactory("type1", id="it2", title="Item 2")\n self.portal.it2.invokeFactory("type1", id="it3", title="Item 3")\n@@ -274,8 +274,8 @@ def setUp(self):\n @mock.patch(\n "plone.app.content.browser.contents.ContentsBaseAction.protect", lambda x: True\n ) # noqa\n- def test_rename_success_with_private_anchestor(self):\n- """Rename content item from a folder with private anchestor"""\n+ def test_rename_success_with_private_ancestor(self):\n+ """Rename content item from a folder with private ancestor"""\n # Create test content /it1/it2/it3\n self.portal.invokeFactory("type1", id="it1", title="Item 1")\n self.portal.it1.invokeFactory("type1", id="it2", title="Item 2")\ndiff --git a/plone/app/content/tests/test_folder.py b/plone/app/content/tests/test_folder.py\nindex 01d2764f..eef41bfe 100644\n--- a/plone/app/content/tests/test_folder.py\n+++ b/plone/app/content/tests/test_folder.py\n@@ -51,7 +51,6 @@ def setUp(self):\n \n \n class DXBaseTest(BaseTest):\n-\n layer = PLONE_APP_CONTENT_DX_INTEGRATION_TESTING\n \n def setUp(self):\n@@ -126,7 +125,6 @@ def testCreators(self):\n \n \n class WorkflowTest(BaseTest):\n-\n layer = PLONE_APP_CONTENT_DX_FUNCTIONAL_TESTING\n \n def convertDateTimeToIndexRepr(self, date):\n@@ -166,7 +164,6 @@ def testStateChange(self):\n \n \n class RenameTest(BaseTest):\n-\n layer = PLONE_APP_CONTENT_DX_INTEGRATION_TESTING\n \n def test_folder_rename_objects(self):\n@@ -204,7 +201,6 @@ def test_default_page_updated_on_rename_objects(self):\n \n \n class ContextInfoTest(BaseTest):\n-\n layer = PLONE_APP_CONTENT_DX_INTEGRATION_TESTING\n \n def testStateChange(self):\ndiff --git a/plone/app/content/tests/test_namechooser_unit.py b/plone/app/content/tests/test_namechooser_unit.py\nindex ec3df752..d9d3f660 100644\n--- a/plone/app/content/tests/test_namechooser_unit.py\n+++ b/plone/app/content/tests/test_namechooser_unit.py\n@@ -13,7 +13,6 @@\n \n \n class NameChooserTest(unittest.TestCase):\n-\n layer = PLONE_APP_CONTENT_INTEGRATION_TESTING\n \n def setUp(self):\ndiff --git a/plone/app/content/tests/test_non_ascii_characters_in_workflow_state.py b/plone/app/content/tests/test_non_ascii_characters_in_workflow_state.py\nindex 386e0697..cef6398e 100644\n--- a/plone/app/content/tests/test_non_ascii_characters_in_workflow_state.py\n+++ b/plone/app/content/tests/test_non_ascii_characters_in_workflow_state.py\n@@ -11,7 +11,6 @@\n \n \n class TestNonAsciiCharactersWorkflow(unittest.TestCase):\n-\n layer = PLONE_APP_CONTENT_NON_ASCII_INTEGRATION_TESTING\n \n def setUp(self):\ndiff --git a/plone/app/content/tests/test_selectdefaultpage.py b/plone/app/content/tests/test_selectdefaultpage.py\nindex 3af4f1ce..ff3a2857 100644\n--- a/plone/app/content/tests/test_selectdefaultpage.py\n+++ b/plone/app/content/tests/test_selectdefaultpage.py\n@@ -28,12 +28,13 @@\n \n \n class SelectDefaultPageDXTestCase(unittest.TestCase):\n-\n layer = PLONE_APP_CONTENT_DX_FUNCTIONAL_TESTING\n \n def setUp(self):\n self.portal = self.layer["portal"]\n- self.portal.acl_users.userFolderAddUser("editor", TEST_USER_PASSWORD, ["Editor"], [])\n+ self.portal.acl_users.userFolderAddUser(\n+ "editor", TEST_USER_PASSWORD, ["Editor"], []\n+ )\n \n self._create_structure()\n transaction.commit()\ndiff --git a/plone/app/content/tests/test_widgets.py b/plone/app/content/tests/test_widgets.py\nindex c3577139..d87b6193 100644\n--- a/plone/app/content/tests/test_widgets.py\n+++ b/plone/app/content/tests/test_widgets.py\n@@ -69,7 +69,6 @@ def _disable_permission_checker(context):\n \n \n class BrowserTest(unittest.TestCase):\n-\n layer = PLONE_APP_CONTENT_DX_INTEGRATION_TESTING\n \n def setUp(self):\n@@ -664,7 +663,6 @@ def testGetMimeIcon(self):\n \n \n class FunctionalBrowserTest(unittest.TestCase):\n-\n layer = PLONE_APP_CONTENT_DX_FUNCTIONAL_TESTING\n \n def setUp(self):\ndiff --git a/plone/app/content/utils.py b/plone/app/content/utils.py\nindex d61cf028..a6131bba 100644\n--- a/plone/app/content/utils.py\n+++ b/plone/app/content/utils.py\n@@ -8,6 +8,7 @@\n # use simplejson because it\'s ahead of stdlib and supports more types\n import simplejson\n \n+\n try:\n from z3c.relationfield.relation import RelationValue\n except ImportError:\ndiff --git a/pyproject.toml b/pyproject.toml\nindex 05b615de..0e84fbc5 100644\n--- a/pyproject.toml\n+++ b/pyproject.toml\n@@ -1,6 +1,9 @@\n+# Generated from:\n+# https://github.com/plone/meta/tree/master/config/default\n+# See the inline comments on how to expand/tweak this configuration file\n [tool.towncrier]\n-filename = "CHANGES.rst"\n directory = "news/"\n+filename = "CHANGES.rst"\n title_format = "{version} ({project_date})"\n underlines = ["-", ""]\n \n@@ -18,3 +21,137 @@ showcontent = true\n directory = "bugfix"\n name = "Bug fixes:"\n showcontent = true\n+\n+[[tool.towncrier.type]]\n+directory = "internal"\n+name = "Internal:"\n+showcontent = true\n+\n+[[tool.towncrier.type]]\n+directory = "documentation"\n+name = "Documentation:"\n+showcontent = true\n+\n+[[tool.towncrier.type]]\n+directory = "tests"\n+name = "Tests"\n+showcontent = true\n+\n+##\n+# Add extra configuration options in .meta.toml:\n+# [pyproject]\n+# towncrier_extra_lines = """\n+# extra_configuration\n+# """\n+##\n+\n+[tool.isort]\n+profile = "plone"\n+\n+##\n+# Add extra configuration options in .meta.toml:\n+# [pyproject]\n+# isort_extra_lines = """\n+# extra_configuration\n+# """\n+##\n+\n+[tool.black]\n+target-version = ["py38"]\n+\n+##\n+# Add extra configuration options in .meta.toml:\n+# [pyproject]\n+# black_extra_lines = """\n+# extra_configuration\n+# """\n+##\n+\n+[tool.codespell]\n+ignore-words-list = "discreet,"\n+skip = "*.po,"\n+##\n+# Add extra configuration options in .meta.toml:\n+# [pyproject]\n+# codespell_ignores = "foo,bar"\n+# codespell_skip = "*.po,*.map,package-lock.json"\n+##\n+\n+[tool.dependencychecker]\n+Zope = [\n+ # Zope own provided namespaces\n+ \'App\', \'OFS\', \'Products.Five\', \'Products.OFSP\', \'Products.PageTemplates\',\n+ \'Products.SiteAccess\', \'Shared\', \'Testing\', \'ZPublisher\', \'ZTUtils\',\n+ \'Zope2\', \'webdav\', \'zmi\',\n+ # ExtensionClass own provided namespaces\n+ \'ExtensionClass\', \'ComputedAttribute\', \'MethodObject\',\n+ # Zope dependencies\n+ \'AccessControl\', \'Acquisition\', \'AuthEncoding\', \'beautifulsoup4\', \'BTrees\',\n+ \'cffi\', \'Chameleon\', \'DateTime\', \'DocumentTemplate\',\n+ \'MultiMapping\', \'multipart\', \'PasteDeploy\', \'Persistence\', \'persistent\',\n+ \'pycparser\', \'python-gettext\', \'pytz\', \'RestrictedPython\', \'roman\',\n+ \'soupsieve\', \'transaction\', \'waitress\', \'WebOb\', \'WebTest\', \'WSGIProxy2\',\n+ \'z3c.pt\', \'zc.lockfile\', \'ZConfig\', \'zExceptions\', \'ZODB\', \'zodbpickle\',\n+ \'zope.annotation\', \'zope.browser\', \'zope.browsermenu\', \'zope.browserpage\',\n+ \'zope.browserresource\', \'zope.cachedescriptors\', \'zope.component\',\n+ \'zope.configuration\', \'zope.container\', \'zope.contentprovider\',\n+ \'zope.contenttype\', \'zope.datetime\', \'zope.deferredimport\',\n+ \'zope.deprecation\', \'zope.dottedname\', \'zope.event\', \'zope.exceptions\',\n+ \'zope.filerepresentation\', \'zope.globalrequest\', \'zope.hookable\',\n+ \'zope.i18n\', \'zope.i18nmessageid\', \'zope.interface\', \'zope.lifecycleevent\',\n+ \'zope.location\', \'zope.pagetemplate\', \'zope.processlifetime\', \'zope.proxy\',\n+ \'zope.ptresource\', \'zope.publisher\', \'zope.schema\', \'zope.security\',\n+ \'zope.sequencesort\', \'zope.site\', \'zope.size\', \'zope.structuredtext\',\n+ \'zope.tal\', \'zope.tales\', \'zope.testbrowser\', \'zope.testing\',\n+ \'zope.traversing\', \'zope.viewlet\'\n+]\n+\'Products.CMFCore\' = [\n+ \'docutils\', \'five.localsitemanager\', \'Missing\', \'Products.BTreeFolder2\',\n+ \'Products.GenericSetup\', \'Products.MailHost\', \'Products.PythonScripts\',\n+ \'Products.StandardCacheManagers\', \'Products.ZCatalog\', \'Record\',\n+ \'zope.sendmail\', \'Zope\'\n+]\n+\'plone.base\' = [\n+ \'plone.batching\', \'plone.registry\', \'plone.schema\',\'plone.z3cform\',\n+ \'Products.CMFCore\', \'Products.CMFDynamicViewFTI\',\n+]\n+python-dateutil = [\'dateutil\']\n+ignore-packages = [\'tus\', ]\n+\n+##\n+# Add extra configuration options in .meta.toml:\n+# [pyproject]\n+# dependencies_ignores = "[\'zestreleaser.towncrier\']"\n+# dependencies_mappings = [\n+# "gitpython = [\'git\']",\n+# "pygithub = [\'github\']",\n+# ]\n+##\n+\n+[tool.check-manifest]\n+ignore = [\n+ ".editorconfig",\n+ ".meta.toml",\n+ ".pre-commit-config.yaml",\n+ "tox.ini",\n+ ".flake8",\n+ "mx.ini",\n+\n+]\n+##\n+# Add extra configuration options in .meta.toml:\n+# [pyproject]\n+# check_manifest_ignores = """\n+# "*.map.js",\n+# "*.pyc",\n+# """\n+##\n+\n+\n+##\n+# Add extra configuration options in .meta.toml:\n+# [pyproject]\n+# extra_lines = """\n+# _your own configuration lines_\n+# """\n+##\ndiff --git a/setup.cfg b/setup.cfg\ndeleted file mode 100644\nindex 3e076fd9..00000000\n--- a/setup.cfg\n+++ /dev/null\n@@ -1,9 +0,0 @@\n-[bdist_wheel]\n-universal = 0\n-\n-[isort]\n-# black compatible Plone isort rules:\n-profile = black\n-force_alphabetical_sort = True\n-force_single_line = True\n-lines_after_imports = 2\ndiff --git a/setup.py b/setup.py\nindex fc1f1425..60acf6d7 100644\n--- a/setup.py\n+++ b/setup.py\n@@ -38,23 +38,41 @@\n namespace_packages=["plone", "plone.app"],\n include_package_data=True,\n zip_safe=False,\n+ python_requires=">=3.8",\n extras_require=dict(\n test=[\n- "plone.app.contenttypes",\n+ "plone.app.contenttypes[test]",\n "plone.app.testing",\n+ "plone.dexterity",\n+ "plone.namedfile",\n+ "plone.testing",\n+ "zope.annotation",\n+ "Products.GenericSetup",\n ]\n ),\n install_requires=[\n+ "plone.app.dexterity",\n+ "plone.app.querystring",\n+ "plone.app.uuid",\n+ "plone.app.vocabularies>4.1.2",\n "plone.app.widgets",\n+ "plone.app.z3cform",\n+ "plone.autoform",\n "plone.base",\n "plone.i18n",\n+ "plone.folder",\n+ "plone.locking",\n "plone.memoize",\n "plone.protect",\n+ "plone.supermodel",\n+ "plone.uuid",\n+ "Missing",\n+ "Products.MimetypesRegistry",\n+ "Products.PortalTransforms",\n "Products.statusmessages",\n- "Products.CMFDynamicViewFTI", # required for cmf.ModifyViewTemplate\n- "plone.app.vocabularies>4.1.2",\n- "setuptools",\n "simplejson",\n+ "z3c.relationfield",\n "z3c.form",\n+ "zope.browsermenu",\n ],\n )\ndiff --git a/tox.ini b/tox.ini\nnew file mode 100644\nindex 00000000..cbb3425e\n--- /dev/null\n+++ b/tox.ini\n@@ -0,0 +1,208 @@\n+# Generated from:\n+# https://github.com/plone/meta/tree/master/config/default\n+# See the inline comments on how to expand/tweak this configuration file\n+[tox]\n+# We need 4.4.0 for constrain_package_deps.\n+min_version = 4.4.0\n+envlist =\n+ lint\n+ test\n+ dependencies\n+\n+\n+##\n+# Add extra configuration options in .meta.toml:\n+# [tox]\n+# envlist_lines = """\n+# my_other_environment\n+# """\n+# config_lines = """\n+# my_extra_top_level_tox_configuration_lines\n+# """\n+##\n+\n+[testenv]\n+skip_install = true\n+allowlist_externals =\n+ echo\n+ false\n+# Make sure typos like `tox -e formaat` are caught instead of silently doing nothing.\n+# See https://github.com/tox-dev/tox/issues/2858.\n+commands =\n+ echo "Unrecognized environment name {envname}"\n+ false\n+\n+[testenv:init]\n+description = Prepare environment\n+skip_install = true\n+commands =\n+ echo "Initial setup complete"\n+\n+\n+[testenv:format]\n+description = automatically reformat code\n+skip_install = true\n+deps =\n+ pre-commit\n+commands =\n+ pre-commit run -a pyupgrade\n+ pre-commit run -a isort\n+ pre-commit run -a black\n+ pre-commit run -a zpretty\n+\n+[testenv:lint]\n+description = run linters that will help improve the code style\n+skip_install = true\n+deps =\n+ pre-commit\n+commands =\n+ pre-commit run -a\n+\n+[testenv:dependencies]\n+description = check if the package defines all its dependencies\n+skip_install = true\n+deps =\n+ build\n+ z3c.dependencychecker==2.11\n+commands =\n+ python -m build --sdist --no-isolation\n+ dependencychecker\n+\n+[testenv:dependencies-graph]\n+description = generate a graph out of the dependencies of the package\n+skip_install = false\n+allowlist_externals =\n+ sh\n+deps =\n+ pipdeptree==2.5.1\n+ graphviz # optional dependency of pipdeptree\n+commands =\n+ sh -c \'pipdeptree --exclude setuptools,wheel,pipdeptree,zope.interface,zope.component --graph-output svg > dependencies.svg\'\n+\n+[testenv:test]\n+description = run the distribution tests\n+use_develop = true\n+skip_install = false\n+constrain_package_deps = true\n+set_env =\n+ ROBOT_BROWSER=headlesschrome\n+\n+##\n+# Specify extra test environment variables in .meta.toml:\n+# [tox]\n+# test_environment_variables = """\n+# PIP_EXTRA_INDEX_URL=https://my-pypi.my-server.com/\n+# """\n+#\n+# Set constrain_package_deps .meta.toml:\n+# [tox]\n+# constrain_package_deps = "false"\n+##\n+deps =\n+ zope.testrunner\n+ -c https://dist.plone.org/release/6.0-dev/constraints.txt\n+ \n+##\n+# Specify additional deps in .meta.toml:\n+# [tox]\n+# test_deps_additional = "-esources/plonegovbr.portal_base[test]"\n+#\n+# Specify a custom constraints file in .meta.toml:\n+# [tox]\n+# constraints_file = "https://my-server.com/constraints.txt"\n+##\n+commands =\n+ zope-testrunner --all --test-path={toxinidir} -s plone.app.content {posargs}\n+extras =\n+ test\n+\n+##\n+# Add extra configuration options in .meta.toml:\n+# [tox]\n+# test_extras = """\n+# tests\n+# widgets\n+# """\n+##\n+\n+[testenv:coverage]\n+description = get a test coverage report\n+use_develop = true\n+skip_install = false\n+constrain_package_deps = true\n+set_env =\n+ ROBOT_BROWSER=headlesschrome\n+\n+##\n+# Specify extra test environment variables in .meta.toml:\n+# [tox]\n+# test_environment_variables = """\n+# PIP_EXTRA_INDEX_URL=https://my-pypi.my-server.com/\n+# """\n+##\n+deps =\n+ coverage\n+ zope.testrunner\n+ -c https://dist.plone.org/release/6.0-dev/constraints.txt\n+ \n+commands =\n+ coverage run --branch --source plone.app.content {envbindir}/zope-testrunner --quiet --all --test-path={toxinidir} -s plone.app.content {posargs}\n+ coverage report -m --format markdown\n+ coverage xml\n+extras =\n+ test\n+\n+\n+[testenv:release-check]\n+description = ensure that the distribution is ready to release\n+skip_install = true\n+deps =\n+ twine\n+ build\n+ towncrier\n+ -c https://dist.plone.org/release/6.0-dev/constraints.txt\n+ \n+commands =\n+ # fake version to not have to install the package\n+ # we build the change log as news entries might break\n+ # the README that is displayed on PyPI\n+ towncrier build --version=100.0.0 --yes\n+ python -m build --sdist --no-isolation\n+ twine check dist/*\n+\n+[testenv:circular]\n+description = ensure there are no cyclic dependencies\n+use_develop = true\n+skip_install = false\n+set_env =\n+\n+##\n+# Specify extra test environment variables in .meta.toml:\n+# [tox]\n+# test_environment_variables = """\n+# PIP_EXTRA_INDEX_URL=https://my-pypi.my-server.com/\n+# """\n+##\n+allowlist_externals =\n+ sh\n+deps =\n+ pipdeptree\n+ pipforester\n+ -c https://dist.plone.org/release/6.0-dev/constraints.txt\n+ \n+commands =\n+ # Generate the full dependency tree\n+ sh -c \'pipdeptree -j > forest.json\'\n+ # Generate a DOT graph with the circular dependencies, if any\n+ pipforester -i forest.json -o forest.dot --cycles\n+ # Report if there are any circular dependencies, i.e. error if there are any\n+ pipforester -i forest.json --check-cycles -o /dev/null\n+\n+\n+##\n+# Add extra configuration options in .meta.toml:\n+# [tox]\n+# extra_lines = """\n+# _your own configuration lines_\n+# """\n+##\n' +b'diff --git a/.editorconfig b/.editorconfig\nnew file mode 100644\nindex 00000000..8ae05aaa\n--- /dev/null\n+++ b/.editorconfig\n@@ -0,0 +1,54 @@\n+# Generated from:\n+# https://github.com/plone/meta/tree/master/config/default\n+# See the inline comments on how to expand/tweak this configuration file\n+#\n+# EditorConfig Configuration file, for more details see:\n+# http://EditorConfig.org\n+# EditorConfig is a convention description, that could be interpreted\n+# by multiple editors to enforce common coding conventions for specific\n+# file types\n+\n+# top-most EditorConfig file:\n+# Will ignore other EditorConfig files in Home directory or upper tree level.\n+root = true\n+\n+\n+[*] # For All Files\n+# Unix-style newlines with a newline ending every file\n+end_of_line = lf\n+insert_final_newline = true\n+trim_trailing_whitespace = true\n+# Set default charset\n+charset = utf-8\n+# Indent style default\n+indent_style = space\n+# Max Line Length - a hard line wrap, should be disabled\n+max_line_length = off\n+\n+[*.{py,cfg,ini}]\n+# 4 space indentation\n+indent_size = 4\n+\n+[*.{yml,zpt,pt,dtml,zcml}]\n+# 2 space indentation\n+indent_size = 2\n+\n+[*.{json,jsonl,js,jsx,ts,tsx,css,less,scss,html}] # Frontend development\n+# 2 space indentation\n+indent_size = 2\n+max_line_length = 80\n+\n+[{Makefile,.gitmodules}]\n+# Tab indentation (no size specified, but view as 4 spaces)\n+indent_style = tab\n+indent_size = unset\n+tab_width = unset\n+\n+\n+##\n+# Add extra configuration options in .meta.toml:\n+# [editorconfig]\n+# extra_lines = """\n+# _your own configuration lines_\n+# """\n+##\ndiff --git a/.flake8 b/.flake8\nnew file mode 100644\nindex 00000000..590eb044\n--- /dev/null\n+++ b/.flake8\n@@ -0,0 +1,24 @@\n+# Generated from:\n+# https://github.com/plone/meta/tree/master/config/default\n+# See the inline comments on how to expand/tweak this configuration file\n+[flake8]\n+doctests = 1\n+ignore =\n+ # black takes care of line length\n+ E501,\n+ # black takes care of where to break lines\n+ W503,\n+ # black takes care of spaces within slicing (list[:])\n+ E203,\n+ # black takes care of spaces after commas\n+ E231,\n+per-file-ignores =\n+ src/plone/app/robotframework/__init__.py:F401\n+\n+##\n+# Add extra configuration options in .meta.toml:\n+# [flake8]\n+# extra_lines = """\n+# _your own configuration lines_\n+# """\n+##\ndiff --git a/.github/workflows/meta.yml b/.github/workflows/meta.yml\nnew file mode 100644\nindex 00000000..d13f706c\n--- /dev/null\n+++ b/.github/workflows/meta.yml\n@@ -0,0 +1,66 @@\n+# Generated from:\n+# https://github.com/plone/meta/tree/master/config/default\n+# See the inline comments on how to expand/tweak this configuration file\n+name: Meta\n+on:\n+ push:\n+ branches:\n+ - master\n+ - main\n+ pull_request:\n+ branches:\n+ - master\n+ - main\n+ workflow_dispatch:\n+\n+##\n+# To set environment variables for all jobs, add in .meta.toml:\n+# [github]\n+# env = """\n+# debug: 1\n+# image-name: \'org/image\'\n+# image-tag: \'latest\'\n+# """\n+##\n+\n+jobs:\n+ qa:\n+ uses: plone/meta/.github/workflows/qa.yml@main\n+ dependencies:\n+ uses: plone/meta/.github/workflows/dependencies.yml@main\n+ release_ready:\n+ uses: plone/meta/.github/workflows/release_ready.yml@main\n+\n+#TODO: remove the tests and coverage, as they fail on GHA for now.\n+# Removed the circular dependency check as well,\n+# due to plone.app.multilingual and Products.CMFPlone having a circular dependency.\n+\n+##\n+# To modify the list of default jobs being created add in .meta.toml:\n+# [github]\n+# jobs = [\n+# "qa",\n+# "test",\n+# "coverage",\n+# "dependencies",\n+# "release_ready",\n+# "circular",\n+# ]\n+##\n+\n+##\n+# To request that some OS level dependencies get installed\n+# when running tests/coverage jobs, add in .meta.toml:\n+# [github]\n+# os_dependencies = "git libxml2 libxslt"\n+##\n+\n+\n+##\n+# Specify additional jobs in .meta.toml:\n+# [github]\n+# extra_lines = """\n+# another:\n+# uses: org/repo/.github/workflows/file.yml@main\n+# """\n+##\ndiff --git a/.gitignore b/.gitignore\nindex 855b1cab..503e47c5 100644\n--- a/.gitignore\n+++ b/.gitignore\n@@ -1,25 +1,55 @@\n-syntax: glob\n+# Generated from:\n+# https://github.com/plone/meta/tree/master/config/default\n+# See the inline comments on how to expand/tweak this configuration file\n+# python related\n *.egg-info\n-*.mo\n-*.swp\n *.pyc\n-*.py.bak\n-.DS_Store\n-.idea\n+*.pyo\n+\n+# translation related\n+*.mo\n+\n+# tools related\n+build/\n+.coverage\n+.*project\n+coverage.xml\n+dist/\n+docs/_build\n+__pycache__/\n+.tox\n+.vscode/\n+node_modules/\n+\n+# venv / buildout related\n+bin/\n+develop-eggs/\n+eggs/\n+.eggs/\n+etc/\n .installed.cfg\n+include/\n+lib/\n+lib64\n .mr.developer.cfg\n-.ropeproject\n-bin\n-buildout-cache\n-develop-eggs\n-dist\n-docs/make.bat\n-docs/Makefile\n-etc\n-include\n-lib\n-local\n-parts\n-pip-selfcheck.json\n-var\n+parts/\n+pyvenv.cfg\n+var/\n+\n+# mxdev\n+/instance/\n+/.make-sentinels/\n+/*-mxdev.txt\n+/reports/\n+/sources/\n+/venv/\n+.installed.txt\n+\n \n+##\n+# Add extra configuration options in .meta.toml:\n+# [gitignore]\n+# extra_lines = """\n+# _your own configuration lines_\n+# """\n+##\ndiff --git a/.meta.toml b/.meta.toml\nnew file mode 100644\nindex 00000000..de2bf65b\n--- /dev/null\n+++ b/.meta.toml\n@@ -0,0 +1,27 @@\n+# Generated from:\n+# https://github.com/plone/meta/tree/master/config/default\n+# See the inline comments on how to expand/tweak this configuration file\n+[meta]\n+template = "default"\n+commit-id = "68cda6e4"\n+\n+[flake8]\n+extra_lines = """\n+per-file-ignores =\n+ src/plone/app/robotframework/__init__.py:F401\n+"""\n+\n+[pyproject]\n+codespell_ignores = "ot,nin,"\n+dependencies_ignores = "[\'robotide\', \'collective.js.speakjs\', \'watchdog\', \'robotframework-debuglibrary\', \'robotframework-ride\', \'robotframework-selenium2library\', \'robotframework-seleniumtestability\', \'sphinxcontrib-robotdoc\', \'robotsuite\', \'robotframework-browser\' ]"\n+dependencies_mappings = [\n+ "Pillow = [\'PIL\']",\n+ "robotframework = [\'robot\']",\n+ ]\n+\n+[github]\n+jobs = [\n+ "qa",\n+ "dependencies",\n+ "release_ready",\n+ ]\ndiff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml\nnew file mode 100644\nindex 00000000..b6eb0432\n--- /dev/null\n+++ b/.pre-commit-config.yaml\n@@ -0,0 +1,94 @@\n+# Generated from:\n+# https://github.com/plone/meta/tree/master/config/default\n+# See the inline comments on how to expand/tweak this configuration file\n+ci:\n+ autofix_prs: false\n+ autoupdate_schedule: monthly\n+\n+repos:\n+- repo: https://github.com/asottile/pyupgrade\n+ rev: v3.14.0\n+ hooks:\n+ - id: pyupgrade\n+ args: [--py38-plus]\n+- repo: https://github.com/pycqa/isort\n+ rev: 5.12.0\n+ hooks:\n+ - id: isort\n+- repo: https://github.com/psf/black\n+ rev: 23.9.1\n+ hooks:\n+ - id: black\n+- repo: https://github.com/collective/zpretty\n+ rev: 3.1.0\n+ hooks:\n+ - id: zpretty\n+\n+##\n+# Add extra configuration options in .meta.toml:\n+# [pre_commit]\n+# zpretty_extra_lines = """\n+# _your own configuration lines_\n+# """\n+##\n+- repo: https://github.com/PyCQA/flake8\n+ rev: 6.1.0\n+ hooks:\n+ - id: flake8\n+\n+##\n+# Add extra configuration options in .meta.toml:\n+# [pre_commit]\n+# flake8_extra_lines = """\n+# _your own configuration lines_\n+# """\n+##\n+- repo: https://github.com/codespell-project/codespell\n+ rev: v2.2.6\n+ hooks:\n+ - id: codespell\n+ additional_dependencies:\n+ - tomli\n+\n+##\n+# Add extra configuration options in .meta.toml:\n+# [pre_commit]\n+# codespell_extra_lines = """\n+# _your own configuration lines_\n+# """\n+##\n+- repo: https://github.com/mgedmin/check-manifest\n+ rev: "0.49"\n+ hooks:\n+ - id: check-manifest\n+- repo: https://github.com/regebro/pyroma\n+ rev: "4.2"\n+ hooks:\n+ - id: pyroma\n+- repo: https://github.com/mgedmin/check-python-versions\n+ rev: "0.21.3"\n+ hooks:\n+ - id: check-python-versions\n+ args: [\'--only\', \'setup.py,pyproject.toml\']\n+- repo: https://github.com/collective/i18ndude\n+ rev: "6.1.0"\n+ hooks:\n+ - id: i18ndude\n+\n+\n+##\n+# Add extra configuration options in .meta.toml:\n+# [pre_commit]\n+# i18ndude_extra_lines = """\n+# _your own configuration lines_\n+# """\n+##\n+\n+\n+##\n+# Add extra configuration options in .meta.toml:\n+# [pre_commit]\n+# extra_lines = """\n+# _your own configuration lines_\n+# """\n+##\ndiff --git a/CHANGES.rst b/CHANGES.rst\nindex 0163e8ee..a1cd1635 100644\n--- a/CHANGES.rst\n+++ b/CHANGES.rst\n@@ -585,7 +585,7 @@ Fixes:\n ------------------\n \n - Add a new command-line option for robot-server to start Zope in debug-mode\n- (useage: bin/robot-server -d or bin/robot-server --debug-mode)\n+ (usage: bin/robot-server -d or bin/robot-server --debug-mode)\n [datakurre]\n - Change robot LISTENER_PORT (used in communication between bin/robot-server\n and bin/robot via robotframework) to default port 49999 instead of 10001\n@@ -676,7 +676,7 @@ Fixes:\n 0.7.1 (2014-02-08)\n ------------------\n \n-- Add ignored Sphinx-directives to pybot to make it easier to run pybot agains\n+- Add ignored Sphinx-directives to pybot to make it easier to run pybot against\n Sphinx documentation\n [datakurre]\n - Update libdoc-generated documentations\n@@ -825,7 +825,7 @@ This is Arnhem Sprint preview release of 0.7.0.\n 0.6.0 (2013-04-30)\n ------------------\n \n-- Add verbose console outout for robot-server for test setup and teardown\n+- Add verbose console output for robot-server for test setup and teardown\n [datakurre]\n - Documentation update\n [datakurre, Silvio Tomatis]\n@@ -892,7 +892,7 @@ This is Arnhem Sprint preview release of 0.7.0.\n ------------------\n \n - PLOG2013 development release.\n-- Define dedicated re-usable AUTOLOGIN_ROBOT_FIXTURE\n+- Define dedicated reusable AUTOLOGIN_ROBOT_FIXTURE\n - Drop BBB for plone.act\n - Drop entrypoints for pure pybot and rebot to make it easier to use them pure\n without extra dependencies by installing robotentrypoints-package\ndiff --git a/buildout.cfg b/buildout.cfg\ndeleted file mode 100644\nindex 3026c2ee..00000000\n--- a/buildout.cfg\n+++ /dev/null\n@@ -1,59 +0,0 @@\n-[buildout]\n-extends =\n- https://raw.githubusercontent.com/collective/buildout.plonetest/master/test-5.1.x.cfg\n- versions.cfg\n-parts +=\n- docs\n- libdoc\n- robot\n-package-name = plone.app.robotframework\n-package-extras = [test,speak]\n-test-eggs = Pillow\n-develop = .\n-versions = versions\n-\n-[versions]\n-setuptools =\n-zc.buildout =\n-plone.app.robotframework =\n-\n-[instance]\n-zcml =\n-\n-[docs]\n-recipe = collective.recipe.sphinxbuilder\n-eggs =\n- Pillow\n- plone.app.robotframework [docs]\n-\n-[libdoc]\n-recipe = zc.recipe.egg\n-eggs = plone.app.robotframework [docs]\n-entry-points = libdoc=robot.libdoc:libdoc_cli\n-scripts = libdoc\n-arguments = sys.argv[1:]\n-\n-[environment]\n-zope_i18n_compile_mo_files = true\n-ROBOT_SELENIUM2LIBRARY_RUN_ON_FAILURE = Capture page screenshot and log source\n-\n-[test]\n-environment = environment\n-\n-[robot]\n-recipe = zc.recipe.egg\n-eggs =\n- Pillow\n- plone.app.robotframework [test,ride,speak,reload,debug]\n-\n-[nix]\n-recipe = collective.recipe.nix\n-name = default\n-eggs =\n- ${test:eggs}\n- ${robot:eggs}\n-nixpkgs =\n- watchdog=pythonPackages.watchdog\n- zc.buildout=pythonPackages.zc_buildout_nix\n-outputs = default.nix\n-allow-from-cache = true\ndiff --git a/docs.cfg b/docs.cfg\ndeleted file mode 100644\nindex 5275a2b2..00000000\n--- a/docs.cfg\n+++ /dev/null\n@@ -1,7 +0,0 @@\n-[buildout]\n-parts = sphinxbuilder\n-index = http://pypi.python.org/simple\n-\n-[sphinxbuilder]\n-recipe = collective.recipe.sphinxbuilder\n-eggs = sphinxcontrib-robotdoc\ndiff --git a/docs/source/conf.py b/docs/source/conf.py\nindex 77437660..0f15e1ea 100644\n--- a/docs/source/conf.py\n+++ b/docs/source/conf.py\n@@ -10,10 +10,6 @@\n # All configuration values have a default; values that are commented out\n # serve to show the default.\n \n-import os\n-import sys\n-\n-\n # If extensions (or modules to document with autodoc) are in another directory,\n # add these directories to sys.path here. If the directory is relative to the\n # documentation root, use os.path.abspath to make it absolute, like shown here.\n@@ -172,11 +168,11 @@\n \n latex_elements = {\n # The paper size (\'letterpaper\' or \'a4paper\').\n- #\'papersize\': \'letterpaper\',\n+ # \'papersize\': \'letterpaper\',\n # The font size (\'10pt\', \'11pt\' or \'12pt\').\n- #\'pointsize\': \'10pt\',\n+ # \'pointsize\': \'10pt\',\n # Additional stuff for the LaTeX preamble.\n- #\'preamble\': \'\',\n+ # \'preamble\': \'\',\n }\n \n # Grouping the document tree into LaTeX files. List of tuples\ndiff --git a/docs/source/happy.rst b/docs/source/happy.rst\nindex 5fd8002b..f21e291b 100644\n--- a/docs/source/happy.rst\n+++ b/docs/source/happy.rst\n@@ -398,7 +398,7 @@ execution* keyword, you can pause the test at any point to make it possible to\n figure out what to do next.\n (Dialogs depend on `TkInter-library `_.)\n \n-.. note:: Be sure to remove *Import libary* and *Pause execution*\n+.. note:: Be sure to remove *Import library* and *Pause execution*\n keyword calls before committing your tests to avoid pausing your\n tests on CI.\n \ndiff --git a/docs/source/keywords.rst b/docs/source/keywords.rst\nindex c18883ed..d838e520 100644\n--- a/docs/source/keywords.rst\n+++ b/docs/source/keywords.rst\n@@ -10,7 +10,7 @@ Selenium2Library Keywords\n \n Selenium2Library is a web testing library for Robot Framework. It provides you\n with several low-level keywords to access certain elements of a web page, to\n-conduct actions on a web page and to test if a page met certain acceptance critera.\n+conduct actions on a web page and to test if a page met certain acceptance criteria.\n \n \n First Example\ndiff --git a/docs/source/libdoc/python_debugging.html b/docs/source/libdoc/python_debugging.html\nindex 0da14491..840b74cb 100644\n--- a/docs/source/libdoc/python_debugging.html\n+++ b/docs/source/libdoc/python_debugging.html\n@@ -1,13 +1,28 @@\n \n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n+ \n-\n+ \n-\n+ \n-\n-\n+ \n-\n+ \n-\n+ \n-\n+ \n-\n-\n-\n+ \n+ \n+ \n+ \n \n-
\n-

Opening library documentation failed

\n-
    \n-
  • Verify that you have JavaScript enabled in your browser.
  • \n-
  • Make sure you are using a modern enough browser. Firefox 3.5, IE 8, or equivalent is required, newer browsers are recommended.
  • \n-
  • Check are there messages in your browser\'s JavaScript error log. Please report the problem if you suspect you have encountered a bug.
  • \n-
\n-
\n+
\n+

Opening library documentation failed

\n+
    \n+
  • Verify that you have\n+ JavaScript enabled\n+ in your browser.
  • \n+
  • Make sure you are using a\n+ modern enough browser. Firefox 3.5, IE 8, or equivalent is required, newer browsers are recommended.
  • \n+
  • Check are there messages in your browser\'s\n+ JavaScript error log. Please report the problem if you suspect you have encountered a bug.
  • \n+
\n+
\n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n \n-\n+ \n \n-\n+ \n \ndiff --git a/docs/source/libdoc/python_layoutmath.html b/docs/source/libdoc/python_layoutmath.html\nindex 97356fed..d672ecc2 100644\n--- a/docs/source/libdoc/python_layoutmath.html\n+++ b/docs/source/libdoc/python_layoutmath.html\n@@ -1,13 +1,28 @@\n \n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n+ \n-\n+ \n-\n+ \n-\n-\n+ \n-\n+ \n-\n+ \n-\n+ \n-\n-\n-\n+ \n+ \n+ \n+ \n \n-
\n-

Opening library documentation failed

\n-
    \n-
  • Verify that you have JavaScript enabled in your browser.
  • \n-
  • Make sure you are using a modern enough browser. Firefox 3.5, IE 8, or equivalent is required, newer browsers are recommended.
  • \n-
  • Check are there messages in your browser\'s JavaScript error log. Please report the problem if you suspect you have encountered a bug.
  • \n-
\n-
\n+
\n+

Opening library documentation failed

\n+
    \n+
  • Verify that you have\n+ JavaScript enabled\n+ in your browser.
  • \n+
  • Make sure you are using a\n+ modern enough browser. Firefox 3.5, IE 8, or equivalent is required, newer browsers are recommended.
  • \n+
  • Check are there messages in your browser\'s\n+ JavaScript error log. Please report the problem if you suspect you have encountered a bug.
  • \n+
\n+
\n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n \n-\n+ \n \n-\n+ \n \ndiff --git a/docs/source/libdoc/python_saucelabs.html b/docs/source/libdoc/python_saucelabs.html\nindex e31f6d15..47c85ae8 100644\n--- a/docs/source/libdoc/python_saucelabs.html\n+++ b/docs/source/libdoc/python_saucelabs.html\n@@ -1,13 +1,28 @@\n \n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n+ \n-\n+ \n-\n+ \n-\n-\n+ \n-\n+ \n-\n+ \n-\n+ \n-\n-\n-\n+ \n+ \n+ \n+ \n \n-
\n-

Opening library documentation failed

\n-
    \n-
  • Verify that you have JavaScript enabled in your browser.
  • \n-
  • Make sure you are using a modern enough browser. Firefox 3.5, IE 8, or equivalent is required, newer browsers are recommended.
  • \n-
  • Check are there messages in your browser\'s JavaScript error log. Please report the problem if you suspect you have encountered a bug.
  • \n-
\n-
\n+
\n+

Opening library documentation failed

\n+
    \n+
  • Verify that you have\n+ JavaScript enabled\n+ in your browser.
  • \n+
  • Make sure you are using a\n+ modern enough browser. Firefox 3.5, IE 8, or equivalent is required, newer browsers are recommended.
  • \n+
  • Check are there messages in your browser\'s\n+ JavaScript error log. Please report the problem if you suspect you have encountered a bug.
  • \n+
\n+
\n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n \n-\n+ \n \n-\n+ \n \ndiff --git a/docs/source/libdoc/python_zope2server.html b/docs/source/libdoc/python_zope2server.html\nindex 634cac2e..1576c859 100644\n--- a/docs/source/libdoc/python_zope2server.html\n+++ b/docs/source/libdoc/python_zope2server.html\n@@ -1,13 +1,28 @@\n \n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n+ \n-\n+ \n-\n+ \n-\n-\n+ \n-\n+ \n-\n+ \n-\n+ \n-\n-\n-\n+ \n+ \n+ \n+ \n \n-
\n-

Opening library documentation failed

\n-
    \n-
  • Verify that you have JavaScript enabled in your browser.
  • \n-
  • Make sure you are using a modern enough browser. Firefox 3.5, IE 8, or equivalent is required, newer browsers are recommended.
  • \n-
  • Check are there messages in your browser\'s JavaScript error log. Please report the problem if you suspect you have encountered a bug.
  • \n-
\n-
\n+
\n+

Opening library documentation failed

\n+
    \n+
  • Verify that you have\n+ JavaScript enabled\n+ in your browser.
  • \n+
  • Make sure you are using a\n+ modern enough browser. Firefox 3.5, IE 8, or equivalent is required, newer browsers are recommended.
  • \n+
  • Check are there messages in your browser\'s\n+ JavaScript error log. Please report the problem if you suspect you have encountered a bug.
  • \n+
\n+
\n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n \n-\n+ \n \n-\n+ \n \ndiff --git a/docs/source/libdoc/remote_autologin.html b/docs/source/libdoc/remote_autologin.html\nindex 673199cb..113d195b 100644\n--- a/docs/source/libdoc/remote_autologin.html\n+++ b/docs/source/libdoc/remote_autologin.html\n@@ -1,13 +1,28 @@\n \n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n+ \n-\n+ \n-\n+ \n-\n-\n+ \n-\n+ \n-\n+ \n-\n+ \n-\n-\n-\n+ \n+ \n+ \n+ \n \n-
\n-

Opening library documentation failed

\n-
    \n-
  • Verify that you have JavaScript enabled in your browser.
  • \n-
  • Make sure you are using a modern enough browser. Firefox 3.5, IE 8, or equivalent is required, newer browsers are recommended.
  • \n-
  • Check are there messages in your browser\'s JavaScript error log. Please report the problem if you suspect you have encountered a bug.
  • \n-
\n-
\n+
\n+

Opening library documentation failed

\n+
    \n+
  • Verify that you have\n+ JavaScript enabled\n+ in your browser.
  • \n+
  • Make sure you are using a\n+ modern enough browser. Firefox 3.5, IE 8, or equivalent is required, newer browsers are recommended.
  • \n+
  • Check are there messages in your browser\'s\n+ JavaScript error log. Please report the problem if you suspect you have encountered a bug.
  • \n+
\n+
\n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n \n-\n+ \n \n-\n+ \n \ndiff --git a/docs/source/libdoc/remote_content.html b/docs/source/libdoc/remote_content.html\nindex c19ccbfc..16452ddb 100644\n--- a/docs/source/libdoc/remote_content.html\n+++ b/docs/source/libdoc/remote_content.html\n@@ -1,13 +1,28 @@\n \n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n+ \n-\n+ \n-\n+ \n-\n-\n+ \n-\n+ \n-\n+ \n-\n+ \n-\n-\n-\n+ \n+ \n+ \n+ \n \n-
\n-

Opening library documentation failed

\n-
    \n-
  • Verify that you have JavaScript enabled in your browser.
  • \n-
  • Make sure you are using a modern enough browser. Firefox 3.5, IE 8, or equivalent is required, newer browsers are recommended.
  • \n-
  • Check are there messages in your browser\'s JavaScript error log. Please report the problem if you suspect you have encountered a bug.
  • \n-
\n-
\n+
\n+

Opening library documentation failed

\n+
    \n+
  • Verify that you have\n+ JavaScript enabled\n+ in your browser.
  • \n+
  • Make sure you are using a\n+ modern enough browser. Firefox 3.5, IE 8, or equivalent is required, newer browsers are recommended.
  • \n+
  • Check are there messages in your browser\'s\n+ JavaScript error log. Please report the problem if you suspect you have encountered a bug.
  • \n+
\n+
\n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n \n-\n+ \n \n-\n+ \n \ndiff --git a/docs/source/libdoc/remote_genericsetup.html b/docs/source/libdoc/remote_genericsetup.html\nindex 5a478d02..b3d4b7bd 100644\n--- a/docs/source/libdoc/remote_genericsetup.html\n+++ b/docs/source/libdoc/remote_genericsetup.html\n@@ -1,13 +1,28 @@\n \n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n+ \n-\n+ \n-\n+ \n-\n-\n+ \n-\n+ \n-\n+ \n-\n+ \n-\n-\n-\n+ \n+ \n+ \n+ \n \n-
\n-

Opening library documentation failed

\n-
    \n-
  • Verify that you have JavaScript enabled in your browser.
  • \n-
  • Make sure you are using a modern enough browser. Firefox 3.5, IE 8, or equivalent is required, newer browsers are recommended.
  • \n-
  • Check are there messages in your browser\'s JavaScript error log. Please report the problem if you suspect you have encountered a bug.
  • \n-
\n-
\n+
\n+

Opening library documentation failed

\n+
    \n+
  • Verify that you have\n+ JavaScript enabled\n+ in your browser.
  • \n+
  • Make sure you are using a\n+ modern enough browser. Firefox 3.5, IE 8, or equivalent is required, newer browsers are recommended.
  • \n+
  • Check are there messages in your browser\'s\n+ JavaScript error log. Please report the problem if you suspect you have encountered a bug.
  • \n+
\n+
\n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n \n-\n+ \n \n-\n+ \n \ndiff --git a/docs/source/libdoc/remote_i18n.html b/docs/source/libdoc/remote_i18n.html\nindex 970e0b4a..6efb53ea 100644\n--- a/docs/source/libdoc/remote_i18n.html\n+++ b/docs/source/libdoc/remote_i18n.html\n@@ -1,13 +1,28 @@\n \n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n+ \n-\n+ \n-\n+ \n-\n-\n+ \n-\n+ \n-\n+ \n-\n+ \n-\n-\n-\n+ \n+ \n+ \n+ \n \n-
\n-

Opening library documentation failed

\n-
    \n-
  • Verify that you have JavaScript enabled in your browser.
  • \n-
  • Make sure you are using a modern enough browser. Firefox 3.5, IE 8, or equivalent is required, newer browsers are recommended.
  • \n-
  • Check are there messages in your browser\'s JavaScript error log. Please report the problem if you suspect you have encountered a bug.
  • \n-
\n-
\n+
\n+

Opening library documentation failed

\n+
    \n+
  • Verify that you have\n+ JavaScript enabled\n+ in your browser.
  • \n+
  • Make sure you are using a\n+ modern enough browser. Firefox 3.5, IE 8, or equivalent is required, newer browsers are recommended.
  • \n+
  • Check are there messages in your browser\'s\n+ JavaScript error log. Please report the problem if you suspect you have encountered a bug.
  • \n+
\n+
\n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n \n-\n+ \n \n-\n+ \n \ndiff --git a/docs/source/libdoc/remote_mockmailhost.html b/docs/source/libdoc/remote_mockmailhost.html\nindex 962eb517..1ed80700 100644\n--- a/docs/source/libdoc/remote_mockmailhost.html\n+++ b/docs/source/libdoc/remote_mockmailhost.html\n@@ -1,13 +1,28 @@\n \n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n+ \n-\n+ \n-\n+ \n-\n-\n+ \n-\n+ \n-\n+ \n-\n+ \n-\n-\n-\n+ \n+ \n+ \n+ \n \n-
\n-

Opening library documentation failed

\n-
    \n-
  • Verify that you have JavaScript enabled in your browser.
  • \n-
  • Make sure you are using a modern enough browser. Firefox 3.5, IE 8, or equivalent is required, newer browsers are recommended.
  • \n-
  • Check are there messages in your browser\'s JavaScript error log. Please report the problem if you suspect you have encountered a bug.
  • \n-
\n-
\n+
\n+

Opening library documentation failed

\n+
    \n+
  • Verify that you have\n+ JavaScript enabled\n+ in your browser.
  • \n+
  • Make sure you are using a\n+ modern enough browser. Firefox 3.5, IE 8, or equivalent is required, newer browsers are recommended.
  • \n+
  • Check are there messages in your browser\'s\n+ JavaScript error log. Please report the problem if you suspect you have encountered a bug.
  • \n+
\n+
\n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n \n-\n+ \n \n-\n+ \n \ndiff --git a/docs/source/libdoc/remote_quickinstaller.html b/docs/source/libdoc/remote_quickinstaller.html\nindex fd713c5e..58085bd4 100644\n--- a/docs/source/libdoc/remote_quickinstaller.html\n+++ b/docs/source/libdoc/remote_quickinstaller.html\n@@ -1,13 +1,28 @@\n \n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n+ \n-\n+ \n-\n+ \n-\n-\n+ \n-\n+ \n-\n+ \n-\n+ \n-\n-\n-\n+ \n+ \n+ \n+ \n \n-
\n-

Opening library documentation failed

\n-
    \n-
  • Verify that you have JavaScript enabled in your browser.
  • \n-
  • Make sure you are using a modern enough browser. Firefox 3.5, IE 8, or equivalent is required, newer browsers are recommended.
  • \n-
  • Check are there messages in your browser\'s JavaScript error log. Please report the problem if you suspect you have encountered a bug.
  • \n-
\n-
\n+
\n+

Opening library documentation failed

\n+
    \n+
  • Verify that you have\n+ JavaScript enabled\n+ in your browser.
  • \n+
  • Make sure you are using a\n+ modern enough browser. Firefox 3.5, IE 8, or equivalent is required, newer browsers are recommended.
  • \n+
  • Check are there messages in your browser\'s\n+ JavaScript error log. Please report the problem if you suspect you have encountered a bug.
  • \n+
\n+
\n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n \n-\n+ \n \n-\n+ \n \ndiff --git a/docs/source/libdoc/remote_users.html b/docs/source/libdoc/remote_users.html\nindex fef16e93..ca10bc10 100644\n--- a/docs/source/libdoc/remote_users.html\n+++ b/docs/source/libdoc/remote_users.html\n@@ -1,13 +1,28 @@\n \n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n+ \n-\n+ \n-\n+ \n-\n-\n+ \n-\n+ \n-\n+ \n-\n+ \n-\n-\n-\n+ \n+ \n+ \n+ \n \n-
\n-

Opening library documentation failed

\n-
    \n-
  • Verify that you have JavaScript enabled in your browser.
  • \n-
  • Make sure you are using a modern enough browser. Firefox 3.5, IE 8, or equivalent is required, newer browsers are recommended.
  • \n-
  • Check are there messages in your browser\'s JavaScript error log. Please report the problem if you suspect you have encountered a bug.
  • \n-
\n-
\n+
\n+

Opening library documentation failed

\n+
    \n+
  • Verify that you have\n+ JavaScript enabled\n+ in your browser.
  • \n+
  • Make sure you are using a\n+ modern enough browser. Firefox 3.5, IE 8, or equivalent is required, newer browsers are recommended.
  • \n+
  • Check are there messages in your browser\'s\n+ JavaScript error log. Please report the problem if you suspect you have encountered a bug.
  • \n+
\n+
\n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n \n-\n+ \n \n-\n+ \n \ndiff --git a/docs/source/libdoc/remote_zope2server.html b/docs/source/libdoc/remote_zope2server.html\nindex e4c539fe..829dc641 100644\n--- a/docs/source/libdoc/remote_zope2server.html\n+++ b/docs/source/libdoc/remote_zope2server.html\n@@ -1,13 +1,28 @@\n \n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n+ \n-\n+ \n-\n+ \n-\n-\n+ \n-\n+ \n-\n+ \n-\n+ \n-\n-\n-\n+ \n+ \n+ \n+ \n \n-
\n-

Opening library documentation failed

\n-
    \n-
  • Verify that you have JavaScript enabled in your browser.
  • \n-
  • Make sure you are using a modern enough browser. Firefox 3.5, IE 8, or equivalent is required, newer browsers are recommended.
  • \n-
  • Check are there messages in your browser\'s JavaScript error log. Please report the problem if you suspect you have encountered a bug.
  • \n-
\n-
\n+
\n+

Opening library documentation failed

\n+
    \n+
  • Verify that you have\n+ JavaScript enabled\n+ in your browser.
  • \n+
  • Make sure you are using a\n+ modern enough browser. Firefox 3.5, IE 8, or equivalent is required, newer browsers are recommended.
  • \n+
  • Check are there messages in your browser\'s\n+ JavaScript error log. Please report the problem if you suspect you have encountered a bug.
  • \n+
\n+
\n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n \n-\n+ \n \n-\n+ \n \ndiff --git a/docs/source/libdoc/selenium.html b/docs/source/libdoc/selenium.html\nindex 55c01242..f82b307f 100644\n--- a/docs/source/libdoc/selenium.html\n+++ b/docs/source/libdoc/selenium.html\n@@ -1,13 +1,28 @@\n \n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n+ \n-\n+ \n-\n+ \n-\n-\n+ \n-\n+ \n-\n-\n-\n+ \n+ \n+ \n+ \n \n-
\n-

Opening library documentation failed

\n-
    \n-
  • Verify that you have JavaScript enabled in your browser.
  • \n-
  • Make sure you are using a modern enough browser. Firefox 3.5, IE 8, or equivalent is required, newer browsers are recommended.
  • \n-
  • Check are there messages in your browser\'s JavaScript error log. Please report the problem if you suspect you have encountered a bug.
  • \n-
\n-
\n+
\n+

Opening library documentation failed

\n+
    \n+
  • Verify that you have\n+ JavaScript enabled\n+ in your browser.
  • \n+
  • Make sure you are using a\n+ modern enough browser. Firefox 3.5, IE 8, or equivalent is required, newer browsers are recommended.
  • \n+
  • Check are there messages in your browser\'s\n+ JavaScript error log. Please report the problem if you suspect you have encountered a bug.
  • \n+
\n+
\n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n-\n+ \n+ \n \n-\n+ \n \ndiff --git a/docs/source/libdoc/user_keywords.html b/docs/source/libdoc/user_keywords.html\nindex 990f5417..27abf9cf 100644\n--- a/docs/source/libdoc/user_keywords.html\n+++ b/docs/source/libdoc/user_keywords.html\n@@ -1,13 +1,28 @@\n \n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n+ \n-\n+ \n-\n+ \n-\n-\n+ \n-\n+ \n-\n+ \n-\n+ \n-\n-\n-\n+ \n+ \n+ \n+ \n \n-
\n-

Opening library documentation failed

\n-
    \n-
  • Verify that you have JavaScript enabled in your browser.
  • \n-
  • Make sure you are using a modern enough browser. Firefox 3.5, IE 8, or equivalent is required, newer browsers are recommended.
  • \n-
  • Check are there messages in your browser\'s JavaScript error log. Please report the problem if you suspect you have encountered a bug.
  • \n-
\n-
\n+
\n+

Opening library documentation failed

\n+
    \n+
  • Verify that you have\n+ JavaScript enabled\n+ in your browser.
  • \n+
  • Make sure you are using a\n+ modern enough browser. Firefox 3.5, IE 8, or equivalent is required, newer browsers are recommended.
  • \n+
  • Check are there messages in your browser\'s\n+ JavaScript error log. Please report the problem if you suspect you have encountered a bug.
  • \n+
\n+
\n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n \n-\n+ \n \n-\n+ \n \ndiff --git a/docs/source/libdoc/user_saucelabs.html b/docs/source/libdoc/user_saucelabs.html\nindex c3356ea6..66b25d38 100644\n--- a/docs/source/libdoc/user_saucelabs.html\n+++ b/docs/source/libdoc/user_saucelabs.html\n@@ -1,13 +1,28 @@\n \n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n+ \n-\n+ \n-\n+ \n-\n-\n+ \n-\n+ \n-\n+ \n-\n+ \n-\n-\n-\n+ \n+ \n+ \n+ \n \n-
\n-

Opening library documentation failed

\n-
    \n-
  • Verify that you have JavaScript enabled in your browser.
  • \n-
  • Make sure you are using a modern enough browser. Firefox 3.5, IE 8, or equivalent is required, newer browsers are recommended.
  • \n-
  • Check are there messages in your browser\'s JavaScript error log. Please report the problem if you suspect you have encountered a bug.
  • \n-
\n-
\n+
\n+

Opening library documentation failed

\n+
    \n+
  • Verify that you have\n+ JavaScript enabled\n+ in your browser.
  • \n+
  • Make sure you are using a\n+ modern enough browser. Firefox 3.5, IE 8, or equivalent is required, newer browsers are recommended.
  • \n+
  • Check are there messages in your browser\'s\n+ JavaScript error log. Please report the problem if you suspect you have encountered a bug.
  • \n+
\n+
\n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n \n-\n+ \n \n-\n+ \n \ndiff --git a/docs/source/libdoc/user_selenium.html b/docs/source/libdoc/user_selenium.html\nindex 3b8b8f11..280a3f0a 100644\n--- a/docs/source/libdoc/user_selenium.html\n+++ b/docs/source/libdoc/user_selenium.html\n@@ -1,13 +1,28 @@\n \n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n+ \n-\n+ \n-\n+ \n-\n-\n+ \n-\n+ \n-\n+ \n-\n+ \n-\n-\n-\n+ \n+ \n+ \n+ \n \n-
\n-

Opening library documentation failed

\n-
    \n-
  • Verify that you have JavaScript enabled in your browser.
  • \n-
  • Make sure you are using a modern enough browser. Firefox 3.5, IE 8, or equivalent is required, newer browsers are recommended.
  • \n-
  • Check are there messages in your browser\'s JavaScript error log. Please report the problem if you suspect you have encountered a bug.
  • \n-
\n-
\n+
\n+

Opening library documentation failed

\n+
    \n+
  • Verify that you have\n+ JavaScript enabled\n+ in your browser.
  • \n+
  • Make sure you are using a\n+ modern enough browser. Firefox 3.5, IE 8, or equivalent is required, newer browsers are recommended.
  • \n+
  • Check are there messages in your browser\'s\n+ JavaScript error log. Please report the problem if you suspect you have encountered a bug.
  • \n+
\n+
\n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n \n-\n+ \n \n-\n+ \n \ndiff --git a/docs/source/libdoc/user_server.html b/docs/source/libdoc/user_server.html\nindex 523d80e5..7624256a 100644\n--- a/docs/source/libdoc/user_server.html\n+++ b/docs/source/libdoc/user_server.html\n@@ -1,13 +1,28 @@\n \n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n+ \n-\n+ \n-\n+ \n-\n-\n+ \n-\n+ \n-\n+ \n-\n+ \n-\n-\n-\n+ \n+ \n+ \n+ \n \n-
\n-

Opening library documentation failed

\n-
    \n-
  • Verify that you have JavaScript enabled in your browser.
  • \n-
  • Make sure you are using a modern enough browser. Firefox 3.5, IE 8, or equivalent is required, newer browsers are recommended.
  • \n-
  • Check are there messages in your browser\'s JavaScript error log. Please report the problem if you suspect you have encountered a bug.
  • \n-
\n-
\n+
\n+

Opening library documentation failed

\n+
    \n+
  • Verify that you have\n+ JavaScript enabled\n+ in your browser.
  • \n+
  • Make sure you are using a\n+ modern enough browser. Firefox 3.5, IE 8, or equivalent is required, newer browsers are recommended.
  • \n+
  • Check are there messages in your browser\'s\n+ JavaScript error log. Please report the problem if you suspect you have encountered a bug.
  • \n+
\n+
\n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n-\n+ \n \n \n-\n+ \n \n-\n+ \n \ndiff --git a/docs/source/remote.rst b/docs/source/remote.rst\nindex 1284b91e..46f9988e 100644\n--- a/docs/source/remote.rst\n+++ b/docs/source/remote.rst\n@@ -6,7 +6,7 @@ test environment for the actual tests-clauses (*When* and *Then*).\n \n Because Given-clauses are not really part of the actual test, it is not\n necessary to run them through Selenium (using Selenium2Library), but it would\n-be faster to write custon Python keywords for them.\n+be faster to write custom Python keywords for them.\n \n **plone.act** includes an example, how to a robot\n `remote library `_,\ndiff --git a/docs/source/robot.rst b/docs/source/robot.rst\nindex 0729d502..4210d2ea 100644\n--- a/docs/source/robot.rst\n+++ b/docs/source/robot.rst\n@@ -49,7 +49,7 @@ Each test suite may contain one to four different parts:\n calling test keywords.\n \n **Keywords**\n- Is used to define new user keywords, which may re-use existing keywords\n+ Is used to define new user keywords, which may reuse existing keywords\n from imported libraries or resource files.\n \n \n@@ -132,14 +132,14 @@ Remote-library approach provides the following benefits when testing Plone:\n Resource files\n --------------\n \n-Resource files provide a re-usable way to abstract your test suites. To put\n+Resource files provide a reusable way to abstract your test suites. To put\n it simply, resources files are just like all the other ``.robot``-files, but\n they should not contain ``*** Test Cases ***`` certain ``*** Settings ***``\n commands (*Suite Setup*, *Suite Teardown*, *Test Setup* or *Test Teardown*).\n \n Resource files are the perfect way to import common libraries (with *Library*\n command in ```*** Settings ***``), define global ``*** Variables ***`` and\n-define re-usable common ```*** Keywords ***```. Resource files are included\n+define reusable common ```*** Keywords ***```. Resource files are included\n in a test suite with *Resource*-command in ```*** Settings ***``:\n \n .. code-block:: robotframework\ndiff --git a/news/434550cc.internal b/news/434550cc.internal\nnew file mode 100644\nindex 00000000..c08f5399\n--- /dev/null\n+++ b/news/434550cc.internal\n@@ -0,0 +1,2 @@\n+Update configuration files.\n+[plone devs]\ndiff --git a/pyproject.toml b/pyproject.toml\nindex 05b615de..4a596000 100644\n--- a/pyproject.toml\n+++ b/pyproject.toml\n@@ -1,6 +1,9 @@\n+# Generated from:\n+# https://github.com/plone/meta/tree/master/config/default\n+# See the inline comments on how to expand/tweak this configuration file\n [tool.towncrier]\n-filename = "CHANGES.rst"\n directory = "news/"\n+filename = "CHANGES.rst"\n title_format = "{version} ({project_date})"\n underlines = ["-", ""]\n \n@@ -18,3 +21,139 @@ showcontent = true\n directory = "bugfix"\n name = "Bug fixes:"\n showcontent = true\n+\n+[[tool.towncrier.type]]\n+directory = "internal"\n+name = "Internal:"\n+showcontent = true\n+\n+[[tool.towncrier.type]]\n+directory = "documentation"\n+name = "Documentation:"\n+showcontent = true\n+\n+[[tool.towncrier.type]]\n+directory = "tests"\n+name = "Tests"\n+showcontent = true\n+\n+##\n+# Add extra configuration options in .meta.toml:\n+# [pyproject]\n+# towncrier_extra_lines = """\n+# extra_configuration\n+# """\n+##\n+\n+[tool.isort]\n+profile = "plone"\n+\n+##\n+# Add extra configuration options in .meta.toml:\n+# [pyproject]\n+# isort_extra_lines = """\n+# extra_configuration\n+# """\n+##\n+\n+[tool.black]\n+target-version = ["py38"]\n+\n+##\n+# Add extra configuration options in .meta.toml:\n+# [pyproject]\n+# black_extra_lines = """\n+# extra_configuration\n+# """\n+##\n+\n+[tool.codespell]\n+ignore-words-list = "discreet,ot,nin,"\n+skip = "*.po,"\n+##\n+# Add extra configuration options in .meta.toml:\n+# [pyproject]\n+# codespell_ignores = "foo,bar"\n+# codespell_skip = "*.po,*.map,package-lock.json"\n+##\n+\n+[tool.dependencychecker]\n+Zope = [\n+ # Zope own provided namespaces\n+ \'App\', \'OFS\', \'Products.Five\', \'Products.OFSP\', \'Products.PageTemplates\',\n+ \'Products.SiteAccess\', \'Shared\', \'Testing\', \'ZPublisher\', \'ZTUtils\',\n+ \'Zope2\', \'webdav\', \'zmi\',\n+ # ExtensionClass own provided namespaces\n+ \'ExtensionClass\', \'ComputedAttribute\', \'MethodObject\',\n+ # Zope dependencies\n+ \'AccessControl\', \'Acquisition\', \'AuthEncoding\', \'beautifulsoup4\', \'BTrees\',\n+ \'cffi\', \'Chameleon\', \'DateTime\', \'DocumentTemplate\',\n+ \'MultiMapping\', \'multipart\', \'PasteDeploy\', \'Persistence\', \'persistent\',\n+ \'pycparser\', \'python-gettext\', \'pytz\', \'RestrictedPython\', \'roman\',\n+ \'soupsieve\', \'transaction\', \'waitress\', \'WebOb\', \'WebTest\', \'WSGIProxy2\',\n+ \'z3c.pt\', \'zc.lockfile\', \'ZConfig\', \'zExceptions\', \'ZODB\', \'zodbpickle\',\n+ \'zope.annotation\', \'zope.browser\', \'zope.browsermenu\', \'zope.browserpage\',\n+ \'zope.browserresource\', \'zope.cachedescriptors\', \'zope.component\',\n+ \'zope.configuration\', \'zope.container\', \'zope.contentprovider\',\n+ \'zope.contenttype\', \'zope.datetime\', \'zope.deferredimport\',\n+ \'zope.deprecation\', \'zope.dottedname\', \'zope.event\', \'zope.exceptions\',\n+ \'zope.filerepresentation\', \'zope.globalrequest\', \'zope.hookable\',\n+ \'zope.i18n\', \'zope.i18nmessageid\', \'zope.interface\', \'zope.lifecycleevent\',\n+ \'zope.location\', \'zope.pagetemplate\', \'zope.processlifetime\', \'zope.proxy\',\n+ \'zope.ptresource\', \'zope.publisher\', \'zope.schema\', \'zope.security\',\n+ \'zope.sequencesort\', \'zope.site\', \'zope.size\', \'zope.structuredtext\',\n+ \'zope.tal\', \'zope.tales\', \'zope.testbrowser\', \'zope.testing\',\n+ \'zope.traversing\', \'zope.viewlet\'\n+]\n+\'Products.CMFCore\' = [\n+ \'docutils\', \'five.localsitemanager\', \'Missing\', \'Products.BTreeFolder2\',\n+ \'Products.GenericSetup\', \'Products.MailHost\', \'Products.PythonScripts\',\n+ \'Products.StandardCacheManagers\', \'Products.ZCatalog\', \'Record\',\n+ \'zope.sendmail\', \'Zope\'\n+]\n+\'plone.base\' = [\n+ \'plone.batching\', \'plone.registry\', \'plone.schema\',\'plone.z3cform\',\n+ \'Products.CMFCore\', \'Products.CMFDynamicViewFTI\',\n+]\n+python-dateutil = [\'dateutil\']\n+ignore-packages = [\'robotide\', \'collective.js.speakjs\', \'watchdog\', \'robotframework-debuglibrary\', \'robotframework-ride\', \'robotframework-selenium2library\', \'robotframework-seleniumtestability\', \'sphinxcontrib-robotdoc\', \'robotsuite\', \'robotframework-browser\' ]\n+Pillow = [\'PIL\']\n+robotframework = [\'robot\']\n+\n+##\n+# Add extra configuration options in .meta.toml:\n+# [pyproject]\n+# dependencies_ignores = "[\'zestreleaser.towncrier\']"\n+# dependencies_mappings = [\n+# "gitpython = [\'git\']",\n+# "pygithub = [\'github\']",\n+# ]\n+##\n+\n+[tool.check-manifest]\n+ignore = [\n+ ".editorconfig",\n+ ".meta.toml",\n+ ".pre-commit-config.yaml",\n+ "tox.ini",\n+ ".flake8",\n+ "mx.ini",\n+\n+]\n+##\n+# Add extra configuration options in .meta.toml:\n+# [pyproject]\n+# check_manifest_ignores = """\n+# "*.map.js",\n+# "*.pyc",\n+# """\n+##\n+\n+\n+##\n+# Add extra configuration options in .meta.toml:\n+# [pyproject]\n+# extra_lines = """\n+# _your own configuration lines_\n+# """\n+##\ndiff --git a/requirements.txt b/requirements.txt\ndeleted file mode 100644\nindex bba24162..00000000\n--- a/requirements.txt\n+++ /dev/null\n@@ -1,2 +0,0 @@\n-setuptools==33.1.1\n-zc.buildout==2.12.1\ndiff --git a/setup.cfg b/setup.cfg\ndeleted file mode 100644\nindex 4f3a3e25..00000000\n--- a/setup.cfg\n+++ /dev/null\n@@ -1,14 +0,0 @@\n-[check-manifest]\n-ignore =\n- *.cfg\n- requirements.txt\n-\n-[isort]\n-profile = black\n-force_alphabetical_sort = True\n-force_single_line = True\n-lines_after_imports = 2\n-\n-[bdist_wheel]\n-# Py3 only\n-universal = 0\ndiff --git a/setup.py b/setup.py\nindex a78eeb34..c578ea70 100644\n--- a/setup.py\n+++ b/setup.py\n@@ -49,14 +49,20 @@ def read(filename):\n entry_points = dict(console_scripts=console_scripts)\n \n install_requires = [\n- "Products.CMFCore",\n+ "Pillow",\n "Products.CMFPlone",\n- "Products.MailHost",\n "Products.PlonePAS >= 5.0.1",\n "Products.PluggableAuthService",\n "babel",\n+ "docutils",\n "plone.app.testing",\n+ "plone.app.textfield",\n "plone.base",\n+ "plone.dexterity",\n+ "plone.i18n",\n+ "plone.namedfile",\n+ "plone.protect",\n+ "plone.registry",\n "plone.testing",\n "plone.uuid",\n "robotframework",\n@@ -66,19 +72,23 @@ def read(filename):\n "robotsuite", # not a direct dependency, but required for convenience\n "selenium",\n "setuptools",\n+ "z3c.form",\n+ "z3c.relationfield",\n "zope.component",\n- "zope.configuration",\n "zope.i18n",\n+ "zope.intid",\n "zope.schema",\n "zope.testrunner",\n ]\n \n test_requires = [\n- "plone.app.dexterity",\n+ "Products.MailHost",\n "plone.app.textfield",\n "plone.dexterity",\n "robotsuite",\n+ "webtest",\n "z3c.form",\n+ "zope.configuration",\n ]\n \n debug_requires = [\ndiff --git a/src/plone/app/robotframework/content.py b/src/plone/app/robotframework/content.py\nindex 31459b28..75d6cc89 100644\n--- a/src/plone/app/robotframework/content.py\n+++ b/src/plone/app/robotframework/content.py\n@@ -224,7 +224,7 @@ def fire_transition(self, content, action):\n """Fire workflow action for content"""\n disableCSRFProtection()\n # It should be ok to use unrestricted-methods, because workflow\n- # transition guard should proctect unprivileged transition:\n+ # transition guard should protect unprivileged transition:\n pc = getToolByName(self, "portal_catalog")\n results = pc.unrestrictedSearchResults(UID=content)\n obj = results[0]._unrestrictedGetObject()\ndiff --git a/src/plone/app/robotframework/i18n.py b/src/plone/app/robotframework/i18n.py\nindex 2af6f824..73d132a0 100644\n--- a/src/plone/app/robotframework/i18n.py\n+++ b/src/plone/app/robotframework/i18n.py\n@@ -21,7 +21,7 @@ def set_default_language(self, language=None):\n \n def translate(self, msgid, *args, **kwargs):\n """Return localized string for given msgid"""\n- # FIXME: we are alrady using robotframework = 3.0\n+ # FIXME: we are already using robotframework = 3.0\n # XXX: Because kwargs are only supported with robotframework >= 2.8.3,\n # we must parse them here to support robotframework < 2.8.3.\n for arg in [x for x in args if "=" in x]:\ndiff --git a/src/plone/app/robotframework/reload.py b/src/plone/app/robotframework/reload.py\nindex 201aa656..614b8827 100644\n--- a/src/plone/app/robotframework/reload.py\n+++ b/src/plone/app/robotframework/reload.py\n@@ -19,7 +19,6 @@ def ERROR(msg):\n \n \n class Watcher(FileSystemEventHandler):\n-\n allowed_extensions = {"po", "pt", "py", "xml", "csv", "zcml"}\n \n def __init__(self, paths, forkloop, minimum_wait=2.0):\n@@ -74,7 +73,6 @@ def on_any_event(self, event):\n \n class ForkLoop:\n def __init__(self):\n-\n self.fork = True # Must be \'True\' to create new child on start\n self.active = False\n self.pause = False\ndiff --git a/src/plone/app/robotframework/remote.py b/src/plone/app/robotframework/remote.py\nindex 29670010..e210e160 100644\n--- a/src/plone/app/robotframework/remote.py\n+++ b/src/plone/app/robotframework/remote.py\n@@ -51,7 +51,6 @@ def run_keyword(self, name, args, kwargs={}):\n \n \n class RemoteLibraryLayer(Layer):\n-\n defaultBases = (PLONE_FIXTURE,)\n libraryBases = ()\n \ndiff --git a/src/plone/app/robotframework/robotentrypoints.py b/src/plone/app/robotframework/robotentrypoints.py\nindex 71357d5a..8159b327 100644\n--- a/src/plone/app/robotframework/robotentrypoints.py\n+++ b/src/plone/app/robotframework/robotentrypoints.py\n@@ -69,7 +69,7 @@ def ride():\n \n plone.app.robotframework[ride,reload]\n \n-Remember that ride must be lauched with system python with\n+Remember that ride must be launched with system python with\n wxPython installed, like:\n \n /usr/bin/python bin/ride\ndiff --git a/src/plone/app/robotframework/saucelabs.py b/src/plone/app/robotframework/saucelabs.py\nindex 59c92cb3..978327ba 100644\n--- a/src/plone/app/robotframework/saucelabs.py\n+++ b/src/plone/app/robotframework/saucelabs.py\n@@ -13,12 +13,7 @@\n class SauceLabs:\n def report_sauce_status(self, name, status, tags=[], remote_url=""):\n """Report test status and tags to SauceLabs"""\n- job_id = (\n- BuiltIn()\n- .get_library_instance("Selenium2Library")\n- .driver\n- .session_id\n- )\n+ job_id = BuiltIn().get_library_instance("Selenium2Library").driver.session_id\n \n if USERNAME_ACCESS_KEY.match(remote_url):\n username, access_key = USERNAME_ACCESS_KEY.findall(remote_url)[0][1:]\ndiff --git a/src/plone/app/robotframework/server.py b/src/plone/app/robotframework/server.py\nindex 00151862..6f8205e6 100644\n--- a/src/plone/app/robotframework/server.py\n+++ b/src/plone/app/robotframework/server.py\n@@ -47,7 +47,6 @@ def READY(msg):\n \n \n def start(zope_layer_dotted_name):\n-\n print(WAIT("Starting Zope robot server"))\n \n zsl = Zope2Server()\n@@ -98,7 +97,6 @@ def start_reload(\n preload_layer_dotted_name="plone.app.testing.PLONE_FIXTURE",\n extensions=None,\n ):\n-\n print(WAIT("Starting Zope robot server"))\n \n zsl = Zope2Server()\n@@ -231,7 +229,6 @@ def server():\n \n \n class RobotListener:\n-\n ROBOT_LISTENER_API_VERSION = 2\n \n def __init__(self):\n@@ -249,7 +246,6 @@ def end_test(self, name, attrs):\n \n \n class Zope2Server:\n-\n stop_zope_server_lazy = False # trigger lazy Zope2Server shutdown\n stop_zope_server_layer = None # sticky layer for lazy shutdown\n \n@@ -304,7 +300,7 @@ def stop_zope_server(self, force=False):\n if not self.stop_zope_server_lazy or force:\n tear_down()\n else:\n- # With lazy stop, the layer is saved to enable Zope2Server re-use\n+ # With lazy stop, the layer is saved to enable Zope2Server reuse\n # within the same process, until tear_down is called explicitly.\n Zope2Server.stop_zope_server_layer = self.zope_layer\n self.zope_layer = None\n@@ -319,11 +315,7 @@ def zodb_setup(self, layer_dotted_name=None):\n for layer in layers:\n if hasattr(layer, "testSetUp"):\n if HAS_VERBOSE_CONSOLE:\n- print(\n- WAIT(\n- "Test set up {}.{}".format(layer.__module__, layer.__name__)\n- )\n- )\n+ print(WAIT(f"Test set up {layer.__module__}.{layer.__name__}"))\n layer.testSetUp()\n if HAS_VERBOSE_CONSOLE:\n print(READY("Test set up"))\ndiff --git a/src/plone/app/robotframework/testing.py b/src/plone/app/robotframework/testing.py\nindex 70860709..6e3a191b 100644\n--- a/src/plone/app/robotframework/testing.py\n+++ b/src/plone/app/robotframework/testing.py\n@@ -18,8 +18,8 @@\n from plone.app.testing import ploneSite\n from plone.testing import Layer\n from plone.testing import zope as zope_testing\n-from plone.testing.zope import WSGIServer\n from plone.testing.zope import WSGI_SERVER_FIXTURE\n+from plone.testing.zope import WSGIServer\n from Products.MailHost.interfaces import IMailHost\n from robot.libraries.BuiltIn import BuiltIn\n from webtest.http import StopableWSGIServer\n@@ -56,7 +56,6 @@ def tearDown(self):\n \n \n class SimplePublicationWithTypesLayer(Layer):\n-\n defaultBases = (SIMPLE_PUBLICATION_FIXTURE,)\n \n def setUp(self):\n@@ -207,7 +206,6 @@ def _get_robot_variable(self, name):\n return filter(bool, [s.strip() for s in candidates])\n \n def setUpZope(self, app, configurationContext):\n-\n # This installs the VHM in the Zope root, so we can have VHM support too\n AppInitializer(app).install_virtual_hosting()\n \n@@ -294,26 +292,22 @@ def __nonzero__(x):\n \n \n class WSGIServerSingleThreaded(WSGIServer):\n-\n def setUpServer(self):\n- """Create a single threaded WSGI server instance and save it in self.server.\n- """\n+ """Create a single threaded WSGI server instance and save it in self.server."""\n app = self.make_wsgi_app()\n- kwargs = {\'clear_untrusted_proxy_headers\': False,\n- \'threads\': 1}\n+ kwargs = {"clear_untrusted_proxy_headers": False, "threads": 1}\n if self.host is not None:\n- kwargs[\'host\'] = self.host\n+ kwargs["host"] = self.host\n if self.port is not None:\n- kwargs[\'port\'] = int(self.port)\n+ kwargs["port"] = int(self.port)\n self.server = StopableWSGIServer.create(app, **kwargs)\n # If we dynamically set the host/port, we want to reset it to localhost\n # Otherwise this will depend on, for example, the local network setup\n- if self.host in (None, \'0.0.0.0\', \'127.0.0.1\', \'localhost\'):\n- self.server.effective_host = \'localhost\'\n+ if self.host in (None, "0.0.0.0", "127.0.0.1", "localhost"):\n+ self.server.effective_host = "localhost"\n # Refresh the hostname and port in case we dynamically picked them\n- self[\'host\'] = self.host = self.server.effective_host\n- self[\'port\'] = self.port = int(self.server.effective_port)\n-\n+ self["host"] = self.host = self.server.effective_host\n+ self["port"] = self.port = int(self.server.effective_port)\n \n \n WSGI_SERVER_SINGLE_THREADED_FIXTURE = WSGIServerSingleThreaded()\n@@ -332,7 +326,6 @@ def setUpServer(self):\n if HAS_SPEAKJS:\n \n class SpeakJSLayer(Layer):\n-\n defaultBases = (PLONE_FIXTURE,)\n \n def setUp(self):\ndiff --git a/src/plone/app/robotframework/tests/test_content.py b/src/plone/app/robotframework/tests/test_content.py\nindex 9052b24d..516878e7 100644\n--- a/src/plone/app/robotframework/tests/test_content.py\n+++ b/src/plone/app/robotframework/tests/test_content.py\n@@ -7,7 +7,6 @@\n \n \n class TestCreateContent(unittest.TestCase):\n-\n layer = PLONE_ROBOT_INTEGRATION_TESTING\n \n def setUp(self):\n@@ -50,7 +49,6 @@ def test_create_content_updates_catalog(self):\n \n \n class TestGlobalAllow(unittest.TestCase):\n-\n layer = PLONE_ROBOT_INTEGRATION_TESTING\n \n def setUp(self):\ndiff --git a/src/plone/app/robotframework/users.py b/src/plone/app/robotframework/users.py\nindex 537e34e6..2611968f 100644\n--- a/src/plone/app/robotframework/users.py\n+++ b/src/plone/app/robotframework/users.py\n@@ -11,7 +11,7 @@ class Users(RemoteLibrary):\n def create_user(self, *args, **kwargs):\n """Create user with given details and return its id"""\n disableCSRFProtection()\n- # FIXME: we are alrady using robotframework = 3.0\n+ # FIXME: we are already using robotframework = 3.0\n # XXX: Because kwargs are only supported with robotframework >= 2.8.3,\n # we must parse them here to support robotframework < 2.8.3.\n for arg in [x for x in args if "=" in x]:\ndiff --git a/tox.ini b/tox.ini\nnew file mode 100644\nindex 00000000..0cb1d9e0\n--- /dev/null\n+++ b/tox.ini\n@@ -0,0 +1,210 @@\n+# Generated from:\n+# https://github.com/plone/meta/tree/master/config/default\n+# See the inline comments on how to expand/tweak this configuration file\n+[tox]\n+# We need 4.4.0 for constrain_package_deps.\n+min_version = 4.4.0\n+envlist =\n+ lint\n+ test\n+ dependencies\n+\n+\n+##\n+# Add extra configuration options in .meta.toml:\n+# [tox]\n+# envlist_lines = """\n+# my_other_environment\n+# """\n+# config_lines = """\n+# my_extra_top_level_tox_configuration_lines\n+# """\n+##\n+\n+[testenv]\n+skip_install = true\n+allowlist_externals =\n+ echo\n+ false\n+# Make sure typos like `tox -e formaat` are caught instead of silently doing nothing.\n+# See https://github.com/tox-dev/tox/issues/2858.\n+commands =\n+ echo "Unrecognized environment name {envname}"\n+ false\n+\n+[testenv:init]\n+description = Prepare environment\n+skip_install = true\n+commands =\n+ echo "Initial setup complete"\n+\n+\n+[testenv:format]\n+description = automatically reformat code\n+skip_install = true\n+deps =\n+ pre-commit\n+commands =\n+ pre-commit run -a pyupgrade\n+ pre-commit run -a isort\n+ pre-commit run -a black\n+ pre-commit run -a zpretty\n+\n+[testenv:lint]\n+description = run linters that will help improve the code style\n+skip_install = true\n+deps =\n+ pre-commit\n+commands =\n+ pre-commit run -a\n+\n+[testenv:dependencies]\n+description = check if the package defines all its dependencies\n+skip_install = true\n+deps =\n+ build\n+ z3c.dependencychecker==2.11\n+commands =\n+ python -m build --sdist --no-isolation\n+ dependencychecker\n+\n+[testenv:dependencies-graph]\n+description = generate a graph out of the dependencies of the package\n+skip_install = false\n+allowlist_externals =\n+ sh\n+deps =\n+ pipdeptree==2.5.1\n+ graphviz # optional dependency of pipdeptree\n+commands =\n+ sh -c \'pipdeptree --exclude setuptools,wheel,pipdeptree,zope.interface,zope.component --graph-output svg > dependencies.svg\'\n+\n+[testenv:test]\n+description = run the distribution tests\n+use_develop = true\n+skip_install = false\n+constrain_package_deps = true\n+set_env =\n+ ROBOT_BROWSER=headlesschrome\n+\n+##\n+# Specify extra test environment variables in .meta.toml:\n+# [tox]\n+# test_environment_variables = """\n+# PIP_EXTRA_INDEX_URL=https://my-pypi.my-server.com/\n+# """\n+#\n+# Set constrain_package_deps .meta.toml:\n+# [tox]\n+# constrain_package_deps = "false"\n+##\n+deps =\n+ zope.testrunner\n+ -c https://dist.plone.org/release/6.0-dev/constraints.txt\n+ \n+##\n+# Specify additional deps in .meta.toml:\n+# [tox]\n+# test_deps_additional = "-esources/plonegovbr.portal_base[test]"\n+#\n+# Specify a custom constraints file in .meta.toml:\n+# [tox]\n+# constraints_file = "https://my-server.com/constraints.txt"\n+##\n+commands =\n+ rfbrowser init\n+ zope-testrunner --all --test-path={toxinidir}/src -s plone.app.robotframework {posargs}\n+extras =\n+ test\n+\n+##\n+# Add extra configuration options in .meta.toml:\n+# [tox]\n+# test_extras = """\n+# tests\n+# widgets\n+# """\n+##\n+\n+[testenv:coverage]\n+description = get a test coverage report\n+use_develop = true\n+skip_install = false\n+constrain_package_deps = true\n+set_env =\n+ ROBOT_BROWSER=headlesschrome\n+\n+##\n+# Specify extra test environment variables in .meta.toml:\n+# [tox]\n+# test_environment_variables = """\n+# PIP_EXTRA_INDEX_URL=https://my-pypi.my-server.com/\n+# """\n+##\n+deps =\n+ coverage\n+ zope.testrunner\n+ -c https://dist.plone.org/release/6.0-dev/constraints.txt\n+ \n+commands =\n+ rfbrowser init\n+ coverage run --branch --source plone.app.robotframework {envbindir}/zope-testrunner --quiet --all --test-path={toxinidir}/src -s plone.app.robotframework {posargs}\n+ coverage report -m --format markdown\n+ coverage xml\n+extras =\n+ test\n+\n+\n+[testenv:release-check]\n+description = ensure that the distribution is ready to release\n+skip_install = true\n+deps =\n+ twine\n+ build\n+ towncrier\n+ -c https://dist.plone.org/release/6.0-dev/constraints.txt\n+ \n+commands =\n+ # fake version to not have to install the package\n+ # we build the change log as news entries might break\n+ # the README that is displayed on PyPI\n+ towncrier build --version=100.0.0 --yes\n+ python -m build --sdist --no-isolation\n+ twine check dist/*\n+\n+[testenv:circular]\n+description = ensure there are no cyclic dependencies\n+use_develop = true\n+skip_install = false\n+set_env =\n+\n+##\n+# Specify extra test environment variables in .meta.toml:\n+# [tox]\n+# test_environment_variables = """\n+# PIP_EXTRA_INDEX_URL=https://my-pypi.my-server.com/\n+# """\n+##\n+allowlist_externals =\n+ sh\n+deps =\n+ pipdeptree\n+ pipforester\n+ -c https://dist.plone.org/release/6.0-dev/constraints.txt\n+ \n+commands =\n+ # Generate the full dependency tree\n+ sh -c \'pipdeptree -j > forest.json\'\n+ # Generate a DOT graph with the circular dependencies, if any\n+ pipforester -i forest.json -o forest.dot --cycles\n+ # Report if there are any circular dependencies, i.e. error if there are any\n+ pipforester -i forest.json --check-cycles -o /dev/null\n+\n+\n+##\n+# Add extra configuration options in .meta.toml:\n+# [tox]\n+# extra_lines = """\n+# _your own configuration lines_\n+# """\n+##\n'