Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
76 commits
Select commit Hold shift + click to select a range
87e2bfd
Add C++ infrastructure: build, format, lint, and unit test tooling
mkolodner-sc Mar 25, 2026
a18fb47
Remove pybind11 import from generate_compile_commands — bundled in to…
mkolodner-sc Mar 25, 2026
c127f2b
ppr seq
yliu2-sc Mar 25, 2026
b5b8027
Auto-build C++ extensions in post_install; auto-add LLVM to PATH on Mac
mkolodner-sc Mar 25, 2026
9d3c8df
Rename setup.py to build_cpp_extensions.py; add build_cpp_extensions …
mkolodner-sc Mar 25, 2026
ace7126
Scope C++ extension discovery to gigl/cpp_extensions/
mkolodner-sc Mar 25, 2026
48be4cc
Remove unnecessary existence check for build_cpp_extensions.py in pos…
mkolodner-sc Mar 25, 2026
1b153b7
Review fixes + adopt PyTorch csrc conventions for C++ layout
mkolodner-sc Mar 25, 2026
03ed8c4
Add multi-source C++ ext support, gigl/csrc package init, and .so git…
mkolodner-sc Mar 25, 2026
638e667
Move build_cpp_extensions.py to scripts/ and wire into relevant make …
mkolodner-sc Mar 25, 2026
416f6b4
Initial commit
mkolodner-sc Mar 30, 2026
4af704e
merge main
mkolodner-sc Mar 30, 2026
91d99d3
Update
mkolodner-sc Mar 31, 2026
3d41dc3
Update
mkolodner-sc Mar 31, 2026
04cee0c
Fix for gs mode
mkolodner-sc Mar 31, 2026
99fdef2
Address comment
mkolodner-sc Mar 31, 2026
04df860
Merge branch 'mkolodner-sc/fix_ppr_memory' into mkolodner-sc/cpp-infr…
mkolodner-sc Mar 31, 2026
210c1dd
Upate
mkolodner-sc Apr 1, 2026
909faf4
Merge branch 'main' into mkolodner-sc/cpp-infrastructure
mkolodner-sc Apr 1, 2026
628a9f2
Update tidy and format
mkolodner-sc Apr 10, 2026
75863a6
Update
mkolodner-sc Apr 10, 2026
cffa7ba
Update guidance
mkolodner-sc Apr 10, 2026
49e9497
Update
mkolodner-sc Apr 10, 2026
3e1bf6b
Fix
mkolodner-sc Apr 10, 2026
7fd3ed9
Fix
mkolodner-sc Apr 10, 2026
a682ded
Update
mkolodner-sc Apr 10, 2026
83e51bc
Update
mkolodner-sc Apr 14, 2026
5e55f54
Updaate
mkolodner-sc Apr 16, 2026
7b742f2
Add C++ linting infrastructure with clangd
mkolodner-sc Apr 16, 2026
43c4271
Update
mkolodner-sc Apr 16, 2026
d0859a3
Update
mkolodner-sc Apr 16, 2026
d07ca57
Update
mkolodner-sc Apr 16, 2026
4815fae
Update
mkolodner-sc Apr 16, 2026
912e5db
Update
mkolodner-sc Apr 16, 2026
5064788
Address comments
mkolodner-sc Apr 17, 2026
099dd2a
Restore
mkolodner-sc Apr 17, 2026
830da8b
Update
mkolodner-sc Apr 17, 2026
3afb8a2
Update
mkolodner-sc Apr 18, 2026
b37786c
Update
mkolodner-sc Apr 20, 2026
ab51157
Update
mkolodner-sc Apr 20, 2026
df98b20
Fix
mkolodner-sc Apr 20, 2026
1165fd3
Fixes
mkolodner-sc Apr 20, 2026
4b579aa
Update
mkolodner-sc Apr 20, 2026
f4b015e
Update uv lock
mkolodner-sc Apr 20, 2026
01a9b2c
Merge
mkolodner-sc Apr 20, 2026
0f253d2
Update
mkolodner-sc Apr 20, 2026
18a7316
Fix
mkolodner-sc Apr 20, 2026
b56945e
Bump pyproject version
mkolodner-sc Apr 20, 2026
30e4e30
bump back to 0.2.0
mkolodner-sc Apr 20, 2026
cbf07f3
[AUTOMATED] Update dep.vars, and other relevant files with new image …
github-actions[bot] Apr 20, 2026
870e936
Add cpp test to gh comment
mkolodner-sc Apr 20, 2026
77e1a02
Update dockerfile with readme
mkolodner-sc Apr 20, 2026
ce9f1e2
update style guide
mkolodner-sc Apr 20, 2026
61f4965
Small update
mkolodner-sc Apr 20, 2026
3af2a33
remove mypy change
mkolodner-sc Apr 20, 2026
f417365
Make necessary changes for when we need to introduce cuda cpp operations
mkolodner-sc Apr 20, 2026
83bb8a6
Additional fixes to cuda setup
mkolodner-sc Apr 21, 2026
712d1e2
Add additional cuda fixes
mkolodner-sc Apr 21, 2026
2861b8d
remove no build isolation from calls, update pyproject to not build i…
mkolodner-sc Apr 21, 2026
adf7046
remove additional build isolations
mkolodner-sc Apr 21, 2026
549702b
Update release
mkolodner-sc Apr 22, 2026
ba300c3
Address additional cpp comments
mkolodner-sc Apr 22, 2026
fc68f9d
cleanup
mkolodner-sc Apr 22, 2026
fa1ee91
Updates
mkolodner-sc Apr 22, 2026
bb87166
Update
mkolodner-sc Apr 22, 2026
907fc12
continued updates
mkolodner-sc Apr 22, 2026
d079113
Updates
mkolodner-sc Apr 22, 2026
a49a4c5
Simplify requirements
mkolodner-sc Apr 23, 2026
3738af6
Update uv
mkolodner-sc Apr 23, 2026
00d836f
[AUTOMATED] Update dep.vars, and other relevant files with new image …
github-actions[bot] Apr 23, 2026
295138a
Update
mkolodner-sc Apr 23, 2026
e070854
Address comments
mkolodner-sc Apr 23, 2026
5484c42
Update
mkolodner-sc Apr 23, 2026
cf8a35b
Potential fix
mkolodner-sc Apr 24, 2026
928d5c7
Update
mkolodner-sc Apr 24, 2026
7610faf
cpp infra abstraction
svij-sc Apr 24, 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
7 changes: 4 additions & 3 deletions .github/cloud_builder/run_command_on_active_checkout.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ substitutions:
options:
logging: CLOUD_LOGGING_ONLY
steps:
- name: us-central1-docker.pkg.dev/external-snap-ci-github-gigl/gigl-base-images/gigl-builder:b34c863a2168c8df5a6da1f6385e5d374f0175d2.91.1
- name: us-central1-docker.pkg.dev/external-snap-ci-github-gigl/gigl-base-images/gigl-builder:3738af6cca02750514278cb63c98c88d07c45f7b.99.1
entrypoint: /bin/bash
args:
- -c
Expand All @@ -28,8 +28,9 @@ steps:
docker buildx create --driver=docker-container --use
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
gcloud auth configure-docker us-central1-docker.pkg.dev
# Install GiGL
uv pip install -e .
# Install GiGL (non-editable). gigl-core (the C++ extension workspace member)
# is resolved transitively and built via scikit-build-core.
uv pip install .
# The builder operates in its own user dir, usually /workspace,
# so we need to copy the gigl tools dir to the current cloud_builder's user dir.
# See: containers/Dockerfile.builder.
Expand Down
17 changes: 17 additions & 0 deletions .github/workflows/on-pr-comment.yml
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,23 @@ jobs:
command: |
make unit_test_py

