

"""simple docstring"""




import unittest

from transformers import MODEL_FOR_DOCUMENT_QUESTION_ANSWERING_MAPPING, AutoTokenizer, is_vision_available
from transformers.pipelines import pipeline
from transformers.pipelines.document_question_answering import apply_tesseract
from transformers.testing_utils import (
    is_pipeline_test,
    nested_simplify,
    require_detectrona,
    require_pytesseract,
    require_tf,
    require_torch,
    require_vision,
    slow,
)

from .test_pipelines_common import ANY


if is_vision_available():
						from PIL import Image

						from transformers.image_utils import load_image
else:





						class    lowerCamelCase						:

									@staticmethod
									def 					SCREAMING_SNAKE_CASE				(					*__UpperCAmelCase				:						Optional[Any]    ,				**__UpperCAmelCase				:						Optional[Any]       )   ->    Optional[Any]:
												pass

						def 	A       (     snake_case__    ):




									'''simple docstring'''


									return None


# This is a pinned image from a specific revision of a document question answering space, hosted by HuggingFace,
# so we can expect it to be available.
A_							:			str											= (
    "https://huggingface.co/spaces/impira/docquery/resolve/2f6c96314dc84dfda62d40de9da55f2f5165d403/invoice.png"
)





@is_pipeline_test
@require_torch
@require_vision
class    lowerCamelCase						(unittest.TestCase			):
			lowerCamelCase__   :		List[str]							=							MODEL_FOR_DOCUMENT_QUESTION_ANSWERING_MAPPING

			@require_pytesseract
			@require_vision
			def 					SCREAMING_SNAKE_CASE				(					self				:						Tuple    ,				__UpperCAmelCase				:						Optional[Any]    ,				__UpperCAmelCase				:						Dict    ,				__UpperCAmelCase				:						Any       )   ->    str:
						SCREAMING_SNAKE_CASE__								=      pipeline(
						    """document-question-answering"""    ,				model=__UpperCAmelCase    ,				tokenizer=__UpperCAmelCase    ,				image_processor=__UpperCAmelCase       )

						SCREAMING_SNAKE_CASE__								=      INVOICE_URL
						SCREAMING_SNAKE_CASE__								=      list(zip(*apply_tesseract(load_image(__UpperCAmelCase       )    ,				__UpperCAmelCase    ,				""""""       )       )       )
						SCREAMING_SNAKE_CASE__								=      """What is the placebo?"""
						SCREAMING_SNAKE_CASE__								=      [
						    {
						        """image""": load_image(__UpperCAmelCase       ),
						        """question""": question,
						    },
						    {
						        """image""": image,
						        """question""": question,
						    },
						    {
						        """image""": image,
						        """question""": question,
						        """word_boxes""": word_boxes,
						    },
						]
						return dqa_pipeline, examples

			def 					SCREAMING_SNAKE_CASE				(					self				:						Any    ,				__UpperCAmelCase				:						Union[str, Any]    ,				__UpperCAmelCase				:						Optional[int]       )   ->    Any:
						SCREAMING_SNAKE_CASE__								=      dqa_pipeline(__UpperCAmelCase    ,				top_k=2       )
						self.assertEqual(
						    __UpperCAmelCase    ,				[
						        [
						            {"""score""": ANY(__UpperCAmelCase       ), """answer""": ANY(__UpperCAmelCase       ), """start""": ANY(__UpperCAmelCase       ), """end""": ANY(__UpperCAmelCase       )},
						            {"""score""": ANY(__UpperCAmelCase       ), """answer""": ANY(__UpperCAmelCase       ), """start""": ANY(__UpperCAmelCase       ), """end""": ANY(__UpperCAmelCase       )},
						        ]
						    ]
						    * 3    ,				)

			@require_torch
			@require_detectrona
			@require_pytesseract
			def 					SCREAMING_SNAKE_CASE				(					self				:						Any       )   ->    str:
						SCREAMING_SNAKE_CASE__								=      pipeline("""document-question-answering"""    ,				model="""hf-internal-testing/tiny-random-layoutlmv2"""       )
						SCREAMING_SNAKE_CASE__								=      INVOICE_URL
						SCREAMING_SNAKE_CASE__								=      """How many cats are there?"""

						SCREAMING_SNAKE_CASE__								=      [
						    {"""score""": 0.0_001, """answer""": """oy 2312/2019""", """start""": 3_8, """end""": 3_9},
						    {"""score""": 0.0_001, """answer""": """oy 2312/2019 DUE""", """start""": 3_8, """end""": 4_0},
						]
						SCREAMING_SNAKE_CASE__								=      dqa_pipeline(image=__UpperCAmelCase    ,				question=__UpperCAmelCase    ,				top_k=2       )
						self.assertEqual(nested_simplify(__UpperCAmelCase    ,				decimals=4       )    ,				__UpperCAmelCase       )

						SCREAMING_SNAKE_CASE__								=      dqa_pipeline({"""image""": image, """question""": question}    ,				top_k=2       )
						self.assertEqual(nested_simplify(__UpperCAmelCase    ,				decimals=4       )    ,				__UpperCAmelCase       )

						# This image does not detect ANY text in it, meaning layoutlmv2 should fail.
						# Empty answer probably
						SCREAMING_SNAKE_CASE__								=      """./tests/fixtures/tests_samples/COCO/000000039769.png"""
						SCREAMING_SNAKE_CASE__								=      dqa_pipeline(image=__UpperCAmelCase    ,				question=__UpperCAmelCase    ,				top_k=2       )
						self.assertEqual(__UpperCAmelCase    ,				[]       )

						# We can optionnally pass directly the words and bounding boxes
						SCREAMING_SNAKE_CASE__								=      """./tests/fixtures/tests_samples/COCO/000000039769.png"""
						SCREAMING_SNAKE_CASE__								=      []
						SCREAMING_SNAKE_CASE__								=      []
						SCREAMING_SNAKE_CASE__								=      dqa_pipeline(image=__UpperCAmelCase    ,				question=__UpperCAmelCase    ,				words=__UpperCAmelCase    ,				boxes=__UpperCAmelCase    ,				top_k=2       )
						self.assertEqual(__UpperCAmelCase    ,				[]       )

			@slow
			@require_torch
			@require_detectrona
			@require_pytesseract
			def 					SCREAMING_SNAKE_CASE				(					self				:						List[Any]       )   ->    List[Any]:
						SCREAMING_SNAKE_CASE__								=      pipeline(
						    """document-question-answering"""    ,				model="""tiennvcs/layoutlmv2-base-uncased-finetuned-docvqa"""    ,				revision="""9977165"""    ,				)
						SCREAMING_SNAKE_CASE__								=      INVOICE_URL
						SCREAMING_SNAKE_CASE__								=      """What is the invoice number?"""

						SCREAMING_SNAKE_CASE__								=      dqa_pipeline(image=__UpperCAmelCase    ,				question=__UpperCAmelCase    ,				top_k=2       )
						self.assertEqual(
						    nested_simplify(__UpperCAmelCase    ,				decimals=4       )    ,				[
						        {"""score""": 0.9_944, """answer""": """us-001""", """start""": 1_6, """end""": 1_6},
						        {"""score""": 0.0_009, """answer""": """us-001""", """start""": 1_6, """end""": 1_6},
						    ]    ,				)

						SCREAMING_SNAKE_CASE__								=      dqa_pipeline({"""image""": image, """question""": question}    ,				top_k=2       )
						self.assertEqual(
						    nested_simplify(__UpperCAmelCase    ,				decimals=4       )    ,				[
						        {"""score""": 0.9_944, """answer""": """us-001""", """start""": 1_6, """end""": 1_6},
						        {"""score""": 0.0_009, """answer""": """us-001""", """start""": 1_6, """end""": 1_6},
						    ]    ,				)

						SCREAMING_SNAKE_CASE__								=      dqa_pipeline(
						    [{"""image""": image, """question""": question}, {"""image""": image, """question""": question}]    ,				top_k=2       )
						self.assertEqual(
						    nested_simplify(__UpperCAmelCase    ,				decimals=4       )    ,				[
						        [
						            {"""score""": 0.9_944, """answer""": """us-001""", """start""": 1_6, """end""": 1_6},
						            {"""score""": 0.0_009, """answer""": """us-001""", """start""": 1_6, """end""": 1_6},
						        ],
						    ]
						    * 2    ,				)

			@slow
			@require_torch
			@require_detectrona
			@require_pytesseract
			def 					SCREAMING_SNAKE_CASE				(					self				:						Dict       )   ->    Optional[Any]:
						SCREAMING_SNAKE_CASE__								=      pipeline(
						    """document-question-answering"""    ,				model="""tiennvcs/layoutlmv2-base-uncased-finetuned-docvqa"""    ,				revision="""9977165"""    ,				max_seq_len=5_0    ,				)
						SCREAMING_SNAKE_CASE__								=      INVOICE_URL
						SCREAMING_SNAKE_CASE__								=      """What is the invoice number?"""

						SCREAMING_SNAKE_CASE__								=      dqa_pipeline(image=__UpperCAmelCase    ,				question=__UpperCAmelCase    ,				top_k=2       )
						self.assertEqual(
						    nested_simplify(__UpperCAmelCase    ,				decimals=4       )    ,				[
						        {"""score""": 0.9_974, """answer""": """1110212019""", """start""": 2_3, """end""": 2_3},
						        {"""score""": 0.9_948, """answer""": """us-001""", """start""": 1_6, """end""": 1_6},
						    ]    ,				)

						SCREAMING_SNAKE_CASE__								=      dqa_pipeline({"""image""": image, """question""": question}    ,				top_k=2       )
						self.assertEqual(
						    nested_simplify(__UpperCAmelCase    ,				decimals=4       )    ,				[
						        {"""score""": 0.9_974, """answer""": """1110212019""", """start""": 2_3, """end""": 2_3},
						        {"""score""": 0.9_948, """answer""": """us-001""", """start""": 1_6, """end""": 1_6},
						    ]    ,				)

						SCREAMING_SNAKE_CASE__								=      dqa_pipeline(
						    [{"""image""": image, """question""": question}, {"""image""": image, """question""": question}]    ,				top_k=2       )
						self.assertEqual(
						    nested_simplify(__UpperCAmelCase    ,				decimals=4       )    ,				[
						        [
						            {"""score""": 0.9_974, """answer""": """1110212019""", """start""": 2_3, """end""": 2_3},
						            {"""score""": 0.9_948, """answer""": """us-001""", """start""": 1_6, """end""": 1_6},
						        ]
						    ]
						    * 2    ,				)

			@slow
			@require_torch
			@require_pytesseract
			@require_vision
			def 					SCREAMING_SNAKE_CASE				(					self				:						str       )   ->    Optional[Any]:
						SCREAMING_SNAKE_CASE__								=      AutoTokenizer.from_pretrained(
						    """impira/layoutlm-document-qa"""    ,				revision="""3dc6de3"""    ,				add_prefix_space=__UpperCAmelCase       )
						SCREAMING_SNAKE_CASE__								=      pipeline(
						    """document-question-answering"""    ,				model="""impira/layoutlm-document-qa"""    ,				tokenizer=__UpperCAmelCase    ,				revision="""3dc6de3"""    ,				)
						SCREAMING_SNAKE_CASE__								=      INVOICE_URL
						SCREAMING_SNAKE_CASE__								=      """What is the invoice number?"""

						SCREAMING_SNAKE_CASE__								=      dqa_pipeline(image=__UpperCAmelCase    ,				question=__UpperCAmelCase    ,				top_k=2       )
						self.assertEqual(
						    nested_simplify(__UpperCAmelCase    ,				decimals=4       )    ,				[
						        {"""score""": 0.4_251, """answer""": """us-001""", """start""": 1_6, """end""": 1_6},
						        {"""score""": 0.0_819, """answer""": """1110212019""", """start""": 2_3, """end""": 2_3},
						    ]    ,				)

						SCREAMING_SNAKE_CASE__								=      dqa_pipeline({"""image""": image, """question""": question}    ,				top_k=2       )
						self.assertEqual(
						    nested_simplify(__UpperCAmelCase    ,				decimals=4       )    ,				[
						        {"""score""": 0.4_251, """answer""": """us-001""", """start""": 1_6, """end""": 1_6},
						        {"""score""": 0.0_819, """answer""": """1110212019""", """start""": 2_3, """end""": 2_3},
						    ]    ,				)

						SCREAMING_SNAKE_CASE__								=      dqa_pipeline(
						    [{"""image""": image, """question""": question}, {"""image""": image, """question""": question}]    ,				top_k=2       )
						self.assertEqual(
						    nested_simplify(__UpperCAmelCase    ,				decimals=4       )    ,				[
						        [
						            {"""score""": 0.4_251, """answer""": """us-001""", """start""": 1_6, """end""": 1_6},
						            {"""score""": 0.0_819, """answer""": """1110212019""", """start""": 2_3, """end""": 2_3},
						        ]
						    ]
						    * 2    ,				)

						SCREAMING_SNAKE_CASE__								=      list(zip(*apply_tesseract(load_image(__UpperCAmelCase       )    ,				__UpperCAmelCase    ,				""""""       )       )       )

						# This model should also work if `image` is set to None
						SCREAMING_SNAKE_CASE__								=      dqa_pipeline({"""image""": None, """word_boxes""": word_boxes, """question""": question}    ,				top_k=2       )
						self.assertEqual(
						    nested_simplify(__UpperCAmelCase    ,				decimals=4       )    ,				[
						        {"""score""": 0.4_251, """answer""": """us-001""", """start""": 1_6, """end""": 1_6},
						        {"""score""": 0.0_819, """answer""": """1110212019""", """start""": 2_3, """end""": 2_3},
						    ]    ,				)

			@slow
			@require_torch
			@require_pytesseract
			@require_vision
			def 					SCREAMING_SNAKE_CASE				(					self				:						int       )   ->    List[Any]:
						SCREAMING_SNAKE_CASE__								=      AutoTokenizer.from_pretrained(
						    """impira/layoutlm-document-qa"""    ,				revision="""3dc6de3"""    ,				add_prefix_space=__UpperCAmelCase       )
						SCREAMING_SNAKE_CASE__								=      pipeline(
						    """document-question-answering"""    ,				model="""impira/layoutlm-document-qa"""    ,				tokenizer=__UpperCAmelCase    ,				revision="""3dc6de3"""    ,				max_seq_len=5_0    ,				)
						SCREAMING_SNAKE_CASE__								=      INVOICE_URL
						SCREAMING_SNAKE_CASE__								=      """What is the invoice number?"""

						SCREAMING_SNAKE_CASE__								=      dqa_pipeline(image=__UpperCAmelCase    ,				question=__UpperCAmelCase    ,				top_k=2       )
						self.assertEqual(
						    nested_simplify(__UpperCAmelCase    ,				decimals=4       )    ,				[
						        {"""score""": 0.9_999, """answer""": """us-001""", """start""": 1_6, """end""": 1_6},
						        {"""score""": 0.9_998, """answer""": """us-001""", """start""": 1_6, """end""": 1_6},
						    ]    ,				)

						SCREAMING_SNAKE_CASE__								=      dqa_pipeline(
						    [{"""image""": image, """question""": question}, {"""image""": image, """question""": question}]    ,				top_k=2       )
						self.assertEqual(
						    nested_simplify(__UpperCAmelCase    ,				decimals=4       )    ,				[
						        [
						            {"""score""": 0.9_999, """answer""": """us-001""", """start""": 1_6, """end""": 1_6},
						            {"""score""": 0.9_998, """answer""": """us-001""", """start""": 1_6, """end""": 1_6},
						        ]
						    ]
						    * 2    ,				)

						SCREAMING_SNAKE_CASE__								=      list(zip(*apply_tesseract(load_image(__UpperCAmelCase       )    ,				__UpperCAmelCase    ,				""""""       )       )       )

						# This model should also work if `image` is set to None
						SCREAMING_SNAKE_CASE__								=      dqa_pipeline({"""image""": None, """word_boxes""": word_boxes, """question""": question}    ,				top_k=2       )
						self.assertEqual(
						    nested_simplify(__UpperCAmelCase    ,				decimals=4       )    ,				[
						        {"""score""": 0.9_999, """answer""": """us-001""", """start""": 1_6, """end""": 1_6},
						        {"""score""": 0.9_998, """answer""": """us-001""", """start""": 1_6, """end""": 1_6},
						    ]    ,				)

			@slow
			@require_torch
			def 					SCREAMING_SNAKE_CASE				(					self				:						List[str]       )   ->    Any:
						SCREAMING_SNAKE_CASE__								=      pipeline(
						    """document-question-answering"""    ,				model="""naver-clova-ix/donut-base-finetuned-docvqa"""    ,				tokenizer=AutoTokenizer.from_pretrained("""naver-clova-ix/donut-base-finetuned-docvqa"""       )    ,				feature_extractor="""naver-clova-ix/donut-base-finetuned-docvqa"""    ,				)

						SCREAMING_SNAKE_CASE__								=      INVOICE_URL
						SCREAMING_SNAKE_CASE__								=      """What is the invoice number?"""
						SCREAMING_SNAKE_CASE__								=      dqa_pipeline(image=__UpperCAmelCase    ,				question=__UpperCAmelCase    ,				top_k=2       )
						self.assertEqual(nested_simplify(__UpperCAmelCase    ,				decimals=4       )    ,				[{"""answer""": """us-001"""}]       )





			@require_tf
			@unittest.skip("""Document question answering not implemented in TF"""       )
			def 					SCREAMING_SNAKE_CASE				(					self				:						Optional[int]       )   ->    Optional[int]:
						pass







"""simple docstring"""




import pytest
import requests

from datasets.utils.file_utils import http_head

from .utils import OfflineSimulationMode, RequestWouldHangIndefinitelyError, offline

@pytest.mark.integration
def 	A       (     ):




			'''simple docstring'''


			with offline(OfflineSimulationMode.CONNECTION_TIMES_OUT    ):
						with pytest.raises(snake_case__    ):
									requests.request("""GET"""		,				"""https://huggingface.co"""    )
						with pytest.raises(requests.exceptions.ConnectTimeout    ):
									requests.request("""GET"""		,				"""https://huggingface.co"""		,				timeout=1.0    )

@pytest.mark.integration
def 	A       (     ):




			'''simple docstring'''


			with offline(OfflineSimulationMode.CONNECTION_FAILS    ):
						with pytest.raises(requests.exceptions.ConnectionError    ):
									requests.request("""GET"""		,				"""https://huggingface.co"""    )




def 	A       (     ):




			'''simple docstring'''


			with offline(OfflineSimulationMode.HF_DATASETS_OFFLINE_SET_TO_1    ):
						with pytest.raises(snake_case__    ):
									http_head("""https://huggingface.co"""    )


