Skip to content

Commit cda8ad7

Browse files
committed
improved
1 parent 1fa23fb commit cda8ad7

8 files changed

Lines changed: 52 additions & 42 deletions

File tree

funpayparsers/message_type_re.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,7 @@
3131
r'(?P=u), не забудьте потом нажать кнопку «Подтвердить (?:выполнение заказа|получение валюты)»\.)|'
3232
r'(?m:The buyer (?P<e_u>%(urs)s) has paid for order #%(oirs)s\. .+\n'
3333
r'(?P=e_u), do not forget to press the '
34-
r'«Confirm (?:order fulfilment|currency receipt)» button once you finish.)'
35-
% _f_dict
34+
r'«Confirm (?:order fulfilment|currency receipt)» button once you finish.)' % _f_dict
3635
)
3736
"""
3837
Покупатель <ИМЯ ПОКУПАТЕЛЯ> оплатил заказ #<ID ЗАКАЗА>. <НАЗВАНИЕ ЛОТА>.

funpayparsers/parsers/offer_fields_parser.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,5 @@ def _parse(self) -> OfferFields:
4343
field_names[k] = label.text(strip=True)
4444

4545
return OfferFields(
46-
raw_source=form.html or '',
47-
fields_dict=fields_dict,
48-
fields_names=field_names
46+
raw_source=form.html or '', fields_dict=fields_dict, fields_names=field_names
4947
)

funpayparsers/parsers/page_parsers/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@
22

33
from .chat_page_parser import *
44
from .main_page_parser import *
5+
from .offer_page_parser import *
56
from .order_page_parser import *
67
from .profile_page_parser import *
78
from .my_chips_page_parser import *
89
from .settings_page_parser import *
910
from .my_offers_page_parser import *
1011
from .subcategory_page_parser import *
1112
from .transactions_page_parser import *
12-
from .offer_page_parser import *

funpayparsers/parsers/page_parsers/offer_page_parser.py

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,22 @@
55

66
from dataclasses import dataclass
77

8-
from funpayparsers.parsers import ChatParsingOptions, ChatParser
8+
from selectolax.lexbor import LexborNode, LexborHTMLParser
9+
10+
from funpayparsers.parsers import ChatParser, ChatParsingOptions
911
from funpayparsers.parsers.base import ParsingOptions, FunPayHTMLObjectParser
12+
from funpayparsers.types.common import PaymentOption, DetailedUserBalance
1013
from funpayparsers.parsers.appdata_parser import AppDataParser, AppDataParsingOptions
14+
from funpayparsers.types.pages.offer_page import OfferPage
15+
from funpayparsers.parsers.money_value_parser import (
16+
MoneyValueParser,
17+
MoneyValueParsingMode,
18+
MoneyValueParsingOptions,
19+
)
1120
from funpayparsers.parsers.page_header_parser import (
1221
PageHeaderParser,
1322
PageHeaderParsingOptions,
1423
)
15-
from funpayparsers.parsers.money_value_parser import MoneyValueParser, MoneyValueParsingOptions, MoneyValueParsingMode
16-
from funpayparsers.types.pages.offer_page import OfferPage
17-
from funpayparsers.types.common import PaymentOption, DetailedUserBalance
18-
from selectolax.lexbor import LexborNode, LexborHTMLParser
1924

2025

2126
@dataclass(frozen=True)
@@ -44,6 +49,7 @@ class OfferPageParsingOptions(ParsingOptions):
4449
Options for ``MoneyValueParser``.
4550
"""
4651