unit-test-cpp:
if: ${{ github.event.issue.pull_request && (contains(github.event.comment.body, '/unit_test_cpp') || endsWith(github.event.comment.body, '/unit_test') || contains(github.event.comment.body, '/all_test')) }}
runs-on: ubuntu-latest
timeout-minutes: 20
steps:
- name: Run C++ Unit Tests
uses: snapchat/gigl/.github/actions/run-command-on-pr@main
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
pr_number: ${{ github.event.issue.number }}
should_leave_progress_comments: "true"
descriptive_workflow_name: "C++ Unit Test"
use_cloud_run: "false"
command: |
bash requirements/install_cpp_deps.sh
make unit_test_cpp

unit-test-scala:
if: ${{ github.event.issue.pull_request && (contains(github.event.comment.body, '/unit_test_scala') || endsWith(github.event.comment.body, '/unit_test') || contains(github.event.comment.body, '/all_test')) }}
runs-on: ubuntu-latest
Expand Down
10 changes: 10 additions & 0 deletions .github/workflows/on-pr-merge.yml
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,16 @@ jobs:
service_account: ${{ secrets.gcp_service_account_email }}
project: ${{ vars.GCP_PROJECT_ID }}

ci-unit-test-cpp:
if: github.event_name == 'merge_group'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install C++ dependencies
run: bash requirements/install_cpp_deps.sh
- name: Run C++ Unit Tests
run: make unit_test_cpp

