Added tests for XML and XLSX internal BoM
This commit is contained in:
parent
7d56b59ba4
commit
5058af5038
|
|
@ -22,7 +22,7 @@ if prev_dir not in sys.path:
|
|||
# from kiplot.misc import (BOM_ERROR)
|
||||
|
||||
BOM_DIR = 'BoM'
|
||||
REF_COLUMN_NAME = 'Reference'
|
||||
REF_COLUMN_NAME = 'Reference' # TODO make the same as KiBoM
|
||||
QTY_COLUMN_NAME = 'Quantity Per PCB'
|
||||
KIBOM_TEST_HEAD = ['Component', 'Description', 'Part', REF_COLUMN_NAME, 'Value', 'Footprint', QTY_COLUMN_NAME, 'Datasheet',
|
||||
'config']
|
||||
|
|
@ -32,7 +32,7 @@ KIBOM_TEST_GROUPS = 5
|
|||
|
||||
|
||||
def check_kibom_test_netlist(rows, ref_column, groups, exclude, comps):
|
||||
""" Checks the kibom-test.xml expected results """
|
||||
""" Checks the kibom-test.sch expected results """
|
||||
# Groups
|
||||
assert len(rows) == groups
|
||||
logging.debug(str(groups) + " groups OK")
|
||||
|
|
@ -102,3 +102,45 @@ def test_int_bom_simple_html():
|
|||
# Check the DNF table
|
||||
check_kibom_test_netlist(rows[1], ref_column, 1, KIBOM_TEST_COMPONENTS, KIBOM_TEST_EXCLUDE)
|
||||
ctx.clean_up()
|
||||
|
||||
|
||||
def adapt_xml(h):
|
||||
h = h.replace(' ', '_')
|
||||
h = h.replace('"', '')
|
||||
h = h.replace("'", '')
|
||||
h = h.replace('#', '_num')
|
||||
return h
|
||||
|
||||
|
||||
def test_int_bom_simple_xml():
|
||||
prj = 'kibom-test'
|
||||
ext = 'xml'
|
||||
ctx = context.TestContext('test_int_bom_simple_xml', prj, 'int_bom_simple_xml', BOM_DIR)
|
||||
ctx.run(no_board_file=True, extra=['-e', os.path.join(ctx.get_board_dir(), prj+'.sch')])
|
||||
out = prj + '-bom.' + ext
|
||||
rows, header = ctx.load_xml(out)
|
||||
# Columns get sorted by name, so we need to take care of it
|
||||
for c in KIBOM_TEST_HEAD:
|
||||
if c == 'Component':
|
||||
continue
|
||||
assert adapt_xml(c) in header, "Missing column "+c
|
||||
ref_column = header.index(adapt_xml(REF_COLUMN_NAME))
|
||||
qty_column = header.index(adapt_xml(QTY_COLUMN_NAME))
|
||||
check_kibom_test_netlist(rows, ref_column, KIBOM_TEST_GROUPS, KIBOM_TEST_EXCLUDE, KIBOM_TEST_COMPONENTS)
|
||||
check_dnc(rows, 'R7', ref_column, qty_column)
|
||||
ctx.clean_up()
|
||||
|
||||
|
||||
def test_int_bom_simple_xlsx():
|
||||
prj = 'kibom-test'
|
||||
ext = 'xlsx'
|
||||
ctx = context.TestContext('test_int_bom_simple_xlsx', prj, 'int_bom_simple_xlsx', BOM_DIR)
|
||||
ctx.run(no_board_file=True, extra=['-e', os.path.join(ctx.get_board_dir(), prj+'.sch')])
|
||||
out = prj + '-bom.' + ext
|
||||
rows, header = ctx.load_xlsx(out)
|
||||
assert header == KIBOM_TEST_HEAD
|
||||
ref_column = header.index(REF_COLUMN_NAME)
|
||||
qty_column = header.index(QTY_COLUMN_NAME)
|
||||
check_kibom_test_netlist(rows, ref_column, KIBOM_TEST_GROUPS, KIBOM_TEST_EXCLUDE, KIBOM_TEST_COMPONENTS)
|
||||
check_dnc(rows, 'R7', ref_column, qty_column)
|
||||
ctx.clean_up()
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@ import pytest
|
|||
import csv
|
||||
from glob import glob
|
||||
from pty import openpty
|
||||
import xml.etree.ElementTree as ET
|
||||
|
||||
COVERAGE_SCRIPT = 'python3-coverage'
|
||||
KICAD_PCB_EXT = '.kicad_pcb'
|
||||
|
|
@ -340,18 +341,18 @@ class TestContext(object):
|
|||
logging.debug("Found apertures {}".format(aps))
|
||||
return aps
|
||||
|
||||
def load_csv(self, filename, column=3):
|
||||
def load_csv(self, filename):
|
||||
rows = []
|
||||
with open(self.expect_out_file(os.path.join(self.sub_dir, filename))) as csvfile:
|
||||
reader = csv.reader(csvfile)
|
||||
header = next(reader) # Skip header
|
||||
header = next(reader)
|
||||
for r in reader:
|
||||
if not r:
|
||||
break
|
||||
rows.append(r)
|
||||
return rows, header
|
||||
|
||||
def load_html(self, filename, column=4, split=True):
|
||||
def load_html(self, filename):
|
||||
file = self.expect_out_file(os.path.join(self.sub_dir, filename))
|
||||
with open(file) as f:
|
||||
html = f.read()
|
||||
|
|
@ -375,6 +376,44 @@ class TestContext(object):
|
|||
c += 1
|
||||
return rows, headers
|
||||
|
||||
def load_xml(self, filename):
|
||||
rows = []
|
||||
headers = None
|
||||
for child in ET.parse(self.expect_out_file(os.path.join(self.sub_dir, filename))).getroot():
|
||||
rows.append([v for v in child.attrib.values()])
|
||||
if not headers:
|
||||
headers = [k for k in child.attrib.keys()]
|
||||
return rows, headers
|
||||
|
||||
def load_xlsx(self, filename):
|
||||
""" Assumes the components are in sheet1 """
|
||||
file = self.expect_out_file(os.path.join(self.sub_dir, filename))
|
||||
subprocess.call(['unzip', file, '-d', self.get_out_path('desc')])
|
||||
# Some XMLs are stored with 0600 preventing them to be read by next CI/CD stage
|
||||
subprocess.call(['chmod', '-R', 'og+r', self.get_out_path('desc')])
|
||||
# Read the table
|
||||
worksheet = self.get_out_path(os.path.join('desc', 'xl', 'worksheets', 'sheet1.xml'))
|
||||
rows = []
|
||||
root = ET.parse(worksheet).getroot()
|
||||
ns = '{http://schemas.openxmlformats.org/spreadsheetml/2006/main}'
|
||||
rnum = 1
|
||||
for r in root.iter(ns+'row'):
|
||||
rcur = int(r.attrib['r'])
|
||||
if rcur > rnum:
|
||||
break
|
||||
rows.append([int(cell.text) for cell in r.iter(ns+'v')])
|
||||
rnum += 1
|
||||
# Read the strings
|
||||
strings = self.get_out_path(os.path.join('desc', 'xl', 'sharedStrings.xml'))
|
||||
strs = [t.text for t in ET.parse(strings).getroot().iter(ns+'t')]
|
||||
# Replace the indexes by the strings
|
||||
for r in rows:
|
||||
for i in range(len(r)):
|
||||
r[i] = strs[r[i]]
|
||||
# Separate the headers
|
||||
headers = rows.pop(0)
|
||||
return rows, headers
|
||||
|
||||
|
||||
class TestContextSCH(TestContext):
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,12 @@
|
|||
# Example KiPlot config file
|
||||
kiplot:
|
||||
version: 1
|
||||
|
||||
outputs:
|
||||
- name: 'bom_internal'
|
||||
comment: "Bill of Materials in HTML format"
|
||||
type: bom
|
||||
dir: BoM
|
||||
options:
|
||||
format: XLSX
|
||||
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
# Example KiPlot config file
|
||||
kiplot:
|
||||
version: 1
|
||||
|
||||
outputs:
|
||||
- name: 'bom_internal'
|
||||
comment: "Bill of Materials in HTML format"
|
||||
type: bom
|
||||
dir: BoM
|
||||
options:
|
||||
format: XML
|
||||
|
||||
Loading…
Reference in New Issue