Ачааллж байна...
Энэ сургалтын эцсийн Бүлэгт тавтай морил. Арван нэгэн Бүлгийн туршид бид олон хэрэгсэл, олон дадлыг тус тусад нь сурсан: Git-ийн commit ба салаа, GitHub-ийн pull ба push, issue ба pull request, pytest-ийн тестүүд, debugger, logging, black, ruff, нэршил, docstring. Хичээл бүр нэг хэрэгсэлд төвлөрч байсан. Гэхдээ мэргэжлийн хөгжүүлэгчийн өдөр хэрэгслүүдээр хуваагддаггүй. Тэр нэг ажлыг эхнээс дуустал хийхдээ эдгээр бүх хэрэгслийг тогтсон дарааллаар, бараг бодолгүйгээр хэрэглэдэг. Энэ дарааллыг өдөр тутмын давталт гэж нэрлэе.
Энэ хичээл түүх хэлбэртэй. Бид нэг ажлын өдрийг, зарлагын бүртгэлд нэг жижиг боломж нэмэх ажлыг, эхнээс нь дуустал хамтдаа туулна. Алхам бүрт аль хичээлийн дадал хэрэглэгдэж байгааг заана. Шинэ command бараг байхгүй: бүх зүйл танд аль хэдийн танил. Шинэ нь зөвхөн тэдгээрийн дараалал, тэдгээрийг нэг урсгал болгон холбох явдал. Түүхийн төгсгөлд давталтыг хураангуйлж, түүнийг автоматжуулдаг CI гэдэг ойлголтыг нэг шударга догол мөрөөр танилцуулна.
Олон мянган цаг ниссэн, туршлагатай нисгэгч ч нислэг бүрийн өмнө шалгах хуудсыг мөр мөрөөр нь уншиж, шалгадаг. Тэр түлшийг, тоормосыг, хөдөлгүүрийг хэрхэн шалгахыг мэддэг, гэхдээ шалгах хуудас түүнийг мэдлэгээр биш, дарааллаар хамгаалдаг. Ядарсан, яарсан, анхаарал сарнисан өдөр ч нэг ч алхам алгасагдахгүй. Нисэхийн аюулгүй байдлын судлаачид шалгах хуудсыг нисэхийн түүхэн дэх хамгийн энгийн бөгөөд хамгийн үр дүнтэй шинэчлэлүүдийн нэг гэж үздэг.
Өдөр тутмын давталт бол таны шалгах хуудас. Эхэндээ та түүнийг ухамсартайгаар дагана, магадгүй энэ хичээлийг нээгээд. Хэдэн долоо хоногийн дараа тэр дадал болж, гар тань өөрөө “git pull” бичиж, commit-ын өмнө “pytest” ажиллуулдаг болно. Гэхдээ ядарсан өдөр ч, яаралтай засвар хийж байхдаа ч дараалал таныг хамгаална: дадал болсон давталт алдаа гарахаас өмнө түүнийг барьдаг.
Түүхийг эхлэхээс өмнө зарлагын бүртгэлд давталтын бүх хэрэгсэл байгаа эсэхийг шалгая. Хэрвээ та 11.1 ба 11.2 дугаар хичээлүүдийн "туршаад үзээрэй" хэсгүүдэд black, ruff-ийг зарлагын бүртгэлд аль хэдийн нэмсэн бол энэ хэсгийг алгасаарай.
Гэрийн компьютерийн expense-tracker фолдероо VS Code-д нээж, venv-ээ идэвхжүүлнэ үү. Хэрэгслүүдийг суулгана.
Command:
pip install black ruffrequirements-dev.txt-д хоёр мөр нэмж, файл ингэж харагдах ёстой.
pytest
black
ruffТөслийн үндсэнд 11.2 дугаар хичээлийн pyproject.toml-ийг үүсгэнэ үү.
toml
[tool.ruff]
output-format = "concise"
[tool.ruff.lint]
select = ["E", "F", "B", "I"]Энэ бэлтгэлийг өөрийн давталтаар, салаа ба pull request-ээр, нэгтгэх нь хамгийн зөв. Гэхдээ энэ хичээлийн гол түүхэд анхаарлаа хандуулахын тулд эдгээр файлууд main дээр аль хэдийн commit хийгдсэн, push хийгдсэн гэж үзье. Хэрвээ хараахан хийгээгүй бол git add requirements-dev.txt pyproject.toml, git commit -m "Add black and ruff", git push хийнэ үү.
Өглөө: эхлэлийн шалгалт
Мягмар гарагийн өглөө. Та компьютерээ асааж, зарлагын бүртгэлийн төслийг нээлээ. Өчигдөр ажил дээрээ, өөр компьютер дээр, жижиг засвар хийсэн байж магадгүй. Хамгийн түрүүнд 4.4 дүгээр хичээлийн дадал: ажил эхлэхийн өмнө pull.
Command:
git switch main
git pull
git statusГаралт (сүүлийн мөрүүд):
On branch main
Your branch is up to date with 'origin/main'.
nothing to commit, working tree cleanmain дээр, GitHub-тай ижил, ажлын фолдер цэвэр. Одоо шинэ дадал, гэхдээ маш энгийн: ямар нэг юм өөрчлөхөөсөө өмнө тестүүдийг ажиллуулна.
Command:
pytestГаралт (сүүлийн мөр):
============================= 23 passed in 0.05s ==============================Яагаад ажил эхлэхээс өмнө? Хэрвээ таны өөрчлөлтийн дараа тест унавал та тэр уналтыг өөрийн өөрчлөлтөөс болсон гэж бодно. Гэтэл тест өглөөнөөс аль хэдийн унаж байсан бол? Та өөрийн кодонд байхгүй алдааг хайж цаг үрнэ. Эхлэлийн ногоон тайлан бол таны баазын шугам: "ажил эхлэхэд бүх зүйл ажиллаж байсан". 10.1 дүгээр хичээлийн хүрээг нарийсгах аргын нэг хэлбэр: хэрвээ дараа нь ямар нэг юм эвдэрвэл шалтгаан таны өнөөдрийн өөрчлөлтөд байна. Таны тестийн тоо өөр байж болно.
Ажлаа сонгох
Ямар ажил хийх вэ? 6.1 дүгээр хичээлийн дадлаар ажил issue-ээс эхэлдэг. Өчигдөр та "хамгийн их зарлагаа харах боломжтой бол сайн байна" гэж бодоод issue нээсэн гэж үзье. Хэрвээ хараахан нээгээгүй бол одоо GitHub дээр нээнэ үү.
Гарчиг: “Show the largest expense”, тайлбар: “Print the single largest expense in the summary, with its category.” Шошго: enhancement. Энэ issue #7 дугаартай болно, таных өөр байж болно.
Салаа
3.2 дугаар хичээлийн дадал: шинэ ажил бүр өөрийн салаан дээр.
Command:
git switch -c largest-expenseГаралт:
Switched to a new branch 'largest-expense'Тестээс эхлэх
9.3 дугаар хичээлд тестийг функцээс өмнө бичих аргыг туршсан. Одоо түүнийг давталтын нэг хэсэг болгоё: юу хийх ёстойгоо эхлээд тестээр хэлнэ. tests\test_report.py-ийн import мөрийг дараах байдлаар нэг мөрөнд өөрчилнө үү, хэлбэрийн тухай санаа зовох хэрэггүй.
python
from report import average, count, filter_by_category, largest_expense, total, total_by_categoryФайлын төгсгөлд хоёр тест нэмнэ үү.
python
def test_largest_expense(sample_expenses):
assert largest_expense(sample_expenses) == {"amount": 12000, "category": "унаа"}
def test_largest_expense_empty():
assert largest_expense([]) is NoneГэрээ тодорхой: хамгийн их дүнтэй зарлагыг бүтнээр нь буцаана, зарлага байхгүй бол None. Хоосон жагсаалтын тест бол 6.1 дүгээр хичээлээс хойш бидний мартдаггүй хил дээрх тохиолдол.
Command:
pytestГаралт (гол хэсэг):
E ImportError: cannot import name 'largest_expense' from 'report' (C:\Users\Bat\expense-tracker\report.py)
=========================== short test summary info ===========================
ERROR tests/test_report.py
!!!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!!Хүлээгдэж буй улаан: функц хараахан байхгүй.
Код
report.py-ийн төгсгөлд функц нэмнэ үү, 11.4 дүгээр хичээлийн дадлаар docstring-тэй.
python
def largest_expense(expenses):
"""Return the expense with the largest amount, or None if there are none."""
if not expenses:
return None
return max(expenses, key=lambda e: e["amount"])max() жагсаалтын хамгийн их элементийг олдог. key параметр нь "юугаар харьцуулах вэ" гэдгийг заана: зарлага бүрийн “amount”-аар. lambda бол өмнөх сургалтаас мэдэх нэргүй жижиг функц. Хоосон жагсаалтад max() алдаа гаргадаг тул эхний хоёр мөр түүнээс өмнө None буцаана.
Command:
pytestГаралт (сүүлийн мөр):
============================= 25 passed in 0.05s ==============================Ногоон. Хорин гурван хуучин тест болон хоёр шинэ тест бүгд давсан: шинэ функц ажиллаж байгаа, хуучин юу ч эвдрээгүй.
Одоо программд ашиглая. main.py-д дунджийн мөрийн дараа нэмнэ үү. Import мөрөнд largest_expense нэмэхээ мартахгүй.
python
largest = largest_expense(expenses)
if largest:
print("Хамгийн их зарлага:", format_amount(largest["amount"]), largest["category"])Command:
python main.pyГаралт:
Нийт зарлага: 20,500₮
Нийт бичлэг: 3 ширхэг
Дундаж зарлага: 6,833₮
Хамгийн их зарлага: 12,000₮ унаа
Ангиллаар:
хоол: 8,500₮
унаа: 12,000₮Шинэ мөр гарч ирсэн. 5.1 дүгээр хичээлийн дадлаар README-ийн “Features” хэсэгт “Prints the largest expense” мөр нэмж, “Example output” хэсгийг шинэ гаралтаар шинэчилнэ үү.
Чанарын шалгалт
Код ажиллаж байна, тест ногоон. Commit хийхээсээ өмнө 11.2 дугаар хичээлийн дараалал: ruff, black, pytest.
Command:
ruff check --fix .Гаралт:
All checks passed!Command:
black .Гаралт:
reformatted C:\Users\Bat\expense-tracker\tests\test_report.py
All done!
1 file reformatted, 9 files left unchanged.black нэг файлыг хэлбэржүүллээ. Аль хэсгийг? test_report.py-ийн import мөр: бид түүнийг нэг урт мөрөнд бичсэн бөгөөд тэр 88 тэмдэгтээс давсан. black түүнийг 11.1 дүгээр хичээлд үзсэн шиг хаалтанд хийж, нэр бүрийг тусдаа мөрөнд хуваасан. Бид хэлбэрийн тухай огт бодолгүй бичсэн, black цэгцэлсэн: энэ бол давталтын хуваарь. Файлуудын тоо таны төслийн бүтцээс хамаараад өөр байж болно.
Command:
pytestГаралт (сүүлийн мөр):
============================= 25 passed in 0.05s ==============================Хэлбэржүүлэлтийн дараа ч ногоон.
Өөрийгөө хянах
Commit-ын өмнөх сүүлийн алхам: юу commit хийх гэж байгаагаа нүдээрээ харах. 2.3 дугаар хичээлийн дадал.
Command:
git status
git diffgit status гурван өөрчлөгдсөн файлыг харуулна: main.py, report.py, tests/test_report.py, мөн README.md. git diff-ийг 2.3 дугаар хичээлийн аргаар уншаарай. Энэ удаад 10.1 дүгээр хичээлийн нэг зөвлөгөөг онцгой анхаараарай: DEBUG мөр, түр print, санамсаргүй үлдсэн зүйл байна уу? Бүх “+” мөр санаатай юу? Diff тань та бодож байгаа зүйлийг яг хэлж байна уу?
Commit
2.2 дугаар хичээлийн "нэг commit нэг утга бүхий өөрчлөлт" зарчмаар ажлыг хоёр commit болгоё: эхнийх нь функц ба түүний тест, хоёр дахь нь программд ашиглах ба баримт бичиг.
Command:
git add report.py tests\test_report.py
git commit -m "Add largest_expense function"
git add main.py README.md
git commit -m "Show largest expense in summary"Гаралт:
[largest-expense 4e1a7c3] Add largest_expense function
2 files changed, 22 insertions(+), 1 deletion(-)
[largest-expense b90d256] Show largest expense in summary
2 files changed, 6 insertions(+), 2 deletions(-)Таны тоонууд өөр байж болно.
Push ба pull request
6.2 дугаар хичээлийн мөчлөг.
Command:
git push -u origin largest-expenseGitHub дээр “Compare & pull request”, чиглэлийг шалгаж, тайлбарт бичнэ үү.
markdown
Adds `largest_expense()` and prints the largest expense in the summary.
Returns None for an empty list. Tests and README updated.
Closes #7Pull request үүсгээд, Files changed табд 6.2 дугаар хичээлийн редакторын нүдээр уншаад, 9.3 дугаар хичээлийн нэмэлт асуултаар шалгана: тест бүр функц буруу ажиллавал унах уу? Бэлэн бол merge, delete branch.
Өдрийн төгсгөл
Command:
git switch main
git pull
git branch -d largest-expense
git fetch --prune
pytest
git statusГаралт (сүүлийн мөрүүд):
============================= 25 passed in 0.05s ==============================
On branch main
Your branch is up to date with 'origin/main'.
nothing to commit, working tree cleanmain дээр, GitHub-тай ижил, ажлын фолдер цэвэр, бүх тест ногоон. Issue #7 автоматаар хаагдсан. Өдөр өглөөнийх шигээ цэвэр байдалтай дууслаа, гэхдээ таны программ нэг шинэ боломжтой, тестэд хамгаалагдсан, баримтжсан, GitHub дээр хадгалагдсан болсон. Хэрвээ компьютер тань өнөө шөнө эвдэрвэл ч өнөөдрийн ажил алдагдахгүй.
Түүхийг шалгах хуудас болгон нэгтгэе.
ӨГЛӨӨ
git switch main
git pull # 4.4: ажил эхлэхийн өмнө pull
git status # цэвэр үү?
pytest # баазын шугам: бүх зүйл ажиллаж байна уу?
АЖИЛ БҮРТ
# issue сонгох эсвэл нээх # 6.1
git switch -c салааны-нэр # 3.2
# тест бичих → pytest (улаан) # 9.3
# код бичих → pytest (ногоон)
# программыг ажиллуулж шалгах
# README, docstring # 5.1, 11.4
ruff check --fix . # 11.2
black . # 11.1
pytest # хэлбэржүүлэлтийн дараа
git status
git diff # 2.3: юу commit хийх гэж байна вэ?
git add ... ; git commit -m "..." # 2.2: жижиг, утга бүхий
git push -u origin салааны-нэр # 6.2
# pull request: "Closes #N", өөрийгөө хянах, merge, delete branch
git switch main
git pull
git branch -d салааны-нэр
git fetch --prune
ӨДРИЙН ТӨГСГӨЛД
git status # бүх зүйл commit, push хийгдсэн үү?Энэ хуудас урт мэт харагдаж болох ч бодит хугацаагаар "АЖИЛ БҮРТ" хэсгийн хэрэгслийн command-ууд хамтдаа хэдхэн секунд. Цаг нь код бичих, бодоход л ордог. Өдөрт хэд хэдэн жижиг давталт хийх нь нэг том давталтаас хавьгүй дээр: жижиг салаа хурдан нэгтгэгддэг, 3.3 дугаар хичээлийн conflict-ийн эрсдэл бага, pull request-ийг хянахад хялбар.
Нэг шударга догол мөр. Дээрх давталтын нэг хэсэг, ruff, black, pytest, хүнээс хамааралтай: та тэдгээрийг ажиллуулахаа мартаж болно. Мэргэжлийн багууд энэ хэсгийг автоматжуулдаг бөгөөд үүнийг CI буюу continuous integration гэдэг. CI бол салаа push хийгдэх эсвэл pull request нээгдэх бүрт тусдаа сервер дээр таны тестүүд, шалгалтуудыг автоматаар ажиллуулж, үр дүнг pull request-ийн хуудсанд ногоон тэмдэг эсвэл улаан загалмайгаар харуулдаг систем юм. 6.2 дугаар хичээлд pull request-ийн “Checks” табыг "одоохондоо хоосон" гэж дурдсан: CI тохируулсны дараа яг тэнд ажиллана. GitHub-д энэ үйлчилгээг GitHub Actions гэдэг бөгөөд тохиргоо нь repository доторх тусгай фолдерт байрлах жижиг файл. Мөн commit хийх мөчид шалгалтуудыг өөрийн компьютер дээр автоматаар ажиллуулдаг pre-commit hooks гэдэг хэрэгсэл ч бий. Энэ сургалт эдгээрийг заахгүй, учир нь тэдгээр нь давталтыг ойлгосны дараа л утгатай болдог: CI бол таны гараар хийж сурсан давталтын автомат хувилбар, түүнийг орлогч биш. Гараар хийж чаддаг хүн CI-ийн улаан загалмайг уншиж, засаж чадна.
Хүсвэл давталтыг өөр нэг жижиг ажил дээр бүхэлд нь, шалгах хуудсаа харж байгаад давтаарай. Жишээ нь хамгийн бага зарлагыг харуулах, эсвэл ангиллын нийт дүнг ихээс бага руу эрэмбэлэх. Эхнээс нь дуустал, issue-ээс эхлээд өдрийн төгсгөлийн git status хүртэл хэр хугацаа зарцуулснаа тэмдэглээрэй. Дараа нь гурав дахь удаагаа хийж, хугацааг харьцуулаарай. Ихэнх хүн гурав дахь удаад шалгах хуудсыг бараг харахгүй болдог: давталт дадал болж эхэлж байна гэсэн үг.
Өглөөний pull-ийг алгасах. Хэрвээ өөр газар хийсэн өөрчлөлтийг татахгүйгээр ажил эхэлбэл 4.4 дүгээр хичээлийн татгалзсан push эсвэл conflict таныг хүлээж байна. Өглөөний эхний хоёр command хамгийн хямд даатгал.
Баазын шугамын тестийг алгасах. Ажил эхлэхээс өмнө pytest ажиллуулаагүй бол дараа нь гарсан уналт таны өөрчлөлтөөс болсон уу, эсвэл өглөөнөөс байсан уу гэдгийг мэдэхгүй. Энэ нь 10.1 дүгээр хичээлийн debugging-ийг хэрэггүй хүндрүүлнэ.
Хэлбэржүүлэлтийг commit-ын дараа хийх. Хэрвээ black ба ruff-ийг commit хийсний дараа ажиллуулбал хэлбэржүүлэлтийн өөрчлөлтүүд тусдаа, утгагүй commit болно, эсвэл 2.5 дугаар хичээлийн amend шаардана. Дараалал чухал: эхлээд чанарын шалгалт, дараа нь commit.
main дээр шууд ажиллах. Давталтын бүх хамгаалалт салаан дээр ажиллахад тулгуурладаг. main дээр санамсаргүй ажил эхэлсэн бол 6.2 дугаар хичээлийн түгээмэл алдаануудын зөвлөгөөг санаарай. VS Code-ийн зүүн доод булан бол таны хамгийн энгийн хамгаалалт.
Хэт урт давталт. Хэдэн өдөр, хэдэн арван файлыг хамарсан нэг салаа нэгтгэхэд хэцүү, хянахад хэцүү, conflict ихтэй. Хэрвээ ажил том бол түүнийг хэдэн жижиг issue, хэдэн жижиг давталтад хуваагаарай: issue-ийн хайрцагтай жагсаалт, 9.3 дугаар хичээлийн арга, үүнд тусална.
Өдрийн төгсгөлд push хийхээ мартах. Commit хийсэн ч push хийгээгүй ажил зөвхөн таны компьютер дээр байна. 4.1 дүгээр хичээлд хэлсэнчлэн GitHub зөвхөн таны илгээсэн зүйлийг хадгалдаг. Өдрийн төгсгөлийн git status “ahead of ‘origin/main’” гэж хэлж байвал гэр лүүгээ явахаасаа өмнө push хий.
Өдөр тутмын давталт бол энэ сургалтын бүх хэрэгслийг нэг ажилд тогтсон дарааллаар холбодог шалгах хуудас бөгөөд нисгэгчийн шалгах хуудас шиг мэдлэгээр биш, дарааллаар хамгаалдаг. Өглөө: main руу шилжиж pull, цэвэр байдлыг шалгах, баазын шугам болгон pytest. Ажил бүрт: issue, салаа, эхлээд тест (улаан), дараа нь код (ногоон), программыг ажиллуулах, README ба docstring, ruff check --fix, black, дахин pytest, git status ба git diff-ээр өөрийгөө хянах, жижиг утга бүхий commit-ууд, push, “Closes #N” бүхий pull request, хянах, merge, local-ыг шинэчилж цэвэрлэх. Өдрийн төгсгөлд: бүх зүйл push хийгдсэн эсэхийг шалгах. Өдөрт хэд хэдэн жижиг давталт нэг том давталтаас дээр. CI нь энэ давталтын шалгалтуудыг сервер дээр автоматаар ажиллуулдаг бөгөөд GitHub-д GitHub Actions гэж нэрлэгддэг, гэхдээ тэр нь гараар хийж сурсан давталтын автомат хувилбар, орлогч биш.
Дараагийн хичээл бол энэ сургалтын эцсийн удирдлагатай бүтээл. Бид цоо шинэ жижиг хэрэгслийг хоосон фолдероос эхлээд GitHub дээр нийтлэгдсэн, тестэд хамгаалагдсан, баримтжсан төсөл болтол энэ сургалтын бүх дадлыг хэрэглэн бүтээнэ. Энэ бол жижиг хэмжээний төгсөлтийн ажил юм.
Бүртгэлтэй болсноор энэ сургалтын бүх хичээлд хандах эрх авна.