forgegraph 0.2.0__tar.gz → 0.3.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {forgegraph-0.2.0 → forgegraph-0.3.0}/.gitignore +6 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/.pre-commit-config.yaml +3 -3
- forgegraph-0.3.0/CHANGELOG.md +92 -0
- forgegraph-0.3.0/CONTRIBUTING.md +45 -0
- forgegraph-0.2.0/README.md → forgegraph-0.3.0/PKG-INFO +66 -28
- forgegraph-0.2.0/PKG-INFO → forgegraph-0.3.0/README.md +36 -53
- {forgegraph-0.2.0/docs → forgegraph-0.3.0/docs/design}/architecture.md +214 -205
- forgegraph-0.3.0/docs/design/todo.md +10 -0
- forgegraph-0.3.0/docs/specs/catalog/base_format.md +11 -0
- forgegraph-0.3.0/docs/specs/catalog/base_layout_format.md +11 -0
- forgegraph-0.3.0/docs/specs/catalog/base_theme.md +81 -0
- forgegraph-0.3.0/docs/specs/catalog/graph_type_xy.md +97 -0
- forgegraph-0.3.0/docs/specs/catalog/layer_error_bar.md +17 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/docs/specs/catalog/layer_note.md +4 -9
- forgegraph-0.3.0/docs/specs/catalog/layer_reference_line.md +22 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/docs/specs/config/config.md +1 -1
- {forgegraph-0.2.0 → forgegraph-0.3.0}/docs/specs/format/base_format.md +1 -1
- {forgegraph-0.2.0 → forgegraph-0.3.0}/docs/specs/graph_type/xy.md +22 -15
- {forgegraph-0.2.0 → forgegraph-0.3.0}/docs/specs/graphspec/polarization.md +36 -23
- {forgegraph-0.2.0 → forgegraph-0.3.0}/docs/specs/layer/note.md +1 -1
- {forgegraph-0.2.0 → forgegraph-0.3.0}/docs/specs/layer/reference_line.md +1 -1
- {forgegraph-0.2.0 → forgegraph-0.3.0}/docs/specs/layout/base_layout.md +5 -4
- {forgegraph-0.2.0 → forgegraph-0.3.0}/docs/specs/pack/acme/graphspecs/polarization-curve.md +2 -1
- {forgegraph-0.2.0 → forgegraph-0.3.0}/docs/specs/pack/acme/schedules/workday.md +2 -1
- {forgegraph-0.2.0 → forgegraph-0.3.0}/docs/specs/pack/acme/themes/acme.md +1 -1
- {forgegraph-0.2.0 → forgegraph-0.3.0}/docs/specs/pack/forgegraph_base.md +3 -3
- forgegraph-0.3.0/docs/specs/pack/forgegraph_base_2/catalogs/formats/compact_format.md +11 -0
- forgegraph-0.3.0/docs/specs/pack/forgegraph_base_2/catalogs/themes/base_theme.md +25 -0
- forgegraph-0.3.0/docs/specs/pack/forgegraph_base_2/formats/compact_format.md +17 -0
- forgegraph-0.3.0/docs/specs/pack/forgegraph_base_2/graphspecs/example.md +17 -0
- forgegraph-0.3.0/docs/specs/pack/forgegraph_base_2/pack.md +9 -0
- forgegraph-0.3.0/docs/specs/pack/forgegraph_base_2/themes/base_theme.md +79 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/docs/specs/provenance/provenance.md +2 -2
- {forgegraph-0.2.0 → forgegraph-0.3.0}/docs/specs/schedule/base_schedule.md +7 -5
- {forgegraph-0.2.0 → forgegraph-0.3.0}/docs/specs/theme/base_theme.md +45 -30
- forgegraph-0.3.0/examples/layouts/README.md +10 -0
- forgegraph-0.3.0/examples/layouts/dashboard/forgegraph.toml +1 -0
- forgegraph-0.3.0/examples/layouts/dashboard/lab_throughput.layout.md +37 -0
- forgegraph-0.3.0/examples/layouts/dashboard/lab_throughput.layout.yaml +33 -0
- forgegraph-0.3.0/examples/layouts/dashboard/lost_runs.parquet +0 -0
- forgegraph-0.3.0/examples/layouts/dashboard/lost_runs.yaml +36 -0
- forgegraph-0.3.0/examples/layouts/dashboard/ops/formats/dashboard.md +20 -0
- forgegraph-0.3.0/examples/layouts/dashboard/ops/formats/dashboard.yaml +16 -0
- forgegraph-0.3.0/examples/layouts/dashboard/ops/pack.yaml +5 -0
- forgegraph-0.3.0/examples/layouts/dashboard/prep_lab_dashboard.py +40 -0
- forgegraph-0.3.0/examples/layouts/dashboard/run_time.parquet +0 -0
- forgegraph-0.3.0/examples/layouts/dashboard/run_time.yaml +36 -0
- forgegraph-0.3.0/examples/layouts/dashboard/runs_gc_ms_01.yaml +26 -0
- forgegraph-0.3.0/examples/layouts/dashboard/runs_hplc_01.yaml +26 -0
- forgegraph-0.3.0/examples/layouts/dashboard/runs_hplc_02.yaml +26 -0
- forgegraph-0.3.0/examples/layouts/dashboard/runs_icp_oes_01.yaml +26 -0
- forgegraph-0.3.0/examples/layouts/dashboard/samples_weekly.yaml +27 -0
- forgegraph-0.3.0/examples/layouts/dashboard/throughput_weekly.yaml +30 -0
- forgegraph-0.3.0/examples/layouts/dashboard/weekly_gc_ms_01.parquet +0 -0
- forgegraph-0.3.0/examples/layouts/dashboard/weekly_hplc_01.parquet +0 -0
- forgegraph-0.3.0/examples/layouts/dashboard/weekly_hplc_02.parquet +0 -0
- forgegraph-0.3.0/examples/layouts/dashboard/weekly_icp_oes_01.parquet +0 -0
- forgegraph-0.3.0/examples/layouts/dashboard/weekly_runs.parquet +0 -0
- forgegraph-0.3.0/examples/layouts/dashboard/weekly_samples.parquet +0 -0
- forgegraph-0.3.0/examples/layouts/paper/cell_durability.parquet +0 -0
- forgegraph-0.3.0/examples/layouts/paper/cell_performance.layout.md +22 -0
- forgegraph-0.3.0/examples/layouts/paper/cell_performance.layout.yaml +18 -0
- forgegraph-0.3.0/examples/layouts/paper/cell_polarization.parquet +0 -0
- forgegraph-0.3.0/examples/layouts/paper/forgegraph.toml +1 -0
- forgegraph-0.3.0/examples/layouts/paper/hfr_time.yaml +30 -0
- forgegraph-0.3.0/examples/layouts/paper/journal/formats/journal-double.md +18 -0
- forgegraph-0.3.0/examples/layouts/paper/journal/formats/journal-double.yaml +14 -0
- forgegraph-0.3.0/examples/layouts/paper/journal/pack.yaml +5 -0
- forgegraph-0.3.0/examples/layouts/paper/polarization.yaml +27 -0
- forgegraph-0.3.0/examples/layouts/paper/prep_cells.py +10 -0
- forgegraph-0.3.0/examples/layouts/paper/voltage_time.yaml +30 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/examples/packs/acme/graphspecs/polarization-curve.yaml +2 -1
- {forgegraph-0.2.0 → forgegraph-0.3.0}/examples/packs/acme/schedules/workday.yaml +2 -1
- {forgegraph-0.2.0 → forgegraph-0.3.0}/examples/packs/acme/themes/acme.yaml +1 -1
- {forgegraph-0.2.0 → forgegraph-0.3.0}/pyproject.toml +12 -10
- {forgegraph-0.2.0 → forgegraph-0.3.0}/scripts/build_example_data.py +11 -10
- {forgegraph-0.2.0 → forgegraph-0.3.0}/scripts/build_recreations.py +12 -22
- {forgegraph-0.2.0 → forgegraph-0.3.0}/scripts/forgemark.py +2 -2
- {forgegraph-0.2.0 → forgegraph-0.3.0}/scripts/mirror_specs.py +3 -4
- {forgegraph-0.2.0 → forgegraph-0.3.0}/scripts/report_skill_evals.py +4 -4
- {forgegraph-0.2.0 → forgegraph-0.3.0}/scripts/run_skill_evals.py +212 -145
- {forgegraph-0.2.0 → forgegraph-0.3.0}/scripts/smoke_installed.py +2 -1
- {forgegraph-0.2.0 → forgegraph-0.3.0}/scripts/visual_changelog.py +7 -5
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/canvas.py +48 -58
- forgegraph-0.3.0/src/forgegraph/catalog_build/build.py +215 -0
- forgegraph-0.3.0/src/forgegraph/catalog_build/cards.py +402 -0
- {forgegraph-0.2.0/src/forgegraph/catalog → forgegraph-0.3.0/src/forgegraph/catalog_build}/examples.py +55 -32
- {forgegraph-0.2.0/src/forgegraph/catalog → forgegraph-0.3.0/src/forgegraph/catalog_build}/files.py +102 -93
- {forgegraph-0.2.0/src/forgegraph/catalog → forgegraph-0.3.0/src/forgegraph/catalog_build}/page.py +8 -0
- forgegraph-0.3.0/src/forgegraph/catalogs/graph_types/xy.yaml +93 -0
- forgegraph-0.3.0/src/forgegraph/catalogs/layers/error_bar.yaml +13 -0
- forgegraph-0.3.0/src/forgegraph/catalogs/layers/note.yaml +11 -0
- forgegraph-0.3.0/src/forgegraph/catalogs/layers/reference_line.yaml +18 -0
- forgegraph-0.3.0/src/forgegraph/cli/__init__.py +135 -0
- forgegraph-0.3.0/src/forgegraph/cli/catalog.py +219 -0
- forgegraph-0.3.0/src/forgegraph/cli/graphs.py +169 -0
- forgegraph-0.3.0/src/forgegraph/cli/jobs.py +42 -0
- forgegraph-0.3.0/src/forgegraph/cli/schema.py +216 -0
- forgegraph-0.3.0/src/forgegraph/cli/skill.py +41 -0
- forgegraph-0.3.0/src/forgegraph/data.py +42 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/drawing/axes.py +37 -297
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/drawing/colorbar.py +8 -9
- forgegraph-0.3.0/src/forgegraph/drawing/dates.py +278 -0
- forgegraph-0.3.0/src/forgegraph/drawing/errors.py +9 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/drawing/export.py +2 -1
- forgegraph-0.3.0/src/forgegraph/drawing/figure.py +157 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/drawing/key.py +6 -7
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/drawing/labels.py +179 -72
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/drawing/layers.py +71 -41
- forgegraph-0.3.0/src/forgegraph/drawing/layout.py +494 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/drawing/lint.py +20 -19
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/drawing/marks.py +55 -64
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/drawing/spacing.py +4 -9
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/drawing/style.py +31 -10
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/drawing/text.py +60 -6
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/drawing/ticks.py +94 -7
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/drawing/xy.py +350 -320
- forgegraph-0.3.0/src/forgegraph/drawn.py +144 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/fonts/__init__.py +28 -7
- {forgegraph-0.2.0/src/forgegraph/catalog → forgegraph-0.3.0/src/forgegraph}/forgemark.py +44 -2
- forgegraph-0.3.0/src/forgegraph/graph.py +354 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/graph_types/xy.yaml +22 -14
- forgegraph-0.3.0/src/forgegraph/jobs/__init__.py +9 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/jobs/run.py +40 -91
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/jobs/status.py +1 -1
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/layers/note.yaml +1 -1
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/layers/reference_line.yaml +1 -1
- forgegraph-0.3.0/src/forgegraph/layouts/__init__.py +542 -0
- forgegraph-0.3.0/src/forgegraph/layouts/separators.py +139 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/packs/__init__.py +29 -17
- forgegraph-0.3.0/src/forgegraph/packs/config.toml +1 -0
- forgegraph-0.3.0/src/forgegraph/packs/forgegraph_base/catalogs/formats/base_format.yaml +7 -0
- forgegraph-0.3.0/src/forgegraph/packs/forgegraph_base/catalogs/formats/base_layout_format.yaml +7 -0
- forgegraph-0.3.0/src/forgegraph/packs/forgegraph_base/catalogs/themes/base_theme.yaml +77 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/packs/forgegraph_base/formats/base_format.yaml +1 -1
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/packs/forgegraph_base/graphspecs/polarization.yaml +36 -23
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/packs/forgegraph_base/layouts/base_layout.yaml +5 -4
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/packs/forgegraph_base/pack.yaml +3 -3
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/packs/forgegraph_base/schedules/base_schedule.yaml +7 -5
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/packs/forgegraph_base/themes/base_theme.yaml +45 -30
- forgegraph-0.3.0/src/forgegraph/packs/forgegraph_base_2/catalogs/formats/compact_format.yaml +7 -0
- forgegraph-0.3.0/src/forgegraph/packs/forgegraph_base_2/catalogs/themes/base_theme.yaml +21 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/packs/forgegraph_base_2/graphspecs/example.yaml +1 -1
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/packs/forgegraph_base_2/pack.yaml +3 -3
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/packs/forgegraph_base_2/themes/base_theme.yaml +18 -15
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/skill/__init__.py +3 -11
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/skill/forgegraph/SKILL.md +2 -2
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/skill/forgegraph/examples/figure.schedule.yaml +2 -1
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/skill/forgegraph/examples/layers.yaml +2 -1
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/skill/forgegraph/examples/xy.yaml +4 -2
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/spec/__init__.py +5 -1
- forgegraph-0.3.0/src/forgegraph/spec/access.py +99 -0
- forgegraph-0.3.0/src/forgegraph/spec/common.py +38 -0
- forgegraph-0.3.0/src/forgegraph/spec/explain.py +70 -0
- forgegraph-0.3.0/src/forgegraph/spec/layers.py +126 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/spec/layout.py +14 -20
- forgegraph-0.3.0/src/forgegraph/spec/loaded.py +82 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/spec/parameters.py +45 -33
- forgegraph-0.3.0/src/forgegraph/spec/provenance.py +134 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/spec/provenance.yaml +2 -2
- forgegraph-0.3.0/src/forgegraph/spec/registry.py +187 -0
- forgegraph-0.3.0/src/forgegraph/spec/resolve.py +162 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/spec/schedule.py +8 -8
- forgegraph-0.3.0/src/forgegraph/spec/validate.py +367 -0
- forgegraph-0.3.0/tests/baselines/crowded_runs.png +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/tests/baselines/layout_anode_layers.png +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/tests/baselines/layout_screening_and_rate.png +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/tests/conftest.py +2 -2
- forgegraph-0.3.0/tests/pack_helpers.py +121 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/tests/recreations.py +54 -74
- {forgegraph-0.2.0 → forgegraph-0.3.0}/tests/render_helpers.py +25 -19
- {forgegraph-0.2.0 → forgegraph-0.3.0}/tests/spec_mirror.py +83 -85
- {forgegraph-0.2.0 → forgegraph-0.3.0}/tests/test_axes.py +62 -16
- {forgegraph-0.2.0 → forgegraph-0.3.0}/tests/test_blank.py +47 -0
- forgegraph-0.3.0/tests/test_catalog.py +158 -0
- forgegraph-0.3.0/tests/test_catalog_files.py +296 -0
- forgegraph-0.3.0/tests/test_catalog_inputs.py +122 -0
- forgegraph-0.3.0/tests/test_catalog_page.py +78 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/tests/test_cli.py +175 -63
- {forgegraph-0.2.0 → forgegraph-0.3.0}/tests/test_jobs.py +90 -53
- forgegraph-0.3.0/tests/test_labels.py +88 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/tests/test_layers.py +143 -10
- {forgegraph-0.2.0 → forgegraph-0.3.0}/tests/test_layout.py +120 -90
- {forgegraph-0.2.0 → forgegraph-0.3.0}/tests/test_lint.py +30 -2
- {forgegraph-0.2.0 → forgegraph-0.3.0}/tests/test_marks.py +50 -5
- forgegraph-0.3.0/tests/test_packaging.py +30 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/tests/test_packs.py +88 -54
- forgegraph-0.3.0/tests/test_perturbation.py +58 -0
- forgegraph-0.3.0/tests/test_regression.py +25 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/tests/test_render.py +133 -36
- {forgegraph-0.2.0 → forgegraph-0.3.0}/tests/test_schedule.py +11 -12
- {forgegraph-0.2.0 → forgegraph-0.3.0}/tests/test_smoke.py +38 -0
- forgegraph-0.3.0/tests/test_spec_comments.py +127 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/tests/test_specs.py +145 -23
- {forgegraph-0.2.0 → forgegraph-0.3.0}/tests/test_text.py +102 -3
- {forgegraph-0.2.0 → forgegraph-0.3.0}/uv.lock +3 -3
- forgegraph-0.2.0/CHANGELOG.md +0 -48
- forgegraph-0.2.0/CONTRIBUTING.md +0 -39
- forgegraph-0.2.0/docs/build-plan.md +0 -382
- forgegraph-0.2.0/docs/decisions.md +0 -222
- forgegraph-0.2.0/docs/forgemark-repro-reattach.md +0 -80
- forgegraph-0.2.0/docs/forgemark-request.md +0 -56
- forgegraph-0.2.0/docs/specs/catalog/base_format.md +0 -22
- forgegraph-0.2.0/docs/specs/catalog/base_theme.md +0 -222
- forgegraph-0.2.0/docs/specs/catalog/graph_type_xy.md +0 -202
- forgegraph-0.2.0/docs/specs/catalog/layer_error_bar.md +0 -26
- forgegraph-0.2.0/docs/specs/catalog/layer_reference_line.md +0 -36
- forgegraph-0.2.0/scripts/build_api_notebook.py +0 -196
- forgegraph-0.2.0/scripts/build_bundled_skill.py +0 -48
- forgegraph-0.2.0/src/forgegraph/catalog/build.py +0 -362
- forgegraph-0.2.0/src/forgegraph/catalogs/graph_types/xy.yaml +0 -198
- forgegraph-0.2.0/src/forgegraph/catalogs/layers/error_bar.yaml +0 -22
- forgegraph-0.2.0/src/forgegraph/catalogs/layers/note.yaml +0 -16
- forgegraph-0.2.0/src/forgegraph/catalogs/layers/reference_line.yaml +0 -32
- forgegraph-0.2.0/src/forgegraph/cli/__init__.py +0 -740
- forgegraph-0.2.0/src/forgegraph/drawing/figure.py +0 -319
- forgegraph-0.2.0/src/forgegraph/graph.py +0 -563
- forgegraph-0.2.0/src/forgegraph/graph_types/__init__.py +0 -1
- forgegraph-0.2.0/src/forgegraph/jobs/__init__.py +0 -9
- forgegraph-0.2.0/src/forgegraph/layouts/__init__.py +0 -639
- forgegraph-0.2.0/src/forgegraph/layouts/arrange.py +0 -403
- forgegraph-0.2.0/src/forgegraph/packs/config.toml +0 -1
- forgegraph-0.2.0/src/forgegraph/packs/forgegraph_base/catalogs/formats/base_format.yaml +0 -18
- forgegraph-0.2.0/src/forgegraph/packs/forgegraph_base/catalogs/formats/base_layout_format.yaml +0 -9
- forgegraph-0.2.0/src/forgegraph/packs/forgegraph_base/catalogs/themes/base_theme.yaml +0 -218
- forgegraph-0.2.0/src/forgegraph/packs/forgegraph_base_2/catalogs/formats/compact_format.yaml +0 -9
- forgegraph-0.2.0/src/forgegraph/packs/forgegraph_base_2/catalogs/themes/base_theme.yaml +0 -26
- forgegraph-0.2.0/src/forgegraph/spec/common.py +0 -11
- forgegraph-0.2.0/src/forgegraph/spec/documents.py +0 -874
- forgegraph-0.2.0/src/forgegraph/spec/provenance.py +0 -63
- forgegraph-0.2.0/tests/baselines/crowded_runs.png +0 -0
- forgegraph-0.2.0/tests/pack_helpers.py +0 -25
- forgegraph-0.2.0/tests/test_catalog.py +0 -290
- forgegraph-0.2.0/tests/test_perturbation.py +0 -48
- forgegraph-0.2.0/tests/test_regression.py +0 -42
- {forgegraph-0.2.0 → forgegraph-0.3.0}/LICENSE +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/TRADEMARKS.md +0 -0
- /forgegraph-0.2.0/docs/initial specification.md → /forgegraph-0.3.0/docs/design/initial-specification.md +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/docs/specs/format/base_layout_format.md +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/docs/specs/layer/error_bar.md +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/docs/specs/pack/acme/formats/slide.md +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/docs/specs/pack/acme/layouts/dashboard.md +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/docs/specs/pack/acme/pack.md +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/examples/packs/acme/formats/slide.yaml +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/examples/packs/acme/layouts/dashboard.yaml +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/examples/packs/acme/pack.yaml +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/examples/packs/acme/references/house.md +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/examples/sample-data/README.md +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/examples/sample-data/air_passengers.csv +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/examples/sample-data/air_passengers_by_month.csv +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/examples/sample-data/anscombe.csv +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/examples/sample-data/assay_summary.csv +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/examples/sample-data/cell_durability.csv +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/examples/sample-data/cell_polarization.csv +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/examples/sample-data/co2_monthly.csv +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/examples/sample-data/diamonds.csv +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/examples/sample-data/dose_response.csv +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/examples/sample-data/economics.csv +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/examples/sample-data/enzyme_kinetics.csv +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/examples/sample-data/fmri.csv +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/examples/sample-data/gapminder.csv +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/examples/sample-data/geyser.csv +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/examples/sample-data/growth.csv +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/examples/sample-data/iris.csv +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/examples/sample-data/lab_export.xlsx +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/examples/sample-data/lab_runs.xlsx +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/examples/sample-data/penguins.csv +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/examples/sample-data/seaice.csv +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/examples/sample-data/sensor_log_eu.csv +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/examples/sample-data/stocks.csv +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/examples/sample-data/tips.csv +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/examples/sample-data/weather.xlsx +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/scripts/build_sample_data.py +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/scripts/check_denylist.py +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/__init__.py +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/__main__.py +0 -0
- {forgegraph-0.2.0/src/forgegraph/catalog → forgegraph-0.3.0/src/forgegraph/catalog_build}/__init__.py +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/drawing/__init__.py +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/drawing/markup.py +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/drawing/page.py +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/fonts/IBMPlexSerif-Bold.ttf +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/fonts/IBMPlexSerif-Light.ttf +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/fonts/IBMPlexSerif-Medium.ttf +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/fonts/IBMPlexSerif-Regular.ttf +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/fonts/IBMPlexSerif-SemiBold.ttf +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/fonts/OFL-IBMPlexSerif.txt +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/fonts/OFL-Roboto.txt +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/fonts/OFL-SourceSans3.md +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/fonts/Roboto-Bold.ttf +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/fonts/Roboto-Italic.ttf +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/fonts/Roboto-Light.ttf +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/fonts/Roboto-Medium.ttf +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/fonts/Roboto-Regular.ttf +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/fonts/Roboto-SemiBold.ttf +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/fonts/SourceSans3-Bold.ttf +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/fonts/SourceSans3-It.ttf +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/fonts/SourceSans3-Light.ttf +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/fonts/SourceSans3-Medium.ttf +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/fonts/SourceSans3-Regular.ttf +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/fonts/SourceSans3-Semibold.ttf +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/layers/error_bar.yaml +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/packs/forgegraph_base/formats/base_layout_format.yaml +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/packs/forgegraph_base/graphspecs/dated.parquet +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/packs/forgegraph_base/graphspecs/fanned.parquet +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/packs/forgegraph_base/graphspecs/polarization.parquet +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/packs/forgegraph_base/graphspecs/reinforced.parquet +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/packs/forgegraph_base_2/formats/compact_format.yaml +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/packs/forgegraph_base_2/graphspecs/dated.parquet +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/packs/forgegraph_base_2/graphspecs/fanned.parquet +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/packs/forgegraph_base_2/graphspecs/polarization.parquet +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/packs/forgegraph_base_2/graphspecs/reinforced.parquet +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/skill/forgegraph/examples/bars.yaml +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/skill/forgegraph/examples/figure.layout.yaml +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/skill/forgegraph/examples/xy.parquet +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/skill/forgegraph/references/requests.md +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/src/forgegraph/skill/forgegraph/references/themes_formats_configs.md +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/tests/baselines/flow_sweep_wide.png +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/tests/baselines/fuel_by_size.png +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/tests/baselines/polarization.png +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/tests/baselines/polarization_narrow.png +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/tests/baselines/precipitation_loglog.png +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/tests/baselines/replicates.png +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/tests/baselines/screening_scatter.png +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/tests/baselines/separator_colorbar.png +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/tests/fixtures/catalog_comments.html +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/tests/test_denylist.py +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/tests/test_key_position.py +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/tests/test_markup.py +0 -0
- {forgegraph-0.2.0 → forgegraph-0.3.0}/tests/test_spec_mirrors.py +0 -0
|
@@ -5,12 +5,12 @@ repos:
|
|
|
5
5
|
- id: check-yaml
|
|
6
6
|
- id: check-toml
|
|
7
7
|
- id: end-of-file-fixer
|
|
8
|
-
exclude: \.md$|^(review|catalog)/
|
|
8
|
+
exclude: \.md$|^(review|catalog|docs/visual-changelog)/
|
|
9
9
|
- id: trailing-whitespace
|
|
10
|
-
exclude: \.md$|^(review|catalog)/
|
|
10
|
+
exclude: \.md$|^(review|catalog|docs/visual-changelog)/
|
|
11
11
|
- id: check-added-large-files
|
|
12
12
|
args: [--maxkb=600]
|
|
13
|
-
exclude: ^(review|catalog)/ # self-contained HTML pages embed
|
|
13
|
+
exclude: ^(review|catalog|docs/visual-changelog)/ # self-contained HTML pages embed images
|
|
14
14
|
- repo: https://github.com/astral-sh/ruff-pre-commit
|
|
15
15
|
rev: v0.17.1
|
|
16
16
|
hooks:
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
ForgeGraph follows [semantic versioning](https://semver.org). Before 1.0, a minor version may change how graphs look or how specs are written. From 0.2.0 on, each release's entry links its visual changelog: before and after images of every catalog card and regression graph that changed, made with `scripts/visual_changelog.py`.
|
|
4
|
+
|
|
5
|
+
## 0.3.0 (2026-10-25)
|
|
6
|
+
|
|
7
|
+
Images that changed: the [visual changelog](docs/visual-changelog/0.3.0.html).
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
- `fg.blank` takes `registry=`, as `fg.render` does, and a blank canvas's `save` path is optional, as a graph's is: with none, it saves `canvas.png` and the format's other file types.
|
|
12
|
+
|
|
13
|
+
### Changed
|
|
14
|
+
|
|
15
|
+
- **Breaking for existing specs:** parameters follow one naming system. `_` joins words that name one thing (`error_bar`, `plot_area`), `.` goes from a thing to its parts and properties (`line.width`), an on/off switch is the thing's `.show`, and nothing is abbreviated. A spec still using an old name is an error that suggests the new one; an old name that's now a category, such as `encoding.color`, suggests that category's parameters. The Python API's keyword arguments (`fg.xy`'s `color=`, `line_style=`, `marker_shape=`, `marker_fill=`, `detail=`) are unchanged and set the new paths. Graphs draw the same as before. The renames, old → new:
|
|
16
|
+
1. `grid.line_style` → `grid.line.style`; `grid.line_width` → `grid.line.width`
|
|
17
|
+
2. `plot_area.line_color` → `plot_area.line.color`; `plot_area.line_width` → `plot_area.line.width`
|
|
18
|
+
3. `layer.error_bar.line_width` → `layer.error_bar.line.width`; `layer.error_bar.cap_size` → `layer.error_bar.cap.width`
|
|
19
|
+
4. `layer.reference_line.line_style` → `layer.reference_line.line.style`; `layer.reference_line.line_width` → `layer.reference_line.line.width`
|
|
20
|
+
5. `series.marker.edge_color`, `series.marker.edge_width` → `series.marker.edge.color`, `series.marker.edge.width`, and the same in `series.bar`, `series.benchmark.marker` and `series.benchmark.bar`
|
|
21
|
+
6. `legend.key.frame_width` → `legend.key.frame.width`
|
|
22
|
+
7. `legend.key.sample.marker_size` → `legend.key.sample.marker.size`
|
|
23
|
+
8. `legend.key.frame` → `legend.key.frame.show`
|
|
24
|
+
9. `series.value_label.total` → `series.value_label.total.show`
|
|
25
|
+
10. `axis.tick.minor.num` → `axis.tick.minor.count`
|
|
26
|
+
11. `encoding.color` → `encoding.color.column`; `encoding.color_type` → `encoding.color.type`; `encoding.line_style` → `encoding.line.style.column`; `encoding.marker_shape` → `encoding.marker.shape.column`; `encoding.marker_fill` → `encoding.marker.fill.column`; `encoding.detail` → `encoding.detail.column` (`encoding.order` is unchanged)
|
|
27
|
+
12. Layouts: `separators.line.border` → `separators.border.show`
|
|
28
|
+
13. Schedules: `freshness.stamp` → `freshness.stamp.show`; `cadence.interval` → `cadence.interval.count`; `cadence.interval_unit` → `cadence.interval.unit`
|
|
29
|
+
- **Breaking for packs' catalog files:** a catalog's cards are chosen by a rule, not by hand. Every parameter gets one card, its value taken from its range and the baseline's data, drawn on the first baseline where it changes the drawing; the page shows the variable parameters' cards. A catalog file lists only its baselines, and a layer's settings: `variations`, `no_card` and the `{value, from, with}` forms are gone. A pack's catalog page draws with the pack's own theme and format values.
|
|
30
|
+
- Drawing and saving are about 3.7 times faster. Graphs and their files are the same as before.
|
|
31
|
+
- A pack's fonts are registered when a file drawn uses one of its specs, not whenever a config lists the pack.
|
|
32
|
+
- `forgegraph --help` gives each command a one-sentence summary, and `forgegraph catalog --help` names every kind it lists.
|
|
33
|
+
- The internal package `forgegraph.catalog` is `forgegraph.catalog_build`. The API is unchanged.
|
|
34
|
+
- One name is one pack. A config can't give a built-in pack's name, or a name the main config already gives, to another folder. Before, a folder config's copy of a pack replaced the one the main config lists, and what it drew wasn't marked non-standard.
|
|
35
|
+
- ForgeGraph needs matplotlib 3.11.2 and typer 0.15.4 or later; earlier versions installed but didn't work.
|
|
36
|
+
- The package's description and classifiers say what it is now: released, in alpha.
|
|
37
|
+
|
|
38
|
+
### Fixed
|
|
39
|
+
|
|
40
|
+
- Error bars on a date axis stand on their points, and error bars of aggregated rows on a date axis draw.
|
|
41
|
+
- Times with a time zone are drawn at the times their clocks show. Before, they raised an error.
|
|
42
|
+
- A reference line at a column's sum or standard deviation counts each row once when several y columns are drawn.
|
|
43
|
+
- Value labels written with format auto use the value axis's tick label format when it's set, as reference lines do.
|
|
44
|
+
- The catalog's record of what it was built from covers every module it draws with, so a change to the drawing code marks the catalog out of date.
|
|
45
|
+
- The package's metadata lists the bundled fonts' licences.
|
|
46
|
+
- A GraphSpec naming a list as its theme, format or graph type gets the error "must be a single value", not a crash.
|
|
47
|
+
- A config naming a pack that can't be found, or another pack problem, stops `catalog`, `pack-notes`, `schema` and `explain` with its problems listed (`error:` lines, exit 1), not a traceback; with `--json`, one problem each, not one joined line.
|
|
48
|
+
|
|
49
|
+
## 0.2.0 (2026-10-24)
|
|
50
|
+
|
|
51
|
+
Images that changed: the [visual changelog](docs/visual-changelog/0.2.0.html).
|
|
52
|
+
|
|
53
|
+
### Changed
|
|
54
|
+
|
|
55
|
+
- Error bars are black by default in both built-in themes, and their color (`layer.error_bar.color`) is a variable parameter: a GraphSpec may set `series` or any hex color.
|
|
56
|
+
- Three internal modules are renamed so none shares a name with the API: `forgegraph.render` is `forgegraph.drawing`, `forgegraph.layout` is `forgegraph.layouts` and `forgegraph.blank` is `forgegraph.canvas`. `import forgegraph.layouts as m` now gives the module, not `fg.layout`. The API is unchanged.
|
|
57
|
+
|
|
58
|
+
### Fixed
|
|
59
|
+
|
|
60
|
+
- `forgegraph --version` and `--help` no longer load matplotlib and pandas, so they answer at once, even on a new install. The API loads on first use.
|
|
61
|
+
- The README and the skill's reference say when the main config is written: the first time a command reads the configs, such as `catalog` or `render`.
|
|
62
|
+
- Error bars on side-by-side bars (`series.offset: side_by_side`) are drawn on their own bars. Before, every series but the middle one had its error bars drawn where they were first placed, before layout, usually off the axes.
|
|
63
|
+
|
|
64
|
+
## 0.1.0 (2026-10-24)
|
|
65
|
+
|
|
66
|
+
The first public release.
|
|
67
|
+
|
|
68
|
+
### Added
|
|
69
|
+
|
|
70
|
+
- **GraphSpecs:** a graph described in YAML or as a Python dict, drawn with `forgegraph render` or `fg.render`; `fg.xy` draws straight from a DataFrame.
|
|
71
|
+
- **The `xy` graph type:**
|
|
72
|
+
- lines, markers and bars: grouped, stacked, 100 % stacked and horizontal;
|
|
73
|
+
- dates and log axes, value labels, a benchmark series;
|
|
74
|
+
- series named beside their lines or in a key.
|
|
75
|
+
- **Layers:** reference lines, notes and error bars, from the data or given.
|
|
76
|
+
- **Themes and formats:** a theme fixes what must stay the same and gives defaults for the rest; a format sets size, base font size, file types and resolution.
|
|
77
|
+
- **Packs and configs:**
|
|
78
|
+
- every named spec comes from a pack, named `pack/name`; ForgeGraph's own is `forgegraph_base`, and `forgegraph_base_2` is a second look in this repository;
|
|
79
|
+
- the main config (written on first use, or named by `FORGEGRAPH_CONFIG`) and folder configs (`forgegraph.toml`) say which packs may be used;
|
|
80
|
+
- a pack only a folder config lists is non-standard: it works, and what's drawn with it is watermarked.
|
|
81
|
+
- **Lint on every render:** overlapping or clipped text, a key covering data, fonts too small for the format, missing fonts, dropped rows and more.
|
|
82
|
+
- **Provenance:** every saved file (PNG, JPEG, TIFF, SVG, PDF and HTML) records its GraphSpec and the specs it was drawn with, at the format's provenance level; `forgegraph load` reads it back.
|
|
83
|
+
- **Layouts:** several GraphSpecs in one figure, with spanning tiles, blank cells and set widths; tabs, and HTML dashboards.
|
|
84
|
+
- **Scheduled renders:** schedule files, `forgegraph job run`, a status file, `on_failure` and `on_success` hooks, a "data as of" footnote and a stale banner.
|
|
85
|
+
- **The themed canvas:** `forgegraph.blank(theme, format)` for what no graph type can draw, always watermarked as non-standard.
|
|
86
|
+
- **The agent skill** for Claude Code, installed with `forgegraph skill install`, with reference notes for themes, formats and configs, and for filing requests.
|
|
87
|
+
- **Commands:** `render`, `explain`, `catalog`, `schema`, `pack-notes`, `load`, `job run` and `skill install`, each with `--json`.
|
|
88
|
+
- **Catalogs:** a page for each pack in this repository, with a card for every parameter.
|
|
89
|
+
|
|
90
|
+
## 0.0.1 (2026-10-17)
|
|
91
|
+
|
|
92
|
+
The name, reserved on PyPI. No functionality.
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# Contributing
|
|
2
|
+
|
|
3
|
+
Contributions are welcome. For a bug or a feature request, open an [issue](https://github.com/sskaye/forgegraph/issues). For a change, open a pull request with tests, after running the checks below.
|
|
4
|
+
|
|
5
|
+
## Development setup
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
uv sync
|
|
9
|
+
uv run pre-commit install
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
While you work, `uv run pytest` runs the development suite: every test not marked slow, in parallel. The full suite adds the slow ones (every catalog card drawn, the image baselines, the catalog pages, and any test over a second). CI runs it on every pull request, and it's the one to run before a release:
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
uv run pytest --full && uv run ruff check . && uv run ruff format --check && uv run pyright
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
Mark a new test `@pytest.mark.slow` if it takes over a second (`uv run pytest --durations=20` lists the slowest).
|
|
19
|
+
|
|
20
|
+
## After changing a definition or how graphs are drawn
|
|
21
|
+
|
|
22
|
+
Every parameter gets one catalog card, its value and baseline chosen by a rule (`src/forgegraph/catalog_build/cards.py`), so a new parameter needs no card of its own; the page shows the variable parameters' cards, and the perturbation test draws them all. It needs a baseline that shows it only if none does: the build (for a variable parameter) or the perturbation test (for any) names a parameter that changes no baseline's drawing, and the fix is a generic scenario added to the baselines in the matching catalog file under `src/forgegraph/catalogs/` (or a pack's `catalogs/`).
|
|
23
|
+
|
|
24
|
+
Rebuild the catalogs (it keeps its review comments; Node 18+ is needed once it has some), and the image baselines if graphs look different on purpose:
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
uv run forgegraph catalog build
|
|
28
|
+
uv run forgegraph catalog build --pack forgegraph_base_2
|
|
29
|
+
uv run python scripts/mirror_specs.py
|
|
30
|
+
uv run python scripts/build_recreations.py --baselines
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
`uv run python scripts/visual_changelog.py main` then shows every image that changed.
|
|
34
|
+
|
|
35
|
+
## Requesting a graph type
|
|
36
|
+
|
|
37
|
+
Open a GitHub issue describing the graph you need, ideally with an example image or sketch and a little sample data. No code is needed.
|
|
38
|
+
|
|
39
|
+
## Releasing
|
|
40
|
+
|
|
41
|
+
1. Set the new version in pyproject.toml and in each built-in pack's pack.yaml.
|
|
42
|
+
2. Rebuild the catalogs and mirrors (above).
|
|
43
|
+
3. Write the visual changelog, `uv run python scripts/visual_changelog.py v<last version>`, and the CHANGELOG entry, linking it.
|
|
44
|
+
4. Merge with CI green, and tag the merge commit `v<version>`.
|
|
45
|
+
5. Run the Publish workflow.
|
|
@@ -1,6 +1,36 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: forgegraph
|
|
3
|
+
Version: 0.3.0
|
|
4
|
+
Summary: Fast, consistent, publication-quality graphs from pandas DataFrames, usable by people and AI agents.
|
|
5
|
+
Project-URL: Repository, https://github.com/sskaye/forgegraph
|
|
6
|
+
Project-URL: Issues, https://github.com/sskaye/forgegraph/issues
|
|
7
|
+
Project-URL: Changelog, https://github.com/sskaye/forgegraph/blob/main/CHANGELOG.md
|
|
8
|
+
Author: Steven Kaye
|
|
9
|
+
License-Expression: MIT AND OFL-1.1
|
|
10
|
+
License-File: LICENSE
|
|
11
|
+
License-File: src/forgegraph/fonts/OFL-IBMPlexSerif.txt
|
|
12
|
+
License-File: src/forgegraph/fonts/OFL-Roboto.txt
|
|
13
|
+
License-File: src/forgegraph/fonts/OFL-SourceSans3.md
|
|
14
|
+
Classifier: Development Status :: 3 - Alpha
|
|
15
|
+
Classifier: Intended Audience :: Science/Research
|
|
16
|
+
Classifier: Programming Language :: Python :: 3
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
20
|
+
Classifier: Topic :: Scientific/Engineering :: Visualization
|
|
21
|
+
Requires-Python: >=3.12
|
|
22
|
+
Requires-Dist: matplotlib>=3.11.2
|
|
23
|
+
Requires-Dist: packaging>=23
|
|
24
|
+
Requires-Dist: pandas>=2.2
|
|
25
|
+
Requires-Dist: pyarrow>=17
|
|
26
|
+
Requires-Dist: pydantic>=2.7
|
|
27
|
+
Requires-Dist: ruamel-yaml>=0.18
|
|
28
|
+
Requires-Dist: typer>=0.15.4
|
|
29
|
+
Description-Content-Type: text/markdown
|
|
30
|
+
|
|
1
31
|
# ForgeGraph
|
|
2
32
|
|
|
3
|
-
Fast, consistent, publication-quality graphs from pandas DataFrames,
|
|
33
|
+
Fast, consistent, publication-quality graphs from pandas DataFrames, usable by people and AI agents.
|
|
4
34
|
|
|
5
35
|
You describe a graph in a **GraphSpec**. ForgeGraph draws it in a house style set by a **theme** and a **format**. It checks what it drew, and records how the graph was made inside the saved file. An agent skill lets agents make and revise graphs the same way.
|
|
6
36
|
|
|
@@ -18,7 +48,7 @@ You describe a graph in a **GraphSpec**. ForgeGraph draws it in a house style se
|
|
|
18
48
|
- **Configs:** control which packs may be used, per user or folder. Used to enforce use of style pack(s) and watermark non-standard graphs.
|
|
19
49
|
- **Lint:** Graphs are linted on rendering, with warnings for issues including overlapping or clipped text, a key covering data, or fonts too small.
|
|
20
50
|
|
|
21
|
-
**Status:** 0.x. `xy` graph type (lines, markers, & bars), reference lines, error bars, and notes layers, initial style packs. More graph types
|
|
51
|
+
**Status:** 0.x. `xy` graph type (lines, markers, & bars), reference lines, error bars, and notes layers, initial style packs. More graph types are planned. If there’s specific ones you want, [open an issue](https://github.com/sskaye/forgegraph/issues).
|
|
22
52
|
|
|
23
53
|
## Install
|
|
24
54
|
|
|
@@ -59,6 +89,16 @@ g = fg.xy(runs, x="hours", y="voltage", color="cell", title="Cell voltage")
|
|
|
59
89
|
g.save("voltage") # voltage.png, with its GraphSpec inside
|
|
60
90
|
```
|
|
61
91
|
|
|
92
|
+
The Python API (each function has a docstring):
|
|
93
|
+
|
|
94
|
+
- `fg.xy(df, x, y, ...)`: draw y against x from a DataFrame.
|
|
95
|
+
- `fg.render(spec, data=None)`: draw a GraphSpec, given as a file or a document.
|
|
96
|
+
- `fg.graphspec(name, graph_type, ...)`: write a GraphSpec document.
|
|
97
|
+
- `fg.layout(spec, data=None)`: draw a layout.
|
|
98
|
+
- `fg.load(path)`: a saved graph's record; its GraphSpec is under `"graphspec"`.
|
|
99
|
+
- `fg.blank(theme, format)`: a themed canvas for drawing with matplotlib what no graph type can; what's drawn on it is watermarked.
|
|
100
|
+
- A `Graph` has `.save(path)`, `.figure` and `.axes` (matplotlib's), `.issues` (the lint) and `.check()`.
|
|
101
|
+
|
|
62
102
|
From the command line, with the DataFrame saved as runs.parquet and a GraphSpec, voltage.yaml:
|
|
63
103
|
|
|
64
104
|
```yaml
|
|
@@ -85,7 +125,8 @@ variable_parameters:
|
|
|
85
125
|
data:
|
|
86
126
|
column: voltage
|
|
87
127
|
encoding:
|
|
88
|
-
color:
|
|
128
|
+
color:
|
|
129
|
+
column: cell
|
|
89
130
|
```
|
|
90
131
|
|
|
91
132
|
```bash
|
|
@@ -102,11 +143,15 @@ A **config** lists the packs that may be used:
|
|
|
102
143
|
- A folder config, `forgegraph.toml`, applies to the files in its folder and every folder below it. A file may use only the packs it lists.
|
|
103
144
|
- A pack that a folder config lists but the main config doesn't still works, but it's non-standard: graphs drawn with it are watermarked, and ForgeGraph's commands say so. That way you can make and try a pack without changing an organization's main config.
|
|
104
145
|
|
|
146
|
+
To write a pack, start from the example pack in [examples/packs/acme](https://github.com/sskaye/forgegraph/blob/main/examples/packs/acme); `forgegraph schema theme`, `format`, `pack` and `config` list every parameter.
|
|
147
|
+
|
|
148
|
+
On macOS, a scheduled render that writes into a cloud-synced folder needs Full Disk Access.
|
|
149
|
+
|
|
105
150
|
## Commands
|
|
106
151
|
|
|
107
152
|
- `forgegraph render <graphspec or layout>`: draw and save, and report lint.
|
|
108
153
|
- `forgegraph explain <graphspec or layout>`: every value it's drawn with, and which file set it.
|
|
109
|
-
- `forgegraph catalog`: the packs, graph types, layer types, themes, formats and reference notes available here.
|
|
154
|
+
- `forgegraph catalog`: the packs, graph types, layer types, themes, formats, GraphSpecs, layouts, schedules and reference notes available here.
|
|
110
155
|
- `forgegraph schema graphspec --graph-type <type> --theme <theme> --format <format>`: every parameter a GraphSpec can set.
|
|
111
156
|
- `forgegraph schema <kind>`: every parameter of a theme, format, layer, layout, schedule, pack or config.
|
|
112
157
|
- `forgegraph pack-notes`: the reference notes of the packs available here.
|
|
@@ -118,48 +163,41 @@ Every command takes `--help`, and `--json` for agents.
|
|
|
118
163
|
|
|
119
164
|
## Catalogs
|
|
120
165
|
|
|
121
|
-
Each pack in this repository has a catalog: a page with a card for each parameter, showing what changing it does.
|
|
166
|
+
Each pack in this repository has a catalog: a page with a card for each parameter, showing what changing it does. Download a page and open it in a browser.
|
|
122
167
|
|
|
123
|
-
- forgegraph_base: ForgeGraph's own pack, with its graph types and layer types.
|
|
124
|
-
- forgegraph_base_2: its own theme and format, and the same graph types and layer types drawn in them.
|
|
168
|
+
- [forgegraph_base](https://github.com/sskaye/forgegraph/blob/main/catalog/forgegraph_base.html): ForgeGraph's own pack, with its graph types and layer types.
|
|
169
|
+
- [forgegraph_base_2](https://github.com/sskaye/forgegraph/blob/main/catalog/forgegraph_base_2.html): its own theme and format, and the same graph types and layer types drawn in them.
|
|
125
170
|
|
|
126
171
|
## Your graphs are yours
|
|
127
172
|
|
|
128
|
-
ForgeGraph is [MIT-licensed](LICENSE). Graphs and other output you make with it are yours: no attribution or licence terms apply to them. See TRADEMARKS.md for use of the name.
|
|
173
|
+
ForgeGraph is [MIT-licensed](https://github.com/sskaye/forgegraph/blob/main/LICENSE). Graphs and other output you make with it are yours: no attribution or licence terms apply to them. See [TRADEMARKS.md](https://github.com/sskaye/forgegraph/blob/main/TRADEMARKS.md) for use of the name.
|
|
129
174
|
|
|
130
175
|
## Documentation
|
|
131
176
|
|
|
132
|
-
-
|
|
133
|
-
-
|
|
134
|
-
-
|
|
135
|
-
- [
|
|
136
|
-
-
|
|
177
|
+
- [Specifications](https://github.com/sskaye/forgegraph/blob/main/docs/specs): every spec, a folder per kind.
|
|
178
|
+
- [Changelog](https://github.com/sskaye/forgegraph/blob/main/CHANGELOG.md).
|
|
179
|
+
- [Contributing](https://github.com/sskaye/forgegraph/blob/main/CONTRIBUTING.md): working on ForgeGraph itself.
|
|
180
|
+
- Design record, in [docs/design](https://github.com/sskaye/forgegraph/blob/main/docs/design):
|
|
181
|
+
- [Architecture](https://github.com/sskaye/forgegraph/blob/main/docs/design/architecture.md): how ForgeGraph is designed, and why.
|
|
182
|
+
- [To do](https://github.com/sskaye/forgegraph/blob/main/docs/design/todo.md): what's still planned.
|
|
137
183
|
|
|
138
184
|
## Contributing
|
|
139
185
|
|
|
140
|
-
Feature requests and bug reports go to [GitHub issues](https://github.com/sskaye/forgegraph/issues); the skill can file them for you. CONTRIBUTING.md covers working on ForgeGraph itself
|
|
141
|
-
|
|
142
|
-
```bash
|
|
143
|
-
uv sync && uv run pre-commit install
|
|
144
|
-
```
|
|
145
|
-
|
|
146
|
-
```bash
|
|
147
|
-
uv run pytest --full && uv run ruff check . && uv run pyright
|
|
148
|
-
```
|
|
186
|
+
Feature requests and bug reports go to [GitHub issues](https://github.com/sskaye/forgegraph/issues); the skill can file them for you. [CONTRIBUTING.md](https://github.com/sskaye/forgegraph/blob/main/CONTRIBUTING.md) covers working on ForgeGraph itself: setup, the checks to run, and regenerating the catalogs.
|
|
149
187
|
|
|
150
188
|
## Repository map
|
|
151
189
|
|
|
152
190
|
- **src/forgegraph/**: the package.
|
|
153
|
-
- `graph.py`: the Python API (`fg.xy`, `fg.render`, `fg.graphspec`, `fg.load`) and the `Graph` object; `canvas.py`: the themed canvas.
|
|
191
|
+
- `graph.py`: the Python API (`fg.xy`, `fg.render`, `fg.graphspec`, `fg.load`) and the `Graph` object; `canvas.py`: `fg.blank`, the themed canvas; `drawn.py`: what they and layouts share once drawn; `data.py`: reading a GraphSpec's data.
|
|
154
192
|
- **cli/**: the `forgegraph` command.
|
|
155
193
|
- **spec/**: reading, checking and resolving specs, and the provenance record.
|
|
156
|
-
- **drawing/**: drawing, layout and lint. **layouts/**: layouts. **jobs/**: scheduled renders.
|
|
194
|
+
- **drawing/**: drawing, layout and lint. **layouts/**: `fg.layout` and layouts. **jobs/**: scheduled renders.
|
|
157
195
|
- **packs/**: packs and configs, and the built-in packs `forgegraph_base` and `forgegraph_base_2`. **fonts/**: bundled fonts and their licences.
|
|
158
|
-
- **graph_types/**, **layers/**: the graph type and layer type definitions. **
|
|
159
|
-
- **skill/forgegraph/**: the agent skill.
|
|
196
|
+
- **graph_types/**, **layers/**: the graph type and layer type definitions. **catalog_build/**: the catalog builder. **catalogs/**: each definition's catalog file.
|
|
197
|
+
- **skill/forgegraph/**: the agent skill. `forgemark.py`: Forgemark's review-comment format, and its pinned tool.
|
|
160
198
|
- **catalog/**: the generated catalog pages.
|
|
161
|
-
- **examples/**: sample data
|
|
199
|
+
- **examples/**: sample data; `packs/acme`, an example pack in a deliberately different style; and `layouts/`, a paper figure and a dashboard.
|
|
162
200
|
- **evals/skill/**: the skill's eval cases, run by `scripts/run_skill_evals.py`.
|
|
163
201
|
- **tests/**, **scripts/**: tests, and build and maintenance scripts.
|
|
164
|
-
- **docs/**: the
|
|
202
|
+
- **docs/**: the specifications, the design record and the visual changelogs. **review/**: each build phase's review pages.
|
|
165
203
|
|
|
@@ -1,31 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.5
|
|
2
|
-
Name: forgegraph
|
|
3
|
-
Version: 0.2.0
|
|
4
|
-
Summary: Consistent, high-quality graphs from pandas DataFrames, for people and AI agents. Early development.
|
|
5
|
-
Project-URL: Repository, https://github.com/sskaye/forgegraph
|
|
6
|
-
Author: Steven Kaye
|
|
7
|
-
License-Expression: MIT
|
|
8
|
-
License-File: LICENSE
|
|
9
|
-
Classifier: Development Status :: 1 - Planning
|
|
10
|
-
Classifier: Intended Audience :: Science/Research
|
|
11
|
-
Classifier: Programming Language :: Python :: 3
|
|
12
|
-
Classifier: Programming Language :: Python :: 3.12
|
|
13
|
-
Classifier: Programming Language :: Python :: 3.13
|
|
14
|
-
Classifier: Programming Language :: Python :: 3.14
|
|
15
|
-
Classifier: Topic :: Scientific/Engineering :: Visualization
|
|
16
|
-
Requires-Python: >=3.12
|
|
17
|
-
Requires-Dist: matplotlib>=3.9
|
|
18
|
-
Requires-Dist: packaging>=23
|
|
19
|
-
Requires-Dist: pandas>=2.2
|
|
20
|
-
Requires-Dist: pyarrow>=17
|
|
21
|
-
Requires-Dist: pydantic>=2.7
|
|
22
|
-
Requires-Dist: ruamel-yaml>=0.18
|
|
23
|
-
Requires-Dist: typer>=0.12
|
|
24
|
-
Description-Content-Type: text/markdown
|
|
25
|
-
|
|
26
1
|
# ForgeGraph
|
|
27
2
|
|
|
28
|
-
Fast, consistent, publication-quality graphs from pandas DataFrames,
|
|
3
|
+
Fast, consistent, publication-quality graphs from pandas DataFrames, usable by people and AI agents.
|
|
29
4
|
|
|
30
5
|
You describe a graph in a **GraphSpec**. ForgeGraph draws it in a house style set by a **theme** and a **format**. It checks what it drew, and records how the graph was made inside the saved file. An agent skill lets agents make and revise graphs the same way.
|
|
31
6
|
|
|
@@ -43,7 +18,7 @@ You describe a graph in a **GraphSpec**. ForgeGraph draws it in a house style se
|
|
|
43
18
|
- **Configs:** control which packs may be used, per user or folder. Used to enforce use of style pack(s) and watermark non-standard graphs.
|
|
44
19
|
- **Lint:** Graphs are linted on rendering, with warnings for issues including overlapping or clipped text, a key covering data, or fonts too small.
|
|
45
20
|
|
|
46
|
-
**Status:** 0.x. `xy` graph type (lines, markers, & bars), reference lines, error bars, and notes layers, initial style packs. More graph types
|
|
21
|
+
**Status:** 0.x. `xy` graph type (lines, markers, & bars), reference lines, error bars, and notes layers, initial style packs. More graph types are planned. If there’s specific ones you want, [open an issue](https://github.com/sskaye/forgegraph/issues).
|
|
47
22
|
|
|
48
23
|
## Install
|
|
49
24
|
|
|
@@ -84,6 +59,16 @@ g = fg.xy(runs, x="hours", y="voltage", color="cell", title="Cell voltage")
|
|
|
84
59
|
g.save("voltage") # voltage.png, with its GraphSpec inside
|
|
85
60
|
```
|
|
86
61
|
|
|
62
|
+
The Python API (each function has a docstring):
|
|
63
|
+
|
|
64
|
+
- `fg.xy(df, x, y, ...)`: draw y against x from a DataFrame.
|
|
65
|
+
- `fg.render(spec, data=None)`: draw a GraphSpec, given as a file or a document.
|
|
66
|
+
- `fg.graphspec(name, graph_type, ...)`: write a GraphSpec document.
|
|
67
|
+
- `fg.layout(spec, data=None)`: draw a layout.
|
|
68
|
+
- `fg.load(path)`: a saved graph's record; its GraphSpec is under `"graphspec"`.
|
|
69
|
+
- `fg.blank(theme, format)`: a themed canvas for drawing with matplotlib what no graph type can; what's drawn on it is watermarked.
|
|
70
|
+
- A `Graph` has `.save(path)`, `.figure` and `.axes` (matplotlib's), `.issues` (the lint) and `.check()`.
|
|
71
|
+
|
|
87
72
|
From the command line, with the DataFrame saved as runs.parquet and a GraphSpec, voltage.yaml:
|
|
88
73
|
|
|
89
74
|
```yaml
|
|
@@ -110,7 +95,8 @@ variable_parameters:
|
|
|
110
95
|
data:
|
|
111
96
|
column: voltage
|
|
112
97
|
encoding:
|
|
113
|
-
color:
|
|
98
|
+
color:
|
|
99
|
+
column: cell
|
|
114
100
|
```
|
|
115
101
|
|
|
116
102
|
```bash
|
|
@@ -127,11 +113,15 @@ A **config** lists the packs that may be used:
|
|
|
127
113
|
- A folder config, `forgegraph.toml`, applies to the files in its folder and every folder below it. A file may use only the packs it lists.
|
|
128
114
|
- A pack that a folder config lists but the main config doesn't still works, but it's non-standard: graphs drawn with it are watermarked, and ForgeGraph's commands say so. That way you can make and try a pack without changing an organization's main config.
|
|
129
115
|
|
|
116
|
+
To write a pack, start from the example pack in [examples/packs/acme](https://github.com/sskaye/forgegraph/blob/main/examples/packs/acme); `forgegraph schema theme`, `format`, `pack` and `config` list every parameter.
|
|
117
|
+
|
|
118
|
+
On macOS, a scheduled render that writes into a cloud-synced folder needs Full Disk Access.
|
|
119
|
+
|
|
130
120
|
## Commands
|
|
131
121
|
|
|
132
122
|
- `forgegraph render <graphspec or layout>`: draw and save, and report lint.
|
|
133
123
|
- `forgegraph explain <graphspec or layout>`: every value it's drawn with, and which file set it.
|
|
134
|
-
- `forgegraph catalog`: the packs, graph types, layer types, themes, formats and reference notes available here.
|
|
124
|
+
- `forgegraph catalog`: the packs, graph types, layer types, themes, formats, GraphSpecs, layouts, schedules and reference notes available here.
|
|
135
125
|
- `forgegraph schema graphspec --graph-type <type> --theme <theme> --format <format>`: every parameter a GraphSpec can set.
|
|
136
126
|
- `forgegraph schema <kind>`: every parameter of a theme, format, layer, layout, schedule, pack or config.
|
|
137
127
|
- `forgegraph pack-notes`: the reference notes of the packs available here.
|
|
@@ -143,48 +133,41 @@ Every command takes `--help`, and `--json` for agents.
|
|
|
143
133
|
|
|
144
134
|
## Catalogs
|
|
145
135
|
|
|
146
|
-
Each pack in this repository has a catalog: a page with a card for each parameter, showing what changing it does.
|
|
136
|
+
Each pack in this repository has a catalog: a page with a card for each parameter, showing what changing it does. Download a page and open it in a browser.
|
|
147
137
|
|
|
148
|
-
- forgegraph_base: ForgeGraph's own pack, with its graph types and layer types.
|
|
149
|
-
- forgegraph_base_2: its own theme and format, and the same graph types and layer types drawn in them.
|
|
138
|
+
- [forgegraph_base](https://github.com/sskaye/forgegraph/blob/main/catalog/forgegraph_base.html): ForgeGraph's own pack, with its graph types and layer types.
|
|
139
|
+
- [forgegraph_base_2](https://github.com/sskaye/forgegraph/blob/main/catalog/forgegraph_base_2.html): its own theme and format, and the same graph types and layer types drawn in them.
|
|
150
140
|
|
|
151
141
|
## Your graphs are yours
|
|
152
142
|
|
|
153
|
-
ForgeGraph is [MIT-licensed](LICENSE). Graphs and other output you make with it are yours: no attribution or licence terms apply to them. See TRADEMARKS.md for use of the name.
|
|
143
|
+
ForgeGraph is [MIT-licensed](https://github.com/sskaye/forgegraph/blob/main/LICENSE). Graphs and other output you make with it are yours: no attribution or licence terms apply to them. See [TRADEMARKS.md](https://github.com/sskaye/forgegraph/blob/main/TRADEMARKS.md) for use of the name.
|
|
154
144
|
|
|
155
145
|
## Documentation
|
|
156
146
|
|
|
157
|
-
-
|
|
158
|
-
-
|
|
159
|
-
-
|
|
160
|
-
- [
|
|
161
|
-
-
|
|
147
|
+
- [Specifications](https://github.com/sskaye/forgegraph/blob/main/docs/specs): every spec, a folder per kind.
|
|
148
|
+
- [Changelog](https://github.com/sskaye/forgegraph/blob/main/CHANGELOG.md).
|
|
149
|
+
- [Contributing](https://github.com/sskaye/forgegraph/blob/main/CONTRIBUTING.md): working on ForgeGraph itself.
|
|
150
|
+
- Design record, in [docs/design](https://github.com/sskaye/forgegraph/blob/main/docs/design):
|
|
151
|
+
- [Architecture](https://github.com/sskaye/forgegraph/blob/main/docs/design/architecture.md): how ForgeGraph is designed, and why.
|
|
152
|
+
- [To do](https://github.com/sskaye/forgegraph/blob/main/docs/design/todo.md): what's still planned.
|
|
162
153
|
|
|
163
154
|
## Contributing
|
|
164
155
|
|
|
165
|
-
Feature requests and bug reports go to [GitHub issues](https://github.com/sskaye/forgegraph/issues); the skill can file them for you. CONTRIBUTING.md covers working on ForgeGraph itself
|
|
166
|
-
|
|
167
|
-
```bash
|
|
168
|
-
uv sync && uv run pre-commit install
|
|
169
|
-
```
|
|
170
|
-
|
|
171
|
-
```bash
|
|
172
|
-
uv run pytest --full && uv run ruff check . && uv run pyright
|
|
173
|
-
```
|
|
156
|
+
Feature requests and bug reports go to [GitHub issues](https://github.com/sskaye/forgegraph/issues); the skill can file them for you. [CONTRIBUTING.md](https://github.com/sskaye/forgegraph/blob/main/CONTRIBUTING.md) covers working on ForgeGraph itself: setup, the checks to run, and regenerating the catalogs.
|
|
174
157
|
|
|
175
158
|
## Repository map
|
|
176
159
|
|
|
177
160
|
- **src/forgegraph/**: the package.
|
|
178
|
-
- `graph.py`: the Python API (`fg.xy`, `fg.render`, `fg.graphspec`, `fg.load`) and the `Graph` object; `canvas.py`: the themed canvas.
|
|
161
|
+
- `graph.py`: the Python API (`fg.xy`, `fg.render`, `fg.graphspec`, `fg.load`) and the `Graph` object; `canvas.py`: `fg.blank`, the themed canvas; `drawn.py`: what they and layouts share once drawn; `data.py`: reading a GraphSpec's data.
|
|
179
162
|
- **cli/**: the `forgegraph` command.
|
|
180
163
|
- **spec/**: reading, checking and resolving specs, and the provenance record.
|
|
181
|
-
- **drawing/**: drawing, layout and lint. **layouts/**: layouts. **jobs/**: scheduled renders.
|
|
164
|
+
- **drawing/**: drawing, layout and lint. **layouts/**: `fg.layout` and layouts. **jobs/**: scheduled renders.
|
|
182
165
|
- **packs/**: packs and configs, and the built-in packs `forgegraph_base` and `forgegraph_base_2`. **fonts/**: bundled fonts and their licences.
|
|
183
|
-
- **graph_types/**, **layers/**: the graph type and layer type definitions. **
|
|
184
|
-
- **skill/forgegraph/**: the agent skill.
|
|
166
|
+
- **graph_types/**, **layers/**: the graph type and layer type definitions. **catalog_build/**: the catalog builder. **catalogs/**: each definition's catalog file.
|
|
167
|
+
- **skill/forgegraph/**: the agent skill. `forgemark.py`: Forgemark's review-comment format, and its pinned tool.
|
|
185
168
|
- **catalog/**: the generated catalog pages.
|
|
186
|
-
- **examples/**: sample data
|
|
169
|
+
- **examples/**: sample data; `packs/acme`, an example pack in a deliberately different style; and `layouts/`, a paper figure and a dashboard.
|
|
187
170
|
- **evals/skill/**: the skill's eval cases, run by `scripts/run_skill_evals.py`.
|
|
188
171
|
- **tests/**, **scripts/**: tests, and build and maintenance scripts.
|
|
189
|
-
- **docs/**: the
|
|
172
|
+
- **docs/**: the specifications, the design record and the visual changelogs. **review/**: each build phase's review pages.
|
|
190
173
|
|