Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
54 commits
Select commit Hold shift + click to select a range
cadf5d4
SK-2954: Split skyflow-python into common/v2/v3 build variants, add f…
saileshwar-skyflow Jul 7, 2026
10506c8
SK-2954: Rename v3 SDK to flowvault, import package to skyflow_flowvault
saileshwar-skyflow Jul 7, 2026
424b64b
SK-2954: Unify shared insert/validation/logging logic into common, ad…
saileshwar-skyflow Jul 8, 2026
c94ece5
SK-2954: Add ISkyflow/IVaultController/IVaultClient interfaces, type …
saileshwar-skyflow Jul 9, 2026
93bf20b
SK-2954: Rename insert records->values, drop Upsert class for a dict …
saileshwar-skyflow Jul 9, 2026
eb54bad
SK-2954: Guard BaseSkyflow against direct instantiation
saileshwar-skyflow Jul 10, 2026
8305904
SK-2954: Fix CI workflows still targeting v3, allow empty insert values
saileshwar-skyflow Jul 10, 2026
0c23a50
SK-2954: Fix flowvault CI coverage install and semgrep generated-code…
saileshwar-skyflow Jul 10, 2026
2d8c05c
SK-2954: Add coverage to test-common, fix semgrep sensitive-info fals…
saileshwar-skyflow Jul 10, 2026
e9ad4da
SK-2954: Remove explanatory comments from a few files
saileshwar-skyflow Jul 13, 2026
ebc71d4
SK-2954: Split ISkyflow into BaseSkyflow/BaseSkyflowImpl, make connec…
saileshwar-skyflow Jul 13, 2026
9ac57f4
SK-2972: Implement get, update, delete, detokenize, tokenize for flow…
saileshwar-skyflow Sep 1, 2026
dc9129d
Merge origin/main into flowdb branch; apply SK-3039 into skyvault via…
saileshwar-skyflow Sep 1, 2026
dd72898
SK-3118: Run all modules in shared PR tests; fix common namespace import
saileshwar-skyflow Sep 1, 2026
ce2d3ab
SK-3118: Exclude Fern-generated code from coverage and Semgrep scanning
saileshwar-skyflow Sep 1, 2026
8ef7674
SK-3118: Clear workflow shell-injection finding; set realistic codeco…
saileshwar-skyflow Sep 1, 2026
0545832
SK-3118: Add griffe public-API contract tests for skyvault and flowvault
saileshwar-skyflow Sep 1, 2026
43c914a
SK-3118: Run contract tests on Python 3.10 (griffe requires >= 3.10)
saileshwar-skyflow Sep 1, 2026
d63741a
SK-3118: Drop skyvault release guard from contract tests for Java parity
saileshwar-skyflow Sep 1, 2026
04161d4
SK-3118: Close flowvault coverage gaps and code-review cleanups
saileshwar-skyflow Sep 2, 2026
524069e
SK-3118: Rename flowvault distribution to skyflow-flowvault-python
saileshwar-skyflow Sep 2, 2026
de1574a
SK-3118: Rename bulk record to BulkInsertRequestRecord, add tokens & …
saileshwar-skyflow Sep 2, 2026
78b164a
SK-3118: Add bulk custom request headers and Java timeout/retry parity
saileshwar-skyflow Sep 2, 2026
0bfbdd1
SK-3118: Add Java flowvault vault and service-account samples
saileshwar-skyflow Sep 2, 2026
aa76606
Merge pull request #276 from skyflowapi/saileshwar/SK-3118-flowdb-sup…
saileshwar-skyflow Sep 2, 2026
95dd7b9
SK-3118: Fix internal-release commit step staging a gitignored build …
saileshwar-skyflow Sep 2, 2026
e846c77
[AUTOMATED] Private Release 1.0.0.dev0+95dd7b9
saileshwar-skyflow Sep 2, 2026
e897ea6
SK-3118: Stop tracking flowvault/CONTRACT_SHAPES.md (internal working…
saileshwar-skyflow Sep 2, 2026
924a162
[AUTOMATED] Private Release 1.0.0.dev0+e897ea6
saileshwar-skyflow Sep 2, 2026
661d1e5
SK-3118: Rename importable package to skyflow + error-handling & type…
saileshwar-skyflow Sep 3, 2026
d1e7db4
SK-3118: Update flowvault README (skyflow import, custom headers, tim…
saileshwar-skyflow Sep 3, 2026
447a179
[AUTOMATED] Private Release 1.0.0.dev0+d1e7db4
saileshwar-skyflow Sep 3, 2026
bbebc83
SK-3118: Fix CX-reported flowvault update and client lifecycle bugs
saileshwar-skyflow Sep 7, 2026
14743bd
[AUTOMATED] Private Release 1.0.0.dev0+bbebc83
saileshwar-skyflow Sep 7, 2026
8c35cc8
SK-3118: Regenerate flowvault REST client with newer Fern generator
saileshwar-skyflow Sep 9, 2026
1fc4469
[AUTOMATED] Private Release 1.0.0.dev0+8c35cc8
saileshwar-skyflow Sep 9, 2026
7a94582
SK-3118: flowvault Java-parity fixes + internal HTTP pool/concurrency…
saileshwar-skyflow Sep 9, 2026
afaef38
[AUTOMATED] Private Release 1.0.0.dev0+7a94582
saileshwar-skyflow Sep 9, 2026
71960cd
SK-3118: Full Java parity for flowvault responses + typed Get request
saileshwar-skyflow Sep 9, 2026
d5f7780
[AUTOMATED] Private Release 1.0.0.dev0+71960cd
saileshwar-skyflow Sep 9, 2026
0744944
SK-3118: Remove flowvault query op + rewrite README as full Java-pari…
saileshwar-skyflow Sep 11, 2026
1bb24b8
[AUTOMATED] Private Release 1.0.0.dev0+0744944
saileshwar-skyflow Sep 11, 2026
98a61c0
SK-3118: Align flowvault bulk-size ceiling with Java (100000, bulk-only)
saileshwar-skyflow Sep 11, 2026
a1bb479
[AUTOMATED] Private Release 1.0.0.dev0+98a61c0
saileshwar-skyflow Sep 11, 2026
a27c0b5
SK-3118: Parse records-bearing error bodies as per-record rows for un…
saileshwar-skyflow Sep 15, 2026
3f56864
[AUTOMATED] Private Release 1.0.0.dev0+a27c0b5
saileshwar-skyflow Sep 15, 2026
7309558
SK-3118: Address flowvault README review feedback
saileshwar-skyflow Sep 15, 2026
c7d688c
[AUTOMATED] Private Release 1.0.0.dev0+7309558
saileshwar-skyflow Sep 15, 2026
45e7ea5
SK-3118: Populate .data on insert responses (unary + bulk)
saileshwar-skyflow Sep 15, 2026
9b0bffa
[AUTOMATED] Private Release 1.0.0.dev0+45e7ea5
saileshwar-skyflow Sep 15, 2026
72205bb
SK-3118: Fix flowvault generated version lookup + refresh unit tests
saileshwar-skyflow Sep 15, 2026
872fefe
[AUTOMATED] Private Release 1.0.0.dev0+72205bb
saileshwar-skyflow Sep 15, 2026
876e4d4
SK-3118: Make flowvault sdist self-contained (bundle common/)
saileshwar-skyflow Sep 15, 2026
4acab46
[AUTOMATED] Private Release 1.0.0.dev0+876e4d4
saileshwar-skyflow Sep 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 1 addition & 1 deletion .codespellrc
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
ignore-words-list = Skyflow,skyflow,skyflowapi,skyflowapis,deidentify,reidentify,detokenize,upsert,upserting,binlookup,byot,creds,fpe,devsecops,formdata,vaultid,dotenv,usecwd,runid,dateutil,Homogenous

# Skip these files and folders
skip = .git,.venv,venv,env,__pycache__,*.pyc,*.egg-info,dist,build,.idea,.vscode,*.log,requirements.txt,./skyflow/generated,setup.py
skip = .git,.venv,venv,env,__pycache__,*.pyc,*.egg-info,dist,build,.idea,.vscode,*.log,requirements.txt,generated,setup.py

# If you want to verify it is working, you can uncomment this line to see what files it checks
# count =
Expand Down
18 changes: 0 additions & 18 deletions .github/workflows/beta-release.yml

This file was deleted.

116 changes: 116 additions & 0 deletions .github/workflows/contract-tests.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
name: Contract Tests

on:
pull_request:
branches:
- main
- skyvault-release/**
- flowvault-release/**
paths:
- "skyvault/**"
- "flowvault/**"
- "common/**"
- "ci-scripts/contract/**"
- ".github/workflows/contract-tests.yml"

jobs:
contract-tests:
name: Contract Tests (${{ matrix.module }})
runs-on: ubuntu-latest

strategy:
fail-fast: false
matrix:
include:
- module: skyvault
pkg: skyflow
- module: flowvault
pkg: skyflow

permissions:
contents: read
pull-requests: write

env:
GRIFFE_VERSION: "2.2.0"

steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Setup Python
uses: actions/setup-python@v2
with:
python-version: '3.10'

- name: Install griffe
run: |
python -m pip install --upgrade pip
python -m pip install "griffe==${GRIFFE_VERSION}"

- name: Verify public API surface against the committed baseline
run: |
python ci-scripts/contract/griffe_contract.py check \
"${{ matrix.module }}" \
"${{ matrix.module }}/api-report/${{ matrix.pkg }}.api.json"

- name: How to update the baseline
if: failure()
run: |
echo "### Public API contract drift in ${{ matrix.module }} ###"
echo "If this change is intentional, run:"
echo " ci-scripts/contract-snapshot-update.sh ${{ matrix.module }}"
echo "review the api-report/${{ matrix.pkg }}.api.json diff, and commit it with your change."

- name: Detect baseline change
id: baseline-diff
if: always() && github.event.pull_request
run: |
git fetch origin "${{ github.event.pull_request.base.ref }}" --depth=1
BASELINE="${{ matrix.module }}/api-report/${{ matrix.pkg }}.api.json"
if ! git diff --quiet "origin/${{ github.event.pull_request.base.ref }}" HEAD -- "$BASELINE"; then
echo "changed=true" >> "$GITHUB_OUTPUT"
{
echo 'diff<<GRIFFE_EOF'
git diff "origin/${{ github.event.pull_request.base.ref }}" HEAD -- "$BASELINE" | head -300
echo 'GRIFFE_EOF'
} >> "$GITHUB_OUTPUT"
else
echo "changed=false" >> "$GITHUB_OUTPUT"
fi

- name: Comment contract baseline change on PR
if: always() && github.event.pull_request && steps.baseline-diff.outputs.changed == 'true'
uses: actions/github-script@v7
env:
MODULE: ${{ matrix.module }}
PKG: ${{ matrix.pkg }}
DIFF: ${{ steps.baseline-diff.outputs.diff }}
with:
script: |
const module = process.env.MODULE;
const pkg = process.env.PKG;
const marker = `<!-- contract-baseline-diff:${module} -->`;
const body = `${marker}\n## Public API contract change (\`${module}\`)\n\n`
+ `This PR changes \`${module}/api-report/${pkg}.api.json\` (the approved public API `
+ `contract for \`${pkg}\`). Review the surface change below:\n\n`
+ '```diff\n' + (process.env.DIFF || '(diff too large - see the file change)') + '\n```';
const { data: comments } = await github.rest.issues.listComments({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
});
const existing = comments.find(c => c.body && c.body.includes(marker));
if (existing) {
await github.rest.issues.updateComment({
owner: context.repo.owner, repo: context.repo.repo,
comment_id: existing.id, body,
});
} else {
await github.rest.issues.createComment({
owner: context.repo.owner, repo: context.repo.repo,
issue_number: context.issue.number, body,
});
}
42 changes: 36 additions & 6 deletions .github/workflows/internal-release.yml
Original file line number Diff line number Diff line change
@@ -1,23 +1,53 @@
name: Internal Release
name: Publish module to the JFrog Artifactory

on:
push:
# '**' not '*.*': Actions glob '*' does not match '/', so '*.*' let slash
# tags (flowvault/v1.0.0) through and fired this branch-only workflow.
tags-ignore:
- '*.*'
- '**'
paths-ignore:
- "setup.py"
- "*.yml"
- "*.md"
- "skyflow/utils/_version.py"
- "samples/**"
branches:
- flowvault-release/*
- skyvault-release/*
# Legacy: predates the per-module naming, still maps to skyvault.
- release/*

jobs:
resolve-module:
runs-on: ubuntu-latest
# Skip our own bump commit, or this loops: bump -> push -> release -> bump.
# PAT-authenticated pushes DO trigger workflows; GITHUB_TOKEN pushes do not.
# build-and-deploy needs this job, so skipping here skips the run.
if: ${{ !contains(github.event.head_commit.message, '[AUTOMATED]') }}
outputs:
module: ${{ steps.set-module.outputs.module }}
steps:
# Explicit match, no catch-all: defaulting once published the wrong module.
- name: Resolve module from branch name
id: set-module
env:
BRANCH: ${{ github.ref_name }}
run: |
case "$BRANCH" in
flowvault-release/*) MODULE="flowvault" ;;
skyvault-release/*) MODULE="skyvault" ;;
release/*) MODULE="skyvault" ;;
*)
echo "::error::Branch '$BRANCH' does not map to a module."
exit 1
;;
esac
echo "Branch '$BRANCH' -> module '$MODULE'"
echo "module=$MODULE" >> "$GITHUB_OUTPUT"

build-and-deploy:
needs: resolve-module
uses: ./.github/workflows/shared-build-and-deploy.yml
with:
ref: ${{ github.ref_name }}
tag: 'internal'
module: ${{ needs.resolve-module.outputs.module }}
secrets: inherit

84 changes: 84 additions & 0 deletions .github/workflows/pr-flowvault.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
name: PR CI Checks (flowvault)

# flowvault is a folder under main, alongside skyvault - not a branch.
# This workflow fires for PRs targeting main or a flowvault-release/* branch
# that actually touch flowvault or its common dependency, and only builds/
# tests those two modules. skyvault (and the full 3-module suite) is covered
# by pr.yml, not here.

on:
pull_request:
branches: [ "main", "flowvault-release/**" ]
paths:
- "flowvault/**"
- "common/**"

jobs:
build:
name: Build
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v2
with:
python-version: '3.9'

# flowvault depends on common as a local path dependency, so common
# must be built and installed first or flowvault's own build/install
# will fail to resolve it.
- name: Build and install common
run: |
python -m pip install --upgrade pip setuptools wheel
cd common
python setup.py sdist bdist_wheel
pip install dist/*.whl

- name: Build flowvault
run: |
cd flowvault
python setup.py sdist bdist_wheel

test:
name: Unit Tests
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v2
with:
python-version: '3.9'

- name: create-json
id: create-json
uses: jsdaniell/create-json@1.1.2
with:
name: "credentials.json"
json: ${{ secrets.VALID_SKYFLOW_CREDS_TEST }}

- name: Run flowvault unit tests
run: |
python -m pip install --upgrade pip setuptools wheel coverage
cp credentials.json flowvault/credentials.json

# flowvault depends on common as a local path dependency.
cd common
python setup.py sdist bdist_wheel
pip install dist/*.whl
cd ..

cd flowvault
python setup.py sdist bdist_wheel
pip install dist/*.whl
if [ -f requirements.txt ]; then
pip install -r requirements.txt
fi
python -m coverage run --source=. -m unittest discover
coverage xml -o test-coverage.xml

- name: Codecov
uses: codecov/codecov-action@v2.1.0
with:
token: ${{ secrets.CODECOV_REPO_UPLOAD_TOKEN }}
files: flowvault/test-coverage.xml
flags: flowvault
name: codecov-skyflow-python-flowvault
verbose: true
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml → .github/workflows/pr.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
name: CI Checks
name: PR CI Checks

on: [pull_request]

Expand Down
73 changes: 63 additions & 10 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -1,18 +1,71 @@
name: Public Release
name: Public release

# Triggered by publishing a GitHub Release, not a raw tag push: the Release
# carries both facts needed here - target_commitish (the branch picked in the
# UI; a tag records only a commit) and tag_name (module prefix + version).
#
# Beta and final share this workflow - 'release' events cannot be filtered by
# tag pattern, and both behave identically downstream. Kind comes from the tag.

on:
push:
tags: "*.*.*"
paths-ignore:
- "setup.py"
- "*.yml"
- "*.md"
- "skyflow/utils/_version.py"
release:
types: [published]

jobs:
resolve-release:
runs-on: ubuntu-latest
outputs:
module: ${{ steps.parse.outputs.module }}
version: ${{ steps.parse.outputs.version }}
kind: ${{ steps.parse.outputs.kind }}
steps:
- name: Parse module, version and release kind from the tag
id: parse
env:
TAG: ${{ github.event.release.tag_name }}
BRANCH: ${{ github.event.release.target_commitish }}
run: |
# Expected: <module>/v<semver>[-beta.N] e.g. flowvault/v1.0.0,
# skyvault/v2.1.2, flowvault/v1.0.0-beta.1
if [[ ! "$TAG" =~ ^[a-z]+/v[0-9]+\.[0-9]+\.[0-9]+(-beta\.[0-9]+)?$ ]]; then
echo "::error::Tag '$TAG' is not <module>/v<semver>[-beta.N]." \
"Examples: flowvault/v1.0.0, skyvault/v2.1.2, flowvault/v1.0.0-beta.1"
exit 1
fi

PREFIX="${TAG%%/*}" # flowvault/v1.0.0 -> flowvault
VERSION="${TAG#*/}" # flowvault/v1.0.0 -> v1.0.0
VERSION="${VERSION#v}" # v1.0.0 -> 1.0.0

# Tag prefix -> module directory (both match the directory name).
case "$PREFIX" in
flowvault) MODULE="flowvault" ;;
skyvault) MODULE="skyvault" ;;
*)
echo "::error::Unknown module prefix '$PREFIX' in tag '$TAG'"
exit 1
;;
esac