52+
4753
class OfferPageParser(FunPayHTMLObjectParser[OfferPage, OfferPageParsingOptions]):
4854
"""
4955
Parser for offer page (`/<lots/chips>/offer?id=<id>`).
@@ -75,12 +81,11 @@ def _parse(self) -> OfferPage:
7581
title=tree.css_first('span.payment-title').text(strip=True),
7682
price=MoneyValueParser(
7783
raw_source=tree.css_first('span.payment-value').text(strip=True),
78-
options=self.options.money_value_parsing_options
84+
options=self.options.money_value_parsing_options,
7985
).parse(),
8086
factors=[float(i) for i in option.attributes['data-factors'].split(',')],
8187
)
8288

83-
8489
return OfferPage(
8590
raw_source=self.raw_source,
8691
header=PageHeaderParser(
@@ -96,7 +101,7 @@ def _parse(self) -> OfferPage:
96101
fields=fields,
97102
chat=ChatParser(
98103
self.tree.css_first('div.chat').html or '',
99-
options=self.options.chat_parsing_options
104+
options=self.options.chat_parsing_options,
100105
).parse(),
101106
payment_options=payment_options,
102107
user_balance=DetailedUserBalance(
@@ -107,5 +112,5 @@ def _parse(self) -> OfferPage:
107112
withdrawable_usd=float(payment_select.attributes['data-balance-usd']),
108113
total_eur=float(payment_select.attributes['data-balance-total-eur']),
109114
withdrawable_eur=float(payment_select.attributes['data-balance-eur']),
110-
)
115+
),
111116
)

funpayparsers/parsers/page_parsers/transactions_page_parser.py

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55

66
from dataclasses import dataclass
77

8+
from funpayparsers.types import MoneyValue
9+
from funpayparsers.exceptions import ParsingError
810
from funpayparsers.types.enums import Currency
911
from funpayparsers.types.pages import TransactionsPage
1012
from funpayparsers.parsers.base import ParsingOptions, FunPayHTMLObjectParser
@@ -89,11 +91,14 @@ def _parse(self) -> TransactionsPage:
8991
deals_balance = None
9092
if len(balances) > 3:
9193
deals_text = balances[3].text().strip().split(' ', 1)[-1]
92-
deals_balance = MoneyValueParser(
93-
deals_text,
94-
options=self.options.money_value_parsing_options,
95-
parsing_mode=MoneyValueParsingMode.FROM_STRING,
96-
).parse()
94+
try:
95+
deals_balance = MoneyValueParser(
96+
deals_text,
97+
options=self.options.money_value_parsing_options,
98+
parsing_mode=MoneyValueParsingMode.FROM_STRING,
99+
).parse()
100+
except ParsingError:
101+
deals_balance = MoneyValue(raw_source='0₽', value=0, character='₽')
97102

98103
transactions_div = self.tree.css('div.tc-finance:not(.hidden)')
99104
if not transactions_div:

funpayparsers/types/enums.py

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,10 @@
1515

1616

1717
import re
18+
import warnings
1819
from typing import Any
1920
from dataclasses import dataclass
2021
from enum import Enum
21-
import warnings
2222

2323
from funpayparsers import message_type_re as msg_re
2424

@@ -48,7 +48,7 @@ def get_by_type_str(type_str: str, /) -> RunnerDataType | None:
4848
'`RunnerDataType.get_by_type_str` is deprecated. '
4949
'Use `RunnerDataType.from_type_str` instead.',
5050
DeprecationWarning,
51-
stacklevel=2
51+
stacklevel=2,
5252
)
5353
return RunnerDataType.from_type_str(type_str)
5454

@@ -60,7 +60,7 @@ def from_type_str(cls, type_str: str, /) -> RunnerDataType | None:
6060
'chat_counter': RunnerDataType.CHAT_COUNTER,
6161
'chat_bookmarks': RunnerDataType.CHAT_BOOKMARKS,
6262
'chat_node': RunnerDataType.CHAT_NODE,
63-
'c-p-u': RunnerDataType.CPU
63+
'c-p-u': RunnerDataType.CPU,
6464
}
6565
return data.get(type_str.lower())
6666

@@ -85,7 +85,7 @@ def get_by_url(url: str, /) -> SubcategoryType:
8585
warnings.warn(
8686
'`SubcategoryType.get_by_url` is deprecated. Use `SubcategoryType.from_url` instead.',
8787
DeprecationWarning,
88-
stacklevel=2
88+
stacklevel=2,
8989
)
9090
return SubcategoryType.from_url(url)
9191

@@ -98,7 +98,7 @@ def get_by_showcase_data_section(showcase_data_section: str, /) -> SubcategoryTy
9898
'`SubcategoryType.get_by_showcase_data_section` is deprecated. '
9999
'Use `SubcategoryType.from_showcase_data_section` instead.',
100100
DeprecationWarning,
101-
stacklevel=2
101+
stacklevel=2,
102102
)
103103
return SubcategoryType.from_showcase_data_section(showcase_data_section)
104104

@@ -126,15 +126,15 @@ def from_showcase_data_section(cls, showcase_data_section: str, /) -> Subcategor
126126
def COMMON(self) -> SubcategoryType:
127127
warnings.warn(
128128
'`SubcategoryType.COMMON` is deprecated. Use `SubcategoryType.OFFERS` instead.',
129-
DeprecationWarning
129+
DeprecationWarning,
130130
)
131131
return self.OFFERS
132132

133133
@property
134134
def CURRENCY(self) -> SubcategoryType:
135135
warnings.warn(
136136
'`SubcategoryType.CURRENCY` is deprecated. Use `SubcategoryType.CHIPS` instead.',
137-
DeprecationWarning
137+
DeprecationWarning,
138138
)
139139
return self.CHIPS
140140

@@ -152,10 +152,11 @@ class _SubcategoryTypeAliases:
152152
url_alias: str
153153
showcase_alias: str
154154

155+
155156
_SUBCATEGORY_TYPE_ALIASES = {
156157
SubcategoryType.OFFERS: _SubcategoryTypeAliases('lots', 'lot'),
157158
SubcategoryType.CHIPS: _SubcategoryTypeAliases('chips', 'chip'),
158-
SubcategoryType.UNKNOWN: _SubcategoryTypeAliases('', '')
159+
SubcategoryType.UNKNOWN: _SubcategoryTypeAliases('', ''),
159160
}
160161

161162

@@ -187,7 +188,7 @@ def get_by_css_class(css_class: str, /) -> OrderStatus:
187188
'`OrderStatus.get_by_css_class` is deprecated. '
188189
'Use `OrderStatus.from_css_class` instead.',
189190
DeprecationWarning,
190-
stacklevel=2
191+
stacklevel=2,
191192
)
192193
return OrderStatus.from_css_class(css_class)
193194

@@ -205,7 +206,7 @@ def from_css_class(cls, css_class: str, /) -> OrderStatus:
205206
_ORDER_STATUSES = {
206207
'text-primary': OrderStatus.PAID,
207208
'text-success': OrderStatus.COMPLETED,
208-
'text-warning': OrderStatus.REFUNDED
209+
'text-warning': OrderStatus.REFUNDED,
209210
}
210211

211212

@@ -225,7 +226,7 @@ def get_by_character(character: str, /) -> Currency:
225226
warnings.warn(
226227
'`Currency.get_by_character` is deprecated. Use `Currency.from_character` instead.',
227228
DeprecationWarning,
228-
stacklevel=2
229+
stacklevel=2,
229230
)
230231
return Currency.from_character(character)
231232

@@ -267,7 +268,7 @@ def get_by_css_class(css_class: str, /) -> TransactionStatus:
267268
'`TransactionStatus.get_by_css_class` is deprecated. '
268269
'Use `TransactionStatus.from_css_class` instead.',
269270
DeprecationWarning,
270-
stacklevel=2
271+
stacklevel=2,
271272
)
272273
return TransactionStatus.from_css_class(css_class)
273274

@@ -281,6 +282,7 @@ def from_css_class(cls, css_class: str, /) -> TransactionStatus:
281282
return enm
282283
return TransactionStatus.UNKNOWN
283284

285+
284286
_TRANSACTION_STATUSES = {
285287
'transaction-status-waiting': TransactionStatus.PENDING,
286288
'transaction-status-complete': TransactionStatus.COMPLETED,
@@ -321,6 +323,7 @@ def from_message_text(cls, message_text: str, /) -> MessageType:
321323
return t
322324
return MessageType.NON_SYSTEM
323325

326+
324327
_MESSAGE_RE = {
325328
MessageType.NEW_ORDER: msg_re.NEW_ORDER,
326329
MessageType.ORDER_CLOSED: msg_re.ORDER_CLOSED,
@@ -353,10 +356,9 @@ def get_by_css_class(css_class: str, /) -> BadgeType:
353356
Determine the badge type based on a given CSS class string.
354357
"""
355358
warnings.warn(
356-
'`BadgeType.get_by_css_class` is deprecated. '
357-
'Use `BadgeType.from_css_class` instead.',
359+
'`BadgeType.get_by_css_class` is deprecated. Use `BadgeType.from_css_class` instead.',
358360
DeprecationWarning,
359-
stacklevel=2
361+
stacklevel=2,
360362
)
361363
return BadgeType.from_css_class(css_class)
362364

