From cb36d9b604796413e2fe74ab11daf1506111e5ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20Mazzucotelli?= Date: Sat, 15 Jul 2023 18:58:27 +0200 Subject: [PATCH] docs: Add insiders note to readme --- .nojekyll | 0 404.html | 1 - README.md | 4 + assets/_markdown_exec_ansi.css | 266 - assets/_markdown_exec_pyodide.css | 49 - assets/_markdown_exec_pyodide.js | 105 - assets/_mkdocstrings.css | 96 - assets/images/favicon.png | Bin 1870 -> 0 bytes assets/javascripts/bundle.daf26eb8.min.js | 3 - assets/javascripts/lunr/min/lunr.ar.min.js | 1 - assets/javascripts/lunr/min/lunr.da.min.js | 18 - assets/javascripts/lunr/min/lunr.de.min.js | 18 - assets/javascripts/lunr/min/lunr.du.min.js | 18 - assets/javascripts/lunr/min/lunr.es.min.js | 18 - assets/javascripts/lunr/min/lunr.fi.min.js | 18 - assets/javascripts/lunr/min/lunr.fr.min.js | 18 - assets/javascripts/lunr/min/lunr.hi.min.js | 1 - assets/javascripts/lunr/min/lunr.hu.min.js | 18 - assets/javascripts/lunr/min/lunr.hy.min.js | 1 - assets/javascripts/lunr/min/lunr.it.min.js | 18 - assets/javascripts/lunr/min/lunr.ja.min.js | 1 - assets/javascripts/lunr/min/lunr.jp.min.js | 1 - assets/javascripts/lunr/min/lunr.kn.min.js | 1 - assets/javascripts/lunr/min/lunr.ko.min.js | 1 - assets/javascripts/lunr/min/lunr.multi.min.js | 1 - assets/javascripts/lunr/min/lunr.nl.min.js | 18 - assets/javascripts/lunr/min/lunr.no.min.js | 18 - assets/javascripts/lunr/min/lunr.pt.min.js | 18 - assets/javascripts/lunr/min/lunr.ro.min.js | 18 - assets/javascripts/lunr/min/lunr.ru.min.js | 18 - assets/javascripts/lunr/min/lunr.sa.min.js | 1 - .../lunr/min/lunr.stemmer.support.min.js | 1 - assets/javascripts/lunr/min/lunr.sv.min.js | 18 - assets/javascripts/lunr/min/lunr.ta.min.js | 1 - assets/javascripts/lunr/min/lunr.te.min.js | 1 - assets/javascripts/lunr/min/lunr.th.min.js | 1 - assets/javascripts/lunr/min/lunr.tr.min.js | 18 - assets/javascripts/lunr/min/lunr.vi.min.js | 1 - assets/javascripts/lunr/min/lunr.zh.min.js | 1 - assets/javascripts/lunr/tinyseg.js | 206 - assets/javascripts/lunr/wordcut.js | 6708 ----------------- .../workers/search.6c7302c4.min.js | 2 - assets/stylesheets/main.cac7c1ad.min.css | 1 - assets/stylesheets/palette.ecc776e4.min.css | 1 - changelog/index.html | 1 - code_of_conduct/index.html | 1 - contributing/index.html | 16 - coverage/coverage_html.js | 624 -- coverage/covindex.html | 128 - coverage/d_25bfe507819b372b_extension_py.html | 183 - coverage/d_a44f0ac069e85531_conftest_py.html | 102 - .../d_a44f0ac069e85531_test_extension_py.html | 150 - coverage/favicon_32.png | Bin 1732 -> 0 bytes coverage/index.html | 15 - coverage/keybd_closed.png | Bin 9004 -> 0 bytes coverage/keybd_open.png | Bin 9003 -> 0 bytes coverage/status.json | 1 - coverage/style.css | 309 - credits/index.html | 1 - css/insiders.css | 125 - css/material.css | 4 - css/mkdocstrings.css | 26 - .../__pycache__/model_ext.cpython-310.pyc | Bin 1200 -> 0 bytes .../__pycache__/model_ext.cpython-311.pyc | Bin 1692 -> 0 bytes examples/__pycache__/model_ext.cpython-38.pyc | Bin 1190 -> 0 bytes examples/__pycache__/model_ext.cpython-39.pyc | Bin 1184 -> 0 bytes .../__pycache__/model_noext.cpython-311.pyc | Bin 1672 -> 0 bytes examples/model_ext.py | 28 - examples/model_noext.py | 28 - index.html | 60 - insiders/changelog/index.html | 1 - insiders/goals.yml | 7 - insiders/index.html | 1 - insiders/installation/index.html | 42 - js/insiders.js | 67 - license/index.html | 16 - objects.inv | 8 - plugins/social/layouts/default.yml | 221 - plugins/social/layouts/default/accent.yml | 211 - plugins/social/layouts/default/invert.yml | 221 - plugins/social/layouts/default/variant.yml | 232 - reference/SUMMARY.txt | 2 - .../griffe_pydantic/extension/index.html | 14 - reference/griffe_pydantic/index.html | 15 - search/search_index.json | 1 - sitemap.xml | 63 - sitemap.xml.gz | Bin 322 -> 0 bytes 87 files changed, 4 insertions(+), 10647 deletions(-) delete mode 100644 .nojekyll delete mode 100644 404.html create mode 100644 README.md delete mode 100644 assets/_markdown_exec_ansi.css delete mode 100644 assets/_markdown_exec_pyodide.css delete mode 100644 assets/_markdown_exec_pyodide.js delete mode 100644 assets/_mkdocstrings.css delete mode 100644 assets/images/favicon.png delete mode 100644 assets/javascripts/bundle.daf26eb8.min.js delete mode 100644 assets/javascripts/lunr/min/lunr.ar.min.js delete mode 100644 assets/javascripts/lunr/min/lunr.da.min.js delete mode 100644 assets/javascripts/lunr/min/lunr.de.min.js delete mode 100644 assets/javascripts/lunr/min/lunr.du.min.js delete mode 100644 assets/javascripts/lunr/min/lunr.es.min.js delete mode 100644 assets/javascripts/lunr/min/lunr.fi.min.js delete mode 100644 assets/javascripts/lunr/min/lunr.fr.min.js delete mode 100644 assets/javascripts/lunr/min/lunr.hi.min.js delete mode 100644 assets/javascripts/lunr/min/lunr.hu.min.js delete mode 100644 assets/javascripts/lunr/min/lunr.hy.min.js delete mode 100644 assets/javascripts/lunr/min/lunr.it.min.js delete mode 100644 assets/javascripts/lunr/min/lunr.ja.min.js delete mode 100644 assets/javascripts/lunr/min/lunr.jp.min.js delete mode 100644 assets/javascripts/lunr/min/lunr.kn.min.js delete mode 100644 assets/javascripts/lunr/min/lunr.ko.min.js delete mode 100644 assets/javascripts/lunr/min/lunr.multi.min.js delete mode 100644 assets/javascripts/lunr/min/lunr.nl.min.js delete mode 100644 assets/javascripts/lunr/min/lunr.no.min.js delete mode 100644 assets/javascripts/lunr/min/lunr.pt.min.js delete mode 100644 assets/javascripts/lunr/min/lunr.ro.min.js delete mode 100644 assets/javascripts/lunr/min/lunr.ru.min.js delete mode 100644 assets/javascripts/lunr/min/lunr.sa.min.js delete mode 100644 assets/javascripts/lunr/min/lunr.stemmer.support.min.js delete mode 100644 assets/javascripts/lunr/min/lunr.sv.min.js delete mode 100644 assets/javascripts/lunr/min/lunr.ta.min.js delete mode 100644 assets/javascripts/lunr/min/lunr.te.min.js delete mode 100644 assets/javascripts/lunr/min/lunr.th.min.js delete mode 100644 assets/javascripts/lunr/min/lunr.tr.min.js delete mode 100644 assets/javascripts/lunr/min/lunr.vi.min.js delete mode 100644 assets/javascripts/lunr/min/lunr.zh.min.js delete mode 100644 assets/javascripts/lunr/tinyseg.js delete mode 100644 assets/javascripts/lunr/wordcut.js delete mode 100644 assets/javascripts/workers/search.6c7302c4.min.js delete mode 100644 assets/stylesheets/main.cac7c1ad.min.css delete mode 100644 assets/stylesheets/palette.ecc776e4.min.css delete mode 100644 changelog/index.html delete mode 100644 code_of_conduct/index.html delete mode 100644 contributing/index.html delete mode 100644 coverage/coverage_html.js delete mode 100644 coverage/covindex.html delete mode 100644 coverage/d_25bfe507819b372b_extension_py.html delete mode 100644 coverage/d_a44f0ac069e85531_conftest_py.html delete mode 100644 coverage/d_a44f0ac069e85531_test_extension_py.html delete mode 100644 coverage/favicon_32.png delete mode 100644 coverage/index.html delete mode 100644 coverage/keybd_closed.png delete mode 100644 coverage/keybd_open.png delete mode 100644 coverage/status.json delete mode 100644 coverage/style.css delete mode 100644 credits/index.html delete mode 100644 css/insiders.css delete mode 100644 css/material.css delete mode 100644 css/mkdocstrings.css delete mode 100644 examples/__pycache__/model_ext.cpython-310.pyc delete mode 100644 examples/__pycache__/model_ext.cpython-311.pyc delete mode 100644 examples/__pycache__/model_ext.cpython-38.pyc delete mode 100644 examples/__pycache__/model_ext.cpython-39.pyc delete mode 100644 examples/__pycache__/model_noext.cpython-311.pyc delete mode 100644 examples/model_ext.py delete mode 100644 examples/model_noext.py delete mode 100644 index.html delete mode 100644 insiders/changelog/index.html delete mode 100644 insiders/goals.yml delete mode 100644 insiders/index.html delete mode 100644 insiders/installation/index.html delete mode 100644 js/insiders.js delete mode 100644 license/index.html delete mode 100644 objects.inv delete mode 100644 plugins/social/layouts/default.yml delete mode 100644 plugins/social/layouts/default/accent.yml delete mode 100644 plugins/social/layouts/default/invert.yml delete mode 100644 plugins/social/layouts/default/variant.yml delete mode 100644 reference/SUMMARY.txt delete mode 100644 reference/griffe_pydantic/extension/index.html delete mode 100644 reference/griffe_pydantic/index.html delete mode 100644 search/search_index.json delete mode 100644 sitemap.xml delete mode 100644 sitemap.xml.gz diff --git a/.nojekyll b/.nojekyll deleted file mode 100644 index e69de29..0000000 diff --git a/404.html b/404.html deleted file mode 100644 index 4e1882c..0000000 --- a/404.html +++ /dev/null @@ -1 +0,0 @@ - griffe-pydantic

404 - Not found

\ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..39633e5 --- /dev/null +++ b/README.md @@ -0,0 +1,4 @@ +# griffe-pydantic + +This project is currently available to [sponsors](https://github.com/sponsors/pawamoy) only. +See the documentation here: https://pawamoy.github.io/griffe-pydantic. diff --git a/assets/_markdown_exec_ansi.css b/assets/_markdown_exec_ansi.css deleted file mode 100644 index 4c1b8a5..0000000 --- a/assets/_markdown_exec_ansi.css +++ /dev/null @@ -1,266 +0,0 @@ -/* - Inspired by https://spec.draculatheme.com/ specification, they should work - decently with both dark and light themes. - */ -:root { - --ansi-red: #ff5555; - --ansi-green: #50fa7b; - --ansi-blue: #265285; - --ansi-yellow: #ffb86c; - --ansi-magenta: #bd93f9; - --ansi-cyan: #8be9fd; - --ansi-black: #282a36; - --ansi-white: #f8f8f2; -} - -.-Color-Green, -.-Color-Faint-Green, -.-Color-Bold-Green { - color: var(--ansi-green); -} - -.-Color-Red, -.-Color-Faint-Red, -.-Color-Bold-Red { - color: var(--ansi-red); -} - -.-Color-Yellow, -.-Color-Faint-Yellow, -.-Color-Bold-Yellow { - color: var(--ansi-yellow); -} - -.-Color-Blue, -.-Color-Faint-Blue, -.-Color-Bold-Blue { - color: var(--ansi-blue); -} - -.-Color-Magenta, -.-Color-Faint-Magenta, -.-Color-Bold-Magenta { - color: var(--ansi-magenta); -} - -.-Color-Cyan, -.-Color-Faint-Cyan, -.-Color-Bold-Cyan { - color: var(--ansi-cyan); -} - -.-Color-White, -.-Color-Faint-White, -.-Color-Bold-White { - color: var(--ansi-white); -} - -.-Color-Black, -.-Color-Faint-Black, -.-Color-Bold-Black { - color: var(--ansi-black); -} - -.-Color-Faint { - opacity: 0.5; -} - -.-Color-Bold { - font-weight: bold; -} - -.-Color-BGBlack, -.-Color-Black-BGBlack, -.-Color-Blue-BGBlack, -.-Color-Bold-BGBlack, -.-Color-Bold-Black-BGBlack, -.-Color-Bold-Green-BGBlack, -.-Color-Bold-Cyan-BGBlack, -.-Color-Bold-Blue-BGBlack, -.-Color-Bold-Magenta-BGBlack, -.-Color-Bold-Red-BGBlack, -.-Color-Bold-White-BGBlack, -.-Color-Bold-Yellow-BGBlack, -.-Color-Cyan-BGBlack, -.-Color-Green-BGBlack, -.-Color-Magenta-BGBlack, -.-Color-Red-BGBlack, -.-Color-White-BGBlack, -.-Color-Yellow-BGBlack { - background-color: var(--ansi-black); -} - -.-Color-BGRed, -.-Color-Black-BGRed, -.-Color-Blue-BGRed, -.-Color-Bold-BGRed, -.-Color-Bold-Black-BGRed, -.-Color-Bold-Green-BGRed, -.-Color-Bold-Cyan-BGRed, -.-Color-Bold-Blue-BGRed, -.-Color-Bold-Magenta-BGRed, -.-Color-Bold-Red-BGRed, -.-Color-Bold-White-BGRed, -.-Color-Bold-Yellow-BGRed, -.-Color-Cyan-BGRed, -.-Color-Green-BGRed, -.-Color-Magenta-BGRed, -.-Color-Red-BGRed, -.-Color-White-BGRed, -.-Color-Yellow-BGRed { - background-color: var(--ansi-red); -} - -.-Color-BGGreen, -.-Color-Black-BGGreen, -.-Color-Blue-BGGreen, -.-Color-Bold-BGGreen, -.-Color-Bold-Black-BGGreen, -.-Color-Bold-Green-BGGreen, -.-Color-Bold-Cyan-BGGreen, -.-Color-Bold-Blue-BGGreen, -.-Color-Bold-Magenta-BGGreen, -.-Color-Bold-Red-BGGreen, -.-Color-Bold-White-BGGreen, -.-Color-Bold-Yellow-BGGreen, -.-Color-Cyan-BGGreen, -.-Color-Green-BGGreen, -.-Color-Magenta-BGGreen, -.-Color-Red-BGGreen, -.-Color-White-BGGreen, -.-Color-Yellow-BGGreen { - background-color: var(--ansi-green); -} - -.-Color-BGYellow, -.-Color-Black-BGYellow, -.-Color-Blue-BGYellow, -.-Color-Bold-BGYellow, -.-Color-Bold-Black-BGYellow, -.-Color-Bold-Green-BGYellow, -.-Color-Bold-Cyan-BGYellow, -.-Color-Bold-Blue-BGYellow, -.-Color-Bold-Magenta-BGYellow, -.-Color-Bold-Red-BGYellow, -.-Color-Bold-White-BGYellow, -.-Color-Bold-Yellow-BGYellow, -.-Color-Cyan-BGYellow, -.-Color-Green-BGYellow, -.-Color-Magenta-BGYellow, -.-Color-Red-BGYellow, -.-Color-White-BGYellow, -.-Color-Yellow-BGYellow { - background-color: var(--ansi-yellow); -} - -.-Color-BGBlue, -.-Color-Black-BGBlue, -.-Color-Blue-BGBlue, -.-Color-Bold-BGBlue, -.-Color-Bold-Black-BGBlue, -.-Color-Bold-Green-BGBlue, -.-Color-Bold-Cyan-BGBlue, -.-Color-Bold-Blue-BGBlue, -.-Color-Bold-Magenta-BGBlue, -.-Color-Bold-Red-BGBlue, -.-Color-Bold-White-BGBlue, -.-Color-Bold-Yellow-BGBlue, -.-Color-Cyan-BGBlue, -.-Color-Green-BGBlue, -.-Color-Magenta-BGBlue, -.-Color-Red-BGBlue, -.-Color-White-BGBlue, -.-Color-Yellow-BGBlue { - background-color: var(--ansi-blue); -} - -.-Color-BGMagenta, -.-Color-Black-BGMagenta, -.-Color-Blue-BGMagenta, -.-Color-Bold-BGMagenta, -.-Color-Bold-Black-BGMagenta, -.-Color-Bold-Green-BGMagenta, -.-Color-Bold-Cyan-BGMagenta, -.-Color-Bold-Blue-BGMagenta, -.-Color-Bold-Magenta-BGMagenta, -.-Color-Bold-Red-BGMagenta, -.-Color-Bold-White-BGMagenta, -.-Color-Bold-Yellow-BGMagenta, -.-Color-Cyan-BGMagenta, -.-Color-Green-BGMagenta, -.-Color-Magenta-BGMagenta, -.-Color-Red-BGMagenta, -.-Color-White-BGMagenta, -.-Color-Yellow-BGMagenta { - background-color: var(--ansi-magenta); -} - -.-Color-BGCyan, -.-Color-Black-BGCyan, -.-Color-Blue-BGCyan, -.-Color-Bold-BGCyan, -.-Color-Bold-Black-BGCyan, -.-Color-Bold-Green-BGCyan, -.-Color-Bold-Cyan-BGCyan, -.-Color-Bold-Blue-BGCyan, -.-Color-Bold-Magenta-BGCyan, -.-Color-Bold-Red-BGCyan, -.-Color-Bold-White-BGCyan, -.-Color-Bold-Yellow-BGCyan, -.-Color-Cyan-BGCyan, -.-Color-Green-BGCyan, -.-Color-Magenta-BGCyan, -.-Color-Red-BGCyan, -.-Color-White-BGCyan, -.-Color-Yellow-BGCyan { - background-color: var(--ansi-cyan); -} - -.-Color-BGWhite, -.-Color-Black-BGWhite, -.-Color-Blue-BGWhite, -.-Color-Bold-BGWhite, -.-Color-Bold-Black-BGWhite, -.-Color-Bold-Green-BGWhite, -.-Color-Bold-Cyan-BGWhite, -.-Color-Bold-Blue-BGWhite, -.-Color-Bold-Magenta-BGWhite, -.-Color-Bold-Red-BGWhite, -.-Color-Bold-White-BGWhite, -.-Color-Bold-Yellow-BGWhite, -.-Color-Cyan-BGWhite, -.-Color-Green-BGWhite, -.-Color-Magenta-BGWhite, -.-Color-Red-BGWhite, -.-Color-White-BGWhite, -.-Color-Yellow-BGWhite { - background-color: var(--ansi-white); -} - -.-Color-Black, -.-Color-Bold-Black, -.-Color-Black-BGBlack, -.-Color-Bold-Black-BGBlack, -.-Color-Black-BGGreen, -.-Color-Red-BGRed, -.-Color-Bold-Red-BGRed, -.-Color-Bold-Blue-BGBlue, -.-Color-Blue-BGBlue { - text-shadow: 0 0 1px var(--ansi-white); -} - -.-Color-Bold-Cyan-BGCyan, -.-Color-Bold-Magenta-BGMagenta, -.-Color-Bold-White, -.-Color-Bold-Yellow-BGYellow, -.-Color-Bold-Green-BGGreen, -.-Color-Cyan-BGCyan, -.-Color-Cyan-BGGreen, -.-Color-Green-BGCyan, -.-Color-Green-BGGreen, -.-Color-Magenta-BGMagenta, -.-Color-White, -.-Color-White-BGWhite, -.-Color-Yellow-BGYellow { - text-shadow: 0 0 1px var(--ansi-black); -} \ No newline at end of file diff --git a/assets/_markdown_exec_pyodide.css b/assets/_markdown_exec_pyodide.css deleted file mode 100644 index 3f53b54..0000000 --- a/assets/_markdown_exec_pyodide.css +++ /dev/null @@ -1,49 +0,0 @@ -html[data-theme="light"] { - @import "https://cdn.jsdelivr.net/npm/highlightjs-themes@1.0.0/tomorrow.css" -} - -html[data-theme="dark"] { - @import "https://cdn.jsdelivr.net/npm/highlightjs-themes@1.0.0/tomorrow-night-blue.min.css" -} - - -.ace_gutter { - z-index: 1; -} - -.pyodide-editor { - width: 100%; - min-height: 200px; - max-height: 400px; - font-size: .85em; -} - -.pyodide-editor-bar { - color: var(--md-primary-bg-color); - background-color: var(--md-primary-fg-color); - width: 100%; - font: monospace; - font-size: 0.75em; - padding: 2px 0 2px; -} - -.pyodide-bar-item { - padding: 0 18px 0; - display: inline-block; - width: 50%; -} - -.pyodide pre { - margin: 0; -} - -.pyodide-output { - width: 100%; - margin-bottom: -15px; - max-height: 400px -} - -.pyodide-clickable { - cursor: pointer; - text-align: right; -} \ No newline at end of file diff --git a/assets/_markdown_exec_pyodide.js b/assets/_markdown_exec_pyodide.js deleted file mode 100644 index 7168f18..0000000 --- a/assets/_markdown_exec_pyodide.js +++ /dev/null @@ -1,105 +0,0 @@ -var _sessions = {}; - -function getSession(name, pyodide) { - if (!(name in _sessions)) { - _sessions[name] = pyodide.globals.get("dict")(); - } - return _sessions[name]; -} - -function writeOutput(element, string) { - element.innerHTML += string + '\n'; -} - -function clearOutput(element) { - element.innerHTML = ''; -} - -async function evaluatePython(pyodide, editor, output, session) { - pyodide.setStdout({ batched: (string) => { writeOutput(output, string); } }); - let result, code = editor.getValue(); - clearOutput(output); - try { - result = await pyodide.runPythonAsync(code, { globals: getSession(session, pyodide) }); - } catch (error) { - writeOutput(output, error); - } - if (result) writeOutput(output, result); - hljs.highlightElement(output); -} - -async function initPyodide() { - let pyodide = await loadPyodide(); - await pyodide.loadPackage("micropip"); - return pyodide; -} - -function getTheme() { - return document.body.getAttribute('data-md-color-scheme'); -} - -function setTheme(editor, currentTheme, light, dark) { - // https://gist.github.com/RyanNutt/cb8d60997d97905f0b2aea6c3b5c8ee0 - if (currentTheme === "default") { - editor.setTheme("ace/theme/" + light); - document.querySelector(`link[title="light"]`).removeAttribute("disabled"); - document.querySelector(`link[title="dark"]`).setAttribute("disabled", "disabled"); - } else if (currentTheme === "slate") { - editor.setTheme("ace/theme/" + dark); - document.querySelector(`link[title="dark"]`).removeAttribute("disabled"); - document.querySelector(`link[title="light"]`).setAttribute("disabled", "disabled"); - } -} - -function updateTheme(editor, light, dark) { - // Create a new MutationObserver instance - const observer = new MutationObserver((mutations) => { - // Loop through the mutations that occurred - mutations.forEach((mutation) => { - // Check if the mutation was a change to the data-md-color-scheme attribute - if (mutation.attributeName === 'data-md-color-scheme') { - // Get the new value of the attribute - const newColorScheme = mutation.target.getAttribute('data-md-color-scheme'); - // Update the editor theme - setTheme(editor, newColorScheme, light, dark); - } - }); - }); - - // Configure the observer to watch for changes to the data-md-color-scheme attribute - observer.observe(document.body, { - attributes: true, - attributeFilter: ['data-md-color-scheme'], - }); -} - -async function setupPyodide(idPrefix, install = null, themeLight = 'tomorrow', themeDark = 'tomorrow_night', session = null) { - const editor = ace.edit(idPrefix + "editor"); - const run = document.getElementById(idPrefix + "run"); - const clear = document.getElementById(idPrefix + "clear"); - const output = document.getElementById(idPrefix + "output"); - - updateTheme(editor, themeLight, themeDark); - - editor.session.setMode("ace/mode/python"); - setTheme(editor, getTheme(), themeLight, themeDark); - - writeOutput(output, "Initializing..."); - let pyodide = await pyodidePromise; - if (install && install.length) { - micropip = pyodide.pyimport("micropip"); - for (const package of install) - await micropip.install(package); - } - clearOutput(output); - run.onclick = () => evaluatePython(pyodide, editor, output, session); - clear.onclick = () => clearOutput(output); - output.parentElement.parentElement.addEventListener("keydown", (event) => { - if (event.ctrlKey && event.key.toLowerCase() === 'enter') { - event.preventDefault(); - run.click(); - } - }); -} - -var pyodidePromise = initPyodide(); diff --git a/assets/_mkdocstrings.css b/assets/_mkdocstrings.css deleted file mode 100644 index ce58265..0000000 --- a/assets/_mkdocstrings.css +++ /dev/null @@ -1,96 +0,0 @@ - -/* Avoid breaking parameter names, etc. in table cells. */ -.doc-contents td code { - word-break: normal !important; -} - -/* No line break before first paragraph of descriptions. */ -.doc-md-description, -.doc-md-description>p:first-child { - display: inline; -} - -/* Max width for docstring sections tables. */ -.doc .md-typeset__table, -.doc .md-typeset__table table { - display: table !important; - width: 100%; -} - -.doc .md-typeset__table tr { - display: table-row; -} - -/* Defaults in Spacy table style. */ -.doc-param-default { - float: right; -} - -/* Symbols in Navigation and ToC. */ -:root, -[data-md-color-scheme="default"] { - --doc-symbol-attribute-fg-color: #953800; - --doc-symbol-function-fg-color: #8250df; - --doc-symbol-class-fg-color: #0550ae; - --doc-symbol-module-fg-color: #5cad0f; - - --doc-symbol-attribute-bg-color: #9538001a; - --doc-symbol-function-bg-color: #8250df1a; - --doc-symbol-class-bg-color: #0550ae1a; - --doc-symbol-module-bg-color: #5cad0f1a; -} - -[data-md-color-scheme="slate"] { - --doc-symbol-attribute-fg-color: #ffa657; - --doc-symbol-function-fg-color: #d2a8ff; - --doc-symbol-class-fg-color: #79c0ff; - --doc-symbol-module-fg-color: #baff79; - - --doc-symbol-attribute-bg-color: #ffa6571a; - --doc-symbol-function-bg-color: #d2a8ff1a; - --doc-symbol-class-bg-color: #79c0ff1a; - --doc-symbol-module-bg-color: #baff791a; -} - -code.doc-symbol { - border-radius: .1rem; - font-size: .85em; - padding: 0 .3em; - font-weight: bold; -} - -code.doc-symbol-attribute { - color: var(--doc-symbol-attribute-fg-color); - background-color: var(--doc-symbol-attribute-bg-color); -} - -code.doc-symbol-attribute::after { - content: "attr"; -} - -code.doc-symbol-function { - color: var(--doc-symbol-function-fg-color); - background-color: var(--doc-symbol-function-bg-color); -} - -code.doc-symbol-function::after { - content: "func"; -} - -code.doc-symbol-class { - color: var(--doc-symbol-class-fg-color); - background-color: var(--doc-symbol-class-bg-color); -} - -code.doc-symbol-class::after { - content: "class"; -} - -code.doc-symbol-module { - color: var(--doc-symbol-module-fg-color); - background-color: var(--doc-symbol-module-bg-color); -} - -code.doc-symbol-module::after { - content: "mod"; -} \ No newline at end of file diff --git a/assets/images/favicon.png b/assets/images/favicon.png deleted file mode 100644 index 1cf13b9f9d978896599290a74f77d5dbe7d1655c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1870 zcmV-U2eJ5xP)Gc)JR9QMau)O=X#!i9;T z37kk-upj^(fsR36MHs_+1RCI)NNu9}lD0S{B^g8PN?Ww(5|~L#Ng*g{WsqleV}|#l zz8@ri&cTzw_h33bHI+12+kK6WN$h#n5cD8OQt`5kw6p~9H3()bUQ8OS4Q4HTQ=1Ol z_JAocz`fLbT2^{`8n~UAo=#AUOf=SOq4pYkt;XbC&f#7lb$*7=$na!mWCQ`dBQsO0 zLFBSPj*N?#u5&pf2t4XjEGH|=pPQ8xh7tpx;US5Cx_Ju;!O`ya-yF`)b%TEt5>eP1ZX~}sjjA%FJF?h7cX8=b!DZl<6%Cv z*G0uvvU+vmnpLZ2paivG-(cd*y3$hCIcsZcYOGh{$&)A6*XX&kXZd3G8m)G$Zz-LV z^GF3VAW^Mdv!)4OM8EgqRiz~*Cji;uzl2uC9^=8I84vNp;ltJ|q-*uQwGp2ma6cY7 z;`%`!9UXO@fr&Ebapfs34OmS9^u6$)bJxrucutf>`dKPKT%%*d3XlFVKunp9 zasduxjrjs>f8V=D|J=XNZp;_Zy^WgQ$9WDjgY=z@stwiEBm9u5*|34&1Na8BMjjgf3+SHcr`5~>oz1Y?SW^=K z^bTyO6>Gar#P_W2gEMwq)ot3; zREHn~U&Dp0l6YT0&k-wLwYjb?5zGK`W6S2v+K>AM(95m2C20L|3m~rN8dprPr@t)5lsk9Hu*W z?pS990s;Ez=+Rj{x7p``4>+c0G5^pYnB1^!TL=(?HLHZ+HicG{~4F1d^5Awl_2!1jICM-!9eoLhbbT^;yHcefyTAaqRcY zmuctDopPT!%k+}x%lZRKnzykr2}}XfG_ne?nRQO~?%hkzo;@RN{P6o`&mMUWBYMTe z6i8ChtjX&gXl`nvrU>jah)2iNM%JdjqoaeaU%yVn!^70x-flljp6Q5tK}5}&X8&&G zX3fpb3E(!rH=zVI_9Gjl45w@{(ITqngWFe7@9{mX;tO25Z_8 zQHEpI+FkTU#4xu>RkN>b3Tnc3UpWzPXWm#o55GKF09j^Mh~)K7{QqbO_~(@CVq! zS<8954|P8mXN2MRs86xZ&Q4EfM@JB94b=(YGuk)s&^jiSF=t3*oNK3`rD{H`yQ?d; ztE=laAUoZx5?RC8*WKOj`%LXEkgDd>&^Q4M^z`%u0rg-It=hLCVsq!Z%^6eB-OvOT zFZ28TN&cRmgU}Elrnk43)!>Z1FCPL2K$7}gwzIc48NX}#!A1BpJP?#v5wkNprhV** z?Cpalt1oH&{r!o3eSKc&ap)iz2BTn_VV`4>9M^b3;(YY}4>#ML6{~(4mH+?%07*qo IM6N<$f(jP3KmY&$ diff --git a/assets/javascripts/bundle.daf26eb8.min.js b/assets/javascripts/bundle.daf26eb8.min.js deleted file mode 100644 index 55745a7..0000000 --- a/assets/javascripts/bundle.daf26eb8.min.js +++ /dev/null @@ -1,3 +0,0 @@ -"use strict";(()=>{var Ni=Object.create;var Cr=Object.defineProperty;var zi=Object.getOwnPropertyDescriptor;var Vi=Object.getOwnPropertyNames,qt=Object.getOwnPropertySymbols,qi=Object.getPrototypeOf,kr=Object.prototype.hasOwnProperty,dn=Object.prototype.propertyIsEnumerable;var mn=(e,t,r)=>t in e?Cr(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,j=(e,t)=>{for(var r in t||(t={}))kr.call(t,r)&&mn(e,r,t[r]);if(qt)for(var r of qt(t))dn.call(t,r)&&mn(e,r,t[r]);return e};var hn=(e,t)=>{var r={};for(var n in e)kr.call(e,n)&&t.indexOf(n)<0&&(r[n]=e[n]);if(e!=null&&qt)for(var n of qt(e))t.indexOf(n)<0&&dn.call(e,n)&&(r[n]=e[n]);return r};var Kt=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Ki=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of Vi(t))!kr.call(e,o)&&o!==r&&Cr(e,o,{get:()=>t[o],enumerable:!(n=zi(t,o))||n.enumerable});return e};var Lt=(e,t,r)=>(r=e!=null?Ni(qi(e)):{},Ki(t||!e||!e.__esModule?Cr(r,"default",{value:e,enumerable:!0}):r,e));var vn=Kt((Rr,bn)=>{(function(e,t){typeof Rr=="object"&&typeof bn!="undefined"?t():typeof define=="function"&&define.amd?define(t):t()})(Rr,function(){"use strict";function e(r){var n=!0,o=!1,i=null,a={text:!0,search:!0,url:!0,tel:!0,email:!0,password:!0,number:!0,date:!0,month:!0,week:!0,time:!0,datetime:!0,"datetime-local":!0};function s(M){return!!(M&&M!==document&&M.nodeName!=="HTML"&&M.nodeName!=="BODY"&&"classList"in M&&"contains"in M.classList)}function p(M){var Ne=M.type,R=M.tagName;return!!(R==="INPUT"&&a[Ne]&&!M.readOnly||R==="TEXTAREA"&&!M.readOnly||M.isContentEditable)}function c(M){M.classList.contains("focus-visible")||(M.classList.add("focus-visible"),M.setAttribute("data-focus-visible-added",""))}function l(M){M.hasAttribute("data-focus-visible-added")&&(M.classList.remove("focus-visible"),M.removeAttribute("data-focus-visible-added"))}function f(M){M.metaKey||M.altKey||M.ctrlKey||(s(r.activeElement)&&c(r.activeElement),n=!0)}function m(M){n=!1}function d(M){s(M.target)&&(n||p(M.target))&&c(M.target)}function h(M){s(M.target)&&(M.target.classList.contains("focus-visible")||M.target.hasAttribute("data-focus-visible-added"))&&(o=!0,window.clearTimeout(i),i=window.setTimeout(function(){o=!1},100),l(M.target))}function v(M){document.visibilityState==="hidden"&&(o&&(n=!0),Y())}function Y(){document.addEventListener("mousemove",K),document.addEventListener("mousedown",K),document.addEventListener("mouseup",K),document.addEventListener("pointermove",K),document.addEventListener("pointerdown",K),document.addEventListener("pointerup",K),document.addEventListener("touchmove",K),document.addEventListener("touchstart",K),document.addEventListener("touchend",K)}function X(){document.removeEventListener("mousemove",K),document.removeEventListener("mousedown",K),document.removeEventListener("mouseup",K),document.removeEventListener("pointermove",K),document.removeEventListener("pointerdown",K),document.removeEventListener("pointerup",K),document.removeEventListener("touchmove",K),document.removeEventListener("touchstart",K),document.removeEventListener("touchend",K)}function K(M){M.target.nodeName&&M.target.nodeName.toLowerCase()==="html"||(n=!1,X())}document.addEventListener("keydown",f,!0),document.addEventListener("mousedown",m,!0),document.addEventListener("pointerdown",m,!0),document.addEventListener("touchstart",m,!0),document.addEventListener("visibilitychange",v,!0),Y(),r.addEventListener("focus",d,!0),r.addEventListener("blur",h,!0),r.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&r.host?r.host.setAttribute("data-js-focus-visible",""):r.nodeType===Node.DOCUMENT_NODE&&(document.documentElement.classList.add("js-focus-visible"),document.documentElement.setAttribute("data-js-focus-visible",""))}if(typeof window!="undefined"&&typeof document!="undefined"){window.applyFocusVisiblePolyfill=e;var t;try{t=new CustomEvent("focus-visible-polyfill-ready")}catch(r){t=document.createEvent("CustomEvent"),t.initCustomEvent("focus-visible-polyfill-ready",!1,!1,{})}window.dispatchEvent(t)}typeof document!="undefined"&&e(document)})});var gn=Kt(Hr=>{(function(e){var t=function(){try{return!!Symbol.iterator}catch(c){return!1}},r=t(),n=function(c){var l={next:function(){var f=c.shift();return{done:f===void 0,value:f}}};return r&&(l[Symbol.iterator]=function(){return l}),l},o=function(c){return encodeURIComponent(c).replace(/%20/g,"+")},i=function(c){return decodeURIComponent(String(c).replace(/\+/g," "))},a=function(){var c=function(f){Object.defineProperty(this,"_entries",{writable:!0,value:{}});var m=typeof f;if(m!=="undefined")if(m==="string")f!==""&&this._fromString(f);else if(f instanceof c){var d=this;f.forEach(function(X,K){d.append(K,X)})}else if(f!==null&&m==="object")if(Object.prototype.toString.call(f)==="[object Array]")for(var h=0;hd[0]?1:0}),c._entries&&(c._entries={});for(var f=0;f1?i(d[1]):"")}})})(typeof global!="undefined"?global:typeof window!="undefined"?window:typeof self!="undefined"?self:Hr);(function(e){var t=function(){try{var o=new e.URL("b","http://a");return o.pathname="c d",o.href==="http://a/c%20d"&&o.searchParams}catch(i){return!1}},r=function(){var o=e.URL,i=function(p,c){typeof p!="string"&&(p=String(p)),c&&typeof c!="string"&&(c=String(c));var l=document,f;if(c&&(e.location===void 0||c!==e.location.href)){c=c.toLowerCase(),l=document.implementation.createHTMLDocument(""),f=l.createElement("base"),f.href=c,l.head.appendChild(f);try{if(f.href.indexOf(c)!==0)throw new Error(f.href)}catch(M){throw new Error("URL unable to set base "+c+" due to "+M)}}var m=l.createElement("a");m.href=p,f&&(l.body.appendChild(m),m.href=m.href);var d=l.createElement("input");if(d.type="url",d.value=p,m.protocol===":"||!/:/.test(m.href)||!d.checkValidity()&&!c)throw new TypeError("Invalid URL");Object.defineProperty(this,"_anchorElement",{value:m});var h=new e.URLSearchParams(this.search),v=!0,Y=!0,X=this;["append","delete","set"].forEach(function(M){var Ne=h[M];h[M]=function(){Ne.apply(h,arguments),v&&(Y=!1,X.search=h.toString(),Y=!0)}}),Object.defineProperty(this,"searchParams",{value:h,enumerable:!0});var K=void 0;Object.defineProperty(this,"_updateSearchParams",{enumerable:!1,configurable:!1,writable:!1,value:function(){this.search!==K&&(K=this.search,Y&&(v=!1,this.searchParams._fromString(this.search),v=!0))}})},a=i.prototype,s=function(p){Object.defineProperty(a,p,{get:function(){return this._anchorElement[p]},set:function(c){this._anchorElement[p]=c},enumerable:!0})};["hash","host","hostname","port","protocol"].forEach(function(p){s(p)}),Object.defineProperty(a,"search",{get:function(){return this._anchorElement.search},set:function(p){this._anchorElement.search=p,this._updateSearchParams()},enumerable:!0}),Object.defineProperties(a,{toString:{get:function(){var p=this;return function(){return p.href}}},href:{get:function(){return this._anchorElement.href.replace(/\?$/,"")},set:function(p){this._anchorElement.href=p,this._updateSearchParams()},enumerable:!0},pathname:{get:function(){return this._anchorElement.pathname.replace(/(^\/?)/,"/")},set:function(p){this._anchorElement.pathname=p},enumerable:!0},origin:{get:function(){var p={"http:":80,"https:":443,"ftp:":21}[this._anchorElement.protocol],c=this._anchorElement.port!=p&&this._anchorElement.port!=="";return this._anchorElement.protocol+"//"+this._anchorElement.hostname+(c?":"+this._anchorElement.port:"")},enumerable:!0},password:{get:function(){return""},set:function(p){},enumerable:!0},username:{get:function(){return""},set:function(p){},enumerable:!0}}),i.createObjectURL=function(p){return o.createObjectURL.apply(o,arguments)},i.revokeObjectURL=function(p){return o.revokeObjectURL.apply(o,arguments)},e.URL=i};if(t()||r(),e.location!==void 0&&!("origin"in e.location)){var n=function(){return e.location.protocol+"//"+e.location.hostname+(e.location.port?":"+e.location.port:"")};try{Object.defineProperty(e.location,"origin",{get:n,enumerable:!0})}catch(o){setInterval(function(){e.location.origin=n()},100)}}})(typeof global!="undefined"?global:typeof window!="undefined"?window:typeof self!="undefined"?self:Hr)});var an=Kt((Ut,on)=>{(function(t,r){typeof Ut=="object"&&typeof on=="object"?on.exports=r():typeof define=="function"&&define.amd?define([],r):typeof Ut=="object"?Ut.ClipboardJS=r():t.ClipboardJS=r()})(Ut,function(){return function(){var e={686:function(n,o,i){"use strict";i.d(o,{default:function(){return Di}});var a=i(279),s=i.n(a),p=i(370),c=i.n(p),l=i(817),f=i.n(l);function m(N){try{return document.execCommand(N)}catch(A){return!1}}var d=function(A){var L=f()(A);return m("cut"),L},h=d;function v(N){var A=document.documentElement.getAttribute("dir")==="rtl",L=document.createElement("textarea");L.style.fontSize="12pt",L.style.border="0",L.style.padding="0",L.style.margin="0",L.style.position="absolute",L.style[A?"right":"left"]="-9999px";var F=window.pageYOffset||document.documentElement.scrollTop;return L.style.top="".concat(F,"px"),L.setAttribute("readonly",""),L.value=N,L}var Y=function(A,L){var F=v(A);L.container.appendChild(F);var W=f()(F);return m("copy"),F.remove(),W},X=function(A){var L=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body},F="";return typeof A=="string"?F=Y(A,L):A instanceof HTMLInputElement&&!["text","search","url","tel","password"].includes(A==null?void 0:A.type)?F=Y(A.value,L):(F=f()(A),m("copy")),F},K=X;function M(N){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?M=function(L){return typeof L}:M=function(L){return L&&typeof Symbol=="function"&&L.constructor===Symbol&&L!==Symbol.prototype?"symbol":typeof L},M(N)}var Ne=function(){var A=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},L=A.action,F=L===void 0?"copy":L,W=A.container,G=A.target,Pe=A.text;if(F!=="copy"&&F!=="cut")throw new Error('Invalid "action" value, use either "copy" or "cut"');if(G!==void 0)if(G&&M(G)==="object"&&G.nodeType===1){if(F==="copy"&&G.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if(F==="cut"&&(G.hasAttribute("readonly")||G.hasAttribute("disabled")))throw new Error(`Invalid "target" attribute. You can't cut text from elements with "readonly" or "disabled" attributes`)}else throw new Error('Invalid "target" value, use a valid Element');if(Pe)return K(Pe,{container:W});if(G)return F==="cut"?h(G):K(G,{container:W})},R=Ne;function B(N){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?B=function(L){return typeof L}:B=function(L){return L&&typeof Symbol=="function"&&L.constructor===Symbol&&L!==Symbol.prototype?"symbol":typeof L},B(N)}function se(N,A){if(!(N instanceof A))throw new TypeError("Cannot call a class as a function")}function me(N,A){for(var L=0;L0&&arguments[0]!==void 0?arguments[0]:{};this.action=typeof W.action=="function"?W.action:this.defaultAction,this.target=typeof W.target=="function"?W.target:this.defaultTarget,this.text=typeof W.text=="function"?W.text:this.defaultText,this.container=B(W.container)==="object"?W.container:document.body}},{key:"listenClick",value:function(W){var G=this;this.listener=c()(W,"click",function(Pe){return G.onClick(Pe)})}},{key:"onClick",value:function(W){var G=W.delegateTarget||W.currentTarget,Pe=this.action(G)||"copy",Vt=R({action:Pe,container:this.container,target:this.target(G),text:this.text(G)});this.emit(Vt?"success":"error",{action:Pe,text:Vt,trigger:G,clearSelection:function(){G&&G.focus(),window.getSelection().removeAllRanges()}})}},{key:"defaultAction",value:function(W){return Ar("action",W)}},{key:"defaultTarget",value:function(W){var G=Ar("target",W);if(G)return document.querySelector(G)}},{key:"defaultText",value:function(W){return Ar("text",W)}},{key:"destroy",value:function(){this.listener.destroy()}}],[{key:"copy",value:function(W){var G=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body};return K(W,G)}},{key:"cut",value:function(W){return h(W)}},{key:"isSupported",value:function(){var W=arguments.length>0&&arguments[0]!==void 0?arguments[0]:["copy","cut"],G=typeof W=="string"?[W]:W,Pe=!!document.queryCommandSupported;return G.forEach(function(Vt){Pe=Pe&&!!document.queryCommandSupported(Vt)}),Pe}}]),L}(s()),Di=Wi},828:function(n){var o=9;if(typeof Element!="undefined"&&!Element.prototype.matches){var i=Element.prototype;i.matches=i.matchesSelector||i.mozMatchesSelector||i.msMatchesSelector||i.oMatchesSelector||i.webkitMatchesSelector}function a(s,p){for(;s&&s.nodeType!==o;){if(typeof s.matches=="function"&&s.matches(p))return s;s=s.parentNode}}n.exports=a},438:function(n,o,i){var a=i(828);function s(l,f,m,d,h){var v=c.apply(this,arguments);return l.addEventListener(m,v,h),{destroy:function(){l.removeEventListener(m,v,h)}}}function p(l,f,m,d,h){return typeof l.addEventListener=="function"?s.apply(null,arguments):typeof m=="function"?s.bind(null,document).apply(null,arguments):(typeof l=="string"&&(l=document.querySelectorAll(l)),Array.prototype.map.call(l,function(v){return s(v,f,m,d,h)}))}function c(l,f,m,d){return function(h){h.delegateTarget=a(h.target,f),h.delegateTarget&&d.call(l,h)}}n.exports=p},879:function(n,o){o.node=function(i){return i!==void 0&&i instanceof HTMLElement&&i.nodeType===1},o.nodeList=function(i){var a=Object.prototype.toString.call(i);return i!==void 0&&(a==="[object NodeList]"||a==="[object HTMLCollection]")&&"length"in i&&(i.length===0||o.node(i[0]))},o.string=function(i){return typeof i=="string"||i instanceof String},o.fn=function(i){var a=Object.prototype.toString.call(i);return a==="[object Function]"}},370:function(n,o,i){var a=i(879),s=i(438);function p(m,d,h){if(!m&&!d&&!h)throw new Error("Missing required arguments");if(!a.string(d))throw new TypeError("Second argument must be a String");if(!a.fn(h))throw new TypeError("Third argument must be a Function");if(a.node(m))return c(m,d,h);if(a.nodeList(m))return l(m,d,h);if(a.string(m))return f(m,d,h);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}function c(m,d,h){return m.addEventListener(d,h),{destroy:function(){m.removeEventListener(d,h)}}}function l(m,d,h){return Array.prototype.forEach.call(m,function(v){v.addEventListener(d,h)}),{destroy:function(){Array.prototype.forEach.call(m,function(v){v.removeEventListener(d,h)})}}}function f(m,d,h){return s(document.body,m,d,h)}n.exports=p},817:function(n){function o(i){var a;if(i.nodeName==="SELECT")i.focus(),a=i.value;else if(i.nodeName==="INPUT"||i.nodeName==="TEXTAREA"){var s=i.hasAttribute("readonly");s||i.setAttribute("readonly",""),i.select(),i.setSelectionRange(0,i.value.length),s||i.removeAttribute("readonly"),a=i.value}else{i.hasAttribute("contenteditable")&&i.focus();var p=window.getSelection(),c=document.createRange();c.selectNodeContents(i),p.removeAllRanges(),p.addRange(c),a=p.toString()}return a}n.exports=o},279:function(n){function o(){}o.prototype={on:function(i,a,s){var p=this.e||(this.e={});return(p[i]||(p[i]=[])).push({fn:a,ctx:s}),this},once:function(i,a,s){var p=this;function c(){p.off(i,c),a.apply(s,arguments)}return c._=a,this.on(i,c,s)},emit:function(i){var a=[].slice.call(arguments,1),s=((this.e||(this.e={}))[i]||[]).slice(),p=0,c=s.length;for(p;p{"use strict";var gs=/["'&<>]/;ci.exports=ys;function ys(e){var t=""+e,r=gs.exec(t);if(!r)return t;var n,o="",i=0,a=0;for(i=r.index;i{function e(n,o){parent.postMessage(n,o||"*")}function t(...n){return n.reduce((o,i)=>o.then(()=>new Promise(a=>{let s=document.createElement("script");s.src=i,s.onload=a,document.body.appendChild(s)})),Promise.resolve())}var r=class extends EventTarget{constructor(n){super(),this.url=n,this.m=i=>{i.source===this.w&&(this.dispatchEvent(new MessageEvent("message",{data:i.data})),this.onmessage&&this.onmessage(i))},this.e=(i,a,s,p,c)=>{if(a===`${this.url}`){let l=new ErrorEvent("error",{message:i,filename:a,lineno:s,colno:p,error:c});this.dispatchEvent(l),this.onerror&&this.onerror(l)}};let o=document.createElement("iframe");o.hidden=!0,document.body.appendChild(this.iframe=o),this.w.document.open(),this.w.document.write(`
\ No newline at end of file diff --git a/code_of_conduct/index.html b/code_of_conduct/index.html deleted file mode 100644 index f171860..0000000 --- a/code_of_conduct/index.html +++ /dev/null @@ -1 +0,0 @@ - Code of Conduct - griffe-pydantic

Contributor Covenant Code of Conduct¤

