- 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>
Bug: Hiding connector pins when none are connected is not reasonable.
When combined with loops or neither pinlabels nor pincolors, then
exceptions are raised as well.
Fix: Forcing pins at the left side in such cases solves #217.
If `show_wirenumbers` is omitted from a cable section, its value will be `None`. In that case, we want to choose a default based on whether this is a bundle or not.
If the user did specify `show_wirenumbers`, then its value will be `True` or `False`, and we want to respect that whether it's a bundle or not.
Bug: Failing to assign the default cable length unit when not present.
It was introduced in #198.
Fix: Test the correct cable attribute. This fix solves issue #205.
Using Any or str in type annotations might increase the need for extra
comments to explain the real valid values. However, such needs can be
drastically reduced with the help of semanticly named type aliases.
Each type alias have their legal values described in comments.
Actual validation might be implemented in the future.
GraphViz does not support the a HTML tag when generating the tables for the
cables/connectors, so this change will remove these tags for the graph generation.
However for the HTML BOM output table these links will be generated.
The https://validator.w3.org/ reported Errors:
The align attribute on the th/td element is obsolete. Use CSS instead.
By replacing align="X" attributes with text-align:X; CSS equivalent,
the validator now completes without any errors or warnings.
This solves the remaining issues from #97.
The application name and URL was defined several places in the code,
and the name was not written exactly the same everywhere.
By using the same constants everywhere, consistency is obtained.
This image, with an optional caption below, is displayed in the lower
section of the connector/cable node in the diagram - just above the
notes if present.
This solves the basic part of issue #27, and is a continuation of
PR #137 that was closed due to changes in the base branch.
Add -V command line option (and --version as an alias) to
both wireviz.py and build_examples.py that show version number.
Move the version number from setup.py into __init__.py to access
the same version number specification from all files needing it.
This solves part 4 of issue #167.
It seems, that the current implementation ignores --generate-bom,
and that parser.add_argument() code line is therefore commented
out until it gets implemented to avoid any confusion.
This solves part 1 of issue #167.