pydantic-models-py/examples/run_validation_fixture.py
Version 354361d83247.bb1 · MIT. This preview displays packaged text and does not execute code. Treat the contents as untrusted instructions.
← Return to resource and package checksum
"""Reproduce a scoped, offline model experiment; no AI or HTTP calls. MIT."""
import datetime as dt
import hashlib
import json
from pathlib import Path
import platform
import sys
import types
import pydantic
from pydantic import ValidationError, ConfigDict
from api_contract import apply_patch
assert not sys.flags.optimize, 'Run with assertions enabled.'
root = Path(__file__).resolve().parent.parent
template = root/'assets/template.py'
raw = template.read_bytes()
assert hashlib.sha256(raw).hexdigest() == 'bc589a21973eeca69d8f0cf08bca4671af01dec0bac2c0f1738f445392104ab3'
rendered = raw.decode().replace('{{ResourceName}}', 'Project').replace('{{resource_name}}', 'project')
assert '{{' not in rendered
module = types.ModuleType('bb_synthetic_project_models')
sys.modules[module.__name__] = module
# The pinned template was manually inspected: imports and model declarations only.
exec(compile(rendered, '<pinned Microsoft template with named placeholders>', 'exec'), module.__dict__)
Create, Update, Response, InDB = module.ProjectCreate, module.ProjectUpdate, module.Project, module.ProjectInDB
class StrictCreate(Create):
model_config = ConfigDict(populate_by_name=True, extra='forbid')
cases = []
def observe(name, fn):
fn()
cases.append({'name':name, 'status':'passed'})
def rejects(fn, field, kind=None):
try:
fn()
except ValidationError as error:
errors = error.errors()
assert any(field in e['loc'] and (kind is None or e['type']==kind) for e in errors), errors
else:
raise AssertionError('Invalid input unexpectedly accepted: '+field)
def check(ok):
assert ok
existing = {'name':'Notes', 'description':'Keep this text', 'workspaceId':'synthetic-workspace'}
response_input = {**existing,'id':'synthetic-project','authorId':'synthetic-author','createdAt':dt.datetime(2026,1,1,tzinfo=dt.UTC)}
observe('create accepts documented camelCase workspace alias', lambda: check(Create.model_validate(existing).workspace_id=='synthetic-workspace'))
observe('create accepts configured Python field name', lambda: check(Create(name='Notes',workspace_id='synthetic-workspace').workspace_id=='synthetic-workspace'))
observe('creation requires workspace identity', lambda: rejects(lambda: Create(name='Notes'),'workspaceId','missing'))
observe('empty project name rejected', lambda: rejects(lambda: Create(name='',workspaceId='synthetic-workspace'),'name','string_too_short'))
observe('name longer than 200 rejected', lambda: rejects(lambda: Create(name='x'*201,workspaceId='synthetic-workspace'),'name','string_too_long'))
observe('description longer than 2000 rejected', lambda: rejects(lambda: Create(name='Notes',description='x'*2001,workspaceId='synthetic-workspace'),'description','string_too_long'))
observe('omitted update excludes default fields', lambda: check(Update().model_dump(exclude_unset=True)=={}))
observe('explicit null retained in update payload', lambda: check(Update(description=None).model_dump(exclude_unset=True)=={'description':None}))
observe('naive default dump contains unrelated null fields', lambda: check(Update(name='Renamed').model_dump()=={'name':'Renamed','description':None}))
observe('upstream default ignores unknown fields rather than rejecting', lambda: check(Update(name='Renamed',authorId='untrusted').model_dump(exclude_unset=True)=={'name':'Renamed'}))
observe('strict create rejects injected server-owned identity', lambda: rejects(lambda: StrictCreate(**existing,authorId='untrusted'),'authorId','extra_forbidden'))
observe('patch rejects changes to workspace identity', lambda: rejects(lambda: apply_patch(existing,{'workspaceId':'other'},Create),'workspaceId','extra_forbidden'))
observe('patch keeps omitted description', lambda: check(apply_patch(existing,{'name':'Renamed'},Create).description=='Keep this text'))
observe('patch deliberately clears explicit description null', lambda: check(apply_patch(existing,{'description':None},Create).description is None))
observe('merged contract rejects null for required name', lambda: rejects(lambda: apply_patch(existing,{'name':None},Create),'name','string_type'))
observe('response JSON serialization uses aliases and JSON-safe dates', lambda: check(json.loads(Response(**response_input).model_dump_json(by_alias=True))['createdAt']=='2026-01-01T00:00:00Z'))
def project_object():
obj=types.SimpleNamespace(name='Notes',description=None,id='synthetic-project',workspace_id='synthetic-workspace',author_id='synthetic-author',created_at=response_input['createdAt'],updated_at=None,password='synthetic-hidden-field')
result=Response.model_validate(obj).model_dump(mode='json',by_alias=True)
assert result['authorId']=='synthetic-author' and 'password' not in result
observe('attribute response projection omits undeclared synthetic field',project_object)
observe('database model supplies its documented discriminator',lambda: check(InDB(**response_input).doc_type=='project'))
def schema_contract():
schema=Create.model_json_schema(by_alias=True)
assert {'name','workspaceId'}.issubset(schema['required']) and schema['properties']['name']['maxLength']==200
observe('generated schema exposes required aliases and bounds',schema_contract)
report={'executed_at':dt.datetime.now(dt.UTC).isoformat(),'fixture':'Pinned Pydantic template and independent partial-update contract','observations':len(cases),'cases':cases,'python':platform.python_version(),'pydantic':pydantic.__version__,'platform':platform.system(),'native_template_executed':True,'runtime_tested':False,'ai_client_executed':False,'production_tested':False,'network_requests':False,'credentials_required':False,'paid_api_used':False,'source_hashes':{name:hashlib.sha256((root/name).read_bytes()).hexdigest() for name in ['assets/template.py','examples/api_contract.py','examples/run_validation_fixture.py']}}
(root/'examples/native-model-evidence.json').write_text(json.dumps(report,indent=2),encoding='utf-8',newline='\n')
print(json.dumps(report))