## Summary epic r04 - begin refactor ## Change Type - [x] Cowork feature - [ ] Bug fix - [ ] Core AI contribution - [ ] Test / hardening - [ ] Performance - [ ] Documentation ## Related Work Cowork Task: Core Repo: http://34.143.229.138/gitea-admin/fsg-ai-core-assets Core AI Issue: Core Task: Related PR: ## Scope What is intentionally included? What is intentionally NOT included? ## Validation - [ ] Unit tests - [ ] Integration tests - [ ] Manual verification - [ ] Regression check Commands / evidence: ## Security Impact Permission / credential / network / customer data impact: ## Compatibility - [ ] No breaking change - [ ] Breaking change documented ## Reviewer Notes Anything Cowork reviewers should pay attention to. --------- Co-authored-by: Anh Tran Nguyen Minh <anhtnm1@fpt.com> Co-authored-by: Huong Le Thi Thien <huongltt35@fpt.com> Co-authored-by: Nam Pham Dinh Thanh <nampdt@fpt.com> Co-authored-by: Vu Dam Tuan <vudt15@fpt.com> Co-authored-by: Hiep Ha Van <hiephv3@fpt.com> Co-authored-by: Lam Hoang Van <lamhv7@fpt.com> Reviewed-on: #7 Co-authored-by: Duy Le Huu <duylh19@fpt.com>
This commit was merged in pull request #7.
This commit is contained in:
@@ -15,10 +15,14 @@ _SEARCH_DAYS = 366 * 2 # give up after two years (an expression that never fir
|
||||
|
||||
|
||||
class CronError(ValueError):
|
||||
"""Biểu thức cron sai cú pháp."""
|
||||
pass
|
||||
|
||||
|
||||
def _parse_field(spec: str, lo: int, hi: int) -> Set[int]:
|
||||
"""Đọc một trường cron thành tập giá trị: hỗ trợ ``*``, danh sách ``a,b``,
|
||||
khoảng ``a-b`` và bước ``*/n``.
|
||||
"""
|
||||
values: Set[int] = set()
|
||||
for part in spec.split(","):
|
||||
part = part.strip()
|
||||
@@ -55,7 +59,13 @@ def _parse_field(spec: str, lo: int, hi: int) -> Set[int]:
|
||||
|
||||
|
||||
class Cron:
|
||||
"""Biểu thức cron 5 trường (phút, giờ, ngày, tháng, thứ)."""
|
||||
def __init__(self, expression: str):
|
||||
"""Phân tích một biểu thức cron 5 trường.
|
||||
|
||||
Sai số trường là ném ``CronError`` ngay tại đây chứ không đợi tới lúc chạy:
|
||||
lịch sai giờ khó phát hiện hơn nhiều so với một lỗi lúc nhập.
|
||||
"""
|
||||
fields = (expression or "").split()
|
||||
if len(fields) != 5:
|
||||
raise CronError("Cron expression needs exactly 5 fields: "
|
||||
@@ -69,6 +79,11 @@ class Cron:
|
||||
self._dow_star = fields[4].strip() == "*"
|
||||
|
||||
def _day_matches(self, dt: datetime) -> bool:
|
||||
"""Ngày này có khớp biểu thức không.
|
||||
|
||||
Theo chuẩn cron: khi cả trường NGÀY và trường THỨ đều được đặt cụ thể thì
|
||||
khớp một trong hai là đủ (OR), chứ không phải cả hai (AND).
|
||||
"""
|
||||
if dt.month not in self.months:
|
||||
return False
|
||||
cron_dow = (dt.weekday() + 1) % 7 # Python Mon=0 → cron Sun=0
|
||||
|
||||
Reference in New Issue
Block a user