ci-integration-test:
if: github.event_name == 'merge_group'
runs-on: ubuntu-latest
Expand Down
6 changes: 4 additions & 2 deletions .github/workflows/release-documentation.yml
Original file line number Diff line number Diff line change
Expand Up @@ -41,11 +41,13 @@ jobs:
gcp_project_id: ${{ vars.GCP_PROJECT_ID }}
workload_identity_provider: ${{ secrets.WORKLOAD_IDENTITY_PROVIDER }}
gcp_service_account_email: ${{ secrets.GCP_SERVICE_ACCOUNT_EMAIL }}
# We also make gigl available w/ editable install `-e` so that autodoc can find it.
# Install gigl so Sphinx autoapi can import and introspect it. Non-editable
# install; autodoc reads from site-packages. gigl-core (the C++ extension
# workspace member) is resolved transitively and built via scikit-build-core.
- name: Install necessary doc dependencies
run: |
uv sync --group docs --inexact
uv pip install -e .
uv pip install .
- name: Sphinx build
run: |
make build_docs
Expand Down
83 changes: 61 additions & 22 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
name: Release GiGL

# TODO: Before the first release using this workflow, complete the following one-time GCP setup:
# 1. Create the `gigl-cu128` Artifact Registry Python repository in GCP project
# `external-snap-ci-github-gigl` (the CPU registry `gigl` already exists).
# 2. Grant the release service account write access to the new `gigl-cu128` repository.

on:
# Triggers the workflow manually for now until we have full support for releasing:
# - building and releasing docker images
Expand All @@ -11,13 +16,21 @@ permissions:
id-token: write # Needed for the auth w/ GCP to upload to Google Artifact Registry.

jobs:
build:
name: Build and release pip whl
runs-on: ubuntu-latest
build-gigl-core:
name: Build and release gigl-core (${{ matrix.torch-variant }})
runs-on: ${{ matrix.runner }}
strategy:
matrix:
include:
- runner: ubuntu-latest
torch-variant: cpu
index-name: gcp-release-registry-cpu
- runner: gigl-gpu-instances
torch-variant: cu128
index-name: gcp-release-registry-cu128
env:
PROJECT_ID: ${{ vars.GCP_PROJECT_ID }}
environment:
# This CI environment contains relevant pip.conf and pyprci information to
name: release
steps:
- name: Checkout
Expand All @@ -31,29 +44,55 @@ jobs:
gcp_project_id: ${{ vars.GCP_PROJECT_ID }}
workload_identity_provider: ${{ secrets.WORKLOAD_IDENTITY_PROVIDER }}
gcp_service_account_email: ${{ secrets.GCP_SERVICE_ACCOUNT_EMAIL }}
# We need build and twine to build the whl and upload it to Google Artifact Registry.
# keyrings.google-artifactregistry-auth is needed to authenticate with Google Artifact Registry.
# See: https://cloud.google.com/artifact-registry/docs/python/store-python
# And: https://cloud.google.com/artifact-registry/docs/python/authentication

- name: Setup environment for publishing Python package
run: |
# Pre-install keyring and Artifact Registry plugin from the public PyPI
uv tool install keyring --with keyrings.google-artifactregistry-auth==1.1.2

