Detailed Documentation
Introduction
Namespace packages offer the huge benefit of being able to distribute parts of a large system in small, self-contained pieces. However, they can be somewhat clunky to navigate, since you end up with a large list of eggs in your egg cache, and then a seemingly endless series of directories you need to open to actually find the contents of your egg.
This recipe sets up a directory structure that mirrors the actual python namespaces, with symlinks to the egg contents. So, instead of this…:
egg-cache/
my.egg.one-1.0-py2.7.egg/
my/
egg/
one/
(contents of first egg)
my.egg.two-1.0-py2.7.egg/
my/
egg/
two/
(contents of second egg)
…you get this:
omelette/
my/
egg/
one/
(contents of first egg)
two/
(contents of second egg)
You can also include non-eggified python packages in the omelette. This makes it simple to get a single path that you can add to your PYTHONPATH for use with specialized python environments like when running under mod_wsgi or PyDev.
Typical usage with Zope and Plone
For a typical Plone buildout, with a part named instance that uses the plone.recipe.zope2instance recipe, the following additions to buildout.cfg will result in an omelette including all eggs used by the Zope instance:
[buildout]
parts =
...(other parts)...
omelette
...
[omelette]
recipe = collective.recipe.omelette
eggs = ${instance:eggs}
Supported options
The recipe supports the following options:
- eggs
List of eggs which should be included in the omelette.
- location
(optional) Override the directory in which the omelette is created (default is parts/[name of buildout part])
- ignore-develop
(optional) Ignore eggs that you are currently developing (listed in ${buildout:develop}). Default is False
- ignores
(optional) List of eggs to ignore when preparing your omelette.
- packages
List of Python packages whose contents should be included in the omelette. Each line should be in the format [packages_location] [target_directory], where packages_location is the real location of the packages, and target_directory is the optional (relative) location where the package should be inserted into the omelette (defaults to ./, so directly in the omelette part). Example: packages = ${buildout:directory}/lib/python3.13/site-packages
Using omelette with zipped eggs
Omelette doesn’t currently know how to deal with eggs that are zipped. If it encounters one, you’ll see a warning something like the following:
omelette: Warning: (While processing egg elementtree) Egg contents not found at /Users/davidg/.buildout/eggs/elementtree-1.2.7_20070827_preview-py2.4.egg/elementtree. Skipping.
You can tell buildout to unzip all eggs by setting the unzip = true flag in the [buildout] section. (Note that this will only take effect for eggs downloaded after the flag is set.)
Running the tests
Just grab the recipe from git and run:
tox -p auto
Known issue: The tests run buildout in a separate process, so it’s currently impossible to put a pdb breakpoint in the recipe and debug during the test. If you need to do this, set up another buildout which installs an omelette part and includes collective.recipe.omelette as a development egg.
Reporting bugs or asking questions
There is a bugtracker on gitHub: https://github.com/collective/collective.recipe.omelette/issues
Change history
3.0.0 (2026-05-14)
Documentation:
Merge CHANGES.txt into CHANGES.rst, and use that for the long description. [maurits]
3.0.0a1 (2025-12-09)
Breaking changes:
Replace pkg_resources namespace with PEP 420 native namespace. Support only Plone 6.2 and Python 3.10+. (#3928)
2.0.0 (2025-02-14)
Breaking changes:
No longer generate __init__.py files with namespace stanza in parts/omelette. I think this was originally done to be able to go to parts/omelette, start a standard Python, and be able to import everything. With current Python versions the __init__.py files are not needed for a directory to be importable. [maurits]
Remove products recipe option and special handling of Products namespace. Zope 4 and higher no longer have the concept of a products directory. You can still use packages = path/to/products_dir Products if you need something similar. [maurits]
Require at least Python 3.9. [maurits]
Bug fixes:
Fix handling checkouts of native namespace packages. [maurits]
1.1.1 (2025-02-12)
Remove setuptools fossils. [maurits]
1.1.0 (2021-12-01)
Fix 2to3 old setuptools hook [goschtl]
mordernize to python3 code [goschtl]
update to new zope.testing [goschtl]
use pytest and tox [goschtl]
Note: tested on Python 2.7 and 3.6-3.10.
1.0.0 (2020-08-03)
Fix to run under Windows with Python 3. [nilshofer, jensens]
0.16 (2013-02-18)
Fix packaging error. [davisagli]
Fix tests to work with buildout 2. [davisagli]
0.15 (2012-05-12)
Integration with Travis CI for running tests and pep8/pyflakes. [hvelarde]
PEP 8/Pyflakes. [hvelarde]
Optimized unlinking of junctioned dirs on Windows. [lck]
0.14 (2012-04-30)
Change the approach to building the omelette using NTFS junctions on Windows. This is now done via the ntfsutils package, rather than relying on junction.exe. [lck]
0.13 (2012-04-14)
Added forward-compatibility with Python 3. [mitchell]
0.12 (2011-09-08)
Replaced os.popen with subprocess equivalent [tom_gross]
Quote path on windows to handle paths with spaces correctly [tom_gross]
0.11 (2011-07-18)
Sort top_level metadata to avoid error building omelette if they are out of order. Fixes https://bugs.launchpad.net/collective.buildout/+bug/553005. Thanks to Leonardo Rochael Almeida. [davisagli]
0.10 (2010-11-22)
Provide an update function (equivalent to install) to avoid spurious “recipe “doesn’t define an update method” warning. [davisagli]
Print a warning rather than aborting the buildout if junction.exe is missing on Windows. [davisagli]
Made the tests compatible with a zc.buildout installed with Distribute rather than Setuptools. [pumazi]
Handle OSErrors on symlink and warn the user. MacOSX can raise OSError due to an existing file here even if os.path.exists returns False. [MatthewWilkes]
Include modules from namespace packages in the omelette. (Namespace packages cannot define anything in __init__.py, but they can contain modules.) [hathawsh]
Made the tests compatible with virtualenv. [hathawsh]
0.9 (2009-04-11)
Adjusted log-levels to be slightly less verbose for non-critical errors. [malthe]
0.8 (2009-01-14)
Fixed ‘OSError [Errno 20] Not a directory’ on zipped eggs, for example when adding the z3c.sqlalchemy==1.3.5 egg. [maurits]
0.7 (2008-09-10)
Actually add namespace declarations to generated __init__.py files. [davisagli]
Use egg-info instead of guessing paths from package name. This also fixes eggs which have a name different from the contents. [fschulze]
0.6 (2008-08-11)
Documentation changes only. [davisagli]
0.5 (2008-05-29)
Added uninstall entry point so that the omelette can be uninstalled on Windows without clobbering things outside the omelette path. [optilude]
Support Windows using NTFS junctions (see http://www.microsoft.com/technet/sysinternals/FileAndDisk/Junction.mspx) [optilude]
Ignore zipped eggs and fakezope2eggs-created links. [davisagli]
Added ‘packages’ option to allow merging non-eggified Python packages to any directory in the omelette (so that, for instance, the contents of Zope’s lib/python can be merged flexibly). [davisagli]
0.4 (2008-04-07)
Added option to include Products directories. [davisagli]
Fixed ignore-develop option. [davisagli]
0.3 (2008-03-30)
Fixed test infrastructure. [davisagli]
Added option to ignore develop eggs [claytron]
Added option to ignore eggs [claytron]
Added option to override the default omelette location. [davisagli]
0.2 (2008-03-16)
Fixed so created directories are not normalized to lowercase. [davisagli]
0.1 (2008-03-10)
Initial basic implementation. [davisagli]
Created recipe with ZopeSkel. [davisagli]
Contributors
David Glick [davisagli]
Clayton Parker [claytron]
Martin Aspeli [optilude]
Florian Schulze [fschulze]
Maurits van Rees [maurits]
Malthe Borch [malthe]
Matthew Wilkes [MatthewWilkes]
Michael Mulich [pumazi]
Shane Hathaway [hathawsh]
Leonardo Rochael Almeida [LeoRochael]
Tom Gross [tom_gross]
Richard Mitchell [mitchell]
Roman Lacko [lck]
Hector Velarde [hvelarde]
Release files for collective.recipe.omelette 3.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| collective_recipe_omelette-3.0.0.tar.gz | 18.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| collective_recipe_omelette-3.0.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 35.4 kB
Release files / collective_recipe_omelette-3.0.0.tar.gz
| Download URL | collective_recipe_omelette-3.0.0.tar.gz |
|---|---|
| Size | 18.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
75274e305de9388acc0614e5d7b51067caec583c27a02674af5b197fdaa0eb4b
|
|
BLAKE2b-256 checksum How to use checksums |
6a8ef5a90b2c8a6cd8919af53f588ff20e1b4a4b1f8a17f679dda025e0aa49a6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.14.2
|
Release files / collective_recipe_omelette-3.0.0-py3-none-any.whl
| Download URL | collective_recipe_omelette-3.0.0-py3-none-any.whl |
|---|---|
| Size | 16.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
ddd749a42ebc224a1645839c3ab4ec60344a71af5dce4c3a9692c6c2c043a914
|
|
BLAKE2b-256 checksum How to use checksums |
20157c21df6139a324501a6e10cd4726782cfc4326df3394b85cbf217c92f170
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.14.2
|