diff --git a/.github/workflows/generated-docs-sync.yaml b/.github/workflows/generated-docs-sync.yaml index 96051fc8a..f8686ddf9 100644 --- a/.github/workflows/generated-docs-sync.yaml +++ b/.github/workflows/generated-docs-sync.yaml @@ -15,9 +15,14 @@ on: - 'scripts/build_schema_docs.py' - 'scripts/build_conformance_docs.py' - 'scripts/build_architecture_docs.py' + - 'scripts/build_release_benchmark_docs.py' - 'scripts/build_llms_txt.py' - 'scripts/update_generate_prompt_snapshots.py' - 'scripts/update_docs_version.py' + - 'docs/data/release-benchmarks.json' + - 'docs/data/release-benchmark-notes.json' + - 'docs/assets/benchmarks/release-benchmarks.css' + - 'docs/assets/benchmarks/release-benchmarks.js' - 'tox.ini' - '.github/workflows/generated-docs-sync.yaml' - 'docs/**/*.md' @@ -66,6 +71,7 @@ jobs: docs/presets.md docs/conformance.md docs/architecture.md + docs/performance-benchmarks.md docs/cli-reference/ docs/llms.txt docs/llms-full.txt diff --git a/.github/workflows/llms-txt.yaml b/.github/workflows/llms-txt.yaml index a9b00c52d..330aa67aa 100644 --- a/.github/workflows/llms-txt.yaml +++ b/.github/workflows/llms-txt.yaml @@ -13,6 +13,11 @@ on: - 'scripts/build_preset_docs.py' - 'src/datamodel_code_generator/parser/schema_version.py' - 'scripts/build_schema_docs.py' + - 'scripts/build_release_benchmark_docs.py' + - 'docs/data/release-benchmarks.json' + - 'docs/data/release-benchmark-notes.json' + - 'docs/assets/benchmarks/release-benchmarks.css' + - 'docs/assets/benchmarks/release-benchmarks.js' - 'docs/**/*.md' - 'README.md' - 'zensical.toml' @@ -67,5 +72,7 @@ jobs: run: .tox/schema-docs/bin/python scripts/build_schema_docs.py - name: Build preset docs run: .tox/preset-docs/bin/python scripts/build_preset_docs.py + - name: Build release benchmark docs + run: .tox/llms-txt/bin/python scripts/build_release_benchmark_docs.py - name: Build llms.txt run: .tox/llms-txt/bin/python scripts/build_llms_txt.py diff --git a/.github/workflows/release-benchmarks.yaml b/.github/workflows/release-benchmarks.yaml new file mode 100644 index 000000000..4e7b846f4 --- /dev/null +++ b/.github/workflows/release-benchmarks.yaml @@ -0,0 +1,203 @@ +name: Release Benchmarks + +on: + pull_request: + types: [labeled] + workflow_run: + workflows: ["Publish"] + types: [completed] + workflow_dispatch: + inputs: + versions: + description: "Release tags, versions, or main to benchmark. Leave empty to select by PyPI download usage." + required: false + default: "" + history_days: + description: "PyPI download lookback window used for version selection." + required: false + default: "365" + limit: + description: "Maximum release versions to benchmark." + required: false + default: "40" + runs: + description: "Measured runs per release/input/formatter case." + required: false + default: "7" + python_version: + description: "Python version used to install and run released packages." + required: false + default: "3.14.2" + +concurrency: + group: release-benchmarks-${{ github.event_name == 'workflow_run' && github.event.workflow_run.head_sha || github.ref }} + cancel-in-progress: false + +permissions: + contents: read + +jobs: + resolve: + name: Resolve release benchmark versions + runs-on: ubuntu-24.04 + if: >- + ${{ + github.event_name == 'workflow_dispatch' || + ( + github.event_name == 'pull_request' && + contains(github.event.pull_request.labels.*.name, 'run-release-benchmarks') && + github.event.pull_request.head.repo.full_name == github.repository + ) || + ( + github.event.workflow_run.conclusion == 'success' && + github.event.workflow_run.event == 'push' && + github.event.workflow_run.head_repository.full_name == github.repository + ) + }} + outputs: + versions_json: ${{ steps.versions.outputs.versions_json }} + versions: ${{ steps.versions.outputs.versions }} + env: + BENCHMARK_PYTHON_VERSION: ${{ github.event_name == 'workflow_dispatch' && inputs.python_version || '3.14.2' }} + BENCHMARK_HISTORY_DAYS: ${{ github.event_name == 'workflow_dispatch' && inputs.history_days || '365' }} + BENCHMARK_LIMIT: ${{ github.event_name == 'workflow_dispatch' && inputs.limit || '40' }} + steps: + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 + with: + persist-credentials: false + - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6 + with: + python-version: ${{ env.BENCHMARK_PYTHON_VERSION }} + - name: Resolve release versions + id: versions + env: + EVENT_NAME: ${{ github.event_name }} + WORKFLOW_TAG: ${{ github.event_name == 'workflow_run' && github.event.workflow_run.head_branch || '' }} + WORKFLOW_SHA: ${{ github.event_name == 'workflow_run' && github.event.workflow_run.head_sha || '' }} + INPUT_VERSIONS: ${{ github.event_name == 'workflow_dispatch' && inputs.versions || '' }} + run: | + set -euo pipefail + versions="$INPUT_VERSIONS" + if [ "$EVENT_NAME" = "workflow_run" ]; then + versions="$WORKFLOW_TAG" + case "$versions" in + refs/tags/*) versions="${versions#refs/tags/}" ;; + v[0-9]* | [0-9]*) ;; + *) versions="" ;; + esac + if [ -z "$versions" ] && [ -n "$WORKFLOW_SHA" ]; then + git fetch --tags --force --depth=1 origin '+refs/tags/*:refs/tags/*' + versions="$(git tag --points-at "$WORKFLOW_SHA" | sort -V | tail -n 1)" + fi + if [ -z "$versions" ]; then + echo "Could not determine release tag for Publish workflow run $WORKFLOW_SHA" >&2 + exit 1 + fi + fi + python scripts/select_release_benchmark_versions.py \ + --versions "$versions" \ + --history-days "$BENCHMARK_HISTORY_DAYS" \ + --limit "$BENCHMARK_LIMIT" \ + --output .benchmarks/release-benchmark-selection.json + - name: Upload benchmark selection + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 + with: + name: dcg-release-benchmark-selection + path: .benchmarks/release-benchmark-selection.json + if-no-files-found: error + + collect: + name: Collect release benchmarks (${{ matrix.version }}) + needs: resolve + if: needs.resolve.result == 'success' + runs-on: ubuntu-24.04 + strategy: + fail-fast: false + max-parallel: 40 + matrix: + version: ${{ fromJson(needs.resolve.outputs.versions_json) }} + env: + BENCHMARK_PYTHON_VERSION: ${{ github.event_name == 'workflow_dispatch' && inputs.python_version || '3.14.2' }} + BENCHMARK_RUNS: ${{ github.event_name == 'workflow_dispatch' && inputs.runs || (github.event_name == 'pull_request' && '3' || '7') }} + OS: ubuntu-24.04 + steps: + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 + with: + persist-credentials: false + - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6 + with: + python-version: ${{ env.BENCHMARK_PYTHON_VERSION }} + - name: Install the latest version of uv + uses: astral-sh/setup-uv@d4b2f3b6ecc6e67c4457f6d3e41ec42d3d0fcb86 # v5 + - name: Collect benchmarks + env: + BENCHMARK_VERSION: ${{ matrix.version }} + run: >- + python scripts/collect_release_benchmarks.py + --versions "$BENCHMARK_VERSION" + --runs "$BENCHMARK_RUNS" + --output ".benchmarks/fragments/release-benchmark-${BENCHMARK_VERSION}.json" + - name: Upload benchmark fragment + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 + with: + name: dcg-release-benchmark-fragment-${{ matrix.version }} + path: .benchmarks/fragments/release-benchmark-${{ matrix.version }}.json + if-no-files-found: error + + build: + name: Build release benchmark docs artifact + needs: [resolve, collect] + if: needs.collect.result == 'success' + runs-on: ubuntu-24.04 + env: + BENCHMARK_PYTHON_VERSION: ${{ github.event_name == 'workflow_dispatch' && inputs.python_version || '3.14.2' }} + OS: ubuntu-24.04 + steps: + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 + with: + persist-credentials: false + - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6 + with: + python-version: ${{ env.BENCHMARK_PYTHON_VERSION }} + - name: Download benchmark selection + uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4 + with: + name: dcg-release-benchmark-selection + path: .benchmarks + - name: Download benchmark fragments + uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4 + with: + pattern: dcg-release-benchmark-fragment-* + path: .benchmarks/fragments + merge-multiple: true + - name: Merge benchmark data + run: >- + python scripts/merge_release_benchmarks.py + .benchmarks/fragments/*.json + --selection .benchmarks/release-benchmark-selection.json + --output .benchmarks/release-benchmarks.json + - name: Build benchmark docs artifact + run: >- + python scripts/build_release_benchmark_docs.py + --data .benchmarks/release-benchmarks.json + --docs .benchmarks/docs/performance-benchmarks.md + - name: Copy benchmark chart assets + run: | + set -euo pipefail + mkdir -p .benchmarks/docs/assets/benchmarks .benchmarks/docs/data + cp docs/assets/benchmarks/release-benchmarks.css .benchmarks/docs/assets/benchmarks/ + cp docs/assets/benchmarks/release-benchmarks.js .benchmarks/docs/assets/benchmarks/ + cp .benchmarks/release-benchmarks.json .benchmarks/docs/data/ + cp docs/data/release-benchmark-notes.json .benchmarks/docs/data/ + - name: Upload benchmark data + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 + with: + name: dcg-release-benchmarks-json + path: .benchmarks/release-benchmarks.json + if-no-files-found: error + - name: Upload benchmark docs + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 + with: + name: dcg-release-benchmark-docs + path: .benchmarks/docs + if-no-files-found: error diff --git a/README.md b/README.md index 035b566a7..30a308035 100644 --- a/README.md +++ b/README.md @@ -199,6 +199,8 @@ Custom templates can emit Python outside the standard generated model patterns c custom-template output is not exhaustively validated. If `--formatters builtin` produces invalid or poorly formatted output with a custom template, please open an issue with a small reproducer. See [Formatter Behavior](https://datamodel-code-generator.koxudaxi.dev/formatter-behavior/) for details. + +See [Performance Benchmarks](https://datamodel-code-generator.koxudaxi.dev/performance-benchmarks/) for release benchmark data and interactive charts. --- @@ -213,6 +215,7 @@ output with a custom template, please open an issue with a small reproducer. See - โš™๏ธ [pyproject.toml](https://datamodel-code-generator.koxudaxi.dev/pyproject_toml/) - Configuration file - ๐Ÿ”„ [CI/CD Integration](https://datamodel-code-generator.koxudaxi.dev/ci-cd/) - GitHub Actions, pre-commit hooks - โœ… [Conformance Dashboard](https://datamodel-code-generator.koxudaxi.dev/conformance/) - External corpus coverage signals +- ๐Ÿ“ˆ [Performance Benchmarks](https://datamodel-code-generator.koxudaxi.dev/performance-benchmarks/) - Release benchmark tables and interactive charts - ๐Ÿงญ [Architecture](https://datamodel-code-generator.koxudaxi.dev/architecture/) - Generation pipeline and synchronized component inventory - ๐Ÿš€ [One-liner Usage](https://datamodel-code-generator.koxudaxi.dev/oneliner/) - uvx, pipx, clipboard integration - โ“ [FAQ](https://datamodel-code-generator.koxudaxi.dev/faq/) - Common questions diff --git a/docs/assets/benchmarks/release-benchmarks.css b/docs/assets/benchmarks/release-benchmarks.css new file mode 100644 index 000000000..d35f03e86 --- /dev/null +++ b/docs/assets/benchmarks/release-benchmarks.css @@ -0,0 +1,82 @@ +.release-benchmark-chart { + display: block; + position: relative; + margin: 1rem 0 1.5rem; + padding: 1rem; + border: 1px solid var(--md-default-fg-color--lightest, #e5e7eb); + border-radius: 0.5rem; + background: var(--md-code-bg-color, #ffffff); +} + +.release-benchmark-chart canvas { + display: block; + width: 100%; + height: 420px; +} + +.release-benchmark-chart__legend { + display: flex; + flex-wrap: wrap; + gap: 0.75rem 1rem; + margin-top: 0.75rem; + font-size: 0.72rem; +} + +.release-benchmark-chart__legend-item { + display: inline-flex; + align-items: center; + gap: 0.35rem; +} + +.release-benchmark-chart__legend-label { + color: var(--md-default-fg-color--light, #6b7280); + font-weight: 700; +} + +.release-benchmark-chart__swatch { + width: 0.75rem; + height: 0.75rem; + border-radius: 999px; +} + +.release-benchmark-chart__status { + display: block; + margin-top: 0.75rem; + color: var(--md-default-fg-color--light, #6b7280); + font-size: 0.72rem; +} + +.release-benchmark-chart__status[hidden] { + display: none; +} + +.release-benchmark-chart__tooltip { + position: absolute; + z-index: 2; + max-width: min(18rem, calc(100% - 2rem)); + padding: 0.35rem 0.5rem; + border-radius: 0.3rem; + background: var(--md-default-bg-color, #ffffff); + box-shadow: 0 0.25rem 0.9rem rgb(15 23 42 / 18%); + color: var(--md-default-fg-color, #111827); + font-size: 0.72rem; + pointer-events: none; + transform: translate(-50%, calc(-100% - 0.6rem)); + white-space: nowrap; +} + +.release-benchmark-version-note { + color: var(--md-accent-fg-color, #dc2626); + text-decoration: underline dotted; + text-underline-offset: 0.18em; +} + +@media screen and (max-width: 42rem) { + .release-benchmark-chart { + padding: 0.75rem; + } + + .release-benchmark-chart canvas { + height: 320px; + } +} diff --git a/docs/assets/benchmarks/release-benchmarks.js b/docs/assets/benchmarks/release-benchmarks.js new file mode 100644 index 000000000..f6749d28a --- /dev/null +++ b/docs/assets/benchmarks/release-benchmarks.js @@ -0,0 +1,622 @@ +(function () { + "use strict"; + + const STATUS_OK = "ok"; + const FORMATTERS = [ + { key: "default", label: "black/isort(Default)", color: "#f59e0b" }, + { key: "builtin", label: "Built-in", color: "#2563eb" }, + { key: "ruff", label: "Ruff", color: "#16a34a" }, + ]; + + const scriptUrl = document.currentScript && document.currentScript.src ? document.currentScript.src : document.baseURI; + const dataUrl = new URL("../../data/release-benchmarks.json", scriptUrl); + const notesUrl = new URL("../../data/release-benchmark-notes.json", scriptUrl); + const MAIN_VERSION = "main"; + const initializedCharts = new WeakSet(); + const observedCharts = new WeakSet(); + let benchmarkPayloadPromise = null; + let benchmarkPayload = null; + let resizeObserver = null; + let globalEventsAttached = false; + let instantNavigationHookAttached = false; + let navigationEventsAttached = false; + let mutationObserverAttached = false; + let initializeScheduled = false; + + function chartContainers() { + return Array.from(document.querySelectorAll("[data-release-benchmark-chart]")); + } + + function versionKey(version) { + const normalizedVersion = String(version).replace(/^v/, ""); + if (normalizedVersion === MAIN_VERSION) { + return [1, 0, 0, 0, 0]; + } + const parts = String(version) + .replace(/^v/, "") + .split(/[.\-+_]/) + .map((part) => (/^\d+$/.test(part) ? Number(part) : 0)); + while (parts.length < 4) { + parts.push(0); + } + parts.unshift(0); + return parts; + } + + function compareVersions(left, right) { + const leftKey = versionKey(left); + const rightKey = versionKey(right); + for (let index = 0; index < 5; index += 1) { + if (leftKey[index] !== rightKey[index]) { + return leftKey[index] - rightKey[index]; + } + } + return String(left).localeCompare(String(right)); + } + + function formatMs(value) { + if (value >= 1000) { + return `${(value / 1000).toFixed(2)}s`; + } + if (value >= 100) { + return `${value.toFixed(0)}ms`; + } + if (value >= 10) { + return `${value.toFixed(1)}ms`; + } + return `${value.toFixed(2)}ms`; + } + + function inputLabel(inputType) { + switch (inputType) { + case "openapi": + return "OpenAPI"; + case "jsonschema": + return "JSON Schema"; + default: + return inputType; + } + } + + function findEntry(entries, version, formatter) { + return entries.find( + (entry) => + entry.version === version && + entry.formatter === formatter && + entry.status === STATUS_OK && + typeof entry.median_ms === "number", + ); + } + + function scale(value, sourceMin, sourceMax, targetMin, targetMax) { + if (sourceMax === sourceMin) { + return (targetMin + targetMax) / 2; + } + return targetMin + ((value - sourceMin) / (sourceMax - sourceMin)) * (targetMax - targetMin); + } + + function maxVersionLabelWidth(context, versions) { + if (versions.length === 0) { + return 0; + } + return Math.max(...versions.map((version) => context.measureText(version).width)); + } + + function versionTickIndexes(context, versions, plotWidth) { + if (versions.length <= 1) { + return versions.length === 1 ? [0] : []; + } + const labelWidth = maxVersionLabelWidth(context, versions); + const minimumSpacing = Math.max(44, Math.ceil(labelWidth) + 16); + const minimumIndexGap = Math.max( + 1, + Math.ceil((minimumSpacing / Math.max(plotWidth, 1)) * (versions.length - 1)), + ); + const indexes = []; + for (let index = 0; index < versions.length; index += minimumIndexGap) { + indexes.push(index); + } + + const lastIndex = versions.length - 1; + if (indexes[indexes.length - 1] === lastIndex) { + return indexes; + } + if (lastIndex - indexes[indexes.length - 1] < minimumIndexGap && indexes.length > 1) { + indexes.pop(); + } + indexes.push(lastIndex); + return indexes; + } + + function cssColor(element, name, fallback) { + const value = getComputedStyle(element).getPropertyValue(name).trim(); + return value || fallback; + } + + function scenarioEntries(data, inputType, caseName) { + return data.entries.filter((entry) => entry.input_type === inputType && entry.case === caseName); + } + + function normalizeNotes(payload) { + if (!payload || !Array.isArray(payload.notes)) { + return []; + } + return payload.notes.reduce((notesByVersion, note) => { + if (note && typeof note.version === "string" && typeof note.summary === "string") { + notesByVersion.push({ + version: note.version, + summary: note.summary, + details: typeof note.details === "string" ? note.details : "", + inputType: typeof note.input_type === "string" ? note.input_type : "", + caseName: typeof note.case === "string" ? note.case : "", + }); + } + return notesByVersion; + }, []); + } + + function noteText(note) { + return note.details ? `${note.summary} ${note.details}` : note.summary; + } + + function noteApplies(note, inputType, caseName) { + if (note.inputType && note.inputType !== inputType) { + return false; + } + if (note.caseName && note.caseName !== caseName) { + return false; + } + return true; + } + + function scenarioNotesByVersion(notes, inputType, caseName) { + return notes.reduce((notesByVersion, note) => { + if (!noteApplies(note, inputType, caseName)) { + return notesByVersion; + } + if (!notesByVersion[note.version]) { + notesByVersion[note.version] = []; + } + notesByVersion[note.version].push(note); + return notesByVersion; + }, {}); + } + + function renderLegend(container) { + const legend = container.querySelector(".release-benchmark-chart__legend"); + if (!legend) { + return; + } + const legendItems = FORMATTERS.map( + (formatter) => + `${formatter.label}`, + ).join(""); + legend.innerHTML = `Formatter:${legendItems}`; + } + + function setStatus(container, message) { + const status = container.querySelector(".release-benchmark-chart__status"); + if (!status) { + return; + } + status.textContent = message; + status.hidden = message === ""; + } + + function chartSize(canvas) { + const rect = canvas.getBoundingClientRect(); + const style = getComputedStyle(canvas); + const width = Math.max(320, Math.floor(rect.width)); + const height = Math.max(260, Number.parseFloat(style.height) || 420); + return { width, height }; + } + + function isVisible(element) { + return Boolean(element.offsetWidth || element.offsetHeight || element.getClientRects().length); + } + + function drawChart(container, data, notes) { + const canvas = container.querySelector("canvas"); + if (!(canvas instanceof HTMLCanvasElement)) { + return; + } + if (!isVisible(container)) { + return; + } + + const inputType = container.dataset.inputType || ""; + const caseName = container.dataset.case || ""; + const entries = scenarioEntries(data, inputType, caseName); + const notesByVersion = scenarioNotesByVersion(notes, inputType, caseName); + const versions = Array.from(new Set(entries.map((entry) => entry.version))).sort(compareVersions); + const okEntries = entries.filter((entry) => entry.status === STATUS_OK && typeof entry.median_ms === "number"); + + if (versions.length === 0 || okEntries.length === 0) { + setStatus(container, "No benchmark data is available for this chart."); + return; + } + setStatus(container, ""); + + const { width, height } = chartSize(canvas); + const devicePixelRatio = window.devicePixelRatio || 1; + canvas.width = Math.floor(width * devicePixelRatio); + canvas.height = Math.floor(height * devicePixelRatio); + canvas.style.width = `${width}px`; + canvas.style.height = `${height}px`; + + const context = canvas.getContext("2d"); + if (!context) { + return; + } + context.setTransform(devicePixelRatio, 0, 0, devicePixelRatio, 0, 0); + context.clearRect(0, 0, width, height); + + const foreground = cssColor(container, "--md-default-fg-color", "#111827"); + const muted = cssColor(container, "--md-default-fg-color--light", "#6b7280"); + const grid = cssColor(container, "--md-default-fg-color--lightest", "#d1d5db"); + const noteColor = cssColor(container, "--md-accent-fg-color", "#dc2626"); + context.font = "12px system-ui, -apple-system, BlinkMacSystemFont, Segoe UI, sans-serif"; + const horizontalLabelPadding = Math.ceil(maxVersionLabelWidth(context, versions) / 2) + 8; + const plot = { + left: Math.max(58, horizontalLabelPadding), + top: 38, + right: width - Math.max(18, horizontalLabelPadding), + bottom: height - 58, + }; + const maxMs = Math.max(...okEntries.map((entry) => entry.median_ms || 0)); + const yMax = maxMs > 0 ? maxMs * 1.15 : 1; + const points = []; + + context.fillStyle = foreground; + context.fillText(`${caseName[0].toUpperCase()}${caseName.slice(1)} / ${inputLabel(inputType)}`, plot.left, 20); + + context.strokeStyle = grid; + context.fillStyle = muted; + context.lineWidth = 1; + for (let index = 0; index <= 4; index += 1) { + const value = (yMax * index) / 4; + const y = scale(value, 0, yMax, plot.bottom, plot.top); + context.beginPath(); + context.moveTo(plot.left, y); + context.lineTo(plot.right, y); + context.stroke(); + context.textAlign = "right"; + context.fillText(formatMs(value), plot.left - 10, y + 4); + } + + context.textAlign = "center"; + versionTickIndexes(context, versions, plot.right - plot.left).forEach((index) => { + const version = versions[index]; + const x = scale(index, 0, Math.max(versions.length - 1, 1), plot.left, plot.right); + context.strokeStyle = grid; + context.beginPath(); + context.moveTo(x, plot.top); + context.lineTo(x, plot.bottom); + context.stroke(); + context.fillStyle = muted; + context.fillText(version, x, plot.bottom + 24); + }); + + context.strokeStyle = foreground; + context.beginPath(); + context.moveTo(plot.left, plot.top); + context.lineTo(plot.left, plot.bottom); + context.lineTo(plot.right, plot.bottom); + context.stroke(); + + const noteMarkers = []; + context.save(); + context.strokeStyle = noteColor; + context.fillStyle = noteColor; + context.textAlign = "center"; + context.setLineDash([4, 4]); + versions.forEach((version, index) => { + const versionNotes = notesByVersion[version]; + if (!versionNotes || versionNotes.length === 0) { + return; + } + const x = scale(index, 0, Math.max(versions.length - 1, 1), plot.left, plot.right); + noteMarkers.push({ x, version, notes: versionNotes, plotTop: plot.top, plotBottom: plot.bottom }); + context.beginPath(); + context.moveTo(x, plot.top); + context.lineTo(x, plot.bottom); + context.stroke(); + context.fillText("*", x, plot.top - 10); + }); + context.restore(); + + FORMATTERS.forEach((formatter) => { + const formatterPoints = []; + versions.forEach((version, index) => { + const entry = findEntry(entries, version, formatter.key); + if (!entry) { + return; + } + const x = scale(index, 0, Math.max(versions.length - 1, 1), plot.left, plot.right); + const y = scale(entry.median_ms, 0, yMax, plot.bottom, plot.top); + formatterPoints.push({ x, y, entry, formatter }); + points.push({ x, y, entry, formatter }); + }); + if (formatterPoints.length === 0) { + return; + } + context.strokeStyle = formatter.color; + context.lineWidth = 2.4; + context.beginPath(); + formatterPoints.forEach((point, index) => { + if (index === 0) { + context.moveTo(point.x, point.y); + return; + } + context.lineTo(point.x, point.y); + }); + context.stroke(); + + context.fillStyle = formatter.color; + formatterPoints.forEach((point) => { + context.beginPath(); + context.arc(point.x, point.y, 3, 0, Math.PI * 2); + context.fill(); + }); + }); + + container.releaseBenchmarkPoints = points; + container.releaseBenchmarkNotes = noteMarkers; + } + + function showTooltip(container, event) { + const tooltip = container.querySelector(".release-benchmark-chart__tooltip"); + const canvas = container.querySelector("canvas"); + if (!tooltip || !(canvas instanceof HTMLCanvasElement) || !container.releaseBenchmarkPoints) { + return; + } + const rect = canvas.getBoundingClientRect(); + const x = event.clientX - rect.left; + const y = event.clientY - rect.top; + let nearest = null; + let nearestDistance = 14; + container.releaseBenchmarkPoints.forEach((point) => { + const distance = Math.hypot(point.x - x, point.y - y); + if (distance < nearestDistance) { + nearest = point; + nearestDistance = distance; + } + }); + let nearestNote = null; + let nearestNoteDistance = 10; + if (container.releaseBenchmarkNotes) { + container.releaseBenchmarkNotes.forEach((marker) => { + const isInsidePlot = y >= marker.plotTop - 24 && y <= marker.plotBottom + 30; + const distance = Math.abs(marker.x - x); + if (isInsidePlot && distance < nearestNoteDistance) { + nearestNote = marker; + nearestNoteDistance = distance; + } + }); + } + if (nearestNote && (!nearest || nearestNoteDistance <= nearestDistance)) { + tooltip.textContent = `${nearestNote.version}: ${nearestNote.notes.map(noteText).join(" ")}`; + tooltip.style.left = `${canvas.offsetLeft + nearestNote.x}px`; + tooltip.style.top = `${canvas.offsetTop + nearestNote.plotTop}px`; + tooltip.hidden = false; + return; + } + if (!nearest) { + tooltip.hidden = true; + return; + } + tooltip.textContent = `${nearest.entry.version} ยท ${nearest.formatter.label}: ${formatMs(nearest.entry.median_ms)}`; + tooltip.style.left = `${canvas.offsetLeft + nearest.x}px`; + tooltip.style.top = `${canvas.offsetTop + nearest.y}px`; + tooltip.hidden = false; + } + + function hideTooltip(container) { + const tooltip = container.querySelector(".release-benchmark-chart__tooltip"); + if (tooltip) { + tooltip.hidden = true; + } + } + + function renderAll(data, notes, charts) { + charts.forEach((container) => drawChart(container, data, notes)); + } + + function scheduleRender(data, notes, charts) { + let rendered = false; + const render = () => { + if (rendered) { + return; + } + rendered = true; + renderAll(data, notes, charts); + }; + window.requestAnimationFrame(render); + window.setTimeout(render, 100); + } + + function initializedChartContainers() { + return chartContainers().filter((container) => initializedCharts.has(container)); + } + + function scheduleInitializedChartsRender() { + if (!benchmarkPayload) { + return; + } + scheduleRender(benchmarkPayload.data, benchmarkPayload.notes, initializedChartContainers()); + } + + function loadBenchmarkPayload() { + if (benchmarkPayloadPromise) { + return benchmarkPayloadPromise; + } + benchmarkPayloadPromise = Promise.all([ + fetch(dataUrl).then((response) => { + if (!response.ok) { + throw new Error(`Could not load ${dataUrl.pathname}`); + } + return response.json(); + }), + fetch(notesUrl) + .then((response) => (response.ok ? response.json() : { notes: [] })) + .then(normalizeNotes) + .catch(() => []), + ]).then((response) => { + const [data, notes] = response; + benchmarkPayload = { data, notes }; + return benchmarkPayload; + }); + return benchmarkPayloadPromise; + } + + function observeChart(container) { + if (!("ResizeObserver" in window) || observedCharts.has(container)) { + return; + } + if (!resizeObserver) { + resizeObserver = new ResizeObserver(scheduleInitializedChartsRender); + } + resizeObserver.observe(container); + observedCharts.add(container); + } + + function attachGlobalEvents() { + if (globalEventsAttached) { + return; + } + globalEventsAttached = true; + window.addEventListener("resize", scheduleInitializedChartsRender); + document.addEventListener("click", () => window.setTimeout(scheduleInitializedChartsRender, 50)); + document.addEventListener("change", () => window.setTimeout(scheduleInitializedChartsRender, 50)); + document.addEventListener("visibilitychange", scheduleInitializedChartsRender); + } + + // Material instant navigation swaps page content without re-running destination extra scripts. + function scheduleNavigationRetry() { + [0, 50, 250, 750].forEach((delay) => { + window.setTimeout(scheduleInitializeCharts, delay); + }); + } + + function attachNavigationEvents() { + if (navigationEventsAttached) { + return; + } + navigationEventsAttached = true; + document.addEventListener( + "click", + (event) => { + const anchor = event.target instanceof Element ? event.target.closest("a") : null; + if (!(anchor instanceof HTMLAnchorElement) || anchor.target || anchor.origin !== window.location.origin) { + return; + } + scheduleNavigationRetry(); + }, + true, + ); + window.addEventListener("popstate", scheduleNavigationRetry); + } + + function prepareChart(container) { + if (initializedCharts.has(container)) { + return; + } + initializedCharts.add(container); + renderLegend(container); + setStatus(container, "Loading benchmark chart..."); + container.addEventListener("mousemove", (event) => showTooltip(container, event)); + container.addEventListener("mouseleave", () => hideTooltip(container)); + observeChart(container); + } + + function initializeCharts() { + const charts = chartContainers(); + if (charts.length === 0) { + return; + } + charts.forEach(prepareChart); + attachGlobalEvents(); + loadBenchmarkPayload() + .then(({ data, notes }) => { + scheduleRender(data, notes, charts); + }) + .catch((error) => { + charts.forEach((container) => { + setStatus(container, error.message); + const tooltip = container.querySelector(".release-benchmark-chart__tooltip"); + if (tooltip) { + tooltip.textContent = error.message; + tooltip.hidden = false; + } + }); + }); + } + + function scheduleInitializeCharts() { + if (initializeScheduled) { + return; + } + initializeScheduled = true; + window.setTimeout(() => { + initializeScheduled = false; + initializeCharts(); + }, 0); + } + + function attachMutationObserver() { + if (mutationObserverAttached || !("MutationObserver" in window) || !document.documentElement) { + return; + } + mutationObserverAttached = true; + const observer = new MutationObserver(() => { + if (chartContainers().some((container) => !initializedCharts.has(container))) { + scheduleInitializeCharts(); + } + }); + observer.observe(document.documentElement, { childList: true, subtree: true }); + } + + function instantNavigationDocument() { + if (window.document$ && typeof window.document$.subscribe === "function") { + return window.document$; + } + if (typeof document$ !== "undefined" && typeof document$.subscribe === "function") { + return document$; + } + return null; + } + + function attachInstantNavigationHook() { + if (instantNavigationHookAttached) { + return; + } + const navigationDocument = instantNavigationDocument(); + if (!navigationDocument) { + return; + } + instantNavigationHookAttached = true; + try { + navigationDocument.subscribe(scheduleInitializeCharts); + } catch { + // Initial rendering and navigation retry still cover environments without this observable. + } + } + + function start() { + attachNavigationEvents(); + attachMutationObserver(); + scheduleInitializeCharts(); + attachInstantNavigationHook(); + } + + if (document.readyState === "loading") { + document.addEventListener( + "DOMContentLoaded", + start, + { once: true }, + ); + } + start(); + window.addEventListener("load", start, { once: true }); + window.setTimeout(start, 0); +})(); diff --git a/docs/data/release-benchmark-notes.json b/docs/data/release-benchmark-notes.json new file mode 100644 index 000000000..3a388f7bd --- /dev/null +++ b/docs/data/release-benchmark-notes.json @@ -0,0 +1,14 @@ +{ + "notes": [ + { + "version": "0.29.0", + "summary": "The inflect dependency range was widened and cold imports became slower.", + "details": "Release 0.29.0 allowed inflect 7.x, which resolves typeguard 4.x in modern environments. That typeguard instrumentation increased fresh-process startup cost. Small OpenAPI is especially visible because the fixture has array component names such as Pets and Users, so class-name singularization initializes inflect while the rest of the generation work is small." + }, + { + "version": "0.64.1", + "summary": "This release predates the main-branch inflect import mitigation.", + "details": "The latest release result still includes the inflect/typeguard cold-import cost. The effect is most visible in Small/OpenAPI because the fixture has array component names such as Pets and Users, so class-name singularization initializes inflect while the rest of the generation work is small." + } + ] +} diff --git a/docs/data/release-benchmarks.json b/docs/data/release-benchmarks.json new file mode 100644 index 000000000..36403683f --- /dev/null +++ b/docs/data/release-benchmarks.json @@ -0,0 +1,10072 @@ +{ + "schema_version": 1, + "metadata": { + "generated_at": "2026-06-22T09:37:07Z", + "workflow": "Release Benchmarks", + "workflow_run_id": "27943311457", + "collector_sha": "4459682eef04147a294af92225b0a07ce04ef2b6", + "os": "ubuntu-24.04", + "python_version": "3.14.2", + "runs_per_case": "mixed", + "warmups_per_case": "1", + "selection_strategy": "clickpy_downloads_with_compatibility_backfill_and_main", + "selection_window_days": "365", + "selected_versions": "0.17.2,0.25.0,0.25.2,0.25.4,0.25.6,0.25.7,0.25.9,0.26.1,0.26.3,0.26.4,0.26.5,0.27.0,0.27.1,0.27.2,0.27.3,0.28.0,0.28.1,0.28.2,0.28.3,0.28.4,0.28.5,0.29.0,0.30.0,0.30.1,0.30.2,0.31.0,0.31.1,0.31.2,0.32.0,0.33.0,0.34.0,0.35.0,0.36.0,0.39.0,0.42.0,0.42.2,0.43.1,0.45.0,0.52.2,0.53.0,0.54.0,0.54.1,0.55.0,0.56.0,0.56.1,0.57.0,0.58.0,0.59.0,0.64.0,0.64.1,0.65.0,main", + "download_source": "clickpy", + "download_window_days": "365", + "download_versions": "160", + "download_window_total": "117445983", + "pypistats_source": "pypistats.org", + "pypistats_last_day": "267774", + "pypistats_last_week": "3551911", + "pypistats_last_month": "13805155", + "pypistats_timeseries_days": "180", + "pypistats_timeseries_downloads": "72119373", + "compatibility_backfill": "Versions 0.26.4-0.34.0 use Python 3.13.14 because those releases fail during import on Python 3.14.2 before benchmark timing.", + "compatibility_backfill_workflow_run_id": "27910916903", + "compatibility_backfill_python_version": "3.13.14", + "release_dates": { + "0.17.2": "2023-03-31T15:26:07Z", + "0.25.0": "2023-11-25T07:17:56Z", + "0.25.2": "2023-12-21T18:12:08Z", + "0.25.4": "2024-02-13T18:10:14Z", + "0.25.6": "2024-04-25T17:06:23Z", + "0.25.7": "2024-06-11T17:16:13Z", + "0.25.9": "2024-08-07T03:11:05Z", + "0.26.1": "2024-09-27T09:04:18Z", + "0.26.3": "2024-11-10T16:42:42Z", + "0.26.4": "2024-12-15T17:26:28Z", + "0.26.5": "2025-01-14T12:02:07Z", + "0.27.0": "2025-02-06T16:13:41Z", + "0.27.1": "2025-02-06T17:11:40Z", + "0.27.2": "2025-02-07T13:08:39Z", + "0.27.3": "2025-02-11T18:12:25Z", + "0.28.0": "2025-02-14T16:17:44Z", + "0.28.1": "2025-02-15T02:52:53Z", + "0.28.2": "2025-02-27T18:00:52Z", + "0.28.3": "2025-03-10T18:31:14Z", + "0.28.4": "2025-03-11T17:23:02Z", + "0.28.5": "2025-03-24T17:36:33Z", + "0.29.0": "2025-04-17T15:06:27Z", + "0.30.0": "2025-04-17T15:24:55Z", + "0.30.1": "2025-04-28T13:58:36Z", + "0.30.2": "2025-06-07T02:42:12Z", + "0.31.0": "2025-06-12T16:20:58Z", + "0.31.1": "2025-06-17T15:24:13Z", + "0.31.2": "2025-06-22T17:40:56Z", + "0.32.0": "2025-07-25T14:12:06Z", + "0.33.0": "2025-08-14T13:50:36Z", + "0.34.0": "2025-09-28T06:36:41Z", + "0.35.0": "2025-10-09T19:26:49Z", + "0.36.0": "2025-11-26T17:14:08Z", + "0.39.0": "2025-12-02T19:29:58Z", + "0.42.0": "2025-12-08T02:57:49Z", + "0.42.2": "2025-12-08T21:04:54Z", + "0.43.1": "2025-12-12T07:03:28Z", + "0.45.0": "2025-12-19T00:13:13Z", + "0.52.2": "2026-01-05T17:25:50Z", + "0.53.0": "2026-01-12T18:14:05Z", + "0.54.0": "2026-02-14T16:19:05Z", + "0.54.1": "2026-03-04T04:15:02Z", + "0.55.0": "2026-03-10T20:41:15Z", + "0.56.0": "2026-04-04T09:46:19Z", + "0.56.1": "2026-04-16T17:09:53Z", + "0.57.0": "2026-05-07T16:21:55Z", + "0.58.0": "2026-05-25T03:23:53Z", + "0.59.0": "2026-05-29T15:47:55Z", + "0.64.0": "2026-06-14T17:24:50Z", + "0.64.1": "2026-06-19T17:19:50Z", + "0.65.0": "2026-06-21T18:21:06Z", + "main": "" + }, + "main_snapshot_workflow_run_id": "27943311457", + "main_snapshot_collector_sha": "4459682eef04147a294af92225b0a07ce04ef2b6", + "main_snapshot_generated_at": "2026-06-22T09:37:07Z" + }, + "entries": [ + { + "version": "0.17.2", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "Using Python 3.14.2 environment at: Resolved 42 packages in 10ms Building typed-ast==1.5.5 \u00d7 Failed to build `typed-ast==1.5.5` \u251c\u2500\u25b6 The build backend returned an error \u2570\u2500\u25b6 Call to `setuptools.build_meta:__legacy__.build_wheel` failed (exit status: 1) [stdout] running bdist_wheel running build running build_py copying typed_ast/conversions.py -> build/lib.linux-x86_64-cpython-314/typed_ast copying typed_ast/__init__.py -> build/lib.linux-x86_64-cpython-314/typed_ast copying typed_ast/ast3.py -> build/lib.linux-x86_64-cpython-314/typed_ast copying typed_ast/ast27.py -> build/lib.linux-x86_64-cpython-314/typed_ast copying ast3/tests/test_basics.py -> build/lib.linux-x86_64-cpython-314/typed_ast/tests running build_ext building '_ast27' extension gcc -fno-strict-overflow -Wsign-compare -DNDEBUG -g -O3 -Wall -fPIC -Iast27/Include -I/home/runner/work/_temp/setup-uv-cache/builds-v0/.tmpbaDYN8/include -I/opt/hostedtoolcache/Python/3.14.2/x64/include/python3.14 -c ast27/Custom/typed_ast.c -o build/temp.linux-x86_64-cpython-314/ast27/Custom/typed_ast.o [stderr] In file included from /opt/hostedtoolcache/Python/3.14.2/x64/include/python3.14/pyport.h:388, from /opt/hostedtoolcache/Python/3.14.2/x64/include/python3.14/Python.h:72, from ast27/Custom/typed_ast.c:1: ast27/Custom/../Include/compile.h:12:12: error: unknown type name \u2018PyFutureFeatures\u2019 12 | PyAPI_FUNC(PyFutureFeatures *) PyFuture_FromAST(struct _mod *, const char *); | ^~~~~~~~~~~~~~~~ /opt/hostedtoolcache/Python/3.14.2/x64/include/python3.14/exports.h:91:53: note: in definition of macro \u2018PyAPI_FUNC\u2019 91 | # define PyAPI_FUNC(RTYPE) Py_EXPORTED_SYMBOL RTYPE | ^~~~~ error: command '/usr/bin/gcc' failed with exit code 1 hint: `typed-ast` (v1.5.5) was included because `datamodel-code-ge..." + }, + { + "version": "0.17.2", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "default", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "Using Python 3.14.2 environment at: Resolved 42 packages in 10ms Building typed-ast==1.5.5 \u00d7 Failed to build `typed-ast==1.5.5` \u251c\u2500\u25b6 The build backend returned an error \u2570\u2500\u25b6 Call to `setuptools.build_meta:__legacy__.build_wheel` failed (exit status: 1) [stdout] running bdist_wheel running build running build_py copying typed_ast/conversions.py -> build/lib.linux-x86_64-cpython-314/typed_ast copying typed_ast/__init__.py -> build/lib.linux-x86_64-cpython-314/typed_ast copying typed_ast/ast3.py -> build/lib.linux-x86_64-cpython-314/typed_ast copying typed_ast/ast27.py -> build/lib.linux-x86_64-cpython-314/typed_ast copying ast3/tests/test_basics.py -> build/lib.linux-x86_64-cpython-314/typed_ast/tests running build_ext building '_ast27' extension gcc -fno-strict-overflow -Wsign-compare -DNDEBUG -g -O3 -Wall -fPIC -Iast27/Include -I/home/runner/work/_temp/setup-uv-cache/builds-v0/.tmpbaDYN8/include -I/opt/hostedtoolcache/Python/3.14.2/x64/include/python3.14 -c ast27/Custom/typed_ast.c -o build/temp.linux-x86_64-cpython-314/ast27/Custom/typed_ast.o [stderr] In file included from /opt/hostedtoolcache/Python/3.14.2/x64/include/python3.14/pyport.h:388, from /opt/hostedtoolcache/Python/3.14.2/x64/include/python3.14/Python.h:72, from ast27/Custom/typed_ast.c:1: ast27/Custom/../Include/compile.h:12:12: error: unknown type name \u2018PyFutureFeatures\u2019 12 | PyAPI_FUNC(PyFutureFeatures *) PyFuture_FromAST(struct _mod *, const char *); | ^~~~~~~~~~~~~~~~ /opt/hostedtoolcache/Python/3.14.2/x64/include/python3.14/exports.h:91:53: note: in definition of macro \u2018PyAPI_FUNC\u2019 91 | # define PyAPI_FUNC(RTYPE) Py_EXPORTED_SYMBOL RTYPE | ^~~~~ error: command '/usr/bin/gcc' failed with exit code 1 hint: `typed-ast` (v1.5.5) was included because `datamodel-code-ge..." + }, + { + "version": "0.17.2", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Using Python 3.14.2 environment at: Resolved 42 packages in 10ms Building typed-ast==1.5.5 \u00d7 Failed to build `typed-ast==1.5.5` \u251c\u2500\u25b6 The build backend returned an error \u2570\u2500\u25b6 Call to `setuptools.build_meta:__legacy__.build_wheel` failed (exit status: 1) [stdout] running bdist_wheel running build running build_py copying typed_ast/conversions.py -> build/lib.linux-x86_64-cpython-314/typed_ast copying typed_ast/__init__.py -> build/lib.linux-x86_64-cpython-314/typed_ast copying typed_ast/ast3.py -> build/lib.linux-x86_64-cpython-314/typed_ast copying typed_ast/ast27.py -> build/lib.linux-x86_64-cpython-314/typed_ast copying ast3/tests/test_basics.py -> build/lib.linux-x86_64-cpython-314/typed_ast/tests running build_ext building '_ast27' extension gcc -fno-strict-overflow -Wsign-compare -DNDEBUG -g -O3 -Wall -fPIC -Iast27/Include -I/home/runner/work/_temp/setup-uv-cache/builds-v0/.tmpbaDYN8/include -I/opt/hostedtoolcache/Python/3.14.2/x64/include/python3.14 -c ast27/Custom/typed_ast.c -o build/temp.linux-x86_64-cpython-314/ast27/Custom/typed_ast.o [stderr] In file included from /opt/hostedtoolcache/Python/3.14.2/x64/include/python3.14/pyport.h:388, from /opt/hostedtoolcache/Python/3.14.2/x64/include/python3.14/Python.h:72, from ast27/Custom/typed_ast.c:1: ast27/Custom/../Include/compile.h:12:12: error: unknown type name \u2018PyFutureFeatures\u2019 12 | PyAPI_FUNC(PyFutureFeatures *) PyFuture_FromAST(struct _mod *, const char *); | ^~~~~~~~~~~~~~~~ /opt/hostedtoolcache/Python/3.14.2/x64/include/python3.14/exports.h:91:53: note: in definition of macro \u2018PyAPI_FUNC\u2019 91 | # define PyAPI_FUNC(RTYPE) Py_EXPORTED_SYMBOL RTYPE | ^~~~~ error: command '/usr/bin/gcc' failed with exit code 1 hint: `typed-ast` (v1.5.5) was included because `datamodel-code-ge..." + }, + { + "version": "0.17.2", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "Using Python 3.14.2 environment at: Resolved 42 packages in 10ms Building typed-ast==1.5.5 \u00d7 Failed to build `typed-ast==1.5.5` \u251c\u2500\u25b6 The build backend returned an error \u2570\u2500\u25b6 Call to `setuptools.build_meta:__legacy__.build_wheel` failed (exit status: 1) [stdout] running bdist_wheel running build running build_py copying typed_ast/conversions.py -> build/lib.linux-x86_64-cpython-314/typed_ast copying typed_ast/__init__.py -> build/lib.linux-x86_64-cpython-314/typed_ast copying typed_ast/ast3.py -> build/lib.linux-x86_64-cpython-314/typed_ast copying typed_ast/ast27.py -> build/lib.linux-x86_64-cpython-314/typed_ast copying ast3/tests/test_basics.py -> build/lib.linux-x86_64-cpython-314/typed_ast/tests running build_ext building '_ast27' extension gcc -fno-strict-overflow -Wsign-compare -DNDEBUG -g -O3 -Wall -fPIC -Iast27/Include -I/home/runner/work/_temp/setup-uv-cache/builds-v0/.tmpbaDYN8/include -I/opt/hostedtoolcache/Python/3.14.2/x64/include/python3.14 -c ast27/Custom/typed_ast.c -o build/temp.linux-x86_64-cpython-314/ast27/Custom/typed_ast.o [stderr] In file included from /opt/hostedtoolcache/Python/3.14.2/x64/include/python3.14/pyport.h:388, from /opt/hostedtoolcache/Python/3.14.2/x64/include/python3.14/Python.h:72, from ast27/Custom/typed_ast.c:1: ast27/Custom/../Include/compile.h:12:12: error: unknown type name \u2018PyFutureFeatures\u2019 12 | PyAPI_FUNC(PyFutureFeatures *) PyFuture_FromAST(struct _mod *, const char *); | ^~~~~~~~~~~~~~~~ /opt/hostedtoolcache/Python/3.14.2/x64/include/python3.14/exports.h:91:53: note: in definition of macro \u2018PyAPI_FUNC\u2019 91 | # define PyAPI_FUNC(RTYPE) Py_EXPORTED_SYMBOL RTYPE | ^~~~~ error: command '/usr/bin/gcc' failed with exit code 1 hint: `typed-ast` (v1.5.5) was included because `datamodel-code-ge..." + }, + { + "version": "0.17.2", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "default", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "Using Python 3.14.2 environment at: Resolved 42 packages in 10ms Building typed-ast==1.5.5 \u00d7 Failed to build `typed-ast==1.5.5` \u251c\u2500\u25b6 The build backend returned an error \u2570\u2500\u25b6 Call to `setuptools.build_meta:__legacy__.build_wheel` failed (exit status: 1) [stdout] running bdist_wheel running build running build_py copying typed_ast/conversions.py -> build/lib.linux-x86_64-cpython-314/typed_ast copying typed_ast/__init__.py -> build/lib.linux-x86_64-cpython-314/typed_ast copying typed_ast/ast3.py -> build/lib.linux-x86_64-cpython-314/typed_ast copying typed_ast/ast27.py -> build/lib.linux-x86_64-cpython-314/typed_ast copying ast3/tests/test_basics.py -> build/lib.linux-x86_64-cpython-314/typed_ast/tests running build_ext building '_ast27' extension gcc -fno-strict-overflow -Wsign-compare -DNDEBUG -g -O3 -Wall -fPIC -Iast27/Include -I/home/runner/work/_temp/setup-uv-cache/builds-v0/.tmpbaDYN8/include -I/opt/hostedtoolcache/Python/3.14.2/x64/include/python3.14 -c ast27/Custom/typed_ast.c -o build/temp.linux-x86_64-cpython-314/ast27/Custom/typed_ast.o [stderr] In file included from /opt/hostedtoolcache/Python/3.14.2/x64/include/python3.14/pyport.h:388, from /opt/hostedtoolcache/Python/3.14.2/x64/include/python3.14/Python.h:72, from ast27/Custom/typed_ast.c:1: ast27/Custom/../Include/compile.h:12:12: error: unknown type name \u2018PyFutureFeatures\u2019 12 | PyAPI_FUNC(PyFutureFeatures *) PyFuture_FromAST(struct _mod *, const char *); | ^~~~~~~~~~~~~~~~ /opt/hostedtoolcache/Python/3.14.2/x64/include/python3.14/exports.h:91:53: note: in definition of macro \u2018PyAPI_FUNC\u2019 91 | # define PyAPI_FUNC(RTYPE) Py_EXPORTED_SYMBOL RTYPE | ^~~~~ error: command '/usr/bin/gcc' failed with exit code 1 hint: `typed-ast` (v1.5.5) was included because `datamodel-code-ge..." + }, + { + "version": "0.17.2", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Using Python 3.14.2 environment at: Resolved 42 packages in 10ms Building typed-ast==1.5.5 \u00d7 Failed to build `typed-ast==1.5.5` \u251c\u2500\u25b6 The build backend returned an error \u2570\u2500\u25b6 Call to `setuptools.build_meta:__legacy__.build_wheel` failed (exit status: 1) [stdout] running bdist_wheel running build running build_py copying typed_ast/conversions.py -> build/lib.linux-x86_64-cpython-314/typed_ast copying typed_ast/__init__.py -> build/lib.linux-x86_64-cpython-314/typed_ast copying typed_ast/ast3.py -> build/lib.linux-x86_64-cpython-314/typed_ast copying typed_ast/ast27.py -> build/lib.linux-x86_64-cpython-314/typed_ast copying ast3/tests/test_basics.py -> build/lib.linux-x86_64-cpython-314/typed_ast/tests running build_ext building '_ast27' extension gcc -fno-strict-overflow -Wsign-compare -DNDEBUG -g -O3 -Wall -fPIC -Iast27/Include -I/home/runner/work/_temp/setup-uv-cache/builds-v0/.tmpbaDYN8/include -I/opt/hostedtoolcache/Python/3.14.2/x64/include/python3.14 -c ast27/Custom/typed_ast.c -o build/temp.linux-x86_64-cpython-314/ast27/Custom/typed_ast.o [stderr] In file included from /opt/hostedtoolcache/Python/3.14.2/x64/include/python3.14/pyport.h:388, from /opt/hostedtoolcache/Python/3.14.2/x64/include/python3.14/Python.h:72, from ast27/Custom/typed_ast.c:1: ast27/Custom/../Include/compile.h:12:12: error: unknown type name \u2018PyFutureFeatures\u2019 12 | PyAPI_FUNC(PyFutureFeatures *) PyFuture_FromAST(struct _mod *, const char *); | ^~~~~~~~~~~~~~~~ /opt/hostedtoolcache/Python/3.14.2/x64/include/python3.14/exports.h:91:53: note: in definition of macro \u2018PyAPI_FUNC\u2019 91 | # define PyAPI_FUNC(RTYPE) Py_EXPORTED_SYMBOL RTYPE | ^~~~~ error: command '/usr/bin/gcc' failed with exit code 1 hint: `typed-ast` (v1.5.5) was included because `datamodel-code-ge..." + }, + { + "version": "0.17.2", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "Using Python 3.14.2 environment at: Resolved 42 packages in 10ms Building typed-ast==1.5.5 \u00d7 Failed to build `typed-ast==1.5.5` \u251c\u2500\u25b6 The build backend returned an error \u2570\u2500\u25b6 Call to `setuptools.build_meta:__legacy__.build_wheel` failed (exit status: 1) [stdout] running bdist_wheel running build running build_py copying typed_ast/conversions.py -> build/lib.linux-x86_64-cpython-314/typed_ast copying typed_ast/__init__.py -> build/lib.linux-x86_64-cpython-314/typed_ast copying typed_ast/ast3.py -> build/lib.linux-x86_64-cpython-314/typed_ast copying typed_ast/ast27.py -> build/lib.linux-x86_64-cpython-314/typed_ast copying ast3/tests/test_basics.py -> build/lib.linux-x86_64-cpython-314/typed_ast/tests running build_ext building '_ast27' extension gcc -fno-strict-overflow -Wsign-compare -DNDEBUG -g -O3 -Wall -fPIC -Iast27/Include -I/home/runner/work/_temp/setup-uv-cache/builds-v0/.tmpbaDYN8/include -I/opt/hostedtoolcache/Python/3.14.2/x64/include/python3.14 -c ast27/Custom/typed_ast.c -o build/temp.linux-x86_64-cpython-314/ast27/Custom/typed_ast.o [stderr] In file included from /opt/hostedtoolcache/Python/3.14.2/x64/include/python3.14/pyport.h:388, from /opt/hostedtoolcache/Python/3.14.2/x64/include/python3.14/Python.h:72, from ast27/Custom/typed_ast.c:1: ast27/Custom/../Include/compile.h:12:12: error: unknown type name \u2018PyFutureFeatures\u2019 12 | PyAPI_FUNC(PyFutureFeatures *) PyFuture_FromAST(struct _mod *, const char *); | ^~~~~~~~~~~~~~~~ /opt/hostedtoolcache/Python/3.14.2/x64/include/python3.14/exports.h:91:53: note: in definition of macro \u2018PyAPI_FUNC\u2019 91 | # define PyAPI_FUNC(RTYPE) Py_EXPORTED_SYMBOL RTYPE | ^~~~~ error: command '/usr/bin/gcc' failed with exit code 1 hint: `typed-ast` (v1.5.5) was included because `datamodel-code-ge..." + }, + { + "version": "0.17.2", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "default", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "Using Python 3.14.2 environment at: Resolved 42 packages in 10ms Building typed-ast==1.5.5 \u00d7 Failed to build `typed-ast==1.5.5` \u251c\u2500\u25b6 The build backend returned an error \u2570\u2500\u25b6 Call to `setuptools.build_meta:__legacy__.build_wheel` failed (exit status: 1) [stdout] running bdist_wheel running build running build_py copying typed_ast/conversions.py -> build/lib.linux-x86_64-cpython-314/typed_ast copying typed_ast/__init__.py -> build/lib.linux-x86_64-cpython-314/typed_ast copying typed_ast/ast3.py -> build/lib.linux-x86_64-cpython-314/typed_ast copying typed_ast/ast27.py -> build/lib.linux-x86_64-cpython-314/typed_ast copying ast3/tests/test_basics.py -> build/lib.linux-x86_64-cpython-314/typed_ast/tests running build_ext building '_ast27' extension gcc -fno-strict-overflow -Wsign-compare -DNDEBUG -g -O3 -Wall -fPIC -Iast27/Include -I/home/runner/work/_temp/setup-uv-cache/builds-v0/.tmpbaDYN8/include -I/opt/hostedtoolcache/Python/3.14.2/x64/include/python3.14 -c ast27/Custom/typed_ast.c -o build/temp.linux-x86_64-cpython-314/ast27/Custom/typed_ast.o [stderr] In file included from /opt/hostedtoolcache/Python/3.14.2/x64/include/python3.14/pyport.h:388, from /opt/hostedtoolcache/Python/3.14.2/x64/include/python3.14/Python.h:72, from ast27/Custom/typed_ast.c:1: ast27/Custom/../Include/compile.h:12:12: error: unknown type name \u2018PyFutureFeatures\u2019 12 | PyAPI_FUNC(PyFutureFeatures *) PyFuture_FromAST(struct _mod *, const char *); | ^~~~~~~~~~~~~~~~ /opt/hostedtoolcache/Python/3.14.2/x64/include/python3.14/exports.h:91:53: note: in definition of macro \u2018PyAPI_FUNC\u2019 91 | # define PyAPI_FUNC(RTYPE) Py_EXPORTED_SYMBOL RTYPE | ^~~~~ error: command '/usr/bin/gcc' failed with exit code 1 hint: `typed-ast` (v1.5.5) was included because `datamodel-code-ge..." + }, + { + "version": "0.17.2", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Using Python 3.14.2 environment at: Resolved 42 packages in 10ms Building typed-ast==1.5.5 \u00d7 Failed to build `typed-ast==1.5.5` \u251c\u2500\u25b6 The build backend returned an error \u2570\u2500\u25b6 Call to `setuptools.build_meta:__legacy__.build_wheel` failed (exit status: 1) [stdout] running bdist_wheel running build running build_py copying typed_ast/conversions.py -> build/lib.linux-x86_64-cpython-314/typed_ast copying typed_ast/__init__.py -> build/lib.linux-x86_64-cpython-314/typed_ast copying typed_ast/ast3.py -> build/lib.linux-x86_64-cpython-314/typed_ast copying typed_ast/ast27.py -> build/lib.linux-x86_64-cpython-314/typed_ast copying ast3/tests/test_basics.py -> build/lib.linux-x86_64-cpython-314/typed_ast/tests running build_ext building '_ast27' extension gcc -fno-strict-overflow -Wsign-compare -DNDEBUG -g -O3 -Wall -fPIC -Iast27/Include -I/home/runner/work/_temp/setup-uv-cache/builds-v0/.tmpbaDYN8/include -I/opt/hostedtoolcache/Python/3.14.2/x64/include/python3.14 -c ast27/Custom/typed_ast.c -o build/temp.linux-x86_64-cpython-314/ast27/Custom/typed_ast.o [stderr] In file included from /opt/hostedtoolcache/Python/3.14.2/x64/include/python3.14/pyport.h:388, from /opt/hostedtoolcache/Python/3.14.2/x64/include/python3.14/Python.h:72, from ast27/Custom/typed_ast.c:1: ast27/Custom/../Include/compile.h:12:12: error: unknown type name \u2018PyFutureFeatures\u2019 12 | PyAPI_FUNC(PyFutureFeatures *) PyFuture_FromAST(struct _mod *, const char *); | ^~~~~~~~~~~~~~~~ /opt/hostedtoolcache/Python/3.14.2/x64/include/python3.14/exports.h:91:53: note: in definition of macro \u2018PyAPI_FUNC\u2019 91 | # define PyAPI_FUNC(RTYPE) Py_EXPORTED_SYMBOL RTYPE | ^~~~~ error: command '/usr/bin/gcc' failed with exit code 1 hint: `typed-ast` (v1.5.5) was included because `datamodel-code-ge..." + }, + { + "version": "0.17.2", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "Using Python 3.14.2 environment at: Resolved 42 packages in 10ms Building typed-ast==1.5.5 \u00d7 Failed to build `typed-ast==1.5.5` \u251c\u2500\u25b6 The build backend returned an error \u2570\u2500\u25b6 Call to `setuptools.build_meta:__legacy__.build_wheel` failed (exit status: 1) [stdout] running bdist_wheel running build running build_py copying typed_ast/conversions.py -> build/lib.linux-x86_64-cpython-314/typed_ast copying typed_ast/__init__.py -> build/lib.linux-x86_64-cpython-314/typed_ast copying typed_ast/ast3.py -> build/lib.linux-x86_64-cpython-314/typed_ast copying typed_ast/ast27.py -> build/lib.linux-x86_64-cpython-314/typed_ast copying ast3/tests/test_basics.py -> build/lib.linux-x86_64-cpython-314/typed_ast/tests running build_ext building '_ast27' extension gcc -fno-strict-overflow -Wsign-compare -DNDEBUG -g -O3 -Wall -fPIC -Iast27/Include -I/home/runner/work/_temp/setup-uv-cache/builds-v0/.tmpbaDYN8/include -I/opt/hostedtoolcache/Python/3.14.2/x64/include/python3.14 -c ast27/Custom/typed_ast.c -o build/temp.linux-x86_64-cpython-314/ast27/Custom/typed_ast.o [stderr] In file included from /opt/hostedtoolcache/Python/3.14.2/x64/include/python3.14/pyport.h:388, from /opt/hostedtoolcache/Python/3.14.2/x64/include/python3.14/Python.h:72, from ast27/Custom/typed_ast.c:1: ast27/Custom/../Include/compile.h:12:12: error: unknown type name \u2018PyFutureFeatures\u2019 12 | PyAPI_FUNC(PyFutureFeatures *) PyFuture_FromAST(struct _mod *, const char *); | ^~~~~~~~~~~~~~~~ /opt/hostedtoolcache/Python/3.14.2/x64/include/python3.14/exports.h:91:53: note: in definition of macro \u2018PyAPI_FUNC\u2019 91 | # define PyAPI_FUNC(RTYPE) Py_EXPORTED_SYMBOL RTYPE | ^~~~~ error: command '/usr/bin/gcc' failed with exit code 1 hint: `typed-ast` (v1.5.5) was included because `datamodel-code-ge..." + }, + { + "version": "0.17.2", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "default", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "Using Python 3.14.2 environment at: Resolved 42 packages in 10ms Building typed-ast==1.5.5 \u00d7 Failed to build `typed-ast==1.5.5` \u251c\u2500\u25b6 The build backend returned an error \u2570\u2500\u25b6 Call to `setuptools.build_meta:__legacy__.build_wheel` failed (exit status: 1) [stdout] running bdist_wheel running build running build_py copying typed_ast/conversions.py -> build/lib.linux-x86_64-cpython-314/typed_ast copying typed_ast/__init__.py -> build/lib.linux-x86_64-cpython-314/typed_ast copying typed_ast/ast3.py -> build/lib.linux-x86_64-cpython-314/typed_ast copying typed_ast/ast27.py -> build/lib.linux-x86_64-cpython-314/typed_ast copying ast3/tests/test_basics.py -> build/lib.linux-x86_64-cpython-314/typed_ast/tests running build_ext building '_ast27' extension gcc -fno-strict-overflow -Wsign-compare -DNDEBUG -g -O3 -Wall -fPIC -Iast27/Include -I/home/runner/work/_temp/setup-uv-cache/builds-v0/.tmpbaDYN8/include -I/opt/hostedtoolcache/Python/3.14.2/x64/include/python3.14 -c ast27/Custom/typed_ast.c -o build/temp.linux-x86_64-cpython-314/ast27/Custom/typed_ast.o [stderr] In file included from /opt/hostedtoolcache/Python/3.14.2/x64/include/python3.14/pyport.h:388, from /opt/hostedtoolcache/Python/3.14.2/x64/include/python3.14/Python.h:72, from ast27/Custom/typed_ast.c:1: ast27/Custom/../Include/compile.h:12:12: error: unknown type name \u2018PyFutureFeatures\u2019 12 | PyAPI_FUNC(PyFutureFeatures *) PyFuture_FromAST(struct _mod *, const char *); | ^~~~~~~~~~~~~~~~ /opt/hostedtoolcache/Python/3.14.2/x64/include/python3.14/exports.h:91:53: note: in definition of macro \u2018PyAPI_FUNC\u2019 91 | # define PyAPI_FUNC(RTYPE) Py_EXPORTED_SYMBOL RTYPE | ^~~~~ error: command '/usr/bin/gcc' failed with exit code 1 hint: `typed-ast` (v1.5.5) was included because `datamodel-code-ge..." + }, + { + "version": "0.17.2", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Using Python 3.14.2 environment at: Resolved 42 packages in 10ms Building typed-ast==1.5.5 \u00d7 Failed to build `typed-ast==1.5.5` \u251c\u2500\u25b6 The build backend returned an error \u2570\u2500\u25b6 Call to `setuptools.build_meta:__legacy__.build_wheel` failed (exit status: 1) [stdout] running bdist_wheel running build running build_py copying typed_ast/conversions.py -> build/lib.linux-x86_64-cpython-314/typed_ast copying typed_ast/__init__.py -> build/lib.linux-x86_64-cpython-314/typed_ast copying typed_ast/ast3.py -> build/lib.linux-x86_64-cpython-314/typed_ast copying typed_ast/ast27.py -> build/lib.linux-x86_64-cpython-314/typed_ast copying ast3/tests/test_basics.py -> build/lib.linux-x86_64-cpython-314/typed_ast/tests running build_ext building '_ast27' extension gcc -fno-strict-overflow -Wsign-compare -DNDEBUG -g -O3 -Wall -fPIC -Iast27/Include -I/home/runner/work/_temp/setup-uv-cache/builds-v0/.tmpbaDYN8/include -I/opt/hostedtoolcache/Python/3.14.2/x64/include/python3.14 -c ast27/Custom/typed_ast.c -o build/temp.linux-x86_64-cpython-314/ast27/Custom/typed_ast.o [stderr] In file included from /opt/hostedtoolcache/Python/3.14.2/x64/include/python3.14/pyport.h:388, from /opt/hostedtoolcache/Python/3.14.2/x64/include/python3.14/Python.h:72, from ast27/Custom/typed_ast.c:1: ast27/Custom/../Include/compile.h:12:12: error: unknown type name \u2018PyFutureFeatures\u2019 12 | PyAPI_FUNC(PyFutureFeatures *) PyFuture_FromAST(struct _mod *, const char *); | ^~~~~~~~~~~~~~~~ /opt/hostedtoolcache/Python/3.14.2/x64/include/python3.14/exports.h:91:53: note: in definition of macro \u2018PyAPI_FUNC\u2019 91 | # define PyAPI_FUNC(RTYPE) Py_EXPORTED_SYMBOL RTYPE | ^~~~~ error: command '/usr/bin/gcc' failed with exit code 1 hint: `typed-ast` (v1.5.5) was included because `datamodel-code-ge..." + }, + { + "version": "0.25.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: unrecognized arguments: --formatters builtin" + }, + { + "version": "0.25.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 3437.675, + "min_ms": 3434.473, + "max_ms": 3450.745, + "stdev_ms": 8.62, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.25.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: unrecognized arguments: --formatters ruff-check ruff-format" + }, + { + "version": "0.25.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: unrecognized arguments: --formatters builtin" + }, + { + "version": "0.25.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 386.88, + "min_ms": 386.71, + "max_ms": 392.235, + "stdev_ms": 3.142, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.25.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: unrecognized arguments: --formatters ruff-check ruff-format" + }, + { + "version": "0.25.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: unrecognized arguments: --formatters builtin" + }, + { + "version": "0.25.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 3199.408, + "min_ms": 3125.231, + "max_ms": 3199.943, + "stdev_ms": 42.982, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.25.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: unrecognized arguments: --formatters ruff-check ruff-format" + }, + { + "version": "0.25.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: unrecognized arguments: --formatters builtin" + }, + { + "version": "0.25.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 425.207, + "min_ms": 420.633, + "max_ms": 428.595, + "stdev_ms": 3.995, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.25.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: unrecognized arguments: --formatters ruff-check ruff-format" + }, + { + "version": "0.25.2", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: unrecognized arguments: --formatters builtin" + }, + { + "version": "0.25.2", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 3671.06, + "min_ms": 3618.839, + "max_ms": 3845.001, + "stdev_ms": 118.414, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.25.2", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: unrecognized arguments: --formatters ruff-check ruff-format" + }, + { + "version": "0.25.2", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: unrecognized arguments: --formatters builtin" + }, + { + "version": "0.25.2", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 417.8, + "min_ms": 414.03, + "max_ms": 417.939, + "stdev_ms": 2.218, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.25.2", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: unrecognized arguments: --formatters ruff-check ruff-format" + }, + { + "version": "0.25.2", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: unrecognized arguments: --formatters builtin" + }, + { + "version": "0.25.2", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 3282.125, + "min_ms": 3276.224, + "max_ms": 3318.271, + "stdev_ms": 22.764, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.25.2", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: unrecognized arguments: --formatters ruff-check ruff-format" + }, + { + "version": "0.25.2", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: unrecognized arguments: --formatters builtin" + }, + { + "version": "0.25.2", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 459.88, + "min_ms": 455.168, + "max_ms": 474.289, + "stdev_ms": 9.962, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.25.2", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: unrecognized arguments: --formatters ruff-check ruff-format" + }, + { + "version": "0.25.4", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: unrecognized arguments: --formatters builtin" + }, + { + "version": "0.25.4", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 3488.498, + "min_ms": 3452.695, + "max_ms": 3490.267, + "stdev_ms": 21.2, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.25.4", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: unrecognized arguments: --formatters ruff-check ruff-format" + }, + { + "version": "0.25.4", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: unrecognized arguments: --formatters builtin" + }, + { + "version": "0.25.4", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 396.39, + "min_ms": 394.673, + "max_ms": 402.313, + "stdev_ms": 4.008, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.25.4", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: unrecognized arguments: --formatters ruff-check ruff-format" + }, + { + "version": "0.25.4", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: unrecognized arguments: --formatters builtin" + }, + { + "version": "0.25.4", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 3188.523, + "min_ms": 3181.403, + "max_ms": 3224.649, + "stdev_ms": 23.187, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.25.4", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: unrecognized arguments: --formatters ruff-check ruff-format" + }, + { + "version": "0.25.4", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: unrecognized arguments: --formatters builtin" + }, + { + "version": "0.25.4", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 436.513, + "min_ms": 434.687, + "max_ms": 437.654, + "stdev_ms": 1.497, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.25.4", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: unrecognized arguments: --formatters ruff-check ruff-format" + }, + { + "version": "0.25.6", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: unrecognized arguments: --formatters builtin" + }, + { + "version": "0.25.6", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 3415.537, + "min_ms": 3310.082, + "max_ms": 3670.968, + "stdev_ms": 185.564, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.25.6", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: unrecognized arguments: --formatters ruff-check ruff-format" + }, + { + "version": "0.25.6", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: unrecognized arguments: --formatters builtin" + }, + { + "version": "0.25.6", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 412.531, + "min_ms": 411.051, + "max_ms": 421.034, + "stdev_ms": 5.388, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.25.6", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: unrecognized arguments: --formatters ruff-check ruff-format" + }, + { + "version": "0.25.6", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: unrecognized arguments: --formatters builtin" + }, + { + "version": "0.25.6", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 3099.583, + "min_ms": 3029.932, + "max_ms": 3155.15, + "stdev_ms": 62.741, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.25.6", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: unrecognized arguments: --formatters ruff-check ruff-format" + }, + { + "version": "0.25.6", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: unrecognized arguments: --formatters builtin" + }, + { + "version": "0.25.6", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 446.511, + "min_ms": 444.555, + "max_ms": 478.991, + "stdev_ms": 19.342, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.25.6", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: unrecognized arguments: --formatters ruff-check ruff-format" + }, + { + "version": "0.25.7", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: unrecognized arguments: --formatters builtin" + }, + { + "version": "0.25.7", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 3171.086, + "min_ms": 3138.074, + "max_ms": 3207.573, + "stdev_ms": 34.764, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.25.7", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: unrecognized arguments: --formatters ruff-check ruff-format" + }, + { + "version": "0.25.7", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: unrecognized arguments: --formatters builtin" + }, + { + "version": "0.25.7", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 396.383, + "min_ms": 394.289, + "max_ms": 399.772, + "stdev_ms": 2.767, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.25.7", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: unrecognized arguments: --formatters ruff-check ruff-format" + }, + { + "version": "0.25.7", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: unrecognized arguments: --formatters builtin" + }, + { + "version": "0.25.7", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 2924.996, + "min_ms": 2907.288, + "max_ms": 2938.075, + "stdev_ms": 15.451, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.25.7", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: unrecognized arguments: --formatters ruff-check ruff-format" + }, + { + "version": "0.25.7", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: unrecognized arguments: --formatters builtin" + }, + { + "version": "0.25.7", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 428.434, + "min_ms": 426.27, + "max_ms": 429.974, + "stdev_ms": 1.861, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.25.7", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: unrecognized arguments: --formatters ruff-check ruff-format" + }, + { + "version": "0.25.9", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: unrecognized arguments: --formatters builtin" + }, + { + "version": "0.25.9", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 3756.553, + "min_ms": 3634.098, + "max_ms": 3810.308, + "stdev_ms": 90.309, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.25.9", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: unrecognized arguments: --formatters ruff-check ruff-format" + }, + { + "version": "0.25.9", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: unrecognized arguments: --formatters builtin" + }, + { + "version": "0.25.9", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 404.428, + "min_ms": 401.902, + "max_ms": 410.079, + "stdev_ms": 4.187, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.25.9", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: unrecognized arguments: --formatters ruff-check ruff-format" + }, + { + "version": "0.25.9", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: unrecognized arguments: --formatters builtin" + }, + { + "version": "0.25.9", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 3313.878, + "min_ms": 3279.241, + "max_ms": 3371.686, + "stdev_ms": 46.704, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.25.9", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: unrecognized arguments: --formatters ruff-check ruff-format" + }, + { + "version": "0.25.9", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: unrecognized arguments: --formatters builtin" + }, + { + "version": "0.25.9", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 439.777, + "min_ms": 437.918, + "max_ms": 440.855, + "stdev_ms": 1.486, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.25.9", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: unrecognized arguments: --formatters ruff-check ruff-format" + }, + { + "version": "0.26.1", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: unrecognized arguments: --formatters builtin" + }, + { + "version": "0.26.1", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 3871.338, + "min_ms": 3799.202, + "max_ms": 3944.924, + "stdev_ms": 72.862, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.26.1", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: unrecognized arguments: --formatters ruff-check ruff-format" + }, + { + "version": "0.26.1", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: unrecognized arguments: --formatters builtin" + }, + { + "version": "0.26.1", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 422.829, + "min_ms": 405.517, + "max_ms": 424.729, + "stdev_ms": 10.586, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.26.1", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: unrecognized arguments: --formatters ruff-check ruff-format" + }, + { + "version": "0.26.1", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: unrecognized arguments: --formatters builtin" + }, + { + "version": "0.26.1", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 3525.146, + "min_ms": 3477.849, + "max_ms": 3597.998, + "stdev_ms": 60.526, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.26.1", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: unrecognized arguments: --formatters ruff-check ruff-format" + }, + { + "version": "0.26.1", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: unrecognized arguments: --formatters builtin" + }, + { + "version": "0.26.1", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 495.077, + "min_ms": 478.385, + "max_ms": 496.589, + "stdev_ms": 10.102, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.26.1", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: unrecognized arguments: --formatters ruff-check ruff-format" + }, + { + "version": "0.26.3", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: unrecognized arguments: --formatters builtin" + }, + { + "version": "0.26.3", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 3287.358, + "min_ms": 3283.44, + "max_ms": 3304.462, + "stdev_ms": 11.179, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.26.3", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: unrecognized arguments: --formatters ruff-check ruff-format" + }, + { + "version": "0.26.3", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: unrecognized arguments: --formatters builtin" + }, + { + "version": "0.26.3", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 400.75, + "min_ms": 398.115, + "max_ms": 407.988, + "stdev_ms": 5.112, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.26.3", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: unrecognized arguments: --formatters ruff-check ruff-format" + }, + { + "version": "0.26.3", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: unrecognized arguments: --formatters builtin" + }, + { + "version": "0.26.3", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 3041.395, + "min_ms": 3022.556, + "max_ms": 3062.794, + "stdev_ms": 20.133, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.26.3", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: unrecognized arguments: --formatters ruff-check ruff-format" + }, + { + "version": "0.26.3", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: unrecognized arguments: --formatters builtin" + }, + { + "version": "0.26.3", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 433.565, + "min_ms": 433.389, + "max_ms": 434.195, + "stdev_ms": 0.424, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.26.3", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: unrecognized arguments: --formatters ruff-check ruff-format" + }, + { + "version": "0.26.4", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters builtin" + }, + { + "version": "0.26.4", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 3286.631, + "min_ms": 3229.569, + "max_ms": 3410.438, + "stdev_ms": 92.464, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.26.4", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters ruff-check ruff-format" + }, + { + "version": "0.26.4", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters builtin" + }, + { + "version": "0.26.4", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 404.676, + "min_ms": 401.05, + "max_ms": 408.213, + "stdev_ms": 3.581, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.26.4", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters ruff-check ruff-format" + }, + { + "version": "0.26.4", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters builtin" + }, + { + "version": "0.26.4", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 3013.208, + "min_ms": 2988.506, + "max_ms": 3078.063, + "stdev_ms": 46.254, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.26.4", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters ruff-check ruff-format" + }, + { + "version": "0.26.4", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters builtin" + }, + { + "version": "0.26.4", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 440.781, + "min_ms": 427.078, + "max_ms": 441.705, + "stdev_ms": 8.191, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.26.4", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters ruff-check ruff-format" + }, + { + "version": "0.26.5", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters builtin" + }, + { + "version": "0.26.5", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 3280.459, + "min_ms": 3222.48, + "max_ms": 3331.492, + "stdev_ms": 54.543, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.26.5", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters ruff-check ruff-format" + }, + { + "version": "0.26.5", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters builtin" + }, + { + "version": "0.26.5", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 404.763, + "min_ms": 396.103, + "max_ms": 408.775, + "stdev_ms": 6.477, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.26.5", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters ruff-check ruff-format" + }, + { + "version": "0.26.5", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters builtin" + }, + { + "version": "0.26.5", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 3209.154, + "min_ms": 3167.391, + "max_ms": 3272.75, + "stdev_ms": 53.055, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.26.5", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters ruff-check ruff-format" + }, + { + "version": "0.26.5", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters builtin" + }, + { + "version": "0.26.5", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 439.177, + "min_ms": 426.517, + "max_ms": 443.282, + "stdev_ms": 8.739, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.26.5", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters ruff-check ruff-format" + }, + { + "version": "0.27.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters builtin" + }, + { + "version": "0.27.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 3653.789, + "min_ms": 3642.647, + "max_ms": 3762.304, + "stdev_ms": 66.102, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.27.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters ruff-check ruff-format" + }, + { + "version": "0.27.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters builtin" + }, + { + "version": "0.27.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 488.155, + "min_ms": 478.874, + "max_ms": 490.98, + "stdev_ms": 6.334, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.27.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters ruff-check ruff-format" + }, + { + "version": "0.27.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters builtin" + }, + { + "version": "0.27.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 3470.973, + "min_ms": 3467.81, + "max_ms": 3476.308, + "stdev_ms": 4.295, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.27.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters ruff-check ruff-format" + }, + { + "version": "0.27.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters builtin" + }, + { + "version": "0.27.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 490.599, + "min_ms": 489.287, + "max_ms": 493.566, + "stdev_ms": 2.192, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.27.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters ruff-check ruff-format" + }, + { + "version": "0.27.1", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters builtin" + }, + { + "version": "0.27.1", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 3512.595, + "min_ms": 3427.5, + "max_ms": 3521.687, + "stdev_ms": 51.953, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.27.1", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters ruff-check ruff-format" + }, + { + "version": "0.27.1", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters builtin" + }, + { + "version": "0.27.1", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 391.846, + "min_ms": 390.896, + "max_ms": 393.149, + "stdev_ms": 1.131, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.27.1", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters ruff-check ruff-format" + }, + { + "version": "0.27.1", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters builtin" + }, + { + "version": "0.27.1", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 3292.006, + "min_ms": 3260.119, + "max_ms": 3296.701, + "stdev_ms": 19.905, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.27.1", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters ruff-check ruff-format" + }, + { + "version": "0.27.1", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters builtin" + }, + { + "version": "0.27.1", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 442.265, + "min_ms": 435.808, + "max_ms": 444.821, + "stdev_ms": 4.645, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.27.1", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters ruff-check ruff-format" + }, + { + "version": "0.27.2", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters builtin" + }, + { + "version": "0.27.2", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 3388.32, + "min_ms": 3373.114, + "max_ms": 3425.898, + "stdev_ms": 27.171, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.27.2", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters ruff-check ruff-format" + }, + { + "version": "0.27.2", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters builtin" + }, + { + "version": "0.27.2", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 389.316, + "min_ms": 387.859, + "max_ms": 392.298, + "stdev_ms": 2.263, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.27.2", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters ruff-check ruff-format" + }, + { + "version": "0.27.2", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters builtin" + }, + { + "version": "0.27.2", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 3201.181, + "min_ms": 3111.191, + "max_ms": 3211.277, + "stdev_ms": 55.102, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.27.2", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters ruff-check ruff-format" + }, + { + "version": "0.27.2", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters builtin" + }, + { + "version": "0.27.2", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 433.085, + "min_ms": 430.577, + "max_ms": 437.777, + "stdev_ms": 3.655, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.27.2", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters ruff-check ruff-format" + }, + { + "version": "0.27.3", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters builtin" + }, + { + "version": "0.27.3", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 3786.975, + "min_ms": 3766.92, + "max_ms": 3877.917, + "stdev_ms": 59.151, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.27.3", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters ruff-check ruff-format" + }, + { + "version": "0.27.3", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters builtin" + }, + { + "version": "0.27.3", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 431.843, + "min_ms": 420.194, + "max_ms": 440.458, + "stdev_ms": 10.17, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.27.3", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters ruff-check ruff-format" + }, + { + "version": "0.27.3", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters builtin" + }, + { + "version": "0.27.3", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 3593.947, + "min_ms": 3510.704, + "max_ms": 3648.179, + "stdev_ms": 69.246, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.27.3", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters ruff-check ruff-format" + }, + { + "version": "0.27.3", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters builtin" + }, + { + "version": "0.27.3", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 475.272, + "min_ms": 471.156, + "max_ms": 483.654, + "stdev_ms": 6.369, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.27.3", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters ruff-check ruff-format" + }, + { + "version": "0.28.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters builtin" + }, + { + "version": "0.28.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 3235.039, + "min_ms": 3216.677, + "max_ms": 3367.515, + "stdev_ms": 82.3, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.28.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters ruff-check ruff-format" + }, + { + "version": "0.28.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters builtin" + }, + { + "version": "0.28.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 400.21, + "min_ms": 399.608, + "max_ms": 401.497, + "stdev_ms": 0.965, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.28.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters ruff-check ruff-format" + }, + { + "version": "0.28.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters builtin" + }, + { + "version": "0.28.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 3003.728, + "min_ms": 2960.112, + "max_ms": 3066.676, + "stdev_ms": 53.573, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.28.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters ruff-check ruff-format" + }, + { + "version": "0.28.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters builtin" + }, + { + "version": "0.28.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 441.993, + "min_ms": 427.833, + "max_ms": 442.05, + "stdev_ms": 8.192, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.28.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters ruff-check ruff-format" + }, + { + "version": "0.28.1", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters builtin" + }, + { + "version": "0.28.1", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 3651.107, + "min_ms": 3640.071, + "max_ms": 3760.14, + "stdev_ms": 66.366, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.28.1", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters ruff-check ruff-format" + }, + { + "version": "0.28.1", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters builtin" + }, + { + "version": "0.28.1", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 424.931, + "min_ms": 420.644, + "max_ms": 430.506, + "stdev_ms": 4.945, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.28.1", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters ruff-check ruff-format" + }, + { + "version": "0.28.1", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters builtin" + }, + { + "version": "0.28.1", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 3475.362, + "min_ms": 3432.898, + "max_ms": 3556.984, + "stdev_ms": 63.065, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.28.1", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters ruff-check ruff-format" + }, + { + "version": "0.28.1", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters builtin" + }, + { + "version": "0.28.1", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 455.764, + "min_ms": 452.522, + "max_ms": 458.746, + "stdev_ms": 3.112, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.28.1", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters ruff-check ruff-format" + }, + { + "version": "0.28.2", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters builtin" + }, + { + "version": "0.28.2", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 3359.982, + "min_ms": 3358.323, + "max_ms": 3363.709, + "stdev_ms": 2.758, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.28.2", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters ruff-check ruff-format" + }, + { + "version": "0.28.2", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters builtin" + }, + { + "version": "0.28.2", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 405.122, + "min_ms": 404.119, + "max_ms": 418.012, + "stdev_ms": 7.748, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.28.2", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters ruff-check ruff-format" + }, + { + "version": "0.28.2", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters builtin" + }, + { + "version": "0.28.2", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 3196.865, + "min_ms": 3116.515, + "max_ms": 3206.943, + "stdev_ms": 49.556, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.28.2", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters ruff-check ruff-format" + }, + { + "version": "0.28.2", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters builtin" + }, + { + "version": "0.28.2", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 448.979, + "min_ms": 437.862, + "max_ms": 450.449, + "stdev_ms": 6.882, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.28.2", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters ruff-check ruff-format" + }, + { + "version": "0.28.3", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters builtin" + }, + { + "version": "0.28.3", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 3668.266, + "min_ms": 3664.425, + "max_ms": 3713.838, + "stdev_ms": 27.487, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.28.3", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters ruff-check ruff-format" + }, + { + "version": "0.28.3", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters builtin" + }, + { + "version": "0.28.3", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 419.125, + "min_ms": 413.232, + "max_ms": 427.506, + "stdev_ms": 7.173, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.28.3", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters ruff-check ruff-format" + }, + { + "version": "0.28.3", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters builtin" + }, + { + "version": "0.28.3", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 3399.66, + "min_ms": 3339.76, + "max_ms": 3437.605, + "stdev_ms": 49.332, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.28.3", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters ruff-check ruff-format" + }, + { + "version": "0.28.3", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters builtin" + }, + { + "version": "0.28.3", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 455.028, + "min_ms": 454.411, + "max_ms": 465.89, + "stdev_ms": 6.457, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.28.3", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "usage: datamodel-codegen [options] __main__.py: error: unrecognized arguments: --formatters ruff-check ruff-format" + }, + { + "version": "0.28.4", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: argument --formatters: invalid choice: 'builtin' (choose from 'black', 'isort', 'ruff-check', 'ruff-format')" + }, + { + "version": "0.28.4", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 3156.777, + "min_ms": 3156.004, + "max_ms": 3160.832, + "stdev_ms": 2.593, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.28.4", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Traceback (most recent call last): File \"\", line 455, in main generate( ~~~~~~~~^ input_=config.url or config.input or sys.stdin.read(), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...<68 lines>... formatters=config.formatters, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 489, in generate results = parser.parse() File \"\", line 1320, in parse body = code_formatter.format_code(body) File \"\", line 208, in format_code code = self.apply_ruff_lint(code) File \"\", line 225, in apply_ruff_lint result = subprocess.run( # noqa: S603 (\"ruff\", \"check\", \"--fix\", \"-\"), ...<2 lines>... check=False, ) File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 554, in run with Popen(*popenargs, **kwargs) as process: ~~~~~^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1039, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ pass_fds, cwd, env, ^^^^^^^^^^^^^^^^^^^ ...<5 lines>... gid, gids, uid, umask, ^^^^^^^^^^^^^^^^^^^^^^ start_new_session, process_group) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1991, in _execute_child raise child_exception_type(errno_num, err_msg, err_filename) FileNotFoundError: [Errno 2] No such file or directory: 'ruff'" + }, + { + "version": "0.28.4", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: argument --formatters: invalid choice: 'builtin' (choose from 'black', 'isort', 'ruff-check', 'ruff-format')" + }, + { + "version": "0.28.4", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 399.335, + "min_ms": 399.074, + "max_ms": 403.887, + "stdev_ms": 2.707, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.28.4", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Traceback (most recent call last): File \"\", line 455, in main generate( ~~~~~~~~^ input_=config.url or config.input or sys.stdin.read(), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...<68 lines>... formatters=config.formatters, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 489, in generate results = parser.parse() File \"\", line 1320, in parse body = code_formatter.format_code(body) File \"\", line 208, in format_code code = self.apply_ruff_lint(code) File \"\", line 225, in apply_ruff_lint result = subprocess.run( # noqa: S603 (\"ruff\", \"check\", \"--fix\", \"-\"), ...<2 lines>... check=False, ) File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 554, in run with Popen(*popenargs, **kwargs) as process: ~~~~~^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1039, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ pass_fds, cwd, env, ^^^^^^^^^^^^^^^^^^^ ...<5 lines>... gid, gids, uid, umask, ^^^^^^^^^^^^^^^^^^^^^^ start_new_session, process_group) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1991, in _execute_child raise child_exception_type(errno_num, err_msg, err_filename) FileNotFoundError: [Errno 2] No such file or directory: 'ruff'" + }, + { + "version": "0.28.4", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: argument --formatters: invalid choice: 'builtin' (choose from 'black', 'isort', 'ruff-check', 'ruff-format')" + }, + { + "version": "0.28.4", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 2983.027, + "min_ms": 2971.983, + "max_ms": 3004.706, + "stdev_ms": 16.647, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.28.4", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Traceback (most recent call last): File \"\", line 455, in main generate( ~~~~~~~~^ input_=config.url or config.input or sys.stdin.read(), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...<68 lines>... formatters=config.formatters, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 489, in generate results = parser.parse() File \"\", line 1320, in parse body = code_formatter.format_code(body) File \"\", line 208, in format_code code = self.apply_ruff_lint(code) File \"\", line 225, in apply_ruff_lint result = subprocess.run( # noqa: S603 (\"ruff\", \"check\", \"--fix\", \"-\"), ...<2 lines>... check=False, ) File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 554, in run with Popen(*popenargs, **kwargs) as process: ~~~~~^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1039, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ pass_fds, cwd, env, ^^^^^^^^^^^^^^^^^^^ ...<5 lines>... gid, gids, uid, umask, ^^^^^^^^^^^^^^^^^^^^^^ start_new_session, process_group) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1991, in _execute_child raise child_exception_type(errno_num, err_msg, err_filename) FileNotFoundError: [Errno 2] No such file or directory: 'ruff'" + }, + { + "version": "0.28.4", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: argument --formatters: invalid choice: 'builtin' (choose from 'black', 'isort', 'ruff-check', 'ruff-format')" + }, + { + "version": "0.28.4", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 425.938, + "min_ms": 421.465, + "max_ms": 426.002, + "stdev_ms": 2.601, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.28.4", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Traceback (most recent call last): File \"\", line 455, in main generate( ~~~~~~~~^ input_=config.url or config.input or sys.stdin.read(), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...<68 lines>... formatters=config.formatters, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 489, in generate results = parser.parse() File \"\", line 1320, in parse body = code_formatter.format_code(body) File \"\", line 208, in format_code code = self.apply_ruff_lint(code) File \"\", line 225, in apply_ruff_lint result = subprocess.run( # noqa: S603 (\"ruff\", \"check\", \"--fix\", \"-\"), ...<2 lines>... check=False, ) File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 554, in run with Popen(*popenargs, **kwargs) as process: ~~~~~^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1039, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ pass_fds, cwd, env, ^^^^^^^^^^^^^^^^^^^ ...<5 lines>... gid, gids, uid, umask, ^^^^^^^^^^^^^^^^^^^^^^ start_new_session, process_group) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1991, in _execute_child raise child_exception_type(errno_num, err_msg, err_filename) FileNotFoundError: [Errno 2] No such file or directory: 'ruff'" + }, + { + "version": "0.28.5", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: argument --formatters: invalid choice: 'builtin' (choose from 'black', 'isort', 'ruff-check', 'ruff-format')" + }, + { + "version": "0.28.5", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 3930.883, + "min_ms": 3892.901, + "max_ms": 3974.099, + "stdev_ms": 40.627, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.28.5", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Traceback (most recent call last): File \"\", line 455, in main generate( ~~~~~~~~^ input_=config.url or config.input or sys.stdin.read(), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...<68 lines>... formatters=config.formatters, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 489, in generate results = parser.parse() File \"\", line 1343, in parse body = code_formatter.format_code(body) File \"\", line 208, in format_code code = self.apply_ruff_lint(code) File \"\", line 225, in apply_ruff_lint result = subprocess.run( # noqa: S603 (\"ruff\", \"check\", \"--fix\", \"-\"), ...<2 lines>... check=False, ) File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 554, in run with Popen(*popenargs, **kwargs) as process: ~~~~~^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1039, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ pass_fds, cwd, env, ^^^^^^^^^^^^^^^^^^^ ...<5 lines>... gid, gids, uid, umask, ^^^^^^^^^^^^^^^^^^^^^^ start_new_session, process_group) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1991, in _execute_child raise child_exception_type(errno_num, err_msg, err_filename) FileNotFoundError: [Errno 2] No such file or directory: 'ruff'" + }, + { + "version": "0.28.5", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: argument --formatters: invalid choice: 'builtin' (choose from 'black', 'isort', 'ruff-check', 'ruff-format')" + }, + { + "version": "0.28.5", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 435.381, + "min_ms": 414.634, + "max_ms": 452.34, + "stdev_ms": 18.885, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.28.5", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Traceback (most recent call last): File \"\", line 455, in main generate( ~~~~~~~~^ input_=config.url or config.input or sys.stdin.read(), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...<68 lines>... formatters=config.formatters, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 489, in generate results = parser.parse() File \"\", line 1343, in parse body = code_formatter.format_code(body) File \"\", line 208, in format_code code = self.apply_ruff_lint(code) File \"\", line 225, in apply_ruff_lint result = subprocess.run( # noqa: S603 (\"ruff\", \"check\", \"--fix\", \"-\"), ...<2 lines>... check=False, ) File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 554, in run with Popen(*popenargs, **kwargs) as process: ~~~~~^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1039, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ pass_fds, cwd, env, ^^^^^^^^^^^^^^^^^^^ ...<5 lines>... gid, gids, uid, umask, ^^^^^^^^^^^^^^^^^^^^^^ start_new_session, process_group) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1991, in _execute_child raise child_exception_type(errno_num, err_msg, err_filename) FileNotFoundError: [Errno 2] No such file or directory: 'ruff'" + }, + { + "version": "0.28.5", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: argument --formatters: invalid choice: 'builtin' (choose from 'black', 'isort', 'ruff-check', 'ruff-format')" + }, + { + "version": "0.28.5", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 3565.167, + "min_ms": 3542.095, + "max_ms": 3591.607, + "stdev_ms": 24.775, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.28.5", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Traceback (most recent call last): File \"\", line 455, in main generate( ~~~~~~~~^ input_=config.url or config.input or sys.stdin.read(), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...<68 lines>... formatters=config.formatters, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 489, in generate results = parser.parse() File \"\", line 1343, in parse body = code_formatter.format_code(body) File \"\", line 208, in format_code code = self.apply_ruff_lint(code) File \"\", line 225, in apply_ruff_lint result = subprocess.run( # noqa: S603 (\"ruff\", \"check\", \"--fix\", \"-\"), ...<2 lines>... check=False, ) File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 554, in run with Popen(*popenargs, **kwargs) as process: ~~~~~^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1039, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ pass_fds, cwd, env, ^^^^^^^^^^^^^^^^^^^ ...<5 lines>... gid, gids, uid, umask, ^^^^^^^^^^^^^^^^^^^^^^ start_new_session, process_group) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1991, in _execute_child raise child_exception_type(errno_num, err_msg, err_filename) FileNotFoundError: [Errno 2] No such file or directory: 'ruff'" + }, + { + "version": "0.28.5", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: argument --formatters: invalid choice: 'builtin' (choose from 'black', 'isort', 'ruff-check', 'ruff-format')" + }, + { + "version": "0.28.5", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 479.098, + "min_ms": 469.15, + "max_ms": 485.181, + "stdev_ms": 8.092, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.28.5", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Traceback (most recent call last): File \"\", line 455, in main generate( ~~~~~~~~^ input_=config.url or config.input or sys.stdin.read(), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...<68 lines>... formatters=config.formatters, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 489, in generate results = parser.parse() File \"\", line 1343, in parse body = code_formatter.format_code(body) File \"\", line 208, in format_code code = self.apply_ruff_lint(code) File \"\", line 225, in apply_ruff_lint result = subprocess.run( # noqa: S603 (\"ruff\", \"check\", \"--fix\", \"-\"), ...<2 lines>... check=False, ) File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 554, in run with Popen(*popenargs, **kwargs) as process: ~~~~~^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1039, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ pass_fds, cwd, env, ^^^^^^^^^^^^^^^^^^^ ...<5 lines>... gid, gids, uid, umask, ^^^^^^^^^^^^^^^^^^^^^^ start_new_session, process_group) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1991, in _execute_child raise child_exception_type(errno_num, err_msg, err_filename) FileNotFoundError: [Errno 2] No such file or directory: 'ruff'" + }, + { + "version": "0.29.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: argument --formatters: invalid choice: 'builtin' (choose from 'black', 'isort', 'ruff-check', 'ruff-format')" + }, + { + "version": "0.29.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 5147.73, + "min_ms": 5116.213, + "max_ms": 5246.25, + "stdev_ms": 67.834, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.29.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Traceback (most recent call last): File \"\", line 457, in main generate( ~~~~~~~~^ input_=config.url or config.input or sys.stdin.read(), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...<68 lines>... formatters=config.formatters, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 490, in generate results = parser.parse() File \"\", line 1366, in parse body = code_formatter.format_code(body) File \"\", line 208, in format_code code = self.apply_ruff_lint(code) File \"\", line 225, in apply_ruff_lint result = subprocess.run( # noqa: S603 (\"ruff\", \"check\", \"--fix\", \"-\"), ...<2 lines>... check=False, ) File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 554, in run with Popen(*popenargs, **kwargs) as process: ~~~~~^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1039, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ pass_fds, cwd, env, ^^^^^^^^^^^^^^^^^^^ ...<5 lines>... gid, gids, uid, umask, ^^^^^^^^^^^^^^^^^^^^^^ start_new_session, process_group) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1991, in _execute_child raise child_exception_type(errno_num, err_msg, err_filename) FileNotFoundError: [Errno 2] No such file or directory: 'ruff'" + }, + { + "version": "0.29.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: argument --formatters: invalid choice: 'builtin' (choose from 'black', 'isort', 'ruff-check', 'ruff-format')" + }, + { + "version": "0.29.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 2065.711, + "min_ms": 2064.019, + "max_ms": 2124.749, + "stdev_ms": 34.585, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.29.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Traceback (most recent call last): File \"\", line 457, in main generate( ~~~~~~~~^ input_=config.url or config.input or sys.stdin.read(), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...<68 lines>... formatters=config.formatters, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 490, in generate results = parser.parse() File \"\", line 1366, in parse body = code_formatter.format_code(body) File \"\", line 208, in format_code code = self.apply_ruff_lint(code) File \"\", line 225, in apply_ruff_lint result = subprocess.run( # noqa: S603 (\"ruff\", \"check\", \"--fix\", \"-\"), ...<2 lines>... check=False, ) File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 554, in run with Popen(*popenargs, **kwargs) as process: ~~~~~^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1039, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ pass_fds, cwd, env, ^^^^^^^^^^^^^^^^^^^ ...<5 lines>... gid, gids, uid, umask, ^^^^^^^^^^^^^^^^^^^^^^ start_new_session, process_group) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1991, in _execute_child raise child_exception_type(errno_num, err_msg, err_filename) FileNotFoundError: [Errno 2] No such file or directory: 'ruff'" + }, + { + "version": "0.29.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: argument --formatters: invalid choice: 'builtin' (choose from 'black', 'isort', 'ruff-check', 'ruff-format')" + }, + { + "version": "0.29.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 4722.555, + "min_ms": 4689.351, + "max_ms": 4784.136, + "stdev_ms": 48.095, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.29.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Traceback (most recent call last): File \"\", line 457, in main generate( ~~~~~~~~^ input_=config.url or config.input or sys.stdin.read(), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...<68 lines>... formatters=config.formatters, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 490, in generate results = parser.parse() File \"\", line 1366, in parse body = code_formatter.format_code(body) File \"\", line 208, in format_code code = self.apply_ruff_lint(code) File \"\", line 225, in apply_ruff_lint result = subprocess.run( # noqa: S603 (\"ruff\", \"check\", \"--fix\", \"-\"), ...<2 lines>... check=False, ) File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 554, in run with Popen(*popenargs, **kwargs) as process: ~~~~~^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1039, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ pass_fds, cwd, env, ^^^^^^^^^^^^^^^^^^^ ...<5 lines>... gid, gids, uid, umask, ^^^^^^^^^^^^^^^^^^^^^^ start_new_session, process_group) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1991, in _execute_child raise child_exception_type(errno_num, err_msg, err_filename) FileNotFoundError: [Errno 2] No such file or directory: 'ruff'" + }, + { + "version": "0.29.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: argument --formatters: invalid choice: 'builtin' (choose from 'black', 'isort', 'ruff-check', 'ruff-format')" + }, + { + "version": "0.29.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 2108.44, + "min_ms": 2093.183, + "max_ms": 2146.638, + "stdev_ms": 27.535, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.29.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Traceback (most recent call last): File \"\", line 457, in main generate( ~~~~~~~~^ input_=config.url or config.input or sys.stdin.read(), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...<68 lines>... formatters=config.formatters, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 490, in generate results = parser.parse() File \"\", line 1366, in parse body = code_formatter.format_code(body) File \"\", line 208, in format_code code = self.apply_ruff_lint(code) File \"\", line 225, in apply_ruff_lint result = subprocess.run( # noqa: S603 (\"ruff\", \"check\", \"--fix\", \"-\"), ...<2 lines>... check=False, ) File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 554, in run with Popen(*popenargs, **kwargs) as process: ~~~~~^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1039, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ pass_fds, cwd, env, ^^^^^^^^^^^^^^^^^^^ ...<5 lines>... gid, gids, uid, umask, ^^^^^^^^^^^^^^^^^^^^^^ start_new_session, process_group) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1991, in _execute_child raise child_exception_type(errno_num, err_msg, err_filename) FileNotFoundError: [Errno 2] No such file or directory: 'ruff'" + }, + { + "version": "0.30.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: argument --formatters: invalid choice: 'builtin' (choose from 'black', 'isort', 'ruff-check', 'ruff-format')" + }, + { + "version": "0.30.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 5809.72, + "min_ms": 5788.385, + "max_ms": 5823.052, + "stdev_ms": 17.487, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.30.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Traceback (most recent call last): File \"\", line 458, in main generate( ~~~~~~~~^ input_=config.url or config.input or sys.stdin.read(), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...<69 lines>... parent_scoped_naming=config.parent_scoped_naming, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 492, in generate results = parser.parse() File \"\", line 1368, in parse body = code_formatter.format_code(body) File \"\", line 208, in format_code code = self.apply_ruff_lint(code) File \"\", line 225, in apply_ruff_lint result = subprocess.run( # noqa: S603 (\"ruff\", \"check\", \"--fix\", \"-\"), ...<2 lines>... check=False, ) File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 554, in run with Popen(*popenargs, **kwargs) as process: ~~~~~^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1039, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ pass_fds, cwd, env, ^^^^^^^^^^^^^^^^^^^ ...<5 lines>... gid, gids, uid, umask, ^^^^^^^^^^^^^^^^^^^^^^ start_new_session, process_group) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1991, in _execute_child raise child_exception_type(errno_num, err_msg, err_filename) FileNotFoundError: [Errno 2] No such file or directory: 'ruff'" + }, + { + "version": "0.30.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: argument --formatters: invalid choice: 'builtin' (choose from 'black', 'isort', 'ruff-check', 'ruff-format')" + }, + { + "version": "0.30.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 2129.756, + "min_ms": 2103.936, + "max_ms": 2140.593, + "stdev_ms": 18.832, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.30.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Traceback (most recent call last): File \"\", line 458, in main generate( ~~~~~~~~^ input_=config.url or config.input or sys.stdin.read(), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...<69 lines>... parent_scoped_naming=config.parent_scoped_naming, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 492, in generate results = parser.parse() File \"\", line 1368, in parse body = code_formatter.format_code(body) File \"\", line 208, in format_code code = self.apply_ruff_lint(code) File \"\", line 225, in apply_ruff_lint result = subprocess.run( # noqa: S603 (\"ruff\", \"check\", \"--fix\", \"-\"), ...<2 lines>... check=False, ) File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 554, in run with Popen(*popenargs, **kwargs) as process: ~~~~~^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1039, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ pass_fds, cwd, env, ^^^^^^^^^^^^^^^^^^^ ...<5 lines>... gid, gids, uid, umask, ^^^^^^^^^^^^^^^^^^^^^^ start_new_session, process_group) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1991, in _execute_child raise child_exception_type(errno_num, err_msg, err_filename) FileNotFoundError: [Errno 2] No such file or directory: 'ruff'" + }, + { + "version": "0.30.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: argument --formatters: invalid choice: 'builtin' (choose from 'black', 'isort', 'ruff-check', 'ruff-format')" + }, + { + "version": "0.30.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 5362.737, + "min_ms": 5349.383, + "max_ms": 5476.511, + "stdev_ms": 69.863, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.30.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Traceback (most recent call last): File \"\", line 458, in main generate( ~~~~~~~~^ input_=config.url or config.input or sys.stdin.read(), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...<69 lines>... parent_scoped_naming=config.parent_scoped_naming, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 492, in generate results = parser.parse() File \"\", line 1368, in parse body = code_formatter.format_code(body) File \"\", line 208, in format_code code = self.apply_ruff_lint(code) File \"\", line 225, in apply_ruff_lint result = subprocess.run( # noqa: S603 (\"ruff\", \"check\", \"--fix\", \"-\"), ...<2 lines>... check=False, ) File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 554, in run with Popen(*popenargs, **kwargs) as process: ~~~~~^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1039, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ pass_fds, cwd, env, ^^^^^^^^^^^^^^^^^^^ ...<5 lines>... gid, gids, uid, umask, ^^^^^^^^^^^^^^^^^^^^^^ start_new_session, process_group) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1991, in _execute_child raise child_exception_type(errno_num, err_msg, err_filename) FileNotFoundError: [Errno 2] No such file or directory: 'ruff'" + }, + { + "version": "0.30.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: argument --formatters: invalid choice: 'builtin' (choose from 'black', 'isort', 'ruff-check', 'ruff-format')" + }, + { + "version": "0.30.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 2218.146, + "min_ms": 2191.267, + "max_ms": 2231.676, + "stdev_ms": 20.569, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.30.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Traceback (most recent call last): File \"\", line 458, in main generate( ~~~~~~~~^ input_=config.url or config.input or sys.stdin.read(), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...<69 lines>... parent_scoped_naming=config.parent_scoped_naming, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 492, in generate results = parser.parse() File \"\", line 1368, in parse body = code_formatter.format_code(body) File \"\", line 208, in format_code code = self.apply_ruff_lint(code) File \"\", line 225, in apply_ruff_lint result = subprocess.run( # noqa: S603 (\"ruff\", \"check\", \"--fix\", \"-\"), ...<2 lines>... check=False, ) File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 554, in run with Popen(*popenargs, **kwargs) as process: ~~~~~^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1039, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ pass_fds, cwd, env, ^^^^^^^^^^^^^^^^^^^ ...<5 lines>... gid, gids, uid, umask, ^^^^^^^^^^^^^^^^^^^^^^ start_new_session, process_group) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1991, in _execute_child raise child_exception_type(errno_num, err_msg, err_filename) FileNotFoundError: [Errno 2] No such file or directory: 'ruff'" + }, + { + "version": "0.30.1", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: argument --formatters: invalid choice: 'builtin' (choose from 'black', 'isort', 'ruff-check', 'ruff-format')" + }, + { + "version": "0.30.1", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 4062.183, + "min_ms": 4032.969, + "max_ms": 4066.517, + "stdev_ms": 18.247, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.30.1", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Traceback (most recent call last): File \"\", line 458, in main generate( ~~~~~~~~^ input_=config.url or config.input or sys.stdin.read(), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...<69 lines>... parent_scoped_naming=config.parent_scoped_naming, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 492, in generate results = parser.parse() File \"\", line 1373, in parse body = code_formatter.format_code(body) File \"\", line 208, in format_code code = self.apply_ruff_lint(code) File \"\", line 225, in apply_ruff_lint result = subprocess.run( # noqa: S603 (\"ruff\", \"check\", \"--fix\", \"-\"), ...<2 lines>... check=False, ) File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 554, in run with Popen(*popenargs, **kwargs) as process: ~~~~~^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1039, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ pass_fds, cwd, env, ^^^^^^^^^^^^^^^^^^^ ...<5 lines>... gid, gids, uid, umask, ^^^^^^^^^^^^^^^^^^^^^^ start_new_session, process_group) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1991, in _execute_child raise child_exception_type(errno_num, err_msg, err_filename) FileNotFoundError: [Errno 2] No such file or directory: 'ruff'" + }, + { + "version": "0.30.1", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: argument --formatters: invalid choice: 'builtin' (choose from 'black', 'isort', 'ruff-check', 'ruff-format')" + }, + { + "version": "0.30.1", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 1586.035, + "min_ms": 1582.988, + "max_ms": 1614.744, + "stdev_ms": 17.521, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.30.1", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Traceback (most recent call last): File \"\", line 458, in main generate( ~~~~~~~~^ input_=config.url or config.input or sys.stdin.read(), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...<69 lines>... parent_scoped_naming=config.parent_scoped_naming, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 492, in generate results = parser.parse() File \"\", line 1373, in parse body = code_formatter.format_code(body) File \"\", line 208, in format_code code = self.apply_ruff_lint(code) File \"\", line 225, in apply_ruff_lint result = subprocess.run( # noqa: S603 (\"ruff\", \"check\", \"--fix\", \"-\"), ...<2 lines>... check=False, ) File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 554, in run with Popen(*popenargs, **kwargs) as process: ~~~~~^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1039, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ pass_fds, cwd, env, ^^^^^^^^^^^^^^^^^^^ ...<5 lines>... gid, gids, uid, umask, ^^^^^^^^^^^^^^^^^^^^^^ start_new_session, process_group) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1991, in _execute_child raise child_exception_type(errno_num, err_msg, err_filename) FileNotFoundError: [Errno 2] No such file or directory: 'ruff'" + }, + { + "version": "0.30.1", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: argument --formatters: invalid choice: 'builtin' (choose from 'black', 'isort', 'ruff-check', 'ruff-format')" + }, + { + "version": "0.30.1", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 3688.09, + "min_ms": 3680.406, + "max_ms": 3697.99, + "stdev_ms": 8.815, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.30.1", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Traceback (most recent call last): File \"\", line 458, in main generate( ~~~~~~~~^ input_=config.url or config.input or sys.stdin.read(), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...<69 lines>... parent_scoped_naming=config.parent_scoped_naming, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 492, in generate results = parser.parse() File \"\", line 1373, in parse body = code_formatter.format_code(body) File \"\", line 208, in format_code code = self.apply_ruff_lint(code) File \"\", line 225, in apply_ruff_lint result = subprocess.run( # noqa: S603 (\"ruff\", \"check\", \"--fix\", \"-\"), ...<2 lines>... check=False, ) File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 554, in run with Popen(*popenargs, **kwargs) as process: ~~~~~^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1039, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ pass_fds, cwd, env, ^^^^^^^^^^^^^^^^^^^ ...<5 lines>... gid, gids, uid, umask, ^^^^^^^^^^^^^^^^^^^^^^ start_new_session, process_group) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1991, in _execute_child raise child_exception_type(errno_num, err_msg, err_filename) FileNotFoundError: [Errno 2] No such file or directory: 'ruff'" + }, + { + "version": "0.30.1", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: argument --formatters: invalid choice: 'builtin' (choose from 'black', 'isort', 'ruff-check', 'ruff-format')" + }, + { + "version": "0.30.1", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 1628.877, + "min_ms": 1608.365, + "max_ms": 1641.599, + "stdev_ms": 16.768, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.30.1", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Traceback (most recent call last): File \"\", line 458, in main generate( ~~~~~~~~^ input_=config.url or config.input or sys.stdin.read(), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...<69 lines>... parent_scoped_naming=config.parent_scoped_naming, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 492, in generate results = parser.parse() File \"\", line 1373, in parse body = code_formatter.format_code(body) File \"\", line 208, in format_code code = self.apply_ruff_lint(code) File \"\", line 225, in apply_ruff_lint result = subprocess.run( # noqa: S603 (\"ruff\", \"check\", \"--fix\", \"-\"), ...<2 lines>... check=False, ) File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 554, in run with Popen(*popenargs, **kwargs) as process: ~~~~~^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1039, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ pass_fds, cwd, env, ^^^^^^^^^^^^^^^^^^^ ...<5 lines>... gid, gids, uid, umask, ^^^^^^^^^^^^^^^^^^^^^^ start_new_session, process_group) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1991, in _execute_child raise child_exception_type(errno_num, err_msg, err_filename) FileNotFoundError: [Errno 2] No such file or directory: 'ruff'" + }, + { + "version": "0.30.2", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: argument --formatters: invalid choice: 'builtin' (choose from 'black', 'isort', 'ruff-check', 'ruff-format')" + }, + { + "version": "0.30.2", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 6025.93, + "min_ms": 5944.212, + "max_ms": 6052.353, + "stdev_ms": 56.377, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.30.2", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Traceback (most recent call last): File \"\", line 459, in main generate( ~~~~~~~~^ input_=config.url or config.input or sys.stdin.read(), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...<70 lines>... parent_scoped_naming=config.parent_scoped_naming, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 494, in generate results = parser.parse() File \"\", line 1390, in parse body = code_formatter.format_code(body) File \"\", line 208, in format_code code = self.apply_ruff_lint(code) File \"\", line 225, in apply_ruff_lint result = subprocess.run( (\"ruff\", \"check\", \"--fix\", \"-\"), ...<2 lines>... check=False, ) File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 554, in run with Popen(*popenargs, **kwargs) as process: ~~~~~^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1039, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ pass_fds, cwd, env, ^^^^^^^^^^^^^^^^^^^ ...<5 lines>... gid, gids, uid, umask, ^^^^^^^^^^^^^^^^^^^^^^ start_new_session, process_group) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1991, in _execute_child raise child_exception_type(errno_num, err_msg, err_filename) FileNotFoundError: [Errno 2] No such file or directory: 'ruff'" + }, + { + "version": "0.30.2", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: argument --formatters: invalid choice: 'builtin' (choose from 'black', 'isort', 'ruff-check', 'ruff-format')" + }, + { + "version": "0.30.2", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 2234.031, + "min_ms": 2212.66, + "max_ms": 2239.301, + "stdev_ms": 14.108, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.30.2", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Traceback (most recent call last): File \"\", line 459, in main generate( ~~~~~~~~^ input_=config.url or config.input or sys.stdin.read(), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...<70 lines>... parent_scoped_naming=config.parent_scoped_naming, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 494, in generate results = parser.parse() File \"\", line 1390, in parse body = code_formatter.format_code(body) File \"\", line 208, in format_code code = self.apply_ruff_lint(code) File \"\", line 225, in apply_ruff_lint result = subprocess.run( (\"ruff\", \"check\", \"--fix\", \"-\"), ...<2 lines>... check=False, ) File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 554, in run with Popen(*popenargs, **kwargs) as process: ~~~~~^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1039, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ pass_fds, cwd, env, ^^^^^^^^^^^^^^^^^^^ ...<5 lines>... gid, gids, uid, umask, ^^^^^^^^^^^^^^^^^^^^^^ start_new_session, process_group) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1991, in _execute_child raise child_exception_type(errno_num, err_msg, err_filename) FileNotFoundError: [Errno 2] No such file or directory: 'ruff'" + }, + { + "version": "0.30.2", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: argument --formatters: invalid choice: 'builtin' (choose from 'black', 'isort', 'ruff-check', 'ruff-format')" + }, + { + "version": "0.30.2", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 5496.347, + "min_ms": 5364.373, + "max_ms": 5625.828, + "stdev_ms": 130.73, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.30.2", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Traceback (most recent call last): File \"\", line 459, in main generate( ~~~~~~~~^ input_=config.url or config.input or sys.stdin.read(), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...<70 lines>... parent_scoped_naming=config.parent_scoped_naming, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 494, in generate results = parser.parse() File \"\", line 1390, in parse body = code_formatter.format_code(body) File \"\", line 208, in format_code code = self.apply_ruff_lint(code) File \"\", line 225, in apply_ruff_lint result = subprocess.run( (\"ruff\", \"check\", \"--fix\", \"-\"), ...<2 lines>... check=False, ) File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 554, in run with Popen(*popenargs, **kwargs) as process: ~~~~~^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1039, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ pass_fds, cwd, env, ^^^^^^^^^^^^^^^^^^^ ...<5 lines>... gid, gids, uid, umask, ^^^^^^^^^^^^^^^^^^^^^^ start_new_session, process_group) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1991, in _execute_child raise child_exception_type(errno_num, err_msg, err_filename) FileNotFoundError: [Errno 2] No such file or directory: 'ruff'" + }, + { + "version": "0.30.2", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: argument --formatters: invalid choice: 'builtin' (choose from 'black', 'isort', 'ruff-check', 'ruff-format')" + }, + { + "version": "0.30.2", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 2330.796, + "min_ms": 2275.042, + "max_ms": 2362.544, + "stdev_ms": 44.297, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.30.2", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Traceback (most recent call last): File \"\", line 459, in main generate( ~~~~~~~~^ input_=config.url or config.input or sys.stdin.read(), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...<70 lines>... parent_scoped_naming=config.parent_scoped_naming, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 494, in generate results = parser.parse() File \"\", line 1390, in parse body = code_formatter.format_code(body) File \"\", line 208, in format_code code = self.apply_ruff_lint(code) File \"\", line 225, in apply_ruff_lint result = subprocess.run( (\"ruff\", \"check\", \"--fix\", \"-\"), ...<2 lines>... check=False, ) File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 554, in run with Popen(*popenargs, **kwargs) as process: ~~~~~^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1039, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ pass_fds, cwd, env, ^^^^^^^^^^^^^^^^^^^ ...<5 lines>... gid, gids, uid, umask, ^^^^^^^^^^^^^^^^^^^^^^ start_new_session, process_group) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1991, in _execute_child raise child_exception_type(errno_num, err_msg, err_filename) FileNotFoundError: [Errno 2] No such file or directory: 'ruff'" + }, + { + "version": "0.31.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: argument --formatters: invalid choice: 'builtin' (choose from 'black', 'isort', 'ruff-check', 'ruff-format')" + }, + { + "version": "0.31.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 5404.599, + "min_ms": 5341.791, + "max_ms": 5497.798, + "stdev_ms": 78.496, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.31.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Traceback (most recent call last): File \"\", line 460, in main generate( ~~~~~~~~^ input_=config.url or config.input or sys.stdin.read(), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...<71 lines>... parent_scoped_naming=config.parent_scoped_naming, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 496, in generate results = parser.parse() File \"\", line 1394, in parse body = code_formatter.format_code(body) File \"\", line 208, in format_code code = self.apply_ruff_lint(code) File \"\", line 225, in apply_ruff_lint result = subprocess.run( (\"ruff\", \"check\", \"--fix\", \"-\"), ...<2 lines>... check=False, ) File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 554, in run with Popen(*popenargs, **kwargs) as process: ~~~~~^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1039, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ pass_fds, cwd, env, ^^^^^^^^^^^^^^^^^^^ ...<5 lines>... gid, gids, uid, umask, ^^^^^^^^^^^^^^^^^^^^^^ start_new_session, process_group) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1991, in _execute_child raise child_exception_type(errno_num, err_msg, err_filename) FileNotFoundError: [Errno 2] No such file or directory: 'ruff'" + }, + { + "version": "0.31.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: argument --formatters: invalid choice: 'builtin' (choose from 'black', 'isort', 'ruff-check', 'ruff-format')" + }, + { + "version": "0.31.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 2000.435, + "min_ms": 1997.643, + "max_ms": 2024.57, + "stdev_ms": 14.807, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.31.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Traceback (most recent call last): File \"\", line 460, in main generate( ~~~~~~~~^ input_=config.url or config.input or sys.stdin.read(), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...<71 lines>... parent_scoped_naming=config.parent_scoped_naming, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 496, in generate results = parser.parse() File \"\", line 1394, in parse body = code_formatter.format_code(body) File \"\", line 208, in format_code code = self.apply_ruff_lint(code) File \"\", line 225, in apply_ruff_lint result = subprocess.run( (\"ruff\", \"check\", \"--fix\", \"-\"), ...<2 lines>... check=False, ) File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 554, in run with Popen(*popenargs, **kwargs) as process: ~~~~~^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1039, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ pass_fds, cwd, env, ^^^^^^^^^^^^^^^^^^^ ...<5 lines>... gid, gids, uid, umask, ^^^^^^^^^^^^^^^^^^^^^^ start_new_session, process_group) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1991, in _execute_child raise child_exception_type(errno_num, err_msg, err_filename) FileNotFoundError: [Errno 2] No such file or directory: 'ruff'" + }, + { + "version": "0.31.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: argument --formatters: invalid choice: 'builtin' (choose from 'black', 'isort', 'ruff-check', 'ruff-format')" + }, + { + "version": "0.31.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 5072.321, + "min_ms": 4994.132, + "max_ms": 5211.624, + "stdev_ms": 110.167, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.31.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Traceback (most recent call last): File \"\", line 460, in main generate( ~~~~~~~~^ input_=config.url or config.input or sys.stdin.read(), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...<71 lines>... parent_scoped_naming=config.parent_scoped_naming, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 496, in generate results = parser.parse() File \"\", line 1394, in parse body = code_formatter.format_code(body) File \"\", line 208, in format_code code = self.apply_ruff_lint(code) File \"\", line 225, in apply_ruff_lint result = subprocess.run( (\"ruff\", \"check\", \"--fix\", \"-\"), ...<2 lines>... check=False, ) File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 554, in run with Popen(*popenargs, **kwargs) as process: ~~~~~^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1039, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ pass_fds, cwd, env, ^^^^^^^^^^^^^^^^^^^ ...<5 lines>... gid, gids, uid, umask, ^^^^^^^^^^^^^^^^^^^^^^ start_new_session, process_group) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1991, in _execute_child raise child_exception_type(errno_num, err_msg, err_filename) FileNotFoundError: [Errno 2] No such file or directory: 'ruff'" + }, + { + "version": "0.31.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: argument --formatters: invalid choice: 'builtin' (choose from 'black', 'isort', 'ruff-check', 'ruff-format')" + }, + { + "version": "0.31.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 2063.59, + "min_ms": 2045.961, + "max_ms": 2135.609, + "stdev_ms": 47.494, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.31.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Traceback (most recent call last): File \"\", line 460, in main generate( ~~~~~~~~^ input_=config.url or config.input or sys.stdin.read(), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...<71 lines>... parent_scoped_naming=config.parent_scoped_naming, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 496, in generate results = parser.parse() File \"\", line 1394, in parse body = code_formatter.format_code(body) File \"\", line 208, in format_code code = self.apply_ruff_lint(code) File \"\", line 225, in apply_ruff_lint result = subprocess.run( (\"ruff\", \"check\", \"--fix\", \"-\"), ...<2 lines>... check=False, ) File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 554, in run with Popen(*popenargs, **kwargs) as process: ~~~~~^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1039, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ pass_fds, cwd, env, ^^^^^^^^^^^^^^^^^^^ ...<5 lines>... gid, gids, uid, umask, ^^^^^^^^^^^^^^^^^^^^^^ start_new_session, process_group) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1991, in _execute_child raise child_exception_type(errno_num, err_msg, err_filename) FileNotFoundError: [Errno 2] No such file or directory: 'ruff'" + }, + { + "version": "0.31.1", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: argument --formatters: invalid choice: 'builtin' (choose from 'black', 'isort', 'ruff-check', 'ruff-format')" + }, + { + "version": "0.31.1", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 5362.653, + "min_ms": 5333.639, + "max_ms": 5397.088, + "stdev_ms": 31.763, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.31.1", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Traceback (most recent call last): File \"\", line 460, in main generate( ~~~~~~~~^ input_=config.url or config.input or sys.stdin.read(), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...<71 lines>... parent_scoped_naming=config.parent_scoped_naming, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 496, in generate results = parser.parse() File \"\", line 1394, in parse body = code_formatter.format_code(body) File \"\", line 208, in format_code code = self.apply_ruff_lint(code) File \"\", line 225, in apply_ruff_lint result = subprocess.run( (\"ruff\", \"check\", \"--fix\", \"-\"), ...<2 lines>... check=False, ) File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 554, in run with Popen(*popenargs, **kwargs) as process: ~~~~~^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1039, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ pass_fds, cwd, env, ^^^^^^^^^^^^^^^^^^^ ...<5 lines>... gid, gids, uid, umask, ^^^^^^^^^^^^^^^^^^^^^^ start_new_session, process_group) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1991, in _execute_child raise child_exception_type(errno_num, err_msg, err_filename) FileNotFoundError: [Errno 2] No such file or directory: 'ruff'" + }, + { + "version": "0.31.1", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: argument --formatters: invalid choice: 'builtin' (choose from 'black', 'isort', 'ruff-check', 'ruff-format')" + }, + { + "version": "0.31.1", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 2093.495, + "min_ms": 2092.656, + "max_ms": 2110.081, + "stdev_ms": 9.828, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.31.1", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Traceback (most recent call last): File \"\", line 460, in main generate( ~~~~~~~~^ input_=config.url or config.input or sys.stdin.read(), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...<71 lines>... parent_scoped_naming=config.parent_scoped_naming, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 496, in generate results = parser.parse() File \"\", line 1394, in parse body = code_formatter.format_code(body) File \"\", line 208, in format_code code = self.apply_ruff_lint(code) File \"\", line 225, in apply_ruff_lint result = subprocess.run( (\"ruff\", \"check\", \"--fix\", \"-\"), ...<2 lines>... check=False, ) File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 554, in run with Popen(*popenargs, **kwargs) as process: ~~~~~^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1039, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ pass_fds, cwd, env, ^^^^^^^^^^^^^^^^^^^ ...<5 lines>... gid, gids, uid, umask, ^^^^^^^^^^^^^^^^^^^^^^ start_new_session, process_group) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1991, in _execute_child raise child_exception_type(errno_num, err_msg, err_filename) FileNotFoundError: [Errno 2] No such file or directory: 'ruff'" + }, + { + "version": "0.31.1", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: argument --formatters: invalid choice: 'builtin' (choose from 'black', 'isort', 'ruff-check', 'ruff-format')" + }, + { + "version": "0.31.1", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 4824.623, + "min_ms": 4810.365, + "max_ms": 4973.499, + "stdev_ms": 90.351, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.31.1", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Traceback (most recent call last): File \"\", line 460, in main generate( ~~~~~~~~^ input_=config.url or config.input or sys.stdin.read(), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...<71 lines>... parent_scoped_naming=config.parent_scoped_naming, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 496, in generate results = parser.parse() File \"\", line 1394, in parse body = code_formatter.format_code(body) File \"\", line 208, in format_code code = self.apply_ruff_lint(code) File \"\", line 225, in apply_ruff_lint result = subprocess.run( (\"ruff\", \"check\", \"--fix\", \"-\"), ...<2 lines>... check=False, ) File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 554, in run with Popen(*popenargs, **kwargs) as process: ~~~~~^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1039, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ pass_fds, cwd, env, ^^^^^^^^^^^^^^^^^^^ ...<5 lines>... gid, gids, uid, umask, ^^^^^^^^^^^^^^^^^^^^^^ start_new_session, process_group) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1991, in _execute_child raise child_exception_type(errno_num, err_msg, err_filename) FileNotFoundError: [Errno 2] No such file or directory: 'ruff'" + }, + { + "version": "0.31.1", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: argument --formatters: invalid choice: 'builtin' (choose from 'black', 'isort', 'ruff-check', 'ruff-format')" + }, + { + "version": "0.31.1", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 2122.654, + "min_ms": 2102.354, + "max_ms": 2124.249, + "stdev_ms": 12.207, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.31.1", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Traceback (most recent call last): File \"\", line 460, in main generate( ~~~~~~~~^ input_=config.url or config.input or sys.stdin.read(), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...<71 lines>... parent_scoped_naming=config.parent_scoped_naming, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 496, in generate results = parser.parse() File \"\", line 1394, in parse body = code_formatter.format_code(body) File \"\", line 208, in format_code code = self.apply_ruff_lint(code) File \"\", line 225, in apply_ruff_lint result = subprocess.run( (\"ruff\", \"check\", \"--fix\", \"-\"), ...<2 lines>... check=False, ) File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 554, in run with Popen(*popenargs, **kwargs) as process: ~~~~~^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1039, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ pass_fds, cwd, env, ^^^^^^^^^^^^^^^^^^^ ...<5 lines>... gid, gids, uid, umask, ^^^^^^^^^^^^^^^^^^^^^^ start_new_session, process_group) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1991, in _execute_child raise child_exception_type(errno_num, err_msg, err_filename) FileNotFoundError: [Errno 2] No such file or directory: 'ruff'" + }, + { + "version": "0.31.2", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: argument --formatters: invalid choice: 'builtin' (choose from 'black', 'isort', 'ruff-check', 'ruff-format')" + }, + { + "version": "0.31.2", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 5249.001, + "min_ms": 5246.64, + "max_ms": 5396.746, + "stdev_ms": 85.991, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.31.2", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Traceback (most recent call last): File \"\", line 460, in main generate( ~~~~~~~~^ input_=config.url or config.input or sys.stdin.read(), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...<71 lines>... parent_scoped_naming=config.parent_scoped_naming, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 496, in generate results = parser.parse() File \"\", line 1394, in parse body = code_formatter.format_code(body) File \"\", line 208, in format_code code = self.apply_ruff_lint(code) File \"\", line 225, in apply_ruff_lint result = subprocess.run( (\"ruff\", \"check\", \"--fix\", \"-\"), ...<2 lines>... check=False, ) File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 554, in run with Popen(*popenargs, **kwargs) as process: ~~~~~^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1039, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ pass_fds, cwd, env, ^^^^^^^^^^^^^^^^^^^ ...<5 lines>... gid, gids, uid, umask, ^^^^^^^^^^^^^^^^^^^^^^ start_new_session, process_group) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1991, in _execute_child raise child_exception_type(errno_num, err_msg, err_filename) FileNotFoundError: [Errno 2] No such file or directory: 'ruff'" + }, + { + "version": "0.31.2", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: argument --formatters: invalid choice: 'builtin' (choose from 'black', 'isort', 'ruff-check', 'ruff-format')" + }, + { + "version": "0.31.2", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 2048.488, + "min_ms": 2038.292, + "max_ms": 2075.439, + "stdev_ms": 19.193, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.31.2", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Traceback (most recent call last): File \"\", line 460, in main generate( ~~~~~~~~^ input_=config.url or config.input or sys.stdin.read(), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...<71 lines>... parent_scoped_naming=config.parent_scoped_naming, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 496, in generate results = parser.parse() File \"\", line 1394, in parse body = code_formatter.format_code(body) File \"\", line 208, in format_code code = self.apply_ruff_lint(code) File \"\", line 225, in apply_ruff_lint result = subprocess.run( (\"ruff\", \"check\", \"--fix\", \"-\"), ...<2 lines>... check=False, ) File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 554, in run with Popen(*popenargs, **kwargs) as process: ~~~~~^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1039, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ pass_fds, cwd, env, ^^^^^^^^^^^^^^^^^^^ ...<5 lines>... gid, gids, uid, umask, ^^^^^^^^^^^^^^^^^^^^^^ start_new_session, process_group) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1991, in _execute_child raise child_exception_type(errno_num, err_msg, err_filename) FileNotFoundError: [Errno 2] No such file or directory: 'ruff'" + }, + { + "version": "0.31.2", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: argument --formatters: invalid choice: 'builtin' (choose from 'black', 'isort', 'ruff-check', 'ruff-format')" + }, + { + "version": "0.31.2", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 4812.433, + "min_ms": 4763.655, + "max_ms": 4837.09, + "stdev_ms": 37.372, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.31.2", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Traceback (most recent call last): File \"\", line 460, in main generate( ~~~~~~~~^ input_=config.url or config.input or sys.stdin.read(), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...<71 lines>... parent_scoped_naming=config.parent_scoped_naming, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 496, in generate results = parser.parse() File \"\", line 1394, in parse body = code_formatter.format_code(body) File \"\", line 208, in format_code code = self.apply_ruff_lint(code) File \"\", line 225, in apply_ruff_lint result = subprocess.run( (\"ruff\", \"check\", \"--fix\", \"-\"), ...<2 lines>... check=False, ) File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 554, in run with Popen(*popenargs, **kwargs) as process: ~~~~~^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1039, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ pass_fds, cwd, env, ^^^^^^^^^^^^^^^^^^^ ...<5 lines>... gid, gids, uid, umask, ^^^^^^^^^^^^^^^^^^^^^^ start_new_session, process_group) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1991, in _execute_child raise child_exception_type(errno_num, err_msg, err_filename) FileNotFoundError: [Errno 2] No such file or directory: 'ruff'" + }, + { + "version": "0.31.2", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: argument --formatters: invalid choice: 'builtin' (choose from 'black', 'isort', 'ruff-check', 'ruff-format')" + }, + { + "version": "0.31.2", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 2044.303, + "min_ms": 2021.208, + "max_ms": 2079.631, + "stdev_ms": 29.424, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.31.2", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Traceback (most recent call last): File \"\", line 460, in main generate( ~~~~~~~~^ input_=config.url or config.input or sys.stdin.read(), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...<71 lines>... parent_scoped_naming=config.parent_scoped_naming, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 496, in generate results = parser.parse() File \"\", line 1394, in parse body = code_formatter.format_code(body) File \"\", line 208, in format_code code = self.apply_ruff_lint(code) File \"\", line 225, in apply_ruff_lint result = subprocess.run( (\"ruff\", \"check\", \"--fix\", \"-\"), ...<2 lines>... check=False, ) File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 554, in run with Popen(*popenargs, **kwargs) as process: ~~~~~^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1039, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ pass_fds, cwd, env, ^^^^^^^^^^^^^^^^^^^ ...<5 lines>... gid, gids, uid, umask, ^^^^^^^^^^^^^^^^^^^^^^ start_new_session, process_group) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1991, in _execute_child raise child_exception_type(errno_num, err_msg, err_filename) FileNotFoundError: [Errno 2] No such file or directory: 'ruff'" + }, + { + "version": "0.32.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: argument --formatters: invalid choice: 'builtin' (choose from 'black', 'isort', 'ruff-check', 'ruff-format')" + }, + { + "version": "0.32.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 5513.665, + "min_ms": 5444.611, + "max_ms": 5528.519, + "stdev_ms": 44.777, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.32.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Traceback (most recent call last): File \"\", line 461, in main generate( ~~~~~~~~^ input_=config.url or config.input or sys.stdin.read(), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...<72 lines>... parent_scoped_naming=config.parent_scoped_naming, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 498, in generate results = parser.parse() File \"\", line 1395, in parse body = code_formatter.format_code(body) File \"\", line 208, in format_code code = self.apply_ruff_lint(code) File \"\", line 225, in apply_ruff_lint result = subprocess.run( (\"ruff\", \"check\", \"--fix\", \"-\"), ...<2 lines>... check=False, ) File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 554, in run with Popen(*popenargs, **kwargs) as process: ~~~~~^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1039, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ pass_fds, cwd, env, ^^^^^^^^^^^^^^^^^^^ ...<5 lines>... gid, gids, uid, umask, ^^^^^^^^^^^^^^^^^^^^^^ start_new_session, process_group) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1991, in _execute_child raise child_exception_type(errno_num, err_msg, err_filename) FileNotFoundError: [Errno 2] No such file or directory: 'ruff'" + }, + { + "version": "0.32.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: argument --formatters: invalid choice: 'builtin' (choose from 'black', 'isort', 'ruff-check', 'ruff-format')" + }, + { + "version": "0.32.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 2016.132, + "min_ms": 2009.482, + "max_ms": 2019.491, + "stdev_ms": 5.094, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.32.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Traceback (most recent call last): File \"\", line 461, in main generate( ~~~~~~~~^ input_=config.url or config.input or sys.stdin.read(), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...<72 lines>... parent_scoped_naming=config.parent_scoped_naming, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 498, in generate results = parser.parse() File \"\", line 1395, in parse body = code_formatter.format_code(body) File \"\", line 208, in format_code code = self.apply_ruff_lint(code) File \"\", line 225, in apply_ruff_lint result = subprocess.run( (\"ruff\", \"check\", \"--fix\", \"-\"), ...<2 lines>... check=False, ) File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 554, in run with Popen(*popenargs, **kwargs) as process: ~~~~~^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1039, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ pass_fds, cwd, env, ^^^^^^^^^^^^^^^^^^^ ...<5 lines>... gid, gids, uid, umask, ^^^^^^^^^^^^^^^^^^^^^^ start_new_session, process_group) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1991, in _execute_child raise child_exception_type(errno_num, err_msg, err_filename) FileNotFoundError: [Errno 2] No such file or directory: 'ruff'" + }, + { + "version": "0.32.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: argument --formatters: invalid choice: 'builtin' (choose from 'black', 'isort', 'ruff-check', 'ruff-format')" + }, + { + "version": "0.32.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 4897.764, + "min_ms": 4809.371, + "max_ms": 4938.623, + "stdev_ms": 66.067, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.32.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Traceback (most recent call last): File \"\", line 461, in main generate( ~~~~~~~~^ input_=config.url or config.input or sys.stdin.read(), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...<72 lines>... parent_scoped_naming=config.parent_scoped_naming, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 498, in generate results = parser.parse() File \"\", line 1395, in parse body = code_formatter.format_code(body) File \"\", line 208, in format_code code = self.apply_ruff_lint(code) File \"\", line 225, in apply_ruff_lint result = subprocess.run( (\"ruff\", \"check\", \"--fix\", \"-\"), ...<2 lines>... check=False, ) File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 554, in run with Popen(*popenargs, **kwargs) as process: ~~~~~^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1039, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ pass_fds, cwd, env, ^^^^^^^^^^^^^^^^^^^ ...<5 lines>... gid, gids, uid, umask, ^^^^^^^^^^^^^^^^^^^^^^ start_new_session, process_group) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1991, in _execute_child raise child_exception_type(errno_num, err_msg, err_filename) FileNotFoundError: [Errno 2] No such file or directory: 'ruff'" + }, + { + "version": "0.32.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: argument --formatters: invalid choice: 'builtin' (choose from 'black', 'isort', 'ruff-check', 'ruff-format')" + }, + { + "version": "0.32.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 2054.993, + "min_ms": 2035.525, + "max_ms": 2061.732, + "stdev_ms": 13.609, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.32.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Traceback (most recent call last): File \"\", line 461, in main generate( ~~~~~~~~^ input_=config.url or config.input or sys.stdin.read(), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...<72 lines>... parent_scoped_naming=config.parent_scoped_naming, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 498, in generate results = parser.parse() File \"\", line 1395, in parse body = code_formatter.format_code(body) File \"\", line 208, in format_code code = self.apply_ruff_lint(code) File \"\", line 225, in apply_ruff_lint result = subprocess.run( (\"ruff\", \"check\", \"--fix\", \"-\"), ...<2 lines>... check=False, ) File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 554, in run with Popen(*popenargs, **kwargs) as process: ~~~~~^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1039, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ pass_fds, cwd, env, ^^^^^^^^^^^^^^^^^^^ ...<5 lines>... gid, gids, uid, umask, ^^^^^^^^^^^^^^^^^^^^^^ start_new_session, process_group) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1991, in _execute_child raise child_exception_type(errno_num, err_msg, err_filename) FileNotFoundError: [Errno 2] No such file or directory: 'ruff'" + }, + { + "version": "0.33.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: argument --formatters: invalid choice: 'builtin' (choose from 'black', 'isort', 'ruff-check', 'ruff-format')" + }, + { + "version": "0.33.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 5914.815, + "min_ms": 5860.141, + "max_ms": 5915.148, + "stdev_ms": 31.663, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.33.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Traceback (most recent call last): File \"\", line 505, in main generate( ~~~~~~~~^ input_=config.url or config.input or sys.stdin.read(), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...<72 lines>... parent_scoped_naming=config.parent_scoped_naming, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 502, in generate results = parser.parse() File \"\", line 1401, in parse body = code_formatter.format_code(body) File \"\", line 208, in format_code code = self.apply_ruff_lint(code) File \"\", line 225, in apply_ruff_lint result = subprocess.run( (\"ruff\", \"check\", \"--fix\", \"-\"), ...<2 lines>... check=False, ) File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 554, in run with Popen(*popenargs, **kwargs) as process: ~~~~~^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1039, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ pass_fds, cwd, env, ^^^^^^^^^^^^^^^^^^^ ...<5 lines>... gid, gids, uid, umask, ^^^^^^^^^^^^^^^^^^^^^^ start_new_session, process_group) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1991, in _execute_child raise child_exception_type(errno_num, err_msg, err_filename) FileNotFoundError: [Errno 2] No such file or directory: 'ruff'" + }, + { + "version": "0.33.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: argument --formatters: invalid choice: 'builtin' (choose from 'black', 'isort', 'ruff-check', 'ruff-format')" + }, + { + "version": "0.33.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 2234.182, + "min_ms": 2209.153, + "max_ms": 2236.55, + "stdev_ms": 15.18, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.33.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Traceback (most recent call last): File \"\", line 505, in main generate( ~~~~~~~~^ input_=config.url or config.input or sys.stdin.read(), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...<72 lines>... parent_scoped_naming=config.parent_scoped_naming, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 502, in generate results = parser.parse() File \"\", line 1401, in parse body = code_formatter.format_code(body) File \"\", line 208, in format_code code = self.apply_ruff_lint(code) File \"\", line 225, in apply_ruff_lint result = subprocess.run( (\"ruff\", \"check\", \"--fix\", \"-\"), ...<2 lines>... check=False, ) File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 554, in run with Popen(*popenargs, **kwargs) as process: ~~~~~^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1039, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ pass_fds, cwd, env, ^^^^^^^^^^^^^^^^^^^ ...<5 lines>... gid, gids, uid, umask, ^^^^^^^^^^^^^^^^^^^^^^ start_new_session, process_group) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1991, in _execute_child raise child_exception_type(errno_num, err_msg, err_filename) FileNotFoundError: [Errno 2] No such file or directory: 'ruff'" + }, + { + "version": "0.33.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: argument --formatters: invalid choice: 'builtin' (choose from 'black', 'isort', 'ruff-check', 'ruff-format')" + }, + { + "version": "0.33.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 5419.433, + "min_ms": 5406.778, + "max_ms": 5483.414, + "stdev_ms": 41.083, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.33.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Traceback (most recent call last): File \"\", line 505, in main generate( ~~~~~~~~^ input_=config.url or config.input or sys.stdin.read(), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...<72 lines>... parent_scoped_naming=config.parent_scoped_naming, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 502, in generate results = parser.parse() File \"\", line 1401, in parse body = code_formatter.format_code(body) File \"\", line 208, in format_code code = self.apply_ruff_lint(code) File \"\", line 225, in apply_ruff_lint result = subprocess.run( (\"ruff\", \"check\", \"--fix\", \"-\"), ...<2 lines>... check=False, ) File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 554, in run with Popen(*popenargs, **kwargs) as process: ~~~~~^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1039, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ pass_fds, cwd, env, ^^^^^^^^^^^^^^^^^^^ ...<5 lines>... gid, gids, uid, umask, ^^^^^^^^^^^^^^^^^^^^^^ start_new_session, process_group) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1991, in _execute_child raise child_exception_type(errno_num, err_msg, err_filename) FileNotFoundError: [Errno 2] No such file or directory: 'ruff'" + }, + { + "version": "0.33.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: argument --formatters: invalid choice: 'builtin' (choose from 'black', 'isort', 'ruff-check', 'ruff-format')" + }, + { + "version": "0.33.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 2235.355, + "min_ms": 2210.142, + "max_ms": 2237.986, + "stdev_ms": 15.372, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.33.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Traceback (most recent call last): File \"\", line 505, in main generate( ~~~~~~~~^ input_=config.url or config.input or sys.stdin.read(), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...<72 lines>... parent_scoped_naming=config.parent_scoped_naming, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 502, in generate results = parser.parse() File \"\", line 1401, in parse body = code_formatter.format_code(body) File \"\", line 208, in format_code code = self.apply_ruff_lint(code) File \"\", line 225, in apply_ruff_lint result = subprocess.run( (\"ruff\", \"check\", \"--fix\", \"-\"), ...<2 lines>... check=False, ) File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 554, in run with Popen(*popenargs, **kwargs) as process: ~~~~~^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1039, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ pass_fds, cwd, env, ^^^^^^^^^^^^^^^^^^^ ...<5 lines>... gid, gids, uid, umask, ^^^^^^^^^^^^^^^^^^^^^^ start_new_session, process_group) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1991, in _execute_child raise child_exception_type(errno_num, err_msg, err_filename) FileNotFoundError: [Errno 2] No such file or directory: 'ruff'" + }, + { + "version": "0.34.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: argument --formatters: invalid choice: 'builtin' (choose from 'black', 'isort', 'ruff-check', 'ruff-format')" + }, + { + "version": "0.34.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 5170.062, + "min_ms": 5073.407, + "max_ms": 5262.702, + "stdev_ms": 94.655, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.34.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Traceback (most recent call last): File \"\", line 506, in main generate( ~~~~~~~~^ input_=config.url or config.input or sys.stdin.read(), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...<73 lines>... disable_future_imports=config.disable_future_imports, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 503, in generate results = parser.parse(disable_future_imports=disable_future_imports) File \"\", line 1402, in parse body = code_formatter.format_code(body) File \"\", line 208, in format_code code = self.apply_ruff_lint(code) File \"\", line 225, in apply_ruff_lint result = subprocess.run( (\"ruff\", \"check\", \"--fix\", \"-\"), ...<2 lines>... check=False, ) File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 554, in run with Popen(*popenargs, **kwargs) as process: ~~~~~^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1039, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ pass_fds, cwd, env, ^^^^^^^^^^^^^^^^^^^ ...<5 lines>... gid, gids, uid, umask, ^^^^^^^^^^^^^^^^^^^^^^ start_new_session, process_group) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1991, in _execute_child raise child_exception_type(errno_num, err_msg, err_filename) FileNotFoundError: [Errno 2] No such file or directory: 'ruff'" + }, + { + "version": "0.34.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: argument --formatters: invalid choice: 'builtin' (choose from 'black', 'isort', 'ruff-check', 'ruff-format')" + }, + { + "version": "0.34.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 2055.526, + "min_ms": 2050.448, + "max_ms": 2075.777, + "stdev_ms": 13.401, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.34.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Traceback (most recent call last): File \"\", line 506, in main generate( ~~~~~~~~^ input_=config.url or config.input or sys.stdin.read(), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...<73 lines>... disable_future_imports=config.disable_future_imports, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 503, in generate results = parser.parse(disable_future_imports=disable_future_imports) File \"\", line 1402, in parse body = code_formatter.format_code(body) File \"\", line 208, in format_code code = self.apply_ruff_lint(code) File \"\", line 225, in apply_ruff_lint result = subprocess.run( (\"ruff\", \"check\", \"--fix\", \"-\"), ...<2 lines>... check=False, ) File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 554, in run with Popen(*popenargs, **kwargs) as process: ~~~~~^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1039, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ pass_fds, cwd, env, ^^^^^^^^^^^^^^^^^^^ ...<5 lines>... gid, gids, uid, umask, ^^^^^^^^^^^^^^^^^^^^^^ start_new_session, process_group) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1991, in _execute_child raise child_exception_type(errno_num, err_msg, err_filename) FileNotFoundError: [Errno 2] No such file or directory: 'ruff'" + }, + { + "version": "0.34.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: argument --formatters: invalid choice: 'builtin' (choose from 'black', 'isort', 'ruff-check', 'ruff-format')" + }, + { + "version": "0.34.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 4741.343, + "min_ms": 4732.464, + "max_ms": 4746.42, + "stdev_ms": 7.064, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.34.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Traceback (most recent call last): File \"\", line 506, in main generate( ~~~~~~~~^ input_=config.url or config.input or sys.stdin.read(), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...<73 lines>... disable_future_imports=config.disable_future_imports, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 503, in generate results = parser.parse(disable_future_imports=disable_future_imports) File \"\", line 1402, in parse body = code_formatter.format_code(body) File \"\", line 208, in format_code code = self.apply_ruff_lint(code) File \"\", line 225, in apply_ruff_lint result = subprocess.run( (\"ruff\", \"check\", \"--fix\", \"-\"), ...<2 lines>... check=False, ) File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 554, in run with Popen(*popenargs, **kwargs) as process: ~~~~~^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1039, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ pass_fds, cwd, env, ^^^^^^^^^^^^^^^^^^^ ...<5 lines>... gid, gids, uid, umask, ^^^^^^^^^^^^^^^^^^^^^^ start_new_session, process_group) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1991, in _execute_child raise child_exception_type(errno_num, err_msg, err_filename) FileNotFoundError: [Errno 2] No such file or directory: 'ruff'" + }, + { + "version": "0.34.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] __main__.py: error: argument --formatters: invalid choice: 'builtin' (choose from 'black', 'isort', 'ruff-check', 'ruff-format')" + }, + { + "version": "0.34.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 2100.02, + "min_ms": 2078.454, + "max_ms": 2102.608, + "stdev_ms": 13.262, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.34.0", + "python_version": "3.13.14", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Traceback (most recent call last): File \"\", line 506, in main generate( ~~~~~~~~^ input_=config.url or config.input or sys.stdin.read(), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...<73 lines>... disable_future_imports=config.disable_future_imports, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 503, in generate results = parser.parse(disable_future_imports=disable_future_imports) File \"\", line 1402, in parse body = code_formatter.format_code(body) File \"\", line 208, in format_code code = self.apply_ruff_lint(code) File \"\", line 225, in apply_ruff_lint result = subprocess.run( (\"ruff\", \"check\", \"--fix\", \"-\"), ...<2 lines>... check=False, ) File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 554, in run with Popen(*popenargs, **kwargs) as process: ~~~~~^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1039, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ pass_fds, cwd, env, ^^^^^^^^^^^^^^^^^^^ ...<5 lines>... gid, gids, uid, umask, ^^^^^^^^^^^^^^^^^^^^^^ start_new_session, process_group) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.13.14/x64/lib/python3.13/subprocess.py\", line 1991, in _execute_child raise child_exception_type(errno_num, err_msg, err_filename) FileNotFoundError: [Errno 2] No such file or directory: 'ruff'" + }, + { + "version": "0.35.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: argument --formatters: invalid choice: 'builtin' (choose from black, isort, ruff-check, ruff-format)" + }, + { + "version": "0.35.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 5057.687, + "min_ms": 5024.423, + "max_ms": 5087.201, + "stdev_ms": 31.408, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.35.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Traceback (most recent call last): File \"\", line 512, in main generate( ~~~~~~~~^ input_=config.url or config.input or sys.stdin.read(), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...<73 lines>... disable_future_imports=config.disable_future_imports, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 503, in generate results = parser.parse(disable_future_imports=disable_future_imports) File \"\", line 1402, in parse body = code_formatter.format_code(body) File \"\", line 209, in format_code code = self.apply_ruff_lint(code) File \"\", line 226, in apply_ruff_lint result = subprocess.run( (\"ruff\", \"check\", \"--fix\", \"-\"), ...<2 lines>... check=False, ) File \"/opt/hostedtoolcache/Python/3.14.2/x64/lib/python3.14/subprocess.py\", line 554, in run with Popen(*popenargs, **kwargs) as process: ~~~~~^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.14.2/x64/lib/python3.14/subprocess.py\", line 1038, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ pass_fds, cwd, env, ^^^^^^^^^^^^^^^^^^^ ...<5 lines>... gid, gids, uid, umask, ^^^^^^^^^^^^^^^^^^^^^^ start_new_session, process_group) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.14.2/x64/..." + }, + { + "version": "0.35.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: argument --formatters: invalid choice: 'builtin' (choose from black, isort, ruff-check, ruff-format)" + }, + { + "version": "0.35.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 2102.286, + "min_ms": 2094.595, + "max_ms": 2104.489, + "stdev_ms": 5.194, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.35.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Traceback (most recent call last): File \"\", line 512, in main generate( ~~~~~~~~^ input_=config.url or config.input or sys.stdin.read(), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...<73 lines>... disable_future_imports=config.disable_future_imports, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 503, in generate results = parser.parse(disable_future_imports=disable_future_imports) File \"\", line 1402, in parse body = code_formatter.format_code(body) File \"\", line 209, in format_code code = self.apply_ruff_lint(code) File \"\", line 226, in apply_ruff_lint result = subprocess.run( (\"ruff\", \"check\", \"--fix\", \"-\"), ...<2 lines>... check=False, ) File \"/opt/hostedtoolcache/Python/3.14.2/x64/lib/python3.14/subprocess.py\", line 554, in run with Popen(*popenargs, **kwargs) as process: ~~~~~^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.14.2/x64/lib/python3.14/subprocess.py\", line 1038, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ pass_fds, cwd, env, ^^^^^^^^^^^^^^^^^^^ ...<5 lines>... gid, gids, uid, umask, ^^^^^^^^^^^^^^^^^^^^^^ start_new_session, process_group) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.14.2/x64/..." + }, + { + "version": "0.35.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: argument --formatters: invalid choice: 'builtin' (choose from black, isort, ruff-check, ruff-format)" + }, + { + "version": "0.35.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 4599.551, + "min_ms": 4590.086, + "max_ms": 4616.515, + "stdev_ms": 13.391, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.35.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Traceback (most recent call last): File \"\", line 512, in main generate( ~~~~~~~~^ input_=config.url or config.input or sys.stdin.read(), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...<73 lines>... disable_future_imports=config.disable_future_imports, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 503, in generate results = parser.parse(disable_future_imports=disable_future_imports) File \"\", line 1402, in parse body = code_formatter.format_code(body) File \"\", line 209, in format_code code = self.apply_ruff_lint(code) File \"\", line 226, in apply_ruff_lint result = subprocess.run( (\"ruff\", \"check\", \"--fix\", \"-\"), ...<2 lines>... check=False, ) File \"/opt/hostedtoolcache/Python/3.14.2/x64/lib/python3.14/subprocess.py\", line 554, in run with Popen(*popenargs, **kwargs) as process: ~~~~~^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.14.2/x64/lib/python3.14/subprocess.py\", line 1038, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ pass_fds, cwd, env, ^^^^^^^^^^^^^^^^^^^ ...<5 lines>... gid, gids, uid, umask, ^^^^^^^^^^^^^^^^^^^^^^ start_new_session, process_group) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.14.2/x64/..." + }, + { + "version": "0.35.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: argument --formatters: invalid choice: 'builtin' (choose from black, isort, ruff-check, ruff-format)" + }, + { + "version": "0.35.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 2167.111, + "min_ms": 2141.276, + "max_ms": 2179.344, + "stdev_ms": 19.435, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.35.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Traceback (most recent call last): File \"\", line 512, in main generate( ~~~~~~~~^ input_=config.url or config.input or sys.stdin.read(), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...<73 lines>... disable_future_imports=config.disable_future_imports, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 503, in generate results = parser.parse(disable_future_imports=disable_future_imports) File \"\", line 1402, in parse body = code_formatter.format_code(body) File \"\", line 209, in format_code code = self.apply_ruff_lint(code) File \"\", line 226, in apply_ruff_lint result = subprocess.run( (\"ruff\", \"check\", \"--fix\", \"-\"), ...<2 lines>... check=False, ) File \"/opt/hostedtoolcache/Python/3.14.2/x64/lib/python3.14/subprocess.py\", line 554, in run with Popen(*popenargs, **kwargs) as process: ~~~~~^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.14.2/x64/lib/python3.14/subprocess.py\", line 1038, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ pass_fds, cwd, env, ^^^^^^^^^^^^^^^^^^^ ...<5 lines>... gid, gids, uid, umask, ^^^^^^^^^^^^^^^^^^^^^^ start_new_session, process_group) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.14.2/x64/..." + }, + { + "version": "0.36.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: argument --formatters: invalid choice: 'builtin' (choose from black, isort, ruff-check, ruff-format)" + }, + { + "version": "0.36.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 4190.714, + "min_ms": 4002.786, + "max_ms": 4247.155, + "stdev_ms": 127.944, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.36.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Traceback (most recent call last): File \"\", line 505, in main generate( ~~~~~~~~^ input_=config.url or config.input or sys.stdin.read(), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...<76 lines>... disable_future_imports=config.disable_future_imports, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 511, in generate results = parser.parse(disable_future_imports=disable_future_imports) File \"\", line 1408, in parse body = code_formatter.format_code(body) File \"\", line 214, in format_code code = self.apply_ruff_lint(code) File \"\", line 231, in apply_ruff_lint result = subprocess.run( (\"ruff\", \"check\", \"--fix\", \"-\"), ...<2 lines>... check=False, ) File \"/opt/hostedtoolcache/Python/3.14.2/x64/lib/python3.14/subprocess.py\", line 554, in run with Popen(*popenargs, **kwargs) as process: ~~~~~^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.14.2/x64/lib/python3.14/subprocess.py\", line 1038, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ pass_fds, cwd, env, ^^^^^^^^^^^^^^^^^^^ ...<5 lines>... gid, gids, uid, umask, ^^^^^^^^^^^^^^^^^^^^^^ start_new_session, process_group) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.14.2/x64/..." + }, + { + "version": "0.36.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: argument --formatters: invalid choice: 'builtin' (choose from black, isort, ruff-check, ruff-format)" + }, + { + "version": "0.36.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 1655.315, + "min_ms": 1652.224, + "max_ms": 1677.834, + "stdev_ms": 13.979, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.36.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Traceback (most recent call last): File \"\", line 505, in main generate( ~~~~~~~~^ input_=config.url or config.input or sys.stdin.read(), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...<76 lines>... disable_future_imports=config.disable_future_imports, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 511, in generate results = parser.parse(disable_future_imports=disable_future_imports) File \"\", line 1408, in parse body = code_formatter.format_code(body) File \"\", line 214, in format_code code = self.apply_ruff_lint(code) File \"\", line 231, in apply_ruff_lint result = subprocess.run( (\"ruff\", \"check\", \"--fix\", \"-\"), ...<2 lines>... check=False, ) File \"/opt/hostedtoolcache/Python/3.14.2/x64/lib/python3.14/subprocess.py\", line 554, in run with Popen(*popenargs, **kwargs) as process: ~~~~~^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.14.2/x64/lib/python3.14/subprocess.py\", line 1038, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ pass_fds, cwd, env, ^^^^^^^^^^^^^^^^^^^ ...<5 lines>... gid, gids, uid, umask, ^^^^^^^^^^^^^^^^^^^^^^ start_new_session, process_group) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.14.2/x64/..." + }, + { + "version": "0.36.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: argument --formatters: invalid choice: 'builtin' (choose from black, isort, ruff-check, ruff-format)" + }, + { + "version": "0.36.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 3683.702, + "min_ms": 3676.664, + "max_ms": 3740.218, + "stdev_ms": 34.839, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.36.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Traceback (most recent call last): File \"\", line 505, in main generate( ~~~~~~~~^ input_=config.url or config.input or sys.stdin.read(), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...<76 lines>... disable_future_imports=config.disable_future_imports, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 511, in generate results = parser.parse(disable_future_imports=disable_future_imports) File \"\", line 1408, in parse body = code_formatter.format_code(body) File \"\", line 214, in format_code code = self.apply_ruff_lint(code) File \"\", line 231, in apply_ruff_lint result = subprocess.run( (\"ruff\", \"check\", \"--fix\", \"-\"), ...<2 lines>... check=False, ) File \"/opt/hostedtoolcache/Python/3.14.2/x64/lib/python3.14/subprocess.py\", line 554, in run with Popen(*popenargs, **kwargs) as process: ~~~~~^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.14.2/x64/lib/python3.14/subprocess.py\", line 1038, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ pass_fds, cwd, env, ^^^^^^^^^^^^^^^^^^^ ...<5 lines>... gid, gids, uid, umask, ^^^^^^^^^^^^^^^^^^^^^^ start_new_session, process_group) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.14.2/x64/..." + }, + { + "version": "0.36.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: argument --formatters: invalid choice: 'builtin' (choose from black, isort, ruff-check, ruff-format)" + }, + { + "version": "0.36.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 1692.332, + "min_ms": 1676.497, + "max_ms": 1720.336, + "stdev_ms": 22.199, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.36.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Traceback (most recent call last): File \"\", line 505, in main generate( ~~~~~~~~^ input_=config.url or config.input or sys.stdin.read(), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...<76 lines>... disable_future_imports=config.disable_future_imports, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 511, in generate results = parser.parse(disable_future_imports=disable_future_imports) File \"\", line 1408, in parse body = code_formatter.format_code(body) File \"\", line 214, in format_code code = self.apply_ruff_lint(code) File \"\", line 231, in apply_ruff_lint result = subprocess.run( (\"ruff\", \"check\", \"--fix\", \"-\"), ...<2 lines>... check=False, ) File \"/opt/hostedtoolcache/Python/3.14.2/x64/lib/python3.14/subprocess.py\", line 554, in run with Popen(*popenargs, **kwargs) as process: ~~~~~^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.14.2/x64/lib/python3.14/subprocess.py\", line 1038, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ pass_fds, cwd, env, ^^^^^^^^^^^^^^^^^^^ ...<5 lines>... gid, gids, uid, umask, ^^^^^^^^^^^^^^^^^^^^^^ start_new_session, process_group) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.14.2/x64/..." + }, + { + "version": "0.39.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: argument --formatters: invalid choice: 'builtin' (choose from black, isort, ruff-check, ruff-format)" + }, + { + "version": "0.39.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 3416.843, + "min_ms": 3344.29, + "max_ms": 3437.514, + "stdev_ms": 48.959, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.39.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Traceback (most recent call last): File \"\", line 769, in main generate( ~~~~~~~~^ input_=config.url or config.input or sys.stdin.read(), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...<84 lines>... all_exports_collision_strategy=config.all_exports_collision_strategy, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 641, in generate results = parser.parse( disable_future_imports=disable_future_imports, all_exports_scope=all_exports_scope, all_exports_collision_strategy=all_exports_collision_strategy, ) File \"\", line 1876, in parse body = code_formatter.format_code(body) File \"\", line 261, in format_code code = self.apply_ruff_lint(code) File \"\", line 281, in apply_ruff_lint result = subprocess.run( (\"ruff\", \"check\", \"--fix\", \"-\"), ...<2 lines>... check=False, ) File \"/opt/hostedtoolcache/Python/3.14.2/x64/lib/python3.14/subprocess.py\", line 554, in run with Popen(*popenargs, **kwargs) as process: ~~~~~^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.14.2/x64/lib/python3.14/subprocess.py\", line 1038, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ pass_fds, cwd, env, ^^^^^^^^^^^^^^^^^^^ ...<5 lines>... gid, gids, uid, umask, ^..." + }, + { + "version": "0.39.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: argument --formatters: invalid choice: 'builtin' (choose from black, isort, ruff-check, ruff-format)" + }, + { + "version": "0.39.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 412.941, + "min_ms": 408.223, + "max_ms": 417.734, + "stdev_ms": 4.756, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.39.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Traceback (most recent call last): File \"\", line 769, in main generate( ~~~~~~~~^ input_=config.url or config.input or sys.stdin.read(), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...<84 lines>... all_exports_collision_strategy=config.all_exports_collision_strategy, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 641, in generate results = parser.parse( disable_future_imports=disable_future_imports, all_exports_scope=all_exports_scope, all_exports_collision_strategy=all_exports_collision_strategy, ) File \"\", line 1876, in parse body = code_formatter.format_code(body) File \"\", line 261, in format_code code = self.apply_ruff_lint(code) File \"\", line 281, in apply_ruff_lint result = subprocess.run( (\"ruff\", \"check\", \"--fix\", \"-\"), ...<2 lines>... check=False, ) File \"/opt/hostedtoolcache/Python/3.14.2/x64/lib/python3.14/subprocess.py\", line 554, in run with Popen(*popenargs, **kwargs) as process: ~~~~~^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.14.2/x64/lib/python3.14/subprocess.py\", line 1038, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ pass_fds, cwd, env, ^^^^^^^^^^^^^^^^^^^ ...<5 lines>... gid, gids, uid, umask, ^..." + }, + { + "version": "0.39.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: argument --formatters: invalid choice: 'builtin' (choose from black, isort, ruff-check, ruff-format)" + }, + { + "version": "0.39.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 3133.92, + "min_ms": 3098.57, + "max_ms": 3201.915, + "stdev_ms": 52.525, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.39.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Traceback (most recent call last): File \"\", line 769, in main generate( ~~~~~~~~^ input_=config.url or config.input or sys.stdin.read(), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...<84 lines>... all_exports_collision_strategy=config.all_exports_collision_strategy, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 641, in generate results = parser.parse( disable_future_imports=disable_future_imports, all_exports_scope=all_exports_scope, all_exports_collision_strategy=all_exports_collision_strategy, ) File \"\", line 1876, in parse body = code_formatter.format_code(body) File \"\", line 261, in format_code code = self.apply_ruff_lint(code) File \"\", line 281, in apply_ruff_lint result = subprocess.run( (\"ruff\", \"check\", \"--fix\", \"-\"), ...<2 lines>... check=False, ) File \"/opt/hostedtoolcache/Python/3.14.2/x64/lib/python3.14/subprocess.py\", line 554, in run with Popen(*popenargs, **kwargs) as process: ~~~~~^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.14.2/x64/lib/python3.14/subprocess.py\", line 1038, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ pass_fds, cwd, env, ^^^^^^^^^^^^^^^^^^^ ...<5 lines>... gid, gids, uid, umask, ^..." + }, + { + "version": "0.39.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: argument --formatters: invalid choice: 'builtin' (choose from black, isort, ruff-check, ruff-format)" + }, + { + "version": "0.39.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 2187.376, + "min_ms": 2158.372, + "max_ms": 2191.174, + "stdev_ms": 17.943, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.39.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Traceback (most recent call last): File \"\", line 769, in main generate( ~~~~~~~~^ input_=config.url or config.input or sys.stdin.read(), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...<84 lines>... all_exports_collision_strategy=config.all_exports_collision_strategy, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 641, in generate results = parser.parse( disable_future_imports=disable_future_imports, all_exports_scope=all_exports_scope, all_exports_collision_strategy=all_exports_collision_strategy, ) File \"\", line 1876, in parse body = code_formatter.format_code(body) File \"\", line 261, in format_code code = self.apply_ruff_lint(code) File \"\", line 281, in apply_ruff_lint result = subprocess.run( (\"ruff\", \"check\", \"--fix\", \"-\"), ...<2 lines>... check=False, ) File \"/opt/hostedtoolcache/Python/3.14.2/x64/lib/python3.14/subprocess.py\", line 554, in run with Popen(*popenargs, **kwargs) as process: ~~~~~^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.14.2/x64/lib/python3.14/subprocess.py\", line 1038, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ pass_fds, cwd, env, ^^^^^^^^^^^^^^^^^^^ ...<5 lines>... gid, gids, uid, umask, ^..." + }, + { + "version": "0.42.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: argument --formatters: invalid choice: 'builtin' (choose from black, isort, ruff-check, ruff-format)" + }, + { + "version": "0.42.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 3470.543, + "min_ms": 3434.077, + "max_ms": 3532.776, + "stdev_ms": 49.907, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.42.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Traceback (most recent call last): File \"\", line 772, in main generate( ~~~~~~~~^ input_=config.url or config.input or sys.stdin.read(), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...<86 lines>... all_exports_collision_strategy=config.all_exports_collision_strategy, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 692, in generate results = parser.parse( disable_future_imports=disable_future_imports, all_exports_scope=all_exports_scope, all_exports_collision_strategy=all_exports_collision_strategy, ) File \"\", line 2312, in parse body = code_formatter.format_code(body) File \"\", line 261, in format_code code = self.apply_ruff_lint(code) File \"\", line 281, in apply_ruff_lint result = subprocess.run( (\"ruff\", \"check\", \"--fix\", \"-\"), ...<2 lines>... check=False, ) File \"/opt/hostedtoolcache/Python/3.14.2/x64/lib/python3.14/subprocess.py\", line 554, in run with Popen(*popenargs, **kwargs) as process: ~~~~~^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.14.2/x64/lib/python3.14/subprocess.py\", line 1038, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ pass_fds, cwd, env, ^^^^^^^^^^^^^^^^^^^ ...<5 lines>... gid, gids, uid, umask, ^..." + }, + { + "version": "0.42.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: argument --formatters: invalid choice: 'builtin' (choose from black, isort, ruff-check, ruff-format)" + }, + { + "version": "0.42.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 413.354, + "min_ms": 408.883, + "max_ms": 415.523, + "stdev_ms": 3.386, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.42.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Traceback (most recent call last): File \"\", line 772, in main generate( ~~~~~~~~^ input_=config.url or config.input or sys.stdin.read(), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...<86 lines>... all_exports_collision_strategy=config.all_exports_collision_strategy, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 692, in generate results = parser.parse( disable_future_imports=disable_future_imports, all_exports_scope=all_exports_scope, all_exports_collision_strategy=all_exports_collision_strategy, ) File \"\", line 2312, in parse body = code_formatter.format_code(body) File \"\", line 261, in format_code code = self.apply_ruff_lint(code) File \"\", line 281, in apply_ruff_lint result = subprocess.run( (\"ruff\", \"check\", \"--fix\", \"-\"), ...<2 lines>... check=False, ) File \"/opt/hostedtoolcache/Python/3.14.2/x64/lib/python3.14/subprocess.py\", line 554, in run with Popen(*popenargs, **kwargs) as process: ~~~~~^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.14.2/x64/lib/python3.14/subprocess.py\", line 1038, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ pass_fds, cwd, env, ^^^^^^^^^^^^^^^^^^^ ...<5 lines>... gid, gids, uid, umask, ^..." + }, + { + "version": "0.42.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: argument --formatters: invalid choice: 'builtin' (choose from black, isort, ruff-check, ruff-format)" + }, + { + "version": "0.42.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 3293.469, + "min_ms": 3238.776, + "max_ms": 3297.76, + "stdev_ms": 32.886, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.42.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Traceback (most recent call last): File \"\", line 772, in main generate( ~~~~~~~~^ input_=config.url or config.input or sys.stdin.read(), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...<86 lines>... all_exports_collision_strategy=config.all_exports_collision_strategy, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 692, in generate results = parser.parse( disable_future_imports=disable_future_imports, all_exports_scope=all_exports_scope, all_exports_collision_strategy=all_exports_collision_strategy, ) File \"\", line 2312, in parse body = code_formatter.format_code(body) File \"\", line 261, in format_code code = self.apply_ruff_lint(code) File \"\", line 281, in apply_ruff_lint result = subprocess.run( (\"ruff\", \"check\", \"--fix\", \"-\"), ...<2 lines>... check=False, ) File \"/opt/hostedtoolcache/Python/3.14.2/x64/lib/python3.14/subprocess.py\", line 554, in run with Popen(*popenargs, **kwargs) as process: ~~~~~^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.14.2/x64/lib/python3.14/subprocess.py\", line 1038, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ pass_fds, cwd, env, ^^^^^^^^^^^^^^^^^^^ ...<5 lines>... gid, gids, uid, umask, ^..." + }, + { + "version": "0.42.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: argument --formatters: invalid choice: 'builtin' (choose from black, isort, ruff-check, ruff-format)" + }, + { + "version": "0.42.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 2206.164, + "min_ms": 2190.886, + "max_ms": 2207.904, + "stdev_ms": 9.364, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.42.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Traceback (most recent call last): File \"\", line 772, in main generate( ~~~~~~~~^ input_=config.url or config.input or sys.stdin.read(), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...<86 lines>... all_exports_collision_strategy=config.all_exports_collision_strategy, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 692, in generate results = parser.parse( disable_future_imports=disable_future_imports, all_exports_scope=all_exports_scope, all_exports_collision_strategy=all_exports_collision_strategy, ) File \"\", line 2312, in parse body = code_formatter.format_code(body) File \"\", line 261, in format_code code = self.apply_ruff_lint(code) File \"\", line 281, in apply_ruff_lint result = subprocess.run( (\"ruff\", \"check\", \"--fix\", \"-\"), ...<2 lines>... check=False, ) File \"/opt/hostedtoolcache/Python/3.14.2/x64/lib/python3.14/subprocess.py\", line 554, in run with Popen(*popenargs, **kwargs) as process: ~~~~~^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.14.2/x64/lib/python3.14/subprocess.py\", line 1038, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ pass_fds, cwd, env, ^^^^^^^^^^^^^^^^^^^ ...<5 lines>... gid, gids, uid, umask, ^..." + }, + { + "version": "0.42.2", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: argument --formatters: invalid choice: 'builtin' (choose from black, isort, ruff-check, ruff-format)" + }, + { + "version": "0.42.2", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 3973.384, + "min_ms": 3919.498, + "max_ms": 4043.933, + "stdev_ms": 62.403, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.42.2", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Traceback (most recent call last): File \"\", line 800, in main generate( ~~~~~~~~^ input_=config.url or config.input or sys.stdin.read(), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...<88 lines>... all_exports_collision_strategy=config.all_exports_collision_strategy, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 695, in generate results = parser.parse( settings_path=settings_path, ...<2 lines>... all_exports_collision_strategy=all_exports_collision_strategy, ) File \"\", line 2322, in parse body = code_formatter.format_code(body) File \"\", line 270, in format_code code = self.apply_ruff_lint(code) File \"\", line 290, in apply_ruff_lint result = subprocess.run( (\"ruff\", \"check\", \"--fix\", \"-\"), ...<3 lines>... cwd=self.settings_path, ) File \"/opt/hostedtoolcache/Python/3.14.2/x64/lib/python3.14/subprocess.py\", line 554, in run with Popen(*popenargs, **kwargs) as process: ~~~~~^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.14.2/x64/lib/python3.14/subprocess.py\", line 1038, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ pass_fds, cwd, env, ^^^^^^^^^^^^^^^^^^^ ...<5 lines>... gid, gids, uid, umask, ^^^^^^^^^^^^^^^^^^^^^^ start_..." + }, + { + "version": "0.42.2", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: argument --formatters: invalid choice: 'builtin' (choose from black, isort, ruff-check, ruff-format)" + }, + { + "version": "0.42.2", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 454.465, + "min_ms": 424.097, + "max_ms": 485.363, + "stdev_ms": 30.634, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.42.2", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Traceback (most recent call last): File \"\", line 800, in main generate( ~~~~~~~~^ input_=config.url or config.input or sys.stdin.read(), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...<88 lines>... all_exports_collision_strategy=config.all_exports_collision_strategy, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 695, in generate results = parser.parse( settings_path=settings_path, ...<2 lines>... all_exports_collision_strategy=all_exports_collision_strategy, ) File \"\", line 2322, in parse body = code_formatter.format_code(body) File \"\", line 270, in format_code code = self.apply_ruff_lint(code) File \"\", line 290, in apply_ruff_lint result = subprocess.run( (\"ruff\", \"check\", \"--fix\", \"-\"), ...<3 lines>... cwd=self.settings_path, ) File \"/opt/hostedtoolcache/Python/3.14.2/x64/lib/python3.14/subprocess.py\", line 554, in run with Popen(*popenargs, **kwargs) as process: ~~~~~^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.14.2/x64/lib/python3.14/subprocess.py\", line 1038, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ pass_fds, cwd, env, ^^^^^^^^^^^^^^^^^^^ ...<5 lines>... gid, gids, uid, umask, ^^^^^^^^^^^^^^^^^^^^^^ start_..." + }, + { + "version": "0.42.2", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: argument --formatters: invalid choice: 'builtin' (choose from black, isort, ruff-check, ruff-format)" + }, + { + "version": "0.42.2", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 3476.048, + "min_ms": 3453.033, + "max_ms": 3493.966, + "stdev_ms": 20.52, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.42.2", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Traceback (most recent call last): File \"\", line 800, in main generate( ~~~~~~~~^ input_=config.url or config.input or sys.stdin.read(), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...<88 lines>... all_exports_collision_strategy=config.all_exports_collision_strategy, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 695, in generate results = parser.parse( settings_path=settings_path, ...<2 lines>... all_exports_collision_strategy=all_exports_collision_strategy, ) File \"\", line 2322, in parse body = code_formatter.format_code(body) File \"\", line 270, in format_code code = self.apply_ruff_lint(code) File \"\", line 290, in apply_ruff_lint result = subprocess.run( (\"ruff\", \"check\", \"--fix\", \"-\"), ...<3 lines>... cwd=self.settings_path, ) File \"/opt/hostedtoolcache/Python/3.14.2/x64/lib/python3.14/subprocess.py\", line 554, in run with Popen(*popenargs, **kwargs) as process: ~~~~~^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.14.2/x64/lib/python3.14/subprocess.py\", line 1038, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ pass_fds, cwd, env, ^^^^^^^^^^^^^^^^^^^ ...<5 lines>... gid, gids, uid, umask, ^^^^^^^^^^^^^^^^^^^^^^ start_..." + }, + { + "version": "0.42.2", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: argument --formatters: invalid choice: 'builtin' (choose from black, isort, ruff-check, ruff-format)" + }, + { + "version": "0.42.2", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 2287.082, + "min_ms": 2279.68, + "max_ms": 2302.207, + "stdev_ms": 11.482, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.42.2", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Traceback (most recent call last): File \"\", line 800, in main generate( ~~~~~~~~^ input_=config.url or config.input or sys.stdin.read(), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...<88 lines>... all_exports_collision_strategy=config.all_exports_collision_strategy, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 695, in generate results = parser.parse( settings_path=settings_path, ...<2 lines>... all_exports_collision_strategy=all_exports_collision_strategy, ) File \"\", line 2322, in parse body = code_formatter.format_code(body) File \"\", line 270, in format_code code = self.apply_ruff_lint(code) File \"\", line 290, in apply_ruff_lint result = subprocess.run( (\"ruff\", \"check\", \"--fix\", \"-\"), ...<3 lines>... cwd=self.settings_path, ) File \"/opt/hostedtoolcache/Python/3.14.2/x64/lib/python3.14/subprocess.py\", line 554, in run with Popen(*popenargs, **kwargs) as process: ~~~~~^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.14.2/x64/lib/python3.14/subprocess.py\", line 1038, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ pass_fds, cwd, env, ^^^^^^^^^^^^^^^^^^^ ...<5 lines>... gid, gids, uid, umask, ^^^^^^^^^^^^^^^^^^^^^^ start_..." + }, + { + "version": "0.43.1", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: argument --formatters: invalid choice: 'builtin' (choose from black, isort, ruff-check, ruff-format)" + }, + { + "version": "0.43.1", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 3846.851, + "min_ms": 3843.71, + "max_ms": 3948.279, + "stdev_ms": 59.487, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.43.1", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Traceback (most recent call last): File \"\", line 815, in main generate( ~~~~~~~~^ input_=config.url or config.input or sys.stdin.read(), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...<89 lines>... all_exports_collision_strategy=config.all_exports_collision_strategy, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 697, in generate results = parser.parse( settings_path=settings_path, ...<2 lines>... all_exports_collision_strategy=all_exports_collision_strategy, ) File \"\", line 2349, in parse body = code_formatter.format_code(body) File \"\", line 270, in format_code code = self.apply_ruff_lint(code) File \"\", line 290, in apply_ruff_lint result = subprocess.run( (\"ruff\", \"check\", \"--fix\", \"-\"), ...<3 lines>... cwd=self.settings_path, ) File \"/opt/hostedtoolcache/Python/3.14.2/x64/lib/python3.14/subprocess.py\", line 554, in run with Popen(*popenargs, **kwargs) as process: ~~~~~^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.14.2/x64/lib/python3.14/subprocess.py\", line 1038, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ pass_fds, cwd, env, ^^^^^^^^^^^^^^^^^^^ ...<5 lines>... gid, gids, uid, umask, ^^^^^^^^^^^^^^^^^^^^^^ start_..." + }, + { + "version": "0.43.1", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: argument --formatters: invalid choice: 'builtin' (choose from black, isort, ruff-check, ruff-format)" + }, + { + "version": "0.43.1", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 402.15, + "min_ms": 399.994, + "max_ms": 409.922, + "stdev_ms": 5.222, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.43.1", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Traceback (most recent call last): File \"\", line 815, in main generate( ~~~~~~~~^ input_=config.url or config.input or sys.stdin.read(), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...<89 lines>... all_exports_collision_strategy=config.all_exports_collision_strategy, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 697, in generate results = parser.parse( settings_path=settings_path, ...<2 lines>... all_exports_collision_strategy=all_exports_collision_strategy, ) File \"\", line 2349, in parse body = code_formatter.format_code(body) File \"\", line 270, in format_code code = self.apply_ruff_lint(code) File \"\", line 290, in apply_ruff_lint result = subprocess.run( (\"ruff\", \"check\", \"--fix\", \"-\"), ...<3 lines>... cwd=self.settings_path, ) File \"/opt/hostedtoolcache/Python/3.14.2/x64/lib/python3.14/subprocess.py\", line 554, in run with Popen(*popenargs, **kwargs) as process: ~~~~~^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.14.2/x64/lib/python3.14/subprocess.py\", line 1038, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ pass_fds, cwd, env, ^^^^^^^^^^^^^^^^^^^ ...<5 lines>... gid, gids, uid, umask, ^^^^^^^^^^^^^^^^^^^^^^ start_..." + }, + { + "version": "0.43.1", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: argument --formatters: invalid choice: 'builtin' (choose from black, isort, ruff-check, ruff-format)" + }, + { + "version": "0.43.1", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 3233.304, + "min_ms": 3225.069, + "max_ms": 3242.164, + "stdev_ms": 8.55, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.43.1", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Traceback (most recent call last): File \"\", line 815, in main generate( ~~~~~~~~^ input_=config.url or config.input or sys.stdin.read(), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...<89 lines>... all_exports_collision_strategy=config.all_exports_collision_strategy, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 697, in generate results = parser.parse( settings_path=settings_path, ...<2 lines>... all_exports_collision_strategy=all_exports_collision_strategy, ) File \"\", line 2349, in parse body = code_formatter.format_code(body) File \"\", line 270, in format_code code = self.apply_ruff_lint(code) File \"\", line 290, in apply_ruff_lint result = subprocess.run( (\"ruff\", \"check\", \"--fix\", \"-\"), ...<3 lines>... cwd=self.settings_path, ) File \"/opt/hostedtoolcache/Python/3.14.2/x64/lib/python3.14/subprocess.py\", line 554, in run with Popen(*popenargs, **kwargs) as process: ~~~~~^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.14.2/x64/lib/python3.14/subprocess.py\", line 1038, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ pass_fds, cwd, env, ^^^^^^^^^^^^^^^^^^^ ...<5 lines>... gid, gids, uid, umask, ^^^^^^^^^^^^^^^^^^^^^^ start_..." + }, + { + "version": "0.43.1", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: argument --formatters: invalid choice: 'builtin' (choose from black, isort, ruff-check, ruff-format)" + }, + { + "version": "0.43.1", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 2085.958, + "min_ms": 2085.198, + "max_ms": 2103.553, + "stdev_ms": 10.385, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.43.1", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Traceback (most recent call last): File \"\", line 815, in main generate( ~~~~~~~~^ input_=config.url or config.input or sys.stdin.read(), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...<89 lines>... all_exports_collision_strategy=config.all_exports_collision_strategy, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 697, in generate results = parser.parse( settings_path=settings_path, ...<2 lines>... all_exports_collision_strategy=all_exports_collision_strategy, ) File \"\", line 2349, in parse body = code_formatter.format_code(body) File \"\", line 270, in format_code code = self.apply_ruff_lint(code) File \"\", line 290, in apply_ruff_lint result = subprocess.run( (\"ruff\", \"check\", \"--fix\", \"-\"), ...<3 lines>... cwd=self.settings_path, ) File \"/opt/hostedtoolcache/Python/3.14.2/x64/lib/python3.14/subprocess.py\", line 554, in run with Popen(*popenargs, **kwargs) as process: ~~~~~^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.14.2/x64/lib/python3.14/subprocess.py\", line 1038, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ pass_fds, cwd, env, ^^^^^^^^^^^^^^^^^^^ ...<5 lines>... gid, gids, uid, umask, ^^^^^^^^^^^^^^^^^^^^^^ start_..." + }, + { + "version": "0.45.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: argument --formatters: invalid choice: 'builtin' (choose from black, isort, ruff-check, ruff-format)" + }, + { + "version": "0.45.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 3449.354, + "min_ms": 3408.469, + "max_ms": 3454.315, + "stdev_ms": 25.159, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.45.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Traceback (most recent call last): File \"\", line 951, in main run_generate_from_config( ~~~~~~~~~~~~~~~~~~~~~~~~^ config=config, ^^^^^^^^^^^^^^ ...<6 lines>... settings_path=config.output if config.check else None, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 674, in run_generate_from_config generate( ~~~~~~~~^ input_=input_, ^^^^^^^^^^^^^^ ...<94 lines>... module_split_mode=config.module_split_mode, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 726, in generate results = parser.parse( settings_path=settings_path, ...<3 lines>... module_split_mode=module_split_mode, ) File \"\", line 2660, in parse body = code_formatter.format_code(body) File \"\", line 285, in format_code code = self.apply_ruff_lint(code) File \"\", line 305, in apply_ruff_lint result = subprocess.run( (\"ruff\", \"check\", \"--fix\", \"-\"), ...<3 lines>... cwd=self.settings_path, ) File \"/opt/hostedtoolcache/Python/3.14.2/x64/lib/python3.14/subprocess.py\", line 554, in run with Popen(*popenargs, **kwargs) as process: ~~~~~^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.14.2/x64/lib/python3.14/subprocess.py\", line 1038, in __init__ self._execute_child(args, e..." + }, + { + "version": "0.45.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: argument --formatters: invalid choice: 'builtin' (choose from black, isort, ruff-check, ruff-format)" + }, + { + "version": "0.45.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 375.427, + "min_ms": 372.609, + "max_ms": 376.081, + "stdev_ms": 1.845, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.45.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Traceback (most recent call last): File \"\", line 951, in main run_generate_from_config( ~~~~~~~~~~~~~~~~~~~~~~~~^ config=config, ^^^^^^^^^^^^^^ ...<6 lines>... settings_path=config.output if config.check else None, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 674, in run_generate_from_config generate( ~~~~~~~~^ input_=input_, ^^^^^^^^^^^^^^ ...<94 lines>... module_split_mode=config.module_split_mode, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 726, in generate results = parser.parse( settings_path=settings_path, ...<3 lines>... module_split_mode=module_split_mode, ) File \"\", line 2660, in parse body = code_formatter.format_code(body) File \"\", line 285, in format_code code = self.apply_ruff_lint(code) File \"\", line 305, in apply_ruff_lint result = subprocess.run( (\"ruff\", \"check\", \"--fix\", \"-\"), ...<3 lines>... cwd=self.settings_path, ) File \"/opt/hostedtoolcache/Python/3.14.2/x64/lib/python3.14/subprocess.py\", line 554, in run with Popen(*popenargs, **kwargs) as process: ~~~~~^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.14.2/x64/lib/python3.14/subprocess.py\", line 1038, in __init__ self._execute_child(args, e..." + }, + { + "version": "0.45.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: argument --formatters: invalid choice: 'builtin' (choose from black, isort, ruff-check, ruff-format)" + }, + { + "version": "0.45.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 2805.344, + "min_ms": 2787.715, + "max_ms": 2832.504, + "stdev_ms": 22.563, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.45.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Traceback (most recent call last): File \"\", line 951, in main run_generate_from_config( ~~~~~~~~~~~~~~~~~~~~~~~~^ config=config, ^^^^^^^^^^^^^^ ...<6 lines>... settings_path=config.output if config.check else None, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 674, in run_generate_from_config generate( ~~~~~~~~^ input_=input_, ^^^^^^^^^^^^^^ ...<94 lines>... module_split_mode=config.module_split_mode, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 726, in generate results = parser.parse( settings_path=settings_path, ...<3 lines>... module_split_mode=module_split_mode, ) File \"\", line 2660, in parse body = code_formatter.format_code(body) File \"\", line 285, in format_code code = self.apply_ruff_lint(code) File \"\", line 305, in apply_ruff_lint result = subprocess.run( (\"ruff\", \"check\", \"--fix\", \"-\"), ...<3 lines>... cwd=self.settings_path, ) File \"/opt/hostedtoolcache/Python/3.14.2/x64/lib/python3.14/subprocess.py\", line 554, in run with Popen(*popenargs, **kwargs) as process: ~~~~~^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.14.2/x64/lib/python3.14/subprocess.py\", line 1038, in __init__ self._execute_child(args, e..." + }, + { + "version": "0.45.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: argument --formatters: invalid choice: 'builtin' (choose from black, isort, ruff-check, ruff-format)" + }, + { + "version": "0.45.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 1889.412, + "min_ms": 1887.295, + "max_ms": 1914.801, + "stdev_ms": 15.306, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.45.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "failed", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "Traceback (most recent call last): File \"\", line 951, in main run_generate_from_config( ~~~~~~~~~~~~~~~~~~~~~~~~^ config=config, ^^^^^^^^^^^^^^ ...<6 lines>... settings_path=config.output if config.check else None, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 674, in run_generate_from_config generate( ~~~~~~~~^ input_=input_, ^^^^^^^^^^^^^^ ...<94 lines>... module_split_mode=config.module_split_mode, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File \"\", line 726, in generate results = parser.parse( settings_path=settings_path, ...<3 lines>... module_split_mode=module_split_mode, ) File \"\", line 2660, in parse body = code_formatter.format_code(body) File \"\", line 285, in format_code code = self.apply_ruff_lint(code) File \"\", line 305, in apply_ruff_lint result = subprocess.run( (\"ruff\", \"check\", \"--fix\", \"-\"), ...<3 lines>... cwd=self.settings_path, ) File \"/opt/hostedtoolcache/Python/3.14.2/x64/lib/python3.14/subprocess.py\", line 554, in run with Popen(*popenargs, **kwargs) as process: ~~~~~^^^^^^^^^^^^^^^^^^^^^^ File \"/opt/hostedtoolcache/Python/3.14.2/x64/lib/python3.14/subprocess.py\", line 1038, in __init__ self._execute_child(args, e..." + }, + { + "version": "0.52.2", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: argument --formatters: invalid choice: 'builtin' (choose from black, isort, ruff-check, ruff-format)" + }, + { + "version": "0.52.2", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 3795.344, + "min_ms": 3774.053, + "max_ms": 3869.416, + "stdev_ms": 50.057, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.52.2", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "ruff", + "runs": 3, + "median_ms": 1549.389, + "min_ms": 1519.641, + "max_ms": 1549.887, + "stdev_ms": 17.32, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "" + }, + { + "version": "0.52.2", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: argument --formatters: invalid choice: 'builtin' (choose from black, isort, ruff-check, ruff-format)" + }, + { + "version": "0.52.2", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 498.38, + "min_ms": 492.263, + "max_ms": 508.656, + "stdev_ms": 8.284, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.52.2", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "ruff", + "runs": 3, + "median_ms": 469.647, + "min_ms": 459.857, + "max_ms": 470.885, + "stdev_ms": 6.042, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "" + }, + { + "version": "0.52.2", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: argument --formatters: invalid choice: 'builtin' (choose from black, isort, ruff-check, ruff-format)" + }, + { + "version": "0.52.2", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 3453.003, + "min_ms": 3440.451, + "max_ms": 3462.351, + "stdev_ms": 10.989, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.52.2", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "ruff", + "runs": 3, + "median_ms": 1523.785, + "min_ms": 1520.951, + "max_ms": 1534.729, + "stdev_ms": 7.276, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "" + }, + { + "version": "0.52.2", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: argument --formatters: invalid choice: 'builtin' (choose from black, isort, ruff-check, ruff-format)" + }, + { + "version": "0.52.2", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 2298.06, + "min_ms": 2294.694, + "max_ms": 2320.641, + "stdev_ms": 14.109, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.52.2", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "ruff", + "runs": 3, + "median_ms": 2262.13, + "min_ms": 2261.425, + "max_ms": 2285.746, + "stdev_ms": 13.843, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "" + }, + { + "version": "0.53.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: argument --formatters: invalid choice: 'builtin' (choose from black, isort, ruff-check, ruff-format)" + }, + { + "version": "0.53.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 3640.67, + "min_ms": 3638.204, + "max_ms": 3691.724, + "stdev_ms": 30.213, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.53.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "ruff", + "runs": 3, + "median_ms": 1529.776, + "min_ms": 1516.02, + "max_ms": 1529.902, + "stdev_ms": 7.978, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "" + }, + { + "version": "0.53.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: argument --formatters: invalid choice: 'builtin' (choose from black, isort, ruff-check, ruff-format)" + }, + { + "version": "0.53.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 485.283, + "min_ms": 482.602, + "max_ms": 498.741, + "stdev_ms": 8.649, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.53.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "ruff", + "runs": 3, + "median_ms": 450.483, + "min_ms": 450.257, + "max_ms": 451.361, + "stdev_ms": 0.583, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "" + }, + { + "version": "0.53.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: argument --formatters: invalid choice: 'builtin' (choose from black, isort, ruff-check, ruff-format)" + }, + { + "version": "0.53.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 3307.422, + "min_ms": 3288.791, + "max_ms": 3337.11, + "stdev_ms": 24.37, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.53.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "ruff", + "runs": 3, + "median_ms": 1476.901, + "min_ms": 1459.658, + "max_ms": 1477.96, + "stdev_ms": 10.275, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "" + }, + { + "version": "0.53.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: argument --formatters: invalid choice: 'builtin' (choose from black, isort, ruff-check, ruff-format)" + }, + { + "version": "0.53.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 2236.328, + "min_ms": 2234.177, + "max_ms": 2245.543, + "stdev_ms": 6.038, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.53.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "ruff", + "runs": 3, + "median_ms": 2204.022, + "min_ms": 2192.708, + "max_ms": 2236.073, + "stdev_ms": 22.494, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "" + }, + { + "version": "0.54.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: argument --formatters: invalid choice: 'builtin' (choose from black, isort, ruff-check, ruff-format)" + }, + { + "version": "0.54.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 3801.188, + "min_ms": 3778.392, + "max_ms": 3977.967, + "stdev_ms": 109.24, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.54.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "ruff", + "runs": 3, + "median_ms": 1625.314, + "min_ms": 1608.422, + "max_ms": 1627.777, + "stdev_ms": 10.536, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "" + }, + { + "version": "0.54.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: argument --formatters: invalid choice: 'builtin' (choose from black, isort, ruff-check, ruff-format)" + }, + { + "version": "0.54.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 507.44, + "min_ms": 505.11, + "max_ms": 511.348, + "stdev_ms": 3.152, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.54.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "ruff", + "runs": 3, + "median_ms": 472.614, + "min_ms": 468.435, + "max_ms": 474.159, + "stdev_ms": 2.961, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "" + }, + { + "version": "0.54.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: argument --formatters: invalid choice: 'builtin' (choose from black, isort, ruff-check, ruff-format)" + }, + { + "version": "0.54.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 3429.947, + "min_ms": 3422.445, + "max_ms": 3433.208, + "stdev_ms": 5.519, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.54.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "ruff", + "runs": 3, + "median_ms": 1548.663, + "min_ms": 1540.537, + "max_ms": 1550.349, + "stdev_ms": 5.246, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "" + }, + { + "version": "0.54.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: argument --formatters: invalid choice: 'builtin' (choose from black, isort, ruff-check, ruff-format)" + }, + { + "version": "0.54.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 2360.706, + "min_ms": 2317.857, + "max_ms": 2421.396, + "stdev_ms": 52.025, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.54.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "ruff", + "runs": 3, + "median_ms": 2316.846, + "min_ms": 2299.591, + "max_ms": 2339.212, + "stdev_ms": 19.866, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "" + }, + { + "version": "0.54.1", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: argument --formatters: invalid choice: 'builtin' (choose from black, isort, ruff-check, ruff-format)" + }, + { + "version": "0.54.1", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 3596.712, + "min_ms": 3592.196, + "max_ms": 3653.695, + "stdev_ms": 34.277, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.54.1", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "ruff", + "runs": 3, + "median_ms": 1548.866, + "min_ms": 1544.718, + "max_ms": 1563.185, + "stdev_ms": 9.689, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "" + }, + { + "version": "0.54.1", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: argument --formatters: invalid choice: 'builtin' (choose from black, isort, ruff-check, ruff-format)" + }, + { + "version": "0.54.1", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 481.478, + "min_ms": 479.941, + "max_ms": 482.08, + "stdev_ms": 1.103, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.54.1", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "ruff", + "runs": 3, + "median_ms": 453.944, + "min_ms": 451.617, + "max_ms": 454.624, + "stdev_ms": 1.577, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "" + }, + { + "version": "0.54.1", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: argument --formatters: invalid choice: 'builtin' (choose from black, isort, ruff-check, ruff-format)" + }, + { + "version": "0.54.1", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 3333.748, + "min_ms": 3289.419, + "max_ms": 3366.957, + "stdev_ms": 38.902, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.54.1", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "ruff", + "runs": 3, + "median_ms": 1476.625, + "min_ms": 1467.272, + "max_ms": 1488.643, + "stdev_ms": 10.713, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "" + }, + { + "version": "0.54.1", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: argument --formatters: invalid choice: 'builtin' (choose from black, isort, ruff-check, ruff-format)" + }, + { + "version": "0.54.1", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 2212.1, + "min_ms": 2201.47, + "max_ms": 2330.919, + "stdev_ms": 71.865, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.54.1", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "ruff", + "runs": 3, + "median_ms": 2173.623, + "min_ms": 2163.278, + "max_ms": 2194.333, + "stdev_ms": 15.813, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "" + }, + { + "version": "0.55.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: argument --formatters: invalid choice: 'builtin' (choose from black, isort, ruff-check, ruff-format)" + }, + { + "version": "0.55.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 3716.647, + "min_ms": 3661.777, + "max_ms": 3767.382, + "stdev_ms": 52.816, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.55.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "ruff", + "runs": 3, + "median_ms": 1574.406, + "min_ms": 1567.321, + "max_ms": 1597.652, + "stdev_ms": 15.867, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "" + }, + { + "version": "0.55.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: argument --formatters: invalid choice: 'builtin' (choose from black, isort, ruff-check, ruff-format)" + }, + { + "version": "0.55.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 504.991, + "min_ms": 503.041, + "max_ms": 515.428, + "stdev_ms": 6.661, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.55.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "ruff", + "runs": 3, + "median_ms": 465.082, + "min_ms": 459.624, + "max_ms": 466.62, + "stdev_ms": 3.676, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "" + }, + { + "version": "0.55.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: argument --formatters: invalid choice: 'builtin' (choose from black, isort, ruff-check, ruff-format)" + }, + { + "version": "0.55.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 3533.19, + "min_ms": 3491.826, + "max_ms": 3542.914, + "stdev_ms": 27.128, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.55.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "ruff", + "runs": 3, + "median_ms": 1555.777, + "min_ms": 1548.551, + "max_ms": 1585.94, + "stdev_ms": 19.832, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "" + }, + { + "version": "0.55.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: argument --formatters: invalid choice: 'builtin' (choose from black, isort, ruff-check, ruff-format)" + }, + { + "version": "0.55.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 2271.758, + "min_ms": 2237.353, + "max_ms": 2317.417, + "stdev_ms": 40.163, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.55.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "ruff", + "runs": 3, + "median_ms": 2269.771, + "min_ms": 2204.506, + "max_ms": 2290.538, + "stdev_ms": 44.893, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "" + }, + { + "version": "0.56.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: argument --formatters: invalid choice: 'builtin' (choose from black, isort, ruff-check, ruff-format)" + }, + { + "version": "0.56.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 3729.925, + "min_ms": 3657.59, + "max_ms": 3768.991, + "stdev_ms": 56.522, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.56.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "ruff", + "runs": 3, + "median_ms": 1499.337, + "min_ms": 1492.749, + "max_ms": 1513.305, + "stdev_ms": 10.496, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "" + }, + { + "version": "0.56.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: argument --formatters: invalid choice: 'builtin' (choose from black, isort, ruff-check, ruff-format)" + }, + { + "version": "0.56.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 495.014, + "min_ms": 494.498, + "max_ms": 510.125, + "stdev_ms": 8.877, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.56.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "ruff", + "runs": 3, + "median_ms": 475.614, + "min_ms": 470.467, + "max_ms": 475.83, + "stdev_ms": 3.036, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "" + }, + { + "version": "0.56.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: argument --formatters: invalid choice: 'builtin' (choose from black, isort, ruff-check, ruff-format)" + }, + { + "version": "0.56.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 3369.123, + "min_ms": 3353.365, + "max_ms": 3396.049, + "stdev_ms": 21.584, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.56.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "ruff", + "runs": 3, + "median_ms": 1499.926, + "min_ms": 1479.329, + "max_ms": 1576.233, + "stdev_ms": 51.051, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "" + }, + { + "version": "0.56.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: argument --formatters: invalid choice: 'builtin' (choose from black, isort, ruff-check, ruff-format)" + }, + { + "version": "0.56.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 2445.559, + "min_ms": 2432.701, + "max_ms": 2447.881, + "stdev_ms": 8.176, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.56.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "ruff", + "runs": 3, + "median_ms": 2362.286, + "min_ms": 2315.898, + "max_ms": 2373.07, + "stdev_ms": 30.378, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "" + }, + { + "version": "0.56.1", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: argument --formatters: invalid choice: 'builtin' (choose from black, isort, ruff-check, ruff-format)" + }, + { + "version": "0.56.1", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 3162.836, + "min_ms": 3154.2, + "max_ms": 3175.469, + "stdev_ms": 10.697, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.56.1", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "ruff", + "runs": 3, + "median_ms": 1364.574, + "min_ms": 1349.311, + "max_ms": 1365.088, + "stdev_ms": 8.964, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "" + }, + { + "version": "0.56.1", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: argument --formatters: invalid choice: 'builtin' (choose from black, isort, ruff-check, ruff-format)" + }, + { + "version": "0.56.1", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 431.782, + "min_ms": 431.004, + "max_ms": 435.143, + "stdev_ms": 2.2, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.56.1", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "ruff", + "runs": 3, + "median_ms": 408.207, + "min_ms": 408.121, + "max_ms": 409.106, + "stdev_ms": 0.546, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "" + }, + { + "version": "0.56.1", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: argument --formatters: invalid choice: 'builtin' (choose from black, isort, ruff-check, ruff-format)" + }, + { + "version": "0.56.1", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 2925.199, + "min_ms": 2917.546, + "max_ms": 2929.919, + "stdev_ms": 6.244, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.56.1", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "ruff", + "runs": 3, + "median_ms": 1352.016, + "min_ms": 1349.857, + "max_ms": 1355.24, + "stdev_ms": 2.709, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "" + }, + { + "version": "0.56.1", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: argument --formatters: invalid choice: 'builtin' (choose from black, isort, ruff-check, ruff-format)" + }, + { + "version": "0.56.1", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 2047.387, + "min_ms": 2014.453, + "max_ms": 2066.178, + "stdev_ms": 26.183, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.56.1", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "ruff", + "runs": 3, + "median_ms": 2022.809, + "min_ms": 2012.845, + "max_ms": 2025.688, + "stdev_ms": 6.739, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "" + }, + { + "version": "0.57.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: argument --formatters: invalid choice: 'builtin' (choose from black, isort, ruff-check, ruff-format)" + }, + { + "version": "0.57.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 3719.665, + "min_ms": 3666.115, + "max_ms": 3821.424, + "stdev_ms": 78.892, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.57.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "ruff", + "runs": 3, + "median_ms": 1584.597, + "min_ms": 1572.388, + "max_ms": 1585.905, + "stdev_ms": 7.455, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "" + }, + { + "version": "0.57.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: argument --formatters: invalid choice: 'builtin' (choose from black, isort, ruff-check, ruff-format)" + }, + { + "version": "0.57.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 491.685, + "min_ms": 490.581, + "max_ms": 497.419, + "stdev_ms": 3.671, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.57.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "ruff", + "runs": 3, + "median_ms": 463.262, + "min_ms": 460.825, + "max_ms": 464.622, + "stdev_ms": 1.923, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "" + }, + { + "version": "0.57.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: argument --formatters: invalid choice: 'builtin' (choose from black, isort, ruff-check, ruff-format)" + }, + { + "version": "0.57.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 3396.911, + "min_ms": 3377.056, + "max_ms": 3410.732, + "stdev_ms": 16.928, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.57.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "ruff", + "runs": 3, + "median_ms": 1544.961, + "min_ms": 1507.405, + "max_ms": 1572.928, + "stdev_ms": 32.879, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "" + }, + { + "version": "0.57.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: argument --formatters: invalid choice: 'builtin' (choose from black, isort, ruff-check, ruff-format)" + }, + { + "version": "0.57.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 2244.073, + "min_ms": 2243.586, + "max_ms": 2260.281, + "stdev_ms": 9.502, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.57.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "ruff", + "runs": 3, + "median_ms": 2217.098, + "min_ms": 2201.523, + "max_ms": 2234.326, + "stdev_ms": 16.409, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "" + }, + { + "version": "0.58.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: argument --formatters: invalid choice: 'builtin' (choose from black, isort, ruff-check, ruff-format)" + }, + { + "version": "0.58.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 3816.663, + "min_ms": 3781.552, + "max_ms": 3825.723, + "stdev_ms": 23.331, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.58.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "ruff", + "runs": 3, + "median_ms": 1591.397, + "min_ms": 1578.95, + "max_ms": 1591.713, + "stdev_ms": 7.279, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "" + }, + { + "version": "0.58.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: argument --formatters: invalid choice: 'builtin' (choose from black, isort, ruff-check, ruff-format)" + }, + { + "version": "0.58.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 539.265, + "min_ms": 533.258, + "max_ms": 591.168, + "stdev_ms": 31.842, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.58.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "ruff", + "runs": 3, + "median_ms": 496.759, + "min_ms": 491.127, + "max_ms": 501.547, + "stdev_ms": 5.216, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "" + }, + { + "version": "0.58.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: argument --formatters: invalid choice: 'builtin' (choose from black, isort, ruff-check, ruff-format)" + }, + { + "version": "0.58.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 3579.385, + "min_ms": 3560.794, + "max_ms": 3651.081, + "stdev_ms": 47.676, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.58.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "ruff", + "runs": 3, + "median_ms": 1601.685, + "min_ms": 1564.276, + "max_ms": 1617.412, + "stdev_ms": 27.295, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "" + }, + { + "version": "0.58.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: argument --formatters: invalid choice: 'builtin' (choose from black, isort, ruff-check, ruff-format)" + }, + { + "version": "0.58.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 2594.137, + "min_ms": 2551.951, + "max_ms": 2601.514, + "stdev_ms": 26.741, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.58.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "ruff", + "runs": 3, + "median_ms": 2568.76, + "min_ms": 2553.369, + "max_ms": 2579.201, + "stdev_ms": 12.995, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "" + }, + { + "version": "0.59.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: argument --formatters: invalid choice: 'builtin' (choose from black, isort, ruff-check, ruff-format)" + }, + { + "version": "0.59.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 3669.701, + "min_ms": 3668.956, + "max_ms": 3701.104, + "stdev_ms": 18.35, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.59.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "ruff", + "runs": 3, + "median_ms": 1712.083, + "min_ms": 1691.185, + "max_ms": 1785.808, + "stdev_ms": 49.708, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "" + }, + { + "version": "0.59.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: argument --formatters: invalid choice: 'builtin' (choose from black, isort, ruff-check, ruff-format)" + }, + { + "version": "0.59.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 540.951, + "min_ms": 537.313, + "max_ms": 543.014, + "stdev_ms": 2.887, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.59.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "ruff", + "runs": 3, + "median_ms": 508.905, + "min_ms": 503.508, + "max_ms": 510.535, + "stdev_ms": 3.678, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "" + }, + { + "version": "0.59.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: argument --formatters: invalid choice: 'builtin' (choose from black, isort, ruff-check, ruff-format)" + }, + { + "version": "0.59.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 3552.607, + "min_ms": 3476.546, + "max_ms": 3572.782, + "stdev_ms": 50.751, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.59.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "ruff", + "runs": 3, + "median_ms": 1702.796, + "min_ms": 1693.997, + "max_ms": 1713.175, + "stdev_ms": 9.6, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "" + }, + { + "version": "0.59.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "builtin", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "usage: datamodel-codegen [options] python -m datamodel_code_generator: error: argument --formatters: invalid choice: 'builtin' (choose from black, isort, ruff-check, ruff-format)" + }, + { + "version": "0.59.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 2377.751, + "min_ms": 2372.701, + "max_ms": 2386.349, + "stdev_ms": 6.9, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.59.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "ruff", + "runs": 3, + "median_ms": 2331.886, + "min_ms": 2289.912, + "max_ms": 2351.414, + "stdev_ms": 31.426, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "" + }, + { + "version": "0.64.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "builtin", + "runs": 3, + "median_ms": 1507.718, + "min_ms": 1507.426, + "max_ms": 1596.505, + "stdev_ms": 51.346, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "" + }, + { + "version": "0.64.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 3771.166, + "min_ms": 3724.303, + "max_ms": 3876.105, + "stdev_ms": 77.731, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.64.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "ruff", + "runs": 3, + "median_ms": 1471.523, + "min_ms": 1457.528, + "max_ms": 1491.672, + "stdev_ms": 17.164, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "" + }, + { + "version": "0.64.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "builtin", + "runs": 3, + "median_ms": 414.914, + "min_ms": 407.075, + "max_ms": 415.995, + "stdev_ms": 4.868, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "" + }, + { + "version": "0.64.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 588.213, + "min_ms": 544.24, + "max_ms": 602.394, + "stdev_ms": 30.322, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.64.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "ruff", + "runs": 3, + "median_ms": 415.974, + "min_ms": 411.3, + "max_ms": 425.634, + "stdev_ms": 7.31, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "" + }, + { + "version": "0.64.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "builtin", + "runs": 3, + "median_ms": 1460.377, + "min_ms": 1455.4, + "max_ms": 1460.784, + "stdev_ms": 2.998, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "" + }, + { + "version": "0.64.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 3421.95, + "min_ms": 3373.877, + "max_ms": 3441.289, + "stdev_ms": 34.711, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.64.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "ruff", + "runs": 3, + "median_ms": 1406.78, + "min_ms": 1400.299, + "max_ms": 1424.231, + "stdev_ms": 12.378, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "" + }, + { + "version": "0.64.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "builtin", + "runs": 3, + "median_ms": 2197.79, + "min_ms": 2185.146, + "max_ms": 2218.413, + "stdev_ms": 16.792, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "" + }, + { + "version": "0.64.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 2321.925, + "min_ms": 2308.752, + "max_ms": 2343.87, + "stdev_ms": 17.74, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.64.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "ruff", + "runs": 3, + "median_ms": 2208.321, + "min_ms": 2208.291, + "max_ms": 2239.296, + "stdev_ms": 17.892, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "" + }, + { + "version": "0.64.1", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "builtin", + "runs": 3, + "median_ms": 1512.578, + "min_ms": 1506.756, + "max_ms": 1517.678, + "stdev_ms": 5.465, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "" + }, + { + "version": "0.64.1", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 3779.433, + "min_ms": 3753.134, + "max_ms": 3790.708, + "stdev_ms": 19.281, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.64.1", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "ruff", + "runs": 3, + "median_ms": 1526.421, + "min_ms": 1453.307, + "max_ms": 1533.602, + "stdev_ms": 44.43, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "" + }, + { + "version": "0.64.1", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "builtin", + "runs": 3, + "median_ms": 420.457, + "min_ms": 415.829, + "max_ms": 432.668, + "stdev_ms": 8.699, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "" + }, + { + "version": "0.64.1", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 561.006, + "min_ms": 551.021, + "max_ms": 567.902, + "stdev_ms": 8.487, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.64.1", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "ruff", + "runs": 3, + "median_ms": 430.4, + "min_ms": 423.673, + "max_ms": 445.64, + "stdev_ms": 11.255, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "" + }, + { + "version": "0.64.1", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "builtin", + "runs": 3, + "median_ms": 1445.446, + "min_ms": 1428.905, + "max_ms": 1450.794, + "stdev_ms": 11.412, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "" + }, + { + "version": "0.64.1", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "default", + "runs": 3, + "median_ms": 3298.572, + "min_ms": 3290.36, + "max_ms": 3321.878, + "stdev_ms": 16.351, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.64.1", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "ruff", + "runs": 3, + "median_ms": 1387.666, + "min_ms": 1367.768, + "max_ms": 1388.021, + "stdev_ms": 11.592, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "" + }, + { + "version": "0.64.1", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "builtin", + "runs": 3, + "median_ms": 2279.606, + "min_ms": 2198.267, + "max_ms": 2387.175, + "stdev_ms": 94.757, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "" + }, + { + "version": "0.64.1", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 2299.819, + "min_ms": 2289.903, + "max_ms": 2310.074, + "stdev_ms": 10.086, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.64.1", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "ruff", + "runs": 3, + "median_ms": 2169.0, + "min_ms": 2164.023, + "max_ms": 2182.98, + "stdev_ms": 9.828, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "" + }, + { + "version": "0.65.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "builtin", + "runs": 7, + "median_ms": 1192.667, + "min_ms": 1148.824, + "max_ms": 1254.876, + "stdev_ms": 41.449, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "" + }, + { + "version": "0.65.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "default", + "runs": 7, + "median_ms": 3203.607, + "min_ms": 2994.876, + "max_ms": 3407.473, + "stdev_ms": 145.379, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.65.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "ruff", + "runs": 7, + "median_ms": 1144.282, + "min_ms": 1114.974, + "max_ms": 1179.412, + "stdev_ms": 19.959, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "" + }, + { + "version": "0.65.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "builtin", + "runs": 7, + "median_ms": 396.616, + "min_ms": 381.756, + "max_ms": 406.122, + "stdev_ms": 9.829, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "" + }, + { + "version": "0.65.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "default", + "runs": 7, + "median_ms": 514.99, + "min_ms": 502.523, + "max_ms": 566.425, + "stdev_ms": 21.33, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.65.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "ruff", + "runs": 7, + "median_ms": 415.708, + "min_ms": 396.458, + "max_ms": 432.789, + "stdev_ms": 11.615, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "" + }, + { + "version": "0.65.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "builtin", + "runs": 7, + "median_ms": 1229.533, + "min_ms": 1204.848, + "max_ms": 1254.55, + "stdev_ms": 17.548, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "" + }, + { + "version": "0.65.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "default", + "runs": 7, + "median_ms": 2969.411, + "min_ms": 2768.702, + "max_ms": 3056.179, + "stdev_ms": 102.039, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.65.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "ruff", + "runs": 7, + "median_ms": 1215.464, + "min_ms": 1158.982, + "max_ms": 1229.668, + "stdev_ms": 23.321, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "" + }, + { + "version": "0.65.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "builtin", + "runs": 7, + "median_ms": 439.356, + "min_ms": 432.132, + "max_ms": 443.916, + "stdev_ms": 4.673, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "" + }, + { + "version": "0.65.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "default", + "runs": 7, + "median_ms": 580.627, + "min_ms": 560.498, + "max_ms": 615.963, + "stdev_ms": 20.151, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "0.65.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "ruff", + "runs": 7, + "median_ms": 480.955, + "min_ms": 447.455, + "max_ms": 504.082, + "stdev_ms": 17.282, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "" + }, + { + "version": "main", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "default", + "runs": 7, + "median_ms": 456.848, + "min_ms": 449.608, + "max_ms": 459.955, + "stdev_ms": 4.383, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "main", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "builtin", + "runs": 7, + "median_ms": 325.147, + "min_ms": 320.863, + "max_ms": 338.907, + "stdev_ms": 5.839, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "" + }, + { + "version": "main", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "ruff", + "runs": 7, + "median_ms": 327.959, + "min_ms": 324.34, + "max_ms": 332.243, + "stdev_ms": 2.544, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "" + }, + { + "version": "main", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "default", + "runs": 7, + "median_ms": 3542.722, + "min_ms": 3420.499, + "max_ms": 3625.524, + "stdev_ms": 80.205, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "main", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "builtin", + "runs": 7, + "median_ms": 1225.419, + "min_ms": 1203.212, + "max_ms": 1242.089, + "stdev_ms": 14.851, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "" + }, + { + "version": "main", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "ruff", + "runs": 7, + "median_ms": 1148.031, + "min_ms": 1143.926, + "max_ms": 1161.826, + "stdev_ms": 7.235, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "" + }, + { + "version": "main", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "default", + "runs": 7, + "median_ms": 522.674, + "min_ms": 514.851, + "max_ms": 528.757, + "stdev_ms": 6.391, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "main", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "builtin", + "runs": 7, + "median_ms": 382.548, + "min_ms": 375.214, + "max_ms": 388.914, + "stdev_ms": 5.207, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "" + }, + { + "version": "main", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "small", + "formatter": "ruff", + "runs": 7, + "median_ms": 379.743, + "min_ms": 372.118, + "max_ms": 386.327, + "stdev_ms": 4.681, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/openapi/api.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "" + }, + { + "version": "main", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "default", + "runs": 7, + "median_ms": 3188.015, + "min_ms": 3170.67, + "max_ms": 3260.619, + "stdev_ms": 31.516, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + }, + { + "version": "main", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "builtin", + "runs": 7, + "median_ms": 1280.562, + "min_ms": 1247.579, + "max_ms": 1301.65, + "stdev_ms": 18.433, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters builtin", + "error": "" + }, + { + "version": "main", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "ruff", + "runs": 7, + "median_ms": 1233.131, + "min_ms": 1203.411, + "max_ms": 1247.045, + "stdev_ms": 13.67, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output model.py --formatters ruff-check ruff-format", + "error": "" + } + ] +} diff --git a/docs/index.md b/docs/index.md index 6db8dde35..55866671c 100644 --- a/docs/index.md +++ b/docs/index.md @@ -200,6 +200,8 @@ Custom templates can emit Python outside the standard generated model patterns c custom-template output is not exhaustively validated. If `--formatters builtin` produces invalid or poorly formatted output with a custom template, please open an issue with a small reproducer. See [Formatter Behavior](formatter-behavior.md) for details. + +See [Performance Benchmarks](performance-benchmarks.md) for release benchmark data and interactive charts. --- @@ -308,6 +310,7 @@ See [CI/CD Integration](ci-cd.md) for more options. - ๐Ÿš€ **[One-liner Usage](oneliner.md)** - uvx, pipx, clipboard integration - ๐Ÿ”„ **[CI/CD Integration](ci-cd.md)** - GitHub Actions and CI validation - โœ… **[Conformance Dashboard](conformance.md)** - External corpus and CI coverage signals +- ๐Ÿ“ˆ **[Performance Benchmarks](performance-benchmarks.md)** - Release benchmark tables and interactive charts - ๐ŸŽจ **[Custom Templates](custom_template.md)** - Customize generated code with Jinja2 - ๐Ÿ–Œ๏ธ **[Code Formatting](formatting.md)** - Configure black, isort, and ruff - โ“ **[FAQ](faq.md)** - Common questions and troubleshooting diff --git a/docs/llms-full.txt b/docs/llms-full.txt index 8a124555c..23c275b27 100644 --- a/docs/llms-full.txt +++ b/docs/llms-full.txt @@ -202,6 +202,8 @@ Custom templates can emit Python outside the standard generated model patterns c custom-template output is not exhaustively validated. If `--formatters builtin` produces invalid or poorly formatted output with a custom template, please open an issue with a small reproducer. See [Formatter Behavior](formatter-behavior.md) for details. + +See [Performance Benchmarks](performance-benchmarks.md) for release benchmark data and interactive charts. --- @@ -310,6 +312,7 @@ See [CI/CD Integration](ci-cd.md) for more options. - ๐Ÿš€ **[One-liner Usage](oneliner.md)** - uvx, pipx, clipboard integration - ๐Ÿ”„ **[CI/CD Integration](ci-cd.md)** - GitHub Actions and CI validation - โœ… **[Conformance Dashboard](conformance.md)** - External corpus and CI coverage signals +- ๐Ÿ“ˆ **[Performance Benchmarks](performance-benchmarks.md)** - Release benchmark tables and interactive charts - ๐ŸŽจ **[Custom Templates](custom_template.md)** - Customize generated code with Jinja2 - ๐Ÿ–Œ๏ธ **[Code Formatting](formatting.md)** - Configure black, isort, and ruff - โ“ **[FAQ](faq.md)** - Common questions and troubleshooting @@ -34905,6 +34908,352 @@ These suites are compatibility and coverage signals. They show that CI exercises --- +# Performance Benchmarks + +Source: https://datamodel-code-generator.koxudaxi.dev/performance-benchmarks/ + + + +This page tracks datamodel-code-generator release and main-branch benchmark results collected on GitHub Actions. The data covers only datamodel-code-generator and uses Ubuntu runners so release-to-release changes can be compared without mixing in third-party generator results. Automatic backfills select versions from PyPI download-by-version data when that public dataset is available. + +datamodel-code-generator supports many schema styles and production use cases, so it includes a broad set of useful options. As releases add more capabilities, these benchmarks help keep the implementation measured, managed, and tuned so code generation stays fast in everyday use. + +## Historical Trends + +Each chart plots median generation time by release version for one benchmark scenario. Each line is a formatter pipeline; missing or unsupported formatter results are skipped. Marked versions have benchmark notes below. + +Compatibility backfill: Versions 0.26.4-0.34.0 use Python 3.13.14 because those releases fail during import on Python 3.14.2 before benchmark timing. + +=== "Small / JSON Schema" + + + + + Loading benchmark chart... + + + + +=== "Small / OpenAPI" + + + + + Loading benchmark chart... + + + + +=== "Large / JSON Schema" + + + + + Loading benchmark chart... + + + + +=== "Large / OpenAPI" + + + + + Loading benchmark chart... + + + + +## Benchmark Notes + +Version markers in the charts and historical tables point to these benchmark interpretation notes. + +- `0.29.0`: The inflect dependency range was widened and cold imports became slower. Release 0.29.0 allowed inflect 7.x, which resolves typeguard 4.x in modern environments. That typeguard instrumentation increased fresh-process startup cost. Small OpenAPI is especially visible because the fixture has array component names such as Pets and Users, so class-name singularization initializes inflect while the rest of the generation work is small. +- `0.64.1`: This release predates the main-branch inflect import mitigation. The latest release result still includes the inflect/typeguard cold-import cost. The effect is most visible in Small/OpenAPI because the fixture has array component names such as Pets and Users, so class-name singularization initializes inflect while the rest of the generation work is small. + +## Collection Policy + +- The benchmark workflow runs on `ubuntu-24.04`. +- Benchmark results are collected on GitHub Actions CI runners, so median timings can vary slightly with runner load and workflow timing; rerun benchmarks before treating small differences as regressions. +- The Python version is the workflow input, defaulting to the latest configured CI Python. +- Release packages are installed from PyPI in isolated virtual environments. +- The `main` snapshot is installed from the GitHub repository when it is explicitly selected. +- Input coverage currently focuses on OpenAPI and JSON Schema. +- Historical backfills are produced by the `Release Benchmarks` workflow and committed after review. + +## Latest Dataset + +- Schema version: `1` +- Generated at: `2026-06-22T09:37:07Z` +- Source workflow: `Release Benchmarks` +- Primary Python version: `3.14.2` +- Entry Python versions: `3.13.14`, `3.14.2` +- Benchmark runs per case: `mixed` +- Version selection: `clickpy_downloads_with_compatibility_backfill_and_main` +- Selected versions: `52` +- Download source: `clickpy` +- Download window: `365` days +- Downloads in window: `117,445,983` +- PyPIStats last month: `13,805,155` + +## Latest Release Summary + +Results below are medians. Built-in and Ruff ratios are relative to the black/isort(Default) formatter for the same scenario. + +### main + +=== "Small" + + | Input | Formatter | Median | vs black/isort(Default) | Range | Status | + | --- | --- | --- | --- | --- | --- | + | JSON Schema | black/isort(Default) | 457ms | baseline | 450ms-460ms | OK | + | JSON Schema | Built-in | 325ms | 1.41x faster | 321ms-339ms | OK | + | JSON Schema | Ruff | 328ms | 1.39x faster | 324ms-332ms | OK | + | OpenAPI | black/isort(Default) | 523ms | baseline | 515ms-529ms | OK | + | OpenAPI | Built-in | 383ms | 1.37x faster | 375ms-389ms | OK | + | OpenAPI | Ruff | 380ms | 1.38x faster | 372ms-386ms | OK | + +=== "Large" + + | Input | Formatter | Median | vs black/isort(Default) | Range | Status | + | --- | --- | --- | --- | --- | --- | + | JSON Schema | black/isort(Default) | 3.54s | baseline | 3.42s-3.63s | OK | + | JSON Schema | Built-in | 1.23s | 2.89x faster | 1.20s-1.24s | OK | + | JSON Schema | Ruff | 1.15s | 3.09x faster | 1.14s-1.16s | OK | + | OpenAPI | black/isort(Default) | 3.19s | baseline | 3.17s-3.26s | OK | + | OpenAPI | Built-in | 1.28s | 2.49x faster | 1.25s-1.30s | OK | + | OpenAPI | Ruff | 1.23s | 2.59x faster | 1.20s-1.25s | OK | + +## Historical Results + +Rows are release versions, newest first, with `main` shown before releases when present. Released is the PyPI upload timestamp in UTC; branch refs such as `main` show `-`. Formatter cells show median generation time; non-default cells include the speed relative to black/isort(Default) when both results are available. Rows without any successful formatter result are omitted. Version cells marked with `*` have benchmark notes above. + +=== "Small / JSON Schema" + + | Version | Released | black/isort(Default) | Built-in | Ruff | + | --- | --- | --- | --- | --- | + | main | - | 457ms | 325ms (1.41x faster) | 328ms (1.39x faster) | + | 0.65.0 | 2026-06-21 18:21 UTC | 515ms | 397ms (1.30x faster) | 416ms (1.24x faster) | + | 0.64.1 * | 2026-06-19 17:19 UTC | 561ms | 420ms (1.33x faster) | 430ms (1.30x faster) | + | 0.64.0 | 2026-06-14 17:24 UTC | 588ms | 415ms (1.42x faster) | 416ms (1.41x faster) | + | 0.59.0 | 2026-05-29 15:47 UTC | 541ms | Unsupported: unavailable | 509ms (1.06x faster) | + | 0.58.0 | 2026-05-25 03:23 UTC | 539ms | Unsupported: unavailable | 497ms (1.09x faster) | + | 0.57.0 | 2026-05-07 16:21 UTC | 492ms | Unsupported: unavailable | 463ms (1.06x faster) | + | 0.56.1 | 2026-04-16 17:09 UTC | 432ms | Unsupported: unavailable | 408ms (1.06x faster) | + | 0.56.0 | 2026-04-04 09:46 UTC | 495ms | Unsupported: unavailable | 476ms (1.04x faster) | + | 0.55.0 | 2026-03-10 20:41 UTC | 505ms | Unsupported: unavailable | 465ms (1.09x faster) | + | 0.54.1 | 2026-03-04 04:15 UTC | 481ms | Unsupported: unavailable | 454ms (1.06x faster) | + | 0.54.0 | 2026-02-14 16:19 UTC | 507ms | Unsupported: unavailable | 473ms (1.07x faster) | + | 0.53.0 | 2026-01-12 18:14 UTC | 485ms | Unsupported: unavailable | 450ms (1.08x faster) | + | 0.52.2 | 2026-01-05 17:25 UTC | 498ms | Unsupported: unavailable | 470ms (1.06x faster) | + | 0.45.0 | 2025-12-19 00:13 UTC | 375ms | Unsupported: unavailable | Failed: command | + | 0.43.1 | 2025-12-12 07:03 UTC | 402ms | Unsupported: unavailable | Failed: command | + | 0.42.2 | 2025-12-08 21:04 UTC | 454ms | Unsupported: unavailable | Failed: command | + | 0.42.0 | 2025-12-08 02:57 UTC | 413ms | Unsupported: unavailable | Failed: command | + | 0.39.0 | 2025-12-02 19:29 UTC | 413ms | Unsupported: unavailable | Failed: command | + | 0.36.0 | 2025-11-26 17:14 UTC | 1.66s | Unsupported: unavailable | Failed: command | + | 0.35.0 | 2025-10-09 19:26 UTC | 2.10s | Unsupported: unavailable | Failed: command | + | 0.34.0 | 2025-09-28 06:36 UTC | 2.06s | Unsupported: unavailable | Failed: command | + | 0.33.0 | 2025-08-14 13:50 UTC | 2.23s | Unsupported: unavailable | Failed: command | + | 0.32.0 | 2025-07-25 14:12 UTC | 2.02s | Unsupported: unavailable | Failed: command | + | 0.31.2 | 2025-06-22 17:40 UTC | 2.05s | Unsupported: unavailable | Failed: command | + | 0.31.1 | 2025-06-17 15:24 UTC | 2.09s | Unsupported: unavailable | Failed: command | + | 0.31.0 | 2025-06-12 16:20 UTC | 2.00s | Unsupported: unavailable | Failed: command | + | 0.30.2 | 2025-06-07 02:42 UTC | 2.23s | Unsupported: unavailable | Failed: command | + | 0.30.1 | 2025-04-28 13:58 UTC | 1.59s | Unsupported: unavailable | Failed: command | + | 0.30.0 | 2025-04-17 15:24 UTC | 2.13s | Unsupported: unavailable | Failed: command | + | 0.29.0 * | 2025-04-17 15:06 UTC | 2.07s | Unsupported: unavailable | Failed: command | + | 0.28.5 | 2025-03-24 17:36 UTC | 435ms | Unsupported: unavailable | Failed: command | + | 0.28.4 | 2025-03-11 17:23 UTC | 399ms | Unsupported: unavailable | Failed: command | + | 0.28.3 | 2025-03-10 18:31 UTC | 419ms | Unsupported: unavailable | Unsupported: unavailable | + | 0.28.2 | 2025-02-27 18:00 UTC | 405ms | Unsupported: unavailable | Unsupported: unavailable | + | 0.28.1 | 2025-02-15 02:52 UTC | 425ms | Unsupported: unavailable | Unsupported: unavailable | + | 0.28.0 | 2025-02-14 16:17 UTC | 400ms | Unsupported: unavailable | Unsupported: unavailable | + | 0.27.3 | 2025-02-11 18:12 UTC | 432ms | Unsupported: unavailable | Unsupported: unavailable | + | 0.27.2 | 2025-02-07 13:08 UTC | 389ms | Unsupported: unavailable | Unsupported: unavailable | + | 0.27.1 | 2025-02-06 17:11 UTC | 392ms | Unsupported: unavailable | Unsupported: unavailable | + | 0.27.0 | 2025-02-06 16:13 UTC | 488ms | Unsupported: unavailable | Unsupported: unavailable | + | 0.26.5 | 2025-01-14 12:02 UTC | 405ms | Unsupported: unavailable | Unsupported: unavailable | + | 0.26.4 | 2024-12-15 17:26 UTC | 405ms | Unsupported: unavailable | Unsupported: unavailable | + | 0.26.3 | 2024-11-10 16:42 UTC | 401ms | Unsupported: unavailable | Unsupported: unavailable | + | 0.26.1 | 2024-09-27 09:04 UTC | 423ms | Unsupported: unavailable | Unsupported: unavailable | + | 0.25.9 | 2024-08-07 03:11 UTC | 404ms | Unsupported: unavailable | Unsupported: unavailable | + | 0.25.7 | 2024-06-11 17:16 UTC | 396ms | Unsupported: unavailable | Unsupported: unavailable | + | 0.25.6 | 2024-04-25 17:06 UTC | 413ms | Unsupported: unavailable | Unsupported: unavailable | + | 0.25.4 | 2024-02-13 18:10 UTC | 396ms | Unsupported: unavailable | Unsupported: unavailable | + | 0.25.2 | 2023-12-21 18:12 UTC | 418ms | Unsupported: unavailable | Unsupported: unavailable | + | 0.25.0 | 2023-11-25 07:17 UTC | 387ms | Unsupported: unavailable | Unsupported: unavailable | + +=== "Small / OpenAPI" + + | Version | Released | black/isort(Default) | Built-in | Ruff | + | --- | --- | --- | --- | --- | + | main | - | 523ms | 383ms (1.37x faster) | 380ms (1.38x faster) | + | 0.65.0 | 2026-06-21 18:21 UTC | 581ms | 439ms (1.32x faster) | 481ms (1.21x faster) | + | 0.64.1 * | 2026-06-19 17:19 UTC | 2.30s | 2.28s (1.01x faster) | 2.17s (1.06x faster) | + | 0.64.0 | 2026-06-14 17:24 UTC | 2.32s | 2.20s (1.06x faster) | 2.21s (1.05x faster) | + | 0.59.0 | 2026-05-29 15:47 UTC | 2.38s | Unsupported: unavailable | 2.33s (1.02x faster) | + | 0.58.0 | 2026-05-25 03:23 UTC | 2.59s | Unsupported: unavailable | 2.57s (1.01x faster) | + | 0.57.0 | 2026-05-07 16:21 UTC | 2.24s | Unsupported: unavailable | 2.22s (1.01x faster) | + | 0.56.1 | 2026-04-16 17:09 UTC | 2.05s | Unsupported: unavailable | 2.02s (1.01x faster) | + | 0.56.0 | 2026-04-04 09:46 UTC | 2.45s | Unsupported: unavailable | 2.36s (1.04x faster) | + | 0.55.0 | 2026-03-10 20:41 UTC | 2.27s | Unsupported: unavailable | 2.27s (same speed) | + | 0.54.1 | 2026-03-04 04:15 UTC | 2.21s | Unsupported: unavailable | 2.17s (1.02x faster) | + | 0.54.0 | 2026-02-14 16:19 UTC | 2.36s | Unsupported: unavailable | 2.32s (1.02x faster) | + | 0.53.0 | 2026-01-12 18:14 UTC | 2.24s | Unsupported: unavailable | 2.20s (1.01x faster) | + | 0.52.2 | 2026-01-05 17:25 UTC | 2.30s | Unsupported: unavailable | 2.26s (1.02x faster) | + | 0.45.0 | 2025-12-19 00:13 UTC | 1.89s | Unsupported: unavailable | Failed: command | + | 0.43.1 | 2025-12-12 07:03 UTC | 2.09s | Unsupported: unavailable | Failed: command | + | 0.42.2 | 2025-12-08 21:04 UTC | 2.29s | Unsupported: unavailable | Failed: command | + | 0.42.0 | 2025-12-08 02:57 UTC | 2.21s | Unsupported: unavailable | Failed: command | + | 0.39.0 | 2025-12-02 19:29 UTC | 2.19s | Unsupported: unavailable | Failed: command | + | 0.36.0 | 2025-11-26 17:14 UTC | 1.69s | Unsupported: unavailable | Failed: command | + | 0.35.0 | 2025-10-09 19:26 UTC | 2.17s | Unsupported: unavailable | Failed: command | + | 0.34.0 | 2025-09-28 06:36 UTC | 2.10s | Unsupported: unavailable | Failed: command | + | 0.33.0 | 2025-08-14 13:50 UTC | 2.24s | Unsupported: unavailable | Failed: command | + | 0.32.0 | 2025-07-25 14:12 UTC | 2.05s | Unsupported: unavailable | Failed: command | + | 0.31.2 | 2025-06-22 17:40 UTC | 2.04s | Unsupported: unavailable | Failed: command | + | 0.31.1 | 2025-06-17 15:24 UTC | 2.12s | Unsupported: unavailable | Failed: command | + | 0.31.0 | 2025-06-12 16:20 UTC | 2.06s | Unsupported: unavailable | Failed: command | + | 0.30.2 | 2025-06-07 02:42 UTC | 2.33s | Unsupported: unavailable | Failed: command | + | 0.30.1 | 2025-04-28 13:58 UTC | 1.63s | Unsupported: unavailable | Failed: command | + | 0.30.0 | 2025-04-17 15:24 UTC | 2.22s | Unsupported: unavailable | Failed: command | + | 0.29.0 * | 2025-04-17 15:06 UTC | 2.11s | Unsupported: unavailable | Failed: command | + | 0.28.5 | 2025-03-24 17:36 UTC | 479ms | Unsupported: unavailable | Failed: command | + | 0.28.4 | 2025-03-11 17:23 UTC | 426ms | Unsupported: unavailable | Failed: command | + | 0.28.3 | 2025-03-10 18:31 UTC | 455ms | Unsupported: unavailable | Unsupported: unavailable | + | 0.28.2 | 2025-02-27 18:00 UTC | 449ms | Unsupported: unavailable | Unsupported: unavailable | + | 0.28.1 | 2025-02-15 02:52 UTC | 456ms | Unsupported: unavailable | Unsupported: unavailable | + | 0.28.0 | 2025-02-14 16:17 UTC | 442ms | Unsupported: unavailable | Unsupported: unavailable | + | 0.27.3 | 2025-02-11 18:12 UTC | 475ms | Unsupported: unavailable | Unsupported: unavailable | + | 0.27.2 | 2025-02-07 13:08 UTC | 433ms | Unsupported: unavailable | Unsupported: unavailable | + | 0.27.1 | 2025-02-06 17:11 UTC | 442ms | Unsupported: unavailable | Unsupported: unavailable | + | 0.27.0 | 2025-02-06 16:13 UTC | 491ms | Unsupported: unavailable | Unsupported: unavailable | + | 0.26.5 | 2025-01-14 12:02 UTC | 439ms | Unsupported: unavailable | Unsupported: unavailable | + | 0.26.4 | 2024-12-15 17:26 UTC | 441ms | Unsupported: unavailable | Unsupported: unavailable | + | 0.26.3 | 2024-11-10 16:42 UTC | 434ms | Unsupported: unavailable | Unsupported: unavailable | + | 0.26.1 | 2024-09-27 09:04 UTC | 495ms | Unsupported: unavailable | Unsupported: unavailable | + | 0.25.9 | 2024-08-07 03:11 UTC | 440ms | Unsupported: unavailable | Unsupported: unavailable | + | 0.25.7 | 2024-06-11 17:16 UTC | 428ms | Unsupported: unavailable | Unsupported: unavailable | + | 0.25.6 | 2024-04-25 17:06 UTC | 447ms | Unsupported: unavailable | Unsupported: unavailable | + | 0.25.4 | 2024-02-13 18:10 UTC | 437ms | Unsupported: unavailable | Unsupported: unavailable | + | 0.25.2 | 2023-12-21 18:12 UTC | 460ms | Unsupported: unavailable | Unsupported: unavailable | + | 0.25.0 | 2023-11-25 07:17 UTC | 425ms | Unsupported: unavailable | Unsupported: unavailable | + +=== "Large / JSON Schema" + + | Version | Released | black/isort(Default) | Built-in | Ruff | + | --- | --- | --- | --- | --- | + | main | - | 3.54s | 1.23s (2.89x faster) | 1.15s (3.09x faster) | + | 0.65.0 | 2026-06-21 18:21 UTC | 3.20s | 1.19s (2.69x faster) | 1.14s (2.80x faster) | + | 0.64.1 * | 2026-06-19 17:19 UTC | 3.78s | 1.51s (2.50x faster) | 1.53s (2.48x faster) | + | 0.64.0 | 2026-06-14 17:24 UTC | 3.77s | 1.51s (2.50x faster) | 1.47s (2.56x faster) | + | 0.59.0 | 2026-05-29 15:47 UTC | 3.67s | Unsupported: unavailable | 1.71s (2.14x faster) | + | 0.58.0 | 2026-05-25 03:23 UTC | 3.82s | Unsupported: unavailable | 1.59s (2.40x faster) | + | 0.57.0 | 2026-05-07 16:21 UTC | 3.72s | Unsupported: unavailable | 1.58s (2.35x faster) | + | 0.56.1 | 2026-04-16 17:09 UTC | 3.16s | Unsupported: unavailable | 1.36s (2.32x faster) | + | 0.56.0 | 2026-04-04 09:46 UTC | 3.73s | Unsupported: unavailable | 1.50s (2.49x faster) | + | 0.55.0 | 2026-03-10 20:41 UTC | 3.72s | Unsupported: unavailable | 1.57s (2.36x faster) | + | 0.54.1 | 2026-03-04 04:15 UTC | 3.60s | Unsupported: unavailable | 1.55s (2.32x faster) | + | 0.54.0 | 2026-02-14 16:19 UTC | 3.80s | Unsupported: unavailable | 1.63s (2.34x faster) | + | 0.53.0 | 2026-01-12 18:14 UTC | 3.64s | Unsupported: unavailable | 1.53s (2.38x faster) | + | 0.52.2 | 2026-01-05 17:25 UTC | 3.80s | Unsupported: unavailable | 1.55s (2.45x faster) | + | 0.45.0 | 2025-12-19 00:13 UTC | 3.45s | Unsupported: unavailable | Failed: command | + | 0.43.1 | 2025-12-12 07:03 UTC | 3.85s | Unsupported: unavailable | Failed: command | + | 0.42.2 | 2025-12-08 21:04 UTC | 3.97s | Unsupported: unavailable | Failed: command | + | 0.42.0 | 2025-12-08 02:57 UTC | 3.47s | Unsupported: unavailable | Failed: command | + | 0.39.0 | 2025-12-02 19:29 UTC | 3.42s | Unsupported: unavailable | Failed: command | + | 0.36.0 | 2025-11-26 17:14 UTC | 4.19s | Unsupported: unavailable | Failed: command | + | 0.35.0 | 2025-10-09 19:26 UTC | 5.06s | Unsupported: unavailable | Failed: command | + | 0.34.0 | 2025-09-28 06:36 UTC | 5.17s | Unsupported: unavailable | Failed: command | + | 0.33.0 | 2025-08-14 13:50 UTC | 5.91s | Unsupported: unavailable | Failed: command | + | 0.32.0 | 2025-07-25 14:12 UTC | 5.51s | Unsupported: unavailable | Failed: command | + | 0.31.2 | 2025-06-22 17:40 UTC | 5.25s | Unsupported: unavailable | Failed: command | + | 0.31.1 | 2025-06-17 15:24 UTC | 5.36s | Unsupported: unavailable | Failed: command | + | 0.31.0 | 2025-06-12 16:20 UTC | 5.40s | Unsupported: unavailable | Failed: command | + | 0.30.2 | 2025-06-07 02:42 UTC | 6.03s | Unsupported: unavailable | Failed: command | + | 0.30.1 | 2025-04-28 13:58 UTC | 4.06s | Unsupported: unavailable | Failed: command | + | 0.30.0 | 2025-04-17 15:24 UTC | 5.81s | Unsupported: unavailable | Failed: command | + | 0.29.0 * | 2025-04-17 15:06 UTC | 5.15s | Unsupported: unavailable | Failed: command | + | 0.28.5 | 2025-03-24 17:36 UTC | 3.93s | Unsupported: unavailable | Failed: command | + | 0.28.4 | 2025-03-11 17:23 UTC | 3.16s | Unsupported: unavailable | Failed: command | + | 0.28.3 | 2025-03-10 18:31 UTC | 3.67s | Unsupported: unavailable | Unsupported: unavailable | + | 0.28.2 | 2025-02-27 18:00 UTC | 3.36s | Unsupported: unavailable | Unsupported: unavailable | + | 0.28.1 | 2025-02-15 02:52 UTC | 3.65s | Unsupported: unavailable | Unsupported: unavailable | + | 0.28.0 | 2025-02-14 16:17 UTC | 3.24s | Unsupported: unavailable | Unsupported: unavailable | + | 0.27.3 | 2025-02-11 18:12 UTC | 3.79s | Unsupported: unavailable | Unsupported: unavailable | + | 0.27.2 | 2025-02-07 13:08 UTC | 3.39s | Unsupported: unavailable | Unsupported: unavailable | + | 0.27.1 | 2025-02-06 17:11 UTC | 3.51s | Unsupported: unavailable | Unsupported: unavailable | + | 0.27.0 | 2025-02-06 16:13 UTC | 3.65s | Unsupported: unavailable | Unsupported: unavailable | + | 0.26.5 | 2025-01-14 12:02 UTC | 3.28s | Unsupported: unavailable | Unsupported: unavailable | + | 0.26.4 | 2024-12-15 17:26 UTC | 3.29s | Unsupported: unavailable | Unsupported: unavailable | + | 0.26.3 | 2024-11-10 16:42 UTC | 3.29s | Unsupported: unavailable | Unsupported: unavailable | + | 0.26.1 | 2024-09-27 09:04 UTC | 3.87s | Unsupported: unavailable | Unsupported: unavailable | + | 0.25.9 | 2024-08-07 03:11 UTC | 3.76s | Unsupported: unavailable | Unsupported: unavailable | + | 0.25.7 | 2024-06-11 17:16 UTC | 3.17s | Unsupported: unavailable | Unsupported: unavailable | + | 0.25.6 | 2024-04-25 17:06 UTC | 3.42s | Unsupported: unavailable | Unsupported: unavailable | + | 0.25.4 | 2024-02-13 18:10 UTC | 3.49s | Unsupported: unavailable | Unsupported: unavailable | + | 0.25.2 | 2023-12-21 18:12 UTC | 3.67s | Unsupported: unavailable | Unsupported: unavailable | + | 0.25.0 | 2023-11-25 07:17 UTC | 3.44s | Unsupported: unavailable | Unsupported: unavailable | + +=== "Large / OpenAPI" + + | Version | Released | black/isort(Default) | Built-in | Ruff | + | --- | --- | --- | --- | --- | + | main | - | 3.19s | 1.28s (2.49x faster) | 1.23s (2.59x faster) | + | 0.65.0 | 2026-06-21 18:21 UTC | 2.97s | 1.23s (2.42x faster) | 1.22s (2.44x faster) | + | 0.64.1 * | 2026-06-19 17:19 UTC | 3.30s | 1.45s (2.28x faster) | 1.39s (2.38x faster) | + | 0.64.0 | 2026-06-14 17:24 UTC | 3.42s | 1.46s (2.34x faster) | 1.41s (2.43x faster) | + | 0.59.0 | 2026-05-29 15:47 UTC | 3.55s | Unsupported: unavailable | 1.70s (2.09x faster) | + | 0.58.0 | 2026-05-25 03:23 UTC | 3.58s | Unsupported: unavailable | 1.60s (2.23x faster) | + | 0.57.0 | 2026-05-07 16:21 UTC | 3.40s | Unsupported: unavailable | 1.54s (2.20x faster) | + | 0.56.1 | 2026-04-16 17:09 UTC | 2.93s | Unsupported: unavailable | 1.35s (2.16x faster) | + | 0.56.0 | 2026-04-04 09:46 UTC | 3.37s | Unsupported: unavailable | 1.50s (2.25x faster) | + | 0.55.0 | 2026-03-10 20:41 UTC | 3.53s | Unsupported: unavailable | 1.56s (2.27x faster) | + | 0.54.1 | 2026-03-04 04:15 UTC | 3.33s | Unsupported: unavailable | 1.48s (2.26x faster) | + | 0.54.0 | 2026-02-14 16:19 UTC | 3.43s | Unsupported: unavailable | 1.55s (2.21x faster) | + | 0.53.0 | 2026-01-12 18:14 UTC | 3.31s | Unsupported: unavailable | 1.48s (2.24x faster) | + | 0.52.2 | 2026-01-05 17:25 UTC | 3.45s | Unsupported: unavailable | 1.52s (2.27x faster) | + | 0.45.0 | 2025-12-19 00:13 UTC | 2.81s | Unsupported: unavailable | Failed: command | + | 0.43.1 | 2025-12-12 07:03 UTC | 3.23s | Unsupported: unavailable | Failed: command | + | 0.42.2 | 2025-12-08 21:04 UTC | 3.48s | Unsupported: unavailable | Failed: command | + | 0.42.0 | 2025-12-08 02:57 UTC | 3.29s | Unsupported: unavailable | Failed: command | + | 0.39.0 | 2025-12-02 19:29 UTC | 3.13s | Unsupported: unavailable | Failed: command | + | 0.36.0 | 2025-11-26 17:14 UTC | 3.68s | Unsupported: unavailable | Failed: command | + | 0.35.0 | 2025-10-09 19:26 UTC | 4.60s | Unsupported: unavailable | Failed: command | + | 0.34.0 | 2025-09-28 06:36 UTC | 4.74s | Unsupported: unavailable | Failed: command | + | 0.33.0 | 2025-08-14 13:50 UTC | 5.42s | Unsupported: unavailable | Failed: command | + | 0.32.0 | 2025-07-25 14:12 UTC | 4.90s | Unsupported: unavailable | Failed: command | + | 0.31.2 | 2025-06-22 17:40 UTC | 4.81s | Unsupported: unavailable | Failed: command | + | 0.31.1 | 2025-06-17 15:24 UTC | 4.82s | Unsupported: unavailable | Failed: command | + | 0.31.0 | 2025-06-12 16:20 UTC | 5.07s | Unsupported: unavailable | Failed: command | + | 0.30.2 | 2025-06-07 02:42 UTC | 5.50s | Unsupported: unavailable | Failed: command | + | 0.30.1 | 2025-04-28 13:58 UTC | 3.69s | Unsupported: unavailable | Failed: command | + | 0.30.0 | 2025-04-17 15:24 UTC | 5.36s | Unsupported: unavailable | Failed: command | + | 0.29.0 * | 2025-04-17 15:06 UTC | 4.72s | Unsupported: unavailable | Failed: command | + | 0.28.5 | 2025-03-24 17:36 UTC | 3.57s | Unsupported: unavailable | Failed: command | + | 0.28.4 | 2025-03-11 17:23 UTC | 2.98s | Unsupported: unavailable | Failed: command | + | 0.28.3 | 2025-03-10 18:31 UTC | 3.40s | Unsupported: unavailable | Unsupported: unavailable | + | 0.28.2 | 2025-02-27 18:00 UTC | 3.20s | Unsupported: unavailable | Unsupported: unavailable | + | 0.28.1 | 2025-02-15 02:52 UTC | 3.48s | Unsupported: unavailable | Unsupported: unavailable | + | 0.28.0 | 2025-02-14 16:17 UTC | 3.00s | Unsupported: unavailable | Unsupported: unavailable | + | 0.27.3 | 2025-02-11 18:12 UTC | 3.59s | Unsupported: unavailable | Unsupported: unavailable | + | 0.27.2 | 2025-02-07 13:08 UTC | 3.20s | Unsupported: unavailable | Unsupported: unavailable | + | 0.27.1 | 2025-02-06 17:11 UTC | 3.29s | Unsupported: unavailable | Unsupported: unavailable | + | 0.27.0 | 2025-02-06 16:13 UTC | 3.47s | Unsupported: unavailable | Unsupported: unavailable | + | 0.26.5 | 2025-01-14 12:02 UTC | 3.21s | Unsupported: unavailable | Unsupported: unavailable | + | 0.26.4 | 2024-12-15 17:26 UTC | 3.01s | Unsupported: unavailable | Unsupported: unavailable | + | 0.26.3 | 2024-11-10 16:42 UTC | 3.04s | Unsupported: unavailable | Unsupported: unavailable | + | 0.26.1 | 2024-09-27 09:04 UTC | 3.53s | Unsupported: unavailable | Unsupported: unavailable | + | 0.25.9 | 2024-08-07 03:11 UTC | 3.31s | Unsupported: unavailable | Unsupported: unavailable | + | 0.25.7 | 2024-06-11 17:16 UTC | 2.92s | Unsupported: unavailable | Unsupported: unavailable | + | 0.25.6 | 2024-04-25 17:06 UTC | 3.10s | Unsupported: unavailable | Unsupported: unavailable | + | 0.25.4 | 2024-02-13 18:10 UTC | 3.19s | Unsupported: unavailable | Unsupported: unavailable | + | 0.25.2 | 2023-12-21 18:12 UTC | 3.28s | Unsupported: unavailable | Unsupported: unavailable | + | 0.25.0 | 2023-11-25 07:17 UTC | 3.20s | Unsupported: unavailable | Unsupported: unavailable | + +--- + # Deprecations Source: https://datamodel-code-generator.koxudaxi.dev/deprecations/ diff --git a/docs/llms.txt b/docs/llms.txt index 85f4b1450..2f07aca63 100644 --- a/docs/llms.txt +++ b/docs/llms.txt @@ -79,6 +79,7 @@ - [Conformance Dashboard](https://datamodel-code-generator.koxudaxi.dev/conformance/): This page summarizes the external conformance and end-to-end corpus checks that CI runs for datamodel-code-generator. The table is generated from `... +- [Performance Benchmarks](https://datamodel-code-generator.koxudaxi.dev/performance-benchmarks/): This page tracks datamodel-code-generator release and main-branch benchmark results collected on GitHub Actions. The data covers only datamodel-cod... - [Deprecations](https://datamodel-code-generator.koxudaxi.dev/deprecations/): This page lists deprecations and scheduled breaking changes. - [Experimental Features](https://datamodel-code-generator.koxudaxi.dev/experimental/): This page lists features that are available but still experimental. - [Architecture](https://datamodel-code-generator.koxudaxi.dev/architecture/): `datamodel-code-generator` is organized around one central idea: many input formats are normalized into a shared generation graph, then rendered th... diff --git a/docs/performance-benchmarks.md b/docs/performance-benchmarks.md new file mode 100644 index 000000000..fd8a05bc1 --- /dev/null +++ b/docs/performance-benchmarks.md @@ -0,0 +1,341 @@ +# Performance Benchmarks + + + +This page tracks datamodel-code-generator release and main-branch benchmark results collected on GitHub Actions. The data covers only datamodel-code-generator and uses Ubuntu runners so release-to-release changes can be compared without mixing in third-party generator results. Automatic backfills select versions from PyPI download-by-version data when that public dataset is available. + +datamodel-code-generator supports many schema styles and production use cases, so it includes a broad set of useful options. As releases add more capabilities, these benchmarks help keep the implementation measured, managed, and tuned so code generation stays fast in everyday use. + +## Historical Trends + +Each chart plots median generation time by release version for one benchmark scenario. Each line is a formatter pipeline; missing or unsupported formatter results are skipped. Marked versions have benchmark notes below. + +Compatibility backfill: Versions 0.26.4-0.34.0 use Python 3.13.14 because those releases fail during import on Python 3.14.2 before benchmark timing. + +=== "Small / JSON Schema" + + + + + Loading benchmark chart... + + + + +=== "Small / OpenAPI" + + + + + Loading benchmark chart... + + + + +=== "Large / JSON Schema" + + + + + Loading benchmark chart... + + + + +=== "Large / OpenAPI" + + + + + Loading benchmark chart... + + + + +## Benchmark Notes + +Version markers in the charts and historical tables point to these benchmark interpretation notes. + +- `0.29.0`: The inflect dependency range was widened and cold imports became slower. Release 0.29.0 allowed inflect 7.x, which resolves typeguard 4.x in modern environments. That typeguard instrumentation increased fresh-process startup cost. Small OpenAPI is especially visible because the fixture has array component names such as Pets and Users, so class-name singularization initializes inflect while the rest of the generation work is small. +- `0.64.1`: This release predates the main-branch inflect import mitigation. The latest release result still includes the inflect/typeguard cold-import cost. The effect is most visible in Small/OpenAPI because the fixture has array component names such as Pets and Users, so class-name singularization initializes inflect while the rest of the generation work is small. + +## Collection Policy + +- The benchmark workflow runs on `ubuntu-24.04`. +- Benchmark results are collected on GitHub Actions CI runners, so median timings can vary slightly with runner load and workflow timing; rerun benchmarks before treating small differences as regressions. +- The Python version is the workflow input, defaulting to the latest configured CI Python. +- Release packages are installed from PyPI in isolated virtual environments. +- The `main` snapshot is installed from the GitHub repository when it is explicitly selected. +- Input coverage currently focuses on OpenAPI and JSON Schema. +- Historical backfills are produced by the `Release Benchmarks` workflow and committed after review. + +## Latest Dataset + +- Schema version: `1` +- Generated at: `2026-06-22T09:37:07Z` +- Source workflow: `Release Benchmarks` +- Primary Python version: `3.14.2` +- Entry Python versions: `3.13.14`, `3.14.2` +- Benchmark runs per case: `mixed` +- Version selection: `clickpy_downloads_with_compatibility_backfill_and_main` +- Selected versions: `52` +- Download source: `clickpy` +- Download window: `365` days +- Downloads in window: `117,445,983` +- PyPIStats last month: `13,805,155` + +## Latest Release Summary + +Results below are medians. Built-in and Ruff ratios are relative to the black/isort(Default) formatter for the same scenario. + +### main + +=== "Small" + + | Input | Formatter | Median | vs black/isort(Default) | Range | Status | + | --- | --- | --- | --- | --- | --- | + | JSON Schema | black/isort(Default) | 457ms | baseline | 450ms-460ms | OK | + | JSON Schema | Built-in | 325ms | 1.41x faster | 321ms-339ms | OK | + | JSON Schema | Ruff | 328ms | 1.39x faster | 324ms-332ms | OK | + | OpenAPI | black/isort(Default) | 523ms | baseline | 515ms-529ms | OK | + | OpenAPI | Built-in | 383ms | 1.37x faster | 375ms-389ms | OK | + | OpenAPI | Ruff | 380ms | 1.38x faster | 372ms-386ms | OK | + +=== "Large" + + | Input | Formatter | Median | vs black/isort(Default) | Range | Status | + | --- | --- | --- | --- | --- | --- | + | JSON Schema | black/isort(Default) | 3.54s | baseline | 3.42s-3.63s | OK | + | JSON Schema | Built-in | 1.23s | 2.89x faster | 1.20s-1.24s | OK | + | JSON Schema | Ruff | 1.15s | 3.09x faster | 1.14s-1.16s | OK | + | OpenAPI | black/isort(Default) | 3.19s | baseline | 3.17s-3.26s | OK | + | OpenAPI | Built-in | 1.28s | 2.49x faster | 1.25s-1.30s | OK | + | OpenAPI | Ruff | 1.23s | 2.59x faster | 1.20s-1.25s | OK | + +## Historical Results + +Rows are release versions, newest first, with `main` shown before releases when present. Released is the PyPI upload timestamp in UTC; branch refs such as `main` show `-`. Formatter cells show median generation time; non-default cells include the speed relative to black/isort(Default) when both results are available. Rows without any successful formatter result are omitted. Version cells marked with `*` have benchmark notes above. + +=== "Small / JSON Schema" + + | Version | Released | black/isort(Default) | Built-in | Ruff | + | --- | --- | --- | --- | --- | + | main | - | 457ms | 325ms (1.41x faster) | 328ms (1.39x faster) | + | 0.65.0 | 2026-06-21 18:21 UTC | 515ms | 397ms (1.30x faster) | 416ms (1.24x faster) | + | 0.64.1 * | 2026-06-19 17:19 UTC | 561ms | 420ms (1.33x faster) | 430ms (1.30x faster) | + | 0.64.0 | 2026-06-14 17:24 UTC | 588ms | 415ms (1.42x faster) | 416ms (1.41x faster) | + | 0.59.0 | 2026-05-29 15:47 UTC | 541ms | Unsupported: unavailable | 509ms (1.06x faster) | + | 0.58.0 | 2026-05-25 03:23 UTC | 539ms | Unsupported: unavailable | 497ms (1.09x faster) | + | 0.57.0 | 2026-05-07 16:21 UTC | 492ms | Unsupported: unavailable | 463ms (1.06x faster) | + | 0.56.1 | 2026-04-16 17:09 UTC | 432ms | Unsupported: unavailable | 408ms (1.06x faster) | + | 0.56.0 | 2026-04-04 09:46 UTC | 495ms | Unsupported: unavailable | 476ms (1.04x faster) | + | 0.55.0 | 2026-03-10 20:41 UTC | 505ms | Unsupported: unavailable | 465ms (1.09x faster) | + | 0.54.1 | 2026-03-04 04:15 UTC | 481ms | Unsupported: unavailable | 454ms (1.06x faster) | + | 0.54.0 | 2026-02-14 16:19 UTC | 507ms | Unsupported: unavailable | 473ms (1.07x faster) | + | 0.53.0 | 2026-01-12 18:14 UTC | 485ms | Unsupported: unavailable | 450ms (1.08x faster) | + | 0.52.2 | 2026-01-05 17:25 UTC | 498ms | Unsupported: unavailable | 470ms (1.06x faster) | + | 0.45.0 | 2025-12-19 00:13 UTC | 375ms | Unsupported: unavailable | Failed: command | + | 0.43.1 | 2025-12-12 07:03 UTC | 402ms | Unsupported: unavailable | Failed: command | + | 0.42.2 | 2025-12-08 21:04 UTC | 454ms | Unsupported: unavailable | Failed: command | + | 0.42.0 | 2025-12-08 02:57 UTC | 413ms | Unsupported: unavailable | Failed: command | + | 0.39.0 | 2025-12-02 19:29 UTC | 413ms | Unsupported: unavailable | Failed: command | + | 0.36.0 | 2025-11-26 17:14 UTC | 1.66s | Unsupported: unavailable | Failed: command | + | 0.35.0 | 2025-10-09 19:26 UTC | 2.10s | Unsupported: unavailable | Failed: command | + | 0.34.0 | 2025-09-28 06:36 UTC | 2.06s | Unsupported: unavailable | Failed: command | + | 0.33.0 | 2025-08-14 13:50 UTC | 2.23s | Unsupported: unavailable | Failed: command | + | 0.32.0 | 2025-07-25 14:12 UTC | 2.02s | Unsupported: unavailable | Failed: command | + | 0.31.2 | 2025-06-22 17:40 UTC | 2.05s | Unsupported: unavailable | Failed: command | + | 0.31.1 | 2025-06-17 15:24 UTC | 2.09s | Unsupported: unavailable | Failed: command | + | 0.31.0 | 2025-06-12 16:20 UTC | 2.00s | Unsupported: unavailable | Failed: command | + | 0.30.2 | 2025-06-07 02:42 UTC | 2.23s | Unsupported: unavailable | Failed: command | + | 0.30.1 | 2025-04-28 13:58 UTC | 1.59s | Unsupported: unavailable | Failed: command | + | 0.30.0 | 2025-04-17 15:24 UTC | 2.13s | Unsupported: unavailable | Failed: command | + | 0.29.0 * | 2025-04-17 15:06 UTC | 2.07s | Unsupported: unavailable | Failed: command | + | 0.28.5 | 2025-03-24 17:36 UTC | 435ms | Unsupported: unavailable | Failed: command | + | 0.28.4 | 2025-03-11 17:23 UTC | 399ms | Unsupported: unavailable | Failed: command | + | 0.28.3 | 2025-03-10 18:31 UTC | 419ms | Unsupported: unavailable | Unsupported: unavailable | + | 0.28.2 | 2025-02-27 18:00 UTC | 405ms | Unsupported: unavailable | Unsupported: unavailable | + | 0.28.1 | 2025-02-15 02:52 UTC | 425ms | Unsupported: unavailable | Unsupported: unavailable | + | 0.28.0 | 2025-02-14 16:17 UTC | 400ms | Unsupported: unavailable | Unsupported: unavailable | + | 0.27.3 | 2025-02-11 18:12 UTC | 432ms | Unsupported: unavailable | Unsupported: unavailable | + | 0.27.2 | 2025-02-07 13:08 UTC | 389ms | Unsupported: unavailable | Unsupported: unavailable | + | 0.27.1 | 2025-02-06 17:11 UTC | 392ms | Unsupported: unavailable | Unsupported: unavailable | + | 0.27.0 | 2025-02-06 16:13 UTC | 488ms | Unsupported: unavailable | Unsupported: unavailable | + | 0.26.5 | 2025-01-14 12:02 UTC | 405ms | Unsupported: unavailable | Unsupported: unavailable | + | 0.26.4 | 2024-12-15 17:26 UTC | 405ms | Unsupported: unavailable | Unsupported: unavailable | + | 0.26.3 | 2024-11-10 16:42 UTC | 401ms | Unsupported: unavailable | Unsupported: unavailable | + | 0.26.1 | 2024-09-27 09:04 UTC | 423ms | Unsupported: unavailable | Unsupported: unavailable | + | 0.25.9 | 2024-08-07 03:11 UTC | 404ms | Unsupported: unavailable | Unsupported: unavailable | + | 0.25.7 | 2024-06-11 17:16 UTC | 396ms | Unsupported: unavailable | Unsupported: unavailable | + | 0.25.6 | 2024-04-25 17:06 UTC | 413ms | Unsupported: unavailable | Unsupported: unavailable | + | 0.25.4 | 2024-02-13 18:10 UTC | 396ms | Unsupported: unavailable | Unsupported: unavailable | + | 0.25.2 | 2023-12-21 18:12 UTC | 418ms | Unsupported: unavailable | Unsupported: unavailable | + | 0.25.0 | 2023-11-25 07:17 UTC | 387ms | Unsupported: unavailable | Unsupported: unavailable | + +=== "Small / OpenAPI" + + | Version | Released | black/isort(Default) | Built-in | Ruff | + | --- | --- | --- | --- | --- | + | main | - | 523ms | 383ms (1.37x faster) | 380ms (1.38x faster) | + | 0.65.0 | 2026-06-21 18:21 UTC | 581ms | 439ms (1.32x faster) | 481ms (1.21x faster) | + | 0.64.1 * | 2026-06-19 17:19 UTC | 2.30s | 2.28s (1.01x faster) | 2.17s (1.06x faster) | + | 0.64.0 | 2026-06-14 17:24 UTC | 2.32s | 2.20s (1.06x faster) | 2.21s (1.05x faster) | + | 0.59.0 | 2026-05-29 15:47 UTC | 2.38s | Unsupported: unavailable | 2.33s (1.02x faster) | + | 0.58.0 | 2026-05-25 03:23 UTC | 2.59s | Unsupported: unavailable | 2.57s (1.01x faster) | + | 0.57.0 | 2026-05-07 16:21 UTC | 2.24s | Unsupported: unavailable | 2.22s (1.01x faster) | + | 0.56.1 | 2026-04-16 17:09 UTC | 2.05s | Unsupported: unavailable | 2.02s (1.01x faster) | + | 0.56.0 | 2026-04-04 09:46 UTC | 2.45s | Unsupported: unavailable | 2.36s (1.04x faster) | + | 0.55.0 | 2026-03-10 20:41 UTC | 2.27s | Unsupported: unavailable | 2.27s (same speed) | + | 0.54.1 | 2026-03-04 04:15 UTC | 2.21s | Unsupported: unavailable | 2.17s (1.02x faster) | + | 0.54.0 | 2026-02-14 16:19 UTC | 2.36s | Unsupported: unavailable | 2.32s (1.02x faster) | + | 0.53.0 | 2026-01-12 18:14 UTC | 2.24s | Unsupported: unavailable | 2.20s (1.01x faster) | + | 0.52.2 | 2026-01-05 17:25 UTC | 2.30s | Unsupported: unavailable | 2.26s (1.02x faster) | + | 0.45.0 | 2025-12-19 00:13 UTC | 1.89s | Unsupported: unavailable | Failed: command | + | 0.43.1 | 2025-12-12 07:03 UTC | 2.09s | Unsupported: unavailable | Failed: command | + | 0.42.2 | 2025-12-08 21:04 UTC | 2.29s | Unsupported: unavailable | Failed: command | + | 0.42.0 | 2025-12-08 02:57 UTC | 2.21s | Unsupported: unavailable | Failed: command | + | 0.39.0 | 2025-12-02 19:29 UTC | 2.19s | Unsupported: unavailable | Failed: command | + | 0.36.0 | 2025-11-26 17:14 UTC | 1.69s | Unsupported: unavailable | Failed: command | + | 0.35.0 | 2025-10-09 19:26 UTC | 2.17s | Unsupported: unavailable | Failed: command | + | 0.34.0 | 2025-09-28 06:36 UTC | 2.10s | Unsupported: unavailable | Failed: command | + | 0.33.0 | 2025-08-14 13:50 UTC | 2.24s | Unsupported: unavailable | Failed: command | + | 0.32.0 | 2025-07-25 14:12 UTC | 2.05s | Unsupported: unavailable | Failed: command | + | 0.31.2 | 2025-06-22 17:40 UTC | 2.04s | Unsupported: unavailable | Failed: command | + | 0.31.1 | 2025-06-17 15:24 UTC | 2.12s | Unsupported: unavailable | Failed: command | + | 0.31.0 | 2025-06-12 16:20 UTC | 2.06s | Unsupported: unavailable | Failed: command | + | 0.30.2 | 2025-06-07 02:42 UTC | 2.33s | Unsupported: unavailable | Failed: command | + | 0.30.1 | 2025-04-28 13:58 UTC | 1.63s | Unsupported: unavailable | Failed: command | + | 0.30.0 | 2025-04-17 15:24 UTC | 2.22s | Unsupported: unavailable | Failed: command | + | 0.29.0 * | 2025-04-17 15:06 UTC | 2.11s | Unsupported: unavailable | Failed: command | + | 0.28.5 | 2025-03-24 17:36 UTC | 479ms | Unsupported: unavailable | Failed: command | + | 0.28.4 | 2025-03-11 17:23 UTC | 426ms | Unsupported: unavailable | Failed: command | + | 0.28.3 | 2025-03-10 18:31 UTC | 455ms | Unsupported: unavailable | Unsupported: unavailable | + | 0.28.2 | 2025-02-27 18:00 UTC | 449ms | Unsupported: unavailable | Unsupported: unavailable | + | 0.28.1 | 2025-02-15 02:52 UTC | 456ms | Unsupported: unavailable | Unsupported: unavailable | + | 0.28.0 | 2025-02-14 16:17 UTC | 442ms | Unsupported: unavailable | Unsupported: unavailable | + | 0.27.3 | 2025-02-11 18:12 UTC | 475ms | Unsupported: unavailable | Unsupported: unavailable | + | 0.27.2 | 2025-02-07 13:08 UTC | 433ms | Unsupported: unavailable | Unsupported: unavailable | + | 0.27.1 | 2025-02-06 17:11 UTC | 442ms | Unsupported: unavailable | Unsupported: unavailable | + | 0.27.0 | 2025-02-06 16:13 UTC | 491ms | Unsupported: unavailable | Unsupported: unavailable | + | 0.26.5 | 2025-01-14 12:02 UTC | 439ms | Unsupported: unavailable | Unsupported: unavailable | + | 0.26.4 | 2024-12-15 17:26 UTC | 441ms | Unsupported: unavailable | Unsupported: unavailable | + | 0.26.3 | 2024-11-10 16:42 UTC | 434ms | Unsupported: unavailable | Unsupported: unavailable | + | 0.26.1 | 2024-09-27 09:04 UTC | 495ms | Unsupported: unavailable | Unsupported: unavailable | + | 0.25.9 | 2024-08-07 03:11 UTC | 440ms | Unsupported: unavailable | Unsupported: unavailable | + | 0.25.7 | 2024-06-11 17:16 UTC | 428ms | Unsupported: unavailable | Unsupported: unavailable | + | 0.25.6 | 2024-04-25 17:06 UTC | 447ms | Unsupported: unavailable | Unsupported: unavailable | + | 0.25.4 | 2024-02-13 18:10 UTC | 437ms | Unsupported: unavailable | Unsupported: unavailable | + | 0.25.2 | 2023-12-21 18:12 UTC | 460ms | Unsupported: unavailable | Unsupported: unavailable | + | 0.25.0 | 2023-11-25 07:17 UTC | 425ms | Unsupported: unavailable | Unsupported: unavailable | + +=== "Large / JSON Schema" + + | Version | Released | black/isort(Default) | Built-in | Ruff | + | --- | --- | --- | --- | --- | + | main | - | 3.54s | 1.23s (2.89x faster) | 1.15s (3.09x faster) | + | 0.65.0 | 2026-06-21 18:21 UTC | 3.20s | 1.19s (2.69x faster) | 1.14s (2.80x faster) | + | 0.64.1 * | 2026-06-19 17:19 UTC | 3.78s | 1.51s (2.50x faster) | 1.53s (2.48x faster) | + | 0.64.0 | 2026-06-14 17:24 UTC | 3.77s | 1.51s (2.50x faster) | 1.47s (2.56x faster) | + | 0.59.0 | 2026-05-29 15:47 UTC | 3.67s | Unsupported: unavailable | 1.71s (2.14x faster) | + | 0.58.0 | 2026-05-25 03:23 UTC | 3.82s | Unsupported: unavailable | 1.59s (2.40x faster) | + | 0.57.0 | 2026-05-07 16:21 UTC | 3.72s | Unsupported: unavailable | 1.58s (2.35x faster) | + | 0.56.1 | 2026-04-16 17:09 UTC | 3.16s | Unsupported: unavailable | 1.36s (2.32x faster) | + | 0.56.0 | 2026-04-04 09:46 UTC | 3.73s | Unsupported: unavailable | 1.50s (2.49x faster) | + | 0.55.0 | 2026-03-10 20:41 UTC | 3.72s | Unsupported: unavailable | 1.57s (2.36x faster) | + | 0.54.1 | 2026-03-04 04:15 UTC | 3.60s | Unsupported: unavailable | 1.55s (2.32x faster) | + | 0.54.0 | 2026-02-14 16:19 UTC | 3.80s | Unsupported: unavailable | 1.63s (2.34x faster) | + | 0.53.0 | 2026-01-12 18:14 UTC | 3.64s | Unsupported: unavailable | 1.53s (2.38x faster) | + | 0.52.2 | 2026-01-05 17:25 UTC | 3.80s | Unsupported: unavailable | 1.55s (2.45x faster) | + | 0.45.0 | 2025-12-19 00:13 UTC | 3.45s | Unsupported: unavailable | Failed: command | + | 0.43.1 | 2025-12-12 07:03 UTC | 3.85s | Unsupported: unavailable | Failed: command | + | 0.42.2 | 2025-12-08 21:04 UTC | 3.97s | Unsupported: unavailable | Failed: command | + | 0.42.0 | 2025-12-08 02:57 UTC | 3.47s | Unsupported: unavailable | Failed: command | + | 0.39.0 | 2025-12-02 19:29 UTC | 3.42s | Unsupported: unavailable | Failed: command | + | 0.36.0 | 2025-11-26 17:14 UTC | 4.19s | Unsupported: unavailable | Failed: command | + | 0.35.0 | 2025-10-09 19:26 UTC | 5.06s | Unsupported: unavailable | Failed: command | + | 0.34.0 | 2025-09-28 06:36 UTC | 5.17s | Unsupported: unavailable | Failed: command | + | 0.33.0 | 2025-08-14 13:50 UTC | 5.91s | Unsupported: unavailable | Failed: command | + | 0.32.0 | 2025-07-25 14:12 UTC | 5.51s | Unsupported: unavailable | Failed: command | + | 0.31.2 | 2025-06-22 17:40 UTC | 5.25s | Unsupported: unavailable | Failed: command | + | 0.31.1 | 2025-06-17 15:24 UTC | 5.36s | Unsupported: unavailable | Failed: command | + | 0.31.0 | 2025-06-12 16:20 UTC | 5.40s | Unsupported: unavailable | Failed: command | + | 0.30.2 | 2025-06-07 02:42 UTC | 6.03s | Unsupported: unavailable | Failed: command | + | 0.30.1 | 2025-04-28 13:58 UTC | 4.06s | Unsupported: unavailable | Failed: command | + | 0.30.0 | 2025-04-17 15:24 UTC | 5.81s | Unsupported: unavailable | Failed: command | + | 0.29.0 * | 2025-04-17 15:06 UTC | 5.15s | Unsupported: unavailable | Failed: command | + | 0.28.5 | 2025-03-24 17:36 UTC | 3.93s | Unsupported: unavailable | Failed: command | + | 0.28.4 | 2025-03-11 17:23 UTC | 3.16s | Unsupported: unavailable | Failed: command | + | 0.28.3 | 2025-03-10 18:31 UTC | 3.67s | Unsupported: unavailable | Unsupported: unavailable | + | 0.28.2 | 2025-02-27 18:00 UTC | 3.36s | Unsupported: unavailable | Unsupported: unavailable | + | 0.28.1 | 2025-02-15 02:52 UTC | 3.65s | Unsupported: unavailable | Unsupported: unavailable | + | 0.28.0 | 2025-02-14 16:17 UTC | 3.24s | Unsupported: unavailable | Unsupported: unavailable | + | 0.27.3 | 2025-02-11 18:12 UTC | 3.79s | Unsupported: unavailable | Unsupported: unavailable | + | 0.27.2 | 2025-02-07 13:08 UTC | 3.39s | Unsupported: unavailable | Unsupported: unavailable | + | 0.27.1 | 2025-02-06 17:11 UTC | 3.51s | Unsupported: unavailable | Unsupported: unavailable | + | 0.27.0 | 2025-02-06 16:13 UTC | 3.65s | Unsupported: unavailable | Unsupported: unavailable | + | 0.26.5 | 2025-01-14 12:02 UTC | 3.28s | Unsupported: unavailable | Unsupported: unavailable | + | 0.26.4 | 2024-12-15 17:26 UTC | 3.29s | Unsupported: unavailable | Unsupported: unavailable | + | 0.26.3 | 2024-11-10 16:42 UTC | 3.29s | Unsupported: unavailable | Unsupported: unavailable | + | 0.26.1 | 2024-09-27 09:04 UTC | 3.87s | Unsupported: unavailable | Unsupported: unavailable | + | 0.25.9 | 2024-08-07 03:11 UTC | 3.76s | Unsupported: unavailable | Unsupported: unavailable | + | 0.25.7 | 2024-06-11 17:16 UTC | 3.17s | Unsupported: unavailable | Unsupported: unavailable | + | 0.25.6 | 2024-04-25 17:06 UTC | 3.42s | Unsupported: unavailable | Unsupported: unavailable | + | 0.25.4 | 2024-02-13 18:10 UTC | 3.49s | Unsupported: unavailable | Unsupported: unavailable | + | 0.25.2 | 2023-12-21 18:12 UTC | 3.67s | Unsupported: unavailable | Unsupported: unavailable | + | 0.25.0 | 2023-11-25 07:17 UTC | 3.44s | Unsupported: unavailable | Unsupported: unavailable | + +=== "Large / OpenAPI" + + | Version | Released | black/isort(Default) | Built-in | Ruff | + | --- | --- | --- | --- | --- | + | main | - | 3.19s | 1.28s (2.49x faster) | 1.23s (2.59x faster) | + | 0.65.0 | 2026-06-21 18:21 UTC | 2.97s | 1.23s (2.42x faster) | 1.22s (2.44x faster) | + | 0.64.1 * | 2026-06-19 17:19 UTC | 3.30s | 1.45s (2.28x faster) | 1.39s (2.38x faster) | + | 0.64.0 | 2026-06-14 17:24 UTC | 3.42s | 1.46s (2.34x faster) | 1.41s (2.43x faster) | + | 0.59.0 | 2026-05-29 15:47 UTC | 3.55s | Unsupported: unavailable | 1.70s (2.09x faster) | + | 0.58.0 | 2026-05-25 03:23 UTC | 3.58s | Unsupported: unavailable | 1.60s (2.23x faster) | + | 0.57.0 | 2026-05-07 16:21 UTC | 3.40s | Unsupported: unavailable | 1.54s (2.20x faster) | + | 0.56.1 | 2026-04-16 17:09 UTC | 2.93s | Unsupported: unavailable | 1.35s (2.16x faster) | + | 0.56.0 | 2026-04-04 09:46 UTC | 3.37s | Unsupported: unavailable | 1.50s (2.25x faster) | + | 0.55.0 | 2026-03-10 20:41 UTC | 3.53s | Unsupported: unavailable | 1.56s (2.27x faster) | + | 0.54.1 | 2026-03-04 04:15 UTC | 3.33s | Unsupported: unavailable | 1.48s (2.26x faster) | + | 0.54.0 | 2026-02-14 16:19 UTC | 3.43s | Unsupported: unavailable | 1.55s (2.21x faster) | + | 0.53.0 | 2026-01-12 18:14 UTC | 3.31s | Unsupported: unavailable | 1.48s (2.24x faster) | + | 0.52.2 | 2026-01-05 17:25 UTC | 3.45s | Unsupported: unavailable | 1.52s (2.27x faster) | + | 0.45.0 | 2025-12-19 00:13 UTC | 2.81s | Unsupported: unavailable | Failed: command | + | 0.43.1 | 2025-12-12 07:03 UTC | 3.23s | Unsupported: unavailable | Failed: command | + | 0.42.2 | 2025-12-08 21:04 UTC | 3.48s | Unsupported: unavailable | Failed: command | + | 0.42.0 | 2025-12-08 02:57 UTC | 3.29s | Unsupported: unavailable | Failed: command | + | 0.39.0 | 2025-12-02 19:29 UTC | 3.13s | Unsupported: unavailable | Failed: command | + | 0.36.0 | 2025-11-26 17:14 UTC | 3.68s | Unsupported: unavailable | Failed: command | + | 0.35.0 | 2025-10-09 19:26 UTC | 4.60s | Unsupported: unavailable | Failed: command | + | 0.34.0 | 2025-09-28 06:36 UTC | 4.74s | Unsupported: unavailable | Failed: command | + | 0.33.0 | 2025-08-14 13:50 UTC | 5.42s | Unsupported: unavailable | Failed: command | + | 0.32.0 | 2025-07-25 14:12 UTC | 4.90s | Unsupported: unavailable | Failed: command | + | 0.31.2 | 2025-06-22 17:40 UTC | 4.81s | Unsupported: unavailable | Failed: command | + | 0.31.1 | 2025-06-17 15:24 UTC | 4.82s | Unsupported: unavailable | Failed: command | + | 0.31.0 | 2025-06-12 16:20 UTC | 5.07s | Unsupported: unavailable | Failed: command | + | 0.30.2 | 2025-06-07 02:42 UTC | 5.50s | Unsupported: unavailable | Failed: command | + | 0.30.1 | 2025-04-28 13:58 UTC | 3.69s | Unsupported: unavailable | Failed: command | + | 0.30.0 | 2025-04-17 15:24 UTC | 5.36s | Unsupported: unavailable | Failed: command | + | 0.29.0 * | 2025-04-17 15:06 UTC | 4.72s | Unsupported: unavailable | Failed: command | + | 0.28.5 | 2025-03-24 17:36 UTC | 3.57s | Unsupported: unavailable | Failed: command | + | 0.28.4 | 2025-03-11 17:23 UTC | 2.98s | Unsupported: unavailable | Failed: command | + | 0.28.3 | 2025-03-10 18:31 UTC | 3.40s | Unsupported: unavailable | Unsupported: unavailable | + | 0.28.2 | 2025-02-27 18:00 UTC | 3.20s | Unsupported: unavailable | Unsupported: unavailable | + | 0.28.1 | 2025-02-15 02:52 UTC | 3.48s | Unsupported: unavailable | Unsupported: unavailable | + | 0.28.0 | 2025-02-14 16:17 UTC | 3.00s | Unsupported: unavailable | Unsupported: unavailable | + | 0.27.3 | 2025-02-11 18:12 UTC | 3.59s | Unsupported: unavailable | Unsupported: unavailable | + | 0.27.2 | 2025-02-07 13:08 UTC | 3.20s | Unsupported: unavailable | Unsupported: unavailable | + | 0.27.1 | 2025-02-06 17:11 UTC | 3.29s | Unsupported: unavailable | Unsupported: unavailable | + | 0.27.0 | 2025-02-06 16:13 UTC | 3.47s | Unsupported: unavailable | Unsupported: unavailable | + | 0.26.5 | 2025-01-14 12:02 UTC | 3.21s | Unsupported: unavailable | Unsupported: unavailable | + | 0.26.4 | 2024-12-15 17:26 UTC | 3.01s | Unsupported: unavailable | Unsupported: unavailable | + | 0.26.3 | 2024-11-10 16:42 UTC | 3.04s | Unsupported: unavailable | Unsupported: unavailable | + | 0.26.1 | 2024-09-27 09:04 UTC | 3.53s | Unsupported: unavailable | Unsupported: unavailable | + | 0.25.9 | 2024-08-07 03:11 UTC | 3.31s | Unsupported: unavailable | Unsupported: unavailable | + | 0.25.7 | 2024-06-11 17:16 UTC | 2.92s | Unsupported: unavailable | Unsupported: unavailable | + | 0.25.6 | 2024-04-25 17:06 UTC | 3.10s | Unsupported: unavailable | Unsupported: unavailable | + | 0.25.4 | 2024-02-13 18:10 UTC | 3.19s | Unsupported: unavailable | Unsupported: unavailable | + | 0.25.2 | 2023-12-21 18:12 UTC | 3.28s | Unsupported: unavailable | Unsupported: unavailable | + | 0.25.0 | 2023-11-25 07:17 UTC | 3.20s | Unsupported: unavailable | Unsupported: unavailable | diff --git a/scripts/build_preset_docs.py b/scripts/build_preset_docs.py index da842c766..1a1970bd7 100644 --- a/scripts/build_preset_docs.py +++ b/scripts/build_preset_docs.py @@ -38,12 +38,14 @@ "https://datamodel-code-generator.koxudaxi.dev/cli-reference/model-customization/#output-model-type" ) README_FORMATTER_BEHAVIOR_LINK = "https://datamodel-code-generator.koxudaxi.dev/formatter-behavior/" +README_PERFORMANCE_BENCHMARKS_LINK = "https://datamodel-code-generator.koxudaxi.dev/performance-benchmarks/" DOCS_PRESETS_LINK = "presets.md" DOCS_CLI_REFERENCE_LINK = "cli-reference/index.md" DOCS_PRESET_OPTION_LINK = "cli-reference/base-options.md#preset" DOCS_INPUT_FILE_TYPE_OPTION_LINK = "cli-reference/base-options.md#input-file-type" DOCS_OUTPUT_MODEL_TYPE_OPTION_LINK = "cli-reference/model-customization.md#output-model-type" DOCS_FORMATTER_BEHAVIOR_LINK = "formatter-behavior.md" +DOCS_PERFORMANCE_BENCHMARKS_LINK = "performance-benchmarks.md" if str(SRC_PATH) not in sys.path: sys.path.insert(0, str(SRC_PATH)) @@ -325,6 +327,8 @@ def _render_readme_quick_start( custom-template output is not exhaustively validated. If `--formatters builtin` produces invalid or poorly formatted output with a custom template, please open an issue with a small reproducer. See [Formatter Behavior]({README_FORMATTER_BEHAVIOR_LINK}) for details. + +See [Performance Benchmarks]({README_PERFORMANCE_BENCHMARKS_LINK}) for release benchmark data and interactive charts. """ @@ -381,7 +385,9 @@ def _render_docs_index_quick_start( Custom templates can emit Python outside the standard generated model patterns covered by `builtin`, so custom-template output is not exhaustively validated. If `--formatters builtin` produces invalid or poorly formatted output with a custom template, please open an issue with a small reproducer. See -[Formatter Behavior]({DOCS_FORMATTER_BEHAVIOR_LINK}) for details.""" +[Formatter Behavior]({DOCS_FORMATTER_BEHAVIOR_LINK}) for details. + +See [Performance Benchmarks]({DOCS_PERFORMANCE_BENCHMARKS_LINK}) for release benchmark data and interactive charts.""" def parse_args() -> argparse.Namespace: diff --git a/scripts/build_release_benchmark_docs.py b/scripts/build_release_benchmark_docs.py new file mode 100644 index 000000000..03780aa58 --- /dev/null +++ b/scripts/build_release_benchmark_docs.py @@ -0,0 +1,832 @@ +"""Build the release benchmark documentation page. + +Usage: + python scripts/build_release_benchmark_docs.py + python scripts/build_release_benchmark_docs.py --check +""" + +from __future__ import annotations + +import argparse +import html +import json +import re +import sys +from dataclasses import dataclass +from datetime import datetime, timezone +from pathlib import Path +from typing import Any + +try: + from scripts.release_benchmark_errors import summarize_benchmark_error +except ModuleNotFoundError: # pragma: no cover - direct script execution + from release_benchmark_errors import summarize_benchmark_error + +ROOT = Path(__file__).resolve().parents[1] +DATA_PATH = ROOT / "docs" / "data" / "release-benchmarks.json" +NOTES_PATH = ROOT / "docs" / "data" / "release-benchmark-notes.json" +DOCS_PATH = ROOT / "docs" / "performance-benchmarks.md" + +STATUS_OK = "ok" +EMPTY_CELL = "-" +MILLISECONDS_PER_SECOND = 1000 +WHOLE_MS_THRESHOLD = 100 +TENTH_MS_THRESHOLD = 10 +SAME_SPEED_TOLERANCE = 0.005 +FORMATTER_ORDER = ("default", "builtin", "ruff") +CASE_ORDER = ("small", "large") +MAIN_VERSION = "main" + + +@dataclass(frozen=True, slots=True) +class BenchmarkEntry: + """One release benchmark result row.""" + + version: str + python_version: str + os: str + input_type: str + case: str + formatter: str + runs: int + median_ms: float | None + min_ms: float | None + max_ms: float | None + stdev_ms: float | None + status: str + command: str + error: str + + +@dataclass(frozen=True, slots=True) +class BenchmarkNote: + """One human-authored release benchmark note.""" + + version: str + summary: str + details: str + input_type: str + case: str + + +@dataclass(frozen=True, slots=True) +class BenchmarkData: + """Release benchmark dataset loaded from JSON.""" + + schema_version: int + metadata: dict[str, Any] + entries: tuple[BenchmarkEntry, ...] + notes: tuple[BenchmarkNote, ...] + + +@dataclass(frozen=True, slots=True) +class GeneratedDoc: + """Generated file content.""" + + path: Path + content: str + + +def _string(value: object) -> str: + return value if isinstance(value, str) else "" + + +def _integer(value: object, *, default: int = 0) -> int: + if isinstance(value, int): + return value + if isinstance(value, float): + return int(value) + if isinstance(value, str) and value.isdecimal(): + return int(value) + return default + + +def _float(value: object) -> float | None: + if isinstance(value, (float, int)): + return float(value) + if isinstance(value, str): + try: + return float(value) + except ValueError: + return None + return None + + +def _entry_from_raw(raw: object, *, index: int) -> BenchmarkEntry: + if not isinstance(raw, dict): + msg = f"Benchmark entry #{index} must be an object" + raise TypeError(msg) + if not (version := _string(raw.get("version")).strip()): + msg = f"Benchmark entry #{index} is missing version" + raise ValueError(msg) + if not (input_type := _string(raw.get("input_type")).strip()): + msg = f"Benchmark entry #{index} is missing input_type" + raise ValueError(msg) + if not (formatter := _string(raw.get("formatter")).strip()): + msg = f"Benchmark entry #{index} is missing formatter" + raise ValueError(msg) + + status = _string(raw.get("status")).strip() or STATUS_OK + return BenchmarkEntry( + version=version, + python_version=_string(raw.get("python_version")).strip(), + os=_string(raw.get("os")).strip(), + input_type=input_type, + case=_string(raw.get("case")).strip() or "default", + formatter=formatter, + runs=_integer(raw.get("runs")), + median_ms=_float(raw.get("median_ms")), + min_ms=_float(raw.get("min_ms")), + max_ms=_float(raw.get("max_ms")), + stdev_ms=_float(raw.get("stdev_ms")), + status=status, + command=_string(raw.get("command")).strip(), + error=_string(raw.get("error")).strip(), + ) + + +def _note_from_raw(raw: object, *, index: int) -> BenchmarkNote: + if not isinstance(raw, dict): + msg = f"Benchmark note #{index} must be an object" + raise TypeError(msg) + if not (version := _string(raw.get("version")).strip()): + msg = f"Benchmark note #{index} is missing version" + raise ValueError(msg) + if not (summary := _string(raw.get("summary")).strip()): + msg = f"Benchmark note #{index} is missing summary" + raise ValueError(msg) + return BenchmarkNote( + version=version, + summary=summary, + details=_string(raw.get("details")).strip(), + input_type=_string(raw.get("input_type")).strip(), + case=_string(raw.get("case")).strip(), + ) + + +def load_benchmark_notes(path: Path | None = NOTES_PATH) -> tuple[BenchmarkNote, ...]: + """Load optional human-authored release benchmark notes.""" + if path is None or not path.exists(): + return () + payload = json.loads(path.read_text(encoding="utf-8")) + if not isinstance(payload, dict): + msg = f"Benchmark notes in {path} must be a JSON object" + raise TypeError(msg) + raw_notes = payload.get("notes", []) + if not isinstance(raw_notes, list): + msg = f"Benchmark notes in {path} must contain a notes list" + raise TypeError(msg) + return tuple(_note_from_raw(raw, index=index) for index, raw in enumerate(raw_notes, start=1)) + + +def load_benchmark_data(path: Path = DATA_PATH, *, notes_path: Path | None = NOTES_PATH) -> BenchmarkData: + """Load release benchmark JSON data.""" + payload = json.loads(path.read_text(encoding="utf-8")) + if not isinstance(payload, dict): + msg = f"Benchmark data in {path} must be a JSON object" + raise TypeError(msg) + raw_entries = payload.get("entries", []) + if not isinstance(raw_entries, list): + msg = f"Benchmark data in {path} must contain an entries list" + raise TypeError(msg) + metadata = payload.get("metadata", {}) + if not isinstance(metadata, dict): + metadata = {} + return BenchmarkData( + schema_version=_integer(payload.get("schema_version"), default=1), + metadata=metadata, + entries=tuple(_entry_from_raw(raw, index=index) for index, raw in enumerate(raw_entries, start=1)), + notes=load_benchmark_notes(notes_path), + ) + + +def _version_sort_key(version: str) -> tuple[int, int, int, int, int, str]: + normalized = version.strip().removeprefix("v") + if normalized == MAIN_VERSION: + return 1, 0, 0, 0, 0, normalized + + numbers: list[int] = [] + suffix_parts: list[str] = [] + for token in re.split(r"[.\-+_]", normalized): + if token.isdecimal(): + numbers.append(int(token)) + elif token: + suffix_parts.append(token) + numbers.extend([0] * 4) + return 0, numbers[0], numbers[1], numbers[2], numbers[3], ".".join(suffix_parts) + + +def _sorted_entries(entries: tuple[BenchmarkEntry, ...]) -> list[BenchmarkEntry]: + return sorted( + entries, + key=lambda entry: ( + _version_sort_key(entry.version), + entry.input_type, + entry.case, + entry.formatter, + ), + ) + + +def _formatter_sort_key(formatter: str) -> tuple[int, str]: + if formatter in FORMATTER_ORDER: + return FORMATTER_ORDER.index(formatter), formatter + return len(FORMATTER_ORDER), formatter + + +def _case_sort_key(case: str) -> tuple[int, str]: + if case in CASE_ORDER: + return CASE_ORDER.index(case), case + return len(CASE_ORDER), case + + +def _scenario_sort_key(entry: BenchmarkEntry) -> tuple[str, str]: + return entry.input_type, entry.case + + +def _scenario_label(input_type: str, case: str) -> str: + return f"{case.title()} / {_input_label(input_type)}" + + +def _input_label(input_type: str) -> str: + label = input_type + match input_type: + case "openapi": + label = "OpenAPI" + case "jsonschema": + label = "JSON Schema" + case _: + pass + return label + + +def _formatter_label(formatter: str) -> str: + label = formatter + match formatter: + case "default": + label = "black/isort(Default)" + case "builtin": + label = "Built-in" + case "ruff": + label = "Ruff" + case _: + pass + return label + + +def _status_label(entry: BenchmarkEntry) -> str: + prefix = entry.status or "Unknown" + match entry.status: + case "ok": + prefix = "OK" + case "unsupported": + prefix = "Unsupported" + case "failed": + prefix = "Failed" + case _: + pass + if entry.status == STATUS_OK: + return prefix + if not entry.error: + return prefix + note = summarize_benchmark_error(status=entry.status, formatter=entry.formatter, error=entry.error) + return f"{prefix}: {note}" + + +def _format_ms(value: float | None) -> str: + if value is None: + return EMPTY_CELL + formatted = f"{value:.2f}ms" + match value: + case value if value >= MILLISECONDS_PER_SECOND: + formatted = f"{value / MILLISECONDS_PER_SECOND:.2f}s" + case value if value >= WHOLE_MS_THRESHOLD: + formatted = f"{value:.0f}ms" + case value if value >= TENTH_MS_THRESHOLD: + formatted = f"{value:.1f}ms" + case _: + pass + return formatted + + +def _latest_version(entries: tuple[BenchmarkEntry, ...]) -> str: + versions = sorted({entry.version for entry in entries}, key=_version_sort_key) + return versions[-1] if versions else "" + + +def _release_dates(data: BenchmarkData) -> dict[str, str]: + if not isinstance(raw_dates := data.metadata.get("release_dates"), dict): + return {} + return { + version: uploaded_at + for version, uploaded_at in raw_dates.items() + if isinstance(version, str) and isinstance(uploaded_at, str) + } + + +def _parse_utc_datetime(value: str) -> datetime | None: + try: + return datetime.fromisoformat(value.replace("Z", "+00:00")).astimezone(timezone.utc) + except ValueError: + return None + + +def _release_date_cell(release_dates: dict[str, str], version: str) -> str: + if not (uploaded_at := release_dates.get(version, "")): + return EMPTY_CELL + if parsed := _parse_utc_datetime(uploaded_at): + return parsed.strftime("%Y-%m-%d %H:%M UTC") + return uploaded_at + + +def _entries_by_scenario_and_formatter( + entries: tuple[BenchmarkEntry, ...], +) -> dict[tuple[str, str], dict[str, BenchmarkEntry]]: + grouped: dict[tuple[str, str], dict[str, BenchmarkEntry]] = {} + for entry in _sorted_entries(entries): + grouped.setdefault((entry.input_type, entry.case), {})[entry.formatter] = entry + return grouped + + +def _cases(entries: tuple[BenchmarkEntry, ...]) -> list[str]: + return sorted({entry.case for entry in entries}, key=_case_sort_key) + + +def _ratio_label(ratio: float) -> str: + if abs(ratio - 1) <= SAME_SPEED_TOLERANCE: + return "same speed" + if ratio > 1: + return f"{ratio:.2f}x faster" + return f"{1 / ratio:.2f}x slower" + + +def _speed_label(entry: BenchmarkEntry, baseline: BenchmarkEntry | None) -> str: + if ( + baseline is None + or baseline.median_ms is None + or entry.median_ms is None + or baseline.median_ms <= 0 + or entry.median_ms <= 0 + ): + return "" + return _ratio_label(baseline.median_ms / entry.median_ms) + + +def _relative_speed_cell(entry: BenchmarkEntry, baseline: BenchmarkEntry | None) -> str: + if entry.status != STATUS_OK: + return EMPTY_CELL + if entry.formatter == "default": + return "baseline" + return _speed_label(entry, baseline) or EMPTY_CELL + + +def _range_cell(entry: BenchmarkEntry) -> str: + if entry.status != STATUS_OK: + return EMPTY_CELL + return f"{_format_ms(entry.min_ms)}-{_format_ms(entry.max_ms)}" + + +def _markdown_cell(value: object) -> str: + text = str(value).replace("\n", "
") + return text.replace("|", "\\|") + + +def _note_applies(note: BenchmarkNote, *, input_type: str, case: str) -> bool: + if note.input_type and note.input_type != input_type: + return False + return not note.case or note.case == case + + +def _notes_by_version( + notes: tuple[BenchmarkNote, ...], + *, + input_type: str, + case: str, +) -> dict[str, tuple[BenchmarkNote, ...]]: + notes_by_version: dict[str, list[BenchmarkNote]] = {} + for note in notes: + if _note_applies(note, input_type=input_type, case=case): + notes_by_version.setdefault(note.version, []).append(note) + return {version: tuple(version_notes) for version, version_notes in notes_by_version.items()} + + +def _visible_notes(data: BenchmarkData) -> tuple[BenchmarkNote, ...]: + notes = tuple( + note + for note in data.notes + if any( + entry.version == note.version and _note_applies(note, input_type=entry.input_type, case=entry.case) + for entry in data.entries + ) + ) + return tuple(sorted(notes, key=lambda note: (*_version_sort_key(note.version), note.input_type, note.case))) + + +def _version_cell(version: str, notes_by_version: dict[str, tuple[BenchmarkNote, ...]]) -> str: + if notes := notes_by_version.get(version): + title = html.escape(" ".join(note.summary for note in notes), quote=True) + label = html.escape(version) + return f'{label} *' + return version + + +def _render_case_results_table(entries: tuple[BenchmarkEntry, ...], *, case: str, include_version: bool) -> str: + headers = ( + ("Version", "Input", "Formatter", "Median", "vs black/isort(Default)", "Status") + if include_version + else ("Input", "Formatter", "Median", "vs black/isort(Default)", "Range", "Status") + ) + lines = [ + "| " + " | ".join(headers) + " |", + "| " + " | ".join("---" for _header in headers) + " |", + ] + case_entries = tuple(entry for entry in entries if entry.case == case) + for version in sorted({entry.version for entry in case_entries}, key=_version_sort_key): + version_entries = tuple(entry for entry in case_entries if entry.version == version) + for (input_type, _case), formatter_entries in _entries_by_scenario_and_formatter(version_entries).items(): + baseline = formatter_entries.get("default") + for formatter in sorted(formatter_entries, key=_formatter_sort_key): + entry = formatter_entries[formatter] + values = [ + _input_label(input_type), + _formatter_label(entry.formatter), + _format_ms(entry.median_ms), + _relative_speed_cell(entry, baseline), + _status_label(entry), + ] + if include_version: + values.insert(0, version) + else: + values.insert(4, _range_cell(entry)) + lines.append("| " + " | ".join(_markdown_cell(value) for value in values) + " |") + return "\n".join(lines) + + +def _indent_block(text: str) -> str: + return "\n".join(f" {line}" if line else "" for line in text.splitlines()) + + +def _render_case_tabs(entries: tuple[BenchmarkEntry, ...], *, include_version: bool) -> str: + blocks: list[str] = [] + for case in _cases(entries): + blocks.extend(( + f'=== "{case.title()}"', + "", + _indent_block(_render_case_results_table(entries, case=case, include_version=include_version)), + "", + )) + return "\n".join(blocks).rstrip() + + +def _scenarios(entries: tuple[BenchmarkEntry, ...]) -> list[tuple[str, str]]: + return sorted( + {(entry.input_type, entry.case) for entry in entries}, + key=lambda scenario: (_case_sort_key(scenario[1]), scenario[0]), + ) + + +def _render_chart_tabs(entries: tuple[BenchmarkEntry, ...]) -> str: + blocks: list[str] = [] + for input_type, case in _scenarios(entries): + label = _scenario_label(input_type, case) + blocks.extend(( + f'=== "{label}"', + "", + _indent_block( + "\n".join(( + ( + f'' + ), + ' ', + ' ', + ' Loading benchmark chart...', + ' ', + " ", + "", + )) + ), + "", + )) + return "\n".join(blocks).rstrip() + + +def _formatter_history_cell(entry: BenchmarkEntry | None, baseline: BenchmarkEntry | None) -> str: + if entry is None: + return EMPTY_CELL + if entry.status != STATUS_OK: + return _status_label(entry) + if entry.formatter == "default": + return _format_ms(entry.median_ms) + if speed := _speed_label(entry, baseline): + return f"{_format_ms(entry.median_ms)} ({speed})" + return _format_ms(entry.median_ms) + + +def _render_scenario_history_table( + entries: tuple[BenchmarkEntry, ...], + *, + input_type: str, + case: str, + release_dates: dict[str, str], + notes_by_version: dict[str, tuple[BenchmarkNote, ...]] | None = None, +) -> str: + notes_by_version = notes_by_version or {} + headers = ("Version", "Released", *(_formatter_label(formatter) for formatter in FORMATTER_ORDER)) + lines = [ + "| " + " | ".join(headers) + " |", + "| " + " | ".join("---" for _header in headers) + " |", + ] + scenario_entries = tuple(entry for entry in entries if entry.input_type == input_type and entry.case == case) + for version in sorted({entry.version for entry in scenario_entries}, key=_version_sort_key, reverse=True): + formatter_entries = {entry.formatter: entry for entry in scenario_entries if entry.version == version} + if not any(entry.status == STATUS_OK for entry in formatter_entries.values()): + continue + baseline = formatter_entries.get("default") + values = [ + _version_cell(version, notes_by_version), + _release_date_cell(release_dates, version), + *(_formatter_history_cell(formatter_entries.get(formatter), baseline) for formatter in FORMATTER_ORDER), + ] + lines.append("| " + " | ".join(_markdown_cell(value) for value in values) + " |") + return "\n".join(lines) + + +def _render_scenario_history_tabs( + entries: tuple[BenchmarkEntry, ...], + *, + release_dates: dict[str, str], + notes: tuple[BenchmarkNote, ...] = (), +) -> str: + blocks: list[str] = [] + for input_type, case in _scenarios(entries): + blocks.extend(( + f'=== "{_scenario_label(input_type, case)}"', + "", + _indent_block( + _render_scenario_history_table( + entries, + input_type=input_type, + case=case, + release_dates=release_dates, + notes_by_version=_notes_by_version(notes, input_type=input_type, case=case), + ) + ), + "", + )) + return "\n".join(blocks).rstrip() + + +def _note_scope_label(note: BenchmarkNote) -> str: + input_type = note.input_type + case_name = note.case + if not input_type and not case_name: + return "" + if input_type and not case_name: + return _input_label(input_type) + if not input_type: + return case_name.title() + return _scenario_label(input_type, case_name) + + +def _render_benchmark_notes(data: BenchmarkData) -> str: + notes = _visible_notes(data) + if not notes: + return "" + lines = [ + "## Benchmark Notes", + "", + "Version markers in the charts and historical tables point to these benchmark interpretation notes.", + "", + ] + for note in notes: + body = note.summary + if note.details: + body = f"{body} {note.details}" + scope = f" ({scope_label})" if (scope_label := _note_scope_label(note)) else "" + lines.append(f"- `{note.version}`{scope}: {_markdown_cell(body)}") + return "\n".join(lines) + + +def _metadata_value(data: BenchmarkData, key: str) -> str: + return _string(data.metadata.get(key)).strip() or EMPTY_CELL + + +def _metadata_int(data: BenchmarkData, key: str) -> int | None: + value = _metadata_value(data, key) + return int(value) if value.isdecimal() else None + + +def _format_count(value: int | None) -> str: + if value is None: + return EMPTY_CELL + return f"{value:,}" + + +def _python_versions(data: BenchmarkData) -> list[str]: + versions = sorted({entry.python_version for entry in data.entries if entry.python_version}) + if versions: + return versions + if metadata_version := _metadata_value(data, "python_version"): + return [] if metadata_version == EMPTY_CELL else [metadata_version] + return [] + + +def _python_versions_label(data: BenchmarkData) -> str: + if versions := _python_versions(data): + return ", ".join(f"`{version}`" for version in versions) + return EMPTY_CELL + + +def _compatibility_backfill_note(data: BenchmarkData) -> str: + note = _metadata_value(data, "compatibility_backfill") + if note == EMPTY_CELL: + return "" + return note + + +def _selected_version_count(data: BenchmarkData) -> int: + selected_versions = _metadata_value(data, "selected_versions") + if selected_versions == EMPTY_CELL: + return len({entry.version for entry in data.entries}) + return len([version for version in selected_versions.split(",") if version]) + + +def _collection_metadata_lines(data: BenchmarkData) -> list[str]: + return [ + "## Collection Policy", + "", + "- The benchmark workflow runs on `ubuntu-24.04`.", + ( + "- Benchmark results are collected on GitHub Actions CI runners, so median timings can vary slightly " + "with runner load and workflow timing; rerun benchmarks before treating small differences as regressions." + ), + "- The Python version is the workflow input, defaulting to the latest configured CI Python.", + "- Release packages are installed from PyPI in isolated virtual environments.", + "- The `main` snapshot is installed from the GitHub repository when it is explicitly selected.", + "- Input coverage currently focuses on OpenAPI and JSON Schema.", + "- Historical backfills are produced by the `Release Benchmarks` workflow and committed after review.", + "", + "## Latest Dataset", + "", + f"- Schema version: `{data.schema_version}`", + f"- Generated at: `{_metadata_value(data, 'generated_at')}`", + f"- Source workflow: `{_metadata_value(data, 'workflow')}`", + f"- Primary Python version: `{_metadata_value(data, 'python_version')}`", + f"- Entry Python versions: {_python_versions_label(data)}", + f"- Benchmark runs per case: `{_metadata_value(data, 'runs_per_case')}`", + f"- Version selection: `{_metadata_value(data, 'selection_strategy')}`", + f"- Selected versions: `{_selected_version_count(data)}`", + f"- Download source: `{_metadata_value(data, 'download_source')}`", + f"- Download window: `{_metadata_value(data, 'download_window_days')}` days", + f"- Downloads in window: `{_format_count(_metadata_int(data, 'download_window_total'))}`", + f"- PyPIStats last month: `{_format_count(_metadata_int(data, 'pypistats_last_month'))}`", + "", + ] + + +def render_release_benchmark_markdown(data: BenchmarkData) -> str: + """Render the release benchmark documentation page.""" + lines = [ + "# Performance Benchmarks", + "", + "", + "", + ( + "This page tracks datamodel-code-generator release and main-branch benchmark results collected on " + "GitHub Actions. The data covers only datamodel-code-generator and uses Ubuntu runners so " + "release-to-release changes can be compared without mixing in third-party generator results. " + "Automatic backfills select versions from PyPI download-by-version data when that public dataset is " + "available." + ), + "", + ( + "datamodel-code-generator supports many schema styles and production use cases, so it includes a broad " + "set of useful options. As releases add more capabilities, these benchmarks help keep the implementation " + "measured, managed, and tuned so code generation stays fast in everyday use." + ), + "", + ] + + if not data.entries: + lines.extend([ + "## Historical Trends", + "", + "No release benchmark data has been committed yet.", + "", + ( + "After this workflow is available on `main`, run it with `workflow_dispatch` and commit the generated " + "`docs/data/release-benchmarks.json` and Markdown artifact." + ), + "", + *_collection_metadata_lines(data), + ]) + return "\n".join(lines) + + latest_version = _latest_version(data.entries) + latest_entries = tuple(entry for entry in data.entries if entry.version == latest_version) + lines.extend([ + "## Historical Trends", + "", + ( + "Each chart plots median generation time by release version for one benchmark scenario. " + "Each line is a formatter pipeline; missing or unsupported formatter results are skipped. " + "Marked versions have benchmark notes below." + ), + "", + ]) + if backfill_note := _compatibility_backfill_note(data): + lines.extend([ + f"Compatibility backfill: {backfill_note}", + "", + ]) + lines.extend([ + _render_chart_tabs(data.entries), + "", + ]) + if notes_block := _render_benchmark_notes(data): + lines.extend([ + notes_block, + "", + ]) + lines.extend([ + *_collection_metadata_lines(data), + "## Latest Release Summary", + "", + ( + "Results below are medians. Built-in and Ruff ratios are relative to the black/isort(Default) formatter " + "for the same scenario." + ), + "", + f"### {latest_version}", + "", + _render_case_tabs(latest_entries, include_version=False), + "", + "## Historical Results", + "", + ( + "Rows are release versions, newest first, with `main` shown before releases when present. Released is " + "the PyPI upload timestamp in UTC; branch refs such as `main` show `-`. Formatter cells show median " + "generation time; non-default cells include the speed relative to black/isort(Default) when both " + "results are available. Rows without any successful formatter result are omitted. Version cells marked " + "with `*` have benchmark notes above." + ), + "", + _render_scenario_history_tabs(data.entries, release_dates=_release_dates(data), notes=_visible_notes(data)), + "", + ]) + return "\n".join(lines) + + +def _generated_docs(data_path: Path, docs_path: Path, notes_path: Path | None) -> tuple[GeneratedDoc, ...]: + data = load_benchmark_data(data_path, notes_path=notes_path) + return (GeneratedDoc(docs_path, render_release_benchmark_markdown(data).rstrip() + "\n"),) + + +def _doc_is_current(doc: GeneratedDoc) -> bool: + return doc.path.exists() and doc.path.read_text(encoding="utf-8") == doc.content + + +def build_docs( + *, + check: bool, + data_path: Path = DATA_PATH, + notes_path: Path | None = NOTES_PATH, + docs_path: Path = DOCS_PATH, +) -> int: + """Generate or check release benchmark documentation outputs.""" + docs = _generated_docs(data_path, docs_path, notes_path) + if check: + if not (out_of_date := tuple(doc.path for doc in docs if not _doc_is_current(doc))): + print("Release benchmark docs are up to date.") + return 0 + for path in out_of_date: + print(f"Release benchmark docs are out of date: {path.relative_to(ROOT)}", file=sys.stderr) + print("Run 'python scripts/build_release_benchmark_docs.py' to update.", file=sys.stderr) + return 1 + + for doc in docs: + doc.path.parent.mkdir(parents=True, exist_ok=True) + doc.path.write_text(doc.content, encoding="utf-8") + return 0 + + +def parse_args() -> argparse.Namespace: + """Parse command-line arguments.""" + parser = argparse.ArgumentParser(description="Build release benchmark documentation") + parser.add_argument("--check", action="store_true", help="Check whether generated benchmark docs are up to date") + parser.add_argument("--data", type=Path, default=DATA_PATH, help="Benchmark JSON data path") + parser.add_argument("--notes", type=Path, default=NOTES_PATH, help="Benchmark notes JSON data path") + parser.add_argument("--docs", type=Path, default=DOCS_PATH, help="Markdown output path") + return parser.parse_args() + + +def main() -> int: + """Script entrypoint.""" + args = parse_args() + return build_docs(check=args.check, data_path=args.data, notes_path=args.notes, docs_path=args.docs) + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/scripts/collect_release_benchmarks.py b/scripts/collect_release_benchmarks.py new file mode 100644 index 000000000..a1ef5e773 --- /dev/null +++ b/scripts/collect_release_benchmarks.py @@ -0,0 +1,451 @@ +"""Collect datamodel-code-generator release benchmarks in isolated environments. + +This script is intended for GitHub Actions. It installs released PyPI packages +or the main branch in temporary virtual environments, runs CLI generation +commands, and writes a JSON artifact consumed by scripts/build_release_benchmark_docs.py. +""" + +from __future__ import annotations + +import argparse +import json +import os +import platform +import re +import shlex +import shutil +import statistics +import subprocess +import sys +import tempfile +import time +import venv +from dataclasses import asdict, dataclass +from datetime import datetime, timezone +from pathlib import Path + +try: + from scripts.release_benchmark_errors import compact_benchmark_error +except ModuleNotFoundError: # pragma: no cover - direct script execution + from release_benchmark_errors import compact_benchmark_error + +ROOT = Path(__file__).resolve().parents[1] +GITHUB_PACKAGE_URL = "git+https://github.com/koxudaxi/datamodel-code-generator.git" +DEFAULT_OUTPUT = ROOT / ".benchmarks" / "release-benchmarks.json" +DEFAULT_RUNS = 7 +DEFAULT_WARMUPS = 1 +DEFAULT_TIMEOUT_SECONDS = 300 +DEFAULT_INSTALL_RETRIES = 3 +INSTALL_RETRY_BASE_SECONDS = 12 +MAX_ERROR_LENGTH = 1800 +TIMEOUT_EXIT_CODE = 124 +STATUS_OK = "ok" +STATUS_FAILED = "failed" +STATUS_UNSUPPORTED = "unsupported" + + +@dataclass(frozen=True, slots=True) +class BenchmarkCase: + """A CLI benchmark input case.""" + + name: str + input_type: str + path: Path + + +@dataclass(frozen=True, slots=True) +class BenchmarkResult: + """A serializable benchmark result row.""" + + version: str + python_version: str + os: str + input_type: str + case: str + formatter: str + runs: int + median_ms: float | None + min_ms: float | None + max_ms: float | None + stdev_ms: float | None + status: str + command: str + error: str + + +@dataclass(frozen=True, slots=True) +class BenchmarkConfig: + """Benchmark execution settings.""" + + runs: int + warmups: int + timeout: int + install_retries: int + + +@dataclass(frozen=True, slots=True) +class BenchmarkContext: + """State shared by case benchmarks for one release.""" + + version: str + python_path: Path + work_dir: Path + config: BenchmarkConfig + + +BENCHMARK_CASES = ( + BenchmarkCase("small", "jsonschema", ROOT / "tests" / "data" / "jsonschema" / "person.json"), + BenchmarkCase("large", "jsonschema", ROOT / "tests" / "data" / "performance" / "large_models.json"), + BenchmarkCase("small", "openapi", ROOT / "tests" / "data" / "openapi" / "api.yaml"), + BenchmarkCase("large", "openapi", ROOT / "tests" / "data" / "performance" / "openapi_large.yaml"), +) +DEFAULT_FORMATTERS = ("default", "builtin", "ruff") + + +def _split_csv_words(raw: str) -> tuple[str, ...]: + return tuple(dict.fromkeys(token for part in raw.splitlines() for token in re.split(r"[\s,]+", part) if token)) + + +def _normalize_version(version: str) -> str: + return version.strip().removeprefix("v") + + +def _venv_python(venv_path: Path) -> Path: + if platform.system() == "Windows": + return venv_path / "Scripts" / "python.exe" + return venv_path / "bin" / "python" + + +def _run_subprocess(command: list[str], *, timeout: int, cwd: Path = ROOT) -> subprocess.CompletedProcess[str]: + try: + return subprocess.run( + command, + cwd=cwd, + check=False, + capture_output=True, + text=True, + timeout=timeout, + ) + except subprocess.TimeoutExpired as exc: + stderr = _process_output(exc.stderr) + message = f"Timed out after {timeout}s" + return subprocess.CompletedProcess( + command, + TIMEOUT_EXIT_CODE, + stdout=_process_output(exc.stdout), + stderr=f"{message}: {stderr}" if stderr else message, + ) + + +def _process_output(value: str | bytes | None) -> str: + if value is None: + return "" + if isinstance(value, bytes): + return value.decode(errors="replace") + return value + + +def _truncate_error(text: str) -> str: + compact = compact_benchmark_error(text) + if len(compact) <= MAX_ERROR_LENGTH: + return compact + return f"{compact[: MAX_ERROR_LENGTH - 3]}..." + + +def _install_spec(version: str) -> str: + if (normalized := _normalize_version(version)) == "main": + return f"datamodel-code-generator[ruff] @ {GITHUB_PACKAGE_URL}@main" + return f"datamodel-code-generator[ruff]=={normalized}" + + +def _install_command(python_path: Path, version: str) -> list[str]: + spec = _install_spec(version) + if uv_path := shutil.which("uv"): + return [uv_path, "pip", "install", "--python", str(python_path), spec] + return [str(python_path), "-m", "pip", "install", spec] + + +def _runner_os() -> str: + return os.environ.get("OS") or os.environ.get("RUNNER_OS") or platform.platform() + + +def _create_venv(path: Path) -> Path: + venv.EnvBuilder(with_pip=True, clear=True).create(path) + return _venv_python(path) + + +def _install_release(python_path: Path, version: str, *, timeout: int, retries: int) -> str: + command = _install_command(python_path, version) + last_error = "" + for attempt in range(retries): + result = _run_subprocess(command, timeout=timeout) + if result.returncode == 0: + return "" + last_error = _truncate_error(result.stderr or result.stdout) + if attempt + 1 < retries: + time.sleep(INSTALL_RETRY_BASE_SECONDS * (attempt + 1)) + return last_error + + +def _formatter_args(formatter: str) -> tuple[str, ...]: + if formatter == "default": + return () + if formatter == "builtin": + return ("--formatters", "builtin") + if formatter == "ruff": + return ("--formatters", "ruff-check", "ruff-format") + msg = f"Unsupported formatter benchmark target: {formatter}" + raise ValueError(msg) + + +def _command_args(python_path: Path, case: BenchmarkCase, formatter: str, output_path: Path) -> list[str]: + return [ + str(python_path), + "-m", + "datamodel_code_generator", + "--input", + str(case.path), + "--input-file-type", + case.input_type, + "--output-model-type", + "pydantic_v2.BaseModel", + "--output", + str(output_path), + *_formatter_args(formatter), + ] + + +def _display_command(case: BenchmarkCase, formatter: str) -> str: + return shlex.join([ + "python", + "-m", + "datamodel_code_generator", + "--input", + str(case.path.relative_to(ROOT)), + "--input-file-type", + case.input_type, + "--output-model-type", + "pydantic_v2.BaseModel", + "--output", + "model.py", + *_formatter_args(formatter), + ]) + + +def _failure_status(formatter: str, output: str) -> str: + lower = output.lower() + if formatter == "builtin" and ("invalid choice" in lower or "unrecognized arguments" in lower): + return STATUS_UNSUPPORTED + if formatter == "ruff" and ( + "ruff" in lower and ("not found" in lower or "invalid choice" in lower or "unrecognized arguments" in lower) + ): + return STATUS_UNSUPPORTED + return STATUS_FAILED + + +def _failed_result(version: str, case: BenchmarkCase, formatter: str, *, status: str, error: str) -> BenchmarkResult: + return BenchmarkResult( + version=version, + python_version=platform.python_version(), + os=_runner_os(), + input_type=case.input_type, + case=case.name, + formatter=formatter, + runs=0, + median_ms=None, + min_ms=None, + max_ms=None, + stdev_ms=None, + status=status, + command=_display_command(case, formatter), + error=error, + ) + + +def _successful_result( + version: str, + case: BenchmarkCase, + formatter: str, + samples_ms: list[float], +) -> BenchmarkResult: + return BenchmarkResult( + version=version, + python_version=platform.python_version(), + os=_runner_os(), + input_type=case.input_type, + case=case.name, + formatter=formatter, + runs=len(samples_ms), + median_ms=round(statistics.median(samples_ms), 3), + min_ms=round(min(samples_ms), 3), + max_ms=round(max(samples_ms), 3), + stdev_ms=round(statistics.stdev(samples_ms), 3) if len(samples_ms) > 1 else 0.0, + status=STATUS_OK, + command=_display_command(case, formatter), + error="", + ) + + +def _benchmark_case(context: BenchmarkContext, case: BenchmarkCase, formatter: str) -> BenchmarkResult: + samples_ms: list[float] = [] + for index in range(context.config.runs + context.config.warmups): + output_path = context.work_dir / f"{case.input_type}-{case.name}-{formatter}-{index}.py" + command = _command_args(context.python_path, case, formatter, output_path) + started_at = time.perf_counter() + result = _run_subprocess(command, timeout=context.config.timeout) + elapsed_ms = (time.perf_counter() - started_at) * 1000 + if result.returncode != 0: + error = _truncate_error(result.stderr or result.stdout) + return _failed_result( + context.version, + case, + formatter, + status=_failure_status(formatter, error), + error=error, + ) + if index >= context.config.warmups: + samples_ms.append(elapsed_ms) + return _successful_result(context.version, case, formatter, samples_ms) + + +def _benchmark_install_failure(version: str, formatters: tuple[str, ...], error: str) -> list[BenchmarkResult]: + return [ + _failed_result(version, case, formatter, status=STATUS_FAILED, error=error) + for case in BENCHMARK_CASES + for formatter in formatters + ] + + +def benchmark_version( + version: str, + *, + formatters: tuple[str, ...], + config: BenchmarkConfig, +) -> list[BenchmarkResult]: + """Benchmark one released datamodel-code-generator version.""" + with tempfile.TemporaryDirectory(prefix="datamodel-code-generator-release-bench-") as tmp: + tmp_path = Path(tmp) + venv_python = _create_venv(tmp_path / "venv") + if error := _install_release( + venv_python, + version, + timeout=config.timeout, + retries=config.install_retries, + ): + return _benchmark_install_failure(version, formatters, error) + work_dir = tmp_path / "outputs" + work_dir.mkdir() + context = BenchmarkContext(version=version, python_path=venv_python, work_dir=work_dir, config=config) + return [_benchmark_case(context, case, formatter) for case in BENCHMARK_CASES for formatter in formatters] + + +def _result_payload(result: BenchmarkResult | dict[str, object]) -> dict[str, object]: + if isinstance(result, BenchmarkResult): + return asdict(result) + return result + + +def _payload(results: list[BenchmarkResult] | list[dict[str, object]], *, runs: int, warmups: int) -> dict[str, object]: + return { + "schema_version": 1, + "metadata": { + "generated_at": datetime.now(timezone.utc).isoformat(timespec="seconds").replace("+00:00", "Z"), + "workflow": os.environ.get("GITHUB_WORKFLOW", "local"), + "workflow_run_id": os.environ.get("GITHUB_RUN_ID", ""), + "collector_sha": os.environ.get("GITHUB_SHA", ""), + "os": _runner_os(), + "python_version": platform.python_version(), + "runs_per_case": str(runs), + "warmups_per_case": str(warmups), + }, + "entries": [_result_payload(result) for result in results], + } + + +def parse_args() -> argparse.Namespace: + """Parse command-line arguments.""" + parser = argparse.ArgumentParser(description="Collect datamodel-code-generator release benchmarks") + parser.add_argument( + "--versions", + required=True, + help="Comma, whitespace, or newline separated release versions/tags or main", + ) + parser.add_argument("--output", type=Path, default=DEFAULT_OUTPUT, help="JSON artifact output path") + parser.add_argument("--runs", type=int, default=DEFAULT_RUNS, help="Measured runs per case") + parser.add_argument("--warmups", type=int, default=DEFAULT_WARMUPS, help="Warmup runs per case") + parser.add_argument("--timeout", type=int, default=DEFAULT_TIMEOUT_SECONDS, help="Subprocess timeout in seconds") + parser.add_argument("--install-retries", type=int, default=DEFAULT_INSTALL_RETRIES, help="PyPI install retry count") + parser.add_argument( + "--formatters", + default=",".join(DEFAULT_FORMATTERS), + help="Comma, whitespace, or newline separated formatter benchmark targets", + ) + return parser.parse_args() + + +def _positive_int_error(name: str, value: int) -> str: + if value > 0: + return "" + return f"{name} must be greater than 0, got {value}" + + +def _non_negative_int_error(name: str, value: int) -> str: + if value >= 0: + return "" + return f"{name} must be greater than or equal to 0, got {value}" + + +def _validate_args(args: argparse.Namespace) -> str: + errors = [ + error + for error in ( + _positive_int_error("--runs", args.runs), + _non_negative_int_error("--warmups", args.warmups), + _positive_int_error("--timeout", args.timeout), + _positive_int_error("--install-retries", args.install_retries), + ) + if error + ] + if not errors: + return "" + return "\n".join(errors) + + +def main() -> int: + """Script entrypoint.""" + args = parse_args() + if error := _validate_args(args): + print(error, file=sys.stderr) + return 2 + if not (versions := tuple(_normalize_version(version) for version in _split_csv_words(args.versions))): + print("No release versions provided", file=sys.stderr) + return 2 + if not (formatters := _split_csv_words(args.formatters)): + print("No formatter targets provided", file=sys.stderr) + return 2 + + results: list[BenchmarkResult] = [] + config = BenchmarkConfig( + runs=args.runs, + warmups=args.warmups, + timeout=args.timeout, + install_retries=args.install_retries, + ) + for version in versions: + print(f"Benchmarking datamodel-code-generator {version}", file=sys.stderr) + results.extend( + benchmark_version( + version, + formatters=formatters, + config=config, + ) + ) + + args.output.parent.mkdir(parents=True, exist_ok=True) + args.output.write_text(json.dumps(_payload(results, runs=args.runs, warmups=args.warmups), indent=2) + "\n") + print(f"Wrote {args.output}", file=sys.stderr) + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/scripts/merge_release_benchmarks.py b/scripts/merge_release_benchmarks.py new file mode 100644 index 000000000..3941fda7e --- /dev/null +++ b/scripts/merge_release_benchmarks.py @@ -0,0 +1,182 @@ +"""Merge per-version release benchmark JSON files. + +Usage: + python scripts/merge_release_benchmarks.py .benchmarks/parts/*.json +""" + +from __future__ import annotations + +import argparse +import json +import os +import platform +import sys +from datetime import datetime, timezone +from pathlib import Path +from typing import Any + +try: + from scripts.release_benchmark_errors import compact_benchmark_error +except ModuleNotFoundError: # pragma: no cover - direct script execution + from release_benchmark_errors import compact_benchmark_error + +DEFAULT_OUTPUT = Path(".benchmarks") / "release-benchmarks.json" +DEFAULT_SELECTION = Path(".benchmarks") / "release-benchmark-selection.json" + + +def _load_json(path: Path) -> object: + return json.loads(path.read_text(encoding="utf-8")) + + +def _metadata(payload: object) -> dict[str, Any]: + if isinstance(payload, dict) and isinstance(metadata := payload.get("metadata"), dict): + return metadata + return {} + + +def _entries(payload: object, *, path: Path) -> list[dict[str, object]]: + if not isinstance(payload, dict) or not isinstance(entries := payload.get("entries"), list): + msg = f"Benchmark fragment {path} must contain an entries list" + raise TypeError(msg) + return [_entry_payload(entry) for entry in entries if isinstance(entry, dict)] + + +def _entry_payload(entry: dict[str, object]) -> dict[str, object]: + payload = dict(entry) + if not isinstance(error := payload.get("error"), str): + return payload + payload["error"] = compact_benchmark_error(error) + return payload + + +def _selection_metadata(selection: object) -> dict[str, object]: + if not isinstance(selection, dict): + return {} + download_stats = selection.get("download_stats") + if not isinstance(download_stats, dict): + download_stats = {} + pypistats = download_stats.get("pypistats") + if not isinstance(pypistats, dict): + pypistats = {} + selected_versions = selection.get("selected_versions") + if not isinstance(selected_versions, list): + selected_versions = [] + return { + "selection_strategy": selection.get("strategy", ""), + "selection_window_days": str(selection.get("history_days", "")), + "selected_versions": ",".join(str(version) for version in selected_versions), + "download_source": download_stats.get("source", ""), + "download_window_days": str(download_stats.get("window_days", "")), + "download_versions": str(download_stats.get("versions_with_downloads", "")), + "download_window_total": str(download_stats.get("window_downloads", "")), + "pypistats_source": pypistats.get("source", ""), + "pypistats_last_day": str(pypistats.get("last_day", "")), + "pypistats_last_week": str(pypistats.get("last_week", "")), + "pypistats_last_month": str(pypistats.get("last_month", "")), + "pypistats_timeseries_days": str(pypistats.get("timeseries_days", "")), + "pypistats_timeseries_downloads": str(pypistats.get("timeseries_downloads", "")), + "release_dates": _selection_release_dates(selection), + } + + +def _selection_release_dates(selection: dict[str, object]) -> dict[str, str]: + if not isinstance(releases := selection.get("releases"), list): + return {} + release_dates: dict[str, str] = {} + for release in releases: + if ( + isinstance(release, dict) + and isinstance(version := release.get("version"), str) + and isinstance(uploaded_at := release.get("uploaded_at"), str) + ): + release_dates[version] = uploaded_at + return release_dates + + +def _runner_os() -> str: + return os.environ.get("OS") or os.environ.get("RUNNER_OS") or platform.platform() + + +def _python_version() -> str: + return os.environ.get("BENCHMARK_PYTHON_VERSION") or platform.python_version() + + +def _payload(entries: list[dict[str, object]], *, runs: int, warmups: int) -> dict[str, object]: + return { + "schema_version": 1, + "metadata": { + "generated_at": datetime.now(timezone.utc).isoformat(timespec="seconds").replace("+00:00", "Z"), + "workflow": os.environ.get("GITHUB_WORKFLOW", "local"), + "workflow_run_id": os.environ.get("GITHUB_RUN_ID", ""), + "collector_sha": os.environ.get("GITHUB_SHA", ""), + "os": _runner_os(), + "python_version": _python_version(), + "runs_per_case": str(runs), + "warmups_per_case": str(warmups), + }, + "entries": entries, + } + + +def merge_benchmark_payloads( + fragment_paths: list[Path], + *, + selection_path: Path, + generated_at: str = "", +) -> dict[str, object]: + """Merge benchmark result fragments and selection metadata.""" + entries: list[dict[str, object]] = [] + fragment_metadata: list[dict[str, Any]] = [] + for path in fragment_paths: + payload = _load_json(path) + entries.extend(_entries(payload, path=path)) + fragment_metadata.append(_metadata(payload)) + + selection = _load_json(selection_path) if selection_path.exists() else {} + runs = next((metadata.get("runs_per_case") for metadata in fragment_metadata if metadata.get("runs_per_case")), "0") + warmups = next( + (metadata.get("warmups_per_case") for metadata in fragment_metadata if metadata.get("warmups_per_case")), + "0", + ) + payload = _payload(entries, runs=int(str(runs) or "0"), warmups=int(str(warmups) or "0")) + payload_metadata = payload["metadata"] + if isinstance(payload_metadata, dict): + payload_metadata.update(_selection_metadata(selection)) + if generated_at: + payload_metadata["generated_at"] = generated_at + payload_metadata["workflow"] = os.environ.get("GITHUB_WORKFLOW", payload_metadata.get("workflow", "local")) + payload_metadata["workflow_run_id"] = os.environ.get("GITHUB_RUN_ID", "") + payload_metadata["collector_sha"] = os.environ.get("GITHUB_SHA", "") + payload_metadata["os"] = _runner_os() + payload_metadata["python_version"] = _python_version() + return payload + + +def parse_args() -> argparse.Namespace: + """Parse command-line arguments.""" + parser = argparse.ArgumentParser(description="Merge datamodel-code-generator release benchmark fragments") + parser.add_argument("fragments", nargs="+", type=Path, help="Per-version benchmark JSON fragments") + parser.add_argument( + "--selection", type=Path, default=DEFAULT_SELECTION, help="Release selection metadata JSON path" + ) + parser.add_argument("--output", type=Path, default=DEFAULT_OUTPUT, help="Merged benchmark JSON output path") + parser.add_argument("--generated-at", default="", help="UTC generated_at override for deterministic tests") + return parser.parse_args() + + +def main() -> int: + """Script entrypoint.""" + args = parse_args() + fragments = sorted(args.fragments) + if not fragments: + print("No benchmark fragments provided", file=sys.stderr) + return 2 + payload = merge_benchmark_payloads(fragments, selection_path=args.selection, generated_at=args.generated_at) + args.output.parent.mkdir(parents=True, exist_ok=True) + args.output.write_text(json.dumps(payload, indent=2) + "\n", encoding="utf-8") + print(f"Wrote {args.output}", file=sys.stderr) + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/scripts/release_benchmark_errors.py b/scripts/release_benchmark_errors.py new file mode 100644 index 000000000..eabbee26f --- /dev/null +++ b/scripts/release_benchmark_errors.py @@ -0,0 +1,52 @@ +"""Helpers for public release benchmark error text.""" + +from __future__ import annotations + +import re + +MAX_PUBLIC_ERROR_LENGTH = 96 + +_BENCHMARK_TEMP_PATH_PATTERN = re.compile( + r"(?:[A-Za-z]:)?[\\/][^\s'\",]*" + r"(?:dcg-release-bench|datamodel-code-generator-release-bench)-[^\s'\",]*" + r"|(?:dcg-release-bench|datamodel-code-generator-release-bench)-[^\s'\",]*", +) + + +def sanitize_benchmark_error(error: str) -> str: + """Remove volatile benchmark worker paths from captured error output.""" + if not error: + return "" + return _BENCHMARK_TEMP_PATH_PATTERN.sub("", error) + + +def compact_benchmark_error(error: str) -> str: + """Normalize captured benchmark error output for JSON and docs.""" + return " ".join(sanitize_benchmark_error(error).split()) + + +def summarize_benchmark_error(*, status: str, formatter: str, error: str) -> str: + """Return a short public-facing error explanation.""" + if not (note := compact_benchmark_error(error)): + return "" + + lower = note.lower() + formatter_name = formatter.lower() + summary = note + match status: + case "unsupported" if formatter_name and ( + "formatters" in lower or "unrecognized arguments" in lower or "invalid choice" in lower + ): + summary = "unavailable" + case "failed" if "timed out after" in lower: + summary = "timeout" + case "failed" if "failed to build" in lower or "no matching distribution" in lower: + summary = "install" + case "failed" if "traceback" in lower: + summary = "command" + case _: + pass + + if len(summary) <= MAX_PUBLIC_ERROR_LENGTH: + return summary + return f"{summary[: MAX_PUBLIC_ERROR_LENGTH - 3]}..." diff --git a/scripts/select_release_benchmark_versions.py b/scripts/select_release_benchmark_versions.py new file mode 100644 index 000000000..24760b6f4 --- /dev/null +++ b/scripts/select_release_benchmark_versions.py @@ -0,0 +1,479 @@ +"""Select release versions for datamodel-code-generator release benchmarks. + +Usage: + python scripts/select_release_benchmark_versions.py --output .benchmarks/release-benchmark-selection.json +""" + +from __future__ import annotations + +import argparse +import importlib.util +import json +import os +import re +import ssl +import sys +import urllib.error +import urllib.request +from dataclasses import asdict, dataclass +from datetime import datetime, timedelta, timezone +from pathlib import Path + +if importlib.util.find_spec("certifi"): + import certifi +else: + certifi = None + +PACKAGE_NAME = "datamodel-code-generator" +PYPI_JSON_URL = f"https://pypi.org/pypi/{PACKAGE_NAME}/json" +PYPISTATS_RECENT_URL = f"https://pypistats.org/api/packages/{PACKAGE_NAME}/recent" +PYPISTATS_OVERALL_URL = f"https://pypistats.org/api/packages/{PACKAGE_NAME}/overall?mirrors=false" +CLICKPY_SQL_URL = "https://sql-clickhouse.clickhouse.com/?user=demo&wait_end_of_query=1" +CLICKPY_VERSION_USAGE_QUERY = """ +SELECT + version, + sum(count) AS downloads, + min(date) AS first_seen, + max(date) AS last_seen +FROM pypi.pypi_downloads_per_day_by_version +WHERE project = '{package_name}' + AND date >= today() - INTERVAL {history_days} DAY +GROUP BY version +ORDER BY downloads DESC +LIMIT {limit} +FORMAT JSON +""" +DEFAULT_OUTPUT = Path(".benchmarks") / "release-benchmark-selection.json" +DEFAULT_HISTORY_DAYS = 365 +DEFAULT_LIMIT = 40 +REQUEST_TIMEOUT_SECONDS = 30 +PRE_RELEASE_PATTERN = re.compile(r"(a|b|rc|dev)", re.IGNORECASE) +AGE_BUCKETS = ( + (0, 30), + (31, 90), + (91, 180), + (181, 365), + (366, 10_000), +) + + +@dataclass(frozen=True, slots=True) +class ReleaseVersion: + """PyPI release version and upload timestamp.""" + + version: str + uploaded_at: str + downloads: int = 0 + first_seen: str = "" + last_seen: str = "" + + +@dataclass(frozen=True, slots=True) +class VersionUsage: + """Download usage for one release version.""" + + version: str + downloads: int + first_seen: str + last_seen: str + + +@dataclass(frozen=True, slots=True) +class VersionSelection: + """Resolved benchmark version selection metadata.""" + + schema_version: int + generated_at: str + package: str + strategy: str + history_days: int + limit: int + selected_versions: list[str] + releases: list[ReleaseVersion] + download_stats: dict[str, object] + + +@dataclass(frozen=True, slots=True) +class SelectionConfig: + """Version selection inputs.""" + + pypi_source: str | Path + clickpy_source: str | Path | None + recent_source: str | Path | None + overall_source: str | Path | None + explicit_versions: str + history_days: int + limit: int + now: datetime + + +def _utc_now() -> datetime: + return datetime.now(timezone.utc) + + +def _parse_datetime(value: str) -> datetime: + return datetime.fromisoformat(value.replace("Z", "+00:00")).astimezone(timezone.utc) + + +def _timestamp(value: datetime) -> str: + return value.astimezone(timezone.utc).isoformat(timespec="seconds").replace("+00:00", "Z") + + +def _split_csv_words(raw: str) -> list[str]: + return list(dict.fromkeys(token for part in raw.splitlines() for token in re.split(r"[\s,]+", part) if token)) + + +def _normalize_version(version: str) -> str: + return version.strip().removeprefix("v") + + +def _is_stable_version(version: str) -> bool: + return PRE_RELEASE_PATTERN.search(version) is None + + +def _ssl_context() -> ssl.SSLContext | None: + if certifi is None: + return None + return ssl.create_default_context(cafile=certifi.where()) + + +def _read_json_url(url: str) -> object: + request = urllib.request.Request(url, headers={"User-Agent": f"{PACKAGE_NAME} release benchmark selector"}) + with urllib.request.urlopen(request, timeout=REQUEST_TIMEOUT_SECONDS, context=_ssl_context()) as response: + return json.loads(response.read().decode()) + + +def _read_clickpy_json(history_days: int, limit: int) -> object: + query = CLICKPY_VERSION_USAGE_QUERY.format( + package_name=PACKAGE_NAME, + history_days=history_days, + limit=max(limit * 4, 100), + ) + request = urllib.request.Request( + CLICKPY_SQL_URL, + data=query.encode(), + headers={ + "Content-Type": "text/plain; charset=utf-8", + "User-Agent": f"{PACKAGE_NAME} release benchmark selector", + }, + method="POST", + ) + with urllib.request.urlopen(request, timeout=REQUEST_TIMEOUT_SECONDS, context=_ssl_context()) as response: + return json.loads(response.read().decode()) + + +def _read_json(path_or_url: str | Path | None) -> object: + if path_or_url is None: + msg = "Missing JSON source" + raise ValueError(msg) + source = str(path_or_url) + if source.startswith(("https://", "http://")): + return _read_json_url(source) + return json.loads(Path(source).read_text(encoding="utf-8")) + + +def _release_versions(payload: object) -> list[ReleaseVersion]: + if not isinstance(payload, dict) or not isinstance(releases := payload.get("releases"), dict): + msg = "PyPI JSON must contain a releases object" + raise TypeError(msg) + + versions: list[ReleaseVersion] = [] + for version, files in releases.items(): + if not isinstance(version, str) or not isinstance(files, list) or not _is_stable_version(version): + continue + active_files = [file_info for file_info in files if isinstance(file_info, dict) and not file_info.get("yanked")] + if not active_files: + continue + upload_times = [ + _parse_datetime(uploaded_at) + for file_info in active_files + if isinstance(file_info, dict) and isinstance(uploaded_at := file_info.get("upload_time_iso_8601"), str) + ] + if not upload_times: + continue + versions.append(ReleaseVersion(version=_normalize_version(version), uploaded_at=_timestamp(max(upload_times)))) + return sorted(versions, key=lambda release: _parse_datetime(release.uploaded_at), reverse=True) + + +def _version_usage(payload: object) -> list[VersionUsage]: + if not isinstance(payload, dict) or not isinstance(rows := payload.get("data"), list): + msg = "ClickPy JSON must contain a data list" + raise TypeError(msg) + usage: list[VersionUsage] = [] + for row in rows: + if not isinstance(row, dict) or not isinstance(version := row.get("version"), str): + continue + usage.append( + VersionUsage( + version=_normalize_version(version), + downloads=int(row.get("downloads", 0)), + first_seen=str(row.get("first_seen", "")), + last_seen=str(row.get("last_seen", "")), + ) + ) + return sorted(usage, key=lambda item: item.downloads, reverse=True) + + +def _release_with_usage(release: ReleaseVersion, usage: VersionUsage | None) -> ReleaseVersion: + if usage is None: + return release + return ReleaseVersion( + version=release.version, + uploaded_at=release.uploaded_at, + downloads=usage.downloads, + first_seen=usage.first_seen, + last_seen=usage.last_seen, + ) + + +def _latest_releases(releases: list[ReleaseVersion], count: int = 2) -> list[ReleaseVersion]: + return releases[:count] + + +def _age_bucket_index(release: ReleaseVersion, *, now: datetime) -> int: + age_days = (now - _parse_datetime(release.uploaded_at)).days + for index, (start, end) in enumerate(AGE_BUCKETS): + if start <= age_days <= end: + return index + return len(AGE_BUCKETS) + + +def _append_unique(selected: list[ReleaseVersion], release: ReleaseVersion, *, limit: int) -> None: + if len(selected) >= limit or release.version in {item.version for item in selected}: + return + selected.append(release) + + +def _selected_explicit_releases( + releases_by_version: dict[str, ReleaseVersion], + usage_by_version: dict[str, VersionUsage], + explicit_versions: str, + *, + limit: int, +) -> list[ReleaseVersion]: + return [ + _release_with_usage( + releases_by_version.get(version) or ReleaseVersion(version=version, uploaded_at=""), + usage_by_version.get(version), + ) + for raw_version in _split_csv_words(explicit_versions) + if (version := _normalize_version(raw_version)) + ][:limit] + + +def _selected_usage_releases( + releases: list[ReleaseVersion], + usage: list[VersionUsage], + *, + limit: int, + now: datetime, +) -> list[ReleaseVersion]: + releases_by_version = {release.version: release for release in releases} + usage_by_version = {item.version: item for item in usage} + selected: list[ReleaseVersion] = [] + + for release in _latest_releases(releases): + _append_unique(selected, _release_with_usage(release, usage_by_version.get(release.version)), limit=limit) + + by_bucket: dict[int, list[ReleaseVersion]] = {} + for usage_item in usage: + if release := releases_by_version.get(usage_item.version): + by_bucket.setdefault(_age_bucket_index(release, now=now), []).append( + _release_with_usage(release, usage_item) + ) + for bucket in sorted(by_bucket): + if by_bucket[bucket]: + _append_unique(selected, by_bucket[bucket][0], limit=limit) + + for usage_item in usage: + if release := releases_by_version.get(usage_item.version): + _append_unique(selected, _release_with_usage(release, usage_item), limit=limit) + + for release in releases: + _append_unique(selected, _release_with_usage(release, usage_by_version.get(release.version)), limit=limit) + return selected + + +def _selected_recent_releases( + releases: list[ReleaseVersion], + *, + history_days: int, + limit: int, + now: datetime, +) -> list[ReleaseVersion]: + cutoff = now - timedelta(days=history_days) + selected = [release for release in releases if _parse_datetime(release.uploaded_at) >= cutoff] + return selected[:limit] + + +def _pypistats_recent(payload: object) -> dict[str, object]: + if not isinstance(payload, dict) or not isinstance(data := payload.get("data"), dict): + return {} + return { + "last_day": data.get("last_day", ""), + "last_week": data.get("last_week", ""), + "last_month": data.get("last_month", ""), + } + + +def _pypistats_overall(payload: object) -> dict[str, object]: + if not isinstance(payload, dict) or not isinstance(rows := payload.get("data"), list): + return {} + downloads = [row.get("downloads", 0) for row in rows if isinstance(row, dict)] + return { + "timeseries_days": len(downloads), + "timeseries_downloads": sum(value for value in downloads if isinstance(value, int)), + } + + +def _load_pypistats(recent_source: str | Path | None, overall_source: str | Path | None) -> dict[str, object]: + stats: dict[str, object] = {"source": "pypistats.org"} + try: + stats.update(_pypistats_recent(_read_json(recent_source or PYPISTATS_RECENT_URL))) + stats.update(_pypistats_overall(_read_json(overall_source or PYPISTATS_OVERALL_URL))) + except (OSError, ValueError, TypeError, urllib.error.URLError) as exc: + stats["error"] = str(exc) + return stats + + +def _load_clickpy_usage( + source: str | Path | None, *, history_days: int, limit: int +) -> tuple[list[VersionUsage], dict[str, object]]: + stats: dict[str, object] = {"source": "clickpy", "window_days": str(history_days)} + try: + payload = _read_json(source) if source else _read_clickpy_json(history_days, limit) + usage = _version_usage(payload) + stats.update({ + "versions_with_downloads": str(len(usage)), + "window_downloads": str(sum(item.downloads for item in usage)), + }) + except (OSError, ValueError, TypeError, urllib.error.URLError) as exc: + stats["error"] = str(exc) + return [], stats + else: + return usage, stats + + +def select_versions(config: SelectionConfig) -> VersionSelection: + """Resolve benchmark release versions and package download metadata.""" + releases = _release_versions(_read_json(config.pypi_source)) + usage, clickpy_stats = _load_clickpy_usage( + config.clickpy_source, + history_days=config.history_days, + limit=config.limit, + ) + usage_by_version = {item.version: item for item in usage} + releases_by_version = {release.version: release for release in releases} + if config.explicit_versions: + strategy = "explicit" + selected = _selected_explicit_releases( + releases_by_version, + usage_by_version, + config.explicit_versions, + limit=config.limit, + ) + elif usage: + strategy = "clickpy_downloads" + selected = _selected_usage_releases(releases, usage, limit=config.limit, now=config.now) + else: + strategy = "release_upload_time" + selected = _selected_recent_releases( + releases, + history_days=config.history_days, + limit=config.limit, + now=config.now, + ) + download_stats = { + **clickpy_stats, + "pypistats": _load_pypistats(config.recent_source, config.overall_source), + } + return VersionSelection( + schema_version=1, + generated_at=_timestamp(config.now), + package=PACKAGE_NAME, + strategy=strategy, + history_days=config.history_days, + limit=config.limit, + selected_versions=[release.version for release in selected], + releases=selected, + download_stats=download_stats, + ) + + +def _selection_payload(selection: VersionSelection) -> dict[str, object]: + return asdict(selection) + + +def _write_github_outputs(selection: VersionSelection) -> None: + if not (output_path := os.environ.get("GITHUB_OUTPUT")): + return + with Path(output_path).open("a", encoding="utf-8") as output: + output.write(f"versions_json={json.dumps(selection.selected_versions, separators=(',', ':'))}\n") + output.write(f"versions={','.join(selection.selected_versions)}\n") + + +def _positive_int_error(name: str, value: int) -> str: + if value > 0: + return "" + return f"{name} must be greater than 0, got {value}" + + +def _validate_args(args: argparse.Namespace) -> str: + errors = [ + error + for name, value in (("--history-days", args.history_days), ("--limit", args.limit)) + if (error := _positive_int_error(name, value)) + ] + if not errors: + return "" + return "\n".join(errors) + + +def parse_args() -> argparse.Namespace: + """Parse command-line arguments.""" + parser = argparse.ArgumentParser(description="Select datamodel-code-generator release benchmark versions") + parser.add_argument("--versions", default="", help="Comma, whitespace, or newline separated release versions/tags") + parser.add_argument("--history-days", type=int, default=DEFAULT_HISTORY_DAYS, help="Release upload lookback window") + parser.add_argument("--limit", type=int, default=DEFAULT_LIMIT, help="Maximum selected release versions") + parser.add_argument("--output", type=Path, default=DEFAULT_OUTPUT, help="Selection JSON output path") + parser.add_argument("--pypi-json", default=PYPI_JSON_URL, help="PyPI project JSON URL or fixture path") + parser.add_argument("--clickpy-json", default=None, help="ClickPy version-download JSON fixture path") + parser.add_argument("--pypistats-recent-json", default=None, help="PyPIStats recent JSON URL or fixture path") + parser.add_argument("--pypistats-overall-json", default=None, help="PyPIStats overall JSON URL or fixture path") + parser.add_argument("--now", default="", help="UTC timestamp override for deterministic tests") + return parser.parse_args() + + +def main() -> int: + """Script entrypoint.""" + args = parse_args() + if error := _validate_args(args): + print(error, file=sys.stderr) + return 2 + + now = _parse_datetime(args.now) if args.now else _utc_now() + selection = select_versions( + SelectionConfig( + pypi_source=args.pypi_json, + clickpy_source=args.clickpy_json, + recent_source=args.pypistats_recent_json, + overall_source=args.pypistats_overall_json, + explicit_versions=args.versions, + history_days=args.history_days, + limit=args.limit, + now=now, + ) + ) + if not selection.selected_versions: + print("No release versions selected", file=sys.stderr) + return 1 + + args.output.parent.mkdir(parents=True, exist_ok=True) + args.output.write_text(json.dumps(_selection_payload(selection), indent=2) + "\n", encoding="utf-8") + _write_github_outputs(selection) + print(",".join(selection.selected_versions)) + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/tests/data/expected/release_benchmark_docs/build_release_benchmark_docs_check.txt b/tests/data/expected/release_benchmark_docs/build_release_benchmark_docs_check.txt new file mode 100644 index 000000000..fcebe1c8e --- /dev/null +++ b/tests/data/expected/release_benchmark_docs/build_release_benchmark_docs_check.txt @@ -0,0 +1,4 @@ +returncode: 0 +stdout: +Release benchmark docs are up to date. +stderr: diff --git a/tests/data/expected/release_benchmark_docs/collect_release_benchmark_install_specs.txt b/tests/data/expected/release_benchmark_docs/collect_release_benchmark_install_specs.txt new file mode 100644 index 000000000..7ae054f35 --- /dev/null +++ b/tests/data/expected/release_benchmark_docs/collect_release_benchmark_install_specs.txt @@ -0,0 +1,2 @@ +release: datamodel-code-generator[ruff]==0.65.0 +main: datamodel-code-generator[ruff] @ git+https://github.com/koxudaxi/datamodel-code-generator.git@main diff --git a/tests/data/expected/release_benchmark_docs/collect_release_benchmarks_failures.txt b/tests/data/expected/release_benchmark_docs/collect_release_benchmarks_failures.txt new file mode 100644 index 000000000..724671bf1 --- /dev/null +++ b/tests/data/expected/release_benchmark_docs/collect_release_benchmarks_failures.txt @@ -0,0 +1,3 @@ +timeout_returncode: 124 +timeout_stderr: Timed out after 1s +ruff_unrecognized: unsupported diff --git a/tests/data/expected/release_benchmark_docs/collect_release_benchmarks_invalid_args.txt b/tests/data/expected/release_benchmark_docs/collect_release_benchmarks_invalid_args.txt new file mode 100644 index 000000000..c020c0943 --- /dev/null +++ b/tests/data/expected/release_benchmark_docs/collect_release_benchmarks_invalid_args.txt @@ -0,0 +1,7 @@ +returncode: 2 +stdout: +stderr: +--runs must be greater than 0, got 0 +--warmups must be greater than or equal to 0, got -1 +--timeout must be greater than 0, got 0 +--install-retries must be greater than 0, got 0 diff --git a/tests/data/expected/release_benchmark_docs/merge_release_benchmarks_cli_outputs.txt b/tests/data/expected/release_benchmark_docs/merge_release_benchmarks_cli_outputs.txt new file mode 100644 index 000000000..c4a286ccc --- /dev/null +++ b/tests/data/expected/release_benchmark_docs/merge_release_benchmarks_cli_outputs.txt @@ -0,0 +1,55 @@ +returncode: 0 +stdout: +stderr: +Wrote /release-benchmarks.json +merged: +{ + "schema_version": 1, + "metadata": { + "generated_at": "2026-06-22T00:00:00Z", + "workflow": "local", + "workflow_run_id": "", + "collector_sha": "", + "os": "ubuntu-24.04", + "python_version": "3.14.2", + "runs_per_case": "3", + "warmups_per_case": "1", + "selection_strategy": "clickpy_downloads", + "selection_window_days": "365", + "selected_versions": "0.64.1,0.64.0,0.53.0,0.33.0", + "download_source": "clickpy", + "download_window_days": "365", + "download_versions": "4", + "download_window_total": "1975", + "pypistats_source": "pypistats.org", + "pypistats_last_day": "12", + "pypistats_last_week": "789", + "pypistats_last_month": "3456", + "pypistats_timeseries_days": "2", + "pypistats_timeseries_downloads": "300", + "release_dates": { + "0.64.1": "2026-06-19T00:00:00Z", + "0.64.0": "2026-06-14T00:00:00Z", + "0.53.0": "2026-01-12T00:00:00Z", + "0.33.0": "2025-08-14T00:00:00Z" + } + }, + "entries": [ + { + "version": "0.64.1", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 546.0, + "min_ms": 533.0, + "max_ms": 552.0, + "stdev_ms": 9.8, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + } + ] +} diff --git a/tests/data/expected/release_benchmark_docs/release_benchmark_cli_outputs.txt b/tests/data/expected/release_benchmark_docs/release_benchmark_cli_outputs.txt new file mode 100644 index 000000000..04cbd54db --- /dev/null +++ b/tests/data/expected/release_benchmark_docs/release_benchmark_cli_outputs.txt @@ -0,0 +1,115 @@ +returncode: 0 +stdout: +stderr: +docs: +# Performance Benchmarks + + + +This page tracks datamodel-code-generator release and main-branch benchmark results collected on GitHub Actions. The data covers only datamodel-code-generator and uses Ubuntu runners so release-to-release changes can be compared without mixing in third-party generator results. Automatic backfills select versions from PyPI download-by-version data when that public dataset is available. + +datamodel-code-generator supports many schema styles and production use cases, so it includes a broad set of useful options. As releases add more capabilities, these benchmarks help keep the implementation measured, managed, and tuned so code generation stays fast in everyday use. + +## Historical Trends + +Each chart plots median generation time by release version for one benchmark scenario. Each line is a formatter pipeline; missing or unsupported formatter results are skipped. Marked versions have benchmark notes below. + +=== "Small / JSON Schema" + + + + + Loading benchmark chart... + + + + +=== "Large / JSON Schema" + + + + + Loading benchmark chart... + + + + +=== "Large / OpenAPI" + + + + + Loading benchmark chart... + + + + +## Benchmark Notes + +Version markers in the charts and historical tables point to these benchmark interpretation notes. + +- `0.59.0` (Large / OpenAPI): Fixture note for a benchmark step change. This note verifies that chart and table markers render from external note data. + +## Collection Policy + +- The benchmark workflow runs on `ubuntu-24.04`. +- Benchmark results are collected on GitHub Actions CI runners, so median timings can vary slightly with runner load and workflow timing; rerun benchmarks before treating small differences as regressions. +- The Python version is the workflow input, defaulting to the latest configured CI Python. +- Release packages are installed from PyPI in isolated virtual environments. +- The `main` snapshot is installed from the GitHub repository when it is explicitly selected. +- Input coverage currently focuses on OpenAPI and JSON Schema. +- Historical backfills are produced by the `Release Benchmarks` workflow and committed after review. + +## Latest Dataset + +- Schema version: `1` +- Generated at: `2026-06-22T00:00:00Z` +- Source workflow: `Release Benchmarks` +- Primary Python version: `3.14.2` +- Entry Python versions: `3.14.2` +- Benchmark runs per case: `7` +- Version selection: `-` +- Selected versions: `3` +- Download source: `-` +- Download window: `-` days +- Downloads in window: `-` +- PyPIStats last month: `-` + +## Latest Release Summary + +Results below are medians. Built-in and Ruff ratios are relative to the black/isort(Default) formatter for the same scenario. + +### main + +=== "Small" + + | Input | Formatter | Median | vs black/isort(Default) | Range | Status | + | --- | --- | --- | --- | --- | --- | + | JSON Schema | black/isort(Default) | 80.0ms | baseline | 78.0ms-83.0ms | OK | + | JSON Schema | Built-in | 70.0ms | 1.14x faster | 68.0ms-73.0ms | OK | + | JSON Schema | Ruff | 71.0ms | 1.13x faster | 69.0ms-75.0ms | OK | + +## Historical Results + +Rows are release versions, newest first, with `main` shown before releases when present. Released is the PyPI upload timestamp in UTC; branch refs such as `main` show `-`. Formatter cells show median generation time; non-default cells include the speed relative to black/isort(Default) when both results are available. Rows without any successful formatter result are omitted. Version cells marked with `*` have benchmark notes above. + +=== "Small / JSON Schema" + + | Version | Released | black/isort(Default) | Built-in | Ruff | + | --- | --- | --- | --- | --- | + | main | - | 80.0ms | 70.0ms (1.14x faster) | 71.0ms (1.13x faster) | + | 0.58.0 | 2026-06-20 08:30 UTC | - | - | 72.3ms | + +=== "Large / JSON Schema" + + | Version | Released | black/isort(Default) | Built-in | Ruff | + | --- | --- | --- | --- | --- | + | 0.59.0 | 2026-06-21 09:45 UTC | - | 360ms | - | + | 0.58.0 | 2026-06-20 08:30 UTC | - | 420ms | - | + +=== "Large / OpenAPI" + + | Version | Released | black/isort(Default) | Built-in | Ruff | + | --- | --- | --- | --- | --- | + | 0.59.0 * | 2026-06-21 09:45 UTC | - | 881ms | Unsupported: formatter target is unavailable in this release | + | 0.58.0 | 2026-06-20 08:30 UTC | - | 980ms | - | diff --git a/tests/data/expected/release_benchmark_docs/release_benchmark_error_helpers.txt b/tests/data/expected/release_benchmark_docs/release_benchmark_error_helpers.txt new file mode 100644 index 000000000..b0ef640aa --- /dev/null +++ b/tests/data/expected/release_benchmark_docs/release_benchmark_error_helpers.txt @@ -0,0 +1,4 @@ +sanitized: Traceback (most recent call last): File "", line 1, in +unsupported: unavailable +install: install +traceback: command diff --git a/tests/data/expected/release_benchmark_docs/release_benchmark_rendered.txt b/tests/data/expected/release_benchmark_docs/release_benchmark_rendered.txt new file mode 100644 index 000000000..c44b709d8 --- /dev/null +++ b/tests/data/expected/release_benchmark_docs/release_benchmark_rendered.txt @@ -0,0 +1,113 @@ + +--- markdown --- +# Performance Benchmarks + + + +This page tracks datamodel-code-generator release and main-branch benchmark results collected on GitHub Actions. The data covers only datamodel-code-generator and uses Ubuntu runners so release-to-release changes can be compared without mixing in third-party generator results. Automatic backfills select versions from PyPI download-by-version data when that public dataset is available. + +datamodel-code-generator supports many schema styles and production use cases, so it includes a broad set of useful options. As releases add more capabilities, these benchmarks help keep the implementation measured, managed, and tuned so code generation stays fast in everyday use. + +## Historical Trends + +Each chart plots median generation time by release version for one benchmark scenario. Each line is a formatter pipeline; missing or unsupported formatter results are skipped. Marked versions have benchmark notes below. + +=== "Small / JSON Schema" + + + + + Loading benchmark chart... + + + + +=== "Large / JSON Schema" + + + + + Loading benchmark chart... + + + + +=== "Large / OpenAPI" + + + + + Loading benchmark chart... + + + + +## Benchmark Notes + +Version markers in the charts and historical tables point to these benchmark interpretation notes. + +- `0.59.0` (Large / OpenAPI): Fixture note for a benchmark step change. This note verifies that chart and table markers render from external note data. + +## Collection Policy + +- The benchmark workflow runs on `ubuntu-24.04`. +- Benchmark results are collected on GitHub Actions CI runners, so median timings can vary slightly with runner load and workflow timing; rerun benchmarks before treating small differences as regressions. +- The Python version is the workflow input, defaulting to the latest configured CI Python. +- Release packages are installed from PyPI in isolated virtual environments. +- The `main` snapshot is installed from the GitHub repository when it is explicitly selected. +- Input coverage currently focuses on OpenAPI and JSON Schema. +- Historical backfills are produced by the `Release Benchmarks` workflow and committed after review. + +## Latest Dataset + +- Schema version: `1` +- Generated at: `2026-06-22T00:00:00Z` +- Source workflow: `Release Benchmarks` +- Primary Python version: `3.14.2` +- Entry Python versions: `3.14.2` +- Benchmark runs per case: `7` +- Version selection: `-` +- Selected versions: `3` +- Download source: `-` +- Download window: `-` days +- Downloads in window: `-` +- PyPIStats last month: `-` + +## Latest Release Summary + +Results below are medians. Built-in and Ruff ratios are relative to the black/isort(Default) formatter for the same scenario. + +### main + +=== "Small" + + | Input | Formatter | Median | vs black/isort(Default) | Range | Status | + | --- | --- | --- | --- | --- | --- | + | JSON Schema | black/isort(Default) | 80.0ms | baseline | 78.0ms-83.0ms | OK | + | JSON Schema | Built-in | 70.0ms | 1.14x faster | 68.0ms-73.0ms | OK | + | JSON Schema | Ruff | 71.0ms | 1.13x faster | 69.0ms-75.0ms | OK | + +## Historical Results + +Rows are release versions, newest first, with `main` shown before releases when present. Released is the PyPI upload timestamp in UTC; branch refs such as `main` show `-`. Formatter cells show median generation time; non-default cells include the speed relative to black/isort(Default) when both results are available. Rows without any successful formatter result are omitted. Version cells marked with `*` have benchmark notes above. + +=== "Small / JSON Schema" + + | Version | Released | black/isort(Default) | Built-in | Ruff | + | --- | --- | --- | --- | --- | + | main | - | 80.0ms | 70.0ms (1.14x faster) | 71.0ms (1.13x faster) | + | 0.58.0 | 2026-06-20 08:30 UTC | - | - | 72.3ms | + +=== "Large / JSON Schema" + + | Version | Released | black/isort(Default) | Built-in | Ruff | + | --- | --- | --- | --- | --- | + | 0.59.0 | 2026-06-21 09:45 UTC | - | 360ms | - | + | 0.58.0 | 2026-06-20 08:30 UTC | - | 420ms | - | + +=== "Large / OpenAPI" + + | Version | Released | black/isort(Default) | Built-in | Ruff | + | --- | --- | --- | --- | --- | + | 0.59.0 * | 2026-06-21 09:45 UTC | - | 881ms | Unsupported: formatter target is unavailable in this release | + | 0.58.0 | 2026-06-20 08:30 UTC | - | 980ms | - | diff --git a/tests/data/expected/release_benchmark_docs/select_release_benchmark_versions_cli_outputs.txt b/tests/data/expected/release_benchmark_docs/select_release_benchmark_versions_cli_outputs.txt new file mode 100644 index 000000000..8124521e2 --- /dev/null +++ b/tests/data/expected/release_benchmark_docs/select_release_benchmark_versions_cli_outputs.txt @@ -0,0 +1,63 @@ +returncode: 0 +stdout: +0.64.1,0.64.0,0.53.0,0.33.0 +stderr: +selection: +{ + "schema_version": 1, + "generated_at": "2026-06-22T00:00:00Z", + "package": "datamodel-code-generator", + "strategy": "clickpy_downloads", + "history_days": 365, + "limit": 4, + "selected_versions": [ + "0.64.1", + "0.64.0", + "0.53.0", + "0.33.0" + ], + "releases": [ + { + "version": "0.64.1", + "uploaded_at": "2026-06-19T00:00:00Z", + "downloads": 25, + "first_seen": "2026-06-19", + "last_seen": "2026-06-20" + }, + { + "version": "0.64.0", + "uploaded_at": "2026-06-14T00:00:00Z", + "downloads": 50, + "first_seen": "2026-06-14", + "last_seen": "2026-06-20" + }, + { + "version": "0.53.0", + "uploaded_at": "2026-01-12T00:00:00Z", + "downloads": 900, + "first_seen": "2026-01-12", + "last_seen": "2026-06-20" + }, + { + "version": "0.33.0", + "uploaded_at": "2025-08-14T00:00:00Z", + "downloads": 1000, + "first_seen": "2026-01-01", + "last_seen": "2026-06-20" + } + ], + "download_stats": { + "source": "clickpy", + "window_days": "365", + "versions_with_downloads": "4", + "window_downloads": "1975", + "pypistats": { + "source": "pypistats.org", + "last_day": 12, + "last_week": 789, + "last_month": 3456, + "timeseries_days": 2, + "timeseries_downloads": 300 + } + } +} diff --git a/tests/data/release_benchmarks/clickpy_versions.json b/tests/data/release_benchmarks/clickpy_versions.json new file mode 100644 index 000000000..ff1038cfa --- /dev/null +++ b/tests/data/release_benchmarks/clickpy_versions.json @@ -0,0 +1,47 @@ +{ + "meta": [ + { + "name": "version", + "type": "String" + }, + { + "name": "downloads", + "type": "UInt64" + }, + { + "name": "first_seen", + "type": "Date" + }, + { + "name": "last_seen", + "type": "Date" + } + ], + "data": [ + { + "version": "0.33.0", + "downloads": 1000, + "first_seen": "2026-01-01", + "last_seen": "2026-06-20" + }, + { + "version": "0.53.0", + "downloads": 900, + "first_seen": "2026-01-12", + "last_seen": "2026-06-20" + }, + { + "version": "0.64.0", + "downloads": 50, + "first_seen": "2026-06-14", + "last_seen": "2026-06-20" + }, + { + "version": "0.64.1", + "downloads": 25, + "first_seen": "2026-06-19", + "last_seen": "2026-06-20" + } + ], + "rows": 4 +} diff --git a/tests/data/release_benchmarks/notes.json b/tests/data/release_benchmarks/notes.json new file mode 100644 index 000000000..05f83139d --- /dev/null +++ b/tests/data/release_benchmarks/notes.json @@ -0,0 +1,11 @@ +{ + "notes": [ + { + "version": "0.59.0", + "input_type": "openapi", + "case": "large", + "summary": "Fixture note for a benchmark step change.", + "details": "This note verifies that chart and table markers render from external note data." + } + ] +} diff --git a/tests/data/release_benchmarks/pypi_project.json b/tests/data/release_benchmarks/pypi_project.json new file mode 100644 index 000000000..664e7c889 --- /dev/null +++ b/tests/data/release_benchmarks/pypi_project.json @@ -0,0 +1,40 @@ +{ + "releases": { + "0.20.0": [ + { + "upload_time_iso_8601": "2024-01-10T00:00:00.000000Z", + "yanked": false + } + ], + "0.33.0": [ + { + "upload_time_iso_8601": "2025-08-14T00:00:00.000000Z", + "yanked": false + } + ], + "0.53.0": [ + { + "upload_time_iso_8601": "2026-01-12T00:00:00.000000Z", + "yanked": false + } + ], + "0.64.0": [ + { + "upload_time_iso_8601": "2026-06-14T00:00:00.000000Z", + "yanked": false + } + ], + "0.64.1": [ + { + "upload_time_iso_8601": "2026-06-19T00:00:00.000000Z", + "yanked": false + } + ], + "0.65.0rc1": [ + { + "upload_time_iso_8601": "2026-06-21T00:00:00.000000Z", + "yanked": false + } + ] + } +} diff --git a/tests/data/release_benchmarks/pypistats_overall.json b/tests/data/release_benchmarks/pypistats_overall.json new file mode 100644 index 000000000..bf9d56422 --- /dev/null +++ b/tests/data/release_benchmarks/pypistats_overall.json @@ -0,0 +1,16 @@ +{ + "data": [ + { + "category": "without_mirrors", + "date": "2026-06-19", + "downloads": 100 + }, + { + "category": "without_mirrors", + "date": "2026-06-20", + "downloads": 200 + } + ], + "package": "datamodel-code-generator", + "type": "overall_downloads" +} diff --git a/tests/data/release_benchmarks/pypistats_recent.json b/tests/data/release_benchmarks/pypistats_recent.json new file mode 100644 index 000000000..bcbe17599 --- /dev/null +++ b/tests/data/release_benchmarks/pypistats_recent.json @@ -0,0 +1,9 @@ +{ + "data": { + "last_day": 12, + "last_month": 3456, + "last_week": 789 + }, + "package": "datamodel-code-generator", + "type": "recent_downloads" +} diff --git a/tests/data/release_benchmarks/release_fragment_0641.json b/tests/data/release_benchmarks/release_fragment_0641.json new file mode 100644 index 000000000..666c39265 --- /dev/null +++ b/tests/data/release_benchmarks/release_fragment_0641.json @@ -0,0 +1,31 @@ +{ + "schema_version": 1, + "metadata": { + "generated_at": "2026-06-22T00:00:00Z", + "workflow": "Release Benchmarks", + "workflow_run_id": "fixture", + "collector_sha": "fixture", + "os": "ubuntu-24.04", + "python_version": "3.14.2", + "runs_per_case": "3", + "warmups_per_case": "1" + }, + "entries": [ + { + "version": "0.64.1", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "default", + "runs": 3, + "median_ms": 546.0, + "min_ms": 533.0, + "max_ms": 552.0, + "stdev_ms": 9.8, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output-model-type pydantic_v2.BaseModel --output model.py", + "error": "" + } + ] +} diff --git a/tests/data/release_benchmarks/sample.json b/tests/data/release_benchmarks/sample.json new file mode 100644 index 000000000..539fcc197 --- /dev/null +++ b/tests/data/release_benchmarks/sample.json @@ -0,0 +1,159 @@ +{ + "schema_version": 1, + "metadata": { + "generated_at": "2026-06-22T00:00:00Z", + "workflow": "Release Benchmarks", + "python_version": "3.14.2", + "runs_per_case": "7", + "release_dates": { + "0.58.0": "2026-06-20T08:30:00Z", + "0.59.0": "2026-06-21T09:45:00Z" + } + }, + "entries": [ + { + "version": "main", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "default", + "runs": 7, + "median_ms": 80.0, + "min_ms": 78.0, + "max_ms": 83.0, + "stdev_ms": 1.8, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --output model.py", + "error": "" + }, + { + "version": "main", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "builtin", + "runs": 7, + "median_ms": 70.0, + "min_ms": 68.0, + "max_ms": 73.0, + "stdev_ms": 1.6, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --formatters builtin --output model.py", + "error": "" + }, + { + "version": "main", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "ruff", + "runs": 7, + "median_ms": 71.0, + "min_ms": 69.0, + "max_ms": 75.0, + "stdev_ms": 2.0, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --formatters ruff-check ruff-format --output model.py", + "error": "" + }, + { + "version": "0.58.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "builtin", + "runs": 7, + "median_ms": 420.4, + "min_ms": 410.1, + "max_ms": 445.9, + "stdev_ms": 11.8, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --formatters builtin --output model.py", + "error": "" + }, + { + "version": "0.58.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "builtin", + "runs": 7, + "median_ms": 980.2, + "min_ms": 950.5, + "max_ms": 1005.7, + "stdev_ms": 17.2, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --formatters builtin --output model.py", + "error": "" + }, + { + "version": "0.58.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "small", + "formatter": "ruff", + "runs": 7, + "median_ms": 72.35, + "min_ms": 70.1, + "max_ms": 76.8, + "stdev_ms": 2.1, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/jsonschema/person.json --input-file-type jsonschema --formatters ruff-check ruff-format --output model.py", + "error": "" + }, + { + "version": "0.59.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "jsonschema", + "case": "large", + "formatter": "builtin", + "runs": 7, + "median_ms": 360.2, + "min_ms": 350.0, + "max_ms": 389.4, + "stdev_ms": 12.0, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/large_models.json --input-file-type jsonschema --formatters builtin --output model.py", + "error": "" + }, + { + "version": "0.59.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "builtin", + "runs": 7, + "median_ms": 880.8, + "min_ms": 850.2, + "max_ms": 901.3, + "stdev_ms": 18.4, + "status": "ok", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --formatters builtin --output model.py", + "error": "" + }, + { + "version": "0.59.0", + "python_version": "3.14.2", + "os": "ubuntu-24.04", + "input_type": "openapi", + "case": "large", + "formatter": "ruff", + "runs": 0, + "median_ms": null, + "min_ms": null, + "max_ms": null, + "stdev_ms": null, + "status": "unsupported", + "command": "python -m datamodel_code_generator --input tests/data/performance/openapi_large.yaml --input-file-type openapi --formatters ruff-check ruff-format --output model.py", + "error": "formatter target is unavailable in this release" + } + ] +} diff --git a/tests/test_build_release_benchmark_docs_script.py b/tests/test_build_release_benchmark_docs_script.py new file mode 100644 index 000000000..527f235b7 --- /dev/null +++ b/tests/test_build_release_benchmark_docs_script.py @@ -0,0 +1,270 @@ +"""Tests for release benchmark documentation generation.""" + +from __future__ import annotations + +import os +import subprocess +import sys +from pathlib import Path + +from scripts import build_release_benchmark_docs +from scripts.collect_release_benchmarks import _failure_status, _install_spec, _run_subprocess +from scripts.release_benchmark_errors import sanitize_benchmark_error, summarize_benchmark_error +from tests.conftest import assert_output + +ROOT = Path(__file__).resolve().parents[1] +SCRIPT = ROOT / "scripts" / "build_release_benchmark_docs.py" +FIXTURE_DATA = ROOT / "tests" / "data" / "release_benchmarks" / "sample.json" +FIXTURE_DIR = ROOT / "tests" / "data" / "release_benchmarks" +FIXTURE_NOTES = FIXTURE_DIR / "notes.json" +EXPECTED_RELEASE_BENCHMARK_DOCS_PATH = ROOT / "tests" / "data" / "expected" / "release_benchmark_docs" + + +def _completed_process_output(result: subprocess.CompletedProcess[str]) -> str: + """Format a subprocess result for stable external-file comparison.""" + return f"returncode: {result.returncode}\nstdout:\n{result.stdout}stderr:\n{result.stderr}" + + +def _completed_process_output_with_tmp(result: subprocess.CompletedProcess[str], tmp_path: Path) -> str: + """Format subprocess output with a stable temporary path placeholder.""" + output = _completed_process_output(result).replace(str(tmp_path), "") + return output.replace("\\", "/") + + +def _raise_for_failed_process(result: subprocess.CompletedProcess[str]) -> None: + """Surface subprocess failures before tests read expected output files.""" + if result.returncode == 0: + return + raise AssertionError(_completed_process_output(result)) + + +def test_build_release_benchmark_docs_check_is_up_to_date() -> None: + """Check that committed release benchmark docs match the committed JSON dataset.""" + result = subprocess.run( + [sys.executable, str(SCRIPT), "--check"], + cwd=ROOT, + capture_output=True, + text=True, + check=False, + ) + + _raise_for_failed_process(result) + assert_output( + _completed_process_output(result), + EXPECTED_RELEASE_BENCHMARK_DOCS_PATH / "build_release_benchmark_docs_check.txt", + ) + + +def test_release_benchmark_renderers_use_fixture_data() -> None: + """Render Markdown from an external benchmark data fixture.""" + data = build_release_benchmark_docs.load_benchmark_data(FIXTURE_DATA, notes_path=FIXTURE_NOTES) + + assert_output( + "\n--- markdown ---\n" + build_release_benchmark_docs.render_release_benchmark_markdown(data), + EXPECTED_RELEASE_BENCHMARK_DOCS_PATH / "release_benchmark_rendered.txt", + ) + + +def test_release_benchmark_docs_cli_writes_expected_outputs(tmp_path: Path) -> None: + """The CLI can render fixture-backed Markdown to a caller-selected path.""" + docs_path = tmp_path / "performance-benchmarks.md" + result = subprocess.run( + [ + sys.executable, + str(SCRIPT), + "--data", + str(FIXTURE_DATA), + "--notes", + str(FIXTURE_NOTES), + "--docs", + str(docs_path), + ], + cwd=ROOT, + capture_output=True, + text=True, + check=False, + ) + + _raise_for_failed_process(result) + assert_output( + _completed_process_output(result) + "docs:\n" + docs_path.read_text(encoding="utf-8"), + EXPECTED_RELEASE_BENCHMARK_DOCS_PATH / "release_benchmark_cli_outputs.txt", + ) + + +def test_collect_release_benchmark_cli_validation() -> None: + """The collector rejects invalid numeric options before benchmarking.""" + result = subprocess.run( + [ + sys.executable, + str(ROOT / "scripts" / "collect_release_benchmarks.py"), + "--versions", + "0.64.1", + "--runs", + "0", + "--warmups", + "-1", + "--timeout", + "0", + "--install-retries", + "0", + ], + cwd=ROOT, + capture_output=True, + text=True, + check=False, + ) + + assert_output( + _completed_process_output(result), + EXPECTED_RELEASE_BENCHMARK_DOCS_PATH / "collect_release_benchmarks_invalid_args.txt", + ) + + +def test_collect_release_benchmark_failure_helpers() -> None: + """Timeouts and old formatter argument errors are classified predictably.""" + timeout_result = _run_subprocess( + [sys.executable, "-c", "import time; time.sleep(2)"], + timeout=1, + ) + output = "\n".join(( + f"timeout_returncode: {timeout_result.returncode}", + f"timeout_stderr: {timeout_result.stderr}", + f"ruff_unrecognized: {_failure_status('ruff', 'error: unrecognized arguments: ruff-format')}", + "", + )) + + assert_output(output, EXPECTED_RELEASE_BENCHMARK_DOCS_PATH / "collect_release_benchmarks_failures.txt") + + +def test_collect_release_benchmark_install_specs() -> None: + """Release versions use PyPI pins and main uses the GitHub branch ref.""" + output = "\n".join(( + f"release: {_install_spec('v0.65.0')}", + f"main: {_install_spec('main')}", + "", + )) + + assert_output(output, EXPECTED_RELEASE_BENCHMARK_DOCS_PATH / "collect_release_benchmark_install_specs.txt") + + +def test_release_benchmark_error_helpers_redact_public_output() -> None: + """Benchmark errors redact volatile temp paths and summarize noisy failures.""" + path_error = ( + 'Traceback (most recent call last): File "/tmp/dcg-release-bench-abc123/venv/lib/python3.14/' + 'site-packages/datamodel_code_generator/__main__.py", line 1, in ' + ) + output = "\n".join(( + f"sanitized: {sanitize_benchmark_error(path_error)}", + "unsupported: " + + summarize_benchmark_error( + status="unsupported", + formatter="builtin", + error="error: argument --formatters: invalid choice: 'builtin'", + ), + "install: " + + summarize_benchmark_error( + status="failed", + formatter="default", + error="Using Python 3.14.2 environment at: /tmp/dcg-release-bench-abc123/venv Failed to build typed-ast", + ), + "traceback: " + summarize_benchmark_error(status="failed", formatter="ruff", error=path_error), + "", + )) + + assert_output(output, EXPECTED_RELEASE_BENCHMARK_DOCS_PATH / "release_benchmark_error_helpers.txt") + + +def test_select_release_benchmark_versions_cli_writes_usage_based_selection(tmp_path: Path) -> None: + """The selector uses version download data and writes a deterministic selection artifact.""" + output_path = tmp_path / "release-benchmark-selection.json" + result = subprocess.run( + [ + sys.executable, + str(ROOT / "scripts" / "select_release_benchmark_versions.py"), + "--pypi-json", + str(FIXTURE_DIR / "pypi_project.json"), + "--clickpy-json", + str(FIXTURE_DIR / "clickpy_versions.json"), + "--pypistats-recent-json", + str(FIXTURE_DIR / "pypistats_recent.json"), + "--pypistats-overall-json", + str(FIXTURE_DIR / "pypistats_overall.json"), + "--history-days", + "365", + "--limit", + "4", + "--now", + "2026-06-22T00:00:00Z", + "--output", + str(output_path), + ], + cwd=ROOT, + capture_output=True, + text=True, + check=False, + ) + + _raise_for_failed_process(result) + assert_output( + _completed_process_output(result) + "selection:\n" + output_path.read_text(encoding="utf-8"), + EXPECTED_RELEASE_BENCHMARK_DOCS_PATH / "select_release_benchmark_versions_cli_outputs.txt", + ) + + +def test_merge_release_benchmarks_cli_writes_expected_payload(tmp_path: Path) -> None: + """The merge CLI combines selection metadata and per-version fragments.""" + selection_path = tmp_path / "release-benchmark-selection.json" + selector_result = subprocess.run( + [ + sys.executable, + str(ROOT / "scripts" / "select_release_benchmark_versions.py"), + "--pypi-json", + str(FIXTURE_DIR / "pypi_project.json"), + "--clickpy-json", + str(FIXTURE_DIR / "clickpy_versions.json"), + "--pypistats-recent-json", + str(FIXTURE_DIR / "pypistats_recent.json"), + "--pypistats-overall-json", + str(FIXTURE_DIR / "pypistats_overall.json"), + "--history-days", + "365", + "--limit", + "4", + "--now", + "2026-06-22T00:00:00Z", + "--output", + str(selection_path), + ], + cwd=ROOT, + capture_output=True, + text=True, + check=False, + ) + _raise_for_failed_process(selector_result) + + output_path = tmp_path / "release-benchmarks.json" + result = subprocess.run( + [ + sys.executable, + str(ROOT / "scripts" / "merge_release_benchmarks.py"), + str(FIXTURE_DIR / "release_fragment_0641.json"), + "--selection", + str(selection_path), + "--generated-at", + "2026-06-22T00:00:00Z", + "--output", + str(output_path), + ], + cwd=ROOT, + env={**os.environ, "OS": "ubuntu-24.04", "BENCHMARK_PYTHON_VERSION": "3.14.2"}, + capture_output=True, + text=True, + check=False, + ) + + _raise_for_failed_process(result) + assert_output( + _completed_process_output_with_tmp(result, tmp_path) + "merged:\n" + output_path.read_text(encoding="utf-8"), + EXPECTED_RELEASE_BENCHMARK_DOCS_PATH / "merge_release_benchmarks_cli_outputs.txt", + ) diff --git a/tox.ini b/tox.ini index d9585c2c3..3068e63c1 100644 --- a/tox.ini +++ b/tox.ini @@ -182,6 +182,13 @@ commands = dependency_groups = no_default_groups = true +[testenv:release-benchmark-docs] +description = Build release benchmark documentation and SVG chart (use --check to validate only) +commands = + python scripts/build_release_benchmark_docs.py {posargs} +dependency_groups = +no_default_groups = true + [testenv:llms-txt] description = Generate llms.txt files (use --check to validate only, requires Python 3.11+) commands = @@ -213,6 +220,7 @@ commands = python scripts/build_experimental_docs.py python scripts/build_conformance_docs.py python scripts/build_architecture_docs.py + python scripts/build_release_benchmark_docs.py python scripts/build_llms_txt.py pytest \ tests/test_main_kr.py::test_generate_prompt_basic \ diff --git a/zensical.toml b/zensical.toml index 029be19cb..62a47fb68 100644 --- a/zensical.toml +++ b/zensical.toml @@ -77,6 +77,7 @@ nav = [ ]} ]}, { "Conformance Dashboard" = "conformance.md" }, + { "Performance Benchmarks" = "performance-benchmarks.md" }, { "Deprecations" = "deprecations.md" }, { "Experimental Features" = "experimental.md" }, { "FAQ" = "faq.md" }, @@ -84,6 +85,14 @@ nav = [ { "Development-Contributing" = "development-contributing.md" } ] +extra_css = [ + "assets/benchmarks/release-benchmarks.css" +] + +extra_javascript = [ + "assets/benchmarks/release-benchmarks.js" +] + [project.theme] custom_dir = "overrides" features = [