From 0f602e0e62db636f0ce875635c964845dfa19a7e Mon Sep 17 00:00:00 2001 From: Job Evers-Meltzer Date: Wed, 27 Jul 2016 11:59:57 -0500 Subject: [PATCH 1/4] allow bittrex fee to be changed --- lbrynet/core/LBRYMetadata.py | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/lbrynet/core/LBRYMetadata.py b/lbrynet/core/LBRYMetadata.py index e57ee1ad6..106fabe1e 100644 --- a/lbrynet/core/LBRYMetadata.py +++ b/lbrynet/core/LBRYMetadata.py @@ -55,8 +55,9 @@ class LBRYFeeFormat(dict): class LBRYFee(LBRYFeeFormat): - def __init__(self, fee_dict, rate_dict): + def __init__(self, fee_dict, rate_dict, bittrex_fee=None): LBRYFeeFormat.__init__(self, fee_dict) + self.bittrex_fee = BITTREX_FEE if bittrex_fee is None else bittrex_fee rates = deepcopy(rate_dict) assert 'BTCLBC' in rates and 'USDBTC' in rates @@ -88,23 +89,15 @@ class LBRYFee(LBRYFeeFormat): return r def _usd_to_btc(self, usd): - # log.error("usd to btc: " + str(usd)) - # log.error("%f * %f = %f" % (self._USDBTC['spot'], float(usd), self._USDBTC['spot'] * float(usd))) return self._USDBTC['spot'] * float(usd) def _btc_to_usd(self, btc): - # log.error("btc to usd: " + str(btc)) - # log.error("%f / %f = %f" % (float(btc), self._USDBTC['spot'], float(btc) / self._USDBTC['spot'])) return float(btc) / self._USDBTC['spot'] def _btc_to_lbc(self, btc): - # log.error("btc to lbc: " + str(btc)) - # log.error("%f * %f = %f" % (float(btc), self._BTCLBC['spot'], float(btc) * self._BTCLBC['spot'] / (1.0 - BITTREX_FEE))) - return float(btc) * self._BTCLBC['spot'] / (1.0 - BITTREX_FEE) + return float(btc) * self._BTCLBC['spot'] / (1.0 - self.bittrex_fee) def _lbc_to_btc(self, lbc): - # log.error("lbc to btc: " + str(lbc)) - # log.error("%f / %f = %f" % (self._BTCLBC['spot'], float(lbc), self._BTCLBC['spot'] / float(lbc))) return self._BTCLBC['spot'] / float(lbc) From 6a1efedc1fb4ddf89079e6b2c7185448feeb1100 Mon Sep 17 00:00:00 2001 From: Job Evers-Meltzer Date: Wed, 27 Jul 2016 12:05:29 -0500 Subject: [PATCH 2/4] some example tests. please expand on these --- tests/lbrynet/core/test_LBRYMetadata.py | 102 ++++++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 tests/lbrynet/core/test_LBRYMetadata.py diff --git a/tests/lbrynet/core/test_LBRYMetadata.py b/tests/lbrynet/core/test_LBRYMetadata.py new file mode 100644 index 000000000..ac88ffa77 --- /dev/null +++ b/tests/lbrynet/core/test_LBRYMetadata.py @@ -0,0 +1,102 @@ +import mock +from lbrynet.core import LBRYMetadata + +from twisted.trial import unittest + + +class LBRYFeeFormatTest(unittest.TestCase): + def test_fee_created_with_correct_inputs(self): + fee_dict = { + 'USD': { + 'amount': 10, + 'address': None + } + } + fee = LBRYMetadata.LBRYFeeFormat(fee_dict) + self.assertEqual(10, fee['USD']['amount']) + + +class LBRYFeeTest(unittest.TestCase): + def setUp(self): + self.patcher = mock.patch('time.time') + self.time = self.patcher.start() + self.time.return_value = 0 + + def tearDown(self): + self.time.stop() + + def test_fee_converts_to_lbc(self): + fee_dict = { + 'USD': { + 'amount': 10, + 'address': None + } + } + rates = {'BTCLBC': {'spot': 3, 'ts': 2}, 'USDBTC': {'spot': 2, 'ts': 3}} + fee = LBRYMetadata.LBRYFee(fee_dict, rates, 0) + self.assertEqual(60, fee.to_lbc()) + + +class MetadataTest(unittest.TestCase): + def test_assertion_if_source_is_missing(self): + metadata = {} + with self.assertRaises(AssertionError): + LBRYMetadata.Metadata(metadata) + + def test_assertion_if_invalid_source(self): + metadata = { + 'sources': {'garbage': None} + } + with self.assertRaises(AssertionError): + LBRYMetadata.Metadata(metadata) + + def test_assertion_if_missing_v001_field(self): + metadata = { + 'sources': [], + } + with self.assertRaises(AssertionError): + LBRYMetadata.Metadata(metadata) + + def test_version_is_001_if_all_fields_are_present(self): + metadata = { + 'sources': [], + 'title': None, + 'description': None, + 'author': None, + 'language': None, + 'license': None, + 'content-type': None, + } + m = LBRYMetadata.Metadata(metadata) + self.assertEquals('0.0.1', m.metaversion) + + def test_assertion_if_there_is_an_extra_field(self): + metadata = { + 'sources': [], + 'title': None, + 'description': None, + 'author': None, + 'language': None, + 'license': None, + 'content-type': None, + 'extra': None + } + with self.assertRaises(AssertionError): + LBRYMetadata.Metadata(metadata) + + def test_version_is_002_if_all_fields_are_present(self): + metadata = { + 'sources': [], + 'title': None, + 'description': None, + 'author': None, + 'language': None, + 'license': None, + 'content-type': None, + 'nsfw': None, + 'ver': None + } + m = LBRYMetadata.Metadata(metadata) + self.assertEquals('0.0.2', m.metaversion) + + From 900d3ad01d12ca5e39783eaac79802324efb8961 Mon Sep 17 00:00:00 2001 From: Job Evers-Meltzer Date: Wed, 27 Jul 2016 13:12:20 -0500 Subject: [PATCH 3/4] Fixes errback not being callable Small code refactoring to make it more obvious what both the callback and errback are doing --- lbrynet/lbrynet_daemon/LBRYDaemon.py | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/lbrynet/lbrynet_daemon/LBRYDaemon.py b/lbrynet/lbrynet_daemon/LBRYDaemon.py index 2408f855b..e5ced6588 100644 --- a/lbrynet/lbrynet_daemon/LBRYDaemon.py +++ b/lbrynet/lbrynet_daemon/LBRYDaemon.py @@ -609,12 +609,27 @@ class LBRYDaemon(jsonrpc.JSONRPC): d.addCallback(lambda _: self._get_lbry_file("name", name, return_json=False)) d.addCallback(lambda l: _start_file(l) if l.stopped else "LBRY file was already running") + def _process_lbry_file(name, lbry_file): + ready_to_start = ( + self.pending_claims[name] == lbry_file['txid'] and + not isinstance(lbry_file['metadata'], str) + ) + if ready_to_start: + _start_file(name) + else: + re_add_to_pending_claims(name) + + def re_add_to_pending_claims(name): + self._add_to_pending_claims(name, self.pending_claims.pop(name)), + for name in self.pending_claims: log.info("Checking if new claim for lbry://%s is confirmed" % name) d = self._resolve_name(name, force_refresh=True) d.addCallback(lambda _: self._get_lbry_file_by_uri(name)) - d.addCallbacks(lambda lbry_file: _start_file(name) if self.pending_claims[name] == lbry_file['txid'] and not isinstance(lbry_file['metadata'], str) else self._add_to_pending_claims(name, self.pending_claims.pop(name)), - self._add_to_pending_claims(name, self.pending_claims.pop(name))) + d.addCallbacks( + lambda lbry_file: _process_lbry_file(name, lbry_file), + lambda _: re_add_to_pending_claims(name) + ) def _start_server(self): if self.peer_port is not None: From 0925171e0795421a2d7be997be2844a07ec7d091 Mon Sep 17 00:00:00 2001 From: Job Evers-Meltzer Date: Wed, 27 Jul 2016 13:59:26 -0500 Subject: [PATCH 4/4] bug fix: use txid attribute, not key --- lbrynet/lbrynet_daemon/LBRYDaemon.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lbrynet/lbrynet_daemon/LBRYDaemon.py b/lbrynet/lbrynet_daemon/LBRYDaemon.py index e5ced6588..20f0577f3 100644 --- a/lbrynet/lbrynet_daemon/LBRYDaemon.py +++ b/lbrynet/lbrynet_daemon/LBRYDaemon.py @@ -610,8 +610,10 @@ class LBRYDaemon(jsonrpc.JSONRPC): d.addCallback(lambda l: _start_file(l) if l.stopped else "LBRY file was already running") def _process_lbry_file(name, lbry_file): + # lbry_file is an instance of ManagedLBRYFileDownloader or None ready_to_start = ( - self.pending_claims[name] == lbry_file['txid'] and + lbry_file and + self.pending_claims[name] == lbry_file.txid and not isinstance(lbry_file['metadata'], str) ) if ready_to_start: @@ -620,7 +622,8 @@ class LBRYDaemon(jsonrpc.JSONRPC): re_add_to_pending_claims(name) def re_add_to_pending_claims(name): - self._add_to_pending_claims(name, self.pending_claims.pop(name)), + txid = self.pending_claims.pop(name) + self._add_to_pending_claims(name, txid) for name in self.pending_claims: log.info("Checking if new claim for lbry://%s is confirmed" % name)