Our Pledge¤

We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, caste, color, religion, or sexual identity and orientation.

We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community.

Our Standards¤

Examples of behavior that contributes to a positive environment for our community include:

  • Demonstrating empathy and kindness toward other people
  • Being respectful of differing opinions, viewpoints, and experiences
  • Giving and gracefully accepting constructive feedback
  • Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience
  • Focusing on what is best not just for us as individuals, but for the overall community

Examples of unacceptable behavior include:

  • The use of sexualized language or imagery, and sexual attention or advances of any kind
  • Trolling, insulting or derogatory comments, and personal or political attacks
  • Public or private harassment
  • Publishing others' private information, such as a physical or email address, without their explicit permission
  • Other conduct which could reasonably be considered inappropriate in a professional setting

Enforcement Responsibilities¤

Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful.

Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate.

Scope¤

This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event.

Enforcement¤

Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at pawamoy@pm.me. All complaints will be reviewed and investigated promptly and fairly.

All community leaders are obligated to respect the privacy and security of the reporter of any incident.

Enforcement Guidelines¤

Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct:

1. Correction¤

Community Impact: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community.

Consequence: A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested.

2. Warning¤

Community Impact: A violation through a single incident or series of actions.

Consequence: A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban.

3. Temporary Ban¤

Community Impact: A serious violation of community standards, including sustained inappropriate behavior.

Consequence: A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban.

4. Permanent Ban¤

Community Impact: Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals.

Consequence: A permanent ban from any sort of public interaction within the community.

Attribution¤

This Code of Conduct is adapted from the Contributor Covenant, version 2.1, available at https://www.contributor-covenant.org/version/2/1/code_of_conduct.html.

Community Impact Guidelines were inspired by Mozilla's code of conduct enforcement ladder.

For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq. Translations are available at https://www.contributor-covenant.org/translations.

\ No newline at end of file diff --git a/contributing/index.html b/contributing/index.html deleted file mode 100644 index 0ceaf30..0000000 --- a/contributing/index.html +++ /dev/null @@ -1,16 +0,0 @@ - Contributing - griffe-pydantic

Contributing¤

Contributions are welcome, and they are greatly appreciated! Every little bit helps, and credit will always be given.

Environment setup¤

Nothing easier!

Fork and clone the repository, then:

cd griffe-pydantic
-make setup
-

Note

If it fails for some reason, you'll need to install PDM manually.

You can install it with:

python3 -m pip install --user pipx
-pipx install pdm
-

Now you can try running make setup again, or simply pdm install.

You now have the dependencies installed.

Run make help to see all the available actions!

Tasks¤

This project uses duty to run tasks. A Makefile is also provided. The Makefile will try to run certain tasks on multiple Python versions. If for some reason you don't want to run the task on multiple Python versions, you run the task directly with pdm run duty TASK.

The Makefile detects if a virtual environment is activated, so make will work the same with the virtualenv activated or not.

If you work in VSCode, see examples of tasks and run configurations.

Development¤

As usual:

  1. create a new branch: git switch -c feature-or-bugfix-name
  2. edit the code and/or the documentation

Before committing:

  1. run make format to auto-format the code
  2. run make check to check everything (fix any warning)
  3. run make test to run the tests (fix any issue)
  4. if you updated the documentation or the project dependencies:
    1. run make docs
    2. go to http://localhost:8000 and check that everything looks good
  5. follow our commit message convention

If you are unsure about how to fix or ignore a warning, just let the continuous integration fail, and we will help you during review.

Don't bother updating the changelog, we will take care of this.

Commit message convention¤

Commit messages must follow our convention based on the Angular style or the Karma convention:

<type>[(scope)]: Subject
-
-[Body]
-

Subject and body must be valid Markdown. Subject must have proper casing (uppercase for first letter if it makes sense), but no dot at the end, and no punctuation in general.

Scope and body are optional. Type can be:

  • build: About packaging, building wheels, etc.
  • chore: About packaging or repo/files management.
  • ci: About Continuous Integration.
  • deps: Dependencies update.
  • docs: About documentation.
  • feat: New feature.
  • fix: Bug fix.
  • perf: About performance.
  • refactor: Changes that are not features or bug fixes.
  • style: A change in code style/format.
  • tests: About tests.

If you write a body, please add trailers at the end (for example issues and PR references, or co-authors), without relying on GitHub's flavored Markdown:

Body.
-
-Issue #10: https://github.com/namespace/project/issues/10
-Related to PR namespace/other-project#15: https://github.com/namespace/other-project/pull/15
-

