meta_package_manager.managers.lure module¶

class meta_package_manager.managers.lure.Lure[source]¶

Bases: PackageManager

LURE, the Linux User REpository: an AUR-shaped build system for any distro.

A package is a build recipe in a git repository LURE clones, and the resulting artifact is handed to the host’s own package manager, so LURE reaches packages no distro archive carries while leaving the installed state with apt, dnf, pacman or whichever backend the host runs.

Important

LURE escalates itself and refuses to be escalated. It aborts as root with “Running LURE as root is forbidden as it may cause catastrophic damage to your system”, and calls its own configured RootCmd (sudo by default) for the privileged half. mpm therefore marks nothing here privileged, the same treatment chromebrew gets.

Caution

remove and upgrade are absent, and the reason is one field. LURE’s default backend options set NoConfirm: false, and only its build path flips it true, so an install reaches the backend as apt install -y while a removal reaches it as a bare apt remove and blocks forever on a confirmation prompt no mpm run can answer. --pm-args can push a flag through, but the right flag is the backend’s own: -y suits apt, dnf and zypper, while pacman reads -y as refresh the databases, so there is no value mpm could pass without knowing a backend it cannot resolve.

Note

Every subcommand pulls its repositories before doing anything else, so even a listing costs a network round-trip and prints the git progress on <stderr>. Only the packages themselves reach <stdout>.

Documentation: LURE readme.

Initialize cli_errors list.

maintenance_note: str | None = 'LURE\'s own forge at `git.elara.ws` answers `502` and `lure.sh` answers `404` behind a placeholder certificate, so its installer and release binaries are both unreachable and the tool has to be built from source. Its author announced a pause rather than an end in [lure-sh/lure#89](https://github.com/lure-sh/lure/issues/89) on 2025-05-04, *"I intend to start working on it again as soon as I\'m in a stable position again"*, and the recipe repository this manager reads is on GitHub and still moving.'¶

A watch note about a still-maintained upstream whose activity is slowing or whose status is ambiguous, as a MyST markdown block.

Unlike unmaintained, this is purely informational: the manager stays in the default selection and in the test matrices. It renders as a {note} admonition atop the manager’s documentation page, flagging upstreams worth keeping an eye on (a slow release cadence, superseded-but-still-shipped tools, a discontinued platform still under vendor support). May embed markdown links. Mutually exclusive with unmaintained: a confirmed-dead manager carries an unmaintained_message instead. Enforced by test_maintenance_note.

name: str = 'LURE'¶

Return package manager’s common name.

Default value is based on class name.

homepage_url: str | None = 'https://github.com/lure-sh/lure'¶

Home page of the project, only used in documentation for reference.

platforms: frozenset[Platform] | Group | Platform | Iterable[Platform | Group] = frozenset({Platform(id='almalinux', name='AlmaLinux'), Platform(id='alpine', name='Alpine Linux'), Platform(id='altlinux', name='ALT Linux'), Platform(id='amzn', name='Amazon Linux'), Platform(id='android', name='Android'), Platform(id='arch', name='Arch Linux'), Platform(id='buildroot', name='Buildroot'), Platform(id='cachyos', name='CachyOS'), Platform(id='centos', name='CentOS'), Platform(id='chromeos', name='ChromeOS'), Platform(id='clearlinux', name='Clear Linux OS'), Platform(id='cloudlinux', name='CloudLinux OS'), Platform(id='crux', name='CRUX'), Platform(id='debian', name='Debian'), Platform(id='endeavouros', name='EndeavourOS'), Platform(id='exherbo', name='Exherbo Linux'), Platform(id='fedora', name='Fedora'), Platform(id='generic_linux', name='Generic Linux'), Platform(id='gentoo', name='Gentoo Linux'), Platform(id='guix', name='Guix System'), Platform(id='ibm_powerkvm', name='IBM PowerKVM'), Platform(id='kali', name='Kali Linux'), Platform(id='kvmibm', name='KVM for IBM z Systems'), Platform(id='linuxmint', name='Linux Mint'), Platform(id='mageia', name='Mageia'), Platform(id='mandriva', name='Mandriva Linux'), Platform(id='manjaro', name='Manjaro Linux'), Platform(id='nixos', name='NixOS'), Platform(id='nobara', name='Nobara'), Platform(id='nutyx', name='NuTyX'), Platform(id='opensuse', name='openSUSE'), Platform(id='openwrt', name='OpenWrt'), Platform(id='oracle', name='Oracle Linux'), Platform(id='parallels', name='Parallels'), Platform(id='pidora', name='Pidora'), Platform(id='pikaos', name='PikaOS'), Platform(id='raspbian', name='Raspbian'), Platform(id='rhel', name='RedHat Enterprise Linux'), Platform(id='rocky', name='Rocky Linux'), Platform(id='scientific', name='Scientific Linux'), Platform(id='slackware', name='Slackware'), Platform(id='sles', name='SUSE Linux Enterprise Server'), Platform(id='slitaz', name='SliTaz GNU/Linux'), Platform(id='solus', name='Solus'), Platform(id='sourcemage', name='Source Mage GNU/Linux'), Platform(id='tuxedo', name='Tuxedo OS'), Platform(id='ubuntu', name='Ubuntu'), Platform(id='ultramarine', name='Ultramarine'), Platform(id='void', name='Void Linux'), Platform(id='wsl1', name='Windows Subsystem for Linux v1'), Platform(id='wsl2', name='Windows Subsystem for Linux v2'), Platform(id='xenserver', name='XenServer')})¶

