Latest Threat Research:SANDWORM_MODE: Shai-Hulud-Style npm Worm Hijacks CI Workflows and Poisons AI Toolchains.Details
Socket
Book a DemoSign in
Socket

erdantic

Package Overview
Dependencies
Maintainers
1
Versions
27
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

erdantic - pypi Package Compare versions

Comparing version
1.2.0
to
1.2.1
+52
AGENTS.md
# AGENTS.md
## Interaction Contract
- For questions, planning, tradeoff analysis, or brainstorming: do not edit files and do not run modifying commands. Read-only commands are allowed.
- In those cases, respond with analysis, options, or a plan only.
- Implement only when the user gives an explicit execution instruction (`implement`, `apply`, `proceed`, or equivalent).
- If intent is ambiguous, ask one short clarification question.
- Never infer implementation intent from context alone.
- Silence is not consent to edit code.
## Working Style
- Make minimal, focused diffs.
- Do not modify unrelated files.
- Avoid broad refactors unless requested.
## Project Map
- Library code: `erdantic/`
- Plugins: `erdantic/plugins/`
- CLI: `erdantic/cli.py`
- Tests: `tests/`
- Static test assets: `tests/assets/`
- Asset generators: `tests/scripts/generate_static_assets.py`, `tests/scripts/generate_pydantic_with_defaults_assets.py`
## Commands
- Use `pixi run` or `just` for project commands; avoid direct `python`/`python3`/`pytest`/`ruff`/`mypy` unless explicitly requested.
- Setup/sync: `just sync`
- Lint: `just lint`
- Format: `just format`
- Typecheck: `just typecheck`
- Tests (default py3.13): `just test`
- Tests (specific Python): `just python=3.12 test`
- Full matrix: `just test-all`
- Test commands accept pytest args, e.g.:
- `just test tests/test_against_assets.py -k pydantic`
- `just test-all tests/test_against_assets.py`
## Testing Expectations
- Behavior changes must include or update tests.
- If expected rendered outputs change, ask for user permission before running `just generate-static-assets`.
- Review `tests/assets/` diffs carefully.
- Prefer targeted test runs while iterating, then run the relevant broader suite.
## Notes
- Graphviz/PyGraphviz is required. Pixi activation automatically runs `scripts/fix_graphviz.sh`.
- Python-version differences matter (`3.9` through `3.14`).
- Some tests validate generated artifacts, not just runtime behavior.
#!/usr/bin/env bash
set -euo pipefail
# Generate Graphviz plugin config files if missing
# Needed for graphviz conda-forge feedstock for osx-arm64
# https://github.com/conda-forge/graphviz-feedstock/issues/152
compgen -G "$CONDA_PREFIX/lib/graphviz/config*" > /dev/null \
|| dot -c \
|| true

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

{
"models": {
"erdantic.examples.attrs.Adventurer": {
"full_name": {
"module": "erdantic.examples.attrs",
"qual_name": "Adventurer"
},
"name": "Adventurer",
"fields": {
"name": {
"model_full_name": {
"module": "erdantic.examples.attrs",
"qual_name": "Adventurer"
},
"name": "name",
"type_name": "str"
},
"profession": {
"model_full_name": {
"module": "erdantic.examples.attrs",
"qual_name": "Adventurer"
},
"name": "profession",
"type_name": "str"
},
"alignment": {
"model_full_name": {
"module": "erdantic.examples.attrs",
"qual_name": "Adventurer"
},
"name": "alignment",
"type_name": "Alignment"
},
"level": {
"model_full_name": {
"module": "erdantic.examples.attrs",
"qual_name": "Adventurer"
},
"name": "level",
"type_name": "int"
}
},
"description": "erdantic.examples.attrs.Adventurer\n\nA person often late for dinner but with a tale or two to tell.\n\nAttributes:\n name (str): Name of this adventurer\n profession (str): Profession of this adventurer\n level (int): Level of this adventurer\n alignment (Alignment): Alignment of this adventurer\n"
},
"erdantic.examples.attrs.Party": {
"full_name": {
"module": "erdantic.examples.attrs",
"qual_name": "Party"
},
"name": "Party",
"fields": {
"name": {
"model_full_name": {
"module": "erdantic.examples.attrs",
"qual_name": "Party"
},
"name": "name",
"type_name": "str"
},
"formed_datetime": {
"model_full_name": {
"module": "erdantic.examples.attrs",
"qual_name": "Party"
},
"name": "formed_datetime",
"type_name": "datetime"
},
"members": {
"model_full_name": {
"module": "erdantic.examples.attrs",
"qual_name": "Party"
},
"name": "members",
"type_name": "list[Adventurer]"
},
"active_quest": {
"model_full_name": {
"module": "erdantic.examples.attrs",
"qual_name": "Party"
},
"name": "active_quest",
"type_name": "Quest | None"
}
},
"description": "erdantic.examples.attrs.Party\n\nA group of adventurers finding themselves doing and saying things altogether unexpected.\n\nAttributes:\n name (str): Name that party is known by\n formed_datetime (datetime): Timestamp of when the party was formed\n members (list[Adventurer]): Adventurers that belong to this party\n active_quest (Optional[Quest]): Current quest that party is actively tackling\n"
},
"erdantic.examples.attrs.Quest": {
"full_name": {
"module": "erdantic.examples.attrs",
"qual_name": "Quest"
},
"name": "Quest",
"fields": {
"name": {
"model_full_name": {
"module": "erdantic.examples.attrs",
"qual_name": "Quest"
},
"name": "name",
"type_name": "str"
},
"giver": {
"model_full_name": {
"module": "erdantic.examples.attrs",
"qual_name": "Quest"
},
"name": "giver",
"type_name": "QuestGiver"
},
"reward_gold": {
"model_full_name": {
"module": "erdantic.examples.attrs",
"qual_name": "Quest"
},
"name": "reward_gold",
"type_name": "int"
}
},
"description": "erdantic.examples.attrs.Quest\n\nA task to complete, with some monetary reward.\n\nAttributes:\n name (str): Name by which this quest is referred to\n giver (QuestGiver): Person who offered the quest\n reward_gold (int): Amount of gold to be rewarded for quest completion\n"
},
"erdantic.examples.attrs.QuestGiver": {
"full_name": {
"module": "erdantic.examples.attrs",
"qual_name": "QuestGiver"
},
"name": "QuestGiver",
"fields": {
"name": {
"model_full_name": {
"module": "erdantic.examples.attrs",
"qual_name": "QuestGiver"
},
"name": "name",
"type_name": "str"
},
"faction": {
"model_full_name": {
"module": "erdantic.examples.attrs",
"qual_name": "QuestGiver"
},
"name": "faction",
"type_name": "str | None"
},
"location": {
"model_full_name": {
"module": "erdantic.examples.attrs",
"qual_name": "QuestGiver"
},
"name": "location",
"type_name": "str"
}
},
"description": "erdantic.examples.attrs.QuestGiver\n\nA person who offers a task that needs completing.\n\nAttributes:\n name (str): Name of this quest giver\n faction (str): Faction that this quest giver belongs to\n location (str): Location this quest giver can be found\n"
}
},
"edges": {
"erdantic.examples.attrs.Party-active_quest-erdantic.examples.attrs.Quest": {
"source_model_full_name": {
"module": "erdantic.examples.attrs",
"qual_name": "Party"
},
"source_field_name": "active_quest",
"target_model_full_name": {
"module": "erdantic.examples.attrs",
"qual_name": "Quest"
},
"target_cardinality": "one",
"target_modality": "zero",
"source_cardinality": "unspecified",
"source_modality": "unspecified"
},
"erdantic.examples.attrs.Party-members-erdantic.examples.attrs.Adventurer": {
"source_model_full_name": {
"module": "erdantic.examples.attrs",
"qual_name": "Party"
},
"source_field_name": "members",
"target_model_full_name": {
"module": "erdantic.examples.attrs",
"qual_name": "Adventurer"
},
"target_cardinality": "many",
"target_modality": "unspecified",
"source_cardinality": "unspecified",
"source_modality": "unspecified"
},
"erdantic.examples.attrs.Quest-giver-erdantic.examples.attrs.QuestGiver": {
"source_model_full_name": {
"module": "erdantic.examples.attrs",
"qual_name": "Quest"
},
"source_field_name": "giver",
"target_model_full_name": {
"module": "erdantic.examples.attrs",
"qual_name": "QuestGiver"
},
"target_cardinality": "one",
"target_modality": "one",
"source_cardinality": "unspecified",
"source_modality": "unspecified"
}
}
}

Sorry, the diff of this file is not supported yet

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 12.2.1 (0)
-->
<!-- Title: Entity Relationship Diagram created by erdantic Pages: 1 -->
<svg width="668pt" height="314pt"
viewBox="0.00 0.00 668.00 313.75" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 309.75)">
<title>Entity Relationship Diagram created by erdantic</title>
<polygon fill="white" stroke="none" points="-4,4 -4,-309.75 664,-309.75 664,4 -4,4"/>
<text text-anchor="middle" x="330" y="-5.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="9.00" fill="#a8a8a8">Created by erdantic vTEST &lt;https://github.com/drivendataorg/erdantic&gt;</text>
<!-- erdantic.examples.attrs.Adventurer -->
<g id="node1" class="node">
<title>erdantic.examples.attrs.Adventurer</title>
<g id="a_node1"><a xlink:title="erdantic.examples.attrs.Adventurer&#10;&#10;A person often late for dinner but with a tale or two to tell.&#10;&#10;Attributes:&#10; &#160;&#160;&#160;name (str): Name of this adventurer&#10; &#160;&#160;&#160;profession (str): Profession of this adventurer&#10; &#160;&#160;&#160;level (int): Level of this adventurer&#10; &#160;&#160;&#160;alignment (Alignment): Alignment of this adventurer&#10;">
<polygon fill="none" stroke="black" points="308.62,-279.25 308.62,-301.75 435.38,-301.75 435.38,-279.25 308.62,-279.25"/>
<text text-anchor="start" x="338.25" y="-286.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-weight="bold" font-size="14.00">Adventurer</text>
<polygon fill="none" stroke="black" points="308.62,-256.75 308.62,-279.25 370.88,-279.25 370.88,-256.75 308.62,-256.75"/>
<text text-anchor="start" x="324.75" y="-262.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">name</text>
<polygon fill="none" stroke="black" points="370.88,-256.75 370.88,-279.25 435.38,-279.25 435.38,-256.75 370.88,-256.75"/>
<text text-anchor="start" x="396.38" y="-262.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
<polygon fill="none" stroke="black" points="308.62,-234.25 308.62,-256.75 370.88,-256.75 370.88,-234.25 308.62,-234.25"/>
<text text-anchor="start" x="311.62" y="-240.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">profession</text>
<polygon fill="none" stroke="black" points="370.88,-234.25 370.88,-256.75 435.38,-256.75 435.38,-234.25 370.88,-234.25"/>
<text text-anchor="start" x="396.38" y="-240.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
<polygon fill="none" stroke="black" points="308.62,-211.75 308.62,-234.25 370.88,-234.25 370.88,-211.75 308.62,-211.75"/>
<text text-anchor="start" x="312.38" y="-217.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">alignment</text>
<polygon fill="none" stroke="black" points="370.88,-211.75 370.88,-234.25 435.38,-234.25 435.38,-211.75 370.88,-211.75"/>
<text text-anchor="start" x="373.88" y="-217.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">Alignment</text>
<polygon fill="none" stroke="black" points="308.62,-189.25 308.62,-211.75 370.88,-211.75 370.88,-189.25 308.62,-189.25"/>
<text text-anchor="start" x="326.62" y="-195.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">level</text>
<polygon fill="none" stroke="black" points="370.88,-189.25 370.88,-211.75 435.38,-211.75 435.38,-189.25 370.88,-189.25"/>
<text text-anchor="start" x="396" y="-195.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">int</text>
</a>
</g>
</g>
<!-- erdantic.examples.attrs.Party -->
<g id="node2" class="node">
<title>erdantic.examples.attrs.Party</title>
<g id="a_node2"><a xlink:title="erdantic.examples.attrs.Party&#10;&#10;A group of adventurers finding themselves doing and saying things altogether unexpected.&#10;&#10;Attributes:&#10; &#160;&#160;&#160;name (str): Name that party is known by&#10; &#160;&#160;&#160;formed_datetime (datetime): Timestamp of when the party was formed&#10; &#160;&#160;&#160;members (list[Adventurer]): Adventurers that belong to this party&#10; &#160;&#160;&#160;active_quest (Optional[Quest]): Current quest that party is actively tackling&#10;">
<polygon fill="none" stroke="black" points="0,-283.25 0,-305.75 192.75,-305.75 192.75,-283.25 0,-283.25"/>
<text text-anchor="start" x="80.25" y="-290.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-weight="bold" font-size="14.00">Party</text>
<polygon fill="none" stroke="black" points="0,-260.75 0,-283.25 99.75,-283.25 99.75,-260.75 0,-260.75"/>
<text text-anchor="start" x="34.88" y="-266.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">name</text>
<polygon fill="none" stroke="black" points="99.75,-260.75 99.75,-283.25 192.75,-283.25 192.75,-260.75 99.75,-260.75"/>
<text text-anchor="start" x="139.5" y="-266.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
<polygon fill="none" stroke="black" points="0,-238.25 0,-260.75 99.75,-260.75 99.75,-238.25 0,-238.25"/>
<text text-anchor="start" x="3" y="-244.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">formed_datetime</text>
<polygon fill="none" stroke="black" points="99.75,-238.25 99.75,-260.75 192.75,-260.75 192.75,-238.25 99.75,-238.25"/>
<text text-anchor="start" x="122.62" y="-244.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">datetime</text>
<polygon fill="none" stroke="black" points="0,-215.75 0,-238.25 99.75,-238.25 99.75,-215.75 0,-215.75"/>
<text text-anchor="start" x="24.38" y="-221.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">members</text>
<polygon fill="none" stroke="black" points="99.75,-215.75 99.75,-238.25 192.75,-238.25 192.75,-215.75 99.75,-215.75"/>
<text text-anchor="start" x="102.75" y="-221.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">list[Adventurer]</text>
<polygon fill="none" stroke="black" points="0,-193.25 0,-215.75 99.75,-215.75 99.75,-193.25 0,-193.25"/>
<text text-anchor="start" x="16.12" y="-199.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">active_quest</text>
<polygon fill="none" stroke="black" points="99.75,-193.25 99.75,-215.75 192.75,-215.75 192.75,-193.25 99.75,-193.25"/>
<text text-anchor="start" x="110.62" y="-199.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">Quest | None</text>
</a>
</g>
</g>
<!-- erdantic.examples.attrs.Party&#45;&gt;erdantic.examples.attrs.Adventurer -->
<g id="edge1" class="edge">
<title>erdantic.examples.attrs.Party:e&#45;&gt;erdantic.examples.attrs.Adventurer:w</title>
<path fill="none" stroke="black" d="M202.71,-227.67C246.18,-233.77 251.99,-279.62 292.46,-288.88"/>
<polyline fill="none" stroke="black" points="192.75,-227 197.74,-227.34"/>
<polyline fill="none" stroke="black" points="197.74,-227.34 202.73,-227.67"/>
<polygon fill="black" stroke="black" points="297.35,-289.4 306.81,-294.94 302.65,-289.97 306.96,-290.43 306.96,-290.43 306.96,-290.43 302.65,-289.97 307.77,-285.99 297.35,-289.4"/>
<polyline fill="none" stroke="black" points="296.14,-289.27 291.17,-288.74"/>
</g>
<!-- erdantic.examples.attrs.Quest -->
<g id="node3" class="node">
<title>erdantic.examples.attrs.Quest</title>
<g id="a_node3"><a xlink:title="erdantic.examples.attrs.Quest&#10;&#10;A task to complete, with some monetary reward.&#10;&#10;Attributes:&#10; &#160;&#160;&#160;name (str): Name by which this quest is referred to&#10; &#160;&#160;&#160;giver (QuestGiver): Person who offered the quest&#10; &#160;&#160;&#160;reward_gold (int): Amount of gold to be rewarded for quest completion&#10;">
<polygon fill="none" stroke="black" points="300.75,-131 300.75,-153.5 443.25,-153.5 443.25,-131 300.75,-131"/>
<text text-anchor="start" x="354.75" y="-138.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-weight="bold" font-size="14.00">Quest</text>
<polygon fill="none" stroke="black" points="300.75,-108.5 300.75,-131 375,-131 375,-108.5 300.75,-108.5"/>
<text text-anchor="start" x="322.88" y="-114.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">name</text>
<polygon fill="none" stroke="black" points="375,-108.5 375,-131 443.25,-131 443.25,-108.5 375,-108.5"/>
<text text-anchor="start" x="402.38" y="-114.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
<polygon fill="none" stroke="black" points="300.75,-86 300.75,-108.5 375,-108.5 375,-86 300.75,-86"/>
<text text-anchor="start" x="324" y="-92.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">giver</text>
<polygon fill="none" stroke="black" points="375,-86 375,-108.5 443.25,-108.5 443.25,-86 375,-86"/>
<text text-anchor="start" x="378" y="-92.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">QuestGiver</text>
<polygon fill="none" stroke="black" points="300.75,-63.5 300.75,-86 375,-86 375,-63.5 300.75,-63.5"/>
<text text-anchor="start" x="303.75" y="-69.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">reward_gold</text>
<polygon fill="none" stroke="black" points="375,-63.5 375,-86 443.25,-86 443.25,-63.5 375,-63.5"/>
<text text-anchor="start" x="402" y="-69.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">int</text>
</a>
</g>
</g>
<!-- erdantic.examples.attrs.Party&#45;&gt;erdantic.examples.attrs.Quest -->
<g id="edge2" class="edge">
<title>erdantic.examples.attrs.Party:e&#45;&gt;erdantic.examples.attrs.Quest:w</title>
<path fill="none" stroke="black" d="M202.48,-203.8C241.8,-197.9 247.76,-156.32 282.07,-145.06"/>
<polyline fill="none" stroke="black" points="192.75,-204.5 197.74,-204.14"/>
<polyline fill="none" stroke="black" points="197.74,-204.14 202.72,-203.78"/>
<polyline fill="none" stroke="black" points="300.75,-142.25 295.81,-142.99"/>
<polygon fill="black" stroke="black" points="294.07,-138.2 295.56,-148.09 293.58,-148.38 292.1,-138.49 294.07,-138.2"/>
<polyline fill="none" stroke="black" points="295.81,-142.99 290.86,-143.74"/>
<ellipse fill="none" stroke="black" cx="286.41" cy="-144.4" rx="4" ry="4"/>
</g>
<!-- erdantic.examples.attrs.QuestGiver -->
<g id="node4" class="node">
<title>erdantic.examples.attrs.QuestGiver</title>
<g id="a_node4"><a xlink:title="erdantic.examples.attrs.QuestGiver&#10;&#10;A person who offers a task that needs completing.&#10;&#10;Attributes:&#10; &#160;&#160;&#160;name (str): Name of this quest giver&#10; &#160;&#160;&#160;faction (str): Faction that this quest giver belongs to&#10; &#160;&#160;&#160;location (str): Location this quest giver can be found&#10;">
<polygon fill="none" stroke="black" points="551.25,-86 551.25,-108.5 660,-108.5 660,-86 551.25,-86"/>
<text text-anchor="start" x="571.5" y="-93.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-weight="bold" font-size="14.00">QuestGiver</text>
<polygon fill="none" stroke="black" points="551.25,-63.5 551.25,-86 600.75,-86 600.75,-63.5 551.25,-63.5"/>
<text text-anchor="start" x="561" y="-69.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">name</text>
<polygon fill="none" stroke="black" points="600.75,-63.5 600.75,-86 660,-86 660,-63.5 600.75,-63.5"/>
<text text-anchor="start" x="623.62" y="-69.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
<polygon fill="none" stroke="black" points="551.25,-41 551.25,-63.5 600.75,-63.5 600.75,-41 551.25,-41"/>
<text text-anchor="start" x="557.25" y="-47.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">faction</text>
<polygon fill="none" stroke="black" points="600.75,-41 600.75,-63.5 660,-63.5 660,-41 600.75,-41"/>
<text text-anchor="start" x="603.75" y="-47.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str | None</text>
<polygon fill="none" stroke="black" points="551.25,-18.5 551.25,-41 600.75,-41 600.75,-18.5 551.25,-18.5"/>
<text text-anchor="start" x="554.25" y="-24.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">location</text>
<polygon fill="none" stroke="black" points="600.75,-18.5 600.75,-41 660,-41 660,-18.5 600.75,-18.5"/>
<text text-anchor="start" x="623.62" y="-24.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
</a>
</g>
</g>
<!-- erdantic.examples.attrs.Quest&#45;&gt;erdantic.examples.attrs.QuestGiver -->
<g id="edge3" class="edge">
<title>erdantic.examples.attrs.Quest:e&#45;&gt;erdantic.examples.attrs.QuestGiver:w</title>
<path fill="none" stroke="black" d="M453.12,-97.25C488.32,-97.25 503.05,-97.25 536.33,-97.25"/>
<polyline fill="none" stroke="black" points="443.25,-97.25 448.25,-97.25"/>
<polyline fill="none" stroke="black" points="448.25,-97.25 453.25,-97.25"/>
<polyline fill="none" stroke="black" points="551.25,-97.25 546.25,-97.25"/>
<polygon fill="black" stroke="black" points="545.25,-92.25 545.25,-102.25 543.25,-102.25 543.25,-92.25 545.25,-92.25"/>
<polyline fill="none" stroke="black" points="546.25,-97.25 541.25,-97.25"/>
<polygon fill="black" stroke="black" points="540.25,-92.25 540.25,-102.25 538.25,-102.25 538.25,-92.25 540.25,-92.25"/>
<polyline fill="none" stroke="black" points="541.25,-97.25 536.25,-97.25"/>
</g>
</g>
</svg>

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

{
"models": {
"erdantic.examples.dataclasses.Adventurer": {
"full_name": {
"module": "erdantic.examples.dataclasses",
"qual_name": "Adventurer"
},
"name": "Adventurer",
"fields": {
"name": {
"model_full_name": {
"module": "erdantic.examples.dataclasses",
"qual_name": "Adventurer"
},
"name": "name",
"type_name": "str"
},
"profession": {
"model_full_name": {
"module": "erdantic.examples.dataclasses",
"qual_name": "Adventurer"
},
"name": "profession",
"type_name": "str"
},
"alignment": {
"model_full_name": {
"module": "erdantic.examples.dataclasses",
"qual_name": "Adventurer"
},
"name": "alignment",
"type_name": "Alignment"
},
"level": {
"model_full_name": {
"module": "erdantic.examples.dataclasses",
"qual_name": "Adventurer"
},
"name": "level",
"type_name": "int"
}
},
"description": "erdantic.examples.dataclasses.Adventurer\n\nA person often late for dinner but with a tale or two to tell.\n\nAttributes:\n name (str): Name of this adventurer\n profession (str): Profession of this adventurer\n alignment (Alignment): Alignment of this adventurer\n level (int): Level of this adventurer\n"
},
"erdantic.examples.dataclasses.Party": {
"full_name": {
"module": "erdantic.examples.dataclasses",
"qual_name": "Party"
},
"name": "Party",
"fields": {
"name": {
"model_full_name": {
"module": "erdantic.examples.dataclasses",
"qual_name": "Party"
},
"name": "name",
"type_name": "str"
},
"formed_datetime": {
"model_full_name": {
"module": "erdantic.examples.dataclasses",
"qual_name": "Party"
},
"name": "formed_datetime",
"type_name": "datetime"
},
"members": {
"model_full_name": {
"module": "erdantic.examples.dataclasses",
"qual_name": "Party"
},
"name": "members",
"type_name": "list[Adventurer]"
},
"active_quest": {
"model_full_name": {
"module": "erdantic.examples.dataclasses",
"qual_name": "Party"
},
"name": "active_quest",
"type_name": "Quest | None"
}
},
"description": "erdantic.examples.dataclasses.Party\n\nA group of adventurers finding themselves doing and saying things altogether unexpected.\n\nAttributes:\n name (str): Name that party is known by\n formed_datetime (datetime): Timestamp of when the party was formed\n members (list[Adventurer]): Adventurers that belong to this party\n active_quest (Optional[Quest]): Current quest that party is actively tackling\n"
},
"erdantic.examples.dataclasses.Quest": {
"full_name": {
"module": "erdantic.examples.dataclasses",
"qual_name": "Quest"
},
"name": "Quest",
"fields": {
"name": {
"model_full_name": {
"module": "erdantic.examples.dataclasses",
"qual_name": "Quest"
},
"name": "name",
"type_name": "str"
},
"giver": {
"model_full_name": {
"module": "erdantic.examples.dataclasses",
"qual_name": "Quest"
},
"name": "giver",
"type_name": "QuestGiver"
},
"reward_gold": {
"model_full_name": {
"module": "erdantic.examples.dataclasses",
"qual_name": "Quest"
},
"name": "reward_gold",
"type_name": "int"
}
},
"description": "erdantic.examples.dataclasses.Quest\n\nA task to complete, with some monetary reward.\n\nAttributes:\n name (str): Name by which this quest is referred to\n giver (QuestGiver): Person who offered the quest\n reward_gold (int): Amount of gold to be rewarded for quest completion\n"
},
"erdantic.examples.dataclasses.QuestGiver": {
"full_name": {
"module": "erdantic.examples.dataclasses",
"qual_name": "QuestGiver"
},
"name": "QuestGiver",
"fields": {
"name": {
"model_full_name": {
"module": "erdantic.examples.dataclasses",
"qual_name": "QuestGiver"
},
"name": "name",
"type_name": "str"
},
"faction": {
"model_full_name": {
"module": "erdantic.examples.dataclasses",
"qual_name": "QuestGiver"
},
"name": "faction",
"type_name": "str | None"
},
"location": {
"model_full_name": {
"module": "erdantic.examples.dataclasses",
"qual_name": "QuestGiver"
},
"name": "location",
"type_name": "str"
}
},
"description": "erdantic.examples.dataclasses.QuestGiver\n\nA person who offers a task that needs completing.\n\nAttributes:\n name (str): Name of this quest giver\n faction (str): Faction that this quest giver belongs to\n location (str): Location this quest giver can be found\n"
}
},
"edges": {
"erdantic.examples.dataclasses.Party-active_quest-erdantic.examples.dataclasses.Quest": {
"source_model_full_name": {
"module": "erdantic.examples.dataclasses",
"qual_name": "Party"
},
"source_field_name": "active_quest",
"target_model_full_name": {
"module": "erdantic.examples.dataclasses",
"qual_name": "Quest"
},
"target_cardinality": "one",
"target_modality": "zero",
"source_cardinality": "unspecified",
"source_modality": "unspecified"
},
"erdantic.examples.dataclasses.Party-members-erdantic.examples.dataclasses.Adventurer": {
"source_model_full_name": {
"module": "erdantic.examples.dataclasses",
"qual_name": "Party"
},
"source_field_name": "members",
"target_model_full_name": {
"module": "erdantic.examples.dataclasses",
"qual_name": "Adventurer"
},
"target_cardinality": "many",
"target_modality": "unspecified",
"source_cardinality": "unspecified",
"source_modality": "unspecified"
},
"erdantic.examples.dataclasses.Quest-giver-erdantic.examples.dataclasses.QuestGiver": {
"source_model_full_name": {
"module": "erdantic.examples.dataclasses",
"qual_name": "Quest"
},
"source_field_name": "giver",
"target_model_full_name": {
"module": "erdantic.examples.dataclasses",
"qual_name": "QuestGiver"
},
"target_cardinality": "one",
"target_modality": "one",
"source_cardinality": "unspecified",
"source_modality": "unspecified"
}
}
}

Sorry, the diff of this file is not supported yet

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 12.2.1 (0)
-->
<!-- Title: Entity Relationship Diagram created by erdantic Pages: 1 -->
<svg width="668pt" height="314pt"
viewBox="0.00 0.00 668.00 313.75" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 309.75)">
<title>Entity Relationship Diagram created by erdantic</title>
<polygon fill="white" stroke="none" points="-4,4 -4,-309.75 664,-309.75 664,4 -4,4"/>
<text text-anchor="middle" x="330" y="-5.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="9.00" fill="#a8a8a8">Created by erdantic vTEST &lt;https://github.com/drivendataorg/erdantic&gt;</text>
<!-- erdantic.examples.dataclasses.Adventurer -->
<g id="node1" class="node">
<title>erdantic.examples.dataclasses.Adventurer</title>
<g id="a_node1"><a xlink:title="erdantic.examples.dataclasses.Adventurer&#10;&#10;A person often late for dinner but with a tale or two to tell.&#10;&#10;Attributes:&#10; &#160;&#160;&#160;name (str): Name of this adventurer&#10; &#160;&#160;&#160;profession (str): Profession of this adventurer&#10; &#160;&#160;&#160;alignment (Alignment): Alignment of this adventurer&#10; &#160;&#160;&#160;level (int): Level of this adventurer&#10;">
<polygon fill="none" stroke="black" points="308.62,-279.25 308.62,-301.75 435.38,-301.75 435.38,-279.25 308.62,-279.25"/>
<text text-anchor="start" x="338.25" y="-286.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-weight="bold" font-size="14.00">Adventurer</text>
<polygon fill="none" stroke="black" points="308.62,-256.75 308.62,-279.25 370.88,-279.25 370.88,-256.75 308.62,-256.75"/>
<text text-anchor="start" x="324.75" y="-262.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">name</text>
<polygon fill="none" stroke="black" points="370.88,-256.75 370.88,-279.25 435.38,-279.25 435.38,-256.75 370.88,-256.75"/>
<text text-anchor="start" x="396.38" y="-262.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
<polygon fill="none" stroke="black" points="308.62,-234.25 308.62,-256.75 370.88,-256.75 370.88,-234.25 308.62,-234.25"/>
<text text-anchor="start" x="311.62" y="-240.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">profession</text>
<polygon fill="none" stroke="black" points="370.88,-234.25 370.88,-256.75 435.38,-256.75 435.38,-234.25 370.88,-234.25"/>
<text text-anchor="start" x="396.38" y="-240.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
<polygon fill="none" stroke="black" points="308.62,-211.75 308.62,-234.25 370.88,-234.25 370.88,-211.75 308.62,-211.75"/>
<text text-anchor="start" x="312.38" y="-217.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">alignment</text>
<polygon fill="none" stroke="black" points="370.88,-211.75 370.88,-234.25 435.38,-234.25 435.38,-211.75 370.88,-211.75"/>
<text text-anchor="start" x="373.88" y="-217.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">Alignment</text>
<polygon fill="none" stroke="black" points="308.62,-189.25 308.62,-211.75 370.88,-211.75 370.88,-189.25 308.62,-189.25"/>
<text text-anchor="start" x="326.62" y="-195.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">level</text>
<polygon fill="none" stroke="black" points="370.88,-189.25 370.88,-211.75 435.38,-211.75 435.38,-189.25 370.88,-189.25"/>
<text text-anchor="start" x="396" y="-195.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">int</text>
</a>
</g>
</g>
<!-- erdantic.examples.dataclasses.Party -->
<g id="node2" class="node">
<title>erdantic.examples.dataclasses.Party</title>
<g id="a_node2"><a xlink:title="erdantic.examples.dataclasses.Party&#10;&#10;A group of adventurers finding themselves doing and saying things altogether unexpected.&#10;&#10;Attributes:&#10; &#160;&#160;&#160;name (str): Name that party is known by&#10; &#160;&#160;&#160;formed_datetime (datetime): Timestamp of when the party was formed&#10; &#160;&#160;&#160;members (list[Adventurer]): Adventurers that belong to this party&#10; &#160;&#160;&#160;active_quest (Optional[Quest]): Current quest that party is actively tackling&#10;">
<polygon fill="none" stroke="black" points="0,-283.25 0,-305.75 192.75,-305.75 192.75,-283.25 0,-283.25"/>
<text text-anchor="start" x="80.25" y="-290.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-weight="bold" font-size="14.00">Party</text>
<polygon fill="none" stroke="black" points="0,-260.75 0,-283.25 99.75,-283.25 99.75,-260.75 0,-260.75"/>
<text text-anchor="start" x="34.88" y="-266.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">name</text>
<polygon fill="none" stroke="black" points="99.75,-260.75 99.75,-283.25 192.75,-283.25 192.75,-260.75 99.75,-260.75"/>
<text text-anchor="start" x="139.5" y="-266.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
<polygon fill="none" stroke="black" points="0,-238.25 0,-260.75 99.75,-260.75 99.75,-238.25 0,-238.25"/>
<text text-anchor="start" x="3" y="-244.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">formed_datetime</text>
<polygon fill="none" stroke="black" points="99.75,-238.25 99.75,-260.75 192.75,-260.75 192.75,-238.25 99.75,-238.25"/>
<text text-anchor="start" x="122.62" y="-244.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">datetime</text>
<polygon fill="none" stroke="black" points="0,-215.75 0,-238.25 99.75,-238.25 99.75,-215.75 0,-215.75"/>
<text text-anchor="start" x="24.38" y="-221.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">members</text>
<polygon fill="none" stroke="black" points="99.75,-215.75 99.75,-238.25 192.75,-238.25 192.75,-215.75 99.75,-215.75"/>
<text text-anchor="start" x="102.75" y="-221.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">list[Adventurer]</text>
<polygon fill="none" stroke="black" points="0,-193.25 0,-215.75 99.75,-215.75 99.75,-193.25 0,-193.25"/>
<text text-anchor="start" x="16.12" y="-199.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">active_quest</text>
<polygon fill="none" stroke="black" points="99.75,-193.25 99.75,-215.75 192.75,-215.75 192.75,-193.25 99.75,-193.25"/>
<text text-anchor="start" x="110.62" y="-199.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">Quest | None</text>
</a>
</g>
</g>
<!-- erdantic.examples.dataclasses.Party&#45;&gt;erdantic.examples.dataclasses.Adventurer -->
<g id="edge1" class="edge">
<title>erdantic.examples.dataclasses.Party:e&#45;&gt;erdantic.examples.dataclasses.Adventurer:w</title>
<path fill="none" stroke="black" d="M202.71,-227.67C246.18,-233.77 251.99,-279.62 292.46,-288.88"/>
<polyline fill="none" stroke="black" points="192.75,-227 197.74,-227.34"/>
<polyline fill="none" stroke="black" points="197.74,-227.34 202.73,-227.67"/>
<polygon fill="black" stroke="black" points="297.35,-289.4 306.81,-294.94 302.65,-289.97 306.96,-290.43 306.96,-290.43 306.96,-290.43 302.65,-289.97 307.77,-285.99 297.35,-289.4"/>
<polyline fill="none" stroke="black" points="296.14,-289.27 291.17,-288.74"/>
</g>
<!-- erdantic.examples.dataclasses.Quest -->
<g id="node3" class="node">
<title>erdantic.examples.dataclasses.Quest</title>
<g id="a_node3"><a xlink:title="erdantic.examples.dataclasses.Quest&#10;&#10;A task to complete, with some monetary reward.&#10;&#10;Attributes:&#10; &#160;&#160;&#160;name (str): Name by which this quest is referred to&#10; &#160;&#160;&#160;giver (QuestGiver): Person who offered the quest&#10; &#160;&#160;&#160;reward_gold (int): Amount of gold to be rewarded for quest completion&#10;">
<polygon fill="none" stroke="black" points="300.75,-131 300.75,-153.5 443.25,-153.5 443.25,-131 300.75,-131"/>
<text text-anchor="start" x="354.75" y="-138.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-weight="bold" font-size="14.00">Quest</text>
<polygon fill="none" stroke="black" points="300.75,-108.5 300.75,-131 375,-131 375,-108.5 300.75,-108.5"/>
<text text-anchor="start" x="322.88" y="-114.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">name</text>
<polygon fill="none" stroke="black" points="375,-108.5 375,-131 443.25,-131 443.25,-108.5 375,-108.5"/>
<text text-anchor="start" x="402.38" y="-114.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
<polygon fill="none" stroke="black" points="300.75,-86 300.75,-108.5 375,-108.5 375,-86 300.75,-86"/>
<text text-anchor="start" x="324" y="-92.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">giver</text>
<polygon fill="none" stroke="black" points="375,-86 375,-108.5 443.25,-108.5 443.25,-86 375,-86"/>
<text text-anchor="start" x="378" y="-92.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">QuestGiver</text>
<polygon fill="none" stroke="black" points="300.75,-63.5 300.75,-86 375,-86 375,-63.5 300.75,-63.5"/>
<text text-anchor="start" x="303.75" y="-69.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">reward_gold</text>
<polygon fill="none" stroke="black" points="375,-63.5 375,-86 443.25,-86 443.25,-63.5 375,-63.5"/>
<text text-anchor="start" x="402" y="-69.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">int</text>
</a>
</g>
</g>
<!-- erdantic.examples.dataclasses.Party&#45;&gt;erdantic.examples.dataclasses.Quest -->
<g id="edge2" class="edge">
<title>erdantic.examples.dataclasses.Party:e&#45;&gt;erdantic.examples.dataclasses.Quest:w</title>
<path fill="none" stroke="black" d="M202.48,-203.8C241.8,-197.9 247.76,-156.32 282.07,-145.06"/>
<polyline fill="none" stroke="black" points="192.75,-204.5 197.74,-204.14"/>
<polyline fill="none" stroke="black" points="197.74,-204.14 202.72,-203.78"/>
<polyline fill="none" stroke="black" points="300.75,-142.25 295.81,-142.99"/>
<polygon fill="black" stroke="black" points="294.07,-138.2 295.56,-148.09 293.58,-148.38 292.1,-138.49 294.07,-138.2"/>
<polyline fill="none" stroke="black" points="295.81,-142.99 290.86,-143.74"/>
<ellipse fill="none" stroke="black" cx="286.41" cy="-144.4" rx="4" ry="4"/>
</g>
<!-- erdantic.examples.dataclasses.QuestGiver -->
<g id="node4" class="node">
<title>erdantic.examples.dataclasses.QuestGiver</title>
<g id="a_node4"><a xlink:title="erdantic.examples.dataclasses.QuestGiver&#10;&#10;A person who offers a task that needs completing.&#10;&#10;Attributes:&#10; &#160;&#160;&#160;name (str): Name of this quest giver&#10; &#160;&#160;&#160;faction (str): Faction that this quest giver belongs to&#10; &#160;&#160;&#160;location (str): Location this quest giver can be found&#10;">
<polygon fill="none" stroke="black" points="551.25,-86 551.25,-108.5 660,-108.5 660,-86 551.25,-86"/>
<text text-anchor="start" x="571.5" y="-93.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-weight="bold" font-size="14.00">QuestGiver</text>
<polygon fill="none" stroke="black" points="551.25,-63.5 551.25,-86 600.75,-86 600.75,-63.5 551.25,-63.5"/>
<text text-anchor="start" x="561" y="-69.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">name</text>
<polygon fill="none" stroke="black" points="600.75,-63.5 600.75,-86 660,-86 660,-63.5 600.75,-63.5"/>
<text text-anchor="start" x="623.62" y="-69.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
<polygon fill="none" stroke="black" points="551.25,-41 551.25,-63.5 600.75,-63.5 600.75,-41 551.25,-41"/>
<text text-anchor="start" x="557.25" y="-47.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">faction</text>
<polygon fill="none" stroke="black" points="600.75,-41 600.75,-63.5 660,-63.5 660,-41 600.75,-41"/>
<text text-anchor="start" x="603.75" y="-47.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str | None</text>
<polygon fill="none" stroke="black" points="551.25,-18.5 551.25,-41 600.75,-41 600.75,-18.5 551.25,-18.5"/>
<text text-anchor="start" x="554.25" y="-24.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">location</text>
<polygon fill="none" stroke="black" points="600.75,-18.5 600.75,-41 660,-41 660,-18.5 600.75,-18.5"/>
<text text-anchor="start" x="623.62" y="-24.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
</a>
</g>
</g>
<!-- erdantic.examples.dataclasses.Quest&#45;&gt;erdantic.examples.dataclasses.QuestGiver -->
<g id="edge3" class="edge">
<title>erdantic.examples.dataclasses.Quest:e&#45;&gt;erdantic.examples.dataclasses.QuestGiver:w</title>
<path fill="none" stroke="black" d="M453.12,-97.25C488.32,-97.25 503.05,-97.25 536.33,-97.25"/>
<polyline fill="none" stroke="black" points="443.25,-97.25 448.25,-97.25"/>
<polyline fill="none" stroke="black" points="448.25,-97.25 453.25,-97.25"/>
<polyline fill="none" stroke="black" points="551.25,-97.25 546.25,-97.25"/>
<polygon fill="black" stroke="black" points="545.25,-92.25 545.25,-102.25 543.25,-102.25 543.25,-92.25 545.25,-92.25"/>
<polyline fill="none" stroke="black" points="546.25,-97.25 541.25,-97.25"/>
<polygon fill="black" stroke="black" points="540.25,-92.25 540.25,-102.25 538.25,-102.25 538.25,-92.25 540.25,-92.25"/>
<polyline fill="none" stroke="black" points="541.25,-97.25 536.25,-97.25"/>
</g>
</g>
</svg>

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

