diff --git a/tests/test_utils.py b/tests/test_utils.py new file mode 100644 index 0000000..53de9d6 --- /dev/null +++ b/tests/test_utils.py @@ -0,0 +1,38 @@ +# -*- coding: utf-8 -*- + + +from wakatime.utils import format_file_path + +import os +from .utils import TestCase, mock + + +class UtilsTestCase(TestCase): + + def test_format_file_path_forces_forward_slashes(self): + path = 'some\\path////to\\\\\\a\\file.txt' + expected = os.path.realpath('some/path/to/a/file.txt') + result = format_file_path(path) + self.assertEquals(expected, result) + + def test_format_file_path_uppercase_windows_drive(self): + path = 'c:\\some\\path////to\\\\\\a\\file.txt' + expected = 'C:/some/path/to/a/file.txt' + + with mock.patch('os.path.realpath') as mock_realpath: + mock_realpath.return_value = path + with mock.patch('os.path.abspath') as mock_abspath: + mock_abspath.return_value = path + + result = format_file_path(path) + self.assertEquals(expected, result) + + def test_format_file_path_handles_exceptions(self): + path = 'c:\\some\\path////to\\\\\\a\\file.txt' + expected = path + + with mock.patch('os.path.abspath') as mock_abspath: + mock_abspath.side_effect = Exception('foobar') + + result = format_file_path(path) + self.assertEquals(expected, result) diff --git a/wakatime/utils.py b/wakatime/utils.py index d7a3bc6..9e04ecf 100644 --- a/wakatime/utils.py +++ b/wakatime/utils.py @@ -24,6 +24,10 @@ from .compat import u log = logging.getLogger('WakaTime') +BACKSLASH_REPLACE_PATTERN = re.compile(r'[\\/]+') +WINDOWS_DRIVE_PATTERN = re.compile(r'^[a-z]:/') + + def should_exclude(entity, include, exclude): if entity is not None and entity.strip() != '': for pattern in include: @@ -74,8 +78,10 @@ def format_file_path(filepath): try: filepath = os.path.realpath(os.path.abspath(filepath)) - filepath = re.sub(r'[/\\]', os.path.sep, filepath) - except: # pragma: nocover + filepath = re.sub(BACKSLASH_REPLACE_PATTERN, '/', filepath) + if WINDOWS_DRIVE_PATTERN.match(filepath): + filepath = filepath.capitalize() + except: pass return filepath