better code organization
function parameters should be lowercase Fix crash on invalid labels import Added invoice exporting and reduced duplicate code Better exception handling removed json module import some more cleanup Cleaned up some stuff Added exporting contacts
This commit is contained in:
@@ -25,10 +25,11 @@ import dns
|
||||
import json
|
||||
import traceback
|
||||
import sys
|
||||
import os
|
||||
|
||||
from . import bitcoin
|
||||
from . import dnssec
|
||||
from .util import FileImportFailed, FileImportFailedEncrypted
|
||||
from .util import export_meta, import_meta
|
||||
|
||||
|
||||
class Contacts(dict):
|
||||
@@ -51,18 +52,15 @@ class Contacts(dict):
|
||||
self.storage.put('contacts', dict(self))
|
||||
|
||||
def import_file(self, path):
|
||||
try:
|
||||
with open(path, 'r') as f:
|
||||
d = self._validate(json.loads(f.read()))
|
||||
except json.decoder.JSONDecodeError:
|
||||
traceback.print_exc(file=sys.stderr)
|
||||
raise FileImportFailedEncrypted()
|
||||
except BaseException:
|
||||
traceback.print_exc(file=sys.stdout)
|
||||
raise FileImportFailed()
|
||||
self.update(d)
|
||||
import_meta(path, self.validate, self.load_meta)
|
||||
|
||||
def load_meta(self, data):
|
||||
self.update(data)
|
||||
self.save()
|
||||
|
||||
def export_file(self, fileName):
|
||||
export_meta(self, fileName)
|
||||
|
||||
def __setitem__(self, key, value):
|
||||
dict.__setitem__(self, key, value)
|
||||
self.save()
|
||||
@@ -119,7 +117,7 @@ class Contacts(dict):
|
||||
except AttributeError:
|
||||
return None
|
||||
|
||||
def _validate(self, data):
|
||||
def validate(self, data):
|
||||
for k,v in list(data.items()):
|
||||
if k == 'contacts':
|
||||
return self._validate(v)
|
||||
|
||||
@@ -40,7 +40,7 @@ except ImportError:
|
||||
from . import bitcoin
|
||||
from . import util
|
||||
from .util import print_error, bh2u, bfh
|
||||
from .util import FileImportFailed, FileImportFailedEncrypted
|
||||
from .util import export_meta, import_meta
|
||||
from . import transaction
|
||||
from . import x509
|
||||
from . import rsakey
|
||||
@@ -468,27 +468,31 @@ class InvoiceStore(object):
|
||||
continue
|
||||
|
||||
def import_file(self, path):
|
||||
try:
|
||||
with open(path, 'r') as f:
|
||||
d = json.loads(f.read())
|
||||
self.load(d)
|
||||
except json.decoder.JSONDecodeError:
|
||||
traceback.print_exc(file=sys.stderr)
|
||||
raise FileImportFailedEncrypted()
|
||||
except BaseException:
|
||||
traceback.print_exc(file=sys.stdout)
|
||||
raise FileImportFailed()
|
||||
import_meta(path, self.validate, self.on_import)
|
||||
|
||||
#TODO: Invoice import validation
|
||||
def validate(self, data):
|
||||
return data
|
||||
|
||||
def on_import(self, data):
|
||||
self.load(data)
|
||||
self.save()
|
||||
|
||||
def save(self):
|
||||
l = {}
|
||||
def export_file(self, fileName):
|
||||
export_meta(self.before_save(), fileName)
|
||||
|
||||
def before_save(self):
|
||||
l= {}
|
||||
for k, pr in self.invoices.items():
|
||||
l[k] = {
|
||||
'hex': bh2u(pr.raw),
|
||||
'requestor': pr.requestor,
|
||||
'txid': pr.tx
|
||||
}
|
||||
self.storage.put('invoices', l)
|
||||
return l
|
||||
|
||||
def save(self):
|
||||
self.storage.put('invoices', self.before_save())
|
||||
|
||||
def get_status(self, key):
|
||||
pr = self.get(key)
|
||||
|
||||
35
lib/util.py
35
lib/util.py
@@ -60,16 +60,18 @@ class InvalidPassword(Exception):
|
||||
|
||||
|
||||
class FileImportFailed(Exception):
|
||||
def __init__(self, message=''):
|
||||
self.message = str(message)
|
||||
|
||||
def __str__(self):
|
||||
return _("Failed to import file.")
|
||||
return _("Failed to import from file.") + "\n" + self.message
|
||||
|
||||
class FileExportFailed(Exception):
|
||||
def __init__(self, reason=''):
|
||||
self.message = str(reason)
|
||||
|
||||
class FileImportFailedEncrypted(FileImportFailed):
|
||||
def __str__(self):
|
||||
return (_('Failed to import file.') + ' ' +
|
||||
_('Perhaps it is encrypted...') + '\n' +
|
||||
_('Importing encrypted files is not supported.'))
|
||||
|
||||
return( _("Failed to export to file.") + "\n" + self.message )
|
||||
|
||||
# Throw this exception to unwind the stack like when an error occurs.
|
||||
# However unlike other exceptions the user won't be informed.
|
||||
@@ -785,3 +787,24 @@ def setup_thread_excepthook():
|
||||
|
||||
def versiontuple(v):
|
||||
return tuple(map(int, (v.split("."))))
|
||||
|
||||
def import_meta(path, validater, load_meta):
|
||||
try:
|
||||
with open(path, 'r') as f:
|
||||
d = validater(json.loads(f.read()))
|
||||
load_meta(d)
|
||||
#backwards compatibility for JSONDecodeError
|
||||
except ValueError:
|
||||
traceback.print_exc(file=sys.stderr)
|
||||
raise FileImportFailed(_("Invalid JSON code."))
|
||||
except BaseException as e:
|
||||
traceback.print_exc(file=sys.stdout)
|
||||
raise FileImportFailed(e)
|
||||
|
||||
def export_meta(meta, fileName):
|
||||
try:
|
||||
with open(fileName, 'w+') as f:
|
||||
json.dump(meta, f, indent=4, sort_keys=True)
|
||||
except (IOError, os.error) as reason:
|
||||
traceback.print_exc(file=sys.stderr)
|
||||
raise FileExportFailed(str(reason))
|
||||
|
||||
Reference in New Issue
Block a user