From 0bc037fdb3a032e462b3ec1a30e59691f7585283 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89rico=20Andrei?= Date: Tue, 27 Jan 2026 10:22:31 -0300 Subject: [PATCH 1/8] Modernize codebase according to the latest cookieplone templates. --- .editorconfig | 25 +- .github/workflows/changelog.yml | 28 ++ .github/workflows/config.yml | 70 ++++ .github/workflows/main.yml | 61 +++ .github/workflows/meta.yml | 65 ---- .gitignore | 40 +- .meta.toml | 20 - .pre-commit-config.yaml | 94 ----- CHANGES.md => CHANGELOG.md | 0 LICENSE.md | 2 +- MANIFEST.in | 19 - Makefile | 136 ++++--- README.md | 53 ++- bobtemplate.cfg | 7 + constraints.txt | 1 - docs/.gitignore | 7 + docs/.readthedocs.yaml | 25 ++ docs/.vale.ini | 12 + docs/LICENSE.md | 3 + docs/Makefile | 138 +++++++ docs/README.md | 124 ++++++ docs/docs/_static/favicon.ico | Bin 0 -> 15406 bytes docs/docs/_static/logo.svg | 54 +++ docs/docs/_templates/404.html | 20 + docs/docs/concepts/index.md | 20 + docs/docs/conf.py | 367 ++++++++++++++++++ docs/docs/glossary.md | 57 +++ docs/docs/how-to-guides/index.md | 30 ++ docs/docs/index.md | 60 +++ docs/docs/reference/index.md | 23 ++ docs/docs/robots.txt | 8 + docs/docs/tutorials/index.md | 19 + docs/pyproject.toml | 61 +++ .../config/vocabularies/Base/accept.txt} | 0 .../config/vocabularies/Base/reject.txt | 0 .../config/vocabularies/Plone/accept.txt | 51 +++ .../config/vocabularies/Plone/reject.txt | 3 + instance.yaml | 9 +- kitconcept-seo.png | Bin 143508 -> 0 bytes kitconcept.png | Bin 3059 -> 0 bytes mx.ini | 3 +- news/.changelog_template.jinja | 15 + pyproject.toml | 268 +++++++------ requirements.txt | 3 +- scripts/create_site.py | 66 ++++ setup.py | 77 ---- src/kitconcept/__init__.py | 4 - src/kitconcept/seo/__init__.py | 3 + src/kitconcept/seo/behaviors/seo.py | 44 +-- src/kitconcept/seo/locales/__main__.py | 69 ++++ src/kitconcept/seo/locales/update.sh | 12 - src/kitconcept/seo/testing.py | 2 +- tests/{ => behaviors}/test_behavior.py | 6 +- tests/conftest.py | 10 +- tox.ini | 211 ---------- 55 files changed, 1719 insertions(+), 786 deletions(-) create mode 100644 .github/workflows/changelog.yml create mode 100644 .github/workflows/config.yml create mode 100644 .github/workflows/main.yml delete mode 100644 .github/workflows/meta.yml delete mode 100644 .meta.toml delete mode 100644 .pre-commit-config.yaml rename CHANGES.md => CHANGELOG.md (100%) delete mode 100644 MANIFEST.in create mode 100644 bobtemplate.cfg delete mode 100644 constraints.txt create mode 100644 docs/.gitignore create mode 100644 docs/.readthedocs.yaml create mode 100644 docs/.vale.ini create mode 100644 docs/LICENSE.md create mode 100644 docs/Makefile create mode 100644 docs/README.md create mode 100644 docs/docs/_static/favicon.ico create mode 100644 docs/docs/_static/logo.svg create mode 100644 docs/docs/_templates/404.html create mode 100644 docs/docs/concepts/index.md create mode 100644 docs/docs/conf.py create mode 100644 docs/docs/glossary.md create mode 100644 docs/docs/how-to-guides/index.md create mode 100644 docs/docs/index.md create mode 100644 docs/docs/reference/index.md create mode 100644 docs/docs/robots.txt create mode 100644 docs/docs/tutorials/index.md create mode 100644 docs/pyproject.toml rename docs/{.gitkeep => styles/config/vocabularies/Base/accept.txt} (100%) create mode 100644 docs/styles/config/vocabularies/Base/reject.txt create mode 100644 docs/styles/config/vocabularies/Plone/accept.txt create mode 100644 docs/styles/config/vocabularies/Plone/reject.txt delete mode 100644 kitconcept-seo.png delete mode 100644 kitconcept.png create mode 100644 news/.changelog_template.jinja create mode 100644 scripts/create_site.py delete mode 100644 setup.py delete mode 100644 src/kitconcept/__init__.py create mode 100644 src/kitconcept/seo/locales/__main__.py delete mode 100755 src/kitconcept/seo/locales/update.sh rename tests/{ => behaviors}/test_behavior.py (87%) delete mode 100644 tox.ini diff --git a/.editorconfig b/.editorconfig index 8ae05aa..b3561a7 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,9 +1,6 @@ -# Generated from: -# https://github.com/plone/meta/tree/master/config/default -# See the inline comments on how to expand/tweak this configuration file -# + # EditorConfig Configuration file, for more details see: -# http://EditorConfig.org +# https://EditorConfig.org # EditorConfig is a convention description, that could be interpreted # by multiple editors to enforce common coding conventions for specific # file types @@ -22,33 +19,17 @@ trim_trailing_whitespace = true charset = utf-8 # Indent style default indent_style = space -# Max Line Length - a hard line wrap, should be disabled -max_line_length = off [*.{py,cfg,ini}] # 4 space indentation indent_size = 4 -[*.{yml,zpt,pt,dtml,zcml}] -# 2 space indentation -indent_size = 2 - -[*.{json,jsonl,js,jsx,ts,tsx,css,less,scss,html}] # Frontend development +[*.{html,dtml,pt,zpt,xml,zcml,js,json,ts,less,scss,css,sass,yml,yaml}] # 2 space indentation indent_size = 2 -max_line_length = 80 [{Makefile,.gitmodules}] # Tab indentation (no size specified, but view as 4 spaces) indent_style = tab indent_size = unset tab_width = unset - - -## -# Add extra configuration options in .meta.toml: -# [editorconfig] -# extra_lines = """ -# _your own configuration lines_ -# """ -## diff --git a/.github/workflows/changelog.yml b/.github/workflows/changelog.yml new file mode 100644 index 0000000..5ed0e35 --- /dev/null +++ b/.github/workflows/changelog.yml @@ -0,0 +1,28 @@ +name: Change log check +on: + pull_request: + types: [assigned, opened, synchronize, reopened, labeled, unlabeled] + branches: + - main + +env: + python-version: 3.13 + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v5 + with: + # Fetch all history + fetch-depth: '0' + + - name: Setup uv + uses: plone/meta/.github/actions/setup_uv@2.x + with: + python-version: ${{ env.python-version }} + - name: Check for presence of a Change Log fragment (only pull requests) + if: github.event_name == 'pull_request' + run: | + git fetch --no-tags origin ${{ github.base_ref }} + uvx towncrier check --compare-with origin/${{ github.base_ref }} --config pyproject.toml --dir . diff --git a/.github/workflows/config.yml b/.github/workflows/config.yml new file mode 100644 index 0000000..60f22ed --- /dev/null +++ b/.github/workflows/config.yml @@ -0,0 +1,70 @@ +name: 'Compute Config variables' + +on: + workflow_call: + inputs: + python-version: + required: false + type: string + default: "3.12" + plone-version: + required: false + type: string + default: "6.1.4" + outputs: + backend: + description: "Flag reporting if we should run the backend jobs" + value: ${{ jobs.config.outputs.backend }} + docs: + description: "Flag reporting if we should run the docs jobs" + value: ${{ jobs.config.outputs.docs }} + base-tag: + description: "Base tag to be used when creating container images" + value: ${{ jobs.config.outputs.base-tag }} + python-version: + description: "Python version to be used" + value: ${{ inputs.python-version }} + plone-version: + description: "Plone version to be used" + value: ${{ inputs.plone-version }} + +jobs: + config: + runs-on: ubuntu-latest + outputs: + backend: ${{ steps.filter.outputs.backend }} + docs: ${{ steps.filter.outputs.docs }} + base-tag: ${{ steps.vars.outputs.BASE_TAG }} + plone-version: ${{ steps.vars.outputs.plone-version }} + + steps: + - name: Checkout + uses: actions/checkout@v5 + + - name: Compute several vars needed for the CI + id: vars + run: | + echo "base-tag=sha-$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT + echo "plone-version=${{ inputs.plone-version }}" >> $GITHUB_OUTPUT + + - uses: dorny/paths-filter@v3.0.2 + id: filter + with: + filters: | + backend: + - '**' + - '.github/workflows/config.yml' + - '.github/workflows/main.yml' + docs: + - '.readthedocs.yaml' + - 'docs/**' + - '.github/workflows/docs.yaml' + + - name: Test vars + run: | + echo "base-tag: ${{ steps.vars.outputs.base-tag }}" + echo 'plone-version: ${{ steps.vars.outputs.plone-version }}' + echo 'event-name: ${{ github.event_name }}' + echo "ref-name: ${{ github.ref_name }}" + echo 'Paths - backend: ${{ steps.filter.outputs.backend }}' + echo 'Paths - docs: ${{ steps.filter.outputs.docs }}' diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 0000000..63402f8 --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,61 @@ +name: kitconcept.seo CI + +on: + push: + +jobs: + + config: + name: "Compute configuration values" + uses: ./.github/workflows/config.yml + lint: + name: "Lint codebase" + uses: plone/meta/.github/workflows/backend-lint.yml@2.x + needs: + - config + with: + python-version: ${{ needs.config.outputs.python-version }} + plone-version: ${{ needs.config.outputs.plone-version }} + test: + name: "Test codebase" + uses: plone/meta/.github/workflows/backend-pytest.yml@2.x + needs: + - config + strategy: + matrix: + python-version: ["3.13", "3.12", "3.11", "3.10"] + plone-version: ["6.1-latest", "6.0-latest"] + with: + python-version: ${{ matrix.python-version }} + plone-version: ${{ matrix.plone-version }} + + coverage: + name: "Backend: Coverage" + uses: plone/meta/.github/workflows/backend-pytest-coverage.yml@2.x + needs: + - config + - test + with: + python-version: ${{ needs.config.outputs.python-version }} + plone-version: ${{ needs.config.outputs.plone-version }} + + report: + name: "Final report" + if: ${{ always() }} + runs-on: ubuntu-latest + needs: + - config + - lint + - test + - coverage + steps: + - name: Report + shell: bash + run: | + echo '# Workflow Report' >> $GITHUB_STEP_SUMMARY + echo '| Job ID | Conclusion |' >> $GITHUB_STEP_SUMMARY + echo '| --- | --- |' >> $GITHUB_STEP_SUMMARY + echo '| Config | ${{ needs.config.result }} |' >> $GITHUB_STEP_SUMMARY + echo '| Lint | ${{ needs.coverage.result }} |' >> $GITHUB_STEP_SUMMARY + echo '| Test | ${{ needs.coverage.result }} |' >> $GITHUB_STEP_SUMMARY + echo '| Coverage | ${{ needs.coverage.result }} |' >> $GITHUB_STEP_SUMMARY diff --git a/.github/workflows/meta.yml b/.github/workflows/meta.yml deleted file mode 100644 index 6f55e66..0000000 --- a/.github/workflows/meta.yml +++ /dev/null @@ -1,65 +0,0 @@ -# Generated from: -# https://github.com/plone/meta/tree/master/config/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: - -## -# To set environment variables for all jobs, add in .meta.toml: -# [github] -# env = """ -# debug: 1 -# image-name: 'org/image' -# image-tag: 'latest' -# """ -## - -jobs: - qa: - uses: plone/meta/.github/workflows/qa.yml@main - test: - uses: plone/meta/.github/workflows/test.yml@main - coverage: - uses: plone/meta/.github/workflows/coverage.yml@main - dependencies: - uses: plone/meta/.github/workflows/dependencies.yml@main - release_ready: - uses: plone/meta/.github/workflows/release_ready.yml@main - -## -# To modify the list of default jobs being created add in .meta.toml: -# [github] -# jobs = [ -# "qa", -# "test", -# "coverage", -# "dependencies", -# "release_ready", -# "circular", -# ] -## - -## -# To request that some OS level dependencies get installed -# when running tests/coverage jobs, add in .meta.toml: -# [github] -# os_dependencies = "git libxml2 libxslt" -## - -## -# Specify additional jobs in .meta.toml: -# [github] -# extra_lines = """ -# another: -# uses: org/repo/.github/workflows/file.yml@main -# """ -## diff --git a/.gitignore b/.gitignore index 3457b7c..3bb87bf 100644 --- a/.gitignore +++ b/.gitignore @@ -1,55 +1,45 @@ -# Generated from: -# https://github.com/plone/meta/tree/master/config/default -# See the inline comments on how to expand/tweak this configuration file # python related *.egg-info *.pyc *.pyo # tools related -build/ +__pycache__/ .coverage +.mypy_cache +.pytest_cache +.ruff_cache +/build/ coverage.xml dist/ docs/_build -__pycache__/ -.tox -.vscode/ node_modules/ # venv / buildout related +.eggs/ +.installed.cfg +.mr.developer.cfg +.venv/ bin/ develop-eggs/ eggs/ -.eggs/ etc/ -.installed.cfg include/ lib/ lib64 -.mr.developer.cfg parts/ pyvenv.cfg var/ # mxdev -/instance/ +.installed.txt +.lock +/.mxdev_cache/ /.make-sentinels/ /*-mxdev.txt +/instance/ /reports/ /sources/ /venv/ -.installed.txt -*.mo - -# pipforester -forest.dot -forest.json - -## -# Add extra configuration options in .meta.toml: -# [gitignore] -# extra_lines = """ -# _your own configuration lines_ -# """ -## +constraints*.txt +requirements*.txt \ No newline at end of file diff --git a/.meta.toml b/.meta.toml deleted file mode 100644 index 770e34e..0000000 --- a/.meta.toml +++ /dev/null @@ -1,20 +0,0 @@ -# Generated from: -# https://github.com/plone/meta/tree/master/config/default -# See the inline comments on how to expand/tweak this configuration file -[meta] -template = "default" -commit-id = "25d2fa7f" - -[pyproject] -codespell_skip = "*.min.js" -codespell_ignores = "vew" -dependencies_ignores = "['zestreleaser.towncrier', 'zest.releaser', 'pytest', 'pytest-cov', 'pytest-plone']" -dependencies_mappings = [ - "'plone.app.testing' = ['plone.testing']", - "'Products.CMFPlone' = ['Products.CMFCore', 'Products.GenericSetup']", - ] - -[tox] -use_mxdev = true -test_runner = "pytest" -test_path = "/tests" diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml deleted file mode 100644 index b6eb043..0000000 --- a/.pre-commit-config.yaml +++ /dev/null @@ -1,94 +0,0 @@ -# Generated from: -# https://github.com/plone/meta/tree/master/config/default -# See the inline comments on how to expand/tweak this configuration file -ci: - autofix_prs: false - autoupdate_schedule: monthly - -repos: -- repo: https://github.com/asottile/pyupgrade - rev: v3.14.0 - hooks: - - id: pyupgrade - args: [--py38-plus] -- repo: https://github.com/pycqa/isort - rev: 5.12.0 - hooks: - - id: isort -- repo: https://github.com/psf/black - rev: 23.9.1 - hooks: - - id: black -- repo: https://github.com/collective/zpretty - rev: 3.1.0 - hooks: - - id: zpretty - -## -# Add extra configuration options in .meta.toml: -# [pre_commit] -# zpretty_extra_lines = """ -# _your own configuration lines_ -# """ -## -- repo: https://github.com/PyCQA/flake8 - rev: 6.1.0 - hooks: - - id: flake8 - -## -# Add extra configuration options in .meta.toml: -# [pre_commit] -# flake8_extra_lines = """ -# _your own configuration lines_ -# """ -## -- repo: https://github.com/codespell-project/codespell - rev: v2.2.6 - hooks: - - id: codespell - additional_dependencies: - - tomli - -## -# Add extra configuration options in .meta.toml: -# [pre_commit] -# codespell_extra_lines = """ -# _your own configuration lines_ -# """ -## -- repo: https://github.com/mgedmin/check-manifest - rev: "0.49" - hooks: - - id: check-manifest -- repo: https://github.com/regebro/pyroma - rev: "4.2" - hooks: - - id: pyroma -- repo: https://github.com/mgedmin/check-python-versions - rev: "0.21.3" - hooks: - - id: check-python-versions - args: ['--only', 'setup.py,pyproject.toml'] -- repo: https://github.com/collective/i18ndude - rev: "6.1.0" - hooks: - - id: i18ndude - - -## -# Add extra configuration options in .meta.toml: -# [pre_commit] -# i18ndude_extra_lines = """ -# _your own configuration lines_ -# """ -## - - -## -# Add extra configuration options in .meta.toml: -# [pre_commit] -# extra_lines = """ -# _your own configuration lines_ -# """ -## diff --git a/CHANGES.md b/CHANGELOG.md similarity index 100% rename from CHANGES.md rename to CHANGELOG.md diff --git a/LICENSE.md b/LICENSE.md index 7bf6429..f3545da 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,4 +1,4 @@ -kitconcept.seo Copyright 2023, Plone Community +kitconcept.seo Copyright 2026, kitconcept GmbH This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2 diff --git a/MANIFEST.in b/MANIFEST.in deleted file mode 100644 index 0595b97..0000000 --- a/MANIFEST.in +++ /dev/null @@ -1,19 +0,0 @@ -graft src/kitconcept -graft docs -graft news -graft tests -include .coveragerc -include .dockerignore -include .editorconfig -include *.txt -include *.yml -include *.md -exclude *-mxdev.txt -exclude Dockerfile -exclude mx.ini -exclude Makefile -recursive-exclude frontend * -exclude instance.yaml -global-exclude *.pyc -global-exclude .DS_Store -exclude *.png diff --git a/Makefile b/Makefile index 1d7c8a3..4155ed7 100644 --- a/Makefile +++ b/Makefile @@ -15,27 +15,29 @@ GREEN=`tput setaf 2` RESET=`tput sgr0` YELLOW=`tput setaf 3` -PLONE6=6.0-latest - # Python checks -PYTHON?=python3 +UV?=uv # installed? -ifeq (, $(shell which $(PYTHON) )) - $(error "PYTHON=$(PYTHON) not found in $(PATH)") -endif - -# version ok? -PYTHON_VERSION_MIN=3.8 -PYTHON_VERSION_OK=$(shell $(PYTHON) -c "import sys; print((int(sys.version_info[0]), int(sys.version_info[1])) >= tuple(map(int, '$(PYTHON_VERSION_MIN)'.split('.'))))") -ifeq ($(PYTHON_VERSION_OK),0) - $(error "Need python $(PYTHON_VERSION) >= $(PYTHON_VERSION_MIN)") +ifeq (, $(shell which $(UV) )) + $(error "UV=$(UV) not found in $(PATH)") endif BACKEND_FOLDER=$(shell dirname $(realpath $(firstword $(MAKEFILE_LIST)))) -GIT_FOLDER=$(BACKEND_FOLDER)/.git +ifdef PLONE_VERSION +PLONE_VERSION := $(PLONE_VERSION) +else +PLONE_VERSION := 6.1.4 +endif + +VENV_FOLDER=$(BACKEND_FOLDER)/.venv +export VIRTUAL_ENV=$(VENV_FOLDER) +BIN_FOLDER=$(VENV_FOLDER)/bin +# Environment variables to be exported +export PYTHONWARNINGS := ignore +export DOCKER_BUILDKIT := 1 all: build @@ -45,68 +47,98 @@ all: build help: ## This help message @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' -bin/pip bin/tox bin/mxdev: - @echo "$(GREEN)==> Setup Virtual Env$(RESET)" - $(PYTHON) -m venv . - bin/pip install -U "pip" "wheel" "cookiecutter" "mxdev" "tox" "pre-commit" - if [ -d $(GIT_FOLDER) ]; then bin/pre-commit install; else echo "$(RED) Not installing pre-commit$(RESET)";fi +requirements-mxdev.txt: pyproject.toml mx.ini ## Generate constraints file + @echo "$(GREEN)==> Generate constraints file$(RESET)" + @echo '-c https://dist.plone.org/release/$(PLONE_VERSION)/constraints.txt' > requirements.txt + @uvx mxdev -c mx.ini + +$(VENV_FOLDER): requirements-mxdev.txt ## Install dependencies + @echo "$(GREEN)==> Install environment$(RESET)" +ifdef CI + @uv venv $(VENV_FOLDER) +else + @uv venv --python=3.10 $(VENV_FOLDER) +endif + @uv pip install -r requirements-mxdev.txt -.PHONY: config -config: bin/pip ## Create instance configuration +.PHONY: sync +sync: $(VENV_FOLDER) ## Sync project dependencies + @echo "$(GREEN)==> Sync project dependencies$(RESET)" + @uv pip install -r requirements-mxdev.txt + +instance/etc/zope.ini instance/etc/zope.conf: instance.yaml ## Create instance configuration @echo "$(GREEN)==> Create instance configuration$(RESET)" - bin/cookiecutter -f --no-input --config-file instance.yaml gh:plone/cookiecutter-zope-instance + @uvx cookiecutter -f --no-input -c 2.1.1 --config-file instance.yaml gh:plone/cookiecutter-zope-instance -.PHONY: build-dev -build-dev: config ## pip install Plone packages - @echo "$(GREEN)==> Setup Build$(RESET)" - bin/mxdev -c mx.ini - bin/pip install -r requirements-mxdev.txt +.PHONY: config +config: instance/etc/zope.ini .PHONY: install -install: build-dev ## Install Plone 6.0 - - -.PHONY: build -build: build-dev ## Install Plone 6.0 +install: $(VENV_FOLDER) config ## Install Plone and dependencies .PHONY: clean -clean: ## Remove old virtualenv and creates a new one +clean: ## Clean installation and instance (data left intact) @echo "$(RED)==> Cleaning environment and build$(RESET)" - rm -rf bin lib lib64 include share etc var inituser pyvenv.cfg .installed.cfg instance .tox .pytest_cache + @rm -rf $(VENV_FOLDER) pyvenv.cfg .installed.cfg instance/etc .venv .pytest_cache .ruff_cache constraints* requirements* + +.PHONY: remove-data +remove-data: ## Remove all content + @echo "$(RED)==> Removing all content$(RESET)" + rm -rf $(VENV_FOLDER) instance/var .PHONY: start -start: ## Start a Plone instance on localhost:8080 - PYTHONWARNINGS=ignore ./bin/runwsgi instance/etc/zope.ini +start: $(VENV_FOLDER) instance/etc/zope.ini ## Start a Plone instance on localhost:8080 + @$(BIN_FOLDER)/runwsgi instance/etc/zope.ini .PHONY: console -console: ## Start a zope console - PYTHONWARNINGS=ignore ./bin/zconsole debug instance/etc/zope.conf +console: $(VENV_FOLDER) instance/etc/zope.ini ## Start a console into a Plone instance + @$(BIN_FOLDER)/zconsole debug instance/etc/zope.conf + +.PHONY: create-site +create-site: $(VENV_FOLDER) instance/etc/zope.ini ## Create a new site from scratch + @$(BIN_FOLDER)/zconsole run instance/etc/zope.conf ./scripts/create_site.py + +# QA +.PHONY: lint +lint: ## Check and fix code base according to Plone standards + @echo "$(GREEN)==> Lint codebase$(RESET)" + @uvx ruff@latest check --fix --config $(BACKEND_FOLDER)/pyproject.toml + @uvx pyroma@latest -d . + @uvx check-python-versions@latest . + @uvx zpretty@latest --check src .PHONY: format -format: bin/tox ## Format the codebase according to our standards +format: ## Check and fix code base according to Plone standards @echo "$(GREEN)==> Format codebase$(RESET)" - bin/tox -e format + @uvx ruff@latest check --select I --fix --config $(BACKEND_FOLDER)/pyproject.toml + @uvx ruff@latest format --config $(BACKEND_FOLDER)/pyproject.toml + @uvx zpretty@latest -i src -.PHONY: lint -lint: ## check code style - bin/tox -e lint +.PHONY: check +check: format lint ## Check and fix code base according to Plone standards # i18n -bin/i18ndude: bin/pip - @echo "$(GREEN)==> Install translation tools$(RESET)" - bin/pip install i18ndude - .PHONY: i18n -i18n: bin/i18ndude ## Update locales +i18n: $(VENV_FOLDER) ## Update locales @echo "$(GREEN)==> Updating locales$(RESET)" - bin/update_dist_locale + @$(BIN_FOLDER)/python -m kitconcept.seo.locales # Tests .PHONY: test -test: bin/tox ## run tests - bin/tox -e test +test: $(VENV_FOLDER) ## run tests + @$(BIN_FOLDER)/pytest .PHONY: test-coverage -test-coverage: bin/tox ## run tests with coverage - bin/tox -e coverage +test-coverage: $(VENV_FOLDER) ## run tests with coverage + @$(BIN_FOLDER)/pytest --cov=kitconcept.seo --cov-report term-missing + +## Add bobtemplates features (check bobtemplates.plone's documentation to get the list of available features) +add: $(VENV_FOLDER) + @uvx plonecli add $(filter-out $@,$(MAKECMDGOALS)) + +.PHONY: release +release: $(VENV_FOLDER) ## Create a release + @echo "$(GREEN)==> Create a release$(RESET)" + @uv pip install -e ".[release]" + @uv run fullrelease diff --git a/README.md b/README.md index 0b82678..3911edd 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,17 @@ # kitconcept.seo -[![Pypi](https://img.shields.io/pypi/status/kitconcept.seo.svg)](https://pypi.python.org/pypi/kitconcept.seo/) -[![Pypi version](https://img.shields.io/pypi/v/kitconcept.seo.svg)](https://pypi.python.org/pypi/kitconcept.seo/) -[![License](https://img.shields.io/pypi/l/kitconcept.seo.svg)](https://pypi.python.org/pypi/kitconcept.seo/) +SEO addon for Plone + +[![PyPI](https://img.shields.io/pypi/v/kitconcept.seo)](https://pypi.org/project/kitconcept.seo/) +[![PyPI - Python Version](https://img.shields.io/pypi/pyversions/kitconcept.seo)](https://pypi.org/project/kitconcept.seo/) +[![PyPI - Wheel](https://img.shields.io/pypi/wheel/kitconcept.seo)](https://pypi.org/project/kitconcept.seo/) +[![PyPI - License](https://img.shields.io/pypi/l/kitconcept.seo)](https://pypi.org/project/kitconcept.seo/) +[![PyPI - Status](https://img.shields.io/pypi/status/kitconcept.seo)](https://pypi.org/project/kitconcept.seo/) + + +[![PyPI - Plone Versions](https://img.shields.io/pypi/frameworkversions/plone/kitconcept.seo)](https://pypi.org/project/kitconcept.seo/) + +[![CI](https://github.com/kitconcept/kitconcept.seo/actions/workflows/main.yml/badge.svg)](https://github.com/kitconcept/kitconcept.seo/actions/workflows/main.yml) [![kitconcept, GmbH](https://raw.githubusercontent.com/kitconcept/kitconcept.seo/master/kitconcept.png)](https://kitconcept.com/) @@ -11,7 +20,6 @@ It might still work with Plone Classic but that is not officially supported. If you are looking for a full featured SEO solution for Plone Classic or older versions of Plone, we suggest looking into [fourdigits.seo](https://pypi.org/project/fourdigits.seo/). - ## Features - Allows to override meta title and meta description per page @@ -34,9 +42,7 @@ This add-on can be seen in action at the following sites: This product has been translated into - German - - Italian - - Spanish ## Installation @@ -46,12 +52,12 @@ Install kitconcept.seo with `pip`: ```shell pip install kitconcept.seo ``` + And to create the Plone site: ```shell -make create_site +make create-site ``` - # Enable the SEO behavior To enable the SEO tab for a specific content type you have to enable the `kitconcept.seo` behavior. @@ -120,9 +126,36 @@ In your Volto page you need to go to the edit mode of the page you want to add a ## Contribute -- [Issue Tracker](https://github.com/collective/kitconcept.seo/issues) -- [Source Code](https://github.com/collective/kitconcept.seo/) +- [Issue tracker](https://github.com/kitconcept/kitconcept.seo/issues) +- [Source code](https://github.com/kitconcept/kitconcept.seo/) + +### Prerequisites โœ… + +- An [operating system](https://6.docs.plone.org/install/create-project-cookieplone.html#prerequisites-for-installation) that runs all the requirements mentioned. +- [uv](https://6.docs.plone.org/install/create-project-cookieplone.html#uv) +- [Make](https://6.docs.plone.org/install/create-project-cookieplone.html#make) +- [Git](https://6.docs.plone.org/install/create-project-cookieplone.html#git) +- [Docker](https://docs.docker.com/get-started/get-docker/) (optional) + +### Installation ๐Ÿ”ง + +1. Clone this repository, then change your working directory. + + ```shell + git clone git@github.com:kitconcept/kitconcept.seo.git + cd kitconcept.seo + ``` + +2. Install this code base. + + ```shell + make install + ``` ## License The project is licensed under GPLv2. + +## Credits and acknowledgements ๐Ÿ™ + +Generated using [Cookieplone (0.9.10)](https://github.com/plone/cookieplone) and [cookieplone-templates (dd13073)](https://github.com/plone/cookieplone-templates/commit/dd13073d34447056d6992461d8da29447d62c029) on 2026-01-27 09:51:10.480177. A special thanks to all contributors and supporters! diff --git a/bobtemplate.cfg b/bobtemplate.cfg new file mode 100644 index 0000000..c7454f0 --- /dev/null +++ b/bobtemplate.cfg @@ -0,0 +1,7 @@ +[main] +version = 6.1.14 +template = plone_addon +git_init = True +python = python3 +package.dottedname = kitconcept.seo +package.browserlayer = BrowserLayer diff --git a/constraints.txt b/constraints.txt deleted file mode 100644 index 228b6cc..0000000 --- a/constraints.txt +++ /dev/null @@ -1 +0,0 @@ --c https://dist.plone.org/release/6.0-latest/constraints.txt diff --git a/docs/.gitignore b/docs/.gitignore new file mode 100644 index 0000000..8c348ac --- /dev/null +++ b/docs/.gitignore @@ -0,0 +1,7 @@ +# Python related +*.egg-info +.venv + +# Documentation builds +_build +styles/Microsoft diff --git a/docs/.readthedocs.yaml b/docs/.readthedocs.yaml new file mode 100644 index 0000000..c629b39 --- /dev/null +++ b/docs/.readthedocs.yaml @@ -0,0 +1,25 @@ +# .readthedocs.yaml +# Read the Docs configuration file +# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details + +# Required +version: 2 + +# Set the OS, Python version and other tools you might need +build: + os: ubuntu-22.04 + tools: + python: "3.13" + commands: + # Cancel building pull requests when there aren't changes in the docs directory or YAML file. + # You can add any other files or directories that you'd like here as well, + # like your docs requirements file, or other files that will change your docs build. + # + # If there are no changes (git diff exits with 0) we force the command to return with 183. + # This is a special exit code on Read the Docs that will cancel the build immediately. + - | + if [ "$READTHEDOCS_VERSION_TYPE" = "external" ] && git diff --quiet origin/main -- docs/docs/ docs/styles/ .readthedocs.yaml docs/.vale.ini docs/Makefile docs/uv.lock .github/workflows/docs.yml; + then + exit 183; + fi + - cd docs && make rtd-pr-preview diff --git a/docs/.vale.ini b/docs/.vale.ini new file mode 100644 index 0000000..f89759a --- /dev/null +++ b/docs/.vale.ini @@ -0,0 +1,12 @@ +StylesPath = styles + +MinAlertLevel = suggestion + +Vocab = Base,Plone + +Packages = Microsoft + +[*] +BasedOnStyles = Vale, Microsoft +Microsoft.Contractions = suggestion +Microsoft.Units = suggestion diff --git a/docs/LICENSE.md b/docs/LICENSE.md new file mode 100644 index 0000000..8b45b5a --- /dev/null +++ b/docs/LICENSE.md @@ -0,0 +1,3 @@ +kitconcept.seo Copyright 2026, kitconcept GmbH + +The text and illustrations in this website are licensed by the Plone Foundation under a [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0/) license. Plone and the Ploneยฎ logo are registered trademarks of the Plone Foundation, registered in the United States and other countries. For guidelines on the permitted uses of the Plone trademarks, see [https://plone.org/foundation/logo](https://plone.org/foundation/logo). All other trademarks are owned by their respective owners. diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 0000000..0a9dc4f --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,138 @@ +# Makefile for Sphinx documentation +.DEFAULT_GOAL = help +SHELL = bash + +# You can set these variables from the command line. +SPHINXOPTS ?= +PAPER ?= + +# Internal variables. +GREEN=`tput setaf 2` +RESET=`tput sgr0` +SPHINXBUILD = "$(realpath .venv/bin/sphinx-build)" +DOCS_DIR = ./docs/ +BUILDDIR = ./_build +PAPEROPT_a4 = -D latex_paper_size=a4 +PAPEROPT_letter = -D latex_paper_size=letter +ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) $(DOCS_DIR) +VALEFILES := $(shell find $(DOCS_DIR) -type f -name "*.md" -print) +VALEOPTS ?= +PYTHONVERSION = >=3.11,<3.14 + +# Add the following 'help' target to your Makefile +# And add help text after each target name starting with '\#\#' +.PHONY: help +help: # This help message + @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' + + +# environment management +.venv/bin/python: ## Create Python virtual environment and install package requirements + @uv sync + +.PHONY: install +install: .venv/bin/python ## Sync package requirements + + +.PHONY: init +init: clean clean-python .venv/bin/python ## Clean docs build directory and Python, and initialize Python virtual environment + +.PHONY: clean +clean: ## Clean docs build directory + cd $(DOCS_DIR) && rm -rf $(BUILDDIR)/ + +.PHONY: clean-python +clean-python: clean + rm -rf .venv/ + rm -rf *.egg-info +# /environment management + + +# documentation builders +.PHONY: html +html: .venv/bin/python ## Build html + @uv run sphinx-build -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." + +.PHONY: livehtml +livehtml: .venv/bin/python ## Rebuild Sphinx documentation on changes, with live-reload in the browser + @uv run sphinx-autobuild \ + --ignore "*.swp" \ + --port 8050 \ + -b html $(DOCS_DIR) "$(BUILDDIR)/html" $(SPHINXOPTS) $(O) + +.PHONY: dirhtml +dirhtml: .venv/bin/python + @uv run sphinx-build -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." + +.PHONY: singlehtml +singlehtml: .venv/bin/python + @uv run sphinx-build -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml + @echo + @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." + +.PHONY: text +text: .venv/bin/python + @uv run sphinx-build -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text + @echo + @echo "Build finished. The text files are in $(BUILDDIR)/text." + +.PHONY: changes +changes: .venv/bin/python + @uv run sphinx-build -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes + @echo + @echo "The overview file is in $(BUILDDIR)/changes." + +.PHONY: rtd-prepare +rtd-prepare: ## Prepare environment on Read the Docs + asdf plugin add uv + asdf install uv latest + asdf global uv latest + +.PHONY: rtd-pr-preview ## Build pull request previews on Read the Docs +rtd-pr-preview: rtd-prepare .venv/bin/python ## Build pull request preview on Read the Docs + $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) ${READTHEDOCS_OUTPUT}/html/ + +.PHONY: build +build: html ## Build documentation in HTML format + +# /documentation builders + + +# test +.PHONY: linkcheck +linkcheck: .venv/bin/python ## Run linkcheck + @uv run sphinx-build -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck + @echo + @echo "Link check complete; look for any errors in the above output " \ + "or in $(BUILDDIR)/linkcheck/ ." + +.PHONY: linkcheckbroken +linkcheckbroken: .venv/bin/python ## Run linkcheck and show only broken links + @uv run sphinx-build -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck | GREP_COLORS='0;31' grep -wi "broken\|redirect" --color=always | GREP_COLORS='0;31' grep -vi "https://github.com/plone/volto/issues/" --color=always && if test $$? = 0; then exit 1; fi || test $$? = 1 + @echo + @echo "Link check complete; look for any errors in the above output " \ + "or in $(BUILDDIR)/linkcheck/ ." + +.PHONY: doctest +doctest: .venv/bin/python ## Test snippets in the documentation + @uv run sphinx-build -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest + @echo "Testing of doctests in the sources finished, look at the " \ + "results in $(BUILDDIR)/doctest/output.txt." + +.PHONY: vale +vale: .venv/bin/python ## Run Vale style, grammar, and spell checks + @uv run vale sync + @uv run vale --no-wrap $(VALEOPTS) $(VALEFILES) + @echo "Vale is finished; look for any errors in the above output." + @echo + +.PHONY: test +test: clean vale linkcheckbroken doctest ## Clean docs build, then run vale, linkcheckbroken, and doctest + +.PHONY: all +all: clean vale linkcheckbroken html ## Clean docs build, then run linkcheckbroken, and build html +# /test diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..f89503e --- /dev/null +++ b/docs/README.md @@ -0,0 +1,124 @@ +# kitconcept.seo + +Documentation for kitconcept.seo. +SEO addon for Plone + +This project provides a Sphinx-based documentation environment for your Plone project, powered by the [Plone Sphinx Theme](https://github.com/plone/plone-sphinx-theme). +It's generated using the `documentation_starter` template from [Cookieplone](https://github.com/plone/cookieplone). + + +## Prerequisites + +- [uv](https://docs.astral.sh/uv/) is the recommended tool for managing Python versions and project dependencies. + +To install uv, use the following command, or visit the [uv installation page](https://docs.astral.sh/uv/getting-started/installation/) for alternative methods. + +```shell +curl -LsSf https://astral.sh/uv/install.sh | sh +``` + + +## Build documentation + +To build the HTML documentation, issue the following command. + +```shell +make html +``` + +To build the HTML documentation and view a live preview while editing your documentation, issue the following command. + +```shell +make livehtml +``` + +To check for broken links in your documentation, issue the following command. + +```shell +make linkcheckbroken +``` + +To check spelling, grammar, and style in your documentation, issue the following command. +You should pay attention to errors and warnings, and suggestions may get noisy. + +```shell +make vale +``` + +To delete the `docs` build directory and Python virtual environment, and reinitialize Python virtual environment, issue the following command. +This is useful to force reinstall dependencies and purge cached files in Sphinx builds. + +```shell +make init +``` + +For more `make` commands, issue the following command. + +```shell +make help +``` + + +## Customize the kitconcept.seo documentation + +This section provides how-to guidance to customize your documentation. + +The file `docs/conf.py` controls the configuration of your documentation. +It has extensive comments for each part, often with links to the authoritative documentation for extensions and configuration. + +The following sections describe customization not addressed in `docs/conf.py`. + + +### Manage dependencies + +You can configure which dependencies or requirements you want to use in your documentation using uv. +Requirements are stored in the `dev` dependency group in the `pyproject.toml` file. + +To add a requirement, use the following command. + +```shell +uv add --dev my-requirement +``` + +To remove a requirement, use the following command. + +```shell +uv remove --dev my-requirement +``` + +See also uv's documentation [Development dependencies](https://docs.astral.sh/uv/concepts/projects/dependencies/#development-dependencies). + +After installing a dependency, you might need to add it to your documentation's configuration file, `conf.py`, under the `extensions` key. + + +### Replace static files + +You might want to replace the default static files, located in `docs/_static`, `logo.svg` and `favicon.ico`. +Plone Sphinx Theme is configured to use these files when rendering documentation to HTML. + +If you rename `logo.svg`, you must update `conf.py`, under the `html_logo`, `ogp_image`, and `latex_logo` keys. + + +## Read the Docs + +Now that you've built your documentation, how do you publish it? +And how do you get collaborators to easily review your changes to your documentation? + +Thankfully, [Read the Docs](https://about.readthedocs.com/) provides both hosting of documentation and pull request previews. +For public repositories, this service is free. +However, the Plone Foundation donates to Read the Docs for their unwavering support to open source software, and encourages you to do the same. + +Your documentation scaffold is partially configured to use Read the Docs. +In several files, search for the string `MY_READTHEDOCS_PROJECT_SLUG`. +You'll need to replace that string with the slug that Read the Docs creates for you when you import your project. + +For complete documentation of this process, see the Plone 6 Documentation [Pull request preview builds](https://6.docs.plone.org/contributing/documentation/admins.html#pull-request-preview-builds). + +See also Read the Docs documentation: + +- [Pull request previews](https://docs.readthedocs.com/platform/stable/pull-requests.html) +- [Build process overview](https://docs.readthedocs.com/platform/stable/builds.html) + +## Credits and acknowledgements ๐Ÿ™ + +This was generated by the [cookieplone-templates documentation_starter template](https://github.com/plone/cookieplone-templates/tree/main/documentation_starter) on 2026-01-27 12:52:31. A special thanks to all contributors and supporters! diff --git a/docs/docs/_static/favicon.ico b/docs/docs/_static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..49048460f7f1a9e8e49e55fb6599acf1c7b9e0d6 GIT binary patch literal 15406 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/docs/_templates/404.html b/docs/docs/_templates/404.html new file mode 100644 index 0000000..782c30d --- /dev/null +++ b/docs/docs/_templates/404.html @@ -0,0 +1,20 @@ +{% extends "!page.html" %} + +{%- block htmltitle %} +{{ title|striptags|e }}{%- for parent in parents %} โ€“ {{ parent.title }}{%- endfor %}{{ titlesuffix }} +{%- endblock %} + +{% block body %} +
+

