Thư mục gốc: 22 file .py -> 7
--------------------------------
13 file "thành phần" nằm rải rác ngay ngoài thư mục gốc, mỗi file chỉ có ĐÚNG
MỘT nơi import — chính cái hub của nó:
i18n.py + 10 file i18n_*.py -> i18n/__init__.py + i18n/*.py
theme.py + 3 file theme_*.py -> theme/__init__.py + theme/*.py
Đổi hub thành `__init__.py` nên 78 chỗ `from ..i18n import tr` và 24 chỗ
`from ..theme import current_palette` KHÔNG phải sửa một dòng nào. Git nhận ra
11/15 file là đổi tên thuần, 0 dòng thay đổi; 4 file còn lại chỉ sửa đúng dòng
import và mấy tham chiếu tên file trong docstring.
Đối chiếu với bản trước khi gom, cùng một phép băm:
số khoá i18n 1431 -> 1431 hash STRINGS a06cc34b... (trùng)
QSS dark hash 7bb230a4... (trùng)
QSS light hash 884f73ce... (trùng)
`check_loc.py` phải khai thêm "i18n", "theme" vào DEFAULT_TARGET_DIRS: chúng
từng được quét theo diện "module nằm ở thư mục gốc", gom vào gói rồi thì không
khai là lặng lẽ tuột khỏi tầm quét.
Bánh cóc `ui/widgets.py` siết 505 -> 466 sau khi tách SegmentedControl — nợ cũ
co lại thì con số phải co theo, không thì bánh cóc đứng yên mãi ở mức cũ.
Một file requirements
---------------------
Xoá `requirements-test.txt`. Nó chỉ có `pytest` + `pydantic`, nhưng 64/108 file
test dựng widget thật và 20 file trong đó import PySide6 thẳng ở đầu file không
có bảo vệ — nên CI cài mỗi file kia thì pytest chết ngay lúc thu thập test chứ
không phải "vài test bị bỏ qua". Hai file cho một danh sách gần trùng nhau chỉ
tạo thêm một chỗ để lệch phiên bản, và `pydantic` đã bị chép ở cả hai.
CI đổi sang cài `requirements.txt`. Người dùng cuối cài thừa pytest vài MB.
Kèm theo: `install.bat` bỏ cờ `--dev` (không còn gì để cài thêm). Khối `if`
rỗng còn sót lại làm cmd.exe báo "( was unexpected at this time" và script chết
ngay sau bước cài thư viện — đã gỡ hẳn.
859 test xanh · 4/4 cổng CASAN · check_design_parity 32/32 ·
check_layout_geometry trùng từng byte với bản trước refactor.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
95 lines
3.6 KiB
YAML
95 lines
3.6 KiB
YAML
name: CI
|
|
|
|
on:
|
|
push:
|
|
branches:
|
|
- main
|
|
pull_request:
|
|
branches:
|
|
- main
|
|
|
|
jobs:
|
|
test:
|
|
runs-on: ubuntu-latest
|
|
timeout-minutes: 15
|
|
defaults:
|
|
run:
|
|
working-directory: cowork_local
|
|
env:
|
|
# Tiến trình con của test import `cowork_local` qua đường này.
|
|
PYTHONPATH: ${{ github.workspace }}
|
|
steps:
|
|
# Checkout PHẢI nằm trong thư mục tên đúng `cowork_local`.
|
|
# Nhiều test characterization sinh tiến trình con chạy
|
|
# `python -c "from cowork_local... import ..."`; tiến trình con đó chỉ
|
|
# import được khi trên sys.path có một thư mục mang đúng tên gói. Checkout
|
|
# vào thư mục tên khác làm 73 test đỏ vì lý do không liên quan tới mã.
|
|
- name: Check out source
|
|
uses: actions/checkout@v4
|
|
with:
|
|
path: cowork_local
|
|
|
|
- name: Set up Python
|
|
uses: actions/setup-python@v5
|
|
with:
|
|
python-version: "3.11"
|
|
cache: pip
|
|
cache-dependency-path: cowork_local/requirements.txt
|
|
|
|
# Mot file duy nhat: requirements-test.txt cu chi co pytest, nhung
|
|
# 64/108 file test dung widget that (20 file import PySide6 thang o dau
|
|
# file, khong co bao ve) nen no van phai keo ve gan nhu ca danh sach
|
|
# runtime. Cai rieng file kia thi pytest chet ngay luc thu thap test.
|
|
- name: Install dependencies
|
|
run: python -m pip install --disable-pip-version-check -r requirements.txt
|
|
|
|
- name: Check Python syntax
|
|
run: |
|
|
python - <<'PY'
|
|
from pathlib import Path
|
|
|
|
files = list(Path(".").rglob("*.py"))
|
|
for path in files:
|
|
compile(path.read_text(encoding="utf-8"), str(path), "exec")
|
|
print(f"Parsed {len(files)} Python files")
|
|
PY
|
|
|
|
- name: Run tests
|
|
run: python -m pytest tests -q
|
|
|
|
# --- CASAN Verification Gate -------------------------------------
|
|
# Ba check này là điều kiện của cổng ngày 30/08. Chạy trên MỌI PR để
|
|
# biết vi phạm ngay hôm phát sinh, thay vì dồn tới ngày cổng.
|
|
#
|
|
# Check 1 do Team Gamma sở hữu và đã có. Check 2 (Team Hoa) và Check 3
|
|
# (Team Duy) chưa viết — bước dưới bỏ qua nếu script chưa tồn tại, để
|
|
# thêm cổng không làm đỏ CI của hai team kia.
|
|
|
|
- name: "CASAN Check 1 — không có credential lộ (Team Gamma)"
|
|
run: |
|
|
python scripts/audit_security.py --self-test
|
|
python scripts/audit_security.py
|
|
|
|
- name: "CASAN Check 2 — file production ≤ 400 dòng (Team Hoa)"
|
|
run: |
|
|
if [ -f scripts/check_loc.py ]; then
|
|
python scripts/check_loc.py
|
|
else
|
|
echo "scripts/check_loc.py chưa có — Team Hoa viết, hạn 30/08. Bỏ qua."
|
|
fi
|
|
|
|
- name: "CASAN Check 3 — domain/ và application/ không import PySide6 (Team Duy)"
|
|
run: |
|
|
if [ -f scripts/check_imports.py ]; then
|
|
python scripts/check_imports.py
|
|
else
|
|
echo "scripts/check_imports.py chưa có — Team Duy viết, hạn 30/08. Bỏ qua."
|
|
fi
|
|
|
|
# Cổng O bổ sung sau đợt đối chiếu AS-IS/TO-BE: ba check trên đều không
|
|
# bắt được mã chết (file không ai import vẫn đúng chiều phụ thuộc, vẫn
|
|
# sạch credential, vẫn dưới 400 dòng). Đợt đó tìm ra 1.400 dòng mã trùng
|
|
# lặp chết lọt qua đúng theo cách này.
|
|
- name: "CASAN Check O — module production phải có nơi import"
|
|
run: python scripts/check_orphan_modules.py
|