use custom JSON encoder for repr'ing Borg objects consistently

This commit is contained in:
Marian Beermann 2017-02-23 12:09:09 +01:00
parent 7cbade2f8c
commit 2ab5d0f213
1 changed files with 28 additions and 8 deletions

View File

@ -65,8 +65,25 @@ from .upgrader import AtticRepositoryUpgrader, BorgRepositoryUpgrader
STATS_HEADER = " Original size Compressed size Deduplicated size"
class BorgJsonEncoder(json.JSONEncoder):
def default(self, o):
if isinstance(o, Repository) or isinstance(o, RemoteRepository):
return {
'id': bin_to_hex(o.id),
'location': o._location.canonical_path(),
}
if isinstance(o, Archive):
return o.info()
if isinstance(o, Cache):
return {
'path': o.path,
'stats': o.stats(),
}
return super().default(o)
def print_as_json(obj):
print(json.dumps(obj, sort_keys=True, indent=4))
print(json.dumps(obj, sort_keys=True, indent=4, cls=BorgJsonEncoder))
def argument(args, str_or_bool):
@ -371,9 +388,10 @@ class Archiver:
if args.stats:
if args.json:
print_as_json({
'cache_stats': cache.stats(),
'repository': repository,
'cache': cache,
'stats': archive.stats.as_dict(),
'archive': archive.info(),
'archive': archive,
})
else:
log_multi(DASHES,
@ -1026,9 +1044,8 @@ class Archiver:
encryption += '\nKey file: %s' % key.find_key()
info = {
'id': bin_to_hex(repository.id),
'location': repository._location.canonical_path(),
'cache': cache.path,
'repository': repository,
'cache': cache,
'security_dir': cache.security_manager.dir,
'encryption': encryption,
}
@ -1041,9 +1058,12 @@ class Archiver:
Repository ID: {id}
Location: {location}
{encryption}
Cache: {cache}
Cache: {cache.path}
Security dir: {security_dir}
""").strip().format_map(info))
""").strip().format(
id=bin_to_hex(repository.id),
location=repository._location.canonical_path(),
**info))
print(DASHES)
print(STATS_HEADER)
print(str(cache))