




'''simple docstring'''



import unittest

import numpy as np

from transformers.testing_utils import require_torch, require_vision
from transformers.utils import is_torch_available, is_vision_available

from ...test_image_processing_common import ImageProcessingSavingTestMixin, prepare_image_inputs


if is_torch_available():
     import torch

if is_vision_available():
     from PIL import Image

     from transformers import MobileViTImageProcessor





class      lowerCAmelCase (			unittest.TestCase):


       def __init__( self     ,	__SCREAMING_SNAKE_CASE     ,	__SCREAMING_SNAKE_CASE=7     ,	__SCREAMING_SNAKE_CASE=3     ,	__SCREAMING_SNAKE_CASE=18     ,	__SCREAMING_SNAKE_CASE=30     ,	__SCREAMING_SNAKE_CASE=400     ,	__SCREAMING_SNAKE_CASE=True     ,	__SCREAMING_SNAKE_CASE=None     ,	__SCREAMING_SNAKE_CASE=True     ,	__SCREAMING_SNAKE_CASE=None     ,	__SCREAMING_SNAKE_CASE=True     ,	)   ->	Tuple:



            '''simple docstring'''




            __snake_case            =	size if size is not None else {'''shortest_edge''': 20}
            __snake_case            =	crop_size if crop_size is not None else {'''height''': 18, '''width''': 18}
            __snake_case            =	parent
            __snake_case            =	batch_size
            __snake_case            =	num_channels
            __snake_case            =	image_size
            __snake_case            =	min_resolution
            __snake_case            =	max_resolution
            __snake_case            =	do_resize
            __snake_case            =	size
            __snake_case            =	do_center_crop
            __snake_case            =	crop_size
            __snake_case            =	do_flip_channel_order




       def    lowerCAmelCase   ( self	)   ->	Union[str, Any]:



            '''simple docstring'''




            return {
                "do_resize": self.do_resize,
                "size": self.size,
                "do_center_crop": self.do_center_crop,
                "crop_size": self.crop_size,
                "do_flip_channel_order": self.do_flip_channel_order,
            }





