DRY fix for _handle_claim_result

This commit is contained in:
Kay Kurokawa 2017-06-23 12:37:55 -04:00 committed by Jack Robison
parent 2728b1ed60
commit cbd85cd7d8
No known key found for this signature in database
GPG key ID: 284699E7404E3CFF

View file

@ -688,46 +688,7 @@ class Wallet(object):
defer.returnValue(my_claim) defer.returnValue(my_claim)
@defer.inlineCallbacks @defer.inlineCallbacks
def _handle_claim_result(self, results, update_caches=True): def _decode_and_cache_claim_result(self, claim, update_caches):
if not results:
raise UnknownNameError("No results to return")
if 'error' in results:
if results['error'] in ['name is not claimed', 'claim not found']:
if 'claim_id' in results:
raise UnknownClaimID(results['claim_id'])
elif 'name' in results:
raise UnknownNameError(results['name'])
elif 'uri' in results:
raise UnknownURI(results['uri'])
raise Exception(results['error'])
if 'certificate' in results:
try:
decoded = smart_decode(results['certificate']['value'])
claim_dict = decoded.claim_dict
outpoint = ClaimOutpoint(results['certificate']['txid'],
results['certificate']['nout'])
name = results['certificate']['name']
results['certificate']['value'] = claim_dict
results['certificate']['hex'] = decoded.serialized.encode('hex')
if update_caches:
if decoded.is_stream:
yield self._save_name_metadata(name, outpoint, decoded.source_hash)
yield self._update_claimid(results['certificate']['claim_id'], name, outpoint)
yield self._storage.save_claim_to_cache(results['certificate']['claim_id'],
results['certificate']['claim_sequence'],
decoded, results['certificate']['address'],
results['certificate']['height'],
results['certificate']['amount'],
results['certificate']['supports'],
None,
None)
except DecodeError:
pass
if 'claim' in results:
claim = results['claim']
if 'has_signature' in claim and claim['has_signature']: if 'has_signature' in claim and claim['has_signature']:
if not claim['signature_is_valid']: if not claim['signature_is_valid']:
log.warning("lbry://%s#%s has an invalid signature", log.warning("lbry://%s#%s has an invalid signature",
@ -755,41 +716,48 @@ class Wallet(object):
claim['value'] = None claim['value'] = None
claim['error'] = "Failed to decode value" claim['error'] = "Failed to decode value"
results['claim'] = claim defer.returnValue(claim)
@defer.inlineCallbacks
def _handle_claim_result(self, results, update_caches=True):
if not results:
raise UnknownNameError("No results to return")
if 'error' in results:
if results['error'] in ['name is not claimed', 'claim not found']:
if 'claim_id' in results:
raise UnknownClaimID(results['claim_id'])
elif 'name' in results:
raise UnknownNameError(results['name'])
elif 'uri' in results:
raise UnknownURI(results['uri'])
raise Exception(results['error'])
# case where return value is {'certificate:{'txid', 'value',...}}
elif 'certificate' in results:
results['certificate'] = yield self._decode_and_cache_claim_result(
results['certificate'],
update_caches)
# case where return value is {'claim':{'txid','value',...}}
elif 'claim' in results:
results['claim'] = yield self._decode_and_cache_claim_result(
results['claim'],
update_caches)
# case where return value is {'txid','value',...}
# returned by queries that are not name resolve related
# (getclaimbyoutpoint, getclaimbyid, getclaimsfromtx)
# we do not update caches here because it should be missing
# some values such as claim_sequence, and supports
elif 'value' in results: elif 'value' in results:
if 'has_signature' in results and results['has_signature']: results = yield self._decode_and_cache_claim_result(results, update_caches=False)
if not results['signature_is_valid']:
log.warning("lbry://%s#%s has an invalid signature",
results['name'], results['claim_id'])
try:
decoded = ClaimDict.load_dict(results['value'])
claim_dict = decoded.claim_dict
claim_hex = decoded.serialized.encode('hex')
claim_err = None
outpoint = ClaimOutpoint(results['txid'], results['nout'])
name = results['name']
if update_caches:
if decoded.is_stream:
yield self._save_name_metadata(name, outpoint, decoded.source_hash)
yield self._update_claimid(results['claim_id'], name, outpoint)
yield self._storage.save_claim_to_cache(results['claim_id'],
results.get('claim_sequence', None),
decoded, results['address'],
results['height'], results['amount'],
results.get('supports', '[]'),
results.get('channel_name', None),
results.get('signature_is_valid',
None))
except DecodeError: else:
claim_dict = None msg = 'result in unexpected format:{}'.format(results)
claim_hex = results['value'] assert False, msg
claim_err = "Failed to decode value"
if claim_err:
results['error'] = claim_err
results['hex'] = claim_hex
results['value'] = claim_dict
defer.returnValue(results) defer.returnValue(results)