NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #1371 most downloaded on PyPI
Keep all y'all's __all__'s in sync
Last release 13 days ago
21 Sep 2026
Ships fairly regularly
a new release about every 6 months
Nearly every release is documented
notes for 27 of 28 stable releases
Nothing withdrawn
no release was ever pulled
10 years old
29 releases · first in 2016
The source distribution ships tests/, docs/, and conftest.py again. 8.0.0 shipped only src/public/, so downstream packagers had no way to run the test
The source distribution ships tests/, docs/, and conftest.py again. 8.0.0 shipped only src/public/, so downstream packagers had no way to run the test suite against the released sdist. (:GL:`30`)
The install extra now requires atpublic-install >= 1.0.0. Unbounded it could resolve to the 0.1.0a1 prerelease, since installers fall back to a prerelease for a requirement that has no final release. atpublic-install in turn now requires atpublic >= 8.0.0, the first final release to export install() from the package itself.
public() and private() now accept a single positional argument, which can be an object imported from another module, a module or submodule, or a strin
One column per quarter.
public() and private() now accept a single positional argument, which can be an object imported from another module, a module or submodule, or a string. The resolved name is added to (or removed from) the __all__ of the module where the call appears. A string is used as given, and must be a valid Python identifier that isn't a reserved word; ValueError is raised otherwise. When no name can be inferred, such as is the case with a constant or an instance, TypeError is raised, pointing you at the keyword argument form. (:MR:`53`)
@public and @private can now be installed into builtins at interpreter startup by installing the new install extra, i.e. pip install atpublic[install]. This pulls in the companion atpublic-install package, which enables the builtins at interpreter startup time via .pth or .start files. (:MR:`51`)
install(), which adds @public and @private to builtins, is now exported from the package itself, so it can be called as from public import install. Previously it was only reachable as public._startup.install, which still works but is no longer the documented spelling.
@private no longer creates an __all__ when the module doesn't already have one. Previously, privatizing a name in a module with no __all__ left an empty one behind, which is not the same thing as not having one: an empty __all__ exports nothing, while no __all__ exports every name that doesn't start with an underscore.
public(thing) and private(thing) used to operate on sys.modules[thing.__module__], i.e. the module where thing was defined. Passing in an imported object therefore added the name to the wrong module's __all__, and in the case of private(), removed it from the wrong module's __all__. Both functions now always use the globals of the module where the call appears. Use as a decorator is unaffected, since a decorator is applied where its target is defined.
The implementation modules are now private, having been renamed with a leading underscore: public.modules, public.private, public.public, and public.types are now public._modules, public._private, public._public, and public._types. Import the package itself instead, as in from public import public, private, populate_all. Among other things this settles what public.public refers to; it used to name both a module and the function of the same name that the package exports.
Switch to pyrefly for type checking.
Nothing published for this version
Documentation improvements. furo has been fixed, so we no longer need the workaround.
Drop Python 3.9.
Documentation improvements. furo has been fixed, so we no longer need the workaround.
pyproject.toml updates and improvements.
Temporary workaround __ for a furo theme bug in dark mode.
Documentation improvements.
Temporary workaround for a furo theme bug in dark mode.
CI updates.
Fix test suite when run with Python < 3.12. (:GL:28)
Fix test suite when run with Python < 3.12. (:GL:`28`)
Add test for Python 3.14.
Added populate_all() which can be called from the bottom of your module to infer and populate your module's __all__. Use this if you don't like the de
Added populate_all() which can be called from the bottom of your module to infer and populate your module's __all__. Use this if you don't like the decorator syntax. (:GL:`27`)
Documentation improvements.
Drop official support for Python 3.8, add support for Python 3.13.
Drop official support for Python 3.8, add support for Python 3.13.
@public is now properly type annotated. (:GL:25)
@public is now properly type annotated. (:GL:`25`)
Adopt hatch test and hatch fmt commands.
@public and @private now raise TypeError instead of ValueError if __all__ is not a concrete list object. (:GL:`26`)
Other minor coding improvements identified by ruff.
Switch to Trusted Publishing for publishing new versions to PyPI. (:GL:`24`)
@public is now properly type annotated.
Adopt hatch test and hatch fmt commands. (:GL:`25`)
@public and @private now raise TypeError instead of ValueError if __all__ is not a concrete list object. (:GL:`26`)
Other minor coding improvements identified by ruff.
Switch to Trusted Publishing for publishing new versions to PyPI. (:GL:`24`)
Nothing published for this version
Drop Python 3.7 support. (:GL:16)
Drop Python 3.7 support. (:GL:`16`)
Remove public.install() which was used to inject the public and private functions into the builtins namespace. This isn't very helpful and could be actively harmful. Explicit is better than implicit. (:GL:`14`)
The functional form of public() now returns the argument values in the order they are given. This allows you to explicitly bind those values to names in the global namespace. While this is redundant, it does solve some linter problems. (:GL:`12`)
Switch from flake8 and isort to ruff for code quality. (:MR:`32`)
Bump dependencies.
More GitLab CI integration improvements.
Switch to pdm-backend (:GL:`15`)
Bump dependencies.
More GitLab CI integration improvements.
Improvements to the GitLab CI integration.
Improvements to the GitLab CI integration.
Fix a typo in pyproject.toml file.
Fix a typo in pyproject.toml file.
Exclude certain local cache files from the sdist/wheel.
Add support for Python 3.11.
Updates for pdm and dependencies.
* Fix a typo in the README.rst.
Fix a typo in the README.rst.
Use modern package management by adopting pdm _ and pyproject.toml, and dropping setup.py and setup.cfg.
Use modern package management by adopting pdm and pyproject.toml, and dropping setup.py and setup.cfg.
Build the docs with Python 3.8.
Update to version 3.0 of Sybil.
Adopt the Furo documentation theme.
Use importlib.metadata.version() as a better way to get the package version number for the documentation.
Drop Python 3.6 support.
Update Windows GitLab runner to include Python 3.10.
Update copyright years.
The master branch is renamed to main. (:GL:`11`)
Do type hinting the right way. (:GL:10)
Do type hinting the right way. (:GL:`10`)
public() and private() can't be correctly type annotated, so the type hints on these two functions have been removed. The ModuleAware was also removed
public() and private() can't be correctly type annotated, so the type hints on these two functions have been removed. The ModuleAware was also removed. (:GL:`10`)
Added a py.typed file to satisfy type checkers. (:GL:`9`)
Fixed a documentation cross-reference bug.
* I blue _ it!
I blue it!
Include test/__init__.py and docs/__init__.py (:MR:9)
Update copyright years.
Include test/__init__.py and docs/__init__.py (:MR:`9`)
Rename top-level tests/ directory to test/ (:GL:8)
Rename top-level tests/ directory to test/ (:GL:`8`)
Reorganized docs and tests out of the code directory (:GL:7).
Clean up some typing problems.
Reorganized docs and tests out of the code directory (:GL:`7`).
Fix the Windows CI tests.
Drop Python 3.4 and 3.5; add Python 3.8 and 3.9.
Drop Python 3.4 and 3.5; add Python 3.8 and 3.9.
The C implementation is removed. (:GL:`4`)
Added an @private decorator (:GL:`3`)
Build and test on Windows in addition to Linux.
Fix the doctests so that they actually run and pass!
Add type annotations and API reference documentation.
Internal improvements and modernizations.
* 1.0 release. * Documentation improvements.
1.0 release.
Documentation improvements.
Fix MANIFEST.in inclusion of the src directory for the C extension.
Fix MANIFEST.in inclusion of the src directory for the C extension.
Make building the C extension optional, for environments without a C compiler.
Add Python 3.6 support.
Make building the C extension optional, for environments without a C compiler.
Raise ValueError when __all__ isn't a list (or subclass) instance.
Raise ValueError when __all__ isn't a list (or subclass) instance.
Documentation updates based on initial feedback.
Documentation updates based on initial feedback.
Some minor test suite clean up.
* Initial release.
Initial release.
Your coding agent can read these notes before it upgrades. Set up the MCP server →