Source code for qudi.util.paths
# -*- coding: utf-8 -*-
"""
.. Copyright (c) 2021, the qudi developers. See the AUTHORS.md file at the top-level directory of this
.. distribution and on <https://github.com/Ulm-IQO/qudi-core/>
..
.. This file is part of qudi.
..
.. Qudi is free software: you can redistribute it and/or modify it under the terms of
.. the GNU Lesser General Public License as published by the Free Software Foundation,
.. either version 3 of the License, or (at your option) any later version.
..
.. Qudi is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
.. without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
.. See the GNU Lesser General Public License for more details.
..
.. You should have received a copy of the GNU Lesser General Public License along with qudi.
.. If not, see <https://www.gnu.org/licenses/>.
ToDo: Throw errors around for non-existent directories
"""
__all__ = [
"get_appdata_dir",
"get_default_config_dir",
"get_default_log_dir",
"get_default_data_dir",
"get_daily_directory",
"get_home_dir",
"get_main_dir",
"get_userdata_dir",
"get_artwork_dir",
"get_module_app_data_path",
]
import datetime
import os
import sys
from typing import Optional
[docs]
def get_main_dir() -> str:
"""
Returns the absolute path to the directory of the main software.
Returns
-------
str
Path to the main tree of the software.
"""
import qudi.core as core
return os.path.abspath(os.path.join(os.path.dirname(core.__file__), ".."))
[docs]
def get_artwork_dir() -> str:
"""
Returns the absolute path to the Qudi artwork directory.
Returns
-------
str
Path to the artwork directory of Qudi.
"""
return os.path.join(get_main_dir(), "artwork")
[docs]
def get_home_dir() -> str:
"""
Returns the absolute path to the home directory.
Returns
-------
str
Absolute path to the home directory.
"""
return os.path.abspath(os.path.expanduser("~"))
[docs]
def get_userdata_dir(create_missing: Optional[bool] = False) -> str:
"""
Returns the absolute path to the Qudi subfolder in the user home directory.
This path should be used for exposed user data like config files, etc.
Returns
-------
str
Absolute path to the Qudi subfolder in the user home directory.
"""
path = os.path.join(get_home_dir(), "qudi")
# Create directory if desired. Will throw an exception if path returned by get_home_dir() is
# non-existent (which should never happen).
if create_missing and not os.path.exists(path):
os.mkdir(path)
return path
[docs]
def get_appdata_dir(create_missing: Optional[bool] = False) -> str:
"""
Get the system-specific application data directory.
Returns
-------
str
Path to the application data directory specific to the system.
"""
if sys.platform == "win32":
# resolves to "C:\Documents and Settings\<UserName>\Application Data" on XP and
# "C:\Users\<UserName>\AppData\Roaming" on win7 and newer
path = os.path.join(os.environ["APPDATA"], "qudi")
elif sys.platform == "darwin":
path = os.path.abspath(os.path.expanduser("~/Library/Preferences/qudi"))
else:
path = os.path.abspath(os.path.expanduser("~/.local/qudi"))
# Create path if desired.
if create_missing and not os.path.exists(path):
os.makedirs(path)
return path
[docs]
def get_default_config_dir(create_missing: Optional[bool] = False) -> str:
"""
Get the system-specific application data directory.
Returns
-------
str
Path to the application data directory specific to the system.
"""
path = os.path.join(get_userdata_dir(create_missing), "config")
# Create path if desired.
if create_missing and not os.path.exists(path):
os.mkdir(path)
return path
[docs]
def get_default_log_dir(create_missing: Optional[bool] = False) -> str:
"""
Get the system-specific application log directory.
Returns
-------
str
Path to the default logging directory specific to the system.
"""
# FIXME: This needs to be properly done for linux systems
path = os.path.join(get_userdata_dir(create_missing), "log")
# Create path if desired.
if create_missing and not os.path.exists(path):
os.mkdir(path)
return path
[docs]
def get_default_data_dir(create_missing: Optional[bool] = False) -> str:
"""
Get the system-specific application fallback data root directory.
This function does NOT consider Qudi configuration.
Returns
-------
str
Path to the default data root directory specific to the system.
"""
# FIXME: This needs to be properly done for linux systems
path = os.path.join(get_userdata_dir(create_missing), "Data")
# Create path if desired.
if create_missing and not os.path.exists(path):
os.mkdir(path)
return path
[docs]
def get_daily_directory(
timestamp: Optional[datetime.datetime] = None,
root: Optional[str] = None,
create_missing: Optional[bool] = False,
) -> str:
"""
Returns a path tree according to the timestamp given.
The directory structure will have the form: root/<YYYY>/<MM>/<YYYY-MM-DD>
If no root directory is given, this method will return just the relative path stub:
<YYYY>/<MM>/<YYYY-MM-DD>
Parameters
----------
timestamp : datetime.datetime, optional
Timestamp for which to create the daily directory. Defaults to current timestamp if not provided.
root : str, optional
Root path for the daily directory structure. If not provided, only the relative path stub is returned.
create_missing : bool, optional
Indicates if the directory should be created (True) or not (False). Only considered if root is given.
Returns
-------
str
Path representing the directory structure based on the timestamp.
"""
if timestamp is None:
timestamp = datetime.datetime.now()
day_dir = timestamp.strftime("%Y-%m-%d")
year_dir, month_dir = day_dir.split("-")[:2]
daily_path = os.path.join(year_dir, month_dir, day_dir)
if root is not None:
daily_path = os.path.join(root, daily_path)
if create_missing:
os.makedirs(daily_path, exist_ok=True)
return daily_path
[docs]
def get_module_app_data_path(cls_name: str, module_base: str, module_name: str) -> str:
"""Constructs the appData file path for the given qudi module"""
file_name = f"status-{cls_name}_{module_base}_{module_name}.cfg"
return os.path.join(get_appdata_dir(), file_name)