Skip to content

Commit

Permalink
fix(ext/cron): automatically override unspecified values (#22042)
Browse files Browse the repository at this point in the history
Fixes #22041
  • Loading branch information
Igor Zinkovsky authored Jan 24, 2024
1 parent 4762064 commit 46b91ec
Show file tree
Hide file tree
Showing 2 changed files with 87 additions and 1 deletion.
67 changes: 67 additions & 0 deletions cli/tests/unit/cron_test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -391,3 +391,70 @@ Deno.test("error on two handlers", () => {
"Deno.cron requires a single handler",
);
});

Deno.test("Parse test", () => {
assertEquals(
parseScheduleToString({
minute: 3,
}),
"3 * * * *",
);
assertEquals(
parseScheduleToString({
hour: { every: 2 },
}),
"0 */2 * * *",
);
assertEquals(
parseScheduleToString({
dayOfMonth: { every: 10 },
}),
"0 0 */10 * *",
);
assertEquals(
parseScheduleToString({
month: { every: 3 },
}),
"0 0 1 */3 *",
);
assertEquals(
parseScheduleToString({
dayOfWeek: { every: 2 },
}),
"0 0 * * */2",
);
assertEquals(
parseScheduleToString({
minute: 3,
hour: { every: 2 },
}),
"3 */2 * * *",
);
assertEquals(
parseScheduleToString({
dayOfMonth: { start: 1, end: 10 },
}),
"0 0 1-10 * *",
);
assertEquals(
parseScheduleToString({
minute: { every: 10 },
dayOfMonth: { every: 5 },
}),
"*/10 * */5 * *",
);
assertEquals(
parseScheduleToString({
hour: { every: 3 },
month: { every: 2 },
}),
"0 */3 * */2 *",
);
assertEquals(
parseScheduleToString({
minute: { every: 5 },
month: { every: 2 },
}),
"*/5 * * */2 *",
);
});
21 changes: 20 additions & 1 deletion ext/cron/01_cron.ts
Original file line number Diff line number Diff line change
Expand Up @@ -62,14 +62,33 @@ export function parseScheduleToString(
if (typeof schedule === "string") {
return schedule;
} else {
const {
let {
minute,
hour,
dayOfMonth,
month,
dayOfWeek,
} = schedule;

// Automatically override unspecified values for convenience. For example,
// to run every 2 hours, `{ hour: { every: 2 } }` can be specified without
// explicitely specifying `minute`.
if (minute !== undefined) {
// Nothing to override.
} else if (hour !== undefined) {
// Override minute to 0 since it's not specified.
minute = 0;
} else if (dayOfMonth !== undefined || dayOfWeek !== undefined) {
// Override minute and hour to 0 since they're not specified.
minute = 0;
hour = 0;
} else if (month !== undefined) {
// Override minute and hour to 0, and dayOfMonth to 1 since they're not specified.
minute = 0;
hour = 0;
dayOfMonth = 1;
}

return formatToCronSchedule(minute) +
" " + formatToCronSchedule(hour) +
" " + formatToCronSchedule(dayOfMonth) +
Expand Down

0 comments on commit 46b91ec

Please sign in to comment.