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
from pyfragment import ConfigurationError, FragmentClient, UserNotFoundError
from pyfragment.models.enums import PaymentMethod
from pyfragment.enums import PaymentMethod
SEED = "word1 word2 ... word24"
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
from pyfragment import ConfigurationError, FragmentClient, UserNotFoundError
from pyfragment.models.enums import PaymentMethod
from pyfragment.enums import PaymentMethod
SEED = "word1 word2 ... word24"
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
from pyfragment import ConfigurationError, FragmentClient, UserNotFoundError
from pyfragment.models.enums import PaymentMethod
from pyfragment.enums import PaymentMethod
SEED = "word1 word2 ... word24"
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
from pyfragment import ConfigurationError, FragmentClient, UserNotFoundError
from pyfragment.models.enums import PaymentMethod
from pyfragment.enums import PaymentMethod
SEED = "word1 word2 ... word24"
API_KEY = "YOUR_TONAPI_KEY"
+8 -7
View File
@@ -20,13 +20,14 @@ from pyfragment.exceptions import (
VerificationError,
WalletError,
)
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
from pyfragment.domains.anonymous_numbers.models import LoginCodeResult, TerminateSessionsResult
from pyfragment.core.models import CookieResult
from pyfragment.enums import PaymentMethod, WalletVersion
from pyfragment.domains.giveaways.models import PremiumGiveawayResult, StarsGiveawayResult
from pyfragment.domains.marketplace.models import GiftsResult, NumbersResult, UsernamesResult
from pyfragment.domains.ads.models import AdsRechargeResult, AdsTopupResult
from pyfragment.domains.purchases.models import PremiumResult, StarsResult
from pyfragment.domains.tonapi.models import WalletInfo
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.tonapi.service import TonapiService
from pyfragment.exceptions import ConfigurationError, CookieError
from pyfragment.models.anonymous_numbers import LoginCodeResult, TerminateSessionsResult
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
from pyfragment.domains.anonymous_numbers.models import LoginCodeResult, TerminateSessionsResult
from pyfragment.enums import PaymentMethod, WalletVersion
from pyfragment.domains.giveaways.models import PremiumGiveawayResult, StarsGiveawayResult
from pyfragment.domains.marketplace.models import GiftsResult, NumbersResult, UsernamesResult
from pyfragment.domains.ads.models import AdsRechargeResult, AdsTopupResult
from pyfragment.domains.purchases.models import PremiumResult, StarsResult
from pyfragment.domains.tonapi.models import WalletInfo
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.exceptions import CookieError
from pyfragment.models.cookies import CookieResult
from pyfragment.models.enums import SupportedBrowser
from pyfragment.core.models import CookieResult
from pyfragment.enums import SupportedBrowser
try:
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.transaction import process_transaction
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:
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.tonup import topup_gram
from pyfragment.domains.base import BaseService
from pyfragment.models.payments import AdsRechargeResult, AdsTopupResult
from pyfragment.domains.ads.models import AdsRechargeResult, AdsTopupResult
if TYPE_CHECKING:
pass
+1 -1
View File
@@ -16,7 +16,7 @@ from pyfragment.exceptions import (
UserNotFoundError,
VerificationError,
)
from pyfragment.models.payments import AdsTopupResult
from pyfragment.domains.ads.models import AdsTopupResult
if TYPE_CHECKING:
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.service import AnonymousNumbersService
from pyfragment.models.anonymous_numbers import LoginCodeResult, TerminateSessionsResult
from pyfragment.domains.anonymous_numbers.models import LoginCodeResult, TerminateSessionsResult
__all__ = [
"AnonymousNumbersService",
@@ -7,7 +7,7 @@ from typing import TYPE_CHECKING
from pyfragment.core.constants import NUMBERS_PAGE
from pyfragment.domains.anonymous_numbers.parser import parse_login_code
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:
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.base import BaseService
from pyfragment.models.anonymous_numbers import LoginCodeResult, TerminateSessionsResult
from pyfragment.domains.anonymous_numbers.models import LoginCodeResult, TerminateSessionsResult
if TYPE_CHECKING:
pass
+1 -1
View File
@@ -1,6 +1,6 @@
from pyfragment.domains.giveaways.giveaway import giveaway_premium, giveaway_stars
from pyfragment.domains.giveaways.service import GiveawaysService
from pyfragment.models.giveaways import PremiumGiveawayResult, StarsGiveawayResult
from pyfragment.domains.giveaways.models import PremiumGiveawayResult, StarsGiveawayResult
__all__ = [
"GiveawaysService",
+2 -2
View File
@@ -28,8 +28,8 @@ from pyfragment.exceptions import (
UserNotFoundError,
VerificationError,
)
from pyfragment.models.enums import PaymentMethod
from pyfragment.models.giveaways import PremiumGiveawayResult, StarsGiveawayResult
from pyfragment.enums import PaymentMethod
from pyfragment.domains.giveaways.models import PremiumGiveawayResult, StarsGiveawayResult
if TYPE_CHECKING:
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.giveaways.giveaway import giveaway_premium, giveaway_stars
from pyfragment.models.enums import PaymentMethod
from pyfragment.models.giveaways import PremiumGiveawayResult, StarsGiveawayResult
from pyfragment.enums import PaymentMethod
from pyfragment.domains.giveaways.models import PremiumGiveawayResult, StarsGiveawayResult
if TYPE_CHECKING:
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.service import MarketplaceService
from pyfragment.models.marketplace import GiftsResult, NumbersResult, UsernamesResult
from pyfragment.domains.marketplace.models import GiftsResult, NumbersResult, UsernamesResult
__all__ = [
"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.domains.marketplace.parser import parse_auction_rows, parse_gift_items
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:
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.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:
pass
+1 -1
View File
@@ -1,5 +1,5 @@
from pyfragment.domains.purchases.purchase import purchase_premium, purchase_stars
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"]
@@ -23,23 +23,4 @@ class StarsResult:
return f"StarsResult(username='{self.username}', amount={self.amount} stars, tx='{self.transaction_id}')"
@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", "PremiumResult", "StarsResult"]
__all__ = ["PremiumResult", "StarsResult"]
+2 -2
View File
@@ -25,8 +25,8 @@ from pyfragment.exceptions import (
UserNotFoundError,
VerificationError,
)
from pyfragment.models.enums import PaymentMethod
from pyfragment.models.payments import PremiumResult, StarsResult
from pyfragment.enums import PaymentMethod
from pyfragment.domains.purchases.models import PremiumResult, StarsResult
if TYPE_CHECKING:
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.purchases.purchase import purchase_premium, purchase_stars
from pyfragment.models.enums import PaymentMethod
from pyfragment.models.payments import PremiumResult, StarsResult
from pyfragment.enums import PaymentMethod
from pyfragment.domains.purchases.models import PremiumResult, StarsResult
if TYPE_CHECKING:
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.exceptions import WalletError
from pyfragment.models.enums import WALLET_CLASSES
from pyfragment.models.wallet import WalletInfo
from pyfragment.enums import WALLET_CLASSES
from pyfragment.domains.tonapi.models import WalletInfo
if TYPE_CHECKING:
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.tonapi.account import get_wallet_info
from pyfragment.models.wallet import WalletInfo
from pyfragment.domains.tonapi.models import WalletInfo
if TYPE_CHECKING:
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.exceptions import ParseError, TransactionError, WalletError
from pyfragment.models.enums import WALLET_CLASSES, PaymentMethod
from pyfragment.enums import WALLET_CLASSES, PaymentMethod
if TYPE_CHECKING:
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.domains.tonapi.transaction import process_transaction
from pyfragment.models.enums import PaymentMethod
from pyfragment.enums import PaymentMethod
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_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
# 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.core.constants.limits import PREMIUM_MONTHS_VALID, PREMIUM_WINNERS_MAX, PREMIUM_WINNERS_MIN
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
# Premium purchase validation tests