{
"models": {
"erdantic.examples.pydantic.Adventurer": {
"full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Adventurer"
},
"name": "Adventurer",
"fields": {
"name": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Adventurer"
},
"name": "name",
"type_name": "str"
},
"profession": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Adventurer"
},
"name": "profession",
"type_name": "str"
},
"alignment": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Adventurer"
},
"name": "alignment",
"type_name": "Alignment"
},
"level": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Adventurer"
},
"name": "level",
"type_name": "int"
}
},
"description": "erdantic.examples.pydantic.Adventurer\n\nA person often late for dinner but with a tale or two to tell.\n\nAttributes:\n name (str): Name of this adventurer\n profession (str): Profession of this adventurer\n alignment (Alignment): Alignment of this adventurer\n level (int): Level of this adventurer\n"
},
"erdantic.examples.pydantic.Party": {
"full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Party"
},
"name": "Party",
"fields": {
"name": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Party"
},
"name": "name",
"type_name": "str"
},
"formed_datetime": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Party"
},
"name": "formed_datetime",
"type_name": "datetime"
},
"members": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Party"
},
"name": "members",
"type_name": "list[Adventurer]"
},
"active_quest": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Party"
},
"name": "active_quest",
"type_name": "Quest | None"
}
},
"description": "erdantic.examples.pydantic.Party\n\nA group of adventurers finding themselves doing and saying things altogether unexpected.\n\nAttributes:\n name (str): Name that party is known by\n formed_datetime (datetime): Timestamp of when the party was formed\n members (list[Adventurer]): Adventurers that belong to this party\n active_quest (Optional[Quest]): Current quest that party is actively tackling\n"
},
"erdantic.examples.pydantic.Quest": {
"full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Quest"
},
"name": "Quest",
"fields": {
"name": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Quest"
},
"name": "name",
"type_name": "str"
},
"giver": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Quest"
},
"name": "giver",
"type_name": "QuestGiver"
},
"reward_gold": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Quest"
},
"name": "reward_gold",
"type_name": "int"
}
},
"description": "erdantic.examples.pydantic.Quest\n\nA task to complete, with some monetary reward.\n\nAttributes:\n name (str): Name by which this quest is referred to\n giver (QuestGiver): Person who offered the quest\n reward_gold (int): Amount of gold to be rewarded for quest completion\n"
},
"erdantic.examples.pydantic.QuestGiver": {
"full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "QuestGiver"
},
"name": "QuestGiver",
"fields": {
"name": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "QuestGiver"
},
"name": "name",
"type_name": "str"
},
"faction": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "QuestGiver"
},
"name": "faction",
"type_name": "str | None"
},
"location": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "QuestGiver"
},
"name": "location",
"type_name": "str"
}
},
"description": "erdantic.examples.pydantic.QuestGiver\n\nA person who offers a task that needs completing.\n\nAttributes:\n name (str): Name of this quest giver\n faction (str): Faction that this quest giver belongs to\n location (str): Location this quest giver can be found\n"
}
},
"edges": {
"erdantic.examples.pydantic.Party-active_quest-erdantic.examples.pydantic.Quest": {
"source_model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Party"
},
"source_field_name": "active_quest",
"target_model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Quest"
},
"target_cardinality": "one",
"target_modality": "zero",
"source_cardinality": "unspecified",
"source_modality": "unspecified"
},
"erdantic.examples.pydantic.Party-members-erdantic.examples.pydantic.Adventurer": {
"source_model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Party"
},
"source_field_name": "members",
"target_model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Adventurer"
},
"target_cardinality": "many",
"target_modality": "unspecified",
"source_cardinality": "unspecified",
"source_modality": "unspecified"
},
"erdantic.examples.pydantic.Quest-giver-erdantic.examples.pydantic.QuestGiver": {
"source_model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Quest"
},
"source_field_name": "giver",
"target_model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "QuestGiver"
},
"target_cardinality": "one",
"target_modality": "one",
"source_cardinality": "unspecified",
"source_modality": "unspecified"
}
}
}

Sorry, the diff of this file is not supported yet

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 12.2.1 (0)
-->
<!-- Title: Entity Relationship Diagram created by erdantic Pages: 1 -->
<svg width="668pt" height="314pt"
viewBox="0.00 0.00 668.00 313.75" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 309.75)">
<title>Entity Relationship Diagram created by erdantic</title>
<polygon fill="white" stroke="none" points="-4,4 -4,-309.75 664,-309.75 664,4 -4,4"/>
<text text-anchor="middle" x="330" y="-5.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="9.00" fill="#a8a8a8">Created by erdantic vTEST &lt;https://github.com/drivendataorg/erdantic&gt;</text>
<!-- erdantic.examples.pydantic.Adventurer -->
<g id="node1" class="node">
<title>erdantic.examples.pydantic.Adventurer</title>
<g id="a_node1"><a xlink:title="erdantic.examples.pydantic.Adventurer&#10;&#10;A person often late for dinner but with a tale or two to tell.&#10;&#10;Attributes:&#10; &#160;&#160;&#160;name (str): Name of this adventurer&#10; &#160;&#160;&#160;profession (str): Profession of this adventurer&#10; &#160;&#160;&#160;alignment (Alignment): Alignment of this adventurer&#10; &#160;&#160;&#160;level (int): Level of this adventurer&#10;">
<polygon fill="none" stroke="black" points="308.62,-279.25 308.62,-301.75 435.38,-301.75 435.38,-279.25 308.62,-279.25"/>
<text text-anchor="start" x="338.25" y="-286.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-weight="bold" font-size="14.00">Adventurer</text>
<polygon fill="none" stroke="black" points="308.62,-256.75 308.62,-279.25 370.88,-279.25 370.88,-256.75 308.62,-256.75"/>
<text text-anchor="start" x="324.75" y="-262.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">name</text>
<polygon fill="none" stroke="black" points="370.88,-256.75 370.88,-279.25 435.38,-279.25 435.38,-256.75 370.88,-256.75"/>
<text text-anchor="start" x="396.38" y="-262.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
<polygon fill="none" stroke="black" points="308.62,-234.25 308.62,-256.75 370.88,-256.75 370.88,-234.25 308.62,-234.25"/>
<text text-anchor="start" x="311.62" y="-240.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">profession</text>
<polygon fill="none" stroke="black" points="370.88,-234.25 370.88,-256.75 435.38,-256.75 435.38,-234.25 370.88,-234.25"/>
<text text-anchor="start" x="396.38" y="-240.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
<polygon fill="none" stroke="black" points="308.62,-211.75 308.62,-234.25 370.88,-234.25 370.88,-211.75 308.62,-211.75"/>
<text text-anchor="start" x="312.38" y="-217.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">alignment</text>
<polygon fill="none" stroke="black" points="370.88,-211.75 370.88,-234.25 435.38,-234.25 435.38,-211.75 370.88,-211.75"/>
<text text-anchor="start" x="373.88" y="-217.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">Alignment</text>
<polygon fill="none" stroke="black" points="308.62,-189.25 308.62,-211.75 370.88,-211.75 370.88,-189.25 308.62,-189.25"/>
<text text-anchor="start" x="326.62" y="-195.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">level</text>
<polygon fill="none" stroke="black" points="370.88,-189.25 370.88,-211.75 435.38,-211.75 435.38,-189.25 370.88,-189.25"/>
<text text-anchor="start" x="396" y="-195.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">int</text>
</a>
</g>
</g>
<!-- erdantic.examples.pydantic.Party -->
<g id="node2" class="node">
<title>erdantic.examples.pydantic.Party</title>
<g id="a_node2"><a xlink:title="erdantic.examples.pydantic.Party&#10;&#10;A group of adventurers finding themselves doing and saying things altogether unexpected.&#10;&#10;Attributes:&#10; &#160;&#160;&#160;name (str): Name that party is known by&#10; &#160;&#160;&#160;formed_datetime (datetime): Timestamp of when the party was formed&#10; &#160;&#160;&#160;members (list[Adventurer]): Adventurers that belong to this party&#10; &#160;&#160;&#160;active_quest (Optional[Quest]): Current quest that party is actively tackling&#10;">
<polygon fill="none" stroke="black" points="0,-283.25 0,-305.75 192.75,-305.75 192.75,-283.25 0,-283.25"/>
<text text-anchor="start" x="80.25" y="-290.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-weight="bold" font-size="14.00">Party</text>
<polygon fill="none" stroke="black" points="0,-260.75 0,-283.25 99.75,-283.25 99.75,-260.75 0,-260.75"/>
<text text-anchor="start" x="34.88" y="-266.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">name</text>
<polygon fill="none" stroke="black" points="99.75,-260.75 99.75,-283.25 192.75,-283.25 192.75,-260.75 99.75,-260.75"/>
<text text-anchor="start" x="139.5" y="-266.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
<polygon fill="none" stroke="black" points="0,-238.25 0,-260.75 99.75,-260.75 99.75,-238.25 0,-238.25"/>
<text text-anchor="start" x="3" y="-244.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">formed_datetime</text>
<polygon fill="none" stroke="black" points="99.75,-238.25 99.75,-260.75 192.75,-260.75 192.75,-238.25 99.75,-238.25"/>
<text text-anchor="start" x="122.62" y="-244.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">datetime</text>
<polygon fill="none" stroke="black" points="0,-215.75 0,-238.25 99.75,-238.25 99.75,-215.75 0,-215.75"/>
<text text-anchor="start" x="24.38" y="-221.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">members</text>
<polygon fill="none" stroke="black" points="99.75,-215.75 99.75,-238.25 192.75,-238.25 192.75,-215.75 99.75,-215.75"/>
<text text-anchor="start" x="102.75" y="-221.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">list[Adventurer]</text>
<polygon fill="none" stroke="black" points="0,-193.25 0,-215.75 99.75,-215.75 99.75,-193.25 0,-193.25"/>
<text text-anchor="start" x="16.12" y="-199.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">active_quest</text>
<polygon fill="none" stroke="black" points="99.75,-193.25 99.75,-215.75 192.75,-215.75 192.75,-193.25 99.75,-193.25"/>
<text text-anchor="start" x="110.62" y="-199.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">Quest | None</text>
</a>
</g>
</g>
<!-- erdantic.examples.pydantic.Party&#45;&gt;erdantic.examples.pydantic.Adventurer -->
<g id="edge1" class="edge">
<title>erdantic.examples.pydantic.Party:e&#45;&gt;erdantic.examples.pydantic.Adventurer:w</title>
<path fill="none" stroke="black" d="M202.71,-227.67C246.18,-233.77 251.99,-279.62 292.46,-288.88"/>
<polyline fill="none" stroke="black" points="192.75,-227 197.74,-227.34"/>
<polyline fill="none" stroke="black" points="197.74,-227.34 202.73,-227.67"/>
<polygon fill="black" stroke="black" points="297.35,-289.4 306.81,-294.94 302.65,-289.97 306.96,-290.43 306.96,-290.43 306.96,-290.43 302.65,-289.97 307.77,-285.99 297.35,-289.4"/>
<polyline fill="none" stroke="black" points="296.14,-289.27 291.17,-288.74"/>
</g>
<!-- erdantic.examples.pydantic.Quest -->
<g id="node3" class="node">
<title>erdantic.examples.pydantic.Quest</title>
<g id="a_node3"><a xlink:title="erdantic.examples.pydantic.Quest&#10;&#10;A task to complete, with some monetary reward.&#10;&#10;Attributes:&#10; &#160;&#160;&#160;name (str): Name by which this quest is referred to&#10; &#160;&#160;&#160;giver (QuestGiver): Person who offered the quest&#10; &#160;&#160;&#160;reward_gold (int): Amount of gold to be rewarded for quest completion&#10;">
<polygon fill="none" stroke="black" points="300.75,-131 300.75,-153.5 443.25,-153.5 443.25,-131 300.75,-131"/>
<text text-anchor="start" x="354.75" y="-138.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-weight="bold" font-size="14.00">Quest</text>
<polygon fill="none" stroke="black" points="300.75,-108.5 300.75,-131 375,-131 375,-108.5 300.75,-108.5"/>
<text text-anchor="start" x="322.88" y="-114.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">name</text>
<polygon fill="none" stroke="black" points="375,-108.5 375,-131 443.25,-131 443.25,-108.5 375,-108.5"/>
<text text-anchor="start" x="402.38" y="-114.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
<polygon fill="none" stroke="black" points="300.75,-86 300.75,-108.5 375,-108.5 375,-86 300.75,-86"/>
<text text-anchor="start" x="324" y="-92.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">giver</text>
<polygon fill="none" stroke="black" points="375,-86 375,-108.5 443.25,-108.5 443.25,-86 375,-86"/>
<text text-anchor="start" x="378" y="-92.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">QuestGiver</text>
<polygon fill="none" stroke="black" points="300.75,-63.5 300.75,-86 375,-86 375,-63.5 300.75,-63.5"/>
<text text-anchor="start" x="303.75" y="-69.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">reward_gold</text>
<polygon fill="none" stroke="black" points="375,-63.5 375,-86 443.25,-86 443.25,-63.5 375,-63.5"/>
<text text-anchor="start" x="402" y="-69.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">int</text>
</a>
</g>
</g>
<!-- erdantic.examples.pydantic.Party&#45;&gt;erdantic.examples.pydantic.Quest -->
<g id="edge2" class="edge">
<title>erdantic.examples.pydantic.Party:e&#45;&gt;erdantic.examples.pydantic.Quest:w</title>
<path fill="none" stroke="black" d="M202.48,-203.8C241.8,-197.9 247.76,-156.32 282.07,-145.06"/>
<polyline fill="none" stroke="black" points="192.75,-204.5 197.74,-204.14"/>
<polyline fill="none" stroke="black" points="197.74,-204.14 202.72,-203.78"/>
<polyline fill="none" stroke="black" points="300.75,-142.25 295.81,-142.99"/>
<polygon fill="black" stroke="black" points="294.07,-138.2 295.56,-148.09 293.58,-148.38 292.1,-138.49 294.07,-138.2"/>
<polyline fill="none" stroke="black" points="295.81,-142.99 290.86,-143.74"/>
<ellipse fill="none" stroke="black" cx="286.41" cy="-144.4" rx="4" ry="4"/>
</g>
<!-- erdantic.examples.pydantic.QuestGiver -->
<g id="node4" class="node">
<title>erdantic.examples.pydantic.QuestGiver</title>
<g id="a_node4"><a xlink:title="erdantic.examples.pydantic.QuestGiver&#10;&#10;A person who offers a task that needs completing.&#10;&#10;Attributes:&#10; &#160;&#160;&#160;name (str): Name of this quest giver&#10; &#160;&#160;&#160;faction (str): Faction that this quest giver belongs to&#10; &#160;&#160;&#160;location (str): Location this quest giver can be found&#10;">
<polygon fill="none" stroke="black" points="551.25,-86 551.25,-108.5 660,-108.5 660,-86 551.25,-86"/>
<text text-anchor="start" x="571.5" y="-93.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-weight="bold" font-size="14.00">QuestGiver</text>
<polygon fill="none" stroke="black" points="551.25,-63.5 551.25,-86 600.75,-86 600.75,-63.5 551.25,-63.5"/>
<text text-anchor="start" x="561" y="-69.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">name</text>
<polygon fill="none" stroke="black" points="600.75,-63.5 600.75,-86 660,-86 660,-63.5 600.75,-63.5"/>
<text text-anchor="start" x="623.62" y="-69.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
<polygon fill="none" stroke="black" points="551.25,-41 551.25,-63.5 600.75,-63.5 600.75,-41 551.25,-41"/>
<text text-anchor="start" x="557.25" y="-47.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">faction</text>
<polygon fill="none" stroke="black" points="600.75,-41 600.75,-63.5 660,-63.5 660,-41 600.75,-41"/>
<text text-anchor="start" x="603.75" y="-47.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str | None</text>
<polygon fill="none" stroke="black" points="551.25,-18.5 551.25,-41 600.75,-41 600.75,-18.5 551.25,-18.5"/>
<text text-anchor="start" x="554.25" y="-24.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">location</text>
<polygon fill="none" stroke="black" points="600.75,-18.5 600.75,-41 660,-41 660,-18.5 600.75,-18.5"/>
<text text-anchor="start" x="623.62" y="-24.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
</a>
</g>
</g>
<!-- erdantic.examples.pydantic.Quest&#45;&gt;erdantic.examples.pydantic.QuestGiver -->
<g id="edge3" class="edge">
<title>erdantic.examples.pydantic.Quest:e&#45;&gt;erdantic.examples.pydantic.QuestGiver:w</title>
<path fill="none" stroke="black" d="M453.12,-97.25C488.32,-97.25 503.05,-97.25 536.33,-97.25"/>
<polyline fill="none" stroke="black" points="443.25,-97.25 448.25,-97.25"/>
<polyline fill="none" stroke="black" points="448.25,-97.25 453.25,-97.25"/>
<polyline fill="none" stroke="black" points="551.25,-97.25 546.25,-97.25"/>
<polygon fill="black" stroke="black" points="545.25,-92.25 545.25,-102.25 543.25,-102.25 543.25,-92.25 545.25,-92.25"/>
<polyline fill="none" stroke="black" points="546.25,-97.25 541.25,-97.25"/>
<polygon fill="black" stroke="black" points="540.25,-92.25 540.25,-102.25 538.25,-102.25 538.25,-92.25 540.25,-92.25"/>
<polyline fill="none" stroke="black" points="541.25,-97.25 536.25,-97.25"/>
</g>
</g>
</svg>

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

{
"models": {
"erdantic.examples.pydantic.Adventurer": {
"full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Adventurer"
},
"name": "Adventurer",
"fields": {
"name": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Adventurer"
},
"name": "name",
"type_name": "str",
"default_value": ""
},
"profession": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Adventurer"
},
"name": "profession",
"type_name": "str",
"default_value": ""
},
"alignment": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Adventurer"
},
"name": "alignment",
"type_name": "Alignment",
"default_value": ""
},
"level": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Adventurer"
},
"name": "level",
"type_name": "int",
"default_value": "1"
}
},
"description": "erdantic.examples.pydantic.Adventurer\n\nA person often late for dinner but with a tale or two to tell.\n\nAttributes:\n name (str): Name of this adventurer\n profession (str): Profession of this adventurer\n alignment (Alignment): Alignment of this adventurer\n level (int): Level of this adventurer\n"
},
"erdantic.examples.pydantic.Party": {
"full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Party"
},
"name": "Party",
"fields": {
"name": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Party"
},
"name": "name",
"type_name": "str",
"default_value": ""
},
"formed_datetime": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Party"
},
"name": "formed_datetime",
"type_name": "datetime",
"default_value": ""
},
"members": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Party"
},
"name": "members",
"type_name": "list[Adventurer]",
"default_value": "[]"
},
"active_quest": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Party"
},
"name": "active_quest",
"type_name": "Quest | None",
"default_value": "None"
}
},
"description": "erdantic.examples.pydantic.Party\n\nA group of adventurers finding themselves doing and saying things altogether unexpected.\n\nAttributes:\n name (str): Name that party is known by\n formed_datetime (datetime): Timestamp of when the party was formed\n members (list[Adventurer]): Adventurers that belong to this party\n active_quest (Optional[Quest]): Current quest that party is actively tackling\n"
},
"erdantic.examples.pydantic.Quest": {
"full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Quest"
},
"name": "Quest",
"fields": {
"name": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Quest"
},
"name": "name",
"type_name": "str",
"default_value": ""
},
"giver": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Quest"
},
"name": "giver",
"type_name": "QuestGiver",
"default_value": ""
},
"reward_gold": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Quest"
},
"name": "reward_gold",
"type_name": "int",
"default_value": "100"
}
},
"description": "erdantic.examples.pydantic.Quest\n\nA task to complete, with some monetary reward.\n\nAttributes:\n name (str): Name by which this quest is referred to\n giver (QuestGiver): Person who offered the quest\n reward_gold (int): Amount of gold to be rewarded for quest completion\n"
},
"erdantic.examples.pydantic.QuestGiver": {
"full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "QuestGiver"
},
"name": "QuestGiver",
"fields": {
"name": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "QuestGiver"
},
"name": "name",
"type_name": "str",
"default_value": ""
},
"faction": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "QuestGiver"
},
"name": "faction",
"type_name": "str | None",
"default_value": "None"
},
"location": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "QuestGiver"
},
"name": "location",
"type_name": "str",
"default_value": "\"Adventurer's Guild\""
}
},
"description": "erdantic.examples.pydantic.QuestGiver\n\nA person who offers a task that needs completing.\n\nAttributes:\n name (str): Name of this quest giver\n faction (str): Faction that this quest giver belongs to\n location (str): Location this quest giver can be found\n"
}
},
"edges": {
"erdantic.examples.pydantic.Party-active_quest-erdantic.examples.pydantic.Quest": {
"source_model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Party"
},
"source_field_name": "active_quest",
"target_model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Quest"
},
"target_cardinality": "one",
"target_modality": "zero",
"source_cardinality": "unspecified",
"source_modality": "unspecified"
},
"erdantic.examples.pydantic.Party-members-erdantic.examples.pydantic.Adventurer": {
"source_model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Party"
},
"source_field_name": "members",
"target_model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Adventurer"
},
"target_cardinality": "many",
"target_modality": "unspecified",
"source_cardinality": "unspecified",
"source_modality": "unspecified"
},
"erdantic.examples.pydantic.Quest-giver-erdantic.examples.pydantic.QuestGiver": {
"source_model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Quest"
},
"source_field_name": "giver",
"target_model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "QuestGiver"
},
"target_cardinality": "one",
"target_modality": "one",
"source_cardinality": "unspecified",
"source_modality": "unspecified"
}
}
}

Sorry, the diff of this file is not supported yet

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 12.2.1 (0)
-->
<!-- Title: Entity Relationship Diagram created by erdantic Pages: 1 -->
<svg width="862pt" height="314pt"
viewBox="0.00 0.00 861.50 313.75" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 309.75)">
<title>Entity Relationship Diagram created by erdantic</title>
<polygon fill="white" stroke="none" points="-4,4 -4,-309.75 857.5,-309.75 857.5,4 -4,4"/>
<text text-anchor="middle" x="426.75" y="-5.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="9.00" fill="#a8a8a8">Created by erdantic vTEST &lt;https://github.com/drivendataorg/erdantic&gt;</text>
<!-- erdantic.examples.pydantic.Adventurer -->
<g id="node1" class="node">
<title>erdantic.examples.pydantic.Adventurer</title>
<g id="a_node1"><a xlink:title="erdantic.examples.pydantic.Adventurer&#10;&#10;A person often late for dinner but with a tale or two to tell.&#10;&#10;Attributes:&#10; &#160;&#160;&#160;name (str): Name of this adventurer&#10; &#160;&#160;&#160;profession (str): Profession of this adventurer&#10; &#160;&#160;&#160;alignment (Alignment): Alignment of this adventurer&#10; &#160;&#160;&#160;level (int): Level of this adventurer&#10;">
<polygon fill="none" stroke="black" points="344.62,-279.25 344.62,-301.75 507.38,-301.75 507.38,-279.25 344.62,-279.25"/>
<text text-anchor="start" x="392.25" y="-286.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-weight="bold" font-size="14.00">Adventurer</text>
<polygon fill="none" stroke="black" points="344.62,-256.75 344.62,-279.25 406.88,-279.25 406.88,-256.75 344.62,-256.75"/>
<text text-anchor="start" x="360.75" y="-262.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">name</text>
<polygon fill="none" stroke="black" points="406.88,-256.75 406.88,-279.25 471.38,-279.25 471.38,-256.75 406.88,-256.75"/>
<text text-anchor="start" x="432.38" y="-262.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
<polygon fill="none" stroke="black" points="471.38,-256.75 471.38,-279.25 507.38,-279.25 507.38,-256.75 471.38,-256.75"/>
<polygon fill="none" stroke="black" points="344.62,-234.25 344.62,-256.75 406.88,-256.75 406.88,-234.25 344.62,-234.25"/>
<text text-anchor="start" x="347.62" y="-240.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">profession</text>
<polygon fill="none" stroke="black" points="406.88,-234.25 406.88,-256.75 471.38,-256.75 471.38,-234.25 406.88,-234.25"/>
<text text-anchor="start" x="432.38" y="-240.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
<polygon fill="none" stroke="black" points="471.38,-234.25 471.38,-256.75 507.38,-256.75 507.38,-234.25 471.38,-234.25"/>
<polygon fill="none" stroke="black" points="344.62,-211.75 344.62,-234.25 406.88,-234.25 406.88,-211.75 344.62,-211.75"/>
<text text-anchor="start" x="348.38" y="-217.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">alignment</text>
<polygon fill="none" stroke="black" points="406.88,-211.75 406.88,-234.25 471.38,-234.25 471.38,-211.75 406.88,-211.75"/>
<text text-anchor="start" x="409.88" y="-217.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">Alignment</text>
<polygon fill="none" stroke="black" points="471.38,-211.75 471.38,-234.25 507.38,-234.25 507.38,-211.75 471.38,-211.75"/>
<polygon fill="none" stroke="black" points="344.62,-189.25 344.62,-211.75 406.88,-211.75 406.88,-189.25 344.62,-189.25"/>
<text text-anchor="start" x="362.62" y="-195.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">level</text>
<polygon fill="none" stroke="black" points="406.88,-189.25 406.88,-211.75 471.38,-211.75 471.38,-189.25 406.88,-189.25"/>
<text text-anchor="start" x="432" y="-195.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">int</text>
<polygon fill="none" stroke="black" points="471.38,-189.25 471.38,-211.75 507.38,-211.75 507.38,-189.25 471.38,-189.25"/>
<text text-anchor="start" x="486" y="-195.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">1</text>
</a>
</g>
</g>
<!-- erdantic.examples.pydantic.Party -->
<g id="node2" class="node">
<title>erdantic.examples.pydantic.Party</title>
<g id="a_node2"><a xlink:title="erdantic.examples.pydantic.Party&#10;&#10;A group of adventurers finding themselves doing and saying things altogether unexpected.&#10;&#10;Attributes:&#10; &#160;&#160;&#160;name (str): Name that party is known by&#10; &#160;&#160;&#160;formed_datetime (datetime): Timestamp of when the party was formed&#10; &#160;&#160;&#160;members (list[Adventurer]): Adventurers that belong to this party&#10; &#160;&#160;&#160;active_quest (Optional[Quest]): Current quest that party is actively tackling&#10;">
<polygon fill="none" stroke="black" points="0,-283.25 0,-305.75 228.75,-305.75 228.75,-283.25 0,-283.25"/>
<text text-anchor="start" x="98.25" y="-290.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-weight="bold" font-size="14.00">Party</text>
<polygon fill="none" stroke="black" points="0,-260.75 0,-283.25 99.75,-283.25 99.75,-260.75 0,-260.75"/>
<text text-anchor="start" x="34.88" y="-266.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">name</text>
<polygon fill="none" stroke="black" points="99.75,-260.75 99.75,-283.25 192.75,-283.25 192.75,-260.75 99.75,-260.75"/>
<text text-anchor="start" x="139.5" y="-266.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
<polygon fill="none" stroke="black" points="192.75,-260.75 192.75,-283.25 228.75,-283.25 228.75,-260.75 192.75,-260.75"/>
<polygon fill="none" stroke="black" points="0,-238.25 0,-260.75 99.75,-260.75 99.75,-238.25 0,-238.25"/>
<text text-anchor="start" x="3" y="-244.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">formed_datetime</text>
<polygon fill="none" stroke="black" points="99.75,-238.25 99.75,-260.75 192.75,-260.75 192.75,-238.25 99.75,-238.25"/>
<text text-anchor="start" x="122.62" y="-244.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">datetime</text>
<polygon fill="none" stroke="black" points="192.75,-238.25 192.75,-260.75 228.75,-260.75 228.75,-238.25 192.75,-238.25"/>
<polygon fill="none" stroke="black" points="0,-215.75 0,-238.25 99.75,-238.25 99.75,-215.75 0,-215.75"/>
<text text-anchor="start" x="24.38" y="-221.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">members</text>
<polygon fill="none" stroke="black" points="99.75,-215.75 99.75,-238.25 192.75,-238.25 192.75,-215.75 99.75,-215.75"/>
<text text-anchor="start" x="102.75" y="-221.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">list[Adventurer]</text>
<polygon fill="none" stroke="black" points="192.75,-215.75 192.75,-238.25 228.75,-238.25 228.75,-215.75 192.75,-215.75"/>
<text text-anchor="start" x="206.25" y="-221.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">[]</text>
<polygon fill="none" stroke="black" points="0,-193.25 0,-215.75 99.75,-215.75 99.75,-193.25 0,-193.25"/>
<text text-anchor="start" x="16.12" y="-199.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">active_quest</text>
<polygon fill="none" stroke="black" points="99.75,-193.25 99.75,-215.75 192.75,-215.75 192.75,-193.25 99.75,-193.25"/>
<text text-anchor="start" x="110.62" y="-199.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">Quest | None</text>
<polygon fill="none" stroke="black" points="192.75,-193.25 192.75,-215.75 228.75,-215.75 228.75,-193.25 192.75,-193.25"/>
<text text-anchor="start" x="196.12" y="-199.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">None</text>
</a>
</g>
</g>
<!-- erdantic.examples.pydantic.Party&#45;&gt;erdantic.examples.pydantic.Adventurer -->
<g id="edge1" class="edge">
<title>erdantic.examples.pydantic.Party:e&#45;&gt;erdantic.examples.pydantic.Adventurer:w</title>
<path fill="none" stroke="black" d="M238.71,-227.67C282.18,-233.77 287.99,-279.62 328.46,-288.88"/>
<polyline fill="none" stroke="black" points="228.75,-227 233.74,-227.34"/>
<polyline fill="none" stroke="black" points="233.74,-227.34 238.73,-227.67"/>
<polygon fill="black" stroke="black" points="333.35,-289.4 342.81,-294.94 338.65,-289.97 342.96,-290.43 342.96,-290.43 342.96,-290.43 338.65,-289.97 343.77,-285.99 333.35,-289.4"/>
<polyline fill="none" stroke="black" points="332.14,-289.27 327.17,-288.74"/>
</g>
<!-- erdantic.examples.pydantic.Quest -->
<g id="node3" class="node">
<title>erdantic.examples.pydantic.Quest</title>
<g id="a_node3"><a xlink:title="erdantic.examples.pydantic.Quest&#10;&#10;A task to complete, with some monetary reward.&#10;&#10;Attributes:&#10; &#160;&#160;&#160;name (str): Name by which this quest is referred to&#10; &#160;&#160;&#160;giver (QuestGiver): Person who offered the quest&#10; &#160;&#160;&#160;reward_gold (int): Amount of gold to be rewarded for quest completion&#10;">
<polygon fill="none" stroke="black" points="336.75,-131 336.75,-153.5 515.25,-153.5 515.25,-131 336.75,-131"/>
<text text-anchor="start" x="408.75" y="-138.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-weight="bold" font-size="14.00">Quest</text>
<polygon fill="none" stroke="black" points="336.75,-108.5 336.75,-131 411,-131 411,-108.5 336.75,-108.5"/>
<text text-anchor="start" x="358.88" y="-114.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">name</text>
<polygon fill="none" stroke="black" points="411,-108.5 411,-131 479.25,-131 479.25,-108.5 411,-108.5"/>
<text text-anchor="start" x="438.38" y="-114.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
<polygon fill="none" stroke="black" points="479.25,-108.5 479.25,-131 515.25,-131 515.25,-108.5 479.25,-108.5"/>
<polygon fill="none" stroke="black" points="336.75,-86 336.75,-108.5 411,-108.5 411,-86 336.75,-86"/>
<text text-anchor="start" x="360" y="-92.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">giver</text>
<polygon fill="none" stroke="black" points="411,-86 411,-108.5 479.25,-108.5 479.25,-86 411,-86"/>
<text text-anchor="start" x="414" y="-92.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">QuestGiver</text>
<polygon fill="none" stroke="black" points="479.25,-86 479.25,-108.5 515.25,-108.5 515.25,-86 479.25,-86"/>
<polygon fill="none" stroke="black" points="336.75,-63.5 336.75,-86 411,-86 411,-63.5 336.75,-63.5"/>
<text text-anchor="start" x="339.75" y="-69.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">reward_gold</text>
<polygon fill="none" stroke="black" points="411,-63.5 411,-86 479.25,-86 479.25,-63.5 411,-63.5"/>
<text text-anchor="start" x="438" y="-69.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">int</text>
<polygon fill="none" stroke="black" points="479.25,-63.5 479.25,-86 515.25,-86 515.25,-63.5 479.25,-63.5"/>
<text text-anchor="start" x="487.12" y="-69.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">100</text>
</a>
</g>
</g>
<!-- erdantic.examples.pydantic.Party&#45;&gt;erdantic.examples.pydantic.Quest -->
<g id="edge2" class="edge">
<title>erdantic.examples.pydantic.Party:e&#45;&gt;erdantic.examples.pydantic.Quest:w</title>
<path fill="none" stroke="black" d="M238.48,-203.8C277.8,-197.9 283.76,-156.32 318.07,-145.06"/>
<polyline fill="none" stroke="black" points="228.75,-204.5 233.74,-204.14"/>
<polyline fill="none" stroke="black" points="233.74,-204.14 238.72,-203.78"/>
<polyline fill="none" stroke="black" points="336.75,-142.25 331.81,-142.99"/>
<polygon fill="black" stroke="black" points="330.07,-138.2 331.56,-148.09 329.58,-148.38 328.1,-138.49 330.07,-138.2"/>
<polyline fill="none" stroke="black" points="331.81,-142.99 326.86,-143.74"/>
<ellipse fill="none" stroke="black" cx="322.41" cy="-144.4" rx="4" ry="4"/>
</g>
<!-- erdantic.examples.pydantic.QuestGiver -->
<g id="node4" class="node">
<title>erdantic.examples.pydantic.QuestGiver</title>
<g id="a_node4"><a xlink:title="erdantic.examples.pydantic.QuestGiver&#10;&#10;A person who offers a task that needs completing.&#10;&#10;Attributes:&#10; &#160;&#160;&#160;name (str): Name of this quest giver&#10; &#160;&#160;&#160;faction (str): Faction that this quest giver belongs to&#10; &#160;&#160;&#160;location (str): Location this quest giver can be found&#10;">
<polygon fill="none" stroke="black" points="623.25,-86 623.25,-108.5 853.5,-108.5 853.5,-86 623.25,-86"/>
<text text-anchor="start" x="704.25" y="-93.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-weight="bold" font-size="14.00">QuestGiver</text>
<polygon fill="none" stroke="black" points="623.25,-63.5 623.25,-86 672.75,-86 672.75,-63.5 623.25,-63.5"/>
<text text-anchor="start" x="633" y="-69.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">name</text>
<polygon fill="none" stroke="black" points="672.75,-63.5 672.75,-86 732,-86 732,-63.5 672.75,-63.5"/>
<text text-anchor="start" x="695.62" y="-69.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
<polygon fill="none" stroke="black" points="732,-63.5 732,-86 853.5,-86 853.5,-63.5 732,-63.5"/>
<polygon fill="none" stroke="black" points="623.25,-41 623.25,-63.5 672.75,-63.5 672.75,-41 623.25,-41"/>
<text text-anchor="start" x="629.25" y="-47.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">faction</text>
<polygon fill="none" stroke="black" points="672.75,-41 672.75,-63.5 732,-63.5 732,-41 672.75,-41"/>
<text text-anchor="start" x="675.75" y="-47.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str | None</text>
<polygon fill="none" stroke="black" points="732,-41 732,-63.5 853.5,-63.5 853.5,-41 732,-41"/>
<text text-anchor="start" x="778.12" y="-47.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">None</text>
<polygon fill="none" stroke="black" points="623.25,-18.5 623.25,-41 672.75,-41 672.75,-18.5 623.25,-18.5"/>
<text text-anchor="start" x="626.25" y="-24.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">location</text>
<polygon fill="none" stroke="black" points="672.75,-18.5 672.75,-41 732,-41 732,-18.5 672.75,-18.5"/>
<text text-anchor="start" x="695.62" y="-24.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
<polygon fill="none" stroke="black" points="732,-18.5 732,-41 853.5,-41 853.5,-18.5 732,-18.5"/>
<text text-anchor="start" x="735" y="-24.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">&quot;Adventurer&#39;s Guild&quot;</text>
</a>
</g>
</g>
<!-- erdantic.examples.pydantic.Quest&#45;&gt;erdantic.examples.pydantic.QuestGiver -->
<g id="edge3" class="edge">
<title>erdantic.examples.pydantic.Quest:e&#45;&gt;erdantic.examples.pydantic.QuestGiver:w</title>
<path fill="none" stroke="black" d="M525.12,-97.25C560.32,-97.25 575.05,-97.25 608.33,-97.25"/>
<polyline fill="none" stroke="black" points="515.25,-97.25 520.25,-97.25"/>
<polyline fill="none" stroke="black" points="520.25,-97.25 525.25,-97.25"/>
<polyline fill="none" stroke="black" points="623.25,-97.25 618.25,-97.25"/>
<polygon fill="black" stroke="black" points="617.25,-92.25 617.25,-102.25 615.25,-102.25 615.25,-92.25 617.25,-92.25"/>
<polyline fill="none" stroke="black" points="618.25,-97.25 613.25,-97.25"/>
<polygon fill="black" stroke="black" points="612.25,-92.25 612.25,-102.25 610.25,-102.25 610.25,-92.25 612.25,-92.25"/>
<polyline fill="none" stroke="black" points="613.25,-97.25 608.25,-97.25"/>
</g>
</g>
</svg>

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

