From: Rob Golding Date: Mon, 13 May 2019 14:38:37 +0000 (+0100) Subject: Merge pull request #63 from robgolding/custom-task-command-location X-Git-Url: https://git.madduck.net/etc/taskwarrior.git/commitdiff_plain/8280d247346b96cc0ca0686a42fcc6574f76b8a3?hp=0ad882377639865283021041f19add5aeb10126a Merge pull request #63 from robgolding/custom-task-command-location Add support for custom `task` location or command --- diff --git a/.travis.yml b/.travis.yml index b3f0af7..cfa6d5f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -24,8 +24,8 @@ install: - sudo apt-get update -qq - sudo apt-get install -qq build-essential cmake uuid-dev g++-4.8 - sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 50 - - git clone --recursive https://git.tasktools.org/TM/task - - cd task + - git clone --recursive https://github.com/GothenburgBitFactory/taskwarrior + - cd taskwarrior - git checkout $TASK_VERSION - git clean -dfx - git submodule init diff --git a/tasklib/backends.py b/tasklib/backends.py index 9110e12..38f6c59 100644 --- a/tasklib/backends.py +++ b/tasklib/backends.py @@ -95,16 +95,21 @@ class TaskWarrior(Backend): VERSION_2_4_5 = six.u('2.4.5') def __init__(self, data_location=None, create=True, - taskrc_location='~/.taskrc'): - self.taskrc_location = os.path.expanduser(taskrc_location) + taskrc_location=None, task_command='task', + version_override=None): + self.taskrc_location = None + if taskrc_location: + self.taskrc_location = os.path.expanduser(taskrc_location) - # If taskrc does not exist, pass / to use defaults and avoid creating - # dummy .taskrc file by TaskWarrior - if not os.path.exists(self.taskrc_location): - self.taskrc_location = '/' + # If taskrc does not exist, pass / to use defaults and avoid creating + # dummy .taskrc file by TaskWarrior + if not os.path.exists(self.taskrc_location): + self.taskrc_location = '/' + + self.task_command = task_command self._config = None - self.version = self._get_version() + self.version = version_override or self._get_version() self.overrides = { 'confirmation': 'no', 'dependency.confirmation': 'no', # See TW-1483 or taskrc man page @@ -127,8 +132,11 @@ class TaskWarrior(Backend): self.tasks = TaskQuerySet(self) + def _get_task_command(self): + return self.task_command.split() + def _get_command_args(self, args, config_override=None): - command_args = ['task', 'rc:{0}'.format(self.taskrc_location)] + command_args = self._get_task_command() overrides = self.overrides.copy() overrides.update(config_override or dict()) for item in overrides.items(): @@ -141,7 +149,7 @@ class TaskWarrior(Backend): def _get_version(self): p = subprocess.Popen( - ['task', '--version'], + self._get_task_command() + ['--version'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) stdout, stderr = [x.decode('utf-8') for x in p.communicate()] @@ -222,7 +230,7 @@ class TaskWarrior(Backend): def convert_datetime_string(self, value): if self.version >= self.VERSION_2_4_0: - # For strings, use 'task calc' to evaluate the string to datetime + # For strings, use 'calc' to evaluate the string to datetime # available since TW 2.4.0 args = value.split() result = self.execute_command(['calc'] + args) @@ -274,8 +282,11 @@ class TaskWarrior(Backend): args, config_override=config_override) logger.debug(u' '.join(command_args)) + env = os.environ.copy() + if self.taskrc_location: + env['TASKRC'] = self.taskrc_location p = subprocess.Popen(command_args, stdout=subprocess.PIPE, - stderr=subprocess.PIPE) + stderr=subprocess.PIPE, env=env) stdout, stderr = [x.decode('utf-8') for x in p.communicate()] if p.returncode and allow_failure: if stderr.strip(): diff --git a/tasklib/tests.py b/tasklib/tests.py index d53fc31..1fd449c 100644 --- a/tasklib/tests.py +++ b/tasklib/tests.py @@ -4,6 +4,7 @@ import copy import datetime import itertools import json +import os import pytz import six import shutil @@ -47,14 +48,35 @@ def total_seconds_2_6(x): class TasklibTest(unittest.TestCase): + def get_taskwarrior(self, **kwargs): + tw_kwargs = dict( + data_location=self.tmp, + taskrc_location='/', + ) + tw_kwargs.update(kwargs) + return TaskWarrior(**tw_kwargs) + def setUp(self): self.tmp = tempfile.mkdtemp(dir='.') - self.tw = TaskWarrior(data_location=self.tmp, taskrc_location='/') + self.tw = self.get_taskwarrior() def tearDown(self): shutil.rmtree(self.tmp) +class TaskWarriorTest(TasklibTest): + + def test_custom_command(self): + # ensure that a custom command which contains multiple parts + # is properly split up + tw = self.get_taskwarrior( + task_command='wsl task', + # prevent `_get_version` from running as `wsl` may not exist + version_override=os.getenv('TASK_VERSION'), + ) + self.assertEqual(tw._get_task_command(), ['wsl', 'task']) + + class TaskFilterTest(TasklibTest): def test_all_empty(self):