Source code for finam.tools.cwd_helper
"""Working directory helpers."""
import os
from contextlib import contextmanager
from .log_helper import ErrorLogger, is_loggable
[docs]
@contextmanager
def set_directory(path):
"""Sets the cwd within a context.
Parameters
----------
path : Path
Path to the desired cwd.
Yields
------
None
"""
origin = os.getcwd()
try:
os.chdir(path)
yield
finally:
os.chdir(origin)
[docs]
def execute_in_cwd(func):
"""Decorator to execute method in given cwd of containing class.
Parameters
----------
func : callable
Method of a class.
Returns
-------
callable
Wrapped function to be executed in cwd.
Notes
-----
The containing class of the given method needs to have a "cwd" property.
"""
def cwd_wrapper(self, *args, **kwargs):
"""Wrapper function."""
cwd = getattr(self, "cwd", None)
with ErrorLogger(getattr(self, "logger", None), do_log=is_loggable(self)):
if cwd is None:
raise ValueError("No working directory given.")
with set_directory(cwd):
return func(self, *args, **kwargs)
return cwd_wrapper