3 new revisions:
Revision: bdff3dda795f
Branch: default
Author: Pekka Klärck
Date: Tue May 6 11:21:32 2014 UTC
Log: DateTime: Combatibility with Python/Jython < 2.7....
http://code.google.com/p/robotframework/source/detail?r=bdff3dda795f
Revision: ee5a5293f667
Branch: default
Author: Pekka Klärck
Date: Tue May 6 11:27:13 2014 UTC
Log: test data cleanup
http://code.google.com/p/robotframework/source/detail?r=ee5a5293f667
Revision: caac344db28e
Branch: default
Author: Pekka Klärck
Date: Tue May 6 22:22:41 2014 UTC
Log: DateTime: Support Python/Jython 2.5 and workaround IronPython
bug....
http://code.google.com/p/robotframework/source/detail?r=caac344db28e
==============================================================================
Revision: bdff3dda795f
Branch: default
Author: Pekka Klärck
Date: Tue May 6 11:21:32 2014 UTC
Log: DateTime: Combatibility with Python/Jython < 2.7.
Update issue 415
Python/Jython < 2.7 compatibility.
http://code.google.com/p/robotframework/source/detail?r=bdff3dda795f
Modified:
/src/robot/libraries/DateTime.py
=======================================
--- /src/robot/libraries/DateTime.py Tue Apr 29 18:01:18 2014 UTC
+++ /src/robot/libraries/DateTime.py Tue May 6 11:21:32 2014 UTC
@@ -1,6 +1,5 @@
from datetime import timedelta, datetime
-from numbers import Number
-from time import mktime
+import time
from string import digits
import re
@@ -24,7 +23,9 @@
def _convert_time_to_seconds(self, time):
if isinstance(time, timedelta):
- return time.total_seconds()
+ # timedelta.total_seconds() is new in Python 2.7
+ return (time.days * 24 * 60 * 60 + time.seconds +
+ time.microseconds / 1000000.0)
if isinstance(time, basestring):
match = self._clock_re.match(time)
if match:
@@ -72,7 +73,7 @@
return dt
if isinstance(dt, basestring):
return self._string_to_datetime(dt, input_format)
- if isinstance(dt, Number):
+ if isinstance(dt, (int, long, float)):
return datetime.fromtimestamp(dt)
def _string_to_datetime(self, dt, input_format):
@@ -100,7 +101,7 @@
return str(self.dt)
def _convert_to_epoch(self):
- return mktime(self.dt.timetuple())
+ return time.mktime(self.dt.timetuple())
def _convert_to_datetime(self):
return self.dt
==============================================================================
Revision: ee5a5293f667
Branch: default
Author: Pekka Klärck
Date: Tue May 6 11:27:13 2014 UTC
Log: test data cleanup
http://code.google.com/p/robotframework/source/detail?r=ee5a5293f667
Modified:
/atest/testdata/standard_libraries/datetime/convert_date_input_format.txt
/atest/testdata/standard_libraries/datetime/convert_date_result_format.txt
=======================================
---
/atest/testdata/standard_libraries/datetime/convert_date_input_format.txt
Tue Apr 29 18:01:18 2014 UTC
+++
/atest/testdata/standard_libraries/datetime/convert_date_input_format.txt
Tue May 6 11:27:13 2014 UTC
@@ -1,30 +1,33 @@
*** Settings ***
-Library DateTime
-Test Template Date Conversion Should Succeed
-Variables datesandtimes.py
+Test Template Date Conversion Should Succeed
+Library DateTime
+Variables datesandtimes.py
-*** Test Cases *** INPUT FORMAT
OUTPUT
-String inputs 2014-04-24 21:45:12.123 ${NONE}
2014-04-24 21:45:12.123
- 2014-04-24 21:45:12 ${NONE}
2014-04-24 21:45:12
- 2014-04-24T21:45:12.123 ${NONE}
2014-04-24 21:45:12.123
- 2014.04+24@@21/45!12,123 ${NONE}
2014-04-24 21:45:12.123
+*** Variables ***
+${DATE} ${datetime(2014, 4, 24, 21, 45, 12, 123000)}
-Formatted strings 21:45:12.123 24.04.2014 %H:%M:%S.%f %d.%m.%Y
2014-04-24 21:45:12.123
- 04/24/2014T21.45.12 %m/%d/%YT%H.%M.%S
2014-04-24 21:45:12
- 24.04.2014 %d.%m.%Y
2014-04-24 00:00:00
- 24-04.2014@21 %d-%m.%Y@%H
2014-04-24 21:00:00
+*** Test Cases *** INPUT FORMAT
OUTPUT
+String inputs 2014-04-24 21:45:12.123 ${NONE}
2014-04-24 21:45:12.123
+ 2014-04-24 21:45:12 ${NONE}
2014-04-24 21:45:12
+ 2014-04-24T21:45:12.123 ${NONE}
2014-04-24 21:45:12.123
+ 2014.04+24@@21/45!12,123 ${NONE}
2014-04-24 21:45:12.123
+
+Formatted strings 21:45:12.123 24.04.2014 %H:%M:%S.%f %d.%m.%Y
2014-04-24 21:45:12.123
+ 04/24/2014T21.45.12 %m/%d/%YT%H.%M.%S
2014-04-24 21:45:12
+ 24.04.2014 %d.%m.%Y
2014-04-24 00:00:00
+ 24-04.2014@21 %d-%m.%Y@%H
2014-04-24 21:00:00
-Epoch ${1398365112.0} ${NONE}
2014-04-24 21:45:12
- ${1398365112.123} ${NONE}
2014-04-24 21:45:12.123
+Epoch ${1398365112.0} ${NONE}
2014-04-24 21:45:12
+ ${1398365112.123} ${NONE}
2014-04-24 21:45:12.123
-Datetime object ${datetime.strptime('2014-04-24
21:45:12.123', '%Y-%m-%d %H:%M:%S.%f')} ${NONE} 2014-04-24 21:45:12.123
+Datetime object ${DATE} ${NONE}
2014-04-24 21:45:12.123
Pad zeroes to missing values
- 2014-04-24 ${NONE}
2014-04-24 00:00:00
- 2014.04.24 21 ${NONE}
2014-04-24 21:00:00
+ 2014-04-24 ${NONE}
2014-04-24 00:00:00
+ 2014.04.24 21 ${NONE}
2014-04-24 21:00:00
*** Keywords ***
Date Conversion Should Succeed
- [Arguments] ${input} ${input_format} ${expected}
- ${ts} = Convert Date ${input} input_format=${input_format}
- Should Be Equal ${ts} ${expected}
+ [Arguments] ${input} ${input_format} ${expected}
+ ${ts} = Convert Date ${input} input_format=${input_format}
+ Should Be Equal ${ts} ${expected}
=======================================
---
/atest/testdata/standard_libraries/datetime/convert_date_result_format.txt
Tue Apr 29 18:01:18 2014 UTC
+++
/atest/testdata/standard_libraries/datetime/convert_date_result_format.txt
Tue May 6 11:27:13 2014 UTC
@@ -2,25 +2,31 @@
Library DateTime
Test Template Date Conversion Should Succeed
Variables datesandtimes.py
+
+*** Variables ***
+${DATE} ${datetime(2014, 4, 24, 21, 45, 12, 123000)}
*** Test Cases ***
-Should convert to timestamp 2014-04-24 21:45:12.123 timeSTAMP
${NONE} 2014-04-24 21:45:12.123
- 21:45:12.123 2014-04-24
tImestamp %H:%M:%S.%f %Y-%m-%d 2014-04-24 21:45:12.123
- ${1398365112.0} TIMEstamp
${NONE} 2014-04-24 21:45:12
- ${datetime.strptime('2014-04-24
21:45:12.123000', '%Y-%m-%d %H:%M:%S.%f')} TimeStamp ${NONE} 2014-04-24
21:45:12.123
+Should convert to timestamp
+ 2014-04-24 21:45:12.123 timeSTAMP ${NONE}
2014-04-24 21:45:12.123
+ 2014-04-24 21:45:12.123 tImestamp %Y-%m-%d %H:%M:%S.%f
2014-04-24 21:45:12.123
+ ${1398365112.0} TIMEstamp ${NONE}
2014-04-24 21:45:12
+ ${DATE} TimeStamp ${NONE}
2014-04-24 21:45:12.123
-Should convert to epoch 2014-04-24 21:45:12.123 epoch
${NONE} ${1398365112.0}
- 21:45:12.123 2014-04-24
epoch %H:%M:%S.%f %Y-%m-%d ${1398365112.0}
- ${1398365112.0} epoch
${NONE} ${1398365112.0}
- ${datetime.strptime('2014-04-24
21:45:12.123000', '%Y-%m-%d %H:%M:%S.%f')} epoch ${NONE} ${1398365112.0}
+Should convert to epoch
+ 2014-04-24 21:45:12.123 epoch ${NONE}
${1398365112.0}
+ 2014-04-24 21:45:12.123 epoch %Y-%m-%d %H:%M:%S.%f
${1398365112.0}
+ ${1398365112.0} epoch ${NONE}
${1398365112.0}
+ ${DATE} epoch ${NONE}
${1398365112.0}
-Should convert to datetime 2014-04-24 21:45:12.123 datetime
${NONE} ${datetime.strptime('2014-04-24
21:45:12.123000', '%Y-%m-%d %H:%M:%S.%f')}
- 21:45:12.123 2014-04-24
datetime %H:%M:%S.%f %Y-%m-%d ${datetime.strptime('2014-04-24
21:45:12.123000', '%Y-%m-%d %H:%M:%S.%f')}
- ${1398365112.123} dateTiMe
${NONE} ${datetime.strptime('2014-04-24
21:45:12.123000', '%Y-%m-%d %H:%M:%S.%f')}
- ${datetime.strptime('2014-04-24
21:45:12.123000', '%Y-%m-%d %H:%M:%S.%f')} datetimE ${NONE}
${datetime.strptime('2014-04-24 21:45:12.123000', '%Y-%m-%d %H:%M:%S.%f')}
+Should convert to datetime
+ 2014-04-24 21:45:12.123 datetime ${NONE} ${DATE}
+ 2014-04-24 21:45:12.123 datetime %Y-%m-%d %H:%M:%S.%f ${DATE}
+ ${1398365112.123} dateTiMe ${NONE} ${DATE}
+ ${DATE} datetimE ${NONE} ${DATE}
*** Keywords ***
Date Conversion Should Succeed
- [Arguments] ${input} ${output_format} ${input_format} ${expected}
- ${ts} = Convert Date ${input} ${output_format} ${input_format}
- Should Be Equal ${ts} ${expected}
+ [Arguments] ${input} ${output_format} ${input_format}
${expected}
+ ${ts} = Convert Date ${input} ${output_format}
${input_format}
+ Should Be Equal ${ts} ${expected}
==============================================================================
Revision: caac344db28e
Branch: default
Author: Pekka Klärck
Date: Tue May 6 22:22:41 2014 UTC
Log: DateTime: Support Python/Jython 2.5 and workaround IronPython bug.
Update issue 415
Support Python/Jython 2.5 and workaround IronPython bug.
http://code.google.com/p/robotframework/source/detail?r=caac344db28e
Modified:
/atest/robot/standard_libraries/datetime/convert_date_input_format.txt
/atest/testdata/standard_libraries/datetime/convert_date_input_format.txt
/src/robot/libraries/DateTime.py
=======================================
--- /atest/robot/standard_libraries/datetime/convert_date_input_format.txt
Tue Apr 29 18:01:18 2014 UTC
+++ /atest/robot/standard_libraries/datetime/convert_date_input_format.txt
Tue May 6 22:22:41 2014 UTC
@@ -9,6 +9,9 @@
Formatted strings
Check Test Case ${TESTNAME}
+
+Formatted with %f in middle
+ Check Test Case ${TESTNAME}
Epoch
Check Test Case ${TESTNAME}
@@ -18,3 +21,9 @@
Pad zeroes to missing values
Check Test Case ${TESTNAME}
+
+Invalid input format
+ Check Test Case ${TESTNAME}
+
+Rounding milliseconds
+ Check Test Case ${TESTNAME}
=======================================
---
/atest/testdata/standard_libraries/datetime/convert_date_input_format.txt
Tue May 6 11:27:13 2014 UTC
+++
/atest/testdata/standard_libraries/datetime/convert_date_input_format.txt
Tue May 6 22:22:41 2014 UTC
@@ -2,9 +2,6 @@
Test Template Date Conversion Should Succeed
Library DateTime
Variables datesandtimes.py
-
-*** Variables ***
-${DATE} ${datetime(2014, 4, 24, 21, 45, 12, 123000)}
*** Test Cases *** INPUT FORMAT
OUTPUT
String inputs 2014-04-24 21:45:12.123 ${NONE}
2014-04-24 21:45:12.123
@@ -12,19 +9,49 @@
2014-04-24T21:45:12.123 ${NONE}
2014-04-24 21:45:12.123
2014.04+24@@21/45!12,123 ${NONE}
2014-04-24 21:45:12.123
-Formatted strings 21:45:12.123 24.04.2014 %H:%M:%S.%f %d.%m.%Y
2014-04-24 21:45:12.123
+Formatted strings 2014-04-24 21:45:12.123 %Y-%m-%d %H:%M:%S.%f
2014-04-24 21:45:12.123
+ 2014-04-24T21:45:12.123 %Y-%m-%dT%H:%M:%S.%f
2014-04-24 21:45:12.123
+ 24.4.2014 21:45:12-123 %d.%m.%Y %H:%M:%S-%f
2014-04-24 21:45:12.123
04/24/2014T21.45.12 %m/%d/%YT%H.%M.%S
2014-04-24 21:45:12
24.04.2014 %d.%m.%Y
2014-04-24 00:00:00
24-04.2014@21 %d-%m.%Y@%H
2014-04-24 21:00:00
+Formatted with %f in middle
+ [Template] NONE
+ Run Keyword If sys.version_info < (2, 6) or sys.platform == 'cli'
+ ... Run Keyword And Expect Error ValueError: %f directive is
supported only at the end of the format string on this Python interpreter.
+ ... Date Conversion Should Succeed 21:45:12.123
24.04.2014 %H:%M:%S.%f %d.%m.%Y 2014-04-24 21:45:12.123
+ ... ELSE
+ ... Date Conversion Should Succeed 21:45:12.123
24.04.2014 %H:%M:%S.%f %d.%m.%Y 2014-04-24 21:45:12.123
+
Epoch ${1398365112.0} ${NONE}
2014-04-24 21:45:12
${1398365112.123} ${NONE}
2014-04-24 21:45:12.123
-Datetime object ${DATE} ${NONE}
2014-04-24 21:45:12.123
+Datetime object ${datetime(2014, 4, 24, 21, 45, 12, 123000)}
${NONE} 2014-04-24 21:45:12.123
+ ${datetime(2014, 4, 24, 21)}
${NONE} 2014-04-24 21:00:00
Pad zeroes to missing values
2014-04-24 ${NONE}
2014-04-24 00:00:00
2014.04.24 21 ${NONE}
2014-04-24 21:00:00
+
+Rounding milliseconds
+ 2014-04-24 21:45:12.123456
${NONE} 2014-04-24 21:45:12.123
+ 2014-04-24 21:45:12.1234
${NONE} 2014-04-24 21:45:12.123
+ 2014-04-24 21:45:12.1235
${NONE} 2014-04-24 21:45:12.124
+
2014-04-24T21:45:12.123456 %Y-%m-%dT%H:%M:%S.%f 2014-04-24
21:45:12.123
+
2014-04-24T21:45:12.1234 %Y-%m-%dT%H:%M:%S.%f 2014-04-24
21:45:12.123
+
2014-04-24T21:45:12.1235 %Y-%m-%dT%H:%M:%S.%f 2014-04-24
21:45:12.124
+ ${1398365112.123456}
${NONE} 2014-04-24 21:45:12.123
+ ${1398365112.1234}
${NONE} 2014-04-24 21:45:12.123
+ ${1398365112.1235}
${NONE} 2014-04-24 21:45:12.124
+ ${datetime(2014, 4, 24, 21, 45, 12, 123456)}
${NONE} 2014-04-24 21:45:12.123
+ ${datetime(2014, 4, 24, 21, 45, 12, 123400)}
${NONE} 2014-04-24 21:45:12.123
+ ${datetime(2014, 4, 24, 21, 45, 12, 123500)}
${NONE} 2014-04-24 21:45:12.124
+
+Invalid input format
+ [Documentation] FAIL ValueError: Unsupported input 'None'.
+ [Template] NONE
+ Convert Date ${NONE}
*** Keywords ***
Date Conversion Should Succeed
=======================================
--- /src/robot/libraries/DateTime.py Tue May 6 11:21:32 2014 UTC
+++ /src/robot/libraries/DateTime.py Tue May 6 22:22:41 2014 UTC
@@ -1,6 +1,7 @@
from datetime import timedelta, datetime
import time
-from string import digits
+import string
+import sys
import re
from robot.utils import elapsed_time_to_string, secs_to_timestr,
timestr_to_secs
@@ -65,43 +66,69 @@
class Date(object):
+
def __init__(self, dt, input_format):
self.dt = self._convert_to_dt(dt, input_format)
def _convert_to_dt(self, dt, input_format):
- if isinstance(dt, datetime):
- return dt
if isinstance(dt, basestring):
- return self._string_to_datetime(dt, input_format)
- if isinstance(dt, (int, long, float)):
- return datetime.fromtimestamp(dt)
+ dt = self._string_to_datetime(dt, input_format)
+ elif isinstance(dt, (int, long, float)):
+ dt = self._dt_from_timestamp(dt)
+ elif not isinstance(dt, datetime):
+ raise ValueError("Unsupported input '%s'." % dt)
+ return self._round_dt_to_millis(dt)
+
+ def _round_dt_to_millis(self, dt):
+ return datetime(dt.year, dt.month, dt.day, dt.hour, dt.minute,
+ dt.second, int(round(dt.microsecond, -3)))
def _string_to_datetime(self, dt, input_format):
if not input_format:
dt = self._normalize_timestamp(dt)
input_format = '%Y-%m-%d %H:%M:%S.%f'
+ if '%f' in input_format and (sys.version_info < (2, 6) or
+ sys.platform == 'cli'):
+ return self._handle_un_supported_f_directive(dt, input_format)
return datetime.strptime(dt, input_format)
def _normalize_timestamp(self, date):
- stamp = ''.join(digit for digit in date if digit in digits)
- stamp = stamp.ljust(17, '0')
- return '%s-%s-%s %s:%s:%s.%s' % (stamp[:4], stamp[4:6],
stamp[6:8], stamp[8:10],
- stamp[10:12], stamp[12:14],
stamp[14:17])
+ ts = ''.join(d for d in date if d in string.digits).ljust(20, '0')
+ return '%s-%s-%s %s:%s:%s.%s' % (ts[:4], ts[4:6], ts[6:8],
ts[8:10],
+ ts[10:12], ts[12:14], ts[14:])
+
+ def _handle_un_supported_f_directive(self, dt, input_format):
+ if not input_format.endswith('%f'):
+ raise ValueError('%f directive is supported only at the end
of '
+ 'the format string on this Python
interpreter.')
+ input_format = input_format[:-2]
+ micro = re.search('\d+$', dt).group(0)
+ dt = dt[:-len(micro)]
+ epoch = time.mktime(time.strptime(dt, input_format))
+ epoch += float(micro) / 10**len(micro)
+ return self._dt_from_timestamp(epoch)
+
+ def _dt_from_timestamp(self, ts):
+ # Jython and IronPython handle floats incorrectly. For example,
+ # datetime.fromtimestamp(1399410716.123).microsecond == 122999
+ dt = datetime.fromtimestamp(ts)
+ return datetime(dt.year, dt.month, dt.day, dt.hour, dt.minute,
+ dt.second, int(round(ts % 1 * 10**6, -3)))
- def convert(self, output_format):
+ def convert(self, format):
try:
- result_converter = getattr(self, '_convert_to_%s' %
output_format.lower())
+ result_converter = getattr(self, '_convert_to_%s' %
format.lower())
except AttributeError:
- raise ValueError("Unknown format '%s'." % output_format)
- return result_converter()
+ raise ValueError("Unknown format '%s'." % format)
+ return result_converter(self.dt)
- def _convert_to_timestamp(self):
- if self.dt.microsecond:
- return str(self.dt)[:-3]
- return str(self.dt)
+ def _convert_to_timestamp(self, dt):
+ if dt.microsecond:
+ return str(dt)[:-3]
+ return str(dt)
- def _convert_to_epoch(self):
- return time.mktime(self.dt.timetuple())
+ def _convert_to_epoch(self, dt):
+ return time.mktime(dt.timetuple())
- def _convert_to_datetime(self):
- return self.dt
+ def _convert_to_datetime(self, dt):
+ return dt
--
---
You received this message because you are subscribed to the Google Groups "robotframework-commit" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to robotframework-commit+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.