{
"models": {
"erdantic.examples.attrs.Adventurer": {
"full_name": {
"module": "erdantic.examples.attrs",
"qual_name": "Adventurer"
},
"name": "Adventurer",
"fields": {
"name": {
"model_full_name": {
"module": "erdantic.examples.attrs",
"qual_name": "Adventurer"
},
"name": "name",
"type_name": "str"
},
"profession": {
"model_full_name": {
"module": "erdantic.examples.attrs",
"qual_name": "Adventurer"
},
"name": "profession",
"type_name": "str"
},
"alignment": {
"model_full_name": {
"module": "erdantic.examples.attrs",
"qual_name": "Adventurer"
},
"name": "alignment",
"type_name": "Alignment"
},
"level": {
"model_full_name": {
"module": "erdantic.examples.attrs",
"qual_name": "Adventurer"
},
"name": "level",
"type_name": "int"
}
},
"description": "erdantic.examples.attrs.Adventurer\n\nA person often late for dinner but with a tale or two to tell.\n\nAttributes:\n name (str): Name of this adventurer\n profession (str): Profession of this adventurer\n level (int): Level of this adventurer\n alignment (Alignment): Alignment of this adventurer\n"
},
"erdantic.examples.attrs.Party": {
"full_name": {
"module": "erdantic.examples.attrs",
"qual_name": "Party"
},
"name": "Party",
"fields": {
"name": {
"model_full_name": {
"module": "erdantic.examples.attrs",
"qual_name": "Party"
},
"name": "name",
"type_name": "str"
},
"formed_datetime": {
"model_full_name": {
"module": "erdantic.examples.attrs",
"qual_name": "Party"
},
"name": "formed_datetime",
"type_name": "datetime"
},
"members": {
"model_full_name": {
"module": "erdantic.examples.attrs",
"qual_name": "Party"
},
"name": "members",
"type_name": "list[Adventurer]"
},
"active_quest": {
"model_full_name": {
"module": "erdantic.examples.attrs",
"qual_name": "Party"
},
"name": "active_quest",
"type_name": "Optional[Quest]"
}
},
"description": "erdantic.examples.attrs.Party\n\nA group of adventurers finding themselves doing and saying things altogether unexpected.\n\nAttributes:\n name (str): Name that party is known by\n formed_datetime (datetime): Timestamp of when the party was formed\n members (list[Adventurer]): Adventurers that belong to this party\n active_quest (Optional[Quest]): Current quest that party is actively tackling\n"
},
"erdantic.examples.attrs.Quest": {
"full_name": {
"module": "erdantic.examples.attrs",
"qual_name": "Quest"
},
"name": "Quest",
"fields": {
"name": {
"model_full_name": {
"module": "erdantic.examples.attrs",
"qual_name": "Quest"
},
"name": "name",
"type_name": "str"
},
"giver": {
"model_full_name": {
"module": "erdantic.examples.attrs",
"qual_name": "Quest"
},
"name": "giver",
"type_name": "QuestGiver"
},
"reward_gold": {
"model_full_name": {
"module": "erdantic.examples.attrs",
"qual_name": "Quest"
},
"name": "reward_gold",
"type_name": "int"
}
},
"description": "erdantic.examples.attrs.Quest\n\nA task to complete, with some monetary reward.\n\nAttributes:\n name (str): Name by which this quest is referred to\n giver (QuestGiver): Person who offered the quest\n reward_gold (int): Amount of gold to be rewarded for quest completion\n"
},
"erdantic.examples.attrs.QuestGiver": {
"full_name": {
"module": "erdantic.examples.attrs",
"qual_name": "QuestGiver"
},
"name": "QuestGiver",
"fields": {
"name": {
"model_full_name": {
"module": "erdantic.examples.attrs",
"qual_name": "QuestGiver"
},
"name": "name",
"type_name": "str"
},
"faction": {
"model_full_name": {
"module": "erdantic.examples.attrs",
"qual_name": "QuestGiver"
},
"name": "faction",
"type_name": "Optional[str]"
},
"location": {
"model_full_name": {
"module": "erdantic.examples.attrs",
"qual_name": "QuestGiver"
},
"name": "location",
"type_name": "str"
}
},
"description": "erdantic.examples.attrs.QuestGiver\n\nA person who offers a task that needs completing.\n\nAttributes:\n name (str): Name of this quest giver\n faction (str): Faction that this quest giver belongs to\n location (str): Location this quest giver can be found\n"
}
},
"edges": {
"erdantic.examples.attrs.Party-active_quest-erdantic.examples.attrs.Quest": {
"source_model_full_name": {
"module": "erdantic.examples.attrs",
"qual_name": "Party"
},
"source_field_name": "active_quest",
"target_model_full_name": {
"module": "erdantic.examples.attrs",
"qual_name": "Quest"
},
"target_cardinality": "one",
"target_modality": "zero",
"source_cardinality": "unspecified",
"source_modality": "unspecified"
},
"erdantic.examples.attrs.Party-members-erdantic.examples.attrs.Adventurer": {
"source_model_full_name": {
"module": "erdantic.examples.attrs",
"qual_name": "Party"
},
"source_field_name": "members",
"target_model_full_name": {
"module": "erdantic.examples.attrs",
"qual_name": "Adventurer"
},
"target_cardinality": "many",
"target_modality": "unspecified",
"source_cardinality": "unspecified",
"source_modality": "unspecified"
},
"erdantic.examples.attrs.Quest-giver-erdantic.examples.attrs.QuestGiver": {
"source_model_full_name": {
"module": "erdantic.examples.attrs",
"qual_name": "Quest"
},
"source_field_name": "giver",
"target_model_full_name": {
"module": "erdantic.examples.attrs",
"qual_name": "QuestGiver"
},
"target_cardinality": "one",
"target_modality": "one",
"source_cardinality": "unspecified",
"source_modality": "unspecified"
}
}
}

Sorry, the diff of this file is not supported yet

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 12.2.1 (0)
-->
<!-- Title: Entity Relationship Diagram created by erdantic Pages: 1 -->
<svg width="685pt" height="314pt"
viewBox="0.00 0.00 685.25 313.75" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 309.75)">
<title>Entity Relationship Diagram created by erdantic</title>
<polygon fill="white" stroke="none" points="-4,4 -4,-309.75 681.25,-309.75 681.25,4 -4,4"/>
<text text-anchor="middle" x="338.62" y="-5.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="9.00" fill="#a8a8a8">Created by erdantic vTEST &lt;https://github.com/drivendataorg/erdantic&gt;</text>
<!-- erdantic.examples.attrs.Adventurer -->
<g id="node1" class="node">
<title>erdantic.examples.attrs.Adventurer</title>
<g id="a_node1"><a xlink:title="erdantic.examples.attrs.Adventurer&#10;&#10;A person often late for dinner but with a tale or two to tell.&#10;&#10;Attributes:&#10; &#160;&#160;&#160;name (str): Name of this adventurer&#10; &#160;&#160;&#160;profession (str): Profession of this adventurer&#10; &#160;&#160;&#160;level (int): Level of this adventurer&#10; &#160;&#160;&#160;alignment (Alignment): Alignment of this adventurer&#10;">
<polygon fill="none" stroke="black" points="309.38,-279.25 309.38,-301.75 436.12,-301.75 436.12,-279.25 309.38,-279.25"/>
<text text-anchor="start" x="339" y="-286.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-weight="bold" font-size="14.00">Adventurer</text>
<polygon fill="none" stroke="black" points="309.38,-256.75 309.38,-279.25 371.62,-279.25 371.62,-256.75 309.38,-256.75"/>
<text text-anchor="start" x="325.5" y="-262.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">name</text>
<polygon fill="none" stroke="black" points="371.62,-256.75 371.62,-279.25 436.12,-279.25 436.12,-256.75 371.62,-256.75"/>
<text text-anchor="start" x="397.12" y="-262.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
<polygon fill="none" stroke="black" points="309.38,-234.25 309.38,-256.75 371.62,-256.75 371.62,-234.25 309.38,-234.25"/>
<text text-anchor="start" x="312.38" y="-240.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">profession</text>
<polygon fill="none" stroke="black" points="371.62,-234.25 371.62,-256.75 436.12,-256.75 436.12,-234.25 371.62,-234.25"/>
<text text-anchor="start" x="397.12" y="-240.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
<polygon fill="none" stroke="black" points="309.38,-211.75 309.38,-234.25 371.62,-234.25 371.62,-211.75 309.38,-211.75"/>
<text text-anchor="start" x="313.12" y="-217.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">alignment</text>
<polygon fill="none" stroke="black" points="371.62,-211.75 371.62,-234.25 436.12,-234.25 436.12,-211.75 371.62,-211.75"/>
<text text-anchor="start" x="374.62" y="-217.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">Alignment</text>
<polygon fill="none" stroke="black" points="309.38,-189.25 309.38,-211.75 371.62,-211.75 371.62,-189.25 309.38,-189.25"/>
<text text-anchor="start" x="327.38" y="-195.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">level</text>
<polygon fill="none" stroke="black" points="371.62,-189.25 371.62,-211.75 436.12,-211.75 436.12,-189.25 371.62,-189.25"/>
<text text-anchor="start" x="396.75" y="-195.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">int</text>
</a>
</g>
</g>
<!-- erdantic.examples.attrs.Party -->
<g id="node2" class="node">
<title>erdantic.examples.attrs.Party</title>
<g id="a_node2"><a xlink:title="erdantic.examples.attrs.Party&#10;&#10;A group of adventurers finding themselves doing and saying things altogether unexpected.&#10;&#10;Attributes:&#10; &#160;&#160;&#160;name (str): Name that party is known by&#10; &#160;&#160;&#160;formed_datetime (datetime): Timestamp of when the party was formed&#10; &#160;&#160;&#160;members (list[Adventurer]): Adventurers that belong to this party&#10; &#160;&#160;&#160;active_quest (Optional[Quest]): Current quest that party is actively tackling&#10;">
<polygon fill="none" stroke="black" points="0,-283.25 0,-305.75 193.5,-305.75 193.5,-283.25 0,-283.25"/>
<text text-anchor="start" x="80.62" y="-290.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-weight="bold" font-size="14.00">Party</text>
<polygon fill="none" stroke="black" points="0,-260.75 0,-283.25 99.75,-283.25 99.75,-260.75 0,-260.75"/>
<text text-anchor="start" x="34.88" y="-266.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">name</text>
<polygon fill="none" stroke="black" points="99.75,-260.75 99.75,-283.25 193.5,-283.25 193.5,-260.75 99.75,-260.75"/>
<text text-anchor="start" x="139.88" y="-266.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
<polygon fill="none" stroke="black" points="0,-238.25 0,-260.75 99.75,-260.75 99.75,-238.25 0,-238.25"/>
<text text-anchor="start" x="3" y="-244.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">formed_datetime</text>
<polygon fill="none" stroke="black" points="99.75,-238.25 99.75,-260.75 193.5,-260.75 193.5,-238.25 99.75,-238.25"/>
<text text-anchor="start" x="123" y="-244.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">datetime</text>
<polygon fill="none" stroke="black" points="0,-215.75 0,-238.25 99.75,-238.25 99.75,-215.75 0,-215.75"/>
<text text-anchor="start" x="24.38" y="-221.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">members</text>
<polygon fill="none" stroke="black" points="99.75,-215.75 99.75,-238.25 193.5,-238.25 193.5,-215.75 99.75,-215.75"/>
<text text-anchor="start" x="103.12" y="-221.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">list[Adventurer]</text>
<polygon fill="none" stroke="black" points="0,-193.25 0,-215.75 99.75,-215.75 99.75,-193.25 0,-193.25"/>
<text text-anchor="start" x="16.12" y="-199.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">active_quest</text>
<polygon fill="none" stroke="black" points="99.75,-193.25 99.75,-215.75 193.5,-215.75 193.5,-193.25 99.75,-193.25"/>
<text text-anchor="start" x="102.75" y="-199.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">Optional[Quest]</text>
</a>
</g>
</g>
<!-- erdantic.examples.attrs.Party&#45;&gt;erdantic.examples.attrs.Adventurer -->
<g id="edge1" class="edge">
<title>erdantic.examples.attrs.Party:e&#45;&gt;erdantic.examples.attrs.Adventurer:w</title>
<path fill="none" stroke="black" d="M203.46,-227.67C246.93,-233.77 252.74,-279.62 293.21,-288.88"/>
<polyline fill="none" stroke="black" points="193.5,-227 198.49,-227.34"/>
<polyline fill="none" stroke="black" points="198.49,-227.34 203.48,-227.67"/>
<polygon fill="black" stroke="black" points="298.1,-289.4 307.56,-294.94 303.4,-289.97 307.71,-290.43 307.71,-290.43 307.71,-290.43 303.4,-289.97 308.52,-285.99 298.1,-289.4"/>
<polyline fill="none" stroke="black" points="296.89,-289.27 291.92,-288.74"/>
</g>
<!-- erdantic.examples.attrs.Quest -->
<g id="node3" class="node">
<title>erdantic.examples.attrs.Quest</title>
<g id="a_node3"><a xlink:title="erdantic.examples.attrs.Quest&#10;&#10;A task to complete, with some monetary reward.&#10;&#10;Attributes:&#10; &#160;&#160;&#160;name (str): Name by which this quest is referred to&#10; &#160;&#160;&#160;giver (QuestGiver): Person who offered the quest&#10; &#160;&#160;&#160;reward_gold (int): Amount of gold to be rewarded for quest completion&#10;">
<polygon fill="none" stroke="black" points="301.5,-131 301.5,-153.5 444,-153.5 444,-131 301.5,-131"/>
<text text-anchor="start" x="355.5" y="-138.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-weight="bold" font-size="14.00">Quest</text>
<polygon fill="none" stroke="black" points="301.5,-108.5 301.5,-131 375.75,-131 375.75,-108.5 301.5,-108.5"/>
<text text-anchor="start" x="323.62" y="-114.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">name</text>
<polygon fill="none" stroke="black" points="375.75,-108.5 375.75,-131 444,-131 444,-108.5 375.75,-108.5"/>
<text text-anchor="start" x="403.12" y="-114.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
<polygon fill="none" stroke="black" points="301.5,-86 301.5,-108.5 375.75,-108.5 375.75,-86 301.5,-86"/>
<text text-anchor="start" x="324.75" y="-92.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">giver</text>
<polygon fill="none" stroke="black" points="375.75,-86 375.75,-108.5 444,-108.5 444,-86 375.75,-86"/>
<text text-anchor="start" x="378.75" y="-92.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">QuestGiver</text>
<polygon fill="none" stroke="black" points="301.5,-63.5 301.5,-86 375.75,-86 375.75,-63.5 301.5,-63.5"/>
<text text-anchor="start" x="304.5" y="-69.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">reward_gold</text>
<polygon fill="none" stroke="black" points="375.75,-63.5 375.75,-86 444,-86 444,-63.5 375.75,-63.5"/>
<text text-anchor="start" x="402.75" y="-69.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">int</text>
</a>
</g>
</g>
<!-- erdantic.examples.attrs.Party&#45;&gt;erdantic.examples.attrs.Quest -->
<g id="edge2" class="edge">
<title>erdantic.examples.attrs.Party:e&#45;&gt;erdantic.examples.attrs.Quest:w</title>
<path fill="none" stroke="black" d="M203.23,-203.8C242.55,-197.9 248.51,-156.32 282.82,-145.06"/>
<polyline fill="none" stroke="black" points="193.5,-204.5 198.49,-204.14"/>
<polyline fill="none" stroke="black" points="198.49,-204.14 203.47,-203.78"/>
<polyline fill="none" stroke="black" points="301.5,-142.25 296.56,-142.99"/>
<polygon fill="black" stroke="black" points="294.82,-138.2 296.31,-148.09 294.33,-148.38 292.85,-138.49 294.82,-138.2"/>
<polyline fill="none" stroke="black" points="296.56,-142.99 291.61,-143.74"/>
<ellipse fill="none" stroke="black" cx="287.16" cy="-144.4" rx="4" ry="4"/>
</g>
<!-- erdantic.examples.attrs.QuestGiver -->
<g id="node4" class="node">
<title>erdantic.examples.attrs.QuestGiver</title>
<g id="a_node4"><a xlink:title="erdantic.examples.attrs.QuestGiver&#10;&#10;A person who offers a task that needs completing.&#10;&#10;Attributes:&#10; &#160;&#160;&#160;name (str): Name of this quest giver&#10; &#160;&#160;&#160;faction (str): Faction that this quest giver belongs to&#10; &#160;&#160;&#160;location (str): Location this quest giver can be found&#10;">
<polygon fill="none" stroke="black" points="552,-86 552,-108.5 677.25,-108.5 677.25,-86 552,-86"/>
<text text-anchor="start" x="580.5" y="-93.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-weight="bold" font-size="14.00">QuestGiver</text>
<polygon fill="none" stroke="black" points="552,-63.5 552,-86 601.5,-86 601.5,-63.5 552,-63.5"/>
<text text-anchor="start" x="561.75" y="-69.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">name</text>
<polygon fill="none" stroke="black" points="601.5,-63.5 601.5,-86 677.25,-86 677.25,-63.5 601.5,-63.5"/>
<text text-anchor="start" x="632.62" y="-69.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
<polygon fill="none" stroke="black" points="552,-41 552,-63.5 601.5,-63.5 601.5,-41 552,-41"/>
<text text-anchor="start" x="558" y="-47.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">faction</text>
<polygon fill="none" stroke="black" points="601.5,-41 601.5,-63.5 677.25,-63.5 677.25,-41 601.5,-41"/>
<text text-anchor="start" x="604.5" y="-47.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">Optional[str]</text>
<polygon fill="none" stroke="black" points="552,-18.5 552,-41 601.5,-41 601.5,-18.5 552,-18.5"/>
<text text-anchor="start" x="555" y="-24.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">location</text>
<polygon fill="none" stroke="black" points="601.5,-18.5 601.5,-41 677.25,-41 677.25,-18.5 601.5,-18.5"/>
<text text-anchor="start" x="632.62" y="-24.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
</a>
</g>
</g>
<!-- erdantic.examples.attrs.Quest&#45;&gt;erdantic.examples.attrs.QuestGiver -->
<g id="edge3" class="edge">
<title>erdantic.examples.attrs.Quest:e&#45;&gt;erdantic.examples.attrs.QuestGiver:w</title>
<path fill="none" stroke="black" d="M453.87,-97.25C489.07,-97.25 503.8,-97.25 537.08,-97.25"/>
<polyline fill="none" stroke="black" points="444,-97.25 449,-97.25"/>
<polyline fill="none" stroke="black" points="449,-97.25 454,-97.25"/>
<polyline fill="none" stroke="black" points="552,-97.25 547,-97.25"/>
<polygon fill="black" stroke="black" points="546,-92.25 546,-102.25 544,-102.25 544,-92.25 546,-92.25"/>
<polyline fill="none" stroke="black" points="547,-97.25 542,-97.25"/>
<polygon fill="black" stroke="black" points="541,-92.25 541,-102.25 539,-102.25 539,-92.25 541,-92.25"/>
<polyline fill="none" stroke="black" points="542,-97.25 537,-97.25"/>
</g>
</g>
</svg>

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

{
"models": {
"erdantic.examples.dataclasses.Adventurer": {
"full_name": {
"module": "erdantic.examples.dataclasses",
"qual_name": "Adventurer"
},
"name": "Adventurer",
"fields": {
"name": {
"model_full_name": {
"module": "erdantic.examples.dataclasses",
"qual_name": "Adventurer"
},
"name": "name",
"type_name": "str"
},
"profession": {
"model_full_name": {
"module": "erdantic.examples.dataclasses",
"qual_name": "Adventurer"
},
"name": "profession",
"type_name": "str"
},
"alignment": {
"model_full_name": {
"module": "erdantic.examples.dataclasses",
"qual_name": "Adventurer"
},
"name": "alignment",
"type_name": "Alignment"
},
"level": {
"model_full_name": {
"module": "erdantic.examples.dataclasses",
"qual_name": "Adventurer"
},
"name": "level",
"type_name": "int"
}
},
"description": "erdantic.examples.dataclasses.Adventurer\n\nA person often late for dinner but with a tale or two to tell.\n\nAttributes:\n name (str): Name of this adventurer\n profession (str): Profession of this adventurer\n alignment (Alignment): Alignment of this adventurer\n level (int): Level of this adventurer\n"
},
"erdantic.examples.dataclasses.Party": {
"full_name": {
"module": "erdantic.examples.dataclasses",
"qual_name": "Party"
},
"name": "Party",
"fields": {
"name": {
"model_full_name": {
"module": "erdantic.examples.dataclasses",
"qual_name": "Party"
},
"name": "name",
"type_name": "str"
},
"formed_datetime": {
"model_full_name": {
"module": "erdantic.examples.dataclasses",
"qual_name": "Party"
},
"name": "formed_datetime",
"type_name": "datetime"
},
"members": {
"model_full_name": {
"module": "erdantic.examples.dataclasses",
"qual_name": "Party"
},
"name": "members",
"type_name": "list[Adventurer]"
},
"active_quest": {
"model_full_name": {
"module": "erdantic.examples.dataclasses",
"qual_name": "Party"
},
"name": "active_quest",
"type_name": "Optional[Quest]"
}
},
"description": "erdantic.examples.dataclasses.Party\n\nA group of adventurers finding themselves doing and saying things altogether unexpected.\n\nAttributes:\n name (str): Name that party is known by\n formed_datetime (datetime): Timestamp of when the party was formed\n members (list[Adventurer]): Adventurers that belong to this party\n active_quest (Optional[Quest]): Current quest that party is actively tackling\n"
},
"erdantic.examples.dataclasses.Quest": {
"full_name": {
"module": "erdantic.examples.dataclasses",
"qual_name": "Quest"
},
"name": "Quest",
"fields": {
"name": {
"model_full_name": {
"module": "erdantic.examples.dataclasses",
"qual_name": "Quest"
},
"name": "name",
"type_name": "str"
},
"giver": {
"model_full_name": {
"module": "erdantic.examples.dataclasses",
"qual_name": "Quest"
},
"name": "giver",
"type_name": "QuestGiver"
},
"reward_gold": {
"model_full_name": {
"module": "erdantic.examples.dataclasses",
"qual_name": "Quest"
},
"name": "reward_gold",
"type_name": "int"
}
},
"description": "erdantic.examples.dataclasses.Quest\n\nA task to complete, with some monetary reward.\n\nAttributes:\n name (str): Name by which this quest is referred to\n giver (QuestGiver): Person who offered the quest\n reward_gold (int): Amount of gold to be rewarded for quest completion\n"
},
"erdantic.examples.dataclasses.QuestGiver": {
"full_name": {
"module": "erdantic.examples.dataclasses",
"qual_name": "QuestGiver"
},
"name": "QuestGiver",
"fields": {
"name": {
"model_full_name": {
"module": "erdantic.examples.dataclasses",
"qual_name": "QuestGiver"
},
"name": "name",
"type_name": "str"
},
"faction": {
"model_full_name": {
"module": "erdantic.examples.dataclasses",
"qual_name": "QuestGiver"
},
"name": "faction",
"type_name": "Optional[str]"
},
"location": {
"model_full_name": {
"module": "erdantic.examples.dataclasses",
"qual_name": "QuestGiver"
},
"name": "location",
"type_name": "str"
}
},
"description": "erdantic.examples.dataclasses.QuestGiver\n\nA person who offers a task that needs completing.\n\nAttributes:\n name (str): Name of this quest giver\n faction (str): Faction that this quest giver belongs to\n location (str): Location this quest giver can be found\n"
}
},
"edges": {
"erdantic.examples.dataclasses.Party-active_quest-erdantic.examples.dataclasses.Quest": {
"source_model_full_name": {
"module": "erdantic.examples.dataclasses",
"qual_name": "Party"
},
"source_field_name": "active_quest",
"target_model_full_name": {
"module": "erdantic.examples.dataclasses",
"qual_name": "Quest"
},
"target_cardinality": "one",
"target_modality": "zero",
"source_cardinality": "unspecified",
"source_modality": "unspecified"
},
"erdantic.examples.dataclasses.Party-members-erdantic.examples.dataclasses.Adventurer": {
"source_model_full_name": {
"module": "erdantic.examples.dataclasses",
"qual_name": "Party"
},
"source_field_name": "members",
"target_model_full_name": {
"module": "erdantic.examples.dataclasses",
"qual_name": "Adventurer"
},
"target_cardinality": "many",
"target_modality": "unspecified",
"source_cardinality": "unspecified",
"source_modality": "unspecified"
},
"erdantic.examples.dataclasses.Quest-giver-erdantic.examples.dataclasses.QuestGiver": {
"source_model_full_name": {
"module": "erdantic.examples.dataclasses",
"qual_name": "Quest"
},
"source_field_name": "giver",
"target_model_full_name": {
"module": "erdantic.examples.dataclasses",
"qual_name": "QuestGiver"
},
"target_cardinality": "one",
"target_modality": "one",
"source_cardinality": "unspecified",
"source_modality": "unspecified"
}
}
}

Sorry, the diff of this file is not supported yet

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 12.2.1 (0)
-->
<!-- Title: Entity Relationship Diagram created by erdantic Pages: 1 -->
<svg width="685pt" height="314pt"
viewBox="0.00 0.00 685.25 313.75" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 309.75)">
<title>Entity Relationship Diagram created by erdantic</title>
<polygon fill="white" stroke="none" points="-4,4 -4,-309.75 681.25,-309.75 681.25,4 -4,4"/>
<text text-anchor="middle" x="338.62" y="-5.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="9.00" fill="#a8a8a8">Created by erdantic vTEST &lt;https://github.com/drivendataorg/erdantic&gt;</text>
<!-- erdantic.examples.dataclasses.Adventurer -->
<g id="node1" class="node">
<title>erdantic.examples.dataclasses.Adventurer</title>
<g id="a_node1"><a xlink:title="erdantic.examples.dataclasses.Adventurer&#10;&#10;A person often late for dinner but with a tale or two to tell.&#10;&#10;Attributes:&#10; &#160;&#160;&#160;name (str): Name of this adventurer&#10; &#160;&#160;&#160;profession (str): Profession of this adventurer&#10; &#160;&#160;&#160;alignment (Alignment): Alignment of this adventurer&#10; &#160;&#160;&#160;level (int): Level of this adventurer&#10;">
<polygon fill="none" stroke="black" points="309.38,-279.25 309.38,-301.75 436.12,-301.75 436.12,-279.25 309.38,-279.25"/>
<text text-anchor="start" x="339" y="-286.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-weight="bold" font-size="14.00">Adventurer</text>
<polygon fill="none" stroke="black" points="309.38,-256.75 309.38,-279.25 371.62,-279.25 371.62,-256.75 309.38,-256.75"/>
<text text-anchor="start" x="325.5" y="-262.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">name</text>
<polygon fill="none" stroke="black" points="371.62,-256.75 371.62,-279.25 436.12,-279.25 436.12,-256.75 371.62,-256.75"/>
<text text-anchor="start" x="397.12" y="-262.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
<polygon fill="none" stroke="black" points="309.38,-234.25 309.38,-256.75 371.62,-256.75 371.62,-234.25 309.38,-234.25"/>
<text text-anchor="start" x="312.38" y="-240.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">profession</text>
<polygon fill="none" stroke="black" points="371.62,-234.25 371.62,-256.75 436.12,-256.75 436.12,-234.25 371.62,-234.25"/>
<text text-anchor="start" x="397.12" y="-240.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
<polygon fill="none" stroke="black" points="309.38,-211.75 309.38,-234.25 371.62,-234.25 371.62,-211.75 309.38,-211.75"/>
<text text-anchor="start" x="313.12" y="-217.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">alignment</text>
<polygon fill="none" stroke="black" points="371.62,-211.75 371.62,-234.25 436.12,-234.25 436.12,-211.75 371.62,-211.75"/>
<text text-anchor="start" x="374.62" y="-217.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">Alignment</text>
<polygon fill="none" stroke="black" points="309.38,-189.25 309.38,-211.75 371.62,-211.75 371.62,-189.25 309.38,-189.25"/>
<text text-anchor="start" x="327.38" y="-195.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">level</text>
<polygon fill="none" stroke="black" points="371.62,-189.25 371.62,-211.75 436.12,-211.75 436.12,-189.25 371.62,-189.25"/>
<text text-anchor="start" x="396.75" y="-195.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">int</text>
</a>
</g>
</g>
<!-- erdantic.examples.dataclasses.Party -->
<g id="node2" class="node">
<title>erdantic.examples.dataclasses.Party</title>
<g id="a_node2"><a xlink:title="erdantic.examples.dataclasses.Party&#10;&#10;A group of adventurers finding themselves doing and saying things altogether unexpected.&#10;&#10;Attributes:&#10; &#160;&#160;&#160;name (str): Name that party is known by&#10; &#160;&#160;&#160;formed_datetime (datetime): Timestamp of when the party was formed&#10; &#160;&#160;&#160;members (list[Adventurer]): Adventurers that belong to this party&#10; &#160;&#160;&#160;active_quest (Optional[Quest]): Current quest that party is actively tackling&#10;">
<polygon fill="none" stroke="black" points="0,-283.25 0,-305.75 193.5,-305.75 193.5,-283.25 0,-283.25"/>
<text text-anchor="start" x="80.62" y="-290.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-weight="bold" font-size="14.00">Party</text>
<polygon fill="none" stroke="black" points="0,-260.75 0,-283.25 99.75,-283.25 99.75,-260.75 0,-260.75"/>
<text text-anchor="start" x="34.88" y="-266.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">name</text>
<polygon fill="none" stroke="black" points="99.75,-260.75 99.75,-283.25 193.5,-283.25 193.5,-260.75 99.75,-260.75"/>
<text text-anchor="start" x="139.88" y="-266.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
<polygon fill="none" stroke="black" points="0,-238.25 0,-260.75 99.75,-260.75 99.75,-238.25 0,-238.25"/>
<text text-anchor="start" x="3" y="-244.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">formed_datetime</text>
<polygon fill="none" stroke="black" points="99.75,-238.25 99.75,-260.75 193.5,-260.75 193.5,-238.25 99.75,-238.25"/>
<text text-anchor="start" x="123" y="-244.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">datetime</text>
<polygon fill="none" stroke="black" points="0,-215.75 0,-238.25 99.75,-238.25 99.75,-215.75 0,-215.75"/>
<text text-anchor="start" x="24.38" y="-221.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">members</text>
<polygon fill="none" stroke="black" points="99.75,-215.75 99.75,-238.25 193.5,-238.25 193.5,-215.75 99.75,-215.75"/>
<text text-anchor="start" x="103.12" y="-221.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">list[Adventurer]</text>
<polygon fill="none" stroke="black" points="0,-193.25 0,-215.75 99.75,-215.75 99.75,-193.25 0,-193.25"/>
<text text-anchor="start" x="16.12" y="-199.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">active_quest</text>
<polygon fill="none" stroke="black" points="99.75,-193.25 99.75,-215.75 193.5,-215.75 193.5,-193.25 99.75,-193.25"/>
<text text-anchor="start" x="102.75" y="-199.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">Optional[Quest]</text>
</a>
</g>
</g>
<!-- erdantic.examples.dataclasses.Party&#45;&gt;erdantic.examples.dataclasses.Adventurer -->
<g id="edge1" class="edge">
<title>erdantic.examples.dataclasses.Party:e&#45;&gt;erdantic.examples.dataclasses.Adventurer:w</title>
<path fill="none" stroke="black" d="M203.46,-227.67C246.93,-233.77 252.74,-279.62 293.21,-288.88"/>
<polyline fill="none" stroke="black" points="193.5,-227 198.49,-227.34"/>
<polyline fill="none" stroke="black" points="198.49,-227.34 203.48,-227.67"/>
<polygon fill="black" stroke="black" points="298.1,-289.4 307.56,-294.94 303.4,-289.97 307.71,-290.43 307.71,-290.43 307.71,-290.43 303.4,-289.97 308.52,-285.99 298.1,-289.4"/>
<polyline fill="none" stroke="black" points="296.89,-289.27 291.92,-288.74"/>
</g>
<!-- erdantic.examples.dataclasses.Quest -->
<g id="node3" class="node">
<title>erdantic.examples.dataclasses.Quest</title>
<g id="a_node3"><a xlink:title="erdantic.examples.dataclasses.Quest&#10;&#10;A task to complete, with some monetary reward.&#10;&#10;Attributes:&#10; &#160;&#160;&#160;name (str): Name by which this quest is referred to&#10; &#160;&#160;&#160;giver (QuestGiver): Person who offered the quest&#10; &#160;&#160;&#160;reward_gold (int): Amount of gold to be rewarded for quest completion&#10;">
<polygon fill="none" stroke="black" points="301.5,-131 301.5,-153.5 444,-153.5 444,-131 301.5,-131"/>
<text text-anchor="start" x="355.5" y="-138.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-weight="bold" font-size="14.00">Quest</text>
<polygon fill="none" stroke="black" points="301.5,-108.5 301.5,-131 375.75,-131 375.75,-108.5 301.5,-108.5"/>
<text text-anchor="start" x="323.62" y="-114.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">name</text>
<polygon fill="none" stroke="black" points="375.75,-108.5 375.75,-131 444,-131 444,-108.5 375.75,-108.5"/>
<text text-anchor="start" x="403.12" y="-114.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
<polygon fill="none" stroke="black" points="301.5,-86 301.5,-108.5 375.75,-108.5 375.75,-86 301.5,-86"/>
<text text-anchor="start" x="324.75" y="-92.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">giver</text>
<polygon fill="none" stroke="black" points="375.75,-86 375.75,-108.5 444,-108.5 444,-86 375.75,-86"/>
<text text-anchor="start" x="378.75" y="-92.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">QuestGiver</text>
<polygon fill="none" stroke="black" points="301.5,-63.5 301.5,-86 375.75,-86 375.75,-63.5 301.5,-63.5"/>
<text text-anchor="start" x="304.5" y="-69.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">reward_gold</text>
<polygon fill="none" stroke="black" points="375.75,-63.5 375.75,-86 444,-86 444,-63.5 375.75,-63.5"/>
<text text-anchor="start" x="402.75" y="-69.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">int</text>
</a>
</g>
</g>
<!-- erdantic.examples.dataclasses.Party&#45;&gt;erdantic.examples.dataclasses.Quest -->
<g id="edge2" class="edge">
<title>erdantic.examples.dataclasses.Party:e&#45;&gt;erdantic.examples.dataclasses.Quest:w</title>
<path fill="none" stroke="black" d="M203.23,-203.8C242.55,-197.9 248.51,-156.32 282.82,-145.06"/>
<polyline fill="none" stroke="black" points="193.5,-204.5 198.49,-204.14"/>
<polyline fill="none" stroke="black" points="198.49,-204.14 203.47,-203.78"/>
<polyline fill="none" stroke="black" points="301.5,-142.25 296.56,-142.99"/>
<polygon fill="black" stroke="black" points="294.82,-138.2 296.31,-148.09 294.33,-148.38 292.85,-138.49 294.82,-138.2"/>
<polyline fill="none" stroke="black" points="296.56,-142.99 291.61,-143.74"/>
<ellipse fill="none" stroke="black" cx="287.16" cy="-144.4" rx="4" ry="4"/>
</g>
<!-- erdantic.examples.dataclasses.QuestGiver -->
<g id="node4" class="node">
<title>erdantic.examples.dataclasses.QuestGiver</title>
<g id="a_node4"><a xlink:title="erdantic.examples.dataclasses.QuestGiver&#10;&#10;A person who offers a task that needs completing.&#10;&#10;Attributes:&#10; &#160;&#160;&#160;name (str): Name of this quest giver&#10; &#160;&#160;&#160;faction (str): Faction that this quest giver belongs to&#10; &#160;&#160;&#160;location (str): Location this quest giver can be found&#10;">
<polygon fill="none" stroke="black" points="552,-86 552,-108.5 677.25,-108.5 677.25,-86 552,-86"/>
<text text-anchor="start" x="580.5" y="-93.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-weight="bold" font-size="14.00">QuestGiver</text>
<polygon fill="none" stroke="black" points="552,-63.5 552,-86 601.5,-86 601.5,-63.5 552,-63.5"/>
<text text-anchor="start" x="561.75" y="-69.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">name</text>
<polygon fill="none" stroke="black" points="601.5,-63.5 601.5,-86 677.25,-86 677.25,-63.5 601.5,-63.5"/>
<text text-anchor="start" x="632.62" y="-69.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
<polygon fill="none" stroke="black" points="552,-41 552,-63.5 601.5,-63.5 601.5,-41 552,-41"/>
<text text-anchor="start" x="558" y="-47.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">faction</text>
<polygon fill="none" stroke="black" points="601.5,-41 601.5,-63.5 677.25,-63.5 677.25,-41 601.5,-41"/>
<text text-anchor="start" x="604.5" y="-47.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">Optional[str]</text>
<polygon fill="none" stroke="black" points="552,-18.5 552,-41 601.5,-41 601.5,-18.5 552,-18.5"/>
<text text-anchor="start" x="555" y="-24.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">location</text>
<polygon fill="none" stroke="black" points="601.5,-18.5 601.5,-41 677.25,-41 677.25,-18.5 601.5,-18.5"/>
<text text-anchor="start" x="632.62" y="-24.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
</a>
</g>
</g>
<!-- erdantic.examples.dataclasses.Quest&#45;&gt;erdantic.examples.dataclasses.QuestGiver -->
<g id="edge3" class="edge">
<title>erdantic.examples.dataclasses.Quest:e&#45;&gt;erdantic.examples.dataclasses.QuestGiver:w</title>
<path fill="none" stroke="black" d="M453.87,-97.25C489.07,-97.25 503.8,-97.25 537.08,-97.25"/>
<polyline fill="none" stroke="black" points="444,-97.25 449,-97.25"/>
<polyline fill="none" stroke="black" points="449,-97.25 454,-97.25"/>
<polyline fill="none" stroke="black" points="552,-97.25 547,-97.25"/>
<polygon fill="black" stroke="black" points="546,-92.25 546,-102.25 544,-102.25 544,-92.25 546,-92.25"/>
<polyline fill="none" stroke="black" points="547,-97.25 542,-97.25"/>
<polygon fill="black" stroke="black" points="541,-92.25 541,-102.25 539,-102.25 539,-92.25 541,-92.25"/>
<polyline fill="none" stroke="black" points="542,-97.25 537,-97.25"/>
</g>
</g>
</svg>

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

