rexprun 0.2.1__tar.gz → 0.2.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {rexprun-0.2.1 → rexprun-0.2.2}/MANIFEST.in +1 -0
- {rexprun-0.2.1/rexprun.egg-info → rexprun-0.2.2}/PKG-INFO +1 -1
- {rexprun-0.2.1 → rexprun-0.2.2}/pyproject.toml +1 -1
- {rexprun-0.2.1 → rexprun-0.2.2}/rexp/docs//344/275/277/347/224/250/350/257/264/346/230/216/344/271/246.md +4 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/rexp/server/environments.py +15 -1
- {rexprun-0.2.1 → rexprun-0.2.2}/rexp/skills/platform-operations/SKILL.md +6 -0
- rexprun-0.2.2/rexp/version.py +1 -0
- {rexprun-0.2.1 → rexprun-0.2.2/rexprun.egg-info}/PKG-INFO +1 -1
- {rexprun-0.2.1 → rexprun-0.2.2}/tests/test_environment_setup.py +18 -0
- rexprun-0.2.1/rexp/version.py +0 -1
- {rexprun-0.2.1 → rexprun-0.2.2}/LICENSE +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/README.md +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/rexp/__init__.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/rexp/__main__.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/rexp/cli/__init__.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/rexp/cli/main.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/rexp/cli/templates/ascend_smoke/README.md +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/rexp/cli/templates/ascend_smoke/configs/smoke.yaml +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/rexp/cli/templates/ascend_smoke/experiment/experiment.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/rexp/cli/templates/default/README.md +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/rexp/cli/templates/default/analysis/analyze.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/rexp/cli/templates/default/configs/full.yaml +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/rexp/cli/templates/default/configs/smoke.yaml +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/rexp/cli/templates/default/evaluation/summarize.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/rexp/cli/templates/default/experiment/README.md +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/rexp/cli/templates/default/experiment/experiment.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/rexp/cli/templates/default/experiment/experiment_helpers.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/rexp/cli/templates/default/tests/test_experiment.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/rexp/cli/templates/dlm_kv_staleness/README.md +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/rexp/cli/templates/dlm_kv_staleness/configs/full.yaml +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/rexp/cli/templates/dlm_kv_staleness/configs/smoke.yaml +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/rexp/cli/templates/dlm_kv_staleness/evaluation/kv_error.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/rexp/cli/templates/dlm_kv_staleness/experiment/kv_staleness.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/rexp/cli/templates/ray_tune/README.md +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/rexp/cli/templates/ray_tune/configs/smoke.yaml +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/rexp/cli/templates/ray_tune/experiment/trainable.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/rexp/cli/templates/ray_tune_npu/README.md +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/rexp/cli/templates/ray_tune_npu/configs/smoke.yaml +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/rexp/cli/templates/ray_tune_npu/experiment/trainable.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/rexp/core/__init__.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/rexp/core/accelerators.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/rexp/core/conda.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/rexp/core/config.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/rexp/core/machine.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/rexp/core/paths.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/rexp/core/process.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/rexp/core/provenance.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/rexp/core/resources.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/rexp/core/run_lock.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/rexp/core/schemas.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/rexp/core/state_store.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/rexp/core/states.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/rexp/core/storage.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/rexp/core/tuning.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/rexp/datasets/__init__.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/rexp/datasets/base.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/rexp/datasets/huggingface.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/rexp/datasets/local_jsonl.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/rexp/docs/schemas.md +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/rexp/models/__init__.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/rexp/models/base.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/rexp/models/dream.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/rexp/models/llada.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/rexp/server/__init__.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/rexp/server/analysis.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/rexp/server/assets.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/rexp/server/dependencies.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/rexp/server/envprobe.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/rexp/server/evaluation.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/rexp/server/mcp.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/rexp/server/node.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/rexp/server/run_cleanup.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/rexp/server/runner.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/rexp/server/scheduler.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/rexp/server/script_execution.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/rexp/server/script_worker.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/rexp/server/services.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/rexp/server/setup.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/rexp/server/trial_queue.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/rexp/server/tuning.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/rexp/skills/experiment-authoring/SKILL.md +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/rexprun.egg-info/SOURCES.txt +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/rexprun.egg-info/dependency_links.txt +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/rexprun.egg-info/entry_points.txt +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/rexprun.egg-info/requires.txt +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/rexprun.egg-info/top_level.txt +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/setup.cfg +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/tests/test_adapters.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/tests/test_ascend.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/tests/test_assets.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/tests/test_bundled_resources.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/tests/test_cli.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/tests/test_command_audit.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/tests/test_crash_recovery.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/tests/test_env_selection.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/tests/test_environment_catalog.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/tests/test_experiment_loading.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/tests/test_first_use_regressions.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/tests/test_initial_setup.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/tests/test_lifecycle.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/tests/test_network_config.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/tests/test_pause_resume.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/tests/test_platform_info.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/tests/test_plugin_interfaces.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/tests/test_process_linux.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/tests/test_project_deps.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/tests/test_research_catalog.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/tests/test_retry.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/tests/test_run_cleanup.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/tests/test_run_metadata.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/tests/test_runs_limit.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/tests/test_scheduler_checks.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/tests/test_scheduler_gpu.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/tests/test_script_environment.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/tests/test_skills_bundled.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/tests/test_startup_resume.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/tests/test_storage.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/tests/test_trial_queue.py +0 -0
- {rexprun-0.2.1 → rexprun-0.2.2}/tests/test_tuning.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: rexprun
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.2
|
|
4
4
|
Summary: Research experiment orchestration with resource-aware scheduling, isolated environments, checkpoint recovery, and Ray Tune searches on GPUs and Ascend NPUs.
|
|
5
5
|
Author: REXP contributors
|
|
6
6
|
License: MIT
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "rexprun"
|
|
7
|
-
version = "0.2.
|
|
7
|
+
version = "0.2.2"
|
|
8
8
|
description = "Research experiment orchestration with resource-aware scheduling, isolated environments, checkpoint recovery, and Ray Tune searches on GPUs and Ascend NPUs."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
@@ -51,6 +51,10 @@ Windows 安装后的命令通常是 `<Conda环境>\Scripts\rexp.exe`。
|
|
|
51
51
|
其他实验环境用 `rexp node env create NAME --python 3.11 --description "中文用途及限制"` 创建、登记在 `<根目录>/env/NAME`;uv/Conda 可按版本创建,venv 需要已安装的 Python 可执行文件(可用 `--python /path/to/python`)。优先复用已有兼容环境;云镜像的 TorchNPU/CANN 环境也可用 `node env add --python` 登记,不重装驱动。Conda prefix 环境与 uv/venv 一样由平台记录绝对解释器路径;既有 Conda 命名环境继续支持 `--conda-env` 登记。`env/platform` 保留给平台,不能登记为普通实验环境。
|
|
52
52
|
|
|
53
53
|
环境设置失败保留数据根目录,修复原因后重跑相同 init。依赖下载失败但解释器已建好时可重试安装;解释器创建中断留下不完整目录时会提示先检查,不自动删除。首次初始化保存用户默认根目录;已有默认根目录时用 `--save-default` 显式切换。安装后分别检查插件内和不设置 PLATFORM_ROOT 的普通终端 `rexp doctor --json`,确认根目录、绑定管理器、平台解释器及 default 环境一致。
|
|
54
|
+
|
|
55
|
+
Agent 首次询问管理器时应给出完整三项:安装 uv(推荐)、安装 Conda、使用现有 Python venv(不安装管理器)。推荐 uv 不会移除 Conda 选项。环境创建/安装显示当前步骤;pip/uv 默认每次网络请求超时 15 秒、重试一次,用户显式配置优先,整个初始化仍有独立总时限。
|
|
56
|
+
|
|
57
|
+
离线安装先准备匹配远端 OS/架构/Python ABI 的完整 wheelhouse,然后设置 `UV_OFFLINE=true UV_FIND_LINKS=<目录> PIP_NO_INDEX=1 PIP_FIND_LINKS=<目录>` 执行相同 init。`uv venv --seed` 也需要种子包(所选 Python 所需的 pip/setuptools/wheel);集合应另包含 default 的 NumPy 等依赖。仅设置 `UV_NO_INDEX=1` 不能让 uv 离线。已有 wheelhouse 时直接离线使用;失败后检查环境,不重复长时间联网尝试。
|
|
54
58
|
`rexp doctor --json` 与 `rexp platform info --json` 的 `experiment_setup` 返回登记状态:
|
|
55
59
|
`needs_environment` 表示没有实验环境,`registered` 只代表已登记,实际实验仍须检查项目依赖。
|
|
56
60
|
至少登记一个可用实验环境;未登记名为 `default` 的环境时,在实验 YAML 中显式指定 `environment:`,
|
|
@@ -41,7 +41,21 @@ def select_manager(available, requested="auto", existing=None):
|
|
|
41
41
|
|
|
42
42
|
|
|
43
43
|
def run(command, timeout=900):
|
|
44
|
-
|
|
44
|
+
# A failed index request should not consume pip/uv's long default retries.
|
|
45
|
+
# Explicit operator settings (including offline wheelhouses) still win.
|
|
46
|
+
child_env = os.environ.copy()
|
|
47
|
+
for key, value in {"PIP_DEFAULT_TIMEOUT": "15", "PIP_RETRIES": "1",
|
|
48
|
+
"PIP_DISABLE_PIP_VERSION_CHECK": "1",
|
|
49
|
+
"UV_HTTP_TIMEOUT": "15", "UV_HTTP_RETRIES": "1"}.items():
|
|
50
|
+
child_env.setdefault(key, value)
|
|
51
|
+
argv = [str(x) for x in command]
|
|
52
|
+
print(f"Environment step: {Path(argv[0]).name} {' '.join(argv[1:3])}", flush=True)
|
|
53
|
+
try:
|
|
54
|
+
result = subprocess.run(argv, capture_output=True, text=True, timeout=timeout, env=child_env)
|
|
55
|
+
except subprocess.TimeoutExpired as exc:
|
|
56
|
+
raise RuntimeError(f"Environment step timed out after {timeout}s. Inspect the existing environment before retrying; "
|
|
57
|
+
"for a prepared wheelhouse use UV_OFFLINE=true UV_FIND_LINKS=<directory> "
|
|
58
|
+
"and PIP_NO_INDEX=1 PIP_FIND_LINKS=<directory>.") from exc
|
|
45
59
|
if result.returncode:
|
|
46
60
|
raise RuntimeError(f"Environment command failed: {(result.stderr or result.stdout)[-1500:]}")
|
|
47
61
|
return result.stdout
|
|
@@ -61,6 +61,12 @@ REXP = Research Experiment Platform:单节点、离线优先的个人科研实
|
|
|
61
61
|
用途自行选择,并告知实际位置。已有平台根目录优先保留,不在源码、cache 或临时目录下另起安装。
|
|
62
62
|
`rexp init` 会检测 Conda 与 uv:首次配置时两者都有优先 uv,只有一个则绑定该管理器。都没有时交互询问是否安装 uv/Conda;选择不安装则使用 Python venv。`--yes` 不擅自安装管理器,缺少管理器时使用 venv;Agent 应先询问用户,再通过 `--install-manager uv|conda` 明确表达安装授权,也可用 `--env-manager uv|conda|venv` 指定已安装的管理器。已绑定的管理器保留,除非显式切换。
|
|
63
63
|
|
|
64
|
+
Agent 提问时必须完整列出:**安装 uv(推荐)/安装 Conda/使用现有 Python venv、不安装管理器**。推荐顺序不能成为省略 Conda 的理由;仅在目标系统/架构确实不支持时说明限制。探测常见安装位置,不能只凭非登录 shell 的 `command -v` 就断言不存在。确认目录与选择后按插件清单安装,不反复遍历本机配置、技能或读取平台源码。
|
|
65
|
+
|
|
66
|
+
下载失败时先说明失败阶段、耗时和下一步,检查已有进程/环境后再重试。初始化的 pip/uv 网络默认超时 15 秒、重试一次,保留用户显式配置;这不是整个初始化过程的总时限。来源已确认不可达时,不重复发起长时间在线安装;可使用用户认可的依赖镜像,或控制端准备匹配远端 OS/架构/Python ABI 的官方 wheel。
|
|
67
|
+
|
|
68
|
+
离线 wheelhouse 同时设置 `UV_OFFLINE=true UV_FIND_LINKS=<目录>` 与 `PIP_NO_INDEX=1 PIP_FIND_LINKS=<目录>`,再执行原 init。`UV_NO_INDEX=1` 不能替代 `UV_OFFLINE=true`;`uv venv --seed` 也会获取种子包,所以集合需包含所选 Python 版本所需的 pip/setuptools/wheel 及 default 的 NumPy、PyYAML、pydantic、packaging 等完整依赖。已有 wheelhouse 时直接离线安装,不再发起在线安装试探;保留 SSH 长连接,不为初始化重启 MCP/Web。
|
|
69
|
+
|
|
64
70
|
平台复用现有独立运行环境;从系统 Python 或 Conda base 初始化时准备 `<根目录>/env/platform` 并安装平台,原全局 `rexp` 命令会转交给已配置的平台 Python。平台无需 PyTorch,不安装科研依赖。默认实验环境为 `<根目录>/env/default`,登记为 `default`,安装 NumPy、PyYAML、pydantic、packaging 等轻量分析/runner 依赖。已有 default 保留并检查解释器存在;不自动启动调度器。`--skip-default-env` 仅初始化存储,跳过全部环境准备。
|
|
65
71
|
|
|
66
72
|
其他实验环境用 `rexp node env create NAME --python 3.11 --description "中文用途及限制"` 创建、登记在 `<根目录>/env/NAME`;uv/Conda 可按版本创建,venv 需要已安装的 Python 可执行文件(可用 `--python /path/to/python`)。优先复用已有兼容环境;云镜像的 TorchNPU/CANN 环境也可用 `node env add --python` 登记,不重装驱动。Conda prefix 环境与 uv/venv 一样由平台记录绝对解释器路径;既有 Conda 命名环境继续支持 `--conda-env` 登记。`env/platform` 保留给平台,不能登记为普通实验环境。
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.2.2"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: rexprun
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.2
|
|
4
4
|
Summary: Research experiment orchestration with resource-aware scheduling, isolated environments, checkpoint recovery, and Ray Tune searches on GPUs and Ascend NPUs.
|
|
5
5
|
Author: REXP contributors
|
|
6
6
|
License: MIT
|
|
@@ -50,6 +50,24 @@ class TestEnvironmentSetup(unittest.TestCase):
|
|
|
50
50
|
with self.assertRaises(ValueError):
|
|
51
51
|
env.select_manager({}, 'invalid')
|
|
52
52
|
|
|
53
|
+
def test_install_network_limits_preserve_offline_and_user_settings(self):
|
|
54
|
+
with mock.patch.dict(os.environ, {'UV_OFFLINE': 'true', 'UV_FIND_LINKS': '/wheels',
|
|
55
|
+
'PIP_NO_INDEX': '1', 'PIP_FIND_LINKS': '/wheels', 'UV_HTTP_TIMEOUT': '45'}, clear=True), \
|
|
56
|
+
mock.patch.object(env.subprocess, 'run', return_value=subprocess.CompletedProcess([], 0, 'ready', '')) as run:
|
|
57
|
+
self.assertEqual(env.run(['/uv', 'pip', 'install']), 'ready')
|
|
58
|
+
inherited = run.call_args.kwargs['env']
|
|
59
|
+
self.assertEqual(inherited['UV_HTTP_TIMEOUT'], '45')
|
|
60
|
+
self.assertEqual(inherited['UV_HTTP_RETRIES'], '1')
|
|
61
|
+
self.assertEqual(inherited['PIP_DEFAULT_TIMEOUT'], '15')
|
|
62
|
+
self.assertEqual(inherited['PIP_RETRIES'], '1')
|
|
63
|
+
for key in ('UV_OFFLINE', 'UV_FIND_LINKS', 'PIP_NO_INDEX', 'PIP_FIND_LINKS'):
|
|
64
|
+
self.assertIn(key, inherited)
|
|
65
|
+
|
|
66
|
+
def test_environment_timeout_has_repair_guidance(self):
|
|
67
|
+
with mock.patch.object(env.subprocess, 'run', side_effect=subprocess.TimeoutExpired(['uv'], 10)):
|
|
68
|
+
with self.assertRaisesRegex(RuntimeError, 'UV_OFFLINE=true'):
|
|
69
|
+
env.run(['/uv', 'venv'], timeout=10)
|
|
70
|
+
|
|
53
71
|
def test_existing_binding_is_stable(self):
|
|
54
72
|
manager = self.bind()
|
|
55
73
|
self.assertEqual(env.select_manager({'uv': '/uv'}, existing=manager), manager)
|
rexprun-0.2.1/rexp/version.py
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__version__ = "0.2.1"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{rexprun-0.2.1 → rexprun-0.2.2}/rexp/cli/templates/dlm_kv_staleness/experiment/kv_staleness.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|