- name: Build Whl Distribution
run: uv build
- name: Build gigl-core Whl Distribution
run: uv build --wheel --package gigl-core

- name: Publish gigl-core Package 🚀
run: |
uv publish --index ${{ matrix.index-name }} --username oauth2accesstoken --keyring-provider subprocess

build:
name: Build and release gigl (${{ matrix.torch-variant }})
needs: build-gigl-core
runs-on: ${{ matrix.runner }}
strategy:
matrix:
include:
- runner: ubuntu-latest
torch-variant: cpu
index-name: gcp-release-registry-cpu
- runner: gigl-gpu-instances
torch-variant: cu128
index-name: gcp-release-registry-cu128
env:
PROJECT_ID: ${{ vars.GCP_PROJECT_ID }}
environment:
name: release
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup Python deps and gcloud
uses: ./.github/actions/setup-python-tools
with:
install_dev_deps: "true"
setup_gcloud: "true"
gcp_project_id: ${{ vars.GCP_PROJECT_ID }}
workload_identity_provider: ${{ secrets.WORKLOAD_IDENTITY_PROVIDER }}
gcp_service_account_email: ${{ secrets.GCP_SERVICE_ACCOUNT_EMAIL }}

- name: Publish Package 🚀
env:
PYPIRC_CONTENTS: ${{ secrets.PYPIRC_CONTENTS }}
PIP_CONF_CONTENTS: ${{ secrets.PIP_CONF_CONTENTS }}
# We upload the build whls to Google Artifact Registry.
- name: Setup environment for publishing Python package
run: |
uv publish --index gcp-release-registry --username oauth2accesstoken --keyring-provider subprocess
uv tool install keyring --with keyrings.google-artifactregistry-auth==1.1.2

- name: Build gigl Whl Distribution
run: uv build --wheel --package gigl

- name: Post Publish Package
if: always()
# Clean up files created during Publish Package step.
- name: Publish gigl Package 🚀
run: |
rm -rf ~/.pypirc
rm -rf ~/.pip/pip.conf
uv publish --index ${{ matrix.index-name }} --username oauth2accesstoken --keyring-provider subprocess
17 changes: 17 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -49,5 +49,22 @@ fossa*.zip
# https://github.com/google-github-actions/auth/issues/497
gha-creds-*.json

# gigl-core build outputs. scikit-build-core writes the proper wheel build into
# gigl-core/build/{wheel_tag}/; the editable-install cmake invocation additionally
# drops cache files at gigl-core/ root (CMakeCache.txt, .cmake/, build.ninja, etc).
gigl-core/build/
gigl-core/CMakeCache.txt
gigl-core/CMakeFiles/
gigl-core/CMakeInit.txt
gigl-core/cmake_install.cmake
gigl-core/build.ninja
gigl-core/.cmake/
gigl-core/.ninja_log
gigl-core/.ninja_deps
gigl-core/.skbuild-info.json
gigl-core/compile_commands.json
gigl-core/_core*.so
gigl-core/src/gigl_core/*.so

# Local-only scripts with hardcoded internal identifiers
scripts/_local/
2 changes: 0 additions & 2 deletions MANIFEST.in

This file was deleted.

66 changes: 60 additions & 6 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,13 @@ DOCKER_IMAGE_MAIN_CPU_NAME_WITH_TAG?=${DOCKER_IMAGE_MAIN_CPU_NAME}:${DATE}
DOCKER_IMAGE_DEV_WORKBENCH_NAME_WITH_TAG?=${DOCKER_IMAGE_DEV_WORKBENCH_NAME}:${DATE}

PYTHON_DIRS:=.github/scripts examples gigl tests snapchat scripts
CPP_SOURCES:=$(shell find gigl-core/src gigl-core/tests \( -name "*.cpp" -o -name "*.cu" -o -name "*.h" -o -name "*.cuh" \) 2>/dev/null)
# clang-tidy 15 does not fully support CUDA syntax (e.g. <<<...>>>, __global__).
# Exclude .cu/.cuh files from tidy targets; clang-format and clangd handle them fine.
CPP_SOURCES_NO_CUDA:=$(filter-out %.cu %.cuh,$(CPP_SOURCES))
# scikit-build-core writes compile_commands.json into gigl-core/build/{wheel_tag}/
# during `uv sync`. Resolved lazily at recipe time so the wildcard sees the latest build.
CPP_COMPILE_COMMANDS_DIR=$(firstword $(wildcard gigl-core/build/*/))
PY_TEST_FILES?="*_test.py"
# You can override GIGL_TEST_DEFAULT_RESOURCE_CONFIG by setting it in your environment i.e.
# adding `export GIGL_TEST_DEFAULT_RESOURCE_CONFIG=your_resource_config` to your shell config (~/.bashrc, ~/.zshrc, etc.)
Expand All @@ -48,7 +55,8 @@ check_if_valid_env:
install_dev_deps: check_if_valid_env
gcloud auth configure-docker us-central1-docker.pkg.dev
bash ./requirements/install_py_deps.sh --dev
bash ./requirements/install_scala_deps.sh
# bash ./requirements/install_scala_deps.sh
# bash ./requirements/install_cpp_deps.sh
uv pip install -e .
uv run pre-commit install --hook-type pre-commit --hook-type pre-push

