/usr/lib/python2.7/dist-packages/tryton/common/timedelta.py is in tryton-client 3.8.4-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 | # This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
from __future__ import division
import datetime
import gettext
import locale
import operator
__all__ = ['format', 'parse']
_ = gettext.gettext
DEFAULT_CONVERTER = {
's': 1,
}
DEFAULT_CONVERTER['m'] = DEFAULT_CONVERTER['s'] * 60
DEFAULT_CONVERTER['h'] = DEFAULT_CONVERTER['m'] * 60
DEFAULT_CONVERTER['d'] = DEFAULT_CONVERTER['h'] * 24
DEFAULT_CONVERTER['w'] = DEFAULT_CONVERTER['d'] * 7
DEFAULT_CONVERTER['M'] = DEFAULT_CONVERTER['w'] * 4
DEFAULT_CONVERTER['Y'] = DEFAULT_CONVERTER['d'] * 365
def _get_separators():
return {
'Y': _('Y'),
'M': _('M'),
'w': _('w'),
'd': _('d'),
'h': _('h'),
'm': _('m'),
's': _('s'),
}
def format(value, converter=None):
'Convert timedelta to text'
if value is None:
return ''
if not converter:
converter = DEFAULT_CONVERTER
text = []
value = value.total_seconds()
sign = ''
if value < 0:
sign = '-'
value = abs(value)
converter = sorted(converter.items(), key=operator.itemgetter(1),
reverse=True)
values = []
for k, v in converter:
part = value // v
value -= part * v
values.append(part)
for (k, _), v in zip(converter[:-3], values):
if v:
text.append(locale.format('%d', v, True) + _get_separators()[k])
if any(values[-3:]) or not text:
time = '%02d:%02d' % tuple(values[-3:-1])
if values[-1] or value:
time += ':%02d' % values[-1]
text.append(time)
text = sign + ' '.join(text)
if value:
if not any(values[-3:]):
# Add space if no time
text += ' '
text += ('%.6f' % value)[1:]
return text
def parse(text, converter=None):
if not text:
return
if not converter:
converter = DEFAULT_CONVERTER
for separator in _get_separators().values():
text = text.replace(separator, separator + ' ')
seconds = 0
for part in text.split():
if ':' in part:
for t, v in zip(part.split(':'),
[converter['h'], converter['m'], converter['s']]):
try:
seconds += abs(float(t)) * v
except ValueError:
pass
else:
for key, separator in _get_separators().items():
if part.endswith(separator):
part = part[:-len(separator)]
try:
seconds += abs(int(part)) * converter[key]
except ValueError:
pass
break
else:
try:
seconds += abs(float(part))
except ValueError:
pass
if '-' in text:
seconds *= -1
return datetime.timedelta(seconds=seconds)
_tests = [
(None, ''),
(datetime.timedelta(), '00:00'),
(datetime.timedelta(days=3, hours=5, minutes=30), '3d 05:30'),
(datetime.timedelta(weeks=48), '12M'),
(datetime.timedelta(weeks=50), '12M 2w'),
(datetime.timedelta(days=365), '1Y'),
(datetime.timedelta(hours=2, minutes=5, seconds=10), '02:05:10'),
(datetime.timedelta(minutes=15, microseconds=42), '00:15:00.000042'),
(datetime.timedelta(days=1, microseconds=42), '1d .000042'),
(datetime.timedelta(seconds=-1), '-00:00:01'),
(datetime.timedelta(days=-1, hours=-5, minutes=-30), '-1d 05:30'),
]
def test_format():
for timedelta, text in _tests:
assert format(timedelta) == text
_tests_parse = [
(datetime.timedelta(), ' '),
(datetime.timedelta(), 'foo'),
(datetime.timedelta(), '1.5d'),
(datetime.timedelta(days=-2), '1d -1d'),
(datetime.timedelta(hours=1, minutes=5, seconds=10), '1:5:10:42'),
(datetime.timedelta(hours=2), '1: 1:'),
(datetime.timedelta(hours=.25), ':15'),
]
def test_parse():
for timedelta, text, in _tests + _tests_parse:
assert parse(text) == timedelta
|