if [[ "$VERSION" == *-beta.* ]]; then KIND="beta"; else KIND="public"; fi

if [ -z "$BRANCH" ]; then
echo "::error::Release has no target_commitish - cannot determine the release branch."
exit 1
fi

echo "Tag '$TAG' -> module='$MODULE' version='$VERSION' kind='$KIND' branch='$BRANCH'"
echo "module=$MODULE" >> "$GITHUB_OUTPUT"
echo "version=$VERSION" >> "$GITHUB_OUTPUT"
echo "kind=$KIND" >> "$GITHUB_OUTPUT"

build-and-deploy:
needs: resolve-release
uses: ./.github/workflows/shared-build-and-deploy.yml
with:
ref: main
tag: 'public'
ref: ${{ github.event.release.tag_name }}
tag: ${{ needs.resolve-release.outputs.kind }}
module: ${{ needs.resolve-release.outputs.module }}
version: ${{ needs.resolve-release.outputs.version }}
release-branch: ${{ github.event.release.target_commitish }}
secrets: inherit
2 changes: 1 addition & 1 deletion .github/workflows/semgrep.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ jobs:

- name: Run Semgrep
run: |
semgrep --config .semgreprules/customRule.yml --config auto --severity ERROR --sarif . > results.sarif
semgrep --config .semgreprules/customRule.yml --config auto --severity ERROR --exclude generated --sarif . > results.sarif

- name: Upload SARIF file
uses: github/codeql-action/upload-sarif@v3
Expand Down
Loading
Loading