From 58069f0a3eed25adf64efe8159b8f889dd17b1a1 Mon Sep 17 00:00:00 2001 From: Pablo Santiago Blum de Aguiar Date: Thu, 23 Apr 2015 23:01:25 -0300 Subject: [PATCH] conf: initialize a settings file if it doesn't exist (fix #111) Signed-off-by: Pablo Santiago Blum de Aguiar --- tests/test_conf.py | 28 ++++++++++++++++++++++++++++ thefuck/conf.py | 22 ++++++++++++++++++++++ thefuck/main.py | 2 +- 3 files changed, 51 insertions(+), 1 deletion(-) diff --git a/tests/test_conf.py b/tests/test_conf.py index b8e6d6c3..32e57b0d 100644 --- a/tests/test_conf.py +++ b/tests/test_conf.py @@ -1,3 +1,4 @@ +import six from mock import patch, Mock from thefuck.types import Rule from thefuck import conf @@ -59,3 +60,30 @@ def test_settings_from_env_with_DEFAULT(): patch('thefuck.conf.os.environ', new_callable=lambda: {'THEFUCK_RULES': 'DEFAULT_RULES:bash:lisp'}): settings = conf.get_settings(Mock()) assert settings.rules == conf.DEFAULT_RULES + ['bash', 'lisp'] + + +def test_initialize_settings_file_ignore_if_exists(): + settings_path_mock = Mock(is_file=Mock(return_value=True), open=Mock()) + user_dir_mock = Mock(joinpath=Mock(return_value=settings_path_mock)) + conf.initialize_settings_file(user_dir_mock) + assert settings_path_mock.is_file.call_count == 1 + assert not settings_path_mock.open.called + + +def test_initialize_settings_file_create_if_exists_not(): + settings_file = six.StringIO() + settings_path_mock = Mock( + is_file=Mock(return_value=False), + open=Mock(return_value=Mock( + __exit__=lambda *args: None, __enter__=lambda *args: settings_file + )), + ) + user_dir_mock = Mock(joinpath=Mock(return_value=settings_path_mock)) + conf.initialize_settings_file(user_dir_mock) + settings_file_contents = settings_file.getvalue() + assert settings_path_mock.is_file.call_count == 1 + assert settings_path_mock.open.call_count == 1 + assert conf.SETTINGS_HEADER in settings_file_contents + for setting in conf.DEFAULT_SETTINGS.items(): + assert '# {} = {}\n'.format(*setting) in settings_file_contents + settings_file.close() diff --git a/thefuck/conf.py b/thefuck/conf.py index 0c6f29a7..d33b1e34 100644 --- a/thefuck/conf.py +++ b/thefuck/conf.py @@ -35,6 +35,19 @@ ENV_TO_ATTR = {'THEFUCK_RULES': 'rules', 'THEFUCK_NO_COLORS': 'no_colors'} +SETTINGS_HEADER = u"""# ~/.thefuck/settings.py: The Fuck settings file +# +# The rules are defined as in the example bellow: +# +# rules = ['cd_parent', 'git_push', 'python_command', 'sudo'] +# +# The default values are as follows. Uncomment and change to fit your needs. +# See https://github.com/nvbn/thefuck#settings for more information. +# + +""" + + def _settings_from_file(user_dir): """Loads settings from file.""" settings = load_source('settings', @@ -92,3 +105,12 @@ def get_settings(user_dir): conf['rules'] = types.RulesNamesList(conf['rules']) return types.Settings(conf) + + +def initialize_settings_file(user_dir): + settings_path = user_dir.joinpath('settings.py') + if not settings_path.is_file(): + with settings_path.open(mode='w') as settings_file: + settings_file.write(SETTINGS_HEADER) + for setting in DEFAULT_SETTINGS.items(): + settings_file.write(u'# {} = {}\n'.format(*setting)) diff --git a/thefuck/main.py b/thefuck/main.py index ea286eb0..2ce1dd33 100644 --- a/thefuck/main.py +++ b/thefuck/main.py @@ -15,7 +15,7 @@ def setup_user_dir(): rules_dir = user_dir.joinpath('rules') if not rules_dir.is_dir(): rules_dir.mkdir(parents=True) - user_dir.joinpath('settings.py').touch() + conf.initialize_settings_file(user_dir) return user_dir