Expand Down Expand Up @@ -86,6 +94,15 @@ unit_test_scala: clean_build_files_scala
( cd scala; sbt test )
( cd scala_spark35 ; sbt test )

# Builds and runs gigl-core's C++ unit tests (GoogleTest + CTest). scikit-build-core
# is not involved here — we invoke cmake directly against gigl-core/ so we can
# flip -DGIGL_CORE_BUILD_TESTS=ON to wire in the tests subdirectory.
unit_test_cpp:
cd gigl-core && uv run cmake -S . -B build/tests -DGIGL_CORE_BUILD_TESTS=ON \
-DCMAKE_PREFIX_PATH=$$(uv run python -c "import sysconfig; print(sysconfig.get_paths()['purelib'])")
cd gigl-core && uv run cmake --build build/tests --parallel
cd gigl-core && uv run ctest --test-dir build/tests --output-on-failure

# Runs unit tests for Python and Scala
# Asserts Python and Scala files are formatted correctly.
# Asserts YAML configs can be parsed.
Expand All @@ -94,7 +111,8 @@ unit_test_scala: clean_build_files_scala
# Eventually, we should look into splitting these up.
# We run `make check_format` separately instead of as a dependent make rule so that it always runs after the actual testing.
# We don't want to fail the tests due to non-conformant formatting during development.
unit_test: precondition_tests unit_test_py unit_test_scala

unit_test: precondition_tests unit_test_py unit_test_scala unit_test_cpp

check_format_py:
uv run ruff check --config pyproject.toml ${PYTHON_DIRS}
Expand All @@ -108,7 +126,12 @@ check_format_md:
@echo "Checking markdown files..."
uv run mdformat --check ${MD_FILES}

check_format: check_format_py check_format_scala check_format_md
check_format_cpp:
clang-format-15 --dry-run --Werror --style=file $(CPP_SOURCES)

# Checks formatting only (clang-format, black, scalafmt, mdformat). Does NOT run
# clang-tidy static analysis — use `make check_lint_cpp` for that.
check_format: check_format_py check_format_cpp check_format_scala check_format_md

# Set PY_TEST_FILES=<TEST_FILE_NAME_GLOB> to test a specifc file.
# Ex. `make integration_test PY_TEST_FILES="dataflow_test.py"`
Expand Down Expand Up @@ -141,14 +164,42 @@ format_md:
@echo "Formatting markdown files..."
uv run mdformat ${MD_FILES}

format: format_py format_scala format_md
format_cpp:
clang-format-15 -i --style=file $(CPP_SOURCES)

format: format_py format_cpp format_scala format_md

type_check:
uv run mypy ${PYTHON_DIRS} --check-untyped-defs

lint_test: check_format assert_yaml_configs_parse
marco:
echo "polo"
touch marco

