fix: show exact sizes where the code compares them

A size validated by the emulator is shown with its bytes on the emulator
page, and a collection card's badge gives the exact size, in whole KB or
MB only when it is one. raze's three DUKE3D.GRP read 42.3 MB alike.
This commit is contained in:
Abdessamad Derraz committed 2026-11-06 03:44:57 +01:00
1 parent 6d6a79019a
commit 225cdaff22
4 files changed
+62 -8

No files matched your search

+32 -7
View File
@@ -6022,7 +6022,9 @@ def _system_file_card(
name = f["name"]
sha1_full = f.get("sha1", "unknown")
md5_full = f.get("md5", "unknown")
size = _fmt_size(f.get("size", 0))
# The size a card names is the file's own, exact: rounded, 44,348,015
# and 44,356,548 bytes were one 42.3 MB.
size = _card_size(int(f.get("size", 0)))
# Who reads this file, not who reads a file of this name
plats = sorted(consumers.platforms.get(sha1_full, ()))
emus = sorted(consumers.emulators.get(sha1_full, ()))
@@ -8051,6 +8053,26 @@ def emulator_setups(coverages: dict, profiles: dict) -> dict[str, list[str]]:
}
def _validation_names(validation: object) -> set[str]:
"""The checks a `validation:` names, a list or one list per build."""
if isinstance(validation, dict):
return {str(v) for checks in validation.values() for v in checks or []}
return {str(v) for v in validation or []}
def _card_size(size: int) -> str:
"""A file's size, exact: in whole MB or KB when it is one, else in B."""
for unit, scale in (("MB", 1024 * 1024), ("KB", 1024)):
if size >= scale and size % scale == 0:
return f"{size // scale:,} {unit}"
return f"{size:,} B"
def _exact_size(size: int) -> str:
"""A rounded size with its bytes, where the bytes are not the same figure."""
return _fmt_size(size) if size < 1024 else f"{_fmt_size(size)} ({size:,} bytes)"
def _build_rows(profile: dict) -> list[str]:
"""Meta card rows for who ships the build, how its files are found, why
its revision is held and where its releases are announced."""
@@ -8184,25 +8206,28 @@ def _render_emulator_file(
details.append(f"Found by: {found}")
if fsystem:
details.append(f"System: {_named_system_link(fsystem, '../')}")
# Where the code compares the size, the exact bytes: raze tells three
# DUKE3D.GRP apart by size, all three shown as 42.3 MB.
sized = _exact_size if "size" in _validation_names(validation) else _fmt_size
if size:
if isinstance(size, list):
size_str = " / ".join(_fmt_size(s) for s in size)
size_str = " / ".join(sized(s) for s in size)
else:
size_str = _fmt_size(size)
size_str = sized(size)
if fmin or fmax:
bounds = []
if fmin:
bounds.append(f"min {_fmt_size(fmin)}")
bounds.append(f"min {sized(fmin)}")
if fmax:
bounds.append(f"max {_fmt_size(fmax)}")
bounds.append(f"max {sized(fmax)}")
size_str += f" ({', '.join(bounds)})"
details.append(f"Size: {size_str}")
elif fmin or fmax:
bounds = []
if fmin:
bounds.append(f"min {_fmt_size(fmin)}")
bounds.append(f"min {sized(fmin)}")
if fmax:
bounds.append(f"max {_fmt_size(fmax)}")
bounds.append(f"max {sized(fmax)}")
details.append(f"Size: {', '.join(bounds)}")
# Starlight folds the hashes and gives each a copy button.
copyable = markup.starlight()
+1 -1
View File
@@ -110,7 +110,7 @@ class ASystemCardShowsTheAnswerFirst(unittest.TestCase):
self.shown = self.text.replace(self.fold, "")
def test_the_open_part(self) -> None:
for fact in ("<code>ppge_atlas.zim</code>", ">650.9 KB<", ">Download</a>",
for fact in ("<code>ppge_atlas.zim</code>", ">666,539 B<", ">Download</a>",
"<dt>On the setup's list</dt>", "<dt>Packed for its emulators by</dt>",
"<dt>Emulators</dt>", f'<dt>SHA1</dt><dd class="rb-hash">{SHA1[:12]}</dd>'):
self.assertIn(fact, self.shown)
+16
View File
@@ -789,6 +789,22 @@ class AnEmulatorPageNamesItsSetups(unittest.TestCase):
self.assertIn("EmuDeck", card[1].splitlines()[0])
class SizesTheCodeComparesAreExact(unittest.TestCase):
"""raze validates DUKE3D.GRP by size, and its page showed 42.3 MB for
44,356,548 and 44,348,015 bytes alike."""
def test_a_validated_size_carries_its_bytes(self):
profile = {"emulator": "x", "type": "libretro", "systems": ["sony-playstation"], "files": [
{"name": "DUKE3D.GRP", "size": 44348015, "validation": ["size", "crc32"]},
{"name": "other.bin", "size": 44356548},
{"name": "built.bin", "size": 2304, "validation": {"core": ["size"]}},
]}
page = _page("x", profile)
self.assertIn("Size: 42.3 MB (44,348,015 bytes)", page)
self.assertIn("Size: 2.2 KB (2,304 bytes)", page)
self.assertNotIn("44,356,548", page)
class ADataDirectoryNamesAFetchableOrigin(unittest.TestCase):
"""pcee2's page linked github.com/PCSX2/pcsx2/archive/{version}.tar.gz,
a 404, and buildbot zips showed `Revision: master (2047720058)`: a branch
+13
View File
@@ -184,6 +184,19 @@ class ThePermalinkIsAnIcon(unittest.TestCase):
self.assertEqual(page.count('href="#rb-link-icon"'), 2)
class TheCardGivesTheSizeInBytes(unittest.TestCase):
"""The badge rounded to 0.1 KB and no line of a system card gave the
bytes an emulator compares."""
def test_the_badge_is_exact(self):
for size, shown in ((524288, "512 KB"), (44348015, "44,348,015 B"),
(2 * 1024 * 1024, "2 MB"), (2304, "2,304 B"), (10, "10 B")):
with self.subTest(size=size):
card = {**_sony_file("scph5501.bin", "4"), "size": size}
title = gs._system_file_card(card, FileConsumers({"files": {}}))[2]
self.assertIn(f'<span class="rb-badge rb-badge-muted">{shown}</span>', title)
class TheCardLinesSayWhatTheyMean(unittest.TestCase):
""""Platforms:" and "Also installed by:" listed different setups, as
lower-case ids, and only a code comment told them apart."""