Source code for boussole.conf.patcher

# -*- coding: utf-8 -*-
"""
Backend values patchs
=====================

Patchs are used to modify given settings items like expanding paths. Backends
inherit from ``SettingsPatcher`` to be able to use it in their ``clean()``
method.

Todo:
    * Should be named postprocess.SettingsPostProcessor because it contains
      patchs but will contain some validations soon.
    * Add validation that source_dir is not also set as a library dir (would
      cause some issues in resolving);
"""
import os

from boussole.conf import SETTINGS_MANIFEST


[docs]class SettingsPatcher(object): """ Mixin object for all available patch methods to use in ``SETTINGS_MANIFEST``. """ projectdir = ''
[docs] def patch(self, settings): """ Perform patchs on settings according to their rules in ``SETTINGS_MANIFEST``. Patchs are implemented in their own method that all have the same signature: * Get arguments: initial settings, item name and item value; * Return item value possibly patched; Args: settings (dict): Loaded settings. Returns: dict: Settings object patched. """ for k, v in settings.items(): # Search for patchs method for setting rule if k in SETTINGS_MANIFEST and \ SETTINGS_MANIFEST[k].get('patchs', None) is not None: patchs = SETTINGS_MANIFEST[k]['patchs'] # Apply each patch on value for method_name in patchs: settings[k] = getattr(self, method_name)(settings, k, v) return settings
[docs] def _patch_expand_path(self, settings, name, value): """ Patch a path to expand home directory and make absolute path. Args: settings (dict): Initial settings unpatched. name (str): Setting name. value (str): Path to patch. Returns: str: Patched path to an absolute path. """ if os.path.isabs(value): return os.path.normpath(value) # Expand home directory if any value = os.path.expanduser(value) # If the path is not yet an absolute directory, make it so from base # directory if not empty if not os.path.isabs(value) and self.projectdir: value = os.path.join(self.projectdir, value) return os.path.normpath(value)
[docs] def _patch_expand_paths(self, settings, name, value): """ Apply patch ``SettingsPatcher._patch_expand_path`` for each element in list. Args: settings (dict): Initial settings unpatched. name (str): Setting name. value (list): List of paths to patch. Returns: list: Patched path list to an absolute path. """ return [self._patch_expand_path(settings, name, item) for item in value]