{
"models": {
"erdantic.examples.pydantic_v1.Adventurer": {
"full_name": {
"module": "erdantic.examples.pydantic_v1",
"qual_name": "Adventurer"
},
"name": "Adventurer",
"fields": {
"name": {
"model_full_name": {
"module": "erdantic.examples.pydantic_v1",
"qual_name": "Adventurer"
},
"name": "name",
"type_name": "str"
},
"profession": {
"model_full_name": {
"module": "erdantic.examples.pydantic_v1",
"qual_name": "Adventurer"
},
"name": "profession",
"type_name": "str"
},
"alignment": {
"model_full_name": {
"module": "erdantic.examples.pydantic_v1",
"qual_name": "Adventurer"
},
"name": "alignment",
"type_name": "Alignment"
},
"level": {
"model_full_name": {
"module": "erdantic.examples.pydantic_v1",
"qual_name": "Adventurer"
},
"name": "level",
"type_name": "int"
}
},
"description": "erdantic.examples.pydantic_v1.Adventurer\n\nA person often late for dinner but with a tale or two to tell.\n\nAttributes:\n name (str): Name of this adventurer\n profession (str): Profession of this adventurer\n alignment (Alignment): Alignment of this adventurer\n level (int): Level of this adventurer\n"
},
"erdantic.examples.pydantic_v1.Party": {
"full_name": {
"module": "erdantic.examples.pydantic_v1",
"qual_name": "Party"
},
"name": "Party",
"fields": {
"name": {
"model_full_name": {
"module": "erdantic.examples.pydantic_v1",
"qual_name": "Party"
},
"name": "name",
"type_name": "str"
},
"formed_datetime": {
"model_full_name": {
"module": "erdantic.examples.pydantic_v1",
"qual_name": "Party"
},
"name": "formed_datetime",
"type_name": "datetime"
},
"members": {
"model_full_name": {
"module": "erdantic.examples.pydantic_v1",
"qual_name": "Party"
},
"name": "members",
"type_name": "list[Adventurer]"
},
"active_quest": {
"model_full_name": {
"module": "erdantic.examples.pydantic_v1",
"qual_name": "Party"
},
"name": "active_quest",
"type_name": "Optional[Quest]"
}
},
"description": "erdantic.examples.pydantic_v1.Party\n\nA group of adventurers finding themselves doing and saying things altogether unexpected.\n\nAttributes:\n name (str): Name that party is known by\n formed_datetime (datetime): Timestamp of when the party was formed\n members (list[Adventurer]): Adventurers that belong to this party\n active_quest (Optional[Quest]): Current quest that party is actively tackling\n"
},
"erdantic.examples.pydantic_v1.Quest": {
"full_name": {
"module": "erdantic.examples.pydantic_v1",
"qual_name": "Quest"
},
"name": "Quest",
"fields": {
"name": {
"model_full_name": {
"module": "erdantic.examples.pydantic_v1",
"qual_name": "Quest"
},
"name": "name",
"type_name": "str"
},
"giver": {
"model_full_name": {
"module": "erdantic.examples.pydantic_v1",
"qual_name": "Quest"
},
"name": "giver",
"type_name": "QuestGiver"
},
"reward_gold": {
"model_full_name": {
"module": "erdantic.examples.pydantic_v1",
"qual_name": "Quest"
},
"name": "reward_gold",
"type_name": "int"
}
},
"description": "erdantic.examples.pydantic_v1.Quest\n\nA task to complete, with some monetary reward.\n\nAttributes:\n name (str): Name by which this quest is referred to\n giver (QuestGiver): Person who offered the quest\n reward_gold (int): Amount of gold to be rewarded for quest completion\n"
},
"erdantic.examples.pydantic_v1.QuestGiver": {
"full_name": {
"module": "erdantic.examples.pydantic_v1",
"qual_name": "QuestGiver"
},
"name": "QuestGiver",
"fields": {
"name": {
"model_full_name": {
"module": "erdantic.examples.pydantic_v1",
"qual_name": "QuestGiver"
},
"name": "name",
"type_name": "str"
},
"faction": {
"model_full_name": {
"module": "erdantic.examples.pydantic_v1",
"qual_name": "QuestGiver"
},
"name": "faction",
"type_name": "Optional[str]"
},
"location": {
"model_full_name": {
"module": "erdantic.examples.pydantic_v1",
"qual_name": "QuestGiver"
},
"name": "location",
"type_name": "str"
}
},
"description": "erdantic.examples.pydantic_v1.QuestGiver\n\nA person who offers a task that needs completing.\n\nAttributes:\n name (str): Name of this quest giver\n faction (str): Faction that this quest giver belongs to\n location (str): Location this quest giver can be found\n"
}
},
"edges": {
"erdantic.examples.pydantic_v1.Party-active_quest-erdantic.examples.pydantic_v1.Quest": {
"source_model_full_name": {
"module": "erdantic.examples.pydantic_v1",
"qual_name": "Party"
},
"source_field_name": "active_quest",
"target_model_full_name": {
"module": "erdantic.examples.pydantic_v1",
"qual_name": "Quest"
},
"target_cardinality": "one",
"target_modality": "zero",
"source_cardinality": "unspecified",
"source_modality": "unspecified"
},
"erdantic.examples.pydantic_v1.Party-members-erdantic.examples.pydantic_v1.Adventurer": {
"source_model_full_name": {
"module": "erdantic.examples.pydantic_v1",
"qual_name": "Party"
},
"source_field_name": "members",
"target_model_full_name": {
"module": "erdantic.examples.pydantic_v1",
"qual_name": "Adventurer"
},
"target_cardinality": "many",
"target_modality": "unspecified",
"source_cardinality": "unspecified",
"source_modality": "unspecified"
},
"erdantic.examples.pydantic_v1.Quest-giver-erdantic.examples.pydantic_v1.QuestGiver": {
"source_model_full_name": {
"module": "erdantic.examples.pydantic_v1",
"qual_name": "Quest"
},
"source_field_name": "giver",
"target_model_full_name": {
"module": "erdantic.examples.pydantic_v1",
"qual_name": "QuestGiver"
},
"target_cardinality": "one",
"target_modality": "one",
"source_cardinality": "unspecified",
"source_modality": "unspecified"
}
}
}

Sorry, the diff of this file is not supported yet

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 12.2.1 (0)
-->
<!-- Title: Entity Relationship Diagram created by erdantic Pages: 1 -->
<svg width="685pt" height="314pt"
viewBox="0.00 0.00 685.25 313.75" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 309.75)">
<title>Entity Relationship Diagram created by erdantic</title>
<polygon fill="white" stroke="none" points="-4,4 -4,-309.75 681.25,-309.75 681.25,4 -4,4"/>
<text text-anchor="middle" x="338.62" y="-5.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="9.00" fill="#a8a8a8">Created by erdantic vTEST &lt;https://github.com/drivendataorg/erdantic&gt;</text>
<!-- erdantic.examples.pydantic_v1.Adventurer -->
<g id="node1" class="node">
<title>erdantic.examples.pydantic_v1.Adventurer</title>
<g id="a_node1"><a xlink:title="erdantic.examples.pydantic_v1.Adventurer&#10;&#10;A person often late for dinner but with a tale or two to tell.&#10;&#10;Attributes:&#10; &#160;&#160;&#160;name (str): Name of this adventurer&#10; &#160;&#160;&#160;profession (str): Profession of this adventurer&#10; &#160;&#160;&#160;alignment (Alignment): Alignment of this adventurer&#10; &#160;&#160;&#160;level (int): Level of this adventurer&#10;">
<polygon fill="none" stroke="black" points="309.38,-279.25 309.38,-301.75 436.12,-301.75 436.12,-279.25 309.38,-279.25"/>
<text text-anchor="start" x="339" y="-286.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-weight="bold" font-size="14.00">Adventurer</text>
<polygon fill="none" stroke="black" points="309.38,-256.75 309.38,-279.25 371.62,-279.25 371.62,-256.75 309.38,-256.75"/>
<text text-anchor="start" x="325.5" y="-262.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">name</text>
<polygon fill="none" stroke="black" points="371.62,-256.75 371.62,-279.25 436.12,-279.25 436.12,-256.75 371.62,-256.75"/>
<text text-anchor="start" x="397.12" y="-262.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
<polygon fill="none" stroke="black" points="309.38,-234.25 309.38,-256.75 371.62,-256.75 371.62,-234.25 309.38,-234.25"/>
<text text-anchor="start" x="312.38" y="-240.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">profession</text>
<polygon fill="none" stroke="black" points="371.62,-234.25 371.62,-256.75 436.12,-256.75 436.12,-234.25 371.62,-234.25"/>
<text text-anchor="start" x="397.12" y="-240.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
<polygon fill="none" stroke="black" points="309.38,-211.75 309.38,-234.25 371.62,-234.25 371.62,-211.75 309.38,-211.75"/>
<text text-anchor="start" x="313.12" y="-217.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">alignment</text>
<polygon fill="none" stroke="black" points="371.62,-211.75 371.62,-234.25 436.12,-234.25 436.12,-211.75 371.62,-211.75"/>
<text text-anchor="start" x="374.62" y="-217.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">Alignment</text>
<polygon fill="none" stroke="black" points="309.38,-189.25 309.38,-211.75 371.62,-211.75 371.62,-189.25 309.38,-189.25"/>
<text text-anchor="start" x="327.38" y="-195.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">level</text>
<polygon fill="none" stroke="black" points="371.62,-189.25 371.62,-211.75 436.12,-211.75 436.12,-189.25 371.62,-189.25"/>
<text text-anchor="start" x="396.75" y="-195.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">int</text>
</a>
</g>
</g>
<!-- erdantic.examples.pydantic_v1.Party -->
<g id="node2" class="node">
<title>erdantic.examples.pydantic_v1.Party</title>
<g id="a_node2"><a xlink:title="erdantic.examples.pydantic_v1.Party&#10;&#10;A group of adventurers finding themselves doing and saying things altogether unexpected.&#10;&#10;Attributes:&#10; &#160;&#160;&#160;name (str): Name that party is known by&#10; &#160;&#160;&#160;formed_datetime (datetime): Timestamp of when the party was formed&#10; &#160;&#160;&#160;members (list[Adventurer]): Adventurers that belong to this party&#10; &#160;&#160;&#160;active_quest (Optional[Quest]): Current quest that party is actively tackling&#10;">
<polygon fill="none" stroke="black" points="0,-283.25 0,-305.75 193.5,-305.75 193.5,-283.25 0,-283.25"/>
<text text-anchor="start" x="80.62" y="-290.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-weight="bold" font-size="14.00">Party</text>
<polygon fill="none" stroke="black" points="0,-260.75 0,-283.25 99.75,-283.25 99.75,-260.75 0,-260.75"/>
<text text-anchor="start" x="34.88" y="-266.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">name</text>
<polygon fill="none" stroke="black" points="99.75,-260.75 99.75,-283.25 193.5,-283.25 193.5,-260.75 99.75,-260.75"/>
<text text-anchor="start" x="139.88" y="-266.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
<polygon fill="none" stroke="black" points="0,-238.25 0,-260.75 99.75,-260.75 99.75,-238.25 0,-238.25"/>
<text text-anchor="start" x="3" y="-244.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">formed_datetime</text>
<polygon fill="none" stroke="black" points="99.75,-238.25 99.75,-260.75 193.5,-260.75 193.5,-238.25 99.75,-238.25"/>
<text text-anchor="start" x="123" y="-244.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">datetime</text>
<polygon fill="none" stroke="black" points="0,-215.75 0,-238.25 99.75,-238.25 99.75,-215.75 0,-215.75"/>
<text text-anchor="start" x="24.38" y="-221.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">members</text>
<polygon fill="none" stroke="black" points="99.75,-215.75 99.75,-238.25 193.5,-238.25 193.5,-215.75 99.75,-215.75"/>
<text text-anchor="start" x="103.12" y="-221.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">list[Adventurer]</text>
<polygon fill="none" stroke="black" points="0,-193.25 0,-215.75 99.75,-215.75 99.75,-193.25 0,-193.25"/>
<text text-anchor="start" x="16.12" y="-199.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">active_quest</text>
<polygon fill="none" stroke="black" points="99.75,-193.25 99.75,-215.75 193.5,-215.75 193.5,-193.25 99.75,-193.25"/>
<text text-anchor="start" x="102.75" y="-199.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">Optional[Quest]</text>
</a>
</g>
</g>
<!-- erdantic.examples.pydantic_v1.Party&#45;&gt;erdantic.examples.pydantic_v1.Adventurer -->
<g id="edge1" class="edge">
<title>erdantic.examples.pydantic_v1.Party:e&#45;&gt;erdantic.examples.pydantic_v1.Adventurer:w</title>
<path fill="none" stroke="black" d="M203.46,-227.67C246.93,-233.77 252.74,-279.62 293.21,-288.88"/>
<polyline fill="none" stroke="black" points="193.5,-227 198.49,-227.34"/>
<polyline fill="none" stroke="black" points="198.49,-227.34 203.48,-227.67"/>
<polygon fill="black" stroke="black" points="298.1,-289.4 307.56,-294.94 303.4,-289.97 307.71,-290.43 307.71,-290.43 307.71,-290.43 303.4,-289.97 308.52,-285.99 298.1,-289.4"/>
<polyline fill="none" stroke="black" points="296.89,-289.27 291.92,-288.74"/>
</g>
<!-- erdantic.examples.pydantic_v1.Quest -->
<g id="node3" class="node">
<title>erdantic.examples.pydantic_v1.Quest</title>
<g id="a_node3"><a xlink:title="erdantic.examples.pydantic_v1.Quest&#10;&#10;A task to complete, with some monetary reward.&#10;&#10;Attributes:&#10; &#160;&#160;&#160;name (str): Name by which this quest is referred to&#10; &#160;&#160;&#160;giver (QuestGiver): Person who offered the quest&#10; &#160;&#160;&#160;reward_gold (int): Amount of gold to be rewarded for quest completion&#10;">
<polygon fill="none" stroke="black" points="301.5,-131 301.5,-153.5 444,-153.5 444,-131 301.5,-131"/>
<text text-anchor="start" x="355.5" y="-138.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-weight="bold" font-size="14.00">Quest</text>
<polygon fill="none" stroke="black" points="301.5,-108.5 301.5,-131 375.75,-131 375.75,-108.5 301.5,-108.5"/>
<text text-anchor="start" x="323.62" y="-114.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">name</text>
<polygon fill="none" stroke="black" points="375.75,-108.5 375.75,-131 444,-131 444,-108.5 375.75,-108.5"/>
<text text-anchor="start" x="403.12" y="-114.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
<polygon fill="none" stroke="black" points="301.5,-86 301.5,-108.5 375.75,-108.5 375.75,-86 301.5,-86"/>
<text text-anchor="start" x="324.75" y="-92.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">giver</text>
<polygon fill="none" stroke="black" points="375.75,-86 375.75,-108.5 444,-108.5 444,-86 375.75,-86"/>
<text text-anchor="start" x="378.75" y="-92.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">QuestGiver</text>
<polygon fill="none" stroke="black" points="301.5,-63.5 301.5,-86 375.75,-86 375.75,-63.5 301.5,-63.5"/>
<text text-anchor="start" x="304.5" y="-69.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">reward_gold</text>
<polygon fill="none" stroke="black" points="375.75,-63.5 375.75,-86 444,-86 444,-63.5 375.75,-63.5"/>
<text text-anchor="start" x="402.75" y="-69.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">int</text>
</a>
</g>
</g>
<!-- erdantic.examples.pydantic_v1.Party&#45;&gt;erdantic.examples.pydantic_v1.Quest -->
<g id="edge2" class="edge">
<title>erdantic.examples.pydantic_v1.Party:e&#45;&gt;erdantic.examples.pydantic_v1.Quest:w</title>
<path fill="none" stroke="black" d="M203.23,-203.8C242.55,-197.9 248.51,-156.32 282.82,-145.06"/>
<polyline fill="none" stroke="black" points="193.5,-204.5 198.49,-204.14"/>
<polyline fill="none" stroke="black" points="198.49,-204.14 203.47,-203.78"/>
<polyline fill="none" stroke="black" points="301.5,-142.25 296.56,-142.99"/>
<polygon fill="black" stroke="black" points="294.82,-138.2 296.31,-148.09 294.33,-148.38 292.85,-138.49 294.82,-138.2"/>
<polyline fill="none" stroke="black" points="296.56,-142.99 291.61,-143.74"/>
<ellipse fill="none" stroke="black" cx="287.16" cy="-144.4" rx="4" ry="4"/>
</g>
<!-- erdantic.examples.pydantic_v1.QuestGiver -->
<g id="node4" class="node">
<title>erdantic.examples.pydantic_v1.QuestGiver</title>
<g id="a_node4"><a xlink:title="erdantic.examples.pydantic_v1.QuestGiver&#10;&#10;A person who offers a task that needs completing.&#10;&#10;Attributes:&#10; &#160;&#160;&#160;name (str): Name of this quest giver&#10; &#160;&#160;&#160;faction (str): Faction that this quest giver belongs to&#10; &#160;&#160;&#160;location (str): Location this quest giver can be found&#10;">
<polygon fill="none" stroke="black" points="552,-86 552,-108.5 677.25,-108.5 677.25,-86 552,-86"/>
<text text-anchor="start" x="580.5" y="-93.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-weight="bold" font-size="14.00">QuestGiver</text>
<polygon fill="none" stroke="black" points="552,-63.5 552,-86 601.5,-86 601.5,-63.5 552,-63.5"/>
<text text-anchor="start" x="561.75" y="-69.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">name</text>
<polygon fill="none" stroke="black" points="601.5,-63.5 601.5,-86 677.25,-86 677.25,-63.5 601.5,-63.5"/>
<text text-anchor="start" x="632.62" y="-69.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
<polygon fill="none" stroke="black" points="552,-41 552,-63.5 601.5,-63.5 601.5,-41 552,-41"/>
<text text-anchor="start" x="558" y="-47.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">faction</text>
<polygon fill="none" stroke="black" points="601.5,-41 601.5,-63.5 677.25,-63.5 677.25,-41 601.5,-41"/>
<text text-anchor="start" x="604.5" y="-47.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">Optional[str]</text>
<polygon fill="none" stroke="black" points="552,-18.5 552,-41 601.5,-41 601.5,-18.5 552,-18.5"/>
<text text-anchor="start" x="555" y="-24.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">location</text>
<polygon fill="none" stroke="black" points="601.5,-18.5 601.5,-41 677.25,-41 677.25,-18.5 601.5,-18.5"/>
<text text-anchor="start" x="632.62" y="-24.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
</a>
</g>
</g>
<!-- erdantic.examples.pydantic_v1.Quest&#45;&gt;erdantic.examples.pydantic_v1.QuestGiver -->
<g id="edge3" class="edge">
<title>erdantic.examples.pydantic_v1.Quest:e&#45;&gt;erdantic.examples.pydantic_v1.QuestGiver:w</title>
<path fill="none" stroke="black" d="M453.87,-97.25C489.07,-97.25 503.8,-97.25 537.08,-97.25"/>
<polyline fill="none" stroke="black" points="444,-97.25 449,-97.25"/>
<polyline fill="none" stroke="black" points="449,-97.25 454,-97.25"/>
<polyline fill="none" stroke="black" points="552,-97.25 547,-97.25"/>
<polygon fill="black" stroke="black" points="546,-92.25 546,-102.25 544,-102.25 544,-92.25 546,-92.25"/>
<polyline fill="none" stroke="black" points="547,-97.25 542,-97.25"/>
<polygon fill="black" stroke="black" points="541,-92.25 541,-102.25 539,-102.25 539,-92.25 541,-92.25"/>
<polyline fill="none" stroke="black" points="542,-97.25 537,-97.25"/>
</g>
</g>
</svg>

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

{
"models": {
"erdantic.examples.pydantic.Adventurer": {
"full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Adventurer"
},
"name": "Adventurer",
"fields": {
"name": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Adventurer"
},
"name": "name",
"type_name": "str"
},
"profession": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Adventurer"
},
"name": "profession",
"type_name": "str"
},
"alignment": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Adventurer"
},
"name": "alignment",
"type_name": "Alignment"
},
"level": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Adventurer"
},
"name": "level",
"type_name": "int"
}
},
"description": "erdantic.examples.pydantic.Adventurer\n\nA person often late for dinner but with a tale or two to tell.\n\nAttributes:\n name (str): Name of this adventurer\n profession (str): Profession of this adventurer\n alignment (Alignment): Alignment of this adventurer\n level (int): Level of this adventurer\n"
},
"erdantic.examples.pydantic.Party": {
"full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Party"
},
"name": "Party",
"fields": {
"name": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Party"
},
"name": "name",
"type_name": "str"
},
"formed_datetime": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Party"
},
"name": "formed_datetime",
"type_name": "datetime"
},
"members": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Party"
},
"name": "members",
"type_name": "list[Adventurer]"
},
"active_quest": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Party"
},
"name": "active_quest",
"type_name": "Optional[Quest]"
}
},
"description": "erdantic.examples.pydantic.Party\n\nA group of adventurers finding themselves doing and saying things altogether unexpected.\n\nAttributes:\n name (str): Name that party is known by\n formed_datetime (datetime): Timestamp of when the party was formed\n members (list[Adventurer]): Adventurers that belong to this party\n active_quest (Optional[Quest]): Current quest that party is actively tackling\n"
},
"erdantic.examples.pydantic.Quest": {
"full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Quest"
},
"name": "Quest",
"fields": {
"name": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Quest"
},
"name": "name",
"type_name": "str"
},
"giver": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Quest"
},
"name": "giver",
"type_name": "QuestGiver"
},
"reward_gold": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Quest"
},
"name": "reward_gold",
"type_name": "int"
}
},
"description": "erdantic.examples.pydantic.Quest\n\nA task to complete, with some monetary reward.\n\nAttributes:\n name (str): Name by which this quest is referred to\n giver (QuestGiver): Person who offered the quest\n reward_gold (int): Amount of gold to be rewarded for quest completion\n"
},
"erdantic.examples.pydantic.QuestGiver": {
"full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "QuestGiver"
},
"name": "QuestGiver",
"fields": {
"name": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "QuestGiver"
},
"name": "name",
"type_name": "str"
},
"faction": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "QuestGiver"
},
"name": "faction",
"type_name": "Optional[str]"
},
"location": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "QuestGiver"
},
"name": "location",
"type_name": "str"
}
},
"description": "erdantic.examples.pydantic.QuestGiver\n\nA person who offers a task that needs completing.\n\nAttributes:\n name (str): Name of this quest giver\n faction (str): Faction that this quest giver belongs to\n location (str): Location this quest giver can be found\n"
}
},
"edges": {
"erdantic.examples.pydantic.Party-active_quest-erdantic.examples.pydantic.Quest": {
"source_model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Party"
},
"source_field_name": "active_quest",
"target_model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Quest"
},
"target_cardinality": "one",
"target_modality": "zero",
"source_cardinality": "unspecified",
"source_modality": "unspecified"
},
"erdantic.examples.pydantic.Party-members-erdantic.examples.pydantic.Adventurer": {
"source_model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Party"
},
"source_field_name": "members",
"target_model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Adventurer"
},
"target_cardinality": "many",
"target_modality": "unspecified",
"source_cardinality": "unspecified",
"source_modality": "unspecified"
},
"erdantic.examples.pydantic.Quest-giver-erdantic.examples.pydantic.QuestGiver": {
"source_model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Quest"
},
"source_field_name": "giver",
"target_model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "QuestGiver"
},
"target_cardinality": "one",
"target_modality": "one",
"source_cardinality": "unspecified",
"source_modality": "unspecified"
}
}
}

Sorry, the diff of this file is not supported yet

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 12.2.1 (0)
-->
<!-- Title: Entity Relationship Diagram created by erdantic Pages: 1 -->
<svg width="685pt" height="314pt"
viewBox="0.00 0.00 685.25 313.75" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 309.75)">
<title>Entity Relationship Diagram created by erdantic</title>
<polygon fill="white" stroke="none" points="-4,4 -4,-309.75 681.25,-309.75 681.25,4 -4,4"/>
<text text-anchor="middle" x="338.62" y="-5.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="9.00" fill="#a8a8a8">Created by erdantic vTEST &lt;https://github.com/drivendataorg/erdantic&gt;</text>
<!-- erdantic.examples.pydantic.Adventurer -->
<g id="node1" class="node">
<title>erdantic.examples.pydantic.Adventurer</title>
<g id="a_node1"><a xlink:title="erdantic.examples.pydantic.Adventurer&#10;&#10;A person often late for dinner but with a tale or two to tell.&#10;&#10;Attributes:&#10; &#160;&#160;&#160;name (str): Name of this adventurer&#10; &#160;&#160;&#160;profession (str): Profession of this adventurer&#10; &#160;&#160;&#160;alignment (Alignment): Alignment of this adventurer&#10; &#160;&#160;&#160;level (int): Level of this adventurer&#10;">
<polygon fill="none" stroke="black" points="309.38,-279.25 309.38,-301.75 436.12,-301.75 436.12,-279.25 309.38,-279.25"/>
<text text-anchor="start" x="339" y="-286.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-weight="bold" font-size="14.00">Adventurer</text>
<polygon fill="none" stroke="black" points="309.38,-256.75 309.38,-279.25 371.62,-279.25 371.62,-256.75 309.38,-256.75"/>
<text text-anchor="start" x="325.5" y="-262.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">name</text>
<polygon fill="none" stroke="black" points="371.62,-256.75 371.62,-279.25 436.12,-279.25 436.12,-256.75 371.62,-256.75"/>
<text text-anchor="start" x="397.12" y="-262.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
<polygon fill="none" stroke="black" points="309.38,-234.25 309.38,-256.75 371.62,-256.75 371.62,-234.25 309.38,-234.25"/>
<text text-anchor="start" x="312.38" y="-240.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">profession</text>
<polygon fill="none" stroke="black" points="371.62,-234.25 371.62,-256.75 436.12,-256.75 436.12,-234.25 371.62,-234.25"/>
<text text-anchor="start" x="397.12" y="-240.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
<polygon fill="none" stroke="black" points="309.38,-211.75 309.38,-234.25 371.62,-234.25 371.62,-211.75 309.38,-211.75"/>
<text text-anchor="start" x="313.12" y="-217.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">alignment</text>
<polygon fill="none" stroke="black" points="371.62,-211.75 371.62,-234.25 436.12,-234.25 436.12,-211.75 371.62,-211.75"/>
<text text-anchor="start" x="374.62" y="-217.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">Alignment</text>
<polygon fill="none" stroke="black" points="309.38,-189.25 309.38,-211.75 371.62,-211.75 371.62,-189.25 309.38,-189.25"/>
<text text-anchor="start" x="327.38" y="-195.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">level</text>
<polygon fill="none" stroke="black" points="371.62,-189.25 371.62,-211.75 436.12,-211.75 436.12,-189.25 371.62,-189.25"/>
<text text-anchor="start" x="396.75" y="-195.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">int</text>
</a>
</g>
</g>
<!-- erdantic.examples.pydantic.Party -->
<g id="node2" class="node">
<title>erdantic.examples.pydantic.Party</title>
<g id="a_node2"><a xlink:title="erdantic.examples.pydantic.Party&#10;&#10;A group of adventurers finding themselves doing and saying things altogether unexpected.&#10;&#10;Attributes:&#10; &#160;&#160;&#160;name (str): Name that party is known by&#10; &#160;&#160;&#160;formed_datetime (datetime): Timestamp of when the party was formed&#10; &#160;&#160;&#160;members (list[Adventurer]): Adventurers that belong to this party&#10; &#160;&#160;&#160;active_quest (Optional[Quest]): Current quest that party is actively tackling&#10;">
<polygon fill="none" stroke="black" points="0,-283.25 0,-305.75 193.5,-305.75 193.5,-283.25 0,-283.25"/>
<text text-anchor="start" x="80.62" y="-290.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-weight="bold" font-size="14.00">Party</text>
<polygon fill="none" stroke="black" points="0,-260.75 0,-283.25 99.75,-283.25 99.75,-260.75 0,-260.75"/>
<text text-anchor="start" x="34.88" y="-266.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">name</text>
<polygon fill="none" stroke="black" points="99.75,-260.75 99.75,-283.25 193.5,-283.25 193.5,-260.75 99.75,-260.75"/>
<text text-anchor="start" x="139.88" y="-266.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
<polygon fill="none" stroke="black" points="0,-238.25 0,-260.75 99.75,-260.75 99.75,-238.25 0,-238.25"/>
<text text-anchor="start" x="3" y="-244.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">formed_datetime</text>
<polygon fill="none" stroke="black" points="99.75,-238.25 99.75,-260.75 193.5,-260.75 193.5,-238.25 99.75,-238.25"/>
<text text-anchor="start" x="123" y="-244.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">datetime</text>
<polygon fill="none" stroke="black" points="0,-215.75 0,-238.25 99.75,-238.25 99.75,-215.75 0,-215.75"/>
<text text-anchor="start" x="24.38" y="-221.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">members</text>
<polygon fill="none" stroke="black" points="99.75,-215.75 99.75,-238.25 193.5,-238.25 193.5,-215.75 99.75,-215.75"/>
<text text-anchor="start" x="103.12" y="-221.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">list[Adventurer]</text>
<polygon fill="none" stroke="black" points="0,-193.25 0,-215.75 99.75,-215.75 99.75,-193.25 0,-193.25"/>
<text text-anchor="start" x="16.12" y="-199.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">active_quest</text>
<polygon fill="none" stroke="black" points="99.75,-193.25 99.75,-215.75 193.5,-215.75 193.5,-193.25 99.75,-193.25"/>
<text text-anchor="start" x="102.75" y="-199.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">Optional[Quest]</text>
</a>
</g>
</g>
<!-- erdantic.examples.pydantic.Party&#45;&gt;erdantic.examples.pydantic.Adventurer -->
<g id="edge1" class="edge">
<title>erdantic.examples.pydantic.Party:e&#45;&gt;erdantic.examples.pydantic.Adventurer:w</title>
<path fill="none" stroke="black" d="M203.46,-227.67C246.93,-233.77 252.74,-279.62 293.21,-288.88"/>
<polyline fill="none" stroke="black" points="193.5,-227 198.49,-227.34"/>
<polyline fill="none" stroke="black" points="198.49,-227.34 203.48,-227.67"/>
<polygon fill="black" stroke="black" points="298.1,-289.4 307.56,-294.94 303.4,-289.97 307.71,-290.43 307.71,-290.43 307.71,-290.43 303.4,-289.97 308.52,-285.99 298.1,-289.4"/>
<polyline fill="none" stroke="black" points="296.89,-289.27 291.92,-288.74"/>
</g>
<!-- erdantic.examples.pydantic.Quest -->
<g id="node3" class="node">
<title>erdantic.examples.pydantic.Quest</title>
<g id="a_node3"><a xlink:title="erdantic.examples.pydantic.Quest&#10;&#10;A task to complete, with some monetary reward.&#10;&#10;Attributes:&#10; &#160;&#160;&#160;name (str): Name by which this quest is referred to&#10; &#160;&#160;&#160;giver (QuestGiver): Person who offered the quest&#10; &#160;&#160;&#160;reward_gold (int): Amount of gold to be rewarded for quest completion&#10;">
<polygon fill="none" stroke="black" points="301.5,-131 301.5,-153.5 444,-153.5 444,-131 301.5,-131"/>
<text text-anchor="start" x="355.5" y="-138.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-weight="bold" font-size="14.00">Quest</text>
<polygon fill="none" stroke="black" points="301.5,-108.5 301.5,-131 375.75,-131 375.75,-108.5 301.5,-108.5"/>
<text text-anchor="start" x="323.62" y="-114.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">name</text>
<polygon fill="none" stroke="black" points="375.75,-108.5 375.75,-131 444,-131 444,-108.5 375.75,-108.5"/>
<text text-anchor="start" x="403.12" y="-114.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
<polygon fill="none" stroke="black" points="301.5,-86 301.5,-108.5 375.75,-108.5 375.75,-86 301.5,-86"/>
<text text-anchor="start" x="324.75" y="-92.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">giver</text>
<polygon fill="none" stroke="black" points="375.75,-86 375.75,-108.5 444,-108.5 444,-86 375.75,-86"/>
<text text-anchor="start" x="378.75" y="-92.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">QuestGiver</text>
<polygon fill="none" stroke="black" points="301.5,-63.5 301.5,-86 375.75,-86 375.75,-63.5 301.5,-63.5"/>
<text text-anchor="start" x="304.5" y="-69.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">reward_gold</text>
<polygon fill="none" stroke="black" points="375.75,-63.5 375.75,-86 444,-86 444,-63.5 375.75,-63.5"/>
<text text-anchor="start" x="402.75" y="-69.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">int</text>
</a>
</g>
</g>
<!-- erdantic.examples.pydantic.Party&#45;&gt;erdantic.examples.pydantic.Quest -->
<g id="edge2" class="edge">
<title>erdantic.examples.pydantic.Party:e&#45;&gt;erdantic.examples.pydantic.Quest:w</title>
<path fill="none" stroke="black" d="M203.23,-203.8C242.55,-197.9 248.51,-156.32 282.82,-145.06"/>
<polyline fill="none" stroke="black" points="193.5,-204.5 198.49,-204.14"/>
<polyline fill="none" stroke="black" points="198.49,-204.14 203.47,-203.78"/>
<polyline fill="none" stroke="black" points="301.5,-142.25 296.56,-142.99"/>
<polygon fill="black" stroke="black" points="294.82,-138.2 296.31,-148.09 294.33,-148.38 292.85,-138.49 294.82,-138.2"/>
<polyline fill="none" stroke="black" points="296.56,-142.99 291.61,-143.74"/>
<ellipse fill="none" stroke="black" cx="287.16" cy="-144.4" rx="4" ry="4"/>
</g>
<!-- erdantic.examples.pydantic.QuestGiver -->
<g id="node4" class="node">
<title>erdantic.examples.pydantic.QuestGiver</title>
<g id="a_node4"><a xlink:title="erdantic.examples.pydantic.QuestGiver&#10;&#10;A person who offers a task that needs completing.&#10;&#10;Attributes:&#10; &#160;&#160;&#160;name (str): Name of this quest giver&#10; &#160;&#160;&#160;faction (str): Faction that this quest giver belongs to&#10; &#160;&#160;&#160;location (str): Location this quest giver can be found&#10;">
<polygon fill="none" stroke="black" points="552,-86 552,-108.5 677.25,-108.5 677.25,-86 552,-86"/>
<text text-anchor="start" x="580.5" y="-93.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-weight="bold" font-size="14.00">QuestGiver</text>
<polygon fill="none" stroke="black" points="552,-63.5 552,-86 601.5,-86 601.5,-63.5 552,-63.5"/>
<text text-anchor="start" x="561.75" y="-69.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">name</text>
<polygon fill="none" stroke="black" points="601.5,-63.5 601.5,-86 677.25,-86 677.25,-63.5 601.5,-63.5"/>
<text text-anchor="start" x="632.62" y="-69.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
<polygon fill="none" stroke="black" points="552,-41 552,-63.5 601.5,-63.5 601.5,-41 552,-41"/>
<text text-anchor="start" x="558" y="-47.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">faction</text>
<polygon fill="none" stroke="black" points="601.5,-41 601.5,-63.5 677.25,-63.5 677.25,-41 601.5,-41"/>
<text text-anchor="start" x="604.5" y="-47.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">Optional[str]</text>
<polygon fill="none" stroke="black" points="552,-18.5 552,-41 601.5,-41 601.5,-18.5 552,-18.5"/>
<text text-anchor="start" x="555" y="-24.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">location</text>
<polygon fill="none" stroke="black" points="601.5,-18.5 601.5,-41 677.25,-41 677.25,-18.5 601.5,-18.5"/>
<text text-anchor="start" x="632.62" y="-24.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
</a>
</g>
</g>
<!-- erdantic.examples.pydantic.Quest&#45;&gt;erdantic.examples.pydantic.QuestGiver -->
<g id="edge3" class="edge">
<title>erdantic.examples.pydantic.Quest:e&#45;&gt;erdantic.examples.pydantic.QuestGiver:w</title>
<path fill="none" stroke="black" d="M453.87,-97.25C489.07,-97.25 503.8,-97.25 537.08,-97.25"/>
<polyline fill="none" stroke="black" points="444,-97.25 449,-97.25"/>
<polyline fill="none" stroke="black" points="449,-97.25 454,-97.25"/>
<polyline fill="none" stroke="black" points="552,-97.25 547,-97.25"/>
<polygon fill="black" stroke="black" points="546,-92.25 546,-102.25 544,-102.25 544,-92.25 546,-92.25"/>
<polyline fill="none" stroke="black" points="547,-97.25 542,-97.25"/>
<polygon fill="black" stroke="black" points="541,-92.25 541,-102.25 539,-102.25 539,-92.25 541,-92.25"/>
<polyline fill="none" stroke="black" points="542,-97.25 537,-97.25"/>
</g>
</g>
</svg>

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

{
"models": {
"erdantic.examples.pydantic.Adventurer": {
"full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Adventurer"
},
"name": "Adventurer",
"fields": {
"name": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Adventurer"
},
"name": "name",
"type_name": "str",
"default_value": ""
},
"profession": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Adventurer"
},
"name": "profession",
"type_name": "str",
"default_value": ""
},
"alignment": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Adventurer"
},
"name": "alignment",
"type_name": "Alignment",
"default_value": ""
},
"level": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Adventurer"
},
"name": "level",
"type_name": "int",
"default_value": "1"
}
},
"description": "erdantic.examples.pydantic.Adventurer\n\nA person often late for dinner but with a tale or two to tell.\n\nAttributes:\n name (str): Name of this adventurer\n profession (str): Profession of this adventurer\n alignment (Alignment): Alignment of this adventurer\n level (int): Level of this adventurer\n"
},
"erdantic.examples.pydantic.Party": {
"full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Party"
},
"name": "Party",
"fields": {
"name": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Party"
},
"name": "name",
"type_name": "str",
"default_value": ""
},
"formed_datetime": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Party"
},
"name": "formed_datetime",
"type_name": "datetime",
"default_value": ""
},
"members": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Party"
},
"name": "members",
"type_name": "list[Adventurer]",
"default_value": "[]"
},
"active_quest": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Party"
},
"name": "active_quest",
"type_name": "Optional[Quest]",
"default_value": "None"
}
},
"description": "erdantic.examples.pydantic.Party\n\nA group of adventurers finding themselves doing and saying things altogether unexpected.\n\nAttributes:\n name (str): Name that party is known by\n formed_datetime (datetime): Timestamp of when the party was formed\n members (list[Adventurer]): Adventurers that belong to this party\n active_quest (Optional[Quest]): Current quest that party is actively tackling\n"
},
"erdantic.examples.pydantic.Quest": {
"full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Quest"
},
"name": "Quest",
"fields": {
"name": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Quest"
},
"name": "name",
"type_name": "str",
"default_value": ""
},
"giver": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Quest"
},
"name": "giver",
"type_name": "QuestGiver",
"default_value": ""
},
"reward_gold": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Quest"
},
"name": "reward_gold",
"type_name": "int",
"default_value": "100"
}
},
"description": "erdantic.examples.pydantic.Quest\n\nA task to complete, with some monetary reward.\n\nAttributes:\n name (str): Name by which this quest is referred to\n giver (QuestGiver): Person who offered the quest\n reward_gold (int): Amount of gold to be rewarded for quest completion\n"
},
"erdantic.examples.pydantic.QuestGiver": {
"full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "QuestGiver"
},
"name": "QuestGiver",
"fields": {
"name": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "QuestGiver"
},
"name": "name",
"type_name": "str",
"default_value": ""
},
"faction": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "QuestGiver"
},
"name": "faction",
"type_name": "Optional[str]",
"default_value": "None"
},
"location": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "QuestGiver"
},
"name": "location",
"type_name": "str",
"default_value": "\"Adventurer's Guild\""
}
},
"description": "erdantic.examples.pydantic.QuestGiver\n\nA person who offers a task that needs completing.\n\nAttributes:\n name (str): Name of this quest giver\n faction (str): Faction that this quest giver belongs to\n location (str): Location this quest giver can be found\n"
}
},
"edges": {
"erdantic.examples.pydantic.Party-active_quest-erdantic.examples.pydantic.Quest": {
"source_model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Party"
},
"source_field_name": "active_quest",
"target_model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Quest"
},
"target_cardinality": "one",
"target_modality": "zero",
"source_cardinality": "unspecified",
"source_modality": "unspecified"
},
"erdantic.examples.pydantic.Party-members-erdantic.examples.pydantic.Adventurer": {
"source_model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Party"
},
"source_field_name": "members",
"target_model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Adventurer"
},
"target_cardinality": "many",
"target_modality": "unspecified",
"source_cardinality": "unspecified",
"source_modality": "unspecified"
},
"erdantic.examples.pydantic.Quest-giver-erdantic.examples.pydantic.QuestGiver": {
"source_model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Quest"
},
"source_field_name": "giver",
"target_model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "QuestGiver"
},
"target_cardinality": "one",
"target_modality": "one",
"source_cardinality": "unspecified",
"source_modality": "unspecified"
}
}
}

