Skip to content

Commit 1582fd8

Browse files
authored
Merge pull request #25 from ArchiveBox/runtime-env
add better EUID loading, ENV handling, provider subpackage resolution…
2 parents 346ad0f + 80e4787 commit 1582fd8

54 files changed

Lines changed: 5352 additions & 2063 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

README.md

Lines changed: 78 additions & 62 deletions
Large diffs are not rendered by default.

abxpkg/__init__.py

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -71,20 +71,20 @@
7171
ALL_PROVIDERS = [
7272
EnvProvider,
7373
UvProvider,
74-
PipProvider,
7574
PnpmProvider,
76-
NpmProvider,
77-
YarnProvider,
78-
BunProvider,
79-
BrewProvider,
75+
PuppeteerProvider,
8076
GemProvider,
8177
GoGetProvider,
8278
CargoProvider,
79+
BrewProvider,
8380
PlaywrightProvider,
84-
PuppeteerProvider,
8581
AptProvider,
8682
NixProvider,
8783
DockerProvider,
84+
PipProvider,
85+
NpmProvider,
86+
BunProvider,
87+
YarnProvider,
8888
DenoProvider,
8989
AnsibleProvider,
9090
PyinfraProvider,
@@ -104,19 +104,32 @@ def _provider_class(provider: type[BinProvider] | BinProvider) -> type[BinProvid
104104
_provider_class(provider).__name__ for provider in ALL_PROVIDERS
105105
] # PipProvider, AptProvider, BrewProvider, etc.
106106

107+
108+
# Default provider names: names of providers that are enabled by default based on the current OS
109+
DEFAULT_PROVIDER_NAMES = [
110+
provider_name
111+
for provider_name in ALL_PROVIDER_NAMES
112+
if not (OPERATING_SYSTEM == "darwin" and provider_name == "apt")
113+
and provider_name not in ("ansible", "pyinfra")
114+
]
115+
107116
# Lazy provider singletons: maps provider name -> class
108117
# e.g. 'apt' -> AptProvider, 'pip' -> PipProvider, 'env' -> EnvProvider
109-
_PROVIDER_CLASS_BY_NAME = {
118+
PROVIDER_CLASS_BY_NAME = {
110119
_provider_class(provider).model_fields["name"].default: _provider_class(provider)
111120
for provider in ALL_PROVIDERS
112121
}
113122
_provider_singletons: dict = {}
114123

115124

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

@@ -166,6 +179,9 @@ def __getattr__(name: str):
166179
"DEFAULT_PATH",
167180
"DEFAULT_ENV_PATH",
168181
"PYTHON_BIN_DIR",
182+
"PROVIDER_CLASS_BY_NAME",
183+
"ALL_PROVIDER_NAMES",
184+
"DEFAULT_PROVIDER_NAMES",
169185
# BinProviders (classes)
170186
"EnvProvider",
171187
"AptProvider",

abxpkg/base_types.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,8 @@ def bin_abspaths(
272272
################## Types ##############################################
273273

274274
UNKNOWN_SHA256 = "unknown"
275+
UNKNOWN_MTIME = 0
276+
UNKNOWN_EUID = -1
275277

276278

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

287289

290+
def is_valid_mtime(mtime: int) -> int:
291+
assert mtime >= 0
292+
return mtime
293+
294+
295+
MTimeNs = Annotated[int, AfterValidator(is_valid_mtime)]
296+
297+
298+
def is_valid_euid(euid: int) -> int:
299+
assert euid >= UNKNOWN_EUID
300+
return euid
301+
302+
303+
EUID = Annotated[int, AfterValidator(is_valid_euid)]
304+
305+
288306
def is_valid_install_args(
289307
install_args: list[str] | tuple[str, ...] | str,
290308
) -> tuple[str, ...]:

0 commit comments

Comments
 (0)