From f6d85e021f31753d9f47f09699fb0fe60083c13a Mon Sep 17 00:00:00 2001 From: gcarq Date: Sat, 16 Dec 2017 03:28:29 +0100 Subject: [PATCH 1/4] add setup.cfg to configure flake8 --- setup.cfg | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 setup.cfg diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 000000000..781c19a39 --- /dev/null +++ b/setup.cfg @@ -0,0 +1,4 @@ +[flake8] +#ignore = E226,E302,E41 +max-line-length = 100 +max-complexity = 12 From 95fe0f4decbde0386968ca4d21eb9e14c68c74b8 Mon Sep 17 00:00:00 2001 From: gcarq Date: Sat, 16 Dec 2017 03:39:47 +0100 Subject: [PATCH 2/4] fix pep8 warnings --- freqtrade/main.py | 9 +++++++-- freqtrade/misc.py | 4 ++-- freqtrade/optimize/backtesting.py | 3 ++- freqtrade/optimize/hyperopt.py | 6 ++++-- freqtrade/rpc/telegram.py | 12 +++++++++--- freqtrade/tests/test_main.py | 4 +++- freqtrade/tests/test_misc.py | 2 ++ freqtrade/tests/test_optimize_backtesting.py | 1 + freqtrade/tests/test_rpc_telegram.py | 15 ++++++++------- setup.cfg | 2 +- 10 files changed, 39 insertions(+), 19 deletions(-) diff --git a/freqtrade/main.py b/freqtrade/main.py index 9b9e1736a..941d6870a 100755 --- a/freqtrade/main.py +++ b/freqtrade/main.py @@ -60,7 +60,10 @@ def _process(dynamic_whitelist: Optional[int] = 0) -> bool: try: # Refresh whitelist based on wallet maintenance refresh_whitelist( - gen_pair_whitelist(_CONF['stake_currency'], topn = dynamic_whitelist) if dynamic_whitelist else None + gen_pair_whitelist( + _CONF['stake_currency'], + topn=dynamic_whitelist + ) if dynamic_whitelist else None ) # Query trades from persistence layer trades = Trade.query.filter(Trade.is_open.is_(True)).all() @@ -329,7 +332,9 @@ def main() -> None: if args.dry_run_db: if _CONF.get('dry_run', False): _CONF.update({'dry_run_db': True}) - logger.info('Dry_run will use the DB file: "tradesv3.dry_run.sqlite". (--dry_run_db detected)') + logger.info( + 'Dry_run will use the DB file: "tradesv3.dry_run.sqlite". (--dry_run_db detected)' + ) else: logger.info('Dry run is disabled. (--dry_run_db ignored)') diff --git a/freqtrade/misc.py b/freqtrade/misc.py index eff0c2228..d46fa5d9f 100644 --- a/freqtrade/misc.py +++ b/freqtrade/misc.py @@ -112,7 +112,7 @@ def parse_args(args: List[str]): ) parser.add_argument( '--dynamic-whitelist', - help='dynamically generate and update whitelist based on 24h BaseVolume (Default 20 currencies)', + help='dynamically generate and update whitelist based on 24h BaseVolume (Default 20 currencies)', # noqa dest='dynamic_whitelist', const=20, type=int, @@ -122,7 +122,7 @@ def parse_args(args: List[str]): parser.add_argument( '--dry-run-db', help='Force dry run to use a local DB "tradesv3.dry_run.sqlite" instead of memory DB. Work only if dry_run is \ - enabled.', + enabled.', # noqa action='store_true', dest='dry_run_db', ) diff --git a/freqtrade/optimize/backtesting.py b/freqtrade/optimize/backtesting.py index 5b34afd25..13d3216ed 100644 --- a/freqtrade/optimize/backtesting.py +++ b/freqtrade/optimize/backtesting.py @@ -35,7 +35,8 @@ def get_timeframe(data: Dict[str, Dict]) -> Tuple[arrow.Arrow, arrow.Arrow]: return arrow.get(min_date), arrow.get(max_date) -def generate_text_table(data: Dict[str, Dict], results: DataFrame, stake_currency, ticker_interval) -> str: +def generate_text_table( + data: Dict[str, Dict], results: DataFrame, stake_currency, ticker_interval) -> str: """ Generates and returns a text table for the given backtest data and the results dataframe :return: pretty printed table with tabulate as str diff --git a/freqtrade/optimize/hyperopt.py b/freqtrade/optimize/hyperopt.py index 78e5a3fb1..4ed0369c7 100644 --- a/freqtrade/optimize/hyperopt.py +++ b/freqtrade/optimize/hyperopt.py @@ -49,7 +49,7 @@ OPTIMIZE_CONFIG = { } # Monkey patch config -from freqtrade import main +from freqtrade import main # noqa main._CONF = OPTIMIZE_CONFIG @@ -102,6 +102,7 @@ SPACE = { ]), } + def log_results(results): "if results is better than _TO_BEAT show it" @@ -118,6 +119,7 @@ def log_results(results): print('.', end='') sys.stdout.flush() + def optimizer(params): global _CURRENT_TRIES @@ -148,7 +150,7 @@ def optimizer(params): 'result': result, 'results': results } - + # logger.info('{:5d}/{}: {}'.format(_CURRENT_TRIES, TOTAL_TRIES, result)) log_results(result_data) diff --git a/freqtrade/rpc/telegram.py b/freqtrade/rpc/telegram.py index dc5dbf734..a097e45f4 100644 --- a/freqtrade/rpc/telegram.py +++ b/freqtrade/rpc/telegram.py @@ -93,7 +93,7 @@ def authorized_only(command_handler: Callable[[Bot, Update], None]) -> Callable[ :return: decorated function """ def wrapper(*args, **kwargs): - bot, update = kwargs.get('bot') or args[0], kwargs.get('update') or args[1] + update = kwargs.get('update') or args[1] # Reject unauthorized messages chat_id = int(_CONF['telegram']['chat_id']) @@ -551,7 +551,10 @@ def send_msg(msg: str, bot: Bot = None, parse_mode: ParseMode = ParseMode.MARKDO try: try: - bot.send_message(_CONF['telegram']['chat_id'], msg, parse_mode=parse_mode, reply_markup=reply_markup) + bot.send_message( + _CONF['telegram']['chat_id'], msg, + parse_mode=parse_mode, reply_markup=reply_markup + ) except NetworkError as network_err: # Sometimes the telegram server resets the current connection, # if this is the case we send the message again. @@ -559,6 +562,9 @@ def send_msg(msg: str, bot: Bot = None, parse_mode: ParseMode = ParseMode.MARKDO 'Got Telegram NetworkError: %s! Trying one more time.', network_err.message ) - bot.send_message(_CONF['telegram']['chat_id'], msg, parse_mode=parse_mode, reply_markup=reply_markup) + bot.send_message( + _CONF['telegram']['chat_id'], msg, + parse_mode=parse_mode, reply_markup=reply_markup + ) except TelegramError as telegram_err: logger.warning('Got TelegramError: %s! Giving up on that message.', telegram_err.message) diff --git a/freqtrade/tests/test_main.py b/freqtrade/tests/test_main.py index 702a5d16c..aeea5a1a1 100644 --- a/freqtrade/tests/test_main.py +++ b/freqtrade/tests/test_main.py @@ -137,7 +137,9 @@ def test_create_trade_minimal_amount(default_conf, ticker, mocker): mocker.patch.dict('freqtrade.main._CONF', default_conf) mocker.patch.multiple('freqtrade.rpc', init=MagicMock(), send_msg=MagicMock()) mocker.patch('freqtrade.main.get_signal', side_effect=lambda s, t: True) - buy_mock = mocker.patch('freqtrade.main.exchange.buy', MagicMock(return_value='mocked_limit_buy')) + buy_mock = mocker.patch( + 'freqtrade.main.exchange.buy', MagicMock(return_value='mocked_limit_buy') + ) mocker.patch.multiple('freqtrade.main.exchange', validate_pairs=MagicMock(), get_ticker=ticker) diff --git a/freqtrade/tests/test_misc.py b/freqtrade/tests/test_misc.py index ca3e69264..e19b18b57 100644 --- a/freqtrade/tests/test_misc.py +++ b/freqtrade/tests/test_misc.py @@ -60,11 +60,13 @@ def test_parse_args_dynamic_whitelist(): assert args is not None assert args.dynamic_whitelist is 20 + def test_parse_args_dynamic_whitelist_10(): args = parse_args(['--dynamic-whitelist', '10']) assert args is not None assert args.dynamic_whitelist is 10 + def test_parse_args_dynamic_whitelist_invalid_values(): with pytest.raises(SystemExit, match=r'2'): parse_args(['--dynamic-whitelist', 'abc']) diff --git a/freqtrade/tests/test_optimize_backtesting.py b/freqtrade/tests/test_optimize_backtesting.py index d314214c3..755016156 100644 --- a/freqtrade/tests/test_optimize_backtesting.py +++ b/freqtrade/tests/test_optimize_backtesting.py @@ -7,6 +7,7 @@ from freqtrade.optimize.backtesting import backtest import pytest + def test_backtest(default_conf, mocker): mocker.patch.dict('freqtrade.main._CONF', default_conf) exchange._API = Bittrex({'key': '', 'secret': ''}) diff --git a/freqtrade/tests/test_rpc_telegram.py b/freqtrade/tests/test_rpc_telegram.py index 901450f14..afdef2692 100644 --- a/freqtrade/tests/test_rpc_telegram.py +++ b/freqtrade/tests/test_rpc_telegram.py @@ -341,6 +341,7 @@ def test_performance_handle( assert 'Performance' in msg_mock.call_args_list[0][0][0] assert 'BTC_ETH\t10.05%' in msg_mock.call_args_list[0][0][0] + def test_daily_handle( default_conf, update, ticker, limit_buy_order, limit_sell_order, mocker): mocker.patch.dict('freqtrade.main._CONF', default_conf) @@ -355,7 +356,7 @@ def test_daily_handle( validate_pairs=MagicMock(), get_ticker=ticker) init(default_conf, create_engine('sqlite://')) - + # Create some test data create_trade(15.0) trade = Trade.query.first() @@ -370,22 +371,22 @@ def test_daily_handle( trade.close_date = datetime.utcnow() trade.is_open = False - #try valid data + # try valid data update.message.text = '/daily 7' _daily(bot=MagicMock(), update=update) assert msg_mock.call_count == 1 assert 'Daily' in msg_mock.call_args_list[0][0][0] assert str(date.today()) + ' 1.50701325 BTC' in msg_mock.call_args_list[0][0][0] - - #try invalid data + + # try invalid data msg_mock.reset_mock() update_state(State.RUNNING) update.message.text = '/daily -2' _daily(bot=MagicMock(), update=update) assert msg_mock.call_count == 1 - assert 'must be an integer greater than 0' in msg_mock.call_args_list[0][0][0] - - + assert 'must be an integer greater than 0' in msg_mock.call_args_list[0][0][0] + + def test_count_handle(default_conf, update, ticker, mocker): mocker.patch.dict('freqtrade.main._CONF', default_conf) mocker.patch('freqtrade.main.get_signal', side_effect=lambda s, t: True) diff --git a/setup.cfg b/setup.cfg index 781c19a39..ba065a7c2 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,4 +1,4 @@ [flake8] -#ignore = E226,E302,E41 +#ignore = max-line-length = 100 max-complexity = 12 From a395a14eeb740151edb48251befa307bed3fb837 Mon Sep 17 00:00:00 2001 From: gcarq Date: Sat, 16 Dec 2017 03:40:06 +0100 Subject: [PATCH 3/4] adapt README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index fa80c9e26..d2c016690 100644 --- a/README.md +++ b/README.md @@ -231,5 +231,5 @@ $ pytest freqtrade Feel like our bot is missing a feature? We welcome your pull requests! Few pointers for contributions: - Create your PR against the `develop` branch, not `master`. -- New features need to contain unit tests. +- New features need to contain unit tests and must be PEP8 conform (`max-line-length = 100`). - If you are unsure, discuss the feature on [slack](https://join.slack.com/t/highfrequencybot/shared_invite/enQtMjQ5NTM0OTYzMzY3LWMxYzE3M2MxNDdjMGM3ZTYwNzFjMGIwZGRjNTc3ZGU3MGE3NzdmZGMwNmU3NDM5ZTNmM2Y3NjRiNzk4NmM4OGE) or in a [issue](https://github.com/gcarq/freqtrade/issues) before a PR. From 6f2caf9698366c3b272d97e2409ca488ab99f741 Mon Sep 17 00:00:00 2001 From: gcarq Date: Sat, 16 Dec 2017 03:44:49 +0100 Subject: [PATCH 4/4] invoke flake8 after success --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 461324f45..37bd480a0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -15,12 +15,12 @@ install: - tar zxvf ta-lib-0.4.0-src.tar.gz - cd ta-lib && ./configure && sudo make && sudo make install && cd .. - export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH -- pip install coveralls +- pip install flake8 coveralls - pip install -r requirements.txt script: - pytest --cov=freqtrade --cov-config=.coveragerc freqtrade/tests/ after_success: -- coveralls +- flake8 freqtrade && coveralls notifications: slack: secure: bKLXmOrx8e2aPZl7W8DA5BdPAXWGpI5UzST33oc1G/thegXcDVmHBTJrBs4sZak6bgAclQQrdZIsRd2eFYzHLalJEaw6pk7hoAw8SvLnZO0ZurWboz7qg2+aZZXfK4eKl/VUe4sM9M4e/qxjkK+yWG7Marg69c4v1ypF7ezUi1fPYILYw8u0paaiX0N5UX8XNlXy+PBlga2MxDjUY70MuajSZhPsY2pDUvYnMY1D/7XN3cFW0g+3O8zXjF0IF4q1Z/1ASQe+eYjKwPQacE+O8KDD+ZJYoTOFBAPllrtpO1jnOPFjNGf3JIbVMZw4bFjIL0mSQaiSUaUErbU3sFZ5Or79rF93XZ81V7uEZ55vD8KMfR2CB1cQJcZcj0v50BxLo0InkFqa0Y8Nra3sbpV4fV5Oe8pDmomPJrNFJnX6ULQhQ1gTCe0M5beKgVms5SITEpt4/Y0CmLUr6iHDT0CUiyMIRWAXdIgbGh1jfaWOMksybeRevlgDsIsNBjXmYI1Sw2ZZR2Eo2u4R6zyfyjOMLwYJ3vgq9IrACv2w5nmf0+oguMWHf6iWi2hiOqhlAN1W74+3HsYQcqnuM3LGOmuCnPprV1oGBqkPXjIFGpy21gNx4vHfO1noLUyJnMnlu2L7SSuN1CdLsnjJ1hVjpJjPfqB4nn8g12x87TqM1bOm+3Q=