Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
f3b3524
add better EUID loading, ENV handling, provider subpackage resolution…
pirate Apr 13, 2026
85efd95
split dependency binaries and installed binaries properly
pirate Apr 13, 2026
b677650
bump version
pirate Apr 13, 2026
6abd53f
readme updates
pirate Apr 13, 2026
ae31eab
Update abxpkg/binprovider.py
pirate Apr 13, 2026
f69166f
Merge branch 'main' into runtime-env
pirate Apr 13, 2026
f103a28
test fixes
pirate Apr 13, 2026
cb80fca
comments
pirate Apr 13, 2026
9b2eb7f
bump version
pirate Apr 13, 2026
d3edcbb
fix provider test drift
pirate Apr 13, 2026
b18b493
fix installer cache path handling
pirate Apr 13, 2026
54fa05a
fix installer cache writes and env proxy paths
pirate Apr 13, 2026
be63b4b
fix ambient dependency provider resolution
pirate Apr 13, 2026
41c2ba5
fix env relinking and nix profile cache path
pirate Apr 13, 2026
31a4043
test fixes
pirate Apr 13, 2026
fcb861e
Fix installer provenance and targeted CI regressions
pirate Apr 13, 2026
b0cee9c
Tighten pip and pnpm env handling
pirate Apr 13, 2026
cd5004f
Respect explicit provider selection in dependency resolution
pirate Apr 13, 2026
8235fcd
Fallback installer resolution to env when self-only
pirate Apr 13, 2026
0f83296
Limit brew postinstall disable support to install
pirate Apr 13, 2026
fc5f3b6
Drop dead brew update postinstall branch
pirate Apr 14, 2026
3d0a2e7
Merge same-name script dependency options into run binary
pirate Apr 14, 2026
ae23e7f
Resolve nullable security defaults in base actions
pirate Apr 14, 2026
60baf01
Update tests/conftest.py
pirate Apr 14, 2026
80e4787
Update tests/test_binary.py
pirate Apr 14, 2026
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
140 changes: 78 additions & 62 deletions README.md

Large diffs are not rendered by default.

34 changes: 25 additions & 9 deletions abxpkg/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -71,20 +71,20 @@
ALL_PROVIDERS = [
EnvProvider,
UvProvider,
PipProvider,
PnpmProvider,
NpmProvider,
YarnProvider,
BunProvider,
BrewProvider,
PuppeteerProvider,
GemProvider,
GoGetProvider,
CargoProvider,
BrewProvider,
PlaywrightProvider,
PuppeteerProvider,
AptProvider,
NixProvider,
DockerProvider,
PipProvider,
NpmProvider,
BunProvider,
YarnProvider,
DenoProvider,
AnsibleProvider,
PyinfraProvider,
Expand All @@ -104,19 +104,32 @@ def _provider_class(provider: type[BinProvider] | BinProvider) -> type[BinProvid
_provider_class(provider).__name__ for provider in ALL_PROVIDERS
] # PipProvider, AptProvider, BrewProvider, etc.


# Default provider names: names of providers that are enabled by default based on the current OS
DEFAULT_PROVIDER_NAMES = [
provider_name
for provider_name in ALL_PROVIDER_NAMES
if not (OPERATING_SYSTEM == "darwin" and provider_name == "apt")
and provider_name not in ("ansible", "pyinfra")
]

# Lazy provider singletons: maps provider name -> class
# e.g. 'apt' -> AptProvider, 'pip' -> PipProvider, 'env' -> EnvProvider
_PROVIDER_CLASS_BY_NAME = {
PROVIDER_CLASS_BY_NAME = {
_provider_class(provider).model_fields["name"].default: _provider_class(provider)
for provider in ALL_PROVIDERS
}
_provider_singletons: dict = {}


# Lazy provider singletons: maps provider name -> class
# e.g. 'apt' -> AptProvider, 'pip' -> PipProvider, 'env' -> EnvProvider
# This is a lazy singleton pattern that allows us to instantiate providers
# only when they are needed, and not when the module is imported.
def __getattr__(name: str):
if name in _PROVIDER_CLASS_BY_NAME:
if name in PROVIDER_CLASS_BY_NAME:
if name not in _provider_singletons:
_provider_singletons[name] = _PROVIDER_CLASS_BY_NAME[name]()
_provider_singletons[name] = PROVIDER_CLASS_BY_NAME[name]()
return _provider_singletons[name]
raise AttributeError(f"module {__name__!r} has no attribute {name!r}")

Expand Down Expand Up @@ -166,6 +179,9 @@ def __getattr__(name: str):
"DEFAULT_PATH",
"DEFAULT_ENV_PATH",
"PYTHON_BIN_DIR",
"PROVIDER_CLASS_BY_NAME",
"ALL_PROVIDER_NAMES",
"DEFAULT_PROVIDER_NAMES",
# BinProviders (classes)
"EnvProvider",
"AptProvider",
Expand Down
18 changes: 18 additions & 0 deletions abxpkg/base_types.py
Original file line number Diff line number Diff line change
Expand Up @@ -272,6 +272,8 @@ def bin_abspaths(
################## Types ##############################################

UNKNOWN_SHA256 = "unknown"
UNKNOWN_MTIME = 0
UNKNOWN_EUID = -1


def is_valid_sha256(sha256: str) -> str:
Expand All @@ -285,6 +287,22 @@ def is_valid_sha256(sha256: str) -> str:
Sha256 = Annotated[str, AfterValidator(is_valid_sha256)]


def is_valid_mtime(mtime: int) -> int:
assert mtime >= 0
return mtime


MTimeNs = Annotated[int, AfterValidator(is_valid_mtime)]


def is_valid_euid(euid: int) -> int:
assert euid >= UNKNOWN_EUID
return euid


EUID = Annotated[int, AfterValidator(is_valid_euid)]


def is_valid_install_args(
install_args: list[str] | tuple[str, ...] | str,
) -> tuple[str, ...]:
Expand Down
Loading
Loading