This commit is contained in:
Alan Hamlett 2014-07-25 02:45:35 -07:00
parent 25a20e0c0d
commit f2a92b80fb
14 changed files with 110 additions and 31 deletions

View file

@ -3,6 +3,20 @@ History
------- -------
2.0.4 (2014-07-25)
++++++++++++++++++
- upgrade external wakatime package to v2.0.5
- use unique logger namespace to prevent collisions in shared plugin environments
- option in .wakatime.cfg to obfuscate file names
2.0.3 (2014-06-09)
++++++++++++++++++
- upgrade external wakatime package to v2.0.2
2.0.2 (2014-05-26) 2.0.2 (2014-05-26)
++++++++++++++++++ ++++++++++++++++++

View file

@ -3,6 +3,31 @@ History
------- -------
2.0.5 (2014-07-25)
++++++++++++++++++
- option in .wakatime.cfg to obfuscate file names
2.0.4 (2014-07-25)
++++++++++++++++++
- use unique logger namespace to prevent collisions in shared plugin environments
2.0.3 (2014-06-18)
++++++++++++++++++
- use project from command line arg when no revision control project is found
2.0.2 (2014-06-09)
++++++++++++++++++
- include python3.2 compatible versions of simplejson, pytz, and tzlocal
- disable offline logging when Python was not compiled with sqlite3 module
2.0.1 (2014-05-26) 2.0.1 (2014-05-26)
++++++++++++++++++ ++++++++++++++++++

View file

