1
0
mirror of https://github.com/nvbn/thefuck.git synced 2025-03-14 14:48:49 +00:00

First attempt at adding internationalization to the cat error message detection.

Fix the tests for inside virtualenvs and add warning if localization appears impossible.

Remove the language warnings for en_US locales and make sure they appear for others.
This commit is contained in:
Scott Colby 2018-07-10 12:59:05 -07:00
parent fe0785bc42
commit 23b27c16dc
2 changed files with 62 additions and 15 deletions

View File

@ -1,15 +1,63 @@
import gettext
import os
import warnings
import pytest
from thefuck.rules.cat_dir import match, get_new_command
from thefuck.types import Command
# patch this so the libc locale is available in the testing virtualenv
gettext._default_localedir = '/usr/share/locale'
@pytest.mark.parametrize('command', [
Command('cat foo', 'cat: foo: Is a directory\n'),
Command('cat /foo/bar/', 'cat: /foo/bar/: Is a directory\n'),
Command('cat cat/', 'cat: cat/: Is a directory\n'),
])
def test_match(command):
assert match(command)
lang_vars = ['LANGUAGE', 'LC_ALL', 'LC_MESSAGES', 'LANG']
@pytest.fixture(params=['en_US.UTF-8', 'fr_FR.UTF-8', 'en_US.ISO8859-1', 'fr_FR.ISO8859-1'])
def language(request):
return request.param
@pytest.fixture(params=[''] + lang_vars)
def environment(request, language):
orig_env = os.environ.copy()
# empty the locale environment variables
for lang_var in lang_vars:
os.environ.pop(lang_var, None)
if request.param:
os.environ[request.param] = language
yield
os.environ = orig_env
@pytest.fixture
def eisdir(environment):
eisdir = gettext.translation('libc', fallback=True).gettext('Is a directory')
return eisdir
@pytest.fixture(params=['foo', '/foo/var', 'cat/'])
def cat_command(request, eisdir):
return (
Command('cat %s' % request.param, 'cat: %s: %s\n' % (request.param, eisdir)),
'ls %s' % request.param
)
def test_localization_possible(language):
if not language.startswith('en_US'):
try:
gettext.translation('libc', languages=[language])
except FileNotFoundError as e:
warnings.warn("No '%s' translation file found for language '%s'; the localization tests for `cat_dir` will be ineffective" % (e.filename, language))
def test_match(cat_command):
assert match(cat_command[0])
@pytest.mark.parametrize('command', [
@ -20,10 +68,5 @@ def test_not_match(command):
assert not match(command)
@pytest.mark.parametrize('command, new_command', [
(Command('cat foo', 'cat: foo: Is a directory\n'), 'ls foo'),
(Command('cat /foo/bar/', 'cat: /foo/bar/: Is a directory\n'), 'ls /foo/bar/'),
(Command('cat cat', 'cat: cat: Is a directory\n'), 'ls cat'),
])
def test_get_new_command(command, new_command):
assert get_new_command(command) == new_command
def test_get_new_command(cat_command):
assert get_new_command(cat_command[0]) == cat_command[1]

View File

@ -1,8 +1,12 @@
import gettext
def match(command):
eisdir = gettext.translation('libc', fallback=True).gettext('Is a directory')
return (
command.script.startswith('cat') and
command.output.startswith('cat: ') and
command.output.rstrip().endswith(': Is a directory')
command.output.rstrip().endswith(': %s' % eisdir)
)