Autor: Jelena Lazović
Broj indeksa: 1045/2024
Kurs: Verifikacija Softvera
Click (Command Line Interface Creation Kit) je Python biblioteka otvorenog koda za kreiranje interfejsa komandne linije. Razvijena od strane Pallets tima, ista organizacija koja održava Flask web framework.
Osnovne informacije:
- Repository: https://github.com/pallets/click
- Jezik: Python 3.11+
- Analizirana grana:
main - Commit hash:
cdab890e57a30a9f437b88ce9652f7bfce980c1f
Projekat koristi 6 različitih alata za sveobuhvatnu analizu kvaliteta koda:
| # | Alat | Kategorija | Opis |
|---|---|---|---|
| 1 | Pytest | Testiranje | Jedinični testovi |
| 2 | Pylint | Statička analiza | Kvalitet koda |
| 3 | MyPy | Type checking | Type safety |
| 4 | Bandit | Security | Sigurnosne ranjivosti |
| 5 | Radon | Kompleksnost | Ciklomatska kompleksnost |
| 6 | Black | Formatiranje | Code style |
Napisano testova: 28 novih testova
Distribucija:
test_decorators_advanced.py: 4 testatest_utils_advanced.py: 11 testovatest_termui_advanced.py: 8 testovatest_types_advanced.py: 7 testova
Pokriveni scenariji:
- Nested command groups (3+ nivoa)
- Context propagacija između komandi
- Unicode handling (Ћирилица, 你好, مرحبا, emoji)
- File operacije
- Terminal UI (prompts, confirmations, progress bars)
- Type validation (File, Path, Bool, Tuple, Choice)
Status: Svi testovi prolaze (100% pass rate)
Komanda:
pytest unit_tests/ -vRezultati:
Baseline: 81% (postojeći Click testovi)
Final: 81% (Click + naši testovi)
Change: +0%
Analiza: Click već poseduje izuzetno kvalitetne testove sa 81% pokrivenosti, što je iznad industrijskog standarda (60-70%). Naši testovi validiraju funkcionalnost iz korisničke perspektive, ali testiraju iste putanje koje Click već pokriva.
Zaključak: Odsustvo povećanja pokrivenosti nije nedostatak analize, već pokazatelj visokog kvaliteta postojećih Click testova.
Komanda:
pytest click/tests/ unit_tests/ \
--cov=click/src/click \
--cov-report=html:reports/coverageRezultati:
Pylint Score: 8.87/10
Problemi po kategoriji:
| Kategorija | Broj | Procenat |
|---|---|---|
| Convention | 253 | 51.3% |
| Refactor | 126 | 25.6% |
| Warning | 112 | 22.7% |
| Error | 2 | 0.4% |
| Ukupno | 493 | 100% |
Najčešći problemi:
missing-function-docstring(76) - Funkcije bez docstring-auseless-import-alias(62) - Import aliasi (namerni re-export pattern)import-outside-toplevel(59) - Lazy loading patterntoo-many-arguments(29) - CLI priroda framework-aredefined-builtin(28) - Prirodna imena za CLI parametre
Analiza: Odličan kvalitet koda. Većina problema su stilske prirode ili false positives specifični za framework kod.
Komanda:
pylint click/src/click/ --reports=yRezultati:
Type Precision: 90.86%
Imprecision: 9.14%
Type Errors: 0
Lines Analyzed: 11,120 LOC
Analiza po modulima (najbolji/najgori):
Najbolji (100% precision):
formatting.py,_textwrap.py,_winconsole.py,__init__.py
Za poboljšanje (najviša imprecision):
_termui_impl.py(17.61%) - Platform-specific koddecorators.py(16.70%) - Generic decorators_compat.py(14.47%) - Compatibility layer
Analiza: Click demonstrira odličnu type safety sa 90.86% type precision. Većina nepreciznosti je u platform-specific i compatibility kodu što je očekivano.
Komanda:
mypy click/src/click/ --html-report reports/mypyRezultati:
Security Issues: 36
High: 0
Medium: 0
Low: 36
Najčešći problemi:
| Issue Type | Count | Severity |
|---|---|---|
assert_used (B101) |
13 | Low |
try_except_pass (B110) |
10 | Low |
subprocess_without_shell (B603) |
8 | Low |
blacklist subprocess (B404) |
4 | Low |
Analiza: Click nema kritične security probleme. Svi detektovani problemi su low severity i predstavljaju false positives ili prihvatljive obrasce u framework kodu.
Komanda:
bandit -r click/src/click/ -f txtRezultati:
Average Complexity: A (3.32)
Distribucija kompleksnosti:
| Grade | Range | Count | Procenat |
|---|---|---|---|
| A | 1-5 | 484 | 85.7% |
| B | 6-10 | 64 | 11.3% |
| C | 11-20 | 15 | 2.7% |
| D | 21-30 | 5 | 0.9% |
| E | 31-40 | 1 | 0.2% |
| F | >40 | 1 | 0.2% |
Najkompleksnije funkcije:
Option.__init__- F (47) - Konstruktor sa mnogo parametaraOption.get_help_extra- E (34) - Help formatiranjeContext.__init__- D (28) - Inicijalizacija konteksta
Dodatne metrike:
- Comment ratio: 26% (odlično)
Analiza: Izuzetno niska prosečna kompleksnost sa 85.7% funkcija grade A.
Komanda:
radon cc click/src/click/ -a -s
radon mi click/src/click/ -sRezultati:
Files Checked: 17
Properly Formatted: 15 (88.2%)
Need Reformatting: 2 (11.8%)
Fajlovi za reformatiranje:
testing.py- Union type annotationscore.py- Assert statements i type annotations
Analiza: Click je 88.2% Black-compliant. Samo 2 fajla imaju minorne formatting razlike koje su kozmetičke prirode.
Komanda:
black --check --diff click/src/click/-
Visok kvalitet postojećeg koda
- 81% test coverage (iznad standarda)
- 8.87/10 Pylint score
- 90.86% type precision
- 3.32 prosečna kompleksnost
-
Bezbednost
- 0 high/medium security issues
- Sve subprocess operacije bezbedne (shell=False)
- Nema hardcoded credentials
-
Održivost
- 85.7% funkcija sa niskom kompleksnošću
- 26% comment ratio
- Dobra dokumentacija
- Minor formatting inconsistencies - 2/17 fajlova (Black)
- Nedostajuća dokumentacija - 76 funkcija bez docstring-a
- Visoka kompleksnost - 7 funkcija (1.2%) sa D+ grade
Iako naši testovi nisu povećali numerički coverage, analiza je pružila:
- Validaciju kvaliteta postojećeg koda
- Potvrdu bezbednosti i održivosti
- Demonstraciju multi-tool pristupa verifikaciji
- Razumevanje da coverage nije jedina metrika kvaliteta
Svaki alat ima svoj direktorijum sa skriptom za pokretanje i rezultatima:
2026_Analysis_click/
├── README.md
├── ProjectAnalysisReport.md
├── click/ # Analizirani projekat (git submodul)
├── unit_tests/ # Jedinični testovi
├── screenshots/ # Screenshot-ovi rezultata
├── pytest/
│ ├── run_pytest.sh # Skripta za pokretanje
│ └── results/ # Rezultati
├── coverage/
│ ├── run_coverage.sh
│ └── results/
├── pylint/
│ ├── run_pylint.sh
│ └── results/
├── mypy/
│ ├── run_mypy.sh
│ └── results/
├── bandit/
│ ├── run_bandit.sh
│ └── results/
├── radon/
│ ├── run_radon.sh
│ └── results/
└── black/
├── run_black.sh
└── results/
# Pojedinačno - svaki alat iz svog direktorijuma
./pytest/run_pytest.sh
./coverage/run_coverage.sh
./pylint/run_pylint.sh
./mypy/run_mypy.sh
./bandit/run_bandit.sh
./radon/run_radon.sh
./black/run_black.sh