# scikit-build-core writes compile_commands.json into gigl-core/build/{wheel_tag}/
# during `uv sync` / `uv pip install -e ./gigl-core`. clang-tidy reads it directly.
# If the path is empty (gigl-core has never been built), `uv sync` populates it.
check_lint_cpp:
@test -n "$(CPP_COMPILE_COMMANDS_DIR)" || (echo "No gigl-core build dir found. Run 'uv sync' first."; exit 1)
clang-tidy-15 -p $(CPP_COMPILE_COMMANDS_DIR) $(CPP_SOURCES_NO_CUDA)

# Not part of `make format`: clang-tidy --fix rewrites logic (renames identifiers,
# changes expressions, adds/removes keywords), not just style. Run manually and
# review the diff before committing. Note: --fix cannot auto-repair every check;
# some violations require manual edits.
fix_lint_cpp:
@test -n "$(CPP_COMPILE_COMMANDS_DIR)" || (echo "No gigl-core build dir found. Run 'uv sync' first."; exit 1)
clang-tidy-15 --fix -p $(CPP_COMPILE_COMMANDS_DIR) $(CPP_SOURCES_NO_CUDA)

lint_test: check_format assert_yaml_configs_parse check_lint_cpp
@echo "Lint checks pass!"

# Wipe gigl-core's build cache. Use this if cmake's cached state becomes inconsistent
# after switching between branches with substantially different CMakeLists.txt structure.
clean_cpp:
rm -rf gigl-core/build
rm -f gigl-core/src/gigl_core/*.so

# compiles current working state of scala projects to local jars
compile_jars:
@echo "Compiling jars..."
Expand Down Expand Up @@ -311,7 +362,10 @@ clean_build_files_scala:
( cd scala; sbt clean; find . -type d -name "target" -prune -exec rm -rf {} \; )
( cd scala_spark35; sbt clean; find . -type d -name "target" -prune -exec rm -rf {} \; )

clean_build_files: clean_build_files_py clean_build_files_scala
clean_build_files_cpp:
rm -rf gigl-core/build

clean_build_files: clean_build_files_py clean_build_files_scala clean_build_files_cpp

# Call to generate new proto definitions if any of the .proto files have been changed.
# We intentionally rebuild *all* protos with one commmand as they should all be in sync.
Expand Down
11 changes: 7 additions & 4 deletions containers/Dockerfile.dataflow.src
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,17 @@ FROM $BASE_IMAGE
# Copy the source
WORKDIR /gigl

COPY MANIFEST.in MANIFEST.in
COPY pyproject.toml pyproject.toml
COPY uv.lock uv.lock
# Copy everything in one layer. The C++ extension lives in the separate `gigl-core`
# workspace member; `uv pip install .` resolves it from the workspace and builds it
# via scikit-build-core — no separate `make build_cpp_extensions` step needed.
COPY pyproject.toml uv.lock Makefile README.md ./
COPY gigl-core gigl-core
COPY gigl/dep_vars.env gigl/dep_vars.env
COPY deployment deployment
COPY gigl gigl
COPY snapchat snapchat
COPY tests tests
RUN uv pip install -e .

RUN uv pip install .

WORKDIR /
14 changes: 6 additions & 8 deletions containers/Dockerfile.src
Original file line number Diff line number Diff line change
@@ -1,22 +1,20 @@
ARG BASE_IMAGE
FROM $BASE_IMAGE

# Copy the source
WORKDIR /gigl


# Note: main package files must live in root of the repo for the python package to be built correctly for Dataflow workers.
# See https://beam.apache.org/documentation/sdks/python-pipxeline-dependencies/#create-reproducible-environments.
WORKDIR /gigl

COPY MANIFEST.in MANIFEST.in
COPY pyproject.toml pyproject.toml
COPY uv.lock uv.lock
# Copy everything in one layer. The C++ extension lives in the separate `gigl-core`
# workspace member; `uv pip install .` resolves it from the workspace and builds it
# via scikit-build-core — no separate `make build_cpp_extensions` step needed.
COPY pyproject.toml uv.lock Makefile README.md ./
COPY gigl-core gigl-core
COPY gigl/dep_vars.env gigl/dep_vars.env
COPY deployment deployment
COPY gigl gigl
COPY snapchat snapchat
COPY tests tests
COPY examples examples

RUN uv pip install -e .
RUN uv pip install .
Loading