Skip to content

feat(modes): add --mode flag for dependency resolution (conservative/modern/bleeding-edge)#83

Open
trisdoan wants to merge 3 commits intomainfrom
experiment/mode
Open

feat(modes): add --mode flag for dependency resolution (conservative/modern/bleeding-edge)#83
trisdoan wants to merge 3 commits intomainfrom
experiment/mode

Conversation

@trisdoan
Copy link
Copy Markdown
Collaborator

@trisdoan trisdoan commented Apr 1, 2026

Summary

Introduces three dependency resolution modes via a new --mode CLI flag to allow flexible version constraint strategies based on stability requirements.

  • conservative: Strict version pins (prefer stability)
  • modern: Relaxed constraints with ^X.Y versions (balance stability/features)
  • bleeding-edge: Latest versions, all specifiers removed (maximum feature access)

Problem Solved

Odoo projects have different dependency requirements:

  • Enterprise/production: Need stable, pinned versions (conservative)
  • Active development: Want latest minor/patch releases (modern)
  • Cutting-edge: Need latest packages despite potential breaking changes (bleeding-edge)

Previously, all projects used the same constraint strategy. Now users can select their risk tolerance.

Technical Explanation

Concepts

Preset = WHAT to install (Odoo version, addons, Python packages).
Mode = HOW to resolve dependency versions.

Modes

Mode Strategy Behavior
conservative (default) compat Exact pins for known-broken packages. Safest for Odoo+OCA.
modern latest-secure Floor versions (>=) instead of exact pins. Lets uv pick latest compatible.
bleeding-edge uncapped Strips all version specifiers from requirements. Discovers breakage.

Data Flow

CLI --mode flag
  → mode_callback validates against modes.toml
  → stored in ctx.obj["mode"]
  → passed to create_odoo_venv(mode=...)
  → load_modes() returns Mode dataclass
  → _resolve_mode_overrides() evaluates `when` markers against odoo_version/python_version
  → produces (ignore_lines, extra_reqs) merged into the main pipeline

How Each Mode Resolves

conservative / modern_resolve_mode_overrides() iterates the mode's overrides list. Each override has:

  • ignore: requirement specs added to the ignore list (filtered out of Odoo's requirements.txt)
  • install: replacement specs added as extra requirements
  • when: marker expression evaluated against odoo_version and python_version

bleeding-edge_resolve_mode_overrides() returns empty lists. Instead, _process_requirement_line() receives strip_specifiers=True and writes bare package names (e.g., urllib3 instead of urllib3==1.26.5), letting uv resolve to latest.

Inheritance

Modern inherits all conservative overrides at load time. Deduplication by package name — if both define the same package, modern's version wins (last-write). known_issues and extra_commands are also inherited. Bleeding-edge inherits nothing (overrides would contradict uncapped strategy).

Known Issues

Each mode can define known_issues — package/error-pattern pairs. When uv pip install fails, _check_known_issues() matches the failed package against these patterns and prints actionable suggestions.

@trisdoan trisdoan force-pushed the experiment/mode branch 5 times, most recently from f13684a to 2e5e87d Compare April 2, 2026 10:36
trisdoan added 3 commits April 2, 2026 17:39
Add mode-based overrides to fix OpenSSL 3.x incompatibility (Ubuntu
24.04+) when creating venvs with OCA addons for Odoo 12-17.

Conservative mode: exact pins per Odoo range
- Odoo 12-14: pyopenssl==22.1.0 + cryptography==38.0.4 (OCA caps)
- Odoo 15-17: pyopenssl>=24.0.0 + cryptography>=41.0.5

Modern mode: floor versions for all Odoo 12-17, resolver picks latest.

Migrate urllib3 override from presets.toml to modes.toml with corrected
scope (odoo_version >= 15.0 + python_version < 3.12).
Add dependency overrides to handle python-ldap/pyldap compatibility
issues
across Odoo versions due to OpenLDAP 2.5+ removing libldap_r:

- Odoo 12: Replace unmaintained pyldap with python-ldap>=3.4.2
- Odoo 13+: Bump python-ldap 3.4.0 to >=3.4.2 (3.4.0 hardcodes -lldap_r)
@trisdoan trisdoan marked this pull request as ready for review April 2, 2026 10:40
@trisdoan trisdoan requested a review from nilshamerlinck April 2, 2026 10:40
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant