Architecture β kwork-api¶
π ΠΠ±Π·ΠΎΡ¶
kwork-api β Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΡΠΉ Python ΠΊΠ»ΠΈΠ΅Π½Ρ Π΄Π»Ρ Kwork.ru API Ρ ΠΏΠΎΠ»Π½ΠΎΠΉ ΡΠΈΠΏΠΈΠ·Π°ΡΠΈΠ΅ΠΉ ΠΈ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠ΅ΠΉ.
ποΈ ΠΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ°¶
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β User Application β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β KworkClient β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Authentication Layer β β
β β - login() / token auth β β
β β - Session management β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β API Groups β β
β β - catalog, projects, user, reference, ... β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β HTTP Layer (httpx) β β
β β - HTTP/2 support β β
β β - Timeout handling β β
β β - Error handling β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Kwork.ru API (HTTPS) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
π Π‘ΡΡΡΠΊΡΡΡΠ° ΠΏΡΠΎΠ΅ΠΊΡΠ°¶
kwork-api/
βββ src/kwork_api/
β βββ __init__.py # Public API
β βββ client.py # KworkClient + API groups
β βββ models.py # Pydantic models
β βββ errors.py # Exception classes
β
βββ tests/
β βββ test_client.py # Client tests
β βββ test_models.py # Model tests
β βββ test_all_endpoints.py # Endpoint tests
β
βββ docs/
β βββ index.md # Quick start
β βββ api-reference.md # API docs
β βββ RELEASE.md # Release guide
β βββ ARCHITECTURE.md # This file
β
βββ .github/workflows/
β βββ ci.yml # CI/CD pipeline
β
βββ pyproject.toml # Project config
βββ uv.lock # Dependencies lock
βββ README.md # Main documentation
π ΠΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ¶
1. KworkClient¶
ΠΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎΡΡΡ: ΠΡΠ½ΠΎΠ²Π½ΠΎΠ΅ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Ρ API
Π€ΡΠ½ΠΊΡΠΈΠΈ: - ΠΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ (login / token) - Π£ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΡΠ΅ΡΡΠΈΠ΅ΠΉ - ΠΠ΅Π»Π΅Π³ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ API Π³ΡΡΠΏΠΏΠ°ΠΌ
API Groups:
client.catalog # CatalogAPI
client.projects # ProjectsAPI
client.user # UserAPI
client.reference # ReferenceAPI
client.notifications # NotificationsAPI
client.other # OtherAPI
2. Models (Pydantic)¶
ΠΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎΡΡΡ: ΠΠ°Π»ΠΈΠ΄Π°ΡΠΈΡ ΠΈ ΡΠΈΠΏΠΈΠ·Π°ΡΠΈΡ ΠΎΡΠ²Π΅ΡΠΎΠ² API
ΠΠ°ΡΠ΅Π³ΠΎΡΠΈΠΈ: - User models: KworkUser, AuthResponse - Kwork models: Kwork, KworkDetails, KworkCategory - Project models: Project, ProjectsResponse - Review models: Review, ReviewsResponse - Notification models: Notification, Dialog - Reference models: City, Country, TimeZone, Feature, Badge - Error models: ErrorDetail, APIErrorResponse
3. Errors¶
ΠΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎΡΡΡ: ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΠΎΡΠΈΠ±ΠΎΠΊ API
ΠΠ΅ΡΠ°ΡΡ ΠΈΡ:
KworkError (base)
βββ KworkAuthError # 401, 403
βββ KworkApiError # 4xx, 5xx
β βββ KworkNotFoundError # 404
β βββ KworkRateLimitError # 429
β βββ KworkValidationError # 400
βββ KworkNetworkError # Network issues
4. HTTP Layer (httpx)¶
ΠΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎΡΡΡ: HTTP Π·Π°ΠΏΡΠΎΡΡ
Π€ΡΠ½ΠΊΡΠΈΠΈ: - HTTP/2 ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° - Π’Π°ΠΉΠΌΠ°ΡΡΡ - Cookies management - Token authentication - Error handling
π Flow: ΠΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ¶
User β KworkClient.login(username, password)
β
βΌ
POST /signIn (cookies)
β
βΌ
POST /getWebAuthToken (token)
β
βΌ
Store token + cookies
β
βΌ
Return authenticated client
π Flow: API Request¶
User β client.catalog.get_list(page=1)
β
βΌ
CatalogAPI.get_list()
β
βΌ
KworkClient._request()
β
βΌ
httpx.AsyncClient.post()
β
βΌ
KworkClient._handle_response()
β
βΌ
CatalogResponse.model_validate()
β
βΌ
Return typed response
π CI/CD Pipeline¶
Push/Tag β GitHub Actions
β
βββ Test Job
β βββ Install UV + Python
β βββ Run linters (ruff)
β βββ Run tests (pytest)
β βββ Upload coverage
β
βββ Build Job
β βββ Build wheel + sdist
β βββ Upload artifacts
β
βββ Publish Job (on tag)
β βββ Download artifacts
β βββ Publish to Gitea Registry
β
βββ Docs Job
βββ Build MkDocs
βββ Upload site
π ΠΠ°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ¶
Runtime¶
httpx[http2]>=0.26.0β HTTP clientpydantic>=2.0.0β Data validationstructlog>=24.0.0β Logging
Development¶
pytest>=8.0.0β Testingpytest-cov>=4.0.0β Coveragepytest-asyncio>=0.23.0β Async testsrespx>=0.20.0β HTTP mockingruff>=0.3.0β Lintingmkdocs + mkdocstringsβ Documentation
π ΠΠ΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡ¶
- Π’ΠΎΠΊΠ΅Π½Ρ: ΠΠ΅ ΡΠΎΡ ΡΠ°Π½ΡΡΡΡΡ Π² Π»ΠΎΠ³Π°Ρ
- ΠΠ°ΡΠΎΠ»ΠΈ: ΠΠ΅ΡΠ΅Π΄Π°ΡΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΈ login()
- Π‘Π΅ΡΡΠΈΠΈ: Token + cookies Ρ ΡΠ°Π½ΡΡΡΡ Π² ΠΊΠ»ΠΈΠ΅Π½ΡΠ΅
- HTTPS: ΠΡΠ΅ Π·Π°ΠΏΡΠΎΡΡ ΡΠ΅ΡΠ΅Π· HTTPS
π ΠΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ¶
- Async/Await: ΠΠ΅Π±Π»ΠΎΠΊΠΈΡΡΡΡΠΈΠ΅ Π·Π°ΠΏΡΠΎΡΡ
- HTTP/2: Multiplexing Π·Π°ΠΏΡΠΎΡΠΎΠ²
- Connection pooling: ΠΠ΅ΡΠ΅ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠΉ
- Timeouts: ΠΠ°ΡΠΈΡΠ° ΠΎΡ Π·Π°Π²ΠΈΡΠ°Π½ΠΈΠΉ
π§ͺ Π’Π΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅¶
- Unit ΡΠ΅ΡΡΡ: 92% coverage
- Mock HTTP: respx Π΄Π»Ρ ΠΈΠ·ΠΎΠ»ΡΡΠΈΠΈ
- Async tests: pytest-asyncio
- CI: ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΏΡΠΎΠ³ΠΎΠ½ ΠΏΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΊΠΎΠΌΠΌΠΈΡΠ΅
π ΠΠΈΡΠ΅Π½Π·ΠΈΡ¶
MIT License β ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΎΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ ΡΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ Π°Π²ΡΠΎΡΡΡΠ²Π°.