Development¶
Repo structure¶
kmake
repo structure:
.
├── Dockerfile
├── docs
│ ├── Makefile
│ ├── requirements.txt
│ └── source
│ ├── conf.py
│ ├── ...
│ └── usage.md
├── LICENSE
├── pyproject.toml
├── README.md
├── src
│ ├── commands
│ │ ├── auxorigin.py
│ │ ├── ...
│ │ └── wireframe.py
│ ├── common
│ │ ├── __init__.py
│ │ ├── kicad_project.py
│ │ └── kmake_helper.py
│ ├── __init__.py
│ ├── kmake.py
│ └── logos
│ └── oshw
└── tests
├── designs
│ └── designs.list
├── test_auxorigin.py
├── ...
└── test_wireframe.py
Commands¶
Commands are stored in the commands
directory.
You can add a custom command by creating a file inside the commands
directory and
importing it in __init__.py
.
The following rules apply:
add_subparser(subparsers)
andrun(project, args)
functions need to be definedCommand line arguments are passed as
args
object to therun(project, args)
functionThe
KicadProject
class object is passed torun(project, args)
.
Printing and logging¶
All printing is handled using log
inherited from kmake
.
There are 4 levels of logging:
info
- for state updates, for example: “Opening PCB for read” or “Saving PCB to file path_to_the_file”debug
- for information relevant to debugging, for example: “Processing footprint abc from library xyz”.warning
- for non critical fails, for example: “Symbol xyz has no mpn to match, it will be omitted”error
- for critical fails: “KiCad project not found”
New command example¶
Sample __init__.py
and new_command.py
file contents:
add following line to __init__.py
from . import new_command
# Minimal working command
import logging
import argparse
from common.kicad_project import KicadProject
log = logging.getLogger(__name__)
def add_subparser(subparsers: argparse._SubParsersAction) -> None:
# Register parser and its arguments as subparser
new_function_parser = subparsers.add_parser("example", help="")
# Example argument
new_function_parser.add_argument(
"-p",
"--print",
dest="print",
action="store_true",
help="Prints hello message",
)
new_function_parser.set_defaults(func=run)
def main(kicad_project: KicadProject, args: argparse.Namespace) -> None:
# Main module function
if args.print:
log.info(f"Hello from example, running in {kicad_project.dir}")
def run(kicad_project: KicadProject, args: argparse.Namespace) -> None:
# Entry function for module
main(kicad_project, args)
Generating tests coverage report¶
To generate a coverage report of the tests, execute:
poetry run pytest --cov-report term --cov-report html:htmlcov --cov=src
The result will be printed in the terminal and saved as an HTML report to htmlcov
.