@@ -581,7 +583,7 @@ def get_by_css_class(css_class: str, /) -> PaymentMethod:
581583
'`PaymentMethod.get_by_css_class` is deprecated. '
582584
'Use `PaymentMethod.from_css_class` instead.',
583585
DeprecationWarning,
584-
stacklevel=2
586+
stacklevel=2,
585587
)
586588
return PaymentMethod.from_css_class(css_class)
587589

@@ -657,7 +659,7 @@ def get_by_lang_code(lang_code: Any, /) -> Language:
657659
warnings.warn(
658660
'`Language.get_by_lang_code` is deprecated. Use `Language.from_lang_code` instead.',
659661
DeprecationWarning,
660-
stacklevel=2
662+
stacklevel=2,
661663
)
662664
return Language.from_lang_code(lang_code)
663665

@@ -667,7 +669,7 @@ def get_by_header_menu_css_class(css_class: str, /) -> Language:
667669
'`Language.get_by_header_menu_css_class` is deprecated. '
668670
'Use `Language.from_header_menu_css_class` instead.',
669671
DeprecationWarning,
670-
stacklevel=2
672+
stacklevel=2,
671673
)
672674
return Language.from_header_menu_css_class(css_class)
673675

@@ -716,4 +718,4 @@ class _LanguageAliases:
716718
Language.RU: _LanguageAliases('ru', '', 'menu-icon-lang-ru'),
717719
Language.EN: _LanguageAliases('en', 'en', 'menu-icon-lang-en'),
718720
Language.UK: _LanguageAliases('uk', 'uk', 'menu-icon-lang-uk'),
719-
}
721+
}

