def test_exception(self): cases = ( ( '2018-03-06 15:08:11', { 'every': [1, 'hour'], 'at': { 'hour': 14, 'second': 44 }, }, ), ( '2018-03-06 15:08:11', { 'every': [10, 'second'], 'at': { 'second': 0 }, }, ), ) for last_fire, conf in cases: last_fire_date = timeutil.parse(last_fire, 'mysql') last_fire_ts = time.mktime(last_fire_date.timetuple()) with self.assertRaises(Exception) as context: jobscheduler.get_next_fire_time(conf, last_fire_ts) self.assertIn('NextFireTimeError', repr(context.exception))
def test_parse_with_timezone(self): cases = ( ('2018-04-03 17:45:01', 'Asia/Shanghai', 1522748701), ('2018-04-03 17:45:01', 'UTC', 1522748701 + 3600 * 8), ) for time_str, timezone, exp_ts in cases: dt = timeutil.parse(time_str, 'mysql', timezone=timezone) ts = timeutil.datetime_to_ts(dt) self.assertEqual(exp_ts, ts)
def test_direct_format(self): for fmt_key, tm_str in test_case['format'].items(): # parse dt_key = timeutil.parse(tm_str, fmt_key) dt_direct = timeutil.parse(tm_str, timeutil.formats[fmt_key]) self.assertTrue(dt_key == dt_direct) # format self.assertEqual(tm_str, timeutil.format(dt_key, fmt_key)) self.assertEqual( tm_str, timeutil.format(dt_key, timeutil.formats[fmt_key])) # format_ts now = int(time.time()) self.assertEqual( timeutil.format_ts(now, fmt_key), timeutil.format_ts(now, timeutil.formats[fmt_key]))
def test_direct_format(self): for fmt_key, tm_str in test_case['format'].items(): # parse dt_key = timeutil.parse(tm_str, fmt_key) dt_direct = timeutil.parse(tm_str, timeutil.formats[fmt_key]) self.assertTrue(dt_key == dt_direct) # format self.assertEqual(tm_str, timeutil.format(dt_key, fmt_key)) self.assertEqual(tm_str, timeutil.format(dt_key, timeutil.formats[fmt_key])) # format_ts now = int(time.time()) self.assertEqual(timeutil.format_ts(now, fmt_key), timeutil.format_ts(now, timeutil.formats[fmt_key]))
def test_parse(self): for fmt_key, tm_str in test_case['format'].items(): dt = timeutil.parse(tm_str, fmt_key) ts = timeutil.utc_datetime_to_ts(dt) if fmt_key == 'archive': self.assertEqual(test_case['ts']['hour_accuracy'], ts) elif fmt_key.startswith('daily'): self.assertEqual(test_case['ts']['day_accuracy'], ts) else: self.assertEqual(test_case['ts']['second_accuracy'], ts)
def test_parse(self): tss = test_case['ts'] for fmt_key, tm_str in test_case['format'].items(): dt = timeutil.parse(tm_str, fmt_key) ts = timeutil.utc_datetime_to_ts(dt) if fmt_key == 'archive': self.assertEqual(tss['hour_accuracy'], ts) self.assertEqual(tss['hour_accuracy'], timeutil.parse_to_ts(tm_str, fmt_key)) elif fmt_key.startswith('daily'): self.assertEqual(tss['day_accuracy'], ts) self.assertEqual(tss['day_accuracy'], timeutil.parse_to_ts(tm_str, fmt_key)) else: self.assertEqual(tss['second_accuracy'], ts) self.assertEqual(tss['second_accuracy'], timeutil.parse_to_ts(tm_str, fmt_key))
def parse(log_str): r = re.match('^\[(.+?),(.+?),(.+?),(.+?),(\d+?),(\w+?)]', log_str) time_str = r.group(1) log_dt = timeutil.parse(time_str, 'mysql') log_ts = int(time.mktime(log_dt.timetuple())) source_file = r.group(4) line_number = int(r.group(5)) level = standard_level[r.group(6)] log_info = { 'log_ts': log_ts, 'level': level, 'source_file': source_file, 'line_number': line_number, } return log_info
from pykit import timeutil from pykit import utfjson f = open('loop_monitor_report.txt', 'r') i = 0 last_ts = None while True: line = f.readline() if line == '': break parts = utfjson.load(line.strip()) r = timeutil.parse(parts[0], 'mysql') ts = time.mktime(r.timetuple()) if last_ts is None: i += 1 last_ts = ts continue if ts != last_ts + 1: print '%d line: %s not adjacent to last line' % (i, line) break i += 1 last_ts = ts print 'no lost slot'
def test_get_next_fire_time(self): cases = ( ('2018-03-06 15:08:11', { 'every': [1, 'hour'], 'at': { 'minute': 33, 'second': 44 }, }, '2018-03-06 16:33:44+08:00'), ( '2018-03-06 15:08:11', { 'every': [1, 'hour'], }, '2018-03-06 16:08:11+08:00', ), ('2018-03-06 15:08:11', { 'every': [1, 'hour'], 'at': { 'minute': 0, 'second': 0 }, }, '2018-03-06 16:00:00+08:00'), ('2018-03-06 15:00:00', { 'every': [1, 'hour'], 'at': { 'minute': 0, 'second': 0 }, }, '2018-03-06 16:00:00+08:00'), ('2018-03-06 15:10:02', { 'every': [2, 'day'], 'at': { 'minute': 0, 'second': 0 }, }, '2018-03-08 15:00:00+08:00'), ('2018-03-06 15:59:59', { 'every': [1, 'hour'], 'at': { 'minute': 0, 'second': 0 }, }, '2018-03-06 16:00:00+08:00'), ('2018-03-06 15:59:59', { 'every': [1, 'minute'], 'at': { 'second': 0 }, }, '2018-03-06 16:00:00+08:00'), ('2018-03-06 16:00:00', { 'every': [1, 'minute'], 'at': { 'second': 0 }, }, '2018-03-06 16:01:00+08:00'), ('2018-03-06 16:00:00', { 'every': [50, 'second'], }, '2018-03-06 16:00:50+08:00'), ('2018-03-06 16:00:00', { 'every': [3, 'month'], 'at': { 'day': 30, 'hour': 13, 'minute': 23, 'second': 33 }, }, '2018-06-30 13:23:33+08:00'), ( '2018-06-30 14:23:55', { 'every': [3, 'month'], 'at': { 'day': 30, 'hour': 13, 'minute': 23, 'second': 33 }, }, # not 2018-09-30, because we assume every month is 31 days, # so add 3 * 31 days to 2018-06-30 is not 2018-09-30. '2018-10-30 13:23:33+08:00'), ('2018-06-30 13:23:33', { 'every': [3, 'week'], 'at': { 'hour': 13, 'minute': 23, 'second': 33 }, }, '2018-07-21 13:23:33+08:00'), ('2018-03-06 15:10:02', { 'every': [1, 'day'], 'at': { 'hour': 12, 'minute': 0, 'second': 0 }, 'timezone': 'utc', }, '2018-03-07 20:00:00+08:00'), ('2018-03-06 15:10:02', { 'every': [1, 'day'], 'at': { 'hour': 12, 'minute': 0, 'second': 0 }, 'timezone': 'Asia/Shanghai' }, '2018-03-07 12:00:00+08:00'), ( '2018-03-06 15:10:02', { 'every': [1, 'day'], 'at': { 'hour': 2, 'minute': 0, 'second': 0 }, 'timezone': 'US/Pacific' }, # 'US/Pacific' is 16 hours behind 'Asia/Shanghai' # after add one day to 2018-03-06 15:10:02, it is # 2018-03-07 15:10:02, but at 'US/Pacific', it is # 2018-03-06 23:10:02, need fire at # 2018-03-06 02:00:00, that is 2018-03-06 18:00:00+08:00 '2018-03-06 18:00:00+08:00'), ) for last_fire, conf, expected_next_fire in cases: last_fire_date = timeutil.parse(last_fire, 'mysql') last_fire_ts = time.mktime(last_fire_date.timetuple()) next_fire_time = jobscheduler.get_next_fire_time( conf, last_fire_ts) self.assertEqual(expected_next_fire, next_fire_time['string'])
from pykit import timeutil if __name__ == '__main__': time_utc = 'Tue, 24 Jan 2017 07:51:59 UTC' dt = timeutil.parse(time_utc, 'default') print dt dt = timeutil.parse(time_utc, 'utc') print dt print time_mysql = '2018-12-1 11:20:30' dt = timeutil.parse(time_mysql, 'mysql') print dt print print timeutil.format(dt, 'utc') print timeutil.format(dt, 'iso') print timeutil.format(dt, 'daily') print ts = timeutil.utc_datetime_to_ts(dt) print ts print time_mysql = timeutil.format_ts(ts, 'mysql') print time_mysql time_iso = timeutil.format_ts(ts, 'iso') print time_iso print