From 973ba43ab1c176a3b39a291fa4ff984d846ad68c Mon Sep 17 00:00:00 2001 From: szakitibi Date: Wed, 22 Apr 2026 13:56:55 +0200 Subject: [PATCH 01/16] Configuring with plone.meta --- .editorconfig | 10 +- .flake8 | 2 +- .github/dependabot.yml | 11 ++ .github/workflows/meta.yml | 17 +- .github/workflows/test-matrix.yml | 69 ++++++++ .github/workflows/test.yml | 40 ----- .gitignore | 5 +- .meta.toml | 4 +- .pre-commit-config.yaml | 28 ++-- news/.gitkeep | 0 pyproject.toml | 58 ++++++- setup.py | 11 +- src/collective/lineage/__init__.py | 1 - src/collective/lineage/browser.py | 1 - src/collective/lineage/interfaces.py | 1 - src/collective/lineage/testing.py | 1 - src/collective/lineage/tests/test_adapter.py | 1 - src/collective/lineage/tests/test_browser.py | 1 - src/collective/lineage/tests/test_setup.py | 1 - src/collective/lineage/tests/test_utils.py | 1 - src/collective/lineage/upgrades.py | 1 - tox.ini | 156 ++++++++++++------- 22 files changed, 267 insertions(+), 153 deletions(-) create mode 100644 .github/dependabot.yml create mode 100644 .github/workflows/test-matrix.yml delete mode 100644 .github/workflows/test.yml create mode 100644 news/.gitkeep diff --git a/.editorconfig b/.editorconfig index 8ae05aa..55bfb6d 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,5 +1,5 @@ # Generated from: -# https://github.com/plone/meta/tree/master/config/default +# https://github.com/plone/meta/tree/2.x/src/plone/meta/default # See the inline comments on how to expand/tweak this configuration file # # EditorConfig Configuration file, for more details see: @@ -13,7 +13,8 @@ root = true -[*] # For All Files +[*] +# Default settings for all files. # Unix-style newlines with a newline ending every file end_of_line = lf insert_final_newline = true @@ -29,11 +30,12 @@ max_line_length = off # 4 space indentation indent_size = 4 -[*.{yml,zpt,pt,dtml,zcml}] +[*.{yml,zpt,pt,dtml,zcml,html,xml}] # 2 space indentation indent_size = 2 -[*.{json,jsonl,js,jsx,ts,tsx,css,less,scss,html}] # Frontend development +[*.{json,jsonl,js,jsx,ts,tsx,css,less,scss}] +# Frontend development # 2 space indentation indent_size = 2 max_line_length = 80 diff --git a/.flake8 b/.flake8 index 7ef4f64..ff17672 100644 --- a/.flake8 +++ b/.flake8 @@ -1,5 +1,5 @@ # Generated from: -# https://github.com/plone/meta/tree/master/config/default +# https://github.com/plone/meta/tree/2.x/src/plone/meta/default # See the inline comments on how to expand/tweak this configuration file [flake8] doctests = 1 diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..8da3888 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,11 @@ +# Generated from: +# https://github.com/plone/meta/tree/2.x/src/plone/meta/default +# See the inline comments on how to expand/tweak this configuration file +version: 2 +updates: + + - package-ecosystem: "github-actions" + directory: "/" + schedule: + # Check for updates to GitHub Actions every week + interval: "weekly" diff --git a/.github/workflows/meta.yml b/.github/workflows/meta.yml index 40bb5c1..87a319b 100644 --- a/.github/workflows/meta.yml +++ b/.github/workflows/meta.yml @@ -1,16 +1,10 @@ # Generated from: -# https://github.com/plone/meta/tree/master/config/default +# https://github.com/plone/meta/tree/2.x/src/plone/meta/default # See the inline comments on how to expand/tweak this configuration file name: Meta + on: push: - branches: - - master - - main - pull_request: - branches: - - master - - main workflow_dispatch: ## @@ -25,18 +19,17 @@ on: jobs: qa: - uses: plone/meta/.github/workflows/qa.yml@main + uses: plone/meta/.github/workflows/qa.yml@2.x test: - uses: plone/meta/.github/workflows/test.yml@main + uses: plone/meta/.github/workflows/test.yml@2.x release_ready: - uses: plone/meta/.github/workflows/release_ready.yml@main + uses: plone/meta/.github/workflows/release_ready.yml@2.x ## # To modify the list of default jobs being created add in .meta.toml: # [github] # jobs = [ # "qa", -# "test", # "coverage", # "dependencies", # "release_ready", diff --git a/.github/workflows/test-matrix.yml b/.github/workflows/test-matrix.yml new file mode 100644 index 0000000..17e71f5 --- /dev/null +++ b/.github/workflows/test-matrix.yml @@ -0,0 +1,69 @@ +# Generated from: +# https://github.com/plone/meta/tree/2.x/src/plone/meta/default +# See the inline comments on how to expand/tweak this configuration file +name: Tests + +on: + push: + workflow_dispatch: + +jobs: + build: + permissions: + contents: read + pull-requests: write + strategy: + # We want to see all failures: + fail-fast: false + matrix: + os: + - ["ubuntu", "ubuntu-latest"] + config: + # [Python version, visual name, tox env] + - ["3.14", "6.2 on py3.14", "py314-plone62"] + - ["3.10", "6.2 on py3.10", "py310-plone62"] + - ["3.13", "6.1 on py3.13", "py313-plone61"] + - ["3.10", "6.1 on py3.10", "py310-plone61"] + - ["3.13", "6.0 on py3.13", "py313-plone60"] + - ["3.10", "6.0 on py3.10", "py310-plone60"] + + runs-on: ${{ matrix.os[1] }} + if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name + name: ${{ matrix.config[1] }} + steps: + - uses: actions/checkout@v6 + with: + persist-credentials: false + - name: Install uv + caching + uses: astral-sh/setup-uv@v8.0.0 + with: + enable-cache: true + cache-dependency-glob: | + setup.* + tox.ini + pyproject.toml + python-version: ${{ matrix.config[0] }} + +## +# Add extra configuration options in .meta.toml: +# [github] +# extra_lines_after_os_dependencies = """ +# _your own configuration lines_ +# """ +## + - name: Initialize tox + # the bash one-liner below does not work on Windows + if: contains(matrix.os, 'ubuntu') + run: | + if [ `uvx tox list --no-desc -f init|wc -l` = 1 ]; then uvx --with tox-uv tox -e init;else true; fi + - name: Test + run: uvx --with tox-uv tox -e ${{ matrix.config[2] }} + + +## +# Add extra configuration options in .meta.toml: +# [github] +# extra_lines = """ +# _your own configuration lines_ +# """ +## diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml deleted file mode 100644 index bdc21be..0000000 --- a/.github/workflows/test.yml +++ /dev/null @@ -1,40 +0,0 @@ -name: Plone 5.2 tests - -on: - push: - branches: - - master - pull_request: - branches: - - master - -jobs: - build: - strategy: - fail-fast: false - matrix: - config: - # [Python version, tox env] - - ["3.8", "plone52"] - runs-on: ubuntu-20.04 - name: ${{ matrix.config[1] }}-py${{ matrix.config[0] }} - steps: - - uses: actions/checkout@v3 - - name: Set up Python - uses: actions/setup-python@v4 - with: - python-version: ${{ matrix.config[0] }} - - name: Pip cache - uses: actions/cache@v2 - with: - path: ~/.cache/pip - key: ${{ runner.os }}-pip-${{ matrix.config[0] }}-${{ matrix.config[1] }}-${{ hashFiles('setup.*', 'tox.ini') }} - restore-keys: | - ${{ runner.os }}-pip-${{ matrix.config[0] }}- - ${{ runner.os }}-pip- - - name: Install dependencies - run: | - python -m pip install --upgrade pip - pip install tox - - name: Test - run: tox -e ${{ matrix.config[1] }} diff --git a/.gitignore b/.gitignore index 503e47c..70377bd 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,5 @@ # Generated from: -# https://github.com/plone/meta/tree/master/config/default +# https://github.com/plone/meta/tree/2.x/src/plone/meta/default # See the inline comments on how to expand/tweak this configuration file # python related *.egg-info @@ -20,6 +20,8 @@ __pycache__/ .tox .vscode/ node_modules/ +forest.dot +forest.json # venv / buildout related bin/ @@ -35,6 +37,7 @@ lib64 parts/ pyvenv.cfg var/ +local.cfg # mxdev /instance/ diff --git a/.meta.toml b/.meta.toml index 1cce024..a7f21f6 100644 --- a/.meta.toml +++ b/.meta.toml @@ -1,9 +1,9 @@ # Generated from: -# https://github.com/plone/meta/tree/master/config/default +# https://github.com/plone/meta/tree/2.x/src/plone/meta/default # See the inline comments on how to expand/tweak this configuration file [meta] template = "default" -commit-id = "8c30aa23" +commit-id = "2.8.0" [tox] extra_lines = """ diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index f13d059..fd9a409 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,5 +1,5 @@ # Generated from: -# https://github.com/plone/meta/tree/master/config/default +# https://github.com/plone/meta/tree/2.x/src/plone/meta/default # See the inline comments on how to expand/tweak this configuration file ci: autofix_prs: false @@ -7,20 +7,20 @@ ci: repos: - repo: https://github.com/asottile/pyupgrade - rev: v3.15.0 + rev: v3.21.2 hooks: - id: pyupgrade - args: [--py38-plus] + args: [--py310-plus] - repo: https://github.com/pycqa/isort - rev: 5.12.0 + rev: 8.0.1 hooks: - id: isort -- repo: https://github.com/psf/black - rev: 23.10.1 +- repo: https://github.com/psf/black-pre-commit-mirror + rev: 26.3.1 hooks: - id: black - repo: https://github.com/collective/zpretty - rev: 3.1.0 + rev: 3.1.1 hooks: - id: zpretty @@ -32,7 +32,7 @@ repos: # """ ## - repo: https://github.com/PyCQA/flake8 - rev: 6.1.0 + rev: 7.3.0 hooks: - id: flake8 @@ -44,7 +44,7 @@ repos: # """ ## - repo: https://github.com/codespell-project/codespell - rev: v2.2.6 + rev: v2.4.2 hooks: - id: codespell additional_dependencies: @@ -58,20 +58,20 @@ repos: # """ ## - repo: https://github.com/mgedmin/check-manifest - rev: "0.49" + rev: "0.51" hooks: - id: check-manifest - repo: https://github.com/regebro/pyroma - rev: "4.2" + rev: "5.0.1" hooks: - id: pyroma - repo: https://github.com/mgedmin/check-python-versions - rev: "0.22.0" + rev: "0.24.0" hooks: - id: check-python-versions - args: ['--only', 'setup.py,pyproject.toml'] + args: ['--only', 'setup.py,tox.ini'] - repo: https://github.com/collective/i18ndude - rev: "6.1.0" + rev: "6.3.0" hooks: - id: i18ndude diff --git a/news/.gitkeep b/news/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/pyproject.toml b/pyproject.toml index 7a4d2d7..1db75d0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,8 +1,46 @@ # Generated from: -# https://github.com/plone/meta/tree/master/config/default +# https://github.com/plone/meta/tree/2.x/src/plone/meta/default # See the inline comments on how to expand/tweak this configuration file [build-system] -requires = ["setuptools>=68.2"] +requires = ["setuptools>=68.2,<82", "wheel"] + + + +[tool.towncrier] +directory = "news/" +filename = "CHANGES.rst" +title_format = "{version} ({project_date})" +underlines = ["-", ""] + +[[tool.towncrier.type]] +directory = "breaking" +name = "Breaking changes:" +showcontent = true + +[[tool.towncrier.type]] +directory = "feature" +name = "New features:" +showcontent = true + +[[tool.towncrier.type]] +directory = "bugfix" +name = "Bug fixes:" +showcontent = true + +[[tool.towncrier.type]] +directory = "internal" +name = "Internal:" +showcontent = true + +[[tool.towncrier.type]] +directory = "documentation" +name = "Documentation:" +showcontent = true + +[[tool.towncrier.type]] +directory = "tests" +name = "Tests:" +showcontent = true ## # Add extra configuration options in .meta.toml: @@ -24,7 +62,7 @@ profile = "plone" ## [tool.black] -target-version = ["py38"] +target-version = ["py310"] ## # Add extra configuration options in .meta.toml: @@ -35,7 +73,7 @@ target-version = ["py38"] ## [tool.codespell] -ignore-words-list = "discreet," +ignore-words-list = "discreet,assertin,thet," skip = "*.po," ## # Add extra configuration options in .meta.toml: @@ -83,6 +121,7 @@ Zope = [ 'Products.CMFCore', 'Products.CMFDynamicViewFTI', ] python-dateutil = ['dateutil'] +pytest-plone = ['pytest', 'zope.pytestlayer', 'plone.testing', 'plone.app.testing'] ignore-packages = ['plone.base', 'plone.app.layout'] ## @@ -98,13 +137,15 @@ ignore-packages = ['plone.base', 'plone.app.layout'] [tool.check-manifest] ignore = [ ".editorconfig", + ".flake8", ".meta.toml", ".pre-commit-config.yaml", - "tox.ini", - ".flake8", + "dependabot.yml", "mx.ini", + "tox.ini", ] + ## # Add extra configuration options in .meta.toml: # [pyproject] @@ -112,6 +153,11 @@ ignore = [ # "*.map.js", # "*.pyc", # """ +# check_manifest_extra_lines = """ +# ignore-bad-ideas = [ +# "some/test/file/PKG-INFO", +# ] +# """ ## diff --git a/setup.py b/setup.py index 15de4de..6b270d4 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,6 @@ from setuptools import find_packages from setuptools import setup - version = "3.0.1.dev0" short_description = "The microsite creation product for Plone" long_description = "\n\n".join( @@ -19,18 +18,18 @@ "Development Status :: 5 - Production/Stable", "Environment :: Web Environment", "Framework :: Plone", - "Framework :: Plone :: 5.2", - "Framework :: Plone :: 6.0", + "Framework :: Plone :: 6.2", "Framework :: Plone :: Addon", "Intended Audience :: End Users/Desktop", "Intended Audience :: System Administrators", "License :: OSI Approved :: GNU General Public License (GPL)", "Operating System :: OS Independent", "Programming Language :: Python", - "Programming Language :: Python :: 3.8", - "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.14", "Topic :: Software Development :: Libraries :: Python Modules", ], keywords="plone lineage", @@ -43,7 +42,7 @@ namespace_packages=["collective"], include_package_data=True, zip_safe=False, - python_requires=">=3.8", + python_requires=">=3.10", install_requires=[ "setuptools", "Products.CMFCore", diff --git a/src/collective/lineage/__init__.py b/src/collective/lineage/__init__.py index 0e32ff5..892f5fe 100644 --- a/src/collective/lineage/__init__.py +++ b/src/collective/lineage/__init__.py @@ -1,4 +1,3 @@ import zope.i18nmessageid - MessageFactory = zope.i18nmessageid.MessageFactory("collective.lineage") diff --git a/src/collective/lineage/browser.py b/src/collective/lineage/browser.py index 06796ca..36f2e03 100644 --- a/src/collective/lineage/browser.py +++ b/src/collective/lineage/browser.py @@ -9,7 +9,6 @@ from zope.component import getMultiAdapter from zope.i18nmessageid import MessageFactory - try: from plone.base.defaultpage import is_default_page except ImportError: diff --git a/src/collective/lineage/interfaces.py b/src/collective/lineage/interfaces.py index b81db14..a2fd2a2 100644 --- a/src/collective/lineage/interfaces.py +++ b/src/collective/lineage/interfaces.py @@ -2,7 +2,6 @@ from zope.i18nmessageid import MessageFactory from zope.interface import Interface - try: from plone.base.interfaces import INavigationRoot except ImportError: diff --git a/src/collective/lineage/testing.py b/src/collective/lineage/testing.py index fd22a4b..1176ab7 100644 --- a/src/collective/lineage/testing.py +++ b/src/collective/lineage/testing.py @@ -26,7 +26,6 @@ from plone.app.testing import PLONE_FIXTURE from plone.app.testing import PloneSandboxLayer - try: from Products.CMFPlone.utils import get_installer except ImportError: diff --git a/src/collective/lineage/tests/test_adapter.py b/src/collective/lineage/tests/test_adapter.py index 04b25ee..4f2516e 100644 --- a/src/collective/lineage/tests/test_adapter.py +++ b/src/collective/lineage/tests/test_adapter.py @@ -4,7 +4,6 @@ from zope.component import queryUtility from zope.component.hooks import setSite - PROJECTNAME = "collective.lineage" diff --git a/src/collective/lineage/tests/test_browser.py b/src/collective/lineage/tests/test_browser.py index 154d6f6..5bd6511 100644 --- a/src/collective/lineage/tests/test_browser.py +++ b/src/collective/lineage/tests/test_browser.py @@ -4,7 +4,6 @@ import transaction - try: from plone.testing import zope except ImportError: diff --git a/src/collective/lineage/tests/test_setup.py b/src/collective/lineage/tests/test_setup.py index 62bef54..806c496 100644 --- a/src/collective/lineage/tests/test_setup.py +++ b/src/collective/lineage/tests/test_setup.py @@ -3,7 +3,6 @@ from plone.app.testing import TEST_USER_ID from plone.browserlayer.utils import registered_layers - try: # BBB import unittest2 as unittest diff --git a/src/collective/lineage/tests/test_utils.py b/src/collective/lineage/tests/test_utils.py index dea8745..3b8f0c0 100644 --- a/src/collective/lineage/tests/test_utils.py +++ b/src/collective/lineage/tests/test_utils.py @@ -4,7 +4,6 @@ from zope import component from zope import interface - PROJECTNAME = "collective.lineage" diff --git a/src/collective/lineage/upgrades.py b/src/collective/lineage/upgrades.py index df87ec7..e9c6f81 100644 --- a/src/collective/lineage/upgrades.py +++ b/src/collective/lineage/upgrades.py @@ -1,6 +1,5 @@ from logging import getLogger - logger = getLogger("collective.lineage.upgrades") diff --git a/tox.ini b/tox.ini index bd13f47..75c5b21 100644 --- a/tox.ini +++ b/tox.ini @@ -1,5 +1,5 @@ # Generated from: -# https://github.com/plone/meta/tree/master/config/default +# https://github.com/plone/meta/tree/2.x/src/plone/meta/default # See the inline comments on how to expand/tweak this configuration file [tox] # We need 4.4.0 for constrain_package_deps. @@ -7,12 +7,31 @@ min_version = 4.4.0 envlist = lint test + py314-plone62 + py313-plone62 + py312-plone62 + py311-plone62 + py310-plone62 + py313-plone61 + py312-plone61 + py311-plone61 + py310-plone61 + py313-plone60 + py312-plone60 + py311-plone60 + py310-plone60 dependencies ## # Add extra configuration options in .meta.toml: +# - to specify a custom testing combination of Plone and python versions, use `test_matrix` +# Use ["*"] to use all supported Python versions for this Plone version. +# - to disable the test matrix entirely, set `use_test_matrix = false` +# - to specify extra custom environments, use `envlist_lines` +# - to specify extra `tox` top-level options, use `config_lines` # [tox] +# test_matrix = {"6.2" = ["3.13", "3.12"], "6.1" = ["*"]} # envlist_lines = """ # my_other_environment # """ @@ -21,32 +40,14 @@ envlist = # """ ## -[testenv] -skip_install = true -allowlist_externals = - echo - false -# Make sure typos like `tox -e formaat` are caught instead of silently doing nothing. -# See https://github.com/tox-dev/tox/issues/2858. -commands = - echo "Unrecognized environment name {envname}" - false - -## -# Add extra configuration options in .meta.toml: -# [tox] -# testenv_options = """ -# basepython = /usr/bin/python3.8 -# """ -## - [testenv:init] description = Prepare environment skip_install = true +allowlist_externals = + echo commands = echo "Initial setup complete" - [testenv:format] description = automatically reformat code skip_install = true @@ -71,9 +72,9 @@ description = check if the package defines all its dependencies skip_install = true deps = build - z3c.dependencychecker==2.11 + z3c.dependencychecker==3.0 commands = - python -m build --sdist + python -m build --wheel dependencychecker [testenv:dependencies-graph] @@ -87,8 +88,19 @@ deps = commands = sh -c 'pipdeptree --exclude setuptools,wheel,pipdeptree,zope.interface,zope.component --graph-output svg > dependencies.svg' -[testenv:test] -description = run the distribution tests + +[test_runner] +deps = zope.testrunner +test = + zope-testrunner --all --test-path={toxinidir}/src -s collective.lineage {posargs} +coverage = + coverage run --branch --source collective.lineage {envbindir}/zope-testrunner --quiet --all --test-path={toxinidir}/src -s collective.lineage {posargs} + coverage report -m --format markdown + coverage xml + coverage html + +[base] +description = shared configuration for tests and coverage use_develop = true skip_install = false constrain_package_deps = true @@ -104,61 +116,83 @@ set_env = # # Set constrain_package_deps .meta.toml: # [tox] -# constrain_package_deps = "false" +# constrain_package_deps = false ## deps = - zope.testrunner - -c https://dist.plone.org/release/6.0-dev/constraints.txt - + {[test_runner]deps} + plone62: -c https://dist.plone.org/release/6.2-dev/constraints.txt + plone61: -c https://dist.plone.org/release/6.1-dev/constraints.txt + plone60: -c https://dist.plone.org/release/6.0-dev/constraints.txt + ## # Specify additional deps in .meta.toml: # [tox] -# test_deps_additional = "-esources/plonegovbr.portal_base[test]" +# test_deps_additional = """ +# -esources/plonegovbr.portal_base[test] +# """ # # Specify a custom constraints file in .meta.toml: # [tox] # constraints_file = "https://my-server.com/constraints.txt" ## -commands = - zope-testrunner --all --test-path={toxinidir}/src -s collective.lineage {posargs} extras = test + ## # Add extra configuration options in .meta.toml: # [tox] +# skip_test_extra = true # test_extras = """ # tests # widgets # """ +# +# Add extra configuration options in .meta.toml: +# [tox] +# testenv_options = """ +# basepython = /usr/bin/python3.8 +# """ ## +[testenv:test] +description = run the distribution tests +use_develop = {[base]use_develop} +skip_install = {[base]skip_install} +constrain_package_deps = {[base]constrain_package_deps} +set_env = {[base]set_env} +deps = + {[test_runner]deps} + -c https://dist.plone.org/release/6.2-dev/constraints.txt + +commands = {[test_runner]test} +extras = {[base]extras} + + +[testenv] +description = run the distribution tests (generative environments) +use_develop = {[base]use_develop} +skip_install = {[base]skip_install} +constrain_package_deps = {[base]constrain_package_deps} +set_env = {[base]set_env} +deps = {[base]deps} +commands = {[test_runner]test} +extras = {[base]extras} + + [testenv:coverage] description = get a test coverage report -use_develop = true -skip_install = false -constrain_package_deps = true -set_env = - ROBOT_BROWSER=headlesschrome - -## -# Specify extra test environment variables in .meta.toml: -# [tox] -# test_environment_variables = """ -# PIP_EXTRA_INDEX_URL=https://my-pypi.my-server.com/ -# """ -## +use_develop = {[base]use_develop} +skip_install = {[base]skip_install} +constrain_package_deps = {[base]constrain_package_deps} +set_env = {[base]set_env} deps = + {[test_runner]deps} coverage - zope.testrunner - -c https://dist.plone.org/release/6.0-dev/constraints.txt - -commands = - coverage run --branch --source collective.lineage {envbindir}/zope-testrunner --quiet --all --test-path={toxinidir}/src -s collective.lineage {posargs} - coverage report -m --format markdown - coverage xml -extras = - test + -c https://dist.plone.org/release/6.2-dev/constraints.txt + +commands = {[test_runner]coverage} +extras = {[base]extras} [testenv:release-check] @@ -167,9 +201,13 @@ skip_install = true deps = twine build - -c https://dist.plone.org/release/6.0-dev/constraints.txt - + towncrier + -c https://dist.plone.org/release/6.2-dev/constraints.txt commands = + # fake version to not have to install the package + # we build the change log as news entries might break + # the README that is displayed on PyPI + towncrier build --version=100.0.0 --yes python -m build --sdist twine check dist/* @@ -177,6 +215,9 @@ commands = description = ensure there are no cyclic dependencies use_develop = true skip_install = false +# Here we must always constrain the package deps to what is already installed, +# otherwise we simply get the latest from PyPI, which may not work. +constrain_package_deps = true set_env = ## @@ -191,8 +232,7 @@ allowlist_externals = deps = pipdeptree pipforester - -c https://dist.plone.org/release/6.0-dev/constraints.txt - + -c https://dist.plone.org/release/6.2-dev/constraints.txt commands = # Generate the full dependency tree sh -c 'pipdeptree -j > forest.json' From a08822a0f3995968cf973bcdfa622c015506c000 Mon Sep 17 00:00:00 2001 From: szakitibi Date: Wed, 22 Apr 2026 14:33:25 +0200 Subject: [PATCH 02/16] drop Archetype and Plone 5 support --- .github/workflows/test-matrix.yml | 4 - .gitignore | 1 + .meta.toml | 18 +--- MANIFEST.in | 14 ++- base.cfg | 106 ------------------- buildout.cfg | 6 -- constraints.txt | 2 +- constraints_plone52.txt | 1 - requirements.txt | 2 +- requirements_plone52.txt | 2 - src/collective/lineage/browser.py | 12 +-- src/collective/lineage/interfaces.py | 7 +- src/collective/lineage/testing.py | 44 ++------ src/collective/lineage/tests/test_adapter.py | 25 ----- src/collective/lineage/tests/test_browser.py | 11 +- src/collective/lineage/tests/test_setup.py | 14 +-- test_plone52.cfg | 10 -- tox.ini | 10 -- 18 files changed, 28 insertions(+), 261 deletions(-) delete mode 100644 base.cfg delete mode 100644 buildout.cfg delete mode 100644 constraints_plone52.txt delete mode 100644 requirements_plone52.txt delete mode 100644 test_plone52.cfg diff --git a/.github/workflows/test-matrix.yml b/.github/workflows/test-matrix.yml index 17e71f5..de94628 100644 --- a/.github/workflows/test-matrix.yml +++ b/.github/workflows/test-matrix.yml @@ -22,10 +22,6 @@ jobs: # [Python version, visual name, tox env] - ["3.14", "6.2 on py3.14", "py314-plone62"] - ["3.10", "6.2 on py3.10", "py310-plone62"] - - ["3.13", "6.1 on py3.13", "py313-plone61"] - - ["3.10", "6.1 on py3.10", "py310-plone61"] - - ["3.13", "6.0 on py3.13", "py313-plone60"] - - ["3.10", "6.0 on py3.10", "py310-plone60"] runs-on: ${{ matrix.os[1] }} if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name diff --git a/.gitignore b/.gitignore index 70377bd..224bcb6 100644 --- a/.gitignore +++ b/.gitignore @@ -38,6 +38,7 @@ parts/ pyvenv.cfg var/ local.cfg +share/ # mxdev /instance/ diff --git a/.meta.toml b/.meta.toml index a7f21f6..36564ee 100644 --- a/.meta.toml +++ b/.meta.toml @@ -5,21 +5,6 @@ template = "default" commit-id = "2.8.0" -[tox] -extra_lines = """ -[testenv:plone52] -min_version = 3.28.0 -description = Plone 5.2 tests with buildout -skip_install = true -deps = - -rrequirements_plone52.txt -commands_pre = - {envbindir}/buildout -nc {toxinidir}/test_plone52.cfg buildout:directory={envdir} buildout:develop={toxinidir} -commands = - {envbindir}/code-analysis - {envbindir}/test {posargs} -""" - [github] jobs = [ "qa", @@ -27,5 +12,8 @@ jobs = [ "release_ready", ] +[tox] +test_matrix = {"6.2" = ["*"]} + [pyproject] dependencies_ignores = "['plone.base', 'plone.app.layout']" diff --git a/MANIFEST.in b/MANIFEST.in index c2509f3..500c6c9 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,12 +1,10 @@ -include *.txt +graft src +graft docs include *.rst - -recursive-include src * -recursive-include docs * - global-exclude *.pyc exclude .coveragerc -exclude base.cfg -exclude buildout.cfg -exclude test_plone52.cfg exclude tox.ini + +include requirements.txt +include constraints.txt +prune news \ No newline at end of file diff --git a/base.cfg b/base.cfg deleted file mode 100644 index 6451ef0..0000000 --- a/base.cfg +++ /dev/null @@ -1,106 +0,0 @@ -[buildout] -show-picked-versions = true -extensions = - mr.developer - -index = https://pypi.python.org/simple/ - -parts = - instance - test - code-analysis - coverage - test-coverage - createcoverage - releaser - i18ndude - omelette - robot - plone-helper-scripts -develop = . - - -[instance] -recipe = plone.recipe.zope2instance -user = admin:admin -http-address = 8080 -environment-vars = - zope_i18n_compile_mo_files true -eggs = - Plone - Pillow - collective.lineage [test] - - -[code-analysis] -recipe = plone.recipe.codeanalysis[recommended] -directory = ${buildout:directory}/src/{{{ package.namespace }}} -return-status-codes = False - - -[omelette] -recipe = collective.recipe.omelette -eggs = ${instance:eggs} - - -[test] -recipe = zc.recipe.testrunner -eggs = ${instance:eggs} -initialization = - os.environ['TZ'] = 'UTC' -defaults = ['-s', 'collective.lineage', '--auto-color', '--auto-progress'] - - -[coverage] -recipe = zc.recipe.egg -eggs = coverage - - -[test-coverage] -recipe = collective.recipe.template -input = inline: - #!/bin/bash - export TZ=UTC - ${buildout:directory}/bin/coverage run bin/test $* - ${buildout:directory}/bin/coverage html - ${buildout:directory}/bin/coverage report -m --fail-under=90 - # Fail (exit status 1) if coverage returns exit status 2 (this happens - # when test coverage is below 100%. -output = ${buildout:directory}/bin/test-coverage -mode = 755 - - -[createcoverage] -recipe = zc.recipe.egg -eggs = createcoverage - - -[robot] -recipe = zc.recipe.egg -eggs = - ${test:eggs} - plone.app.robotframework[debug,reload] - - -[releaser] -recipe = zc.recipe.egg -eggs = zest.releaser - - -[i18ndude] -recipe = zc.recipe.egg -eggs = i18ndude - -[plone-helper-scripts] -recipe = zc.recipe.egg -eggs = - Products.CMFPlone - ${instance:eggs} -interpreter = zopepy -scripts = - zopepy - plone-compile-resources - -[versions] -# Don't use a released version of collective.lineage -collective.lineage = diff --git a/buildout.cfg b/buildout.cfg deleted file mode 100644 index 1ff605d..0000000 --- a/buildout.cfg +++ /dev/null @@ -1,6 +0,0 @@ -[buildout] - -# use this extend one of the buildout configuration: -extends = - test_plone52.cfg - test_plone60.cfg diff --git a/constraints.txt b/constraints.txt index c0e8f2f..d293e06 100644 --- a/constraints.txt +++ b/constraints.txt @@ -1 +1 @@ --c https://dist.plone.org/release/6.0-dev/constraints.txt +-c https://dist.plone.org/release/6.2-latest/constraints.txt diff --git a/constraints_plone52.txt b/constraints_plone52.txt deleted file mode 100644 index 7efc510..0000000 --- a/constraints_plone52.txt +++ /dev/null @@ -1 +0,0 @@ --c https://dist.plone.org/release/5.2-latest/constraints.txt diff --git a/requirements.txt b/requirements.txt index cbccb03..1855f2d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,2 @@ -c constraints.txt --r https://dist.plone.org/release/6.0-latest/requirements.txt +-e .[test] \ No newline at end of file diff --git a/requirements_plone52.txt b/requirements_plone52.txt deleted file mode 100644 index 52f04ce..0000000 --- a/requirements_plone52.txt +++ /dev/null @@ -1,2 +0,0 @@ --c constraints_plone52.txt --r https://dist.plone.org/release/5.2-latest/requirements.txt diff --git a/src/collective/lineage/browser.py b/src/collective/lineage/browser.py index 36f2e03..bcd00e6 100644 --- a/src/collective/lineage/browser.py +++ b/src/collective/lineage/browser.py @@ -2,6 +2,7 @@ from collective.lineage.interfaces import IChildSite from collective.lineage.utils import disable_childsite from collective.lineage.utils import enable_childsite +from plone.base.defaultpage import is_default_page from plone.folder.interfaces import IFolder from Products.CMFCore.utils import getToolByName from Products.Five.browser import BrowserView @@ -9,17 +10,6 @@ from zope.component import getMultiAdapter from zope.i18nmessageid import MessageFactory -try: - from plone.base.defaultpage import is_default_page -except ImportError: - try: - # BBB - from Products.CMFPlone.utils import defaultpage as is_default_page - except ImportError: - # BBB BBB - from Products.CMFPlone.utils import isDefaultPage as is_default_page - - _ = MessageFactory("collective.lineage") diff --git a/src/collective/lineage/interfaces.py b/src/collective/lineage/interfaces.py index a2fd2a2..e99be5b 100644 --- a/src/collective/lineage/interfaces.py +++ b/src/collective/lineage/interfaces.py @@ -1,13 +1,8 @@ +from plone.base.interfaces import INavigationRoot from zope.component.interfaces import IPossibleSite from zope.i18nmessageid import MessageFactory from zope.interface import Interface -try: - from plone.base.interfaces import INavigationRoot -except ImportError: - from plone.app.layout.navigation.interfaces import INavigationRoot - - _ = MessageFactory("collective.lineage") diff --git a/src/collective/lineage/testing.py b/src/collective/lineage/testing.py index 1176ab7..ab21d68 100644 --- a/src/collective/lineage/testing.py +++ b/src/collective/lineage/testing.py @@ -2,35 +2,16 @@ Common Lineage test fixtures and cases. """ -try: - # BBB - import unittest2 as unittest -except ImportError: - import unittest - -try: - from plone.testing import zope -except ImportError: - # BBB Plone 5.1 - from plone.testing import z2 as zope -try: - from plone.testing.zope import WSGI_SERVER_FIXTURE as SERVER_FIXTURE -except ImportError: - # BBB Plone 5.1 - from plone.testing.z2 import ZSERVER_FIXTURE as SERVER_FIXTURE - from plone.app import testing as pa_testing from plone.app.testing import applyProfile from plone.app.testing import FunctionalTesting from plone.app.testing import IntegrationTesting from plone.app.testing import PLONE_FIXTURE from plone.app.testing import PloneSandboxLayer +from plone.testing import zope +from plone.testing.zope import WSGI_SERVER_FIXTURE -try: - from Products.CMFPlone.utils import get_installer -except ImportError: - # BBB for Plone 5.0 and lower. - get_installer = None +import unittest class LineageLayer(PloneSandboxLayer): @@ -38,22 +19,14 @@ class LineageLayer(PloneSandboxLayer): def setUpZope(self, app, configurationContext): import collective.lineage + import plone.app.contenttypes - try: - import plone.app.contenttypes - - self["has_pact"] = True - except ImportError: - self["has_pact"] = False self.loadZCML(package=collective.lineage) - if self["has_pact"]: - self.loadZCML(package=plone.app.contenttypes) - if self["has_pact"]: - zope.installProduct(app, "plone.app.contenttypes") + self.loadZCML(package=plone.app.contenttypes) + zope.installProduct(app, "plone.app.contenttypes") def setUpPloneSite(self, portal): - if self["has_pact"]: - applyProfile(portal, "plone.app.contenttypes:default") + applyProfile(portal, "plone.app.contenttypes:default") applyProfile(portal, "collective.lineage:default") @@ -71,7 +44,8 @@ def setUpPloneSite(self, portal): LINEAGE_SERVER_TESTING = FunctionalTesting( - bases=(LINEAGE_FIXTURE, SERVER_FIXTURE), name="collective.lineage:ServerTesting" + bases=(LINEAGE_FIXTURE, WSGI_SERVER_FIXTURE), + name="collective.lineage:ServerTesting", ) diff --git a/src/collective/lineage/tests/test_adapter.py b/src/collective/lineage/tests/test_adapter.py index 4f2516e..0604215 100644 --- a/src/collective/lineage/tests/test_adapter.py +++ b/src/collective/lineage/tests/test_adapter.py @@ -1,6 +1,5 @@ from .. import testing from plone.dexterity.interfaces import IDexterityFTI -from zope.component import getGlobalSiteManager from zope.component import queryUtility from zope.component.hooks import setSite @@ -12,30 +11,6 @@ class AdapterTestCase(testing.LineageTestCase): Test adapter lookup in a child site. """ - def test_adapter_registered_correctly(self): - """this test is ATCT only""" - if self.layer["has_pact"]: - return - from plone.app.imaging.interfaces import IImagingSchema - - sm = getGlobalSiteManager() - registrations = [ - a for a in sm.registeredAdapters() if a.provided == IImagingSchema - ] - self.assertEqual(len(registrations), 1) - - def test_childsite_is_image_traverser(self): - """this test is ATCT only""" - if self.layer["has_pact"]: - return - from collective.lineage.utils import enable_childsite - from plone.app.imaging.configlet import ImagingControlPanelAdapter - from plone.app.imaging.interfaces import IImagingSchema - - enable_childsite(self.portal.site1) - configuration = IImagingSchema(self.portal.site1) - self.assertIsInstance(configuration, ImagingControlPanelAdapter) - def test_childsite_query_utility(self): from collective.lineage.utils import enable_childsite diff --git a/src/collective/lineage/tests/test_browser.py b/src/collective/lineage/tests/test_browser.py index 5bd6511..98be833 100644 --- a/src/collective/lineage/tests/test_browser.py +++ b/src/collective/lineage/tests/test_browser.py @@ -2,16 +2,11 @@ Test Lineage in the test browser. """ -import transaction - -try: - from plone.testing import zope -except ImportError: - # BBB Plone 5.1 - from plone.testing import z2 as zope - from .. import testing from plone.app import testing as pa_testing +from plone.testing import zope + +import transaction class TestLineageInBrowser(testing.LineageTestCase): diff --git a/src/collective/lineage/tests/test_setup.py b/src/collective/lineage/tests/test_setup.py index 806c496..9ba7c38 100644 --- a/src/collective/lineage/tests/test_setup.py +++ b/src/collective/lineage/tests/test_setup.py @@ -2,19 +2,9 @@ from plone.app.testing import setRoles from plone.app.testing import TEST_USER_ID from plone.browserlayer.utils import registered_layers +from Products.CMFPlone.utils import get_installer -try: - # BBB - import unittest2 as unittest -except ImportError: - import unittest - -try: - from Products.CMFPlone.utils import get_installer -except ImportError: - # BBB for Plone 5.0 and lower. - get_installer = None - +import unittest PROJECTNAME = "collective.lineage" diff --git a/test_plone52.cfg b/test_plone52.cfg deleted file mode 100644 index fbde218..0000000 --- a/test_plone52.cfg +++ /dev/null @@ -1,10 +0,0 @@ -[buildout] - -extends = - https://raw.github.com/collective/buildout.plonetest/master/test-5.2.x.cfg - https://raw.githubusercontent.com/collective/buildout.plonetest/master/qa.cfg - base.cfg - -update-versions-file = test_plone52.cfg - -[versions] diff --git a/tox.ini b/tox.ini index 75c5b21..fa9a9b6 100644 --- a/tox.ini +++ b/tox.ini @@ -12,14 +12,6 @@ envlist = py312-plone62 py311-plone62 py310-plone62 - py313-plone61 - py312-plone61 - py311-plone61 - py310-plone61 - py313-plone60 - py312-plone60 - py311-plone60 - py310-plone60 dependencies @@ -121,8 +113,6 @@ set_env = deps = {[test_runner]deps} plone62: -c https://dist.plone.org/release/6.2-dev/constraints.txt - plone61: -c https://dist.plone.org/release/6.1-dev/constraints.txt - plone60: -c https://dist.plone.org/release/6.0-dev/constraints.txt ## # Specify additional deps in .meta.toml: From ff30beefaa262ff490765563f565eca65d6b98c4 Mon Sep 17 00:00:00 2001 From: szakitibi Date: Wed, 22 Apr 2026 14:42:05 +0200 Subject: [PATCH 03/16] PEP 420 native namespace --- news/3928.breaking | 2 ++ setup.py | 5 ----- src/collective/__init__.py | 1 - 3 files changed, 2 insertions(+), 6 deletions(-) create mode 100644 news/3928.breaking delete mode 100644 src/collective/__init__.py diff --git a/news/3928.breaking b/news/3928.breaking new file mode 100644 index 0000000..5487c64 --- /dev/null +++ b/news/3928.breaking @@ -0,0 +1,2 @@ +Replace ``pkg_resources`` namespace with PEP 420 native namespace. +Support only Plone 6.2 and Python 3.10+. \ No newline at end of file diff --git a/setup.py b/setup.py index 6b270d4..828f990 100644 --- a/setup.py +++ b/setup.py @@ -1,5 +1,4 @@ from pathlib import Path -from setuptools import find_packages from setuptools import setup version = "3.0.1.dev0" @@ -37,14 +36,10 @@ author_email="info@sixfeetup.com", url="https://pypi.org/project/collective-lineage", license="GPL", - packages=find_packages("src"), - package_dir={"": "src"}, - namespace_packages=["collective"], include_package_data=True, zip_safe=False, python_requires=">=3.10", install_requires=[ - "setuptools", "Products.CMFCore", "Products.CMFPlone", "five.localsitemanager", diff --git a/src/collective/__init__.py b/src/collective/__init__.py deleted file mode 100644 index 5284146..0000000 --- a/src/collective/__init__.py +++ /dev/null @@ -1 +0,0 @@ -__import__("pkg_resources").declare_namespace(__name__) From 219aca071067f77a4248e93f8be37ee88b6483ab Mon Sep 17 00:00:00 2001 From: szakitibi Date: Wed, 22 Apr 2026 14:45:53 +0200 Subject: [PATCH 04/16] cleanup redundant entries Products.CMFPlone https://github.com/plone/Products.CMFPlone/blob/6.1.4/setup.py --- setup.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/setup.py b/setup.py index 828f990..62cba80 100644 --- a/setup.py +++ b/setup.py @@ -43,9 +43,6 @@ "Products.CMFCore", "Products.CMFPlone", "five.localsitemanager", - "plone.browserlayer", - "plone.dexterity", - "plone.folder", ], extras_require={ "test": [ From d15ee7ba140123a982c8c45e01f7375cef9f97c0 Mon Sep 17 00:00:00 2001 From: szakitibi Date: Wed, 22 Apr 2026 15:13:22 +0200 Subject: [PATCH 05/16] fix get_installer import --- src/collective/lineage/tests/test_setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/collective/lineage/tests/test_setup.py b/src/collective/lineage/tests/test_setup.py index 9ba7c38..7dee54d 100644 --- a/src/collective/lineage/tests/test_setup.py +++ b/src/collective/lineage/tests/test_setup.py @@ -1,8 +1,8 @@ from collective.lineage.testing import LINEAGE_INTEGRATION_TESTING from plone.app.testing import setRoles from plone.app.testing import TEST_USER_ID +from plone.base.utils import get_installer from plone.browserlayer.utils import registered_layers -from Products.CMFPlone.utils import get_installer import unittest From eace536d91f7bb895a6e60fb6df0c3154b9a195f Mon Sep 17 00:00:00 2001 From: szakitibi Date: Thu, 23 Apr 2026 09:08:25 +0200 Subject: [PATCH 06/16] update meta workflow skip dependencies check with confusing results --- .github/workflows/meta.yml | 6 ++++-- .meta.toml | 3 ++- pyproject.toml | 2 +- tox.ini | 11 ----------- 4 files changed, 7 insertions(+), 15 deletions(-) diff --git a/.github/workflows/meta.yml b/.github/workflows/meta.yml index 87a319b..dfd282d 100644 --- a/.github/workflows/meta.yml +++ b/.github/workflows/meta.yml @@ -20,10 +20,12 @@ on: jobs: qa: uses: plone/meta/.github/workflows/qa.yml@2.x - test: - uses: plone/meta/.github/workflows/test.yml@2.x + coverage: + uses: plone/meta/.github/workflows/coverage.yml@2.x release_ready: uses: plone/meta/.github/workflows/release_ready.yml@2.x + circular: + uses: plone/meta/.github/workflows/circular.yml@2.x ## # To modify the list of default jobs being created add in .meta.toml: diff --git a/.meta.toml b/.meta.toml index 36564ee..62e566e 100644 --- a/.meta.toml +++ b/.meta.toml @@ -8,8 +8,9 @@ commit-id = "2.8.0" [github] jobs = [ "qa", - "test", + "coverage", "release_ready", + "circular" ] [tox] diff --git a/pyproject.toml b/pyproject.toml index 1db75d0..3002f6a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -2,7 +2,7 @@ # https://github.com/plone/meta/tree/2.x/src/plone/meta/default # See the inline comments on how to expand/tweak this configuration file [build-system] -requires = ["setuptools>=68.2,<82", "wheel"] +requires = ["setuptools>=68.2,<83", "wheel"] diff --git a/tox.ini b/tox.ini index fa9a9b6..c004078 100644 --- a/tox.ini +++ b/tox.ini @@ -231,17 +231,6 @@ commands = # Report if there are any circular dependencies, i.e. error if there are any pipforester -i forest.json --check-cycles -o /dev/null -[testenv:plone52] -min_version = 3.28.0 -description = Plone 5.2 tests with buildout -skip_install = true -deps = - -rrequirements_plone52.txt -commands_pre = - {envbindir}/buildout -nc {toxinidir}/test_plone52.cfg buildout:directory={envdir} buildout:develop={toxinidir} -commands = - {envbindir}/code-analysis - {envbindir}/test {posargs} ## # Add extra configuration options in .meta.toml: From 9c3eae1652d4f6d757fdc50c4c187bb9f055e444 Mon Sep 17 00:00:00 2001 From: szakitibi Date: Fri, 24 Apr 2026 15:08:06 +0200 Subject: [PATCH 07/16] bump test coverage to 90% --- src/collective/lineage/tests/test_browser.py | 36 ++++++++++++++++++++ src/collective/lineage/tests/test_utils.py | 14 ++++++++ 2 files changed, 50 insertions(+) diff --git a/src/collective/lineage/tests/test_browser.py b/src/collective/lineage/tests/test_browser.py index 98be833..f51c0c7 100644 --- a/src/collective/lineage/tests/test_browser.py +++ b/src/collective/lineage/tests/test_browser.py @@ -3,6 +3,7 @@ """ from .. import testing +from collective.lineage import utils from plone.app import testing as pa_testing from plone.testing import zope @@ -74,3 +75,38 @@ def test_browser_add_content(self): self.childsite.objectIds(), "Document not present in child site after submitting add form", ) + + def test_browser_disable_subsite(self): + """ + Child site can be disabled. + """ + utils.enable_childsite(self.childsite) + transaction.commit() + browser = self.setUpBrowser() + browser.open(self.childsite.absolute_url()) + browser.getLink("Disable Subsite").click() + self.assertIsNotNone(browser.getLink("Enable Subsite")) + + +class TestLinageUtilsView(testing.LineageTestCase): + + def setUp(self): + super().setUp() + utils.enable_childsite(self.childsite) + + def test_on_siteroot(self): + view = self.portal.restrictedTraverse("lineageutils") + self.assertFalse(view.isChildSite()) + self.assertIsNone(view.current_childsite) + + def test_on_childsite(self): + view = self.childsite.restrictedTraverse("lineageutils") + self.assertTrue(view.isChildSite()) + self.assertEqual(view.current_childsite, self.childsite) + + def test_on_childsite_content(self): + doc_id = self.childsite.invokeFactory("Document", "d1", title="Test") + document = self.childsite[doc_id] + view = document.restrictedTraverse("lineageutils") + self.assertTrue(view.isChildSite()) + self.assertEqual(view.current_childsite, self.childsite) diff --git a/src/collective/lineage/tests/test_utils.py b/src/collective/lineage/tests/test_utils.py index 3b8f0c0..507da3d 100644 --- a/src/collective/lineage/tests/test_utils.py +++ b/src/collective/lineage/tests/test_utils.py @@ -3,6 +3,9 @@ from plone.browserlayer import utils as layer_utils from zope import component from zope import interface +from zope.site.hooks import site as site_hook + +import unittest PROJECTNAME = "collective.lineage" @@ -53,3 +56,14 @@ def test_childsite_browserlayer(self): IChildSiteLayer.providedBy(self.portal.REQUEST), "Child site browser layer not applied to the request", ) + + def test_parent_site_on_siteroot(self): + site = utils.parent_site() + self.assertEqual(site, self.portal) + + @unittest.skip("Currently fails, due to `_find_site` always going for aq_parent.") + def test_parent_site_on_childsite(self): + utils.enable_childsite(self.childsite) + with site_hook(self.childsite): + site = utils.parent_site() + self.assertEqual(site, self.childsite) From f7731c192d8ad472bcb0cce62002027a0121eb2e Mon Sep 17 00:00:00 2001 From: szakitibi Date: Mon, 27 Apr 2026 09:10:04 +0200 Subject: [PATCH 08/16] fix dependencies --- .github/workflows/meta.yml | 2 ++ .meta.toml | 1 + dependencies.svg | 0 setup.py | 13 +++++++++++++ 4 files changed, 16 insertions(+) create mode 100644 dependencies.svg diff --git a/.github/workflows/meta.yml b/.github/workflows/meta.yml index dfd282d..df9c753 100644 --- a/.github/workflows/meta.yml +++ b/.github/workflows/meta.yml @@ -22,6 +22,8 @@ jobs: uses: plone/meta/.github/workflows/qa.yml@2.x coverage: uses: plone/meta/.github/workflows/coverage.yml@2.x + dependencies: + uses: plone/meta/.github/workflows/dependencies.yml@2.x release_ready: uses: plone/meta/.github/workflows/release_ready.yml@2.x circular: diff --git a/.meta.toml b/.meta.toml index 62e566e..10157ea 100644 --- a/.meta.toml +++ b/.meta.toml @@ -9,6 +9,7 @@ commit-id = "2.8.0" jobs = [ "qa", "coverage", + "dependencies", "release_ready", "circular" ] diff --git a/dependencies.svg b/dependencies.svg new file mode 100644 index 0000000..e69de29 diff --git a/setup.py b/setup.py index 62cba80..2a44755 100644 --- a/setup.py +++ b/setup.py @@ -40,14 +40,27 @@ zip_safe=False, python_requires=">=3.10", install_requires=[ + "Acquisition", "Products.CMFCore", "Products.CMFPlone", + "Products.Five", "five.localsitemanager", + "plone.browserlayer", + "plone.folder", + "zope.component", + "zope.event", + "zope.i18nmessageid", + "zope.interface", + "zope.site", + "zope.traversing", ], extras_require={ "test": [ "plone.app.testing", + "plone.app.contenttypes", + "plone.dexterity", "plone.testing>=5.0.0", + "transaction", ], }, entry_points=""" From 3f92ffe6b00c2881117dafdf9f9a6ab1932c07cf Mon Sep 17 00:00:00 2001 From: szakitibi Date: Mon, 27 Apr 2026 10:10:27 +0200 Subject: [PATCH 09/16] fix imports --- src/collective/lineage/configure.zcml | 4 ++-- src/collective/lineage/utils.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/collective/lineage/configure.zcml b/src/collective/lineage/configure.zcml index 8d00a7b..b7ad732 100644 --- a/src/collective/lineage/configure.zcml +++ b/src/collective/lineage/configure.zcml @@ -12,12 +12,12 @@ mark_layer subscriber will be run before the child site site manager is set up otherwise --> diff --git a/src/collective/lineage/utils.py b/src/collective/lineage/utils.py index cea16cf..3b61619 100644 --- a/src/collective/lineage/utils.py +++ b/src/collective/lineage/utils.py @@ -5,7 +5,7 @@ from collective.lineage.events import ChildSiteWillBeRemovedEvent from collective.lineage.interfaces import IChildSite from five.localsitemanager import make_objectmanager_site -from Products.CMFPlone.interfaces import IPloneSiteRoot +from plone.base.interfaces import IPloneSiteRoot from Products.Five.component import disableSite from zope.component.hooks import getSite from zope.component.interfaces import ISite From 176b6698e2d2d1cfdc422e1b382e2e3e74ffa96e Mon Sep 17 00:00:00 2001 From: szakitibi Date: Mon, 27 Apr 2026 12:05:46 +0200 Subject: [PATCH 10/16] cleanup Products.Five --- setup.py | 1 - 1 file changed, 1 deletion(-) diff --git a/setup.py b/setup.py index 2a44755..4cceb05 100644 --- a/setup.py +++ b/setup.py @@ -43,7 +43,6 @@ "Acquisition", "Products.CMFCore", "Products.CMFPlone", - "Products.Five", "five.localsitemanager", "plone.browserlayer", "plone.folder", From 4487d0fb16847ff91af89c85b067132fc562d6d9 Mon Sep 17 00:00:00 2001 From: szakitibi Date: Tue, 28 Apr 2026 15:33:06 +0200 Subject: [PATCH 11/16] fix dependency checker --- .meta.toml | 5 ++++- setup.py | 10 +--------- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/.meta.toml b/.meta.toml index 10157ea..3bc2f29 100644 --- a/.meta.toml +++ b/.meta.toml @@ -18,4 +18,7 @@ jobs = [ test_matrix = {"6.2" = ["*"]} [pyproject] -dependencies_ignores = "['plone.base', 'plone.app.layout']" +dependencies_ignores = "['plone.base', 'plone.app.layout', 'Products.CMFPlone']" + +[tool.dependencychecker] +ignore-packages = ['plone.base', 'plone.app.layout', 'Products.CMFPlone'] diff --git a/setup.py b/setup.py index 4cceb05..ab1e4d1 100644 --- a/setup.py +++ b/setup.py @@ -40,18 +40,11 @@ zip_safe=False, python_requires=">=3.10", install_requires=[ - "Acquisition", + "Zope", "Products.CMFCore", - "Products.CMFPlone", "five.localsitemanager", "plone.browserlayer", "plone.folder", - "zope.component", - "zope.event", - "zope.i18nmessageid", - "zope.interface", - "zope.site", - "zope.traversing", ], extras_require={ "test": [ @@ -59,7 +52,6 @@ "plone.app.contenttypes", "plone.dexterity", "plone.testing>=5.0.0", - "transaction", ], }, entry_points=""" From 89b81ee55a0a2950c2838487ec4527e5819d9473 Mon Sep 17 00:00:00 2001 From: szakitibi Date: Tue, 28 Apr 2026 15:34:39 +0200 Subject: [PATCH 12/16] cleanup .meta.toml --- .meta.toml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/.meta.toml b/.meta.toml index 3bc2f29..10157ea 100644 --- a/.meta.toml +++ b/.meta.toml @@ -18,7 +18,4 @@ jobs = [ test_matrix = {"6.2" = ["*"]} [pyproject] -dependencies_ignores = "['plone.base', 'plone.app.layout', 'Products.CMFPlone']" - -[tool.dependencychecker] -ignore-packages = ['plone.base', 'plone.app.layout', 'Products.CMFPlone'] +dependencies_ignores = "['plone.base', 'plone.app.layout']" From a14330fc997a9ea0697af82689df1663b3dee6f6 Mon Sep 17 00:00:00 2001 From: szakitibi Date: Tue, 28 Apr 2026 15:44:45 +0200 Subject: [PATCH 13/16] remove dependenc.svg --- dependencies.svg | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 dependencies.svg diff --git a/dependencies.svg b/dependencies.svg deleted file mode 100644 index e69de29..0000000 From c586c25fcb3451c288399010eae13f43a497ae6a Mon Sep 17 00:00:00 2001 From: szakitibi Date: Tue, 28 Apr 2026 16:00:28 +0200 Subject: [PATCH 14/16] remove requirements.txt and constraints.txt --- constraints.txt | 1 - requirements.txt | 2 -- 2 files changed, 3 deletions(-) delete mode 100644 constraints.txt delete mode 100644 requirements.txt diff --git a/constraints.txt b/constraints.txt deleted file mode 100644 index d293e06..0000000 --- a/constraints.txt +++ /dev/null @@ -1 +0,0 @@ --c https://dist.plone.org/release/6.2-latest/constraints.txt diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 1855f2d..0000000 --- a/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ --c constraints.txt --e .[test] \ No newline at end of file From 8e459f87f96a55cb4ff4f89238bf185e879a802b Mon Sep 17 00:00:00 2001 From: szakitibi Date: Tue, 28 Apr 2026 16:02:30 +0200 Subject: [PATCH 15/16] cleanup MANIFEST.in --- MANIFEST.in | 3 --- 1 file changed, 3 deletions(-) diff --git a/MANIFEST.in b/MANIFEST.in index 500c6c9..532c268 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -4,7 +4,4 @@ include *.rst global-exclude *.pyc exclude .coveragerc exclude tox.ini - -include requirements.txt -include constraints.txt prune news \ No newline at end of file From 91429f6fd3081f3cd625a563f984058c01ee3007 Mon Sep 17 00:00:00 2001 From: szakitibi Date: Mon, 25 May 2026 13:58:06 +0200 Subject: [PATCH 16/16] add note about maybe needed horse-with-no-namespace of buildout 5 --- README.rst | 1 + news/3928.breaking | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/README.rst b/README.rst index 4b4f9c4..3a2f6f1 100644 --- a/README.rst +++ b/README.rst @@ -13,6 +13,7 @@ Lineage can be used within a large organization to manage multiple microsites, s Version information =================== +- 4.x: Plone 6.2 - Python 3.10+ - PEP 420 native namespace - 3.x: Plone 5.2, 6.0 - Python 3.8+ - 2.x: Plone 5.0, 5.1, 5.2 - Python 2.7 - 1.x: Plone 4.3 diff --git a/news/3928.breaking b/news/3928.breaking index 5487c64..f2360fa 100644 --- a/news/3928.breaking +++ b/news/3928.breaking @@ -1,2 +1,4 @@ Replace ``pkg_resources`` namespace with PEP 420 native namespace. -Support only Plone 6.2 and Python 3.10+. \ No newline at end of file +Support only Plone 6.2 and Python 3.10+. +When you use ``collective.lineage`` with other packages in the ``collective`` namespace, and you get a ``ModuleNotFoundError``, you may need to install ``horse-with-no-namespace``, or use ``zc.buildout`` 5. +[szakitibi] \ No newline at end of file