Skip to main content

Auto include code and zcml

Project description

Coveralls License

plone.autoinclude

Automatically include zcml of a package when it is loaded in a Plone site.

Features

  • It is an alternative to z3c.autoinclude.

  • When a package registers an autoinclude entry point, we load its Python code at Zope/Plone startup.

  • And we load its zcml.

  • Works with Buildout-installed packages.

  • Works with pip-installed packages.

Compatibility

Since Plone 6.0.0a2 this package is included in core Plone. See PLIP 3339.

The 1.x versions also work on Plone 5.2, on Python 3.6+.

For add-on authors

When you have an existing package that has some zcml, you probably already have something like this in your setup.py:

entry_points="""
[z3c.autoinclude.plugin]
target = plone
"""

or in a dictionary:

entry_points={
    "z3c.autoinclude.plugin": [
        "target = plone",
    ],
}

or in setup.cfg:

[options.entry_points]
z3c.autoinclude.plugin =
    target=plone

This still works! You do not need to change anything.

But if you do not care about compatibility with z3c.autoinclude, you could use this new entry point:

entry_points="""
[plone.autoinclude.plugin]
target = plone
"""

It does the same thing, but it only works with plone.autoinclude.

Note: you should not add plone.autoinclude in your install_dependencies. It is the responsibility of the framework (usually Plone) to do this.

Entry point details

This is an entry point with all options specified:

entry_points="""
[plone.autoinclude.plugin]
target = plone
module = example.alternative
"""

You must specify at least one option, otherwise the entry point does not exist.

target

In which framework should your zcml be loaded? For a Plone add-on you would use plone. If Zope ever wants to use something similar, it could add configuration to look for packages with target="zope". You can come up with targets yourself, and load them in a policy package, maybe: cms, frontend, companyname, customername, nl/de (language). If target is empty, or the option is not there, the zcml will get loaded by all frameworks.

module

Use this when your package name is different from what you import in Python. See also the next section.

Different project and module name

Usually the project name of an add-on (what is in setup.py or setup.cfg) is the same as how you would import it in Python code. It could be different though. In that case, you may get a ModuleNotFoundError on startup: plone.autoinclude tries to import the project name and this fails.

This may happen more often since setuptools 75.8.1, which changed some name handling to be in line with the standards in several packaging-related PEPs (Python Enhancement Proposals).

The easiest way to solve this, is to switch from z3c.autoinclude.plugin to plone.autoinclude.plugin, if you have not done so already, and specify the module. In setup.py:

setup(
    name="example.different2",
    entry_points="""
    [plone.autoinclude.plugin]
    module = example.somethingelse2
    """,
)

If you must still support Plone 5.2 and are tied to z3c.autoinclude.plugin, or if you cannot edit the problematic package, you can work around it. You set an environment variable AUTOINCLUDE_ALLOW_MODULE_NOT_FOUND_ERROR. To accept ModuleNotFoundError in all packages:

export AUTOINCLUDE_ALLOW_MODULE_NOT_FOUND_ERROR=1

To accept ModuleNotFoundError only in specific packages, use a comma-separated list of project names, with or without spaces:

export AUTOINCLUDE_ALLOW_MODULE_NOT_FOUND_ERROR=example.different,example.different2

In the logs you will see a traceback so you can investigate, but startup continues. You should make sure the zcml of this package is loaded in some other way.

Comparison with z3c.autoinclude

  • z3c.autoinclude supports includeDependencies in a zcml file in your package. This would look in the setup_requires of the package to find dependencies. For each, it would load the zcml. This can take quite long. It might not work for packages installed by pip, but this is not confirmed. In the Plone community this is discouraged, and Plone already disables this in the tests. plone.autoinclude does not support this. You should load the zcml of the dependencies explicitly in the configure.zcml of your package.

  • z3c.autoinclude tries hard to find packages in non-standard places, installed in weird or old ways, or with a module name that differs from the package name, with code especially suited for eggs that buildout installs. plone.autoinclude simply uses importlib.import_module on the module name. If there is a mismatch between package name and module name, you can set module = modulename in your entry point.

  • z3c.autoinclude does not support empty targets. The target of the entry point must match the target that is being loaded. plone.autoinclude does support empty targets: they will always get loaded. This is not good or bad, it is just a different choice.

  • z3c.autoinclude supports disabling loading the plugins, via either an environment variable or an api call. plone.autoinclude does not. But Products.CMFPlone currently loads the z3c.autoinclude plugins unless a zcml condition is true: not-have disable-autoinclude. When Products.CMFPlone switches to plone.autoinclude, it can use this same condition.

In general, plone.autoinclude is a bit more modern, as it only started in 2020, and only supports Python 3.

Usage in Plone 5.2

For instructions on how to use this in Plone 5.2, see the README.rst of any 1.x version of this package.

For other frameworks

