Unified the YAML errors, added more context information

This commit is contained in:
Salvador E. Tropea 2020-03-22 13:02:17 -03:00
parent 6067c84394
commit d4f12a1d13
1 changed files with 24 additions and 33 deletions

View File

@ -27,9 +27,9 @@ class CfgReader(object):
def __init__(self): def __init__(self):
pass pass
def config_error(msg):
class YamlError(error.KiPlotError): logger.error(msg)
pass sys.exit(misc.EXIT_BAD_CONFIG)
def load_layers(kicad_pcb_file): def load_layers(kicad_pcb_file):
layer_names=['-']*50 layer_names=['-']*50
@ -62,23 +62,20 @@ class CfgYamlReader(CfgReader):
try: try:
version = data['kiplot']['version'] version = data['kiplot']['version']
except KeyError: except (KeyError, TypeError):
raise YamlError("YAML config needs kiplot.version.") config_error("YAML config needs kiplot.version.")
return None
if version != 1: if version != 1:
raise YamlError("Unknown KiPlot config version: {}" config_error("Unknown KiPlot config version: "+str(version))
.format(version))
return None
return version return version
def _get_required(self, data, key): def _get_required(self, data, key, context=None):
try: try:
val = data[key] val = data[key]
except KeyError: except (KeyError, TypeError):
raise YamlError("Value is needed for {}".format(key)) config_error("Missing `"+key+"' "+('' if context is None else context))
return val return val
@ -95,12 +92,12 @@ class CfgYamlReader(CfgReader):
'pdf': pcbnew.PLOT_FORMAT_PDF 'pdf': pcbnew.PLOT_FORMAT_PDF
} }
type_s = self._get_required(map_opts, 'type') type_s = self._get_required(map_opts, 'type', 'in drill map section')
try: try:
mo.type = TYPES[type_s] mo.type = TYPES[type_s]
except KeyError: except KeyError:
raise YamlError("Unknown drill map type: {}".format(type_s)) config_error("Unknown drill map type: "+type_s)
return mo return mo
@ -108,7 +105,7 @@ class CfgYamlReader(CfgReader):
opts = PC.DrillReportOptions() opts = PC.DrillReportOptions()
opts.filename = self._get_required(report_opts, 'filename') opts.filename = self._get_required(report_opts, 'filename', 'in drill report section')
return opts return opts
@ -128,7 +125,7 @@ class CfgYamlReader(CfgReader):
# set the internal option as needed # set the internal option as needed
if mapping['required'](cfg_options): if mapping['required'](cfg_options):
cfg_val = self._get_required(cfg_options, key) cfg_val = self._get_required(cfg_options, key, 'in '+otype+' section')
elif not(cfg_options is None) and key in cfg_options: elif not(cfg_options is None) and key in cfg_options:
# not required but given anyway # not required but given anyway
cfg_val = cfg_options[key] cfg_val = cfg_options[key]
@ -458,21 +455,17 @@ class CfgYamlReader(CfgReader):
# 3) Inner.N names # 3) Inner.N names
if s.startswith("Inner"): if s.startswith("Inner"):
m = re.match(r"^Inner\.([0-9]+)$", s) m = re.match(r"^Inner\.([0-9]+)$", s)
if not m: if not m:
logger.error('Malformed inner layer name: '+s+', use Inner.N') config_error('Malformed inner layer name: '+s+', use Inner.N')
sys.exit(misc.EXIT_BAD_CONFIG)
layer = PC.LayerInfo(int(m.group(1)), True, s) layer = PC.LayerInfo(int(m.group(1)), True, s)
else: else:
logger.error('Unknown layer name: '+s) config_error('Unknown layer name: '+s)
sys.exit(misc.EXIT_BAD_CONFIG)
return layer return layer
def _parse_layer(self, l_obj): def _parse_layer(self, l_obj, context):
l_str = self._get_required(l_obj, 'layer') l_str = self._get_required(l_obj, 'layer', context)
layer_id = self._get_layer_from_str(l_str) layer_id = self._get_layer_from_str(l_str)
layer = PC.LayerConfig(layer_id) layer = PC.LayerConfig(layer_id)
@ -486,7 +479,7 @@ class CfgYamlReader(CfgReader):
try: try:
name = o_obj['name'] name = o_obj['name']
except KeyError: except KeyError:
raise self.YamlError("Output needs a name") config_error("Output needs a name in: "+str(o_obj))
try: try:
desc = o_obj['comment'] desc = o_obj['comment']
@ -496,24 +489,23 @@ class CfgYamlReader(CfgReader):
try: try:
otype = o_obj['type'] otype = o_obj['type']
except KeyError: except KeyError:
raise YamlError("Output needs a type") config_error("Output '"+name+"' needs a type")
if otype not in ['gerber', 'ps', 'hpgl', 'dxf', 'pdf', 'svg', if otype not in ['gerber', 'ps', 'hpgl', 'dxf', 'pdf', 'svg',
'gerb_drill', 'excellon', 'position', 'gerb_drill', 'excellon', 'position',
'kibom', 'ibom', 'pdf_sch_print', 'pdf_pcb_print']: 'kibom', 'ibom', 'pdf_sch_print', 'pdf_pcb_print']:
raise YamlError("Unknown output type: {}".format(otype)) config_error("Unknown output type '"+otype+"' in '"+name+"'")
try: try:
options = o_obj['options'] options = o_obj['options']
except KeyError: except KeyError:
if not otype in ['ibom', 'pdf_sch_print']: if not otype in ['ibom', 'pdf_sch_print']:
logger.error('Output "'+name+'" needs options') config_error("Output '"+name+"' needs options")
sys.exit(misc.EXIT_BAD_CONFIG)
options = None options = None
logger.debug("Parsing output options for {} ({})".format(name, otype)) logger.debug("Parsing output options for {} ({})".format(name, otype))
outdir = self._get_required(o_obj, 'dir') outdir = self._get_required(o_obj, 'dir', 'in section `'+name+'` ('+otype+')')
output_opts = self._parse_out_opts(otype, options) output_opts = self._parse_out_opts(otype, options)
@ -529,7 +521,7 @@ class CfgYamlReader(CfgReader):
layers = [] layers = []
for l in layers: for l in layers:
o_cfg.layers.append(self._parse_layer(l)) o_cfg.layers.append(self._parse_layer(l, 'in section '+name+' ('+otype+')'))
return o_cfg return o_cfg
@ -562,8 +554,7 @@ class CfgYamlReader(CfgReader):
try: try:
data = yaml.load(fstream) data = yaml.load(fstream)
except yaml.YAMLError as e: except yaml.YAMLError as e:
raise YamlError("Error loading YAML") config_error("Error loading YAML")
return None
self._check_version(data) self._check_version(data)