Page not found

+

We could not find the page you requested.

+

You can search.

+
+ + +{% endblock %} diff --git a/docs/docs/concepts/index.md b/docs/docs/concepts/index.md new file mode 100644 index 0000000..1797fba --- /dev/null +++ b/docs/docs/concepts/index.md @@ -0,0 +1,20 @@ +--- +myst: + html_meta: + "description": "kitconcept.seo concepts" + "property=og:description": "kitconcept.seo concepts" + "property=og:title": "kitconcept.seo concepts" + "keywords": "Plone, kitconcept.seo, concepts" +--- + +# Concepts + +This part of the documentation contains conceptual guides, including design defense and explanation of concepts for deeper study. +The Diรกtaxis framework also calls this class of documentation _explanation_. + +> Explanation is a discursive treatment of a subject, that permits reflection. +> Explanation is understanding-oriented. + +```{seealso} +https://diataxis.fr/explanation/ +``` diff --git a/docs/docs/conf.py b/docs/docs/conf.py new file mode 100644 index 0000000..4c3f0db --- /dev/null +++ b/docs/docs/conf.py @@ -0,0 +1,367 @@ +# Configuration file for the Sphinx documentation builder. +# kitconcept.seo build configuration file + + +# -- Path setup -------------------------------------------------------------- + +from datetime import datetime +from packaging.version import Version +from plone_sphinx_theme import __version__ + + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# +# import os +# import sys +# sys.path.insert(0, os.path.abspath("../src/plone_sphinx_theme")) + +# -- Project information ----------------------------------------------------- + +project = "kitconcept.seo" +author = "kitconcept GmbH" +trademark_name = "kitconcept" +now = datetime.now() +year = str(now.year) + + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The full version, including alpha/beta/rc tags. +release = __version__ +# The short X.Y version. +version = "v" + (Version(str(release)).base_version) + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +# language = None + +# There are two options for replacing |today|: either, you set today to some +# non-false value, then it is used: +# today = "" +# Else, today_fmt is used as the format for a strftime call. +# today_fmt = "%B %d, %Y" + + +# -- General configuration ---------------------------------------------------- + +# Add any paths that contain templates here, relative to this directory. +templates_path = ["_templates"] + +# Add any Sphinx extension module names here, as strings. +# They can be extensions coming with Sphinx (named "sphinx.ext.*") +# or your custom ones. +extensions = [ + "myst_parser", + "notfound.extension", + "sphinx.ext.autodoc", + "sphinx.ext.autosummary", # plone.api + "sphinx.ext.doctest", # plone.api + "sphinx.ext.graphviz", + "sphinx.ext.ifconfig", + "sphinx.ext.intersphinx", + "sphinx.ext.todo", + "sphinx.ext.viewcode", # plone.api + "sphinx_copybutton", + "sphinx_design", + "sphinx_examples", + "sphinx_reredirects", + "sphinx_sitemap", + "sphinx_tippy", + "sphinxcontrib.httpdomain", # plone.restapi + "sphinxcontrib.httpexample", # plone.restapi + "sphinxcontrib.mermaid", + "sphinxcontrib.video", + "sphinxcontrib.youtube", + "sphinxext.opengraph", +] + +# If true, the Docutils Smart Quotes transform, originally based on SmartyPants +# (limited to English) and currently applying to many languages, will be used +# to convert quotes and dashes to typographically correct entities. +smartquotes = False + +# Options for the linkcheck builder +# Ignore localhost +linkcheck_ignore = [ + # Ignore local and example URLs + r"http://0.0.0.0", + r"http://127.0.0.1", + r"http://localhost", + # Ignore file downloads + r"^/_static/", + # Ignore pages that require authentication + r"https://github.com/kitconcept/kitconceptseo/issues/new", # requires auth + # Ignore github.com pages with anchors + r"https://github.com/.*#.*", + # Ignore other specific anchors +] +linkcheck_allowed_redirects = { # TODO: Confirm usage of linkcheck_allowed_redirects + # All HTTP redirections from the source URI to the canonical URI will be treated + # as "working". +} +linkcheck_anchors = True +linkcheck_timeout = 5 +linkcheck_retries = 1 + +# The suffix of source filenames. +source_suffix = { + ".md": "markdown", + ".rst": "restructuredtext", +} + +# The master toctree document. +master_doc = "index" + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This pattern also affects html_static_path and html_extra_path. +exclude_patterns = [] + +suppress_warnings = [] + + +# -- Options for HTML output ------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +html_theme = "plone_sphinx_theme" # This can be configured +html_logo = "_static/logo.svg" +html_favicon = "_static/favicon.ico" +# The default value includes icon-links, so override it with that one omitted, +# and add it to html_theme_options[footer_content_items]. +html_sidebars = { + "**": [ + "navbar-logo", + "search-button-field", + "sbt-sidebar-nav", + ] +} +html_theme_options = { + "article_header_start": ["toggle-primary-sidebar"], + "footer_content_items": [ + "author", + "copyright", + "last-updated", + "extra-footer", + "icon-links", + ], + # Uncomment for a page-wide footer + # "footer_end": ["version.html"], + "icon_links": [ + { + "name": "GitHub", + "url": "https://github.com/kitconcept/kitconceptseo", + "icon": "fa-brands fa-square-github", + "type": "fontawesome", + "attributes": { + "target": "_blank", + "rel": "noopener me", + "class": "nav-link custom-fancy-css", + }, + }, + # { + # "name": "Mastodon", + # "url": "https://MY_MASTODON_SERVER/@MY_MASTODON_USER", + # "icon": "fa-brands fa-mastodon", + # "type": "fontawesome", + # "attributes": { + # "target": "_blank", + # "rel": "noopener me", + # "class": "nav-link custom-fancy-css", + # }, + # }, + ], + "logo": { + "text": "kitconcept.seo", + }, + "navigation_with_keys": True, + "path_to_docs": "docs/docs", + "repository_branch": "main", + "repository_url": "https://github.com/kitconcept/kitconceptseo", + "search_bar_text": "Search", + "show_toc_level": 2, + "use_edit_page_button": True, + "use_issues_button": True, + "use_repository_button": True, +} +# suggest edit link +# remark: is mandatory in "edit_page_url_template" +# html_context = { +# "edit_page_url_template": "https://github.com/kitconcept/kitconceptseo/edit/main/docs/", +# } + +# Announce that we have an opensearch plugin +# https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-html_use_opensearch +html_use_opensearch = "https://MY_READTHEDOCS_PROJECT_SLUG.readthedocs.io" + +# The name for this set of Sphinx documents. If None, it defaults to +# " v documentation". +html_title = f"{project} v{release}" + +# If false, no index is generated. +html_use_index = True + +# html_css_files = ["custom.css", ("print.css", {"media": "print"})] +# html_js_files = [] + +html_extra_path = [ + "robots.txt", +] + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = [ + "_static", +] + + +# -- Options for autodoc ---------------------------------------------------- + +# https://www.sphinx-doc.org/en/master/usage/extensions/autodoc.html#configuration +# Automatically extract typehints when specified and place them in +# descriptions of the relevant function/method. +# autodoc_typehints = "description" + +# Don't show class signature with the class' name. +autodoc_class_signature = "separated" + + +# -- Options for sphinx_sitemap to html ----------------------------- + +# Used by sphinx_sitemap to generate a sitemap +html_baseurl = "https://MY_READTHEDOCS_PROJECT_SLUG.readthedocs.io/" +# https://sphinx-sitemap.readthedocs.io/en/latest/advanced-configuration.html#customizing-the-url-scheme +sitemap_url_scheme = "{link}" +sitemap_filename = "sitemap-custom.xml" + +# -- Options for myST markdown conversion to html ----------------------------- + +# For more information see: +# https://myst-parser.readthedocs.io/en/latest/syntax/optional.html +myst_enable_extensions = [ + "attrs_block", # Support parsing of block attributes. + "attrs_inline", # Support parsing of inline attributes. + "colon_fence", # Use ::: delimiters to denote code fences, instead of ``` + "deflist", # Support definition lists. https://myst-parser.readthedocs.io/en/latest/syntax/optional.html#definition-lists + "html_image", # For inline images. See https://myst-parser.readthedocs.io/en/latest/syntax/optional.html#html-images + "linkify", # Identify "bare" web URLs and add hyperlinks. + "strikethrough", # See https://myst-parser.readthedocs.io/en/latest/syntax/optional.html#syntax-strikethrough + "substitution", # Use Jinja2 for substitutions. https://myst-parser.readthedocs.io/en/latest/syntax/optional.html#substitutions-with-jinja2 +] + +myst_substitutions = {} + +# -- Intersphinx configuration ---------------------------------- + +# This extension can generate automatic links to the documentation of objects +# in other projects. Usage is simple: whenever Sphinx encounters a +# cross-reference that has no matching target in the current documentation set, +# it looks for targets in the documentation sets configured in +# intersphinx_mapping. A reference like :py:class:`zipfile.ZipFile` can then +# linkto the Python documentation for the ZipFile class, without you having to +# specify where it is located exactly. +# +# https://www.sphinx-doc.org/en/master/usage/extensions/intersphinx.html +intersphinx_mapping = { + "python": ("https://docs.python.org/3/", None), + "plone": ("https://6.docs.plone.org/", None), +} + + +# -- GraphViz configuration ---------------------------------- +graphviz_output_format = "svg" + + +# -- Mermaid configuration ---------------------------------- +mermaid_version = "11.2.0" + + +# -- OpenGraph configuration ---------------------------------- +ogp_site_url = "https://MY_READTHEDOCS_PROJECT_SLUG.readthedocs.io/" +ogp_description_length = 200 +ogp_image = "https://MY_READTHEDOCS_PROJECT_SLUG/_static/MY_LOGO.svg" +ogp_site_name = "kitconcept.seo Documentation" +ogp_type = "website" +ogp_custom_meta_tags = [ + '', +] + + +# -- sphinx.ext.todo ----------------------- +# See http://sphinx-doc.org/ext/todo.html#confval-todo_include_todos +todo_include_todos = True + + +# -- sphinx-notfound-page configuration ---------------------------------- +notfound_urls_prefix = "" +notfound_template = "404.html" + + +# -- sphinx-reredirects configuration ---------------------------------- +# https://documatt.com/sphinx-reredirects/usage.html +redirects = {} + + +# -- sphinx-tippy configuration ---------------------------------- +tippy_anchor_parent_selector = "article.bd-article" +tippy_enable_doitips = False +tippy_enable_wikitips = False +tippy_props = { + "interactive": True, + "placement": "auto-end", +} + + +# -- Options for HTML help output ------------------------------------------------- + +# Output file base name for HTML help builder. +htmlhelp_basename = "kitconcept.seoDocumentation" + + +# -- Options for LaTeX output ------------------------------------------------- + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, author, documentclass [howto/manual]) +latex_documents = [ + ( + "index", + "kitconcept.seoDocumentation.tex", + "kitconcept.seo Documentation", + "kitconcept community", + "manual", + ), +] + +# The name of an image file (relative to this directory) to place at the top of +# the title page. +latex_logo = "_static/logo.svg" + + +# -- Configuration for source_replacements extension ----------------------- +# An extension that allows replacements for code blocks that +# are not supported in `rst_epilog` or other substitutions. +# https://stackoverflow.com/a/56328457/2214933 +def source_replace(app, docname, source): + result = source[0] + for key in app.config.source_replacements: + result = result.replace(key, app.config.source_replacements[key]) + source[0] = result + + +# Dict of replacements. +source_replacements = { + "{SUPPORTED_PYTHON_VERSIONS}": "3.10, 3.11, 3.12, or 3.13", +} + + +# Finally, configure app attributes. +def setup(app): + app.add_config_value("source_replacements", {}, True) + app.connect("source-read", source_replace) + # For sphinx.ext.ifconfig + app.add_config_value("context", "documentation", "env") diff --git a/docs/docs/glossary.md b/docs/docs/glossary.md new file mode 100644 index 0000000..ee89125 --- /dev/null +++ b/docs/docs/glossary.md @@ -0,0 +1,57 @@ +--- +myst: + html_meta: + "description": "Terms and definitions used throughout the Plone Sphinx Theme documentation." + "property=og:description": "Terms and definitions used throughout the Plone Sphinx Theme documentation." + "property=og:title": "Glossary" + "keywords": "Plone, documentation, glossary, term, definition" +--- + +This glossary provides example terms and definitions relevant to **kitconcept.seo**. +SEO addon for Plone + +```{note} +This is an example glossary demonstrating MyST Markdownโ€™s `{glossary}` directive. You can adapt it for your projectโ€™s appendix by editing or replacing these entries with your own terms and definitions. +``` + +(glossary-label)= + +# Glossary + +```{glossary} +:sorted: true + +Plone + [Plone](https://plone.org/) is an open-source content management system that is used to create, edit, and manage digital content, like websites, intranets and custom solutions. + It comes with over 20 years of growth, optimisations, and refinements. + The result is a system trusted by governments, universities, businesses, and other organisations all over the world. + +add-on + An add-on in Plone extends its functionality. + It is code that is released as a package to make it easier to install. + + In Volto, an add-on is a JavaScript package. + + In Plone core, an add-on is a Python package. + + - [Plone core add-ons](https://github.com/collective/awesome-plone#readme) + - [Volto add-ons](https://github.com/collective/awesome-volto#readme) + - [Add-ons tagged with the trove classifier `Framework :: Plone` on PyPI](https://pypi.org/search/?c=Framework+%3A%3A+Plone) + +Plone Sphinx Theme +plone-sphinx-theme + [Plone Sphinx Theme](https://plone-sphinx-theme.readthedocs.io/) is a Sphinx theme for [Plone 6 Documentation](https://6.docs.plone.org/), [Plone Conference Training](https://training.plone.org/), and documentation of various Plone packages. + This scaffold uses Plone Sphinx Theme. + +Markedly Structured Text +MyST + [Markedly Structured Text (MyST)](https://myst-parser.readthedocs.io/en/latest/) is a rich and extensible flavor of Markdown, for authoring Plone Documentation. + The sample documentation in this scaffold is written in MyST. + +Sphinx + [Sphinx](https://www.sphinx-doc.org/en/master/) is a tool that makes it easy to create intelligent and beautiful documentation. + It was originally created for Python documentation, and it has excellent facilities for the documentation of software projects in a range of languages. + It can generate multiple output formats, including HTML and PDF, from a single source. + This scaffold uses Sphinx to generate documentation in HTML format. + +``` diff --git a/docs/docs/how-to-guides/index.md b/docs/docs/how-to-guides/index.md new file mode 100644 index 0000000..fb99ac5 --- /dev/null +++ b/docs/docs/how-to-guides/index.md @@ -0,0 +1,30 @@ +--- +myst: + html_meta: + "description": "kitconcept.seo how-to guides" + "property=og:description": "kitconcept.seo how-to guides" + "property=og:title": "kitconcept.seo how-to guides" + "keywords": "Plone, kitconcept.seo, how-to, guides" +--- + +# How-to guides + +This part of the documentation contains how-to guides, including installation and usage. + +> How-to guides are directions that guide the reader through a problem or towards a result. +> How-to guides are goal-oriented. + +```{seealso} +https://diataxis.fr/how-to-guides/ +``` + + +## Authors + +- {doc}`plone:contributing/documentation/myst-reference` +- {doc}`plone:contributing/documentation/authors` + + +## Designers + +- [Contribute to Plone Sphinx Theme](https://plone-sphinx-theme.readthedocs.io/guides/contribute.html) diff --git a/docs/docs/index.md b/docs/docs/index.md new file mode 100644 index 0000000..e428b70 --- /dev/null +++ b/docs/docs/index.md @@ -0,0 +1,60 @@ +--- +myst: + html_meta: + "description": "SEO addon for Plone" + "property=og:description": "SEO addon for Plone" + "property=og:title": "kitconcept.seo" + "keywords": "kitconcept.seo, documentation, SEO addon for Plone" +--- + +# kitconcept.seo + +Welcome to the documentation for kitconcept.seo! +SEO addon for Plone + +This scaffold provides a ready-to-use environment for creating comprehensive documentation for {term}`Plone` projects, based on {term}`Plone Sphinx Theme`. + +Built with Markedly Structured Text ({term}`MyST`), this environment supports rich formatting, directives, and extensions tailored for technical documentation. + +It's structured following the [Diรกtaxis](https://diataxis.fr/) documentation framework. + +```{toctree} +:caption: How to guides +:maxdepth: 2 +:hidden: true + +how-to-guides/index +``` + +```{toctree} +:caption: Reference +:maxdepth: 2 +:hidden: true + +reference/index +``` + +```{toctree} +:caption: Tutorials +:maxdepth: 2 +:hidden: true + +tutorials/index +``` + +```{toctree} +:caption: Concepts +:maxdepth: 2 +:hidden: true + +concepts/index +``` + +```{toctree} +:caption: Appendices +:maxdepth: 2 +:hidden: true + +glossary +genindex +``` diff --git a/docs/docs/reference/index.md b/docs/docs/reference/index.md new file mode 100644 index 0000000..e710616 --- /dev/null +++ b/docs/docs/reference/index.md @@ -0,0 +1,23 @@ +--- +myst: + html_meta: + "description": "kitconcept.seo Reference" + "property=og:description": "kitconcept.seo Reference" + "property=og:title": "kitconcept.seo Reference" + "keywords": "Plone, _kitconcept.seo,_ reference" +--- + +# Reference + +This part of the documentation contains reference material, including APIs, configuration values, and environment variables. + +> Reference guides are technical descriptions of the machinery and how to operate it. +> Reference material is information-oriented. + +```{seealso} +https://diataxis.fr/reference/ +``` + +## Configuration + +- {doc}`plone:contributing/documentation/themes-and-extensions` diff --git a/docs/docs/robots.txt b/docs/docs/robots.txt new file mode 100644 index 0000000..b68dd24 --- /dev/null +++ b/docs/docs/robots.txt @@ -0,0 +1,8 @@ +# Disallow all user agents from the following directories and files +User-agent: * +Disallow: /_sources/ +Disallow: /.doctrees/ +Disallow: /*.txt$ +Disallow: /.buildinfo$ +Disallow: /objects.inv$ +Sitemap: https://MY_READTHEDOCS_PROJECT_SLUG.readthedocs.io/sitemap-custom.xml diff --git a/docs/docs/tutorials/index.md b/docs/docs/tutorials/index.md new file mode 100644 index 0000000..5725e8b --- /dev/null +++ b/docs/docs/tutorials/index.md @@ -0,0 +1,19 @@ +--- +myst: + html_meta: + "description": "kitconcept.seo Tutorials" + "property=og:description": "kitconcept.seo Tutorials" + "property=og:title": "kitconcept.seo Tutorials" + "keywords": "Plone, kitconcept.seo, tutorials" +--- + +# Tutorials + +This part of the documentation contains tutorials. + +> A tutorial is an experience that takes place under the guidance of a tutor. +> A tutorial is always learning-oriented. + +```{seealso} +https://diataxis.fr/tutorials/ +``` diff --git a/docs/pyproject.toml b/docs/pyproject.toml new file mode 100644 index 0000000..fd7dc75 --- /dev/null +++ b/docs/pyproject.toml @@ -0,0 +1,61 @@ +[project] +name = "kitconcept_seo_Documentation" +description = "SEO addon for Plone" +keywords = [ + "kitconcept.seo", + "documentation", + "Plone", + "Diรกtaxis", +] +version="1.0.0" +readme = "README.md" +requires-python = ">=3.10,<3.14" +license = { file = "LICENSE" } +maintainers = [ + { name = "kitconcept GmbH", email = "info@kitconcept.com" }, +] +authors = [ + { name = "kitconcept GmbH", email = "info@kitconcept.com" }, +] +classifiers = [ + "Development Status :: 1 - Planning", + "Operating System :: OS Independent", + "Programming Language :: Python", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", +] + +[dependency-groups] +dev = [ + "graphviz", + "linkify-it-py", + "myst-parser", + "plone-sphinx-theme>=1.4.1", # Use the latest stable version or a minimum + "setuptools", # required by sphinxcontrib.httpexample, remove when it migrates to importlib. See https://github.com/collective/sphinxcontrib-httpexample/issues/106 + "sphinx-autobuild", + "sphinx-copybutton", + "sphinx-design", + "sphinx-examples", + "sphinx-notfound-page", + "sphinx-reredirects", + "sphinx-sitemap", + "sphinx-tippy", + "sphinxcontrib-httpdomain", + "sphinxcontrib-httpexample", + "sphinxcontrib-mermaid", + "sphinxcontrib-video", + "sphinxcontrib-youtube", + "sphinxext-opengraph", + "vale", +] + +[project.urls] +Repository = "https://github.com/kitconcept/kitconceptseo" +Documentation = "https://MY_READTHEDOCS_PROJECT_SLUG.readthedocs.io/" + +[build-system] +requires = ["setuptools"] +build-backend = "setuptools.build_meta" diff --git a/docs/.gitkeep b/docs/styles/config/vocabularies/Base/accept.txt similarity index 100% rename from docs/.gitkeep rename to docs/styles/config/vocabularies/Base/accept.txt diff --git a/docs/styles/config/vocabularies/Base/reject.txt b/docs/styles/config/vocabularies/Base/reject.txt new file mode 100644 index 0000000..e69de29 diff --git a/docs/styles/config/vocabularies/Plone/accept.txt b/docs/styles/config/vocabularies/Plone/accept.txt new file mode 100644 index 0000000..cde1ced --- /dev/null +++ b/docs/styles/config/vocabularies/Plone/accept.txt @@ -0,0 +1,51 @@ +`plone.api` +`plone.restapi` +`plone.volto` +accessor +APIs +[Aa]sync +[Bb]ackend +backport(ed|ing) +Barceloneta +[Bb]oolean +bugfix +buildout +cacheable +CommonJS +doctest +folderish +fieldset +getter +JavaScript +[Jj]enkins +jQuery +libxslt +Mockup +npm +nvm +Pastanaga +PLIP(s) +Plone +pluggab(le|ility) +[Pp]ortlet +prerendered +programatically +[Qq]uerystring +Razzle +[Rr]enderer +RichText +Sass +Schuko +subfolder +[Tt]owncrier +transpile[dr]{0,1} +[Uu]ncomment +[Uu]nhide +unregister +UUID +uv +validator +[Vv]iewlet +Volto +Vue +Zope diff --git a/docs/styles/config/vocabularies/Plone/reject.txt b/docs/styles/config/vocabularies/Plone/reject.txt new file mode 100644 index 0000000..81510d5 --- /dev/null +++ b/docs/styles/config/vocabularies/Plone/reject.txt @@ -0,0 +1,3 @@ +[^.]js +NodeJS +[Pp]re-requisite diff --git a/instance.yaml b/instance.yaml index 1d5501b..73e0f3e 100644 --- a/instance.yaml +++ b/instance.yaml @@ -1,8 +1,5 @@ +# Configuration for https://github.com/plone/cookiecutter-zope-instance + default_context: - initial_user_name: 'admin' initial_user_password: 'admin' - - load_zcml: - package_includes: ['kitconcept.seo'] - - db_storage: direct + zcml_package_includes: 'kitconcept.seo' \ No newline at end of file diff --git a/kitconcept-seo.png b/kitconcept-seo.png deleted file mode 100644 index 0d58ec8f77c336ffa1fecc91b122d487eae91877..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 143508 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