Sorry, the diff of this file is not supported yet

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 12.2.1 (0)
-->
<!-- Title: Entity Relationship Diagram created by erdantic Pages: 1 -->
<svg width="879pt" height="314pt"
viewBox="0.00 0.00 878.75 313.75" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 309.75)">
<title>Entity Relationship Diagram created by erdantic</title>
<polygon fill="white" stroke="none" points="-4,4 -4,-309.75 874.75,-309.75 874.75,4 -4,4"/>
<text text-anchor="middle" x="435.38" y="-5.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="9.00" fill="#a8a8a8">Created by erdantic vTEST &lt;https://github.com/drivendataorg/erdantic&gt;</text>
<!-- erdantic.examples.pydantic.Adventurer -->
<g id="node1" class="node">
<title>erdantic.examples.pydantic.Adventurer</title>
<g id="a_node1"><a xlink:title="erdantic.examples.pydantic.Adventurer&#10;&#10;A person often late for dinner but with a tale or two to tell.&#10;&#10;Attributes:&#10; &#160;&#160;&#160;name (str): Name of this adventurer&#10; &#160;&#160;&#160;profession (str): Profession of this adventurer&#10; &#160;&#160;&#160;alignment (Alignment): Alignment of this adventurer&#10; &#160;&#160;&#160;level (int): Level of this adventurer&#10;">
<polygon fill="none" stroke="black" points="345.38,-279.25 345.38,-301.75 508.12,-301.75 508.12,-279.25 345.38,-279.25"/>
<text text-anchor="start" x="393" y="-286.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-weight="bold" font-size="14.00">Adventurer</text>
<polygon fill="none" stroke="black" points="345.38,-256.75 345.38,-279.25 407.62,-279.25 407.62,-256.75 345.38,-256.75"/>
<text text-anchor="start" x="361.5" y="-262.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">name</text>
<polygon fill="none" stroke="black" points="407.62,-256.75 407.62,-279.25 472.12,-279.25 472.12,-256.75 407.62,-256.75"/>
<text text-anchor="start" x="433.12" y="-262.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
<polygon fill="none" stroke="black" points="472.12,-256.75 472.12,-279.25 508.12,-279.25 508.12,-256.75 472.12,-256.75"/>
<polygon fill="none" stroke="black" points="345.38,-234.25 345.38,-256.75 407.62,-256.75 407.62,-234.25 345.38,-234.25"/>
<text text-anchor="start" x="348.38" y="-240.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">profession</text>
<polygon fill="none" stroke="black" points="407.62,-234.25 407.62,-256.75 472.12,-256.75 472.12,-234.25 407.62,-234.25"/>
<text text-anchor="start" x="433.12" y="-240.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
<polygon fill="none" stroke="black" points="472.12,-234.25 472.12,-256.75 508.12,-256.75 508.12,-234.25 472.12,-234.25"/>
<polygon fill="none" stroke="black" points="345.38,-211.75 345.38,-234.25 407.62,-234.25 407.62,-211.75 345.38,-211.75"/>
<text text-anchor="start" x="349.12" y="-217.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">alignment</text>
<polygon fill="none" stroke="black" points="407.62,-211.75 407.62,-234.25 472.12,-234.25 472.12,-211.75 407.62,-211.75"/>
<text text-anchor="start" x="410.62" y="-217.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">Alignment</text>
<polygon fill="none" stroke="black" points="472.12,-211.75 472.12,-234.25 508.12,-234.25 508.12,-211.75 472.12,-211.75"/>
<polygon fill="none" stroke="black" points="345.38,-189.25 345.38,-211.75 407.62,-211.75 407.62,-189.25 345.38,-189.25"/>
<text text-anchor="start" x="363.38" y="-195.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">level</text>
<polygon fill="none" stroke="black" points="407.62,-189.25 407.62,-211.75 472.12,-211.75 472.12,-189.25 407.62,-189.25"/>
<text text-anchor="start" x="432.75" y="-195.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">int</text>
<polygon fill="none" stroke="black" points="472.12,-189.25 472.12,-211.75 508.12,-211.75 508.12,-189.25 472.12,-189.25"/>
<text text-anchor="start" x="486.75" y="-195.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">1</text>
</a>
</g>
</g>
<!-- erdantic.examples.pydantic.Party -->
<g id="node2" class="node">
<title>erdantic.examples.pydantic.Party</title>
<g id="a_node2"><a xlink:title="erdantic.examples.pydantic.Party&#10;&#10;A group of adventurers finding themselves doing and saying things altogether unexpected.&#10;&#10;Attributes:&#10; &#160;&#160;&#160;name (str): Name that party is known by&#10; &#160;&#160;&#160;formed_datetime (datetime): Timestamp of when the party was formed&#10; &#160;&#160;&#160;members (list[Adventurer]): Adventurers that belong to this party&#10; &#160;&#160;&#160;active_quest (Optional[Quest]): Current quest that party is actively tackling&#10;">
<polygon fill="none" stroke="black" points="0,-283.25 0,-305.75 229.5,-305.75 229.5,-283.25 0,-283.25"/>
<text text-anchor="start" x="98.62" y="-290.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-weight="bold" font-size="14.00">Party</text>
<polygon fill="none" stroke="black" points="0,-260.75 0,-283.25 99.75,-283.25 99.75,-260.75 0,-260.75"/>
<text text-anchor="start" x="34.88" y="-266.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">name</text>
<polygon fill="none" stroke="black" points="99.75,-260.75 99.75,-283.25 193.5,-283.25 193.5,-260.75 99.75,-260.75"/>
<text text-anchor="start" x="139.88" y="-266.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
<polygon fill="none" stroke="black" points="193.5,-260.75 193.5,-283.25 229.5,-283.25 229.5,-260.75 193.5,-260.75"/>
<polygon fill="none" stroke="black" points="0,-238.25 0,-260.75 99.75,-260.75 99.75,-238.25 0,-238.25"/>
<text text-anchor="start" x="3" y="-244.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">formed_datetime</text>
<polygon fill="none" stroke="black" points="99.75,-238.25 99.75,-260.75 193.5,-260.75 193.5,-238.25 99.75,-238.25"/>
<text text-anchor="start" x="123" y="-244.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">datetime</text>
<polygon fill="none" stroke="black" points="193.5,-238.25 193.5,-260.75 229.5,-260.75 229.5,-238.25 193.5,-238.25"/>
<polygon fill="none" stroke="black" points="0,-215.75 0,-238.25 99.75,-238.25 99.75,-215.75 0,-215.75"/>
<text text-anchor="start" x="24.38" y="-221.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">members</text>
<polygon fill="none" stroke="black" points="99.75,-215.75 99.75,-238.25 193.5,-238.25 193.5,-215.75 99.75,-215.75"/>
<text text-anchor="start" x="103.12" y="-221.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">list[Adventurer]</text>
<polygon fill="none" stroke="black" points="193.5,-215.75 193.5,-238.25 229.5,-238.25 229.5,-215.75 193.5,-215.75"/>
<text text-anchor="start" x="207" y="-221.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">[]</text>
<polygon fill="none" stroke="black" points="0,-193.25 0,-215.75 99.75,-215.75 99.75,-193.25 0,-193.25"/>
<text text-anchor="start" x="16.12" y="-199.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">active_quest</text>
<polygon fill="none" stroke="black" points="99.75,-193.25 99.75,-215.75 193.5,-215.75 193.5,-193.25 99.75,-193.25"/>
<text text-anchor="start" x="102.75" y="-199.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">Optional[Quest]</text>
<polygon fill="none" stroke="black" points="193.5,-193.25 193.5,-215.75 229.5,-215.75 229.5,-193.25 193.5,-193.25"/>
<text text-anchor="start" x="196.88" y="-199.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">None</text>
</a>
</g>
</g>
<!-- erdantic.examples.pydantic.Party&#45;&gt;erdantic.examples.pydantic.Adventurer -->
<g id="edge1" class="edge">
<title>erdantic.examples.pydantic.Party:e&#45;&gt;erdantic.examples.pydantic.Adventurer:w</title>
<path fill="none" stroke="black" d="M239.46,-227.67C282.93,-233.77 288.74,-279.62 329.21,-288.88"/>
<polyline fill="none" stroke="black" points="229.5,-227 234.49,-227.34"/>
<polyline fill="none" stroke="black" points="234.49,-227.34 239.48,-227.67"/>
<polygon fill="black" stroke="black" points="334.1,-289.4 343.56,-294.94 339.4,-289.97 343.71,-290.43 343.71,-290.43 343.71,-290.43 339.4,-289.97 344.52,-285.99 334.1,-289.4"/>
<polyline fill="none" stroke="black" points="332.89,-289.27 327.92,-288.74"/>
</g>
<!-- erdantic.examples.pydantic.Quest -->
<g id="node3" class="node">
<title>erdantic.examples.pydantic.Quest</title>
<g id="a_node3"><a xlink:title="erdantic.examples.pydantic.Quest&#10;&#10;A task to complete, with some monetary reward.&#10;&#10;Attributes:&#10; &#160;&#160;&#160;name (str): Name by which this quest is referred to&#10; &#160;&#160;&#160;giver (QuestGiver): Person who offered the quest&#10; &#160;&#160;&#160;reward_gold (int): Amount of gold to be rewarded for quest completion&#10;">
<polygon fill="none" stroke="black" points="337.5,-131 337.5,-153.5 516,-153.5 516,-131 337.5,-131"/>
<text text-anchor="start" x="409.5" y="-138.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-weight="bold" font-size="14.00">Quest</text>
<polygon fill="none" stroke="black" points="337.5,-108.5 337.5,-131 411.75,-131 411.75,-108.5 337.5,-108.5"/>
<text text-anchor="start" x="359.62" y="-114.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">name</text>
<polygon fill="none" stroke="black" points="411.75,-108.5 411.75,-131 480,-131 480,-108.5 411.75,-108.5"/>
<text text-anchor="start" x="439.12" y="-114.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
<polygon fill="none" stroke="black" points="480,-108.5 480,-131 516,-131 516,-108.5 480,-108.5"/>
<polygon fill="none" stroke="black" points="337.5,-86 337.5,-108.5 411.75,-108.5 411.75,-86 337.5,-86"/>
<text text-anchor="start" x="360.75" y="-92.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">giver</text>
<polygon fill="none" stroke="black" points="411.75,-86 411.75,-108.5 480,-108.5 480,-86 411.75,-86"/>
<text text-anchor="start" x="414.75" y="-92.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">QuestGiver</text>
<polygon fill="none" stroke="black" points="480,-86 480,-108.5 516,-108.5 516,-86 480,-86"/>
<polygon fill="none" stroke="black" points="337.5,-63.5 337.5,-86 411.75,-86 411.75,-63.5 337.5,-63.5"/>
<text text-anchor="start" x="340.5" y="-69.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">reward_gold</text>
<polygon fill="none" stroke="black" points="411.75,-63.5 411.75,-86 480,-86 480,-63.5 411.75,-63.5"/>
<text text-anchor="start" x="438.75" y="-69.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">int</text>
<polygon fill="none" stroke="black" points="480,-63.5 480,-86 516,-86 516,-63.5 480,-63.5"/>
<text text-anchor="start" x="487.88" y="-69.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">100</text>
</a>
</g>
</g>
<!-- erdantic.examples.pydantic.Party&#45;&gt;erdantic.examples.pydantic.Quest -->
<g id="edge2" class="edge">
<title>erdantic.examples.pydantic.Party:e&#45;&gt;erdantic.examples.pydantic.Quest:w</title>
<path fill="none" stroke="black" d="M239.23,-203.8C278.55,-197.9 284.51,-156.32 318.82,-145.06"/>
<polyline fill="none" stroke="black" points="229.5,-204.5 234.49,-204.14"/>
<polyline fill="none" stroke="black" points="234.49,-204.14 239.47,-203.78"/>
<polyline fill="none" stroke="black" points="337.5,-142.25 332.56,-142.99"/>
<polygon fill="black" stroke="black" points="330.82,-138.2 332.31,-148.09 330.33,-148.38 328.85,-138.49 330.82,-138.2"/>
<polyline fill="none" stroke="black" points="332.56,-142.99 327.61,-143.74"/>
<ellipse fill="none" stroke="black" cx="323.16" cy="-144.4" rx="4" ry="4"/>
</g>
<!-- erdantic.examples.pydantic.QuestGiver -->
<g id="node4" class="node">
<title>erdantic.examples.pydantic.QuestGiver</title>
<g id="a_node4"><a xlink:title="erdantic.examples.pydantic.QuestGiver&#10;&#10;A person who offers a task that needs completing.&#10;&#10;Attributes:&#10; &#160;&#160;&#160;name (str): Name of this quest giver&#10; &#160;&#160;&#160;faction (str): Faction that this quest giver belongs to&#10; &#160;&#160;&#160;location (str): Location this quest giver can be found&#10;">
<polygon fill="none" stroke="black" points="624,-86 624,-108.5 870.75,-108.5 870.75,-86 624,-86"/>
<text text-anchor="start" x="713.25" y="-93.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-weight="bold" font-size="14.00">QuestGiver</text>
<polygon fill="none" stroke="black" points="624,-63.5 624,-86 673.5,-86 673.5,-63.5 624,-63.5"/>
<text text-anchor="start" x="633.75" y="-69.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">name</text>
<polygon fill="none" stroke="black" points="673.5,-63.5 673.5,-86 749.25,-86 749.25,-63.5 673.5,-63.5"/>
<text text-anchor="start" x="704.62" y="-69.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
<polygon fill="none" stroke="black" points="749.25,-63.5 749.25,-86 870.75,-86 870.75,-63.5 749.25,-63.5"/>
<polygon fill="none" stroke="black" points="624,-41 624,-63.5 673.5,-63.5 673.5,-41 624,-41"/>
<text text-anchor="start" x="630" y="-47.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">faction</text>
<polygon fill="none" stroke="black" points="673.5,-41 673.5,-63.5 749.25,-63.5 749.25,-41 673.5,-41"/>
<text text-anchor="start" x="676.5" y="-47.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">Optional[str]</text>
<polygon fill="none" stroke="black" points="749.25,-41 749.25,-63.5 870.75,-63.5 870.75,-41 749.25,-41"/>
<text text-anchor="start" x="795.38" y="-47.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">None</text>
<polygon fill="none" stroke="black" points="624,-18.5 624,-41 673.5,-41 673.5,-18.5 624,-18.5"/>
<text text-anchor="start" x="627" y="-24.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">location</text>
<polygon fill="none" stroke="black" points="673.5,-18.5 673.5,-41 749.25,-41 749.25,-18.5 673.5,-18.5"/>
<text text-anchor="start" x="704.62" y="-24.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
<polygon fill="none" stroke="black" points="749.25,-18.5 749.25,-41 870.75,-41 870.75,-18.5 749.25,-18.5"/>
<text text-anchor="start" x="752.25" y="-24.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">&quot;Adventurer&#39;s Guild&quot;</text>
</a>
</g>
</g>
<!-- erdantic.examples.pydantic.Quest&#45;&gt;erdantic.examples.pydantic.QuestGiver -->
<g id="edge3" class="edge">
<title>erdantic.examples.pydantic.Quest:e&#45;&gt;erdantic.examples.pydantic.QuestGiver:w</title>
<path fill="none" stroke="black" d="M525.87,-97.25C561.07,-97.25 575.8,-97.25 609.08,-97.25"/>
<polyline fill="none" stroke="black" points="516,-97.25 521,-97.25"/>
<polyline fill="none" stroke="black" points="521,-97.25 526,-97.25"/>
<polyline fill="none" stroke="black" points="624,-97.25 619,-97.25"/>
<polygon fill="black" stroke="black" points="618,-92.25 618,-102.25 616,-102.25 616,-92.25 618,-92.25"/>
<polyline fill="none" stroke="black" points="619,-97.25 614,-97.25"/>
<polygon fill="black" stroke="black" points="613,-92.25 613,-102.25 611,-102.25 611,-92.25 613,-92.25"/>
<polyline fill="none" stroke="black" points="614,-97.25 609,-97.25"/>
</g>
</g>
</svg>
from dataclasses import dataclass
from dataclasses import field as dc_field
import sys
from typing import Optional, Union
from attrs import define
from attrs import field as attrs_field
import msgspec
import pydantic
@define
class AttrsRelatedNode:
name: str
@define
class AttrsRelationSemantics:
required_node: AttrsRelatedNode
optional_node: Optional[AttrsRelatedNode] = None
related_nodes: list[AttrsRelatedNode] = attrs_field(factory=list)
@define
class AttrsAltNode:
name: str
@define
class AttrsUnionSemantics:
union_node: Union[AttrsRelatedNode, AttrsAltNode]
optional_union_node: Optional[Union[AttrsRelatedNode, AttrsAltNode]] = None
@define
class AttrsNestedTypes:
node_map: dict[str, Optional[AttrsRelatedNode]] = attrs_field(factory=dict)
node_groups: list[list[AttrsRelatedNode]] = attrs_field(factory=list)
@define
class AttrsRecursive:
parent: Optional["AttrsRecursive"] = None
children: list["AttrsRecursive"] = attrs_field(factory=list)
@dataclass
class DataclassRelatedNode:
name: str
@dataclass
class DataclassRelationSemantics:
required_node: DataclassRelatedNode
optional_node: Optional[DataclassRelatedNode] = None
related_nodes: list[DataclassRelatedNode] = dc_field(default_factory=list)
@dataclass
class DataclassAltNode:
name: str
@dataclass
class DataclassUnionSemantics:
union_node: Union[DataclassRelatedNode, DataclassAltNode]
optional_union_node: Optional[Union[DataclassRelatedNode, DataclassAltNode]] = None
@dataclass
class DataclassNestedTypes:
node_map: dict[str, Optional[DataclassRelatedNode]] = dc_field(default_factory=dict)
node_groups: list[list[DataclassRelatedNode]] = dc_field(default_factory=list)
@dataclass
class DataclassRecursive:
parent: Optional["DataclassRecursive"] = None
children: list["DataclassRecursive"] = dc_field(default_factory=list)
class PydanticRelatedNode(pydantic.BaseModel):
name: str
class PydanticRelationSemantics(pydantic.BaseModel):
required_node: PydanticRelatedNode
optional_node: Optional[PydanticRelatedNode] = None
related_nodes: list[PydanticRelatedNode] = []
class PydanticAltNode(pydantic.BaseModel):
name: str
class PydanticUnionSemantics(pydantic.BaseModel):
union_node: Union[PydanticRelatedNode, PydanticAltNode]
optional_union_node: Optional[Union[PydanticRelatedNode, PydanticAltNode]] = None
class PydanticNestedTypes(pydantic.BaseModel):
node_map: dict[str, Optional[PydanticRelatedNode]] = {}
node_groups: list[list[PydanticRelatedNode]] = []
class PydanticRecursive(pydantic.BaseModel):
parent: Optional["PydanticRecursive"] = None
children: list["PydanticRecursive"] = []
class MsgspecRelatedNode(msgspec.Struct):
name: str
class MsgspecRelationSemantics(msgspec.Struct):
required_node: MsgspecRelatedNode
optional_node: Optional[MsgspecRelatedNode] = None
related_nodes: list[MsgspecRelatedNode] = msgspec.field(default_factory=list)
class MsgspecAltNode(msgspec.Struct):
name: str
class MsgspecUnionSemantics(msgspec.Struct):
union_node: Union[MsgspecRelatedNode, MsgspecAltNode]
optional_union_node: Optional[Union[MsgspecRelatedNode, MsgspecAltNode]] = None
class MsgspecNestedTypes(msgspec.Struct):
node_map: dict[str, Optional[MsgspecRelatedNode]] = msgspec.field(default_factory=dict)
node_groups: list[list[MsgspecRelatedNode]] = msgspec.field(default_factory=list)
class MsgspecRecursive(msgspec.Struct):
parent: Optional["MsgspecRecursive"] = None
children: list["MsgspecRecursive"] = msgspec.field(default_factory=list)
SNAPSHOT_CASES = [
("attrs_relation_semantics", AttrsRelationSemantics),
("attrs_union_semantics", AttrsUnionSemantics),
("attrs_nested_types", AttrsNestedTypes),
("dataclasses_relation_semantics", DataclassRelationSemantics),
("dataclasses_union_semantics", DataclassUnionSemantics),
("dataclasses_nested_types", DataclassNestedTypes),
("pydantic_relation_semantics", PydanticRelationSemantics),
("pydantic_union_semantics", PydanticUnionSemantics),
("pydantic_nested_types", PydanticNestedTypes),
("msgspec_relation_semantics", MsgspecRelationSemantics),
("msgspec_union_semantics", MsgspecUnionSemantics),
("msgspec_nested_types", MsgspecNestedTypes),
]
if sys.version_info >= (3, 11):
SNAPSHOT_CASES.extend(
[
("attrs_recursive", AttrsRecursive),
("dataclasses_recursive", DataclassRecursive),
("pydantic_recursive", PydanticRecursive),
("msgspec_recursive", MsgspecRecursive),
]
)
+2
-2

@@ -69,3 +69,3 @@ name: release

- uses: pypa/gh-action-pypi-publish@v1.12.4
- uses: pypa/gh-action-pypi-publish@v1.13.0
with:

@@ -91,3 +91,3 @@ repository-url: https://test.pypi.org/legacy/

- uses: pypa/gh-action-pypi-publish@v1.12.4
- uses: pypa/gh-action-pypi-publish@v1.13.0

@@ -94,0 +94,0 @@ create-github-release:

@@ -51,3 +51,3 @@ name: tests

os: [ubuntu-latest, macos-latest]
python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"]
python-version: ["3.9", "3.10", "3.11", "3.12", "3.13", "3.14"]

@@ -101,7 +101,2 @@ steps:

- name: Fix graphviz for macos-latest
if: ${{ matrix.os == 'macos-latest' }}
run: |
just python=${{ matrix.python-version }} fix-graphviz-test
- name: Run tests

@@ -108,0 +103,0 @@ run: |

