Add shapes tests and fix django-readers as core dependency

25 tests covering Shape, Diff, and NestedDiff:
- Shape metaclass: model resolution, field extraction, nested detection, spec/pair building
- Query: list, filter, nested relations, empty results, Pydantic serialization
- Diff (new): detects all fields as changed
- Diff (existing): no changes, single field, multiple fields, nonexistent ID
- Diff (nested): created, updated, deleted, combined, nonexistent relation

Fixes:
- django-readers moved from optional to core dependency
- Shape import lazy-loaded via __getattr__ (django_readers imports
  contenttypes which can't happen during apps.populate())
- Added Author, Book, Tag test models

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-31 02:16:36 -04:00
parent a726fd6863
commit 9516c05f75
4 changed files with 327 additions and 5 deletions

View File

@@ -38,3 +38,37 @@ class EmailUser(AbstractBaseUser, PermissionsMixin):
class Meta:
app_label = "tests"
# ─── Shape test models ──────────────────────────────────────────────────────
class Author(models.Model):
name = models.CharField(max_length=100)
bio = models.TextField(blank=True, default="")
class Meta:
app_label = "tests"
def __str__(self):
return self.name
class Book(models.Model):
title = models.CharField(max_length=200)
pages = models.IntegerField(default=0)
author = models.ForeignKey(Author, on_delete=models.CASCADE, related_name="books")
class Meta:
app_label = "tests"
def __str__(self):
return self.title
class Tag(models.Model):
name = models.CharField(max_length=50)
books = models.ManyToManyField(Book, related_name="tags", blank=True)
class Meta:
app_label = "tests"