@require_torch
@require_vision
class      lowerCAmelCase (			__lowerCAmelCase					, unittest.TestCase):
       __lowercase	:   Union[str, Any]										=      MobileViTImageProcessor if is_vision_available() else None


       def    lowerCAmelCase   ( self	)   ->	str:



            '''simple docstring'''




            __snake_case            =	MobileViTImageProcessingTester(self	)


       @property
       def    lowerCAmelCase   ( self	)   ->	Optional[int]:



            '''simple docstring'''




            return self.image_processor_tester.prepare_image_processor_dict()


       def    lowerCAmelCase   ( self	)   ->	Union[str, Any]:



            '''simple docstring'''




            __snake_case            =	self.image_processing_class(**self.image_processor_dict	)
            self.assertTrue(hasattr(__SCREAMING_SNAKE_CASE     ,	'''do_resize'''	)	)
            self.assertTrue(hasattr(__SCREAMING_SNAKE_CASE     ,	'''size'''	)	)
            self.assertTrue(hasattr(__SCREAMING_SNAKE_CASE     ,	'''do_center_crop'''	)	)
            self.assertTrue(hasattr(__SCREAMING_SNAKE_CASE     ,	'''center_crop'''	)	)
            self.assertTrue(hasattr(__SCREAMING_SNAKE_CASE     ,	'''do_flip_channel_order'''	)	)


       def    lowerCAmelCase   ( self	)   ->	Optional[int]:



            '''simple docstring'''




            __snake_case            =	self.image_processing_class.from_dict(self.image_processor_dict	)
            self.assertEqual(image_processor.size     ,	{'''shortest_edge''': 20}	)
            self.assertEqual(image_processor.crop_size     ,	{'''height''': 18, '''width''': 18}	)

            __snake_case            =	self.image_processing_class.from_dict(self.image_processor_dict     ,	size=42     ,	crop_size=84	)
            self.assertEqual(image_processor.size     ,	{'''shortest_edge''': 42}	)
            self.assertEqual(image_processor.crop_size     ,	{'''height''': 84, '''width''': 84}	)


       def    lowerCAmelCase   ( self	)   ->	Optional[Any]:



            '''simple docstring'''




            pass


       def    lowerCAmelCase   ( self	)   ->	str:



            '''simple docstring'''




            __snake_case            =	self.image_processing_class(**self.image_processor_dict	)
            # create random PIL images
            __snake_case            =	prepare_image_inputs(self.image_processor_tester     ,	equal_resolution=__SCREAMING_SNAKE_CASE	)
            for image in image_inputs:
                 self.assertIsInstance(__SCREAMING_SNAKE_CASE     ,	Image.Image	)

            # Test not batched input
            __snake_case            =	image_processing(image_inputs[0]     ,	return_tensors='''pt'''	).pixel_values
            self.assertEqual(
                encoded_images.shape     ,	(
                    1,
                    self.image_processor_tester.num_channels,
                    self.image_processor_tester.crop_size['''height'''],
                    self.image_processor_tester.crop_size['''width'''],
                )     ,	)

            # Test batched
            __snake_case            =	image_processing(__SCREAMING_SNAKE_CASE     ,	return_tensors='''pt'''	).pixel_values
            self.assertEqual(
                encoded_images.shape     ,	(
                    self.image_processor_tester.batch_size,
                    self.image_processor_tester.num_channels,
                    self.image_processor_tester.crop_size['''height'''],
                    self.image_processor_tester.crop_size['''width'''],
                )     ,	)


       def    lowerCAmelCase   ( self	)   ->	Tuple:



            '''simple docstring'''




            __snake_case            =	self.image_processing_class(**self.image_processor_dict	)
            # create random numpy tensors
            __snake_case            =	prepare_image_inputs(self.image_processor_tester     ,	equal_resolution=__SCREAMING_SNAKE_CASE     ,	numpify=__SCREAMING_SNAKE_CASE	)
            for image in image_inputs:
                 self.assertIsInstance(__SCREAMING_SNAKE_CASE     ,	np.ndarray	)

            # Test not batched input
            __snake_case            =	image_processing(image_inputs[0]     ,	return_tensors='''pt'''	).pixel_values
            self.assertEqual(
                encoded_images.shape     ,	(
                    1,
                    self.image_processor_tester.num_channels,
                    self.image_processor_tester.crop_size['''height'''],
                    self.image_processor_tester.crop_size['''width'''],
                )     ,	)

            # Test batched
            __snake_case            =	image_processing(__SCREAMING_SNAKE_CASE     ,	return_tensors='''pt'''	).pixel_values
            self.assertEqual(
                encoded_images.shape     ,	(
                    self.image_processor_tester.batch_size,
                    self.image_processor_tester.num_channels,
                    self.image_processor_tester.crop_size['''height'''],
                    self.image_processor_tester.crop_size['''width'''],
                )     ,	)




       def    lowerCAmelCase   ( self	)   ->	Tuple:



            '''simple docstring'''




            __snake_case            =	self.image_processing_class(**self.image_processor_dict	)
            # create random PyTorch tensors
            __snake_case            =	prepare_image_inputs(self.image_processor_tester     ,	equal_resolution=__SCREAMING_SNAKE_CASE     ,	torchify=__SCREAMING_SNAKE_CASE	)
            for image in image_inputs:
                 self.assertIsInstance(__SCREAMING_SNAKE_CASE     ,	torch.Tensor	)

            # Test not batched input
            __snake_case            =	image_processing(image_inputs[0]     ,	return_tensors='''pt'''	).pixel_values
            self.assertEqual(
                encoded_images.shape     ,	(
                    1,
                    self.image_processor_tester.num_channels,
                    self.image_processor_tester.crop_size['''height'''],
                    self.image_processor_tester.crop_size['''width'''],
                )     ,	)

            # Test batched
            __snake_case            =	image_processing(__SCREAMING_SNAKE_CASE     ,	return_tensors='''pt'''	).pixel_values
            self.assertEqual(
                encoded_images.shape     ,	(
                    self.image_processor_tester.batch_size,
                    self.image_processor_tester.num_channels,
                    self.image_processor_tester.crop_size['''height'''],
                    self.image_processor_tester.crop_size['''width'''],
                )     ,	)








"""simple docstring"""






import html

from ...feature_extraction_utils import BatchFeature, FeatureExtractionMixin
from ...utils import is_bsa_available, logging, requires_backends


if is_bsa_available():
					import bsa
					from bsa import BeautifulSoup


_lowercase							=				logging.get_logger(__name__)