# erdantic Changelog
## v1.2.1 (2026-02-15)
- Added official support for Python 3.14. ([PR #164](https://github.com/drivendataorg/erdantic/pull/164))
- _Note_: The `pydantic_v1` plugin is disabled when running on Python 3.14+, as Pydantic has dropped support for its V1 legacy module.
- _Note_: Python 3.14's internal representation of `typing.Union` and `typing.Optional` have changed, such that they will always render using the `|` operator.
## v1.2.0 (2025-09-15)

@@ -4,0 +10,0 @@

@@ -60,2 +60,8 @@ # Contributing to erdantic

All test commands can be passed arguments, e.g.,
```bash
just test-all tests/test_against_assets.py
```
### Code quality

@@ -62,0 +68,0 @@

@@ -12,3 +12,3 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?>

<polygon fill="white" stroke="none" points="-4,4 -4,-380.75 985.75,-380.75 985.75,4 -4,4"/>
<text text-anchor="middle" x="490.88" y="-5.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="9.00" fill="#a8a8a8">Created by erdantic v1.1.1.dev0 &lt;https://github.com/drivendataorg/erdantic&gt;</text>
<text text-anchor="middle" x="490.88" y="-5.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="9.00" fill="#a8a8a8">Created by erdantic v1.2.1 &lt;https://github.com/drivendataorg/erdantic&gt;</text>
<!-- erdantic.core.Edge -->

@@ -15,0 +15,0 @@ <g id="node1" class="node">

@@ -12,3 +12,3 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?>

<polygon fill="white" stroke="none" points="-4,4 -4,-309.75 681.25,-309.75 681.25,4 -4,4"/>
<text text-anchor="middle" x="338.62" y="-5.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="9.00" fill="#a8a8a8">Created by erdantic v1.1.1.dev0 &lt;https://github.com/drivendataorg/erdantic&gt;</text>
<text text-anchor="middle" x="338.62" y="-5.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="9.00" fill="#a8a8a8">Created by erdantic v1.2.1 &lt;https://github.com/drivendataorg/erdantic&gt;</text>
<!-- erdantic.examples.pydantic.Adventurer -->

@@ -15,0 +15,0 @@ <g id="node1" class="node">

"""Example data model classes."""
from erdantic.examples import dataclasses, pydantic, pydantic_v1
import sys
from erdantic.examples import dataclasses, pydantic
__all__ = [
"dataclasses",
"pydantic",
"pydantic_v1",
]
if sys.version_info < (3, 14):
from erdantic.examples import pydantic_v1
pydantic_v1
__all__.append("pydantic_v1")
try:

@@ -19,1 +26,10 @@ from erdantic.examples import attrs

raise
try:
from erdantic.examples import msgspec
msgspec
__all__.append("msgspec")
except ModuleNotFoundError as e:
if e.name != "msgspec":
raise

@@ -6,2 +6,3 @@ """Example data model classes using legacy

from enum import Enum
import sys
from typing import Optional

@@ -11,3 +12,6 @@

if sys.version_info >= (3, 14):
raise ImportError("Pydantic V1 does not support Python 3.14+")
class Alignment(str, Enum):

@@ -14,0 +18,0 @@ LAWFUL_GOOD = "lawful_good"

@@ -20,5 +20,4 @@ import importlib.metadata

CORE_PLUGINS = (
CORE_PLUGINS: tuple[tuple[str, str], ...] = (
("pydantic", "erdantic.plugins.pydantic"),
("pydantic_v1", "erdantic.plugins.pydantic"),
("attrs", "erdantic.plugins.attrs"),

@@ -29,2 +28,5 @@ ("dataclasses", "erdantic.plugins.dataclasses"),

if sys.version_info < (3, 14):
CORE_PLUGINS += (("pydantic_v1", "erdantic.plugins.pydantic"),)
_ModelType = TypeVar("_ModelType", bound=type)

@@ -31,0 +33,0 @@ _ModelType_co = TypeVar("_ModelType_co", bound=type, covariant=True)

@@ -11,4 +11,10 @@ import re

import pydantic
import pydantic.v1
if sys.version_info < (3, 14):
import pydantic.v1
PYDANTIC_V1_AVAILABLE = True
else:
PYDANTIC_V1_AVAILABLE = False
from erdantic.core import FieldInfo, FullyQualifiedName

@@ -76,69 +82,69 @@ from erdantic.exceptions import UnresolvableForwardRefError

PydanticV1Model = Type[pydantic.v1.BaseModel]
if PYDANTIC_V1_AVAILABLE:
PydanticV1Model = Type[pydantic.v1.BaseModel]
def is_pydantic_v1_model(obj) -> TypeGuard[PydanticV1Model]:
"""Predicate function to determine if an object is a Pydantic V1 model (not an instance).
This is for models that use the legacy `pydantic.v1` namespace.
def is_pydantic_v1_model(obj) -> TypeGuard[PydanticV1Model]:
"""Predicate function to determine if an object is a Pydantic V1 model (not an instance). This
is for models that use the legacy `pydantic.v1` namespace.
Args:
obj (Any): The object to check.
Args:
obj (Any): The object to check.
Returns:
bool: True if the object is a Pydantic V1 model, False otherwise.
"""
return isinstance(obj, type) and issubclass(obj, pydantic.v1.BaseModel)
Returns:
bool: True if the object is a Pydantic V1 model, False otherwise.
"""
return isinstance(obj, type) and issubclass(obj, pydantic.v1.BaseModel)
def get_fields_from_pydantic_v1_model(model: PydanticV1Model) -> list[FieldInfo]:
"""Given a Pydantic V1 model, return a list of FieldInfo instances for each field in the
model.
Args:
model (PydanticV1Model): The Pydantic V1 model to get fields from.
def get_fields_from_pydantic_v1_model(model: PydanticV1Model) -> list[FieldInfo]:
"""Given a Pydantic V1 model, return a list of FieldInfo instances for each field in the model.
Returns:
list[FieldInfo]: List of FieldInfo instances for each field in the model
"""
try:
model.update_forward_refs()
except NameError as e:
model_full_name = FullyQualifiedName.from_object(model)
# NameError attribute 'name' was added in Python 3.10
forward_ref = getattr(
e,
"name",
re.search(r"(?<=')(?:[^'])*(?=')", str(e)).group(0), # type: ignore [union-attr]
)
msg = (
f"Failed to resolve forward reference '{forward_ref}' in the type annotations for "
f"Pydantic V1 model {model_full_name}. "
"You should call the method update_forward_refs(**locals()) on the model in "
"the scope where it has been defined to manually resolve it."
)
raise UnresolvableForwardRefError(
msg, name=forward_ref, model_full_name=model_full_name
) from e
Args:
model (PydanticV1Model): The Pydantic V1 model to get fields from.
return [
FieldInfo.from_raw_type(
model_full_name=FullyQualifiedName.from_object(model),
name=name,
raw_type=get_type_annotation_from_pydantic_v1_field(field),
)
for name, field in model.__fields__.items()
]
Returns:
list[FieldInfo]: List of FieldInfo instances for each field in the model
"""
try:
model.update_forward_refs()
except NameError as e:
model_full_name = FullyQualifiedName.from_object(model)
# NameError attribute 'name' was added in Python 3.10
forward_ref = getattr(
e,
"name",
re.search(r"(?<=')(?:[^'])*(?=')", str(e)).group(0), # type: ignore [union-attr]
)
msg = (
f"Failed to resolve forward reference '{forward_ref}' in the type annotations for "
f"Pydantic V1 model {model_full_name}. "
"You should call the method update_forward_refs(**locals()) on the model in "
"the scope where it has been defined to manually resolve it."
)
raise UnresolvableForwardRefError(
msg, name=forward_ref, model_full_name=model_full_name
) from e
def get_type_annotation_from_pydantic_v1_field(
field_info: pydantic.v1.fields.ModelField,
) -> type:
"""Utility function to get the type annotation from a Pydantic V1 field info object."""
tp = field_info.outer_type_
if field_info.allow_none:
return Optional[tp] # type: ignore
return tp
return [
FieldInfo.from_raw_type(
model_full_name=FullyQualifiedName.from_object(model),
name=name,
raw_type=get_type_annotation_from_pydantic_v1_field(field),
)
for name, field in model.__fields__.items()
]
def get_type_annotation_from_pydantic_v1_field(field_info: pydantic.v1.fields.ModelField) -> type:
"""Utility function to get the type annotation from a Pydantic V1 field info object."""
tp = field_info.outer_type_
if field_info.allow_none:
return Optional[tp] # type: ignore
return tp
register_plugin(
key="pydantic_v1",
predicate_fn=is_pydantic_v1_model,
get_fields_fn=get_fields_from_pydantic_v1_model,
)
register_plugin(
key="pydantic_v1",
predicate_fn=is_pydantic_v1_model,
get_fields_fn=get_fields_from_pydantic_v1_model,
)

@@ -76,5 +76,10 @@ import collections.abc

elif isinstance(t, ForwardRef):
if t.__forward_evaluated__:
t = t.__forward_value__ # type: ignore [assignment]
# Python < 3.14 caches an "evaluated" state on ForwardRef
if hasattr(t, "__forward_evaluated__"):
if t.__forward_evaluated__:
t = t.__forward_value__ # type: ignore [assignment]
else:
raise _UnevaluatedForwardRefError(forward_ref=t.__forward_arg__)
else:
# Python 3.14+ no longer exposes this evaluated state
raise _UnevaluatedForwardRefError(forward_ref=t.__forward_arg__)

@@ -81,0 +86,0 @@

Metadata-Version: 2.4
Name: erdantic
Version: 1.2.0
Version: 1.2.1
Summary: Entity relationship diagrams for Python data model classes like Pydantic.

@@ -25,2 +25,3 @@ Project-URL: Repository, https://github.com/drivendataorg/erdantic

Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: 3.14
Classifier: Topic :: Software Development :: Code Generators

@@ -27,0 +28,0 @@ Requires-Python: >=3.9

[project]
name = "erdantic"
version = "1.2.0"
version = "1.2.1"
description = "Entity relationship diagrams for Python data model classes like Pydantic."

@@ -20,2 +20,3 @@ readme = "README.md"

"Programming Language :: Python :: 3.13",
"Programming Language :: Python :: 3.14",
"Framework :: Pydantic",

@@ -91,3 +92,3 @@ "Framework :: Pydantic :: 2",

[tool.pixi.project]
[tool.pixi.workspace]
channels = ["conda-forge"]

@@ -112,2 +113,4 @@ platforms = ["linux-64", "osx-64", "osx-arm64", "win-64"]

python = "3.13.*"
[tool.pixi.feature.py314.dependencies]
python = "3.14.*"

@@ -121,4 +124,10 @@ [tool.pixi.environments]

test-py313 = ["py313", "test"]
test-py314 = ["py314", "test"]
typecheck = ["py313", "typecheck"]
[tool.pixi.activation]
scripts = [
"scripts/fix_graphviz.sh", # Generate Graphviz plugin config files if missing
]
## TOOLS

@@ -125,0 +134,0 @@

from pathlib import Path
import sys

@@ -22,4 +23,4 @@ import tests.pydantic_with_default_column

filename = "pydantic_with_default_column"
out_dir = ASSETS_DIR / "test_core-test_subclass"
(out_dir).mkdir(exist_ok=True)
out_dir = ASSETS_DIR / sys.argv[1] / "test_core-test_subclass"
out_dir.mkdir(exist_ok=True)
diagram = tests.pydantic_with_default_column.EntityRelationshipDiagramWithDefault()

@@ -26,0 +27,0 @@ diagram.add_model(erdantic.examples.pydantic.Party)

from pathlib import Path
from types import ModuleType
import sys
from tests.snapshot_cases import SNAPSHOT_CASES
import erdantic as erd

@@ -19,22 +21,44 @@ import erdantic._version

def create_assets(examples: ModuleType):
plugin = examples.__name__.rsplit(".", 1)[1]
(ASSETS_DIR).mkdir(exist_ok=True)
diagram = erd.create(examples.Party)
def generate_example_assets(name: str, model_or_module: object, out_dir: Path):
"""Generate all static assets for user-facing example cases."""
out_dir.mkdir(parents=True, exist_ok=True)
diagram = erd.create(model_or_module)
diagram.draw(out=ASSETS_DIR / f"{plugin}.png")
diagram.draw(out=ASSETS_DIR / f"{plugin}.svg")
with (ASSETS_DIR / f"{plugin}.dot").open("w") as fp:
diagram.draw(out=out_dir / f"{name}.png")
diagram.draw(out=out_dir / f"{name}.svg")
with (out_dir / f"{name}.dot").open("w") as fp:
fp.write(diagram.to_dot())
with (ASSETS_DIR / f"{plugin}.json").open("w") as fp:
with (out_dir / f"{name}.json").open("w") as fp:
fp.write(diagram.model_dump_json(indent=2))
with (out_dir / f"{name}.d2").open("w") as fp:
fp.write(diagram.to_d2())
def generate_snapshot_assets(name: str, model_or_module: object, out_dir: Path):
"""Generate only text-based renderer snapshots for test-focused cases."""
out_dir.mkdir(parents=True, exist_ok=True)
diagram = erd.create(model_or_module)
with (out_dir / f"{name}.dot").open("w") as fp:
fp.write(diagram.to_dot())
with (out_dir / f"{name}.d2").open("w") as fp:
fp.write(diagram.to_d2())
if __name__ == "__main__":
for module in [
out_dir = ASSETS_DIR / sys.argv[1]
out_dir.mkdir(exist_ok=True)
modules = [
erdantic.examples.attrs,
erdantic.examples.dataclasses,
erdantic.examples.pydantic,
erdantic.examples.pydantic_v1,
]:
create_assets(module)
]
if sys.version_info < (3, 14):
modules.append(erdantic.examples.pydantic_v1)
for module in modules:
plugin = module.__name__.rsplit(".", 1)[1]
generate_example_assets(plugin, module.Party, out_dir)
snapshots_dir = out_dir / "snapshots"
for case_name, model in SNAPSHOT_CASES:
generate_snapshot_assets(case_name, model, snapshots_dir)
import filecmp
import os
from pathlib import Path
import sys

@@ -12,25 +13,38 @@ import filetype

import erdantic.examples
from tests.snapshot_cases import SNAPSHOT_CASES as SNAPSHOT_MODEL_CASES
from tests.utils import assert_dot_equals
ASSETS_DIR = Path(__file__).resolve().parent / "assets"
if sys.version_info < (3, 14):
ASSETS_SUBDIR = "py_lt_314"
else:
ASSETS_SUBDIR = "py_gte_314"
ASSETS_DIR = Path(__file__).resolve().parent / "assets" / ASSETS_SUBDIR
CASES = (
EXAMPLE_CASES = [
("attrs", erdantic.examples.attrs),
("dataclasses", erdantic.examples.dataclasses),
("pydantic", erdantic.examples.pydantic),
("pydantic_v1", erdantic.examples.pydantic_v1),
("attrs", erdantic.examples.attrs.Party),
("dataclasses", erdantic.examples.dataclasses.Party),
("pydantic", erdantic.examples.pydantic.Party),
("pydantic_v1", erdantic.examples.pydantic_v1.Party),
)
]
if sys.version_info < (3, 14):
EXAMPLE_CASES.extend(
[
("pydantic_v1", erdantic.examples.pydantic_v1),
("pydantic_v1", erdantic.examples.pydantic_v1.Party),
]
)
@pytest.mark.parametrize("case", CASES)
def test_draw_png_against_static_assets(case, outputs_dir, version_patch):
"""Uses draw convenience function."""
SNAPSHOTS_DIR = ASSETS_DIR / "snapshots"
@pytest.mark.parametrize("case", EXAMPLE_CASES)
def test_draw_png_examples_against_static_assets(case, outputs_dir, version_patch):
"""Uses draw convenience function for user-facing examples."""
plugin, model_or_module = case
expected_path = ASSETS_DIR / f"{plugin}.png"
out_path = outputs_dir / f"{plugin}.png"

@@ -47,9 +61,9 @@

@pytest.mark.parametrize("case", CASES)
def test_draw_svg_against_static_assets(case, outputs_dir, version_patch):
"""Uses draw convenience function."""
@pytest.mark.parametrize("case", EXAMPLE_CASES)
def test_draw_svg_examples_against_static_assets(case, outputs_dir, version_patch):
"""Uses draw convenience function for user-facing examples."""
plugin, model_or_module = case
expected_path = ASSETS_DIR / f"{plugin}.svg"
out_path = outputs_dir / f"{plugin}.svg"
out_path = outputs_dir / f"{plugin}.svg"
erd.draw(model_or_module, out=out_path)

@@ -61,9 +75,9 @@ if not os.getenv("GITHUB_ACTIONS", False):

@pytest.mark.parametrize("case", CASES)
def test_to_dot_against_static_assets(case, outputs_dir, version_patch):
"""Uses to_dot convenience function."""
@pytest.mark.parametrize("case", EXAMPLE_CASES)
def test_to_dot_examples_against_static_assets(case, outputs_dir, version_patch):
"""Uses to_dot convenience function for user-facing examples."""
plugin, model_or_module = case
expected_path = ASSETS_DIR / f"{plugin}.dot"
out_path = outputs_dir / f"{plugin}.dot"
out_path = outputs_dir / f"{plugin}.dot"
out = erd.to_dot(model_or_module)

@@ -74,8 +88,8 @@ out_path.write_text(out)

@pytest.mark.parametrize("case", CASES)
def test_json_against_static_assets(case, outputs_dir, version_patch):
@pytest.mark.parametrize("case", EXAMPLE_CASES)
def test_json_examples_against_static_assets(case, outputs_dir, version_patch):
plugin, model_or_module = case
expected_path = ASSETS_DIR / f"{plugin}.json"
out_path = outputs_dir / f"{plugin}.json"
out_path = outputs_dir / f"{plugin}.json"
diagram = erd.create(model_or_module)

@@ -90,17 +104,38 @@ out_json = diagram.model_dump_json(indent=2)

@pytest.mark.parametrize("case", CASES)
def test_to_d2_against_static_assets(case, outputs_dir, version_patch):
"""Uses to_d2 method to test against static assets."""
@pytest.mark.parametrize("case", EXAMPLE_CASES)
def test_to_d2_examples_against_static_assets(case, outputs_dir, version_patch):
"""Uses to_d2 method to test against static assets for user-facing examples."""
plugin, model_or_module = case
expected_path = ASSETS_DIR / f"{plugin}.d2"
# to_d2 is not a convenience function, so we always create the diagram first
diagram = erd.create(model_or_module)
out = diagram.to_d2()
# Write our own asset for inspection
out_path = outputs_dir / f"{plugin}.d2"
out_path.write_text(out)
assert out.strip() == expected_path.read_text().strip()
# Compare to expected
@pytest.mark.parametrize("case", SNAPSHOT_MODEL_CASES)
def test_to_dot_snapshots_against_static_assets(case, outputs_dir, version_patch):
"""Uses to_dot convenience function for test-focused snapshots."""
case_name, model = case
expected_path = SNAPSHOTS_DIR / f"{case_name}.dot"
out_dir = outputs_dir / "snapshots"
out_dir.mkdir(parents=True, exist_ok=True)
out_path = out_dir / f"{case_name}.dot"
out = erd.to_dot(model)
out_path.write_text(out)
assert_dot_equals(out, expected_path.read_text())
@pytest.mark.parametrize("case", SNAPSHOT_MODEL_CASES)
def test_to_d2_snapshots_against_static_assets(case, outputs_dir, version_patch):
"""Uses to_d2 method for test-focused snapshots."""
case_name, model = case
expected_path = SNAPSHOTS_DIR / f"{case_name}.d2"
out_dir = outputs_dir / "snapshots"
out_dir.mkdir(parents=True, exist_ok=True)
out_path = out_dir / f"{case_name}.d2"
diagram = erd.create(model)
out = diagram.to_d2()
out_path.write_text(out)
assert out.strip() == expected_path.read_text().strip()

@@ -49,3 +49,3 @@ from pprint import pprint

assert fields[3].name == "active_quest"
assert fields[3].type_name == "Optional[Quest]"
assert fields[3].raw_type == Optional[attrs_examples.Quest]

@@ -93,15 +93,11 @@

assert fields["imported_ref"].raw_type == attrs_examples.Party
assert fields["nested_imported_ref"].type_name == "Optional[Quest]"
assert fields["nested_imported_ref"].raw_type == Optional[attrs_examples.Quest]
assert fields["self_ref"].type_name == "GlobalWithFwdRefs"
assert fields["self_ref"].raw_type == GlobalWithFwdRefs
assert fields["nested_self_ref"].type_name == "Optional[GlobalWithFwdRefs]"
assert fields["nested_self_ref"].raw_type == Optional[GlobalWithFwdRefs]
assert fields["global_ref_before"].type_name == "GlobalOtherClassBefore"
assert fields["global_ref_before"].raw_type == GlobalOtherClassBefore
assert fields["nested_global_ref_before"].type_name == "Optional[GlobalOtherClassBefore]"
assert fields["nested_global_ref_before"].raw_type == Optional[GlobalOtherClassBefore]
assert fields["global_ref_after"].type_name == "GlobalOtherClassAfter"
assert fields["global_ref_after"].raw_type == GlobalOtherClassAfter
assert fields["nested_global_ref_after"].type_name == "Optional[GlobalOtherClassAfter]"
assert fields["nested_global_ref_after"].raw_type == Optional[GlobalOtherClassAfter]

@@ -129,7 +125,5 @@

assert fields["imported_ref"].raw_type == attrs_examples.Party
assert fields["nested_imported_ref"].type_name == "Optional[Quest]"
assert fields["nested_imported_ref"].raw_type == Optional[attrs_examples.Quest]
assert fields["global_ref"].type_name == "GlobalOtherClassBefore"
assert fields["global_ref"].raw_type == GlobalOtherClassBefore
assert fields["nested_global_ref"].type_name == "Optional[GlobalOtherClassBefore]"
assert fields["nested_global_ref"].raw_type == Optional[GlobalOtherClassBefore]

@@ -187,11 +181,8 @@

assert fields["self_ref"].raw_type == FnScopeManuallyResolvable
assert fields["nested_self_ref"].type_name == "Optional[FnScopeManuallyResolvable]"
assert fields["nested_self_ref"].raw_type == Optional[FnScopeManuallyResolvable]
assert fields["sibling_ref_before"].type_name == "FnScopeOtherClassBefore"
assert fields["sibling_ref_before"].raw_type == FnScopeOtherClassBefore
assert fields["nested_sibling_ref_before"].type_name == "Optional[FnScopeOtherClassBefore]"
assert fields["nested_sibling_ref_before"].raw_type == Optional[FnScopeOtherClassBefore]
assert fields["sibling_ref_after"].type_name == "FnScopeOtherClassAfter"
assert fields["sibling_ref_after"].raw_type == FnScopeOtherClassAfter
assert fields["nested_sibling_ref_after"].type_name == "Optional[FnScopeOtherClassAfter]"
assert fields["nested_sibling_ref_after"].raw_type == Optional[FnScopeOtherClassAfter]

@@ -28,6 +28,12 @@ import builtins

from erdantic.plugins.dataclasses import DataclassType
from erdantic.typing_utils import is_nullable_type
ASSETS_DIR = Path(__file__).resolve().parent / "assets"
if sys.version_info < (3, 14):
ASSETS_SUBDIR = "py_lt_314"
else:
ASSETS_SUBDIR = "py_gte_314"
ASSETS_DIR = Path(__file__).resolve().parent / "assets" / ASSETS_SUBDIR
def test_fully_qualified_name_import_object():

@@ -97,4 +103,6 @@ full_name = FullyQualifiedName.from_object(Party)

)
assert field_info.type_name == "Optional[str]"
assert field_info.raw_type == tp
assert "Annotated" not in field_info.type_name
assert "str" in field_info.type_name
assert is_nullable_type(field_info.raw_type)

@@ -101,0 +109,0 @@

@@ -26,3 +26,3 @@ import erdantic as erd

assert "+name: str" in d2_string
assert '+active_quest: "Optional[Quest]"' in d2_string
assert "+active_quest:" in d2_string

@@ -29,0 +29,0 @@ # Check for relationships and crow's foot

@@ -51,3 +51,3 @@ import dataclasses

assert fields[3].name == "active_quest"
assert fields[3].type_name == "Optional[Quest]"
assert fields[3].raw_type == Optional[dataclasses_examples.Quest]

@@ -95,15 +95,11 @@

assert fields["imported_ref"].raw_type == dataclasses_examples.Party
assert fields["nested_imported_ref"].type_name == "Optional[Quest]"
assert fields["nested_imported_ref"].raw_type == Optional[dataclasses_examples.Quest]
assert fields["self_ref"].type_name == "GlobalWithFwdRefs"
assert fields["self_ref"].raw_type == GlobalWithFwdRefs
assert fields["nested_self_ref"].type_name == "Optional[GlobalWithFwdRefs]"
assert fields["nested_self_ref"].raw_type == Optional[GlobalWithFwdRefs]
assert fields["global_ref_before"].type_name == "GlobalOtherClassBefore"
assert fields["global_ref_before"].raw_type == GlobalOtherClassBefore
assert fields["nested_global_ref_before"].type_name == "Optional[GlobalOtherClassBefore]"
assert fields["nested_global_ref_before"].raw_type == Optional[GlobalOtherClassBefore]
assert fields["global_ref_after"].type_name == "GlobalOtherClassAfter"
assert fields["global_ref_after"].raw_type == GlobalOtherClassAfter
assert fields["nested_global_ref_after"].type_name == "Optional[GlobalOtherClassAfter]"
assert fields["nested_global_ref_after"].raw_type == Optional[GlobalOtherClassAfter]

@@ -131,7 +127,5 @@

assert fields["imported_ref"].raw_type == dataclasses_examples.Party
assert fields["nested_imported_ref"].type_name == "Optional[Quest]"
assert fields["nested_imported_ref"].raw_type == Optional[dataclasses_examples.Quest]
assert fields["global_ref"].type_name == "GlobalOtherClassBefore"
assert fields["global_ref"].raw_type == GlobalOtherClassBefore
assert fields["nested_global_ref"].type_name == "Optional[GlobalOtherClassBefore]"
assert fields["nested_global_ref"].raw_type == Optional[GlobalOtherClassBefore]

@@ -189,11 +183,8 @@

assert fields["self_ref"].raw_type == FnScopeManuallyResolvable
assert fields["nested_self_ref"].type_name == "Optional[FnScopeManuallyResolvable]"
assert fields["nested_self_ref"].raw_type == Optional[FnScopeManuallyResolvable]
assert fields["sibling_ref_before"].type_name == "FnScopeOtherClassBefore"
assert fields["sibling_ref_before"].raw_type == FnScopeOtherClassBefore
assert fields["nested_sibling_ref_before"].type_name == "Optional[FnScopeOtherClassBefore]"
assert fields["nested_sibling_ref_before"].raw_type == Optional[FnScopeOtherClassBefore]
assert fields["sibling_ref_after"].type_name == "FnScopeOtherClassAfter"
assert fields["sibling_ref_after"].raw_type == FnScopeOtherClassAfter
assert fields["nested_sibling_ref_after"].type_name == "Optional[FnScopeOtherClassAfter]"
assert fields["nested_sibling_ref_after"].raw_type == Optional[FnScopeOtherClassAfter]

@@ -200,0 +191,0 @@

@@ -49,3 +49,3 @@ from pprint import pprint

assert fields[3].name == "active_quest"
assert fields[3].type_name == "Optional[Quest]"
assert fields[3].raw_type == Optional[msgspec_examples.Quest]

@@ -90,15 +90,11 @@

assert fields["imported_ref"].raw_type == msgspec_examples.Party
assert fields["nested_imported_ref"].type_name == "Optional[Quest]"
assert fields["nested_imported_ref"].raw_type == Optional[msgspec_examples.Quest]
assert fields["self_ref"].type_name == "GlobalWithFwdRefs"
assert fields["self_ref"].raw_type == GlobalWithFwdRefs
assert fields["nested_self_ref"].type_name == "Optional[GlobalWithFwdRefs]"
assert fields["nested_self_ref"].raw_type == Optional[GlobalWithFwdRefs]
assert fields["global_ref_before"].type_name == "GlobalOtherClassBefore"
assert fields["global_ref_before"].raw_type == GlobalOtherClassBefore
assert fields["nested_global_ref_before"].type_name == "Optional[GlobalOtherClassBefore]"
assert fields["nested_global_ref_before"].raw_type == Optional[GlobalOtherClassBefore]
assert fields["global_ref_after"].type_name == "GlobalOtherClassAfter"
assert fields["global_ref_after"].raw_type == GlobalOtherClassAfter
assert fields["nested_global_ref_after"].type_name == "Optional[GlobalOtherClassAfter]"
assert fields["nested_global_ref_after"].raw_type == Optional[GlobalOtherClassAfter]

@@ -125,7 +121,5 @@

assert fields["imported_ref"].raw_type == msgspec_examples.Party
assert fields["nested_imported_ref"].type_name == "Optional[Quest]"
assert fields["nested_imported_ref"].raw_type == Optional[msgspec_examples.Quest]
assert fields["global_ref"].type_name == "GlobalOtherClassBefore"
assert fields["global_ref"].raw_type == GlobalOtherClassBefore
assert fields["nested_global_ref"].type_name == "Optional[GlobalOtherClassBefore]"
assert fields["nested_global_ref"].raw_type == Optional[GlobalOtherClassBefore]

@@ -132,0 +126,0 @@

import subprocess
import sys
import textwrap

@@ -40,8 +41,10 @@

def test_get_predicate_fn():
for key, predicate_fn in [
cases = [
("attrs", erdantic.plugins.attrs.is_attrs_class),
("dataclasses", erdantic.plugins.dataclasses.is_dataclass_class),
("pydantic", erdantic.plugins.pydantic.is_pydantic_model),
("pydantic_v1", erdantic.plugins.pydantic.is_pydantic_v1_model),
]:
]
if sys.version_info < (3, 14):
cases.append(("pydantic_v1", erdantic.plugins.pydantic.is_pydantic_v1_model))
for key, predicate_fn in cases:
assert get_predicate_fn(key) == predicate_fn

@@ -54,8 +57,12 @@

def test_get_field_extractor_fn():
for key, get_fields_fn in [
cases = [
("attrs", erdantic.plugins.attrs.get_fields_from_attrs_class),
("dataclasses", erdantic.plugins.dataclasses.get_fields_from_dataclass),
("pydantic", erdantic.plugins.pydantic.get_fields_from_pydantic_model),
("pydantic_v1", erdantic.plugins.pydantic.get_fields_from_pydantic_v1_model),
]:
]
if sys.version_info < (3, 14):
cases.append(("pydantic_v1", erdantic.plugins.pydantic.get_fields_from_pydantic_v1_model))
for key, get_fields_fn in cases:
assert get_field_extractor_fn(key) == get_fields_fn

@@ -68,11 +75,16 @@

def test_identify_field_extractor_fn():
for example_module, get_fields_fn in [
cases = [
(erdantic.examples.attrs, erdantic.plugins.attrs.get_fields_from_attrs_class),
(erdantic.examples.dataclasses, erdantic.plugins.dataclasses.get_fields_from_dataclass),
(erdantic.examples.pydantic, erdantic.plugins.pydantic.get_fields_from_pydantic_model),
(
erdantic.examples.pydantic_v1,
erdantic.plugins.pydantic.get_fields_from_pydantic_v1_model,
),
]:
]
if sys.version_info < (3, 14):
cases.append(
(
erdantic.examples.pydantic_v1,
erdantic.plugins.pydantic.get_fields_from_pydantic_v1_model,
)
)
for example_module, get_fields_fn in cases:
assert identify_field_extractor_fn(example_module.Party) == get_fields_fn

@@ -87,3 +99,6 @@

"""Core plugins are loaded when erdantic is imported."""
for key in ("attrs", "dataclasses", "msgspec", "pydantic", "pydantic_v1"):
expected_keys = ["attrs", "dataclasses", "pydantic", "msgspec"]
if sys.version_info < (3, 14):
expected_keys.append("pydantic_v1")
for key in expected_keys:
script = textwrap.dedent(

@@ -90,0 +105,0 @@ f"""\

from pprint import pprint
import sys
from typing import Optional

@@ -10,10 +11,14 @@

import erdantic.examples.pydantic as pydantic_examples
import erdantic.examples.pydantic_v1 as pydantic_v1_examples
from erdantic.exceptions import UnresolvableForwardRefError
from erdantic.plugins.pydantic import (
get_fields_from_pydantic_v1_model,
is_pydantic_v1_model,
)
if sys.version_info < (3, 14):
from erdantic.examples import pydantic_v1 as pydantic_v1_examples
from erdantic.plugins.pydantic import (
get_fields_from_pydantic_v1_model,
is_pydantic_v1_model,
)
else:
pytest.skip("Pydantic v1 is not supported on Python 3.14 and above", allow_module_level=True)
def test_is_pydantic_v1_model():

@@ -20,0 +25,0 @@ class NotAPydanticModel:

from pprint import pprint
import sys
from typing import Optional
import pydantic
import pydantic.v1
import pytest
if sys.version_info < (3, 14):
import pydantic.v1
import erdantic.examples.pydantic_v1 as pydantic_v1_examples
from erdantic.core import EntityRelationshipDiagram, FullyQualifiedName
import erdantic.examples.pydantic as pydantic_examples
import erdantic.examples.pydantic_v1 as pydantic_v1_examples
from erdantic.exceptions import UnresolvableForwardRefError

@@ -30,3 +34,4 @@ from erdantic.plugins.pydantic import (

assert not is_pydantic_model(NotAPydanticModel)
assert not is_pydantic_model(pydantic_v1_examples.Party)
if sys.version_info < (3, 14):
assert not is_pydantic_model(pydantic_v1_examples.Party)

@@ -53,3 +58,3 @@

assert fields[3].name == "active_quest"
assert fields[3].type_name == "Optional[Quest]"
assert fields[3].raw_type == Optional[pydantic_examples.Quest]

@@ -95,11 +100,8 @@

assert fields["imported_ref"].raw_type == pydantic_examples.Party
assert fields["nested_imported_ref"].type_name == "Optional[Quest]"
assert fields["nested_imported_ref"].raw_type == Optional[pydantic_examples.Quest]
assert fields["self_ref"].type_name == "GlobalWithFwdRefs"
assert fields["self_ref"].raw_type == GlobalWithFwdRefs
assert fields["nested_self_ref"].type_name == "Optional[GlobalWithFwdRefs]"
assert fields["nested_self_ref"].raw_type == Optional[GlobalWithFwdRefs]
assert fields["global_ref_before"].type_name == "GlobalOtherModelBefore"
assert fields["global_ref_before"].raw_type == GlobalOtherModelBefore
assert fields["nested_global_ref_before"].type_name == "Optional[GlobalOtherModelBefore]"
assert fields["nested_global_ref_before"].raw_type == Optional[GlobalOtherModelBefore]

@@ -109,3 +111,2 @@ # Resolved by model_rebuild()

assert fields["global_ref_after"].raw_type == GlobalOtherModelAfter
assert fields["nested_global_ref_after"].type_name == "Optional[GlobalOtherModelAfter]"
assert fields["nested_global_ref_after"].raw_type == Optional[GlobalOtherModelAfter]

@@ -142,15 +143,11 @@

assert fields["imported_ref"].raw_type == pydantic_examples.Party
assert fields["nested_imported_ref"].type_name == "Optional[Quest]"
assert fields["nested_imported_ref"].raw_type == Optional[pydantic_examples.Quest]
assert fields["global_ref"].type_name == "GlobalWithFwdRefs"
assert fields["global_ref"].raw_type == GlobalWithFwdRefs
assert fields["nested_global_ref"].type_name == "Optional[GlobalWithFwdRefs]"
assert fields["nested_global_ref"].raw_type == Optional[GlobalWithFwdRefs]
assert fields["self_ref"].type_name == "FnScopeAutomaticallyResolvable"
assert fields["self_ref"].raw_type == FnScopeAutomaticallyResolvable
assert fields["nested_self_ref"].type_name == "Optional[FnScopeAutomaticallyResolvable]"
assert fields["nested_self_ref"].raw_type == Optional[FnScopeAutomaticallyResolvable]
assert fields["sibling_ref_before"].type_name == "FnScopeOtherModelBefore"
assert fields["sibling_ref_before"].raw_type == FnScopeOtherModelBefore
assert fields["nested_sibling_ref_before"].type_name == "Optional[FnScopeOtherModelBefore]"
assert fields["nested_sibling_ref_before"].raw_type == Optional[FnScopeOtherModelBefore]

@@ -195,3 +192,2 @@

assert fields["sibling_ref_after"].raw_type == FnScopeOtherModelAfter
assert fields["nested_sibling_ref_after"].type_name == "Optional[FnScopeOtherModelAfter]"
assert fields["nested_sibling_ref_after"].raw_type == Optional[FnScopeOtherModelAfter]

@@ -71,7 +71,6 @@ import typing

# Resolve forward reference
typing.get_type_hints(Model, localns=locals())
resolved_annotations = typing.get_type_hints(Model, localns=locals())
assert get_recursive_args(resolved_annotations["field"]) == [SomeForwardRef]
assert get_recursive_args(Model.__annotations__["field"]) == [SomeForwardRef]
def test_get_depth1_bases():

@@ -78,0 +77,0 @@ class A0:

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

{
"models": {
"erdantic.examples.attrs.Adventurer": {
"full_name": {
"module": "erdantic.examples.attrs",
"qual_name": "Adventurer"
},
"name": "Adventurer",
"fields": {
"name": {
"model_full_name": {
"module": "erdantic.examples.attrs",
"qual_name": "Adventurer"
},
"name": "name",
"type_name": "str"
},
"profession": {
"model_full_name": {
"module": "erdantic.examples.attrs",
"qual_name": "Adventurer"
},
"name": "profession",
"type_name": "str"
},
"alignment": {
"model_full_name": {
"module": "erdantic.examples.attrs",
"qual_name": "Adventurer"
},
"name": "alignment",
"type_name": "Alignment"
},
"level": {
"model_full_name": {
"module": "erdantic.examples.attrs",
"qual_name": "Adventurer"
},
"name": "level",
"type_name": "int"
}
},
"description": "erdantic.examples.attrs.Adventurer\n\nA person often late for dinner but with a tale or two to tell.\n\nAttributes:\n name (str): Name of this adventurer\n profession (str): Profession of this adventurer\n level (int): Level of this adventurer\n alignment (Alignment): Alignment of this adventurer\n"
},
"erdantic.examples.attrs.Party": {
"full_name": {
"module": "erdantic.examples.attrs",
"qual_name": "Party"
},
"name": "Party",
"fields": {
"name": {
"model_full_name": {
"module": "erdantic.examples.attrs",
"qual_name": "Party"
},
"name": "name",
"type_name": "str"
},
"formed_datetime": {
"model_full_name": {
"module": "erdantic.examples.attrs",
"qual_name": "Party"
},
"name": "formed_datetime",
"type_name": "datetime"
},
"members": {
"model_full_name": {
"module": "erdantic.examples.attrs",
"qual_name": "Party"
},
"name": "members",
"type_name": "list[Adventurer]"
},
"active_quest": {
"model_full_name": {
"module": "erdantic.examples.attrs",
"qual_name": "Party"
},
"name": "active_quest",
"type_name": "Optional[Quest]"
}
},
"description": "erdantic.examples.attrs.Party\n\nA group of adventurers finding themselves doing and saying things altogether unexpected.\n\nAttributes:\n name (str): Name that party is known by\n formed_datetime (datetime): Timestamp of when the party was formed\n members (list[Adventurer]): Adventurers that belong to this party\n active_quest (Optional[Quest]): Current quest that party is actively tackling\n"
},
"erdantic.examples.attrs.Quest": {
"full_name": {
"module": "erdantic.examples.attrs",
"qual_name": "Quest"
},
"name": "Quest",
"fields": {
"name": {
"model_full_name": {
"module": "erdantic.examples.attrs",
"qual_name": "Quest"
},
"name": "name",
"type_name": "str"
},
"giver": {
"model_full_name": {
"module": "erdantic.examples.attrs",
"qual_name": "Quest"
},
"name": "giver",
"type_name": "QuestGiver"
},
"reward_gold": {
"model_full_name": {
"module": "erdantic.examples.attrs",
"qual_name": "Quest"
},
"name": "reward_gold",
"type_name": "int"
}
},
"description": "erdantic.examples.attrs.Quest\n\nA task to complete, with some monetary reward.\n\nAttributes:\n name (str): Name by which this quest is referred to\n giver (QuestGiver): Person who offered the quest\n reward_gold (int): Amount of gold to be rewarded for quest completion\n"
},
"erdantic.examples.attrs.QuestGiver": {
"full_name": {
"module": "erdantic.examples.attrs",
"qual_name": "QuestGiver"
},
"name": "QuestGiver",
"fields": {
"name": {
"model_full_name": {
"module": "erdantic.examples.attrs",
"qual_name": "QuestGiver"
},
"name": "name",
"type_name": "str"
},
"faction": {
"model_full_name": {
"module": "erdantic.examples.attrs",
"qual_name": "QuestGiver"
},
"name": "faction",
"type_name": "Optional[str]"
},
"location": {
"model_full_name": {
"module": "erdantic.examples.attrs",
"qual_name": "QuestGiver"
},
"name": "location",
"type_name": "str"
}
},
"description": "erdantic.examples.attrs.QuestGiver\n\nA person who offers a task that needs completing.\n\nAttributes:\n name (str): Name of this quest giver\n faction (str): Faction that this quest giver belongs to\n location (str): Location this quest giver can be found\n"
}
},
"edges": {
"erdantic.examples.attrs.Party-active_quest-erdantic.examples.attrs.Quest": {
"source_model_full_name": {
"module": "erdantic.examples.attrs",
"qual_name": "Party"
},
"source_field_name": "active_quest",
"target_model_full_name": {
"module": "erdantic.examples.attrs",
"qual_name": "Quest"
},
"target_cardinality": "one",
"target_modality": "zero",
"source_cardinality": "unspecified",
"source_modality": "unspecified"
},
"erdantic.examples.attrs.Party-members-erdantic.examples.attrs.Adventurer": {
"source_model_full_name": {
"module": "erdantic.examples.attrs",
"qual_name": "Party"
},
"source_field_name": "members",
"target_model_full_name": {
"module": "erdantic.examples.attrs",
"qual_name": "Adventurer"
},
"target_cardinality": "many",
"target_modality": "unspecified",
"source_cardinality": "unspecified",
"source_modality": "unspecified"
},
"erdantic.examples.attrs.Quest-giver-erdantic.examples.attrs.QuestGiver": {
"source_model_full_name": {
"module": "erdantic.examples.attrs",
"qual_name": "Quest"
},
"source_field_name": "giver",
"target_model_full_name": {
"module": "erdantic.examples.attrs",
"qual_name": "QuestGiver"
},
"target_cardinality": "one",
"target_modality": "one",
"source_cardinality": "unspecified",
"source_modality": "unspecified"
}
}
}

Sorry, the diff of this file is not supported yet

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 12.2.1 (0)
-->
<!-- Title: Entity Relationship Diagram created by erdantic Pages: 1 -->
<svg width="685pt" height="314pt"
viewBox="0.00 0.00 685.25 313.75" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 309.75)">
<title>Entity Relationship Diagram created by erdantic</title>
<polygon fill="white" stroke="none" points="-4,4 -4,-309.75 681.25,-309.75 681.25,4 -4,4"/>
<text text-anchor="middle" x="338.62" y="-5.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="9.00" fill="#a8a8a8">Created by erdantic vTEST &lt;https://github.com/drivendataorg/erdantic&gt;</text>
<!-- erdantic.examples.attrs.Adventurer -->
<g id="node1" class="node">
<title>erdantic.examples.attrs.Adventurer</title>
<g id="a_node1"><a xlink:title="erdantic.examples.attrs.Adventurer&#10;&#10;A person often late for dinner but with a tale or two to tell.&#10;&#10;Attributes:&#10; &#160;&#160;&#160;name (str): Name of this adventurer&#10; &#160;&#160;&#160;profession (str): Profession of this adventurer&#10; &#160;&#160;&#160;level (int): Level of this adventurer&#10; &#160;&#160;&#160;alignment (Alignment): Alignment of this adventurer&#10;">
<polygon fill="none" stroke="black" points="309.38,-279.25 309.38,-301.75 436.12,-301.75 436.12,-279.25 309.38,-279.25"/>
<text text-anchor="start" x="339" y="-286.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-weight="bold" font-size="14.00">Adventurer</text>
<polygon fill="none" stroke="black" points="309.38,-256.75 309.38,-279.25 371.62,-279.25 371.62,-256.75 309.38,-256.75"/>
<text text-anchor="start" x="325.5" y="-262.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">name</text>
<polygon fill="none" stroke="black" points="371.62,-256.75 371.62,-279.25 436.12,-279.25 436.12,-256.75 371.62,-256.75"/>
<text text-anchor="start" x="397.12" y="-262.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
<polygon fill="none" stroke="black" points="309.38,-234.25 309.38,-256.75 371.62,-256.75 371.62,-234.25 309.38,-234.25"/>
<text text-anchor="start" x="312.38" y="-240.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">profession</text>
<polygon fill="none" stroke="black" points="371.62,-234.25 371.62,-256.75 436.12,-256.75 436.12,-234.25 371.62,-234.25"/>
<text text-anchor="start" x="397.12" y="-240.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
<polygon fill="none" stroke="black" points="309.38,-211.75 309.38,-234.25 371.62,-234.25 371.62,-211.75 309.38,-211.75"/>
<text text-anchor="start" x="313.12" y="-217.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">alignment</text>
<polygon fill="none" stroke="black" points="371.62,-211.75 371.62,-234.25 436.12,-234.25 436.12,-211.75 371.62,-211.75"/>
<text text-anchor="start" x="374.62" y="-217.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">Alignment</text>
<polygon fill="none" stroke="black" points="309.38,-189.25 309.38,-211.75 371.62,-211.75 371.62,-189.25 309.38,-189.25"/>
<text text-anchor="start" x="327.38" y="-195.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">level</text>
<polygon fill="none" stroke="black" points="371.62,-189.25 371.62,-211.75 436.12,-211.75 436.12,-189.25 371.62,-189.25"/>
<text text-anchor="start" x="396.75" y="-195.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">int</text>
</a>
</g>
</g>
<!-- erdantic.examples.attrs.Party -->
<g id="node2" class="node">
<title>erdantic.examples.attrs.Party</title>
<g id="a_node2"><a xlink:title="erdantic.examples.attrs.Party&#10;&#10;A group of adventurers finding themselves doing and saying things altogether unexpected.&#10;&#10;Attributes:&#10; &#160;&#160;&#160;name (str): Name that party is known by&#10; &#160;&#160;&#160;formed_datetime (datetime): Timestamp of when the party was formed&#10; &#160;&#160;&#160;members (list[Adventurer]): Adventurers that belong to this party&#10; &#160;&#160;&#160;active_quest (Optional[Quest]): Current quest that party is actively tackling&#10;">
<polygon fill="none" stroke="black" points="0,-283.25 0,-305.75 193.5,-305.75 193.5,-283.25 0,-283.25"/>
<text text-anchor="start" x="80.62" y="-290.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-weight="bold" font-size="14.00">Party</text>
<polygon fill="none" stroke="black" points="0,-260.75 0,-283.25 99.75,-283.25 99.75,-260.75 0,-260.75"/>
<text text-anchor="start" x="34.88" y="-266.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">name</text>
<polygon fill="none" stroke="black" points="99.75,-260.75 99.75,-283.25 193.5,-283.25 193.5,-260.75 99.75,-260.75"/>
<text text-anchor="start" x="139.88" y="-266.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
<polygon fill="none" stroke="black" points="0,-238.25 0,-260.75 99.75,-260.75 99.75,-238.25 0,-238.25"/>
<text text-anchor="start" x="3" y="-244.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">formed_datetime</text>
<polygon fill="none" stroke="black" points="99.75,-238.25 99.75,-260.75 193.5,-260.75 193.5,-238.25 99.75,-238.25"/>
<text text-anchor="start" x="123" y="-244.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">datetime</text>
<polygon fill="none" stroke="black" points="0,-215.75 0,-238.25 99.75,-238.25 99.75,-215.75 0,-215.75"/>
<text text-anchor="start" x="24.38" y="-221.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">members</text>
<polygon fill="none" stroke="black" points="99.75,-215.75 99.75,-238.25 193.5,-238.25 193.5,-215.75 99.75,-215.75"/>
<text text-anchor="start" x="103.12" y="-221.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">list[Adventurer]</text>
<polygon fill="none" stroke="black" points="0,-193.25 0,-215.75 99.75,-215.75 99.75,-193.25 0,-193.25"/>
<text text-anchor="start" x="16.12" y="-199.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">active_quest</text>
<polygon fill="none" stroke="black" points="99.75,-193.25 99.75,-215.75 193.5,-215.75 193.5,-193.25 99.75,-193.25"/>
<text text-anchor="start" x="102.75" y="-199.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">Optional[Quest]</text>
</a>
</g>
</g>
<!-- erdantic.examples.attrs.Party&#45;&gt;erdantic.examples.attrs.Adventurer -->
<g id="edge1" class="edge">
<title>erdantic.examples.attrs.Party:e&#45;&gt;erdantic.examples.attrs.Adventurer:w</title>
<path fill="none" stroke="black" d="M203.46,-227.67C246.93,-233.77 252.74,-279.62 293.21,-288.88"/>
<polyline fill="none" stroke="black" points="193.5,-227 198.49,-227.34"/>
<polyline fill="none" stroke="black" points="198.49,-227.34 203.48,-227.67"/>
<polygon fill="black" stroke="black" points="298.1,-289.4 307.56,-294.94 303.4,-289.97 307.71,-290.43 307.71,-290.43 307.71,-290.43 303.4,-289.97 308.52,-285.99 298.1,-289.4"/>
<polyline fill="none" stroke="black" points="296.89,-289.27 291.92,-288.74"/>
</g>
<!-- erdantic.examples.attrs.Quest -->
<g id="node3" class="node">
<title>erdantic.examples.attrs.Quest</title>
<g id="a_node3"><a xlink:title="erdantic.examples.attrs.Quest&#10;&#10;A task to complete, with some monetary reward.&#10;&#10;Attributes:&#10; &#160;&#160;&#160;name (str): Name by which this quest is referred to&#10; &#160;&#160;&#160;giver (QuestGiver): Person who offered the quest&#10; &#160;&#160;&#160;reward_gold (int): Amount of gold to be rewarded for quest completion&#10;">
<polygon fill="none" stroke="black" points="301.5,-131 301.5,-153.5 444,-153.5 444,-131 301.5,-131"/>
<text text-anchor="start" x="355.5" y="-138.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-weight="bold" font-size="14.00">Quest</text>
<polygon fill="none" stroke="black" points="301.5,-108.5 301.5,-131 375.75,-131 375.75,-108.5 301.5,-108.5"/>
<text text-anchor="start" x="323.62" y="-114.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">name</text>
<polygon fill="none" stroke="black" points="375.75,-108.5 375.75,-131 444,-131 444,-108.5 375.75,-108.5"/>
<text text-anchor="start" x="403.12" y="-114.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
<polygon fill="none" stroke="black" points="301.5,-86 301.5,-108.5 375.75,-108.5 375.75,-86 301.5,-86"/>
<text text-anchor="start" x="324.75" y="-92.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">giver</text>
<polygon fill="none" stroke="black" points="375.75,-86 375.75,-108.5 444,-108.5 444,-86 375.75,-86"/>
<text text-anchor="start" x="378.75" y="-92.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">QuestGiver</text>
<polygon fill="none" stroke="black" points="301.5,-63.5 301.5,-86 375.75,-86 375.75,-63.5 301.5,-63.5"/>
<text text-anchor="start" x="304.5" y="-69.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">reward_gold</text>
<polygon fill="none" stroke="black" points="375.75,-63.5 375.75,-86 444,-86 444,-63.5 375.75,-63.5"/>
<text text-anchor="start" x="402.75" y="-69.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">int</text>
</a>
</g>
</g>
<!-- erdantic.examples.attrs.Party&#45;&gt;erdantic.examples.attrs.Quest -->
<g id="edge2" class="edge">
<title>erdantic.examples.attrs.Party:e&#45;&gt;erdantic.examples.attrs.Quest:w</title>
<path fill="none" stroke="black" d="M203.23,-203.8C242.55,-197.9 248.51,-156.32 282.82,-145.06"/>
<polyline fill="none" stroke="black" points="193.5,-204.5 198.49,-204.14"/>
<polyline fill="none" stroke="black" points="198.49,-204.14 203.47,-203.78"/>
<polyline fill="none" stroke="black" points="301.5,-142.25 296.56,-142.99"/>
<polygon fill="black" stroke="black" points="294.82,-138.2 296.31,-148.09 294.33,-148.38 292.85,-138.49 294.82,-138.2"/>
<polyline fill="none" stroke="black" points="296.56,-142.99 291.61,-143.74"/>
<ellipse fill="none" stroke="black" cx="287.16" cy="-144.4" rx="4" ry="4"/>
</g>
<!-- erdantic.examples.attrs.QuestGiver -->
<g id="node4" class="node">
<title>erdantic.examples.attrs.QuestGiver</title>
<g id="a_node4"><a xlink:title="erdantic.examples.attrs.QuestGiver&#10;&#10;A person who offers a task that needs completing.&#10;&#10;Attributes:&#10; &#160;&#160;&#160;name (str): Name of this quest giver&#10; &#160;&#160;&#160;faction (str): Faction that this quest giver belongs to&#10; &#160;&#160;&#160;location (str): Location this quest giver can be found&#10;">
<polygon fill="none" stroke="black" points="552,-86 552,-108.5 677.25,-108.5 677.25,-86 552,-86"/>
<text text-anchor="start" x="580.5" y="-93.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-weight="bold" font-size="14.00">QuestGiver</text>
<polygon fill="none" stroke="black" points="552,-63.5 552,-86 601.5,-86 601.5,-63.5 552,-63.5"/>
<text text-anchor="start" x="561.75" y="-69.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">name</text>
<polygon fill="none" stroke="black" points="601.5,-63.5 601.5,-86 677.25,-86 677.25,-63.5 601.5,-63.5"/>
<text text-anchor="start" x="632.62" y="-69.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
<polygon fill="none" stroke="black" points="552,-41 552,-63.5 601.5,-63.5 601.5,-41 552,-41"/>
<text text-anchor="start" x="558" y="-47.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">faction</text>
<polygon fill="none" stroke="black" points="601.5,-41 601.5,-63.5 677.25,-63.5 677.25,-41 601.5,-41"/>
<text text-anchor="start" x="604.5" y="-47.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">Optional[str]</text>
<polygon fill="none" stroke="black" points="552,-18.5 552,-41 601.5,-41 601.5,-18.5 552,-18.5"/>
<text text-anchor="start" x="555" y="-24.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">location</text>
<polygon fill="none" stroke="black" points="601.5,-18.5 601.5,-41 677.25,-41 677.25,-18.5 601.5,-18.5"/>
<text text-anchor="start" x="632.62" y="-24.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
</a>
</g>
</g>
<!-- erdantic.examples.attrs.Quest&#45;&gt;erdantic.examples.attrs.QuestGiver -->
<g id="edge3" class="edge">
<title>erdantic.examples.attrs.Quest:e&#45;&gt;erdantic.examples.attrs.QuestGiver:w</title>
<path fill="none" stroke="black" d="M453.87,-97.25C489.07,-97.25 503.8,-97.25 537.08,-97.25"/>
<polyline fill="none" stroke="black" points="444,-97.25 449,-97.25"/>
<polyline fill="none" stroke="black" points="449,-97.25 454,-97.25"/>
<polyline fill="none" stroke="black" points="552,-97.25 547,-97.25"/>
<polygon fill="black" stroke="black" points="546,-92.25 546,-102.25 544,-102.25 544,-92.25 546,-92.25"/>
<polyline fill="none" stroke="black" points="547,-97.25 542,-97.25"/>
<polygon fill="black" stroke="black" points="541,-92.25 541,-102.25 539,-102.25 539,-92.25 541,-92.25"/>
<polyline fill="none" stroke="black" points="542,-97.25 537,-97.25"/>
</g>
</g>
</svg>

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

{
"models": {
"erdantic.examples.dataclasses.Adventurer": {
"full_name": {
"module": "erdantic.examples.dataclasses",
"qual_name": "Adventurer"
},
"name": "Adventurer",
"fields": {
"name": {
"model_full_name": {
"module": "erdantic.examples.dataclasses",
"qual_name": "Adventurer"
},
"name": "name",
"type_name": "str"
},
"profession": {
"model_full_name": {
"module": "erdantic.examples.dataclasses",
"qual_name": "Adventurer"
},
"name": "profession",
"type_name": "str"
},
"alignment": {
"model_full_name": {
"module": "erdantic.examples.dataclasses",
"qual_name": "Adventurer"
},
"name": "alignment",
"type_name": "Alignment"
},
"level": {
"model_full_name": {
"module": "erdantic.examples.dataclasses",
"qual_name": "Adventurer"
},
"name": "level",
"type_name": "int"
}
},
"description": "erdantic.examples.dataclasses.Adventurer\n\nA person often late for dinner but with a tale or two to tell.\n\nAttributes:\n name (str): Name of this adventurer\n profession (str): Profession of this adventurer\n alignment (Alignment): Alignment of this adventurer\n level (int): Level of this adventurer\n"
},
"erdantic.examples.dataclasses.Party": {
"full_name": {
"module": "erdantic.examples.dataclasses",
"qual_name": "Party"
},
"name": "Party",
"fields": {
"name": {
"model_full_name": {
"module": "erdantic.examples.dataclasses",
"qual_name": "Party"
},
"name": "name",
"type_name": "str"
},
"formed_datetime": {
"model_full_name": {
"module": "erdantic.examples.dataclasses",
"qual_name": "Party"
},
"name": "formed_datetime",
"type_name": "datetime"
},
"members": {
"model_full_name": {
"module": "erdantic.examples.dataclasses",
"qual_name": "Party"
},
"name": "members",
"type_name": "list[Adventurer]"
},
"active_quest": {
"model_full_name": {
"module": "erdantic.examples.dataclasses",
"qual_name": "Party"
},
"name": "active_quest",
"type_name": "Optional[Quest]"
}
},
"description": "erdantic.examples.dataclasses.Party\n\nA group of adventurers finding themselves doing and saying things altogether unexpected.\n\nAttributes:\n name (str): Name that party is known by\n formed_datetime (datetime): Timestamp of when the party was formed\n members (list[Adventurer]): Adventurers that belong to this party\n active_quest (Optional[Quest]): Current quest that party is actively tackling\n"
},
"erdantic.examples.dataclasses.Quest": {
"full_name": {
"module": "erdantic.examples.dataclasses",
"qual_name": "Quest"
},
"name": "Quest",
"fields": {
"name": {
"model_full_name": {
"module": "erdantic.examples.dataclasses",
"qual_name": "Quest"
},
"name": "name",
"type_name": "str"
},
"giver": {
"model_full_name": {
"module": "erdantic.examples.dataclasses",
"qual_name": "Quest"
},
"name": "giver",
"type_name": "QuestGiver"
},
"reward_gold": {
"model_full_name": {
"module": "erdantic.examples.dataclasses",
"qual_name": "Quest"
},
"name": "reward_gold",
"type_name": "int"
}
},
"description": "erdantic.examples.dataclasses.Quest\n\nA task to complete, with some monetary reward.\n\nAttributes:\n name (str): Name by which this quest is referred to\n giver (QuestGiver): Person who offered the quest\n reward_gold (int): Amount of gold to be rewarded for quest completion\n"
},
"erdantic.examples.dataclasses.QuestGiver": {
"full_name": {
"module": "erdantic.examples.dataclasses",
"qual_name": "QuestGiver"
},
"name": "QuestGiver",
"fields": {
"name": {
"model_full_name": {
"module": "erdantic.examples.dataclasses",
"qual_name": "QuestGiver"
},
"name": "name",
"type_name": "str"
},
"faction": {
"model_full_name": {
"module": "erdantic.examples.dataclasses",
"qual_name": "QuestGiver"
},
"name": "faction",
"type_name": "Optional[str]"
},
"location": {
"model_full_name": {
"module": "erdantic.examples.dataclasses",
"qual_name": "QuestGiver"
},
"name": "location",
"type_name": "str"
}
},
"description": "erdantic.examples.dataclasses.QuestGiver\n\nA person who offers a task that needs completing.\n\nAttributes:\n name (str): Name of this quest giver\n faction (str): Faction that this quest giver belongs to\n location (str): Location this quest giver can be found\n"
}
},
"edges": {
"erdantic.examples.dataclasses.Party-active_quest-erdantic.examples.dataclasses.Quest": {
"source_model_full_name": {
"module": "erdantic.examples.dataclasses",
"qual_name": "Party"
},
"source_field_name": "active_quest",
"target_model_full_name": {
"module": "erdantic.examples.dataclasses",
"qual_name": "Quest"
},
"target_cardinality": "one",
"target_modality": "zero",
"source_cardinality": "unspecified",
"source_modality": "unspecified"
},
"erdantic.examples.dataclasses.Party-members-erdantic.examples.dataclasses.Adventurer": {
"source_model_full_name": {
"module": "erdantic.examples.dataclasses",
"qual_name": "Party"
},
"source_field_name": "members",
"target_model_full_name": {
"module": "erdantic.examples.dataclasses",
"qual_name": "Adventurer"
},
"target_cardinality": "many",
"target_modality": "unspecified",
"source_cardinality": "unspecified",
"source_modality": "unspecified"
},
"erdantic.examples.dataclasses.Quest-giver-erdantic.examples.dataclasses.QuestGiver": {
"source_model_full_name": {
"module": "erdantic.examples.dataclasses",
"qual_name": "Quest"
},
"source_field_name": "giver",
"target_model_full_name": {
"module": "erdantic.examples.dataclasses",
"qual_name": "QuestGiver"
},
"target_cardinality": "one",
"target_modality": "one",
"source_cardinality": "unspecified",
"source_modality": "unspecified"
}
}
}

Sorry, the diff of this file is not supported yet

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 12.2.1 (0)
-->
<!-- Title: Entity Relationship Diagram created by erdantic Pages: 1 -->
<svg width="685pt" height="314pt"
viewBox="0.00 0.00 685.25 313.75" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 309.75)">
<title>Entity Relationship Diagram created by erdantic</title>
<polygon fill="white" stroke="none" points="-4,4 -4,-309.75 681.25,-309.75 681.25,4 -4,4"/>
<text text-anchor="middle" x="338.62" y="-5.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="9.00" fill="#a8a8a8">Created by erdantic vTEST &lt;https://github.com/drivendataorg/erdantic&gt;</text>
<!-- erdantic.examples.dataclasses.Adventurer -->
<g id="node1" class="node">
<title>erdantic.examples.dataclasses.Adventurer</title>
<g id="a_node1"><a xlink:title="erdantic.examples.dataclasses.Adventurer&#10;&#10;A person often late for dinner but with a tale or two to tell.&#10;&#10;Attributes:&#10; &#160;&#160;&#160;name (str): Name of this adventurer&#10; &#160;&#160;&#160;profession (str): Profession of this adventurer&#10; &#160;&#160;&#160;alignment (Alignment): Alignment of this adventurer&#10; &#160;&#160;&#160;level (int): Level of this adventurer&#10;">
<polygon fill="none" stroke="black" points="309.38,-279.25 309.38,-301.75 436.12,-301.75 436.12,-279.25 309.38,-279.25"/>
<text text-anchor="start" x="339" y="-286.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-weight="bold" font-size="14.00">Adventurer</text>
<polygon fill="none" stroke="black" points="309.38,-256.75 309.38,-279.25 371.62,-279.25 371.62,-256.75 309.38,-256.75"/>
<text text-anchor="start" x="325.5" y="-262.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">name</text>
<polygon fill="none" stroke="black" points="371.62,-256.75 371.62,-279.25 436.12,-279.25 436.12,-256.75 371.62,-256.75"/>
<text text-anchor="start" x="397.12" y="-262.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
<polygon fill="none" stroke="black" points="309.38,-234.25 309.38,-256.75 371.62,-256.75 371.62,-234.25 309.38,-234.25"/>
<text text-anchor="start" x="312.38" y="-240.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">profession</text>
<polygon fill="none" stroke="black" points="371.62,-234.25 371.62,-256.75 436.12,-256.75 436.12,-234.25 371.62,-234.25"/>
<text text-anchor="start" x="397.12" y="-240.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
<polygon fill="none" stroke="black" points="309.38,-211.75 309.38,-234.25 371.62,-234.25 371.62,-211.75 309.38,-211.75"/>
<text text-anchor="start" x="313.12" y="-217.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">alignment</text>
<polygon fill="none" stroke="black" points="371.62,-211.75 371.62,-234.25 436.12,-234.25 436.12,-211.75 371.62,-211.75"/>
<text text-anchor="start" x="374.62" y="-217.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">Alignment</text>
<polygon fill="none" stroke="black" points="309.38,-189.25 309.38,-211.75 371.62,-211.75 371.62,-189.25 309.38,-189.25"/>
<text text-anchor="start" x="327.38" y="-195.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">level</text>
<polygon fill="none" stroke="black" points="371.62,-189.25 371.62,-211.75 436.12,-211.75 436.12,-189.25 371.62,-189.25"/>
<text text-anchor="start" x="396.75" y="-195.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">int</text>
</a>
</g>
</g>
<!-- erdantic.examples.dataclasses.Party -->
<g id="node2" class="node">
<title>erdantic.examples.dataclasses.Party</title>
<g id="a_node2"><a xlink:title="erdantic.examples.dataclasses.Party&#10;&#10;A group of adventurers finding themselves doing and saying things altogether unexpected.&#10;&#10;Attributes:&#10; &#160;&#160;&#160;name (str): Name that party is known by&#10; &#160;&#160;&#160;formed_datetime (datetime): Timestamp of when the party was formed&#10; &#160;&#160;&#160;members (list[Adventurer]): Adventurers that belong to this party&#10; &#160;&#160;&#160;active_quest (Optional[Quest]): Current quest that party is actively tackling&#10;">
<polygon fill="none" stroke="black" points="0,-283.25 0,-305.75 193.5,-305.75 193.5,-283.25 0,-283.25"/>
<text text-anchor="start" x="80.62" y="-290.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-weight="bold" font-size="14.00">Party</text>
<polygon fill="none" stroke="black" points="0,-260.75 0,-283.25 99.75,-283.25 99.75,-260.75 0,-260.75"/>
<text text-anchor="start" x="34.88" y="-266.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">name</text>
<polygon fill="none" stroke="black" points="99.75,-260.75 99.75,-283.25 193.5,-283.25 193.5,-260.75 99.75,-260.75"/>
<text text-anchor="start" x="139.88" y="-266.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
<polygon fill="none" stroke="black" points="0,-238.25 0,-260.75 99.75,-260.75 99.75,-238.25 0,-238.25"/>
<text text-anchor="start" x="3" y="-244.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">formed_datetime</text>
<polygon fill="none" stroke="black" points="99.75,-238.25 99.75,-260.75 193.5,-260.75 193.5,-238.25 99.75,-238.25"/>
<text text-anchor="start" x="123" y="-244.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">datetime</text>
<polygon fill="none" stroke="black" points="0,-215.75 0,-238.25 99.75,-238.25 99.75,-215.75 0,-215.75"/>
<text text-anchor="start" x="24.38" y="-221.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">members</text>
<polygon fill="none" stroke="black" points="99.75,-215.75 99.75,-238.25 193.5,-238.25 193.5,-215.75 99.75,-215.75"/>
<text text-anchor="start" x="103.12" y="-221.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">list[Adventurer]</text>
<polygon fill="none" stroke="black" points="0,-193.25 0,-215.75 99.75,-215.75 99.75,-193.25 0,-193.25"/>
<text text-anchor="start" x="16.12" y="-199.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">active_quest</text>
<polygon fill="none" stroke="black" points="99.75,-193.25 99.75,-215.75 193.5,-215.75 193.5,-193.25 99.75,-193.25"/>
<text text-anchor="start" x="102.75" y="-199.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">Optional[Quest]</text>
</a>
</g>
</g>
<!-- erdantic.examples.dataclasses.Party&#45;&gt;erdantic.examples.dataclasses.Adventurer -->
<g id="edge1" class="edge">
<title>erdantic.examples.dataclasses.Party:e&#45;&gt;erdantic.examples.dataclasses.Adventurer:w</title>
<path fill="none" stroke="black" d="M203.46,-227.67C246.93,-233.77 252.74,-279.62 293.21,-288.88"/>
<polyline fill="none" stroke="black" points="193.5,-227 198.49,-227.34"/>
<polyline fill="none" stroke="black" points="198.49,-227.34 203.48,-227.67"/>
<polygon fill="black" stroke="black" points="298.1,-289.4 307.56,-294.94 303.4,-289.97 307.71,-290.43 307.71,-290.43 307.71,-290.43 303.4,-289.97 308.52,-285.99 298.1,-289.4"/>
<polyline fill="none" stroke="black" points="296.89,-289.27 291.92,-288.74"/>
</g>
<!-- erdantic.examples.dataclasses.Quest -->
<g id="node3" class="node">
<title>erdantic.examples.dataclasses.Quest</title>
<g id="a_node3"><a xlink:title="erdantic.examples.dataclasses.Quest&#10;&#10;A task to complete, with some monetary reward.&#10;&#10;Attributes:&#10; &#160;&#160;&#160;name (str): Name by which this quest is referred to&#10; &#160;&#160;&#160;giver (QuestGiver): Person who offered the quest&#10; &#160;&#160;&#160;reward_gold (int): Amount of gold to be rewarded for quest completion&#10;">
<polygon fill="none" stroke="black" points="301.5,-131 301.5,-153.5 444,-153.5 444,-131 301.5,-131"/>
<text text-anchor="start" x="355.5" y="-138.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-weight="bold" font-size="14.00">Quest</text>
<polygon fill="none" stroke="black" points="301.5,-108.5 301.5,-131 375.75,-131 375.75,-108.5 301.5,-108.5"/>
<text text-anchor="start" x="323.62" y="-114.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">name</text>
<polygon fill="none" stroke="black" points="375.75,-108.5 375.75,-131 444,-131 444,-108.5 375.75,-108.5"/>
<text text-anchor="start" x="403.12" y="-114.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
<polygon fill="none" stroke="black" points="301.5,-86 301.5,-108.5 375.75,-108.5 375.75,-86 301.5,-86"/>
<text text-anchor="start" x="324.75" y="-92.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">giver</text>
<polygon fill="none" stroke="black" points="375.75,-86 375.75,-108.5 444,-108.5 444,-86 375.75,-86"/>
<text text-anchor="start" x="378.75" y="-92.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">QuestGiver</text>
<polygon fill="none" stroke="black" points="301.5,-63.5 301.5,-86 375.75,-86 375.75,-63.5 301.5,-63.5"/>
<text text-anchor="start" x="304.5" y="-69.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">reward_gold</text>
<polygon fill="none" stroke="black" points="375.75,-63.5 375.75,-86 444,-86 444,-63.5 375.75,-63.5"/>
<text text-anchor="start" x="402.75" y="-69.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">int</text>
</a>
</g>
</g>
<!-- erdantic.examples.dataclasses.Party&#45;&gt;erdantic.examples.dataclasses.Quest -->
<g id="edge2" class="edge">
<title>erdantic.examples.dataclasses.Party:e&#45;&gt;erdantic.examples.dataclasses.Quest:w</title>
<path fill="none" stroke="black" d="M203.23,-203.8C242.55,-197.9 248.51,-156.32 282.82,-145.06"/>
<polyline fill="none" stroke="black" points="193.5,-204.5 198.49,-204.14"/>
<polyline fill="none" stroke="black" points="198.49,-204.14 203.47,-203.78"/>
<polyline fill="none" stroke="black" points="301.5,-142.25 296.56,-142.99"/>
<polygon fill="black" stroke="black" points="294.82,-138.2 296.31,-148.09 294.33,-148.38 292.85,-138.49 294.82,-138.2"/>
<polyline fill="none" stroke="black" points="296.56,-142.99 291.61,-143.74"/>
<ellipse fill="none" stroke="black" cx="287.16" cy="-144.4" rx="4" ry="4"/>
</g>
<!-- erdantic.examples.dataclasses.QuestGiver -->
<g id="node4" class="node">
<title>erdantic.examples.dataclasses.QuestGiver</title>
<g id="a_node4"><a xlink:title="erdantic.examples.dataclasses.QuestGiver&#10;&#10;A person who offers a task that needs completing.&#10;&#10;Attributes:&#10; &#160;&#160;&#160;name (str): Name of this quest giver&#10; &#160;&#160;&#160;faction (str): Faction that this quest giver belongs to&#10; &#160;&#160;&#160;location (str): Location this quest giver can be found&#10;">
<polygon fill="none" stroke="black" points="552,-86 552,-108.5 677.25,-108.5 677.25,-86 552,-86"/>
<text text-anchor="start" x="580.5" y="-93.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-weight="bold" font-size="14.00">QuestGiver</text>
<polygon fill="none" stroke="black" points="552,-63.5 552,-86 601.5,-86 601.5,-63.5 552,-63.5"/>
<text text-anchor="start" x="561.75" y="-69.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">name</text>
<polygon fill="none" stroke="black" points="601.5,-63.5 601.5,-86 677.25,-86 677.25,-63.5 601.5,-63.5"/>
<text text-anchor="start" x="632.62" y="-69.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
<polygon fill="none" stroke="black" points="552,-41 552,-63.5 601.5,-63.5 601.5,-41 552,-41"/>
<text text-anchor="start" x="558" y="-47.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">faction</text>
<polygon fill="none" stroke="black" points="601.5,-41 601.5,-63.5 677.25,-63.5 677.25,-41 601.5,-41"/>
<text text-anchor="start" x="604.5" y="-47.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">Optional[str]</text>
<polygon fill="none" stroke="black" points="552,-18.5 552,-41 601.5,-41 601.5,-18.5 552,-18.5"/>
<text text-anchor="start" x="555" y="-24.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">location</text>
<polygon fill="none" stroke="black" points="601.5,-18.5 601.5,-41 677.25,-41 677.25,-18.5 601.5,-18.5"/>
<text text-anchor="start" x="632.62" y="-24.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
</a>
</g>
</g>
<!-- erdantic.examples.dataclasses.Quest&#45;&gt;erdantic.examples.dataclasses.QuestGiver -->
<g id="edge3" class="edge">
<title>erdantic.examples.dataclasses.Quest:e&#45;&gt;erdantic.examples.dataclasses.QuestGiver:w</title>
<path fill="none" stroke="black" d="M453.87,-97.25C489.07,-97.25 503.8,-97.25 537.08,-97.25"/>
<polyline fill="none" stroke="black" points="444,-97.25 449,-97.25"/>
<polyline fill="none" stroke="black" points="449,-97.25 454,-97.25"/>
<polyline fill="none" stroke="black" points="552,-97.25 547,-97.25"/>
<polygon fill="black" stroke="black" points="546,-92.25 546,-102.25 544,-102.25 544,-92.25 546,-92.25"/>
<polyline fill="none" stroke="black" points="547,-97.25 542,-97.25"/>
<polygon fill="black" stroke="black" points="541,-92.25 541,-102.25 539,-102.25 539,-92.25 541,-92.25"/>
<polyline fill="none" stroke="black" points="542,-97.25 537,-97.25"/>
</g>
</g>
</svg>

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

{
"models": {
"erdantic.examples.pydantic_v1.Adventurer": {
"full_name": {
"module": "erdantic.examples.pydantic_v1",
"qual_name": "Adventurer"
},
"name": "Adventurer",
"fields": {
"name": {
"model_full_name": {
"module": "erdantic.examples.pydantic_v1",
"qual_name": "Adventurer"
},
"name": "name",
"type_name": "str"
},
"profession": {
"model_full_name": {
"module": "erdantic.examples.pydantic_v1",
"qual_name": "Adventurer"
},
"name": "profession",
"type_name": "str"
},
"alignment": {
"model_full_name": {
"module": "erdantic.examples.pydantic_v1",
"qual_name": "Adventurer"
},
"name": "alignment",
"type_name": "Alignment"
},
"level": {
"model_full_name": {
"module": "erdantic.examples.pydantic_v1",
"qual_name": "Adventurer"
},
"name": "level",
"type_name": "int"
}
},
"description": "erdantic.examples.pydantic_v1.Adventurer\n\nA person often late for dinner but with a tale or two to tell.\n\nAttributes:\n name (str): Name of this adventurer\n profession (str): Profession of this adventurer\n alignment (Alignment): Alignment of this adventurer\n level (int): Level of this adventurer\n"
},
"erdantic.examples.pydantic_v1.Party": {
"full_name": {
"module": "erdantic.examples.pydantic_v1",
"qual_name": "Party"
},
"name": "Party",
"fields": {
"name": {
"model_full_name": {
"module": "erdantic.examples.pydantic_v1",
"qual_name": "Party"
},
"name": "name",
"type_name": "str"
},
"formed_datetime": {
"model_full_name": {
"module": "erdantic.examples.pydantic_v1",
"qual_name": "Party"
},
"name": "formed_datetime",
"type_name": "datetime"
},
"members": {
"model_full_name": {
"module": "erdantic.examples.pydantic_v1",
"qual_name": "Party"
},
"name": "members",
"type_name": "list[Adventurer]"
},
"active_quest": {
"model_full_name": {
"module": "erdantic.examples.pydantic_v1",
"qual_name": "Party"
},
"name": "active_quest",
"type_name": "Optional[Quest]"
}
},
"description": "erdantic.examples.pydantic_v1.Party\n\nA group of adventurers finding themselves doing and saying things altogether unexpected.\n\nAttributes:\n name (str): Name that party is known by\n formed_datetime (datetime): Timestamp of when the party was formed\n members (list[Adventurer]): Adventurers that belong to this party\n active_quest (Optional[Quest]): Current quest that party is actively tackling\n"
},
"erdantic.examples.pydantic_v1.Quest": {
"full_name": {
"module": "erdantic.examples.pydantic_v1",
"qual_name": "Quest"
},
"name": "Quest",
"fields": {
"name": {
"model_full_name": {
"module": "erdantic.examples.pydantic_v1",
"qual_name": "Quest"
},
"name": "name",
"type_name": "str"
},
"giver": {
"model_full_name": {
"module": "erdantic.examples.pydantic_v1",
"qual_name": "Quest"
},
"name": "giver",
"type_name": "QuestGiver"
},
"reward_gold": {
"model_full_name": {
"module": "erdantic.examples.pydantic_v1",
"qual_name": "Quest"
},
"name": "reward_gold",
"type_name": "int"
}
},
"description": "erdantic.examples.pydantic_v1.Quest\n\nA task to complete, with some monetary reward.\n\nAttributes:\n name (str): Name by which this quest is referred to\n giver (QuestGiver): Person who offered the quest\n reward_gold (int): Amount of gold to be rewarded for quest completion\n"
},
"erdantic.examples.pydantic_v1.QuestGiver": {
"full_name": {
"module": "erdantic.examples.pydantic_v1",
"qual_name": "QuestGiver"
},
"name": "QuestGiver",
"fields": {
"name": {
"model_full_name": {
"module": "erdantic.examples.pydantic_v1",
"qual_name": "QuestGiver"
},
"name": "name",
"type_name": "str"
},
"faction": {
"model_full_name": {
"module": "erdantic.examples.pydantic_v1",
"qual_name": "QuestGiver"
},
"name": "faction",
"type_name": "Optional[str]"
},
"location": {
"model_full_name": {
"module": "erdantic.examples.pydantic_v1",
"qual_name": "QuestGiver"
},
"name": "location",
"type_name": "str"
}
},
"description": "erdantic.examples.pydantic_v1.QuestGiver\n\nA person who offers a task that needs completing.\n\nAttributes:\n name (str): Name of this quest giver\n faction (str): Faction that this quest giver belongs to\n location (str): Location this quest giver can be found\n"
}
},
"edges": {
"erdantic.examples.pydantic_v1.Party-active_quest-erdantic.examples.pydantic_v1.Quest": {
"source_model_full_name": {
"module": "erdantic.examples.pydantic_v1",
"qual_name": "Party"
},
"source_field_name": "active_quest",
"target_model_full_name": {
"module": "erdantic.examples.pydantic_v1",
"qual_name": "Quest"
},
"target_cardinality": "one",
"target_modality": "zero",
"source_cardinality": "unspecified",
"source_modality": "unspecified"
},
"erdantic.examples.pydantic_v1.Party-members-erdantic.examples.pydantic_v1.Adventurer": {
"source_model_full_name": {
"module": "erdantic.examples.pydantic_v1",
"qual_name": "Party"
},
"source_field_name": "members",
"target_model_full_name": {
"module": "erdantic.examples.pydantic_v1",
"qual_name": "Adventurer"
},
"target_cardinality": "many",
"target_modality": "unspecified",
"source_cardinality": "unspecified",
"source_modality": "unspecified"
},
"erdantic.examples.pydantic_v1.Quest-giver-erdantic.examples.pydantic_v1.QuestGiver": {
"source_model_full_name": {
"module": "erdantic.examples.pydantic_v1",
"qual_name": "Quest"
},
"source_field_name": "giver",
"target_model_full_name": {
"module": "erdantic.examples.pydantic_v1",
"qual_name": "QuestGiver"
},
"target_cardinality": "one",
"target_modality": "one",
"source_cardinality": "unspecified",
"source_modality": "unspecified"
}
}
}

Sorry, the diff of this file is not supported yet

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 12.2.1 (0)
-->
<!-- Title: Entity Relationship Diagram created by erdantic Pages: 1 -->
<svg width="685pt" height="314pt"
viewBox="0.00 0.00 685.25 313.75" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 309.75)">
<title>Entity Relationship Diagram created by erdantic</title>
<polygon fill="white" stroke="none" points="-4,4 -4,-309.75 681.25,-309.75 681.25,4 -4,4"/>
<text text-anchor="middle" x="338.62" y="-5.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="9.00" fill="#a8a8a8">Created by erdantic vTEST &lt;https://github.com/drivendataorg/erdantic&gt;</text>
<!-- erdantic.examples.pydantic_v1.Adventurer -->
<g id="node1" class="node">
<title>erdantic.examples.pydantic_v1.Adventurer</title>
<g id="a_node1"><a xlink:title="erdantic.examples.pydantic_v1.Adventurer&#10;&#10;A person often late for dinner but with a tale or two to tell.&#10;&#10;Attributes:&#10; &#160;&#160;&#160;name (str): Name of this adventurer&#10; &#160;&#160;&#160;profession (str): Profession of this adventurer&#10; &#160;&#160;&#160;alignment (Alignment): Alignment of this adventurer&#10; &#160;&#160;&#160;level (int): Level of this adventurer&#10;">
<polygon fill="none" stroke="black" points="309.38,-279.25 309.38,-301.75 436.12,-301.75 436.12,-279.25 309.38,-279.25"/>
<text text-anchor="start" x="339" y="-286.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-weight="bold" font-size="14.00">Adventurer</text>
<polygon fill="none" stroke="black" points="309.38,-256.75 309.38,-279.25 371.62,-279.25 371.62,-256.75 309.38,-256.75"/>
<text text-anchor="start" x="325.5" y="-262.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">name</text>
<polygon fill="none" stroke="black" points="371.62,-256.75 371.62,-279.25 436.12,-279.25 436.12,-256.75 371.62,-256.75"/>
<text text-anchor="start" x="397.12" y="-262.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
<polygon fill="none" stroke="black" points="309.38,-234.25 309.38,-256.75 371.62,-256.75 371.62,-234.25 309.38,-234.25"/>
<text text-anchor="start" x="312.38" y="-240.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">profession</text>
<polygon fill="none" stroke="black" points="371.62,-234.25 371.62,-256.75 436.12,-256.75 436.12,-234.25 371.62,-234.25"/>
<text text-anchor="start" x="397.12" y="-240.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
<polygon fill="none" stroke="black" points="309.38,-211.75 309.38,-234.25 371.62,-234.25 371.62,-211.75 309.38,-211.75"/>
<text text-anchor="start" x="313.12" y="-217.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">alignment</text>
<polygon fill="none" stroke="black" points="371.62,-211.75 371.62,-234.25 436.12,-234.25 436.12,-211.75 371.62,-211.75"/>
<text text-anchor="start" x="374.62" y="-217.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">Alignment</text>
<polygon fill="none" stroke="black" points="309.38,-189.25 309.38,-211.75 371.62,-211.75 371.62,-189.25 309.38,-189.25"/>
<text text-anchor="start" x="327.38" y="-195.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">level</text>
<polygon fill="none" stroke="black" points="371.62,-189.25 371.62,-211.75 436.12,-211.75 436.12,-189.25 371.62,-189.25"/>
<text text-anchor="start" x="396.75" y="-195.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">int</text>
</a>
</g>
</g>
<!-- erdantic.examples.pydantic_v1.Party -->
<g id="node2" class="node">
<title>erdantic.examples.pydantic_v1.Party</title>
<g id="a_node2"><a xlink:title="erdantic.examples.pydantic_v1.Party&#10;&#10;A group of adventurers finding themselves doing and saying things altogether unexpected.&#10;&#10;Attributes:&#10; &#160;&#160;&#160;name (str): Name that party is known by&#10; &#160;&#160;&#160;formed_datetime (datetime): Timestamp of when the party was formed&#10; &#160;&#160;&#160;members (list[Adventurer]): Adventurers that belong to this party&#10; &#160;&#160;&#160;active_quest (Optional[Quest]): Current quest that party is actively tackling&#10;">
<polygon fill="none" stroke="black" points="0,-283.25 0,-305.75 193.5,-305.75 193.5,-283.25 0,-283.25"/>
<text text-anchor="start" x="80.62" y="-290.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-weight="bold" font-size="14.00">Party</text>
<polygon fill="none" stroke="black" points="0,-260.75 0,-283.25 99.75,-283.25 99.75,-260.75 0,-260.75"/>
<text text-anchor="start" x="34.88" y="-266.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">name</text>
<polygon fill="none" stroke="black" points="99.75,-260.75 99.75,-283.25 193.5,-283.25 193.5,-260.75 99.75,-260.75"/>
<text text-anchor="start" x="139.88" y="-266.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
<polygon fill="none" stroke="black" points="0,-238.25 0,-260.75 99.75,-260.75 99.75,-238.25 0,-238.25"/>
<text text-anchor="start" x="3" y="-244.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">formed_datetime</text>
<polygon fill="none" stroke="black" points="99.75,-238.25 99.75,-260.75 193.5,-260.75 193.5,-238.25 99.75,-238.25"/>
<text text-anchor="start" x="123" y="-244.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">datetime</text>
<polygon fill="none" stroke="black" points="0,-215.75 0,-238.25 99.75,-238.25 99.75,-215.75 0,-215.75"/>
<text text-anchor="start" x="24.38" y="-221.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">members</text>
<polygon fill="none" stroke="black" points="99.75,-215.75 99.75,-238.25 193.5,-238.25 193.5,-215.75 99.75,-215.75"/>
<text text-anchor="start" x="103.12" y="-221.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">list[Adventurer]</text>
<polygon fill="none" stroke="black" points="0,-193.25 0,-215.75 99.75,-215.75 99.75,-193.25 0,-193.25"/>
<text text-anchor="start" x="16.12" y="-199.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">active_quest</text>
<polygon fill="none" stroke="black" points="99.75,-193.25 99.75,-215.75 193.5,-215.75 193.5,-193.25 99.75,-193.25"/>
<text text-anchor="start" x="102.75" y="-199.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">Optional[Quest]</text>
</a>
</g>
</g>
<!-- erdantic.examples.pydantic_v1.Party&#45;&gt;erdantic.examples.pydantic_v1.Adventurer -->
<g id="edge1" class="edge">
<title>erdantic.examples.pydantic_v1.Party:e&#45;&gt;erdantic.examples.pydantic_v1.Adventurer:w</title>
<path fill="none" stroke="black" d="M203.46,-227.67C246.93,-233.77 252.74,-279.62 293.21,-288.88"/>
<polyline fill="none" stroke="black" points="193.5,-227 198.49,-227.34"/>
<polyline fill="none" stroke="black" points="198.49,-227.34 203.48,-227.67"/>
<polygon fill="black" stroke="black" points="298.1,-289.4 307.56,-294.94 303.4,-289.97 307.71,-290.43 307.71,-290.43 307.71,-290.43 303.4,-289.97 308.52,-285.99 298.1,-289.4"/>
<polyline fill="none" stroke="black" points="296.89,-289.27 291.92,-288.74"/>
</g>
<!-- erdantic.examples.pydantic_v1.Quest -->
<g id="node3" class="node">
<title>erdantic.examples.pydantic_v1.Quest</title>
<g id="a_node3"><a xlink:title="erdantic.examples.pydantic_v1.Quest&#10;&#10;A task to complete, with some monetary reward.&#10;&#10;Attributes:&#10; &#160;&#160;&#160;name (str): Name by which this quest is referred to&#10; &#160;&#160;&#160;giver (QuestGiver): Person who offered the quest&#10; &#160;&#160;&#160;reward_gold (int): Amount of gold to be rewarded for quest completion&#10;">
<polygon fill="none" stroke="black" points="301.5,-131 301.5,-153.5 444,-153.5 444,-131 301.5,-131"/>
<text text-anchor="start" x="355.5" y="-138.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-weight="bold" font-size="14.00">Quest</text>
<polygon fill="none" stroke="black" points="301.5,-108.5 301.5,-131 375.75,-131 375.75,-108.5 301.5,-108.5"/>
<text text-anchor="start" x="323.62" y="-114.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">name</text>
<polygon fill="none" stroke="black" points="375.75,-108.5 375.75,-131 444,-131 444,-108.5 375.75,-108.5"/>
<text text-anchor="start" x="403.12" y="-114.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
<polygon fill="none" stroke="black" points="301.5,-86 301.5,-108.5 375.75,-108.5 375.75,-86 301.5,-86"/>
<text text-anchor="start" x="324.75" y="-92.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">giver</text>
<polygon fill="none" stroke="black" points="375.75,-86 375.75,-108.5 444,-108.5 444,-86 375.75,-86"/>
<text text-anchor="start" x="378.75" y="-92.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">QuestGiver</text>
<polygon fill="none" stroke="black" points="301.5,-63.5 301.5,-86 375.75,-86 375.75,-63.5 301.5,-63.5"/>
<text text-anchor="start" x="304.5" y="-69.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">reward_gold</text>
<polygon fill="none" stroke="black" points="375.75,-63.5 375.75,-86 444,-86 444,-63.5 375.75,-63.5"/>
<text text-anchor="start" x="402.75" y="-69.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">int</text>
</a>
</g>
</g>
<!-- erdantic.examples.pydantic_v1.Party&#45;&gt;erdantic.examples.pydantic_v1.Quest -->
<g id="edge2" class="edge">
<title>erdantic.examples.pydantic_v1.Party:e&#45;&gt;erdantic.examples.pydantic_v1.Quest:w</title>
<path fill="none" stroke="black" d="M203.23,-203.8C242.55,-197.9 248.51,-156.32 282.82,-145.06"/>
<polyline fill="none" stroke="black" points="193.5,-204.5 198.49,-204.14"/>
<polyline fill="none" stroke="black" points="198.49,-204.14 203.47,-203.78"/>
<polyline fill="none" stroke="black" points="301.5,-142.25 296.56,-142.99"/>
<polygon fill="black" stroke="black" points="294.82,-138.2 296.31,-148.09 294.33,-148.38 292.85,-138.49 294.82,-138.2"/>
<polyline fill="none" stroke="black" points="296.56,-142.99 291.61,-143.74"/>
<ellipse fill="none" stroke="black" cx="287.16" cy="-144.4" rx="4" ry="4"/>
</g>
<!-- erdantic.examples.pydantic_v1.QuestGiver -->
<g id="node4" class="node">
<title>erdantic.examples.pydantic_v1.QuestGiver</title>
<g id="a_node4"><a xlink:title="erdantic.examples.pydantic_v1.QuestGiver&#10;&#10;A person who offers a task that needs completing.&#10;&#10;Attributes:&#10; &#160;&#160;&#160;name (str): Name of this quest giver&#10; &#160;&#160;&#160;faction (str): Faction that this quest giver belongs to&#10; &#160;&#160;&#160;location (str): Location this quest giver can be found&#10;">
<polygon fill="none" stroke="black" points="552,-86 552,-108.5 677.25,-108.5 677.25,-86 552,-86"/>
<text text-anchor="start" x="580.5" y="-93.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-weight="bold" font-size="14.00">QuestGiver</text>
<polygon fill="none" stroke="black" points="552,-63.5 552,-86 601.5,-86 601.5,-63.5 552,-63.5"/>
<text text-anchor="start" x="561.75" y="-69.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">name</text>
<polygon fill="none" stroke="black" points="601.5,-63.5 601.5,-86 677.25,-86 677.25,-63.5 601.5,-63.5"/>
<text text-anchor="start" x="632.62" y="-69.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
<polygon fill="none" stroke="black" points="552,-41 552,-63.5 601.5,-63.5 601.5,-41 552,-41"/>
<text text-anchor="start" x="558" y="-47.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">faction</text>
<polygon fill="none" stroke="black" points="601.5,-41 601.5,-63.5 677.25,-63.5 677.25,-41 601.5,-41"/>
<text text-anchor="start" x="604.5" y="-47.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">Optional[str]</text>
<polygon fill="none" stroke="black" points="552,-18.5 552,-41 601.5,-41 601.5,-18.5 552,-18.5"/>
<text text-anchor="start" x="555" y="-24.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">location</text>
<polygon fill="none" stroke="black" points="601.5,-18.5 601.5,-41 677.25,-41 677.25,-18.5 601.5,-18.5"/>
<text text-anchor="start" x="632.62" y="-24.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
</a>
</g>
</g>
<!-- erdantic.examples.pydantic_v1.Quest&#45;&gt;erdantic.examples.pydantic_v1.QuestGiver -->
<g id="edge3" class="edge">
<title>erdantic.examples.pydantic_v1.Quest:e&#45;&gt;erdantic.examples.pydantic_v1.QuestGiver:w</title>
<path fill="none" stroke="black" d="M453.87,-97.25C489.07,-97.25 503.8,-97.25 537.08,-97.25"/>
<polyline fill="none" stroke="black" points="444,-97.25 449,-97.25"/>
<polyline fill="none" stroke="black" points="449,-97.25 454,-97.25"/>
<polyline fill="none" stroke="black" points="552,-97.25 547,-97.25"/>
<polygon fill="black" stroke="black" points="546,-92.25 546,-102.25 544,-102.25 544,-92.25 546,-92.25"/>
<polyline fill="none" stroke="black" points="547,-97.25 542,-97.25"/>
<polygon fill="black" stroke="black" points="541,-92.25 541,-102.25 539,-102.25 539,-92.25 541,-92.25"/>
<polyline fill="none" stroke="black" points="542,-97.25 537,-97.25"/>
</g>
</g>
</svg>

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

