Skip to content

Commit 253cbd9

Browse files
committed
Started development of new DataTime library.
Update issue 415 Status: Started Implemented "Convert Time" keyword.
1 parent 6a56e52 commit 253cbd9

8 files changed

Lines changed: 214 additions & 1 deletion

File tree

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
*** Settings ***
2+
Suite Setup Run Tests ${EMPTY} standard_libraries/datetime/convert_time_input_format.txt
3+
Force Tags regression pybot jybot
4+
Resource atest_resource.txt
5+
6+
*** Test Cases ***
7+
Time string
8+
Check Test Case ${TESTNAME}
9+
10+
Number as string
11+
Check Test Case ${TESTNAME}
12+
13+
Number
14+
Check Test Case ${TESTNAME}
15+
16+
Clock
17+
Check Test Case ${TESTNAME}
18+
19+
Clock without millis
20+
Check Test Case ${TESTNAME}
21+
22+
Timedelta
23+
Check Test Case ${TESTNAME}
24+
25+
Invalid
26+
Check Test Case ${TESTNAME}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
*** Settings ***
2+
Suite Setup Run Tests ${EMPTY} standard_libraries/datetime/convert_time_result_format.txt
3+
Force Tags regression pybot jybot
4+
Resource atest_resource.txt
5+
6+
*** Test Cases ***
7+
Convert to seconds
8+
Check Test Case ${TESTNAME}
9+
10+
Convert to string
11+
Check Test Case ${TESTNAME}
12+
13+
Convert to compact string
14+
Check Test Case ${TESTNAME}
15+
16+
Convert to clock
17+
Check Test Case ${TESTNAME}
18+
19+
Convert to timedelta
20+
Check Test Case ${TESTNAME}
21+
22+
Ignore millis
23+
Check Test Case ${TESTNAME}
24+
25+
Invalid format
26+
Check Test Case ${TESTNAME}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
*** Settings ***
2+
Test Template Time conversion should succeed
3+
Library DateTime
4+
Variables datesandtimes.py
5+
6+
*** Test Cases *** INPUT EXPECTED
7+
Time string 10 s 10
8+
0.5 seconds 0.5
9+
1d 2h 3m 4s 5ms 93784.005
10+
1 day 2 hours 3 min 4 sec 5 millis 93784.005
11+
999.9 milliseconds 1
12+
-10s -10
13+
- 1 min 0.5 sec -60.5
14+
0 days 2 mins 0 s 120
15+
0 s 0
16+
17+
Number as string 10 10
18+
0.5 0.5
19+
-1 -1
20+
0 0
21+
22+
Number ${42} 42
23+
${3.14} 3.14
24+
${-0.5} -0.5
25+
${0} 0
26+
27+
Clock 00:00:00.000 0
28+
00:00:00.001 0.001
29+
00:00:01.000 1
30+
01:02:03.004 3723.004
31+
99:59:59.999 359999.999
32+
100:00:00.000 360000
33+
34+
Clock without millis
35+
00:00:00 0
36+
00:00:01 1
37+
01:02:03 3723
38+
99:59:59 359999
39+
100:00:00 360000
40+
41+
Timedelta ${timedelta(1)} 86400
42+
${timedelta(seconds=1.5)} 1.5
43+
${timedelta(hours=-1)} -3600
44+
45+
Invalid [Documentation] FAIL ValueError: Invalid time string 'kekkonen'.
46+
kekkonen 0
47+
48+
*** Keywords ***
49+
Time conversion should succeed
50+
[Arguments] ${input} ${expected}
51+
${expected} = Convert To Number ${expected}
52+
${result} = Convert Time ${input}
53+
Should Be Equal ${result} ${expected}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
*** Settings ***
2+
Test Template Time conversion should succeed
3+
Library DateTime
4+
Variables datesandtimes.py
5+
6+
*** Test Cases *** INPUT FORMAT EXPECTED
7+
Convert to seconds 10 s number ${10}
8+
${-62.3} NUMBER ${-62.3}
9+
${timedelta(2)} NUMber ${172800}
10+
11+
Convert to string 10 s verbose 10 seconds
12+
${-62.3} VERBOSE - 1 minute 2 seconds 300 milliseconds
13+
${timedelta(2)} VERbose 2 days
14+
15+
Convert to compact string
16+
10 s compact 10s
17+
${-62.3} COMPACT - 1min 2s 300ms
18+
${timedelta(2)} COMpact 2d
19+
20+
Convert to clock 10 s clock 00:00:10.000
21+
${-62.3} CLOCK -00:01:02.300
22+
${timedelta(5)} CLock 120:00:00.000
23+
24+
Convert to timedelta
25+
10 s timedelta ${timedelta(seconds=10)}
26+
${-62.3} TIMEDELTA ${timedelta(minutes=-1, seconds=-2.3)}
27+
${timedelta(2)} TIMEdelta ${timedelta(2)}
28+
29+
Ignore millis [Template] Time conversion without millis should succeed
30+
61.5 number ${62}
31+
61.5 verbose 1 minute 2 seconds
32+
61.5 compact 1min 2s
33+
61.5 clock 00:01:02
34+
61.5 timedelta ${timedelta(seconds=62)}
35+
36+
Invalid format [Documentation] FAIL ValueError: Unknown format 'invalid'.
37+
10s invalid 0
38+
39+
*** Keywords ***
40+
Time conversion should succeed
41+
[Arguments] ${input} ${format} ${expected}
42+
${result} = Convert Time ${input} ${format}
43+
Should Be Equal ${result} ${expected}
44+
45+
Time conversion without millis should succeed
46+
[Arguments] ${input} ${format} ${expected}
47+
${result} = Convert Time ${input} ${format} exclude_millis=Yes
48+
Should Be Equal ${result} ${expected}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
from datetime import timedelta
2+

