Use `output_formats` parameter to specify which *files* to output to disk,
Use `return_types` parameter to specify which objects to return to a calling Python script
- Use pin names instead of pin indices, until the last moment when generating the ports for the GraphViz nodes
- `Harness.add_mate_pin()` now uses pin names
- Remove unused `if is_arrow()` check from `Harness.connect()`
- Consolidate calling of `Connector.activate_pin()` to prevent subtle bugs
- Call it from `connect()` and `add_mate_pin()`
- No longer call it from `create_graph()`
- Misc. other tuning
This was requested by designer2k2 in #219 for bgcolor usage.
It has also been discussed in #135.
The input validation is more detailed to help the user identifying
and locating invalid values. The wire color padding is now done on
the output to cover different input alternatives.
* Skip assignment and return expression directly
* Simplify get_bom_index() parameters
- Use the actual BOM as first parameter instead of the whole harness.
- Use a whole AdditionalComponent as second parameter instead of each
attribute separately.
* Use the same lambda in get_bom_index() as for deduplicating BOM
Move the lambda declaration out of the function scope for common
access from two different functions.
* Convert dataclass object to dict to use the same lambda
* Redefine the common lambda to an ordinary function
* Simplify BOM header row logic
* Simplify collecting designators for a joined BOM entry
Assign input designators once to a temporary variable for easy reusage.
* Simplify deduplication and sorting of collected designators
* Remove parentheses around return expressions
https://stackoverflow.com/questions/4978567/should-a-return-statement-have-parentheses
* Move out code from inner loop into helper functions
* Move BOM sorting above grouping to use groupby()
- Use one common entry loop to consume iterator only once.
- Use same key function for sort() and groupby(),
except replace None with empty string when sorting.
* Make the BOM grouping function return string tuple for sorting
* Use a generator expressions and raise exception if failing
Seems to be the most popular search alternative:
https://stackoverflow.com/questions/8653516/python-list-of-dictionaries-search
Raising StopIteration if not found is better than returning None
to detect such an internal error more easily.
* Replace accumulation loop with sum expressions
Make a list from the group iterator for reusage in sum expressions
and to pick first group entry. The expected group sizes are very small,
so performance loss by creating a temporary list should be neglectable.
Alternativly, itertools.tee(group, 3) could be called to triplicate
the iterator, but it was not chosen for readability reasons.
* Add function type hints and doc strings
* Add BOMEntry type alias
This type alias describes the possible types of keys and values in
the dict representing a BOM entry.
* Rename extra variable to part for consistency
* Build output string in one big expression
Build output string in component_table_entry() as the similar strings
in generate_bom(). Repeating a couple of minor if-expressions is small
cost to obtain a more compact and readable main expression.
* Move default qty value=1 to BOM deduplication
* Eliminate local variable
* Rename the 'item' key to 'description' in all BOMEntry dicts
This way, both BOM and harness.additional_bom_items uses the same
set of keys in their dict entries. This was originally suggested
in a #115 review, but had too many issues to be implemented then.
* Move repeated code into new optional_fields() function
* Group common function arguments into a dict
* Revert "Use a generator expressions and raise exception if failing"
This reverts commit 96d393dfb757afc61ffb319c34035d8d2ce7c33d.
However, raising an exception if failing the BOM index search is still
wanted, so a custom exception is raised instead of returning None.
* Use new BOMKey type alias for get_bom_index() target argument
Replace the get_bom_index() part argument with the target key argument
to prepare for quering any BOM entry that matches the target key.
* Cache the BOM entry key in the entry itself
* Rename bom_types_group() to bom_entry_key()
* Define tuples of BOM columns as common constants
* Clarify a comment
* Change BOM heading from `Item` to `Description`
Co-authored-by: kvid <kvid@users.noreply.github.com>
Co-authored-by: Daniel Rojas <github@danielrojas.net>