k zZ|_~4_c`hU~v8G2bF6guPhVSvz@E`9B+w14%s4Q$Ru#!tb;Si~CgJ9p|;FCGj zh3{|!qsBE`)Rn-w2*)CW$n=TlWz>FD^+s{ZBl5?o=(lYcsx#%!2gyqEPeD z(%Sd2H>8dp1VOQzZr%rj>0OdKvhKwqc_5C|k*d^_`N0n1%HDjIsW9L2W-s>AI?nUc z+=6i@A6uJBb({IITxM;wCD9&VdMcV&h8xg-dOH~vT!Xnb4h^o4t}q2WeF}h~Y8#o= zjcg&;8Hd8uI<)RDA2rpchJ^qiw^#Z9XANhNC5d$iUfSDBQa43SeV}VazliIS@BjdP znGZ^Au-6_1kNvCkrN+9>`j>JoY`H9t)Uj~o4;{T#e-gxWSX>2&d|;z%WAfq0i1fY% z2jlX(@0~7HGz-8yZV19}T&bKdkSBo3w4A(wMU(=}oVt`x_49L*&xK|kedm4cCj_p1 zVQ|+Gran&kv5c7A2!3ZfJygK#dZ9pSz7pLEJe3}(1={tvU%mj5B)cCg*d)+=THdlQ zKbID__upE8G}5Zma?cMHzUxZ4G}0%72lHv1n^;Yb zy0_o&msu4pe;V`X;MS{kR*^_ed3CH&ON6$8yFROz0=RX zXSFnH=?Ef#?XwuUO1p+MKe4l;0lcU7=PRa`lfNe>W!@i`Q|+}@3}~q>Jm%@ejy2TO z#p2Ve3r202T0q07)_~*8H94o_kp1}p^K4Colz}2>@%$X!Y(0OB!+hk?H+Wo^H3Puc z<9b=oYLP-qg<_McfJq^$1(Ih5TKX?lQ7GN`)_inP$8xz^nb)9pVzphRM1@I-d`%wD z$Eqnhdv8A{r|{5$a!08hPpJdOxUFeT@xap`487UBI9LC!vO+NjJcG}!%PU$T`;8Wb zJPT2|Hh4P4<@`V&(7+(>;y}&PnQa?~OQ=QIR^#?vp;Zk)dOg*Z3_7 z|MQ0ZMZ>*WcKO`U6w-Hy=U?m0$gzk_Fm!D)H(a+#(e1NujN_aX3EDf;bm^lhEVU`O=$5MpB*^uMq5R$8JH|GuX8f?d?IDQpf?5J|HI!u^} zVQmTHzZnIjHf=KfRs*ez1>eT=1{Y0vgR(Ct4yEjtwK)bqlF#i@^!XVVN_Hv=Rctmb z!4+bEer>m}$aaTmC3KqtzW178J%1eVy{6rZa|>2;3!lju`81@9!ECU=UDrht<5ePk z9)o9M7mtU}81$*lJtG9pupjV+upKHgLU2K1?va}C6t%}h%ezHtuHu;E2}Dz${Oh|6gi1Io$>kGKf&qtGX>JM@8-|$^g2wpFcb#mLaz~S z?!H$H14@)qosKfOy70I1Uc2*8kGzXc6vXle%azsuH32pU0$YfQ8dPf z4WNoEi*DyNX%C^l)RAE6Fr5E+;vZ#yNs?7tO$SK8)@l|Entcoa=|ZJF^zSa+Sk0g( zk6K|Ub(Y-^0!;b^xY~kjh=`C-73Bj_N+o`^q22`3O>mtkXf(^PyMyqN+Js7PRXAa6 zB)=CtSA755(9O)IyUZswA83qyKLr{lX|r`OF!E`=a+ESVDLT7uJ>74`nM*&+{(xQa zq+E~yh7xm%0ho=7k{KED)p7G&A^n6EheFK!BV0%(&?q>r*qK1y7Zp1Go21b7T`sCC z&6s+#zH|(QrSP!QNtkGl0MdFnm_Hq+oZvFG@}@-4l7&YHs?MPJ#%mwm>c>7C zcs~5RI@p{g`XD6x>`(3Y2%7Mw)bo1jo&EY-^#)wJW;ExU*;E2i(_=Hj1&zXO@03-P zI`?Y_v(?A7%TD&?>Ix!rM19yIZ_#rK(+WHuniwPX^?4^rNg_<&zHReOYchSl>BtvP zrx2aklFfTCYuB6V-758ORf6)yoxczk6626$%!GkXepogXCj-+w7q=}P>8c}0v&pU< zrKiraMW5`2lph^q#W~yK^U)P({Xca>kTHPOb+xBc1MKg7c4*Et~^w%X%z5hfLW@A9l-hHXf#WFJ-s8oo&LI8Og!{iAFT)Anyp%~Pj5 zZ7%MMkmnHXLT@8Lz!HZ2*A_ZDLb4Tcx-dr;wqbvY;gYL`w!burM3iM>VQ4tX* zsj|M&e8vuS;(NcsfHJHBz@{6({+^)XI^}Q;6RaIh^E0^5I zzobpyGiRL)AeAy7Bfp;1(zk%FWrg$(r5k+HCR%kew~dXl!Hqa)7}9>_g;!LNATLqL z;cvCED%;|!idP><)w@ZTzj);#gOGZY;S86{EUN2BaGM`*1OW^T-G~QprUM{q)*;#| z5QIpVNOBsRubeXsBcoq$@Qs5FXY!46Dt?9fk1c$eK#5CQuNx-T;d;=D9VOBOoH?K3 zZlTx~i_G9VMnxSB?_=G$mi3b2?-eF3&d;CBZvtWncd*b!2Czc-n!>gxSunCm`Wf^Q zHB#?>L;KGUp5qt?Y}ez8bw)YgHT{gd&B=B_&XppMpC$LVHPI1uxKl)M`7l-=yFMt%@peX+9eZT!SebhAm0{P{j0SR;l@$2u(~I^gUJ)=4bLpb*D;dz ze7!!z6M4QXnq-dty9Cqm<@|4M4PJN+R=!vqHFichq_`GoYta=7DB7?Rc6VOWehOM~3LHID!OHD8%m;xM>mTRTNleC%i2N(!)85nJlI zj^+2QrO%2-&5=#wf~$K!bkqQvZ6VSizF{#W(C&P+E;McGEUT%>shj4=Z9xw65eF8J z7UN&B53DK(vOU|gv361!K^IR)p<4s2WT$GqD(@|y9Ris?tYzRo&Vhq9*`xaLrIjiH zG$@hmbUfDJqwuD3$&UNpogxEM(2v^g8}&*CEg&O6HDij0+SW6`=|iL-2&C=fYz?)U z(>n{S>7=kf8*+I}R!9MepCdqmAZ9Py4Sg8zo?iT6CqU&9{d_jx+MS#cAm@L&Yp?tA z34}V71peD&(OmYeVfc4#tVzx5RIkVt(vDaaaPqOa|0PA_;Y=+c9sM=$!v>&G+ClL6 zBj7+zt{&QuH7e}?30dK}$1FgNN*LLHW=>md77ZDPej@Ee8+x{mp({S@fp7y7uTxHZrv~LEZ)&F z@MkpVAft^*V;a|J6XVZ*RV(DvJwKFKUIr{kjg|VQJB>FQorBA@5AK;lPMvmYj1lza z+B_=oc%J_Gn+AE~wb16SuhsILJzqIKYA1GfN!G0+L7?;Vec{H}0Y`Ph_#7yPNA%j| zkij0p3q9TqZ&KH#`dOO^oxz*rwjxo$8>2; zk(xP6qiD-1d151;#ow_Vp;ramErm_d7ufJ~(|eBSsdwA`=)uZfqfh~k-h;KQv#~@{ zVDC63u&BTn#uH>)OUqD=ODN7cbxB+K(-f&*JD}@D>$^5*@9jGQT|f`_m;L!dT{U*z zmKd08Z)^UcM`&p5Q590U9}zyN>VR8e9ulq5vDLl*4B{;e;D>2nY+l2~AHjt^+3~ac zxZZTFbFGt$w?seZad00=e>u zGK2ZfL}4u{YHM(O*{PC+IMv00{RsP}!MB5rTb!umqmUA{0o5kRFb;%$ZPSc*; zEIXCOIuO2&R-EU|+k(kD^PWihf&KlIWi_ zrmx|6!?j!%2Cf1xtjThB7-`0Hf{OpX^q%W?&>gt^Ko8>UpKOMupTU;LfKA0cu7R;M zK-u0a!+=7&#?+?;j3Dsy6S(=w9Sz`jX#%4yo7|Q5S!8(tF-Cmj$4J$`xVUD}wQ)N$ zExyoZf)er@# zV=#2*JcRyBlt8{k65B6tc$D|53=lFacpMA$y~ZWb5x_`G-Nz%!7MI-2dx1@)vR5nC zlU~a7dD~c}qVZD9Ttr_-FuJ?@1=%c3_B`+AKr%Qe8Kt|@!{@&G2< zEuj45NA@9Wsx|&MpW4YDHN$RVm<|oswDyvMJ;KHC$hS8BmUx!`zD2! z;bWI8*D3zb>>~e@j5X-u#-RqDPDh^nc<^l7eCIr`{aX)Yr-`C!-VpMh)ea1!KkTm( z(HU&j*7YzWE5PE<-u7G%zd0hTV8 z-RJhXd9CTHX{Db8pkMg3o|7*twZD$$S<5y|)WBu63f^Ys9L~(F%pe#+f1iD5eKO^b z$=$Gj-upe$q1=7PkY744V%nf>Q_=&$l_?o2wzVcv>$QiJ*v;{K2YmQk*$ezaq13%> zo=@>TGRk?6X zHy#+~GUa6>i4AI+D=LIVBO=ugbD2#=~f^JQd;I+A7CWINrl}5HT@bmdHDp zwLE(%nB0>R4K5~tjl^F|y>Y|z*`Y&Yg2#F7i&D>fr=j0vcJ;9XODROpp0S@7(=n5I z)7PodOHgeB@Jwre$MvE!#vr+S=a&EaV{Y?|uisO@mcPh8J?eG$7!PigRQt1?-Ngck z5}ZeqSS>FOKaNx>>c3o`ZhUtW5Q6QOlF~KG{WbCU6pEMj9k*%B=1Q~~6C-H%v}y?Y z7lHH|8D1IEnrQIW0Gg^;Pq}Z8ecmC}%_>9ZySjT*bP~{f1fHV#ad6u-J6F3WkcO6z zmRj)&Dw^4&41Ww_U6@RhPmTc~2keM>L%PHlp#L9x?-|u}xAYAM1VyncB3(s#lP(=a zK}DK0=}MI@EeW9nEMTFCAV^mckS@I>0Tk)ddrRoOgc@4NySd7_&wb8S@;>ic?}uky zeEKh7x7o92_RRcdcF1I7Z0)WMB|M-gO!*HHu$zT`3ePuJ#?xW?-25KGE2pn?8G0+oK>$NKm&)Ba7JGWOSPKt%mDF9#PrV zEc2%G@j~@=QIA4(Gc(?!@a2uYFSxlc7WSngiI9u3176Ayp;fuYX!B}dwV>2?j)>vlS;Rqq(g-ioR`OV^r0ie8JU=@ORrkB|JdOu!YEmg(sg z9S@Nt!i+;@tG<6x_EWPk2HJD6X>letb}DB3aPr{hxx1TfZEh9?4Wqx|(h;E-b9OW< znJCcUD!`caDl0i7>jMTV!8mVS9gHejv(6-(aXzX#otP*a7OSdnVPaa1;if|oy3*DWo z{~<%NW&$Co8~2$z=3he+4A-(Tf#XRzNHrUPA}=;$`Wf(tfCVfK~{?{>-YSeTj`AbAhRuO_MQ1r3&vxSX%r^MgnWO^EA@^MFD;`l zzn>$37Fa&)s?oAn)?$!RA}vCQJsdz>kTX&aNel+LA#Pm0*Vko=3*>NpOcb((4GXA^ zdM@0a&_a(EAi^gX7M}BAMVHqXi7J-OyL6{3c0QD1jx1n^u0n_Fqc(=r_BG+^PpQ`v zI1c-cYnWed(I_{x1W;lMsv*j2){v!cfv~nSdv|CbtaKf;_Xi%;cA#W=Y%euD0bw0$Db~d z-qXo=W`hMJCI397TPU=SSPAn=z824G+dY~ANr+hsoLRN3E_1Y<r16S0GVt%7Ky#ehX`tccYj4$C0>RAr&_ zQ|azn+w@V>=Tj+?hQZBUkZ8=ibPL@%g?1Ck2=T>a{}ton0^QWOQm?r&qlI;k=hj95a{b_@Vh3yq%+tq>TZPzsS!i)JAm}ud(sUqRw62^y+`;B zi}fEi>Q<;j?OEj%Okrx3z;r2O^f;O&9n!tM4|hE^a?y3H=9rWZC(lss2i|e9uP`ni zI$bdnGYm)~aJ#)Si^6@L(a-h1&Coj+CYI>N>8D?0Dg2V(uulH*@h~V%^6l<93WXjh z``pHgHAExr_lWILIIN?reMG*)WtLvh^lcP&Z*aH2!(=hM#PFSaZkO;uC1qbbd8{6b zV@60xA^NmNV)%)QJ#jS}4NP{zNZlpsg4Wb@1Z=aHr__DxPE2{XE`zpN0YF~;j21Of zY(b37!lzQ!?cXab1Qkjjhi%H3B^vKvV;jL=v{Dd;;s{=`ujgxr0HwiuuYS7T>)XuH+L^#7=8!cYW8pi#o%J z@3fnz{>fh}be{2&%w+T9(tFWiv#@N|o3nR6H1%Ehm}fhbQ4y!Ee!F&|0ioMD*rvcZ{cJ3UiYBkL3!w^JIL}%;ny)bs z#}X$*VBhYz5%dqbhriXjY5A>vT?E8C7gl*&B^I0ZPM<&d;Kkk?8|lq4Bejo9m!7XQ z*3l=Z_bknJ*&AA+0NnUIqjuBK&hnwphRJyn14ak&K}R291Z}c@gGtAvUh=cK5ijw_ zR4xWoCSlq1K(c$E21qd47;sA*6b3<95vId~a2Rz06GkKO&_uXo0K!R8fpG?8g4P!! zf99et>8DpQVB~ZevU=u{nDxHT_2xzI$}X}bDa8yhqy=-))A8F5@BL+-`;CvM26RuVb`gZd9%OX%<>tQ8*t?&F5cd7AZ!Tv#IL95j7u#mw{H(AHQ{hAInb#Dsl zl__u6(~tk`yIfEAM)e3CP0w{#V;V~i|NVf-wMyD3LDfCH=HX-YTzU+xneM1T+CKz_ z&}>En=2jRu8Tk}2w<%!mA|w_108rdA+1*L%3Cn>;8D!M&37ReUKKtDTP$y2MfO5gUSWffV8l#1h>U)^A_6jz<~D)I|7FQ)Hjhf&*0_Hw)m zc@@FMhSre$u~8q|VQGRUUP;V<$X{5L=$ptFJ9fr$xqm%xXFB)jkTQl{rz`inLQ4!E za3B)u5W3XgW9ZC3y9^n&i)DwXESfwQlsUo5=@r6SEMw}Be13)mw*kfIqMJ@WnDy}` z?Jx&=wdXlG?nl^JPn|+(H|^_ZYjg zN1Crhr{rX@-|+$NZ^m14TuJ5c$FICd-TrdLbY?VcauH>sYD0wL4Y%Gkdo%*bV zV-XtjjhU46N&_V@uhoE*I=B@^UotvmV68JbL8cHF@&o{C=xScm923{@8mu?%zfi*h!7Dyo*TPjE# z`TCizb}OK&Vse$7Kr(^-#O-(IwYy}zdTJJySB9M3EGHFc$9tpm)tfp>5OgyGh2ieD zJvC{*1|MB=YaH8|X=mrPQWL~9uc3MJCmTjR<~*tlLMC-pny_^GMvKmEoioEGvn8O) z6^$1tx-Fe|WRzI?7--)7ZzF95h?e(93?yD>u@ChZbHGyrtN$|p4MgIBua)8b$bP(! z3w%o*R(7)h2Rlg0GwI!t`%SwxVO4L8<3YV7;M|z)%H%vz=ydV;>E2!M*OcSZ{B zA~zPP`m@W*={J|u4Fu<_)atm-4^^*I)W{^`{1n zV2(FZy!rOAmzU-Re};KRQRFL+M>i=>F<2gddiiqHvy&G}tBiJ-o8$AA?f^{Vp~dI3V; zy5-2ukB4f*)TBkkrJig=4lD)9!OU2_nN`n|)q)L_l*wRfN& zWFC{~Ez9S};r(;YCBnY&DxpiBdnsH+pIJlW<{w9)q0tILA+l@3@G<+4xaDojkTD7> znv)k4{U8*S|M}rBar$JXeUf=JF9l`t$&;0QH=~UzZc(7SV^igX5BE9r_A=dm;DjBN z%5|t8ZBWTK8`#-4C)QwlTX*2HTb&*66mf5>U%Q?XvEMKZR{5h5{xzn5^x2b@vA2C% zI2HXWLntZXWtYxSP@wPLKL*NY{p-K}=!1hEOw9AZeR&GX(lel;ubJglL?wyabNZ;f!mC|AZXBHTy6QnsGQo8o3lNz`$oI-)&*e z%YOPn(uUOFUn&zbyMM<5{M7`;Rl$KZTff2t$WAjnBsPM0J)a)<*AyfY6Brm9e zy)z?o?|$Q@x-g&+LSAWoPNNy7ON;5g{x>}K>ueQcKqa^Gx*K4YXY`(){;TExYvym* z0T(mVCEe0KRmpcx9F#Qp&-wq+(Eef+6tX^HFTpH1GY@k7tGB=UxS#@fQHobNEaj4) z{%1QwT5<-WptJ?8w#hwfztJHCu&S$0&?U8-kepjx1?R|Pq;}A1?ItG}FZwGZsJll- zD}Uz0G{X~L&fkoA1u+dvw-xv!w)t;{{0v&ny#D7v{r`EO6h}ZrHW4A+Esqvd`EiPm zV9c72K)8yhW^%FnMHPNs{u`;Ih^zgV*4e|3r0EY`M1tA(^V3#(bNQvE;Z z3!J@kI*Jfy=+9_zJ_MpHDI;H0T3Xuh!{RCOIO$}a-iKBSG=|VCuwhVo$>^JlGO3G& zP~+U=_{Ccvq5*MMj%igQZ)tTp`(5?0dOku=98=bMJpE7TJ5%f;CP8zu}n zS2z6{3VVpt^e#*NDvV`ImBd6gA%#bzhC)g>CH$Cp@N4pv%p)UzP?TH{vohdP)dUmM z`C@S#X~0ZM(bvx=?oQxdF(KDu0~TdA>Xgj8m_o9R`TV&2dNeyqUXUjeis(*Os`A7` zuxmS8sl`Wz)y&#x$lJ_ugAZa9=q3$W1`P$`U8TbJqBg1T6`Y+W`om;~u!s9RqwsUas z<{xR0|B|kXJ2VlTez2K$xDY0%@}!Rq%x;^FqnnbLGS@7Ksgk9P@nt_raY-1N^O6T* zoTu<~WvuT3+F>w7&(;ND`OJj`O1P7sf*@CC{{Ckguu9 zguD$c2vxKN)D(CL=rB%&Pnnz)BtxkH()6n+LUPozK$GsDpaVBI`v0QWA2QHFv0rHUgaPj`*@zu99)KzYT#?R*iCS{(!CdY*-yOGb-r4* zvPGY>J+;}VR;(}oyFg<^K(z!3%1ed|NS=ZbjzQ{#1@I^1e-+h2hlY~>1JaH z{wkx(O~FIO?mZ^vp;P=>gHts9v&$$i{vq+nMKPJlpD}cDazkxheGDutEXTUO-Tco* z{>e_%jI#CxC3ateF%(8VBvVqq+#gHd%*$lZbwDmUkIiNJ z^_WMFeCEng3Rz&3#5N6+H|w7z`yEA@ZY`9IOv;E*EBr3>WR-yK5bCfNz4|B1{g3Sv z72Ib$s~&G5r`;}R(9!n0L)C11*i-LpXoi94?{_%J^;eg}e~E|(HT$C9z7XW6{r^P9 z(9D688V;U$JoEAK@wqKnue(=4u1IXMZB{RlNGvW%LZoo(of%S#Aif0Tbt0yqNxr1k%rkf?xW30U@1gs(0zAi4hA ziuj}7Xu5+d-BqZc+f-RXY5SoH};J)y#p92vIF@5>UG40Pb`hOAo4(|m&{r2xR7zYY; z=JQ|>Xd;6#EAN71(d15jWZRnp{p4JC9(ii+Ja7kf9R0_!^N(ZaU#$6$W9L_u@{gzV zce(SAr}Wp0!T;@^Qfz0&)?G8Cu~(19a*Yo(xNpcro2@SXUy|W3KP-XPisEthJVaj^ zYq*e8;cT(HMOX^*V#P7G3|KjNkM{bEeZkOcI9?&sRq$rtRh5FCU@?X`yB3;NSQ&ZG zD=Y@(4CM+&w#2e5`OYl5%ru>-W;aTBIksVR&OW41GO{^Vy!4uh8d)k+F$G+dqE{ke zk15bKb_!Rno<}0bp1LfCF22n2IpEUXsP{wVgc*ZO%j_$z;`Lh6&N61Xl&Pm?aItw) zK}A*wyP7BWDL*MG_nQfsu9SZpaJ#T#qFCd{EE2`;Ca%WeqVbu&O zi)Wk_@TJ0SHPEL|PnnfZj9lFbgw>vDS*u1J@5kh^W1sX5O*o41k!2lTsREP~HTL@? zZwe8@bMn1J5|0wN;C@L4#w(*Os~+UA9jwhU9>Pq44JB{IPk9 zjhDJROWk;);AOHb(GQ+ru%>)5@PZ%(dJTGYInkHFo(;*nw^+DS&9~8O)gZUpafmIn zVzXGryjsw0ln=S~mM3%!6x1i@PLv{e!B5gd2Bv-i@N-DV&f3O%TnF8dN&K=i!Rd>4 zoJZ%X1r(+~3O2S*Fq_zpK!{5=e>( z!1P)%j+aP?g_sgY4-a=qx{^1dEV%PeluA3wO77D(gBqW`I~G+ln9$sCEY+K^(Q7{v z_mTb45^hb$7+*%@!wr=ATu|TKZdwkj(ys|LE6v+GKpt24{kyE(F3h3E*O+>CCcF-$ zg!d?XbqVwb&clH+@>a{YZ_|D>{tg^aT|(P(OvN?v7$aE8<9c;D04$-eX<_X@%anjE zuObjk#3U1n;ZDRuC1iCC@xKcwDKa6jG)xJf$iloM%bCgj8Zf8<@6f2nk>SGggJXZY z(Z4Xmqf*eSvA%Ixkpk`7*~d$kgD}DXn1esNS{^R|ui_|U%%5^cT)?>L?^u9;KT-b1 zAOt`0>1cHM+%KJaH^7fsv8s2mLy-?gx?s$ZPy)W0%<2Bpj z_U2f7(=%=%S3hly6_322ggf3B(*{74Ki${=`O|}Yl*u&193vs zxodDn3I6nH?&26*Xp`BFp?h--U87L>eHtNvtmIsGn>Hsy5CQ(|*Zgpn0)31=jvhmA zDyx%lldGaaN@fHM*P#*Gq;DoCw$U!y9Q52-=HoG=kEPn@D($mV+sNbmx|NGvvY1%orPM6E92K9P(=?B)_M{LjJ;(we;mACd^JX^`9DJ(!H zhCydP4EVMybm*}2@*$0v)oik!D_O!<&(F0;i%OVy>aJr$LO|~f&~m1WJbsc}MXra) zkqzS z5J?pD-|Y(1YM7Z0O>+_F_Jg`EP8Gah|tI)X8Kd_Wy(5TW%~jCYqiuH*$mW-?y4VA%+0lU!#sdmgqkD z2nMd3HhjGRa$FOj;bZqD;WkYUlDOTwHgReM<<|Y<$(UZDSCf$lk^&uh#fwa@z9=`i zZBin~rsV0F6t?PF8r%99Q1SVklR1dSqmk(tRsp{r({&Le@{T>H5a_MOA@C&FsQIEv z;}O*DjYtUg@;763@_1kX0APZ7`nKI#SmdD_eM=m*ZG!SMpNsew@2cO2ICHMc#gZZ0 z{2=~%Ku-m0`Z_d~E^k_yW&0*4v70}BJdL^z54TsLK-YVg{<-q|A0Y`k+5pHiuOjQv zcnl{islloX=K-y8n#z2+cZ_K?SHsu*OZsnYuvH@s|s!l2M<{g zW5jc3RvI(#EG)SLF>V%n>BTy}sAadr*TIRqaHNL~_n?tBG_AVD5MhKN&mhj&0P{J8`H}K?c zj)$xETnQGu56RKu=^-;(pG`S&bYDq{wuGqZ2M=y7#@&BB=yIkzm+KL4Dt!OCz&A8m6F>P#=L7IlgPC_n=gu@_q$}4q!))SNXhSq`TTcArHLnF< z1+y!`*ViCKaXN#9b z>1%)#z2dInde+hPa#qh*MFGFsXJm0U1?5dTZV*g6jEnb0IFxVC+6l-=o6j)V)Od5d5+ujveXFzs%2Zp>TSf zQ2SPU&%w~*+{7e^ON1t)Y6d|tGtMCYQ);SAnY2t2_~C9WI8L6RxWljc3WEJjuFLC8 zHZ;S)Re;9|_xPJEMz8S)kpOcQYl6o?4*JsXN9 z5rw}x8u7~!*Y3kdUk3Mzc{lxfZ4e4+-l8=p2$?eGo9&JUED6j4O?xvd(}O(5)I7rt z%1|3Poc=zrQQ4oe;4NA7e4pPzwR7F?u$J!t4jxWkX!pbPK2U}Z^TyLC5n_tvHJ2wx z)lkuh8G);O-=~@kAn0tV$fNoz;9AgMJJQm+4MJ@+SPL?bO7y;^@uhM70O$YVGG2KL93Mp(g-LUUgR1J2E!|gqS-H|6^VJpIR6HfP?ql zK8pW{jSfY5l4aR;VibQ&4qt|Q!4 z#~v}^MzXmt0#G_-kq>L6&JTzw`v?lrbC>gdRG@Us0dh=ze-`T5Lko&Jv41#)3^WFJup&EZIGC+2gDo$EZL(3c5Mr8;(NW{Z zrw4J~O?p^M+p8x2CMv@FYJ~ol2@}kpoVC(`G!OAdQRrDVDVe^?p&u7f+ZQpryhny7 ziX|N7@;`xyiu65+1+N)1)jLwsxAdKD&;_HR$0rLtyxz-_K>)?$RABuz>LLQSqFA$4 zX}i?U7TEWk1Q7M(jHNHMxvxW<%SKSSgw*GY%-4*5EEaSAy_-NWjH*WF3AA>2sQ07^ z!*zghzB#+joRvIu03LoAw{X6I3A>Pet}MeubT6#%_A;|%Y|=Riy1(xi;(vZ=x_2Z; zUkRF&lR^K3uU#GV?R!_`)T1c~_C{@$1Y;4COikU+{IjUrjSS>uS$;^P3AU*J zM%6eXBxTo^uOrn=j5`hjfI4Hczw(g+7(~d2tL$YJ?5Qxiaj1?3U$cYwBo0kQx0!Wl zk#%~k)h`J6MU{7$oGxKv_>tiwkL|IyXLRO5zl7GsN`w0M+3K#+0lX->Y6QJm=PEz2p0pH}vDgcqZ7 z!6wQKdqAPb%wh|gobB~-@r~a80-J&=;Q~r{_{{Mh34YB82zHv?LgmnM z0IZTJXq>y>a8t1F@KX07*3A2u(VIJx4wKi(U~v%O~XrXWJ_CM1aY1h&KLJ9fMDzPj~R#vF`b_d9bonTEbDN0-9xnH?VG*SEyv-Gt#J!it3k}xuC|eL&*CZkcB|m0qE(ai zo^kv7+yWwz=u%r1s@K5j*Ap@XUVHtk$Sa1T`q1xKfZy;j;dEano^N<9I<<9miM#JQ z2t140Wej_^@^)xBK`s!gLnE}c9iq{+BM8oT_`=y9$;+BS`!u!*f8O&1etTHZQ}-#X zemVc?yJ3?RPb5ikcd~en7e`-d|HZ_ZoN!_5BxNDGl{O)tzpPA}4~5fx3h#=?r&FNM zZx^1+%qXS>LNHb`U`9jj11S5D3*w&@8ql%~76qeYLm-?0>gU!^!Q{5@Q>#Oq?TBOK zWZ(I3oZeq_pJUG*d^Yr`#OgOB!h zMS`@czVW%jIpu>(=`uKuhiE&%g2E>WnK(^`JCK~)$E?ni!B_sqw4E#0Ta3y+=N< zjm}`X8M|9vbjDQRMHI7&k&G*J)CAuin$koY!2W3U-peOVNf?l>snXQl@P@TA!&G0! zRiZQnO103-f?qVK$lXty{Kh!o`d54YI}Yj|b-)4mYi)2WN@-0OuJ&JIR^s!UI&|rb z|EGg^WmZ5=+_8{8Vs;rV)`y8Tr{u`6Rl6x!7o@sqMFF7#!dsI7XvKc#Ha4{{k{+qB zDakA!hqH%fH1&OAzYY;Xiu3#k>X-79T)EXhVqp`Wclja8vIk|!g&rANdV9gtb>6`P z2qyG(v9C9OpY&fX?CzZh4v?Jud<2!F>#jrIn8^aW6hh+gn6476aLh`DRTMQAmd}0w z5gwyMD+o{t6s`S*=arr^Kktk3g=z+M?La;H>_@{w5oryHU7K8DEmZgEuyTV zKyQt)UIY1^T_K;c0+!yM#NxFI4p)Y#H0$Nmk7Zaqw(RE)6%|V@I=g?>xeAYpxNvw> zw+g;a2_GmXR6mUc5y3ncHF5&I5AIMZd47DpnzSFxDk}?+w?pC7z++I<%WnfgerXz& z6YpEa9V&c!Z9|B6mq;2rtX#F+?AR~|*f?J`=y#?Udwb(a$mygUpqOuA9LTEouuiRf z5MPE;IfMs7jJS$@Tn;Hydo@Fzm^!Bsy==O3pEx-MX+S@7oEFC?Y?B$@NhRPsGM zV6gJYA9`%K3yM+I6BU8$@A!BeLR(IuW^)QdSzsXVZ&j3>Bsoo1|22r|`uYA`mDb~I zHwUyR7@2-Bc``eyT@i?gI%Faettjw%A%sn|)>e%r5x^CzPy2@2{vL?&vA4Y**TwI)9%wF`B zY&#BAmeuS@`}hdOorCy;f!$IoH2uoZO4aYMdaeB{gB=|`8FmiMSw$ddgbriDH6R>E z;kp;gMjr%8Y{xP}wIygs2Tv7Q}LBVj-rud>N2uE1nS*r1U2S;=hZ_ zH%R|BK#l3yJM!r$&~Bo_*ZRGvzX&ycd*=|ZN{gNXD4^2)DutZBS}Fa(Isr%}Bg2jR zS=2ld%x<37vN3U2A%>L)@w4%m2(--@Iaa}UmGx8uq*m|IZ8p< zakf|3FN$gjOf;Dqf9Y+K4a+qdHE1zCNQ-PaRd92`aqiOZ5sklq_4a~DrH1~=N1qf8 zDB<;sumcAQ*&k)d3_Iem^d}U+gL*%pB4^35#+s=CQ%*JGq!0)@8JsRsEhH{$;fcP? zlkVeiDWNYjO_?Cj2EqP>en=&UfqsJ-C+NaKNgWFGcga#}a!_DL0fNT%Af+0pN(HW* z<}wVg$WR#0g|W zfBlI&6cEzW&M{d4R8#}JbuHGD9OR&)I@m7Pdo&%~0l&~+Si0};>YM!{s2Bm7-Tp?s zI2Gfsto&8iSeXn7rU?NsIm)wbr&rkbHy|p}N$kwuZvezU6ObhDoP=-MFU)nP3xAG` zWM}Su5OzIN2V>(G6qHkdZ>BMoTci0kajJ-7;iJ+HCIUg<06QBYX*c4&o5URA;F_93t0nkip* z{fW}X$)&SwvItyc%SVS3%;(PsJ(b_WluW!#oK78I z55vh_fF=ydxf7%I=CCF9#53=373*(+UED~Y#}4A=+SGbxtE-!9LTs5qTPZ{I)sh<0 z={#dzB1r{{=;hp&xtlThrgjQWYP8V(nWjsrP-breas+UCtgv3J>gWkm zv{weJ+=$zXbdK@x`~T!DO*^oy_o8s4vHRyM6oTa{M-FJx*f<1FHP5Ecvle;psV}3G zS1mYUv0g0`3c;#N-tL`e!JA{SDj%lN3A5dnhQSlPp3uSVksisN+O)4@YMqI;ulHJW zg@Ur1LrT1ek-bx*IJUC!H`H#U0SY9{cWE`Nhb%VU7Slx@q@DF#_r3X#xQdzlp4!3_ z1U+BUdNDIIa;=?C+w++h&0VA6Fg1;8E0T}1RUF5vbuG$lYuBZgnK@{4H+1Qhno+TC z_RReJi>{nL1?kw*!u|q%OTU=PcDL-{+U@N?MTEl2PHy9%LC3+BJq5?>2kzc`kcZTl z8hL}Us2(j1_rBvM)G|AjQ<~3=EO@zhydxb{WR=2_R_?!B`8kueKwOR{l_cd2Q@bHX zF*%59L)Ffn)?UWmL}%U}515DE9#*2OCv}gwvDtbey@k}Os`rCSk43iYV+_K~bgHZK z<~jGTVaW1C@3nGaST|nbKHv0P0lq*=`=0FJ0VkAzFLBOH-#1>)3p!ueW136AdezRE z63X673K0teJ?6TrCCi0(Nn4#p{drc6qfO4fZkWbV`ijk)ySq~gp@FOj?(Q5jvr=Ee z5G<6APw$783X5)Z?EflW!w673_Bst7RE$8pG^#+H$B~uk`b9~RKVOqv>P(l5lr~;% z$*gyx(6%_zq!3$>B;Y!&F^qNJ6ZjVE>(LyXw`NB|c$Xr${_Ep57149ClDe#<4PwHX zs5rcgfm-rHP5fOX=WDO+G3OwVS||(>?hfrPz(zxCo?f-VjC#6kFR{IET*p-`*I!-x zK4(5xshHWD#^pq+TPn6p0M#BIZoIKQ(&m_re*HzOUOXqQ7@N)$l2p%Y)jc?3 zx)#c#(DHN#{1ygMpR76=)rUMM`QR*aJ-m?2Tf52c;+#UxuqI_5SDl*0|`bAB& znDM1wJS$x8iXl|Qw`^NGu$<34`gm?9nnMx!}wM9ST=Ok(g-5Vj&yn>~ZY&iVe$X(j5 zuv$yvG)rLZNQ+sFt+Rv|9zk*XV#so}%3dNCmarRhUt;uqX94P5bM)Tw^QLSh1_Y&M z4{!NKQ_o_MoD%iw?zN|mwTuAJT0Gw+Pl}?HqjSSy!1m@e(EkU5!% zn9s;Z6VjDy9J|HCeb}-HgVBc0`B?3|=`@7(!X}ZQl%1D_yzsU>uA@UYD#c)lh&MZhhBZJeq1LcF?XRg%o~5RE$9d_?1LThl z-d9I%X=_EKbMsk-WI z-uJz-Jy$11+^01$al(G7*3GLP2W51_Vz!)SJJS&H3;l)RC*(I3?Y_=Na%d> zL45z=ZqeOg%E^b*29PWcoq;z*@-VVPN z{nPfdTQX()$9ukxUa=u25&9{HzQTqm#dBLlYBzmkmYREcR|)Z5dvafFd2F>rq6W^G zPx!mF6L12C(Fp4Nh8_+5)<)EkH|VPm3+JzTsX@&uvb@qcZdG-pbehEqdfqb_O!Y@< z)IhT31kDhH9s4AH1#^R#u?#({WZ&HR?F4DBMf~%*m7%wol^(39>&l`JCQ+|G%oJ;P zQjl)d#)YrYk|edTUgK-ZqhyyB!S@tR$8hm^UP_@SacULXP{6`9F*>xf?fLP@`JIw& zLWFu(@~!*QfsPrzd$lP^D?5=Ed29c#CSfdm;YQb@4D_3^)f^aveXL3{h5(9&#ji(A%FVo*+$L6TlL9!#8?sO$(5{ON zsO1-GKJTj9Z%;K)fA*=~Wpz~g=!b$}yT_tF4{9{J2XL)ghoza=!HpZlvWe`17BJ(T zx6AKqJrv^B6CJq(>o?a`EV19*T=6w53z*v&p_`voIW*q=J)tGyu4td|*@!l~0mMOAa9V4-mu|1jh)Mldg-65;4w8m}m?Dg#eh38i{|oM{W%$`*Ig%!Nqq=oPA6&3flt{o-b>5Z zC!Vx(%ceH6U5as$^V*s;Ss>msQDMY|cb<=9w-Uij-8fgzX(p>BNP~F0g!*tDRvXIJ zV|w*b>jlReDVtE_-j<5|_B8uKS_F@FL&H11n@yIftS-lf`&zye`t5UWC(8TCF8*8? zC@$>V(aSN-dZ#NoDPU5jBVzfW-YXP-_J0JU;sq*DKmYmgHJd0R7pNfc5Ii{>dLA|F zhZYl>qz@*^>FY9{YZ+-Z(7B(p@T^OMLfS^|&d{4Jl-n_$NIA~;qKGZunJt`PF^lGN zvu0##d&*C=N$SK*+T1!5do!=5Wb8S#vAzUr=-bp3$M#nRKi}1J-tBZ5yc6xd`DA18 z**UAv7Vn-o4T#uJ@z`$FBC_r#%`;f~<{%KB`V?$Wy?Ne$Sfl4(m{BW z%T_z8>%Eo8YA1)|36gKw6Ila^obuw077mS=8-}vdzS*}9>hfJ?6BAg#&pj3wt$cl^ zyKeKq)S#WO0qXtH7e{*<*WTx;*UZZ=EYmn3le2x5+6^~z1ZqDo;DlA3%F;jk`16aT zDABnTi8+G@b$HKex~`pebepAJIkQxV@7=qjG&yIMIUsb=anj|h#E(qjO2fpmk65cw z!)TZG_Nc-53}ivpxLBq=ax6p@>$0)hFG#v zo5H>_`$@D|UT zYL7Qsh06=b;_3Y3B(tVZhLu&@_}cfMzK3Y+=G{9%g_@PY@-1_T*h|oqGF8iB6Lew*b)VYZkAshz2)X~gnp}y!f zmxrQ6`z3;GE+AI&W{o6Sam-t=J&J~7+uCdpKH?1Bd(eOyYv*jldT@l?&lbE9epvBn(4N)_r>?V#CmBuD>8Fz8FCpNw z(r-jQ-feCwQR4ktHqxNBpus}>y#86UxWk4%@xj-j2#@V4F8%Yf#FbF`bk)OE1h?)y zYvUHi+9R+-H+-VNd$IzFAqHR1X6t3e+_-7rd$&JXmEMt4+KdexSC55$-AEy`Y{w#S zj}dwJol0(SDowzqIW8Fmoh^)aUFj@BdR3mp>I z3`+(k>(cOAFTWPJ;z!kD7t*ft4wq#+f37p2(A9lOc%A7)YT)es%VvR3PW z>mK2{O|RZd8{9K+-Tl<$HY?stiK>b19eOqO26-Z($0jnJA<}f^vj)%3C#PwP^!4G5 zpgIor0sZ6n{LYFdw{w-+qIeym{A9@&LgY=%?CouxW}6EIMXi~8r($ylGRwz9eY3yA zJOYIBqW!R zSJuV-smr$e{wR;14K(ozN`CDAYEK8<=cXjK&if->Uh91*Lj1-I(T7PY-d`kp?8%X{ zV&Xp=>~M!e2FvU_SjDZ^GPUmto$F~)?|u~*jI=9Cib^%2gx9nvb=#ZG+1JV&s2fH# zClNb* zH}M+Xh6v?PY_F=s-`h>)mIsfcs=dZz9U~21=xp&ucQjxQonUFmXo=jx+Kny;LQGE_ zKm7GW1rUi?n2``m!Tbm+>I>eq;uwS^%wDX>l;<{?GK>_-OMJOFn}xc!h$1;e z-rE|Pd37&KQxD^o#vyfXNrCSeS9TjI<;iuXZSl7{_5A))>za+)mfNl&drODd zh(_F_7CGWA+A>+w?RR8rA}iq3Tk$N8h>zvdMlREFYYBxWJD)TP2ezN%#%P8OV6#)Y zhmr?mUnl1$$Bj+}9sQa0V^Y<5E&;=Lm(` zWye?VleL2KVLu<~-!_bFaC~ZebUKZRpB`ubF#qh&gnWGt?{V`5@dRtxL2xJ|NcAgx zmg|~kKTdd+JsEFe&cEADoIbQd%pmXthrz3P?OehlP!_=R@zpZ>&ScO3W8d z@kX?!-nr&j|818+drp+9loo4pKGNPJ_PjUv9wf?@_GGaJ zi40Ck*yssjitKiLFO~9zO;?Pu^v1b(R63JnW3*O)yva4AJwdHYr#wuGw;xA%=RPjx zFMZrJxqTb+0+Jv_A#1_KcK>2UL{q%hip?GNi52U1B{}P0j>Tq${GDfg>wTf(-E&(9 z``TX{UN1y^%X}+nCF0npDL!Y4vyHWEwrvzio&C5?$XxVr#5OiD(;H)$igrAc5C#ZC3PZ;Xiqa)145gIB&@;#kGyFE3d(ZWp@4e^4AHRQm zA;X$yJ$tWS@3psQT2Cv&fp3AP;D^Iu8HWStLM>H7ztEemncT4jvV=p8f8F#e6pfm@ z)ypaye)-Jeoz&M!kNj;2^o*#4pB%>)X2oEJq`FEKxPIm+IMeBLE$ zTs}vxzw#C}R^+j7kxsw^fs6K}=r7giJgLE#^I@MHeS_tPAtS+g>oSxcidyjV@a0SG z%qOrmLOO3APR<5Sc3!Z#uRFQ?u>!uZ?B2M{lwY(}=EG>moUY|2bD^QXXFSMJifcK4 z#6=|9B~Z2pA|4=8WK*`8Fs|G3hxw1H4-?grg>TFKnt1%mQscvGe^9PJ zbNaLhM|rl%3l$2N;Zi$c*NGcWXC>XHx|3e2rCu-2RvVTH`q_Qat|#+3xk4vTS4saB zR)0n-?A)C{iyb#8LSCO^4`xURPfYVQ2I0XOPYRd*kL#N26*|6~RqN(_O6i~1!XmG^ zW}>Xd2GOxr%9H-$FQIqeW|E8eaBv|lLs&eX&JuEdT|9Vmt2S+IEcbw~AEZ3*vcO{K zg8}Y-hL?1Ag^G_YoUZpX<_IBTFQ7N%dL%SI^;DQOi`Z;tkl6r!x<4l*tj(#s?) zZs^TlKb4t_-LAAicdQxW&AuJ6pb#o=x`{0svaEk^$&mHq+p7 zyvccLne_8}ChK=eYwd7e-_t~<&@Kk*_|-H=*ufHdlq;!licMILEn|!yrj9B(!FFh7 zXg))i@qqU{MDw|--3EJ@Z_rS84Qi@u(MOyDNemx0ayj4)!E+)v8!Fo~hPmlb@Zqxe zYWKeRTIt9aN!S;&itBuQzP>D4k&JBuk!$D*Tg4S@shk((>!%#_3n3o_g!*Gkd_*KY zu1=onq~T>qh%rj~+E&T5LlTS5jjF+ziMZ&eNWSME54u0Es$YOXOu$l{ZiP`Uve_$@ zy?+OjY~Q{`(N#;4emqufPP<`_-xm`7r@|rv?c@h?hQenzauz)B*XTZL-9!jUu=LlI zlKiTZCqt254dVl>Nu9`wIrRdprb@1ip>zLY*M0Kw3B=~e7ZV31#0Vpcr$*S8{tb$w`U#;-y%d{`XY_b4%m5h1+wp7qE*{O&8CU8V+jrhvIPRG{UGp5@2 zT2Oh%s82dY_3Jsc4Y6PwyuSBrV5t?^F^OE|`k+i<&0M63@w868cw24 z$;A?FaKYca$-d{czGt?nrS2k(^(kj{cpr}-iK&r4%y9;nZx1dsoE^n?rb+jpgMyOf zgHUQApr@h?7k9cWEUej+r7~OIg*mdKozvORq4D-soNyNBgCbUrJCWT~LG!B{z3Oc+ zvp~kY^*rM$H-d0!&Sn4k4S^cT?sgE1f1a97E{z zyv@|Jqzfubk%-bDCYysIPZN!yB9p2T_?y>(7;&OfIs9D4`o+K7+sRDgCD>}N(4G8# zfyz6^oOZ<`z7wM5h7%?RCs%+Q;n#nZOTh1)X;^E-V{GMo5v+vb9R*!efV5I!)^YB%ikTntA00S+*p9bnC40J&%FxO#8e( zwDQB3xt;Yuj9(7#0F9QvKLa!0|7Qgt>H0L0y^t9iGimqoT;lX z?2sg*eTV<03L9k0y2uf`!O>r; zSn!;e-Df^+hG3)WP-EjL&r`5d%CDEpIy+{6$=puBJa>K2MWwvR0;TvsWE`4n*p2

