Refactor pyfragment structure: Move models to domain-specific modules

- Moved PaymentMethod and other enums from models to enums.py for better organization.
- Refactored imports in various files to reflect the new structure.
- Created new model files for ads, anonymous numbers, giveaways, marketplace, purchases, and tonapi.
- Removed the old models.py file to clean up the codebase.
- Updated all relevant imports in the codebase to use the new model locations.
This commit is contained in:
bohd4nx
2026-06-16 01:02:28 +03:00
parent 8f865f4911
commit 9f11ccb3ee
37 changed files with 73 additions and 90 deletions
+1 -1
View File
@@ -9,7 +9,7 @@ Channel can be "@channel", "channel", or "https://t.me/channel".
import asyncio import asyncio
from pyfragment import ConfigurationError, FragmentClient, UserNotFoundError from pyfragment import ConfigurationError, FragmentClient, UserNotFoundError
from pyfragment.models.enums import PaymentMethod from pyfragment.enums import PaymentMethod
SEED = "word1 word2 ... word24" SEED = "word1 word2 ... word24"
API_KEY = "YOUR_TONAPI_KEY" API_KEY = "YOUR_TONAPI_KEY"
+1 -1
View File
@@ -9,7 +9,7 @@ Channel can be "@channel", "channel", or "https://t.me/channel".
import asyncio import asyncio
from pyfragment import ConfigurationError, FragmentClient, UserNotFoundError from pyfragment import ConfigurationError, FragmentClient, UserNotFoundError
from pyfragment.models.enums import PaymentMethod from pyfragment.enums import PaymentMethod
SEED = "word1 word2 ... word24" SEED = "word1 word2 ... word24"
API_KEY = "YOUR_TONAPI_KEY" API_KEY = "YOUR_TONAPI_KEY"
+1 -1
View File
@@ -9,7 +9,7 @@ Username can be "@username", "username", or "https://t.me/username".
import asyncio import asyncio
from pyfragment import ConfigurationError, FragmentClient, UserNotFoundError from pyfragment import ConfigurationError, FragmentClient, UserNotFoundError
from pyfragment.models.enums import PaymentMethod from pyfragment.enums import PaymentMethod
SEED = "word1 word2 ... word24" SEED = "word1 word2 ... word24"
API_KEY = "YOUR_TONAPI_KEY" API_KEY = "YOUR_TONAPI_KEY"
+1 -1
View File
@@ -9,7 +9,7 @@ Username can be "@username", "username", or "https://t.me/username".
import asyncio import asyncio
from pyfragment import ConfigurationError, FragmentClient, UserNotFoundError from pyfragment import ConfigurationError, FragmentClient, UserNotFoundError
from pyfragment.models.enums import PaymentMethod from pyfragment.enums import PaymentMethod
SEED = "word1 word2 ... word24" SEED = "word1 word2 ... word24"
API_KEY = "YOUR_TONAPI_KEY" API_KEY = "YOUR_TONAPI_KEY"
+8 -7
View File
@@ -20,13 +20,14 @@ from pyfragment.exceptions import (
VerificationError, VerificationError,
WalletError, WalletError,
) )
from pyfragment.models.anonymous_numbers import LoginCodeResult, TerminateSessionsResult from pyfragment.domains.anonymous_numbers.models import LoginCodeResult, TerminateSessionsResult
from pyfragment.models.cookies import CookieResult from pyfragment.core.models import CookieResult
from pyfragment.models.enums import PaymentMethod, WalletVersion from pyfragment.enums import PaymentMethod, WalletVersion
from pyfragment.models.giveaways import PremiumGiveawayResult, StarsGiveawayResult from pyfragment.domains.giveaways.models import PremiumGiveawayResult, StarsGiveawayResult
from pyfragment.models.marketplace import GiftsResult, NumbersResult, UsernamesResult from pyfragment.domains.marketplace.models import GiftsResult, NumbersResult, UsernamesResult
from pyfragment.models.payments import AdsRechargeResult, AdsTopupResult, PremiumResult, StarsResult from pyfragment.domains.ads.models import AdsRechargeResult, AdsTopupResult
from pyfragment.models.wallet import WalletInfo from pyfragment.domains.purchases.models import PremiumResult, StarsResult
from pyfragment.domains.tonapi.models import WalletInfo
logging.getLogger("pyfragment").addHandler(logging.NullHandler()) logging.getLogger("pyfragment").addHandler(logging.NullHandler())
+7 -6
View File
@@ -19,12 +19,13 @@ from pyfragment.domains.marketplace.service import MarketplaceService
from pyfragment.domains.purchases.service import PurchasesService from pyfragment.domains.purchases.service import PurchasesService
from pyfragment.domains.tonapi.service import TonapiService from pyfragment.domains.tonapi.service import TonapiService
from pyfragment.exceptions import ConfigurationError, CookieError from pyfragment.exceptions import ConfigurationError, CookieError
from pyfragment.models.anonymous_numbers import LoginCodeResult, TerminateSessionsResult from pyfragment.domains.anonymous_numbers.models import LoginCodeResult, TerminateSessionsResult
from pyfragment.models.enums import PaymentMethod, WalletVersion from pyfragment.enums import PaymentMethod, WalletVersion
from pyfragment.models.giveaways import PremiumGiveawayResult, StarsGiveawayResult from pyfragment.domains.giveaways.models import PremiumGiveawayResult, StarsGiveawayResult
from pyfragment.models.marketplace import GiftsResult, NumbersResult, UsernamesResult from pyfragment.domains.marketplace.models import GiftsResult, NumbersResult, UsernamesResult
from pyfragment.models.payments import AdsRechargeResult, AdsTopupResult, PremiumResult, StarsResult from pyfragment.domains.ads.models import AdsRechargeResult, AdsTopupResult
from pyfragment.models.wallet import WalletInfo from pyfragment.domains.purchases.models import PremiumResult, StarsResult
from pyfragment.domains.tonapi.models import WalletInfo
class FragmentClient: class FragmentClient:
+2 -2
View File
@@ -6,8 +6,8 @@ from typing import Any
from pyfragment.core.constants import FRAGMENT_BASE_URL, FRAGMENT_DOMAIN, REQUIRED_COOKIE_KEYS from pyfragment.core.constants import FRAGMENT_BASE_URL, FRAGMENT_DOMAIN, REQUIRED_COOKIE_KEYS
from pyfragment.exceptions import CookieError from pyfragment.exceptions import CookieError
from pyfragment.models.cookies import CookieResult from pyfragment.core.models import CookieResult
from pyfragment.models.enums import SupportedBrowser from pyfragment.enums import SupportedBrowser
try: try:
import rookiepy import rookiepy
+25
View File
@@ -0,0 +1,25 @@
from __future__ import annotations
from dataclasses import dataclass
@dataclass
class AdsTopupResult:
transaction_id: str
username: str
amount: int
def __repr__(self) -> str:
return f"AdsTopupResult(username='{self.username}', amount={self.amount} GRAM (ex TON), tx='{self.transaction_id}')"
@dataclass
class AdsRechargeResult:
transaction_id: str
amount: int
def __repr__(self) -> str:
return f"AdsRechargeResult(amount={self.amount} GRAM (ex TON), tx='{self.transaction_id}')"
__all__ = ["AdsRechargeResult", "AdsTopupResult"]
+1 -1
View File
@@ -8,7 +8,7 @@ from pyfragment.core.constants import ADS_TOPUP_PAGE, DEVICE_INFO, GRAM_TOPUP_MA
from pyfragment.domains.tonapi.account import get_account_info from pyfragment.domains.tonapi.account import get_account_info
from pyfragment.domains.tonapi.transaction import process_transaction from pyfragment.domains.tonapi.transaction import process_transaction
from pyfragment.exceptions import ConfigurationError, FragmentAPIError, FragmentError, UnexpectedError, VerificationError from pyfragment.exceptions import ConfigurationError, FragmentAPIError, FragmentError, UnexpectedError, VerificationError
from pyfragment.models.payments import AdsRechargeResult from pyfragment.domains.ads.models import AdsRechargeResult
if TYPE_CHECKING: if TYPE_CHECKING:
from pyfragment.client import FragmentClient from pyfragment.client import FragmentClient
+1 -1
View File
@@ -5,7 +5,7 @@ from typing import TYPE_CHECKING
from pyfragment.domains.ads.recharge import recharge_ads from pyfragment.domains.ads.recharge import recharge_ads
from pyfragment.domains.ads.tonup import topup_gram from pyfragment.domains.ads.tonup import topup_gram
from pyfragment.domains.base import BaseService from pyfragment.domains.base import BaseService
from pyfragment.models.payments import AdsRechargeResult, AdsTopupResult from pyfragment.domains.ads.models import AdsRechargeResult, AdsTopupResult
if TYPE_CHECKING: if TYPE_CHECKING:
pass pass
+1 -1
View File
@@ -16,7 +16,7 @@ from pyfragment.exceptions import (
UserNotFoundError, UserNotFoundError,
VerificationError, VerificationError,
) )
from pyfragment.models.payments import AdsTopupResult from pyfragment.domains.ads.models import AdsTopupResult
if TYPE_CHECKING: if TYPE_CHECKING:
from pyfragment.client import FragmentClient from pyfragment.client import FragmentClient
@@ -1,6 +1,6 @@
from pyfragment.domains.anonymous_numbers.number import get_login_code, terminate_sessions, toggle_login_codes from pyfragment.domains.anonymous_numbers.number import get_login_code, terminate_sessions, toggle_login_codes
from pyfragment.domains.anonymous_numbers.service import AnonymousNumbersService from pyfragment.domains.anonymous_numbers.service import AnonymousNumbersService
from pyfragment.models.anonymous_numbers import LoginCodeResult, TerminateSessionsResult from pyfragment.domains.anonymous_numbers.models import LoginCodeResult, TerminateSessionsResult
__all__ = [ __all__ = [
"AnonymousNumbersService", "AnonymousNumbersService",
@@ -7,7 +7,7 @@ from typing import TYPE_CHECKING
from pyfragment.core.constants import NUMBERS_PAGE from pyfragment.core.constants import NUMBERS_PAGE
from pyfragment.domains.anonymous_numbers.parser import parse_login_code from pyfragment.domains.anonymous_numbers.parser import parse_login_code
from pyfragment.exceptions import AnonymousNumberError, FragmentAPIError, FragmentError, UnexpectedError from pyfragment.exceptions import AnonymousNumberError, FragmentAPIError, FragmentError, UnexpectedError
from pyfragment.models.anonymous_numbers import LoginCodeResult, TerminateSessionsResult from pyfragment.domains.anonymous_numbers.models import LoginCodeResult, TerminateSessionsResult
if TYPE_CHECKING: if TYPE_CHECKING:
from pyfragment.client import FragmentClient from pyfragment.client import FragmentClient
@@ -4,7 +4,7 @@ from typing import TYPE_CHECKING
from pyfragment.domains.anonymous_numbers.number import get_login_code, terminate_sessions, toggle_login_codes from pyfragment.domains.anonymous_numbers.number import get_login_code, terminate_sessions, toggle_login_codes
from pyfragment.domains.base import BaseService from pyfragment.domains.base import BaseService
from pyfragment.models.anonymous_numbers import LoginCodeResult, TerminateSessionsResult from pyfragment.domains.anonymous_numbers.models import LoginCodeResult, TerminateSessionsResult
if TYPE_CHECKING: if TYPE_CHECKING:
pass pass
+1 -1
View File
@@ -1,6 +1,6 @@
from pyfragment.domains.giveaways.giveaway import giveaway_premium, giveaway_stars from pyfragment.domains.giveaways.giveaway import giveaway_premium, giveaway_stars
from pyfragment.domains.giveaways.service import GiveawaysService from pyfragment.domains.giveaways.service import GiveawaysService
from pyfragment.models.giveaways import PremiumGiveawayResult, StarsGiveawayResult from pyfragment.domains.giveaways.models import PremiumGiveawayResult, StarsGiveawayResult
__all__ = [ __all__ = [
"GiveawaysService", "GiveawaysService",
+2 -2
View File
@@ -28,8 +28,8 @@ from pyfragment.exceptions import (
UserNotFoundError, UserNotFoundError,
VerificationError, VerificationError,
) )
from pyfragment.models.enums import PaymentMethod from pyfragment.enums import PaymentMethod
from pyfragment.models.giveaways import PremiumGiveawayResult, StarsGiveawayResult from pyfragment.domains.giveaways.models import PremiumGiveawayResult, StarsGiveawayResult
if TYPE_CHECKING: if TYPE_CHECKING:
from pyfragment.client import FragmentClient from pyfragment.client import FragmentClient
+2 -2
View File
@@ -4,8 +4,8 @@ from typing import TYPE_CHECKING
from pyfragment.domains.base import BaseService from pyfragment.domains.base import BaseService
from pyfragment.domains.giveaways.giveaway import giveaway_premium, giveaway_stars from pyfragment.domains.giveaways.giveaway import giveaway_premium, giveaway_stars
from pyfragment.models.enums import PaymentMethod from pyfragment.enums import PaymentMethod
from pyfragment.models.giveaways import PremiumGiveawayResult, StarsGiveawayResult from pyfragment.domains.giveaways.models import PremiumGiveawayResult, StarsGiveawayResult
if TYPE_CHECKING: if TYPE_CHECKING:
pass pass
+1 -1
View File
@@ -1,6 +1,6 @@
from pyfragment.domains.marketplace.search import search_gifts, search_numbers, search_usernames from pyfragment.domains.marketplace.search import search_gifts, search_numbers, search_usernames
from pyfragment.domains.marketplace.service import MarketplaceService from pyfragment.domains.marketplace.service import MarketplaceService
from pyfragment.models.marketplace import GiftsResult, NumbersResult, UsernamesResult from pyfragment.domains.marketplace.models import GiftsResult, NumbersResult, UsernamesResult
__all__ = [ __all__ = [
"GiftsResult", "GiftsResult",
+1 -1
View File
@@ -6,7 +6,7 @@ from typing import TYPE_CHECKING, Any
from pyfragment.core.constants import FRAGMENT_BASE_URL, GIFTS_PAGE, NUMBERS_PAGE from pyfragment.core.constants import FRAGMENT_BASE_URL, GIFTS_PAGE, NUMBERS_PAGE
from pyfragment.domains.marketplace.parser import parse_auction_rows, parse_gift_items from pyfragment.domains.marketplace.parser import parse_auction_rows, parse_gift_items
from pyfragment.exceptions import FragmentAPIError, FragmentError, UnexpectedError from pyfragment.exceptions import FragmentAPIError, FragmentError, UnexpectedError
from pyfragment.models.marketplace import GiftsResult, NumbersResult, UsernamesResult from pyfragment.domains.marketplace.models import GiftsResult, NumbersResult, UsernamesResult
if TYPE_CHECKING: if TYPE_CHECKING:
from pyfragment.client import FragmentClient from pyfragment.client import FragmentClient
+1 -1
View File
@@ -4,7 +4,7 @@ from typing import TYPE_CHECKING
from pyfragment.domains.base import BaseService from pyfragment.domains.base import BaseService
from pyfragment.domains.marketplace.search import search_gifts, search_numbers, search_usernames from pyfragment.domains.marketplace.search import search_gifts, search_numbers, search_usernames
from pyfragment.models.marketplace import GiftsResult, NumbersResult, UsernamesResult from pyfragment.domains.marketplace.models import GiftsResult, NumbersResult, UsernamesResult
if TYPE_CHECKING: if TYPE_CHECKING:
pass pass
+1 -1
View File
@@ -1,5 +1,5 @@
from pyfragment.domains.purchases.purchase import purchase_premium, purchase_stars from pyfragment.domains.purchases.purchase import purchase_premium, purchase_stars
from pyfragment.domains.purchases.service import PurchasesService from pyfragment.domains.purchases.service import PurchasesService
from pyfragment.models.payments import PremiumResult, StarsResult from pyfragment.domains.purchases.models import PremiumResult, StarsResult
__all__ = ["PremiumResult", "PurchasesService", "StarsResult", "purchase_premium", "purchase_stars"] __all__ = ["PremiumResult", "PurchasesService", "StarsResult", "purchase_premium", "purchase_stars"]
@@ -23,23 +23,4 @@ class StarsResult:
return f"StarsResult(username='{self.username}', amount={self.amount} stars, tx='{self.transaction_id}')" return f"StarsResult(username='{self.username}', amount={self.amount} stars, tx='{self.transaction_id}')"
@dataclass __all__ = ["PremiumResult", "StarsResult"]
class AdsTopupResult:
transaction_id: str
username: str
amount: int
def __repr__(self) -> str:
return f"AdsTopupResult(username='{self.username}', amount={self.amount} GRAM (ex TON), tx='{self.transaction_id}')"
@dataclass
class AdsRechargeResult:
transaction_id: str
amount: int
def __repr__(self) -> str:
return f"AdsRechargeResult(amount={self.amount} GRAM (ex TON), tx='{self.transaction_id}')"
__all__ = ["AdsRechargeResult", "AdsTopupResult", "PremiumResult", "StarsResult"]
+2 -2
View File
@@ -25,8 +25,8 @@ from pyfragment.exceptions import (
UserNotFoundError, UserNotFoundError,
VerificationError, VerificationError,
) )
from pyfragment.models.enums import PaymentMethod from pyfragment.enums import PaymentMethod
from pyfragment.models.payments import PremiumResult, StarsResult from pyfragment.domains.purchases.models import PremiumResult, StarsResult
if TYPE_CHECKING: if TYPE_CHECKING:
from pyfragment.client import FragmentClient from pyfragment.client import FragmentClient
+2 -2
View File
@@ -4,8 +4,8 @@ from typing import TYPE_CHECKING
from pyfragment.domains.base import BaseService from pyfragment.domains.base import BaseService
from pyfragment.domains.purchases.purchase import purchase_premium, purchase_stars from pyfragment.domains.purchases.purchase import purchase_premium, purchase_stars
from pyfragment.models.enums import PaymentMethod from pyfragment.enums import PaymentMethod
from pyfragment.models.payments import PremiumResult, StarsResult from pyfragment.domains.purchases.models import PremiumResult, StarsResult
if TYPE_CHECKING: if TYPE_CHECKING:
pass pass
+2 -2
View File
@@ -11,8 +11,8 @@ from tonutils.exceptions import ProviderResponseError
from pyfragment.core.constants import MIN_GRAM_BALANCE, MIN_USDT_BALANCE, USDT_GRAM_MASTER_ADDRESS from pyfragment.core.constants import MIN_GRAM_BALANCE, MIN_USDT_BALANCE, USDT_GRAM_MASTER_ADDRESS
from pyfragment.exceptions import WalletError from pyfragment.exceptions import WalletError
from pyfragment.models.enums import WALLET_CLASSES from pyfragment.enums import WALLET_CLASSES
from pyfragment.models.wallet import WalletInfo from pyfragment.domains.tonapi.models import WalletInfo
if TYPE_CHECKING: if TYPE_CHECKING:
from pyfragment.client import FragmentClient from pyfragment.client import FragmentClient
+1 -1
View File
@@ -4,7 +4,7 @@ from typing import TYPE_CHECKING
from pyfragment.domains.base import BaseService from pyfragment.domains.base import BaseService
from pyfragment.domains.tonapi.account import get_wallet_info from pyfragment.domains.tonapi.account import get_wallet_info
from pyfragment.models.wallet import WalletInfo from pyfragment.domains.tonapi.models import WalletInfo
if TYPE_CHECKING: if TYPE_CHECKING:
pass pass
+1 -1
View File
@@ -13,7 +13,7 @@ from tonutils.exceptions import ProviderResponseError
from pyfragment.domains.tonapi.account import check_gram_payment_balance, check_usdt_payment_balance from pyfragment.domains.tonapi.account import check_gram_payment_balance, check_usdt_payment_balance
from pyfragment.exceptions import ParseError, TransactionError, WalletError from pyfragment.exceptions import ParseError, TransactionError, WalletError
from pyfragment.models.enums import WALLET_CLASSES, PaymentMethod from pyfragment.enums import WALLET_CLASSES, PaymentMethod
if TYPE_CHECKING: if TYPE_CHECKING:
from pyfragment.client import FragmentClient from pyfragment.client import FragmentClient
-25
View File
@@ -1,25 +0,0 @@
from pyfragment.models.anonymous_numbers import LoginCodeResult, TerminateSessionsResult
from pyfragment.models.cookies import CookieResult
from pyfragment.models.enums import PaymentMethod, WalletVersion
from pyfragment.models.giveaways import PremiumGiveawayResult, StarsGiveawayResult
from pyfragment.models.marketplace import GiftsResult, NumbersResult, UsernamesResult
from pyfragment.models.payments import AdsRechargeResult, AdsTopupResult, PremiumResult, StarsResult
from pyfragment.models.wallet import WalletInfo
__all__ = [
"AdsRechargeResult",
"AdsTopupResult",
"CookieResult",
"GiftsResult",
"LoginCodeResult",
"NumbersResult",
"PaymentMethod",
"PremiumGiveawayResult",
"PremiumResult",
"StarsGiveawayResult",
"StarsResult",
"TerminateSessionsResult",
"UsernamesResult",
"WalletInfo",
"WalletVersion",
]
+1 -1
View File
@@ -9,7 +9,7 @@ from tonutils.exceptions import ProviderResponseError
from pyfragment import TransactionError, WalletError from pyfragment import TransactionError, WalletError
from pyfragment.domains.tonapi.transaction import process_transaction from pyfragment.domains.tonapi.transaction import process_transaction
from pyfragment.models.enums import PaymentMethod from pyfragment.enums import PaymentMethod
from tests.shared import VALID_SEED from tests.shared import VALID_SEED
+1 -1
View File
@@ -15,7 +15,7 @@ from pyfragment.core.constants.limits import (
STARS_WINNERS_MAX, STARS_WINNERS_MAX,
STARS_WINNERS_MIN, STARS_WINNERS_MIN,
) )
from pyfragment.models.enums import PaymentMethod from pyfragment.enums import PaymentMethod
from tests.shared import FAKE_ACCOUNT, FAKE_RECIPIENT, FAKE_REQ_ID, FAKE_TRANSACTION, FAKE_TX_HASH from tests.shared import FAKE_ACCOUNT, FAKE_RECIPIENT, FAKE_REQ_ID, FAKE_TRANSACTION, FAKE_TX_HASH
# Stars purchase validation tests # Stars purchase validation tests
+1 -1
View File
@@ -9,7 +9,7 @@ import pyfragment.domains.purchases.purchase as _purchase_premium_mod
from pyfragment import ConfigurationError, FragmentClient, PremiumGiveawayResult, PremiumResult, UserNotFoundError from pyfragment import ConfigurationError, FragmentClient, PremiumGiveawayResult, PremiumResult, UserNotFoundError
from pyfragment.core.constants.limits import PREMIUM_MONTHS_VALID, PREMIUM_WINNERS_MAX, PREMIUM_WINNERS_MIN from pyfragment.core.constants.limits import PREMIUM_MONTHS_VALID, PREMIUM_WINNERS_MAX, PREMIUM_WINNERS_MIN
from pyfragment.exceptions import AlreadySubscribedError from pyfragment.exceptions import AlreadySubscribedError
from pyfragment.models.enums import PaymentMethod from pyfragment.enums import PaymentMethod
from tests.shared import FAKE_ACCOUNT, FAKE_RECIPIENT, FAKE_REQ_ID, FAKE_TRANSACTION, FAKE_TX_HASH from tests.shared import FAKE_ACCOUNT, FAKE_RECIPIENT, FAKE_REQ_ID, FAKE_TRANSACTION, FAKE_TX_HASH
# Premium purchase validation tests # Premium purchase validation tests