doc/libraries/lib2html.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
Libraries:
66
BuiltIn (bu)
77
Collections (co)
8+
DateTime (da)
89
Dialogs (di)
910
OperatingSystem (op)
1011
Process (pr)

src/robot/libraries/DateTime.py

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
from datetime import timedelta
2+
import re
3+
4+
from robot.utils import elapsed_time_to_string, secs_to_timestr, timestr_to_secs
5+
6+
7+
class DateTime(object):
8+
9+
def convert_time(self, time, result_format='number', exclude_millis=False):
10+
return Time(time).convert(result_format, millis=not exclude_millis)
11+
12+
13+
class Time(object):
14+
_clock_re = re.compile('(\d{2,}):(\d{2}):(\d{2})(\.(\d{3}))?')
15+
16+
def __init__(self, time):
17+
self.seconds = self._convert_time_to_seconds(time)
18+
19+
def _convert_time_to_seconds(self, time):
20+
if isinstance(time, timedelta):
21+
return time.total_seconds()
22+
if isinstance(time, basestring):
23+
match = self._clock_re.match(time)
24+
if match:
25+
return self._convert_clock_to_secs(match)
26+
return timestr_to_secs(time)
27+
28+
def _convert_clock_to_secs(self, match):
29+
hours, minutes, seconds, millis_included, millis = match.groups()
30+
result = 60 * 60 * int(hours) + 60 * int(minutes) + int(seconds)
31+
print match.groups()
32+
if millis_included:
33+
result += int(millis) / 1000.0
34+
return result
35+
36+
def convert(self, format, millis=True):
37+
try:
38+
result_converter = getattr(self, '_convert_to_%s' % format.lower())
39+
except AttributeError:
40+
raise ValueError("Unknown format '%s'." % format)
41+
seconds = self.seconds if millis else int(round(self.seconds))
42+
return result_converter(seconds, millis)
43+
44+
def _convert_to_number(self, seconds, millis=True):
45+
return seconds
46+
47+
def _convert_to_verbose(self, seconds, millis=True):
48+
return secs_to_timestr(seconds)
49+
50+
def _convert_to_compact(self, seconds, millis=True):
51+
return secs_to_timestr(seconds, compact=True)
52+
53+
def _convert_to_clock(self, seconds, millis=True):
54+
return elapsed_time_to_string(seconds * 1000, include_millis=millis)
55+
56+
def _convert_to_timedelta(self, seconds, millis=True):
57+
return timedelta(seconds=seconds)

src/robot/running/namespace.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
from .context import EXECUTION_CONTEXTS
3030

3131

32-
STDLIB_NAMES = set(('BuiltIn', 'Collections', 'Dialogs', 'Easter',
32+
STDLIB_NAMES = set(('BuiltIn', 'Collections', 'DateTime', 'Dialogs', 'Easter',
3333
'OperatingSystem', 'Process', 'Remote', 'Reserved',
3434
'Screenshot', 'String', 'Telnet', 'XML'))
3535
IMPORTER = Importer()

0 commit comments

Comments
 (0)