Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
61 commits
Select commit Hold shift + click to select a range
c34a5b8
Merge remote-tracking branch 'origin/claude/add-file-column-type-LtXQ…
claude Dec 24, 2025
cab10f6
Add storage types redesign spec
claude Dec 25, 2025
261543f
Merge remote-tracking branch 'origin/pre/v2.0' into claude/upgrade-ad…
claude Dec 25, 2025
ecac82d
Update storage types spec with OAS integration approach
claude Dec 25, 2025
7e7f968
Unify external storage under OAS with content-addressed region
claude Dec 25, 2025
495d7f7
Make <djblob@store> and <attach@store> return values transparently
claude Dec 25, 2025
7ae8f15
Introduce layered storage architecture with content core type
claude Dec 25, 2025
6fcc4d3
Add parameterized AttributeTypes and content vs object comparison
claude Dec 25, 2025
b87342b
Make content storage per-project and add migration utility
claude Dec 25, 2025
40c1dbb
Add filepath as third OAS region with ObjectRef interface
claude Dec 25, 2025
dbf092d
Redesign filepath as URI reference tracker and add json core type
claude Dec 25, 2025
43c1999
Simplify filepath to filepath@store with relative paths for portability
claude Dec 25, 2025
b9b6e34
Simplify to two-layer architecture: database types + AttributeTypes
claude Dec 25, 2025
2a5d161
Add three-layer type architecture with core DataJoint types
claude Dec 25, 2025
d36739d
Use angle brackets for all AttributeTypes in definitions
claude Dec 25, 2025
5c1e854
Add implementation plan for storage types redesign
claude Dec 25, 2025
979f45b
Implement Phase 1: Core type system with store parameter support
claude Dec 25, 2025
6926c58
Remove legacy AttributeAdapter support, update tests for AttributeType
claude Dec 25, 2025
97bc162
Simplify core type system: remove SERIALIZED_TYPES, clarify blob sema…
claude Dec 25, 2025
2de222a
Simplify type system: only core types and AttributeTypes
claude Dec 25, 2025
f35e027
Define complete core type system with blob→longblob mapping
claude Dec 25, 2025
746108a
Implement Phase 2: Content-Addressed Storage
claude Dec 25, 2025
328a59a
Apply ruff-format to content_registry.py
claude Dec 25, 2025
bbbfbc3
Remove legacy compatibility shims: attribute_adapter.py, bypass_seria…
claude Dec 25, 2025
3c4608f
Update implementation plan to reflect actual implementation
claude Dec 25, 2025
70fb567
Move built-in AttributeTypes to separate builtin_types.py module
claude Dec 25, 2025
ad09877
Implement ObjectType for path-addressed storage
claude Dec 25, 2025
dd8c623
Remove migration phase from implementation plan
claude Dec 25, 2025
e1b3be1
Add staged insert documentation to implementation plan
claude Dec 25, 2025
ca0b914
Implement Phase 3: AttachType, XAttachType, FilepathType
claude Dec 25, 2025
d0f5614
Implement Phase 5 (GC) and Phase 6 (Tests)
claude Dec 25, 2025
73535de
Add object type garbage collection support
claude Dec 26, 2025
3fc00ee
Move EXTERNAL_TABLE_ROOT to external.py (deprecated)
claude Dec 26, 2025
b4512c9
Remove deprecated external.py module
claude Dec 26, 2025
c951ee5
Replace ClassProperty with metaclass properties
claude Dec 30, 2025
6d5b745
Simplify test infrastructure to use docker-compose services
dimitri-yatsenko Dec 31, 2025
4edf5ed
Fix table_name and uuid type resolution bugs
dimitri-yatsenko Dec 31, 2025
5aa191f
Use <djblob> for automatic serialization, fix is_blob detection
dimitri-yatsenko Dec 31, 2025
8140530
Fix settings tests and config loading
dimitri-yatsenko Dec 31, 2025
09d1f1d
Fix adapted_attributes tests for new type system
dimitri-yatsenko Dec 31, 2025
d51c16e
Fix test failures and update to new type system
dimitri-yatsenko Dec 31, 2025
eb70921
Cherry-pick AutoPopulate 2.0 spec and initial implementation
dimitri-yatsenko Jan 1, 2026
966694f
Drop jobs table when auto-populated table is dropped
claude Dec 23, 2025
a94ca3c
Add tests for Autopopulate 2.0 jobs system
claude Dec 23, 2025
72ebd2c
Fix ruff linting errors and reformat
claude Dec 23, 2025
979af3c
Remove legacy schema-wide jobs system
claude Dec 23, 2025
a1c9963
Rename jobs_v2.py to jobs.py
claude Dec 23, 2025
f8a7461
Improve jobs.py: use update1, djblob, cleaner f-string
claude Dec 23, 2025
d0b7469
Simplify reserve() to use update1
claude Dec 23, 2025
dfe42d6
Use update1 in complete() method
claude Dec 23, 2025
94778e9
Simplify: use self.proj() for jobs table projections
claude Dec 23, 2025
e46b9ec
Simplify ignore(): only insert new records, cannot convert existing
claude Dec 23, 2025
01b3e7c
Use insert1 in _insert_job_with_status instead of explicit SQL
claude Dec 23, 2025
69118c7
Remove AutoPopulate._job_key - no longer needed
claude Dec 23, 2025
afd497a
Remove AutoPopulate.target property
claude Dec 23, 2025
d39a28a
Remove legacy _make_tuples callback support - use self.make exclusively
claude Dec 23, 2025
c94beb0
Eliminate _jobs_to_do method
claude Dec 23, 2025
5ac1bb9
Simplify jobs variable usage in populate()
claude Dec 23, 2025
8f55d01
Inline _get_pending_jobs into populate()
claude Dec 23, 2025
fb311ea
Remove order parameter and consolidate limit/max_calls
claude Dec 23, 2025
b14e536
Fix integration issues after AutoPopulate 2.0 rebase
dimitri-yatsenko Jan 1, 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: 4 additions & 5 deletions .devcontainer/devcontainer.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
{
"image": "mcr.microsoft.com/devcontainers/typescript-node:0-18",
"features": {
"ghcr.io/devcontainers/features/docker-in-docker:2": {}
},
"dockerComposeFile": ["../docker-compose.yaml", "docker-compose.yml"],
"service": "app",
"workspaceFolder": "/src",
"postCreateCommand": "curl -fsSL https://pixi.sh/install.sh | bash && echo 'export PATH=\"$HOME/.pixi/bin:$PATH\"' >> ~/.bashrc"
}
}
24 changes: 4 additions & 20 deletions .devcontainer/docker-compose.yml
Original file line number Diff line number Diff line change
@@ -1,30 +1,14 @@
# Devcontainer overrides for the app service from ../docker-compose.yaml
# Inherits db and minio services automatically
services:
# Update this to the name of the service you want to work with in your docker-compose.yml file
app:
# Uncomment if you want to override the service's Dockerfile to one in the .devcontainer
# folder. Note that the path of the Dockerfile and context is relative to the *primary*
# docker-compose.yml file (the first in the devcontainer.json "dockerComposeFile"
# array). The sample below assumes your primary file is in the root of your project.
container_name: datajoint-python-devcontainer
image: datajoint/datajoint-python-devcontainer:${PY_VER:-3.11}-${DISTRO:-bookworm}
build:
context: .
context: ..
dockerfile: .devcontainer/Dockerfile
args:
- PY_VER=${PY_VER:-3.11}
- DISTRO=${DISTRO:-bookworm}

