]>
git.madduck.net Git - etc/taskwarrior.git/blobdiff - tasklib/task.py
madduck's git repository
Every one of the projects in this repository is available at the canonical
URL git://git.madduck.net/madduck/pub/<projectpath> — see
each project's metadata for the exact URL.
All patches and comments are welcome. Please squash your changes to logical
commits before using git-format-patch and git-send-email to
patches@ git. madduck. net .
If you'd read over the Git project's submission guidelines and adhered to them,
I'd be especially grateful.
SSH access, as well as push access can be individually
arranged .
If you use my repositories frequently, consider adding the following
snippet to ~/.gitconfig and using the third clone URL listed for each
project:
[url "git://git.madduck.net/madduck/"]
insteadOf = madduck:
VERSION_2_4_0 = six.u('2.4.0')
VERSION_2_4_1 = six.u('2.4.1')
VERSION_2_4_2 = six.u('2.4.2')
VERSION_2_4_0 = six.u('2.4.0')
VERSION_2_4_1 = six.u('2.4.1')
VERSION_2_4_2 = six.u('2.4.2')
+VERSION_2_4_3 = six.u('2.4.3')
logger = logging.getLogger(__name__)
local_zone = tzlocal.get_localzone()
logger = logging.getLogger(__name__)
local_zone = tzlocal.get_localzone()
# time zone at this point. Also None is a valid value too.
localized = value
elif (isinstance(value, six.string_types)
# time zone at this point. Also None is a valid value too.
localized = value
elif (isinstance(value, six.string_types)
- and self.warrior.version > VERSION_2_4_0):
+ and self.warrior.version >= VERSION_2_4_0):
# For strings, use 'task calc' to evaluate the string to datetime
# available since TW 2.4.0
args = value.split()
# For strings, use 'task calc' to evaluate the string to datetime
# available since TW 2.4.0
args = value.split()
def pending(self):
return self['status'] == six.text_type('pending')
def pending(self):
return self['status'] == six.text_type('pending')
+ @property
+ def active(self):
+ return self['start'] is not None
+
@property
def saved(self):
return self['uuid'] is not None or self['id'] is not None
@property
def saved(self):
return self['uuid'] is not None or self['id'] is not None
if self.warrior.version < VERSION_2_4_0:
return self._data['description']
else:
if self.warrior.version < VERSION_2_4_0:
return self._data['description']
else:
- return "description:'{0}'" .format(self._data['description'] or '')
+ return six.u("description:'{0}'") .format(self._data['description'] or '')
def delete(self):
if not self.saved:
def delete(self):
if not self.saved:
if serialized_value is '':
escaped_serialized_value = ''
else:
if serialized_value is '':
escaped_serialized_value = ''
else:
- escaped_serialized_value = "'{0}'" .format(serialized_value)
+ escaped_serialized_value = six.u("'{0}'") .format(serialized_value)
- format_default = lambda: "{0}:{1}" .format(field,
+ format_default = lambda: six.u("{0}:{1}") .format(field,
escaped_serialized_value)
format_func = getattr(self, 'format_{0}'.format(field),
escaped_serialized_value)
format_func = getattr(self, 'format_{0}'.format(field),
modifier = '.is' if value else '.none'
key = key + modifier if '.' not in key else key
modifier = '.is' if value else '.none'
key = key + modifier if '.' not in key else key
- self.filter_params.append("{0}:{1}" .format(key, value))
+ self.filter_params.append(six.u("{0}:{1}") .format(key, value))
def get_filter_params(self):
return [f for f in self.filter_params if f]
def get_filter_params(self):
return [f for f in self.filter_params if f]
class TaskWarrior(object):
class TaskWarrior(object):
- def __init__(self, data_location='~/.task', create=True, taskrc_location='~/.taskrc'):
- data_location = os.path.expanduser(data_location)
+ def __init__(self, data_location=None, create=True, taskrc_location='~/.taskrc'):
self.taskrc_location = os.path.expanduser(taskrc_location)
# If taskrc does not exist, pass / to use defaults and avoid creating
self.taskrc_location = os.path.expanduser(taskrc_location)
# If taskrc does not exist, pass / to use defaults and avoid creating
if not os.path.exists(self.taskrc_location):
self.taskrc_location = '/'
if not os.path.exists(self.taskrc_location):
self.taskrc_location = '/'
- if create and not os.path.exists(data_location):
- os.makedirs(data_location)
-
+ self.version = self._get_version()
- 'data.location': data_location,
'confirmation': 'no',
'dependency.confirmation': 'no', # See TW-1483 or taskrc man page
'recurrence.confirmation': 'no', # Necessary for modifying R tasks
'confirmation': 'no',
'dependency.confirmation': 'no', # See TW-1483 or taskrc man page
'recurrence.confirmation': 'no', # Necessary for modifying R tasks
+ # 2.4.3 onwards supports 0 as infite bulk, otherwise set just
+ # arbitrary big number which is likely to be large enough
+ 'bulk': 0 if self.version >= VERSION_2_4_3 else 100000,
+
+ # Set data.location override if passed via kwarg
+ if data_location is not None:
+ data_location = os.path.expanduser(data_location)
+ if create and not os.path.exists(data_location):
+ os.makedirs(data_location)
+ self.config['data.location'] = data_location
+
self.tasks = TaskQuerySet(self)
self.tasks = TaskQuerySet(self)
- self.version = self._get_version()
def _get_command_args(self, args, config_override={}):
command_args = ['task', 'rc:{0}'.format(self.taskrc_location)]
def _get_command_args(self, args, config_override={}):
command_args = ['task', 'rc:{0}'.format(self.taskrc_location)]
config.update(config_override)
for item in config.items():
command_args.append('rc.{0}={1}'.format(*item))
config.update(config_override)
for item in config.items():
command_args.append('rc.{0}={1}'.format(*item))
- command_args.extend(map(str , args))
+ command_args.extend(map(six.text_type , args))
return command_args
def _get_version(self):
return command_args
def _get_version(self):
stdout, stderr = [x.decode('utf-8') for x in p.communicate()]
return stdout.strip('\n')
stdout, stderr = [x.decode('utf-8') for x in p.communicate()]
return stdout.strip('\n')
- def execute_command(self, args, config_override={}, allow_failure=True):
+ def execute_command(self, args, config_override={}, allow_failure=True,
+ return_all=False):
command_args = self._get_command_args(
args, config_override=config_override)
logger.debug(' '.join(command_args))
command_args = self._get_command_args(
args, config_override=config_override)
logger.debug(' '.join(command_args))
else:
error_msg = stdout.strip()
raise TaskWarriorException(error_msg)
else:
error_msg = stdout.strip()
raise TaskWarriorException(error_msg)
- return stdout.rstrip().split('\n')
+
+ # Return all whole triplet only if explicitly asked for
+ if not return_all:
+ return stdout.rstrip().split('\n')
+ else:
+ return (stdout.rstrip().split('\n'),
+ stderr.rstrip().split('\n'),
+ p.returncode)
def enforce_recurrence(self):
# Run arbitrary report command which will trigger generation
def enforce_recurrence(self):
# Run arbitrary report command which will trigger generation