def test_parse_range(self): """ Test that the parse_range method returns the correct list of ints """ # test comma-delimited one_three_five_str = '1,3,5' one_three_five_lst = [1, 3, 5] result = TimeWindow.parse_range(one_three_five_str) self.assertEqual(one_three_five_lst, result, msg='Could not parse comma-delimeted str.') # test range one_to_three_str = '1-3' one_to_three_lst = [1, 2, 3] result = TimeWindow.parse_range(one_to_three_str) self.assertEqual(one_to_three_lst, result, msg='Could not parse range str.') # test mix of commas and ranges one_three_four_to_six_str = '1,3,4-6' one_three_four_to_six_lst = [1, 3, 4, 5, 6] result = TimeWindow.parse_range(one_three_four_to_six_str) self.assertEqual( one_three_four_to_six_lst, result, msg='Could not parse mix of comma-delimited and range str.') # test invalid range zero_to_10_str = '0-10' zero_to_6_lst = [0, 1, 2, 3, 4, 5, 6] result = TimeWindow.parse_range(zero_to_10_str) self.assertEqual(zero_to_6_lst, result) # test invalid single eleven_str = '11' empty_lst = [] result = TimeWindow.parse_range(eleven_str) self.assertEqual(empty_lst, result)
def test_parse_range(self): """ Test that the parse_range method returns the correct list of ints """ # test comma-delimited one_three_five_str = '1,3,5' one_three_five_lst = [1, 3, 5] result = TimeWindow.parse_range(one_three_five_str) self.assertEqual(one_three_five_lst, result, msg='Could not parse comma-delimeted str.') # test range one_to_three_str = '1-3' one_to_three_lst = [1, 2, 3] result = TimeWindow.parse_range(one_to_three_str) self.assertEqual(one_to_three_lst, result, msg='Could not parse range str.') # test mix of commas and ranges one_three_four_to_six_str = '1,3,4-6' one_three_four_to_six_lst = [1, 3, 4, 5, 6] result = TimeWindow.parse_range(one_three_four_to_six_str) self.assertEqual(one_three_four_to_six_lst, result, msg='Could not parse mix of comma-delimited and range str.') # test invalid range zero_to_10_str = '0-10' zero_to_6_lst = [0, 1, 2, 3, 4, 5, 6] result = TimeWindow.parse_range(zero_to_10_str) self.assertEqual(zero_to_6_lst, result) # test invalid single eleven_str = '11' empty_lst = [] result = TimeWindow.parse_range(eleven_str) self.assertEqual(empty_lst, result)
def _parse_dependencies(self, action): """ Parse dependencies out of XML :type action: xml.etree.ElementTree.Element :rtype: list """ # TODO: rename 'path' when it really isn't a path. this is a hack... # prev_was_not keeps track of whether the outer class was 'not' dependencies = [] prev_was_not = False for predicate in action.iter('Predicate'): pred_type = predicate.get('type').lower() pred_path = predicate.get('path', None) # pred_oper = predicate.get('operational', False) pred_oper = bool( verify_attribute(predicate, 'operational', none_allowed=True)) if pred_type == PredicateType.ZOOKEEPERHASCHILDREN: dependencies.append({ 'type': pred_type, 'path': pred_path, 'operational': pred_oper }) prev_was_not = False elif pred_type == PredicateType.ZOOKEEPERHASGRANDCHILDREN: dependencies.append({ 'type': pred_type, 'path': pred_path, 'operational': pred_oper }) prev_was_not = False elif pred_type == PredicateType.ZOOKEEPERGOODUNTILTIME: if len(pred_path.split('gut/')) > 1: dependencies.append({ 'type': pred_type, 'path': ("I should be up between: {0}".format( pred_path.split("gut/")[1])), 'operational': pred_oper }) else: logging.debug('Invalid GUT path: {0}'.format(pred_path)) prev_was_not = False elif pred_type == PredicateType.HOLIDAY: dependencies.append({ 'type': pred_type, 'path': ("Does NOT run on holidays" if prev_was_not else "Runs on holidays"), 'operational': pred_oper }) prev_was_not = False elif pred_type == PredicateType.WEEKEND: dependencies.append({ 'type': pred_type, 'path': ("Does NOT run on weekends" if prev_was_not else "Runs on weekends"), 'operational': pred_oper }) prev_was_not = False elif pred_type == PredicateType.TIMEWINDOW: begin = predicate.get('begin', None) end = predicate.get('end', None) weekdays = predicate.get('weekdays', None) msg = 'I should be up ' if begin is not None: msg += 'after: {0} '.format(begin) if end is not None: msg += 'until: {0}'.format(end) # only send dependency if there is something to send if begin is not None or end is not None: dependencies.append({ 'type': pred_type, 'path': msg, 'operational': pred_oper }) # pretend this is a weekend predicate for convenience if weekdays is not None: day_range = TimeWindow.parse_range(weekdays) if Weekdays.SATURDAY in day_range or Weekdays.SUNDAY in day_range: wk_msg = 'Runs on weekends' else: wk_msg = 'Does NOT run on weekends' dependencies.append({ 'type': PredicateType.WEEKEND, 'path': wk_msg, 'operational': pred_oper }) elif pred_type == PredicateType.NOT: prev_was_not = True return dependencies