Add bytes_per_second to hash_file.

master
voussoir 2021-01-25 14:50:39 -08:00
parent 1d90086d96
commit d9e1e6bf7c
No known key found for this signature in database
GPG Key ID: 5F7554F8C26DACCB
1 changed files with 15 additions and 3 deletions

View File

@ -546,10 +546,14 @@ def hash_file(
path, path,
hash_class, hash_class,
*, *,
bytes_per_second=None,
callback_progress=None, callback_progress=None,
chunk_size=CHUNK_SIZE, chunk_size=CHUNK_SIZE,
): ):
''' '''
hash_class:
Should be a hashlib class or a callable that returns an instance of one.
callback_progress: callback_progress:
A function that takes three parameters: A function that takes three parameters:
path object, bytes ingested so far, bytes total path object, bytes ingested so far, bytes total
@ -557,21 +561,29 @@ def hash_file(
path = pathclass.Path(path) path = pathclass.Path(path)
path.assert_is_file() path.assert_is_file()
hasher = hash_class() hasher = hash_class()
bytes_per_second = limiter_or_none(bytes_per_second)
callback_progress = callback_progress or do_nothing
checked_bytes = 0 checked_bytes = 0
file_size = path.size file_size = path.size
callback_progress = callback_progress or do_nothing
handle = path.open('rb') handle = path.open('rb')
with handle: with handle:
while True: while True:
chunk = handle.read(chunk_size) chunk = handle.read(chunk_size)
if not chunk: if not chunk:
break break
this_size = len(chunk)
hasher.update(chunk) hasher.update(chunk)
checked_bytes += len(chunk)
checked_bytes += this_size
callback_progress(path, checked_bytes, file_size) callback_progress(path, checked_bytes, file_size)
if bytes_per_second is not None:
bytes_per_second.limit(this_size)
return hasher return hasher
def is_xor(*args): def is_xor(*args):