Source code for sicor.options.options

#!/usr/bin/env python
# coding: utf-8

# SICOR is a freely available, platform-independent software designed to process hyperspectral remote sensing data,
# and particularly developed to handle data from the EnMAP sensor.

# This file contains tools to load and validate options dictionaryfiles.

# Copyright (C) 2018  Niklas Bohn (GFZ, <nbohn@gfz-potsdam.de>),
# German Research Centre for Geosciences (GFZ, <https://www.gfz-potsdam.de>)

# This software was developed within the context of the EnMAP project supported by the DLR Space Administration with
# funds of the German Federal Ministry of Economic Affairs and Energy (on the basis of a decision by the German
# Bundestag: 50 EE 1529) and contributions from DLR, GFZ and OHB System AG.

# This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public
# License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later
# version.

# This program 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 General Public License for more details.

# You should have received a copy of the GNU General Public License along with this program.
# If not, see <https://www.gnu.org/licenses/>.


from os.path import isfile
from jsmin import jsmin
from cerberus import Validator
from os import path
import json
import warnings
from .sicor_enmap_schema import sicor_enmap_schema


[docs] def _processing_dict(): return {"Exception": None, "interface": {"args": (), "kwargs": {}}, "Exception_type": "", "clear_fraction": None, "status": 1, "tIO": 0.0, "tRT": 0.0, "uncertainties": {} }
# noinspection PyClassHasNoInit
[docs] class SicorValidator(Validator):
[docs] def _validate_existing_path(self, existing_path, field, value): """ Test whether a string is provided for a given options dictionary key. The rule's arguments are validated against this schema: {'type': 'string'} """ if existing_path is True and path.isdir(value) is False: warnings.warn("Path '%s' should exist." % value)
[docs] def json_to_python(dd): if type(dd) is dict: return {json_to_python(k): json_to_python(v) for k, v in dd.items()} elif type(dd) is list: return [json_to_python(v) for v in dd] else: if dd == "None": return None if dd == "slice(None, None, None)": return slice(None) if dd == "10.0": return 10.0 if dd in ["10.0", "20.0", "60.0"]: return float(dd) if dd == "true": return True if dd == "false": return False else: return dd
[docs] def python_to_json(dd): if type(dd) is dict: return {python_to_json(k): python_to_json(v) for k, v in dd.items()} elif type(dd) is list: return [python_to_json(v) for v in dd] else: if dd is None: return "None" if dd == slice(None): return "slice(None, None, None)" if dd is True: return "true" if dd is False: return "false" else: return dd
[docs] def get_options(target, validation=True): """ return dictionary will all options :param validation: True / False, whether to validate options read from files ot not :param target: if path to file, then json is used to load, otherwise the default template is used :return: dictionary with options """ if isfile(target): with open(target, "r") as fl: options = json_to_python(json.loads(jsmin(fl.read()))) options["processing"] = _processing_dict() if validation is True: vv = SicorValidator(allow_unknown=True, schema=sicor_enmap_schema) if vv.validate(document=options) is False: raise ValueError("Options is malformed: %s" % str(vv.errors)) return options else: raise FileNotFoundError("target:%s is not a valid file path" % target)