volumes:
# Update this to wherever you want VS Code to mount the folder of your project
- ..:/workspaces:cached

# Uncomment the next four lines if you will use a ptrace-based debugger like C++, Go, and Rust.
# cap_add:
# - SYS_PTRACE
# security_opt:
# - seccomp:unconfined

user: root

# Overrides default command so things don't shut down after the process ends.
# Keep container running for devcontainer
command: /bin/sh -c "while sleep 1000; do :; done"
63 changes: 63 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -141,3 +141,66 @@ DataJoint (<https://datajoint.com>).
- [Contribution Guidelines](https://docs.datajoint.com/about/contribute/)

- [Developer Guide](https://docs.datajoint.com/core/datajoint-python/latest/develop/)

## Developer Guide

### Prerequisites

- [Docker](https://docs.docker.com/get-docker/) for running MySQL and MinIO services
- [pixi](https://prefix.dev/docs/pixi/overview) package manager (or pip/conda)

### Setting Up the Development Environment

1. Clone the repository and install dependencies:

```bash
git clone https://github.com/datajoint/datajoint-python.git
cd datajoint-python
pixi install
```

2. Start the required services (MySQL and MinIO):

```bash
docker compose up -d db minio
```

### Running Tests

Run tests with pytest using the test environment:

```bash
DJ_HOST=localhost DJ_PORT=3306 S3_ENDPOINT=localhost:9000 python -m pytest tests/
```

Or run specific test files:

```bash
DJ_HOST=localhost DJ_PORT=3306 S3_ENDPOINT=localhost:9000 python -m pytest tests/test_blob.py -v
```

### Running Pre-commit Checks

Pre-commit hooks ensure code quality before commits. Install and run them:

```bash
# Install pre-commit hooks
pre-commit install

# Run all pre-commit checks manually
pre-commit run --all-files

# Run specific hooks
pre-commit run ruff --all-files
pre-commit run mypy --all-files
```

### Environment Variables

| Variable | Default | Description |
|----------|---------|-------------|
| `DJ_HOST` | `localhost` | MySQL server hostname |
| `DJ_PORT` | `3306` | MySQL server port |
| `DJ_USER` | `datajoint` | MySQL username |
| `DJ_PASS` | `datajoint` | MySQL password |
| `S3_ENDPOINT` | `localhost:9000` | MinIO/S3 endpoint |
18 changes: 7 additions & 11 deletions docker-compose.yaml
Original file line number Diff line number Diff line change
@@ -1,15 +1,14 @@
# Development environment with MySQL and MinIO services
# To run tests: pytest --cov-report term-missing --cov=datajoint tests
# Start services: docker-compose up -d db minio
# Run tests: pixi run test
services:
db:
image: datajoint/mysql:${MYSQL_VER:-8.0}
environment:
- MYSQL_ROOT_PASSWORD=${DJ_PASS:-password}
command: mysqld --default-authentication-plugin=mysql_native_password
# ports:
# - "3306:3306"
# volumes:
# - ./mysql/data:/var/lib/mysql
ports:
- "3306:3306"
healthcheck:
test: [ "CMD", "mysqladmin", "ping", "-h", "localhost" ]
timeout: 30s
Expand All @@ -20,18 +19,15 @@ services:
environment:
- MINIO_ACCESS_KEY=datajoint
- MINIO_SECRET_KEY=datajoint
# ports:
# - "9000:9000"
# volumes:
# - ./minio/config:/root/.minio
# - ./minio/data:/data
ports:
- "9000:9000"
command: server --address ":9000" /data
healthcheck:
test:
- "CMD"
- "curl"
- "--fail"
- "http://minio:9000/minio/health/live"
- "http://localhost:9000/minio/health/live"
timeout: 30s
retries: 5
interval: 15s
Expand Down
Loading