show_progress: add finished=true/false to archive_progress json, fixes #6570

also:
- remove empty values from final json
- add test
This commit is contained in:
Thomas Waldmann 2022-05-08 18:32:07 +02:00
parent dc89798496
commit 1c0937958d
2 changed files with 35 additions and 2 deletions

View File

@ -143,11 +143,15 @@ class Statistics:
if dt is None or now - self.last_progress > dt:
self.last_progress = now
if self.output_json:
data = self.as_dict()
if not final:
data = self.as_dict()
data['path'] = remove_surrogates(item.path if item else '')
else:
data = {}
data.update({
'time': time.time(),
'type': 'archive_progress',
'path': remove_surrogates(item.path if item else ''),
'finished': final,
})
msg = json.dumps(data)
end = '\n'

View File

@ -1,3 +1,4 @@
import json
from collections import OrderedDict
from datetime import datetime, timezone
from io import StringIO
@ -61,6 +62,34 @@ This archive: 20 B 10 B 10 B""
assert repr(stats) == f'<Statistics object at {id(stats):#x} (20, 10, 10)>'
def test_stats_progress_json(stats):
stats.output_json = True
out = StringIO()
stats.show_progress(item=Item(path='foo'), stream=out)
result = json.loads(out.getvalue())
assert result['type'] == 'archive_progress'
assert isinstance(result['time'], float)
assert result['finished'] is False
assert result['path'] == 'foo'
assert result['original_size'] == 20
assert result['compressed_size'] == 10
assert result['deduplicated_size'] == 10
assert result['nfiles'] == 0 # this counter gets updated elsewhere
out = StringIO()
stats.show_progress(stream=out, final=True)
result = json.loads(out.getvalue())
assert result['type'] == 'archive_progress'
assert isinstance(result['time'], float)
assert result['finished'] is True # see #6570
assert 'path' not in result
assert 'original_size' not in result
assert 'compressed_size' not in result
assert 'deduplicated_size' not in result
assert 'nfiles' not in result
class MockCache:
class MockRepo: