Skip to content

fix(parsers): устойчивость trade-страниц к пустым подкатегориям и парсинг chips#105

Open
Flummy1 wants to merge 1 commit into
revert/rollback-to-0.7from
fix/trade-pages-parsers
Open

fix(parsers): устойчивость trade-страниц к пустым подкатегориям и парсинг chips#105
Flummy1 wants to merge 1 commit into
revert/rollback-to-0.7from
fix/trade-pages-parsers

Conversation

@Flummy1

@Flummy1 Flummy1 commented Jun 7, 2026

Copy link
Copy Markdown
Contributor

База PR — revert/rollback-to-0.7 (PR #106).
Ветка отребейзена поверх отката к 0.7.0: фикс лежит одним коммитом сверху, в diff
только изменения этого фикса. Части исходного коммита, относившиеся к удалённой
в откате фиче SubcategoryStructure (методы схемы полей в OfferFieldsParser и
тесты _parse_conditions/_parse_options), при rebase отброшены.

Проблема

MyOffersPageParser и MyChipsPageParser падают с ParsingError, когда у
продавца нет предложений в подкатегории — это штатное состояние страницы.

  • Offers. Для пустой категории FunPay рендерит /lots/<id>/trade без
    div.showcase-table. Парсер обращался к table.html на None
    AttributeErrorParsingError.
  • Chips. Для пустой категории отсутствует form.form-ajax-simple
    form.html на None → та же ошибка.

Дополнительно MyChipsPageParser не работал ни для какой категории (даже
непустой): он передаёт в OfferFieldsParser HTML голой <form>, а тот искал
только div.page-content > form и падал с IndexError на отсутствующей обёртке.

Изменения

  • MyOffersPageParser — guard для header/body/div.content-lots/
    div.showcase-table. Отсутствие таблицы трактуется как «ноль офферов»
    (MyOffersPage(offers={})).
  • MyChipsPageParser — guard для header/body/form. Отсутствие формы
    даёт пустые OfferFields.
  • OfferFieldsParser — fallback с div.page-content > form на обычный
    form (парсит и голую форму из chips-парсера) и возврат пустых OfferFields,
    когда формы нет. Поведение на offerEdit-странице не меняется.
  • PageHeaderParser / AppDataParser — возвращают пустые объекты при
    отсутствии <header> / пустом data-app-data вместо падения.

Тесты

Регрессионные тесты (раньше у trade page-парсеров их не было):

  • my_offers_page_parser_test.py — пустая категория, категория с оффером,
    не-trade страница.
  • my_chips_page_parser_test.py — пустая категория, непустая категория,
    не-trade страница.
  • page_header_parser_test.py — пустой/отсутствующий header.
  • appdata_parser_test.py — пустой data-app-data + валидный.
  • offer_fields_parser_extras_test.py — устойчивость OfferFieldsParser
    (пустой ввод, ввод без формы, голая <form>).

Test plan

  • Локально: pytest --doctest-modules486 passed.
  • CI-матрица (ubuntu/macos/windows × Python 3.10–3.13) — перезапустится на
    force-push, дождаться зелёного статуса.
  • Проверено на реальных страницах FunPay: пустая offers-категория →
    MyOffersPage(offers={}) без ParsingError; непустая → офферы парсятся;
    chips-категория → поля парсятся.

@Flummy1 Flummy1 changed the title fix(parsers): корректная обработка пустых trade-страниц и парсинг chips fix(parsers): устойчивость trade-страниц к пустым подкатегориям и парсинг chips Jun 7, 2026
MyOffersPageParser and MyChipsPageParser crashed on subcategories with no
offers: FunPay renders /lots|/chips/<id>/trade without div.showcase-table
(offers) or form.form-ajax-simple (chips), so table.html / form.html raised
AttributeError and surfaced as ParsingError.

MyChipsPageParser additionally never worked for non-empty subcategories: it
feeds the bare <form> HTML to OfferFieldsParser, which only looked for
'div.page-content > form' and raised IndexError on the missing wrapper.

Changes:
- MyOffersPageParser: guard header/body/content-lots/showcase-table; a missing
  table is treated as zero offers.
- MyChipsPageParser: guard header/body/form; a missing form yields empty fields.
- OfferFieldsParser: fall back from 'div.page-content > form' to a plain 'form'
  lookup, and return empty OfferFields when there is no form.
- PageHeaderParser / AppDataParser: return empty objects on a missing header /
  empty app-data instead of raising (makes the header/body guards meaningful and
  hardens all page parsers).
- Add regression tests for both trade page parsers and the empty-source behavior
  of the affected leaf parsers.
@Flummy1 Flummy1 force-pushed the fix/trade-pages-parsers branch from 8a3b763 to 112c7aa Compare June 8, 2026 07:59
@Flummy1 Flummy1 changed the base branch from dev to revert/rollback-to-0.7 June 8, 2026 08:00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant