chore(tradein): четыре символа, на которые нет ни одной ссылки
All checks were successful
CI Trade-In / changes (pull_request) Successful in 10s
CI / changes (pull_request) Successful in 13s
CI Trade-In / browser-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / backend-tests (pull_request) Successful in 5m12s
All checks were successful
CI Trade-In / changes (pull_request) Successful in 10s
CI / changes (pull_request) Successful in 13s
CI Trade-In / browser-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / backend-tests (pull_request) Successful in 5m12s
Найдено сверкой двух независимых источников: подсчёт упоминаний по всем
python-файлам (включая тесты) дал имена, встречающиеся ровно один раз — в
собственном объявлении; каждое затем подтверждено serena find_referencing_symbols
(LSP, видит и косвенные ссылки) и проверено grep'ом по yml/sql/ts/md на случай
ссылки строкой.
Удалено:
* _qr_code_data_url (trade_in_pdf) — QR как SVG data URL, не вызывался
ниоткуда; вместе с ним ушёл осиротевший import segno. `io` ОСТАВЛЕН —
io.BytesIO используется дальше по файлу (строка 774);
* _local_name (gar_flats_loader) — снятие namespace с имени тега;
* AvitoParseError — класс никто не поднимает и не ловит;
* IMVCityMismatchError — то же.
Что НЕ тронуто, хотя фильтр их показал:
* ~200 обработчиков FastAPI и celery-задач — их поднимает декоратор, по имени
их действительно никто не зовёт;
* refresh_ddu_price_indicator — точка ручного обслуживания, задокументирована
в комментарии к матвью (data/sql/152_mv_ddu_price_indicator.sql: «Refresh:
... (не в beat)»);
* schemas/parcel.py::MarketPrice — половина контракта, фронт использует
(frontend/src/types/site-finder.ts: market_price?: MarketPrice);
* JobSetting — SQLAlchemy-модель, живёт через metadata Base.
segno остался в backend/pyproject.toml и больше нигде не используется — снятие
зависимости требует пересборки лока, поэтому отдельным PR.
ruff clean, 4974 passed / 37 skipped.
This commit is contained in:
parent
fa62d69fb9
commit
4902d1e29e
4 changed files with 0 additions and 24 deletions
|
|
@ -46,7 +46,6 @@ import matplotlib
|
|||
matplotlib.use("Agg") # headless-safe backend — ОБЯЗАТЕЛЬНО до любого рендера: в Docker-образе
|
||||
# нет GUI toolkit (Tkinter/Qt/GTK), импорт matplotlib без явного backend может тянуть их/падать.
|
||||
import matplotlib.font_manager as _font_manager
|
||||
import segno
|
||||
from matplotlib.figure import Figure # object API, НЕ pyplot — см. _price_range_chart_svg
|
||||
from matplotlib.patches import Rectangle
|
||||
|
||||
|
|
@ -441,14 +440,6 @@ def _expires_date(estimate: AggregatedEstimate) -> dt.date:
|
|||
return dt.date.today() + dt.timedelta(days=30)
|
||||
|
||||
|
||||
def _qr_code_data_url(text: str, size: int = 4) -> str:
|
||||
"""QR-код как SVG data URL."""
|
||||
qr = segno.make(text, error="m")
|
||||
buf = io.BytesIO()
|
||||
qr.save(buf, kind="svg", scale=size, dark="#1a1d23", light="#ffffff")
|
||||
return f"data:image/svg+xml;base64,{base64.b64encode(buf.getvalue()).decode('ascii')}"
|
||||
|
||||
|
||||
def _conf_label(confidence: str) -> str:
|
||||
return {"high": "Высокая", "medium": "Средняя", "low": "Низкая"}.get(confidence, confidence)
|
||||
|
||||
|
|
|
|||
|
|
@ -141,13 +141,6 @@ def _find_files(dir_path: str, prefix: str) -> list[str]:
|
|||
# ─────────────────────────────────────────────────────────────────────────────
|
||||
# Стриминговый парсер (lxml iterparse + очистка)
|
||||
# ─────────────────────────────────────────────────────────────────────────────
|
||||
def _local_name(tag: object) -> str:
|
||||
"""Локальное имя тега без namespace; '' для не-элементов (комментарии/PI)."""
|
||||
if not isinstance(tag, str):
|
||||
return ""
|
||||
return tag.rsplit("}", 1)[-1]
|
||||
|
||||
|
||||
def _stream_rows(path: str, marker_attr: str) -> Iterator[etree._Element]:
|
||||
"""Yield row-элементов файла, у которых есть атрибут marker_attr, освобождая память.
|
||||
|
||||
|
|
|
|||
|
|
@ -71,7 +71,3 @@ class AvitoWarmupCookiesMissingError(AvitoBlockedError):
|
|||
proxy-ротация, consecutive-block breaker в pipeline/backfill) отработали как на обычном
|
||||
блоке площадки, без отдельного except-блока на call-сайтах.
|
||||
"""
|
||||
|
||||
|
||||
class AvitoParseError(AvitoError):
|
||||
"""Cannot parse Avito HTML structure (selector changes)."""
|
||||
|
|
|
|||
|
|
@ -92,10 +92,6 @@ class IMVAddressNotFoundError(Exception):
|
|||
"""Raised when /coords/by_address returns no geoHash for given address."""
|
||||
|
||||
|
||||
class IMVCityMismatchError(Exception):
|
||||
"""Raised when locationId не входит в ожидаемый город (sanity check)."""
|
||||
|
||||
|
||||
class IMVAuthError(Exception):
|
||||
"""Avito API rejected auth / quota exceeded (HTTP 401 / 403)."""
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue