Ralph,

I appreciate the feedback, thanks. I’m a pretty terrible Python programmer,
having last touched it in 2001/2002 when I started at university (and
no-one else used it). I’ll throw your complete set of comments to Claude
and see what it thinks.

As I’m about to send the resulting output files to a Chinese harness
factory, the latest commit now features simplified Chinese support and
support for cores contained within a sheath (a cable as it were)…

On Tue, 12 May 2026 at 11:45, Ralph Corderoy <[email protected]> wrote:

> Hi Hugh,
>
> > It started off just getting Claude to generate these directly from the
> > csv, but by the time I’d done a couple of them it made sense to get it
> > into a simple program. All told it’s about half a day of work. Claude
> > did all the program architecture, wrote all the code, wrote the docs,
> > managed the repo and pushed to my GitHub.
>
> Thanks for making that available.  I was curious so here's some
> comments.
>
>
> When looking at the HTML produced for the example, I was puzzled why
> clicking each of the ‘Bootlace ferrule’ wires in turn switched the
> highlight to them except for ‘TL-GND (power meter’ which cancelled the
> highlight.
>
> It's because clicking the text doesn't ‘pick’; clicking the rectangle
> the text sits in is needed.  ‘TL-GND (power meter’ is the longest piece
> of text so when I ran the mouse down vertically, it happened to be over
> text for just that one wire.
>
> I think the text should pick too, e.g. ‘13 Mode change’.
>
>
> I looked just at the start of wd/parser.py:
>
>     5   # Flexible column name aliases (all lowercase, spaces normalised)
>     6   COLUMN_ALIASES: dict[str, list[str]] = {
>     7       "signal":      ["signal", "signal name", "name", "wire", "wire
> name"],
>     8       "left_conn":   ["left connector", "left conn", "from
> connector", "from",
>     9                       "source connector", "source"],
>    10       "left_pin":    ["left pin", "from pin", "source pin", "pin
> (left)", "left pin no"],
>    11       "right_conn":  ["right connector", "right conn", "to
> connector", "to",
>    12                       "dest connector", "destination connector",
> "destination",
>    13                       "termination", "termination type"],
>    14       "right_pin":   ["right pin", "to pin", "dest pin",
> "destination pin",
>    15                       "pin (right)", "right pin no"],
>    16       "colour":      ["wire colour", "wire color", "colour",
> "color", "wire col"],
>    17       "warning":     ["warning", "note", "notes", "annotation",
> "remark"],
>    18       "pair":        ["pair", "twisted pair", "tp", "pair group",
> "cable group"],
>    19       "length":      ["length", "wire length", "len"],
>    20   }
>
> COLUMN_ALIASES is only currently used by parser.py so perhaps it could
> be better hidden from importers.
>
> That the value is a list suggests to me, trying to understand its
> purpose, that it may be modified, but it isn't.  A tuple avoids this.
>
> It would be nice if the first string in the list of values was
> consistently the same as the key.  Then I wouldn't need to hunt to see
> if that was true each time, as it is.
>
>    23   def _norm(h: str) -> str:
>    24       return h.strip().lower().replace("_", " ").replace("-", " ")
>
> This smells wrong: stripping spaces only to then turn some characters
> into spaces.
>
>    27   def _map_headers(headers: list[str]) -> dict[str, int]:
>    28       norm = {_norm(h): i for i, h in enumerate(headers)}
>    29       result: dict[str, int] = {}
>    30       for field, aliases in COLUMN_ALIASES.items():
>    31           for alias in aliases:
>    32               if alias in norm:
>    33                   result[field] = norm[alias]
>    34                   break
>    35       return result
>
> I haven't looked at the calls of this so it might not be possible, and
> if it is possible it may not matter, but headers[] may be mapped onto
> a norm{} which has fewer keys than len(headers).  The last one wins,
> having its index, ‘i’, stored.  This might confuse the user.
>
> And if a normalised header element isn't found in the aliases, which
> include the key itself, then it is silently dropped by not appearing in
> result[].
>
> The example CSV could show that blank lines and comments are allowed,
> that spaces can be used within fields to create columns, and notes may
> be given.
>
> --
> Cheers, Ralph.
>
> --
>   Next meeting: Online, Jitsi, Tuesday, 2026-06-02 20:00
>   Check to whom you are replying
>   Meetings, mailing list, IRC, ...  https://dorset.lug.org.uk
>   New thread, don't hijack:  mailto:[email protected]
>
-- 
  Next meeting: Online, Jitsi, Tuesday, 2026-06-02 20:00
  Check to whom you are replying
  Meetings, mailing list, IRC, ...  https://dorset.lug.org.uk
  New thread, don't hijack:  mailto:[email protected]

Reply via email to