If you want to use this in a framework that is built on top of Zope, but is not Plone, you need to take care of the following:

  • Include the plone.autoinclude package in install_requires.

  • In your meta.zcml load the meta.zcml of plone.autoinclude.

  • In your meta.zcml load the meta.zcml of your plugins: <autoIncludePlugins target="your-framework" file="meta.zcml" />

  • In your configure.zcml load the configure.zcml of your plugins: <autoIncludePlugins target="your-framework" file="configure.zcml" />

  • In your overrides.zcml load the meta.zcml of your plugins in override mode: <autoIncludePluginsOverrides target="your-framework" file="meta.zcml" />

Contribute or get support

License

The project is licensed under the GPLv2.

Changelog

2.0.5 (2025-10-02)

Tests:

  • Fix tests with buildout 4, and add tests with buildout 5. This is needed because we get more namespace packages. [maurits]

2.0.4 (2025-09-10)

Internal:

  • Build system: require setuptools < 80. [maurits]

Tests:

  • GitHub Actions: do not use a cache. [maurits]

  • Remove pkg_resources from tests. [maurits]

  • Test with latest zc.buildout 4.1.12, and run the buildout tests in GitHub Actions. [maurits]

2.0.3 (2025-03-14)

Bug fixes:

  • Fix wheel compatibility with older versions of setuptools and buildout. [maurits] (#34)

2.0.2 (2025-03-12)

Bug fixes:

  • If a distribution is not found, try to normalize the name like recent setuptools is doing and try again [ale-rt] (#32)

2.0.1 (2025-03-07)

Bug fixes:

  • Replace pkg_resources with importlib.metadata/importlib.resources. [gforcada] (#4126)

2.0.0 (2025-02-27)

Breaking changes:

  • Support Plone 6.0, 6.1, 6.2, Python 3.9-3.13, and Buildout 4. Drop support for older Plone, Python and Buildout versions. Drop support for PyPy. Technically it may still work, but we no longer test it. It is irrelevant for Plone. [maurits] (#24)

Bug fixes:

  • Fix importing module when the module name differs from the project name. This can easily happen with setuptools 75.8.1, though maybe 75.8.2 fixes it in some cases. [maurits] (#25)

1.0.1 (2022-12-10)

Bug fixes:

  • Revert “Use setuptools/pkg_resources regex to compute safe name for a project” to fix an error importing packages with dashes. [davisagli] (#22)

1.0.0 (2022-12-01)

Bug fixes:

  • Use setuptools/pkg_resources regex to compute safe name for a project. [gforcada] (#17)

1.0.0a5 (2022-05-24)

New features:

  • Raise an exception when a module is not found. When environment variable AUTOINCLUDE_ALLOW_MODULE_NOT_FOUND_ERROR=1 is set, we log an error and continue. To accept ModuleNotFoundError only in specific packages, use a comma-separated list of project names, with or without spaces. See issue 19. [maurits] (#19)

1.0.0a4 (2022-02-23)

Bug fixes:

  • Replace dash with lowdash in project_name, as Python Project are normally divided by dash and modul name uses lowdash [MrTango] (#16)

1.0.0a3 (2021-12-03)

Bug fixes:

  • Decrease verbosity when loading packages (#11)

1.0.0a2 (2021-10-20)

Bug fixes:

  • Improved documentation, especially on how to include this. Added zcml in a ploneinclude directory to make this easier for now. [maurits] (#1)

1.0.0a1 (2021-10-15)

New features:

  • Initial release. [maurits, tschorr]

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

plone_autoinclude-2.0.5.tar.gz (41.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

plone_autoinclude-2.0.5-py3-none-any.whl (21.5 kB view details)

Uploaded Python 3

File details

Details for the file plone_autoinclude-2.0.5.tar.gz.

File metadata

  • Download URL: plone_autoinclude-2.0.5.tar.gz
  • Upload date:
  • Size: 41.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.3

File hashes

Hashes for plone_autoinclude-2.0.5.tar.gz
Algorithm Hash digest
SHA256 13303da75b4e2c2cc5af81b330708a677df2d553a83d52c8a60f54e5ff837362
MD5 91ca32cff73b7704eb43a81542536e84
BLAKE2b-256 d407c241a3c7b3a2a90b922f0131d9931d051fcc76319dc35a16d6823a21411f

See more details on using hashes here.

File details

Details for the file plone_autoinclude-2.0.5-py3-none-any.whl.

File metadata

File hashes

Hashes for plone_autoinclude-2.0.5-py3-none-any.whl
Algorithm Hash digest
SHA256 79cb2c7d7b3ceb6b6f483989ba4d745a80cda5dcc0c24d0d5d2d20ce79af703c
MD5 873723086975c4e50525d8590a312076
BLAKE2b-256 bc3816af0d0ccf2258c23b427a121f6c84b210911a96cf546517b80e4fa2e673

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page