Unified the YAML errors, added more context information
This commit is contained in:
parent
6067c84394
commit
d4f12a1d13
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue