René's URL Explorer Experiment


Title: SK-2954: common/v2/flowvault split + flowvault insert support by saileshwar-skyflow · Pull Request #269 · skyflowapi/skyflow-python · GitHub

Open Graph Title: SK-2954: common/v2/flowvault split + flowvault insert support by saileshwar-skyflow · Pull Request #269 · skyflowapi/skyflow-python

X Title: SK-2954: common/v2/flowvault split + flowvault insert support by saileshwar-skyflow · Pull Request #269 · skyflowapi/skyflow-python

Description: Why Splits skyflow-python from a single-variant SDK into three build variants sharing a bundled common/ module: common/ — shared credential resolution, vault-URL resolution, bearer-token fetch/cache/expiry, validation, logging, and client-composition logic. Never published independently; bundled into each variant's wheel at build time. v2/ — today's SDK, relocated from the repo root. Public API unchanged — same class names, signatures, import paths. flowvault/ (renamed from v3/) — new, built on the flowservice/flowdb API. Insert-only this round by design; every other operation is deliberately out of scope until a follow-up round (tracked in SK-2972). Publishes as skyflow-flowvault, importable as skyflow_flowvault, starting at 1.0.0. common/ — interfaces and shared logic ISkyflow/IVaultController/IVaultClient: pure interfaces (ABC + @abstractmethod, no implementation) declaring the contract each variant must satisfy. BaseSkyflow/BaseVaultController/BaseVaultClient implement them with the logic shared by every variant — protected helpers like _validate_table_name_if_present/_validate_field_values live on the base, per-variant behavior (insert/get/... , resolve_vault_url/initialize_api_client) stays abstract for concrete subclasses to fill in. make_skyflow_class(...): a factory function that builds each variant's concrete Skyflow class from injected collaborators (VaultClient, VaultController, its messages catalog, validators). Each variant's own client/skyflow.py is now a handful of lines calling this factory with its own classes — no variant-specific wiring logic lives in common, and common never imports v2 or flowvault. Unified validation/logging: validate_vault_config, validate_update_vault_config, validate_log_level, validate_credentials, LogLevel, Logger were confirmed field-for-field identical between v2 and flowvault and are now single implementations in common, using a messages= dependency-injection parameter so each variant's own error text/SDK version still renders correctly (common has no SDK version of its own). BaseInsertRequest/BaseInsertResponse: shared base types for insert's request/response shape. table/values are required (no silent default) on the base; upsert's concrete type is left generic on the base (Union[str, dict]) since it's a plain string for v2 and a dict for flowvault — each variant's own InsertRequest/InsertResponse subclass declares its exact type. BaseSkyflow and the interface classes guard against direct instantiation via a SkyflowError (not a bare NotImplementedError), matching how every other SDK error is raised. v2/ Structural relocation, zero behavior change to the public contract — same class names, signatures, import paths. Vault remains a backward-compatible alias for the internal VaultController name. InsertRequest now extends BaseInsertRequest; every controller method (insert, get, update, delete, query, detokenize, tokenize, upload_file) has full request/response type hints. Fixed a real bug surfaced during this work: v2's own Env enum was failing cross-class comparisons against common's Env because they were two structurally-identical-but-distinct enum classes — v2's is now a re-export of common's. flowvault/ — insert support Request shape: InsertRequest(values, table=None, upsert=None) — values is a plain list of dicts (each shaped {"values": {...}, "table": ..., "upsert": ...}), matching PDB's own naming/shape convention rather than a custom InsertRecord class. upsert (at either the request or per-record level) is a plain dict, typed via a TypedDict (Upsert) rather than a class — type(upsert) is exactly dict at runtime, matching how records are handled. InsertResponse shape was iterated against a real vault until it matched PDB's own shape exactly: no redundant data/table keys, tokens flattened directly onto each result dict (no nested tokens key), errors=None (not []) when there are none, each entry tagged with request_index (stable position in the original values list). Validation ported from Java's v3 Validations.java: table/upsert must live in exactly one place (request-level applying to every record, or per-record — never mixed, never both, confirmed against a real vault's 400 response), 10,000-record cap, and (post-review) empty/null field values are explicitly allowed — only empty/null keys are rejected. Error handling: parses the backend's structured per-record error body into individual entries, propagating x-request-id onto each. All records for a request go out in a single API call (no batching this round). Fixed a real, live-vault-confirmed bug: SDK_VERSION was hardcoded/stale (0.1.0) instead of matching setup.py's real version (1.0.0). Skyflow/VaultController/VaultClient are built via make_skyflow_class/extend common's base classes — no flowvault-specific wiring logic beyond supplying its own collaborators. CI/CD Every workflow (main, ci, beta-release, internal-release, release, and the two shared reusable workflows) now correctly targets flowvault/ (the workflows were still pointing at the pre-rename v3/ directory, which meant every flowvault CI job failed outright — ci-scripts/bump_version.sh and the shared workflows now also take a package-name input, since they'd hardcoded the skyflow package name too and would've silently bumped/measured the wrong files for flowvault). test-common now actually runs coverage and uploads to Codecov, matching v2/flowvault's own pattern — it previously ran unittest discover with no coverage tracking at all, making common/'s substantial growth this round invisible to Codecov's patch/project checks. Fixed .semgreprules/customRule.yml's check-sensitive-info regex: an optional quote-capture group let its own backreference match an empty string, so the rule fired on any keyword: value regardless of quoting — flagging things like token=OPTIONAL_TOKEN or CredentialField.TOKEN as "sensitive info". Tightened to require an actual quoted literal and exclude self-referential values (TOKEN = 'token'), eliminating 28 false positives with no inline suppressions. Also excludes **/generated/** (Fern-owned code) from semgrep, and fixed a real finding — a ${{ }} GitHub Actions context value was interpolated directly into a run: shell block instead of being routed through env: first. Testing common/tests, v2/tests, flowvault/tests, tests/contract/ all pass locally with no regressions from this round's changes. Manually verified end-to-end against a real flowdb/flowvault vault multiple times through this round (SSL, auth, vault-URL resolution, exact response/error shapes all confirmed live, not just mocked). Known follow-ups (intentionally out of scope here) flowvault's get/update/delete/query/detokenize are stubs (NotImplementedError) — tracked in SK-2972, one operation at a time, same pattern as this round's insert. CI: JFrog Artifactory publish target is reused as-is for both variants; worth a careful look before the first real flowvault- tag/branch push since some of the release automation couldn't be dry-run outside GitHub's own infrastructure.

Open Graph Description: Why Splits skyflow-python from a single-variant SDK into three build variants sharing a bundled common/ module: common/ — shared credential resolution, vault-URL resolution, bearer-token fetch/cac...

X Description: Why Splits skyflow-python from a single-variant SDK into three build variants sharing a bundled common/ module: common/ — shared credential resolution, vault-URL resolution, bearer-token fetch/cac...

Opengraph URL: https://github.com/skyflowapi/skyflow-python/pull/269

X: @github

direct link

Domain: github.com

react-profiling0
react-import-mapreact,react-dom,react-dom/client,react-dom/profiling,react-is,react-reconciler,react/compiler-runtime,react/jsx-dev-runtime,react/jsx-runtime,scheduler@d5750093facf
route-pattern/:user_id/:repository/pull/:id/files(.:format)
route-controllerpull_requests
route-actionfiles
fetch-noncev2:f90c03ad-a428-f3ea-c7fa-4cc4075fd85b
current-catalog-service-hashae870bc5e265a340912cde392f23dad3671a0a881730ffdadd82f2f57d81641b
request-idAAD0:1D550E:72E17B:96E6CA:6AF83AA2
html-safe-nonce792d2a1385347b8496d9de304c851a6e92a6eea6872fd35daf8dbdd824e16dcb
visitor-payloadeyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJBQUQwOjFENTUwRTo3MkUxN0I6OTZFNkNBOjZBRjgzQUEyIiwidmlzaXRvcl9pZCI6IjgwNTIwODI4OTU5NDc4NDAxNjIiLCJyZWdpb25fZWRnZSI6ImlhZCIsInJlZ2lvbl9yZW5kZXIiOiJpYWQifQ==
visitor-hmac6466db960eb3377e889c1a37ffe14b982c6dfb22bdf73e91513eb167cc2929b9
hovercard-subject-tagpull_request:4005999147
github-keyboard-shortcutsrepository,pull-request-list,pull-request-conversation,pull-request-files-changed,copilot
google-site-verificationApib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I
octolytics-urlhttps://collector.github.com/github/collect
analytics-location///pull_requests/show/files
fb:app_id1401488693436528
apple-itunes-appapp-id=1477376905, app-argument=https://github.com/skyflowapi/skyflow-python/pull/269/files
twitter:imagehttps://avatars.githubusercontent.com/u/156889717?s=400&v=4
twitter:cardsummary_large_image
og:imagehttps://avatars.githubusercontent.com/u/156889717?s=400&v=4
og:image:altWhy Splits skyflow-python from a single-variant SDK into three build variants sharing a bundled common/ module: common/ — shared credential resolution, vault-URL resolution, bearer-token fetch/cac...
og:site_nameGitHub
og:typeobject
hostnamegithub.com
expected-hostnamegithub.com
None5713ecd83001b2f55c3509fb7a292bf7d66d0f167c7ae87a9f7eaec5a52bf8db
turbo-cache-controlno-preview
diff-viewunified
go-importgithub.com/skyflowapi/skyflow-python git https://github.com/skyflowapi/skyflow-python.git
octolytics-dimension-user_id72233674
octolytics-dimension-user_loginskyflowapi
octolytics-dimension-repository_id416989700
octolytics-dimension-repository_nwoskyflowapi/skyflow-python
octolytics-dimension-repository_publictrue
octolytics-dimension-repository_is_forkfalse
octolytics-dimension-repository_network_root_id416989700
octolytics-dimension-repository_network_root_nwoskyflowapi/skyflow-python
turbo-body-classeslogged-out env-production page-responsive full-width
disable-turbotrue
browser-stats-urlhttps://api.github.com/_private/browser/stats
browser-errors-urlhttps://api.github.com/_private/browser/errors
release653be32ff5c755082a4db662491bfbbcfc9112c1
ui-targetfull
theme-color#1e2327
color-schemelight dark

Links:

Skip to contenthttps://github.com/skyflowapi/skyflow-python/pull/269/files#start-of-content
https://github.com/
Sign inhttps://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fskyflowapi%2Fskyflow-python%2Fpull%2F269%2Ffiles
GitHubRepository hosting, code review, and collaborationhttps://github.com/platform
CopilotAI coding agent for tasks, projects, and automated workhttps://github.com/features/copilot
ActionsCI/CD and automationhttps://github.com/features/actions
Code QualityQuality analysis, fixes, and enforcementhttps://github.com/features/code-quality
CodespacesCloud development environmentshttps://github.com/features/codespaces
Code SecurityVulnerability detection and remediationhttps://github.com/security/advanced-security/code-security
Secret ProtectionSecret scanning and leak preventionhttps://github.com/security/advanced-security/secret-protection
All Featureshttps://github.com/features
Documentationhttps://docs.github.com/en
Traininghttps://learn.github.com/skills
Certificationshttps://learn.github.com/credentials
Build with Copilothttps://github.com/features/ai
Customize Copilothttps://docs.github.com/en/copilot/how-tos/copilot-on-github/customize-copilot/customize-copilot-overview
Integrationshttps://github.com/marketplace
Trending reposhttps://github.com/trending
GitHub Sponsorshttps://github.com/open-source/sponsors
Developer articleshttps://github.com/resources/articles
ChangelogYour source for the latest features, improvements, and fixes across GitHub products, all in one place.https://github.blog/changelog/
Enterpriseshttps://github.com/enterprise
Teamhttps://github.com/team
Startupshttps://github.com/enterprise/startups
Nonprofitshttps://github.com/solutions/industry/nonprofits
Healthcarehttps://github.com/solutions/industry/healthcare
Financial serviceshttps://github.com/solutions/industry/financial-services
Manufacturinghttps://github.com/solutions/industry/manufacturing
Governmenthttps://github.com/solutions/industry/government
See all industrieshttps://github.com/solutions/industry
Why GitHubhttps://github.com/why-github
Customer Storieshttps://github.com/customer-stories
Business insightshttps://github.com/solutions/executive-insights
Trust Centerhttps://github.com/trust-center
GitHub Advanced SecurityEnterprise-grade code securityhttps://github.com/security/advanced-security
Copilot for businessEnterprise-grade AI featureshttps://github.com/features/copilot/copilot-business
Premium SupportEnterprise-grade 24/7 supporthttps://github.com/enterprise/premium-support
Documentationhttps://docs.github.com/en
Resource centerhttps://github.com/resources
Bloghttps://github.blog/
Events & webinarshttps://github.com/resources/events
Community Forumhttps://github.com/orgs/community/discussions
Customer Storieshttps://github.com/customer-stories
Integrationshttps://github.com/marketplace
Customer supporthttps://help.github.com/
Traininghttps://learn.github.com/skills
GitHub Statushttps://www.githubstatus.com/
Abouthttps://github.com/about
Partnershttps://github.com/partners
Changeloghttps://github.blog/changelog/
GitHub UniverseThe event for developers, by developers — talks, workshops, and what’s next for GitHub.https://githubuniverse.com/
Pricinghttps://github.com/pricing
Sign inhttps://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fskyflowapi%2Fskyflow-python%2Fpull%2F269%2Ffiles
Sign uphttps://github.com/signup?ref_cta=Sign+up&ref_loc=header+logged+out&ref_page=%2F%3Cuser-name%3E%2F%3Crepo-name%3E%2Fpull_requests%2Fshow%2Ffiles&source=header-repo&source_repo=skyflowapi%2Fskyflow-python
Reloadhttps://github.com/skyflowapi/skyflow-python/pull/269/files
Reloadhttps://github.com/skyflowapi/skyflow-python/pull/269/files
Reloadhttps://github.com/skyflowapi/skyflow-python/pull/269/files
skyflowapihttps://github.com/skyflowapi
skyflow-pythonhttps://github.com/skyflowapi/skyflow-python
Codehttps://github.com/skyflowapi/skyflow-python
Issues1 (1)https://github.com/skyflowapi/skyflow-python/issues
Pull requests9 (9)https://github.com/skyflowapi/skyflow-python/pulls
Actionshttps://github.com/skyflowapi/skyflow-python/actions
Projectshttps://github.com/skyflowapi/skyflow-python/projects
Security and qualityhttps://github.com/skyflowapi/skyflow-python/security
Insightshttps://github.com/skyflowapi/skyflow-python/pulse
Sign up for GitHub https://github.com/signup?return_to=%2Fskyflowapi%2Fskyflow-python%2Fissues%2Fnew%2Fchoose
terms of servicehttps://docs.github.com/terms
privacy statementhttps://docs.github.com/privacy
Sign inhttps://github.com/login?return_to=%2Fskyflowapi%2Fskyflow-python%2Fissues%2Fnew%2Fchoose
saileshwar-skyflowhttps://github.com/saileshwar-skyflow
mainhttps://github.com/skyflowapi/skyflow-python/tree/main
saileshwar/SK-2954-flowdb-vaut-apis-supporthttps://github.com/skyflowapi/skyflow-python/tree/saileshwar/SK-2954-flowdb-vaut-apis-support
Conversation 15 https://github.com/skyflowapi/skyflow-python/pull/269
Commits 12 https://github.com/skyflowapi/skyflow-python/pull/269/commits
Checks 0 https://github.com/skyflowapi/skyflow-python/pull/269/checks
Files changed https://github.com/skyflowapi/skyflow-python/pull/269/files
Please reload this pagehttps://github.com/skyflowapi/skyflow-python/pull/269/files
SK-2954: common/v2/flowvault split + flowvault insert support https://github.com/skyflowapi/skyflow-python/pull/269/files#top
Show all changes 12 commits https://github.com/skyflowapi/skyflow-python/pull/269/files
cadf5d4 SK-2954: Split skyflow-python into common/v2/v3 build variants, add f… saileshwar-skyflow Jul 7, 2026 https://github.com/skyflowapi/skyflow-python/pull/269/commits/cadf5d40a0661f0e83cdcbd83c2b937448d53aae
b6757b0 Rename v3 SDK to flowvault, import package to skyflow_flowvault saileshwar-skyflow Jul 7, 2026 https://github.com/skyflowapi/skyflow-python/pull/269/commits/b6757b04212ff46f722bb1b28130d81c5c7f980c
f2bbf42 SK-2954: Unify shared insert/validation/logging logic into common, ad… saileshwar-skyflow Jul 8, 2026 https://github.com/skyflowapi/skyflow-python/pull/269/commits/f2bbf42c41eb3a33c3823cc8db32248eeddd3ee5
b861313 SK-2954: Add ISkyflow/IVaultController/IVaultClient interfaces, type … saileshwar-skyflow Jul 9, 2026 https://github.com/skyflowapi/skyflow-python/pull/269/commits/b8613132d6105533cf8e1bcf7deceb8e60182d07
9814a48 SK-2954: Rename insert records->values, drop Upsert class for a dict … saileshwar-skyflow Jul 9, 2026 https://github.com/skyflowapi/skyflow-python/pull/269/commits/9814a48150205a663d479a1a35f099d6f395e8aa
16de967 SK-2954: Guard BaseSkyflow against direct instantiation saileshwar-skyflow Jul 10, 2026 https://github.com/skyflowapi/skyflow-python/pull/269/commits/16de967b62834df781e66b18dc44b862bc6bda11
a25ed62 SK-2954: Fix CI workflows still targeting v3, allow empty insert values saileshwar-skyflow Jul 10, 2026 https://github.com/skyflowapi/skyflow-python/pull/269/commits/a25ed6210b743eaec6c29a79d2c8d0cae4bb13f3
f2611f6 SK-2954: Fix flowvault CI coverage install and semgrep generated-code… saileshwar-skyflow Jul 10, 2026 https://github.com/skyflowapi/skyflow-python/pull/269/commits/f2611f64739f18d1016455c8b3c3dea7924f0ffb
7f0d248 SK-2954: Add coverage to test-common, fix semgrep sensitive-info fals… saileshwar-skyflow Jul 10, 2026 https://github.com/skyflowapi/skyflow-python/pull/269/commits/7f0d248bb0abc2480903f71deeac22c492eafa95
feb79cc SK-2954: Remove explanatory comments from a few files saileshwar-skyflow Jul 13, 2026 https://github.com/skyflowapi/skyflow-python/pull/269/commits/feb79ccbbdbb6b70024d827b28b7c87d82cc8714
29623f0 SK-2954: Split ISkyflow into BaseSkyflow/BaseSkyflowImpl, make connec… saileshwar-skyflow Jul 13, 2026 https://github.com/skyflowapi/skyflow-python/pull/269/commits/29623f0a8e14837fa206096725560652caa4a743
43346ee SK-2972: Implement get, update, delete, detokenize, tokenize for flow… saileshwar-skyflow Sep 1, 2026 https://github.com/skyflowapi/skyflow-python/pull/269/commits/43346eeb6becc72de019d76469584799a2bf4f46
Clear filters https://github.com/skyflowapi/skyflow-python/pull/269/files
Please reload this pagehttps://github.com/skyflowapi/skyflow-python/pull/269/files
Please reload this pagehttps://github.com/skyflowapi/skyflow-python/pull/269/files
.codespellrchttps://github.com/skyflowapi/skyflow-python/pull/269/files#diff-5df60be1ec15d5da885121f5941ad7ceb4a31d7edeaf038873247cd1b9eb0193
View file https://github.com/skyflowapi/skyflow-python/blob/43346eeb6becc72de019d76469584799a2bf4f46/.codespellrc
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/skyflowapi/skyflow-python/pull/269/{{ revealButtonHref }}
https://github.com/skyflowapi/skyflow-python/pull/269/files#diff-5df60be1ec15d5da885121f5941ad7ceb4a31d7edeaf038873247cd1b9eb0193
https://github.com/skyflowapi/skyflow-python/pull/269/files#diff-5df60be1ec15d5da885121f5941ad7ceb4a31d7edeaf038873247cd1b9eb0193
.github/workflows/beta-release.ymlhttps://github.com/skyflowapi/skyflow-python/pull/269/files#diff-18c71efd7026f4953ff7ac4065357d2ea0e5e4c887cb831f706c42ea2eaa8cb2
View file https://github.com/skyflowapi/skyflow-python/blob/57a3e3ad4fe45cbc8752bc1e186c890c4fe8e44b/.github/workflows/beta-release.yml
Open in desktop https://desktop.github.com
Please reload this pagehttps://github.com/skyflowapi/skyflow-python/pull/269/files
.github/workflows/internal-release.ymlhttps://github.com/skyflowapi/skyflow-python/pull/269/files#diff-e9f2a066722a45830909f1a8979f8be0bd63eab09a1b44def62d05d14b146d1b
View file https://github.com/skyflowapi/skyflow-python/blob/43346eeb6becc72de019d76469584799a2bf4f46/.github/workflows/internal-release.yml
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/skyflowapi/skyflow-python/pull/269/{{ revealButtonHref }}
.github/workflows/pr-flowvault.ymlhttps://github.com/skyflowapi/skyflow-python/pull/269/files#diff-9c9c1143657dc0d7dd0d02e57e58152bc3ed1534756c56ed4b5705d19978a987
View file https://github.com/skyflowapi/skyflow-python/blob/43346eeb6becc72de019d76469584799a2bf4f46/.github/workflows/pr-flowvault.yml
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/skyflowapi/skyflow-python/pull/269/{{ revealButtonHref }}
.github/workflows/ci.yml → .github/workflows/pr.ymlhttps://github.com/skyflowapi/skyflow-python/pull/269/files#diff-15c806aa509538190832852f439e9921a23bec2da81f95ed0e4bf13c14e5b160
View file https://github.com/skyflowapi/skyflow-python/blob/43346eeb6becc72de019d76469584799a2bf4f46/.github/workflows/pr.yml
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/skyflowapi/skyflow-python/pull/269/{{ revealButtonHref }}
https://github.com/skyflowapi/skyflow-python/pull/269/files#diff-15c806aa509538190832852f439e9921a23bec2da81f95ed0e4bf13c14e5b160
.github/workflows/release.ymlhttps://github.com/skyflowapi/skyflow-python/pull/269/files#diff-87db21a973eed4fef5f32b267aa60fcee5cbdf03c67fafdc2a9b553bb0b15f34
View file https://github.com/skyflowapi/skyflow-python/blob/43346eeb6becc72de019d76469584799a2bf4f46/.github/workflows/release.yml
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/skyflowapi/skyflow-python/pull/269/{{ revealButtonHref }}
Please reload this pagehttps://github.com/skyflowapi/skyflow-python/pull/269/files
https://github.com
Termshttps://docs.github.com/site-policy/github-terms/github-terms-of-service
Privacyhttps://docs.github.com/site-policy/privacy-policies/github-privacy-statement
Securityhttps://github.com/security
Statushttps://www.githubstatus.com/
Communityhttps://github.community/
Docshttps://docs.github.com/
Contacthttps://support.github.com?tags=dotcom-footer

Viewport: width=device-width


URLs of crawlers that visited me.