Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
66 commits
Select commit Hold shift + click to select a range
5c66a58
Reorganize repo into multi-package monorepo structure
Feb 11, 2026
626c55c
Add metaflow-functions package
Feb 12, 2026
fa31e77
Publish only function package
romain-intel Feb 13, 2026
33d60b0
fix versioning, publishin pipeline, config
Feb 20, 2026
31d77d5
Add ray-default to conda pinned libs, bump to 0.2.1
Feb 20, 2026
e823cd3
Add conda plugin unit tests from Netflix internal repo
Feb 25, 2026
326c51c
Fix test paths and add test dependencies
Feb 25, 2026
1966cc8
Bump version to 1.3.2.dev0 for dev release with uv changes
Feb 25, 2026
e3c1c3a
Add missing test data files and pytest-mock dependency
Feb 25, 2026
c957771
Skip Netflix-internal tests in OSS test suite
Feb 25, 2026
7958200
Remove Netflix-internal tests from OSS test suite
Feb 25, 2026
f623a94
Add full_id_unique_keys parameter support to conda plugin
Feb 25, 2026
34cab51
Bump to 1.3.3.dev0
Feb 25, 2026
675ac46
Add full_id_unique_keys to CondaResolver and PipResolver
Feb 25, 2026
a50992f
Fix circular import: import CondaException from utils instead of conda
Feb 25, 2026
a1b6989
Fix coverage import to use nflx namespace (internal-only plugin)
Feb 25, 2026
ac85a5d
Bump to 1.3.4.dev1
Feb 25, 2026
3a6779c
Move coverage plugin to OSS (netflix_ext namespace)
Feb 25, 2026
fbc71f3
Use generic coveragerc.py in OSS, fall back to nflx override if avail…
Feb 25, 2026
801f07e
Remove nflx reference from setup_coverage; coveragerc override done b…
Feb 25, 2026
38a89a4
Fix nflx->netflix_ext namespace refs; use env var for coveragerc over…
Feb 25, 2026
645f516
Add full_id_unique_keys param to all Resolver.resolve() implementations
Feb 26, 2026
d128c12
Port missing internal fixes to OSS: setuptools<82 constraint + pylock…
Feb 26, 2026
b9f4308
Add test-functions GHA workflow for metaflow-functions unit tests
Mar 6, 2026
3db3887
Add junit XML output and dorny/test-reporter to test.yml
Mar 6, 2026
eee7a5a
Fix GHA: black formatting, monorepo pip install path, pandas dep for …
Mar 6, 2026
a0d5751
Fix prefix.dev 403: move channel_alias setup to post-environment step
Mar 6, 2026
e3e7ce9
Fix test-functions: install metaflow-netflixext (needed by environmen…
Mar 6, 2026
173c5b6
Fix test-functions: drop Python 3.9 (metaflow-functions requires >=3.10)
Mar 6, 2026
00cc19e
Fix test fixtures: remove Netflix-internal package, fix python versio…
Mar 6, 2026
8370092
Run ux function tests in GHA via minio
Mar 6, 2026
2909f38
Fix ux tests: restore @conda for code packaging, replace pydash with …
Mar 6, 2026
5959c2d
Restore pydash in ux test flow to verify conda env package installation
Mar 6, 2026
bc10be0
Fix YAML syntax: use block scalar for channel_alias echo command
Mar 6, 2026
2611159
Restore environment=conda in Runner: required for @conda decorator
Mar 6, 2026
3417bfb
Fix channel_alias: set in condarc block (CONDARC env var ignored by ~…
Mar 6, 2026
fc9ebee
Fix: use micromamba resolver (mamba not installed in GHA setup-microm…
Mar 6, 2026
0b92ebf
Fix: fall back to METAFLOW_CODE_URL when task.code is None (first tas…
Mar 6, 2026
b885fa8
Enable FEAT_ALWAYS_UPLOAD_CODE_PACKAGE for ux tests (required for tas…
Mar 6, 2026
2574641
Fix: set METAFLOW_DEFAULT_FUNCTIONS_S3_ROOT for ux tests
Mar 7, 2026
1a7db01
Fix: set METAFLOW_FUNCTION_RUNTIME_PATH=/tmp (GHA /mnt is read-only)
Mar 7, 2026
626a3da
Add pytest-cov coverage reports; fix test.yml channel alias regression
Mar 7, 2026
59ba94b
Add Codecov upload to test-fastdata and test-functions workflows
Mar 7, 2026
502304f
Add CODECOV_TOKEN to codecov upload steps
Mar 7, 2026
84a4295
Use single merged Codecov upload via coverage-report job
Mar 7, 2026
37d9af6
Fix test failures: env var typo, pytest-mock, PyPI source, duplicate …
Mar 19, 2026
fcd2fe9
Bump metaflow-functions to 0.2.1.dev1
Mar 22, 2026
9106fd7
Fix 3 test failures: Python 3.8 compat, pylock missing arg, yml pytho…
Mar 23, 2026
618080f
Updated version to match current Netflix implementation
romain-intel Apr 1, 2026
fd6dd60
Rename to nflx instead of netflix_ext
romain-intel Apr 1, 2026
3d9dde6
Add redirect
romain-intel Apr 1, 2026
0b01acf
Update tests
romain-intel Apr 1, 2026
434fe2f
Get test.yml to run again?
romain-intel Apr 1, 2026
8251e90
Update test workflow
romain-intel Apr 1, 2026
4a93f01
It helps to add tests
romain-intel Apr 1, 2026
512d263
Fix more tests
romain-intel Apr 1, 2026
0d77c24
Fixup http helpers
romain-intel Apr 2, 2026
7513806
Fix four CI failures in PR #66
Apr 2, 2026
d949c11
Fix have_channels regression: always pass explicit -c flags for user …
Apr 2, 2026
1c8ec39
Fix conda_resolver: skip explicit -c flags for default channels
Apr 2, 2026
d14a06a
Skip test_resolve_one/all_envs on macOS py3.8 (unsupported by newer l…
Apr 2, 2026
b78e4b0
fix: measure metaflow_extensions coverage in extensions test job
Apr 10, 2026
5cfb37a
Fix coverage combine: ignore missing source paths from cross-platform…
Apr 10, 2026
2691a86
Add .coveragerc with cross-platform path remapping for coverage combine
Apr 10, 2026
50f0827
Remove --ignore-errors flags now that path remapping is in place
Apr 10, 2026
8349b33
Omit generated nflxext_version.py from coverage report
Apr 11, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions .coveragerc
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
[paths]
source =
.
/home/runner/work/metaflow-nflx-extensions/metaflow-nflx-extensions/
/Users/runner/work/metaflow-nflx-extensions/metaflow-nflx-extensions/

[report]
omit =
*/toplevel/nflxext_version.py
45 changes: 29 additions & 16 deletions .github/workflows/python-publish.yml
Original file line number Diff line number Diff line change
@@ -1,10 +1,7 @@
# This workflow will upload a Python Package using Twine when a release is created
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-python#publishing-to-package-registries

# This workflow uses actions that are not certified by GitHub.
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.
# Publish packages to PyPI when a release is created.
#
# Builds all packages and publishes them with skip-existing, so only
# packages with new versions (not yet on PyPI) are actually uploaded.

name: Publish

Expand All @@ -17,25 +14,41 @@ permissions:

jobs:
deploy:

runs-on: ubuntu-latest
# Specifying a GitHub environment is optional, but strongly encouraged
environment: pypi
permissions:
# IMPORTANT: this permission is mandatory for Trusted Publishing
id-token: write

steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4

- name: Set up Python
uses: actions/setup-python@v3
uses: actions/setup-python@v5
with:
python-version: '3.x'
- name: Install dependencies

- name: Install build dependencies
run: |
python -m pip install --upgrade pip
pip install setuptools wheel twine
- name: Build package

- name: Build packages
run: |
python setup.py sdist bdist_wheel --universal
- name: Publish package
for pkg_dir in metaflow-netflixext metaflow-functions; do
echo "Building $pkg_dir..."
cd "$pkg_dir"
python setup.py sdist bdist_wheel --universal
cd ..
done

- name: Publish metaflow-netflixext
uses: pypa/gh-action-pypi-publish@ed0c53931b1dc9bd32cbe73a98c7f6766f8a527e # 1.13.0
with:
packages-dir: metaflow-netflixext/dist/
skip-existing: true

- name: Publish metaflow-functions
uses: pypa/gh-action-pypi-publish@ed0c53931b1dc9bd32cbe73a98c7f6766f8a527e # 1.13.0
with:
packages-dir: metaflow-functions/dist/
skip-existing: true
177 changes: 177 additions & 0 deletions .github/workflows/test-functions.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,177 @@
name: test-functions

on:
pull_request:
push:
branches:
- main

jobs:
unit:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
python-version: ["3.10", "3.11", "3.12"]

env:
AWS_ENDPOINT_URL: http://localhost:9000
AWS_ACCESS_KEY_ID: minioadmin
AWS_SECRET_ACCESS_KEY: minioadmin
AWS_DEFAULT_REGION: us-east-1
METAFLOW_DEFAULT_DATASTORE: s3
METAFLOW_DATASTORE_SYSROOT_S3: s3://metaflow-test
METAFLOW_DEFAULT_FUNCTIONS_S3_ROOT: s3://metaflow-test/functions
METAFLOW_FUNCTION_RUNTIME_PATH: /tmp
METAFLOW_CONDA_DEPENDENCY_RESOLVER: micromamba
METAFLOW_FEAT_ALWAYS_UPLOAD_CODE_PACKAGE: true

steps:
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7

- name: Start MinIO
run: |
docker run -d \
-p 9000:9000 \
-e MINIO_ROOT_USER=minioadmin \
-e MINIO_ROOT_PASSWORD=minioadmin \
minio/minio server /data
until curl -sf http://localhost:9000/minio/health/live; do sleep 1; done

- uses: mamba-org/setup-micromamba@b09ef9b599704322748535812ca03efb2625677b # v2.0.5
with:
environment-name: nflxext-dev
condarc: |
channels:
- conda-forge
channel_alias: https://prefix.dev
create-args: python=${{ matrix.python-version }}

- name: Install metaflow-functions + test deps
shell: bash -eo pipefail -l {0}
run: |
pip install metaflow
pip install -e metaflow-netflixext/
pip install -e metaflow-functions/
pip install pytest pytest-xdist pytest-cov fastavro psutil pandas pyarrow pytest-mock

- name: Create minio bucket
shell: bash -eo pipefail -l {0}
run: |
python -c "
import boto3, botocore
s3 = boto3.client(
's3',
endpoint_url='http://localhost:9000',
aws_access_key_id='minioadmin',
aws_secret_access_key='minioadmin',
region_name='us-east-1',
config=botocore.config.Config(signature_version='s3v4'),
)
s3.create_bucket(Bucket='metaflow-test')
print('Bucket metaflow-test created')
"

- name: Run unit tests
shell: bash -eo pipefail -l {0}
run: |
pytest tests/functions/ -v \
--junit-xml=junit.xml \
--cov=metaflow-functions/metaflow_extensions \
--cov-report=term-missing \
--cov-report=xml:coverage.xml \
--cov-report=html:htmlcov \
--cov-branch

- name: Publish test results
uses: dorny/test-reporter@v1
if: always()
with:
name: Functions Unit Tests (py${{ matrix.python-version }})
path: junit.xml
reporter: java-junit

- name: Post coverage summary
if: always()
run: |
echo "## Coverage — Functions Unit Tests (py${{ matrix.python-version }})" >> $GITHUB_STEP_SUMMARY
echo '```' >> $GITHUB_STEP_SUMMARY
python -m coverage report --sort=miss >> $GITHUB_STEP_SUMMARY || true
echo '```' >> $GITHUB_STEP_SUMMARY

- name: Upload test report
uses: actions/upload-artifact@v4
if: always()
with:
name: functions-unit-test-report-py${{ matrix.python-version }}
path: |
junit.xml
coverage.xml
htmlcov/
.coverage
include-hidden-files: true

coverage-report:
name: "Coverage Report"
needs: unit
if: always()
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7

- uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1
with:
python-version: "3.11"

- name: Install coverage
run: pip install coverage[toml]

- name: Download coverage data from all jobs
uses: actions/download-artifact@v4
with:
pattern: "functions-unit-test-report-*"
path: coverage-artifacts/

- name: Combine coverage data
run: |
for dir in coverage-artifacts/*/; do
label=$(basename "$dir" | sed 's/^functions-unit-test-report-//')
src="$dir/.coverage"
if [ -f "$src" ]; then
cp "$src" ".coverage.$label"
echo "Copied $src → .coverage.$label"
fi
done
coverage combine
echo "Combined data sources:"
coverage debug data

- name: Generate combined report
run: |
coverage xml -o combined-coverage.xml
coverage html -d combined-htmlcov/ --title="metaflow-functions Coverage"

- name: Post coverage summary
run: |
echo "## Coverage — metaflow-functions (combined)" >> $GITHUB_STEP_SUMMARY
echo '```' >> $GITHUB_STEP_SUMMARY
coverage report --sort=miss >> $GITHUB_STEP_SUMMARY || true
echo '```' >> $GITHUB_STEP_SUMMARY
total=$(coverage report | tail -1 | awk '{print $NF}')
echo "**Total coverage: $total**" >> $GITHUB_STEP_SUMMARY

- name: Upload coverage to Codecov
uses: codecov/codecov-action@v5
with:
token: ${{ secrets.CODECOV_TOKEN }}
files: combined-coverage.xml
name: functions-combined

- name: Upload combined coverage report
uses: actions/upload-artifact@v4
with:
name: coverage-combined
path: |
combined-htmlcov/
combined-coverage.xml
112 changes: 108 additions & 4 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ jobs:
METAFLOW_CONDA_DEPENDENCY_RESOLVER: ${{ matrix.resolver }}
METAFLOW_CONDA_TEST: 1
METAFLOW_DATASTORE_SYSROOT_LOCAL: .metaflow
METAFLOW_HACK_CONDA_CHANNEL_ALIAS: prefix.dev
METAFLOW_CONDA_HACK_CHANNEL_ALIAS: prefix.dev
steps:
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7

Expand All @@ -53,15 +53,20 @@ jobs:
condarc: |
channels:
- conda-forge
channel_alias: https://prefix.dev
create-args: >-
python=${{ matrix.python-version }}
${{ matrix.mamba-version }}

- name: Configure channel alias for tests
shell: bash -eo pipefail -l {0}
run: |
echo "channel_alias: https://prefix.dev" >> ~/.condarc

- name: install nflx-extension
shell: bash -eo pipefail -l {0}
run: |
which pip
pip install -e . --force-reinstall -U
pip install -e metaflow-netflixext/

- name: install bash
if: runner.os == 'macOS'
Expand All @@ -73,4 +78,103 @@ jobs:
set -x
which pytest
mkdir .metaflow
pytest -n 4 tests
pytest tests/environments tests/plugins/conda -v \
--junit-xml=junit.xml \
--cov=metaflow_extensions \
--cov-report=term-missing \
--cov-report=xml:coverage.xml \
--cov-report=html:htmlcov \
--cov-branch

- name: Publish test results
uses: dorny/test-reporter@v1
if: always()
with:
name: Extensions Unit Tests (py${{ matrix.python-version }} resolver ${{ matrix.resolver }} micromamba ${{ matrix.micromamba-version }} mamba ${{ matrix.mamba-version }} on ${{ matrix.os }})
path: junit.xml
reporter: java-junit

- name: Post coverage summary
if: always()
run: |
echo "## Coverage — Extensions Unit Tests (py${{ matrix.python-version }} resolver ${{ matrix.resolver }} micromamba ${{ matrix.micromamba-version }} mamba ${{ matrix.mamba-version }} on ${{ matrix.os }})" >> $GITHUB_STEP_SUMMARY
echo '```' >> $GITHUB_STEP_SUMMARY
python -m coverage report --sort=miss >> $GITHUB_STEP_SUMMARY || true
echo '```' >> $GITHUB_STEP_SUMMARY

- name: Upload test report
uses: actions/upload-artifact@v4
if: always()
with:
name: extensions-unit-test-report-py${{ matrix.python-version }}-re${{ matrix.resolver }}-umamba${{ matrix.micromamba-version }}-mamba${{ matrix.mamba-version }}-os${{ matrix.os }}
path: |
junit.xml
coverage.xml
htmlcov/
.coverage
include-hidden-files: true

coverage-report-ext:
name: "Coverage Report"
needs: test
if: always()
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7

- uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1
with:
python-version: "3.11"

- name: Install coverage
run: pip install coverage[toml]

- name: Download coverage data from all jobs
uses: actions/download-artifact@v4
with:
pattern: "extensions-unit-test-report-*"
path: coverage-artifacts/

- name: Combine coverage data
run: |
for dir in coverage-artifacts/*/; do
label=$(basename "$dir" | sed 's/^extensions-unit-test-report-//')
src="$dir/.coverage"
if [ -f "$src" ]; then
cp "$src" ".coverage.$label"
echo "Copied $src → .coverage.$label"
fi
done
coverage combine
echo "Combined data sources:"
coverage debug data

- name: Generate combined report
run: |
coverage xml -o combined-coverage.xml
coverage html -d combined-htmlcov/ --title="metaflow-extensions Coverage"

- name: Post coverage summary
run: |
echo "## Coverage — metaflow-extensions (combined)" >> $GITHUB_STEP_SUMMARY
echo '```' >> $GITHUB_STEP_SUMMARY
coverage report --sort=miss >> $GITHUB_STEP_SUMMARY || true
echo '```' >> $GITHUB_STEP_SUMMARY
total=$(coverage report | tail -1 | awk '{print $NF}')
echo "**Total coverage: $total**" >> $GITHUB_STEP_SUMMARY

- name: Upload coverage to Codecov
uses: codecov/codecov-action@v5
with:
token: ${{ secrets.CODECOV_TOKEN }}
files: combined-coverage.xml
name: extensions-combined

- name: Upload combined coverage report
uses: actions/upload-artifact@v4
with:
name: coverage-combined
path: |
combined-htmlcov/
combined-coverage.xml
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1 +1,5 @@
**/__pycache__
**/*.egg-info
**/dist
**/build
metaflow-functions/metaflow_extensions/nflx/toplevel/functions_version.py
Loading
Loading