class 					__a     ( __a       ):



							'''simple docstring'''







							def __init__(     self  ,    **_lowerCamelCase       )			->							List[Any]:




										'''simple docstring'''
										requires_backends(self  ,    ["bs4"]       )
										super().__init__(**_lowerCamelCase       )
							def   SCREAMING_SNAKE_CASE						(     self  ,    _lowerCamelCase       )			->							Tuple:




										'''simple docstring'''
										__lowercase       =       []
										__lowercase       =       []
										__lowercase       =       element if element.name else element.parent
										for parent in child.parents:  # type: bs4.element.Tag
													__lowercase       =       parent.find_all(child.name  ,    recursive=_lowerCamelCase       )
													xpath_tags.append(child.name       )
													xpath_subscripts.append(
													    0 if 1 == len(_lowerCamelCase       ) else next(i for i, s in enumerate(_lowerCamelCase  ,    1       ) if s is child       )       )
													__lowercase       =       parent
										xpath_tags.reverse()
										xpath_subscripts.reverse()
										return xpath_tags, xpath_subscripts
							def   SCREAMING_SNAKE_CASE						(     self  ,    _lowerCamelCase       )			->							Union[str, Any]:




										'''simple docstring'''
										__lowercase       =       BeautifulSoup(_lowerCamelCase  ,    "html.parser"       )

										__lowercase       =       []
										__lowercase       =       []
										__lowercase       =       []

										for element in html_code.descendants:
													if type(_lowerCamelCase       ) == bsa.element.NavigableString:
																if type(element.parent       ) != bsa.element.Tag:
																			continue

																__lowercase       =       html.unescape(_lowerCamelCase       ).strip()
																if not text_in_this_tag:
																			continue

																all_doc_strings.append(_lowerCamelCase       )

																__lowercase   ,					__lowercase       =       self.xpath_soup(_lowerCamelCase       )
																stringaxtag_seq.append(_lowerCamelCase       )
																stringaxsubs_seq.append(_lowerCamelCase       )

										if len(_lowerCamelCase       ) != len(_lowerCamelCase       ):
													raise ValueError("Number of doc strings and xtags does not correspond"       )
										if len(_lowerCamelCase       ) != len(_lowerCamelCase       ):
													raise ValueError("Number of doc strings and xsubs does not correspond"       )

										return all_doc_strings, stringaxtag_seq, stringaxsubs_seq
							def   SCREAMING_SNAKE_CASE						(     self  ,    _lowerCamelCase  ,    _lowerCamelCase       )			->							Tuple:




										'''simple docstring'''
										__lowercase       =       ""
										for tagname, subs in zip(_lowerCamelCase  ,    _lowerCamelCase       ):
													xpath += f'''/{tagname}'''
													if subs != 0:
																xpath += f'''[{subs}]'''
										return xpath





							def __call__(     self  ,    _lowerCamelCase       )			->							BatchFeature:




										'''simple docstring'''
										__lowercase       =       False

										# Check that strings has a valid type
										if isinstance(_lowerCamelCase  ,    _lowerCamelCase       ):
													__lowercase       =       True
										elif isinstance(_lowerCamelCase  ,    (list, tuple)       ):
													if len(_lowerCamelCase       ) == 0 or isinstance(html_strings[0]  ,    _lowerCamelCase       ):
																__lowercase       =       True

										if not valid_strings:
													raise ValueError(
													    "HTML strings must of type `str`, `List[str]` (batch of examples), "
													    f'''but is of type {type(_lowerCamelCase       )}.'''       )

										__lowercase       =       bool(isinstance(_lowerCamelCase  ,    (list, tuple)       ) and (isinstance(html_strings[0]  ,    _lowerCamelCase       ))       )

										if not is_batched:
													__lowercase       =       [html_strings]

										# Get nodes + xpaths
										__lowercase       =       []
										__lowercase       =       []
										for html_string in html_strings:
													__lowercase   ,					__lowercase   ,					__lowercase       =       self.get_three_from_single(_lowerCamelCase       )
													nodes.append(_lowerCamelCase       )
													__lowercase       =       []
													for node, tag_list, sub_list in zip(_lowerCamelCase  ,    _lowerCamelCase  ,    _lowerCamelCase       ):
																__lowercase       =       self.construct_xpath(_lowerCamelCase  ,    _lowerCamelCase       )
																xpath_strings.append(_lowerCamelCase       )
													xpaths.append(_lowerCamelCase       )

										# return as Dict
										__lowercase       =       {"nodes": nodes, "xpaths": xpaths}
										__lowercase       =       BatchFeature(data=_lowerCamelCase  ,    tensor_type=_lowerCamelCase       )

										return encoded_inputs