{
"models": {
"erdantic.examples.pydantic.Adventurer": {
"full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Adventurer"
},
"name": "Adventurer",
"fields": {
"name": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Adventurer"
},
"name": "name",
"type_name": "str"
},
"profession": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Adventurer"
},
"name": "profession",
"type_name": "str"
},
"alignment": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Adventurer"
},
"name": "alignment",
"type_name": "Alignment"
},
"level": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Adventurer"
},
"name": "level",
"type_name": "int"
}
},
"description": "erdantic.examples.pydantic.Adventurer\n\nA person often late for dinner but with a tale or two to tell.\n\nAttributes:\n name (str): Name of this adventurer\n profession (str): Profession of this adventurer\n alignment (Alignment): Alignment of this adventurer\n level (int): Level of this adventurer\n"
},
"erdantic.examples.pydantic.Party": {
"full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Party"
},
"name": "Party",
"fields": {
"name": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Party"
},
"name": "name",
"type_name": "str"
},
"formed_datetime": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Party"
},
"name": "formed_datetime",
"type_name": "datetime"
},
"members": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Party"
},
"name": "members",
"type_name": "list[Adventurer]"
},
"active_quest": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Party"
},
"name": "active_quest",
"type_name": "Optional[Quest]"
}
},
"description": "erdantic.examples.pydantic.Party\n\nA group of adventurers finding themselves doing and saying things altogether unexpected.\n\nAttributes:\n name (str): Name that party is known by\n formed_datetime (datetime): Timestamp of when the party was formed\n members (list[Adventurer]): Adventurers that belong to this party\n active_quest (Optional[Quest]): Current quest that party is actively tackling\n"
},
"erdantic.examples.pydantic.Quest": {
"full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Quest"
},
"name": "Quest",
"fields": {
"name": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Quest"
},
"name": "name",
"type_name": "str"
},
"giver": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Quest"
},
"name": "giver",
"type_name": "QuestGiver"
},
"reward_gold": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Quest"
},
"name": "reward_gold",
"type_name": "int"
}
},
"description": "erdantic.examples.pydantic.Quest\n\nA task to complete, with some monetary reward.\n\nAttributes:\n name (str): Name by which this quest is referred to\n giver (QuestGiver): Person who offered the quest\n reward_gold (int): Amount of gold to be rewarded for quest completion\n"
},
"erdantic.examples.pydantic.QuestGiver": {
"full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "QuestGiver"
},
"name": "QuestGiver",
"fields": {
"name": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "QuestGiver"
},
"name": "name",
"type_name": "str"
},
"faction": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "QuestGiver"
},
"name": "faction",
"type_name": "Optional[str]"
},
"location": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "QuestGiver"
},
"name": "location",
"type_name": "str"
}
},
"description": "erdantic.examples.pydantic.QuestGiver\n\nA person who offers a task that needs completing.\n\nAttributes:\n name (str): Name of this quest giver\n faction (str): Faction that this quest giver belongs to\n location (str): Location this quest giver can be found\n"
}
},
"edges": {
"erdantic.examples.pydantic.Party-active_quest-erdantic.examples.pydantic.Quest": {
"source_model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Party"
},
"source_field_name": "active_quest",
"target_model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Quest"
},
"target_cardinality": "one",
"target_modality": "zero",
"source_cardinality": "unspecified",
"source_modality": "unspecified"
},
"erdantic.examples.pydantic.Party-members-erdantic.examples.pydantic.Adventurer": {
"source_model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Party"
},
"source_field_name": "members",
"target_model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Adventurer"
},
"target_cardinality": "many",
"target_modality": "unspecified",
"source_cardinality": "unspecified",
"source_modality": "unspecified"
},
"erdantic.examples.pydantic.Quest-giver-erdantic.examples.pydantic.QuestGiver": {
"source_model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Quest"
},
"source_field_name": "giver",
"target_model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "QuestGiver"
},
"target_cardinality": "one",
"target_modality": "one",
"source_cardinality": "unspecified",
"source_modality": "unspecified"
}
}
}

