Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .github/workflows/e2e.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,13 @@ jobs:
python_version: "3.13"

steps:
# Pre-install uv via official action with caching to avoid
# downloading from GitHub Releases on every matrix job.
- name: Install uv
uses: astral-sh/setup-uv@v6
with:
enable-cache: true

- name: Bootstrap
run: |
mkdir -p ~/code
Expand Down
6 changes: 3 additions & 3 deletions odoo_venv/cli/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
from odoo_venv.exceptions import PresetNotFoundError
from odoo_venv.launcher import create_launcher
from odoo_venv.main import create_odoo_venv
from odoo_venv.utils import initialize_presets, load_presets, run_migration
from odoo_venv.utils import initialize_presets, load_presets, run_migration, split_escaped

app = typer.Typer()
initialize_presets()
Expand Down Expand Up @@ -206,7 +206,7 @@ def create(
] = None,
extra_requirement: Annotated[
str | None,
typer.Option(help="Comma-separated list of extra packages to install."),
typer.Option(help="Comma-separated list of extra packages to install. Use \\, for a literal comma."),
] = None,
verbose: Annotated[
bool,
Expand Down Expand Up @@ -262,7 +262,7 @@ def create(
extra_requirements_list = []
if extra_requirement:
if isinstance(extra_requirement, str):
extra_requirements_list = extra_requirement.split(",")
extra_requirements_list = split_escaped(extra_requirement)
else:
extra_requirements_list = list(extra_requirement)

Expand Down
21 changes: 21 additions & 0 deletions odoo_venv/utils.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import re
import subprocess
import sys
from dataclasses import dataclass, fields
Expand All @@ -7,6 +8,26 @@
import tomli
from packaging.version import Version


def split_escaped(s: str, sep: str = ",") -> list[str]:
"""Split *s* on *sep*, honouring backslash-escaped separators.

Escaped separators (``\\,``) are preserved as literal characters in the
resulting items; unescaped separators are used as split points.

>>> split_escaped("sentry_sdk,requests")
['sentry_sdk', 'requests']
>>> split_escaped(r"sentry_sdk>=2.0.0\\,<=2.22.0")
['sentry_sdk>=2.0.0,<=2.22.0']
>>> split_escaped(r"a,sentry_sdk>=2.0.0\\,<=2.22.0,b")
['a', 'sentry_sdk>=2.0.0,<=2.22.0', 'b']
>>> split_escaped("")
['']
"""
parts = re.split(rf"(?<!\\){re.escape(sep)}", s)
return [p.replace(f"\\{sep}", sep) for p in parts]


ROOT_PATH = Path("~/.local/share/odoo-venv/").expanduser()
PRESETS_FILE = "presets.toml"
USER_PRESETS_PATH = ROOT_PATH / PRESETS_FILE
Expand Down
Loading