snowflake-connector-python 4.4.0__cp314-cp314-win_amd64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- snowflake/connector/__init__.py +118 -0
- snowflake/connector/_query_context_cache.py +276 -0
- snowflake/connector/_sql_util.py +48 -0
- snowflake/connector/_utils.py +353 -0
- snowflake/connector/aio/README.md +88 -0
- snowflake/connector/aio/__init__.py +163 -0
- snowflake/connector/aio/_azure_storage_client.py +227 -0
- snowflake/connector/aio/_bind_upload_agent.py +69 -0
- snowflake/connector/aio/_connection.py +1216 -0
- snowflake/connector/aio/_cursor.py +1402 -0
- snowflake/connector/aio/_description.py +5 -0
- snowflake/connector/aio/_direct_file_operation_utils.py +88 -0
- snowflake/connector/aio/_file_transfer_agent.py +316 -0
- snowflake/connector/aio/_gcs_storage_client.py +360 -0
- snowflake/connector/aio/_network.py +860 -0
- snowflake/connector/aio/_ocsp_asn1crypto.py +51 -0
- snowflake/connector/aio/_ocsp_snowflake.py +608 -0
- snowflake/connector/aio/_pandas_tools.py +561 -0
- snowflake/connector/aio/_result_batch.py +442 -0
- snowflake/connector/aio/_result_set.py +309 -0
- snowflake/connector/aio/_s3_storage_client.py +460 -0
- snowflake/connector/aio/_session_manager.py +588 -0
- snowflake/connector/aio/_storage_client.py +331 -0
- snowflake/connector/aio/_telemetry.py +97 -0
- snowflake/connector/aio/_time_util.py +57 -0
- snowflake/connector/aio/_wif_util.py +324 -0
- snowflake/connector/aio/auth/__init__.py +52 -0
- snowflake/connector/aio/auth/_auth.py +406 -0
- snowflake/connector/aio/auth/_by_plugin.py +131 -0
- snowflake/connector/aio/auth/_default.py +28 -0
- snowflake/connector/aio/auth/_idtoken.py +54 -0
- snowflake/connector/aio/auth/_keypair.py +60 -0
- snowflake/connector/aio/auth/_no_auth.py +31 -0
- snowflake/connector/aio/auth/_oauth.py +27 -0
- snowflake/connector/aio/auth/_oauth_code.py +117 -0
- snowflake/connector/aio/auth/_oauth_credentials.py +100 -0
- snowflake/connector/aio/auth/_okta.py +247 -0
- snowflake/connector/aio/auth/_pat.py +27 -0
- snowflake/connector/aio/auth/_usrpwdmfa.py +30 -0
- snowflake/connector/aio/auth/_webbrowser.py +405 -0
- snowflake/connector/aio/auth/_workload_identity.py +60 -0
- snowflake/connector/arrow_context.py +211 -0
- snowflake/connector/auth/__init__.py +53 -0
- snowflake/connector/auth/_auth.py +669 -0
- snowflake/connector/auth/_http_server.py +257 -0
- snowflake/connector/auth/_oauth_base.py +472 -0
- snowflake/connector/auth/by_plugin.py +219 -0
- snowflake/connector/auth/default.py +36 -0
- snowflake/connector/auth/idtoken.py +72 -0
- snowflake/connector/auth/keypair.py +225 -0
- snowflake/connector/auth/no_auth.py +39 -0
- snowflake/connector/auth/oauth.py +49 -0
- snowflake/connector/auth/oauth_code.py +490 -0
- snowflake/connector/auth/oauth_credentials.py +71 -0
- snowflake/connector/auth/okta.py +339 -0
- snowflake/connector/auth/pat.py +40 -0
- snowflake/connector/auth/usrpwdmfa.py +69 -0
- snowflake/connector/auth/webbrowser.py +514 -0
- snowflake/connector/auth/workload_identity.py +110 -0
- snowflake/connector/azure_storage_client.py +278 -0
- snowflake/connector/backoff_policies.py +141 -0
- snowflake/connector/bind_upload_agent.py +89 -0
- snowflake/connector/cache.py +696 -0
- snowflake/connector/compat.py +127 -0
- snowflake/connector/config_manager.py +553 -0
- snowflake/connector/connection.py +2671 -0
- snowflake/connector/connection_diagnostic.py +793 -0
- snowflake/connector/constants.py +460 -0
- snowflake/connector/converter.py +809 -0
- snowflake/connector/converter_issue23517.py +87 -0
- snowflake/connector/converter_null.py +14 -0
- snowflake/connector/converter_snowsql.py +205 -0
- snowflake/connector/crl.py +919 -0
- snowflake/connector/crl_cache.py +734 -0
- snowflake/connector/cursor.py +2099 -0
- snowflake/connector/dbapi.py +53 -0
- snowflake/connector/description.py +21 -0
- snowflake/connector/direct_file_operation_utils.py +88 -0
- snowflake/connector/encryption_util.py +220 -0
- snowflake/connector/errorcode.py +94 -0
- snowflake/connector/errors.py +666 -0
- snowflake/connector/externals_utils/__init__.py +0 -0
- snowflake/connector/externals_utils/externals_setup.py +30 -0
- snowflake/connector/feature.py +4 -0
- snowflake/connector/file_compression_type.py +118 -0
- snowflake/connector/file_lock.py +72 -0
- snowflake/connector/file_transfer_agent.py +1244 -0
- snowflake/connector/file_util.py +153 -0
- snowflake/connector/gcs_storage_client.py +476 -0
- snowflake/connector/gzip_decoder.py +85 -0
- snowflake/connector/interval_util.py +26 -0
- snowflake/connector/local_storage_client.py +90 -0
- snowflake/connector/log_configuration.py +62 -0
- snowflake/connector/logging_utils/__init__.py +0 -0
- snowflake/connector/logging_utils/filters.py +72 -0
- snowflake/connector/minicore/__init__.py +0 -0
- snowflake/connector/minicore/aix_ppc64/libsf_mini_core.a +0 -0
- snowflake/connector/minicore/aix_ppc64/libsf_mini_core_static.a +0 -0
- snowflake/connector/minicore/linux_aarch64_glibc/libsf_mini_core.so +0 -0
- snowflake/connector/minicore/linux_aarch64_musl/libsf_mini_core.so +0 -0
- snowflake/connector/minicore/linux_x86_64_glibc/libsf_mini_core.so +0 -0
- snowflake/connector/minicore/linux_x86_64_musl/libsf_mini_core.so +0 -0
- snowflake/connector/minicore/macos_aarch64/libsf_mini_core.dylib +0 -0
- snowflake/connector/minicore/macos_x86_64/libsf_mini_core.dylib +0 -0
- snowflake/connector/minicore/windows_x86_64/sf_mini_core.dll +0 -0
- snowflake/connector/minicore/windows_x86_64/sf_mini_core_static.lib +0 -0
- snowflake/connector/nanoarrow_arrow_iterator.cp314-win_amd64.pyd +0 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/ArrayConverter.cpp +60 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/ArrayConverter.hpp +29 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/BinaryConverter.cpp +19 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/BinaryConverter.hpp +26 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/BooleanConverter.cpp +21 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/BooleanConverter.hpp +23 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowChunkIterator.cpp +570 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowChunkIterator.hpp +98 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowIterator.cpp +125 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowIterator.hpp +115 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowTableIterator.cpp +1140 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowTableIterator.hpp +138 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/DateConverter.cpp +47 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/DateConverter.hpp +46 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/DecFloatConverter.cpp +83 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/DecFloatConverter.hpp +35 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/DecimalConverter.cpp +97 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/DecimalConverter.hpp +72 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/FixedSizeListConverter.cpp +73 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/FixedSizeListConverter.hpp +28 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/FloatConverter.cpp +30 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/FloatConverter.hpp +35 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/IColumnConverter.hpp +17 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/IntConverter.cpp +23 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/IntConverter.hpp +45 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/IntervalConverter.cpp +75 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/IntervalConverter.hpp +57 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/LICENSE.txt +209 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/MapConverter.cpp +75 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/MapConverter.hpp +30 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/ObjectConverter.cpp +46 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/ObjectConverter.hpp +29 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Common.cpp +8 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Common.hpp +95 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Helpers.cpp +57 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Helpers.hpp +36 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/SnowflakeType.cpp +34 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/SnowflakeType.hpp +48 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/StringConverter.cpp +19 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/StringConverter.hpp +26 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeConverter.cpp +36 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeConverter.hpp +31 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeStampConverter.cpp +346 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeStampConverter.hpp +145 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/macros.hpp +14 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/time.cpp +67 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/time.hpp +68 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_accessors.h +101 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_alloc.h +127 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_assert.h +45 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_builder.h +1908 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_emitter.h +215 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_endian.h +125 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_epilogue.h +7 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_flatbuffers.h +55 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_identifier.h +148 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_iov.h +31 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_prologue.h +8 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_refmap.h +144 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_rtconfig.h +162 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_types.h +97 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_verifier.h +239 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/flatcc_portable.h +14 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/paligned_alloc.h +210 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pattributes.h +84 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic.h +84 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic_pop.h +20 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic_push.h +51 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pendian.h +206 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pendian_detect.h +118 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pinline.h +19 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pinttypes.h +52 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/portable.h +2 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/portable_basic.h +25 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstatic_assert.h +67 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstdalign.h +162 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstdint.h +898 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/punaligned.h +190 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pversion.h +6 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pwarnings.h +52 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc.c +3204 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.c +3217 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.h +3618 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.hpp +379 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_arrow_iterator.pyx +262 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_device.c +512 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_device.h +350 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_ipc.c +33273 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_ipc.h +397 -0
- snowflake/connector/nanoarrow_cpp/Logging/logging.cpp +100 -0
- snowflake/connector/nanoarrow_cpp/Logging/logging.hpp +49 -0
- snowflake/connector/network.py +1227 -0
- snowflake/connector/ocsp_asn1crypto.py +447 -0
- snowflake/connector/ocsp_snowflake.py +1939 -0
- snowflake/connector/options.py +179 -0
- snowflake/connector/os_details.py +88 -0
- snowflake/connector/pandas_tools.py +734 -0
- snowflake/connector/platform_detection.py +555 -0
- snowflake/connector/proxy.py +28 -0
- snowflake/connector/py.typed +0 -0
- snowflake/connector/result_batch.py +917 -0
- snowflake/connector/result_set.py +340 -0
- snowflake/connector/s3_storage_client.py +614 -0
- snowflake/connector/secret_detector.py +181 -0
- snowflake/connector/session_manager.py +650 -0
- snowflake/connector/sf_dirs.py +64 -0
- snowflake/connector/sfbinaryformat.py +35 -0
- snowflake/connector/sfdatetime.py +345 -0
- snowflake/connector/snow_logging.py +144 -0
- snowflake/connector/sqlstate.py +9 -0
- snowflake/connector/ssd_internal_keys.py +30 -0
- snowflake/connector/ssl_wrap_socket.py +281 -0
- snowflake/connector/storage_client.py +486 -0
- snowflake/connector/telemetry.py +254 -0
- snowflake/connector/telemetry_oob.py +544 -0
- snowflake/connector/test_util.py +30 -0
- snowflake/connector/time_util.py +159 -0
- snowflake/connector/token_cache.py +457 -0
- snowflake/connector/tool/__init__.py +0 -0
- snowflake/connector/tool/dump_certs.py +57 -0
- snowflake/connector/tool/dump_ocsp_response.py +139 -0
- snowflake/connector/tool/dump_ocsp_response_cache.py +194 -0
- snowflake/connector/tool/probe_connection.py +69 -0
- snowflake/connector/url_util.py +55 -0
- snowflake/connector/util_text.py +320 -0
- snowflake/connector/vendored/__init__.py +3 -0
- snowflake/connector/vendored/requests/LICENSE +175 -0
- snowflake/connector/vendored/requests/__init__.py +184 -0
- snowflake/connector/vendored/requests/__version__.py +14 -0
- snowflake/connector/vendored/requests/_internal_utils.py +50 -0
- snowflake/connector/vendored/requests/adapters.py +696 -0
- snowflake/connector/vendored/requests/api.py +157 -0
- snowflake/connector/vendored/requests/auth.py +314 -0
- snowflake/connector/vendored/requests/certs.py +17 -0
- snowflake/connector/vendored/requests/compat.py +106 -0
- snowflake/connector/vendored/requests/cookies.py +561 -0
- snowflake/connector/vendored/requests/exceptions.py +151 -0
- snowflake/connector/vendored/requests/help.py +134 -0
- snowflake/connector/vendored/requests/hooks.py +33 -0
- snowflake/connector/vendored/requests/models.py +1039 -0
- snowflake/connector/vendored/requests/packages.py +23 -0
- snowflake/connector/vendored/requests/sessions.py +831 -0
- snowflake/connector/vendored/requests/status_codes.py +128 -0
- snowflake/connector/vendored/requests/structures.py +99 -0
- snowflake/connector/vendored/requests/utils.py +1086 -0
- snowflake/connector/vendored/urllib3/LICENSE.txt +21 -0
- snowflake/connector/vendored/urllib3/__init__.py +211 -0
- snowflake/connector/vendored/urllib3/_base_connection.py +165 -0
- snowflake/connector/vendored/urllib3/_collections.py +487 -0
- snowflake/connector/vendored/urllib3/_request_methods.py +278 -0
- snowflake/connector/vendored/urllib3/_version.py +34 -0
- snowflake/connector/vendored/urllib3/connection.py +1108 -0
- snowflake/connector/vendored/urllib3/connectionpool.py +1178 -0
- snowflake/connector/vendored/urllib3/contrib/__init__.py +0 -0
- snowflake/connector/vendored/urllib3/contrib/emscripten/__init__.py +17 -0
- snowflake/connector/vendored/urllib3/contrib/emscripten/connection.py +260 -0
- snowflake/connector/vendored/urllib3/contrib/emscripten/emscripten_fetch_worker.js +110 -0
- snowflake/connector/vendored/urllib3/contrib/emscripten/fetch.py +726 -0
- snowflake/connector/vendored/urllib3/contrib/emscripten/request.py +22 -0
- snowflake/connector/vendored/urllib3/contrib/emscripten/response.py +277 -0
- snowflake/connector/vendored/urllib3/contrib/pyopenssl.py +564 -0
- snowflake/connector/vendored/urllib3/contrib/socks.py +228 -0
- snowflake/connector/vendored/urllib3/exceptions.py +335 -0
- snowflake/connector/vendored/urllib3/fields.py +341 -0
- snowflake/connector/vendored/urllib3/filepost.py +89 -0
- snowflake/connector/vendored/urllib3/http2/__init__.py +53 -0
- snowflake/connector/vendored/urllib3/http2/connection.py +356 -0
- snowflake/connector/vendored/urllib3/http2/probe.py +87 -0
- snowflake/connector/vendored/urllib3/poolmanager.py +651 -0
- snowflake/connector/vendored/urllib3/py.typed +2 -0
- snowflake/connector/vendored/urllib3/response.py +1480 -0
- snowflake/connector/vendored/urllib3/util/__init__.py +42 -0
- snowflake/connector/vendored/urllib3/util/connection.py +137 -0
- snowflake/connector/vendored/urllib3/util/proxy.py +43 -0
- snowflake/connector/vendored/urllib3/util/request.py +263 -0
- snowflake/connector/vendored/urllib3/util/response.py +101 -0
- snowflake/connector/vendored/urllib3/util/retry.py +549 -0
- snowflake/connector/vendored/urllib3/util/ssl_.py +527 -0
- snowflake/connector/vendored/urllib3/util/ssl_match_hostname.py +159 -0
- snowflake/connector/vendored/urllib3/util/ssltransport.py +271 -0
- snowflake/connector/vendored/urllib3/util/timeout.py +275 -0
- snowflake/connector/vendored/urllib3/util/url.py +469 -0
- snowflake/connector/vendored/urllib3/util/util.py +42 -0
- snowflake/connector/vendored/urllib3/util/wait.py +124 -0
- snowflake/connector/version.py +3 -0
- snowflake/connector/wif_util.py +434 -0
- snowflake_connector_python-4.4.0.dist-info/DELVEWHEEL +2 -0
- snowflake_connector_python-4.4.0.dist-info/METADATA +1591 -0
- snowflake_connector_python-4.4.0.dist-info/RECORD +302 -0
- snowflake_connector_python-4.4.0.dist-info/WHEEL +5 -0
- snowflake_connector_python-4.4.0.dist-info/entry_points.txt +4 -0
- snowflake_connector_python-4.4.0.dist-info/licenses/LICENSE.txt +202 -0
- snowflake_connector_python-4.4.0.dist-info/licenses/NOTICE +8 -0
- snowflake_connector_python-4.4.0.dist-info/top_level.txt +1 -0
- snowflake_connector_python.libs/msvcp140-0f885b509a685d2bbfa652fed26b5fb3.dll +0 -0
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import importlib
|
|
4
|
+
import os
|
|
5
|
+
import warnings
|
|
6
|
+
from importlib.metadata import PackageNotFoundError, distribution
|
|
7
|
+
from logging import getLogger
|
|
8
|
+
from types import ModuleType
|
|
9
|
+
from typing import Union
|
|
10
|
+
|
|
11
|
+
from packaging.requirements import Requirement
|
|
12
|
+
|
|
13
|
+
from . import errors
|
|
14
|
+
|
|
15
|
+
logger = getLogger(__name__)
|
|
16
|
+
|
|
17
|
+
"""This module helps to manage optional dependencies.
|
|
18
|
+
|
|
19
|
+
It implements MissingOptionalDependency as a base class. If a module is unavailable an instance of this will be
|
|
20
|
+
returned. These derived classes can be seen in this file pre-defined. The point of these classes is that if someone
|
|
21
|
+
tries to use pyarrow code then by importing pyarrow from this module if they did pyarrow.xxx then that would raise
|
|
22
|
+
a MissingDependencyError.
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class MissingOptionalDependency:
|
|
27
|
+
"""A class to replace missing dependencies.
|
|
28
|
+
|
|
29
|
+
The only thing this class is supposed to do is raise a MissingDependencyError when __getattr__ is called.
|
|
30
|
+
This will be triggered whenever module.member is going to be called.
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
_dep_name = "not set"
|
|
34
|
+
|
|
35
|
+
def __getattr__(self, item):
|
|
36
|
+
raise errors.MissingDependencyError(self._dep_name)
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class MissingPandas(MissingOptionalDependency):
|
|
40
|
+
"""The class is specifically for pandas optional dependency."""
|
|
41
|
+
|
|
42
|
+
_dep_name = "pandas"
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
class MissingKeyring(MissingOptionalDependency):
|
|
46
|
+
"""The class is specifically for sso optional dependency."""
|
|
47
|
+
|
|
48
|
+
_dep_name = "keyring"
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
class MissingBotocore(MissingOptionalDependency):
|
|
52
|
+
"""The class is specifically for boto optional dependency."""
|
|
53
|
+
|
|
54
|
+
_dep_name = "botocore"
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
class MissingBoto3(MissingOptionalDependency):
|
|
58
|
+
"""The class is specifically for boto3 optional dependency."""
|
|
59
|
+
|
|
60
|
+
_dep_name = "boto3"
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
class MissingAioBotocore(MissingOptionalDependency):
|
|
64
|
+
"""The class is specifically for boto optional dependency."""
|
|
65
|
+
|
|
66
|
+
_dep_name = "aiobotocore"
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
class MissingAioBoto3(MissingOptionalDependency):
|
|
70
|
+
"""The class is specifically for boto3 optional dependency."""
|
|
71
|
+
|
|
72
|
+
_dep_name = "aioboto3"
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
ModuleLikeObject = Union[ModuleType, MissingOptionalDependency]
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def warn_incompatible_dep(
|
|
79
|
+
dep_name: str, installed_ver: str, expected_ver: Requirement
|
|
80
|
+
) -> None:
|
|
81
|
+
warnings.warn(
|
|
82
|
+
"You have an incompatible version of '{}' installed ({}), please install a version that "
|
|
83
|
+
"adheres to: '{}'".format(dep_name, installed_ver, expected_ver),
|
|
84
|
+
stacklevel=2,
|
|
85
|
+
)
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def _import_or_missing_pandas_option() -> (
|
|
89
|
+
tuple[ModuleLikeObject, ModuleLikeObject, bool]
|
|
90
|
+
):
|
|
91
|
+
"""This function tries importing the following packages: pandas, pyarrow.
|
|
92
|
+
|
|
93
|
+
If available it returns pandas and pyarrow packages with a flag of whether they were imported.
|
|
94
|
+
It also warns users if they have an unsupported pyarrow version installed if possible.
|
|
95
|
+
"""
|
|
96
|
+
try:
|
|
97
|
+
pandas = importlib.import_module("pandas")
|
|
98
|
+
# since we enable relative imports without dots this import gives us an issues when ran from test directory
|
|
99
|
+
from pandas import DataFrame # NOQA
|
|
100
|
+
|
|
101
|
+
pyarrow = importlib.import_module("pyarrow")
|
|
102
|
+
|
|
103
|
+
# set default memory pool to system for pyarrow to_pandas conversion
|
|
104
|
+
if "ARROW_DEFAULT_MEMORY_POOL" not in os.environ:
|
|
105
|
+
os.environ["ARROW_DEFAULT_MEMORY_POOL"] = "system"
|
|
106
|
+
|
|
107
|
+
# Check whether we have the currently supported pyarrow installed
|
|
108
|
+
try:
|
|
109
|
+
pyarrow_dist = distribution("pyarrow")
|
|
110
|
+
snowflake_connector_dist = distribution("snowflake-connector-python")
|
|
111
|
+
|
|
112
|
+
dependencies = snowflake_connector_dist.metadata.get_all(
|
|
113
|
+
"Requires-Dist", []
|
|
114
|
+
)
|
|
115
|
+
pandas_pyarrow_extra = None
|
|
116
|
+
for dependency in dependencies:
|
|
117
|
+
dep = Requirement(dependency)
|
|
118
|
+
if (
|
|
119
|
+
dep.marker is not None
|
|
120
|
+
and dep.marker.evaluate({"extra": "pandas"})
|
|
121
|
+
and dep.name == "pyarrow"
|
|
122
|
+
):
|
|
123
|
+
pandas_pyarrow_extra = dep
|
|
124
|
+
break
|
|
125
|
+
|
|
126
|
+
installed_pyarrow_version = pyarrow_dist.version
|
|
127
|
+
if not pandas_pyarrow_extra.specifier.contains(installed_pyarrow_version):
|
|
128
|
+
warn_incompatible_dep(
|
|
129
|
+
"pyarrow", installed_pyarrow_version, pandas_pyarrow_extra
|
|
130
|
+
)
|
|
131
|
+
|
|
132
|
+
except PackageNotFoundError as e:
|
|
133
|
+
logger.info(
|
|
134
|
+
f"Cannot determine if compatible pyarrow is installed because of missing package(s): {e}"
|
|
135
|
+
)
|
|
136
|
+
return pandas, pyarrow, True
|
|
137
|
+
except ImportError:
|
|
138
|
+
return MissingPandas(), MissingPandas(), False
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
def _import_or_missing_keyring_option() -> tuple[ModuleLikeObject, bool]:
|
|
142
|
+
"""This function tries importing the following packages: keyring.
|
|
143
|
+
|
|
144
|
+
If available it returns keyring package with a flag of whether it was imported.
|
|
145
|
+
"""
|
|
146
|
+
try:
|
|
147
|
+
keyring = importlib.import_module("keyring")
|
|
148
|
+
return keyring, True
|
|
149
|
+
except ImportError:
|
|
150
|
+
return MissingKeyring(), False
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
def _import_or_missing_boto_option() -> tuple[ModuleLikeObject, ModuleLikeObject, bool]:
|
|
154
|
+
"""This function tries importing the following packages: botocore and boto3."""
|
|
155
|
+
try:
|
|
156
|
+
botocore = importlib.import_module("botocore")
|
|
157
|
+
boto3 = importlib.import_module("boto3")
|
|
158
|
+
return botocore, boto3, True
|
|
159
|
+
except ImportError:
|
|
160
|
+
return MissingBotocore(), MissingBoto3(), False
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
def _import_or_missing_aioboto_option() -> (
|
|
164
|
+
tuple[ModuleLikeObject, ModuleLikeObject, bool]
|
|
165
|
+
):
|
|
166
|
+
"""This function tries importing the following packages: botocore and boto3."""
|
|
167
|
+
try:
|
|
168
|
+
aiobotocore = importlib.import_module("aiobotocore")
|
|
169
|
+
aioboto3 = importlib.import_module("aioboto3")
|
|
170
|
+
return aiobotocore, aioboto3, True
|
|
171
|
+
except ImportError:
|
|
172
|
+
return MissingAioBotocore(), MissingAioBoto3(), False
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
# Create actual constants to be imported from this file
|
|
176
|
+
pandas, pyarrow, installed_pandas = _import_or_missing_pandas_option()
|
|
177
|
+
keyring, installed_keyring = _import_or_missing_keyring_option()
|
|
178
|
+
botocore, boto3, installed_boto = _import_or_missing_boto_option()
|
|
179
|
+
aiobotocore, aioboto3, installed_aioboto = _import_or_missing_aioboto_option()
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Module for extracting OS details from /etc/os-release on Linux systems."""
|
|
3
|
+
|
|
4
|
+
from __future__ import annotations
|
|
5
|
+
|
|
6
|
+
import logging
|
|
7
|
+
import platform
|
|
8
|
+
import re
|
|
9
|
+
|
|
10
|
+
logger = logging.getLogger(__name__)
|
|
11
|
+
|
|
12
|
+
# Allowed keys to extract from /etc/os-release
|
|
13
|
+
ALLOWED_KEYS = [
|
|
14
|
+
"NAME",
|
|
15
|
+
"PRETTY_NAME",
|
|
16
|
+
"ID",
|
|
17
|
+
"BUILD_ID",
|
|
18
|
+
"IMAGE_ID",
|
|
19
|
+
"IMAGE_VERSION",
|
|
20
|
+
"VERSION",
|
|
21
|
+
"VERSION_ID",
|
|
22
|
+
]
|
|
23
|
+
|
|
24
|
+
# Regex to parse: KEY=value or KEY="value"
|
|
25
|
+
OS_RELEASE_KEY_VALUE_REGEX = re.compile(r'^([A-Z0-9_]+)=(?:"([^"]*)"|(.*))$')
|
|
26
|
+
|
|
27
|
+
# Cache the OS details so we only read the file once
|
|
28
|
+
_cached_os_details: dict[str, str] | None = None
|
|
29
|
+
_cache_initialized = False
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def extract_linux_os_release() -> dict[str, str]:
|
|
33
|
+
"""
|
|
34
|
+
Extract OS details from /etc/os-release file.
|
|
35
|
+
|
|
36
|
+
Returns:
|
|
37
|
+
Dictionary containing OS details with keys from ALLOWED_KEYS.
|
|
38
|
+
|
|
39
|
+
Raises:
|
|
40
|
+
FileNotFoundError: If /etc/os-release does not exist.
|
|
41
|
+
IOError: If there's an error reading the file.
|
|
42
|
+
"""
|
|
43
|
+
result: dict[str, str] = {}
|
|
44
|
+
|
|
45
|
+
with open("/etc/os-release", encoding="utf-8") as f:
|
|
46
|
+
contents = f.read()
|
|
47
|
+
|
|
48
|
+
for line in contents.split("\n"):
|
|
49
|
+
match = OS_RELEASE_KEY_VALUE_REGEX.match(line)
|
|
50
|
+
if match:
|
|
51
|
+
key, quoted_value, unquoted_value = match.groups()
|
|
52
|
+
if key in ALLOWED_KEYS:
|
|
53
|
+
result[key] = (
|
|
54
|
+
quoted_value if quoted_value is not None else unquoted_value
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
return result
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def get_os_details() -> dict[str, str] | None:
|
|
61
|
+
"""
|
|
62
|
+
Get OS details from /etc/os-release (Linux only).
|
|
63
|
+
|
|
64
|
+
This function caches the result on first call. Returns None on non-Linux
|
|
65
|
+
platforms or if there's an error reading the file.
|
|
66
|
+
|
|
67
|
+
Returns:
|
|
68
|
+
Dictionary containing OS details, or None if unavailable or on error.
|
|
69
|
+
"""
|
|
70
|
+
global _cached_os_details, _cache_initialized
|
|
71
|
+
|
|
72
|
+
if _cache_initialized:
|
|
73
|
+
return _cached_os_details
|
|
74
|
+
|
|
75
|
+
_cache_initialized = True
|
|
76
|
+
|
|
77
|
+
# Only attempt to read os-release on Linux
|
|
78
|
+
if platform.system() != "Linux":
|
|
79
|
+
_cached_os_details = None
|
|
80
|
+
return None
|
|
81
|
+
|
|
82
|
+
try:
|
|
83
|
+
_cached_os_details = extract_linux_os_release()
|
|
84
|
+
return _cached_os_details
|
|
85
|
+
except Exception as e:
|
|
86
|
+
logger.debug("Error extracting OS details: %s", e)
|
|
87
|
+
_cached_os_details = None
|
|
88
|
+
return None
|