Source code for cleanmymac.schema
#
# author: Cosmin Basca
#
# Copyright 2015 Cosmin Basca
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
import os
from voluptuous import Schema, Required, All, Optional, ALLOW_EXTRA, Any, IsDir, In, Or, message, DirInvalid, truth
from cleanmymac.log import error
from cleanmymac.constants import VALID_TARGET_TYPES
@message('not a directory', cls=DirInvalid)
@truth
[docs]def IsDirUserExpand(v):
"""Verify the directory exists.
>>> IsDirUserExpand()('/')
'/'
"""
return os.path.isdir(os.path.expanduser(v))
def _cmd_spec_schema(strict=True):
return Schema({
Required('update_commands', default=[]): All(list),
Required('clean_commands'): All(list),
})
def _dir_spec_schema(strict=True):
return Schema({
Optional('update_message'): str,
Required('entries'): [
{
Required('dir'): IsDirUserExpand() if strict else str,
Optional('pattern'): str
}
]
})
__TYPE_SCHEMA__ = {
'cmd': _cmd_spec_schema,
'dir': _dir_spec_schema
}
def _target_schema():
return Schema({
Required('type'): All(str, In(VALID_TARGET_TYPES)),
Required('spec'): dict
})
[docs]def validate_yaml_target(description, strict=True):
"""
performs the validation of the **YAML** definition of a :class:`cleanmymac.target.Target`.
Currently two kinds of schemas are supported.
* Shell command based Targets
.. code-block:: yaml
type: 'cmd'
spec: {
update_commands: [
'conda update conda',
'conda update anaconda'
],
clean_commands: [
'conda clean -p -s -t -y'
]
}
* Directory based Targets
.. code-block:: yaml
type: 'dir'
spec: {
update_message: 'Get the latest Java version from http://www.oracle.com/technetwork/java/javase/downloads/index.html',
entries: [
{
dir: '/Library/Java/JavaVirtualMachines',
pattern: 'jdk1\.6\.\d_\d+\.jdk'
},
{
dir: '/Library/Java/JavaVirtualMachines',
pattern: 'jdk1\.7\.\d_\d+\.jdk'
},
{
dir: '/Library/Java/JavaVirtualMachines',
pattern: 'jdk1\.8\.\d_\d+\.jdk'
},
]
}
:param dict description: the loaded description
:param bool strict: perform strict validation (fail on invalid specification if True)
:return: the validate description
:rtype: dict
"""
global __TYPE_SCHEMA__
schema = _target_schema()
description = schema(description)
_type = description['type']
_spec = description['spec']
try:
schema = __TYPE_SCHEMA__[_type](strict=strict)
description['spec'] = schema(_spec)
except Exception as e:
error(e)
if strict:
raise e
return description
def _config_schema():
return Schema({
Optional('cleanmymac'): Schema({
Optional('targets_path'): list
}, extra=ALLOW_EXTRA),
}, extra=ALLOW_EXTRA)
[docs]def validate_yaml_config(config):
"""
performs the validation of the **YAML** definition of the global **cleanmymac** configuration.
The current supported syntax allows for the specification of extra environment variables on a
per target basis. See for example the case when the *anaconda* target is not in **PATH**:
.. code-block:: yaml
cleanmymac: {
targets_path: ['.']
}
anaconda: {
env: {
PATH: '~/anaconda/bin',
},
}
:param dict config: the loaded configuration
:return: the validate configuration
:rtype: dict
"""
schema = _config_schema()
return schema(config)