List of platforms supported by the manager.

Allows for a mishmash of platforms and groups of platforms. Will be normalized into a frozenset of Platform instances at instantiation.

requirement: str | None = '>=0.1.3'¶

The newest release, and the one this parser was checked against: list.go already carries the installed flag there.

The build driven here is that tag plus a single commit touching the install script, LURE having tagged nothing since.

cli_names: tuple[str, ...] = ('lure',)¶

List of CLI names the package manager is known as.

This list of recognized CLI names is ordered by priority. That way we can influence the search of the right binary.

..hint::

This was helpful in the case of the Python transition from 2.x to 3.x, where multiple versions of the same executable were named python or python3.

By default, this property’s value is derived from the manager’s ID (see the MetaPackageManager.__init__ method above).

version_cli_options: tuple[str, ...] = ('version',)¶

lure --version is rejected as flag provided but not defined, the version living behind a subcommand instead.

version_regexes: tuple[str, ...] = ('v?(?P<version>\\d+\\.\\d+\\.\\d+)',)¶
$ lure version
v0.1.3
property version: TokenizedString | None[source]¶

Parse the version off <stderr>, where LURE alone prints it.

lure version reaches Go’s builtin println, which writes to <stderr> and leaves <stdout> empty, so the inherited probe (reading the return value of run_cli()) would find nothing and leave the manager permanently unavailable.

Both streams are searched, not <stderr> alone: a version that moved to <stdout> should not take the manager offline.

id: str = 'lure'¶

Package manager’s ID.

Derived by defaults from the lower-cased class name in which underscores _ are replaced by dashes -.

This ID must be unique among all package manager definitions and lower-case, as they’re used as feature flags for the mpm CLI.

property installed: Iterator[Package]¶

Fetch installed packages.

The version is the built artifact’s, carrying the recipe’s release number, where search() reports the recipe’s own.

$ lure list --installed
default/neofetch 7.1.0-1
virtual: bool = False¶

Should we expose the package manager to the user?

Virtual package manager are just skeleton classes used to factorize code among managers of the same family.

search(query, extended, exact)[source]¶

Fetch matching packages.

LURE has no search verb: list prints the whole catalog of every repository it tracks, and mpm’s own refiltering narrows it.

Caution

Search does not support extended or exact matching, and the query never reaches LURE.

$ lure list
default/admc 0.13.0-alt1
default/admc-git 3592.023670c
default/binutils-z80 2.43
default/cava 0.9.1
default/cava-git 0
default/deduplicator 0.1.6
Return type:

Iterator[Package]

install(package_id, version=None)[source]¶

Install one package, building it from its recipe.

This is the one path LURE runs non-interactively on its own: the build sets NoConfirm, so the backend is handed its own confirmation flag.

$ lure install neofetch
Return type:

str

sync()[source]¶

Pull every tracked recipe repository.

$ lure refresh
Return type:

None