These "trailers" must appear at the end of the body, without any blank lines between them. The trailer title can contain any character except colons :. We expect a full URI for each trailer, not just GitHub autolinks (for example, full GitHub URLs for commits and issues, not the hash or the #issue-number).

We do not enforce a line length on commit messages summary and body, but please avoid very long summaries, and very long lines in the body, unless they are part of code blocks that must not be wrapped.

Pull requests guidelines¤

Link to any related issue in the Pull Request message.

During the review, we recommend using fixups:

# SHA is the SHA of the commit you want to fix
-git commit --fixup=SHA
-

Once all the changes are approved, you can squash your commits:

git rebase -i --autosquash main
-

And force-push:

git push -f
-

If this seems all too complicated, you can push or force-push each new commit, and we will squash them ourselves if needed, before merging.

\ No newline at end of file diff --git a/coverage/coverage_html.js b/coverage/coverage_html.js deleted file mode 100644 index 4c32118..0000000 --- a/coverage/coverage_html.js +++ /dev/null @@ -1,624 +0,0 @@ -// Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 -// For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt - -// Coverage.py HTML report browser code. -/*jslint browser: true, sloppy: true, vars: true, plusplus: true, maxerr: 50, indent: 4 */ -/*global coverage: true, document, window, $ */ - -coverage = {}; - -// General helpers -function debounce(callback, wait) { - let timeoutId = null; - return function(...args) { - clearTimeout(timeoutId); - timeoutId = setTimeout(() => { - callback.apply(this, args); - }, wait); - }; -}; - -function checkVisible(element) { - const rect = element.getBoundingClientRect(); - const viewBottom = Math.max(document.documentElement.clientHeight, window.innerHeight); - const viewTop = 30; - return !(rect.bottom < viewTop || rect.top >= viewBottom); -} - -function on_click(sel, fn) { - const elt = document.querySelector(sel); - if (elt) { - elt.addEventListener("click", fn); - } -} - -// Helpers for table sorting -function getCellValue(row, column = 0) { - const cell = row.cells[column] - if (cell.childElementCount == 1) { - const child = cell.firstElementChild - if (child instanceof HTMLTimeElement && child.dateTime) { - return child.dateTime - } else if (child instanceof HTMLDataElement && child.value) { - return child.value - } - } - return cell.innerText || cell.textContent; -} - -function rowComparator(rowA, rowB, column = 0) { - let valueA = getCellValue(rowA, column); - let valueB = getCellValue(rowB, column); - if (!isNaN(valueA) && !isNaN(valueB)) { - return valueA - valueB - } - return valueA.localeCompare(valueB, undefined, {numeric: true}); -} - -function sortColumn(th) { - // Get the current sorting direction of the selected header, - // clear state on other headers and then set the new sorting direction - const currentSortOrder = th.getAttribute("aria-sort"); - [...th.parentElement.cells].forEach(header => header.setAttribute("aria-sort", "none")); - if (currentSortOrder === "none") { - th.setAttribute("aria-sort", th.dataset.defaultSortOrder || "ascending"); - } else { - th.setAttribute("aria-sort", currentSortOrder === "ascending" ? "descending" : "ascending"); - } - - const column = [...th.parentElement.cells].indexOf(th) - - // Sort all rows and afterwards append them in order to move them in the DOM - Array.from(th.closest("table").querySelectorAll("tbody tr")) - .sort((rowA, rowB) => rowComparator(rowA, rowB, column) * (th.getAttribute("aria-sort") === "ascending" ? 1 : -1)) - .forEach(tr => tr.parentElement.appendChild(tr) ); -} - -// Find all the elements with data-shortcut attribute, and use them to assign a shortcut key. -coverage.assign_shortkeys = function () { - document.querySelectorAll("[data-shortcut]").forEach(element => { - document.addEventListener("keypress", event => { - if (event.target.tagName.toLowerCase() === "input") { - return; // ignore keypress from search filter - } - if (event.key === element.dataset.shortcut) { - element.click(); - } - }); - }); -}; - -// Create the events for the filter box. -coverage.wire_up_filter = function () { - // Cache elements. - const table = document.querySelector("table.index"); - const table_body_rows = table.querySelectorAll("tbody tr"); - const no_rows = document.getElementById("no_rows"); - - // Observe filter keyevents. - document.getElementById("filter").addEventListener("input", debounce(event => { - // Keep running total of each metric, first index contains number of shown rows - const totals = new Array(table.rows[0].cells.length).fill(0); - // Accumulate the percentage as fraction - totals[totals.length - 1] = { "numer": 0, "denom": 0 }; - - // Hide / show elements. - table_body_rows.forEach(row => { - if (!row.cells[0].textContent.includes(event.target.value)) { - // hide - row.classList.add("hidden"); - return; - } - - // show - row.classList.remove("hidden"); - totals[0]++; - - for (let column = 1; column < totals.length; column++) { - // Accumulate dynamic totals - cell = row.cells[column] - if (column === totals.length - 1) { - // Last column contains percentage - const [numer, denom] = cell.dataset.ratio.split(" "); - totals[column]["numer"] += parseInt(numer, 10); - totals[column]["denom"] += parseInt(denom, 10); - } else { - totals[column] += parseInt(cell.textContent, 10); - } - } - }); - - // Show placeholder if no rows will be displayed. - if (!totals[0]) { - // Show placeholder, hide table. - no_rows.style.display = "block"; - table.style.display = "none"; - return; - } - - // Hide placeholder, show table. - no_rows.style.display = null; - table.style.display = null; - - const footer = table.tFoot.rows[0]; - // Calculate new dynamic sum values based on visible rows. - for (let column = 1; column < totals.length; column++) { - // Get footer cell element. - const cell = footer.cells[column]; - - // Set value into dynamic footer cell element. - if (column === totals.length - 1) { - // Percentage column uses the numerator and denominator, - // and adapts to the number of decimal places. - const match = /\.([0-9]+)/.exec(cell.textContent); - const places = match ? match[1].length : 0; - const { numer, denom } = totals[column]; - cell.dataset.ratio = `${numer} ${denom}`; - // Check denom to prevent NaN if filtered files contain no statements - cell.textContent = denom - ? `${(numer * 100 / denom).toFixed(places)}%` - : `${(100).toFixed(places)}%`; - } else { - cell.textContent = totals[column]; - } - } - })); - - // Trigger change event on setup, to force filter on page refresh - // (filter value may still be present). - document.getElementById("filter").dispatchEvent(new Event("input")); -}; - -coverage.INDEX_SORT_STORAGE = "COVERAGE_INDEX_SORT_2"; - -// Loaded on index.html -coverage.index_ready = function () { - coverage.assign_shortkeys(); - coverage.wire_up_filter(); - document.querySelectorAll("[data-sortable] th[aria-sort]").forEach( - th => th.addEventListener("click", e => sortColumn(e.target)) - ); - - // Look for a localStorage item containing previous sort settings: - const stored_list = localStorage.getItem(coverage.INDEX_SORT_STORAGE); - - if (stored_list) { - const {column, direction} = JSON.parse(stored_list); - const th = document.querySelector("[data-sortable]").tHead.rows[0].cells[column]; - th.setAttribute("aria-sort", direction === "ascending" ? "descending" : "ascending"); - th.click() - } - - // Watch for page unload events so we can save the final sort settings: - window.addEventListener("unload", function () { - const th = document.querySelector('[data-sortable] th[aria-sort="ascending"], [data-sortable] [aria-sort="descending"]'); - if (!th) { - return; - } - localStorage.setItem(coverage.INDEX_SORT_STORAGE, JSON.stringify({ - column: [...th.parentElement.cells].indexOf(th), - direction: th.getAttribute("aria-sort"), - })); - }); - - on_click(".button_prev_file", coverage.to_prev_file); - on_click(".button_next_file", coverage.to_next_file); - - on_click(".button_show_hide_help", coverage.show_hide_help); -}; - -// -- pyfile stuff -- - -coverage.LINE_FILTERS_STORAGE = "COVERAGE_LINE_FILTERS"; - -coverage.pyfile_ready = function () { - // If we're directed to a particular line number, highlight the line. - var frag = location.hash; - if (frag.length > 2 && frag[1] === "t") { - document.querySelector(frag).closest(".n").classList.add("highlight"); - coverage.set_sel(parseInt(frag.substr(2), 10)); - } else { - coverage.set_sel(0); - } - - on_click(".button_toggle_run", coverage.toggle_lines); - on_click(".button_toggle_mis", coverage.toggle_lines); - on_click(".button_toggle_exc", coverage.toggle_lines); - on_click(".button_toggle_par", coverage.toggle_lines); - - on_click(".button_next_chunk", coverage.to_next_chunk_nicely); - on_click(".button_prev_chunk", coverage.to_prev_chunk_nicely); - on_click(".button_top_of_page", coverage.to_top); - on_click(".button_first_chunk", coverage.to_first_chunk); - - on_click(".button_prev_file", coverage.to_prev_file); - on_click(".button_next_file", coverage.to_next_file); - on_click(".button_to_index", coverage.to_index); - - on_click(".button_show_hide_help", coverage.show_hide_help); - - coverage.filters = undefined; - try { - coverage.filters = localStorage.getItem(coverage.LINE_FILTERS_STORAGE); - } catch(err) {} - - if (coverage.filters) { - coverage.filters = JSON.parse(coverage.filters); - } - else { - coverage.filters = {run: false, exc: true, mis: true, par: true}; - } - - for (cls in coverage.filters) { - coverage.set_line_visibilty(cls, coverage.filters[cls]); - } - - coverage.assign_shortkeys(); - coverage.init_scroll_markers(); - coverage.wire_up_sticky_header(); - - document.querySelectorAll("[id^=ctxs]").forEach( - cbox => cbox.addEventListener("click", coverage.expand_contexts) - ); - - // Rebuild scroll markers when the window height changes. - window.addEventListener("resize", coverage.build_scroll_markers); -}; - -coverage.toggle_lines = function (event) { - const btn = event.target.closest("button"); - const category = btn.value - const show = !btn.classList.contains("show_" + category); - coverage.set_line_visibilty(category, show); - coverage.build_scroll_markers(); - coverage.filters[category] = show; - try { - localStorage.setItem(coverage.LINE_FILTERS_STORAGE, JSON.stringify(coverage.filters)); - } catch(err) {} -}; - -coverage.set_line_visibilty = function (category, should_show) { - const cls = "show_" + category; - const btn = document.querySelector(".button_toggle_" + category); - if (btn) { - if (should_show) { - document.querySelectorAll("#source ." + category).forEach(e => e.classList.add(cls)); - btn.classList.add(cls); - } - else { - document.querySelectorAll("#source ." + category).forEach(e => e.classList.remove(cls)); - btn.classList.remove(cls); - } - } -}; - -// Return the nth line div. -coverage.line_elt = function (n) { - return document.getElementById("t" + n)?.closest("p"); -}; - -// Set the selection. b and e are line numbers. -coverage.set_sel = function (b, e) { - // The first line selected. - coverage.sel_begin = b; - // The next line not selected. - coverage.sel_end = (e === undefined) ? b+1 : e; -}; - -coverage.to_top = function () { - coverage.set_sel(0, 1); - coverage.scroll_window(0); -}; - -coverage.to_first_chunk = function () { - coverage.set_sel(0, 1); - coverage.to_next_chunk(); -}; - -coverage.to_prev_file = function () { - window.location = document.getElementById("prevFileLink").href; -} - -coverage.to_next_file = function () { - window.location = document.getElementById("nextFileLink").href; -} - -coverage.to_index = function () { - location.href = document.getElementById("indexLink").href; -} - -coverage.show_hide_help = function () { - const helpCheck = document.getElementById("help_panel_state") - helpCheck.checked = !helpCheck.checked; -} - -// Return a string indicating what kind of chunk this line belongs to, -// or null if not a chunk. -coverage.chunk_indicator = function (line_elt) { - const classes = line_elt?.className; - if (!classes) { - return null; - } - const match = classes.match(/\bshow_\w+\b/); - if (!match) { - return null; - } - return match[0]; -}; - -coverage.to_next_chunk = function () { - const c = coverage; - - // Find the start of the next colored chunk. - var probe = c.sel_end; - var chunk_indicator, probe_line; - while (true) { - probe_line = c.line_elt(probe); - if (!probe_line) { - return; - } - chunk_indicator = c.chunk_indicator(probe_line); - if (chunk_indicator) { - break; - } - probe++; - } - - // There's a next chunk, `probe` points to it. - var begin = probe; - - // Find the end of this chunk. - var next_indicator = chunk_indicator; - while (next_indicator === chunk_indicator) { - probe++; - probe_line = c.line_elt(probe); - next_indicator = c.chunk_indicator(probe_line); - } - c.set_sel(begin, probe); - c.show_selection(); -}; - -coverage.to_prev_chunk = function () { - const c = coverage; - - // Find the end of the prev colored chunk. - var probe = c.sel_begin-1; - var probe_line = c.line_elt(probe); - if (!probe_line) { - return; - } - var chunk_indicator = c.chunk_indicator(probe_line); - while (probe > 1 && !chunk_indicator) { - probe--; - probe_line = c.line_elt(probe); - if (!probe_line) { - return; - } - chunk_indicator = c.chunk_indicator(probe_line); - } - - // There's a prev chunk, `probe` points to its last line. - var end = probe+1; - - // Find the beginning of this chunk. - var prev_indicator = chunk_indicator; - while (prev_indicator === chunk_indicator) { - probe--; - if (probe <= 0) { - return; - } - probe_line = c.line_elt(probe); - prev_indicator = c.chunk_indicator(probe_line); - } - c.set_sel(probe+1, end); - c.show_selection(); -}; - -// Returns 0, 1, or 2: how many of the two ends of the selection are on -// the screen right now? -coverage.selection_ends_on_screen = function () { - if (coverage.sel_begin === 0) { - return 0; - } - - const begin = coverage.line_elt(coverage.sel_begin); - const end = coverage.line_elt(coverage.sel_end-1); - - return ( - (checkVisible(begin) ? 1 : 0) - + (checkVisible(end) ? 1 : 0) - ); -}; - -coverage.to_next_chunk_nicely = function () { - if (coverage.selection_ends_on_screen() === 0) { - // The selection is entirely off the screen: - // Set the top line on the screen as selection. - - // This will select the top-left of the viewport - // As this is most likely the span with the line number we take the parent - const line = document.elementFromPoint(0, 0).parentElement; - if (line.parentElement !== document.getElementById("source")) { - // The element is not a source line but the header or similar - coverage.select_line_or_chunk(1); - } else { - // We extract the line number from the id - coverage.select_line_or_chunk(parseInt(line.id.substring(1), 10)); - } - } - coverage.to_next_chunk(); -}; - -coverage.to_prev_chunk_nicely = function () { - if (coverage.selection_ends_on_screen() === 0) { - // The selection is entirely off the screen: - // Set the lowest line on the screen as selection. - - // This will select the bottom-left of the viewport - // As this is most likely the span with the line number we take the parent - const line = document.elementFromPoint(document.documentElement.clientHeight-1, 0).parentElement; - if (line.parentElement !== document.getElementById("source")) { - // The element is not a source line but the header or similar - coverage.select_line_or_chunk(coverage.lines_len); - } else { - // We extract the line number from the id - coverage.select_line_or_chunk(parseInt(line.id.substring(1), 10)); - } - } - coverage.to_prev_chunk(); -}; - -// Select line number lineno, or if it is in a colored chunk, select the -// entire chunk -coverage.select_line_or_chunk = function (lineno) { - var c = coverage; - var probe_line = c.line_elt(lineno); - if (!probe_line) { - return; - } - var the_indicator = c.chunk_indicator(probe_line); - if (the_indicator) { - // The line is in a highlighted chunk. - // Search backward for the first line. - var probe = lineno; - var indicator = the_indicator; - while (probe > 0 && indicator === the_indicator) { - probe--; - probe_line = c.line_elt(probe); - if (!probe_line) { - break; - } - indicator = c.chunk_indicator(probe_line); - } - var begin = probe + 1; - - // Search forward for the last line. - probe = lineno; - indicator = the_indicator; - while (indicator === the_indicator) { - probe++; - probe_line = c.line_elt(probe); - indicator = c.chunk_indicator(probe_line); - } - - coverage.set_sel(begin, probe); - } - else { - coverage.set_sel(lineno); - } -}; - -coverage.show_selection = function () { - // Highlight the lines in the chunk - document.querySelectorAll("#source .highlight").forEach(e => e.classList.remove("highlight")); - for (let probe = coverage.sel_begin; probe < coverage.sel_end; probe++) { - coverage.line_elt(probe).querySelector(".n").classList.add("highlight"); - } - - coverage.scroll_to_selection(); -}; - -coverage.scroll_to_selection = function () { - // Scroll the page if the chunk isn't fully visible. - if (coverage.selection_ends_on_screen() < 2) { - const element = coverage.line_elt(coverage.sel_begin); - coverage.scroll_window(element.offsetTop - 60); - } -}; - -coverage.scroll_window = function (to_pos) { - window.scroll({top: to_pos, behavior: "smooth"}); -}; - -coverage.init_scroll_markers = function () { - // Init some variables - coverage.lines_len = document.querySelectorAll("#source > p").length; - - // Build html - coverage.build_scroll_markers(); -}; - -coverage.build_scroll_markers = function () { - const temp_scroll_marker = document.getElementById("scroll_marker") - if (temp_scroll_marker) temp_scroll_marker.remove(); - // Don't build markers if the window has no scroll bar. - if (document.body.scrollHeight <= window.innerHeight) { - return; - } - - const marker_scale = window.innerHeight / document.body.scrollHeight; - const line_height = Math.min(Math.max(3, window.innerHeight / coverage.lines_len), 10); - - let previous_line = -99, last_mark, last_top; - - const scroll_marker = document.createElement("div"); - scroll_marker.id = "scroll_marker"; - document.getElementById("source").querySelectorAll( - "p.show_run, p.show_mis, p.show_exc, p.show_exc, p.show_par" - ).forEach(element => { - const line_top = Math.floor(element.offsetTop * marker_scale); - const line_number = parseInt(element.querySelector(".n a").id.substr(1)); - - if (line_number === previous_line + 1) { - // If this solid missed block just make previous mark higher. - last_mark.style.height = `${line_top + line_height - last_top}px`; - } else { - // Add colored line in scroll_marker block. - last_mark = document.createElement("div"); - last_mark.id = `m${line_number}`; - last_mark.classList.add("marker"); - last_mark.style.height = `${line_height}px`; - last_mark.style.top = `${line_top}px`; - scroll_marker.append(last_mark); - last_top = line_top; - } - - previous_line = line_number; - }); - - // Append last to prevent layout calculation - document.body.append(scroll_marker); -}; - -coverage.wire_up_sticky_header = function () { - const header = document.querySelector("header"); - const header_bottom = ( - header.querySelector(".content h2").getBoundingClientRect().top - - header.getBoundingClientRect().top - ); - - function updateHeader() { - if (window.scrollY > header_bottom) { - header.classList.add("sticky"); - } else { - header.classList.remove("sticky"); - } - } - - window.addEventListener("scroll", updateHeader); - updateHeader(); -}; - -coverage.expand_contexts = function (e) { - var ctxs = e.target.parentNode.querySelector(".ctxs"); - - if (!ctxs.classList.contains("expanded")) { - var ctxs_text = ctxs.textContent; - var width = Number(ctxs_text[0]); - ctxs.textContent = ""; - for (var i = 1; i < ctxs_text.length; i += width) { - key = ctxs_text.substring(i, i + width).trim(); - ctxs.appendChild(document.createTextNode(contexts[key])); - ctxs.appendChild(document.createElement("br")); - } - ctxs.classList.add("expanded"); - } -}; - -document.addEventListener("DOMContentLoaded", () => { - if (document.body.classList.contains("indexfile")) { - coverage.index_ready(); - } else { - coverage.pyfile_ready(); - } -}); diff --git a/coverage/covindex.html b/coverage/covindex.html deleted file mode 100644 index 904cdd4..0000000 --- a/coverage/covindex.html +++ /dev/null @@ -1,128 +0,0 @@ - - - - - Coverage report - - - - - -
-
-

Coverage report: - 97.56% -

- -
- -
-

- coverage.py v7.2.7, - created at 2023-07-13 11:37 +0200 -

-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Modulestatementsmissingexcludedbranchespartialcoverage
src/griffe_pydantic/extension.py510220297.18%
tests/conftest.py10000100.00%
tests/test_extension.py80020100.00%
Total600222297.56%
-

- No items found using the specified filter. -

-
- - - diff --git a/coverage/d_25bfe507819b372b_extension_py.html b/coverage/d_25bfe507819b372b_extension_py.html deleted file mode 100644 index fe57a84..0000000 --- a/coverage/d_25bfe507819b372b_extension_py.html +++ /dev/null @@ -1,183 +0,0 @@ - - - - - Coverage for src/griffe_pydantic/extension.py: 97.18% - - - - - -
- -
-
-

1"""Griffe extension for Pydantic.""" 

-

2 

-

3from __future__ import annotations 

-

4 

-

5import json 

-

6import sys 

-

7from typing import TYPE_CHECKING 

-

8 

-

9from griffe.agents.nodes import ObjectNode 

-

10from griffe.agents.nodes import get_call_keyword_arguments as get_kwargs 

-

11from griffe.dataclasses import Attribute, Class, Docstring, Function 

-

12from griffe.expressions import Expression, Name 

-

13from griffe.extensions import Extension 

-

14from griffe.importer import dynamic_import 

-

15 

-

16if TYPE_CHECKING: 

-

17 import ast 

-

18 

-

19 

-

20self_namespace = "griffe_pydantic" 

-

21mkdocstrings_namespace = "mkdocstrings" 

-

22 

-

23 

-

24def _is_pydantic_field_validator(func: Function) -> bool: 

-

25 return any(decorator.callable_path == "pydantic.field_validator" for decorator in func.decorators) 

-

26 

-

27 

-

28class PydanticExtension(Extension): 

-

29 """Griffe extension for Pydantic.""" 

-

30 

-

31 def __init__(self, *, schema: bool = True) -> None: 

-

32 """Initialize the extension. 

-

33 

-

34 Parameters: 

-

35 schema: Whether to compute and store the JSON schema of models. 

-

36 """ 

-

37 super().__init__() 

-

38 self.schema = schema 

-

39 self.in_model: list[Class] = [] 

-

40 

-

41 def on_class_instance(self, node: ast.AST | ObjectNode, cls: Class) -> None: # noqa: ARG002 

-

42 """Detect and prepare Pydantic models.""" 

-

43 for base in cls.bases: 

-

44 if isinstance(base, (Name, Expression)): 44 ↛ 46line 44 didn't jump to line 46, because the condition on line 44 was never false

-

45 base = base.full # noqa: PLW2901 

-

46 if base == "pydantic.BaseModel": 

-

47 cls.labels.add(f"pydantic-{base[13:].lower()}") # pydantic-model/settings 

-

48 cls.extra[self_namespace]["fields"] = {} 

-

49 cls.extra[self_namespace]["validators"] = {} 

-

50 cls.extra[mkdocstrings_namespace]["template"] = "pydantic_model.html" 

-

51 self.in_model.append(cls) 

-

52 break 

-

53 

-

54 def on_attribute_instance(self, node: ast.AST | ObjectNode, attr: Attribute) -> None: 

-

55 """Handle Pydantic fields.""" 

-

56 if self.in_model: 

-

57 cls = self.in_model[-1] 

-

58 if attr.name == "model_config": 

-

59 cls.extra[self_namespace]["config"] = get_kwargs(node.value, parent=cls) # type: ignore[union-attr] 

-

60 else: 

-

61 attr.labels = {"pydantic-field"} 

-

62 cls.extra[self_namespace]["fields"][attr.name] = attr 

-

63 # Populate docstring from the field's `description` argument. 

-

64 if not attr.docstring and (docstring := get_kwargs(node.value, parent=cls).get("description", None)): # type: ignore[union-attr] 

-

65 attr.docstring = Docstring(docstring, parent=attr) 

-

66 

-

67 def on_function_instance(self, node: ast.AST | ObjectNode, func: Function) -> None: # noqa: ARG002 

-

68 """Handle Pydantic field validators.""" 

-

69 if self.in_model and _is_pydantic_field_validator(func): 

-

70 func.labels = {"pydantic-validator"} 

-

71 cls = self.in_model[-1] 

-

72 cls.extra[self_namespace]["validators"][func.name] = func 

-

73 

-

74 def on_class_members(self, node: ast.AST | ObjectNode, cls: Class) -> None: # noqa: ARG002 

-

75 """Finalize the Pydantic model data.""" 

-

76 if self.in_model and cls is self.in_model[-1]: 

-

77 # Add schema to extra data. 

-

78 if self.schema: 78 ↛ 84line 78 didn't jump to line 84, because the condition on line 78 was never false

-

79 true_class = dynamic_import(cls.path, import_paths=[cls.filepath.parent, *sys.path]) # type: ignore[union-attr] 

-

80 schema = json.dumps(true_class.model_json_schema(), indent=2) 

-

81 cls.extra[self_namespace]["schema"] = schema 

-

82 

-

83 # Pop last class from the heap. 

-

84 self.in_model.pop() 

-
- - - diff --git a/coverage/d_a44f0ac069e85531_conftest_py.html b/coverage/d_a44f0ac069e85531_conftest_py.html deleted file mode 100644 index 52d6488..0000000 --- a/coverage/d_a44f0ac069e85531_conftest_py.html +++ /dev/null @@ -1,102 +0,0 @@ - - - - - Coverage for tests/conftest.py: 100.00% - - - - - -
-
-

- Coverage for tests/conftest.py: - 100.00% -

- -

- 1 statements   - - - - -

-

- « prev     - ^ index     - » next -       - coverage.py v7.2.7, - created at 2023-07-13 11:34 +0200 -

- -
-
-
-

1"""Configuration for the pytest test suite.""" 

-

2 

-

3pytest_plugins = ["griffe.tests"] 

-
- - - diff --git a/coverage/d_a44f0ac069e85531_test_extension_py.html b/coverage/d_a44f0ac069e85531_test_extension_py.html deleted file mode 100644 index 8ac3a01..0000000 --- a/coverage/d_a44f0ac069e85531_test_extension_py.html +++ /dev/null @@ -1,150 +0,0 @@ - - - - - Coverage for tests/test_extension.py: 100.00% - - - - - -
-
-

- Coverage for tests/test_extension.py: - 100.00% -

- -

- 8 statements   - - - - -

-

- « prev     - ^ index     - » next -       - coverage.py v7.2.7, - created at 2023-07-13 11:37 +0200 -

- -
-
-
-

1"""Tests for the `extension` module.""" 

-

2 

-

3from __future__ import annotations 

-

4 

-

5from griffe.extensions import load_extensions 

-

6from griffe.tests import temporary_visited_module 

-

7 

-

8from griffe_pydantic.extension import PydanticExtension 

-

9 

-

10code = """ 

-

11 from pydantic import field_validator, ConfigDict, BaseModel, Field 

-

12 

-

13 

-

14 class ExampleModel(BaseModel): 

-

15 '''An example model.''' 

-

16 

-

17 model_config = ConfigDict(frozen=False) 

-

18 

-

19 field_without_default: str 

-

20 '''Shows the *[Required]* marker in the signature.''' 

-

21 

-

22 field_plain_with_validator: int = 100 

-

23 '''Show standard field with type annotation.''' 

-

24 

-

25 field_with_validator_and_alias: str = Field("FooBar", alias="BarFoo", validation_alias="BarFoo") 

-

26 '''Shows corresponding validator with link/anchor.''' 

-

27 

-

28 field_with_constraints_and_description: int = Field( 

-

29 default=5, ge=0, le=100, description="Shows constraints within doc string." 

-

30 ) 

-

31 

-

32 @field_validator("field_with_validator_and_alias", "field_plain_with_validator") 

-

33 @classmethod 

-

34 def check_max_length_ten(cls, v): 

-

35 '''Show corresponding field with link/anchor.''' 

-

36 if len(v) >= 10: 

-

37 raise ValueError("No more than 10 characters allowed") 

-

38 return v 

-

39 

-

40 def regular_method(self): 

-

41 pass 

-

42  

-

43 class RegularClass(object): 

-

44 regular_attr = 1 

-

45""" 

-

46 

-

47 

-

48def test_extension() -> None: 

-

49 """Test the extension.""" 

-

50 with temporary_visited_module(code, extensions=load_extensions([PydanticExtension])) as module: 

-

51 assert module 

-
- - - diff --git a/coverage/favicon_32.png b/coverage/favicon_32.png deleted file mode 100644 index 8649f0475d8d20793b2ec431fe25a186a414cf10..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1732 zcmV;#20QtQP)K2KOkBOVxIZChq#W-v7@TU%U6P(wycKT1hUJUToW3ke1U1ONa4 z000000000000000bb)GRa9mqwR9|UWHy;^RUrt?IT__Y0JUcxmBP0(51q1>E00030 z|NrOz)aw7%8sJzM<5^g%z7^qE`}_Ot|JUUG(NUkWzR|7K?Zo%@_v-8G-1N%N=D$;; zw;keH4dGY$`1t4M=HK_s*zm^0#KgqfwWhe3qO_HtvXYvtjgX>;-~C$L`&k>^R)9)7 zdPh2TL^pCnHC#0+_4D)M`p?qp!pq{jO_{8;$fbaflbx`Tn52n|n}8VFRTA1&ugOP< zPd{uvFjz7t*Vot1&d$l-xWCk}s;sQL&#O(Bskh6gqNJv>#iB=ypG1e3K!K4yc7!~M zfj4S*g^zZ7eP$+_Sl07Z646l;%urinP#D8a6TwRtnLIRcI!r4f@bK~9-`~;E(N?Lv zSEst7s;rcxsi~}{Nsytfz@MtUoR*iFc8!#vvx}Umhm4blk(_~MdVD-@dW&>!Nn~ro z_E~-ESVQAj6Wmn;(olz(O&_{U2*pZBc1aYjMh>Dq3z|6`jW`RDHV=t3I6yRKJ~LOX zz_z!!vbVXPqob#=pj3^VMT?x6t(irRmSKsMo1~LLkB&=#j!=M%NP35mfqim$drWb9 zYIb>no_LUwc!r^NkDzs4YHu@=ZHRzrafWDZd1EhEVq=tGX?tK$pIa)DTh#bkvh!J- z?^%@YS!U*0E8$q$_*aOTQ&)Ra64g>ep;BdcQgvlg8qQHrP*E$;P{-m=A*@axn@$bO zO-Y4JzS&EAi%YG}N?cn?YFS7ivPY=EMV6~YH;+Xxu|tefLS|Aza)Cg6us#)=JW!uH zQa?H>d^j+YHCtyjL^LulF*05|F$RG!AX_OHVI&MtA~_@=5_lU|0000rbW%=J06GH4 z^5LD8b8apw8vNh1ua1mF{{Hy)_U`NA;Nacc+sCpuHXa-V{r&yz?c(9#+}oX+NmiRW z+W-IqK1oDDR5;6GfCDCOP5}iL5fK(cB~ET81`MFgF2kGa9AjhSIk~-E-4&*tPPKdiilQJ11k_J082ZS z>@TvivP!5ZFG?t@{t+GpR3XR&@*hA_VE1|Lo8@L@)l*h(Z@=?c-NS$Fk&&61IzUU9 z*nPqBM=OBZ-6ka1SJgGAS-Us5EN)r#dUX%>wQZLa2ytPCtMKp)Ob z*xcu38Z&d5<-NBS)@jRD+*!W*cf-m_wmxDEqBf?czI%3U0J$Xik;lA`jg}VH?(S(V zE!M3;X2B8w0TnnW&6(8;_Uc)WD;Ms6PKP+s(sFgO!}B!^ES~GDt4qLPxwYB)^7)XA zZwo9zDy-B0B+jT6V=!=bo(zs_8{eBA78gT9GH$(DVhz;4VAYwz+bOIdZ-PNb|I&rl z^XG=vFLF)1{&nT2*0vMz#}7^9hXzzf&ZdKlEj{LihP;|;Ywqn35ajP?H?7t|i-Un% z&&kxee@9B{nwgv1+S-~0)E1{ob1^Wn`F2isurqThKK=3%&;`@{0{!D- z&CSj80t;uPu&FaJFtSXKH#ajgGj}=sEad7US6jP0|Db@0j)?(5@sf<7`~a9>s;wCa zm^)spe{uxGFmrJYI9cOh7s$>8Npkt-5EWB1UKc`{W{y5Ce$1+nM9Cr;);=Ju#N^62OSlJMn7omiUgP&ErsYzT~iGxcW aE(`!K@+CXylaC4j0000 Coverage - griffe-pydantic

Coverage

\ No newline at end of file diff --git a/coverage/keybd_closed.png b/coverage/keybd_closed.png deleted file mode 100644 index ba119c47df81ed2bbd27a06988abf700139c4f99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9004 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 diff --git a/coverage/keybd_open.png b/coverage/keybd_open.png deleted file mode 100644 index a8bac6c9de256626c680f9e9e3f8ee81d9713ecd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9003 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 G%6|bpD&^7u diff --git a/coverage/status.json b/coverage/status.json deleted file mode 100644 index 7497836..0000000 --- a/coverage/status.json +++ /dev/null @@ -1 +0,0 @@ -{"format":2,"version":"7.2.7","globals":"01e029218f243c1bb4f5072b1da12194","files":{"d_25bfe507819b372b_extension_py":{"hash":"9378728cb4880bab5ce7b115c41f6017","index":{"nums":[2,1,51,2,0,20,2,2],"html_filename":"d_25bfe507819b372b_extension_py.html","relative_filename":"src/griffe_pydantic/extension.py"}},"d_a44f0ac069e85531_conftest_py":{"hash":"d88daa31710decff766b2651c48c1a84","index":{"nums":[2,1,1,0,0,0,0,0],"html_filename":"d_a44f0ac069e85531_conftest_py.html","relative_filename":"tests/conftest.py"}},"d_a44f0ac069e85531_test_extension_py":{"hash":"3fc4bfae30e016e41074cd018d982881","index":{"nums":[2,1,8,0,0,2,0,0],"html_filename":"d_a44f0ac069e85531_test_extension_py.html","relative_filename":"tests/test_extension.py"}}}} \ No newline at end of file diff --git a/coverage/style.css b/coverage/style.css deleted file mode 100644 index 11b24c4..0000000 --- a/coverage/style.css +++ /dev/null @@ -1,309 +0,0 @@ -@charset "UTF-8"; -/* Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 */ -/* For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt */ -/* Don't edit this .css file. Edit the .scss file instead! */ -html, body, h1, h2, h3, p, table, td, th { margin: 0; padding: 0; border: 0; font-weight: inherit; font-style: inherit; font-size: 100%; font-family: inherit; vertical-align: baseline; } - -body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; font-size: 1em; background: #fff; color: #000; } - -@media (prefers-color-scheme: dark) { body { background: #1e1e1e; } } - -@media (prefers-color-scheme: dark) { body { color: #eee; } } - -html > body { font-size: 16px; } - -a:active, a:focus { outline: 2px dashed #007acc; } - -p { font-size: .875em; line-height: 1.4em; } - -table { border-collapse: collapse; } - -td { vertical-align: top; } - -table tr.hidden { display: none !important; } - -p#no_rows { display: none; font-size: 1.2em; } - -a.nav { text-decoration: none; color: inherit; } - -a.nav:hover { text-decoration: underline; color: inherit; } - -.hidden { display: none; } - -header { background: #f8f8f8; width: 100%; z-index: 2; border-bottom: 1px solid #ccc; } - -@media (prefers-color-scheme: dark) { header { background: black; } } - -@media (prefers-color-scheme: dark) { header { border-color: #333; } } - -header .content { padding: 1rem 3.5rem; } - -header h2 { margin-top: .5em; font-size: 1em; } - -header p.text { margin: .5em 0 -.5em; color: #666; font-style: italic; } - -@media (prefers-color-scheme: dark) { header p.text { color: #aaa; } } - -header.sticky { position: fixed; left: 0; right: 0; height: 2.5em; } - -header.sticky .text { display: none; } - -header.sticky h1, header.sticky h2 { font-size: 1em; margin-top: 0; display: inline-block; } - -header.sticky .content { padding: 0.5rem 3.5rem; } - -header.sticky .content p { font-size: 1em; } - -header.sticky ~ #source { padding-top: 6.5em; } - -main { position: relative; z-index: 1; } - -footer { margin: 1rem 3.5rem; } - -footer .content { padding: 0; color: #666; font-style: italic; } - -@media (prefers-color-scheme: dark) { footer .content { color: #aaa; } } - -#index { margin: 1rem 0 0 3.5rem; } - -h1 { font-size: 1.25em; display: inline-block; } - -#filter_container { float: right; margin: 0 2em 0 0; } - -#filter_container input { width: 10em; padding: 0.2em 0.5em; border: 2px solid #ccc; background: #fff; color: #000; } - -@media (prefers-color-scheme: dark) { #filter_container input { border-color: #444; } } - -@media (prefers-color-scheme: dark) { #filter_container input { background: #1e1e1e; } } - -@media (prefers-color-scheme: dark) { #filter_container input { color: #eee; } } - -#filter_container input:focus { border-color: #007acc; } - -header button { font-family: inherit; font-size: inherit; border: 1px solid; border-radius: .2em; color: inherit; padding: .1em .5em; margin: 1px calc(.1em + 1px); cursor: pointer; border-color: #ccc; } - -@media (prefers-color-scheme: dark) { header button { border-color: #444; } } - -header button:active, header button:focus { outline: 2px dashed #007acc; } - -header button.run { background: #eeffee; } - -@media (prefers-color-scheme: dark) { header button.run { background: #373d29; } } - -header button.run.show_run { background: #dfd; border: 2px solid #00dd00; margin: 0 .1em; } - -@media (prefers-color-scheme: dark) { header button.run.show_run { background: #373d29; } } - -header button.mis { background: #ffeeee; } - -@media (prefers-color-scheme: dark) { header button.mis { background: #4b1818; } } - -header button.mis.show_mis { background: #fdd; border: 2px solid #ff0000; margin: 0 .1em; } - -@media (prefers-color-scheme: dark) { header button.mis.show_mis { background: #4b1818; } } - -header button.exc { background: #f7f7f7; } - -@media (prefers-color-scheme: dark) { header button.exc { background: #333; } } - -header button.exc.show_exc { background: #eee; border: 2px solid #808080; margin: 0 .1em; } - -@media (prefers-color-scheme: dark) { header button.exc.show_exc { background: #333; } } - -header button.par { background: #ffffd5; } - -@media (prefers-color-scheme: dark) { header button.par { background: #650; } } - -header button.par.show_par { background: #ffa; border: 2px solid #bbbb00; margin: 0 .1em; } - -@media (prefers-color-scheme: dark) { header button.par.show_par { background: #650; } } - -#help_panel, #source p .annotate.long { display: none; position: absolute; z-index: 999; background: #ffffcc; border: 1px solid #888; border-radius: .2em; color: #333; padding: .25em .5em; } - -#source p .annotate.long { white-space: normal; float: right; top: 1.75em; right: 1em; height: auto; } - -#help_panel_wrapper { float: right; position: relative; } - -#keyboard_icon { margin: 5px; } - -#help_panel_state { display: none; } - -#help_panel { top: 25px; right: 0; padding: .75em; border: 1px solid #883; color: #333; } - -#help_panel .keyhelp p { margin-top: .75em; } - -#help_panel .legend { font-style: italic; margin-bottom: 1em; } - -.indexfile #help_panel { width: 25em; } - -.pyfile #help_panel { width: 18em; } - -#help_panel_state:checked ~ #help_panel { display: block; } - -kbd { border: 1px solid black; border-color: #888 #333 #333 #888; padding: .1em .35em; font-family: SFMono-Regular, Menlo, Monaco, Consolas, monospace; font-weight: bold; background: #eee; border-radius: 3px; } - -#source { padding: 1em 0 1em 3.5rem; font-family: SFMono-Regular, Menlo, Monaco, Consolas, monospace; } - -#source p { position: relative; white-space: pre; } - -#source p * { box-sizing: border-box; } - -#source p .n { float: left; text-align: right; width: 3.5rem; box-sizing: border-box; margin-left: -3.5rem; padding-right: 1em; color: #999; } - -@media (prefers-color-scheme: dark) { #source p .n { color: #777; } } - -#source p .n.highlight { background: #ffdd00; } - -#source p .n a { margin-top: -4em; padding-top: 4em; text-decoration: none; color: #999; } - -@media (prefers-color-scheme: dark) { #source p .n a { color: #777; } } - -#source p .n a:hover { text-decoration: underline; color: #999; } - -@media (prefers-color-scheme: dark) { #source p .n a:hover { color: #777; } } - -#source p .t { display: inline-block; width: 100%; box-sizing: border-box; margin-left: -.5em; padding-left: 0.3em; border-left: 0.2em solid #fff; } - -@media (prefers-color-scheme: dark) { #source p .t { border-color: #1e1e1e; } } - -#source p .t:hover { background: #f2f2f2; } - -@media (prefers-color-scheme: dark) { #source p .t:hover { background: #282828; } } - -#source p .t:hover ~ .r .annotate.long { display: block; } - -#source p .t .com { color: #008000; font-style: italic; line-height: 1px; } - -@media (prefers-color-scheme: dark) { #source p .t .com { color: #6a9955; } } - -#source p .t .key { font-weight: bold; line-height: 1px; } - -#source p .t .str { color: #0451a5; } - -@media (prefers-color-scheme: dark) { #source p .t .str { color: #9cdcfe; } } - -#source p.mis .t { border-left: 0.2em solid #ff0000; } - -#source p.mis.show_mis .t { background: #fdd; } - -@media (prefers-color-scheme: dark) { #source p.mis.show_mis .t { background: #4b1818; } } - -#source p.mis.show_mis .t:hover { background: #f2d2d2; } - -@media (prefers-color-scheme: dark) { #source p.mis.show_mis .t:hover { background: #532323; } } - -#source p.run .t { border-left: 0.2em solid #00dd00; } - -#source p.run.show_run .t { background: #dfd; } - -@media (prefers-color-scheme: dark) { #source p.run.show_run .t { background: #373d29; } } - -#source p.run.show_run .t:hover { background: #d2f2d2; } - -@media (prefers-color-scheme: dark) { #source p.run.show_run .t:hover { background: #404633; } } - -#source p.exc .t { border-left: 0.2em solid #808080; } - -#source p.exc.show_exc .t { background: #eee; } - -@media (prefers-color-scheme: dark) { #source p.exc.show_exc .t { background: #333; } } - -#source p.exc.show_exc .t:hover { background: #e2e2e2; } - -@media (prefers-color-scheme: dark) { #source p.exc.show_exc .t:hover { background: #3c3c3c; } } - -#source p.par .t { border-left: 0.2em solid #bbbb00; } - -#source p.par.show_par .t { background: #ffa; } - -@media (prefers-color-scheme: dark) { #source p.par.show_par .t { background: #650; } } - -#source p.par.show_par .t:hover { background: #f2f2a2; } - -@media (prefers-color-scheme: dark) { #source p.par.show_par .t:hover { background: #6d5d0c; } } - -#source p .r { position: absolute; top: 0; right: 2.5em; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; } - -#source p .annotate { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; color: #666; padding-right: .5em; } - -@media (prefers-color-scheme: dark) { #source p .annotate { color: #ddd; } } - -#source p .annotate.short:hover ~ .long { display: block; } - -#source p .annotate.long { width: 30em; right: 2.5em; } - -#source p input { display: none; } - -#source p input ~ .r label.ctx { cursor: pointer; border-radius: .25em; } - -#source p input ~ .r label.ctx::before { content: "▶ "; } - -#source p input ~ .r label.ctx:hover { background: #e8f4ff; color: #666; } - -@media (prefers-color-scheme: dark) { #source p input ~ .r label.ctx:hover { background: #0f3a42; } } - -@media (prefers-color-scheme: dark) { #source p input ~ .r label.ctx:hover { color: #aaa; } } - -#source p input:checked ~ .r label.ctx { background: #d0e8ff; color: #666; border-radius: .75em .75em 0 0; padding: 0 .5em; margin: -.25em 0; } - -@media (prefers-color-scheme: dark) { #source p input:checked ~ .r label.ctx { background: #056; } } - -@media (prefers-color-scheme: dark) { #source p input:checked ~ .r label.ctx { color: #aaa; } } - -#source p input:checked ~ .r label.ctx::before { content: "▼ "; } - -#source p input:checked ~ .ctxs { padding: .25em .5em; overflow-y: scroll; max-height: 10.5em; } - -#source p label.ctx { color: #999; display: inline-block; padding: 0 .5em; font-size: .8333em; } - -@media (prefers-color-scheme: dark) { #source p label.ctx { color: #777; } } - -#source p .ctxs { display: block; max-height: 0; overflow-y: hidden; transition: all .2s; padding: 0 .5em; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; white-space: nowrap; background: #d0e8ff; border-radius: .25em; margin-right: 1.75em; text-align: right; } - -@media (prefers-color-scheme: dark) { #source p .ctxs { background: #056; } } - -#index { font-family: SFMono-Regular, Menlo, Monaco, Consolas, monospace; font-size: 0.875em; } - -#index table.index { margin-left: -.5em; } - -#index td, #index th { text-align: right; width: 5em; padding: .25em .5em; border-bottom: 1px solid #eee; } - -@media (prefers-color-scheme: dark) { #index td, #index th { border-color: #333; } } - -#index td.name, #index th.name { text-align: left; width: auto; } - -#index th { font-style: italic; color: #333; cursor: pointer; } - -@media (prefers-color-scheme: dark) { #index th { color: #ddd; } } - -#index th:hover { background: #eee; } - -@media (prefers-color-scheme: dark) { #index th:hover { background: #333; } } - -#index th[aria-sort="ascending"], #index th[aria-sort="descending"] { white-space: nowrap; background: #eee; padding-left: .5em; } - -@media (prefers-color-scheme: dark) { #index th[aria-sort="ascending"], #index th[aria-sort="descending"] { background: #333; } } - -#index th[aria-sort="ascending"]::after { font-family: sans-serif; content: " ↑"; } - -#index th[aria-sort="descending"]::after { font-family: sans-serif; content: " ↓"; } - -#index td.name a { text-decoration: none; color: inherit; } - -#index tr.total td, #index tr.total_dynamic td { font-weight: bold; border-top: 1px solid #ccc; border-bottom: none; } - -#index tr.file:hover { background: #eee; } - -@media (prefers-color-scheme: dark) { #index tr.file:hover { background: #333; } } - -#index tr.file:hover td.name { text-decoration: underline; color: inherit; } - -#scroll_marker { position: fixed; z-index: 3; right: 0; top: 0; width: 16px; height: 100%; background: #fff; border-left: 1px solid #eee; will-change: transform; } - -@media (prefers-color-scheme: dark) { #scroll_marker { background: #1e1e1e; } } - -@media (prefers-color-scheme: dark) { #scroll_marker { border-color: #333; } } - -#scroll_marker .marker { background: #ccc; position: absolute; min-height: 3px; width: 100%; } - -@media (prefers-color-scheme: dark) { #scroll_marker .marker { background: #444; } } diff --git a/credits/index.html b/credits/index.html deleted file mode 100644 index e9f0a63..0000000 --- a/credits/index.html +++ /dev/null @@ -1 +0,0 @@ - Credits - griffe-pydantic

Credits¤

These projects were used to build griffe-pydantic. Thank you!

python | pdm | copier-pdm

Runtime dependencies¤

Project Summary Version (accepted) Version (last resolved) License
colorama Cross-platform colored terminal text. >=0.4 0.4.6 BSD License
griffe Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API. >=0.32.0 0.32.0 ISC

Development dependencies¤

Project Summary Version (accepted) Version (last resolved) License
annotated-types Reusable constraint types to use with typing.Annotated >=0.4.0 0.5.0 MIT License
ansimarkup Produce colored terminal text with an xml-like markup ~=1.4 1.5.0 Revised BSD License
babel Internationalization utilities >=2.10.3 2.12.1 BSD
beautifulsoup4 Screen-scraping library 4.12.2 MIT License
black The uncompromising code formatter. >=23.1 23.7.0 MIT
blacken-docs Run Black on Python code blocks in documentation files. >=1.13 1.15.0 MIT
certifi Python package for providing Mozilla's CA Bundle. >=2017.4.17 2023.5.7 MPL-2.0
charset-normalizer The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet. <4,>=2 3.2.0 MIT
click Composable command line interface toolkit >=8.0.0 8.1.4 BSD-3-Clause
colorama Cross-platform colored terminal text. ; platform_system == "Windows" 0.4.6 BSD License
coverage Code coverage measurement for Python [toml]>=5.2.1 7.2.7 Apache-2.0
csscompressor A python port of YUI CSS Compressor >=0.9.5 0.9.5 BSD
cssselect cssselect parses CSS3 Selectors and translates them to XPath 1.0 >=1.2.0 1.2.0 BSD
dparse A parser for Python dependency files >=0.6.2 0.6.3 MIT license
duty A simple task runner. >=0.10 1.0.0 ISC
exceptiongroup Backport of PEP 654 (exception groups) >=1.0.0rc8; python_version < "3.11" 1.1.2 ?
execnet execnet: rapid multi-Python deployment >=1.1 2.0.2 MIT License
failprint Run a command, print its output only if it fails. >=0.11 0.11.1 ISC
ghp-import Copy your docs directly to the gh-pages branch. >=1.0 2.1.0 Apache Software License
git-changelog Automatic Changelog generator using Jinja2 templates. >=1.0 2.0.0 ISC
gitdb Git Object Database <5,>=4.0.1 4.0.10 BSD License
gitpython GitPython is a Python library used to interact with Git repositories 3.1.32 BSD
griffe Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API. >=0.24 0.32.0 ISC
htmlmin2 An HTML Minifier >=0.1.13 0.1.13 BSD
idna Internationalized Domain Names in Applications (IDNA) <4,>=2.5 3.4 BSD License
importlib-metadata Read metadata from Python packages >=4.3; python_version < "3.10" 6.8.0 ?
iniconfig brain-dead simple config-ini parsing 2.0.0 MIT License
jinja2 A very fast and expressive template engine. <4,>=2.11 3.1.2 BSD-3-Clause
jsmin JavaScript minifier. >=3.0.1 3.0.1 MIT License
lxml Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API. >=4.6 4.9.3 BSD-3-Clause
markdown Python implementation of Markdown. <4.0.0,>=3.3.3 3.3.7 BSD License
markdown-callouts Markdown extension: a classier syntax for admonitions >=0.2 0.3.0 MIT
markdown-exec Utilities to execute code blocks in Markdown files. >=0.5 1.6.0.1.0.0 ISC
markdown2 A fast and complete Python implementation of Markdown >=2.4.3 2.4.9 MIT
markupsafe Safely add untrusted strings to HTML/XML markup. >=2.0 2.1.3 BSD-3-Clause
mergedeep A deep merge function for 🐍. >=1.3.4 1.3.4 MIT License
mkdocs Project documentation with Markdown. >=1.3 1.4.3 BSD License
mkdocs-coverage MkDocs plugin to integrate your coverage HTML report into your site. >=0.2 0.2.7 ISC
mkdocs-gen-files MkDocs plugin to programmatically generate documentation pages during the build >=0.3 0.5.0 MIT License
mkdocs-git-committers-plugin-2 An MkDocs plugin to create a list of contributors on the page >=1.1 1.1.2 MIT
mkdocs-literate-nav MkDocs plugin to specify the navigation in Markdown instead of YAML >=0.4 0.6.0 MIT License
mkdocs-material Documentation that simply works >=7.3 9.1.18+insiders.4.36.1 MIT License
mkdocs-material-extensions Extension pack for Python Markdown and MkDocs Material. >=1.1 1.1.1 MIT License
mkdocs-minify-plugin An MkDocs plugin to minify HTML, JS or CSS files prior to being written to disk >=0.6.4 0.6.4 MIT
mkdocstrings Automatic documentation from sources, for MkDocs. [python]>=0.18 0.22.0 ISC
mkdocstrings-python A Python handler for mkdocstrings. >=0.5.2 1.1.2.1.1.1 ISC
mypy Optional static typing for Python >=0.910 1.4.1 MIT License
mypy-extensions Type system extensions for programs checked with the mypy type checker. >=0.4.3 1.0.0 MIT License
packaging Core utilities for Python packages >=22.0 23.1 BSD License
paginate Divides large result sets into pages for easier browsing >=0.5.6 0.5.6 MIT
pathspec Utility library for gitignore style pattern matching of file paths. >=0.9.0 0.11.1 Mozilla Public License 2.0 (MPL 2.0)
pipdeptree Command line utility to show dependency tree of packages. >=2.3 2.9.5 MIT License
platformdirs A small Python package for determining appropriate platform-specific dirs, e.g. a "user data dir". >=2 3.8.1 MIT License
pluggy plugin and hook calling mechanisms for python <2.0,>=0.12 1.2.0 MIT
ptyprocess Run a subprocess in a pseudo terminal ~=0.6; sys_platform != "win32" 0.7.0 ISC License (ISCL)
pydantic Data validation using Python type hints >=2.0.2 2.0.2 MIT License
pydantic-core ==2.1.2 2.1.2 MIT
pygments Pygments is a syntax highlighting package written in Python. >=2.14 2.15.1 BSD-2-Clause
pymdown-extensions Extension pack for Python Markdown. >=9 10.0.1 MIT License
pyquery A jquery-like library for python >=1.2 2.0.0 BSD
pytest pytest: simple powerful testing with Python >=6.2 7.4.0 MIT
pytest-cov Pytest plugin for measuring coverage. >=3.0 4.1.0 MIT
pytest-randomly Pytest plugin to randomly order tests and control random.seed. >=3.10 3.13.0 MIT
pytest-xdist pytest xdist plugin for distributed testing, most importantly across multiple CPUs >=2.4 3.3.1 MIT
python-dateutil Extensions to the standard Python datetime module >=2.8.1 2.8.2 Dual License
pytz World timezone definitions, modern and historical >=2015.7; python_version < "3.9" 2023.3 ?
pyyaml YAML parser and emitter for Python >=5.1 6.0 MIT
pyyaml-env-tag A custom YAML tag for referencing environment variables in YAML files. >=0.1 0.1 MIT License
readtime Calculates the time some text takes the average human to read, based on Medium's read time forumula >=2.0 2.0.0 BSD
regex Alternative regular expression module, to replace re. >=2022.4.24 2023.6.3 Apache Software License
requests Python HTTP for Humans. 2.31.0 Apache 2.0
ruamel-yaml ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order >=0.17.21 0.17.32 MIT license
ruamel-yaml-clib C version of reader, parser and emitter for ruamel.yaml derived from libyaml >=0.2.7; platform_python_implementation == "CPython" and python_version < "3.12" 0.2.7 MIT
ruff An extremely fast Python linter, written in Rust. >=0.0.246 0.0.278 MIT
safety Checks installed dependencies for known vulnerabilities and licenses. >=2 2.3.4 MIT license
semver Python helper for Semantic Versioning (https://semver.org) >=2.13 3.0.1 BSD
setuptools Easily download, build, install, upgrade, and uninstall Python packages >=19.3 68.0.0 MIT License
six Python 2 and 3 compatibility utilities >=1.5 1.16.0 MIT
smmap A pure Python implementation of a sliding window memory map manager <6,>=3.0.1 5.0.0 BSD
soupsieve A modern CSS selector implementation for Beautiful Soup. >1.2 2.4.1 MIT License
toml Python Library for Tom's Obvious, Minimal Language >=0.10 0.10.2 MIT
tomli A lil' TOML parser >=1.1.0; python_version < "3.11" 2.0.1 ?
types-markdown Typing stubs for Markdown >=3.3 3.4.2.9 Apache-2.0 license
types-pyyaml Typing stubs for PyYAML >=6.0 6.0.12.10 Apache-2.0 license
types-toml Typing stubs for toml >=0.10 0.10.8.6 Apache-2.0 license
typing-extensions Backported and Experimental Type Hints for Python 3.7+ >=3.10.0.0; python_version < "3.10" 4.7.1 Python Software Foundation License
urllib3 HTTP library with thread-safe connection pooling, file post, and more. <3,>=1.21.1 2.0.3 MIT License
watchdog Filesystem events monitoring >=2.0 3.0.0 Apache License 2.0
zipp Backport of pathlib-compatible object wrapper for zip files >=0.5 3.16.1 ?

More credits from the author

\ No newline at end of file diff --git a/css/insiders.css b/css/insiders.css deleted file mode 100644 index b5547bd..0000000 --- a/css/insiders.css +++ /dev/null @@ -1,125 +0,0 @@ -@keyframes heart { - - 0%, - 40%, - 80%, - 100% { - transform: scale(1); - } - - 20%, - 60% { - transform: scale(1.15); - } -} - -@keyframes vibrate { - 0%, 2%, 4%, 6%, 8%, 10%, 12%, 14%, 16%, 18% { - -webkit-transform: translate3d(-2px, 0, 0); - transform: translate3d(-2px, 0, 0); - } - 1%, 3%, 5%, 7%, 9%, 11%, 13%, 15%, 17%, 19% { - -webkit-transform: translate3d(2px, 0, 0); - transform: translate3d(2px, 0, 0); - } - 20%, 100% { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} - -.heart { - color: #e91e63; -} - -.pulse { - animation: heart 1000ms infinite; -} - -.vibrate { - animation: vibrate 2000ms infinite; -} - -.new-feature svg { - fill: var(--md-accent-fg-color) !important; -} - -a.insiders { - color: #e91e63; -} - -.sponsorship-list { - width: 100%; -} - -.sponsorship-item { - float: left; - border-radius: 100%; - display: block; - height: 1.6rem; - margin: .2rem; - overflow: hidden; - width: 1.6rem; -} - -.sponsorship-item:focus, .sponsorship-item:hover { - transform: scale(1.1); -} - -.sponsorship-item img { - filter: grayscale(100%) opacity(75%); - height: auto; - width: 100%; -} - -.sponsorship-item:focus img, .sponsorship-item:hover img { - filter: grayscale(0); -} - -.sponsorship-item.private { - background: var(--md-default-fg-color--lightest); - color: var(--md-default-fg-color); - font-size: .6rem; - font-weight: 700; - line-height: 1.6rem; - text-align: center; -} - -.mastodon { - color: #897ff8; - border-radius: 100%; - box-shadow: inset 0 0 0 .05rem currentcolor; - display: inline-block; - height: 1.2rem !important; - padding: .25rem; - transition: all .25s; - vertical-align: bottom !important; - width: 1.2rem; -} - -.premium-sponsors { - text-align: center; -} - -#silver-sponsors img { - height: 140px; -} - -#bronze-sponsors img { - height: 140px; -} - -#bronze-sponsors p { - display: flex; - flex-wrap: wrap; - justify-content: center; -} - -#bronze-sponsors a { - display: block; - flex-shrink: 0; -} - -.sponsors-total { - font-weight: bold; -} \ No newline at end of file diff --git a/css/material.css b/css/material.css deleted file mode 100644 index 9e8c14a..0000000 --- a/css/material.css +++ /dev/null @@ -1,4 +0,0 @@ -/* More space at the bottom of the page. */ -.md-main__inner { - margin-bottom: 1.5rem; -} diff --git a/css/mkdocstrings.css b/css/mkdocstrings.css deleted file mode 100644 index fe191c8..0000000 --- a/css/mkdocstrings.css +++ /dev/null @@ -1,26 +0,0 @@ -/* Indentation. */ -div.doc-contents:not(.first) { - padding-left: 25px; - border-left: .05rem solid var(--md-typeset-table-color); -} - -/* Mark external links as such. */ -a.external::after, -a.autorefs-external::after { - /* https://primer.style/octicons/arrow-up-right-24 */ - mask-image: url('data:image/svg+xml,'); - content: ' '; - - display: inline-block; - vertical-align: middle; - position: relative; - - height: 1em; - width: 1em; - background-color: var(--md-typeset-a-color); -} - -a.external:hover::after, -a.autorefs-external:hover::after { - background-color: var(--md-accent-fg-color); -} \ No newline at end of file diff --git a/examples/__pycache__/model_ext.cpython-310.pyc b/examples/__pycache__/model_ext.cpython-310.pyc deleted file mode 100644 index 1c37555291a130d8dc0497be756bb1be0b59c07d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1200 zcmZux&2AGh5VrRx-ENb%KtcRSXh8@m2oktgsI*W{^n&297t7jll2yHSus3aqIFVla zAe?v-UcgsQeFZqccsHmy;Alpk@yvYlx6!>`O7Oh>{T+UUg#7fv>WNU;L$Xhi0RbvW zMRQsOc~FIUSVeh6$y)*egy#f85iY_!hUh)%$Cv0q`jOijl|lkL;j#o?Yva-btw!be zby?JIeV<$LPJ@sxKJ<2l_gXz26!wtp9GM_F1(F9JFq1qKk;lEDc`Q0&4WeDLP9V+` zv5r#5OCp6eNbt9Q5#}3>Rl3w~Ko?@@!RAGjcN>qbT_SprLT3?(P1uHO=VU<_G~a^j zSkDdDeRIaEsch4oUwfr8(JHda7ce;NQ`Z?8Jr~N|Y>PfE>xrJ#48(}fWPJ%(gS*?l zO(icC^A=aV$vcNy?{kxPkm0o-xETA!t=nGquhfdQn)_D}R{Bh-E0U`J?v} zeQL8pD_a``t!?IEOO=5xGSro7JitkK?D)t%Pb2SL})a zA^#nJ_jG_{ZzHS87i=le;ym{it4HpynPRL4WE ziitLZOTV=9hesMaZ$ws4xXNBU&x#2*yr_k-8JAL@3c&t_633B#q77^96>71BC- z@{O1~80Xi)uo6)6A#Nu!aWX8GEdiqp$EF;O#IxyV;HoZ*A-2m7mqWM1X6j6w)r0A0 zw^K|+am*@y#t?9fL#>6n<;(U9+>H_%(fNbb4I2E<&Sz`>7Va(u1OI){21*d}Fl?!pAZj0eyl&-m-okc_6G8f|TO|uw16wM9K{CwO- zA-T1cz;y+4&#QfFR@hxH`cnKqg1wI{B@s=7BnW61=@wEDBy{sn5(RXdHnvCoj!XV^ iuK{ZEH9kh0hL5;{(tvs>m+ZEczw{eyy~Ay?6aEF=hftLO diff --git a/examples/__pycache__/model_ext.cpython-311.pyc b/examples/__pycache__/model_ext.cpython-311.pyc deleted file mode 100644 index df2d2aead9bc5bea3baa828f8cb24ebc5d4ed27b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1692 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 diff --git a/examples/model_ext.py b/examples/model_ext.py deleted file mode 100644 index 877eedd..0000000 --- a/examples/model_ext.py +++ /dev/null @@ -1,28 +0,0 @@ -from pydantic import field_validator, ConfigDict, BaseModel, Field - - -class ExampleModel(BaseModel): - """An example model.""" - - model_config = ConfigDict(frozen=False) - - field_without_default: str - """Shows the *[Required]* marker in the signature.""" - - field_plain_with_validator: int = 100 - """Show standard field with type annotation.""" - - field_with_validator_and_alias: str = Field("FooBar", alias="BarFoo", validation_alias="BarFoo") - """Shows corresponding validator with link/anchor.""" - - field_with_constraints_and_description: int = Field( - default=5, ge=0, le=100, description="Shows constraints within doc string." - ) - - @field_validator("field_with_validator_and_alias", "field_without_default") - @classmethod - def check_max_length_ten(cls, v) -> str: - """Show corresponding field with link/anchor.""" - if len(v) >= 10: - raise ValueError("No more than 10 characters allowed") - return v diff --git a/examples/model_noext.py b/examples/model_noext.py deleted file mode 100644 index 877eedd..0000000 --- a/examples/model_noext.py +++ /dev/null @@ -1,28 +0,0 @@ -from pydantic import field_validator, ConfigDict, BaseModel, Field - - -class ExampleModel(BaseModel): - """An example model.""" - - model_config = ConfigDict(frozen=False) - - field_without_default: str - """Shows the *[Required]* marker in the signature.""" - - field_plain_with_validator: int = 100 - """Show standard field with type annotation.""" - - field_with_validator_and_alias: str = Field("FooBar", alias="BarFoo", validation_alias="BarFoo") - """Shows corresponding validator with link/anchor.""" - - field_with_constraints_and_description: int = Field( - default=5, ge=0, le=100, description="Shows constraints within doc string." - ) - - @field_validator("field_with_validator_and_alias", "field_without_default") - @classmethod - def check_max_length_ten(cls, v) -> str: - """Show corresponding field with link/anchor.""" - if len(v) >= 10: - raise ValueError("No more than 10 characters allowed") - return v diff --git a/index.html b/index.html deleted file mode 100644 index 7e0e3c3..0000000 --- a/index.html +++ /dev/null @@ -1,60 +0,0 @@ - Overview - griffe-pydantic

griffe-pydantic¤

ci documentation pypi version gitpod gitter

Griffe extension for Pydantic.

Installation¤

With pip:

pip install griffe-pydantic
-

With pipx:

python3.8 -m pip install --user pipx
-pipx install griffe-pydantic
-

Usage¤

Command-line¤

griffe dump mypackage -e griffe_pydantic
-

See command-line usage in Griffe's documentation.

Python¤

import griffe
-
-griffe.load(
-    "mypackage",
-    extensions=griffe.load_extensions(
-        [{"griffe_pydantic": {"schema": True}}]
-    )
-)
-

See programmatic usage in Griffe's documentation.

MkDocs¤

mkdocs.yml
plugins:
-- mkdocstrings:
-    handlers:
-      python:
-        options:
-          extensions:
-          - griffe_pydantic:
-              schema: true
-

See MkDocs usage in Griffe's documentation.

Examples¤

from pydantic import field_validator, ConfigDict, BaseModel, Field
-
-
-class ExampleModel(BaseModel):
-    """An example model."""
-
-    model_config = ConfigDict(frozen=False)
-
-    field_without_default: str
-    """Shows the *[Required]* marker in the signature."""
-
-    field_plain_with_validator: int = 100
-    """Show standard field with type annotation."""
-
-    field_with_validator_and_alias: str = Field("FooBar", alias="BarFoo", validation_alias="BarFoo")
-    """Shows corresponding validator with link/anchor."""
-
-    field_with_constraints_and_description: int = Field(
-        default=5, ge=0, le=100, description="Shows constraints within doc string."
-    )
-
-    @field_validator("field_with_validator_and_alias", "field_without_default")
-    @classmethod
-    def check_max_length_ten(cls, v) -> str:
-        """Show corresponding field with link/anchor."""
-        if len(v) >= 10:
-            raise ValueError("No more than 10 characters allowed")
-        return v
-

ExampleModel ¤

Bases: BaseModel

An example model.

field_plain_with_validator class-attribute instance-attribute ¤

field_plain_with_validator: int = 100
-

Show standard field with type annotation.

field_with_validator_and_alias class-attribute instance-attribute ¤

field_with_validator_and_alias: str = Field(
-    "FooBar", alias="BarFoo", validation_alias="BarFoo"
-)
-

Shows corresponding validator with link/anchor.

field_without_default instance-attribute ¤

field_without_default: str
-

Shows the [Required] marker in the signature.

check_max_length_ten classmethod ¤

check_max_length_ten(v) -> str
-

Show corresponding field with link/anchor.

¤

¤

¤

¤

¤

ExampleModel pydantic-model ¤

Bases: BaseModel

An example model.

Config:

  • frozen: False

Fields:

Validators:

field_plain_with_validator pydantic-field ¤

field_plain_with_validator: int
-

Show standard field with type annotation.

field_with_constraints_and_description pydantic-field ¤

field_with_constraints_and_description: int = 5
-

Shows constraints within doc string.

field_with_validator_and_alias pydantic-field ¤

field_with_validator_and_alias: str
-

Shows corresponding validator with link/anchor.

field_without_default pydantic-field ¤

field_without_default: str
-

Shows the [Required] marker in the signature.

check_max_length_ten pydantic-validator ¤

check_max_length_ten(v) -> str
-

Show corresponding field with link/anchor.

¤

¤

¤

¤

¤

¤

\ No newline at end of file diff --git a/insiders/changelog/index.html b/insiders/changelog/index.html deleted file mode 100644 index 8a9e54a..0000000 --- a/insiders/changelog/index.html +++ /dev/null @@ -1 +0,0 @@ - Changelog - griffe-pydantic

Changelog¤

griffe-pydantic Insiders¤

1.0.0a0 July 13, 2023¤

  • Release first Insiders version (alpha)
\ No newline at end of file diff --git a/insiders/goals.yml b/insiders/goals.yml deleted file mode 100644 index b8c30e7..0000000 --- a/insiders/goals.yml +++ /dev/null @@ -1,7 +0,0 @@ -goals: - 1000: - name: GraviFridge User Manual - features: - - name: "[Project] Griffe extension for Pydantic" - ref: / - since: 2023/07/13 diff --git a/insiders/index.html b/insiders/index.html deleted file mode 100644 index 6fd5df7..0000000 --- a/insiders/index.html +++ /dev/null @@ -1 +0,0 @@ - Insiders - griffe-pydantic

Insiders¤

griffe-pydantic follows the sponsorware release strategy, which means that new features are first exclusively released to sponsors as part of Insiders. Read on to learn what sponsorships achieve, how to become a sponsor to get access to Insiders, and what's in it for you!

What is Insiders?¤

griffe-pydantic Insiders is a private fork of griffe-pydantic, hosted as a private GitHub repository. Almost1 all new features are developed as part of this fork, which means that they are immediately available to all eligible sponsors, as they are made collaborators of this repository.

Every feature is tied to a funding goal in monthly subscriptions. When a funding goal is hit, the features that are tied to it are merged back into griffe-pydantic and released for general availability, making them available to all users. Bugfixes are always released in tandem.

Sponsorships start as low as $10 a month.2

What sponsorships achieve¤

Sponsorships make this project sustainable, as they buy the maintainers of this project time – a very scarce resource – which is spent on the development of new features, bug fixing, stability improvement, issue triage and general support. The biggest bottleneck in Open Source is time.3

If you're unsure if you should sponsor this project, check out the list of completed funding goals to learn whether you're already using features that were developed with the help of sponsorships. You're most likely using at least a handful of them, thanks to our awesome sponsors!

What's in it for me?¤

The moment you become a sponsor, you'll get immediate access to 1 additional features that you can start using right away, and which are currently exclusively available to sponsors:

How to become a sponsor¤

Thanks for your interest in sponsoring! In order to become an eligible sponsor with your GitHub account, visit pawamoy's sponsor profile, and complete a sponsorship of $10 a month or more. You can use your individual or organization GitHub account for sponsoring.

Important: If you're sponsoring @pawamoy through a GitHub organization, please send a short email to pawamoy@pm.me with the name of your organization and the GitHub account of the individual that should be added as a collaborator.4

You can cancel your sponsorship anytime.5

  Join our awesome sponsors





If you sponsor publicly, you're automatically added here with a link to your profile and avatar to show your support for griffe-pydantic. Alternatively, if you wish to keep your sponsorship private, you'll be a silent +1. You can select visibility during checkout and change it afterwards.

Funding ¤

Goals¤

The following section lists all funding goals. Each goal contains a list of features prefixed with a checkmark symbol, denoting whether a feature is already available or planned, but not yet implemented. When the funding goal is hit, the features are released for general availability.

$ 1,000 — GraviFridge User Manual¤

Goals completed¤

This section lists all funding goals that were previously completed, which means that those features were part of Insiders, but are now generally available and can be used by all users.

Frequently asked questions¤

Compatibility¤

We're building an open source project and want to allow outside collaborators to use griffe-pydantic locally without having access to Insiders. Is this still possible?

Yes. Insiders is compatible with griffe-pydantic. Almost all new features and configuration options are either backward-compatible or implemented behind feature flags. Most Insiders features enhance the overall experience, though while these features add value for the users of your project, they shouldn't be necessary for previewing when making changes to content.

Payment¤

We don't want to pay for sponsorship every month. Are there any other options?

Yes. You can sponsor on a yearly basis by switching your GitHub account to a yearly billing cycle. If for some reason you cannot do that, you could also create a dedicated GitHub account with a yearly billing cycle, which you only use for sponsoring (some sponsors already do that).

If you have any problems or further questions, please reach out to pawamoy@pm.me.

Terms¤

Are we allowed to use Insiders under the same terms and conditions as griffe-pydantic?

Yes. Whether you're an individual or a company, you may use griffe-pydantic Insiders precisely under the same terms as griffe-pydantic, which are given by the ISC License. However, we kindly ask you to respect our fair use policy:

  • Please don't distribute the source code of Insiders. You may freely use it for public, private or commercial projects, privately fork or mirror it, but please don't make the source code public, as it would counteract the sponsorware strategy.

  • If you cancel your subscription, you're automatically removed as a collaborator and will miss out on all future updates of Insiders. However, you may use the latest version that's available to you as long as you like. Just remember that GitHub deletes private forks.


  1. In general, every new feature is first exclusively released to sponsors, but sometimes upstream dependencies enhance existing features that must be supported by griffe-pydantic

  2. Note that $10 a month is the minimum amount to become eligible for Insiders. While GitHub Sponsors also allows to sponsor lower amounts or one-time amounts, those can't be granted access to Insiders due to technical reasons. Such contributions are still very much welcome as they help ensuring the project's sustainability. 

  3. Making an Open Source project sustainable is exceptionally hard: maintainers burn out, projects are abandoned. That's not great and very unpredictable. The sponsorware model ensures that if you decide to use griffe-pydantic, you can be sure that bugs are fixed quickly and new features are added regularly. 

  4. It's currently not possible to grant access to each member of an organization, as GitHub only allows for adding users. Thus, after sponsoring, please send an email to pawamoy@pm.me, stating which account should become a collaborator of the Insiders repository. We're working on a solution which will make access to organizations much simpler. To ensure that access is not tied to a particular individual GitHub account, create a bot account (i.e. a GitHub account that is not tied to a specific individual), and use this account for the sponsoring. After being added to the list of collaborators, the bot account can create a private fork of the private Insiders GitHub repository, and grant access to all members of the organizations. 

  5. If you cancel your sponsorship, GitHub schedules a cancellation request which will become effective at the end of the billing cycle. This means that even though you cancel your sponsorship, you will keep your access to Insiders as long as your cancellation isn't effective. All charges are processed by GitHub through Stripe. As we don't receive any information regarding your payment, and GitHub doesn't offer refunds, sponsorships are non-refundable. 

\ No newline at end of file diff --git a/insiders/installation/index.html b/insiders/installation/index.html deleted file mode 100644 index 2ba3ca4..0000000 --- a/insiders/installation/index.html +++ /dev/null @@ -1,42 +0,0 @@ - Getting started with Insiders - griffe-pydantic

Getting started with Insiders¤

griffe-pydantic Insiders is a compatible drop-in replacement for griffe-pydantic, and can be installed similarly using pip or git. Note that in order to access the Insiders repository, you need to become an eligible sponsor of @pawamoy on GitHub.

Installation¤

with pip (ssh/https)¤

griffe-pydantic Insiders can be installed with pip using SSH:

pip install git+ssh://git@github.com/pawamoy-insiders/griffe-pydantic.git
-

Or using HTTPS:

pip install git+https://${GH_TOKEN}@github.com/pawamoy-insiders/griffe-pydantic.git
-
How to get a GitHub personal access token

The GH_TOKEN environment variable is a GitHub token. It can be obtained by creating a personal access token for your GitHub account. It will give you access to the Insiders repository, programmatically, from the command line or GitHub Actions workflows:

  1. Go to https://github.com/settings/tokens
  2. Click on Generate a new token
  3. Enter a name and select the repo scope
  4. Generate the token and store it in a safe place

Note that the personal access token must be kept secret at all times, as it allows the owner to access your private repositories.

with pip (self-hosted)¤

Self-hosting the Insiders package makes it possible to depend on griffe-pydantic normally, while transparently downloading and installing the Insiders version locally. It means that you can specify your dependencies normally, and your contributors without access to Insiders will get the public version, while you get the Insiders version on your machine.

Limitation

With this method, there is no way to force the installation of an Insiders version rather than a public version. If there is a public version that is more recent than your self-hosted Insiders version, the public version will take precedence. Remember to regularly update your self-hosted versions by uploading latest distributions.

You can build the distributions for Insiders yourself, by cloning the repository and using build to build the distributions, or you can download them from our GitHub Releases. You can upload these distributions to a private PyPI-like registry (Artifactory, Google Cloud, pypiserver, etc.) with Twine:

# download distributions in ~/dists, then upload with:
-twine upload --repository-url https://your-private-index.com ~/dists/*
-

You might also need to provide a username and password/token to authenticate against the registry. Please check Twine's documentation.

You can then configure pip (or other tools) to look for packages into your package index. For example, with pip:

pip config set global.extra-index-url https://your-private-index.com/simple
-

Note that the URL might differ depending on whether your are uploading a package (with Twine) or installing a package (with pip), and depending on the registry you are using (Artifactory, Google Cloud, etc.). Please check the documentation of your registry to learn how to configure your environment.

We kindly ask that you do not upload the distributions to public registries, as it is against our Terms of use.

Full example with pypiserver

In this example we use pypiserver to serve a local PyPI index.

pip install --user pypiserver
-# or pipx install pypiserver
-
-# create a packages directory
-mkdir -p ~/.local/pypiserver/packages
-
-# run the pypi server without authentication
-pypi-server run -p 8080 -a . -P . ~/.local/pypiserver/packages &
-

We can configure the credentials to access the server in ~/.pypirc:

.pypirc
[distutils]
-index-servers =
-    local
-
-[local]
-repository: http://localhost:8080
-username:
-password:
-

We then clone the Insiders repository, build distributions and upload them to our local server:

# clone the repository
-git clone git@github.com:pawamoy-insiders/griffe-pydantic
-cd griffe-pydantic
-
-# install build
-pip install --user build
-# or pipx install build
-
-# checkout latest tag
-git checkout $(git describe --tags --abbrev=0)
-
-# build the distributions
-pyproject-build
-
-# upload them to our local server
-twine upload -r local dist/* --skip-existing
-

Finally, we configure pip, and for example PDM, to use our local index to find packages:

pip config set global.extra-index-url http://localhost:8080/simple
-pdm config pypi.extra.url http://localhost:8080/simple
-

Now when running pip install griffe-pydantic, or resolving dependencies with PDM, both tools will look into our local index and find the Insiders version. Remember to update your local index regularly!

with git¤

Of course, you can use griffe-pydantic Insiders directly from git:

git clone git@github.com:pawamoy-insiders/griffe-pydantic
-

When cloning from git, the package must be installed:

pip install -e griffe-pydantic
-

Upgrading¤

When upgrading Insiders, you should always check the version of griffe-pydantic which makes up the first part of the version qualifier. For example, a version like 8.x.x.4.x.x means that Insiders 4.x.x is currently based on 8.x.x.

If the major version increased, it's a good idea to consult the changelog and go through the steps to ensure your configuration is up to date and all necessary changes have been made.

\ No newline at end of file diff --git a/js/insiders.js b/js/insiders.js deleted file mode 100644 index 03bcb40..0000000 --- a/js/insiders.js +++ /dev/null @@ -1,67 +0,0 @@ -function humanReadableAmount(amount) { - const strAmount = String(amount); - if (strAmount.length >= 4) { - return `${strAmount.slice(0, strAmount.length - 3)},${strAmount.slice(-3)}`; - } - return strAmount; -} - -function getJSON(url, callback) { - var xhr = new XMLHttpRequest(); - xhr.open('GET', url, true); - xhr.responseType = 'json'; - xhr.onload = function () { - var status = xhr.status; - if (status === 200) { - callback(null, xhr.response); - } else { - callback(status, xhr.response); - } - }; - xhr.send(); -} - -function updateInsidersPage(author_username) { - const sponsorURL = `https://github.com/sponsors/${author_username}` - const dataURL = `https://raw.githubusercontent.com/${author_username}/sponsors/main`; - getJSON(dataURL + '/numbers.json', function (err, numbers) { - document.getElementById('sponsors-count').innerHTML = numbers.count; - Array.from(document.getElementsByClassName('sponsors-total')).forEach(function (element) { - element.innerHTML = '$ ' + humanReadableAmount(numbers.total); - }); - getJSON(dataURL + '/sponsors.json', function (err, sponsors) { - const sponsorsElem = document.getElementById('sponsors'); - const privateSponsors = numbers.count - sponsors.length; - sponsors.forEach(function (sponsor) { - sponsorsElem.innerHTML += ` - - - - `; - }); - if (privateSponsors > 0) { - sponsorsElem.innerHTML += ` - - +${privateSponsors} - - `; - } - }); - }); - getJSON(dataURL + '/sponsorsBronze.json', function (err, sponsors) { - const bronzeSponsors = document.getElementById("bronze-sponsors"); - if (sponsors) { - let html = ''; - html += 'Bronze sponsors

' - sponsors.forEach(function (sponsor) { - html += ` - - ${sponsor.name} - - ` - }); - html += '

' - bronzeSponsors.innerHTML = html; - } - }); -} diff --git a/license/index.html b/license/index.html deleted file mode 100644 index a1b2475..0000000 --- a/license/index.html +++ /dev/null @@ -1,16 +0,0 @@ - License - griffe-pydantic

License¤

ISC License
-
-Copyright (c) 2023, Timothée Mazzucotelli
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted, provided that the above
-copyright notice and this permission notice appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
\ No newline at end of file diff --git a/objects.inv b/objects.inv deleted file mode 100644 index 7882e5c..0000000 --- a/objects.inv +++ /dev/null @@ -1,8 +0,0 @@ -# Sphinx inventory version 2 -# Project: griffe-pydantic -# Version: 0.0.0 -# The remainder of this file is compressed using zlib. -xŒN0 J͌60[^ - v1/i we>랤bYTQj9*Wwu^?: \ No newline at end of file diff --git a/plugins/social/layouts/default.yml b/plugins/social/layouts/default.yml deleted file mode 100644 index d67e318..0000000 --- a/plugins/social/layouts/default.yml +++ /dev/null @@ -1,221 +0,0 @@ -# Copyright (c) 2016-2023 Martin Donath - -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to -# deal in the Software without restriction, including without limitation the -# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -# sell copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: - -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. - -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -# IN THE SOFTWARE. - -# ----------------------------------------------------------------------------- -# Configuration -# ----------------------------------------------------------------------------- - -# Definitions -definitions: - - # Background image - - &background_image >- - {{ layout.background_image or "" }} - - # Background color (default: indigo) - - &background_color >- - {%- if layout.background_color -%} - {{ layout.background_color }} - {%- else -%} - {%- set palette = config.theme.palette or {} -%} - {%- if not palette is mapping -%} - {%- set palette = palette | first -%} - {%- endif -%} - {%- set primary = palette.get("primary", "indigo") -%} - {%- set primary = primary.replace(" ", "-") -%} - {{ { - "red": "#ef5552", - "pink": "#e92063", - "purple": "#ab47bd", - "deep-purple": "#7e56c2", - "indigo": "#4051b5", - "blue": "#2094f3", - "light-blue": "#02a6f2", - "cyan": "#00bdd6", - "teal": "#009485", - "green": "#4cae4f", - "light-green": "#8bc34b", - "lime": "#cbdc38", - "yellow": "#ffec3d", - "amber": "#ffc105", - "orange": "#ffa724", - "deep-orange": "#ff6e42", - "brown": "#795649", - "grey": "#757575", - "blue-grey": "#546d78", - "black": "#000000", - "white": "#ffffff" - }[primary] or "#4051b5" }} - {%- endif -%} - - # Text color (default: white) - - &color >- - {%- if layout.color -%} - {{ layout.color }} - {%- else -%} - {%- set palette = config.theme.palette or {} -%} - {%- if not palette is mapping -%} - {%- set palette = palette | first -%} - {%- endif -%} - {%- set primary = palette.get("primary", "indigo") -%} - {%- set primary = primary.replace(" ", "-") -%} - {{ { - "red": "#ffffff", - "pink": "#ffffff", - "purple": "#ffffff", - "deep-purple": "#ffffff", - "indigo": "#ffffff", - "blue": "#ffffff", - "light-blue": "#ffffff", - "cyan": "#ffffff", - "teal": "#ffffff", - "green": "#ffffff", - "light-green": "#ffffff", - "lime": "#000000", - "yellow": "#000000", - "amber": "#000000", - "orange": "#000000", - "deep-orange": "#ffffff", - "brown": "#ffffff", - "grey": "#ffffff", - "blue-grey": "#ffffff", - "black": "#ffffff", - "white": "#000000" - }[primary] or "#ffffff" }} - {%- endif -%} - - # Font family (default: Roboto) - - &font_family >- - {%- if layout.font_family -%} - {{ layout.font_family }} - {%- elif config.theme.font != false -%} - {{ config.theme.font.get("text", "Roboto") }} - {%- else -%} - Roboto - {%- endif -%} - - # Site name - - &site_name >- - {{ config.site_name }} - - # Page title - - &page_title >- - {{ page.meta.get("title", page.title) }} - - # Page title with site name - - &page_title_with_site_name >- - {%- if not page.is_homepage -%} - {{ page.meta.get("title", page.title) }} - {{ config.site_name }} - {%- else -%} - {{ page.meta.get("title", page.title) }} - {%- endif -%} - - # Page description - - &page_description >- - {{ page.meta.get("description", config.site_description) or "" }} - - # Logo - - &logo >- - {%- if config.theme.logo -%} - {{ config.docs_dir }}/{{ config.theme.logo }} - {%- endif -%} - - # Logo (icon) - - &logo_icon >- - {{ config.theme.icon.logo or "" }} - -# Meta tags -tags: - - # Open Graph - og:type: website - og:title: *page_title_with_site_name - og:description: *page_description - og:image: "{{ image.url }}" - og:image:type: "{{ image.type }}" - og:image:width: "{{ image.width }}" - og:image:height: "{{ image.height }}" - og:url: "{{ page.canonical_url }}" - - # Twitter - twitter:card: summary_large_image - twitter.title: *page_title_with_site_name - twitter:description: *page_description - twitter:image: "{{ image.url }}" - -# ----------------------------------------------------------------------------- -# Specification -# ----------------------------------------------------------------------------- - -# Card size and layers -size: { width: 1200, height: 630 } -layers: - - # Background - - background: - image: *background_image - color: *background_color - - # Logo - - size: { width: 144, height: 144 } - offset: { x: 992, y: 64 } - background: - image: *logo - icon: - value: *logo_icon - color: *color - - # Site name - - size: { width: 832, height: 42 } - offset: { x: 64, y: 64 } - typography: - content: *site_name - color: *color - font: - family: *font_family - style: Bold - - # Page title - - size: { width: 832, height: 310 } - offset: { x: 62, y: 160 } - typography: - content: *page_title - align: start - color: *color - line: - amount: 3 - height: 1.25 - font: - family: *font_family - style: Bold - - # Page description - - size: { width: 832, height: 64 } - offset: { x: 64, y: 512 } - typography: - content: *page_description - align: start - color: *color - line: - amount: 2 - height: 1.5 - font: - family: *font_family - style: Regular diff --git a/plugins/social/layouts/default/accent.yml b/plugins/social/layouts/default/accent.yml deleted file mode 100644 index 99684c7..0000000 --- a/plugins/social/layouts/default/accent.yml +++ /dev/null @@ -1,211 +0,0 @@ -# Copyright (c) 2016-2023 Martin Donath - -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to -# deal in the Software without restriction, including without limitation the -# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -# sell copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: - -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. - -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -# IN THE SOFTWARE. - -# ----------------------------------------------------------------------------- -# Configuration -# ----------------------------------------------------------------------------- - -# Definitions -definitions: - - # Background image - - &background_image >- - {{ layout.background_image or "" }} - - # Background color (default: indigo) - - &background_color >- - {%- if layout.background_color -%} - {{ layout.background_color }} - {%- else -%} - {%- set palette = config.theme.palette or {} -%} - {%- if not palette is mapping -%} - {%- set palette = palette | first -%} - {%- endif -%} - {%- set accent = palette.get("accent", "indigo") -%} - {%- set accent = accent.replace(" ", "-") -%} - {{ { - "red": "#ff1a47", - "pink": "#f50056", - "purple": "#df41fb", - "deep-purple": "#7c4dff", - "indigo": "#526cfe", - "blue": "#4287ff", - "light-blue": "#0091eb", - "cyan": "#00bad6", - "teal": "#00bda4", - "green": "#00c753", - "light-green": "#63de17", - "lime": "#b0eb00", - "yellow": "#ffd500", - "amber": "#ffaa00", - "orange": "#ff9100", - "deep-orange": "#ff6e42" - }[accent] or "#4051b5" }} - {%- endif -%} - - # Text color (default: white) - - &color >- - {%- if layout.color -%} - {{ layout.color }} - {%- else -%} - {%- set palette = config.theme.palette or {} -%} - {%- if not palette is mapping -%} - {%- set palette = palette | first -%} - {%- endif -%} - {%- set accent = palette.get("accent", "indigo") -%} - {%- set accent = accent.replace(" ", "-") -%} - {{ { - "red": "#ffffff", - "pink": "#ffffff", - "purple": "#ffffff", - "deep-purple": "#ffffff", - "indigo": "#ffffff", - "blue": "#ffffff", - "light-blue": "#ffffff", - "cyan": "#ffffff", - "teal": "#ffffff", - "green": "#ffffff", - "light-green": "#ffffff", - "lime": "#000000", - "yellow": "#000000", - "amber": "#000000", - "orange": "#000000", - "deep-orange": "#ffffff" - }[accent] or "#ffffff" }} - {%- endif -%} - - # Font family (default: Roboto) - - &font_family >- - {%- if layout.font_family -%} - {{ layout.font_family }} - {%- elif config.theme.font != false -%} - {{ config.theme.font.get("text", "Roboto") }} - {%- else -%} - Roboto - {%- endif -%} - - # Site name - - &site_name >- - {{ config.site_name }} - - # Page title - - &page_title >- - {{ page.meta.get("title", page.title) }} - - # Page title with site name - - &page_title_with_site_name >- - {%- if not page.is_homepage -%} - {{ page.meta.get("title", page.title) }} - {{ config.site_name }} - {%- else -%} - {{ page.meta.get("title", page.title) }} - {%- endif -%} - - # Page description - - &page_description >- - {{ page.meta.get("description", config.site_description) or "" }} - - # Logo - - &logo >- - {%- if config.theme.logo -%} - {{ config.docs_dir }}/{{ config.theme.logo }} - {%- endif -%} - - # Logo (icon) - - &logo_icon >- - {{ config.theme.icon.logo or "" }} - -# Meta tags -tags: - - # Open Graph - og:type: website - og:title: *page_title_with_site_name - og:description: *page_description - og:image: "{{ image.url }}" - og:image:type: "{{ image.type }}" - og:image:width: "{{ image.width }}" - og:image:height: "{{ image.height }}" - og:url: "{{ page.canonical_url }}" - - # Twitter - twitter:card: summary_large_image - twitter.title: *page_title_with_site_name - twitter:description: *page_description - twitter:image: "{{ image.url }}" - -# ----------------------------------------------------------------------------- -# Specification -# ----------------------------------------------------------------------------- - -# Card size and layers -size: { width: 1200, height: 630 } -layers: - - # Background - - background: - image: *background_image - color: *background_color - - # Logo - - size: { width: 144, height: 144 } - offset: { x: 992, y: 64 } - background: - image: *logo - icon: - value: *logo_icon - color: *color - - # Site name - - size: { width: 832, height: 42 } - offset: { x: 64, y: 64 } - typography: - content: *site_name - color: *color - font: - family: *font_family - style: Bold - - # Page title - - size: { width: 832, height: 310 } - offset: { x: 62, y: 160 } - typography: - content: *page_title - align: start - color: *color - line: - amount: 3 - height: 1.25 - font: - family: *font_family - style: Bold - - # Page description - - size: { width: 832, height: 64 } - offset: { x: 64, y: 512 } - typography: - content: *page_description - align: start - color: *color - line: - amount: 2 - height: 1.5 - font: - family: *font_family - style: Regular diff --git a/plugins/social/layouts/default/invert.yml b/plugins/social/layouts/default/invert.yml deleted file mode 100644 index eddc02e..0000000 --- a/plugins/social/layouts/default/invert.yml +++ /dev/null @@ -1,221 +0,0 @@ -# Copyright (c) 2016-2023 Martin Donath - -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to -# deal in the Software without restriction, including without limitation the -# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -# sell copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: - -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. - -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -# IN THE SOFTWARE. - -# ----------------------------------------------------------------------------- -# Configuration -# ----------------------------------------------------------------------------- - -# Definitions -definitions: - - # Background image - - &background_image >- - {{ layout.background_image or "" }} - - # Background color (default: white) - - &background_color >- - {%- if layout.background_color -%} - {{ layout.background_color }} - {%- else -%} - {%- set palette = config.theme.palette or {} -%} - {%- if not palette is mapping -%} - {%- set palette = palette | first -%} - {%- endif -%} - {%- set primary = palette.get("primary", "indigo") -%} - {%- set primary = primary.replace(" ", "-") -%} - {{ { - "red": "#ffffff", - "pink": "#ffffff", - "purple": "#ffffff", - "deep-purple": "#ffffff", - "indigo": "#ffffff", - "blue": "#ffffff", - "light-blue": "#ffffff", - "cyan": "#ffffff", - "teal": "#ffffff", - "green": "#ffffff", - "light-green": "#ffffff", - "lime": "#000000", - "yellow": "#000000", - "amber": "#000000", - "orange": "#000000", - "deep-orange": "#ffffff", - "brown": "#ffffff", - "grey": "#ffffff", - "blue-grey": "#ffffff", - "black": "#ffffff", - "white": "#000000" - }[primary] or "#ffffff" }} - {%- endif -%} - - # Text color (default: indigo) - - &color >- - {%- if layout.color -%} - {{ layout.color }} - {%- else -%} - {%- set palette = config.theme.palette or {} -%} - {%- if not palette is mapping -%} - {%- set palette = palette | first -%} - {%- endif -%} - {%- set primary = palette.get("primary", "indigo") -%} - {%- set primary = primary.replace(" ", "-") -%} - {{ { - "red": "#ef5552", - "pink": "#e92063", - "purple": "#ab47bd", - "deep-purple": "#7e56c2", - "indigo": "#4051b5", - "blue": "#2094f3", - "light-blue": "#02a6f2", - "cyan": "#00bdd6", - "teal": "#009485", - "green": "#4cae4f", - "light-green": "#8bc34b", - "lime": "#cbdc38", - "yellow": "#ffec3d", - "amber": "#ffc105", - "orange": "#ffa724", - "deep-orange": "#ff6e42", - "brown": "#795649", - "grey": "#757575", - "blue-grey": "#546d78", - "black": "#000000", - "white": "#ffffff" - }[primary] or "#4051b5" }} - {%- endif -%} - - # Font family (default: Roboto) - - &font_family >- - {%- if layout.font_family -%} - {{ layout.font_family }} - {%- elif config.theme.font != false -%} - {{ config.theme.font.get("text", "Roboto") }} - {%- else -%} - Roboto - {%- endif -%} - - # Site name - - &site_name >- - {{ config.site_name }} - - # Page title - - &page_title >- - {{ page.meta.get("title", page.title) }} - - # Page title with site name - - &page_title_with_site_name >- - {%- if not page.is_homepage -%} - {{ page.meta.get("title", page.title) }} - {{ config.site_name }} - {%- else -%} - {{ page.meta.get("title", page.title) }} - {%- endif -%} - - # Page description - - &page_description >- - {{ page.meta.get("description", config.site_description) or "" }} - - # Logo - - &logo >- - {%- if config.theme.logo -%} - {{ config.docs_dir }}/{{ config.theme.logo }} - {%- endif -%} - - # Logo (icon) - - &logo_icon >- - {{ config.theme.icon.logo or "" }} - -# Meta tags -tags: - - # Open Graph - og:type: website - og:title: *page_title_with_site_name - og:description: *page_description - og:image: "{{ image.url }}" - og:image:type: "{{ image.type }}" - og:image:width: "{{ image.width }}" - og:image:height: "{{ image.height }}" - og:url: "{{ page.canonical_url }}" - - # Twitter - twitter:card: summary_large_image - twitter.title: *page_title_with_site_name - twitter:description: *page_description - twitter:image: "{{ image.url }}" - -# ----------------------------------------------------------------------------- -# Specification -# ----------------------------------------------------------------------------- - -# Card size and layers -size: { width: 1200, height: 630 } -layers: - - # Background - - background: - image: *background_image - color: *background_color - - # Logo - - size: { width: 144, height: 144 } - offset: { x: 992, y: 64 } - background: - image: *logo - icon: - value: *logo_icon - color: *color - - # Site name - - size: { width: 832, height: 42 } - offset: { x: 64, y: 64 } - typography: - content: *site_name - color: *color - font: - family: *font_family - style: Bold - - # Page title - - size: { width: 832, height: 310 } - offset: { x: 62, y: 160 } - typography: - content: *page_title - align: start - color: *color - line: - amount: 3 - height: 1.25 - font: - family: *font_family - style: Bold - - # Page description - - size: { width: 832, height: 64 } - offset: { x: 64, y: 512 } - typography: - content: *page_description - align: start - color: *color - line: - amount: 2 - height: 1.5 - font: - family: *font_family - style: Regular diff --git a/plugins/social/layouts/default/variant.yml b/plugins/social/layouts/default/variant.yml deleted file mode 100644 index 158d2e8..0000000 --- a/plugins/social/layouts/default/variant.yml +++ /dev/null @@ -1,232 +0,0 @@ -# Copyright (c) 2016-2023 Martin Donath - -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to -# deal in the Software without restriction, including without limitation the -# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -# sell copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: - -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. - -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -# IN THE SOFTWARE. - -# ----------------------------------------------------------------------------- -# Configuration -# ----------------------------------------------------------------------------- - -# Definitions -definitions: - - # Background image - - &background_image >- - {{ layout.background_image or "" }} - - # Background color (default: indigo) - - &background_color >- - {%- if layout.background_color -%} - {{ layout.background_color }} - {%- else -%} - {%- set palette = config.theme.palette or {} -%} - {%- if not palette is mapping -%} - {%- set palette = palette | first -%} - {%- endif -%} - {%- set primary = palette.get("primary", "indigo") -%} - {%- set primary = primary.replace(" ", "-") -%} - {{ { - "red": "#ef5552", - "pink": "#e92063", - "purple": "#ab47bd", - "deep-purple": "#7e56c2", - "indigo": "#4051b5", - "blue": "#2094f3", - "light-blue": "#02a6f2", - "cyan": "#00bdd6", - "teal": "#009485", - "green": "#4cae4f", - "light-green": "#8bc34b", - "lime": "#cbdc38", - "yellow": "#ffec3d", - "amber": "#ffc105", - "orange": "#ffa724", - "deep-orange": "#ff6e42", - "brown": "#795649", - "grey": "#757575", - "blue-grey": "#546d78", - "black": "#000000", - "white": "#ffffff" - }[primary] or "#4051b5" }} - {%- endif -%} - - # Text color (default: white) - - &color >- - {%- if layout.color -%} - {{ layout.color }} - {%- else -%} - {%- set palette = config.theme.palette or {} -%} - {%- if not palette is mapping -%} - {%- set palette = palette | first -%} - {%- endif -%} - {%- set primary = palette.get("primary", "indigo") -%} - {%- set primary = primary.replace(" ", "-") -%} - {{ { - "red": "#ffffff", - "pink": "#ffffff", - "purple": "#ffffff", - "deep-purple": "#ffffff", - "indigo": "#ffffff", - "blue": "#ffffff", - "light-blue": "#ffffff", - "cyan": "#ffffff", - "teal": "#ffffff", - "green": "#ffffff", - "light-green": "#ffffff", - "lime": "#000000", - "yellow": "#000000", - "amber": "#000000", - "orange": "#000000", - "deep-orange": "#ffffff", - "brown": "#ffffff", - "grey": "#ffffff", - "blue-grey": "#ffffff", - "black": "#ffffff", - "white": "#000000" - }[primary] or "#ffffff" }} - {%- endif -%} - - # Font family (default: Roboto) - - &font_family >- - {%- if layout.font_family -%} - {{ layout.font_family }} - {%- elif config.theme.font != false -%} - {{ config.theme.font.get("text", "Roboto") }} - {%- else -%} - Roboto - {%- endif -%} - - # Site name - - &site_name >- - {{ config.site_name }} - - # Page title - - &page_title >- - {{ page.meta.get("title", page.title) }} - - # Page title with site name - - &page_title_with_site_name >- - {%- if not page.is_homepage -%} - {{ page.meta.get("title", page.title) }} - {{ config.site_name }} - {%- else -%} - {{ page.meta.get("title", page.title) }} - {%- endif -%} - - # Page description - - &page_description >- - {{ page.meta.get("description", config.site_description) or "" }} - - # Page icon - - &page_icon >- - {{ page.meta.icon or "" }} - - # Logo - - &logo >- - {%- if config.theme.logo -%} - {{ config.docs_dir }}/{{ config.theme.logo }} - {%- endif -%} - - # Logo (icon) - - &logo_icon >- - {{ config.theme.icon.logo or "" }} - -# Meta tags -tags: - - # Open Graph - og:type: website - og:title: *page_title_with_site_name - og:description: *page_description - og:image: "{{ image.url }}" - og:image:type: "{{ image.type }}" - og:image:width: "{{ image.width }}" - og:image:height: "{{ image.height }}" - og:url: "{{ page.canonical_url }}" - - # Twitter - twitter:card: summary_large_image - twitter.title: *page_title_with_site_name - twitter:description: *page_description - twitter:image: "{{ image.url }}" - -# ----------------------------------------------------------------------------- -# Specification -# ----------------------------------------------------------------------------- - -# Card size and layers -size: { width: 1200, height: 630 } -layers: - - # Background - - background: - image: *background_image - color: *background_color - - # Page icon - - size: { width: 630, height: 630 } - offset: { x: 800, y: 0 } - icon: - value: *page_icon - color: "#00000033" - - # Logo - - size: { width: 64, height: 64 } - offset: { x: 64, y: 64 } - background: - image: *logo - icon: - value: *logo_icon - color: *color - - # Site name - - size: { width: 768, height: 42 } - offset: { x: 160, y: 74 } - typography: - content: *site_name - color: *color - font: - family: *font_family - style: Bold - - # Page title - - size: { width: 864, height: 256 } - offset: { x: 62, y: 192 } - typography: - content: *page_title - align: start - color: *color - line: - amount: 3 - height: 1.25 - font: - family: *font_family - style: Bold - - # Page description - - size: { width: 864, height: 64 } - offset: { x: 64, y: 512 } - typography: - content: *page_description - align: start - color: *color - line: - amount: 2 - height: 1.5 - font: - family: *font_family - style: Regular diff --git a/reference/SUMMARY.txt b/reference/SUMMARY.txt deleted file mode 100644 index 0f2cb35..0000000 --- a/reference/SUMMARY.txt +++ /dev/null @@ -1,2 +0,0 @@ -* [ griffe_pydantic](griffe_pydantic/index.md) - * [ extension](griffe_pydantic/extension.md) diff --git a/reference/griffe_pydantic/extension/index.html b/reference/griffe_pydantic/extension/index.html deleted file mode 100644 index c15887e..0000000 --- a/reference/griffe_pydantic/extension/index.html +++ /dev/null @@ -1,14 +0,0 @@ - extension - griffe-pydantic

extension ¤

Griffe extension for Pydantic.

PydanticExtension ¤

PydanticExtension(*, schema: bool = False) -> None
-

Bases: Extension

Griffe extension for Pydantic.

Parameters:

  • schema (bool) –

    Whether to compute and store the JSON schema of models.

on_attribute_instance ¤

on_attribute_instance(
-    node: ast.AST | ObjectNode, attr: Attribute
-) -> None
-

Handle Pydantic fields.

on_class_instance ¤

on_class_instance(
-    node: ast.AST | ObjectNode, cls: Class
-) -> None
-

Detect and prepare Pydantic models.

on_class_members ¤

on_class_members(
-    node: ast.AST | ObjectNode, cls: Class
-) -> None
-

Finalize the Pydantic model data.

on_function_instance ¤

on_function_instance(
-    node: ast.AST | ObjectNode, func: Function
-) -> None
-

Handle Pydantic field validators.

\ No newline at end of file diff --git a/reference/griffe_pydantic/index.html b/reference/griffe_pydantic/index.html deleted file mode 100644 index f7a03f6..0000000 --- a/reference/griffe_pydantic/index.html +++ /dev/null @@ -1,15 +0,0 @@ - Index - griffe-pydantic

griffe_pydantic ¤

griffe-pydantic package.

Griffe extension for Pydantic.

PydanticExtension ¤

PydanticExtension(*, schema: bool = False) -> None
-

Bases: Extension

Griffe extension for Pydantic.

Parameters:

  • schema (bool) –

    Whether to compute and store the JSON schema of models.

on_attribute_instance ¤

on_attribute_instance(
-    node: ast.AST | ObjectNode, attr: Attribute
-) -> None
-

Handle Pydantic fields.

on_class_instance ¤

on_class_instance(
-    node: ast.AST | ObjectNode, cls: Class
-) -> None
-

Detect and prepare Pydantic models.

on_class_members ¤

on_class_members(
-    node: ast.AST | ObjectNode, cls: Class
-) -> None
-

Finalize the Pydantic model data.

on_function_instance ¤

on_function_instance(
-    node: ast.AST | ObjectNode, func: Function
-) -> None
-

Handle Pydantic field validators.

get_templates_path ¤

get_templates_path() -> Path
-

Return the templates directory path.

\ No newline at end of file diff --git a/search/search_index.json b/search/search_index.json deleted file mode 100644 index bb68933..0000000 --- a/search/search_index.json +++ /dev/null @@ -1 +0,0 @@ -{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"],"fields":{"title":{"boost":1000.0},"text":{"boost":1.0},"tags":{"boost":1000000.0}}},"docs":[{"location":"","title":"griffe-pydantic","text":"

Griffe extension for Pydantic.

"},{"location":"#installation","title":"Installation","text":"

With pip:

pip install griffe-pydantic\n

With pipx:

python3.8 -m pip install --user pipx\npipx install griffe-pydantic\n

"},{"location":"#usage","title":"Usage","text":""},{"location":"#command-line","title":"Command-line","text":"
griffe dump mypackage -e griffe_pydantic\n

See command-line usage in Griffe's documentation.

"},{"location":"#python","title":"Python","text":"
import griffe\n\ngriffe.load(\n    \"mypackage\",\n    extensions=griffe.load_extensions(\n        [{\"griffe_pydantic\": {\"schema\": True}}]\n    )\n)\n

See programmatic usage in Griffe's documentation.

"},{"location":"#mkdocs","title":"MkDocs","text":"mkdocs.yml
plugins:\n- mkdocstrings:\nhandlers:\npython:\noptions:\nextensions:\n- griffe_pydantic:\nschema: true\n

See MkDocs usage in Griffe's documentation.

"},{"location":"#examples","title":"Examples","text":"Pydantic modelWithout extensionWith extension

from pydantic import field_validator, ConfigDict, BaseModel, Field\n\n\nclass ExampleModel(BaseModel):\n\"\"\"An example model.\"\"\"\n\n    model_config = ConfigDict(frozen=False)\n\n    field_without_default: str\n\"\"\"Shows the *[Required]* marker in the signature.\"\"\"\n\n    field_plain_with_validator: int = 100\n\"\"\"Show standard field with type annotation.\"\"\"\n\n    field_with_validator_and_alias: str = Field(\"FooBar\", alias=\"BarFoo\", validation_alias=\"BarFoo\")\n\"\"\"Shows corresponding validator with link/anchor.\"\"\"\n\n    field_with_constraints_and_description: int = Field(\n        default=5, ge=0, le=100, description=\"Shows constraints within doc string.\"\n    )\n\n    @field_validator(\"field_with_validator_and_alias\", \"field_without_default\")\n    @classmethod\n    def check_max_length_ten(cls, v) -> str:\n\"\"\"Show corresponding field with link/anchor.\"\"\"\n        if len(v) >= 10:\n            raise ValueError(\"No more than 10 characters allowed\")\n        return v\n

"},{"location":"#model_noext.ExampleModel","title":"ExampleModel","text":"

Bases: BaseModel

An example model.

"},{"location":"#model_noext.ExampleModel.field_plain_with_validator","title":"field_plain_with_validator class-attribute instance-attribute","text":"
field_plain_with_validator: int = 100\n

Show standard field with type annotation.

"},{"location":"#model_noext.ExampleModel.field_with_validator_and_alias","title":"field_with_validator_and_alias class-attribute instance-attribute","text":"
field_with_validator_and_alias: str = Field(\n    \"FooBar\", alias=\"BarFoo\", validation_alias=\"BarFoo\"\n)\n

Shows corresponding validator with link/anchor.

"},{"location":"#model_noext.ExampleModel.field_without_default","title":"field_without_default instance-attribute","text":"
field_without_default: str\n

Shows the [Required] marker in the signature.

"},{"location":"#model_noext.ExampleModel.check_max_length_ten","title":"check_max_length_ten classmethod","text":"
check_max_length_ten(v) -> str\n

Show corresponding field with link/anchor.

"},{"location":"#model_noext.ExampleModel","title":"Overview","text":""},{"location":"#model_noext.ExampleModel.field_plain_with_validator","title":"Overview","text":""},{"location":"#model_noext.ExampleModel.field_with_validator_and_alias","title":"Overview","text":""},{"location":"#model_noext.ExampleModel.field_without_default","title":"Overview","text":""},{"location":"#model_noext.ExampleModel.check_max_length_ten","title":"Overview","text":""},{"location":"#model_ext.ExampleModel","title":"ExampleModel pydantic-model","text":"

Bases: BaseModel

An example model.

Config:

  • frozen: False

Fields:

  • field_without_default (str)
  • field_plain_with_validator (int)
  • field_with_validator_and_alias (str)
  • field_with_constraints_and_description (int)

Validators:

  • check_max_length_ten \u2192 field_with_validator_and_alias, field_without_default
"},{"location":"#model_ext.ExampleModel.field_plain_with_validator","title":"field_plain_with_validator pydantic-field","text":"
field_plain_with_validator: int\n

Show standard field with type annotation.

"},{"location":"#model_ext.ExampleModel.field_with_constraints_and_description","title":"field_with_constraints_and_description pydantic-field","text":"
field_with_constraints_and_description: int = 5\n

Shows constraints within doc string.

"},{"location":"#model_ext.ExampleModel.field_with_validator_and_alias","title":"field_with_validator_and_alias pydantic-field","text":"
field_with_validator_and_alias: str\n

Shows corresponding validator with link/anchor.

"},{"location":"#model_ext.ExampleModel.field_without_default","title":"field_without_default pydantic-field","text":"
field_without_default: str\n

Shows the [Required] marker in the signature.

"},{"location":"#model_ext.ExampleModel.check_max_length_ten","title":"check_max_length_ten pydantic-validator","text":"
check_max_length_ten(v) -> str\n

Show corresponding field with link/anchor.

"},{"location":"#model_ext.ExampleModel","title":"Overview","text":""},{"location":"#model_ext.ExampleModel.field_plain_with_validator","title":"Overview","text":""},{"location":"#model_ext.ExampleModel.field_with_constraints_and_description","title":"Overview","text":""},{"location":"#model_ext.ExampleModel.field_with_validator_and_alias","title":"Overview","text":""},{"location":"#model_ext.ExampleModel.field_without_default","title":"Overview","text":""},{"location":"#model_ext.ExampleModel.check_max_length_ten","title":"Overview","text":""},{"location":"changelog/","title":"Changelog","text":"

All notable changes to this project will be documented in this file.

The format is based on Keep a Changelog and this project adheres to Semantic Versioning.

"},{"location":"code_of_conduct/","title":"Contributor Covenant Code of Conduct","text":""},{"location":"code_of_conduct/#our-pledge","title":"Our Pledge","text":"

We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, caste, color, religion, or sexual identity and orientation.

We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community.

"},{"location":"code_of_conduct/#our-standards","title":"Our Standards","text":"

Examples of behavior that contributes to a positive environment for our community include:

  • Demonstrating empathy and kindness toward other people
  • Being respectful of differing opinions, viewpoints, and experiences
  • Giving and gracefully accepting constructive feedback
  • Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience
  • Focusing on what is best not just for us as individuals, but for the overall community

Examples of unacceptable behavior include:

  • The use of sexualized language or imagery, and sexual attention or advances of any kind
  • Trolling, insulting or derogatory comments, and personal or political attacks
  • Public or private harassment
  • Publishing others' private information, such as a physical or email address, without their explicit permission
  • Other conduct which could reasonably be considered inappropriate in a professional setting
"},{"location":"code_of_conduct/#enforcement-responsibilities","title":"Enforcement Responsibilities","text":"

Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful.

Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate.

"},{"location":"code_of_conduct/#scope","title":"Scope","text":"

This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event.

"},{"location":"code_of_conduct/#enforcement","title":"Enforcement","text":"

Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at pawamoy@pm.me. All complaints will be reviewed and investigated promptly and fairly.

All community leaders are obligated to respect the privacy and security of the reporter of any incident.

"},{"location":"code_of_conduct/#enforcement-guidelines","title":"Enforcement Guidelines","text":"

Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct:

"},{"location":"code_of_conduct/#1-correction","title":"1. Correction","text":"

Community Impact: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community.

Consequence: A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested.

"},{"location":"code_of_conduct/#2-warning","title":"2. Warning","text":"

Community Impact: A violation through a single incident or series of actions.

Consequence: A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban.

"},{"location":"code_of_conduct/#3-temporary-ban","title":"3. Temporary Ban","text":"

Community Impact: A serious violation of community standards, including sustained inappropriate behavior.

Consequence: A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban.

"},{"location":"code_of_conduct/#4-permanent-ban","title":"4. Permanent Ban","text":"

Community Impact: Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals.

Consequence: A permanent ban from any sort of public interaction within the community.

"},{"location":"code_of_conduct/#attribution","title":"Attribution","text":"

This Code of Conduct is adapted from the Contributor Covenant, version 2.1, available at https://www.contributor-covenant.org/version/2/1/code_of_conduct.html.

Community Impact Guidelines were inspired by Mozilla's code of conduct enforcement ladder.

For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq. Translations are available at https://www.contributor-covenant.org/translations.

"},{"location":"contributing/","title":"Contributing","text":"

Contributions are welcome, and they are greatly appreciated! Every little bit helps, and credit will always be given.

"},{"location":"contributing/#environment-setup","title":"Environment setup","text":"

Nothing easier!

Fork and clone the repository, then:

cd griffe-pydantic\nmake setup\n

Note

If it fails for some reason, you'll need to install PDM manually.

You can install it with:

python3 -m pip install --user pipx\npipx install pdm\n

Now you can try running make setup again, or simply pdm install.

You now have the dependencies installed.

Run make help to see all the available actions!

"},{"location":"contributing/#tasks","title":"Tasks","text":"

This project uses duty to run tasks. A Makefile is also provided. The Makefile will try to run certain tasks on multiple Python versions. If for some reason you don't want to run the task on multiple Python versions, you run the task directly with pdm run duty TASK.

The Makefile detects if a virtual environment is activated, so make will work the same with the virtualenv activated or not.

If you work in VSCode, see examples of tasks and run configurations.

"},{"location":"contributing/#development","title":"Development","text":"

As usual:

  1. create a new branch: git switch -c feature-or-bugfix-name
  2. edit the code and/or the documentation

Before committing:

  1. run make format to auto-format the code
  2. run make check to check everything (fix any warning)
  3. run make test to run the tests (fix any issue)
  4. if you updated the documentation or the project dependencies:
    1. run make docs
    2. go to http://localhost:8000 and check that everything looks good
  5. follow our commit message convention

If you are unsure about how to fix or ignore a warning, just let the continuous integration fail, and we will help you during review.

Don't bother updating the changelog, we will take care of this.

"},{"location":"contributing/#commit-message-convention","title":"Commit message convention","text":"

Commit messages must follow our convention based on the Angular style or the Karma convention:

<type>[(scope)]: Subject\n\n[Body]\n

Subject and body must be valid Markdown. Subject must have proper casing (uppercase for first letter if it makes sense), but no dot at the end, and no punctuation in general.

Scope and body are optional. Type can be:

  • build: About packaging, building wheels, etc.
  • chore: About packaging or repo/files management.
  • ci: About Continuous Integration.
  • deps: Dependencies update.
  • docs: About documentation.
  • feat: New feature.
  • fix: Bug fix.
  • perf: About performance.
  • refactor: Changes that are not features or bug fixes.
  • style: A change in code style/format.
  • tests: About tests.

If you write a body, please add trailers at the end (for example issues and PR references, or co-authors), without relying on GitHub's flavored Markdown:

Body.\n\nIssue #10: https://github.com/namespace/project/issues/10\nRelated to PR namespace/other-project#15: https://github.com/namespace/other-project/pull/15\n

These \"trailers\" must appear at the end of the body, without any blank lines between them. The trailer title can contain any character except colons :. We expect a full URI for each trailer, not just GitHub autolinks (for example, full GitHub URLs for commits and issues, not the hash or the #issue-number).

We do not enforce a line length on commit messages summary and body, but please avoid very long summaries, and very long lines in the body, unless they are part of code blocks that must not be wrapped.

"},{"location":"contributing/#pull-requests-guidelines","title":"Pull requests guidelines","text":"

Link to any related issue in the Pull Request message.

During the review, we recommend using fixups:

# SHA is the SHA of the commit you want to fix\ngit commit --fixup=SHA\n

Once all the changes are approved, you can squash your commits:

git rebase -i --autosquash main\n

And force-push:

git push -f\n

If this seems all too complicated, you can push or force-push each new commit, and we will squash them ourselves if needed, before merging.

"},{"location":"credits/","title":"Credits","text":""},{"location":"credits/#exec-2--credits","title":"Credits","text":"

These projects were used to build griffe-pydantic. Thank you!

python | pdm | copier-pdm

"},{"location":"credits/#exec-2--runtime-dependencies","title":"Runtime dependencies","text":"Project Summary Version (accepted) Version (last resolved) License colorama Cross-platform colored terminal text. >=0.4 0.4.6 BSD License griffe Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API. >=0.32.0 0.32.0 ISC"},{"location":"credits/#exec-2--development-dependencies","title":"Development dependencies","text":"Project Summary Version (accepted) Version (last resolved) License annotated-types Reusable constraint types to use with typing.Annotated >=0.4.0 0.5.0 MIT License ansimarkup Produce colored terminal text with an xml-like markup ~=1.4 1.5.0 Revised BSD License babel Internationalization utilities >=2.10.3 2.12.1 BSD beautifulsoup4 Screen-scraping library 4.12.2 MIT License black The uncompromising code formatter. >=23.1 23.7.0 MIT blacken-docs Run Black on Python code blocks in documentation files. >=1.13 1.15.0 MIT certifi Python package for providing Mozilla's CA Bundle. >=2017.4.17 2023.5.7 MPL-2.0 charset-normalizer The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet. <4,>=2 3.2.0 MIT click Composable command line interface toolkit >=8.0.0 8.1.4 BSD-3-Clause colorama Cross-platform colored terminal text. ; platform_system == \"Windows\" 0.4.6 BSD License coverage Code coverage measurement for Python [toml]>=5.2.1 7.2.7 Apache-2.0 csscompressor A python port of YUI CSS Compressor >=0.9.5 0.9.5 BSD cssselect cssselect parses CSS3 Selectors and translates them to XPath 1.0 >=1.2.0 1.2.0 BSD dparse A parser for Python dependency files >=0.6.2 0.6.3 MIT license duty A simple task runner. >=0.10 1.0.0 ISC exceptiongroup Backport of PEP 654 (exception groups) >=1.0.0rc8; python_version < \"3.11\" 1.1.2 ? execnet execnet: rapid multi-Python deployment >=1.1 2.0.2 MIT License failprint Run a command, print its output only if it fails. >=0.11 0.11.1 ISC ghp-import Copy your docs directly to the gh-pages branch. >=1.0 2.1.0 Apache Software License git-changelog Automatic Changelog generator using Jinja2 templates. >=1.0 2.0.0 ISC gitdb Git Object Database <5,>=4.0.1 4.0.10 BSD License gitpython GitPython is a Python library used to interact with Git repositories 3.1.32 BSD griffe Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API. >=0.24 0.32.0 ISC htmlmin2 An HTML Minifier >=0.1.13 0.1.13 BSD idna Internationalized Domain Names in Applications (IDNA) <4,>=2.5 3.4 BSD License importlib-metadata Read metadata from Python packages >=4.3; python_version < \"3.10\" 6.8.0 ? iniconfig brain-dead simple config-ini parsing 2.0.0 MIT License jinja2 A very fast and expressive template engine. <4,>=2.11 3.1.2 BSD-3-Clause jsmin JavaScript minifier. >=3.0.1 3.0.1 MIT License lxml Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API. >=4.6 4.9.3 BSD-3-Clause markdown Python implementation of Markdown. <4.0.0,>=3.3.3 3.3.7 BSD License markdown-callouts Markdown extension: a classier syntax for admonitions >=0.2 0.3.0 MIT markdown-exec Utilities to execute code blocks in Markdown files. >=0.5 1.6.0.1.0.0 ISC markdown2 A fast and complete Python implementation of Markdown >=2.4.3 2.4.9 MIT markupsafe Safely add untrusted strings to HTML/XML markup. >=2.0 2.1.3 BSD-3-Clause mergedeep A deep merge function for \ud83d\udc0d. >=1.3.4 1.3.4 MIT License mkdocs Project documentation with Markdown. >=1.3 1.4.3 BSD License mkdocs-coverage MkDocs plugin to integrate your coverage HTML report into your site. >=0.2 0.2.7 ISC mkdocs-gen-files MkDocs plugin to programmatically generate documentation pages during the build >=0.3 0.5.0 MIT License mkdocs-git-committers-plugin-2 An MkDocs plugin to create a list of contributors on the page >=1.1 1.1.2 MIT mkdocs-literate-nav MkDocs plugin to specify the navigation in Markdown instead of YAML >=0.4 0.6.0 MIT License mkdocs-material Documentation that simply works >=7.3 9.1.18+insiders.4.36.1 MIT License mkdocs-material-extensions Extension pack for Python Markdown and MkDocs Material. >=1.1 1.1.1 MIT License mkdocs-minify-plugin An MkDocs plugin to minify HTML, JS or CSS files prior to being written to disk >=0.6.4 0.6.4 MIT mkdocstrings Automatic documentation from sources, for MkDocs. [python]>=0.18 0.22.0 ISC mkdocstrings-python A Python handler for mkdocstrings. >=0.5.2 1.1.2.1.1.1 ISC mypy Optional static typing for Python >=0.910 1.4.1 MIT License mypy-extensions Type system extensions for programs checked with the mypy type checker. >=0.4.3 1.0.0 MIT License packaging Core utilities for Python packages >=22.0 23.1 BSD License paginate Divides large result sets into pages for easier browsing >=0.5.6 0.5.6 MIT pathspec Utility library for gitignore style pattern matching of file paths. >=0.9.0 0.11.1 Mozilla Public License 2.0 (MPL 2.0) pipdeptree Command line utility to show dependency tree of packages. >=2.3 2.9.5 MIT License platformdirs A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\". >=2 3.8.1 MIT License pluggy plugin and hook calling mechanisms for python <2.0,>=0.12 1.2.0 MIT ptyprocess Run a subprocess in a pseudo terminal ~=0.6; sys_platform != \"win32\" 0.7.0 ISC License (ISCL) pydantic Data validation using Python type hints >=2.0.2 2.0.2 MIT License pydantic-core ==2.1.2 2.1.2 MIT pygments Pygments is a syntax highlighting package written in Python. >=2.14 2.15.1 BSD-2-Clause pymdown-extensions Extension pack for Python Markdown. >=9 10.0.1 MIT License pyquery A jquery-like library for python >=1.2 2.0.0 BSD pytest pytest: simple powerful testing with Python >=6.2 7.4.0 MIT pytest-cov Pytest plugin for measuring coverage. >=3.0 4.1.0 MIT pytest-randomly Pytest plugin to randomly order tests and control random.seed. >=3.10 3.13.0 MIT pytest-xdist pytest xdist plugin for distributed testing, most importantly across multiple CPUs >=2.4 3.3.1 MIT python-dateutil Extensions to the standard Python datetime module >=2.8.1 2.8.2 Dual License pytz World timezone definitions, modern and historical >=2015.7; python_version < \"3.9\" 2023.3 ? pyyaml YAML parser and emitter for Python >=5.1 6.0 MIT pyyaml-env-tag A custom YAML tag for referencing environment variables in YAML files. >=0.1 0.1 MIT License readtime Calculates the time some text takes the average human to read, based on Medium's read time forumula >=2.0 2.0.0 BSD regex Alternative regular expression module, to replace re. >=2022.4.24 2023.6.3 Apache Software License requests Python HTTP for Humans. 2.31.0 Apache 2.0 ruamel-yaml ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order >=0.17.21 0.17.32 MIT license ruamel-yaml-clib C version of reader, parser and emitter for ruamel.yaml derived from libyaml >=0.2.7; platform_python_implementation == \"CPython\" and python_version < \"3.12\" 0.2.7 MIT ruff An extremely fast Python linter, written in Rust. >=0.0.246 0.0.278 MIT safety Checks installed dependencies for known vulnerabilities and licenses. >=2 2.3.4 MIT license semver Python helper for Semantic Versioning (https://semver.org) >=2.13 3.0.1 BSD setuptools Easily download, build, install, upgrade, and uninstall Python packages >=19.3 68.0.0 MIT License six Python 2 and 3 compatibility utilities >=1.5 1.16.0 MIT smmap A pure Python implementation of a sliding window memory map manager <6,>=3.0.1 5.0.0 BSD soupsieve A modern CSS selector implementation for Beautiful Soup. >1.2 2.4.1 MIT License toml Python Library for Tom's Obvious, Minimal Language >=0.10 0.10.2 MIT tomli A lil' TOML parser >=1.1.0; python_version < \"3.11\" 2.0.1 ? types-markdown Typing stubs for Markdown >=3.3 3.4.2.9 Apache-2.0 license types-pyyaml Typing stubs for PyYAML >=6.0 6.0.12.10 Apache-2.0 license types-toml Typing stubs for toml >=0.10 0.10.8.6 Apache-2.0 license typing-extensions Backported and Experimental Type Hints for Python 3.7+ >=3.10.0.0; python_version < \"3.10\" 4.7.1 Python Software Foundation License urllib3 HTTP library with thread-safe connection pooling, file post, and more. <3,>=1.21.1 2.0.3 MIT License watchdog Filesystem events monitoring >=2.0 3.0.0 Apache License 2.0 zipp Backport of pathlib-compatible object wrapper for zip files >=0.5 3.16.1 ?

More credits from the author

"},{"location":"license/","title":"License","text":"
ISC License\n\nCopyright (c) 2023, Timoth\u00e9e Mazzucotelli\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\nWITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\nANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\nWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\nACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\nOR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n
"},{"location":"insiders/","title":"Insiders","text":"

griffe-pydantic follows the sponsorware release strategy, which means that new features are first exclusively released to sponsors as part of Insiders. Read on to learn what sponsorships achieve, how to become a sponsor to get access to Insiders, and what's in it for you!

"},{"location":"insiders/#what-is-insiders","title":"What is Insiders?","text":"

griffe-pydantic Insiders is a private fork of griffe-pydantic, hosted as a private GitHub repository. Almost1 all new features are developed as part of this fork, which means that they are immediately available to all eligible sponsors, as they are made collaborators of this repository.

Every feature is tied to a funding goal in monthly subscriptions. When a funding goal is hit, the features that are tied to it are merged back into griffe-pydantic and released for general availability, making them available to all users. Bugfixes are always released in tandem.

Sponsorships start as low as $10 a month.2

"},{"location":"insiders/#what-sponsorships-achieve","title":"What sponsorships achieve","text":"

Sponsorships make this project sustainable, as they buy the maintainers of this project time \u2013 a very scarce resource \u2013 which is spent on the development of new features, bug fixing, stability improvement, issue triage and general support. The biggest bottleneck in Open Source is time.3

If you're unsure if you should sponsor this project, check out the list of completed funding goals to learn whether you're already using features that were developed with the help of sponsorships. You're most likely using at least a handful of them, thanks to our awesome sponsors!

"},{"location":"insiders/#whats-in-it-for-me","title":"What's in it for me?","text":"

The moment you become a sponsor, you'll get immediate access to 1 additional features that you can start using right away, and which are currently exclusively available to sponsors:

  • [Project] Griffe extension for Pydantic
"},{"location":"insiders/#how-to-become-a-sponsor","title":"How to become a sponsor","text":"

Thanks for your interest in sponsoring! In order to become an eligible sponsor with your GitHub account, visit pawamoy's sponsor profile, and complete a sponsorship of $10 a month or more. You can use your individual or organization GitHub account for sponsoring.

Important: If you're sponsoring @pawamoy through a GitHub organization, please send a short email to pawamoy@pm.me with the name of your organization and the GitHub account of the individual that should be added as a collaborator.4

You can cancel your sponsorship anytime.5

\u00a0 Join our awesome sponsors

If you sponsor publicly, you're automatically added here with a link to your profile and avatar to show your support for griffe-pydantic. Alternatively, if you wish to keep your sponsorship private, you'll be a silent +1. You can select visibility during checkout and change it afterwards.

"},{"location":"insiders/#funding","title":"Funding","text":""},{"location":"insiders/#goals","title":"Goals","text":"

The following section lists all funding goals. Each goal contains a list of features prefixed with a checkmark symbol, denoting whether a feature is already available or planned, but not yet implemented. When the funding goal is hit, the features are released for general availability.

"},{"location":"insiders/#1000-gravifridge-user-manual","title":"$ 1,000 \u2014 GraviFridge User Manual","text":"
  • [Project] Griffe extension for Pydantic
"},{"location":"insiders/#goals-completed","title":"Goals completed","text":"

This section lists all funding goals that were previously completed, which means that those features were part of Insiders, but are now generally available and can be used by all users.

"},{"location":"insiders/#frequently-asked-questions","title":"Frequently asked questions","text":""},{"location":"insiders/#compatibility","title":"Compatibility","text":"

We're building an open source project and want to allow outside collaborators to use griffe-pydantic locally without having access to Insiders. Is this still possible?

Yes. Insiders is compatible with griffe-pydantic. Almost all new features and configuration options are either backward-compatible or implemented behind feature flags. Most Insiders features enhance the overall experience, though while these features add value for the users of your project, they shouldn't be necessary for previewing when making changes to content.

"},{"location":"insiders/#payment","title":"Payment","text":"

We don't want to pay for sponsorship every month. Are there any other options?

Yes. You can sponsor on a yearly basis by switching your GitHub account to a yearly billing cycle. If for some reason you cannot do that, you could also create a dedicated GitHub account with a yearly billing cycle, which you only use for sponsoring (some sponsors already do that).

If you have any problems or further questions, please reach out to pawamoy@pm.me.

"},{"location":"insiders/#terms","title":"Terms","text":"

Are we allowed to use Insiders under the same terms and conditions as griffe-pydantic?

Yes. Whether you're an individual or a company, you may use griffe-pydantic Insiders precisely under the same terms as griffe-pydantic, which are given by the ISC License. However, we kindly ask you to respect our fair use policy:

  • Please don't distribute the source code of Insiders. You may freely use it for public, private or commercial projects, privately fork or mirror it, but please don't make the source code public, as it would counteract the sponsorware strategy.

  • If you cancel your subscription, you're automatically removed as a collaborator and will miss out on all future updates of Insiders. However, you may use the latest version that's available to you as long as you like. Just remember that GitHub deletes private forks.

  1. In general, every new feature is first exclusively released to sponsors, but sometimes upstream dependencies enhance existing features that must be supported by griffe-pydantic.\u00a0\u21a9

  2. Note that $10 a month is the minimum amount to become eligible for Insiders. While GitHub Sponsors also allows to sponsor lower amounts or one-time amounts, those can't be granted access to Insiders due to technical reasons. Such contributions are still very much welcome as they help ensuring the project's sustainability.\u00a0\u21a9

  3. Making an Open Source project sustainable is exceptionally hard: maintainers burn out, projects are abandoned. That's not great and very unpredictable. The sponsorware model ensures that if you decide to use griffe-pydantic, you can be sure that bugs are fixed quickly and new features are added regularly.\u00a0\u21a9

  4. It's currently not possible to grant access to each member of an organization, as GitHub only allows for adding users. Thus, after sponsoring, please send an email to pawamoy@pm.me, stating which account should become a collaborator of the Insiders repository. We're working on a solution which will make access to organizations much simpler. To ensure that access is not tied to a particular individual GitHub account, create a bot account (i.e. a GitHub account that is not tied to a specific individual), and use this account for the sponsoring. After being added to the list of collaborators, the bot account can create a private fork of the private Insiders GitHub repository, and grant access to all members of the organizations.\u00a0\u21a9

  5. If you cancel your sponsorship, GitHub schedules a cancellation request which will become effective at the end of the billing cycle. This means that even though you cancel your sponsorship, you will keep your access to Insiders as long as your cancellation isn't effective. All charges are processed by GitHub through Stripe. As we don't receive any information regarding your payment, and GitHub doesn't offer refunds, sponsorships are non-refundable.\u00a0\u21a9

"},{"location":"insiders/changelog/","title":"Changelog","text":""},{"location":"insiders/changelog/#griffe-pydantic-insiders","title":"griffe-pydantic Insiders","text":""},{"location":"insiders/changelog/#1.0.0a0","title":"1.0.0a0 July 13, 2023","text":"
  • Release first Insiders version (alpha)
"},{"location":"insiders/installation/","title":"Getting started with Insiders","text":"

griffe-pydantic Insiders is a compatible drop-in replacement for griffe-pydantic, and can be installed similarly using pip or git. Note that in order to access the Insiders repository, you need to become an eligible sponsor of @pawamoy on GitHub.

"},{"location":"insiders/installation/#installation","title":"Installation","text":""},{"location":"insiders/installation/#with-pip-sshhttps","title":"with pip (ssh/https)","text":"

griffe-pydantic Insiders can be installed with pip using SSH:

pip install git+ssh://git@github.com/pawamoy-insiders/griffe-pydantic.git\n

Or using HTTPS:

pip install git+https://${GH_TOKEN}@github.com/pawamoy-insiders/griffe-pydantic.git\n
How to get a GitHub personal access token

The GH_TOKEN environment variable is a GitHub token. It can be obtained by creating a personal access token for your GitHub account. It will give you access to the Insiders repository, programmatically, from the command line or GitHub Actions workflows:

  1. Go to https://github.com/settings/tokens
  2. Click on Generate a new token
  3. Enter a name and select the repo scope
  4. Generate the token and store it in a safe place

Note that the personal access token must be kept secret at all times, as it allows the owner to access your private repositories.

"},{"location":"insiders/installation/#with-pip-self-hosted","title":"with pip (self-hosted)","text":"

Self-hosting the Insiders package makes it possible to depend on griffe-pydantic normally, while transparently downloading and installing the Insiders version locally. It means that you can specify your dependencies normally, and your contributors without access to Insiders will get the public version, while you get the Insiders version on your machine.

Limitation

With this method, there is no way to force the installation of an Insiders version rather than a public version. If there is a public version that is more recent than your self-hosted Insiders version, the public version will take precedence. Remember to regularly update your self-hosted versions by uploading latest distributions.

You can build the distributions for Insiders yourself, by cloning the repository and using build to build the distributions, or you can download them from our GitHub Releases. You can upload these distributions to a private PyPI-like registry (Artifactory, Google Cloud, pypiserver, etc.) with Twine:

# download distributions in ~/dists, then upload with:\ntwine upload --repository-url https://your-private-index.com ~/dists/*\n

You might also need to provide a username and password/token to authenticate against the registry. Please check Twine's documentation.

You can then configure pip (or other tools) to look for packages into your package index. For example, with pip:

pip config set global.extra-index-url https://your-private-index.com/simple\n

Note that the URL might differ depending on whether your are uploading a package (with Twine) or installing a package (with pip), and depending on the registry you are using (Artifactory, Google Cloud, etc.). Please check the documentation of your registry to learn how to configure your environment.

We kindly ask that you do not upload the distributions to public registries, as it is against our Terms of use.

Full example with pypiserver

In this example we use pypiserver to serve a local PyPI index.

pip install --user pypiserver\n# or pipx install pypiserver\n\n# create a packages directory\nmkdir -p ~/.local/pypiserver/packages\n\n# run the pypi server without authentication\npypi-server run -p 8080 -a . -P . ~/.local/pypiserver/packages &\n

We can configure the credentials to access the server in ~/.pypirc:

.pypirc
[distutils]\nindex-servers =\nlocal\n\n[local]\nrepository: http://localhost:8080\nusername:\npassword:\n

We then clone the Insiders repository, build distributions and upload them to our local server:

# clone the repository\ngit clone git@github.com:pawamoy-insiders/griffe-pydantic\ncd griffe-pydantic\n\n# install build\npip install --user build\n# or pipx install build\n\n# checkout latest tag\ngit checkout $(git describe --tags --abbrev=0)\n\n# build the distributions\npyproject-build\n\n# upload them to our local server\ntwine upload -r local dist/* --skip-existing\n

Finally, we configure pip, and for example PDM, to use our local index to find packages:

pip config set global.extra-index-url http://localhost:8080/simple\npdm config pypi.extra.url http://localhost:8080/simple\n

Now when running pip install griffe-pydantic, or resolving dependencies with PDM, both tools will look into our local index and find the Insiders version. Remember to update your local index regularly!

"},{"location":"insiders/installation/#with-git","title":"with git","text":"

Of course, you can use griffe-pydantic Insiders directly from git:

git clone git@github.com:pawamoy-insiders/griffe-pydantic\n

When cloning from git, the package must be installed:

pip install -e griffe-pydantic\n
"},{"location":"insiders/installation/#upgrading","title":"Upgrading","text":"

When upgrading Insiders, you should always check the version of griffe-pydantic which makes up the first part of the version qualifier. For example, a version like 8.x.x.4.x.x means that Insiders 4.x.x is currently based on 8.x.x.

If the major version increased, it's a good idea to consult the changelog and go through the steps to ensure your configuration is up to date and all necessary changes have been made.

"},{"location":"reference/griffe_pydantic/","title":"Index","text":""},{"location":"reference/griffe_pydantic/#griffe_pydantic","title":"griffe_pydantic","text":"

griffe-pydantic package.

Griffe extension for Pydantic.

"},{"location":"reference/griffe_pydantic/#griffe_pydantic.PydanticExtension","title":"PydanticExtension","text":"
PydanticExtension(*, schema: bool = False) -> None\n

Bases: Extension

Griffe extension for Pydantic.

Parameters:

  • schema (bool) \u2013

    Whether to compute and store the JSON schema of models.

"},{"location":"reference/griffe_pydantic/#griffe_pydantic.extension.PydanticExtension.on_attribute_instance","title":"on_attribute_instance","text":"
on_attribute_instance(\n    node: ast.AST | ObjectNode, attr: Attribute\n) -> None\n

Handle Pydantic fields.

"},{"location":"reference/griffe_pydantic/#griffe_pydantic.extension.PydanticExtension.on_class_instance","title":"on_class_instance","text":"
on_class_instance(\n    node: ast.AST | ObjectNode, cls: Class\n) -> None\n

Detect and prepare Pydantic models.

"},{"location":"reference/griffe_pydantic/#griffe_pydantic.extension.PydanticExtension.on_class_members","title":"on_class_members","text":"
on_class_members(\n    node: ast.AST | ObjectNode, cls: Class\n) -> None\n

Finalize the Pydantic model data.

"},{"location":"reference/griffe_pydantic/#griffe_pydantic.extension.PydanticExtension.on_function_instance","title":"on_function_instance","text":"
on_function_instance(\n    node: ast.AST | ObjectNode, func: Function\n) -> None\n

Handle Pydantic field validators.

"},{"location":"reference/griffe_pydantic/#griffe_pydantic.get_templates_path","title":"get_templates_path","text":"
get_templates_path() -> Path\n

Return the templates directory path.

"},{"location":"reference/griffe_pydantic/extension/","title":" extension","text":""},{"location":"reference/griffe_pydantic/extension/#griffe_pydantic.extension","title":"extension","text":"

Griffe extension for Pydantic.

"},{"location":"reference/griffe_pydantic/extension/#griffe_pydantic.extension.PydanticExtension","title":"PydanticExtension","text":"
PydanticExtension(*, schema: bool = False) -> None\n

Bases: Extension

Griffe extension for Pydantic.

Parameters:

  • schema (bool) \u2013

    Whether to compute and store the JSON schema of models.

"},{"location":"reference/griffe_pydantic/extension/#griffe_pydantic.extension.PydanticExtension.on_attribute_instance","title":"on_attribute_instance","text":"
on_attribute_instance(\n    node: ast.AST | ObjectNode, attr: Attribute\n) -> None\n

Handle Pydantic fields.

"},{"location":"reference/griffe_pydantic/extension/#griffe_pydantic.extension.PydanticExtension.on_class_instance","title":"on_class_instance","text":"
on_class_instance(\n    node: ast.AST | ObjectNode, cls: Class\n) -> None\n

Detect and prepare Pydantic models.

"},{"location":"reference/griffe_pydantic/extension/#griffe_pydantic.extension.PydanticExtension.on_class_members","title":"on_class_members","text":"
on_class_members(\n    node: ast.AST | ObjectNode, cls: Class\n) -> None\n

Finalize the Pydantic model data.

"},{"location":"reference/griffe_pydantic/extension/#griffe_pydantic.extension.PydanticExtension.on_function_instance","title":"on_function_instance","text":"
on_function_instance(\n    node: ast.AST | ObjectNode, func: Function\n) -> None\n

Handle Pydantic field validators.

"},{"location":"coverage/","title":"Coverage","text":""}]} \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml deleted file mode 100644 index 151d46c..0000000 --- a/sitemap.xml +++ /dev/null @@ -1,63 +0,0 @@ - - - - https://mkdocstrings.github.io/griffe-pydantic/ - 2023-07-13 - daily - - - https://mkdocstrings.github.io/griffe-pydantic/changelog/ - 2023-07-13 - daily - - - https://mkdocstrings.github.io/griffe-pydantic/code_of_conduct/ - 2023-07-13 - daily - - - https://mkdocstrings.github.io/griffe-pydantic/contributing/ - 2023-07-13 - daily - - - https://mkdocstrings.github.io/griffe-pydantic/credits/ - 2023-07-13 - daily - - - https://mkdocstrings.github.io/griffe-pydantic/license/ - 2023-07-13 - daily - - - https://mkdocstrings.github.io/griffe-pydantic/insiders/ - 2023-07-13 - daily - - - https://mkdocstrings.github.io/griffe-pydantic/insiders/changelog/ - 2023-07-13 - daily - - - https://mkdocstrings.github.io/griffe-pydantic/insiders/installation/ - 2023-07-13 - daily - - - https://mkdocstrings.github.io/griffe-pydantic/reference/griffe_pydantic/ - 2023-07-13 - daily - - - https://mkdocstrings.github.io/griffe-pydantic/reference/griffe_pydantic/extension/ - 2023-07-13 - daily - - - https://mkdocstrings.github.io/griffe-pydantic/coverage/ - 2023-07-13 - daily - - \ No newline at end of file diff --git a/sitemap.xml.gz b/sitemap.xml.gz deleted file mode 100644 index 05a1a4ee729b66e9fb14274a68890960a6d773f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 322 zcmV-I0loeoiwFo$C$MA!|8r?{Wo=<_E_iKh0M(YiZo?oD#`iph<=w_fhW?RFwmv~S zM+D9o6+_CMo8;|#j-x0`x2h5>!1?3jhmh}RcjwU;-;mJ7(3R`DDGLZX8W(I=e!Ra` z&*e_8+9`PiDp(w_D+i+Es}QHtsYXXIsw37hS%G@s35r`#H1$gRLo>!X&l z3$o4lX`)6-yd~Dw(J&oq7llo(@1Z(gj0)tmXvMtf(L*7P(a24+*;dU{wcfJi7JHEC zK?Mtaf-h;5^OsgUL>4%4r~3oW#ob4n4{