


"""simple docstring"""






import importlib
import inspect
from functools import wraps
from typing import TYPE_CHECKING, Optional, Union

from .download.streaming_download_manager import (
    xbasename,
    xdirname,
    xet_parse,
    xexists,
    xgetsize,
    xglob,
    xgzip_open,
    xisdir,
    xisfile,
    xjoin,
    xlistdir,
    xnumpy_load,
    xopen,
    xpandas_read_csv,
    xpandas_read_excel,
    xPath,
    xrelpath,
    xsio_loadmat,
    xsplit,
    xsplitext,
    xwalk,
    xxml_dom_minidom_parse,
)
from .utils.logging import get_logger
from .utils.patching import patch_submodule
from .utils.py_utils import get_imports


_lowerCamelCase  =	get_logger(__name__)


if TYPE_CHECKING:
	from .builder import DatasetBuilder


def __lowercase  (   lowerCamelCase_	:   List[str]    ,       lowerCamelCase_	:   Optional[Union[str, bool]] = None	):
				SCREAMING_SNAKE_CASE__  				=					importlib.import_module(lowerCamelCase_	)

				# TODO(QL): always update the module to add subsequent new authentication
				if hasattr(lowerCamelCase_    ,       "_patched_for_streaming"	) and module._patched_for_streaming:
								return

				def wrap_auth(lowerCamelCase_	:   str	):
								@wraps(lowerCamelCase_	)
								def wrapper(*lowerCamelCase_	:   List[Any]    ,       **lowerCamelCase_	:   Union[str, Any]	):
												return function(*lowerCamelCase_    ,       use_auth_token=lowerCamelCase_    ,       **lowerCamelCase_	)

								SCREAMING_SNAKE_CASE__  				=					"wrap_auth"
								return wrapper

				# open files in a streaming fashion
				patch_submodule(lowerCamelCase_    ,       "open"    ,       wrap_auth(lowerCamelCase_	)	).start()
				patch_submodule(lowerCamelCase_    ,       "os.listdir"    ,       wrap_auth(lowerCamelCase_	)	).start()
				patch_submodule(lowerCamelCase_    ,       "os.walk"    ,       wrap_auth(lowerCamelCase_	)	).start()
				patch_submodule(lowerCamelCase_    ,       "glob.glob"    ,       wrap_auth(lowerCamelCase_	)	).start()
				# allow to navigate in remote zip files
				patch_submodule(lowerCamelCase_    ,       "os.path.join"    ,       lowerCamelCase_	).start()
				patch_submodule(lowerCamelCase_    ,       "os.path.dirname"    ,       lowerCamelCase_	).start()
				patch_submodule(lowerCamelCase_    ,       "os.path.basename"    ,       lowerCamelCase_	).start()
				patch_submodule(lowerCamelCase_    ,       "os.path.relpath"    ,       lowerCamelCase_	).start()
				patch_submodule(lowerCamelCase_    ,       "os.path.split"    ,       lowerCamelCase_	).start()
				patch_submodule(lowerCamelCase_    ,       "os.path.splitext"    ,       lowerCamelCase_	).start()
				# allow checks on paths
				patch_submodule(lowerCamelCase_    ,       "os.path.exists"    ,       wrap_auth(lowerCamelCase_	)	).start()
				patch_submodule(lowerCamelCase_    ,       "os.path.isdir"    ,       wrap_auth(lowerCamelCase_	)	).start()
				patch_submodule(lowerCamelCase_    ,       "os.path.isfile"    ,       wrap_auth(lowerCamelCase_	)	).start()
				patch_submodule(lowerCamelCase_    ,       "os.path.getsize"    ,       wrap_auth(lowerCamelCase_	)	).start()
				patch_submodule(lowerCamelCase_    ,       "pathlib.Path"    ,       lowerCamelCase_	).start()
				# file readers
				patch_submodule(lowerCamelCase_    ,       "gzip.open"    ,       wrap_auth(lowerCamelCase_	)	).start()
				patch_submodule(lowerCamelCase_    ,       "numpy.load"    ,       wrap_auth(lowerCamelCase_	)	).start()
				patch_submodule(lowerCamelCase_    ,       "pandas.read_csv"    ,       wrap_auth(lowerCamelCase_	)    ,       attrs=["__version__"]	).start()
				patch_submodule(lowerCamelCase_    ,       "pandas.read_excel"    ,       wrap_auth(lowerCamelCase_	)    ,       attrs=["__version__"]	).start()
				patch_submodule(lowerCamelCase_    ,       "scipy.io.loadmat"    ,       wrap_auth(lowerCamelCase_	)    ,       attrs=["__version__"]	).start()
				patch_submodule(lowerCamelCase_    ,       "xml.etree.ElementTree.parse"    ,       wrap_auth(lowerCamelCase_	)	).start()
				patch_submodule(lowerCamelCase_    ,       "xml.dom.minidom.parse"    ,       wrap_auth(lowerCamelCase_	)	).start()
				SCREAMING_SNAKE_CASE__  				=					True


def __lowercase  (   lowerCamelCase_	:   "DatasetBuilder"	):
				extend_module_for_streaming(builder.__module__    ,       use_auth_token=builder.use_auth_token	)
				# if needed, we also have to extend additional internal imports (like wmt14 -> wmt_utils)
				if not builder.__module__.startswith("datasets."	):  # check that it's not a packaged builder like csv
								for imports in get_imports(inspect.getfile(builder.__class__	)	):
												if imports[0] == "internal":
																SCREAMING_SNAKE_CASE__  				=					imports[1]
																SCREAMING_SNAKE_CASE__  				=					".".join(builder.__module__.split("."	)[:-1] + [internal_import_name]	)
																extend_module_for_streaming(lowerCamelCase_    ,       use_auth_token=builder.use_auth_token	)

    # builders can inherit from other builders that might use streaming functionality
    # (for example, ImageFolder and AudioFolder inherit from FolderBuilder which implements examples generation)
    # but these parents builders are not patched automatically as they are not instantiated, so we patch them here
				from .builder import DatasetBuilder

				SCREAMING_SNAKE_CASE__  				=					[
				    cls.__module__
				    for cls in type(lowerCamelCase_	).__mro__[1:]  # make sure it's not the same module we've already patched
				    if issubclass(cls    ,       lowerCamelCase_	) and cls.__module__ != DatasetBuilder.__module__
				]  # check it's not a standard builder from datasets.builder
				for module in parent_builder_modules:
								extend_module_for_streaming(lowerCamelCase_    ,       use_auth_token=builder.use_auth_token	)




"""simple docstring"""






def __lowercase  (   lowerCamelCase_	:   str	):
				SCREAMING_SNAKE_CASE__  				=					str(lowerCamelCase_	).strip()
				if not oct_string:
								raise ValueError("Empty string was passed to the function"	)
				SCREAMING_SNAKE_CASE__  				=					oct_string[0] == "-"
				if is_negative:
								SCREAMING_SNAKE_CASE__  				=					oct_string[1:]
				if not oct_string.isdigit() or not all(0 <= int(lowerCamelCase_	) <= 7 for char in oct_string	):
								raise ValueError("Non-octal value was passed to the function"	)
				SCREAMING_SNAKE_CASE__  				=					0
				for char in oct_string:
								SCREAMING_SNAKE_CASE__  				=					8 * decimal_number + int(lowerCamelCase_	)
				if is_negative:
								SCREAMING_SNAKE_CASE__  				=					-decimal_number
				return decimal_number


if __name__ == "__main__":
	from doctest import testmod

	testmod()
