Fix `pytest` config-dir isolation in subactors
The old (commented-out) `get_app_dir()` override gated on `'pytest' in sys.modules` which can NEVER work in spawned subactors (fresh procs, no pytest import); as a result test `paperboi`/daemon actors were writing into the user's REAL `~/.config/piker/accounting/` files.. friggin yikes. Deats, - add `config._maybe_use_test_dir()` which lazily (at conf-path access time, NOT import time) reads the `piker_test_dir` entry from `tractor.runtime._state._runtime_vars['piker_vars']` as pre-loaded by `open_piker_runtime()` from the `tests.conftest._open_test_pikerd()` overrides. - hook it in `get_conf_dir()` and route `get_conf_path()` + `load()`'s mkdir through `get_conf_dir()`. - route `.accounting._ledger` / `._pos` dir derivation through `config.get_conf_dir()` (was reading the `_config_dir` global directly, bypassing the override); also `mkdir(parents=True, exist_ok=True)` for nested tmp-dir creation. (this patch was generated in some part by [`claude-code`][claude-code-gh]) [claude-code-gh]: https://github.com/anthropics/claude-code Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
parent
fa98290808
commit
fa8d413c84
|
|
@ -324,10 +324,13 @@ def load_ledger(
|
||||||
ldir: Path = (
|
ldir: Path = (
|
||||||
dirpath
|
dirpath
|
||||||
or
|
or
|
||||||
config._config_dir / 'accounting' / 'ledgers'
|
config.get_conf_dir() / 'accounting' / 'ledgers'
|
||||||
)
|
)
|
||||||
if not ldir.is_dir():
|
if not ldir.is_dir():
|
||||||
ldir.mkdir()
|
ldir.mkdir(
|
||||||
|
parents=True,
|
||||||
|
exist_ok=True,
|
||||||
|
)
|
||||||
|
|
||||||
fname = f'trades_{brokername}_{acctid}.toml'
|
fname = f'trades_{brokername}_{acctid}.toml'
|
||||||
fpath: Path = ldir / fname
|
fpath: Path = ldir / fname
|
||||||
|
|
|
||||||
|
|
@ -785,9 +785,16 @@ def load_account(
|
||||||
legacy_fn: str = f'pps.{brokername}.{acctid}.toml'
|
legacy_fn: str = f'pps.{brokername}.{acctid}.toml'
|
||||||
fn: str = f'account.{brokername}.{acctid}.toml'
|
fn: str = f'account.{brokername}.{acctid}.toml'
|
||||||
|
|
||||||
dirpath: Path = dirpath or (config._config_dir / 'accounting')
|
dirpath: Path = (
|
||||||
|
dirpath
|
||||||
|
or
|
||||||
|
(config.get_conf_dir() / 'accounting')
|
||||||
|
)
|
||||||
if not dirpath.is_dir():
|
if not dirpath.is_dir():
|
||||||
dirpath.mkdir()
|
dirpath.mkdir(
|
||||||
|
parents=True,
|
||||||
|
exist_ok=True,
|
||||||
|
)
|
||||||
|
|
||||||
conf, path = config.load(
|
conf, path = config.load(
|
||||||
path=dirpath / fn,
|
path=dirpath / fn,
|
||||||
|
|
|
||||||
|
|
@ -188,6 +188,48 @@ def _override_config_dir(
|
||||||
_config_dir = path
|
_config_dir = path
|
||||||
|
|
||||||
|
|
||||||
|
def _maybe_use_test_dir() -> None:
|
||||||
|
'''
|
||||||
|
When running under the `pytest` harness, override
|
||||||
|
the config dir to the per-test-tmp dir "passed down"
|
||||||
|
the actor tree via `tractor`'s runtime-vars
|
||||||
|
inheritance mechanism.
|
||||||
|
|
||||||
|
See the `tractor_runtime_overrides` usage in our
|
||||||
|
`tests.conftest._open_test_pikerd()` as well as
|
||||||
|
`.service._actor_runtime.open_piker_runtime()` for
|
||||||
|
the root-actor's pre-loading of the var state.
|
||||||
|
|
||||||
|
NOTE: this must be checked lazily at config-path
|
||||||
|
access time (NOT import time) since sub-actors only
|
||||||
|
receive runtime-vars once their `tractor` runtime
|
||||||
|
has fully booted.
|
||||||
|
|
||||||
|
'''
|
||||||
|
global _config_dir
|
||||||
|
import tractor
|
||||||
|
actor = tractor.current_actor(
|
||||||
|
err_on_no_runtime=False,
|
||||||
|
)
|
||||||
|
if actor is None:
|
||||||
|
return
|
||||||
|
|
||||||
|
rvs: dict = tractor.runtime._state._runtime_vars
|
||||||
|
pvars: dict|None = rvs.get('piker_vars')
|
||||||
|
if (
|
||||||
|
pvars
|
||||||
|
and
|
||||||
|
(testdir := pvars.get('piker_test_dir'))
|
||||||
|
):
|
||||||
|
testdirpath = Path(testdir)
|
||||||
|
assert testdirpath.exists(), (
|
||||||
|
f'piker test harness might be borked!?\n'
|
||||||
|
f'testdirpath: {testdirpath!r}\n'
|
||||||
|
)
|
||||||
|
if _config_dir != testdirpath:
|
||||||
|
_override_config_dir(testdirpath)
|
||||||
|
|
||||||
|
|
||||||
def _conf_fn_w_ext(
|
def _conf_fn_w_ext(
|
||||||
name: str,
|
name: str,
|
||||||
) -> str:
|
) -> str:
|
||||||
|
|
@ -201,6 +243,7 @@ def get_conf_dir() -> Path:
|
||||||
on the local filesystem.
|
on the local filesystem.
|
||||||
|
|
||||||
'''
|
'''
|
||||||
|
_maybe_use_test_dir()
|
||||||
return _config_dir
|
return _config_dir
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -226,7 +269,7 @@ def get_conf_path(
|
||||||
assert str(conf_name) in _conf_names
|
assert str(conf_name) in _conf_names
|
||||||
|
|
||||||
fn = _conf_fn_w_ext(conf_name)
|
fn = _conf_fn_w_ext(conf_name)
|
||||||
return _config_dir / Path(fn)
|
return get_conf_dir() / Path(fn)
|
||||||
|
|
||||||
|
|
||||||
def repodir() -> Path:
|
def repodir() -> Path:
|
||||||
|
|
@ -271,8 +314,9 @@ def load(
|
||||||
|
|
||||||
'''
|
'''
|
||||||
# create the $HOME/.config/piker dir if dne
|
# create the $HOME/.config/piker dir if dne
|
||||||
if not _config_dir.is_dir():
|
conf_dir: Path = get_conf_dir()
|
||||||
_config_dir.mkdir(
|
if not conf_dir.is_dir():
|
||||||
|
conf_dir.mkdir(
|
||||||
parents=True,
|
parents=True,
|
||||||
exist_ok=True,
|
exist_ok=True,
|
||||||
)
|
)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue