From c8e55528b85029b6ed3a2a5005a0d0ea2d5ada43 Mon Sep 17 00:00:00 2001 From: tyler Date: Sat, 16 Sep 2023 16:55:12 -0400 Subject: [PATCH] multiple ranges support --- docs/metadata/details/schedule.md | 4 ++-- modules/util.py | 31 +++++++++++++++++-------------- 2 files changed, 19 insertions(+), 16 deletions(-) diff --git a/docs/metadata/details/schedule.md b/docs/metadata/details/schedule.md index 8eee359c..7e2bd7ca 100644 --- a/docs/metadata/details/schedule.md +++ b/docs/metadata/details/schedule.md @@ -14,10 +14,10 @@ The scheduling options are: |:-------------|:-----------------------------------------------------------------------------------------------------------|:---------------------------------------------------|:-------------------------------------------------------------| | Hourly | Update only when the script is run in that hour or hour range | hourly(Hour of Day)
hourly(Start Hour-End Hour) | `hourly(17)`
`hourly(17-04)` | | Daily | Update once a day | daily | `daily` | -| Weekly | Update once a week on the specified days (For multiple days use a bar-separated (|) list | weekly(Days of Week) | `weekly(sunday)`
weekly(sunday|tuesday) | +| Weekly | Update once a week on the specified days (For multiple days, use a bar-separated (|) list)| weekly(Days of Week) | `weekly(sunday)`
weekly(sunday|tuesday) | | Monthly | Update once a month on the specified day | monthly(Day of Month) | `monthly(1)` | | Yearly | Update once a year on the specified day | yearly(MM/DD) | `yearly(01/30)` | -| Range | Updates whenever the date is within the range | range(MM/DD-MM/DD) | `range(12/01-12/31)` | +| Range | Updates whenever the date is within the range (For mulitple ranges, use a bar-separated (`\|`) list) | range(MM/DD-MM/DD) | `range(12/01-12/31)`
`range(8/01-8/15\|9/01-9/15)` | | Never | Never updates | never | `never` | | Non Existing | Updates if it doesn't exist | non_existing | `non_existing` | | All | Requires that all comma separated scheduling options inside its brackets be meet in order to run | all[Options] | `all[weekly(sunday), hourly(17)]` | diff --git a/modules/util.py b/modules/util.py index 994fea4f..c6725d8d 100644 --- a/modules/util.py +++ b/modules/util.py @@ -669,20 +669,23 @@ def schedule_check(attribute, data, current_time, run_hour, is_all=False): except ValueError: logger.error(f"Schedule Error: yearly {display} must be in the MM/DD format i.e. yearly(11/22)") elif run_time.startswith("range"): - match = re.match("^(1[0-2]|0?[1-9])/(3[01]|[12][0-9]|0?[1-9])-(1[0-2]|0?[1-9])/(3[01]|[12][0-9]|0?[1-9])$", param) - if not match: - logger.error(f"Schedule Error: range {display} must be in the MM/DD-MM/DD format i.e. range(12/01-12/25)") - continue - month_start, day_start = check_day(int(match.group(1)), int(match.group(2))) - month_end, day_end = check_day(int(match.group(3)), int(match.group(4))) - month_check, day_check = check_day(current_time.month, current_time.day) - check = datetime.strptime(f"{month_check}/{day_check}", "%m/%d") - start = datetime.strptime(f"{month_start}/{day_start}", "%m/%d") - end = datetime.strptime(f"{month_end}/{day_end}", "%m/%d") - range_collection = True - schedule_str += f"\nScheduled between {pretty_months[month_start]} {num2words(day_start, to='ordinal_num')} and {pretty_months[month_end]} {num2words(day_end, to='ordinal_num')}" - if start <= check <= end if start < end else (check <= end or check >= start): - all_check += 1 + ok_ranges = param.lower().split("|") + err = None + for ok_range in ok_ranges: + match = re.match("^(1[0-2]|0?[1-9])/(3[01]|[12][0-9]|0?[1-9])-(1[0-2]|0?[1-9])/(3[01]|[12][0-9]|0?[1-9])$", ok_range) + if not match: + logger.error(f"Schedule Error: range {display} must be in the MM/DD-MM/DD format i.e. range(12/01-12/25)") + continue + month_start, day_start = check_day(int(match.group(1)), int(match.group(2))) + month_end, day_end = check_day(int(match.group(3)), int(match.group(4))) + month_check, day_check = check_day(current_time.month, current_time.day) + check = datetime.strptime(f"{month_check}/{day_check}", "%m/%d") + start = datetime.strptime(f"{month_start}/{day_start}", "%m/%d") + end = datetime.strptime(f"{month_end}/{day_end}", "%m/%d") + range_collection = True + schedule_str += f"\nScheduled between {pretty_months[month_start]} {num2words(day_start, to='ordinal_num')} and {pretty_months[month_end]} {num2words(day_end, to='ordinal_num')}" + if start <= check <= end if start < end else (check <= end or check >= start): + all_check += 1 else: logger.error(f"Schedule Error: {display}") if is_all: