SYMBOL INDEX (1067 symbols across 149 files) FILE: pdf_bot/__main__.py function main (line 17) | def main( FILE: pdf_bot/account/account_repository.py class AccountRepository (line 6) | class AccountRepository: method __init__ (line 7) | def __init__(self, datastore_client: Client) -> None: method get_user (line 10) | def get_user(self, user_id: int) -> Entity | None: method upsert_user (line 16) | def upsert_user(self, user_id: int, language_code: str) -> None: FILE: pdf_bot/account/account_service.py class AccountService (line 7) | class AccountService: method __init__ (line 10) | def __init__( method create_user (line 16) | def create_user(self, telegram_user: User) -> None: FILE: pdf_bot/analytics/analytics_repository.py class AnalyticsRepository (line 8) | class AnalyticsRepository: method __init__ (line 9) | def __init__(self, api_client: Session, settings: Settings | dict[str,... method send_event (line 22) | def send_event(self, event: dict[str, Any]) -> None: FILE: pdf_bot/analytics/analytics_service.py class AnalyticsService (line 15) | class AnalyticsService: method __init__ (line 16) | def __init__( method send_event (line 24) | def send_event( FILE: pdf_bot/analytics/models.py class TaskType (line 4) | class TaskType(Enum): class EventAction (line 28) | class EventAction(Enum): FILE: pdf_bot/cli/cli_service.py class CLIService (line 11) | class CLIService: method compress_pdf (line 12) | def compress_pdf(self, input_path: Path, output_path: Path) -> None: method extract_pdf_images (line 19) | def extract_pdf_images(self, input_path: Path, output_path: Path) -> N... method _run_command (line 24) | def _run_command(command: str) -> None: FILE: pdf_bot/cli/exceptions.py class CLIServiceError (line 1) | class CLIServiceError(Exception): class CLINonZeroExitStatusError (line 5) | class CLINonZeroExitStatusError(CLIServiceError): FILE: pdf_bot/command/command_handler.py class MyCommandHandler (line 8) | class MyCommandHandler(AbstractTelegramHandler): method __init__ (line 13) | def __init__(self, command_service: CommandService, admin_telegram_id:... method handlers (line 18) | def handlers(self) -> list[BaseHandler]: FILE: pdf_bot/command/command_service.py class CommandService (line 14) | class CommandService: method __init__ (line 15) | def __init__(self, account_service: AccountService, language_service: ... method send_start_message (line 19) | async def send_start_message(self, update: Update, context: ContextTyp... method send_help_message (line 54) | async def send_help_message(self, update: Update, context: ContextType... method send_message_to_user (line 90) | async def send_message_to_user( FILE: pdf_bot/compare/compare_handler.py class CompareHandler (line 10) | class CompareHandler(AbstractTelegramHandler): method __init__ (line 13) | def __init__(self, compare_service: CompareService, telegram_service: ... method handlers (line 18) | def handlers(self) -> list[BaseHandler]: FILE: pdf_bot/compare/compare_service.py class CompareService (line 18) | class CompareService: method __init__ (line 23) | def __init__( method ask_first_pdf (line 33) | async def ask_first_pdf(self, update: Update, context: ContextTypes.DE... method check_first_pdf (line 49) | async def check_first_pdf(self, update: Update, context: ContextTypes.... method compare_pdfs (line 70) | async def compare_pdfs(self, update: Update, context: ContextTypes.DEF... method check_text (line 95) | async def check_text(self, update: Update, context: ContextTypes.DEFAU... FILE: pdf_bot/containers.py class Core (line 49) | class Core(containers.DeclarativeContainer): class Clients (line 78) | class Clients(containers.DeclarativeContainer): class Repositories (line 91) | class Repositories(containers.DeclarativeContainer): class Services (line 106) | class Services(containers.DeclarativeContainer): class Processors (line 205) | class Processors(containers.DeclarativeContainer): class Handlers (line 307) | class Handlers(containers.DeclarativeContainer): class Application (line 365) | class Application(containers.DeclarativeContainer): FILE: pdf_bot/datastore/datastore_client.py class MyDatastoreClient (line 5) | class MyDatastoreClient(Client): method __init__ (line 6) | def __init__(self, service_account_dict: dict) -> None: FILE: pdf_bot/error/error_callback_query_handler.py class ErrorCallbackQueryHandler (line 8) | class ErrorCallbackQueryHandler(AbstractTelegramHandler): method __init__ (line 9) | def __init__(self, error_service: ErrorService) -> None: method handlers (line 13) | def handlers(self) -> list[BaseHandler]: FILE: pdf_bot/error/error_handler.py class ErrorHandler (line 13) | class ErrorHandler: method __init__ (line 14) | def __init__(self, language_service: LanguageService) -> None: method callback (line 17) | async def callback(self, update: object, context: ContextTypes.DEFAULT... method _handle_error (line 30) | async def _handle_error(self, update: Update, context: ContextTypes.DE... method _handle_bad_request (line 41) | async def _handle_bad_request( method _send_message (line 66) | async def _send_message( FILE: pdf_bot/error/error_service.py class ErrorService (line 9) | class ErrorService: method __init__ (line 10) | def __init__(self, language_service: LanguageService) -> None: method process_unknown_callback_query (line 13) | async def process_unknown_callback_query( FILE: pdf_bot/errors.py class FileDataTypeError (line 6) | class FileDataTypeError(Exception): method __init__ (line 7) | def __init__(self, file_data: FileData, *args: object) -> None: class CallbackQueryDataTypeError (line 12) | class CallbackQueryDataTypeError(Exception): method __init__ (line 13) | def __init__(self, data: Any, *args: object) -> None: class UserIdError (line 18) | class UserIdError(Exception): FILE: pdf_bot/feedback/feedback_handler.py class FeedbackHandler (line 10) | class FeedbackHandler(AbstractTelegramHandler): method __init__ (line 13) | def __init__( method handlers (line 22) | def handlers(self) -> list[BaseHandler]: FILE: pdf_bot/feedback/feedback_repository.py class FeedbackRepository (line 7) | class FeedbackRepository: method __init__ (line 10) | def __init__(self, slack_client: WebClient) -> None: method save_feedback (line 13) | def save_feedback(self, chat_id: int, username: str, feedback: str) ->... FILE: pdf_bot/feedback/feedback_service.py class FeedbackService (line 14) | class FeedbackService: method __init__ (line 18) | def __init__( method ask_feedback (line 28) | async def ask_feedback(self, update: Update, context: ContextTypes.DEF... method check_text (line 36) | async def check_text(self, update: Update, context: ContextTypes.DEFAU... method _save_feedback (line 45) | async def _save_feedback(self, update: Update, context: ContextTypes.D... FILE: pdf_bot/file/file_handler.py class FileHandler (line 17) | class FileHandler(AbstractTelegramHandler): method __init__ (line 18) | def __init__(self, file_service: FileService, telegram_service: Telegr... method handlers (line 23) | def handlers(self) -> list[BaseHandler]: FILE: pdf_bot/file/file_service.py class FileService (line 14) | class FileService: method __init__ (line 15) | def __init__( method check_pdf (line 27) | async def check_pdf(self, update: Update, context: ContextTypes.DEFAUL... method check_image (line 35) | async def check_image(self, update: Update, context: ContextTypes.DEFA... method _get_file_data (line 43) | async def _get_file_data( FILE: pdf_bot/file_processor/abstract_file_processor.py class AbstractFileProcessor (line 27) | class AbstractFileProcessor(FileTaskMixin, ABC): method __init__ (line 30) | def __init__( method get_task_data_list (line 46) | def get_task_data_list(cls) -> Sequence[TaskData]: method get_handlers (line 50) | def get_handlers(cls) -> list[BaseHandler]: method task_type (line 55) | def task_type(self) -> TaskType: method task_data (line 60) | def task_data(self) -> TaskData: method handler (line 65) | def handler(self) -> BaseHandler: method process_file_task (line 70) | async def process_file_task(self, file_data: FileData) -> AsyncGenerat... method generic_error_types (line 74) | def generic_error_types(self) -> set[type[Exception]]: method custom_error_handlers (line 78) | def custom_error_handlers( method ask_task (line 83) | async def ask_task(self, update: Update, context: ContextTypes.DEFAULT... method process_file (line 92) | async def process_file(self, update: Update, context: ContextTypes.DEF... method _process_file_task (line 123) | async def _process_file_task( method _process_previous_message (line 151) | async def _process_previous_message( method _get_error_handlers (line 165) | def _get_error_handlers( method _handle_generic_error (line 174) | async def _handle_generic_error( FILE: pdf_bot/file_processor/abstract_file_task_processor.py class AbstractFileTaskProcessor (line 12) | class AbstractFileTaskProcessor(FileTaskMixin, ABC): method __init__ (line 13) | def __init__(self, language_service: LanguageService) -> None: method processor_type (line 18) | def processor_type(self) -> type[AbstractFileProcessor]: method ask_task (line 21) | async def ask_task(self, update: Update, context: CallbackContext) -> ... FILE: pdf_bot/file_processor/errors.py class DuplicateClassError (line 1) | class DuplicateClassError(Exception): method __init__ (line 2) | def __init__(self, cls_name: str, *args: object) -> None: FILE: pdf_bot/file_processor/file_task_mixin.py class FileTaskMixin (line 19) | class FileTaskMixin: method ask_task_helper (line 23) | async def ask_task_helper( FILE: pdf_bot/image/image_service.py class ImageService (line 15) | class ImageService: method __init__ (line 16) | def __init__( method beautify_and_convert_images_to_pdf (line 27) | async def beautify_and_convert_images_to_pdf( method convert_images_to_pdf (line 39) | async def convert_images_to_pdf( method _get_file_ids (line 51) | def _get_file_ids(file_data_list: list[FileData]) -> list[str]: FILE: pdf_bot/image_handler/batch_image_handler.py class BatchImageHandler (line 10) | class BatchImageHandler(AbstractTelegramHandler): method __init__ (line 13) | def __init__( method handlers (line 20) | def handlers(self) -> list[BaseHandler]: FILE: pdf_bot/image_handler/batch_image_service.py class BatchImageService (line 16) | class BatchImageService: method __init__ (line 24) | def __init__( method ask_first_image (line 34) | async def ask_first_image(self, update: Update, context: ContextTypes.... method check_image (line 53) | async def check_image(self, update: Update, context: ContextTypes.DEFA... method check_text (line 71) | async def check_text(self, update: Update, context: ContextTypes.DEFAU... method _ask_next_image (line 90) | async def _ask_next_image(self, update: Update, context: ContextTypes.... method _remove_last_image (line 115) | async def _remove_last_image( method _preprocess_images (line 140) | async def _preprocess_images( method _process_images (line 159) | async def _process_images( method _append_file_data (line 191) | def _append_file_data( FILE: pdf_bot/image_processor/abstract_image_processor.py class AbstractImageProcessor (line 11) | class AbstractImageProcessor(AbstractFileProcessor): method __init__ (line 14) | def __init__( method get_task_data_list (line 31) | def get_task_data_list(cls) -> list[TaskData]: FILE: pdf_bot/image_processor/beautify_image_processor.py class BeautifyImageData (line 13) | class BeautifyImageData(FileData): class BeautifyImageProcessor (line 17) | class BeautifyImageProcessor(AbstractImageProcessor): method task_type (line 19) | def task_type(self) -> TaskType: method task_data (line 23) | def task_data(self) -> TaskData: method handler (line 27) | def handler(self) -> CallbackQueryHandler: method process_file_task (line 31) | async def process_file_task(self, file_data: FileData) -> AsyncGenerat... FILE: pdf_bot/image_processor/image_task_processor.py class ImageTaskProcessor (line 6) | class ImageTaskProcessor(AbstractFileTaskProcessor): method processor_type (line 8) | def processor_type(self) -> type[AbstractImageProcessor]: FILE: pdf_bot/image_processor/image_to_pdf_processor.py class ImageToPdfData (line 13) | class ImageToPdfData(FileData): class ImageToPdfProcessor (line 17) | class ImageToPdfProcessor(AbstractImageProcessor): method task_type (line 19) | def task_type(self) -> TaskType: method task_data (line 23) | def task_data(self) -> TaskData: method handler (line 27) | def handler(self) -> CallbackQueryHandler: method process_file_task (line 31) | async def process_file_task(self, file_data: FileData) -> AsyncGenerat... FILE: pdf_bot/io_internal/io_service.py class IOService (line 7) | class IOService: method create_temp_directory (line 10) | def create_temp_directory(prefix: str | None = None) -> Generator[Path... method create_temp_file (line 22) | def create_temp_file( method create_temp_files (line 36) | def create_temp_files(num_files: int) -> Generator[list[Path], None, N... method create_temp_pdf_file (line 45) | def create_temp_pdf_file(self, prefix: str | None = None) -> Generator... method create_temp_png_file (line 50) | def create_temp_png_file(self, prefix: str) -> Generator[Path, None, N... method create_temp_txt_file (line 55) | def create_temp_txt_file(self, prefix: str) -> Generator[Path, None, N... FILE: pdf_bot/language/language_handler.py class LanguageHandler (line 9) | class LanguageHandler(AbstractTelegramHandler): method __init__ (line 12) | def __init__(self, language_service: LanguageService) -> None: method handlers (line 16) | def handlers(self) -> list[BaseHandler]: FILE: pdf_bot/language/language_repository.py class LanguageRepository (line 6) | class LanguageRepository: method __init__ (line 10) | def __init__(self, datastore_client: Client) -> None: method get_language (line 13) | def get_language(self, user_id: int) -> str: method upsert_language (line 28) | def upsert_language(self, user_id: int, language_code: str) -> None: FILE: pdf_bot/language/language_service.py class LanguageService (line 15) | class LanguageService: method __init__ (line 65) | def __init__(self, language_repository: LanguageRepository) -> None: method get_language_code_from_short_code (line 68) | def get_language_code_from_short_code(self, short_code: str) -> str | ... method send_language_options (line 74) | async def send_language_options( method get_user_language (line 89) | def get_user_language(self, update: Update, context: ContextTypes.DEFA... method update_user_language (line 103) | async def update_user_language( method set_app_language (line 122) | def set_app_language( method _answer_query_and_drop_data (line 130) | async def _answer_query_and_drop_data( method _get_languages_markup (line 137) | def _get_languages_markup( method _get_user_id (line 154) | def _get_user_id(self, update: Update) -> int: FILE: pdf_bot/language/models.py class SetLanguageData (line 4) | class SetLanguageData: class LanguageData (line 8) | class LanguageData(BaseModel): method short_code (line 13) | def short_code(self) -> str: FILE: pdf_bot/log/log_handler.py class InterceptLoggingHandler (line 8) | class InterceptLoggingHandler(logging.Handler): method emit (line 9) | def emit(self, record: logging.LogRecord) -> None: class MyLogHandler (line 25) | class MyLogHandler: method __init__ (line 29) | def __init__(self, intercept_logging_handler: InterceptLoggingHandler)... method setup (line 32) | def setup(self) -> None: FILE: pdf_bot/merge/merge_handler.py class MergeHandler (line 10) | class MergeHandler(AbstractTelegramHandler): method __init__ (line 13) | def __init__(self, merge_service: MergeService, telegram_service: Tele... method handlers (line 18) | def handlers(self) -> list[BaseHandler]: FILE: pdf_bot/merge/merge_service.py class MergeService (line 16) | class MergeService: method __init__ (line 21) | def __init__( method ask_first_pdf (line 31) | async def ask_first_pdf(self, update: Update, context: ContextTypes.DE... method check_pdf (line 45) | async def check_pdf(self, update: Update, context: ContextTypes.DEFAUL... method check_text (line 63) | async def check_text(self, update: Update, context: ContextTypes.DEFAU... method _ask_next_pdf (line 82) | async def _ask_next_pdf(self, update: Update, context: ContextTypes.DE... method _remove_last_pdf (line 108) | async def _remove_last_pdf( method _preprocess_pdfs (line 135) | async def _preprocess_pdfs( method _merge_pdfs (line 154) | async def _merge_pdfs( method _append_file_data (line 172) | def _append_file_data(self, context: ContextTypes.DEFAULT_TYPE, docume... FILE: pdf_bot/models.py class BackData (line 7) | class BackData: class SupportData (line 11) | class SupportData: class FileData (line 16) | class FileData: method from_telegram_object (line 21) | def from_telegram_object(cls, obj: Document | PhotoSize) -> "FileData": class TaskData (line 28) | class TaskData: method get_file_data (line 32) | def get_file_data(self, obj: Document | PhotoSize) -> FileData: class MessageData (line 37) | class MessageData: method from_telegram_message (line 42) | def from_telegram_message(cls, message: Message) -> "MessageData": class FileTaskResult (line 47) | class FileTaskResult: FILE: pdf_bot/payment/models.py class PaymentData (line 4) | class PaymentData(BaseModel): FILE: pdf_bot/payment/payment_handler.py class PaymentHandler (line 17) | class PaymentHandler(AbstractTelegramHandler): method __init__ (line 21) | def __init__(self, payment_service: PaymentService) -> None: method handlers (line 25) | def handlers(self) -> list[BaseHandler]: FILE: pdf_bot/payment/payment_service.py class PaymentService (line 23) | class PaymentService: method __init__ (line 36) | def __init__( method send_support_options (line 46) | async def send_support_options( method send_invoice (line 61) | async def send_invoice(self, update: Update, context: ContextTypes.DEF... method precheckout_check (line 84) | async def precheckout_check(self, update: Update, context: ContextType... method successful_payment (line 93) | async def successful_payment(self, update: Update, context: ContextTyp... method _get_support_options_markup (line 98) | def _get_support_options_markup( FILE: pdf_bot/pdf/exceptions.py class PdfServiceError (line 4) | class PdfServiceError(Exception): class PdfReadError (line 8) | class PdfReadError(PdfServiceError): class PdfDecryptError (line 12) | class PdfDecryptError(PdfServiceError): class PdfIncorrectPasswordError (line 16) | class PdfIncorrectPasswordError(PdfServiceError): class PdfNoTextError (line 20) | class PdfNoTextError(PdfServiceError): class PdfNoImagesError (line 24) | class PdfNoImagesError(PdfServiceError): class PdfEncryptedError (line 28) | class PdfEncryptedError(PdfServiceError): method __init__ (line 31) | def __init__(self, *args: object, **kwargs: object) -> None: FILE: pdf_bot/pdf/models.py class CompressResult (line 8) | class CompressResult: method reduced_percentage (line 14) | def reduced_percentage(self) -> float: method readable_old_size (line 18) | def readable_old_size(self) -> str: method readable_new_size (line 22) | def readable_new_size(self) -> str: method _readable_size (line 26) | def _readable_size(size: int) -> str: class FontData (line 31) | class FontData: class ScaleData (line 37) | class ScaleData: method __str__ (line 41) | def __str__(self) -> str: # pragma: no cover method from_string (line 45) | def from_string(value: str) -> "ScaleData": class ScaleByData (line 50) | class ScaleByData(ScaleData): class ScaleToData (line 54) | class ScaleToData(ScaleData): FILE: pdf_bot/pdf/pdf_service.py class PdfService (line 40) | class PdfService: method __init__ (line 41) | def __init__( method add_watermark_to_pdf (line 52) | async def add_watermark_to_pdf( method grayscale_pdf (line 69) | async def grayscale_pdf(self, file_id: str) -> AsyncGenerator[Path, No... method compare_pdfs (line 88) | async def compare_pdfs(self, file_id_a: str, file_id_b: str) -> AsyncG... method compress_pdf (line 98) | async def compress_pdf(self, file_id: str) -> AsyncGenerator[CompressR... method convert_pdf_to_images (line 107) | async def convert_pdf_to_images(self, file_id: str) -> AsyncGenerator[... method create_pdf_from_text (line 114) | async def create_pdf_from_text( method crop_pdf_by_percentage (line 142) | async def crop_pdf_by_percentage( method crop_pdf_by_margin_size (line 151) | async def crop_pdf_by_margin_size( method decrypt_pdf (line 160) | async def decrypt_pdf(self, file_id: str, password: str) -> AsyncGener... method encrypt_pdf (line 181) | async def encrypt_pdf(self, file_id: str, password: str) -> AsyncGener... method extract_pdf_images (line 193) | async def extract_pdf_images(self, file_id: str) -> AsyncGenerator[Pat... method extract_pdf_text (line 206) | async def extract_pdf_text(self, file_id: str) -> AsyncGenerator[Path,... method merge_pdfs (line 223) | async def merge_pdfs(self, file_data_list: list[FileData]) -> AsyncGen... method ocr_pdf (line 241) | async def ocr_pdf(self, file_id: str) -> AsyncGenerator[Path, None]: method preview_pdf (line 253) | async def preview_pdf(self, file_id: str) -> AsyncGenerator[Path, None]: method rename_pdf (line 269) | async def rename_pdf(self, file_id: str, file_name: str) -> AsyncGener... method rotate_pdf (line 277) | async def rotate_pdf(self, file_id: str, degree: int) -> AsyncGenerato... method scale_pdf_by_factor (line 288) | async def scale_pdf_by_factor( method scale_pdf_to_dimension (line 302) | async def scale_pdf_to_dimension( method split_range_valid (line 316) | def split_range_valid(split_range: str) -> bool: method split_pdf (line 320) | async def split_pdf(self, file_id: str, split_range: str) -> AsyncGene... method _get_file_ids (line 329) | def _get_file_ids(file_data_list: list[FileData]) -> list[str]: method _open_pdf (line 332) | async def _open_pdf(self, file_id: str, allow_encrypted: bool = False)... method _write_pdf (line 344) | def _write_pdf(self, writer: PdfWriter, file_prefix: str) -> Generator... FILE: pdf_bot/pdf_processor/abstract_pdf_processor.py class AbstractPdfProcessor (line 11) | class AbstractPdfProcessor(AbstractFileProcessor): method __init__ (line 14) | def __init__( method get_task_data_list (line 31) | def get_task_data_list(cls) -> list[TaskData]: method generic_error_types (line 35) | def generic_error_types(self) -> set[type[Exception]]: FILE: pdf_bot/pdf_processor/abstract_pdf_select_and_text_processor.py class SelectOption (line 24) | class SelectOption(Enum): method ask_value_text (line 27) | def ask_value_text(self) -> str: class SelectOptionData (line 32) | class SelectOptionData(FileData): class OptionAndInputData (line 37) | class OptionAndInputData(SelectOptionData): class AbstractPdfSelectAndTextProcessor (line 41) | class AbstractPdfSelectAndTextProcessor(AbstractPdfProcessor): method entry_point_data_type (line 47) | def entry_point_data_type(self) -> type[FileData]: method ask_select_option_text (line 52) | def ask_select_option_text(self) -> str: method select_option_type (line 57) | def select_option_type(self) -> type[SelectOption]: method get_cleaned_text_input (line 61) | def get_cleaned_text_input(self, text: str) -> str | Any | None: method invalid_text_input_error (line 66) | def invalid_text_input_error(self) -> str: method option_and_input_data_type (line 70) | def option_and_input_data_type(self) -> type[OptionAndInputData]: method handler (line 74) | def handler(self) -> ConversationHandler: method _ask_select_option (line 98) | async def _ask_select_option(self, update: Update, context: ContextTyp... method _get_ask_select_option_markup (line 114) | def _get_ask_select_option_markup( method _ask_text_input (line 138) | async def _ask_text_input(self, update: Update, context: ContextTypes.... method _get_ask_text_input_markup (line 157) | def _get_ask_text_input_markup( method _process_text_input (line 174) | async def _process_text_input( FILE: pdf_bot/pdf_processor/abstract_pdf_text_input_processor.py class TextInputData (line 26) | class TextInputData(FileData): class AbstractPdfTextInputProcessor (line 30) | class AbstractPdfTextInputProcessor(AbstractPdfProcessor): method entry_point_data_type (line 35) | def entry_point_data_type(self) -> type[FileData]: method get_ask_text_input_text (line 39) | def get_ask_text_input_text(self, _: Callable[[str], str]) -> str: method get_cleaned_text_input (line 43) | def get_cleaned_text_input(self, text: str) -> str | None: method invalid_text_input_error (line 48) | def invalid_text_input_error(self) -> str: method handler (line 52) | def handler(self) -> ConversationHandler: method _ask_text_input (line 70) | async def _ask_text_input(self, update: Update, context: ContextTypes.... method _process_text_input (line 85) | async def _process_text_input( FILE: pdf_bot/pdf_processor/compress_pdf_processor.py class CompressPdfData (line 13) | class CompressPdfData(FileData): class CompressPdfProcessor (line 17) | class CompressPdfProcessor(AbstractPdfProcessor): method task_type (line 19) | def task_type(self) -> TaskType: method task_data (line 23) | def task_data(self) -> TaskData: method handler (line 27) | def handler(self) -> CallbackQueryHandler: method process_file_task (line 31) | async def process_file_task(self, file_data: FileData) -> AsyncGenerat... FILE: pdf_bot/pdf_processor/crop_pdf_processor.py class CropType (line 16) | class CropType(SelectOption): method ask_value_text (line 21) | def ask_value_text(self) -> str: # pragma: no cover class CropPdfData (line 37) | class CropPdfData(FileData): class CropOptionAndInputData (line 41) | class CropOptionAndInputData(OptionAndInputData): class CropPdfProcessor (line 45) | class CropPdfProcessor(AbstractPdfSelectAndTextProcessor): method entry_point_data_type (line 47) | def entry_point_data_type(self) -> type[CropPdfData]: method task_type (line 51) | def task_type(self) -> TaskType: method task_data (line 55) | def task_data(self) -> TaskData: method ask_select_option_text (line 59) | def ask_select_option_text(self) -> str: # pragma: no cover method select_option_type (line 63) | def select_option_type(self) -> type[CropType]: method invalid_text_input_error (line 67) | def invalid_text_input_error(self) -> str: # pragma: no cover method option_and_input_data_type (line 71) | def option_and_input_data_type(self) -> type[CropOptionAndInputData]: method get_cleaned_text_input (line 74) | def get_cleaned_text_input(self, text: str) -> float | None: method process_file_task (line 81) | async def process_file_task(self, file_data: FileData) -> AsyncGenerat... FILE: pdf_bot/pdf_processor/decrypt_pdf_processor.py class DecryptPdfData (line 18) | class DecryptPdfData(FileData): class DecryptPdfProcessor (line 22) | class DecryptPdfProcessor(AbstractPdfTextInputProcessor): method task_type (line 24) | def task_type(self) -> TaskType: method entry_point_data_type (line 28) | def entry_point_data_type(self) -> type[DecryptPdfData]: method task_data (line 32) | def task_data(self) -> TaskData: method invalid_text_input_error (line 36) | def invalid_text_input_error(self) -> str: # pragma: no cover method get_ask_text_input_text (line 39) | def get_ask_text_input_text(self, _: Callable[[str], str]) -> str: # ... method get_cleaned_text_input (line 42) | def get_cleaned_text_input(self, text: str) -> str: method custom_error_handlers (line 46) | def custom_error_handlers(self) -> dict[type[Exception], ErrorHandlerT... method process_file_task (line 50) | async def process_file_task(self, file_data: FileData) -> AsyncGenerat... method _handle_incorrect_password (line 57) | async def _handle_incorrect_password( FILE: pdf_bot/pdf_processor/encrypt_pdf_processor.py class EncryptPdfData (line 12) | class EncryptPdfData(FileData): class EncryptPdfProcessor (line 16) | class EncryptPdfProcessor(AbstractPdfTextInputProcessor): method task_type (line 18) | def task_type(self) -> TaskType: method entry_point_data_type (line 22) | def entry_point_data_type(self) -> type[EncryptPdfData]: method task_data (line 26) | def task_data(self) -> TaskData: method invalid_text_input_error (line 30) | def invalid_text_input_error(self) -> str: # pragma: no cover method get_ask_text_input_text (line 33) | def get_ask_text_input_text(self, _: Callable[[str], str]) -> str: # ... method get_cleaned_text_input (line 36) | def get_cleaned_text_input(self, text: str) -> str: method process_file_task (line 40) | async def process_file_task(self, file_data: FileData) -> AsyncGenerat... FILE: pdf_bot/pdf_processor/extract_pdf_image_processor.py class ExtractPdfImageData (line 13) | class ExtractPdfImageData(FileData): class ExtractPdfImageProcessor (line 17) | class ExtractPdfImageProcessor(AbstractPdfProcessor): method task_type (line 19) | def task_type(self) -> TaskType: method task_data (line 23) | def task_data(self) -> TaskData: method handler (line 27) | def handler(self) -> CallbackQueryHandler: method process_file_task (line 31) | async def process_file_task(self, file_data: FileData) -> AsyncGenerat... FILE: pdf_bot/pdf_processor/extract_pdf_text_processor.py class ExtractPdfTextData (line 13) | class ExtractPdfTextData(FileData): class ExtractPdfTextProcessor (line 17) | class ExtractPdfTextProcessor(AbstractPdfProcessor): method task_type (line 19) | def task_type(self) -> TaskType: method task_data (line 23) | def task_data(self) -> TaskData: method handler (line 27) | def handler(self) -> CallbackQueryHandler: method process_file_task (line 31) | async def process_file_task(self, file_data: FileData) -> AsyncGenerat... FILE: pdf_bot/pdf_processor/grayscale_pdf_processor.py class GrayscalePdfData (line 13) | class GrayscalePdfData(FileData): class GrayscalePdfProcessor (line 17) | class GrayscalePdfProcessor(AbstractPdfProcessor): method task_type (line 19) | def task_type(self) -> TaskType: method task_data (line 23) | def task_data(self) -> TaskData: method handler (line 27) | def handler(self) -> CallbackQueryHandler: method process_file_task (line 31) | async def process_file_task(self, file_data: FileData) -> AsyncGenerat... FILE: pdf_bot/pdf_processor/ocr_pdf_processor.py class OcrPdfData (line 12) | class OcrPdfData(FileData): class OcrPdfProcessor (line 16) | class OcrPdfProcessor(AbstractPdfProcessor): method task_type (line 18) | def task_type(self) -> TaskType: method task_data (line 22) | def task_data(self) -> TaskData: method handler (line 26) | def handler(self) -> CallbackQueryHandler: method process_file_task (line 30) | async def process_file_task(self, file_data: FileData) -> AsyncGenerat... FILE: pdf_bot/pdf_processor/pdf_task_processor.py class PdfTaskProcessor (line 6) | class PdfTaskProcessor(AbstractFileTaskProcessor): method processor_type (line 8) | def processor_type(self) -> type[AbstractPdfProcessor]: FILE: pdf_bot/pdf_processor/pdf_to_image_processor.py class PdfToImageData (line 13) | class PdfToImageData(FileData): class PdfToImageProcessor (line 17) | class PdfToImageProcessor(AbstractPdfProcessor): method task_type (line 19) | def task_type(self) -> TaskType: method task_data (line 23) | def task_data(self) -> TaskData: method handler (line 27) | def handler(self) -> CallbackQueryHandler: method process_file_task (line 31) | async def process_file_task(self, file_data: FileData) -> AsyncGenerat... FILE: pdf_bot/pdf_processor/preview_pdf_processor.py class PreviewPdfData (line 13) | class PreviewPdfData(FileData): class PreviewPdfProcessor (line 17) | class PreviewPdfProcessor(AbstractPdfProcessor): method task_type (line 19) | def task_type(self) -> TaskType: method task_data (line 23) | def task_data(self) -> TaskData: method handler (line 27) | def handler(self) -> CallbackQueryHandler: method process_file_task (line 31) | async def process_file_task(self, file_data: FileData) -> AsyncGenerat... FILE: pdf_bot/pdf_processor/rename_pdf_processor.py class RenamePdfData (line 13) | class RenamePdfData(FileData): class RenamePdfProcessor (line 17) | class RenamePdfProcessor(AbstractPdfTextInputProcessor): method task_type (line 21) | def task_type(self) -> TaskType: method entry_point_data_type (line 25) | def entry_point_data_type(self) -> type[RenamePdfData]: method task_data (line 29) | def task_data(self) -> TaskData: method invalid_text_input_error (line 33) | def invalid_text_input_error(self) -> str: # pragma: no cover method get_ask_text_input_text (line 39) | def get_ask_text_input_text(self, _: Callable[[str], str]) -> str: # ... method get_cleaned_text_input (line 42) | def get_cleaned_text_input(self, text: str) -> str | None: method process_file_task (line 49) | async def process_file_task(self, file_data: FileData) -> AsyncGenerat... FILE: pdf_bot/pdf_processor/rotate_pdf_processor.py class RotatePdfData (line 19) | class RotatePdfData(FileData): class RotateDegreeData (line 24) | class RotateDegreeData(RotatePdfData): class RotatePdfProcessor (line 28) | class RotatePdfProcessor(AbstractPdfProcessor): method task_type (line 33) | def task_type(self) -> TaskType: method task_data (line 37) | def task_data(self) -> TaskData: method handler (line 41) | def handler(self) -> ConversationHandler: method process_file_task (line 58) | async def process_file_task(self, file_data: FileData) -> AsyncGenerat... method ask_degree (line 65) | async def ask_degree(self, update: Update, context: ContextTypes.DEFAU... method _get_ask_degree_reply_markup (line 82) | def _get_ask_degree_reply_markup( FILE: pdf_bot/pdf_processor/scale_pdf_processor.py class ScaleType (line 17) | class ScaleType(SelectOption): method ask_value_text (line 22) | def ask_value_text(self) -> str: # pragma: no cover class ScalePdfData (line 37) | class ScalePdfData(FileData): class ScaleOptionAndInputData (line 41) | class ScaleOptionAndInputData(OptionAndInputData): class ScalePdfProcessor (line 45) | class ScalePdfProcessor(AbstractPdfSelectAndTextProcessor): method entry_point_data_type (line 47) | def entry_point_data_type(self) -> type[ScalePdfData]: method task_type (line 51) | def task_type(self) -> TaskType: method task_data (line 55) | def task_data(self) -> TaskData: method ask_select_option_text (line 59) | def ask_select_option_text(self) -> str: # pragma: no cover method select_option_type (line 63) | def select_option_type(self) -> type[ScaleType]: method invalid_text_input_error (line 67) | def invalid_text_input_error(self) -> str: # pragma: no cover method option_and_input_data_type (line 71) | def option_and_input_data_type(self) -> type[ScaleOptionAndInputData]: method get_cleaned_text_input (line 74) | def get_cleaned_text_input(self, text: str) -> ScaleData | None: method process_file_task (line 81) | async def process_file_task(self, file_data: FileData) -> AsyncGenerat... FILE: pdf_bot/pdf_processor/split_pdf_processor.py class SplitPdfData (line 12) | class SplitPdfData(FileData): class SplitPdfProcessor (line 16) | class SplitPdfProcessor(AbstractPdfTextInputProcessor): method task_type (line 20) | def task_type(self) -> TaskType: method entry_point_data_type (line 24) | def entry_point_data_type(self) -> type[SplitPdfData]: method task_data (line 28) | def task_data(self) -> TaskData: method invalid_text_input_error (line 32) | def invalid_text_input_error(self) -> str: # pragma: no cover method get_ask_text_input_text (line 35) | def get_ask_text_input_text(self, _: Callable[[str], str]) -> str: # ... method get_cleaned_text_input (line 78) | def get_cleaned_text_input(self, text: str) -> str | None: method process_file_task (line 84) | async def process_file_task(self, file_data: FileData) -> AsyncGenerat... FILE: pdf_bot/settings.py class Settings (line 7) | class Settings(BaseSettings): FILE: pdf_bot/telegram_handler/abstract_telegram_handler.py class AbstractTelegramHandler (line 6) | class AbstractTelegramHandler(ABC): method handlers (line 9) | def handlers(self) -> list[BaseHandler]: FILE: pdf_bot/telegram_internal/exceptions.py class TelegramServiceError (line 1) | class TelegramServiceError(Exception): class TelegramFileMimeTypeError (line 5) | class TelegramFileMimeTypeError(TelegramServiceError): class TelegramFileTooLargeError (line 9) | class TelegramFileTooLargeError(TelegramServiceError): class TelegramGetUserDataError (line 13) | class TelegramGetUserDataError(TelegramServiceError): class TelegramUpdateUserDataError (line 17) | class TelegramUpdateUserDataError(TelegramServiceError): class TelegramImageNotFoundError (line 21) | class TelegramImageNotFoundError(TelegramServiceError): FILE: pdf_bot/telegram_internal/telegram_service.py class _ReplyData (line 38) | class _ReplyData(BaseModel): class TelegramService (line 44) | class TelegramService: method __init__ (line 51) | def __init__( method check_file_size (line 64) | def check_file_size(file: Document | PhotoSize) -> None: method check_file_upload_size (line 77) | def check_file_upload_size(path: Path) -> None: method get_user_data (line 88) | def get_user_data(context: ContextTypes.DEFAULT_TYPE, key: str) -> Any: method user_data_contains (line 112) | def user_data_contains(context: ContextTypes.DEFAULT_TYPE, key: str) -... method update_user_data (line 116) | def update_user_data(context: ContextTypes.DEFAULT_TYPE, key: str, val... method get_file_data (line 121) | def get_file_data(self, context: ContextTypes.DEFAULT_TYPE) -> FileData: method cache_file_data (line 125) | def cache_file_data(self, context: ContextTypes.DEFAULT_TYPE, file_dat... method get_message_data (line 128) | def get_message_data(self, context: ContextTypes.DEFAULT_TYPE) -> Mess... method cache_message_data (line 132) | def cache_message_data( method answer_query_and_drop_data (line 141) | async def answer_query_and_drop_data( method check_image (line 148) | def check_image(self, message: Message) -> Document | PhotoSize: method check_pdf_document (line 167) | def check_pdf_document(self, message: Message) -> Document: method download_pdf_file (line 177) | async def download_pdf_file(self, file_id: str) -> AsyncGenerator[Path... method download_files (line 184) | async def download_files(self, file_ids: list[str]) -> AsyncGenerator[... method cancel_conversation (line 191) | async def cancel_conversation(self, update: Update, context: ContextTy... method get_back_button (line 204) | def get_back_button( method get_back_inline_markup (line 210) | def get_back_inline_markup( method get_support_markup (line 216) | def get_support_markup( method reply_with_back_markup (line 229) | def reply_with_back_markup( method reply_with_cancel_markup (line 239) | def reply_with_cancel_markup( method send_file (line 249) | async def send_file( method send_file_names (line 285) | async def send_file_names( method send_message (line 303) | async def send_message( method _get_chat_id (line 311) | def _get_chat_id(update: Update) -> int: method _reply_with_markup (line 322) | def _reply_with_markup( FILE: pdf_bot/text/text_handler.py class TextHandler (line 10) | class TextHandler(AbstractTelegramHandler): method __init__ (line 13) | def __init__(self, text_service: TextService, telegram_service: Telegr... method handlers (line 18) | def handlers(self) -> list[BaseHandler]: FILE: pdf_bot/text/text_repository.py class TextRepository (line 6) | class TextRepository: method __init__ (line 7) | def __init__(self, api_client: Session, google_fonts_token: str) -> None: method get_font (line 11) | def get_font(self, font: str) -> FontData | None: FILE: pdf_bot/text/text_service.py class TextService (line 16) | class TextService: method __init__ (line 23) | def __init__( method ask_pdf_text (line 35) | async def ask_pdf_text(self, update: Update, context: ContextTypes.DEF... method ask_pdf_font (line 44) | async def ask_pdf_font(self, update: Update, context: ContextTypes.DEF... method check_text (line 73) | async def check_text(self, update: Update, context: ContextTypes.DEFAU... method _text_to_pdf (line 93) | async def _text_to_pdf( FILE: pdf_bot/watermark/watermark_handler.py class WatermarkHandler (line 10) | class WatermarkHandler(AbstractTelegramHandler): method __init__ (line 13) | def __init__( method handlers (line 20) | def handlers(self) -> list[BaseHandler]: FILE: pdf_bot/watermark/watermark_service.py class WatermarkService (line 18) | class WatermarkService: method __init__ (line 23) | def __init__( method ask_source_pdf (line 33) | async def ask_source_pdf(self, update: Update, context: ContextTypes.D... method check_source_pdf (line 42) | async def check_source_pdf(self, update: Update, context: ContextTypes... method add_watermark_to_pdf (line 60) | async def add_watermark_to_pdf(self, update: Update, context: ContextT... method check_text (line 88) | async def check_text(self, update: Update, context: ContextTypes.DEFAU... FILE: pdf_bot/webpage/webpage_handler.py class WebpageHandler (line 9) | class WebpageHandler(AbstractTelegramHandler): method __init__ (line 10) | def __init__(self, webpage_service: WebpageService) -> None: method handlers (line 14) | def handlers(self) -> list[BaseHandler]: FILE: pdf_bot/webpage/webpage_service.py class WebpageService (line 22) | class WebpageService: method __init__ (line 23) | def __init__( method url_to_pdf (line 33) | async def url_to_pdf(self, update: Update, context: ContextTypes.DEFAU... method _cache_url (line 50) | def _cache_url(self, context: ContextTypes.DEFAULT_TYPE, url_hash: str... method _clear_url_cache (line 54) | def _clear_url_cache(self, context: ContextTypes.DEFAULT_TYPE, url_has... method _url_to_pdf (line 58) | async def _url_to_pdf( FILE: tests/account/test_account_repository.py class TestAccountRepository (line 9) | class TestAccountRepository: method setup_method (line 13) | def setup_method(self) -> None: method test_get_user (line 19) | def test_get_user(self) -> None: method test_get_user_null (line 24) | def test_get_user_null(self) -> None: method test_upsert_user (line 29) | def test_upsert_user(self) -> None: method test_upsert_user_language_exists (line 39) | def test_upsert_user_language_exists(self) -> None: method test_upsert_user_new_user (line 49) | def test_upsert_user_new_user(self) -> None: FILE: tests/account/test_account_service.py class TestAccountService (line 9) | class TestAccountService(LanguageServiceTestMixin): method setup_method (line 13) | def setup_method(self) -> None: method test_create_user (line 23) | def test_create_user(self) -> None: method test_create_user_with_language_code (line 28) | def test_create_user_with_language_code(self) -> None: method test_create_user_with_invalid_language_code (line 37) | def test_create_user_with_invalid_language_code(self) -> None: FILE: tests/analytics/test_analytics_repository.py class TestAnalyticsRepository (line 10) | class TestAnalyticsRepository: method setup_method (line 13) | def setup_method(self) -> None: method test_send_event (line 19) | def test_send_event(self) -> None: FILE: tests/analytics/test_analytics_service.py class TestAnalyticsService (line 11) | class TestAnalyticsService(LanguageServiceTestMixin, TelegramTestMixin): method setup_method (line 16) | def setup_method(self) -> None: method test_send_event (line 27) | def test_send_event(self) -> None: method test_send_event_error (line 30) | def test_send_event_error(self) -> None: method _test_and_assert_send_event (line 39) | def _test_and_assert_send_event(self) -> None: FILE: tests/cli/test_cli_service.py class TestCLIService (line 11) | class TestCLIService(PathTestMixin): method setup_method (line 15) | def setup_method(self) -> None: method teardown_method (line 30) | def teardown_method(self) -> None: method test_compress_pdf (line 34) | async def test_compress_pdf(self) -> None: method test_compress_pdf_error (line 40) | async def test_compress_pdf_error(self) -> None: method test_extract_pdf_images (line 49) | async def test_extract_pdf_images(self) -> None: method test_extract_pdf_images_error (line 55) | async def test_extract_pdf_images_error(self) -> None: method _assert_compress_command (line 63) | def _assert_compress_command(self) -> None: method _assert_crop_pdf_percentage_command (line 71) | def _assert_crop_pdf_percentage_command(self) -> None: method _assert_crop_pdf_margin_size_command (line 77) | def _assert_crop_pdf_margin_size_command(self) -> None: method _assert_get_pdf_images_command (line 83) | def _assert_get_pdf_images_command(self) -> None: FILE: tests/command/test_command_handler.py class TestCommandHandler (line 10) | class TestCommandHandler(TelegramTestMixin): method setup_method (line 16) | def setup_method(self) -> None: method test_handlers (line 22) | async def test_handlers(self) -> None: FILE: tests/command/test_command_service.py class TestCommandService (line 13) | class TestCommandService(LanguageServiceTestMixin, TelegramTestMixin): method setup_method (line 14) | def setup_method(self) -> None: method test_send_start_message (line 22) | async def test_send_start_message(self) -> None: method test_send_help_message (line 31) | async def test_send_help_message(self) -> None: method test_send_message_to_user (line 36) | async def test_send_message_to_user(self) -> None: method test_send_message_to_user_unauthorized (line 42) | async def test_send_message_to_user_unauthorized(self) -> None: method test_send_message_to_user_invalid_args (line 51) | async def test_send_message_to_user_invalid_args(self) -> None: method _assert_send_message_to_user (line 62) | def _assert_send_message_to_user(self, message: str) -> None: FILE: tests/compare/test_compare_handler.py class TestCompareHandlers (line 11) | class TestCompareHandlers(TelegramServiceTestMixin): method setup_method (line 15) | def setup_method(self) -> None: method test_handlers (line 23) | async def test_handlers(self) -> None: FILE: tests/compare/test_compare_service.py class TestCompareService (line 16) | class TestCompareService(LanguageServiceTestMixin, TelegramServiceTestMi... method setup_method (line 21) | def setup_method(self) -> None: method test_ask_first_pdf (line 31) | async def test_ask_first_pdf(self) -> None: method test_check_first_pdf (line 37) | async def test_check_first_pdf(self) -> None: method test_check_first_pdf_invalid_pdf (line 45) | async def test_check_first_pdf_invalid_pdf(self) -> None: method test_compare_pdfs (line 54) | async def test_compare_pdfs(self) -> None: method test_compare_pdfs_no_differences (line 72) | async def test_compare_pdfs_no_differences(self) -> None: method test_compare_pdfs_invalid_user_data (line 85) | async def test_compare_pdfs_invalid_user_data(self) -> None: method test_compare_pdfs_invalid_pdf (line 95) | async def test_compare_pdfs_invalid_pdf(self) -> None: method test_check_text_back (line 105) | async def test_check_text_back(self) -> None: method test_check_text_cancel (line 111) | async def test_check_text_cancel(self) -> None: method test_check_text_unknown (line 120) | async def test_check_text_unknown(self) -> None: FILE: tests/conftest.py function _after_test (line 9) | def _after_test() -> None: FILE: tests/datastore/test_datastore_client.py class TestMyDatastoreClient (line 8) | class TestMyDatastoreClient: method test_init (line 9) | def test_init(self) -> None: FILE: tests/error/test_error_callback_query_handler.py class TestErrorCallbackQueryHandler (line 10) | class TestErrorCallbackQueryHandler(TelegramServiceTestMixin): method setup_method (line 11) | def setup_method(self) -> None: method test_handlers (line 18) | async def test_handlers(self) -> None: FILE: tests/error/test_error_handler.py class TestErrorHandler (line 11) | class TestErrorHandler(LanguageServiceTestMixin, TelegramTestMixin): method setup_method (line 12) | def setup_method(self) -> None: method teardown_method (line 20) | def teardown_method(self) -> None: method test_callback_known_error (line 24) | async def test_callback_known_error(self) -> None: method test_callback_unknown_error (line 29) | async def test_callback_unknown_error(self) -> None: method test_callback_unknown_error_and_send_message_error (line 39) | async def test_callback_unknown_error_and_send_message_error(self) -> ... method test_callback_unknown_error_and_without_chat_id (line 50) | async def test_callback_unknown_error_and_without_chat_id(self) -> None: method test_callback_unknown_error_and_effective_chat (line 62) | async def test_callback_unknown_error_and_effective_chat(self) -> None: method test_callback_unknown_error_and_not_update (line 74) | async def test_callback_unknown_error_and_not_update(self) -> None: method test_callback_without_error (line 84) | async def test_callback_without_error(self) -> None: method test_callback_bad_request_swallow_error (line 102) | async def test_callback_bad_request_swallow_error(self, message: str) ... method test_callback_bad_request_swallow_and_reply_error (line 119) | async def test_callback_bad_request_swallow_and_reply_error(self, mess... method test_callback_unknown_bad_request (line 128) | async def test_callback_unknown_bad_request(self) -> None: FILE: tests/error/test_error_service.py class TestErrorService (line 8) | class TestErrorService(LanguageServiceTestMixin, TelegramTestMixin): method setup_method (line 9) | def setup_method(self) -> None: method test_process_unknown_callback_query (line 16) | async def test_process_unknown_callback_query(self) -> None: FILE: tests/feedback/test_feedback_handler.py class TestFeedbackHandler (line 11) | class TestFeedbackHandler(TelegramServiceTestMixin, TelegramTestMixin): method setup_method (line 15) | def setup_method(self) -> None: method test_handlers (line 26) | async def test_handlers(self) -> None: FILE: tests/feedback/test_feedback_repository.py class TestFeedbackRepository (line 10) | class TestFeedbackRepository(TelegramTestMixin): method setup_method (line 13) | def setup_method(self) -> None: method test_save_feedback (line 17) | def test_save_feedback(self) -> None: method test_save_feedback_error (line 20) | def test_save_feedback_error(self) -> None: method _save_feedback_and_assert_slack_client (line 33) | def _save_feedback_and_assert_slack_client(self) -> None: FILE: tests/feedback/test_feedback_service.py class TestFeedbackService (line 11) | class TestFeedbackService(LanguageServiceTestMixin, TelegramServiceTestM... method setup_method (line 16) | def setup_method(self) -> None: method teardown_method (line 32) | def teardown_method(self) -> None: method test_ask_feedback (line 37) | async def test_ask_feedback(self) -> None: method test_check_text_save_feedback (line 44) | async def test_check_text_save_feedback(self) -> None: method test_check_text_save_feedback_invalid_language (line 51) | async def test_check_text_save_feedback_invalid_language(self) -> None: method test_check_text_cancel (line 61) | async def test_check_text_cancel(self) -> None: method _assert_save_feedback_and_reply_text (line 72) | def _assert_save_feedback_and_reply_text(self) -> None: FILE: tests/file/test_file_handler.py class TestFileHandler (line 18) | class TestFileHandler(TelegramServiceTestMixin, TelegramTestMixin): method setup_method (line 21) | def setup_method(self) -> None: method test_handlers (line 29) | async def test_handlers(self) -> None: FILE: tests/file/test_file_service.py class TestFileService (line 13) | class TestFileService(LanguageServiceTestMixin, TelegramServiceTestMixin... method setup_method (line 16) | def setup_method(self) -> None: method test_check_pdf (line 31) | async def test_check_pdf(self) -> None: method test_check_pdf_too_big (line 43) | async def test_check_pdf_too_big(self) -> None: method test_check_image (line 52) | async def test_check_image(self) -> None: method test_check_image_too_big (line 64) | async def test_check_image_too_big(self) -> None: FILE: tests/file_processor/test_abstract_file_processor.py class GenericError (line 23) | class GenericError(Exception): class CustomError (line 27) | class CustomError(Exception): class UnknownError (line 31) | class UnknownError(Exception): class MockProcessor (line 35) | class MockProcessor(PathTestMixin, AbstractFileProcessor): method __init__ (line 40) | def __init__( method get_task_data_list (line 51) | def get_task_data_list(cls) -> Sequence[TaskData]: method task_type (line 55) | def task_type(self) -> TaskType: method task_data (line 59) | def task_data(self) -> TaskData: method handler (line 63) | def handler(self) -> BaseHandler: method process_file_task (line 67) | async def process_file_task(self, _file_data: FileData) -> AsyncGenera... class MockProcessorWithGenericError (line 71) | class MockProcessorWithGenericError(MockProcessor): method generic_error_types (line 73) | def generic_error_types(self) -> set[type[Exception]]: class MockProcessorWithCustomErrorHandler (line 77) | class MockProcessorWithCustomErrorHandler(MockProcessor): method custom_error_handlers (line 81) | def custom_error_handlers( method _handle_custom_error (line 86) | async def _handle_custom_error( class TestAbstractFileProcessorInit (line 96) | class TestAbstractFileProcessorInit( method setup_method (line 100) | def setup_method(self) -> None: method teardown_method (line 110) | def teardown_method(self) -> None: method test_init (line 114) | def test_init(self) -> None: method test_init_already_initialized (line 122) | def test_init_already_initialized(self) -> None: class TestAbstractFileProcessor (line 132) | class TestAbstractFileProcessor( method setup_method (line 140) | def setup_method(self) -> None: method test_ask_task (line 154) | async def test_ask_task(self) -> None: method test_ask_task_without_callback_query (line 172) | async def test_ask_task_without_callback_query(self) -> None: method test_process_file (line 190) | async def test_process_file(self) -> None: method test_process_file_with_result_message (line 197) | async def test_process_file_with_result_message(self) -> None: method test_process_file_dir_output (line 211) | async def test_process_file_dir_output(self) -> None: method test_process_file_generic_error_not_registered (line 233) | async def test_process_file_generic_error_not_registered(self) -> None: method test_process_file_error (line 245) | async def test_process_file_error(self) -> None: method test_process_file_custom_error (line 259) | async def test_process_file_custom_error(self) -> None: method test_process_file_unknown_error (line 272) | async def test_process_file_unknown_error(self) -> None: method test_process_file_invalid_file_data (line 287) | async def test_process_file_invalid_file_data(self) -> None: method test_process_file_with_callback_query (line 297) | async def test_process_file_with_callback_query(self) -> None: method test_process_file_with_callback_query_unknown_data (line 315) | async def test_process_file_with_callback_query_unknown_data(self) -> ... method test_process_file_process_previous_message_error (line 326) | async def test_process_file_process_previous_message_error(self, error... method _assert_process_file_succeed (line 335) | def _assert_process_file_succeed(self, path: Path | None = None) -> None: method _assert_get_file_and_message_data (line 347) | def _assert_get_file_and_message_data(self) -> None: FILE: tests/file_processor/test_abstract_file_task_processor.py class MockProcessor (line 11) | class MockProcessor(AbstractFileTaskProcessor): method processor_type (line 15) | def processor_type(self) -> type[AbstractFileProcessor]: class TestAbstractFileTaskProcessor (line 21) | class TestAbstractFileTaskProcessor(LanguageServiceTestMixin, TelegramTe... method setup_method (line 24) | def setup_method(self) -> None: method test_ask_task (line 30) | async def test_ask_task(self) -> None: FILE: tests/file_processor/test_file_task_mixin.py class TestFileTaskMixin (line 16) | class TestFileTaskMixin(LanguageServiceTestMixin, TelegramTestMixin): method setup_method (line 20) | def setup_method(self) -> None: method test_ask_task_helper (line 26) | async def test_ask_task_helper(self) -> None: method test_ask_task_helper_without_user_data (line 38) | async def test_ask_task_helper_without_user_data(self) -> None: method test_ask_task_helper_without_file_data_and_file (line 52) | async def test_ask_task_helper_without_file_data_and_file(self) -> None: method _assert_inline_keyboard (line 67) | def _assert_inline_keyboard(self) -> None: FILE: tests/image/test_image_service.py class TestImageService (line 14) | class TestImageService(LanguageServiceTestMixin, TelegramServiceTestMixi... method setup_method (line 18) | def setup_method(self) -> None: method test_beautify_and_convert_images_to_pdf (line 34) | async def test_beautify_and_convert_images_to_pdf(self, num_files: int... method test_convert_images_to_pdf (line 52) | async def test_convert_images_to_pdf(self, num_files: int) -> None: method _get_file_data_list (line 73) | def _get_file_data_list( FILE: tests/image_handler/test_batch_image_handler.py class TestCompareHandlers (line 11) | class TestCompareHandlers(TelegramServiceTestMixin): method setup_method (line 15) | def setup_method(self) -> None: method test_handlers (line 23) | async def test_handlers(self) -> None: FILE: tests/image_handler/test_batch_image_service.py class TestBatchImageService (line 15) | class TestBatchImageService(LanguageServiceTestMixin, TelegramServiceTes... method setup_method (line 24) | def setup_method(self) -> None: method test_ask_first_image (line 40) | async def test_ask_first_image(self) -> None: method test_check_image (line 47) | async def test_check_image(self) -> None: method test_check_image_invalid_image (line 68) | async def test_check_image_invalid_image(self) -> None: method test_check_image_user_data_error (line 79) | async def test_check_image_user_data_error(self) -> None: method test_check_text_remove_last (line 96) | async def test_check_text_remove_last(self) -> None: method test_check_text_remove_last_with_existing_file (line 111) | async def test_check_text_remove_last_with_existing_file(self) -> None: method test_check_text_remove_last_remove_error (line 130) | async def test_check_text_remove_last_remove_error(self) -> None: method test_check_text_beautify (line 146) | async def test_check_text_beautify(self) -> None: method test_check_text_to_pdf (line 171) | async def test_check_text_to_pdf(self) -> None: method test_check_text_process_with_one_file_only (line 194) | async def test_check_text_process_with_one_file_only(self) -> None: method test_check_text_process_without_files (line 210) | async def test_check_text_process_without_files(self) -> None: method test_check_text_cancel (line 227) | async def test_check_text_cancel(self) -> None: method test_check_text_unknown_text (line 239) | async def test_check_text_unknown_text(self) -> None: method test_check_text_telegram_service_error (line 246) | async def test_check_text_telegram_service_error(self, text: str) -> N... method _assert_ask_first_image (line 258) | def _assert_ask_first_image(self) -> None: FILE: tests/image_processor/test_abstract_image_processor.py class MockProcessor (line 17) | class MockProcessor(AbstractImageProcessor): method task_type (line 19) | def task_type(self) -> TaskType: method task_data (line 23) | def task_data(self) -> TaskData: method handler (line 27) | def handler(self) -> BaseHandler: method process_file_task (line 31) | async def process_file_task(self, _file_data: FileData) -> AsyncGenera... class TestAbstractImageProcessor (line 35) | class TestAbstractImageProcessor(LanguageServiceTestMixin, TelegramServi... method setup_method (line 36) | def setup_method(self) -> None: method teardown_method (line 53) | def teardown_method(self) -> None: method test_init (line 58) | def test_init(self) -> None: method test_init_already_initialized (line 66) | def test_init_already_initialized(self) -> None: method test_get_task_data_list (line 75) | def test_get_task_data_list(self) -> None: FILE: tests/image_processor/test_beautify_image_processor.py class TestBeautifyImageProcessor (line 15) | class TestBeautifyImageProcessor( method setup_method (line 20) | def setup_method(self) -> None: method test_task_type (line 33) | def test_task_type(self) -> None: method test_task_data (line 37) | def test_task_data(self) -> None: method test_handler (line 41) | def test_handler(self) -> None: method test_process_file_task (line 48) | async def test_process_file_task(self) -> None: FILE: tests/image_processor/test_image_task_processor.py class TestImageTaskProcessor (line 6) | class TestImageTaskProcessor( method setup_method (line 10) | def setup_method(self) -> None: method test_processor_type (line 15) | def test_processor_type(self) -> None: FILE: tests/image_processor/test_image_to_pdf_processor.py class TestImageToPdfProcessorProcessor (line 15) | class TestImageToPdfProcessorProcessor( method setup_method (line 20) | def setup_method(self) -> None: method test_task_type (line 33) | def test_task_type(self) -> None: method test_task_data (line 37) | def test_task_data(self) -> None: method test_handler (line 41) | def test_handler(self) -> None: method test_process_file_task (line 48) | async def test_process_file_task(self) -> None: FILE: tests/io_internal/test_io_service.py class TestIOService (line 10) | class TestIOService: method setup_method (line 17) | def setup_method(self) -> None: method teardown_method (line 28) | def teardown_method(self) -> None: method test_create_temp_directory (line 33) | async def test_create_temp_directory(self, prefix: str | None) -> None: method test_create_temp_file (line 60) | async def test_create_temp_file(self, prefix: str | None, suffix: str ... method test_create_temp_files (line 69) | async def test_create_temp_files(self, num_files: int) -> None: method test_create_temp_pdf_file (line 99) | async def test_create_temp_pdf_file(self, prefix: str | None) -> None: method test_create_temp_png_file (line 107) | async def test_create_temp_png_file(self) -> None: method test_create_temp_txt_file (line 113) | async def test_create_temp_txt_file(self) -> None: method _assert_temp_file (line 118) | def _assert_temp_file(self, prefix: str | None, suffix: str | None) ->... method _get_expected_prefix (line 122) | def _get_expected_prefix(self, prefix: str | None) -> str | None: FILE: tests/language/language_service_test_mixin.py class LanguageServiceTestMixin (line 6) | class LanguageServiceTestMixin: method mock_language_service (line 8) | def mock_language_service() -> AsyncMock: FILE: tests/language/test_language_handler.py class TestLanguageHandler (line 10) | class TestLanguageHandler(LanguageServiceTestMixin, TelegramTestMixin): method setup_method (line 13) | def setup_method(self) -> None: method test_handlers (line 19) | async def test_handlers(self) -> None: FILE: tests/language/test_language_repository.py class TestLanguageRepository (line 10) | class TestLanguageRepository: method setup_method (line 15) | def setup_method(self) -> None: method test_get_language (line 21) | def test_get_language(self) -> None: method test_get_language_without_user (line 29) | def test_get_language_without_user(self) -> None: method test_get_language_and_language_not_set (line 34) | def test_get_language_and_language_not_set(self) -> None: method test_get_language_legacy_en_code (line 39) | def test_get_language_legacy_en_code(self) -> None: method test_upsert_language (line 48) | def test_upsert_language(self) -> None: method test_upsert_language_without_user (line 56) | def test_upsert_language_without_user(self) -> None: method _mock_user_entity_dict (line 67) | def _mock_user_entity_dict(self, user_entity_dict: dict[str, Any] | No... FILE: tests/language/test_language_service.py class TestLanguageService (line 10) | class TestLanguageService(TelegramTestMixin): method setup_method (line 15) | def setup_method(self) -> None: method teardown_method (line 25) | def teardown_method(self) -> None: method test_get_language_code_from_short_code (line 30) | def test_get_language_code_from_short_code(self, value: str, expected:... method test_send_language_options (line 35) | async def test_send_language_options(self) -> None: method test_send_language_options_with_callback_query (line 45) | async def test_send_language_options_with_callback_query(self) -> None: method test_get_user_language (line 55) | async def test_get_user_language(self) -> None: method test_get_user_language_cached (line 67) | async def test_get_user_language_cached(self) -> None: method test_get_user_language_without_user_data (line 76) | async def test_get_user_language_without_user_data(self) -> None: method test_get_user_language_without_callback_query (line 85) | async def test_get_user_language_without_callback_query(self) -> None: method test_get_user_language_with_chat_id (line 98) | async def test_get_user_language_with_chat_id(self) -> None: method test_get_user_language_without_message_and_chat (line 113) | async def test_get_user_language_without_message_and_chat(self) -> None: method test_update_user_language (line 127) | async def test_update_user_language(self, side_effect: type[Exception]... method test_update_user_language_without_user_data (line 145) | async def test_update_user_language_without_user_data(self) -> None: method test_update_user_language_invalid_callback_query_data (line 157) | async def test_update_user_language_invalid_callback_query_data(self) ... FILE: tests/merge/test_merge_handler.py class TestMergeHandler (line 11) | class TestMergeHandler(TelegramServiceTestMixin): method setup_method (line 15) | def setup_method(self) -> None: method test_conversation_handler (line 23) | async def test_conversation_handler(self) -> None: FILE: tests/merge/test_merge_service.py class TestMergeService (line 15) | class TestMergeService( method setup_method (line 27) | def setup_method(self) -> None: method test_ask_first_pdf (line 43) | async def test_ask_first_pdf(self) -> None: method test_check_pdf (line 50) | async def test_check_pdf(self) -> None: method test_check_pdf_invalid_pdf (line 64) | async def test_check_pdf_invalid_pdf(self) -> None: method test_check_pdf_user_data_error (line 75) | async def test_check_pdf_user_data_error(self) -> None: method test_check_text_remove_last (line 92) | async def test_check_text_remove_last(self) -> None: method test_check_text_remove_last_with_existing_file (line 107) | async def test_check_text_remove_last_with_existing_file(self) -> None: method test_check_text_remove_last_remove_error (line 126) | async def test_check_text_remove_last_remove_error(self) -> None: method test_check_text_done_and_merge (line 142) | async def test_check_text_done_and_merge(self) -> None: method test_check_text_done_pdf_service_error (line 163) | async def test_check_text_done_pdf_service_error(self) -> None: method test_check_text_done_with_one_file_only (line 179) | async def test_check_text_done_with_one_file_only(self) -> None: method test_check_text_done_without_files (line 194) | async def test_check_text_done_without_files(self) -> None: method test_check_text_cancel (line 210) | async def test_check_text_cancel(self) -> None: method test_check_text_unknown_text (line 222) | async def test_check_text_unknown_text(self) -> None: method test_check_text_telegram_service_error (line 229) | async def test_check_text_telegram_service_error(self, text: str) -> N... method _assert_ask_first_pdf (line 241) | def _assert_ask_first_pdf(self) -> None: FILE: tests/path_test_mixin.py class PathTestMixin (line 7) | class PathTestMixin: method mock_file_path (line 9) | def mock_file_path() -> MagicMock: method mock_dir_path (line 15) | def mock_dir_path() -> MagicMock: method mock_path_open (line 21) | def mock_path_open(path: MagicMock) -> MagicMock: method mock_path_stat (line 27) | def mock_path_stat(path: MagicMock) -> MagicMock: FILE: tests/payment/test_payment_handler.py class TestLanguageHandler (line 17) | class TestLanguageHandler(TelegramTestMixin): method setup_method (line 21) | def setup_method(self) -> None: method test_handlers (line 27) | async def test_handlers(self) -> None: FILE: tests/payment/test_payment_service.py class TestPaymentService (line 10) | class TestPaymentService(LanguageServiceTestMixin, TelegramServiceTestMi... method setup_method (line 17) | def setup_method(self) -> None: method test_send_support_options (line 25) | async def test_send_support_options(self) -> None: method test_send_support_options_with_callback_query (line 38) | async def test_send_support_options_with_callback_query(self) -> None: method test_send_invoice (line 52) | async def test_send_invoice(self) -> None: method test_send_invoice_invalid_callback_query_data (line 62) | async def test_send_invoice_invalid_callback_query_data(self) -> None: method test_precheckout_check (line 69) | async def test_precheckout_check(self) -> None: method test_precheckout_check_invalid_payload (line 75) | async def test_precheckout_check_invalid_payload(self) -> None: method test_successful_payment (line 83) | async def test_successful_payment(self) -> None: method _assert_keyboard_payment_callback_data (line 87) | def _assert_keyboard_payment_callback_data(self, reply_markup: InlineK... FILE: tests/pdf/test_compress_result.py class TestCompressResult (line 7) | class TestCompressResult(PathTestMixin): method setup_method (line 8) | def setup_method(self) -> None: method test_reduced_percentage (line 12) | def test_reduced_percentage(self) -> None: method test_readable_old_size (line 16) | def test_readable_old_size(self) -> None: method test_readable_new_size (line 21) | def test_readable_new_size(self) -> None: FILE: tests/pdf/test_pdf_service.py class TestPDFService (line 37) | class TestPDFService( method setup_method (line 44) | def setup_method(self) -> None: method teardown_method (line 73) | def teardown_method(self) -> None: method test_add_watermark_to_pdf (line 82) | async def test_add_watermark_to_pdf(self) -> None: method test_add_watermark_to_pdf_read_error (line 123) | async def test_add_watermark_to_pdf_read_error(self) -> None: method test_grayscale_pdf (line 133) | async def test_grayscale_pdf(self) -> None: method test_compare_pdfs (line 161) | async def test_compare_pdfs(self) -> None: method test_compress_pdf (line 174) | async def test_compress_pdf(self) -> None: method test_convert_to_images (line 192) | async def test_convert_to_images(self) -> None: method test_create_pdf_from_text (line 206) | async def test_create_pdf_from_text(self, has_font_data: bool) -> None: method test_crop_pdf_by_percentage (line 250) | async def test_crop_pdf_by_percentage(self) -> None: method test_crop_pdf_by_margin_size (line 262) | async def test_crop_pdf_by_margin_size(self) -> None: method test_decrypt_pdf (line 277) | async def test_decrypt_pdf(self, num_pages: int) -> None: method test_decrypt_pdf_not_encrypted (line 297) | async def test_decrypt_pdf_not_encrypted(self) -> None: method test_decrypt_pdf_incorrect_password (line 311) | async def test_decrypt_pdf_incorrect_password(self) -> None: method test_decrypt_pdf_invalid_encryption_method (line 323) | async def test_decrypt_pdf_invalid_encryption_method(self) -> None: method test_encrypt_pdf (line 336) | async def test_encrypt_pdf(self, num_pages: int) -> None: method test_encrypt_pdf_already_encrypted (line 356) | async def test_encrypt_pdf_already_encrypted(self) -> None: method test_extract_pdf_text (line 369) | async def test_extract_pdf_text(self) -> None: method test_extract_pdf_text_error (line 377) | async def test_extract_pdf_text_error(self) -> None: method test_extract_pdf_text_no_text (line 389) | async def test_extract_pdf_text_no_text(self) -> None: method test_extract_pdf_images (line 401) | async def test_extract_pdf_images(self) -> None: method test_extract_pdf_images_no_images (line 415) | async def test_extract_pdf_images_no_images(self) -> None: method test_extract_pdf_images_cli_error (line 430) | async def test_extract_pdf_images_cli_error(self) -> None: method test_merge_pdfs (line 446) | async def test_merge_pdfs(self, num_files: int) -> None: method test_merge_pdfs_read_error (line 461) | async def test_merge_pdfs_read_error(self, exception: Exception) -> None: method test_ocr_pdf (line 477) | async def test_ocr_pdf(self) -> None: method test_ocr_pdf_error (line 494) | async def test_ocr_pdf_error(self, error: type[Exception], expected: t... method test_preview_pdf (line 507) | async def test_preview_pdf(self) -> None: method test_rename_pdf (line 538) | async def test_rename_pdf(self) -> None: method test_rotate_pdf (line 552) | async def test_rotate_pdf(self, num_pages: int) -> None: method test_scale_pdf_by_factor (line 579) | async def test_scale_pdf_by_factor(self, num_pages: int) -> None: method test_scale_pdf_to_dimension (line 604) | async def test_scale_pdf_to_dimension(self, num_pages: int) -> None: method test_split_range_valid (line 647) | async def test_split_range_valid(self, split_range: str) -> None: method test_split_range_invalid (line 651) | async def test_split_range_invalid(self) -> None: method test_split_pdf (line 655) | async def test_split_pdf(self) -> None: method _async_context_manager_side_effect_echo (line 670) | def _async_context_manager_side_effect_echo( method _method_side_effect_echo (line 678) | def _method_side_effect_echo(return_value: str, *_args: Any, **_kwargs... method _get_file_data_list (line 682) | def _get_file_data_list( method _assert_telegram_and_io_services (line 697) | def _assert_telegram_and_io_services(self, temp_pdf_file_prefix: str) ... method _assert_decrypt_failure (line 701) | def _assert_decrypt_failure(self, reader: MagicMock) -> None: FILE: tests/pdf_processor/test_abstract_pdf_processor.py class MockProcessor (line 17) | class MockProcessor(AbstractPdfProcessor): method task_type (line 19) | def task_type(self) -> TaskType: method task_data (line 23) | def task_data(self) -> TaskData: method handler (line 27) | def handler(self) -> BaseHandler: method process_file_task (line 31) | async def process_file_task(self, _file_data: FileData) -> AsyncGenera... class TestAbstractPdfProcessor (line 35) | class TestAbstractPdfProcessor(LanguageServiceTestMixin, TelegramService... method setup_method (line 36) | def setup_method(self) -> None: method teardown_method (line 52) | def teardown_method(self) -> None: method test_init (line 57) | def test_init(self) -> None: method test_init_already_initialized (line 65) | def test_init_already_initialized(self) -> None: method test_get_task_data_list (line 74) | def test_get_task_data_list(self) -> None: method test_generic_error_types (line 84) | def test_generic_error_types(self) -> None: FILE: tests/pdf_processor/test_abstract_pdf_select_and_text_processor.py class OptionType (line 26) | class OptionType(SelectOption): method ask_value_text (line 31) | def ask_value_text(self) -> str: class MockProcessor (line 35) | class MockProcessor(PathTestMixin, AbstractPdfSelectAndTextProcessor): method __init__ (line 38) | def __init__( method entry_point_data_type (line 50) | def entry_point_data_type(self) -> type[FileData]: method task_type (line 54) | def task_type(self) -> TaskType: method task_data (line 58) | def task_data(self) -> TaskData: method ask_select_option_text (line 62) | def ask_select_option_text(self) -> str: method select_option_type (line 66) | def select_option_type(self) -> type[OptionType]: method invalid_text_input_error (line 70) | def invalid_text_input_error(self) -> str: method get_cleaned_text_input (line 73) | def get_cleaned_text_input(self, _text: str) -> str | None: method process_file_task (line 77) | async def process_file_task(self, _file_data: FileData) -> AsyncGenera... class TestAbstractPdfTextInputProcessor (line 81) | class TestAbstractPdfTextInputProcessor( method setup_method (line 89) | def setup_method(self) -> None: method test_handler (line 116) | def test_handler(self) -> None: method test_ask_select_option (line 158) | async def test_ask_select_option(self) -> None: method test_ask_select_option_invalid_callback_query_data (line 171) | async def test_ask_select_option_invalid_callback_query_data(self) -> ... method test_ask_text_input (line 183) | async def test_ask_text_input(self) -> None: method test_ask_text_input_invalid_callback_query_data (line 202) | async def test_ask_text_input_invalid_callback_query_data(self) -> None: method test_process_text_input (line 215) | async def test_process_text_input(self) -> None: method test_process_text_input_invalid_input (line 232) | async def test_process_text_input_invalid_input(self) -> None: method test_process_text_input_invalid_file_data (line 241) | async def test_process_text_input_invalid_file_data(self) -> None: FILE: tests/pdf_processor/test_abstract_pdf_text_input_processor.py class MockProcessor (line 22) | class MockProcessor(PathTestMixin, AbstractPdfTextInputProcessor): method __init__ (line 25) | def __init__( method entry_point_data_type (line 37) | def entry_point_data_type(self) -> type[FileData]: method task_type (line 41) | def task_type(self) -> TaskType: method task_data (line 45) | def task_data(self) -> TaskData: method get_ask_text_input_text (line 48) | def get_ask_text_input_text(self, _: Callable[[str], str]) -> str: method invalid_text_input_error (line 52) | def invalid_text_input_error(self) -> str: method get_cleaned_text_input (line 55) | def get_cleaned_text_input(self, _text: str) -> str | None: method process_file_task (line 59) | async def process_file_task(self, _file_data: FileData) -> AsyncGenera... class TestAbstractPdfTextInputProcessor (line 63) | class TestAbstractPdfTextInputProcessor( method setup_method (line 70) | def setup_method(self) -> None: method test_handler (line 90) | def test_handler(self) -> None: method test_ask_text_input (line 122) | async def test_ask_text_input(self) -> None: method test_process_text_input (line 141) | async def test_process_text_input(self) -> None: method test_process_text_input_invalid_input (line 158) | async def test_process_text_input_invalid_input(self) -> None: method test_process_text_input_get_file_data_error (line 167) | async def test_process_text_input_get_file_data_error(self) -> None: FILE: tests/pdf_processor/test_compress_pdf_processor.py class TestCompressPdfProcessor (line 15) | class TestCompressPdfProcessor( method setup_method (line 20) | def setup_method(self) -> None: method test_get_task_type (line 33) | def test_get_task_type(self) -> None: method test_task_data (line 37) | def test_task_data(self) -> None: method test_handler (line 41) | def test_handler(self) -> None: method test_process_file_task (line 48) | async def test_process_file_task(self) -> None: FILE: tests/pdf_processor/test_crop_pdf_processor.py class TestPdfProcessor (line 14) | class TestPdfProcessor( method setup_method (line 22) | def setup_method(self) -> None: method test_entry_point_data_type (line 37) | def test_entry_point_data_type(self) -> None: method test_task_type (line 41) | def test_task_type(self) -> None: method test_task_data (line 45) | def test_task_data(self) -> None: method test_select_option_type (line 49) | def test_select_option_type(self) -> None: method test_option_and_input_data_type (line 53) | def test_option_and_input_data_type(self) -> None: method test_get_cleaned_text_input (line 57) | def test_get_cleaned_text_input(self) -> None: method test_get_cleaned_text_input_invalid (line 61) | def test_get_cleaned_text_input_invalid(self) -> None: method test_process_file_task_scale_by_factor (line 66) | async def test_process_file_task_scale_by_factor(self) -> None: method test_process_file_task_scale_to_dimension (line 84) | async def test_process_file_task_scale_to_dimension(self) -> None: method test_process_file_task_invalid_file_data (line 102) | async def test_process_file_task_invalid_file_data(self) -> None: FILE: tests/pdf_processor/test_decrypt_pdf_processor.py class TestDecryptPdfProcessor (line 14) | class TestDecryptPdfProcessor( method setup_method (line 21) | def setup_method(self) -> None: method test_get_task_type (line 34) | def test_get_task_type(self) -> None: method test_entry_point_data_type (line 38) | def test_entry_point_data_type(self) -> None: method test_task_data (line 42) | def test_task_data(self) -> None: method test_get_cleaned_text_input (line 46) | def test_get_cleaned_text_input(self) -> None: method test_get_custom_error_handlers (line 51) | async def test_get_custom_error_handlers(self) -> None: method test_process_file_task (line 67) | async def test_process_file_task(self) -> None: method test_process_file_task_invalid_file_data (line 77) | async def test_process_file_task_invalid_file_data(self) -> None: FILE: tests/pdf_processor/test_encrypt_pdf_processor.py class TestEncryptPdfProcessor (line 14) | class TestEncryptPdfProcessor( method setup_method (line 19) | def setup_method(self) -> None: method test_get_task_type (line 32) | def test_get_task_type(self) -> None: method test_entry_point_data_type (line 36) | def test_entry_point_data_type(self) -> None: method test_task_data (line 40) | def test_task_data(self) -> None: method test_get_cleaned_text_input (line 44) | def test_get_cleaned_text_input(self) -> None: method test_process_file_task (line 49) | async def test_process_file_task(self) -> None: method test_process_file_task_invalid_file_data (line 59) | async def test_process_file_task_invalid_file_data(self) -> None: FILE: tests/pdf_processor/test_extract_pdf_image_processor.py class TestExtractPdfImageProcessor (line 14) | class TestExtractPdfImageProcessor( method setup_method (line 19) | def setup_method(self) -> None: method test_get_task_type (line 32) | def test_get_task_type(self) -> None: method test_task_data (line 36) | def test_task_data(self) -> None: method test_handler (line 40) | def test_handler(self) -> None: method test_process_file_task (line 47) | async def test_process_file_task(self) -> None: FILE: tests/pdf_processor/test_extract_pdf_text_processor.py class TestExtractPDFTextProcessor (line 14) | class TestExtractPDFTextProcessor( method setup_method (line 19) | def setup_method(self) -> None: method test_get_task_type (line 32) | def test_get_task_type(self) -> None: method test_task_data (line 36) | def test_task_data(self) -> None: method test_handler (line 40) | def test_handler(self) -> None: method test_process_file_task (line 47) | async def test_process_file_task(self) -> None: FILE: tests/pdf_processor/test_grayscale_pdf_processor.py class TestGrayscalePdfProcessor (line 14) | class TestGrayscalePdfProcessor( method setup_method (line 19) | def setup_method(self) -> None: method test_get_task_type (line 32) | def test_get_task_type(self) -> None: method test_task_data (line 36) | def test_task_data(self) -> None: method test_handler (line 40) | def test_handler(self) -> None: method test_process_file_task (line 47) | async def test_process_file_task(self) -> None: FILE: tests/pdf_processor/test_ocr_pdf_processor.py class TestOCRPdfProcessor (line 14) | class TestOCRPdfProcessor( method setup_method (line 19) | def setup_method(self) -> None: method test_get_task_type (line 32) | def test_get_task_type(self) -> None: method test_task_data (line 36) | def test_task_data(self) -> None: method test_handler (line 40) | def test_handler(self) -> None: method test_process_file_task (line 47) | async def test_process_file_task(self) -> None: FILE: tests/pdf_processor/test_pdf_task_processor.py class TestPdfTaskProcessor (line 6) | class TestPdfTaskProcessor( method setup_method (line 10) | def setup_method(self) -> None: method test_processor_type (line 15) | def test_processor_type(self) -> None: FILE: tests/pdf_processor/test_pdf_to_image_processor.py class TestPdfToImageProcessor (line 14) | class TestPdfToImageProcessor( method setup_method (line 19) | def setup_method(self) -> None: method test_get_task_type (line 32) | def test_get_task_type(self) -> None: method test_task_data (line 36) | def test_task_data(self) -> None: method test_handler (line 40) | def test_handler(self) -> None: method test_process_file_task (line 47) | async def test_process_file_task(self) -> None: FILE: tests/pdf_processor/test_preview_pdf_processor.py class TestPreviewPdfProcessor (line 14) | class TestPreviewPdfProcessor( method setup_method (line 19) | def setup_method(self) -> None: method test_get_task_type (line 32) | def test_get_task_type(self) -> None: method test_task_data (line 36) | def test_task_data(self) -> None: method test_handler (line 40) | def test_handler(self) -> None: method test_process_file_task (line 47) | async def test_process_file_task(self) -> None: FILE: tests/pdf_processor/test_rename_pdf_processor.py class TestRenamePdfProcessor (line 14) | class TestRenamePdfProcessor( method setup_method (line 19) | def setup_method(self) -> None: method test_task_type (line 33) | def test_task_type(self) -> None: method test_entry_point_data_type (line 37) | def test_entry_point_data_type(self) -> None: method test_task_data (line 41) | def test_task_data(self) -> None: method test_get_cleaned_text_input (line 45) | def test_get_cleaned_text_input(self) -> None: method test_get_cleaned_text_input_invalid (line 50) | def test_get_cleaned_text_input_invalid(self) -> None: method test_process_file_task (line 56) | async def test_process_file_task(self) -> None: method test_process_file_task_invalid_file_data (line 66) | async def test_process_file_task_invalid_file_data(self) -> None: FILE: tests/pdf_processor/test_rotate_pdf_processor.py class TestRotatePdfProcessor (line 16) | class TestRotatePdfProcessor( method setup_method (line 23) | def setup_method(self) -> None: method test_task_type (line 38) | def test_task_type(self) -> None: method test_task_data (line 42) | def test_task_data(self) -> None: method test_handler (line 46) | def test_handler(self) -> None: method test_process_file_task (line 79) | async def test_process_file_task(self) -> None: method test_process_file_task_invalid_file_data (line 93) | async def test_process_file_task_invalid_file_data(self) -> None: method test_ask_degree (line 100) | async def test_ask_degree(self) -> None: method test_ask_degree_invalid_callback_query_data (line 115) | async def test_ask_degree_invalid_callback_query_data(self) -> None: FILE: tests/pdf_processor/test_scale_pdf_processor.py class TestPdfProcessor (line 20) | class TestPdfProcessor( method setup_method (line 28) | def setup_method(self) -> None: method test_entry_point_data_type (line 43) | def test_entry_point_data_type(self) -> None: method test_task_type (line 47) | def test_task_type(self) -> None: method test_task_data (line 51) | def test_task_data(self) -> None: method test_select_option_type (line 55) | def test_select_option_type(self) -> None: method test_option_and_input_data_type (line 59) | def test_option_and_input_data_type(self) -> None: method test_get_cleaned_text_input (line 63) | def test_get_cleaned_text_input(self) -> None: method test_get_cleaned_text_input_invalid (line 67) | def test_get_cleaned_text_input_invalid(self) -> None: method test_process_file_task_scale_by_factor (line 72) | async def test_process_file_task_scale_by_factor(self) -> None: method test_process_file_task_scale_to_dimension (line 88) | async def test_process_file_task_scale_to_dimension(self) -> None: method test_process_file_task_invalid_file_data (line 106) | async def test_process_file_task_invalid_file_data(self) -> None: FILE: tests/pdf_processor/test_split_pdf_processor.py class TestSplitPdfProcessor (line 14) | class TestSplitPdfProcessor( method setup_method (line 19) | def setup_method(self) -> None: method test_task_type (line 32) | def test_task_type(self) -> None: method test_entry_point_data_type (line 36) | def test_entry_point_data_type(self) -> None: method test_task_data (line 40) | def test_task_data(self) -> None: method test_get_cleaned_text_input (line 47) | def test_get_cleaned_text_input(self, is_valid: bool, expected: str | ... method test_process_file_task (line 53) | async def test_process_file_task(self) -> None: method test_process_file_task_invalid_file_data (line 63) | async def test_process_file_task_invalid_file_data(self) -> None: FILE: tests/telegram_internal/telegram_service_test_mixin.py class TelegramServiceTestMixin (line 11) | class TelegramServiceTestMixin(TelegramTestMixin): method mock_telegram_service (line 12) | def mock_telegram_service(self) -> AsyncMock: method get_file_data_side_effect_by_index (line 26) | def get_file_data_side_effect_by_index( FILE: tests/telegram_internal/telegram_test_mixin.py class TelegramTestMixin (line 23) | class TelegramTestMixin(PathTestMixin): method setup_method (line 45) | def setup_method(self) -> None: method teardown_method (line 97) | def teardown_method(self) -> None: FILE: tests/telegram_internal/test_telegram_service.py class TestTelegramService (line 25) | class TestTelegramService(LanguageServiceTestMixin, TelegramTestMixin): method setup_method (line 35) | def setup_method(self) -> None: method teardown_method (line 50) | def teardown_method(self) -> None: method test_init_with_telegram_app (line 55) | async def test_init_with_telegram_app(self) -> None: method test_check_file_size (line 62) | async def test_check_file_size(self) -> None: method test_check_file_size_too_large (line 67) | async def test_check_file_size_too_large(self) -> None: method test_check_file_upload_size (line 73) | async def test_check_file_upload_size(self) -> None: method test_check_file_upload_size_too_large (line 80) | async def test_check_file_upload_size_too_large(self) -> None: method test_check_image_document (line 88) | async def test_check_image_document(self) -> None: method test_check_image_document_invalid_mime_type (line 98) | async def test_check_image_document_invalid_mime_type(self) -> None: method test_check_image_document_too_large (line 106) | async def test_check_image_document_too_large(self) -> None: method test_check_image (line 115) | async def test_check_image(self) -> None: method test_check_image_not_found (line 125) | async def test_check_image_not_found(self) -> None: method test_check_image_too_large (line 133) | async def test_check_image_too_large(self) -> None: method test_check_pdf_document (line 142) | async def test_check_pdf_document(self) -> None: method test_check_pdf_document_invalid_mime_type (line 152) | async def test_check_pdf_document_invalid_mime_type(self) -> None: method test_check_pdf_document_too_large (line 160) | async def test_check_pdf_document_too_large(self) -> None: method test_download_pdf_file (line 169) | async def test_download_pdf_file(self) -> None: method test_download_files (line 180) | async def test_download_files(self, num_files: int) -> None: method test_cancel_conversation (line 214) | async def test_cancel_conversation(self) -> None: method test_cancel_conversation_with_callback_query (line 225) | async def test_cancel_conversation_with_callback_query(self) -> None: method test_get_back_button (line 239) | async def test_get_back_button(self) -> None: method test_get_back_inline_markup (line 246) | async def test_get_back_inline_markup(self) -> None: method test_get_support_markup (line 257) | async def test_get_support_markup(self) -> None: method test_get_user_data (line 261) | def test_get_user_data(self) -> None: method test_get_user_data_key_error (line 270) | def test_get_user_data_key_error(self, user_data: dict | None) -> None: method test_user_data_contains (line 276) | def test_user_data_contains(self) -> None: method test_user_data_contains_without_key (line 281) | def test_user_data_contains_without_key(self) -> None: method test_user_data_contains_without_user_data (line 286) | def test_user_data_contains_without_user_data(self) -> None: method test_update_user_data (line 291) | def test_update_user_data(self) -> None: method test_update_user_data_error (line 296) | def test_update_user_data_error(self) -> None: method test_get_file_data (line 303) | def test_get_file_data(self) -> None: method test_cache_file_data (line 311) | def test_cache_file_data(self) -> None: method test_get_message_data (line 316) | def test_get_message_data(self) -> None: method test_cache_message_data (line 324) | def test_cache_message_data(self) -> None: method test_cache_message_data_error (line 331) | def test_cache_message_data_error(self) -> None: method test_cache_message_data_not_message (line 335) | def test_cache_message_data_not_message(self) -> None: method test_answer_query_and_drop_data (line 342) | async def test_answer_query_and_drop_data(self, side_effect: type[Exce... method test_reply_with_back_markup (line 356) | async def test_reply_with_back_markup(self, parse_mode: ParseMode | No... method test_reply_with_cancel_markup (line 367) | async def test_reply_with_cancel_markup(self, parse_mode: ParseMode | ... method test_send_file_document (line 377) | async def test_send_file_document(self) -> None: method test_send_file_image (line 402) | async def test_send_file_image(self) -> None: method test_send_file_document_with_query (line 427) | async def test_send_file_document_with_query(self) -> None: method test_send_file_too_large (line 456) | async def test_send_file_too_large(self) -> None: method test_send_file_names (line 473) | async def test_send_file_names(self) -> None: method test_send_file_names_truncate (line 484) | async def test_send_file_names_truncate(self) -> None: method test_send_message (line 496) | async def test_send_message(self) -> None: FILE: tests/test_containers.py class TestContainer (line 9) | class TestContainer: method test_container (line 10) | def test_container(self) -> None: method _test_providers (line 20) | def _test_providers(self, container: Container) -> None: FILE: tests/test_models.py class UnknownTelegramObject (line 7) | class UnknownTelegramObject: class TestFileData (line 11) | class TestFileData(TelegramTestMixin): method test_from_telegram_document (line 12) | def test_from_telegram_document(self) -> None: method test_from_telegram_photo_size (line 16) | def test_from_telegram_photo_size(self) -> None: class TestTaskData (line 21) | class TestTaskData(TelegramTestMixin): method test_get_file_data (line 22) | def test_get_file_data(self) -> None: FILE: tests/text/test_text_handler.py class TestTextHandler (line 11) | class TestTextHandler(TelegramServiceTestMixin): method setup_method (line 15) | def setup_method(self) -> None: method test_conversation_handler (line 23) | async def test_conversation_handler(self) -> None: FILE: tests/text/test_text_repository.py class TestTextRepository (line 9) | class TestTextRepository: method setup_method (line 14) | def setup_method(self) -> None: method test_get_font (line 25) | def test_get_font(self) -> None: method test_get_font_no_regular_font (line 31) | def test_get_font_no_regular_font(self) -> None: method test_get_font_unknown_font (line 39) | def test_get_font_unknown_font(self) -> None: method _assert_api_call (line 45) | def _assert_api_call(self) -> None: FILE: tests/text/test_text_service.py class TestTextService (line 15) | class TestTextService(LanguageServiceTestMixin, TelegramServiceTestMixin... method setup_method (line 23) | def setup_method(self) -> None: method test_ask_pdf_text (line 45) | async def test_ask_pdf_text(self) -> None: method test_ask_pdf_font (line 51) | async def test_ask_pdf_font(self) -> None: method test_ask_pdf_font_cancel_option (line 61) | async def test_ask_pdf_font_cancel_option(self) -> None: method test_check_text (line 71) | async def test_check_text(self) -> None: method test_check_text_invalid_user_data (line 90) | async def test_check_text_invalid_user_data(self) -> None: method test_check_text_unknown_font (line 104) | async def test_check_text_unknown_font(self) -> None: method test_check_text_skip_option (line 116) | async def test_check_text_skip_option(self) -> None: method test_check_text_cancel_option (line 136) | async def test_check_text_cancel_option(self) -> None: FILE: tests/watermark/test_watermark_handler.py class TestWatermarkHandler (line 11) | class TestWatermarkHandler(TelegramServiceTestMixin): method setup_method (line 15) | def setup_method(self) -> None: method test_conversation_handler (line 23) | async def test_conversation_handler(self) -> None: FILE: tests/watermark/test_watermark_service.py class TestWatermarkService (line 14) | class TestWatermarkService(LanguageServiceTestMixin, TelegramServiceTest... method setup_method (line 20) | def setup_method(self) -> None: method test_ask_source_pdf (line 36) | async def test_ask_source_pdf(self) -> None: method test_check_source_pdf (line 43) | async def test_check_source_pdf(self) -> None: method test_check_source_pdf_invalid_pdf (line 54) | async def test_check_source_pdf_invalid_pdf(self) -> None: method test_add_watermark_to_pdf (line 65) | async def test_add_watermark_to_pdf(self) -> None: method test_add_watermark_to_pdf_service_error (line 86) | async def test_add_watermark_to_pdf_service_error(self) -> None: method test_add_watermark_to_pdf_invalid_user_data (line 102) | async def test_add_watermark_to_pdf_invalid_user_data(self) -> None: method test_add_watermark_to_pdf_invalid_pdf (line 116) | async def test_add_watermark_to_pdf_invalid_pdf(self) -> None: method test_check_text_back_option (line 128) | async def test_check_text_back_option(self) -> None: method test_check_text_cancel_option (line 134) | async def test_check_text_cancel_option(self) -> None: method test_check_text_unknown_text (line 143) | async def test_check_text_unknown_text(self) -> None: FILE: tests/webpage/test_webpage_handler.py class TestWebpageHandler (line 11) | class TestWebpageHandler(TelegramTestMixin): method setup_method (line 12) | def setup_method(self) -> None: method test_handlers (line 18) | async def test_handlers(self) -> None: FILE: tests/webpage/test_webpage_service.py class TestWebpageService (line 17) | class TestWebpageService(LanguageServiceTestMixin, TelegramServiceTestMi... method setup_method (line 22) | def setup_method(self) -> None: method teardown_method (line 41) | def teardown_method(self) -> None: method test_url_to_pdf (line 45) | async def test_url_to_pdf(self) -> None: method test_url_to_pdf_clear_cache_error (line 52) | async def test_url_to_pdf_clear_cache_error(self) -> None: method test_url_to_pdf_cache_error (line 61) | async def test_url_to_pdf_cache_error(self) -> None: method test_url_to_pdf_in_progress (line 70) | async def test_url_to_pdf_in_progress(self) -> None: method test_url_to_pdf_error (line 101) | async def test_url_to_pdf_error(self, error: type[Exception]) -> None: method _assert_url_to_pdf_calls (line 110) | def _assert_url_to_pdf_calls(self) -> None: method _assert_url_to_pdf_send_file (line 124) | def _assert_url_to_pdf_send_file(self) -> None: