SNOW-2912540: add IS_V5_DRIVER constant; use it for SecretDetector/TelemetryData/TelemetryClient/ReauthenticationRequest imports and pandas/pyarrow/numpy resolution - #4313
Merged
sfc-gh-yuwang merged 44 commits intoSep 9, 2026
Conversation
sfc-gh-fpawlowski
requested review from
sfc-gh-aling,
sfc-gh-bkogan and
sfc-gh-jzeng
and removed request for
a team
August 12, 2026 16:10
This was referenced Aug 13, 2026
Collaborator
Author
sfc-gh-fpawlowski
marked this pull request as draft
August 14, 2026 17:29
3 tasks
sfc-gh-fpawlowski
changed the base branch from
SNOW-2912540-is-v5-driver-constant
to
SNOW-2912540-decouple-oob-telemetry
August 17, 2026 18:33
sfc-gh-fpawlowski
marked this pull request as ready for review
August 17, 2026 18:34
Codecov Report❌ Patch coverage is Additional details and impacted files@@ Coverage Diff @@
## graphite-base/4282 #4313 +/- ##
=====================================================
Coverage ? 82.64%
=====================================================
Files ? 172
Lines ? 44811
Branches ? 7692
=====================================================
Hits ? 37036
Misses ? 5812
Partials ? 1963 ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
sfc-gh-fpawlowski
force-pushed
the
SNOW-2912540-secret-detector-import
branch
from
August 20, 2026 16:28
69382c5 to
07f8f83
Compare
This was referenced Aug 20, 2026
sfc-gh-fpawlowski
force-pushed
the
SNOW-2912540-secret-detector-import
branch
from
August 20, 2026 17:13
07f8f83 to
cd9364b
Compare
sfc-gh-fpawlowski
changed the base branch from
SNOW-2912540-decouple-oob-telemetry
to
graphite-base/4313
August 21, 2026 08:30
…ield imports on IS_V5_DRIVER network.py doesn't exist in UD at all -- legacy's errors.py/network.py split is consolidated into errors.py. UD PR #1224 (open, stacked on #1133) adds ReauthenticationRequest(ProgrammingError) to errors.py and removes network.py outright, naming Snowpark's import site explicitly as the target. Gate the import in server_connection.py and its unit test mock, same pattern as every other IS_V5_DRIVER import in this stack. TelemetryClient/TelemetryField were imported unconditionally from the top-level snowflake.connector.telemetry module, which is a stub on v5 (the real implementation lives in _common.telemetry per UD PR #1106's current branch). Also fixes this same file's PCTelemetryData import, added in an earlier commit against _internal.telemetry -- that class moved to _common too on the same #1106 branch since that commit landed, so it was already stale for the identical reason. Adds test coverage for _missing_pandas() (added earlier in this stack to replace direct MissingPandas() construction), which had zero coverage after test__pandas_importer() was deleted alongside _pandas_importer() itself.
… import from snowflake.connector.options import installed_pandas is unconditional in tests/integ/test_function.py, test_cte.py, scala/test_datatype_suite.py, and scala/test_update_delete_merge_suite.py -- ModuleNotFoundError once UD deletes options.py outright (confirmed: f61156c7a, ancestor of SNOW-2912540-extras-to-common's current tip, already relied on elsewhere in this stack). Swap to snowflake.snowpark._internal.utils, which already re-exports installed_pandas correctly gated on IS_V5_DRIVER internally (from this PR's earlier _pandas_importer()-removal commit) -- no IS_V5_DRIVER awareness needed in these test files themselves.
…s.py _internal/utils.py's IS_V5_DRIVER-gated block (MissingOptionalDependency, ModuleLikeObject, pandas, pyarrow, installed_pandas, installed_pyarrow, _missing_pandas()) was a self-contained concern mirroring the connector's own options.py/_common.extras 1:1, buried in an already-large kitchen-sink file. Moved to a dedicated module, mirroring mock/_options.py's existing role as the scoped equivalent for the local-testing side. options.py computes its own IS_V5_DRIVER independently rather than importing it from utils.py, since utils.py itself needs names back from options.py (MissingOptionalDependency/ModuleLikeObject/installed_pandas, used by its modin-optional-dependency code) -- importing in both directions would be circular. One-line duplication, avoids import-order fragility entirely. Updated all 17 consumers (found types.py's multi-line import via a regex-based sweep after a naive single-line grep missed it) to import these names from _internal.options instead. mock/_options.py and event_table_telemetry.py keep their other _internal.utils imports (IS_V5_DRIVER, parse_table_name) unchanged.
…ield Reuse the canonical IS_V5_DRIVER from _internal.options instead of redefining it in utils, and gate the leftover Modin connector.telemetry import on the same flag as Snowpark telemetry. Co-authored-by: Filip Pawłowski <sfc-gh-fpawlowski@users.noreply.github.com>
cursor
Bot
force-pushed
the
SNOW-2912540-secret-detector-import
branch
from
September 2, 2026 06:45
5f3a1eb to
64d0102
Compare
sfc-gh-yuwang
approved these changes
Sep 2, 2026
flake8 reports unused IS_V5_DRIVER on the `from` line, so a noqa on the name itself never applied and Check linting failed from this PR upstack. Co-authored-by: Filip Pawłowski <sfc-gh-fpawlowski@users.noreply.github.com>
Moving noqa to the from-import line was not enough for Check linting on this PR. Bind the options module constant to a local name instead of an unused import. Co-authored-by: Filip Pawłowski <sfc-gh-fpawlowski@users.noreply.github.com>
pre-commit insert-license failed Check linting from this PR through #4313. Co-authored-by: Filip Pawłowski <sfc-gh-fpawlowski@users.noreply.github.com>
…secret-detector-import Co-authored-by: Filip Pawłowski <sfc-gh-fpawlowski@users.noreply.github.com>
…move-connector-shims Co-authored-by: Filip Pawłowski <sfc-gh-fpawlowski@users.noreply.github.com>
…inline-pandas-staging-helpers Co-authored-by: Filip Pawłowski <sfc-gh-fpawlowski@users.noreply.github.com>
…912540-decouple-oob-telemetry Co-authored-by: Filip Pawłowski <sfc-gh-fpawlowski@users.noreply.github.com>
…secret-detector-import Co-authored-by: Filip Pawłowski <sfc-gh-fpawlowski@users.noreply.github.com>
…move-connector-shims Co-authored-by: Filip Pawłowski <sfc-gh-fpawlowski@users.noreply.github.com>
…inline-pandas-staging-helpers Co-authored-by: Filip Pawłowski <sfc-gh-fpawlowski@users.noreply.github.com>
…912540-decouple-oob-telemetry Co-authored-by: Filip Pawłowski <sfc-gh-fpawlowski@users.noreply.github.com>
…secret-detector-import Co-authored-by: Filip Pawłowski <sfc-gh-fpawlowski@users.noreply.github.com>
…move-connector-shims
…inline-pandas-staging-helpers
…912540-decouple-oob-telemetry
…secret-detector-import
Base automatically changed from
SNOW-2912540-decouple-oob-telemetry
to
graphite-base/4282
September 9, 2026 16:51
sfc-gh-yuwang
added this pull request to stack #4349
September 9, 2026 16:52
Resolve import conflicts by keeping this PR's changes: - analyzer_utils.py: import pyarrow from snowflake.snowpark._internal.options - mock/_telemetry.py: drop connector secret_detector/telemetry_oob imports (local ._secret_detector.SecretDetector is used; TelemetryService unused)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.

Summary
IS_V5_DRIVER: bool = connector_version[0] >= 5to_internal/utils.py— a single canonical place for code that needs to branch on connector generation (legacy v3/v4 vs Universal Driver v5+). Originally opened as its own PR (SNOW-2912540: add IS_V5_DRIVER constant for version-conditioned connector imports #4310); folded in here since every other change in this PR is gated on it.snowflake.connector.secret_detectordoes not exist in v5 (UD) —SecretDetectorlives atsnowflake.connector._common.secret_detector. Fixed with anIS_V5_DRIVER-gated conditional import inmock/_telemetry.py.snowflake.connector.optionsalready providesMissingOptionalDependency,ModuleLikeObject, andpyarrowon both driver generations — no gap to fill. Re-import these from the connector, gated onIS_V5_DRIVER, instead of redefining them locally in_internal/utils.py.installed_pyarrowis now imported directly on v5 (UD PR [Local Testing] SNOW-904981 Support Column bitwise operations and unary minus expression #1151 fixed it to checkpyarrowindependently instead of mirroringinstalled_pandas) but still derived locally viaisinstanceon v4 (not exported there at all).MissingPandasis imported only on v4 (UD PR [Local Testing] SNOW-904981 Support Column bitwise operations and unary minus expression #1151 deleted it outright on v5 — no replacement, perBehaviorDifferences.yamlFix drop columns of dataframe join #66); a_missing_pandas()helper builds the sentinel with whichever construction style each driver generation supports, so callers don't need their ownIS_V5_DRIVERbranch._internal/utils.py's pre-existing_pandas_importer()(a second, independent pandas-resolution attempt that predates this whole effort) in favor of sourcingpandas/installed_pandasfrom the sameIS_V5_DRIVER-gated import as the rest of these names. Dedupsmock/_options.py's numpy handling againstconnector._common.extras.numpyon v5 (confirmed pure duplicate; v4 keeps its ownMissingNumpysince v4'soptions.pyhas no numpy handling to delegate to). Originally opened as a separate PR (SNOW-2912540: remove _pandas_importer(), dedup mock/_options.py numpy handling #4317); folded in here since the diff was small._internal/telemetry.py'sTelemetryClient/TelemetryFieldimport was completely unconditional, pointing at the top-levelsnowflake.connector.telemetrymodule — a real implementation on v4, but a"""BACKWARD COMPATIBILITY MODULE ONLY"""stub on v5. Gated onIS_V5_DRIVER: v5 now imports from_common.telemetry, matching UD PR SNOW-946900: Add internal parameter in stored proc registration to allow forcing inline code #1106's current branch (verified directly —_internal/telemetry.pyno longer exists there at all, fully moved). This same commit also corrects this file'sTelemetryDataimport, which an earlier commit here pointed at_internal.telemetry— that class moved to_commontoo on the same SNOW-946900: Add internal parameter in stored proc registration to allow forcing inline code #1106 branch since that earlier fix landed, so it was already stale for the identical reason.server_connection.pyimportedReauthenticationRequestunconditionally fromsnowflake.connector.network— that module doesn't exist in UD at all (legacy'serrors.py/network.pysplit is consolidated intoerrors.py). UD PR SNOW-1023214: Support date_part argument in last_day #1224 (open, stacked on SNOW-964034 Enable skipped multistmt tests for stored proc #1133) addsReauthenticationRequest(ProgrammingError)toerrors.pyand removesnetwork.pyoutright, naming Snowpark's import site explicitly as the target. Gated the import (and its unit test mock intest_server_connection.py, which had the same unconditional-import bug) onIS_V5_DRIVER._missing_pandas()(had zero coverage aftertest__pandas_importer()was deleted alongside_pandas_importer()itself).tests/integ/test_function.py,tests/integ/test_cte.py,tests/integ/scala/test_datatype_suite.py,tests/integ/scala/test_update_delete_merge_suite.py) that unconditionally importedinstalled_pandasfromsnowflake.connector.options— that module is deleted outright in UD PR [Local Testing] SNOW-904981 Support Column bitwise operations and unary minus expression #1151 (confirmed:f61156c7ais an ancestor ofSNOW-2912540-extras-to-common's current tip).IS_V5_DRIVER-gated options/pandas/pyarrow block out of_internal/utils.pyinto a new, dedicated_internal/options.py— mirrors the connector's ownoptions.py/_common.extras1:1, and mirrorsmock/_options.py's existing role as the scoped equivalent for local testing. Updated all 17 consumers (includingtypes.py, whose multi-line import a naive single-line grep initially missed — caught by a regex-based sweep afterward).options.pycomputes its ownIS_V5_DRIVERrather than importing it fromutils.py, sinceutils.pyitself needs names back fromoptions.py(its modin-optional-dependency code) — importing in both directions would be circular.Still open: UD PRs #1151, #1152, #1106, #1133, and #1224 are unmerged. This PR's
IS_V5_DRIVER=Truepaths are written against their current source but unverifiable end-to-end until they merge.Test plan
LocalTestOOBTelemetryService.export_queue_to_string()still callsSecretDetector.mask_secretscorrectly with both v4 and v5 connectorsgrep -rn "_pandas_importer" src/ tests/→ nothing;grep -rn "MissingNumpy" src/→ only inmock/_options.py's v4 branch;grep -rn "connector\.network\b" src/ tests/unit/→ only the v4 branch of the gated imports;grep -rn "connector\.options" tests/integ/→ nothing left; zero remaining imports of the moved names from_internal.utils(regex-based multi-line sweep, not just single-line grep)black/flake8clean on all 20 touched filesIS_V5_DRIVER=Truepaths againstconnector._common.extras/_common.telemetry/errors.ReauthenticationRequestonce UD PR [Local Testing] SNOW-904981 Support Column bitwise operations and unary minus expression #1151/ [Local Testing] SNOW-850263 Support Dataframe case insensitive collect #1152/SNOW-946900: Add internal parameter in stored proc registration to allow forcing inline code #1106/SNOW-964034 Enable skipped multistmt tests for stored proc #1133/SNOW-1023214: Support date_part argument in last_day #1224 mergeChecklist
Stack (via Graphite)
🤖 Generated with Claude Code