Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 34 additions & 0 deletions pylabrobot/resources/carrier.py
Original file line number Diff line number Diff line change
Expand Up @@ -281,6 +281,40 @@ def __init__(
)
self.sites: Dict[int, PlateHolder] = sites or {} # fix type

def summary(self) -> str:
"""Return a summary of the carrier's sites and their contents."""

def create_pretty_table(header, *columns) -> str:
col_widths = [
max(len(str(item)) for item in [header[i]] + list(columns[i])) for i in range(len(header))
]

def format_row(row, border="|") -> str:
return (
f"{border} "
+ " | ".join(f"{str(row[i]).ljust(col_widths[i])}" for i in range(len(row)))
+ f" {border}"
)

def separator_line(cross: str = "+", line: str = "-") -> str:
return cross + cross.join(line * (width + 2) for width in col_widths) + cross

table = []
table.append(separator_line()) # Top border
table.append(format_row(header))
table.append(separator_line()) # Header separator
for row in zip(*columns):
table.append(format_row(row))
table.append(separator_line()) # Bottom border
return "\n".join(table)

indices = sorted(self.sites.keys())
header = ["Site", "Content"]
site_numbers = list(reversed([str(i) for i in indices]))
site_resources = list(reversed([self.sites[i].resource for i in indices]))
site_contents = [r.name if r is not None else "<empty>" for r in site_resources]
return create_pretty_table(header, site_numbers, site_contents)


class MFXCarrier(Carrier[ResourceHolder]):
def __init__(
Expand Down
Loading