# -*- coding: utf-8 -*-
"""
JSON schema to be used by jsonschema.validate on YAML qudi configuration files.
.. This file contains models of exponential decay fitting routines for qudi based on the lmfit package.
..
.. 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/>.
"""
__all__ = ['config_schema', 'local_module_config_schema', 'remote_module_config_schema']
from typing import Dict, Any
__module_name_pattern = r'[a-zA-Z_]+[a-zA-Z0-9_]*'
[docs]
def config_schema() -> Dict[str, Any]:
"""Creates and returns the JSON schema for a qudi configuration"""
return {
'type': 'object',
'additionalProperties': False,
'properties': {
'global': {
'type': 'object',
'additionalProperties': True,
'default': dict(),
'properties': {
'startup_modules': {
'type': 'array',
'uniqueItems': True,
'items': {
'type': 'string',
'pattern': f'^{__module_name_pattern}$',
},
'default': list(),
},
'remote_modules_server': {
'type': ['null', 'object'],
'required': ['address', 'port'],
'default': None,
'additionalProperties': False,
'properties': {
'address': {
'type': 'string',
},
'port': {'type': 'integer', 'minimum': 0, 'maximum': 65535},
'certfile': {'type': ['null', 'string'], 'default': None},
'keyfile': {'type': ['null', 'string'], 'default': None},
},
},
'namespace_server_port': {
'type': 'integer',
'minimum': 0,
'maximum': 65535,
'default': 18861,
},
'force_remote_calls_by_value': {'type': 'boolean', 'default': True},
'hide_manager_window': {'type': 'boolean', 'default': False},
'stylesheet': {
'type': 'string',
'pattern': r'^[^.]+\.qss$',
'default': 'qdark.qss',
},
'daily_data_dirs': {'type': 'boolean', 'default': True},
'default_data_dir': {'type': ['null', 'string'], 'default': None},
'extension_paths': {
'type': 'array',
'uniqueItems': True,
'items': {'type': 'string'},
'default': list(),
},
},
},
'gui': {
'type': 'object',
'propertyNames': {'pattern': f'^{__module_name_pattern}$'},
'additionalProperties': {'$ref': '#/$defs/local_module'},
'default': dict(),
},
'logic': {
'type': 'object',
'propertyNames': {'pattern': f'^{__module_name_pattern}$'},
'additionalProperties': {
'oneOf': [
{'$ref': '#/$defs/local_module'},
{'$ref': '#/$defs/remote_module'},
]
},
'default': dict(),
},
'hardware': {
'type': 'object',
'propertyNames': {'pattern': f'^{__module_name_pattern}$'},
'additionalProperties': {
'oneOf': [
{'$ref': '#/$defs/local_module'},
{'$ref': '#/$defs/remote_module'},
]
},
'default': dict(),
},
},
'$defs': {
'local_module': local_module_config_schema(),
'remote_module': remote_module_config_schema(),
},
}
[docs]
def local_module_config_schema() -> Dict[str, Any]:
"""Creates and returns the JSON schema for a single qudi local module configuration"""
return {
'type': 'object',
'required': ['module.Class'],
'additionalProperties': False,
'properties': {
'module.Class': {
'type': 'string',
'pattern': f'^{__module_name_pattern}(\\.{__module_name_pattern})*$',
},
'allow_remote': {'type': 'boolean', 'default': False},
'connect': {
'type': 'object',
'additionalProperties': {
'type': 'string',
'pattern': f'^{__module_name_pattern}$',
},
'default': dict(),
},
'options': {
'type': 'object',
'additionalProperties': True,
'default': dict(),
},
},
}
[docs]
def remote_module_config_schema() -> Dict[str, Any]:
"""Creates and returns the JSON schema for a single qudi remote module configuration"""
return {
'type': 'object',
'required': ['native_module_name', 'address', 'port'],
'additionalProperties': False,
'properties': {
'native_module_name': {
'type': 'string',
'pattern': f'^{__module_name_pattern}$',
},
'address': {
'type': 'string',
},
'port': {'type': 'integer', 'minimum': 0, 'maximum': 65535},
'certfile': {'type': ['null', 'string'], 'default': None},
'keyfile': {'type': ['null', 'string'], 'default': None},
},
}