@ -13,7 +13,7 @@
from __future__ import print_function from __future__ import print_function
__title__ = 'wakatime' __title__ = 'wakatime'
__version__ = '2.0.2' __version__ = '2.0.5'
__author__ = 'Alan Hamlett' __author__ = 'Alan Hamlett'
__license__ = 'BSD' __license__ = 'BSD'
__copyright__ = 'Copyright 2014 Alan Hamlett' __copyright__ = 'Copyright 2014 Alan Hamlett'
@ -52,7 +52,12 @@ except:
from .packages import tzlocal3 from .packages import tzlocal3
log = logging.getLogger(__name__) log = logging.getLogger('WakaTime')
try:
unicode
except NameError:
unicode = str
class FileAction(argparse.Action): class FileAction(argparse.Action):
@ -161,6 +166,9 @@ def parseArguments(argv):
parser.add_argument('--disableoffline', dest='offline', parser.add_argument('--disableoffline', dest='offline',
action='store_false', action='store_false',
help='disables offline time logging instead of queuing logged time') help='disables offline time logging instead of queuing logged time')
parser.add_argument('--hidefilenames', dest='hidefilenames',
action='store_true',
help='obfuscate file names; will not send file names to api')
parser.add_argument('--ignore', dest='ignore', action='append', parser.add_argument('--ignore', dest='ignore', action='append',
help='filename patterns to ignore; POSIX regex syntax; can be used more than once') help='filename patterns to ignore; POSIX regex syntax; can be used more than once')
parser.add_argument('--logfile', dest='logfile', parser.add_argument('--logfile', dest='logfile',
@ -203,6 +211,8 @@ def parseArguments(argv):
pass pass
if args.offline and configs.has_option('settings', 'offline'): if args.offline and configs.has_option('settings', 'offline'):
args.offline = configs.getboolean('settings', 'offline') args.offline = configs.getboolean('settings', 'offline')
if not args.hidefilenames and configs.has_option('settings', 'hidefilenames'):
args.hidefilenames = configs.getboolean('settings', 'hidefilenames')
if not args.verbose and configs.has_option('settings', 'verbose'): if not args.verbose and configs.has_option('settings', 'verbose'):
args.verbose = configs.getboolean('settings', 'verbose') args.verbose = configs.getboolean('settings', 'verbose')
if not args.verbose and configs.has_option('settings', 'debug'): if not args.verbose and configs.has_option('settings', 'debug'):
@ -221,7 +231,10 @@ def should_ignore(fileName, patterns):
if compiled.search(fileName): if compiled.search(fileName):
return pattern return pattern
except re.error as ex: except re.error as ex:
log.warning('Regex error (%s) for ignore pattern: %s' % (str(ex), pattern)) log.warning(unicode('Regex error ({msg}) for ignore pattern: {pattern}').format(
msg=str(ex),
pattern=pattern,
))
except TypeError: except TypeError:
pass pass
return False return False
@ -230,21 +243,34 @@ def should_ignore(fileName, patterns):
def get_user_agent(plugin): def get_user_agent(plugin):
ver = sys.version_info ver = sys.version_info
python_version = '%d.%d.%d.%s.%d' % (ver[0], ver[1], ver[2], ver[3], ver[4]) python_version = '%d.%d.%d.%s.%d' % (ver[0], ver[1], ver[2], ver[3], ver[4])
user_agent = 'wakatime/%s (%s) Python%s' % (__version__, user_agent = unicode('wakatime/{ver} ({platform}) Python{py_ver}').format(
platform.platform(), python_version) ver=__version__,
platform=platform.platform(),
py_ver=python_version,
)
if plugin: if plugin:
user_agent = user_agent+' '+plugin user_agent = unicode('{user_agent} {plugin}').format(
user_agent=user_agent,
plugin=plugin,
)
return user_agent return user_agent
def send_action(project=None, branch=None, stats=None, key=None, targetFile=None, def send_action(project=None, branch=None, stats=None, key=None, targetFile=None,
timestamp=None, isWrite=None, plugin=None, offline=None, **kwargs): timestamp=None, isWrite=None, plugin=None, offline=None,
hidefilenames=None, **kwargs):
url = 'https://wakatime.com/api/v1/actions' url = 'https://wakatime.com/api/v1/actions'
log.debug('Sending action to api at %s' % url) log.debug('Sending heartbeat to api at %s' % url)
data = { data = {
'time': timestamp, 'time': timestamp,
'file': targetFile, 'file': targetFile,
} }
if hidefilenames and targetFile is not None:
data['file'] = data['file'].rsplit('/', 1)[-1].rsplit('\\', 1)[-1]
if len(data['file'].strip('.').split('.', 1)) > 1:
data['file'] = unicode('HIDDEN.{ext}').format(ext=data['file'].strip('.').rsplit('.', 1)[-1])
else:
data['file'] = unicode('HIDDEN')
if stats.get('lines'): if stats.get('lines'):
data['lines'] = stats['lines'] data['lines'] = stats['lines']
if stats.get('language'): if stats.get('language'):
@ -258,16 +284,16 @@ def send_action(project=None, branch=None, stats=None, key=None, targetFile=None
log.debug(data) log.debug(data)
# setup api request # setup api request
request = Request(url=url, data=str.encode(json.dumps(data))) request = Request(url=url, data=json.dumps(data))
request.add_header('User-Agent', get_user_agent(plugin)) request.add_header('User-Agent', get_user_agent(plugin))
request.add_header('Content-Type', 'application/json') request.add_header('Content-Type', 'application/json')
auth = 'Basic %s' % bytes.decode(base64.b64encode(str.encode(key))) auth = unicode('Basic {key}').format(key=bytes.decode(base64.b64encode(str.encode(key))))
request.add_header('Authorization', auth) request.add_header('Authorization', auth)
# add Olson timezone to request # add Olson timezone to request
tz = tzlocal.get_localzone() tz = tzlocal.get_localzone()
if tz: if tz:
request.add_header('TimeZone', str(tz.zone)) request.add_header('TimeZone', unicode(tz.zone))
# log time to api # log time to api
response = None response = None
@ -276,7 +302,7 @@ def send_action(project=None, branch=None, stats=None, key=None, targetFile=None
except HTTPError as exc: except HTTPError as exc:
exception_data = { exception_data = {
'response_code': exc.getcode(), 'response_code': exc.getcode(),
sys.exc_info()[0].__name__: str(sys.exc_info()[1]), sys.exc_info()[0].__name__: unicode(sys.exc_info()[1]),
} }
if log.isEnabledFor(logging.DEBUG): if log.isEnabledFor(logging.DEBUG):
exception_data['traceback'] = traceback.format_exc() exception_data['traceback'] = traceback.format_exc()
@ -289,7 +315,7 @@ def send_action(project=None, branch=None, stats=None, key=None, targetFile=None
log.error(exception_data) log.error(exception_data)
except: except:
exception_data = { exception_data = {
sys.exc_info()[0].__name__: str(sys.exc_info()[1]), sys.exc_info()[0].__name__: unicode(sys.exc_info()[1]),
} }
if log.isEnabledFor(logging.DEBUG): if log.isEnabledFor(logging.DEBUG):
exception_data['traceback'] = traceback.format_exc() exception_data['traceback'] = traceback.format_exc()
@ -339,7 +365,9 @@ def main(argv=None):
ignore = should_ignore(args.targetFile, args.ignore) ignore = should_ignore(args.targetFile, args.ignore)
if ignore is not False: if ignore is not False:
log.debug('File ignored because matches pattern: %s' % ignore) log.debug(unicode('File ignored because matches pattern: {pattern}').format(
pattern=ignore,
))
return 0 return 0
if os.path.isfile(args.targetFile): if os.path.isfile(args.targetFile):
@ -348,10 +376,10 @@ def main(argv=None):
project = find_project(args.targetFile, configs=configs) project = find_project(args.targetFile, configs=configs)
branch = None branch = None
project_name = None project_name = args.project_name
if project: if project:
branch = project.branch() branch = project.branch()
project_name = args.project_name or project.name() project_name = project.name()
if send_action( if send_action(
project=project_name, project=project_name,
@ -364,9 +392,16 @@ def main(argv=None):
action = queue.pop() action = queue.pop()
if action is None: if action is None:
break break
if not send_action(project=action['project'], targetFile=action['file'], timestamp=action['time'], sent = send_action(project=action['project'],
branch=action['branch'], stats={'language': action['language'], 'lines': action['lines']}, targetFile=action['file'],
key=args.key, isWrite=action['is_write'], plugin=action['plugin'], offline=args.offline): timestamp=action['time'],
branch=action['branch'],
stats={'language': action['language'], 'lines': action['lines']},
key=args.key, isWrite=action['is_write'],
plugin=action['plugin'],
offline=args.offline,
hidefilenames=args.hidefilenames)
if not sent:
break break
return 0 # success return 0 # success

View file

@ -73,7 +73,7 @@ def set_log_level(logger, args):
def setup_logging(args, version): def setup_logging(args, version):
logger = logging.getLogger() logger = logging.getLogger('WakaTime')
set_log_level(logger, args) set_log_level(logger, args)
if len(logger.handlers) > 0: if len(logger.handlers) > 0:
formatter = JsonFormatter(datefmt='%Y/%m/%d %H:%M:%S %z') formatter = JsonFormatter(datefmt='%Y/%m/%d %H:%M:%S %z')

View file

@ -19,7 +19,7 @@ from .projects.subversion import Subversion
from .projects.wakatime import WakaTime from .projects.wakatime import WakaTime
log = logging.getLogger(__name__) log = logging.getLogger('WakaTime')
# List of plugin classes to find a project for the current file path. # List of plugin classes to find a project for the current file path.

View file

@ -13,7 +13,7 @@ import logging
import os import os
log = logging.getLogger(__name__) log = logging.getLogger('WakaTime')
class BaseProject(object): class BaseProject(object):

View file

@ -15,7 +15,7 @@ import os
from .base import BaseProject from .base import BaseProject
log = logging.getLogger(__name__) log = logging.getLogger('WakaTime')
# str is unicode in Python3 # str is unicode in Python3

View file

@ -15,7 +15,7 @@ import os
from .base import BaseProject from .base import BaseProject
log = logging.getLogger(__name__) log = logging.getLogger('WakaTime')
# str is unicode in Python3 # str is unicode in Python3

View file

@ -26,7 +26,7 @@ import os
from .base import BaseProject from .base import BaseProject
log = logging.getLogger(__name__) log = logging.getLogger('WakaTime')
# str is unicode in Python3 # str is unicode in Python3

View file

@ -21,7 +21,7 @@ except ImportError:
from ..packages.ordereddict import OrderedDict from ..packages.ordereddict import OrderedDict
log = logging.getLogger(__name__) log = logging.getLogger('WakaTime')
# str is unicode in Python3 # str is unicode in Python3

View file

@ -17,7 +17,7 @@ import os
from .base import BaseProject from .base import BaseProject
log = logging.getLogger(__name__) log = logging.getLogger('WakaTime')
# str is unicode in Python3 # str is unicode in Python3

View file

@ -22,7 +22,7 @@ except ImportError:
HAS_SQL = False HAS_SQL = False
log = logging.getLogger(__name__) log = logging.getLogger('WakaTime')
class Queue(object): class Queue(object):

View file

@ -20,7 +20,12 @@ else:
from pygments.lexers import guess_lexer_for_filename from pygments.lexers import guess_lexer_for_filename
log = logging.getLogger(__name__) log = logging.getLogger('WakaTime')
try:
unicode
except NameError:
unicode = str
# force file name extensions to be recognized as a certain language # force file name extensions to be recognized as a certain language
@ -54,7 +59,7 @@ def guess_language(file_name):
except: except:
pass pass
if lexer: if lexer:
return translate_language(str(lexer.name)) return translate_language(unicode(lexer.name))
else: else:
return None return None

View file

@ -6,7 +6,7 @@
" Website: https://wakatime.com/ " Website: https://wakatime.com/
" ============================================================================ " ============================================================================
let s:VERSION = '2.0.3' let s:VERSION = '2.0.4'
" Init {{{ " Init {{{