# -*- coding: utf-8 -*- """ wakatime.utils ~~~~~~~~~~~~~~ Utility functions. :copyright: (c) 2016 Alan Hamlett. :license: BSD, see LICENSE for more details. """ import platform import logging import os import re import socket import sys from .__about__ import __version__ from .compat import u log = logging.getLogger('WakaTime') BACKSLASH_REPLACE_PATTERN = re.compile(r'[\\/]+') WINDOWS_DRIVE_PATTERN = re.compile(r'^[a-z]:/') WINDOWS_NETWORK_MOUNT_PATTERN = re.compile(r'^\\{2}[a-z]+', re.IGNORECASE) def should_exclude(entity, include, exclude): if entity is not None and entity.strip() != '': for pattern in include: try: compiled = re.compile(pattern, re.IGNORECASE) if compiled.search(entity): return False except re.error as ex: log.warning(u('Regex error ({msg}) for include pattern: {pattern}').format( msg=u(ex), pattern=u(pattern), )) for pattern in exclude: try: compiled = re.compile(pattern, re.IGNORECASE) if compiled.search(entity): return pattern except re.error as ex: log.warning(u('Regex error ({msg}) for exclude pattern: {pattern}').format( msg=u(ex), pattern=u(pattern), )) return False def get_user_agent(plugin=None): ver = sys.version_info python_version = '%d.%d.%d.%s.%d' % (ver[0], ver[1], ver[2], ver[3], ver[4]) user_agent = u('wakatime/{ver} ({platform}) Python{py_ver}').format( ver=u(__version__), platform=u(platform.platform()), py_ver=python_version, ) if plugin: user_agent = u('{user_agent} {plugin}').format( user_agent=user_agent, plugin=u(plugin), ) else: user_agent = u('{user_agent} Unknown/0').format( user_agent=user_agent, ) return user_agent def format_file_path(filepath): """Formats a path as absolute and with the correct platform separator.""" try: is_windows_network_mount = WINDOWS_NETWORK_MOUNT_PATTERN.match(filepath) filepath = os.path.realpath(os.path.abspath(filepath)) filepath = re.sub(BACKSLASH_REPLACE_PATTERN, '/', filepath) is_windows_drive = WINDOWS_DRIVE_PATTERN.match(filepath) if is_windows_drive: filepath = filepath.capitalize() if is_windows_network_mount: # Add back a / to the front, since the previous modifications # will have replaced any double slashes with single filepath = '/' + filepath except: pass return filepath def get_hostname(args): return args.hostname or socket.gethostname() def find_project_file(path): path = os.path.realpath(path) if os.path.isfile(path): path = os.path.split(path)[0] if os.path.isfile(os.path.join(path, '.wakatime-project')): return os.path.join(path, '.wakatime-project') split_path = os.path.split(path) if split_path[1] == '': return None return find_project_file(split_path[0])