funpayparsers/types/pages/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@
33
from .base import *
44
from .chat_page import *
55
from .main_page import *
6+
from .offer_page import *
67
from .order_page import *
78
from .profile_page import *
89
from .my_chips_page import *
910
from .settings_page import *
1011
from .my_offers_page import *
1112
from .subcategory_page import *
1213
from .transactions_page import *
13-
from .offer_page import *

funpayparsers/types/pages/offer_page.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,10 @@
99

1010
from funpayparsers.types.pages.base import FunPayPage
1111

12+
1213
if TYPE_CHECKING:
13-
from funpayparsers.types.common import PaymentOption, DetailedUserBalance
1414
from funpayparsers.types.chat import Chat
15+
from funpayparsers.types.common import PaymentOption, DetailedUserBalance
1516
from funpayparsers.parsers.page_parsers.offer_page_parser import OfferPageParsingOptions
1617

1718

@@ -41,7 +42,7 @@ def from_raw_source(
4142
) -> OfferPage:
4243
from funpayparsers.parsers.page_parsers.offer_page_parser import (
4344
OfferPageParser,
44-
OfferPageParsingOptions
45+
OfferPageParsingOptions,
4546
)
4647

4748
options = options or OfferPageParsingOptions()

0 commit comments

Comments
 (0)