Moved KiBoM default behavior to the KiBoM variant.

So it can be applied to other outputs.
This commit is contained in:
Salvador E. Tropea 2020-09-05 18:58:26 -03:00
parent 1163d28e71
commit d719718eca
7 changed files with 44 additions and 21 deletions

View File

@ -180,6 +180,10 @@ class BaseFilter(RegFilter):
for name in names:
if not name:
continue
if isinstance(name, Registrable):
# A filter already converted
filters.append(name)
continue
if name[0] == '!':
invert = True
name = name[1:]

View File

@ -12,7 +12,6 @@ from .gs import GS
from .optionable import Optionable, BaseOptions
from .registrable import RegOutput
from .error import KiPlotConfigurationError
from .misc import IFILL_MECHANICAL
from .kiplot import get_board_comps_data
from .macros import macros, document, output_class # noqa: F401
from .bom.columnlist import ColumnList, BoMError
@ -273,6 +272,9 @@ class BoMOptions(BaseOptions):
self.variant.config_field = self.fit_field
self.variant.variant = []
self.variant.name = 'default'
# Delegate any filter to the variant
self.variant.set_def_filters(self.exclude_filter, self.dnf_filter, self.dnc_filter)
self.exclude_filter = self.dnf_filter = self.dnc_filter = None
self.variant.config() # Fill or adjust any detail
def config(self):
@ -303,9 +305,9 @@ class BoMOptions(BaseOptions):
if isinstance(self.component_aliases, type):
self.component_aliases = DEFAULT_ALIASES
# Filters
self.exclude_filter = BaseFilter.solve_filter(self.exclude_filter, 'exclude_filter', IFILL_MECHANICAL)
self.dnf_filter = BaseFilter.solve_filter(self.dnf_filter, 'dnf_filter', '_kibom_dnf_'+self.fit_field)
self.dnc_filter = BaseFilter.solve_filter(self.dnc_filter, 'dnc_filter', '_kibom_dnc_'+self.fit_field)
self.exclude_filter = BaseFilter.solve_filter(self.exclude_filter, 'exclude_filter')
self.dnf_filter = BaseFilter.solve_filter(self.dnf_filter, 'dnf_filter')
self.dnc_filter = BaseFilter.solve_filter(self.dnc_filter, 'dnc_filter')
# Variants, make it an object
self._normalize_variant()
# Field names are handled in lowercase

View File

@ -5,7 +5,7 @@
# Project: KiBot (formerly KiPlot)
from .registrable import RegVariant
from .optionable import Optionable
from .fil_base import BaseFilter, apply_in_bom_filter, apply_fitted_filter, apply_fixed_filter
from .fil_base import apply_in_bom_filter, apply_fitted_filter, apply_fixed_filter
from .macros import macros, document # noqa: F401
@ -33,15 +33,6 @@ class BaseVariant(RegVariant):
""" [string|list(string)=''] Name of the filter to mark components as 'Do Not Change'.
Use '_kibom_dnc' for the default KiBoM behavior """
def config(self):
super().config()
# exclude_filter
self.exclude_filter = BaseFilter.solve_filter(self.exclude_filter, 'exclude_filter')
# dnf_filter
self.dnf_filter = BaseFilter.solve_filter(self.dnf_filter, 'dnf_filter')
# dnc_filter
self.dnc_filter = BaseFilter.solve_filter(self.dnc_filter, 'dnc_filter')
def filter(self, comps, reset):
# Apply all the filters
apply_in_bom_filter(comps, self.exclude_filter, reset)

View File

@ -8,6 +8,7 @@ Implements the IBoM variants mechanism.
"""
from .optionable import Optionable
from .gs import GS
from .fil_base import BaseFilter
from .macros import macros, document, variant_class # noqa: F401
from . import log
@ -46,6 +47,9 @@ class IBoM(BaseVariant): # noqa: F821
def config(self):
super().config()
self.exclude_filter = BaseFilter.solve_filter(self.exclude_filter, 'exclude_filter')
self.dnf_filter = BaseFilter.solve_filter(self.dnf_filter, 'dnf_filter')
self.dnc_filter = BaseFilter.solve_filter(self.dnc_filter, 'dnc_filter')
self.variants_blacklist = self._force_list(self.variants_blacklist)
self.variants_whitelist = self._force_list(self.variants_whitelist)

View File

@ -8,6 +8,8 @@ Implements the KiBoM variants mechanism.
"""
from .optionable import Optionable
from .gs import GS
from .misc import IFILL_MECHANICAL
from .fil_base import BaseFilter
from .macros import macros, document, variant_class # noqa: F401
from . import log
@ -22,13 +24,23 @@ class KiBoM(BaseVariant): # noqa: F821
+VARIANT includes the component only if we are using this variant. """
def __init__(self):
super().__init__()
self._def_exclude_filter = None
self._def_dnf_filter = None
self._def_dnc_filter = None
with document:
self.config_field = 'Config'
""" Name of the field used to clasify components """
self.variant = Optionable
""" [string|list(string)=''] Board variant(s) """
def set_def_filters(self, exclude_filter, dnf_filter, dnc_filter):
""" Filters delegated to the variant """
self._def_exclude_filter = exclude_filter
self._def_dnf_filter = dnf_filter
self._def_dnc_filter = dnc_filter
def config(self):
# Now we can let the parent initialize the filters
super().config()
# Variants, ensure a list
if isinstance(self.variant, type):
@ -39,6 +51,22 @@ class KiBoM(BaseVariant): # noqa: F821
else:
self.variant = []
self.variant = [v.lower() for v in self.variant]
# Filters priority:
# 1) Defined here
# 2) Delegated from the output format
# 3) KiBoM default behavior
# exclude_filter
if not self._def_exclude_filter:
self._def_exclude_filter = IFILL_MECHANICAL
self.exclude_filter = BaseFilter.solve_filter(self.exclude_filter, 'exclude_filter', self._def_exclude_filter)
# dnf_filter
if not self._def_dnf_filter:
self._def_dnf_filter = '_kibom_dnf_'+self.config_field
self.dnf_filter = BaseFilter.solve_filter(self.dnf_filter, 'dnf_filter', self._def_dnf_filter)
# dnc_filter
if not self._def_dnc_filter:
self._def_dnc_filter = '_kibom_dnc_'+self.config_field
self.dnc_filter = BaseFilter.solve_filter(self.dnc_filter, 'dnc_filter', self._def_dnc_filter)
# Config field must be lowercase
self.config_field = self.config_field.lower()

View File

@ -118,4 +118,3 @@ def test_ibom_variant_1():
logging.debug("* `bla bla` variant")
check_modules(ctx, prj+'-ibom_bla_bla.html', ['R1', 'R4'])
ctx.clean_up()

View File

@ -9,15 +9,13 @@ variants:
type: kibom
file_id: '_(V1)'
variant: V1
dnc_filter: '_kibom_dnc'
dnf_filter: '_kibom_dnf_Config'
exclude_filter: '_mechanical'
- name: 't1_v1b'
comment: 'Test 1 Variant V1'
type: kibom
file_id: '_(V1b)'
variant: V1
dnc_filter: '_none'
outputs:
- name: 'bom_internal_v1'
@ -26,9 +24,6 @@ outputs:
dir: BoM
options:
variant: t1_v1
dnc_filter: '_none'
dnf_filter: '_none'
exclude_filter: '_none'
- name: 'bom_internal_v1b'
comment: "Bill of Materials in CSV format for variant t1_v1"