fix: preserve requested pagination filters and add ReviewsBatch.next_batch - #41
Conversation
Stamp the requested filter and user_id onto ReviewsBatch in GetReviews.transform_result, since FunPay omits the hidden filter/user_id inputs in some responses. Add ReviewsBatch.next_batch() to paginate while preserving the filter, mirroring the transactions pagination fix. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Reworked on top of 0.10.0rc3: the requested filters now travel through the `context` channel the method base gained on dev, instead of the removed `transform_result` override. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
qvvonk
left a comment
There was a problem hiding this comment.
Передача фильтров через context крайне неявна: будет сложно понять, откуда у модели появились значения, необходимые для пагинации.
Лучше явно устанавливать соответствующие поля в GetReview.parse_result, например:
async def parse_result(self, response: ...) -> ...:
result = await super().parse_result(response)
result.filter = ...
result.user_id = ...
return result…l context Review feedback: passing the filters through `context` makes it hard to see where the values on the model came from. The parsers return plain mutable dataclasses, so the methods can set the fields right after parsing — the requested value sits next to the field it overrides, and both models go back to being untouched except for the new `ReviewsBatch.next_batch()`. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
Согласен, поправил — Значения теперь проставляются прямо в class GetReviews(FunPayMethod[ReviewsBatch]):
async def parse_result(self, response: RawResponse[Any]) -> ParsedReviewsBatch:
result: ParsedReviewsBatch = await super().parse_result(response)
# FunPay omits the hidden ``user_id`` / ``filter`` inputs in a part of the
# ``users/reviews`` responses, so the parsed values are unreliable. The requested
# ones are known here and are what the next batch has to be asked with.
result.user_id = self.user_id
result.filter = self.filter
return resultТо же самое в Побочный плюс: Тесты переписаны под этот путь: теперь они дёргают сам |
Проблема
ReviewsParserиTransactionPreviewsParserчитаютfilterиuser_idизскрытых инпутов ответа:
FunPay отдаёт эти инпуты не во всех ответах
users/reviewsиusers/transactions— в остальных случаях в батч попадаетNone. Любаяпагинация, опирающаяся на спарсенное значение, молча теряла запрошенный фильтр:
TransactionPreviewsBatch.next_batch()подставлялself.filter or '',то есть после первой страницы фильтр по типу транзакций сбрасывался на «все»;
user_idтерялся так же.Отдельная деталь:
GetReviewsв репозитории есть, но он не экспортирован изfunpaybotengine.methodsи недоступен черезBot— то есть метод написан,но пользователю его не достать.
Решение
Парсеры возвращают обычные мутабельные датаклассы, поэтому метод проставляет
запрошенные значения сразу после разбора — рядом с полем, которое перекрывает:
То же самое в
GetTransactions.parse_resultдляfilter. Модели при этом нетрогаются вовсе — единственное добавление в них это
ReviewsBatch.next_batch(),аналог того, что уже есть у
TransactionPreviewsBatchиOrderPreviewsBatch:ValueError('Last batch.'), еслиnext_review_idпуст;ValueError('Unknown user id.'), еслиuser_idнеизвестен (в отличие оттранзакций, отзывам нужен явный id профиля — батч со страницы заказа
пагинировать нечем);
Чтобы
next_batch()было чем выполнять,GetReviewsэкспортирован изfunpaybotengine.methodsи доступен какBot.get_reviews().Что изменилось по сравнению с исходной версией PR
Исходная версия переопределяла
transform_resultи правила поля батча послепостроения модели — на
0.10.0rc3такого хука уже нет, решение переписано подтекущий API.
Сюда же переехал фикс фильтра транзакций из
#40 — он был влит в
ветку #39, но на
devне попал, а баг там ровно тот же.Использование
Обратная совместимость
Ломающих изменений нет:
next_batch()иBot.get_reviews()— новые, апредпочтение запрошенного фильтра спарсенному меняет поведение только там, где
раньше значение терялось.
Проверки
tests/pagination_filters_test.pyфиксирует и предпосылку бага (парсер отдаётNone, когда скрытых инпутов нет), и то, чтоparse_resultпроставляетзапрошенные значения, и то, что фильтр с курсором доезжают до следующего
запроса.
🤖 Generated with Claude Code