Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
90 commits
Select commit Hold shift + click to select a range
158933c
centralize config I/O in core.config
deruyter92 Jan 29, 2026
833fd26
add pytests for core config I/O and generalized_data_converter
deruyter92 Jan 29, 2026
4db28fd
Apply review suggestions (import core_config and os -> pathlib)
deruyter92 Jan 30, 2026
c0f296b
Update tests/pose_estimation_pytorch/modelzoo/test_generalized_data_c…
deruyter92 Jan 30, 2026
a972ed1
modelzoo materialize.py: fix typos corner2move2
deruyter92 Feb 2, 2026
c36e43e
additional tests for core config
deruyter92 Feb 3, 2026
dd41bc6
auxilliary functions: apply formatting
deruyter92 Feb 3, 2026
b17d385
add pytorch base config mixin
deruyter92 Jan 26, 2026
f8b0449
add tests for ConfigMixin
deruyter92 Jan 29, 2026
34cfeef
feat: add structured configuration classes for pose estimation
arashsm79 Jan 9, 2026
9fc40fe
Simplify changes (only add typed configs)
deruyter92 Jan 30, 2026
9804163
Add typed ProjectConfig as pydantic dataclass
deruyter92 Jan 29, 2026
bbb43a9
add pytorch configs as pydantic dataclasses
deruyter92 Jan 26, 2026
9667da5
copilot suggestions (return transforms, default MultthreadingConfig, …
deruyter92 Jan 30, 2026
341d80e
fix transforms return value at validation
deruyter92 Feb 2, 2026
090d0b1
add comments in yaml using CommentedMap
deruyter92 Feb 2, 2026
acb2ce3
Fix skip decorator pytests
deruyter92 Feb 4, 2026
05d72fd
fix missing typing_extensions on python 3.10
deruyter92 Feb 4, 2026
d1330b0
fix None-type handling in update_config_by_dotpath
deruyter92 Feb 5, 2026
b70c523
Replace config in loaders with new DictConfig
deruyter92 Jan 30, 2026
5c8d493
isolate old config logic in `make_pose_confg` and replace with Pose…
deruyter92 Feb 2, 2026
da29ce5
update core config loaders in utils.py
deruyter92 Feb 3, 2026
2db7c55
update tests to reflect changes in behaviour
deruyter92 Feb 3, 2026
e706a83
apply review suggestions: comments, warnings and wrong type
deruyter92 Feb 4, 2026
dc47fcb
add deprecated argument sentinel class
deruyter92 Feb 4, 2026
cb05ccc
improve `test_read_config_preserves_existing_engine_and_project_path`
deruyter92 Feb 4, 2026
2ece608
Update `read_config` and `ConfigMixin`: Add empty field handling for…
deruyter92 Feb 5, 2026
35cf23d
Update ConfigMixin: normalize paths/enums for serialization
deruyter92 Feb 5, 2026
692b080
update make_pose_config: replace write_config with PoseConfig.to_yaml
deruyter92 Feb 5, 2026
573d3ff
update ProjectConfig: pathlib Path instead of str
deruyter92 Feb 5, 2026
1207088
fix intermediate head_cfg container in build PoseModel
deruyter92 Feb 5, 2026
d0c0320
fix ProjectConfig list[int] type for corner2move2 field
deruyter92 Feb 5, 2026
00e2b77
fix omegaconf.select (`default` -> keyword argument)
deruyter92 Feb 5, 2026
6ad8478
docs: merge changes from main
deruyter92 Feb 18, 2026
1d6debe
YAML I/O - add centralized, safe ruamel YAML loader and dumper with P…
deruyter92 Feb 5, 2026
271217d
YAML I/O - add yaml representers for DictConfig and ListConfig
deruyter92 Feb 13, 2026
86b5a29
YAML I/O - merge ruamel fix from main (in centralized yaml dumper)
deruyter92 Feb 18, 2026
38b2b7d
CFG UPDATE - strict init for PoseConfig and ProjectConfig (forbid ext…
deruyter92 Feb 18, 2026
ae1defe
CFG UPDATE - Add TestConfig for pytorch pose_cfg.yaml
deruyter92 Feb 18, 2026
dfa8359
CFG UPDATE - update project config adjust `project_path` when loading…
deruyter92 Feb 6, 2026
a1bac9e
CFG UPDATE - Add default individual in ProjectConfig (required in the…
deruyter92 Feb 6, 2026
8ee14fb
CFG UPDATE - update PoseConfig NetTypes missing cspnext models
deruyter92 Feb 6, 2026
0bce7e7
CFG UPDATE - fix WeightInitialization snapshot path -> None or pathli…
deruyter92 Feb 18, 2026
fb1f073
CFG UPDATE - Add missing (ambiguous) with_identity field
deruyter92 Feb 18, 2026
02b97b8
CFG UPDATE - Fix mismatching bodyparts fields in metadata and proj. c…
deruyter92 Feb 16, 2026
926d4e5
CFG UPDATE - add field 'device' to RunnerConfig (used in testscripts …
deruyter92 Feb 17, 2026
712f0d5
CFG UPDATE - Fix GenSamplingConfig & PoseDatasetParameters: resolve a…
deruyter92 Feb 17, 2026
544071e
CFG UPDATE - update TrainsettingsConfig: allow WeightInitialization None
deruyter92 Feb 13, 2026
c0703c3
CFG UPDATE - fix make_pose_config initialization from defaults
deruyter92 Feb 18, 2026
d8658cd
TYPE CONVERSION - Add typed -> plain config conversion decorator
deruyter92 Feb 17, 2026
f61d1ae
TYPE CONVERSION - convert to plain dict / list where necesary (OmegaC…
deruyter92 Feb 16, 2026
b93fc32
TYPE CONVERSION - Add TODO comments: mark unvalidated config updates
deruyter92 Feb 17, 2026
5f0ff03
TYPE CONVERSION - update make_pose_config & Loader: dict-updates BEFO…
deruyter92 Feb 17, 2026
494ea49
TYPE CONVERSION - Fix + MARK instance checks for ListConfig and DictC…
deruyter92 Feb 13, 2026
133d8d4
TYPE CONVERSION - fix unsupported operand type(s) for *: 'int' and 'L…
deruyter92 Feb 6, 2026
673834a
TYPE CONVERSION - Update test_video_set_configuration: assert isinsta…
deruyter92 Feb 16, 2026
fac952d
TYPE CONVERSION - update paf_predictor: convert np.int64 to native in…
deruyter92 Feb 16, 2026
583512e
NONE HANDLING - fix omegaconf.select default crop_cfg in loaders (not…
deruyter92 Feb 6, 2026
55e032b
NONE HANDLING - Add None-safe get methods for configs that are allowe…
deruyter92 Feb 16, 2026
22734d6
FIX TESTS - fix testscript invalid config: only add detector updates …
deruyter92 Feb 18, 2026
b2cbefe
docs: merge changes from main
deruyter92 Feb 18, 2026
e767890
YAML I/O - Add post_yaml_load_updates hook for ConfigMixin
deruyter92 Feb 19, 2026
bdfd241
C3-II Additional refactoring of YAML I/O, Config schemas, and DictCon…
deruyter92 Feb 20, 2026
a55af9d
VERSIONING - Add config versioning and migration system
deruyter92 Jan 30, 2026
573d409
VERSIONING - add tests for versioning and migrationmixin
deruyter92 Jan 30, 2026
21a416f
VERSIONING - Add sequential step-wise migration chain
deruyter92 Feb 16, 2026
f881b21
VERSIONING - fix leaking toy migration
deruyter92 Feb 16, 2026
40d2d1a
VERSIONING - add duplicate migration guard and eliminate redundant co…
deruyter92 Feb 16, 2026
45d5eae
VERSIONING - adress invalid version numbers
deruyter92 Feb 16, 2026
1ea562d
VERSIONING - move MigrationMixin to versioning
deruyter92 Feb 16, 2026
60ab6a3
VERSIONING - increase test coverage for config migration
deruyter92 Feb 16, 2026
16a5387
VERSIONING - Add extensive logging for config migrations.
deruyter92 Feb 16, 2026
7939c8a
VERSIONING - fix import Self (typing_extensions, for python 3.10)
deruyter92 Feb 17, 2026
6aa4b72
VERSIONING - Validate assignment for ProjectConfig and PoseConfig (+ …
deruyter92 Feb 20, 2026
538bb37
VERSIONING - Update MigrationMixin migrate BEFORE validation (works w…
deruyter92 Feb 20, 2026
62d98ee
FIX TESTS - Update test core config string coercion to path
deruyter92 Feb 20, 2026
e415df6
merge C4 - Add config migration system
deruyter92 Feb 20, 2026
fe2190f
TYPED CFG - Update ConfigMixin: Add dict-like functionality for Confi…
deruyter92 Feb 16, 2026
9ac68dd
TYPED CFG - update tests for ConfigMixin
deruyter92 Feb 16, 2026
88baeb3
TYPED CFG - Remove OmegaConf DictConfig -> typed ConfigMixin
deruyter92 Feb 16, 2026
091f645
CHANGETRACKING - Add ChangeTracking mixin
deruyter92 Feb 20, 2026
18cd431
CHANGETRACKING - update utils using the new TrackChanges mixin
deruyter92 Feb 20, 2026
94b3616
CHANGETRACKING - fix bypass pydantic validation for ChangeTrackingMix…
deruyter92 Feb 20, 2026
45c7fc7
DOWNST REFACTOR - remove ad-hoc config manipulation in _build_detector
deruyter92 Feb 20, 2026
f35f4c4
DOWNST REFACTOR - str concatenation -> pathlib Path
deruyter92 Feb 20, 2026
123ac76
Merge C5 - Fully typed configs: remove OmegaConf DictConfig
deruyter92 Feb 20, 2026
1bf1b17
DOWNST REFACTOR - fix more str concatenations -> pathlib Path
deruyter92 Feb 20, 2026
253f15b
Update ConfigMixin: add aliasing system (#3211)
deruyter92 Jun 1, 2026
f4c6bce
Merge main (version 3.0)
deruyter92 Jun 1, 2026
65c4c22
linting
deruyter92 Jun 1, 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
  •  
  •  
  •  
71 changes: 60 additions & 11 deletions .circleci/config.yml
Original file line number Diff line number Diff line change
@@ -1,24 +1,73 @@
version: 2.1

orbs:
python: circleci/python@0.2.1
python: circleci/python@4.0.0

jobs:
build-and-test:
working_directory: ~/circleci-demo-python-django
docker:
- image: circleci/python:3.10 # primary container for the build job
auth:
username: mydockerhub-user
password: $DOCKERHUB_PASSWORD # context / project UI env-var reference
executor:
name: python/default
tag: '3.10' # or '3.12'
environment:
# HuggingFace: disable xet and use cache directory
# NOTE @deruyter92 2026-05-07: "xet" opens many simultaneous connections
# to different data chunks. Currently doesn't work well with CircleCI.
# See: https://github.com/huggingface/xet-core/issues/800
HF_HUB_DISABLE_XET: 1
HF_HOME: ~/.cache/huggingface

steps:
- checkout
- python/load-cache
- python/install-deps
- python/save-cache

# Restore uv cache
- restore_cache:
name: Restore uv cache
keys:
- v2-uv-pip-{{ checksum "pyproject.toml" }}
- v2-uv-pip-

# Restore HuggingFace weights cache
- restore_cache:
name: Restore Hugging Face cache
keys:
- hf-weights-v1-{{ checksum "pyproject.toml" }}
- hf-weights-v1-

# Install uv
- run:
name: Install uv
command: |
pip install uv

# Install DeepLabCut runtime deps only
- run:
name: Install DeepLabCut runtime deps only
command: |
uv pip install --system -e .

# (Optional) Trim the cache for CI so uploads stay small and fast
- run:
name: Prune uv cache for CI
command: uv cache prune --ci || true

# Save the uv cache for next runs
- save_cache:
name: Save uv cache
key: v2-uv-pip-{{ checksum "pyproject.toml" }}
paths:
- ~/.cache/uv

# Test DLC
- run:
command: python testscript_cli.py
name: TestDLC
command: python testscript_cli.py

# Save the HF weights cache for next runs
- save_cache:
name: Save huggingface cache
key: hf-weights-v1-{{ checksum "pyproject.toml" }}
paths:
- ~/.cache/huggingface

workflows:
main:
Expand Down
2 changes: 1 addition & 1 deletion .github/ISSUE_TEMPLATE/bug_report.yml
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ body:
attributes:
label: DeepLabCut version
description: What version of DLC are you using? Please check with `import deeplabcut`, `deeplabcut.__version__`
placeholder: 3.0.0rc9
placeholder: 3.0.0
validations:
required: true
- type: dropdown
Expand Down
51 changes: 51 additions & 0 deletions .github/workflows/build-book.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
name: Build (and optionally deploy) Jupyter Book

on:
workflow_call:
inputs:
python-version:
description: "Python version used to build the docs."
required: false
default: "3.10"
type: string
build_dir:
required: false
default: "./_build/html"
type: string
upload_artifact:
description: "If true, upload the built site as an artifact."
required: false
default: false
type: boolean



jobs:
build:
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- uses: actions/checkout@v6

- name: Set up Python
uses: actions/setup-python@v6
with:
python-version: ${{ inputs.python-version }}

- name: Install docs dependencies
run: |
python -m pip install --upgrade pip
python -m pip install .[docs]

- name: Build the book
run: jupyter-book build .

- name: Upload built site artifact
if: ${{ inputs.upload_artifact }}
uses: actions/upload-artifact@v6
with:
name: built-book
path: ${{ inputs.build_dir }}
if-no-files-found: error
retention-days: 1
5 changes: 3 additions & 2 deletions .github/workflows/codespell.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@ on:
push:
branches: [main]
pull_request:
branches: [main]
types: [opened, synchronize, reopened]
branches: [ main ]

jobs:
codespell:
Expand All @@ -14,7 +15,7 @@ jobs:

steps:
- name: Checkout
uses: actions/checkout@v3
uses: actions/checkout@v6
- name: Annotate locations with typos
uses: codespell-project/codespell-problem-matcher@v1
- name: Codespell
Expand Down
59 changes: 59 additions & 0 deletions .github/workflows/docs_and_notebooks_checks.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
name: Docs & notebooks freshness and formatting checks

on:
pull_request:
branches: [main]
push:
branches: [main]

permissions:
contents: read

jobs:
staleness:
name: Docs and notebooks scan (read-only)
runs-on: ubuntu-latest
timeout-minutes: 5

steps:
- name: Checkout repository (full history for git dates)
uses: actions/checkout@v6
with:
fetch-depth: 0

- name: Set up Python
uses: actions/setup-python@v6
with:
python-version: "3.12"

- name: Install staleness tool dependencies
run: |
python -m pip install --upgrade pip
python -m pip install "pydantic>=2,<3" pyyaml "nbformat>=5"

- name: Run staleness report (read-only)
run: |
python tools/docs_and_notebooks_check.py \
--config tools/docs_and_notebooks_report_config.yml \
--out-dir tmp/docs_nb_checks \
report


# Optional: run check mode (will fail only once you populate allowlists in config)
- name: Run staleness policy check (optional gate)
continue-on-error: true
run: |
python tools/docs_and_notebooks_check.py \
--config tools/docs_and_notebooks_report_config.yml \
--out-dir tmp/docs_nb_checks \
--no-step-summary \
check

- name: Upload staleness artifacts
uses: actions/upload-artifact@v4
with:
name: staleness-report
path: |
tmp/docs_nb_checks/*.json
tmp/docs_nb_checks/*.md
if-no-files-found: error
119 changes: 119 additions & 0 deletions .github/workflows/format.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
name: pre-commit (PR only on changed files)

on:
pull_request:
types: [opened, synchronize, reopened]

permissions:
contents: read

jobs:
detect_changes:
runs-on: ubuntu-latest
outputs:
changed: ${{ steps.changed_files.outputs.changed }}
changed_python: ${{ steps.changed_python.outputs.changed_python }}

steps:
- name: Checkout full history
uses: actions/checkout@v6
with:
fetch-depth: 0
persist-credentials: false

- name: Detect changed files
id: changed_files
run: |
git fetch origin ${{ github.base_ref }}
CHANGED_FILES=$(git diff --name-only origin/${{ github.base_ref }}...HEAD)

{
echo "changed<<EOF"
echo "$CHANGED_FILES"
echo "EOF"
} >> "$GITHUB_OUTPUT"

- name: Detect changed Python files
id: changed_python
run: |
git fetch origin ${{ github.base_ref }}
CHANGED_PYTHON=$(git diff --name-only origin/${{ github.base_ref }}...HEAD | grep -E '\.(py|pyi|ipynb)$' || true)

{
echo "changed_python<<EOF"
echo "$CHANGED_PYTHON"
echo "EOF"
} >> "$GITHUB_OUTPUT"

- name: Show changed files
run: |
echo "Changed files:"
echo "${{ steps.changed_files.outputs.changed }}"

echo
echo "Changed Python files:"
echo "${{ steps.changed_python.outputs.changed_python }}"

precommit:
needs: detect_changes
runs-on: ubuntu-latest
if: ${{ needs.detect_changes.outputs.changed != '' }}

steps:
- name: Checkout PR branch
uses: actions/checkout@v6
with:
fetch-depth: 0

- name: Set up Python
uses: actions/setup-python@v6
with:
python-version: "3.12"

- name: Install tooling
run: pip install pre-commit ruff

- name: Run pre-commit (CI check-only stage) on changed files
id: precommit_run
continue-on-error: true
env:
CHANGED_FILES: ${{ needs.detect_changes.outputs.changed }}
run: |
mapfile -t files <<< "$CHANGED_FILES"
pre-commit run --hook-stage manual --files "${files[@]}" --show-diff-on-failure

- name: Generate Ruff Markdown report
id: ruff_report
if: ${{ always() && needs.detect_changes.outputs.changed_python != '' }}
env:
CHANGED_PYTHON: ${{ needs.detect_changes.outputs.changed_python }}
run: |
mkdir -p tmp
mapfile -t pyfiles <<< "$CHANGED_PYTHON"
python tools/ruff_report.py "${pyfiles[@]}" --output tmp/ruff-report.md

- name: Add short Ruff report to GitHub Actions summary
if: ${{ always() && steps.precommit_run.outcome == 'failure' && needs.detect_changes.outputs.changed_python != '' }}
run: |
{
echo "# Lint summary"
echo
echo "## Ruff report (top section)"
echo
sed -n '1,80p' tmp/ruff-report.md
echo
echo "_Full report uploaded as workflow artifact: `ruff-report`_"
} >> "$GITHUB_STEP_SUMMARY"

- name: Upload Ruff report artifact
if: ${{ always() && needs.detect_changes.outputs.changed_python != '' }}
uses: actions/upload-artifact@v6
with:
name: ruff-report
path: tmp/ruff-report.md

- name: Fail job if pre-commit failed
if: ${{ steps.precommit_run.outcome == 'failure' }}
run: |
echo "pre-commit reported failures"
exit 1
Loading