N6kWJC;0W`ii;7R1W8}#{OCPi)2}~#3q@Sj1 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 NoG||#d;HS%{|Cd}F_-`V diff --git a/kitconcept.png b/kitconcept.png deleted file mode 100644 index 6391c28c148622b7b8c21943631370dfaacaf12d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3059 zcmVv$P)0c;_3PN`~Uy{MPY`($<{VieDL%2m87|Tk*enE?sA8tpRK?zPIri! zvADv}tGLM4+~g@qbJy07q5uF3X-PyuRCwC$o#&RbDinqlkznt+|4ThlER;=CGjV+f ze$1LRI*IU5c6pKL70SO;qR<3^W+;JXC{LqVryivyp@pAIGi~z7t8`5q+W4U~$1d_N z?>;p0BWVuNsnUj4ejv>{KSwi~LNh;)W_1!~ghDevj^-4dE<#?j?6hPHkR zO?;hZQiR5S2F)?Lp@iuBGiVmc9W=W%wDuEd_R%dRglnHbGwtr78D*ile@_$L1T(@R zT>EpHS#(PMLUy=u^Wo{*SWtX*2lnRT1Po;8=QAJMSTWFx~6jdrcqg9jv9Sx%5Fow*ap_BI?%MrM>v{nK+Zc=dbj_D zMI|83mQQmhyG0!99%yZWlAl>rMI)Xp4D`YB6G(yeSk ziDLbJ+7EG@wM{2C;%w%`U$ zB1V!xLvQVf$JAM@)9PkM7@D~V?F`TTre!3L@ZvREAZxM#a*>#9>HPV+@2 zf6-Efdj5&`yC$SgUsr6}B6p!6b=wCo!y}ix7DnorMpv4&P(5%Y^?5{;w(I$MShDw)S&s@;0D_%y zF8%8jnvEk(%3i53W@WvohF+Zl#W80Z8*el&_P;MXqHYiM_y-;5a&^?Gio`S45rdlR+^J-Q+}zH zCM}#h!qLnLXixM!h}4o$>@`No$bSgfB`V=buh2|gXmXLf{qcNWDirH!)>L)?9ch-f z-7ZLv0C5jh!}A{xsCMc&KoX(myRv>R$&?xSbkyD9m3ny#i!OV|eJe;`eH~0Y&Bn5n zkxm~;X}Q5r!$T(JXb!gh;`6h-p*cP0YEQWdL9)w)pwA_m4i0CRtD?&Vu-l$8ASt%d zTpc@L1X*b=-GEq@O=JjWR>1gyX_mGZ2rf?U02In$qWS?oUwV^UGGb19iJ0vuiY`aT zwX@ewO8&=o_SksDWsJLV12dH%xq0uX-CxJlnJpQGfigYq~|Oyk!Gds4CQS!%}5l{Wg`Dw zUrIyp)znX;iWoMxAK(tRP6$I&4gXGMcLD zOH=PSz73+w-V(S+&SC28E!9+_30bf$s0hruoec)1log;ou+e0O8j^5+tnp1-!g7={ z?vy5}OtX`^7mHMLbBxVcccH0u98IFjwN12v`^i1&u>7T)bTliV%?VO5{@gJ1iB3;zrMZsjD6ht;PUChp7HBF$h>||52`Tm)D#^NG zB5+&|({u=cE7e$+tLjM;PCwg3m!>z&w0`N`ShI5h@S*k#HMZnzvfLtuccu9v(0XFg zx(kDDwN*!Jl4*3=oo;=X7t)5z2i_Qhtk%KrbwP$*MVow5rYS7W#|5H71cz|HSz-uGhnaQM^%XkI@O&SF;w zntw_2rUOyJp^cBAdCy@*;Xu`g(7fXyv2fV&Q)u3C$X_^!{4q4IAHbP}Q>Q?aWSXY* z&uPZ*i!_Ho?hlIVnerFClyF+(qi9|{R6ZPg@hF<^Z;tVkkA(6Qnpe*H3upU1ji%Q- z4cz4;q5OvC`7?59@J^mbb2>{ioLBuonr986U;;gorpt?G09P~2v(Ka{>Cc?j%#fmf zEX~)e&IXT?rJ;qNOf!@~Gn7Cxlt44k4CUV_{{e_GClDECC^Y~8002ovPDHLkV1il2 B=1.0.0a2", +] +release = [ + "zest.releaser[recommended]", + "zestreleaser.towncrier", + "zest.pocompile", +] + +[project.urls] +Homepage = "https://github.com/kitconcept/kitconcept.seo" +PyPI = "https://pypi.org/project/kitconcept.seo" +Source = "https://github.com/kitconcept/kitconcept.seo" +Tracker = "https://github.com/kitconcept/kitconcept.seo/issues" + + +[project.entry-points."plone.autoinclude.plugin"] +target = "plone" + +[tool.uv] +managed = false + +[tool.hatch.version] +path = "src/kitconcept/seo/__init__.py" + +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[tool.hatch.build] +strict-naming = true + +[tool.hatch.build.targets.sdist] +exclude = [ + "/.github", +] + +[tool.hatch.build.targets.wheel] +packages = ["src/kitconcept"] + [tool.towncrier] directory = "news/" -filename = "CHANGES.md" +filename = "CHANGELOG.md" start_string = "\n" title_format = "## {version} ({project_date})" +template = "news/.changelog_template.jinja" +issue_format = "[#{issue}](https://github.com/kitconcept/kitconcept.seo/issues/{issue})" underlines = ["", "", ""] [[tool.towncrier.type]] @@ -38,124 +120,68 @@ directory = "tests" name = "Tests" showcontent = true -## -# Add extra configuration options in .meta.toml: -# [pyproject] -# towncrier_extra_lines = """ -# extra_configuration -# """ -## - -[tool.isort] -profile = "plone" - -## -# Add extra configuration options in .meta.toml: -# [pyproject] -# isort_extra_lines = """ -# extra_configuration -# """ -## - -[tool.black] -target-version = ["py38"] - -## -# Add extra configuration options in .meta.toml: -# [pyproject] -# black_extra_lines = """ -# extra_configuration -# """ -## - -[tool.codespell] -ignore-words-list = "discreet,vew" -skip = "*.po,*.min.js" -## -# Add extra configuration options in .meta.toml: -# [pyproject] -# codespell_ignores = "foo,bar" -# codespell_skip = "*.po,*.map,package-lock.json" -## - -[tool.dependencychecker] -Zope = [ - # Zope own provided namespaces - 'App', 'OFS', 'Products.Five', 'Products.OFSP', 'Products.PageTemplates', - 'Products.SiteAccess', 'Shared', 'Testing', 'ZPublisher', 'ZTUtils', - 'Zope2', 'webdav', 'zmi', - # ExtensionClass own provided namespaces - 'ExtensionClass', 'ComputedAttribute', 'MethodObject', - # Zope dependencies - 'AccessControl', 'Acquisition', 'AuthEncoding', 'beautifulsoup4', 'BTrees', - 'cffi', 'Chameleon', 'DateTime', 'DocumentTemplate', - 'MultiMapping', 'multipart', 'PasteDeploy', 'Persistence', 'persistent', - 'pycparser', 'python-gettext', 'pytz', 'RestrictedPython', 'roman', - 'soupsieve', 'transaction', 'waitress', 'WebOb', 'WebTest', 'WSGIProxy2', - 'z3c.pt', 'zc.lockfile', 'ZConfig', 'zExceptions', 'ZODB', 'zodbpickle', - 'zope.annotation', 'zope.browser', 'zope.browsermenu', 'zope.browserpage', - 'zope.browserresource', 'zope.cachedescriptors', 'zope.component', - 'zope.configuration', 'zope.container', 'zope.contentprovider', - 'zope.contenttype', 'zope.datetime', 'zope.deferredimport', - 'zope.deprecation', 'zope.dottedname', 'zope.event', 'zope.exceptions', - 'zope.filerepresentation', 'zope.globalrequest', 'zope.hookable', - 'zope.i18n', 'zope.i18nmessageid', 'zope.interface', 'zope.lifecycleevent', - 'zope.location', 'zope.pagetemplate', 'zope.processlifetime', 'zope.proxy', - 'zope.ptresource', 'zope.publisher', 'zope.schema', 'zope.security', - 'zope.sequencesort', 'zope.site', 'zope.size', 'zope.structuredtext', - 'zope.tal', 'zope.tales', 'zope.testbrowser', 'zope.testing', - 'zope.traversing', 'zope.viewlet' +[tool.ruff] +target-version = "py310" +line-length = 88 +fix = true +lint.select = [ + # flake8-2020 + "YTT", + # flake8-bandit + "S", + # flake8-bugbear + "B", + # flake8-builtins + "A", + # flake8-comprehensions + "C4", + # flake8-debugger + "T10", + # flake8-simplify + "SIM", + # mccabe + "C90", + # pycodestyle + "E", "W", + # pyflakes + "F", + # pygrep-hooks + "PGH", + # pyupgrade + "UP", + # ruff + "RUF", ] -'Products.CMFCore' = [ - 'docutils', 'five.localsitemanager', 'Missing', 'Products.BTreeFolder2', - 'Products.GenericSetup', 'Products.MailHost', 'Products.PythonScripts', - 'Products.StandardCacheManagers', 'Products.ZCatalog', 'Record', - 'zope.sendmail', 'Zope' +lint.ignore = [ + # DoNotAssignLambda + "E731", ] -'plone.base' = [ - 'plone.batching', 'plone.registry', 'plone.schema','plone.z3cform', - 'Products.CMFCore', 'Products.CMFDynamicViewFTI', -] -python-dateutil = ['dateutil'] -ignore-packages = ['zestreleaser.towncrier', 'zest.releaser', 'pytest', 'pytest-cov', 'pytest-plone', 'plone.app.iterate'] -'plone.app.testing' = ['plone.testing'] -'Products.CMFPlone' = ['Products.CMFCore', 'Products.GenericSetup'] - -## -# Add extra configuration options in .meta.toml: -# [pyproject] -# dependencies_ignores = "['zestreleaser.towncrier']" -# dependencies_mappings = [ -# "gitpython = ['git']", -# "pygithub = ['github']", -# ] -# """ -## - -[tool.check-manifest] -ignore = [ - ".editorconfig", - ".meta.toml", - ".pre-commit-config.yaml", - "tox.ini", - ".flake8", - "mx.ini", +[tool.ruff.lint.isort] +case-sensitive = false +no-sections = true +force-single-line = true +from-first = true +lines-after-imports = 2 +lines-between-types = 1 +order-by-type = false + +[tool.ruff.format] +preview = true + +[tool.ruff.lint.per-file-ignores] +"tests/*" = ["E501", "RUF001", "S101"] + +[tool.pytest.ini_options] +testpaths = ["tests"] + +[tool.coverage.run] +source_pkgs = ["kitconcept.seo", "tests"] +branch = true +parallel = true +omit = [ + "src/kitconcept/seo/locales/*.py", ] -## -# Add extra configuration options in .meta.toml: -# [pyproject] -# check_manifest_ignores = """ -# "*.map.js", -# "*.pyc", -# """ -## - - -## -# Add extra configuration options in .meta.toml: -# [pyproject] -# extra_lines = """ -# _your own configuration lines_ -# """ -## + +[tool.zest-releaser] +python-file-with-version = "src/kitconcept/seo/__init__.py" diff --git a/requirements.txt b/requirements.txt index 9dd6dd4..9416c4c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1 @@ --c constraints.txt --e ".[test]" +-c https://dist.plone.org/release/6.1.4/constraints.txt diff --git a/scripts/create_site.py b/scripts/create_site.py new file mode 100644 index 0000000..553a968 --- /dev/null +++ b/scripts/create_site.py @@ -0,0 +1,66 @@ +from AccessControl.SecurityManagement import newSecurityManager +from kitconcept.seo.interfaces import IKitconceptSeoLayer +from Products.CMFPlone.factory import _DEFAULT_PROFILE +from Products.CMFPlone.factory import addPloneSite +from Products.GenericSetup.tool import SetupTool +from Testing.makerequest import makerequest +from zope.interface import directlyProvidedBy +from zope.interface import directlyProvides + +import os +import transaction + + +truthy = frozenset(("t", "true", "y", "yes", "on", "1")) + + +def asbool(s): + """Return the boolean value ``True`` if the case-lowered value of string + input ``s`` is a :term:`truthy string`. If ``s`` is already one of the + boolean values ``True`` or ``False``, return it.""" + if s is None: + return False + if isinstance(s, bool): + return s + s = str(s).strip() + return s.lower() in truthy + + +DELETE_EXISTING = asbool(os.getenv("DELETE_EXISTING")) + +app = makerequest(globals()["app"]) + +request = app.REQUEST + +ifaces = [IKitconceptSeoLayer] +for iface in directlyProvidedBy(request): + ifaces.append(iface) + +directlyProvides(request, *ifaces) + +admin = app.acl_users.getUserById("admin") +admin = admin.__of__(app.acl_users) +newSecurityManager(None, admin) + +site_id = "Plone" +payload = { + "title": "kitconcept.seo", + "profile_id": _DEFAULT_PROFILE, + "distribution_name": "volto", + "setup_content": False, + "default_language": "en", + "portal_timezone": "UTC", +} + +if site_id in app.objectIds() and DELETE_EXISTING: + app.manage_delObjects([site_id]) + transaction.commit() + app._p_jar.sync() + +if site_id not in app.objectIds(): + site = addPloneSite(app, site_id, **payload) + transaction.commit() + + portal_setup: SetupTool = site.portal_setup + portal_setup.runAllImportStepsFromProfile("profile-kitconcept.seo:default") + transaction.commit() diff --git a/setup.py b/setup.py deleted file mode 100644 index cc6ee29..0000000 --- a/setup.py +++ /dev/null @@ -1,77 +0,0 @@ -"""Installer for the kitconcept.seo package.""" - -from pathlib import Path -from setuptools import setup - - -long_description = f""" -{Path("README.md").read_text()}\n -{Path("CONTRIBUTORS.md").read_text()}\n -{Path("CHANGES.md").read_text()}\n -""" - - -setup( - name="kitconcept.seo", - version="2.1.4.dev0", - description="SEO optimizations plugin for Plone", - long_description=long_description, - long_description_content_type="text/markdown", - classifiers=[ - "Development Status :: 5 - Production/Stable", - "Environment :: Web Environment", - "Framework :: Plone", - "Framework :: Plone :: Addon", - "Framework :: Plone :: 6.0", - "Programming Language :: Python", - "Programming Language :: Python :: 3.8", - "Programming Language :: Python :: 3.9", - "Programming Language :: Python :: 3.10", - "Programming Language :: Python :: 3.11", - "Operating System :: OS Independent", - ], - keywords="Python Plone CMS", - author="kitconcept GmbH", - author_email="info@kitconcept.com", - url="https://pypi.python.org/pypi/kitconcept.seo", - project_urls={ - "PyPI": "https://pypi.python.org/pypi/kitconcept.seo", - "Source": "https://github.com/kitconcept/kitconcept.seo", - "Tracker": "https://github.com/kitconcept/kitconcept.seo/issues", - }, - license="GPL version 2", - include_package_data=True, - zip_safe=False, - python_requires=">=3.8", - install_requires=[ - "setuptools", - "Products.CMFPlone", - "plone.app.dexterity", - "plone.autoform", - "plone.behavior", - "plone.dexterity", - "plone.namedfile", - "plone.supermodel", - ], - extras_require={ - "test": [ - "zest.releaser[recommended]", - "zestreleaser.towncrier", - "plone.app.contenttypes[test]", - "plone.app.testing", - "plone.restapi[test]", - # Undeclared dependency of plone.restapi, - # can be removed after next release - "plone.app.iterate", - "pytest", - "pytest-cov", - "pytest-plone>=0.2.0", - ], - }, - entry_points=""" - [z3c.autoinclude.plugin] - target = plone - [console_scripts] - update_dist_locale = kitconcept.seo.locales.update:update_locale - """, -) diff --git a/src/kitconcept/__init__.py b/src/kitconcept/__init__.py deleted file mode 100644 index 26cfe40..0000000 --- a/src/kitconcept/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -from pkgutil import extend_path - - -__path__ = extend_path(__path__, __name__) diff --git a/src/kitconcept/seo/__init__.py b/src/kitconcept/seo/__init__.py index e3d5170..1366aef 100644 --- a/src/kitconcept/seo/__init__.py +++ b/src/kitconcept/seo/__init__.py @@ -1,9 +1,12 @@ """Init and utils.""" + from zope.i18nmessageid import MessageFactory import logging +__version__ = "3.0.0a0.dev0" + PACKAGE_NAME = "kitconcept.seo" _ = MessageFactory(PACKAGE_NAME) diff --git a/src/kitconcept/seo/behaviors/seo.py b/src/kitconcept/seo/behaviors/seo.py index aaf612c..203b79c 100644 --- a/src/kitconcept/seo/behaviors/seo.py +++ b/src/kitconcept/seo/behaviors/seo.py @@ -20,9 +20,6 @@ class ISeo(model.Schema): "seo_description", "seo_noindex", "seo_canonical_url", - # "seo_nofollow", - # "seo_noarchive", - # "seo_nosnippet", "opengraph_title", "opengraph_description", "opengraph_image", @@ -74,40 +71,17 @@ class ISeo(model.Schema): seo_canonical_url = schema.URI( title=_("Canonical URL"), description=_( - "Tells the search engine to choose this URL as the canonical version and crawl that." + "Tells the search engine to choose this URL as the canonical " + "version and crawl that." ), required=False, ) - # # https://support.google.com/webmasters/answer/96569?hl=en - # seo_nofollow = schema.Bool( - # title=_(u"No Follow"), - # description=_(u"Prevents search engines to follow links on this page"), - # required=False, - # ) - - # # https://support.google.com/webmasters/answer/79812?hl=en - # seo_noarchive = schema.Bool( - # title=_(u"No Archive"), - # description=_( - # u"Prevents search engines to store a cached copy of this page"), - # required=False, - # ) - - # # https://support.google.com/webmasters/answer/96569?hl=en - # seo_nosnippet = schema.Bool( - # title=_(u"No Snippet"), - # description=_( - # u"Prevents search engines from displaying a snippet for your page in search results" # noqa - # ), - # required=False, - # ) - opengraph_title = schema.TextLine( title=_("Open Graph Title"), description=_( - "Override the Open Graph title, that Facebook and Twitter use. When empty the default title will " - + "be used. Use maximum 60 characters." + "Override the Open Graph title, that Facebook and Twitter use. When empty " + "the default title will be used. Use maximum 60 characters." ), required=False, ) @@ -115,8 +89,9 @@ class ISeo(model.Schema): opengraph_description = schema.TextLine( title=_("Open Graph Description"), description=_( - "Override the Open Graph description, that Facebook and Twitter use. When empty the default " - + "description will be used. Use maximum 155 characters." + "Override the Open Graph description, that Facebook and Twitter use. " + "When empty the default description will be used. " + "Use maximum 155 characters." ), required=False, ) @@ -124,8 +99,9 @@ class ISeo(model.Schema): opengraph_image = NamedBlobImage( title=_("Open Graph Image"), description=_( - "Override the Open Graph image, that Facebook and Twitter use. When empty the default " - + "lead image will be used. Recommended image ratio is 1,91:1 and 1200 x 630px." + "Override the Open Graph image, that Facebook and Twitter use. " + "When empty the default lead image will be used. Recommended image " + "ratio is 1,91:1 and 1200 x 630px." ), required=False, ) diff --git a/src/kitconcept/seo/locales/__main__.py b/src/kitconcept/seo/locales/__main__.py new file mode 100644 index 0000000..a5677b6 --- /dev/null +++ b/src/kitconcept/seo/locales/__main__.py @@ -0,0 +1,69 @@ +"""Update locales.""" + +from pathlib import Path + +import logging +import re +import subprocess + + +logger = logging.getLogger("i18n") +logger.setLevel(logging.DEBUG) + + +PATTERN = r"^[a-z]{2}.*" + +locale_path = Path(__file__).parent.resolve() +target_path = locale_path.parent.resolve() +domains = [path.name[:-4] for path in locale_path.glob("*.pot")] + +i18ndude = "uvx i18ndude" + +# ignore node_modules files resulting in errors +excludes = '"*.html *json-schema*.xml"' + + +def locale_folder_setup(domain: str): + languages = [path for path in locale_path.glob("*") if path.is_dir()] + for lang_folder in languages: + lc_messages_path = lang_folder / "LC_MESSAGES" + lang = lang_folder.name + if lc_messages_path.exists(): + continue + elif re.match(PATTERN, lang): + lc_messages_path.mkdir() + cmd = ( + f"msginit --locale={lang} " + f"--input={locale_path}/{domain}.pot " + f"--output={locale_path}/{lang}/LC_MESSAGES/{domain}.po" + ) + subprocess.call(cmd, shell=True) # noQA: S602 + + +def _rebuild(domain: str): + cmd = ( + f"{i18ndude} rebuild-pot --pot {locale_path}/{domain}.pot " + f"--exclude {excludes} " + f"--create {domain} {target_path}" + ) + subprocess.call(cmd, shell=True) # noQA: S602 + + +def _sync(domain: str): + cmd = ( + f"{i18ndude} sync --pot {locale_path}/{domain}.pot " + f"{locale_path}/*/LC_MESSAGES/{domain}.po" + ) + subprocess.call(cmd, shell=True) # noQA: S602 + + +def main(): + for domain in domains: + logger.info(f"Updating translations for {domain}") + locale_folder_setup(domain) + _rebuild(domain) + _sync(domain) + + +if __name__ == "__main__": + main() diff --git a/src/kitconcept/seo/locales/update.sh b/src/kitconcept/seo/locales/update.sh deleted file mode 100755 index e171378..0000000 --- a/src/kitconcept/seo/locales/update.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash -# i18ndude should be available in current $PATH (eg by running -# ``export PATH=$PATH:$BUILDOUT_DIR/bin`` when i18ndude is located in your buildout's bin directory) -# -# For every language you want to translate into you need a -# locales/[language]/LC_MESSAGES/kitconcept.seo.po -# (e.g. locales/de/LC_MESSAGES/kitconcept.seo.po) - -domain=kitconcept.seo - -i18ndude rebuild-pot --pot $domain.pot --create $domain ../ -i18ndude sync --pot $domain.pot */LC_MESSAGES/$domain.po diff --git a/src/kitconcept/seo/testing.py b/src/kitconcept/seo/testing.py index 1754799..833a988 100644 --- a/src/kitconcept/seo/testing.py +++ b/src/kitconcept/seo/testing.py @@ -5,7 +5,7 @@ from plone.app.testing import PloneSandboxLayer from plone.testing.zope import WSGI_SERVER_FIXTURE -import kitconcept.seo # noQA +import kitconcept.seo class Layer(PloneSandboxLayer): diff --git a/tests/test_behavior.py b/tests/behaviors/test_behavior.py similarity index 87% rename from tests/test_behavior.py rename to tests/behaviors/test_behavior.py index abd93a8..f374a1b 100644 --- a/tests/test_behavior.py +++ b/tests/behaviors/test_behavior.py @@ -1,7 +1,8 @@ def test_seo_behavior_fields(manager_plone_client): # Enable behavior for pages manager_plone_client.patch( - "++api++/@controlpanels/dexterity-types/Document", json={"kitconcept.seo": True} + "++api++/@controlpanels/dexterity-types/Document", + json={"kitconcept.seo": True}, ) # Check schema @@ -26,7 +27,8 @@ def test_seo_behavior_fields(manager_plone_client): def test_noindex_sets_response_header(manager_plone_client): # Enable behavior for pages manager_plone_client.patch( - "++api++/@controlpanels/dexterity-types/Document", json={"kitconcept.seo": True} + "++api++/@controlpanels/dexterity-types/Document", + json={"kitconcept.seo": True}, ) # Add page diff --git a/tests/conftest.py b/tests/conftest.py index 1a31697..08c538b 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -12,12 +12,10 @@ globals().update( - fixtures_factory( - ( - (FUNCTIONAL_TESTING, "functional"), - (INTEGRATION_TESTING, "integration"), - ) - ) + fixtures_factory(( + (FUNCTIONAL_TESTING, "functional"), + (INTEGRATION_TESTING, "integration"), + )) ) diff --git a/tox.ini b/tox.ini deleted file mode 100644 index bb98e04..0000000 --- a/tox.ini +++ /dev/null @@ -1,211 +0,0 @@ -# Generated from: -# https://github.com/plone/meta/tree/master/config/default -# See the inline comments on how to expand/tweak this configuration file -[tox] -# We need 4.4.0 for constrain_package_deps. -min_version = 4.4.0 -envlist = - lint - test - dependencies - - -## -# Add extra configuration options in .meta.toml: -# [tox] -# envlist_lines = """ -# my_other_environment -# """ -# config_lines = """ -# my_extra_top_level_tox_configuration_lines -# """ -## - -[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 - -[testenv:init] -description = Prepare environment -skip_install = true -deps = - mxdev -commands = - mxdev -c mx.ini - echo "Initial setup for mxdev" - - -[testenv:format] -description = automatically reformat code -skip_install = true -deps = - pre-commit -commands = - pre-commit run -a pyupgrade - pre-commit run -a isort - pre-commit run -a black - pre-commit run -a zpretty - -[testenv:lint] -description = run linters that will help improve the code style -skip_install = true -deps = - pre-commit -commands = - pre-commit run -a - -[testenv:dependencies] -description = check if the package defines all its dependencies -skip_install = true -deps = - build - z3c.dependencychecker==2.11 -commands = - python -m build --sdist --no-isolation - dependencychecker - -[testenv:dependencies-graph] -description = generate a graph out of the dependencies of the package -skip_install = false -allowlist_externals = - sh -deps = - pipdeptree==2.5.1 - graphviz # optional dependency of pipdeptree -commands = - sh -c 'pipdeptree --exclude setuptools,wheel,pipdeptree,zope.interface,zope.component --graph-output svg > dependencies.svg' - -[testenv:test] -description = run the tests -use_develop = true -skip_install = false -constrain_package_deps = true -set_env = - ROBOT_BROWSER=headlesschrome - -## -# Specify extra test environment variables in .meta.toml: -# [tox] -# test_environment_variables = """ -# PIP_EXTRA_INDEX_URL=https://my-pypi.my-server.com/ -# """ -# -# Set constrain_package_deps .meta.toml: -# [tox] -# constrain_package_deps = false -## -deps = - pytest-plone - pytest - -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] -# """ -# -# Specify a custom constraints file in .meta.toml: -# [tox] -# constraints_file = "https://my-server.com/constraints.txt" -## -commands = - pytest --disable-warnings {posargs} {toxinidir}/tests -extras = - test - - -[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/ -# """ -# -# Set constrain_package_deps .meta.toml: -# [tox] -# constrain_package_deps = "false" -## -deps = - pytest-plone - pytest - coverage - -c https://dist.plone.org/release/6.0-dev/constraints.txt - -commands = - coverage run --source kitconcept.seo -m pytest {posargs} --disable-warnings {toxinidir}/tests - coverage report -m --format markdown - coverage xml -extras = - test - - -[testenv:release-check] -description = ensure that the package is ready to release -skip_install = true -deps = - twine - build - towncrier - -c https://dist.plone.org/release/6.0-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 --no-isolation - twine check dist/* - -[testenv:circular] -description = ensure there are no cyclic dependencies -use_develop = true -skip_install = false -set_env = - -## -# Specify extra test environment variables in .meta.toml: -# [tox] -# test_environment_variables = """ -# PIP_EXTRA_INDEX_URL=https://my-pypi.my-server.com/ -# """ -## -allowlist_externals = - sh -deps = - pipdeptree - pipforester - -c https://dist.plone.org/release/6.0-dev/constraints.txt - -commands = - # Generate the full dependency tree - sh -c 'pipdeptree -j > forest.json' - # Generate a DOT graph with the circular dependencies, if any - pipforester -i forest.json -o forest.dot --cycles - # Report if there are any circular dependencies, i.e. error if there are any - pipforester -i forest.json --check-cycles -o /dev/null - - -## -# Add extra configuration options in .meta.toml: -# [tox] -# extra_lines = """ -# _your own configuration lines_ -# """ -## From 8aa0f5d6cbea49818936250bbe0e03e2ba2558ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89rico=20Andrei?= Date: Tue, 27 Jan 2026 10:44:09 -0300 Subject: [PATCH 2/8] Increate test coverage. --- tests/behaviors/conftest.py | 83 ++++++++++++++++++++++++ tests/behaviors/test_behavior.py | 106 +++++++++++++++++-------------- tests/conftest.py | 13 ---- 3 files changed, 140 insertions(+), 62 deletions(-) create mode 100644 tests/behaviors/conftest.py diff --git a/tests/behaviors/conftest.py b/tests/behaviors/conftest.py new file mode 100644 index 0000000..f2d912b --- /dev/null +++ b/tests/behaviors/conftest.py @@ -0,0 +1,83 @@ +from plone.app.testing import setRoles +from plone.app.testing import SITE_OWNER_NAME +from plone.app.testing import SITE_OWNER_PASSWORD +from plone.app.testing import TEST_USER_ID +from plone.dexterity.fti import DexterityFTI +from plone.restapi.testing import RelativeSession +from zope.component.hooks import setSite + +import pytest +import transaction + + +@pytest.fixture() +def request_factory(portal): + def factory(mimetype: str = "application/json") -> RelativeSession: + url = portal.absolute_url() + api_session = RelativeSession(url) + api_session.headers.update({"Accept": mimetype}) + return api_session + + return factory + + +@pytest.fixture() +def anon_request(request_factory) -> RelativeSession: + return request_factory() + + +@pytest.fixture() +def manager_request(request_factory): + request = request_factory() + request.auth = (SITE_OWNER_NAME, SITE_OWNER_PASSWORD) + yield request + request.auth = () + + +@pytest.fixture() +def manager_html_request(request_factory): + request = request_factory("text/html") + request.auth = (SITE_OWNER_NAME, SITE_OWNER_PASSWORD) + yield request + request.auth = () + + +@pytest.fixture +def portal(functional): + return functional["portal"] + + +@pytest.fixture +def portal_factory(functional): + def func(behavior: str): + portal = functional["portal"] + setRoles(portal, TEST_USER_ID, ["Manager"]) + fti = DexterityFTI("DummyType") + fti.behaviors = (behavior,) + portal.portal_types._setObject("DummyType", fti) + setSite(portal) + transaction.commit() + return portal + + return func + + +@pytest.fixture +def dummy_type_schema(manager_request): + def func(): + url = "/@types/DummyType" + response = manager_request.get(url) + data = response.json() + return data + + return func + + +@pytest.fixture +def create_dummy_content(manager_request): + def func(payload: dict): + payload["@type"] = "DummyType" + response = manager_request.post("/", json=payload) + return response + + return func diff --git a/tests/behaviors/test_behavior.py b/tests/behaviors/test_behavior.py index f374a1b..ea76b88 100644 --- a/tests/behaviors/test_behavior.py +++ b/tests/behaviors/test_behavior.py @@ -1,49 +1,57 @@ -def test_seo_behavior_fields(manager_plone_client): - # Enable behavior for pages - manager_plone_client.patch( - "++api++/@controlpanels/dexterity-types/Document", - json={"kitconcept.seo": True}, - ) - - # Check schema - schema = manager_plone_client.get("++api++/@types/Document").json() - assert schema["fieldsets"][-1] == { - "behavior": "plone", - "description": "", - "fields": [ - "seo_title", - "seo_description", - "seo_noindex", - "seo_canonical_url", - "opengraph_title", - "opengraph_description", - "opengraph_image", - ], - "id": "seo", - "title": "SEO", - } - - -def test_noindex_sets_response_header(manager_plone_client): - # Enable behavior for pages - manager_plone_client.patch( - "++api++/@controlpanels/dexterity-types/Document", - json={"kitconcept.seo": True}, - ) - - # Add page - resp = manager_plone_client.post( - "++api++/", - json={"@type": "Document", "title": "Test page", "seo_noindex": True}, - ) - assert resp.status_code == 201 - - # Confirm the page is served with X-Robots-Tag header - resp = manager_plone_client.get("/test-page") - assert resp.status_code == 200 - assert resp.headers["X-Robots-Tag"] == "noindex" - - # Confirm views of the page are served with X-Robots-Tag header - resp = manager_plone_client.get("/test-page/@@view") - assert resp.status_code == 200 - assert resp.headers["X-Robots-Tag"] == "noindex" +from copy import deepcopy +from kitconcept.seo import PACKAGE_NAME + +import pytest + + +PAYLOAD = { + "seo_title": "Foo Bar", + "seo_description": "Lorem ipsum dolor sit amet", + "seo_noindex": False, + "seo_canonical_url": "https://example.com/canonical-url", + "opengraph_title": "Open Graph Title", + "opengraph_description": "Open Graph Description", + "opengraph_image": None, +} + + +@pytest.fixture +def payload() -> dict: + data = deepcopy(PAYLOAD) + return data + + +class TestBehaviorContato: + name: str = f"{PACKAGE_NAME}" + + @pytest.fixture(autouse=True) + def _setup(self, portal_factory, dummy_type_schema, manager_html_request): + self.portal = portal_factory(behavior=self.name) + self.schema = dummy_type_schema() + self.request = manager_html_request + + @pytest.mark.parametrize("key", PAYLOAD.keys()) + def test_behavior_schema(self, key: str): + assert key in self.schema["properties"] + + def test_behavior_data(self, payload: dict, create_dummy_content): + response = create_dummy_content(payload) + assert response.status_code == 201 + + def test_noindex_sets_response_header(self): + # Add page + resp = self.request.post( + "++api++/", + json={"@type": "DummyType", "title": "Test page", "seo_noindex": True}, + ) + assert resp.status_code == 201 + + # Confirm the page is served with X-Robots-Tag header + resp = self.request.get("/test-page") + assert resp.status_code == 200 + assert resp.headers["X-Robots-Tag"] == "noindex" + + # Confirm views of the page are served with X-Robots-Tag header + resp = self.request.get("/test-page/@@view") + assert resp.status_code == 200 + assert resp.headers["X-Robots-Tag"] == "noindex" diff --git a/tests/conftest.py b/tests/conftest.py index 08c538b..a7d93b1 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,12 +1,7 @@ from kitconcept.seo.testing import FUNCTIONAL_TESTING from kitconcept.seo.testing import INTEGRATION_TESTING -from plone.app.testing import SITE_OWNER_NAME -from plone.app.testing import SITE_OWNER_PASSWORD -from plone.restapi.testing import RelativeSession from pytest_plone import fixtures_factory -import pytest - pytest_plugins = ["pytest_plone"] @@ -17,11 +12,3 @@ (INTEGRATION_TESTING, "integration"), )) ) - - -@pytest.fixture -def manager_plone_client(functional): - portal = functional["portal"] - api_session = RelativeSession(f"{portal.absolute_url()}") - api_session.auth = (SITE_OWNER_NAME, SITE_OWNER_PASSWORD) - return api_session From 26cb760d49f6a1053f8985448c8b56b59a44d3cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89rico=20Andrei?= Date: Tue, 27 Jan 2026 10:45:26 -0300 Subject: [PATCH 3/8] Test on Plone 6.2 --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 63402f8..9798341 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -24,7 +24,7 @@ jobs: strategy: matrix: python-version: ["3.13", "3.12", "3.11", "3.10"] - plone-version: ["6.1-latest", "6.0-latest"] + plone-version: ["6.2-latest", "6.1-latest", "6.0-latest"] with: python-version: ${{ matrix.python-version }} plone-version: ${{ matrix.plone-version }} From cb10a19c81e994d5e2e85ef86c55d48087cf2986 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89rico=20Andrei?= Date: Tue, 27 Jan 2026 10:47:12 -0300 Subject: [PATCH 4/8] Update changelog --- news/+changelog.internal | 1 + news/+plone6.1.feature | 1 + news/+plone6.2.feature | 1 + news/+py312.feature | 1 + news/+py313.feature | 1 + news/+py38.breaking | 1 + news/+py39.breaking | 1 + news/2.internal | 1 + news/2.tests | 1 + 9 files changed, 9 insertions(+) create mode 100644 news/+changelog.internal create mode 100644 news/+plone6.1.feature create mode 100644 news/+plone6.2.feature create mode 100644 news/+py312.feature create mode 100644 news/+py313.feature create mode 100644 news/+py38.breaking create mode 100644 news/+py39.breaking create mode 100644 news/2.internal create mode 100644 news/2.tests diff --git a/news/+changelog.internal b/news/+changelog.internal new file mode 100644 index 0000000..3000624 --- /dev/null +++ b/news/+changelog.internal @@ -0,0 +1 @@ +Add GHA checking for changelog entry on pull requests. @ericof diff --git a/news/+plone6.1.feature b/news/+plone6.1.feature new file mode 100644 index 0000000..18e876d --- /dev/null +++ b/news/+plone6.1.feature @@ -0,0 +1 @@ +Add support for Plone 6.1. @ericof diff --git a/news/+plone6.2.feature b/news/+plone6.2.feature new file mode 100644 index 0000000..8019a00 --- /dev/null +++ b/news/+plone6.2.feature @@ -0,0 +1 @@ +Add support for Plone 6.2. @ericof diff --git a/news/+py312.feature b/news/+py312.feature new file mode 100644 index 0000000..1bc2f53 --- /dev/null +++ b/news/+py312.feature @@ -0,0 +1 @@ +Add support for Python 3.12. @ericof diff --git a/news/+py313.feature b/news/+py313.feature new file mode 100644 index 0000000..0a29f32 --- /dev/null +++ b/news/+py313.feature @@ -0,0 +1 @@ +Add support for Python 3.13. @ericof diff --git a/news/+py38.breaking b/news/+py38.breaking new file mode 100644 index 0000000..b7d72b6 --- /dev/null +++ b/news/+py38.breaking @@ -0,0 +1 @@ +Drop support for Python 3.8. @ericof diff --git a/news/+py39.breaking b/news/+py39.breaking new file mode 100644 index 0000000..0af81ff --- /dev/null +++ b/news/+py39.breaking @@ -0,0 +1 @@ +Drop support for Python 3.9. @ericof diff --git a/news/2.internal b/news/2.internal new file mode 100644 index 0000000..a286fbf --- /dev/null +++ b/news/2.internal @@ -0,0 +1 @@ +Update codebase to the latest standard for Plone backend addons. @ericof diff --git a/news/2.tests b/news/2.tests new file mode 100644 index 0000000..816c319 --- /dev/null +++ b/news/2.tests @@ -0,0 +1 @@ +Increase test coverage for the package. @ericof From 4a7eba00210e0b6b9fe86a4acf1165af1609ccff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89rico=20Andrei?= Date: Wed, 28 Jan 2026 09:09:59 -0300 Subject: [PATCH 5/8] GHa: Update Python to version 3.13 --- .github/workflows/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/config.yml b/.github/workflows/config.yml index 60f22ed..e286a31 100644 --- a/.github/workflows/config.yml +++ b/.github/workflows/config.yml @@ -6,7 +6,7 @@ on: python-version: required: false type: string - default: "3.12" + default: "3.13" plone-version: required: false type: string From 0485a4a14327997a8194c03ac0d8b27f98b56ce8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89rico=20Andrei?= Date: Wed, 28 Jan 2026 09:12:18 -0300 Subject: [PATCH 6/8] Fix typo in the description of an attribute of the behavior --- src/kitconcept/seo/behaviors/seo.py | 2 +- .../locales/de/LC_MESSAGES/kitconcept.seo.po | 61 +++++++++-------- .../locales/es/LC_MESSAGES/kitconcept.seo.po | 66 +++++++++---------- .../locales/it/LC_MESSAGES/kitconcept.seo.po | 64 +++++++++--------- src/kitconcept/seo/locales/kitconcept.seo.pot | 60 ++++++++--------- 5 files changed, 126 insertions(+), 127 deletions(-) diff --git a/src/kitconcept/seo/behaviors/seo.py b/src/kitconcept/seo/behaviors/seo.py index 203b79c..eac085a 100644 --- a/src/kitconcept/seo/behaviors/seo.py +++ b/src/kitconcept/seo/behaviors/seo.py @@ -101,7 +101,7 @@ class ISeo(model.Schema): description=_( "Override the Open Graph image, that Facebook and Twitter use. " "When empty the default lead image will be used. Recommended image " - "ratio is 1,91:1 and 1200 x 630px." + "ratio is 1.91:1 and 1200 x 630px." ), required=False, ) diff --git a/src/kitconcept/seo/locales/de/LC_MESSAGES/kitconcept.seo.po b/src/kitconcept/seo/locales/de/LC_MESSAGES/kitconcept.seo.po index b4d365a..3e1193a 100644 --- a/src/kitconcept/seo/locales/de/LC_MESSAGES/kitconcept.seo.po +++ b/src/kitconcept/seo/locales/de/LC_MESSAGES/kitconcept.seo.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"POT-Creation-Date: 2020-03-24 14:11+0000\n" +"POT-Creation-Date: 2026-01-28 12:10+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI +ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -14,87 +14,86 @@ msgstr "" "Preferred-Encodings: utf-8 latin1\n" "Domain: DOMAIN\n" -#: kitconcept/seo/behaviors/seo.py:62 +#: kitconcept/seo/behaviors/seo.py:72 msgid "Canonical URL" msgstr "" -#: kitconcept/seo/behaviors/seo.py:44 +#: kitconcept/seo/behaviors/seo.py:55 msgid "Description" msgstr "Beschreibung" -#: kitconcept/seo/behaviors/configure.zcml:17 +#: kitconcept/seo/behaviors/configure.zcml:21 msgid "Enhances a content type with fields for Search Engine Optimizations" msgstr "Erweitert einen Inhaltstyp um Felder fรผr die Suchmaschinenoptimierung" -#: kitconcept/seo/configure.zcml:22 +#: kitconcept/seo/profiles.zcml:13 msgid "Installs the kitconcept.seo add-on." msgstr "Installiert das kitconcept.seo Add-on" -#: kitconcept/seo/behaviors/seo.py:55 +#: kitconcept/seo/behaviors/seo.py:65 msgid "No Index" msgstr "" -#: kitconcept/seo/behaviors/seo.py:104 +#: kitconcept/seo/behaviors/seo.py:90 msgid "Open Graph Description" msgstr "Open Graph Beschreibung" -#: kitconcept/seo/behaviors/seo.py:114 +#: kitconcept/seo/behaviors/seo.py:100 msgid "Open Graph Image" msgstr "Open Graph Bild" -#: kitconcept/seo/behaviors/seo.py:94 +#: kitconcept/seo/behaviors/seo.py:81 msgid "Open Graph Title" msgstr "Open Graph Titel" -#: kitconcept/seo/behaviors/seo.py:105 +#: kitconcept/seo/behaviors/seo.py:91 msgid "Override the Open Graph description, that Facebook and Twitter use. When empty the default description will be used. Use maximum 155 characters." msgstr "รœberschreibt die Open Graph Beschreibung, die von Facebook und Twitter genutzt wird. Wenn dieses Feld leer ist wird das Standard Beschreibung Feld verwendet. Empfohlene Lรคnge: 155 Zeichen." -#: kitconcept/seo/behaviors/seo.py:115 -msgid "Override the Open Graph image, that Facebook and Twitter use. When empty the default lead image will be used. Recommended image ratio is 1,91:1 and 1200 x 630px." -msgstr "รœberschreibt das Open Graph Bild, welches von Facebook und Twitter genutzt wird. Wenn dieses Feld leer ist wird das Lead Image Feld verwendet." - +#: kitconcept/seo/behaviors/seo.py:101 +msgid "Override the Open Graph image, that Facebook and Twitter use. When empty the default lead image will be used. Recommended image ratio is 1.91:1 and 1200 x 630px." +msgstr "" -#: kitconcept/seo/behaviors/seo.py:95 +#: kitconcept/seo/behaviors/seo.py:82 msgid "Override the Open Graph title, that Facebook and Twitter use. When empty the default title will be used. Use maximum 60 characters." msgstr "รœberschreibt den Open Graph Titel, der von Facebook und Twitter genutzt wird. Wenn dieses Feld leer ist wird das Standard Titel Feld verwendet. Empfohlene Lรคnge: 60 Zeichen." -#: kitconcept/seo/behaviors/seo.py:45 -msgid "Override the meta description. When empty the default description will be used. Use maximum 150 characters." -msgstr "รœberschreibt die Meta-Beschreibung." +#: kitconcept/seo/behaviors/seo.py:56 +msgid "Override the meta description. When empty the default description will be used. Use maximum 155 characters." +msgstr "" -#: kitconcept/seo/behaviors/seo.py:35 -msgid "Override the meta title. When empty the default title will be used. Use maximum 50 characters." -msgstr "รœberschreibt den Meta-Titel." +#: kitconcept/seo/behaviors/seo.py:39 +msgid "Override the meta title. When empty the default title will be used. Use maximum 55 characters." +msgstr "" -#: kitconcept/seo/behaviors/seo.py:56 +#: kitconcept/seo/behaviors/seo.py:66 msgid "Prevents a page from appearing in search engines" msgstr "SchlieรŸt die aktuelle Seite vom Suchmaschinen-Index aus." -#: kitconcept/seo/behaviors/seo.py:18 +#: kitconcept/seo/behaviors/seo.py:17 msgid "SEO" msgstr "" -#: kitconcept/seo/behaviors/configure.zcml:17 +#: kitconcept/seo/behaviors/configure.zcml:21 msgid "SEO Behavior" msgstr "" -#: kitconcept/seo/behaviors/seo.py:63 +#: kitconcept/seo/behaviors/seo.py:73 msgid "Tells the search engine to choose this URL as the canonical version and crawl that." msgstr "Teil der Suchmaschine mit dass die hier hinterlegte URL die kanonische Version ist, die gecrawlt werden soll." -#: kitconcept/seo/behaviors/seo.py:34 +#: kitconcept/seo/behaviors/seo.py:38 msgid "Title" msgstr "Titel" -#: kitconcept/seo/configure.zcml:31 +#: kitconcept/seo/profiles.zcml:21 msgid "Uninstalls the kitconcept.seo add-on." msgstr "Deinstalliert das kitconcept.seo Add-On" -#: kitconcept/seo/configure.zcml:22 -msgid "kitconcept.seo" +#: kitconcept/seo/profiles.zcml:13 +msgid "kitconcept seo: Install" msgstr "" -#: kitconcept/seo/configure.zcml:31 -msgid "kitconcept.seo (uninstall)" +#: kitconcept/seo/profiles.zcml:21 +msgid "kitconcept seo: Uninstall" msgstr "" diff --git a/src/kitconcept/seo/locales/es/LC_MESSAGES/kitconcept.seo.po b/src/kitconcept/seo/locales/es/LC_MESSAGES/kitconcept.seo.po index 34efcb5..ed80edd 100644 --- a/src/kitconcept/seo/locales/es/LC_MESSAGES/kitconcept.seo.po +++ b/src/kitconcept/seo/locales/es/LC_MESSAGES/kitconcept.seo.po @@ -3,11 +3,10 @@ msgid "" msgstr "" "Project-Id-Version: kitconcept.seo\n" -"POT-Creation-Date: 2020-03-24 14:11+0000\n" +"POT-Creation-Date: 2026-01-28 12:10+0000\n" "PO-Revision-Date: 2025-07-16 12:42+0200\n" "Last-Translator: Leonardo J. Caballero G. \n" "Language-Team: Plone i18n \n" -"Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -16,89 +15,90 @@ msgstr "" "Language-Name: Espaรฑol\n" "Preferred-Encodings: utf-8 latin1\n" "Domain: kitconcept.seo\n" +"Language: es\n" "X-Generator: Poedit 3.6\n" "X-Is-Fallback-For: es-ar es-bo es-cl es-co es-cr es-do es-ec es-es es-sv es-gt es-hn es-mx es-ni es-pa es-py es-pe es-pr es-us es-uy es-ve\n" -#: kitconcept/seo/behaviors/seo.py:62 +#: kitconcept/seo/behaviors/seo.py:72 msgid "Canonical URL" msgstr "URL canรณnica" -#: kitconcept/seo/behaviors/seo.py:44 +#: kitconcept/seo/behaviors/seo.py:55 msgid "Description" msgstr "Descripciรณn" -#: kitconcept/seo/behaviors/configure.zcml:17 +#: kitconcept/seo/behaviors/configure.zcml:21 msgid "Enhances a content type with fields for Search Engine Optimizations" msgstr "Aรฑade campos adicionales a los tipos de contenido para SEO" -#: kitconcept/seo/configure.zcml:22 +#: kitconcept/seo/profiles.zcml:13 msgid "Installs the kitconcept.seo add-on." msgstr "Instala el complemento kitconcept.seo." -#: kitconcept/seo/behaviors/seo.py:55 +#: kitconcept/seo/behaviors/seo.py:65 msgid "No Index" msgstr "Sin รญndice" -#: kitconcept/seo/behaviors/seo.py:104 +#: kitconcept/seo/behaviors/seo.py:90 msgid "Open Graph Description" msgstr "Descripciรณn de Open Graph" -#: kitconcept/seo/behaviors/seo.py:114 +#: kitconcept/seo/behaviors/seo.py:100 msgid "Open Graph Image" msgstr "Imagen Open Graph" -#: kitconcept/seo/behaviors/seo.py:94 +#: kitconcept/seo/behaviors/seo.py:81 msgid "Open Graph Title" msgstr "Tรญtulo de Open Graph" -#: kitconcept/seo/behaviors/seo.py:105 +#: kitconcept/seo/behaviors/seo.py:91 msgid "Override the Open Graph description, that Facebook and Twitter use. When empty the default description will be used. Use maximum 155 characters." msgstr "Sobrescribe la descripciรณn para Open Graph, utilizada por Facebook y Twitter. Si estรก vacรญa, se utilizarรก la descripciรณn del contenido. Debe utilizarse un mรกximo de 155 caracteres." -#: kitconcept/seo/behaviors/seo.py:115 -msgid "Override the Open Graph image, that Facebook and Twitter use. When empty the default lead image will be used. Recommended image ratio is 1,91:1 and 1200 x 630px." -msgstr "Sobrescribe la imagen para Open Graph, utilizada por Facebook y Twitter. Si estรก vacรญa, se utilizarรก la imagen de contenido (si estรก presente). La proporciรณn recomendada es 1,91:1 y 1200 x 630px." +#: kitconcept/seo/behaviors/seo.py:101 +msgid "Override the Open Graph image, that Facebook and Twitter use. When empty the default lead image will be used. Recommended image ratio is 1.91:1 and 1200 x 630px." +msgstr "" -#: kitconcept/seo/behaviors/seo.py:95 +#: kitconcept/seo/behaviors/seo.py:82 msgid "Override the Open Graph title, that Facebook and Twitter use. When empty the default title will be used. Use maximum 60 characters." msgstr "Sobrescribe el tรญtulo para Open Graph, utilizado por Facebook y Twitter. Si estรก vacรญo, se utilizarรก el tรญtulo del contenido. Debe utilizarse un mรกximo de 60 caracteres." -#: kitconcept/seo/behaviors/seo.py:45 -msgid "Override the meta description. When empty the default description will be used. Use maximum 150 characters." -msgstr "Sobrescribe la etiqueta meta description. Si estรก vacรญa, se utilizarรก la descripciรณn del contenido. Debe utilizarse un mรกximo de 150 caracteres." +#: kitconcept/seo/behaviors/seo.py:56 +msgid "Override the meta description. When empty the default description will be used. Use maximum 155 characters." +msgstr "" -#: kitconcept/seo/behaviors/seo.py:35 -msgid "Override the meta title. When empty the default title will be used. Use maximum 50 characters." -msgstr "Sobrescribe la etiqueta meta title. Si estรก vacรญa, se utilizarรก el tรญtulo del contenido. Debe utilizarse un mรกximo de 50 caracteres." +#: kitconcept/seo/behaviors/seo.py:39 +msgid "Override the meta title. When empty the default title will be used. Use maximum 55 characters." +msgstr "" -#: kitconcept/seo/behaviors/seo.py:56 +#: kitconcept/seo/behaviors/seo.py:66 msgid "Prevents a page from appearing in search engines" msgstr "Impide que la pรกgina sea indexada por los motores de bรบsqueda" -#: kitconcept/seo/behaviors/seo.py:18 +#: kitconcept/seo/behaviors/seo.py:17 msgid "SEO" msgstr "SEO" -#: kitconcept/seo/behaviors/configure.zcml:17 +#: kitconcept/seo/behaviors/configure.zcml:21 msgid "SEO Behavior" msgstr "Comportamiento SEO" -#: kitconcept/seo/behaviors/seo.py:63 +#: kitconcept/seo/behaviors/seo.py:73 msgid "Tells the search engine to choose this URL as the canonical version and crawl that." msgstr "Indica a los motores de bรบsqueda que utilicen la URL proporcionada como versiรณn canรณnica del contenido actual, y que indexen ese contenido en consecuencia." -#: kitconcept/seo/behaviors/seo.py:34 +#: kitconcept/seo/behaviors/seo.py:38 msgid "Title" msgstr "Tรญtulo" -#: kitconcept/seo/configure.zcml:31 +#: kitconcept/seo/profiles.zcml:21 msgid "Uninstalls the kitconcept.seo add-on." msgstr "Desinstala el complemento kitconcept.seo." -#: kitconcept/seo/configure.zcml:22 -msgid "kitconcept.seo" -msgstr "kitconcept.seo" +#: kitconcept/seo/profiles.zcml:13 +msgid "kitconcept seo: Install" +msgstr "" -#: kitconcept/seo/configure.zcml:31 -msgid "kitconcept.seo (uninstall)" -msgstr "kitconcept.seo (desinstalar)" +#: kitconcept/seo/profiles.zcml:21 +msgid "kitconcept seo: Uninstall" +msgstr "" diff --git a/src/kitconcept/seo/locales/it/LC_MESSAGES/kitconcept.seo.po b/src/kitconcept/seo/locales/it/LC_MESSAGES/kitconcept.seo.po index 02de6d2..1bc917e 100644 --- a/src/kitconcept/seo/locales/it/LC_MESSAGES/kitconcept.seo.po +++ b/src/kitconcept/seo/locales/it/LC_MESSAGES/kitconcept.seo.po @@ -4,7 +4,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"POT-Creation-Date: 2020-03-24 14:11+0000\n" +"POT-Creation-Date: 2026-01-28 12:10+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI +ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,86 +17,86 @@ msgstr "" "Preferred-Encodings: utf-8 latin1\n" "Domain: kitconcept.seo\n" -#: kitconcept/seo/behaviors/seo.py:62 +#: kitconcept/seo/behaviors/seo.py:72 msgid "Canonical URL" msgstr "Canonical URL" -#: kitconcept/seo/behaviors/seo.py:44 +#: kitconcept/seo/behaviors/seo.py:55 msgid "Description" msgstr "Descrizione" -#: kitconcept/seo/behaviors/configure.zcml:17 +#: kitconcept/seo/behaviors/configure.zcml:21 msgid "Enhances a content type with fields for Search Engine Optimizations" msgstr "Aggiunge dei campi extra ai content type per il SEO" -#: kitconcept/seo/configure.zcml:22 +#: kitconcept/seo/profiles.zcml:13 msgid "Installs the kitconcept.seo add-on." msgstr "Installa kitconcept.seo" -#: kitconcept/seo/behaviors/seo.py:55 +#: kitconcept/seo/behaviors/seo.py:65 msgid "No Index" msgstr "No Index" -#: kitconcept/seo/behaviors/seo.py:104 +#: kitconcept/seo/behaviors/seo.py:90 msgid "Open Graph Description" msgstr "Descrizione Open Graph" -#: kitconcept/seo/behaviors/seo.py:114 +#: kitconcept/seo/behaviors/seo.py:100 msgid "Open Graph Image" msgstr "Immagine Open Graph" -#: kitconcept/seo/behaviors/seo.py:94 +#: kitconcept/seo/behaviors/seo.py:81 msgid "Open Graph Title" msgstr "Titolo Open Graph" -#: kitconcept/seo/behaviors/seo.py:105 +#: kitconcept/seo/behaviors/seo.py:91 msgid "Override the Open Graph description, that Facebook and Twitter use. When empty the default description will be used. Use maximum 155 characters." msgstr "Sovrascrive la descrizione per Open Graph, utilizzata da Facebook e Twitter. Se vuoto, verrร  utilizzata la descrizione del contenuto. Sarebbe indicato utilizzare al massimo 155 caratteri." -#: kitconcept/seo/behaviors/seo.py:115 -msgid "Override the Open Graph image, that Facebook and Twitter use. When empty the default lead image will be used. Recommended image ratio is 1,91:1 and 1200 x 630px." -msgstr "Sovrascrive l'immagine per Open Graph, utilizzata da Facebook e Twitter. Se vuoto, verrร  utilizzata l'immagine del contenuto (se presente). La proporzione raccomandata รจ 1,91:1 e 1200 x 630px." +#: kitconcept/seo/behaviors/seo.py:101 +msgid "Override the Open Graph image, that Facebook and Twitter use. When empty the default lead image will be used. Recommended image ratio is 1.91:1 and 1200 x 630px." +msgstr "" -#: kitconcept/seo/behaviors/seo.py:95 +#: kitconcept/seo/behaviors/seo.py:82 msgid "Override the Open Graph title, that Facebook and Twitter use. When empty the default title will be used. Use maximum 60 characters." msgstr "Sovrascrive il titolo per Open Graph, utilizzato da Facebook e Twitter. Se vuoto, verrร  utilizzato il titolo del contenuto. Sarebbe indicato utilizzare al massimo 60 caratteri." -#: kitconcept/seo/behaviors/seo.py:45 -msgid "Override the meta description. When empty the default description will be used. Use maximum 150 characters." -msgstr "Sovrascrive il meta-tag description. Se vuoto, verrร  utilizzata la descrizione del contenuto. Sarebbe indicato utilizzare al massimo 150 caratteri." +#: kitconcept/seo/behaviors/seo.py:56 +msgid "Override the meta description. When empty the default description will be used. Use maximum 155 characters." +msgstr "" -#: kitconcept/seo/behaviors/seo.py:35 -msgid "Override the meta title. When empty the default title will be used. Use maximum 50 characters." -msgstr "Sovrascrive il meta-tag title. Se vuoto, verrร  utilizzato il titolo del contenuto. Sarebbe indicato utilizzare al massimo 50 caratteri." +#: kitconcept/seo/behaviors/seo.py:39 +msgid "Override the meta title. When empty the default title will be used. Use maximum 55 characters." +msgstr "" -#: kitconcept/seo/behaviors/seo.py:56 +#: kitconcept/seo/behaviors/seo.py:66 msgid "Prevents a page from appearing in search engines" msgstr "Impedisce alla pagina di essere indicizzata dai motori di ricerca." -#: kitconcept/seo/behaviors/seo.py:18 +#: kitconcept/seo/behaviors/seo.py:17 msgid "SEO" msgstr "SEO" -#: kitconcept/seo/behaviors/configure.zcml:17 +#: kitconcept/seo/behaviors/configure.zcml:21 msgid "SEO Behavior" msgstr "SEO Behavior" -#: kitconcept/seo/behaviors/seo.py:63 +#: kitconcept/seo/behaviors/seo.py:73 msgid "Tells the search engine to choose this URL as the canonical version and crawl that." msgstr "Dice ai motori di ricerca di utilizzare l'URL fornito come versione canonica del contenuto corrente, e di conseguenza indicizzano quel contenuto." -#: kitconcept/seo/behaviors/seo.py:34 +#: kitconcept/seo/behaviors/seo.py:38 msgid "Title" msgstr "Titolo" -#: kitconcept/seo/configure.zcml:31 +#: kitconcept/seo/profiles.zcml:21 msgid "Uninstalls the kitconcept.seo add-on." msgstr "Disinstalla kitconcept.seo" -#: kitconcept/seo/configure.zcml:22 -msgid "kitconcept.seo" -msgstr "kitconcept.seo" +#: kitconcept/seo/profiles.zcml:13 +msgid "kitconcept seo: Install" +msgstr "" -#: kitconcept/seo/configure.zcml:31 -msgid "kitconcept.seo (uninstall)" -msgstr "kitconcept.seo (disinstalla)" +#: kitconcept/seo/profiles.zcml:21 +msgid "kitconcept seo: Uninstall" +msgstr "" diff --git a/src/kitconcept/seo/locales/kitconcept.seo.pot b/src/kitconcept/seo/locales/kitconcept.seo.pot index f992167..8188c1f 100644 --- a/src/kitconcept/seo/locales/kitconcept.seo.pot +++ b/src/kitconcept/seo/locales/kitconcept.seo.pot @@ -1,10 +1,10 @@ -# --- PLEASE EDIT THE LINES BELOW CORRECTLY --- -# SOME DESCRIPTIVE TITLE. -# FIRST AUTHOR , YEAR. +#--- PLEASE EDIT THE LINES BELOW CORRECTLY --- +#SOME DESCRIPTIVE TITLE. +#FIRST AUTHOR , YEAR. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"POT-Creation-Date: 2020-03-24 14:11+0000\n" +"POT-Creation-Date: 2026-01-28 12:10+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI +ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,86 +17,86 @@ msgstr "" "Preferred-Encodings: utf-8 latin1\n" "Domain: kitconcept.seo\n" -#: kitconcept/seo/behaviors/seo.py:62 +#: kitconcept/seo/behaviors/seo.py:72 msgid "Canonical URL" msgstr "" -#: kitconcept/seo/behaviors/seo.py:44 +#: kitconcept/seo/behaviors/seo.py:55 msgid "Description" msgstr "" -#: kitconcept/seo/behaviors/configure.zcml:17 +#: kitconcept/seo/behaviors/configure.zcml:21 msgid "Enhances a content type with fields for Search Engine Optimizations" msgstr "" -#: kitconcept/seo/configure.zcml:22 +#: kitconcept/seo/profiles.zcml:13 msgid "Installs the kitconcept.seo add-on." msgstr "" -#: kitconcept/seo/behaviors/seo.py:55 +#: kitconcept/seo/behaviors/seo.py:65 msgid "No Index" msgstr "" -#: kitconcept/seo/behaviors/seo.py:104 +#: kitconcept/seo/behaviors/seo.py:90 msgid "Open Graph Description" msgstr "" -#: kitconcept/seo/behaviors/seo.py:114 +#: kitconcept/seo/behaviors/seo.py:100 msgid "Open Graph Image" msgstr "" -#: kitconcept/seo/behaviors/seo.py:94 +#: kitconcept/seo/behaviors/seo.py:81 msgid "Open Graph Title" msgstr "" -#: kitconcept/seo/behaviors/seo.py:105 +#: kitconcept/seo/behaviors/seo.py:91 msgid "Override the Open Graph description, that Facebook and Twitter use. When empty the default description will be used. Use maximum 155 characters." msgstr "" -#: kitconcept/seo/behaviors/seo.py:115 -msgid "Override the Open Graph image, that Facebook and Twitter use. When empty the default lead image will be used. Recommended image ratio is 1,91:1 and 1200 x 630px." +#: kitconcept/seo/behaviors/seo.py:101 +msgid "Override the Open Graph image, that Facebook and Twitter use. When empty the default lead image will be used. Recommended image ratio is 1.91:1 and 1200 x 630px." msgstr "" -#: kitconcept/seo/behaviors/seo.py:95 +#: kitconcept/seo/behaviors/seo.py:82 msgid "Override the Open Graph title, that Facebook and Twitter use. When empty the default title will be used. Use maximum 60 characters." msgstr "" -#: kitconcept/seo/behaviors/seo.py:45 -msgid "Override the meta description. When empty the default description will be used. Use maximum 150 characters." +#: kitconcept/seo/behaviors/seo.py:56 +msgid "Override the meta description. When empty the default description will be used. Use maximum 155 characters." msgstr "" -#: kitconcept/seo/behaviors/seo.py:35 -msgid "Override the meta title. When empty the default title will be used. Use maximum 50 characters." +#: kitconcept/seo/behaviors/seo.py:39 +msgid "Override the meta title. When empty the default title will be used. Use maximum 55 characters." msgstr "" -#: kitconcept/seo/behaviors/seo.py:56 +#: kitconcept/seo/behaviors/seo.py:66 msgid "Prevents a page from appearing in search engines" msgstr "" -#: kitconcept/seo/behaviors/seo.py:18 +#: kitconcept/seo/behaviors/seo.py:17 msgid "SEO" msgstr "" -#: kitconcept/seo/behaviors/configure.zcml:17 +#: kitconcept/seo/behaviors/configure.zcml:21 msgid "SEO Behavior" msgstr "" -#: kitconcept/seo/behaviors/seo.py:63 +#: kitconcept/seo/behaviors/seo.py:73 msgid "Tells the search engine to choose this URL as the canonical version and crawl that." msgstr "" -#: kitconcept/seo/behaviors/seo.py:34 +#: kitconcept/seo/behaviors/seo.py:38 msgid "Title" msgstr "" -#: kitconcept/seo/configure.zcml:31 +#: kitconcept/seo/profiles.zcml:21 msgid "Uninstalls the kitconcept.seo add-on." msgstr "" -#: kitconcept/seo/configure.zcml:22 -msgid "kitconcept.seo" +#: kitconcept/seo/profiles.zcml:13 +msgid "kitconcept seo: Install" msgstr "" -#: kitconcept/seo/configure.zcml:31 -msgid "kitconcept.seo (uninstall)" +#: kitconcept/seo/profiles.zcml:21 +msgid "kitconcept seo: Uninstall" msgstr "" From db6372986ff95def63da46041c066f0816477624 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89rico=20Andrei?= Date: Wed, 28 Jan 2026 09:12:38 -0300 Subject: [PATCH 7/8] Remove requirements.txt from repository --- requirements.txt | 1 - 1 file changed, 1 deletion(-) delete mode 100644 requirements.txt diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 9416c4c..0000000 --- a/requirements.txt +++ /dev/null @@ -1 +0,0 @@ --c https://dist.plone.org/release/6.1.4/constraints.txt From 1eb28f59ea92ca0e21d0495a41d3ea75c3983606 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89rico=20Andrei?= Date: Wed, 28 Jan 2026 09:16:47 -0300 Subject: [PATCH 8/8] Restore images used in the readme file --- README.md | 4 +++- kitconcept-seo.png | Bin 0 -> 143508 bytes kitconcept.png | Bin 0 -> 3059 bytes 3 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 kitconcept-seo.png create mode 100644 kitconcept.png diff --git a/README.md b/README.md index 3911edd..1546898 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ SEO addon for Plone [![CI](https://github.com/kitconcept/kitconcept.seo/actions/workflows/main.yml/badge.svg)](https://github.com/kitconcept/kitconcept.seo/actions/workflows/main.yml) -[![kitconcept, GmbH](https://raw.githubusercontent.com/kitconcept/kitconcept.seo/master/kitconcept.png)](https://kitconcept.com/) +[![kitconcept, GmbH](https://raw.githubusercontent.com/kitconcept/kitconcept.seo/main/kitconcept.png)](https://kitconcept.com/) [SEO](https://en.wikipedia.org/wiki/Search_engine_optimization) enhancements for the Plone Content Management System. `kitconcept.seo` works with the latest Plone 6 and its default frontend [Volto](https://github.com/plone/volto). @@ -27,6 +27,8 @@ If you are looking for a full featured SEO solution for Plone Classic or older v - Allows to set a canonical URL - Allows to set Open Graph title, description and image +![Fieldset](https://raw.githubusercontent.com/kitconcept/kitconcept.seo/main/kitconcept-seo.png) + ## Examples This add-on can be seen in action at the following sites: diff --git a/kitconcept-seo.png b/kitconcept-seo.png new file mode 100644 index 0000000000000000000000000000000000000000..0d58ec8f77c336ffa1fecc91b122d487eae91877 GIT binary patch literal 143508 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

k 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

N6kWJC;0W`ii;7R1W8}#{OCPi)2}~#3q@Sj1 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 NoG||#d;HS%{|Cd}F_-`V literal 0 HcmV?d00001 diff --git a/kitconcept.png b/kitconcept.png new file mode 100644 index 0000000000000000000000000000000000000000..6391c28c148622b7b8c21943631370dfaacaf12d GIT binary patch literal 3059 zcmVv$P)0c;_3PN`~Uy{MPY`($<{VieDL%2m87|Tk*enE?sA8tpRK?zPIri! zvADv}tGLM4+~g@qbJy07q5uF3X-PyuRCwC$o#&RbDinqlkznt+|4ThlER;=CGjV+f ze$1LRI*IU5c6pKL70SO;qR<3^W+;JXC{LqVryivyp@pAIGi~z7t8`5q+W4U~$1d_N z?>;p0BWVuNsnUj4ejv>{KSwi~LNh;)W_1!~ghDevj^-4dE<#?j?6hPHkR zO?;hZQiR5S2F)?Lp@iuBGiVmc9W=W%wDuEd_R%dRglnHbGwtr78D*ile@_$L1T(@R zT>EpHS#(PMLUy=u^Wo{*SWtX*2lnRT1Po;8=QAJMSTWFx~6jdrcqg9jv9Sx%5Fow*ap_BI?%MrM>v{nK+Zc=dbj_D zMI|83mQQmhyG0!99%yZWlAl>rMI)Xp4D`YB6G(yeSk ziDLbJ+7EG@wM{2C;%w%`U$ zB1V!xLvQVf$JAM@)9PkM7@D~V?F`TTre!3L@ZvREAZxM#a*>#9>HPV+@2 zf6-Efdj5&`yC$SgUsr6}B6p!6b=wCo!y}ix7DnorMpv4&P(5%Y^?5{;w(I$MShDw)S&s@;0D_%y zF8%8jnvEk(%3i53W@WvohF+Zl#W80Z8*el&_P;MXqHYiM_y-;5a&^?Gio`S45rdlR+^J-Q+}zH zCM}#h!qLnLXixM!h}4o$>@`No$bSgfB`V=buh2|gXmXLf{qcNWDirH!)>L)?9ch-f z-7ZLv0C5jh!}A{xsCMc&KoX(myRv>R$&?xSbkyD9m3ny#i!OV|eJe;`eH~0Y&Bn5n zkxm~;X}Q5r!$T(JXb!gh;`6h-p*cP0YEQWdL9)w)pwA_m4i0CRtD?&Vu-l$8ASt%d zTpc@L1X*b=-GEq@O=JjWR>1gyX_mGZ2rf?U02In$qWS?oUwV^UGGb19iJ0vuiY`aT zwX@ewO8&=o_SksDWsJLV12dH%xq0uX-CxJlnJpQGfigYq~|Oyk!Gds4CQS!%}5l{Wg`Dw zUrIyp)znX;iWoMxAK(tRP6$I&4gXGMcLD zOH=PSz73+w-V(S+&SC28E!9+_30bf$s0hruoec)1log;ou+e0O8j^5+tnp1-!g7={ z?vy5}OtX`^7mHMLbBxVcccH0u98IFjwN12v`^i1&u>7T)bTliV%?VO5{@gJ1iB3;zrMZsjD6ht;PUChp7HBF$h>||52`Tm)D#^NG zB5+&|({u=cE7e$+tLjM;PCwg3m!>z&w0`N`ShI5h@S*k#HMZnzvfLtuccu9v(0XFg zx(kDDwN*!Jl4*3=oo;=X7t)5z2i_Qhtk%KrbwP$*MVow5rYS7W#|5H71cz|HSz-uGhnaQM^%XkI@O&SF;w zntw_2rUOyJp^cBAdCy@*;Xu`g(7fXyv2fV&Q)u3C$X_^!{4q4IAHbP}Q>Q?aWSXY* z&uPZ*i!_Ho?hlIVnerFClyF+(qi9|{R6ZPg@hF<^Z;tVkkA(6Qnpe*H3upU1ji%Q- z4cz4;q5OvC`7?59@J^mbb2>{ioLBuonr986U;;gorpt?G09P~2v(Ka{>Cc?j%#fmf zEX~)e&IXT?rJ;qNOf!@~Gn7Cxlt44k4CUV_{{e_GClDECC^Y~8002ovPDHLkV1il2 B