Oops bundles a set of opinionated command-line utilities used at Apik to keep complex Odoo multi-repository projects in check. It streamlines Git submodule management, generates addon inventories, and normalizes Odoo manifests so teams can focus on delivering features instead of chasing repository drift.
- Automates adding, auditing, and pruning Git submodules across multiple Odoo repositories.
- Builds addon lists and tables directly from manifests for documentation or reporting.
- Normalizes
__manifest__.pyfiles while preserving comments and project-specific tweaks. - Ships reproducible scripts that integrate well with CI pipelines and project bootstrap tooling.
- Python 3.8+ (Python 3.7 is the minimum supported version).
- Git with submodule support enabled.
- A POSIX-compatible shell; examples below assume
bash.
pip install git+https://github.com/apikcloud/oops.gitgit clone https://github.com/apikcloud/oops.git
cd oops
pip install -e .# Add an OCA submodule and create symlinks for each addon it contains
oops-sub-add https://github.com/OCA/server-ux.git -b 18.0 --auto-symlinks
# List every addon discovered in the configured submodules
oops-addons-list --format json > addons.json
# Reformat every __manifest__.py under ./addons and exit non-zero on pending changes
oops-man-rewrite --addons-dir ./addons --check- Create and activate a virtual environment.
- Install development dependencies:
pip install -e .[dev](ormake install). - Run quality checks before opening a pull request:
make lintto execute Ruff.make typecheckto run Pyright (soft-fail by design).make testto execute the pytest suite.
- Build artifacts locally with
make buildwhen you need wheels or source distributions.
Issues and pull requests are welcome on GitHub. Please include clear reproduction steps, add tests or changelog fragments when relevant, and describe the impact on downstream projects so reviews can move quickly. The scripts are provided as-is by the Apik team; feel free to fork if you need bespoke behavior.
oops is distributed under the AGPL-3.0-only license. See LICENSE or visit
https://www.gnu.org/licenses/agpl-3.0.html for the full text.