Skip to content

Commit a5cd2b1

Browse files
committed
feat(misc): Rename bytes to human-readable conversion function
- Implemented `bytes_to_human_readable` function to convert byte sizes into a more readable format. - Added unit tests for the new function to ensure accuracy across various sizes.
1 parent 073a1f7 commit a5cd2b1

2 files changed

Lines changed: 37 additions & 11 deletions

File tree

src/imcflibs/imagej/misc.py

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,13 @@
1010

1111
from ij import IJ # pylint: disable-msg=import-error
1212
from ij.plugin import Duplicator, ImageCalculator, StackWriter
13+
from org.scijava.widget import TextWidget, WidgetStyle
1314

1415
from .. import pathtools
1516
from ..log import LOG as log
1617
from . import bioformats as bf
1718
from . import prefs
1819

19-
from org.scijava.widget import WidgetStyle
20-
from org.scijava.widget import TextWidget
21-
2220

2321
def show_status(msg):
2422
"""Update the ImageJ status bar and issue a log message.
@@ -533,7 +531,9 @@ def write_ordereddict_to_csv(out_file, content):
533531
dict_writer.writerows(content)
534532

535533

536-
def save_image_in_format(imp, format, out_dir, series, pad_number, split_channels, suffix=""):
534+
def save_image_in_format(
535+
imp, format, out_dir, series, pad_number, split_channels, suffix=""
536+
):
537537
"""Save an ImagePlus object in the specified format.
538538
539539
This function provides flexible options for saving ImageJ images in various
@@ -791,22 +791,32 @@ def save_script_parameters(destination, save_file_name="script_parameters.txt"):
791791

792792
timed_log("Saved script parameters to: %s" % out_path)
793793

794-
def convert_bytes(size):
795-
"""Convert size from bytes to a readable value.
794+
795+
def bytes_to_human_readable(size):
796+
"""Convert a byte count to a human-readable string using binary units.
796797
797798
Parameters
798799
----------
799800
size : int
800-
Byte size
801+
Byte size (number of bytes).
801802
802803
Returns
803804
-------
804805
str
805-
Easy to read value with the correct unit
806+
Human-friendly size string, e.g. `"512.0 bytes"`, `"2.0 KB"`,
807+
`"1.0 MB"`.
808+
809+
Notes
810+
-----
811+
- Uses powers of 1024 (KB = 1024 bytes).
812+
- Always returns a string with one decimal place and the unit.
806813
"""
807-
for x in ["bytes", "KB", "MB", "GB", "TB"]:
814+
815+
for unit in ["bytes", "KB", "MB", "GB", "TB"]:
808816
if size < 1024.0:
809-
return "%3.1f %s" % (size, x)
817+
return "%3.1f %s" % (size, unit)
810818
size /= 1024.0
811819

812-
return size
820+
# If the value is larger than the largest unit, fall back to TB with
821+
# the current value (already divided accordingly).
822+
return "%3.1f %s" % (size, "TB")

tests/test_misc.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
"""Tests for `imcflibs.imagej.misc` utility functions."""
2+
3+
from imcflibs.imagej.misc import bytes_to_human_readable
4+
5+
6+
def test_bytes_to_human_readable_simple():
7+
assert bytes_to_human_readable(500) == "500.0 bytes"
8+
assert bytes_to_human_readable(2048) == "2.0 KB"
9+
assert bytes_to_human_readable(1024 * 1024) == "1.0 MB"
10+
assert bytes_to_human_readable(5 * 1024**3) == "5.0 GB"
11+
12+
13+
def test_bytes_to_human_readable_large():
14+
# 1.5 TB in bytes should format as 1.5 TB
15+
size = int(1.5 * (1024**4))
16+
assert bytes_to_human_readable(size) == "1.5 TB"

0 commit comments

Comments
 (0)