Sorry, the diff of this file is not supported yet

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 12.2.1 (0)
-->
<!-- Title: Entity Relationship Diagram created by erdantic Pages: 1 -->
<svg width="685pt" height="314pt"
viewBox="0.00 0.00 685.25 313.75" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 309.75)">
<title>Entity Relationship Diagram created by erdantic</title>
<polygon fill="white" stroke="none" points="-4,4 -4,-309.75 681.25,-309.75 681.25,4 -4,4"/>
<text text-anchor="middle" x="338.62" y="-5.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="9.00" fill="#a8a8a8">Created by erdantic vTEST &lt;https://github.com/drivendataorg/erdantic&gt;</text>
<!-- erdantic.examples.pydantic.Adventurer -->
<g id="node1" class="node">
<title>erdantic.examples.pydantic.Adventurer</title>
<g id="a_node1"><a xlink:title="erdantic.examples.pydantic.Adventurer&#10;&#10;A person often late for dinner but with a tale or two to tell.&#10;&#10;Attributes:&#10; &#160;&#160;&#160;name (str): Name of this adventurer&#10; &#160;&#160;&#160;profession (str): Profession of this adventurer&#10; &#160;&#160;&#160;alignment (Alignment): Alignment of this adventurer&#10; &#160;&#160;&#160;level (int): Level of this adventurer&#10;">
<polygon fill="none" stroke="black" points="309.38,-279.25 309.38,-301.75 436.12,-301.75 436.12,-279.25 309.38,-279.25"/>
<text text-anchor="start" x="339" y="-286.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-weight="bold" font-size="14.00">Adventurer</text>
<polygon fill="none" stroke="black" points="309.38,-256.75 309.38,-279.25 371.62,-279.25 371.62,-256.75 309.38,-256.75"/>
<text text-anchor="start" x="325.5" y="-262.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">name</text>
<polygon fill="none" stroke="black" points="371.62,-256.75 371.62,-279.25 436.12,-279.25 436.12,-256.75 371.62,-256.75"/>
<text text-anchor="start" x="397.12" y="-262.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
<polygon fill="none" stroke="black" points="309.38,-234.25 309.38,-256.75 371.62,-256.75 371.62,-234.25 309.38,-234.25"/>
<text text-anchor="start" x="312.38" y="-240.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">profession</text>
<polygon fill="none" stroke="black" points="371.62,-234.25 371.62,-256.75 436.12,-256.75 436.12,-234.25 371.62,-234.25"/>
<text text-anchor="start" x="397.12" y="-240.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
<polygon fill="none" stroke="black" points="309.38,-211.75 309.38,-234.25 371.62,-234.25 371.62,-211.75 309.38,-211.75"/>
<text text-anchor="start" x="313.12" y="-217.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">alignment</text>
<polygon fill="none" stroke="black" points="371.62,-211.75 371.62,-234.25 436.12,-234.25 436.12,-211.75 371.62,-211.75"/>
<text text-anchor="start" x="374.62" y="-217.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">Alignment</text>
<polygon fill="none" stroke="black" points="309.38,-189.25 309.38,-211.75 371.62,-211.75 371.62,-189.25 309.38,-189.25"/>
<text text-anchor="start" x="327.38" y="-195.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">level</text>
<polygon fill="none" stroke="black" points="371.62,-189.25 371.62,-211.75 436.12,-211.75 436.12,-189.25 371.62,-189.25"/>
<text text-anchor="start" x="396.75" y="-195.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">int</text>
</a>
</g>
</g>
<!-- erdantic.examples.pydantic.Party -->
<g id="node2" class="node">
<title>erdantic.examples.pydantic.Party</title>
<g id="a_node2"><a xlink:title="erdantic.examples.pydantic.Party&#10;&#10;A group of adventurers finding themselves doing and saying things altogether unexpected.&#10;&#10;Attributes:&#10; &#160;&#160;&#160;name (str): Name that party is known by&#10; &#160;&#160;&#160;formed_datetime (datetime): Timestamp of when the party was formed&#10; &#160;&#160;&#160;members (list[Adventurer]): Adventurers that belong to this party&#10; &#160;&#160;&#160;active_quest (Optional[Quest]): Current quest that party is actively tackling&#10;">
<polygon fill="none" stroke="black" points="0,-283.25 0,-305.75 193.5,-305.75 193.5,-283.25 0,-283.25"/>
<text text-anchor="start" x="80.62" y="-290.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-weight="bold" font-size="14.00">Party</text>
<polygon fill="none" stroke="black" points="0,-260.75 0,-283.25 99.75,-283.25 99.75,-260.75 0,-260.75"/>
<text text-anchor="start" x="34.88" y="-266.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">name</text>
<polygon fill="none" stroke="black" points="99.75,-260.75 99.75,-283.25 193.5,-283.25 193.5,-260.75 99.75,-260.75"/>
<text text-anchor="start" x="139.88" y="-266.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
<polygon fill="none" stroke="black" points="0,-238.25 0,-260.75 99.75,-260.75 99.75,-238.25 0,-238.25"/>
<text text-anchor="start" x="3" y="-244.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">formed_datetime</text>
<polygon fill="none" stroke="black" points="99.75,-238.25 99.75,-260.75 193.5,-260.75 193.5,-238.25 99.75,-238.25"/>
<text text-anchor="start" x="123" y="-244.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">datetime</text>
<polygon fill="none" stroke="black" points="0,-215.75 0,-238.25 99.75,-238.25 99.75,-215.75 0,-215.75"/>
<text text-anchor="start" x="24.38" y="-221.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">members</text>
<polygon fill="none" stroke="black" points="99.75,-215.75 99.75,-238.25 193.5,-238.25 193.5,-215.75 99.75,-215.75"/>
<text text-anchor="start" x="103.12" y="-221.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">list[Adventurer]</text>
<polygon fill="none" stroke="black" points="0,-193.25 0,-215.75 99.75,-215.75 99.75,-193.25 0,-193.25"/>
<text text-anchor="start" x="16.12" y="-199.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">active_quest</text>
<polygon fill="none" stroke="black" points="99.75,-193.25 99.75,-215.75 193.5,-215.75 193.5,-193.25 99.75,-193.25"/>
<text text-anchor="start" x="102.75" y="-199.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">Optional[Quest]</text>
</a>
</g>
</g>
<!-- erdantic.examples.pydantic.Party&#45;&gt;erdantic.examples.pydantic.Adventurer -->
<g id="edge1" class="edge">
<title>erdantic.examples.pydantic.Party:e&#45;&gt;erdantic.examples.pydantic.Adventurer:w</title>
<path fill="none" stroke="black" d="M203.46,-227.67C246.93,-233.77 252.74,-279.62 293.21,-288.88"/>
<polyline fill="none" stroke="black" points="193.5,-227 198.49,-227.34"/>
<polyline fill="none" stroke="black" points="198.49,-227.34 203.48,-227.67"/>
<polygon fill="black" stroke="black" points="298.1,-289.4 307.56,-294.94 303.4,-289.97 307.71,-290.43 307.71,-290.43 307.71,-290.43 303.4,-289.97 308.52,-285.99 298.1,-289.4"/>
<polyline fill="none" stroke="black" points="296.89,-289.27 291.92,-288.74"/>
</g>
<!-- erdantic.examples.pydantic.Quest -->
<g id="node3" class="node">
<title>erdantic.examples.pydantic.Quest</title>
<g id="a_node3"><a xlink:title="erdantic.examples.pydantic.Quest&#10;&#10;A task to complete, with some monetary reward.&#10;&#10;Attributes:&#10; &#160;&#160;&#160;name (str): Name by which this quest is referred to&#10; &#160;&#160;&#160;giver (QuestGiver): Person who offered the quest&#10; &#160;&#160;&#160;reward_gold (int): Amount of gold to be rewarded for quest completion&#10;">
<polygon fill="none" stroke="black" points="301.5,-131 301.5,-153.5 444,-153.5 444,-131 301.5,-131"/>
<text text-anchor="start" x="355.5" y="-138.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-weight="bold" font-size="14.00">Quest</text>
<polygon fill="none" stroke="black" points="301.5,-108.5 301.5,-131 375.75,-131 375.75,-108.5 301.5,-108.5"/>
<text text-anchor="start" x="323.62" y="-114.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">name</text>
<polygon fill="none" stroke="black" points="375.75,-108.5 375.75,-131 444,-131 444,-108.5 375.75,-108.5"/>
<text text-anchor="start" x="403.12" y="-114.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
<polygon fill="none" stroke="black" points="301.5,-86 301.5,-108.5 375.75,-108.5 375.75,-86 301.5,-86"/>
<text text-anchor="start" x="324.75" y="-92.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">giver</text>
<polygon fill="none" stroke="black" points="375.75,-86 375.75,-108.5 444,-108.5 444,-86 375.75,-86"/>
<text text-anchor="start" x="378.75" y="-92.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">QuestGiver</text>
<polygon fill="none" stroke="black" points="301.5,-63.5 301.5,-86 375.75,-86 375.75,-63.5 301.5,-63.5"/>
<text text-anchor="start" x="304.5" y="-69.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">reward_gold</text>
<polygon fill="none" stroke="black" points="375.75,-63.5 375.75,-86 444,-86 444,-63.5 375.75,-63.5"/>
<text text-anchor="start" x="402.75" y="-69.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">int</text>
</a>
</g>
</g>
<!-- erdantic.examples.pydantic.Party&#45;&gt;erdantic.examples.pydantic.Quest -->
<g id="edge2" class="edge">
<title>erdantic.examples.pydantic.Party:e&#45;&gt;erdantic.examples.pydantic.Quest:w</title>
<path fill="none" stroke="black" d="M203.23,-203.8C242.55,-197.9 248.51,-156.32 282.82,-145.06"/>
<polyline fill="none" stroke="black" points="193.5,-204.5 198.49,-204.14"/>
<polyline fill="none" stroke="black" points="198.49,-204.14 203.47,-203.78"/>
<polyline fill="none" stroke="black" points="301.5,-142.25 296.56,-142.99"/>
<polygon fill="black" stroke="black" points="294.82,-138.2 296.31,-148.09 294.33,-148.38 292.85,-138.49 294.82,-138.2"/>
<polyline fill="none" stroke="black" points="296.56,-142.99 291.61,-143.74"/>
<ellipse fill="none" stroke="black" cx="287.16" cy="-144.4" rx="4" ry="4"/>
</g>
<!-- erdantic.examples.pydantic.QuestGiver -->
<g id="node4" class="node">
<title>erdantic.examples.pydantic.QuestGiver</title>
<g id="a_node4"><a xlink:title="erdantic.examples.pydantic.QuestGiver&#10;&#10;A person who offers a task that needs completing.&#10;&#10;Attributes:&#10; &#160;&#160;&#160;name (str): Name of this quest giver&#10; &#160;&#160;&#160;faction (str): Faction that this quest giver belongs to&#10; &#160;&#160;&#160;location (str): Location this quest giver can be found&#10;">
<polygon fill="none" stroke="black" points="552,-86 552,-108.5 677.25,-108.5 677.25,-86 552,-86"/>
<text text-anchor="start" x="580.5" y="-93.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-weight="bold" font-size="14.00">QuestGiver</text>
<polygon fill="none" stroke="black" points="552,-63.5 552,-86 601.5,-86 601.5,-63.5 552,-63.5"/>
<text text-anchor="start" x="561.75" y="-69.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">name</text>
<polygon fill="none" stroke="black" points="601.5,-63.5 601.5,-86 677.25,-86 677.25,-63.5 601.5,-63.5"/>
<text text-anchor="start" x="632.62" y="-69.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
<polygon fill="none" stroke="black" points="552,-41 552,-63.5 601.5,-63.5 601.5,-41 552,-41"/>
<text text-anchor="start" x="558" y="-47.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">faction</text>
<polygon fill="none" stroke="black" points="601.5,-41 601.5,-63.5 677.25,-63.5 677.25,-41 601.5,-41"/>
<text text-anchor="start" x="604.5" y="-47.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">Optional[str]</text>
<polygon fill="none" stroke="black" points="552,-18.5 552,-41 601.5,-41 601.5,-18.5 552,-18.5"/>
<text text-anchor="start" x="555" y="-24.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">location</text>
<polygon fill="none" stroke="black" points="601.5,-18.5 601.5,-41 677.25,-41 677.25,-18.5 601.5,-18.5"/>
<text text-anchor="start" x="632.62" y="-24.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
</a>
</g>
</g>
<!-- erdantic.examples.pydantic.Quest&#45;&gt;erdantic.examples.pydantic.QuestGiver -->
<g id="edge3" class="edge">
<title>erdantic.examples.pydantic.Quest:e&#45;&gt;erdantic.examples.pydantic.QuestGiver:w</title>
<path fill="none" stroke="black" d="M453.87,-97.25C489.07,-97.25 503.8,-97.25 537.08,-97.25"/>
<polyline fill="none" stroke="black" points="444,-97.25 449,-97.25"/>
<polyline fill="none" stroke="black" points="449,-97.25 454,-97.25"/>
<polyline fill="none" stroke="black" points="552,-97.25 547,-97.25"/>
<polygon fill="black" stroke="black" points="546,-92.25 546,-102.25 544,-102.25 544,-92.25 546,-92.25"/>
<polyline fill="none" stroke="black" points="547,-97.25 542,-97.25"/>
<polygon fill="black" stroke="black" points="541,-92.25 541,-102.25 539,-102.25 539,-92.25 541,-92.25"/>
<polyline fill="none" stroke="black" points="542,-97.25 537,-97.25"/>
</g>
</g>
</svg>

Sorry, the diff of this file is not supported yet

{
"models": {
"erdantic.examples.pydantic.Adventurer": {
"full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Adventurer"
},
"name": "Adventurer",
"fields": {
"name": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Adventurer"
},
"name": "name",
"type_name": "str",
"default_value": ""
},
"profession": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Adventurer"
},
"name": "profession",
"type_name": "str",
"default_value": ""
},
"alignment": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Adventurer"
},
"name": "alignment",
"type_name": "Alignment",
"default_value": ""
},
"level": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Adventurer"
},
"name": "level",
"type_name": "int",
"default_value": "1"
}
},
"description": "erdantic.examples.pydantic.Adventurer\n\nA person often late for dinner but with a tale or two to tell.\n\nAttributes:\n name (str): Name of this adventurer\n profession (str): Profession of this adventurer\n alignment (Alignment): Alignment of this adventurer\n level (int): Level of this adventurer\n"
},
"erdantic.examples.pydantic.Party": {
"full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Party"
},
"name": "Party",
"fields": {
"name": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Party"
},
"name": "name",
"type_name": "str",
"default_value": ""
},
"formed_datetime": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Party"
},
"name": "formed_datetime",
"type_name": "datetime",
"default_value": ""
},
"members": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Party"
},
"name": "members",
"type_name": "list[Adventurer]",
"default_value": "[]"
},
"active_quest": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Party"
},
"name": "active_quest",
"type_name": "Optional[Quest]",
"default_value": "None"
}
},
"description": "erdantic.examples.pydantic.Party\n\nA group of adventurers finding themselves doing and saying things altogether unexpected.\n\nAttributes:\n name (str): Name that party is known by\n formed_datetime (datetime): Timestamp of when the party was formed\n members (list[Adventurer]): Adventurers that belong to this party\n active_quest (Optional[Quest]): Current quest that party is actively tackling\n"
},
"erdantic.examples.pydantic.Quest": {
"full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Quest"
},
"name": "Quest",
"fields": {
"name": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Quest"
},
"name": "name",
"type_name": "str",
"default_value": ""
},
"giver": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Quest"
},
"name": "giver",
"type_name": "QuestGiver",
"default_value": ""
},
"reward_gold": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Quest"
},
"name": "reward_gold",
"type_name": "int",
"default_value": "100"
}
},
"description": "erdantic.examples.pydantic.Quest\n\nA task to complete, with some monetary reward.\n\nAttributes:\n name (str): Name by which this quest is referred to\n giver (QuestGiver): Person who offered the quest\n reward_gold (int): Amount of gold to be rewarded for quest completion\n"
},
"erdantic.examples.pydantic.QuestGiver": {
"full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "QuestGiver"
},
"name": "QuestGiver",
"fields": {
"name": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "QuestGiver"
},
"name": "name",
"type_name": "str",
"default_value": ""
},
"faction": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "QuestGiver"
},
"name": "faction",
"type_name": "Optional[str]",
"default_value": "None"
},
"location": {
"model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "QuestGiver"
},
"name": "location",
"type_name": "str",
"default_value": "\"Adventurer's Guild\""
}
},
"description": "erdantic.examples.pydantic.QuestGiver\n\nA person who offers a task that needs completing.\n\nAttributes:\n name (str): Name of this quest giver\n faction (str): Faction that this quest giver belongs to\n location (str): Location this quest giver can be found\n"
}
},
"edges": {
"erdantic.examples.pydantic.Party-active_quest-erdantic.examples.pydantic.Quest": {
"source_model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Party"
},
"source_field_name": "active_quest",
"target_model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Quest"
},
"target_cardinality": "one",
"target_modality": "zero",
"source_cardinality": "unspecified",
"source_modality": "unspecified"
},
"erdantic.examples.pydantic.Party-members-erdantic.examples.pydantic.Adventurer": {
"source_model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Party"
},
"source_field_name": "members",
"target_model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Adventurer"
},
"target_cardinality": "many",
"target_modality": "unspecified",
"source_cardinality": "unspecified",
"source_modality": "unspecified"
},
"erdantic.examples.pydantic.Quest-giver-erdantic.examples.pydantic.QuestGiver": {
"source_model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "Quest"
},
"source_field_name": "giver",
"target_model_full_name": {
"module": "erdantic.examples.pydantic",
"qual_name": "QuestGiver"
},
"target_cardinality": "one",
"target_modality": "one",
"source_cardinality": "unspecified",
"source_modality": "unspecified"
}
}
}

Sorry, the diff of this file is not supported yet

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 12.2.1 (0)
-->
<!-- Title: Entity Relationship Diagram created by erdantic Pages: 1 -->
<svg width="879pt" height="314pt"
viewBox="0.00 0.00 878.75 313.75" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 309.75)">
<title>Entity Relationship Diagram created by erdantic</title>
<polygon fill="white" stroke="none" points="-4,4 -4,-309.75 874.75,-309.75 874.75,4 -4,4"/>
<text text-anchor="middle" x="435.38" y="-5.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="9.00" fill="#a8a8a8">Created by erdantic vTEST &lt;https://github.com/drivendataorg/erdantic&gt;</text>
<!-- erdantic.examples.pydantic.Adventurer -->
<g id="node1" class="node">
<title>erdantic.examples.pydantic.Adventurer</title>
<g id="a_node1"><a xlink:title="erdantic.examples.pydantic.Adventurer&#10;&#10;A person often late for dinner but with a tale or two to tell.&#10;&#10;Attributes:&#10; &#160;&#160;&#160;name (str): Name of this adventurer&#10; &#160;&#160;&#160;profession (str): Profession of this adventurer&#10; &#160;&#160;&#160;alignment (Alignment): Alignment of this adventurer&#10; &#160;&#160;&#160;level (int): Level of this adventurer&#10;">
<polygon fill="none" stroke="black" points="345.38,-279.25 345.38,-301.75 508.12,-301.75 508.12,-279.25 345.38,-279.25"/>
<text text-anchor="start" x="393" y="-286.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-weight="bold" font-size="14.00">Adventurer</text>
<polygon fill="none" stroke="black" points="345.38,-256.75 345.38,-279.25 407.62,-279.25 407.62,-256.75 345.38,-256.75"/>
<text text-anchor="start" x="361.5" y="-262.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">name</text>
<polygon fill="none" stroke="black" points="407.62,-256.75 407.62,-279.25 472.12,-279.25 472.12,-256.75 407.62,-256.75"/>
<text text-anchor="start" x="433.12" y="-262.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
<polygon fill="none" stroke="black" points="472.12,-256.75 472.12,-279.25 508.12,-279.25 508.12,-256.75 472.12,-256.75"/>
<polygon fill="none" stroke="black" points="345.38,-234.25 345.38,-256.75 407.62,-256.75 407.62,-234.25 345.38,-234.25"/>
<text text-anchor="start" x="348.38" y="-240.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">profession</text>
<polygon fill="none" stroke="black" points="407.62,-234.25 407.62,-256.75 472.12,-256.75 472.12,-234.25 407.62,-234.25"/>
<text text-anchor="start" x="433.12" y="-240.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
<polygon fill="none" stroke="black" points="472.12,-234.25 472.12,-256.75 508.12,-256.75 508.12,-234.25 472.12,-234.25"/>
<polygon fill="none" stroke="black" points="345.38,-211.75 345.38,-234.25 407.62,-234.25 407.62,-211.75 345.38,-211.75"/>
<text text-anchor="start" x="349.12" y="-217.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">alignment</text>
<polygon fill="none" stroke="black" points="407.62,-211.75 407.62,-234.25 472.12,-234.25 472.12,-211.75 407.62,-211.75"/>
<text text-anchor="start" x="410.62" y="-217.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">Alignment</text>
<polygon fill="none" stroke="black" points="472.12,-211.75 472.12,-234.25 508.12,-234.25 508.12,-211.75 472.12,-211.75"/>
<polygon fill="none" stroke="black" points="345.38,-189.25 345.38,-211.75 407.62,-211.75 407.62,-189.25 345.38,-189.25"/>
<text text-anchor="start" x="363.38" y="-195.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">level</text>
<polygon fill="none" stroke="black" points="407.62,-189.25 407.62,-211.75 472.12,-211.75 472.12,-189.25 407.62,-189.25"/>
<text text-anchor="start" x="432.75" y="-195.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">int</text>
<polygon fill="none" stroke="black" points="472.12,-189.25 472.12,-211.75 508.12,-211.75 508.12,-189.25 472.12,-189.25"/>
<text text-anchor="start" x="486.75" y="-195.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">1</text>
</a>
</g>
</g>
<!-- erdantic.examples.pydantic.Party -->
<g id="node2" class="node">
<title>erdantic.examples.pydantic.Party</title>
<g id="a_node2"><a xlink:title="erdantic.examples.pydantic.Party&#10;&#10;A group of adventurers finding themselves doing and saying things altogether unexpected.&#10;&#10;Attributes:&#10; &#160;&#160;&#160;name (str): Name that party is known by&#10; &#160;&#160;&#160;formed_datetime (datetime): Timestamp of when the party was formed&#10; &#160;&#160;&#160;members (list[Adventurer]): Adventurers that belong to this party&#10; &#160;&#160;&#160;active_quest (Optional[Quest]): Current quest that party is actively tackling&#10;">
<polygon fill="none" stroke="black" points="0,-283.25 0,-305.75 229.5,-305.75 229.5,-283.25 0,-283.25"/>
<text text-anchor="start" x="98.62" y="-290.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-weight="bold" font-size="14.00">Party</text>
<polygon fill="none" stroke="black" points="0,-260.75 0,-283.25 99.75,-283.25 99.75,-260.75 0,-260.75"/>
<text text-anchor="start" x="34.88" y="-266.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">name</text>
<polygon fill="none" stroke="black" points="99.75,-260.75 99.75,-283.25 193.5,-283.25 193.5,-260.75 99.75,-260.75"/>
<text text-anchor="start" x="139.88" y="-266.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
<polygon fill="none" stroke="black" points="193.5,-260.75 193.5,-283.25 229.5,-283.25 229.5,-260.75 193.5,-260.75"/>
<polygon fill="none" stroke="black" points="0,-238.25 0,-260.75 99.75,-260.75 99.75,-238.25 0,-238.25"/>
<text text-anchor="start" x="3" y="-244.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">formed_datetime</text>
<polygon fill="none" stroke="black" points="99.75,-238.25 99.75,-260.75 193.5,-260.75 193.5,-238.25 99.75,-238.25"/>
<text text-anchor="start" x="123" y="-244.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">datetime</text>
<polygon fill="none" stroke="black" points="193.5,-238.25 193.5,-260.75 229.5,-260.75 229.5,-238.25 193.5,-238.25"/>
<polygon fill="none" stroke="black" points="0,-215.75 0,-238.25 99.75,-238.25 99.75,-215.75 0,-215.75"/>
<text text-anchor="start" x="24.38" y="-221.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">members</text>
<polygon fill="none" stroke="black" points="99.75,-215.75 99.75,-238.25 193.5,-238.25 193.5,-215.75 99.75,-215.75"/>
<text text-anchor="start" x="103.12" y="-221.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">list[Adventurer]</text>
<polygon fill="none" stroke="black" points="193.5,-215.75 193.5,-238.25 229.5,-238.25 229.5,-215.75 193.5,-215.75"/>
<text text-anchor="start" x="207" y="-221.95" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">[]</text>
<polygon fill="none" stroke="black" points="0,-193.25 0,-215.75 99.75,-215.75 99.75,-193.25 0,-193.25"/>
<text text-anchor="start" x="16.12" y="-199.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">active_quest</text>
<polygon fill="none" stroke="black" points="99.75,-193.25 99.75,-215.75 193.5,-215.75 193.5,-193.25 99.75,-193.25"/>
<text text-anchor="start" x="102.75" y="-199.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">Optional[Quest]</text>
<polygon fill="none" stroke="black" points="193.5,-193.25 193.5,-215.75 229.5,-215.75 229.5,-193.25 193.5,-193.25"/>
<text text-anchor="start" x="196.88" y="-199.45" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">None</text>
</a>
</g>
</g>
<!-- erdantic.examples.pydantic.Party&#45;&gt;erdantic.examples.pydantic.Adventurer -->
<g id="edge1" class="edge">
<title>erdantic.examples.pydantic.Party:e&#45;&gt;erdantic.examples.pydantic.Adventurer:w</title>
<path fill="none" stroke="black" d="M239.46,-227.67C282.93,-233.77 288.74,-279.62 329.21,-288.88"/>
<polyline fill="none" stroke="black" points="229.5,-227 234.49,-227.34"/>
<polyline fill="none" stroke="black" points="234.49,-227.34 239.48,-227.67"/>
<polygon fill="black" stroke="black" points="334.1,-289.4 343.56,-294.94 339.4,-289.97 343.71,-290.43 343.71,-290.43 343.71,-290.43 339.4,-289.97 344.52,-285.99 334.1,-289.4"/>
<polyline fill="none" stroke="black" points="332.89,-289.27 327.92,-288.74"/>
</g>
<!-- erdantic.examples.pydantic.Quest -->
<g id="node3" class="node">
<title>erdantic.examples.pydantic.Quest</title>
<g id="a_node3"><a xlink:title="erdantic.examples.pydantic.Quest&#10;&#10;A task to complete, with some monetary reward.&#10;&#10;Attributes:&#10; &#160;&#160;&#160;name (str): Name by which this quest is referred to&#10; &#160;&#160;&#160;giver (QuestGiver): Person who offered the quest&#10; &#160;&#160;&#160;reward_gold (int): Amount of gold to be rewarded for quest completion&#10;">
<polygon fill="none" stroke="black" points="337.5,-131 337.5,-153.5 516,-153.5 516,-131 337.5,-131"/>
<text text-anchor="start" x="409.5" y="-138.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-weight="bold" font-size="14.00">Quest</text>
<polygon fill="none" stroke="black" points="337.5,-108.5 337.5,-131 411.75,-131 411.75,-108.5 337.5,-108.5"/>
<text text-anchor="start" x="359.62" y="-114.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">name</text>
<polygon fill="none" stroke="black" points="411.75,-108.5 411.75,-131 480,-131 480,-108.5 411.75,-108.5"/>
<text text-anchor="start" x="439.12" y="-114.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
<polygon fill="none" stroke="black" points="480,-108.5 480,-131 516,-131 516,-108.5 480,-108.5"/>
<polygon fill="none" stroke="black" points="337.5,-86 337.5,-108.5 411.75,-108.5 411.75,-86 337.5,-86"/>
<text text-anchor="start" x="360.75" y="-92.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">giver</text>
<polygon fill="none" stroke="black" points="411.75,-86 411.75,-108.5 480,-108.5 480,-86 411.75,-86"/>
<text text-anchor="start" x="414.75" y="-92.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">QuestGiver</text>
<polygon fill="none" stroke="black" points="480,-86 480,-108.5 516,-108.5 516,-86 480,-86"/>
<polygon fill="none" stroke="black" points="337.5,-63.5 337.5,-86 411.75,-86 411.75,-63.5 337.5,-63.5"/>
<text text-anchor="start" x="340.5" y="-69.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">reward_gold</text>
<polygon fill="none" stroke="black" points="411.75,-63.5 411.75,-86 480,-86 480,-63.5 411.75,-63.5"/>
<text text-anchor="start" x="438.75" y="-69.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">int</text>
<polygon fill="none" stroke="black" points="480,-63.5 480,-86 516,-86 516,-63.5 480,-63.5"/>
<text text-anchor="start" x="487.88" y="-69.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">100</text>
</a>
</g>
</g>
<!-- erdantic.examples.pydantic.Party&#45;&gt;erdantic.examples.pydantic.Quest -->
<g id="edge2" class="edge">
<title>erdantic.examples.pydantic.Party:e&#45;&gt;erdantic.examples.pydantic.Quest:w</title>
<path fill="none" stroke="black" d="M239.23,-203.8C278.55,-197.9 284.51,-156.32 318.82,-145.06"/>
<polyline fill="none" stroke="black" points="229.5,-204.5 234.49,-204.14"/>
<polyline fill="none" stroke="black" points="234.49,-204.14 239.47,-203.78"/>
<polyline fill="none" stroke="black" points="337.5,-142.25 332.56,-142.99"/>
<polygon fill="black" stroke="black" points="330.82,-138.2 332.31,-148.09 330.33,-148.38 328.85,-138.49 330.82,-138.2"/>
<polyline fill="none" stroke="black" points="332.56,-142.99 327.61,-143.74"/>
<ellipse fill="none" stroke="black" cx="323.16" cy="-144.4" rx="4" ry="4"/>
</g>
<!-- erdantic.examples.pydantic.QuestGiver -->
<g id="node4" class="node">
<title>erdantic.examples.pydantic.QuestGiver</title>
<g id="a_node4"><a xlink:title="erdantic.examples.pydantic.QuestGiver&#10;&#10;A person who offers a task that needs completing.&#10;&#10;Attributes:&#10; &#160;&#160;&#160;name (str): Name of this quest giver&#10; &#160;&#160;&#160;faction (str): Faction that this quest giver belongs to&#10; &#160;&#160;&#160;location (str): Location this quest giver can be found&#10;">
<polygon fill="none" stroke="black" points="624,-86 624,-108.5 870.75,-108.5 870.75,-86 624,-86"/>
<text text-anchor="start" x="713.25" y="-93.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-weight="bold" font-size="14.00">QuestGiver</text>
<polygon fill="none" stroke="black" points="624,-63.5 624,-86 673.5,-86 673.5,-63.5 624,-63.5"/>
<text text-anchor="start" x="633.75" y="-69.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">name</text>
<polygon fill="none" stroke="black" points="673.5,-63.5 673.5,-86 749.25,-86 749.25,-63.5 673.5,-63.5"/>
<text text-anchor="start" x="704.62" y="-69.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
<polygon fill="none" stroke="black" points="749.25,-63.5 749.25,-86 870.75,-86 870.75,-63.5 749.25,-63.5"/>
<polygon fill="none" stroke="black" points="624,-41 624,-63.5 673.5,-63.5 673.5,-41 624,-41"/>
<text text-anchor="start" x="630" y="-47.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">faction</text>
<polygon fill="none" stroke="black" points="673.5,-41 673.5,-63.5 749.25,-63.5 749.25,-41 673.5,-41"/>
<text text-anchor="start" x="676.5" y="-47.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">Optional[str]</text>
<polygon fill="none" stroke="black" points="749.25,-41 749.25,-63.5 870.75,-63.5 870.75,-41 749.25,-41"/>
<text text-anchor="start" x="795.38" y="-47.2" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">None</text>
<polygon fill="none" stroke="black" points="624,-18.5 624,-41 673.5,-41 673.5,-18.5 624,-18.5"/>
<text text-anchor="start" x="627" y="-24.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">location</text>
<polygon fill="none" stroke="black" points="673.5,-18.5 673.5,-41 749.25,-41 749.25,-18.5 673.5,-18.5"/>
<text text-anchor="start" x="704.62" y="-24.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">str</text>
<polygon fill="none" stroke="black" points="749.25,-18.5 749.25,-41 870.75,-41 870.75,-18.5 749.25,-18.5"/>
<text text-anchor="start" x="752.25" y="-24.7" font-family="Times New Roman,Times,Liberation Serif,serif" font-size="14.00">&quot;Adventurer&#39;s Guild&quot;</text>
</a>
</g>
</g>
<!-- erdantic.examples.pydantic.Quest&#45;&gt;erdantic.examples.pydantic.QuestGiver -->
<g id="edge3" class="edge">
<title>erdantic.examples.pydantic.Quest:e&#45;&gt;erdantic.examples.pydantic.QuestGiver:w</title>
<path fill="none" stroke="black" d="M525.87,-97.25C561.07,-97.25 575.8,-97.25 609.08,-97.25"/>
<polyline fill="none" stroke="black" points="516,-97.25 521,-97.25"/>
<polyline fill="none" stroke="black" points="521,-97.25 526,-97.25"/>
<polyline fill="none" stroke="black" points="624,-97.25 619,-97.25"/>
<polygon fill="black" stroke="black" points="618,-92.25 618,-102.25 616,-102.25 616,-92.25 618,-92.25"/>
<polyline fill="none" stroke="black" points="619,-97.25 614,-97.25"/>
<polygon fill="black" stroke="black" points="613,-92.25 613,-102.25 611,-102.25 611,-92.25 613,-92.25"/>
<polyline fill="none" stroke="black" points="614,-97.25 609,-97.25"/>
</g>
</g>
</svg>

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is too big to display