Now outputs and preflights are loaded as plugins.

They can be added from ~/.config/kiplot/plugins/
Also sorted the preflights in the YAML example and allower -v for
--help-list-outputs, needed to know from where are the plugins loaded.
This commit is contained in:
Salvador E. Tropea 2020-07-02 12:30:30 -03:00
parent 1ca21efe94
commit 4538236574
5 changed files with 49 additions and 36 deletions

View File

@ -520,7 +520,7 @@ Usage:
[-q | -v...] [-i] [TARGET...]
kiplot [-c PLOT_CONFIG] --list
kiplot [-b BOARD] [-d OUT_DIR] [-p] --example
kiplot --help-list-outputs
kiplot [-v] --help-list-outputs
kiplot --help-output=HELP_OUTPUT
kiplot --help-outputs
kiplot --help-preflights

View File

@ -2,21 +2,21 @@ kiplot:
version: 1
preflight:
# [boolean=false] Zones are filled before doing any operation involving PCB layers
check_zone_fills: true
# A list of entries to filter out ERC/DRC messages. Keys: `filter`, `number` and `regex`
filters:
- filter: 'Filter description'
number: 10
regex: 'Regular expression to match'
# [boolean=false] Option for `run_drc`. Ignores the unconnected nets. Useful if you didn't finish the routing
ignore_unconnected: false
# [boolean=false] Runs the DRC (Distance Rules Check). To ensure we have a valid PCB
run_drc: true
# [boolean=false] Runs the ERC (Electrical Rules Check). To ensure the schematic is electrically correct
run_erc: true
# [boolean=false] Update the XML version of the BoM (Bill of Materials). To ensure our generated BoM is up to date
update_xml: true
# [boolean=false] Zones are filled before doing any operation involving PCB layers
check_zone_fills: true
# [boolean=false] Option for `run_drc`. Ignores the unconnected nets. Useful if you didn't finish the routing
ignore_unconnected: false
# A list of entries to filter out ERC/DRC messages. Keys: `filter`, `number` and `regex`
filters:
- filter: 'Filter description'
number: 10
regex: 'Regular expression to match'
outputs:
# DXF (Drawing Exchange Format):

View File

@ -6,7 +6,7 @@ Usage:
[-q | -v...] [-i] [TARGET...]
kiplot [-c PLOT_CONFIG] --list
kiplot [-b BOARD] [-d OUT_DIR] [-p] --example
kiplot --help-list-outputs
kiplot [-v] --help-list-outputs
kiplot --help-output=HELP_OUTPUT
kiplot --help-outputs
kiplot --help-preflights
@ -53,7 +53,7 @@ from logging import DEBUG
from . import log
log.set_domain('kiplot')
from .gs import (GS)
from .kiplot import (generate_outputs)
from .kiplot import (generate_outputs, load_actions)
from .pre_base import (BasePreFlight)
from .config_reader import (CfgYamlReader, print_outputs_help, print_output_help, print_preflights_help, create_example)
from .misc import (NO_PCB_FILE, NO_SCH_FILE, EXIT_BAD_ARGS)
@ -162,6 +162,9 @@ def main():
# Output dir: relative to CWD (absolute path overrides)
GS.out_dir = os.path.join(os.getcwd(), args.out_dir)
# Load output and preflight plugins
load_actions()
if args.help_outputs or args.help_list_outputs:
print_outputs_help(details=args.help_outputs)
sys.exit(0)

View File

@ -9,31 +9,8 @@ from collections import OrderedDict
from .error import (KiPlotConfigurationError)
from .kiplot import (Layer, load_board)
from .misc import (NO_YAML_MODULE, EXIT_BAD_CONFIG, EXIT_BAD_ARGS, EXAMPLE_CFG, WONT_OVERWRITE)
from mcpy import activate # noqa: F401
# Output classes
from .out_base import BaseOutput
from . import out_gerber # noqa: F401
from . import out_ps # noqa: F401
from . import out_hpgl # noqa: F401
from . import out_dxf # noqa: F401
from . import out_pdf # noqa: F401
from . import out_svg # noqa: F401
from . import out_gerb_drill # noqa: F401
from . import out_excellon # noqa: F401
from . import out_position # noqa: F401
from . import out_step # noqa: F401
from . import out_kibom # noqa: F401
from . import out_ibom # noqa: F401
from . import out_pdf_sch_print # noqa: F401
from . import out_pdf_pcb_print # noqa: F401
# PreFlight classes
from .pre_base import BasePreFlight
from . import pre_drc # noqa: F401
from . import pre_erc # noqa: F401
from . import pre_update_xml # noqa: F401
from . import pre_check_zone_fills # noqa: F401
from . import pre_ignore_unconnected # noqa: F401
from . import pre_filters # noqa: F401
# Logger
from . import log
@ -316,7 +293,7 @@ def create_example(pcb_file, out_dir, copy_options):
# Preflights
f.write('\npreflight:\n')
pres = BasePreFlight.get_registered()
for n, o in pres.items():
for n, o in OrderedDict(sorted(pres.items())).items():
if o.__doc__:
f.write(' #'+o.__doc__.rstrip()+'\n')
f.write(' {}: {}\n'.format(n, o.get_example()))

View File

@ -7,7 +7,9 @@ import re
from sys import exit
from shutil import which
from subprocess import (run, PIPE)
from glob import glob
from distutils.version import StrictVersion
from importlib.util import (spec_from_file_location, module_from_spec)
from .gs import (GS)
from .misc import (PLOT_ERROR, NO_PCBNEW_MODULE, MISSING_TOOL, CMD_EESCHEMA_DO, URL_EESCHEMA_DO, NO_SCH_FILE, CORRUPTED_PCB,
@ -18,6 +20,7 @@ from . import log
logger = log.get_logger(__name__)
try:
import pcbnew
except ImportError: # pragma: no cover
@ -156,6 +159,36 @@ class Layer(object):
return "{} ({} '{}' {})".format(self.name, self.id, self.desc, self.suffix)
def _import(name, path):
# Python 3.4+ import mechanism
spec = spec_from_file_location("kiplot."+name, path)
mod = module_from_spec(spec)
spec.loader.exec_module(mod)
def _load_actions(path):
logger.debug("Importing from "+path)
lst = glob(os.path.join(path, 'out_*.py')) + glob(os.path.join(path, 'pre_*.py'))
for p in lst:
name = os.path.splitext(os.path.basename(p))[0]
logger.debug("- Importing "+name)
_import(name, p)
def load_actions():
""" Load all the available ouputs and preflights """
from mcpy import activate
_load_actions(os.path.abspath(os.path.dirname(__file__)))
home = os.environ.get('HOME')
if home:
dir = os.path.join(home, '.config', 'kiplot', 'plugins')
if os.path.isdir(dir):
_load_actions(dir)
if 'de_activate' in activate.__dict__:
logger.debug('Deactivating macros')
activate.de_activate()
def check_version(command, version):
cmd = [command, '--version']
logger.debug('Running: '+str(cmd))