upgraded wakatime package to v0.1.3
This commit is contained in:
parent
239c6f56b5
commit
fae7b4a8e4
20 changed files with 195 additions and 46 deletions
35
packages/wakatime/.gitignore
vendored
Normal file
35
packages/wakatime/.gitignore
vendored
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
*.py[cod]
|
||||||
|
|
||||||
|
# C extensions
|
||||||
|
*.so
|
||||||
|
|
||||||
|
# Packages
|
||||||
|
*.egg
|
||||||
|
*.egg-info
|
||||||
|
dist
|
||||||
|
build
|
||||||
|
eggs
|
||||||
|
parts
|
||||||
|
bin
|
||||||
|
var
|
||||||
|
sdist
|
||||||
|
develop-eggs
|
||||||
|
.installed.cfg
|
||||||
|
lib
|
||||||
|
lib64
|
||||||
|
|
||||||
|
# Installer logs
|
||||||
|
pip-log.txt
|
||||||
|
|
||||||
|
# Unit test / coverage reports
|
||||||
|
.coverage
|
||||||
|
.tox
|
||||||
|
nosetests.xml
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
*.mo
|
||||||
|
|
||||||
|
# Mr Developer
|
||||||
|
.mr.developer.cfg
|
||||||
|
.project
|
||||||
|
.pydevproject
|
17
packages/wakatime/HISTORY.rst
Normal file
17
packages/wakatime/HISTORY.rst
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
|
||||||
|
History
|
||||||
|
-------
|
||||||
|
|
||||||
|
|
||||||
|
0.1.1 (2013-07-07)
|
||||||
|
++++++++++++++++++
|
||||||
|
|
||||||
|
- Refactored
|
||||||
|
- Simplified action events schema
|
||||||
|
|
||||||
|
|
||||||
|
0.0.1 (2013-07-05)
|
||||||
|
++++++++++++++++++
|
||||||
|
|
||||||
|
- Birth
|
||||||
|
|
29
packages/wakatime/LICENSE
Normal file
29
packages/wakatime/LICENSE
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
Copyright (c) 2013 Alan Hamlett https://wakati.me
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer
|
||||||
|
in the documentation and/or other materials provided
|
||||||
|
with the distribution.
|
||||||
|
|
||||||
|
* Neither the names of Wakatime or Wakati.Me, nor the names of its
|
||||||
|
contributors may be used to endorse or promote products derived
|
||||||
|
from this software without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE AND DOCUMENTATION IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER
|
||||||
|
OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
2
packages/wakatime/MANIFEST.in
Normal file
2
packages/wakatime/MANIFEST.in
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
include README.rst LICENSE HISTORY.rst
|
||||||
|
recursive-include wakatime *.py
|
12
packages/wakatime/README.rst
Normal file
12
packages/wakatime/README.rst
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
Wakati.Me
|
||||||
|
=========
|
||||||
|
|
||||||
|
Wakati.Me is a time tracking api for text editors. This is the command line
|
||||||
|
action event appender for the Wakati.Me api. You shouldn't need to directly
|
||||||
|
use this outside of a text editor plugin.
|
||||||
|
|
||||||
|
|
||||||
|
Installation
|
||||||
|
------------
|
||||||
|
|
||||||
|
https://www.wakati.me/help/plugins/installing-plugins
|
39
packages/wakatime/setup.py
Normal file
39
packages/wakatime/setup.py
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
from setuptools import setup
|
||||||
|
|
||||||
|
from wakatime.__init__ import __version__ as VERSION
|
||||||
|
|
||||||
|
|
||||||
|
packages = [
|
||||||
|
'wakatime',
|
||||||
|
]
|
||||||
|
|
||||||
|
setup(
|
||||||
|
name='wakatime',
|
||||||
|
version=VERSION,
|
||||||
|
license='BSD 3 Clause',
|
||||||
|
description=' '.join([
|
||||||
|
'Action event appender for Wakati.Me, a time',
|
||||||
|
'tracking api for text editors.',
|
||||||
|
]),
|
||||||
|
long_description=open('README.rst').read(),
|
||||||
|
author='Alan Hamlett',
|
||||||
|
author_email='alan.hamlett@gmail.com',
|
||||||
|
url='https://github.com/wakatime/wakatime',
|
||||||
|
packages=packages,
|
||||||
|
package_dir={'wakatime': 'wakatime'},
|
||||||
|
include_package_data=True,
|
||||||
|
zip_safe=False,
|
||||||
|
platforms='any',
|
||||||
|
entry_points={
|
||||||
|
'console_scripts': ['wakatime = wakatime.__init__:main'],
|
||||||
|
},
|
||||||
|
classifiers=(
|
||||||
|
'Development Status :: 3 - Alpha',
|
||||||
|
'Environment :: Console',
|
||||||
|
'Intended Audience :: Developers',
|
||||||
|
'License :: OSI Approved :: BSD License',
|
||||||
|
'Natural Language :: English',
|
||||||
|
'Programming Language :: Python',
|
||||||
|
'Topic :: Text Editors',
|
||||||
|
),
|
||||||
|
)
|
18
packages/wakatime/wakatime-cli.py
Normal file
18
packages/wakatime/wakatime-cli.py
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
"""
|
||||||
|
wakatime-cli
|
||||||
|
~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Action event appender for Wakati.Me, auto time tracking for text editors.
|
||||||
|
|
||||||
|
:copyright: (c) 2013 Alan Hamlett.
|
||||||
|
:license: BSD, see LICENSE for more details.
|
||||||
|
"""
|
||||||
|
|
||||||
|
from __future__ import print_function
|
||||||
|
|
||||||
|
import sys
|
||||||
|
import wakatime
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
sys.exit(wakatime.main(sys.argv))
|
|
@ -3,7 +3,7 @@
|
||||||
wakatime
|
wakatime
|
||||||
~~~~~~~~
|
~~~~~~~~
|
||||||
|
|
||||||
Action event appender for Wakati.Me, a time tracking api for text editors.
|
Action event appender for Wakati.Me, auto time tracking for text editors.
|
||||||
|
|
||||||
:copyright: (c) 2013 Alan Hamlett.
|
:copyright: (c) 2013 Alan Hamlett.
|
||||||
:license: BSD, see LICENSE for more details.
|
:license: BSD, see LICENSE for more details.
|
||||||
|
@ -12,22 +12,12 @@
|
||||||
from __future__ import print_function
|
from __future__ import print_function
|
||||||
|
|
||||||
__title__ = 'wakatime'
|
__title__ = 'wakatime'
|
||||||
__version__ = '0.1.2'
|
__version__ = '0.1.3'
|
||||||
__author__ = 'Alan Hamlett'
|
__author__ = 'Alan Hamlett'
|
||||||
__license__ = 'BSD'
|
__license__ = 'BSD'
|
||||||
__copyright__ = 'Copyright 2013 Alan Hamlett'
|
__copyright__ = 'Copyright 2013 Alan Hamlett'
|
||||||
|
|
||||||
|
|
||||||
# allow running script directly
|
|
||||||
if __name__ == '__main__' and __package__ is None:
|
|
||||||
import os, sys
|
|
||||||
parent_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
|
||||||
sys.path.insert(0, parent_dir)
|
|
||||||
import wakatime
|
|
||||||
__package__ = 'wakatime'
|
|
||||||
del os, sys
|
|
||||||
|
|
||||||
|
|
||||||
import base64
|
import base64
|
||||||
import json
|
import json
|
||||||
import logging
|
import logging
|
||||||
|
@ -41,11 +31,7 @@ import urllib2
|
||||||
|
|
||||||
from .log import setup_logging
|
from .log import setup_logging
|
||||||
from .project import find_project
|
from .project import find_project
|
||||||
|
from .packages import argparse
|
||||||
try:
|
|
||||||
import argparse
|
|
||||||
except ImportError:
|
|
||||||
from .packages import argparse
|
|
||||||
|
|
||||||
|
|
||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
|
@ -58,7 +44,7 @@ class FileAction(argparse.Action):
|
||||||
setattr(namespace, self.dest, values)
|
setattr(namespace, self.dest, values)
|
||||||
|
|
||||||
|
|
||||||
def parseArguments():
|
def parseArguments(argv):
|
||||||
parser = argparse.ArgumentParser(
|
parser = argparse.ArgumentParser(
|
||||||
description='Wakati.Me event api appender')
|
description='Wakati.Me event api appender')
|
||||||
parser.add_argument('--file', dest='targetFile', metavar='file',
|
parser.add_argument('--file', dest='targetFile', metavar='file',
|
||||||
|
@ -88,7 +74,7 @@ def parseArguments():
|
||||||
parser.add_argument('--verbose', dest='verbose', action='store_true',
|
parser.add_argument('--verbose', dest='verbose', action='store_true',
|
||||||
help='turns on debug messages in log file')
|
help='turns on debug messages in log file')
|
||||||
parser.add_argument('--version', action='version', version=__version__)
|
parser.add_argument('--version', action='version', version=__version__)
|
||||||
args = parser.parse_args()
|
args = parser.parse_args(args=argv[1:])
|
||||||
if not args.timestamp:
|
if not args.timestamp:
|
||||||
args.timestamp = time.time()
|
args.timestamp = time.time()
|
||||||
if not args.key:
|
if not args.key:
|
||||||
|
@ -138,7 +124,7 @@ def send_action(project=None, tags=None, key=None, targetFile=None,
|
||||||
if project:
|
if project:
|
||||||
data['project'] = project
|
data['project'] = project
|
||||||
if tags:
|
if tags:
|
||||||
data['tags'] = tags
|
data['tags'] = list(set(tags))
|
||||||
log.debug(data)
|
log.debug(data)
|
||||||
request = urllib2.Request(url=url, data=json.dumps(data))
|
request = urllib2.Request(url=url, data=json.dumps(data))
|
||||||
user_agent = get_user_agent(plugin)
|
user_agent = get_user_agent(plugin)
|
||||||
|
@ -178,8 +164,10 @@ def send_action(project=None, tags=None, key=None, targetFile=None,
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main(argv=None):
|
||||||
args = parseArguments()
|
if not argv:
|
||||||
|
argv = sys.argv
|
||||||
|
args = parseArguments(argv)
|
||||||
setup_logging(args, __version__)
|
setup_logging(args, __version__)
|
||||||
if os.path.isfile(args.targetFile):
|
if os.path.isfile(args.targetFile):
|
||||||
project = find_project(args.targetFile)
|
project = find_project(args.targetFile)
|
||||||
|
@ -191,6 +179,3 @@ def main():
|
||||||
log.debug('File does not exist; ignoring this action.')
|
log.debug('File does not exist; ignoring this action.')
|
||||||
return 101
|
return 101
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
sys.exit(main())
|
|
|
@ -37,13 +37,14 @@ class Git(BaseProject):
|
||||||
def tags(self):
|
def tags(self):
|
||||||
tags = []
|
tags = []
|
||||||
if self.config:
|
if self.config:
|
||||||
base = self._project_base()
|
proj_name = self.name()
|
||||||
if base:
|
if proj_name:
|
||||||
tags.append(base)
|
tags.append(proj_name)
|
||||||
sections = self._parse_config()
|
sections = self._parse_config()
|
||||||
for section in sections:
|
for section in sections:
|
||||||
if section.split(' ', 1)[0] == 'remote' and 'url' in sections[section]:
|
if section.split(' ', 1)[0] == 'remote' and 'url' in sections[section]:
|
||||||
tags.append(sections[section]['url'])
|
remote = sections[section]['url'].rsplit(':', 1)[1].rsplit('/', 1)[1].split('.git', 1)[0]
|
||||||
|
tags.append(remote)
|
||||||
branch = self._current_branch()
|
branch = self._current_branch()
|
||||||
if branch is not None:
|
if branch is not None:
|
||||||
tags.append(branch)
|
tags.append(branch)
|
|
@ -23,20 +23,23 @@ log = logging.getLogger(__name__)
|
||||||
class Subversion(BaseProject):
|
class Subversion(BaseProject):
|
||||||
|
|
||||||
def process(self):
|
def process(self):
|
||||||
self.info = self._get_info()
|
return self._find_project_base(self.path)
|
||||||
if 'Repository Root' in self.info:
|
|
||||||
return True
|
|
||||||
return False
|
|
||||||
|
|
||||||
def name(self):
|
def name(self):
|
||||||
return self.info['Repository Root'].split('/')[-1]
|
return self.info['Repository Root'].split('/')[-1]
|
||||||
|
|
||||||
def _get_info(self):
|
def tags(self):
|
||||||
|
tags = []
|
||||||
|
if self.base:
|
||||||
|
tags.append(os.path.basename(self.base))
|
||||||
|
return tags
|
||||||
|
|
||||||
|
def _get_info(self, path):
|
||||||
info = OrderedDict()
|
info = OrderedDict()
|
||||||
stdout = None
|
stdout = None
|
||||||
try:
|
try:
|
||||||
stdout, stderr = Popen([
|
stdout, stderr = Popen([
|
||||||
'svn', 'info', os.path.realpath(self.path)
|
'svn', 'info', os.path.realpath(path)
|
||||||
], stdout=PIPE, stderr=PIPE).communicate()
|
], stdout=PIPE, stderr=PIPE).communicate()
|
||||||
except OSError:
|
except OSError:
|
||||||
pass
|
pass
|
||||||
|
@ -53,11 +56,19 @@ class Subversion(BaseProject):
|
||||||
info[line[0]] = line[1]
|
info[line[0]] = line[1]
|
||||||
return info
|
return info
|
||||||
|
|
||||||
def tags(self):
|
def _find_project_base(self, path, found=False):
|
||||||
tags = []
|
path = os.path.realpath(path)
|
||||||
for key in self.info:
|
if os.path.isfile(path):
|
||||||
if key == 'Repository UUID':
|
path = os.path.split(path)[0]
|
||||||
tags.append(self.info[key])
|
info = self._get_info(path)
|
||||||
if key == 'URL':
|
if len(info) > 0:
|
||||||
tags.append(os.path.dirname(self.info[key]))
|
found = True
|
||||||
return tags
|
self.base = path
|
||||||
|
self.info = info
|
||||||
|
elif found:
|
||||||
|
return True
|
||||||
|
split_path = os.path.split(path)
|
||||||
|
if split_path[1] == '':
|
||||||
|
return found
|
||||||
|
return self._find_project_base(split_path[0], found)
|
||||||
|
|
|
@ -20,7 +20,7 @@ import sublime_plugin
|
||||||
AWAY_MINUTES = 10
|
AWAY_MINUTES = 10
|
||||||
ACTION_FREQUENCY = 5
|
ACTION_FREQUENCY = 5
|
||||||
PLUGIN_DIR = dirname(realpath(__file__))
|
PLUGIN_DIR = dirname(realpath(__file__))
|
||||||
API_CLIENT = '%s/packages/wakatime/wakatime.py' % PLUGIN_DIR
|
API_CLIENT = '%s/packages/wakatime/wakatime-cli.py' % PLUGIN_DIR
|
||||||
LAST_ACTION = 0
|
LAST_ACTION = 0
|
||||||
LAST_USAGE = 0
|
LAST_USAGE = 0
|
||||||
LAST_FILE = None
|
LAST_FILE = None
|
||||||
|
@ -51,11 +51,11 @@ def api(targetFile, timestamp, isWrite=False, endtime=0):
|
||||||
if not targetFile:
|
if not targetFile:
|
||||||
targetFile = LAST_FILE
|
targetFile = LAST_FILE
|
||||||
if targetFile:
|
if targetFile:
|
||||||
|
|
||||||
python_cmd = 'python'
|
python_cmd = 'python'
|
||||||
if(platform.system() == 'Windows'):
|
if(platform.system() == 'Windows'):
|
||||||
python_cmd = 'pythonw'
|
python_cmd = 'pythonw'
|
||||||
|
|
||||||
cmd = [python_cmd, API_CLIENT,
|
cmd = [python_cmd, API_CLIENT,
|
||||||
'--file', targetFile,
|
'--file', targetFile,
|
||||||
'--time', str('%f' % timestamp),
|
'--time', str('%f' % timestamp),
|
||||||
|
|
Loading…
Reference in a new issue