forgegraph 0.4.0__tar.gz → 0.6.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.4.0 → forgegraph-0.6.0}/.gitignore +3 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/CHANGELOG.md +56 -28
- forgegraph-0.6.0/CITATION.cff +16 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/CONTRIBUTING.md +17 -5
- {forgegraph-0.4.0 → forgegraph-0.6.0}/PKG-INFO +10 -9
- {forgegraph-0.4.0 → forgegraph-0.6.0}/README.md +9 -8
- forgegraph-0.6.0/SECURITY.md +9 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/docs/design/architecture.md +41 -36
- {forgegraph-0.4.0 → forgegraph-0.6.0}/docs/packs/acme/layouts/dashboard.md +1 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/docs/packs/acme/pack.md +1 -1
- {forgegraph-0.4.0 → forgegraph-0.6.0}/docs/packs/acme/themes/acme.md +1 -1
- {forgegraph-0.4.0 → forgegraph-0.6.0}/docs/packs/forgegraph_default/formats/compact_format.md +2 -17
- {forgegraph-0.4.0 → forgegraph-0.6.0}/docs/packs/forgegraph_default/formats/wide_format.md +3 -32
- {forgegraph-0.4.0 → forgegraph-0.6.0}/docs/packs/forgegraph_default/graphspecs/graphspec_example.md +4 -4
- {forgegraph-0.4.0 → forgegraph-0.6.0}/docs/packs/forgegraph_default/layouts/layout.md +10 -3
- forgegraph-0.6.0/docs/packs/forgegraph_default/pack.md +9 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/docs/packs/forgegraph_default/schedules/schedule.md +1 -1
- {forgegraph-0.4.0 → forgegraph-0.6.0}/docs/packs/forgegraph_default/themes/light_theme.md +3 -3
- forgegraph-0.6.0/docs/site/get-started/installation.md +13 -0
- forgegraph-0.6.0/docs/site/get-started/quickstart.md +54 -0
- forgegraph-0.6.0/docs/site/get-started/skill.md +17 -0
- forgegraph-0.6.0/docs/site/index.md +46 -0
- forgegraph-0.6.0/docs/site/reference/python-api.md +77 -0
- forgegraph-0.6.0/docs/site/stylesheets/extra.css +83 -0
- forgegraph-0.6.0/docs/specifications/config.md +6 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/docs/specifications/format.md +1 -1
- {forgegraph-0.4.0 → forgegraph-0.6.0}/docs/specifications/graphspec_example.md +3 -3
- {forgegraph-0.4.0 → forgegraph-0.6.0}/docs/specifications/graphtype_xy.md +1 -1
- {forgegraph-0.4.0 → forgegraph-0.6.0}/docs/specifications/layer_error_bar.md +3 -3
- {forgegraph-0.4.0 → forgegraph-0.6.0}/docs/specifications/layer_reference.md +3 -32
- {forgegraph-0.4.0 → forgegraph-0.6.0}/docs/specifications/layout_example.md +5 -2
- forgegraph-0.6.0/docs/specifications/pack.md +9 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/docs/specifications/provenance.md +2 -2
- {forgegraph-0.4.0 → forgegraph-0.6.0}/docs/specifications/schedule.md +1 -1
- {forgegraph-0.4.0 → forgegraph-0.6.0}/docs/specifications/theme.md +8 -2
- {forgegraph-0.4.0 → forgegraph-0.6.0}/examples/layouts/dashboard/lab_throughput.layout.md +1 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/examples/layouts/dashboard/ops/formats/dashboard.md +1 -1
- {forgegraph-0.4.0 → forgegraph-0.6.0}/examples/layouts/dashboard/ops/formats/dashboard.yaml +1 -1
- {forgegraph-0.4.0 → forgegraph-0.6.0}/examples/layouts/paper/journal/formats/journal-double.md +1 -1
- {forgegraph-0.4.0 → forgegraph-0.6.0}/examples/layouts/paper/journal/formats/journal-double.yaml +1 -1
- {forgegraph-0.4.0 → forgegraph-0.6.0}/examples/packs/acme/pack.yaml +1 -1
- {forgegraph-0.4.0 → forgegraph-0.6.0}/examples/packs/acme/themes/acme.yaml +1 -1
- forgegraph-0.6.0/mkdocs.yml +67 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/pyproject.toml +6 -1
- forgegraph-0.6.0/scripts/docs_site.py +227 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/cli/schema.py +10 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/drawing/axes.py +8 -7
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/drawing/layers.py +48 -9
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/drawing/markup.py +17 -0
- forgegraph-0.6.0/src/forgegraph/drawing/page.py +650 -0
- forgegraph-0.6.0/src/forgegraph/drawing/readout.py +269 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/drawing/spacing.py +56 -31
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/drawing/style.py +4 -4
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/drawing/xy.py +15 -4
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/fonts/__init__.py +10 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/forgemark.py +2 -2
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/graph.py +3 -1
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/layouts/__init__.py +70 -23
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/layouts/separators.py +14 -4
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/packs/forgegraph_default/formats/compact_format.yaml +1 -1
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/packs/forgegraph_default/formats/wide_format.yaml +1 -1
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/packs/forgegraph_default/graphspecs/graphspec_example.yaml +3 -3
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/packs/forgegraph_default/layouts/layout.yaml +9 -2
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/packs/forgegraph_default/pack.yaml +3 -3
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/packs/forgegraph_default/schedules/schedule.yaml +1 -1
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/packs/forgegraph_default/themes/light_theme.yaml +3 -3
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/skill/forgegraph/SKILL.md +4 -3
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/skill/forgegraph/references/requests.md +1 -1
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/spec/layout.py +94 -22
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/spec/parameters.py +19 -1
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/spec/validate.py +22 -1
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/specifications/format.yaml +1 -1
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/specifications/graphspec_example.yaml +3 -3
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/specifications/graphtype_xy.yaml +1 -1
- forgegraph-0.6.0/src/forgegraph/specifications/layer_error_bar.yaml +11 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/specifications/layer_reference.yaml +1 -1
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/specifications/layout_example.yaml +5 -2
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/specifications/pack.yaml +3 -3
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/specifications/provenance.yaml +2 -2
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/specifications/schedule.yaml +1 -1
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/specifications/theme.yaml +8 -2
- forgegraph-0.6.0/tests/baselines/crowded_runs.png +0 -0
- forgegraph-0.6.0/tests/baselines/flow_sweep_wide.png +0 -0
- forgegraph-0.6.0/tests/baselines/fuel_by_size.png +0 -0
- forgegraph-0.6.0/tests/baselines/layout_anode_layers.png +0 -0
- forgegraph-0.6.0/tests/baselines/layout_screening_and_rate.png +0 -0
- forgegraph-0.6.0/tests/baselines/polarization.png +0 -0
- forgegraph-0.6.0/tests/baselines/polarization_narrow.png +0 -0
- forgegraph-0.6.0/tests/baselines/precipitation_loglog.png +0 -0
- forgegraph-0.6.0/tests/baselines/replicates.png +0 -0
- forgegraph-0.6.0/tests/baselines/screening_scatter.png +0 -0
- forgegraph-0.6.0/tests/baselines/separator_colorbar.png +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/tests/test_layers.py +35 -1
- {forgegraph-0.4.0 → forgegraph-0.6.0}/tests/test_layout.py +281 -4
- {forgegraph-0.4.0 → forgegraph-0.6.0}/tests/test_markup.py +15 -1
- forgegraph-0.6.0/tests/test_readout.py +280 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/tests/test_specs.py +49 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/tests/test_styles.py +26 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/tests/test_text.py +21 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/uv.lock +569 -4
- forgegraph-0.4.0/docs/design/todo.md +0 -10
- forgegraph-0.4.0/docs/packs/forgegraph_default/pack.md +0 -29
- forgegraph-0.4.0/docs/specifications/config.md +0 -24
- forgegraph-0.4.0/docs/specifications/pack.md +0 -25
- forgegraph-0.4.0/docs/specs_and_packs_revisions/notes.docx +0 -0
- forgegraph-0.4.0/src/forgegraph/drawing/page.py +0 -219
- forgegraph-0.4.0/src/forgegraph/specifications/layer_error_bar.yaml +0 -11
- forgegraph-0.4.0/tests/baselines/crowded_runs.png +0 -0
- forgegraph-0.4.0/tests/baselines/flow_sweep_wide.png +0 -0
- forgegraph-0.4.0/tests/baselines/fuel_by_size.png +0 -0
- forgegraph-0.4.0/tests/baselines/layout_anode_layers.png +0 -0
- forgegraph-0.4.0/tests/baselines/layout_screening_and_rate.png +0 -0
- forgegraph-0.4.0/tests/baselines/polarization.png +0 -0
- forgegraph-0.4.0/tests/baselines/polarization_narrow.png +0 -0
- forgegraph-0.4.0/tests/baselines/precipitation_loglog.png +0 -0
- forgegraph-0.4.0/tests/baselines/replicates.png +0 -0
- forgegraph-0.4.0/tests/baselines/screening_scatter.png +0 -0
- forgegraph-0.4.0/tests/baselines/separator_colorbar.png +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/.pre-commit-config.yaml +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/LICENSE +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/TRADEMARKS.md +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/docs/design/initial-specification.md +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/docs/packs/acme/formats/slide.md +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/docs/packs/acme/graphspecs/polarization-curve.md +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/docs/packs/acme/schedules/workday.md +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/docs/packs/forgegraph_default/catalogs/formats/compact_format.md +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/docs/packs/forgegraph_default/catalogs/formats/wide_format.md +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/docs/packs/forgegraph_default/catalogs/themes/light_theme.md +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/docs/specifications/catalogs/graphtype_xy.md +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/docs/specifications/catalogs/layer_error_bar.md +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/docs/specifications/catalogs/layer_note.md +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/docs/specifications/catalogs/layer_reference.md +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/docs/specifications/layer_note.md +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/docs/specifications/styles.md +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/examples/layouts/README.md +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/examples/layouts/dashboard/forgegraph.toml +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/examples/layouts/dashboard/lab_throughput.layout.yaml +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/examples/layouts/dashboard/lost_runs.parquet +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/examples/layouts/dashboard/lost_runs.yaml +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/examples/layouts/dashboard/ops/pack.yaml +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/examples/layouts/dashboard/prep_lab_dashboard.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/examples/layouts/dashboard/run_time.parquet +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/examples/layouts/dashboard/run_time.yaml +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/examples/layouts/dashboard/runs_gc_ms_01.yaml +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/examples/layouts/dashboard/runs_hplc_01.yaml +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/examples/layouts/dashboard/runs_hplc_02.yaml +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/examples/layouts/dashboard/runs_icp_oes_01.yaml +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/examples/layouts/dashboard/samples_weekly.yaml +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/examples/layouts/dashboard/throughput_weekly.yaml +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/examples/layouts/dashboard/weekly_gc_ms_01.parquet +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/examples/layouts/dashboard/weekly_hplc_01.parquet +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/examples/layouts/dashboard/weekly_hplc_02.parquet +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/examples/layouts/dashboard/weekly_icp_oes_01.parquet +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/examples/layouts/dashboard/weekly_runs.parquet +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/examples/layouts/dashboard/weekly_samples.parquet +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/examples/layouts/paper/cell_durability.parquet +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/examples/layouts/paper/cell_performance.layout.md +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/examples/layouts/paper/cell_performance.layout.yaml +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/examples/layouts/paper/cell_polarization.parquet +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/examples/layouts/paper/forgegraph.toml +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/examples/layouts/paper/hfr_time.yaml +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/examples/layouts/paper/journal/pack.yaml +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/examples/layouts/paper/polarization.yaml +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/examples/layouts/paper/prep_cells.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/examples/layouts/paper/voltage_time.yaml +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/examples/packs/acme/formats/slide.yaml +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/examples/packs/acme/graphspecs/polarization-curve.yaml +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/examples/packs/acme/layouts/dashboard.yaml +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/examples/packs/acme/references/house.md +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/examples/packs/acme/schedules/workday.yaml +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/examples/sample-data/README.md +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/examples/sample-data/air_passengers.csv +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/examples/sample-data/air_passengers_by_month.csv +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/examples/sample-data/anscombe.csv +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/examples/sample-data/assay_summary.csv +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/examples/sample-data/cell_durability.csv +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/examples/sample-data/cell_polarization.csv +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/examples/sample-data/co2_monthly.csv +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/examples/sample-data/diamonds.csv +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/examples/sample-data/dose_response.csv +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/examples/sample-data/economics.csv +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/examples/sample-data/enzyme_kinetics.csv +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/examples/sample-data/fmri.csv +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/examples/sample-data/gapminder.csv +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/examples/sample-data/geyser.csv +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/examples/sample-data/growth.csv +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/examples/sample-data/iris.csv +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/examples/sample-data/lab_export.xlsx +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/examples/sample-data/lab_runs.xlsx +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/examples/sample-data/penguins.csv +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/examples/sample-data/seaice.csv +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/examples/sample-data/sensor_log_eu.csv +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/examples/sample-data/stocks.csv +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/examples/sample-data/tips.csv +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/examples/sample-data/weather.xlsx +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/scripts/build_example_data.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/scripts/build_recreations.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/scripts/build_sample_data.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/scripts/check_denylist.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/scripts/forgemark.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/scripts/mirror_specs.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/scripts/report_skill_evals.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/scripts/run_skill_evals.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/scripts/smoke_installed.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/scripts/visual_changelog.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/__init__.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/__main__.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/canvas.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/catalog_build/__init__.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/catalog_build/build.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/catalog_build/cards.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/catalog_build/examples.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/catalog_build/files.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/catalog_build/page.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/cli/__init__.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/cli/catalog.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/cli/graphs.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/cli/jobs.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/cli/skill.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/data.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/drawing/__init__.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/drawing/colorbar.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/drawing/dates.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/drawing/errors.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/drawing/export.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/drawing/figure.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/drawing/key.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/drawing/labels.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/drawing/layout.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/drawing/limits.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/drawing/lint.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/drawing/marks.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/drawing/text.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/drawing/ticks.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/drawn.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/fonts/IBMPlexSerif-Bold.ttf +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/fonts/IBMPlexSerif-Light.ttf +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/fonts/IBMPlexSerif-Medium.ttf +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/fonts/IBMPlexSerif-Regular.ttf +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/fonts/IBMPlexSerif-SemiBold.ttf +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/fonts/OFL-IBMPlexSerif.txt +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/fonts/OFL-Roboto.txt +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/fonts/OFL-SourceSans3.md +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/fonts/Roboto-Bold.ttf +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/fonts/Roboto-Italic.ttf +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/fonts/Roboto-Light.ttf +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/fonts/Roboto-Medium.ttf +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/fonts/Roboto-Regular.ttf +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/fonts/Roboto-SemiBold.ttf +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/fonts/SourceSans3-Bold.ttf +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/fonts/SourceSans3-It.ttf +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/fonts/SourceSans3-Light.ttf +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/fonts/SourceSans3-Medium.ttf +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/fonts/SourceSans3-Regular.ttf +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/fonts/SourceSans3-Semibold.ttf +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/jobs/__init__.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/jobs/run.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/jobs/status.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/packs/__init__.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/packs/forgegraph_default/catalogs/formats/compact_format.yaml +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/packs/forgegraph_default/catalogs/formats/wide_format.yaml +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/packs/forgegraph_default/catalogs/themes/light_theme.yaml +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/packs/forgegraph_default/graphspecs/dated.parquet +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/packs/forgegraph_default/graphspecs/fanned.parquet +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/packs/forgegraph_default/graphspecs/polarization.parquet +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/packs/forgegraph_default/graphspecs/reinforced.parquet +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/skill/__init__.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/skill/forgegraph/examples/bars.yaml +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/skill/forgegraph/examples/figure.layout.yaml +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/skill/forgegraph/examples/figure.schedule.yaml +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/skill/forgegraph/examples/layers.yaml +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/skill/forgegraph/examples/xy.parquet +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/skill/forgegraph/examples/xy.yaml +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/skill/forgegraph/references/themes_formats_configs.md +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/spec/__init__.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/spec/access.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/spec/common.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/spec/explain.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/spec/layers.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/spec/loaded.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/spec/provenance.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/spec/registry.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/spec/resolve.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/spec/schedule.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/spec/series.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/spec/tags.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/specifications/catalogs/graphtype_xy.yaml +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/specifications/catalogs/layer_error_bar.yaml +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/specifications/catalogs/layer_note.yaml +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/specifications/catalogs/layer_reference.yaml +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/specifications/config.toml +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/specifications/layer_note.yaml +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/src/forgegraph/specifications/styles.yaml +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/tests/conftest.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/tests/fixtures/catalog_comments.html +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/tests/pack_helpers.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/tests/recreations.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/tests/render_helpers.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/tests/spec_mirror.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/tests/test_axes.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/tests/test_blank.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/tests/test_catalog.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/tests/test_catalog_files.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/tests/test_catalog_inputs.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/tests/test_catalog_page.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/tests/test_cli.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/tests/test_dates.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/tests/test_denylist.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/tests/test_jobs.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/tests/test_key_position.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/tests/test_labels.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/tests/test_lint.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/tests/test_marks.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/tests/test_packaging.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/tests/test_packs.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/tests/test_perturbation.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/tests/test_regression.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/tests/test_render.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/tests/test_schedule.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/tests/test_series.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/tests/test_smoke.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/tests/test_spec_comments.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/tests/test_spec_mirrors.py +0 -0
- {forgegraph-0.4.0 → forgegraph-0.6.0}/tests/test_tags.py +0 -0
|
@@ -1,40 +1,70 @@
|
|
|
1
1
|
# Changelog
|
|
2
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.
|
|
3
|
+
ForgeGraph follows [semantic versioning](https://semver.org). Before 1.0, a minor version may change how graphs look or how specs are written.
|
|
4
|
+
|
|
5
|
+
## 0.6.0 (2026-10-30)
|
|
6
|
+
|
|
7
|
+
### New Features
|
|
8
|
+
|
|
9
|
+
- **Values on hover.** Pointing at a data point on a graph in an HTML page, or tapping it, shows its values: each axis's value, with its error bar where it has one, and its series' group. A value with an error bar is rounded to the error's last digit, as in 8.0 ± 0.4 (95%CI). It works on markers, lines and bars, and in every tile of a layout.
|
|
10
|
+
- **Feature requests from the agent.** When the agent makes a graph ForgeGraph can't draw, or one that's watermarked, it asks whether you'd like to file a feature request for what was missing.
|
|
11
|
+
- **A documentation site.** Getting started, and a reference for every specification, command and Python function, built from the repository.
|
|
12
|
+
|
|
13
|
+
### Changes
|
|
14
|
+
|
|
15
|
+
- **HTML pages are larger.** Each HTML page now carries its graphs' points and the font their values are written in, about 0.2 MB more for the font.
|
|
16
|
+
- **Issue forms.** Feature requests and bug reports on GitHub now have forms, and the agent writes requests under their headings.
|
|
17
|
+
|
|
18
|
+
### Bug Fixes
|
|
19
|
+
|
|
20
|
+
- A negative error bar distance is now an error when the spec is read, instead of when the graph is drawn.
|
|
21
|
+
- The specifications' descriptions now match what ForgeGraph does.
|
|
22
|
+
|
|
23
|
+
## 0.5.0 (2026-10-29)
|
|
24
|
+
|
|
25
|
+
### New Features
|
|
26
|
+
|
|
27
|
+
- **Nested tabs.** A tab in a layout can now hold tabs of its own, to any depth. The HTML page shows a row of tabs for each level, and switching to another group keeps the same chart showing.
|
|
28
|
+
- **Tick labels per axis.** `axis.x.tick.label` and `axis.y.tick.label` set the size, weight and color of each axis's tick labels separately. Anything they don't set comes from `axis.tick.label`.
|
|
29
|
+
- **Tabs without scripts.** The tabs on a layout's HTML page now work where the page's scripts don't run, such as in a browser with JavaScript turned off. Before, such a page showed every tab, one below another.
|
|
30
|
+
- **Tab bar style.** A layout's `tab_bar.label` and `tab_bar.line` set the look of the tab names and of the line under them on the HTML page. By default they follow the first graph's theme.
|
|
31
|
+
|
|
32
|
+
### Changes
|
|
33
|
+
|
|
34
|
+
- **Titles.** Titles now sit `title.gap` above the plot, measured from the line the letters sit on, so titles side by side line up whatever their letters. The default theme's `title.gap` is now 0.41, which keeps its titles where they were. A theme that sets its own `title.gap` will see its titles sit a little higher than in 0.4.
|
|
35
|
+
- **Notes above the plot.** A note placed outside the plot at the top now goes between the title and the plot, instead of above the title.
|
|
36
|
+
- **Tab names on the page.** The tab names are written in the theme's font and color, instead of the browser's font in dark grey.
|
|
37
|
+
|
|
38
|
+
### Bug Fixes
|
|
39
|
+
|
|
40
|
+
- Tick labels now use the theme's tick label font and weight. Before, only their size and color were applied.
|
|
41
|
+
- A y-axis title reading upward now sits the same distance from the tick labels whatever its letters.
|
|
4
42
|
|
|
5
43
|
## 0.4.0 (2026-10-27)
|
|
6
44
|
|
|
7
|
-
|
|
45
|
+
### New Features
|
|
8
46
|
|
|
9
|
-
|
|
47
|
+
- **Multiple Series.** GraphSpecs can now have independent Series, enabling full control over the marker, line, and bar properties and not just variation by a palette.
|
|
48
|
+
- **Reference bands.** The `reference_line` layer is now `reference` and has been augmented to also draw lines per element of the series and bands. It also can now compute a value plus offset (e.g. a line at mean + 3 s.d.). This enables drawing of error bands, confidence intervals of model fits, and other more complex references.
|
|
49
|
+
- **More aggregations.** Series, reference lines, and error bars can show the mean, median, percentile, standard deviation, standard error or confidence intervals.
|
|
50
|
+
- **Stepped and smooth lines.** `line.interpolate` can now be steps or a smooth curve in addition to a direct line.
|
|
51
|
+
- **Dates as values.** Dates, such as `2025-08-25`, can now be used directly in all relevant parameters.
|
|
10
52
|
|
|
11
|
-
|
|
12
|
-
- The specification files, which define each kind, are in `src/forgegraph/specifications/`, and their pages in `docs/specifications/`; no spec can name or extend them. The built-in pack's pages are in `docs/packs/forgegraph_default/`, and the catalog page is `catalog/forgegraph_default.html`.
|
|
13
|
-
- A category's brackets in a specification file say what the code reads about it, from a fixed set: its style, `same as <sibling>` for a category with a sibling's parameters, and `look from <theme category>` for a layer category whose look comes from the theme. Anything else there is an error, and descriptions are never read, so rewording one changes nothing.
|
|
14
|
-
- A style's member that no file tags, itself or through a category inside `parameters`, is fixed or variable as its general parameter is: a fixed `text.font` fixes every text style's font, even where the theme sets the style's own.
|
|
15
|
-
- `forgegraph schema <kind>` no longer says whether a parameter is fixed: it shows the kind's specification, which isn't what graphs are drawn with. `forgegraph schema graphspec` lists what a GraphSpec can set, and `forgegraph explain` shows what's fixed.
|
|
16
|
-
- A reference layer's `fill.color` may be None: two lines with values make a band only when it isn't.
|
|
17
|
-
- **Breaking for existing specs:** a GraphSpec lists its series by name under `series`, each drawn from its own column (by default, the column of its name) with its own settings: `aggregation`, `split`, `order`, `color`, `color_scale`, `line`, `marker`, `bar` and `value_label`, and the theme's variable series parameters it sets for itself. They replace `axis.*.data.aggregation`, `encoding.*` and `mark.*`; the value axis's `data.column` is None. `arrangement.base_axis`, `arrangement.stacking`, `arrangement.offset` and `arrangement.total.show` replace `series.base_axis`, `series.aggregation`, `series.offset` and `series.value_label.total.show`. A series' color, line style, marker shape and fill take `first`, `series`, a value or a column; series take palette colors in the order they're listed.
|
|
18
|
-
- **Breaking for existing specs:** the `reference` layer replaces `reference_line`: `line_1` and `line_2`, each at a value or from a column, with its own `aggregation` and `offset` (aggregation styles), `scope`, line and label (with `label.inside`), and the `fill` of a band between them. The theme's `layer.reference` replaces `layer.reference_line`.
|
|
19
|
-
- An aggregation style (`function`, `multiplier`, `percentile`) for a series, a reference line and error bars; functions include `percentile`, `stddev`, `stderr` and `ci`.
|
|
20
|
-
- `line.interpolate` draws a series' line straight, in steps (`step_after`, `step_before`, `step_center`) or as a smooth curve that never overshoots its points.
|
|
21
|
-
- A note and a reference layer's lines, labels and fill may set the theme's variable look for themselves.
|
|
22
|
-
- A style key (one from `encoding.line.style.column`, `encoding.marker.shape.column` or `encoding.marker.fill.column`) follows `legend.key.title.text`, as the series' key does: `column_name`, the default, gives each key its own column's name, so default graphs are unchanged; `None` removes every key's title; a text titles one key, and with more than one key drawn it's an error. With no `encoding.color.column`, a style key's samples are drawn in the one series color, not the text color. `render --json` reports `style_keys`, the column each style key drawn explains (for a layout, each tile's), beside `labelling`.
|
|
23
|
-
- A range type `date`: a date, or a date and time, as YAML's bare date (`2025-08-25`, `2025-08-25 06:00:00`) or ISO 8601 text (`"2025-08-25T06:00"`); a time with a zone is at its clock time, as the data's are. `axis.x.min`, `axis.x.max`, `axis.y.min` and `axis.y.max`, a reference line's `value` and `benchmark.value` take it: on a datetime axis or column, a date is drawn exactly where its day number is, and numbers keep working as day numbers. A date on an axis that isn't dates is an error naming the axis's type. Text that reads as a date is a reference line's column only if the data has a column of that name. Provenance records write dates as ISO 8601 text.
|
|
24
|
-
- On a date value axis, what would draw nonsense is an error that says what to do: stacking (`series.aggregation` sum or percent), adding up rows (`axis.*.data.aggregation` sum), bars (`mark.bar.show`, which would start at 1970), and value labels without a date format. A reference line at a date column's aggregate is on a date axis only, at its mean, median, min or max, with multiplier 1. A date axis's `tick.label.format` must have a date directive.
|
|
53
|
+
### Changes
|
|
25
54
|
|
|
26
|
-
|
|
55
|
+
- **One built-in pack, `forgegraph_default`.** `forgegraph_base` is renamed `forgegraph_default` and its specifications have been renamed. `forgegraph_base_2` has been removed. Please update your config and any GraphSpecs or packs referencing the old packs. The default theme has been tuned slightly to fix more parameters, reducing complexity of graph design.
|
|
56
|
+
- **Themes, formats and GraphSpecs are written differently.** Each has one `parameters` tree, and `!fix` and `!var` tags are used to set what a GraphSpec can change, in place of the `fixed_parameters` and `variable_parameters` blocks. A theme sets the parameters of all text and all lines once, under `text` and `line`, and each category that uses them, such as the title or the tick labels, only needs to modify the parameters that are different from that default.
|
|
57
|
+
- **Simplified Specifications.** Numerous simplifications to the way specifications are written, making them easier to read and modify.
|
|
27
58
|
|
|
28
|
-
|
|
29
|
-
- The `outside-limits` and `log-axis-values` lint checks count only data points. A reference line's ends and an error bar's ends no longer count as points outside a set axis limit, or as values of 0 or below on a log axis.
|
|
30
|
-
- A style key on the benchmark's column matches the drawing: its entries are the groups the series are styled by, so a value after the benchmark no longer gets the next value's style, and the benchmark, drawn in its own style, has no style sample and is named once, by `legend.method`. When `legend.method: key` doesn't fit, the error says why: every position in `legend.key.positions` is taken or covers data, naming the position each style key took.
|
|
31
|
-
- YAML's null (`null`, `~` or nothing) is None everywhere a spec can say None. `extends: null` failed with `KeyError: None`, and a file extending null wasn't required to list every parameter.
|
|
32
|
-
- Computed values are compared with an axis's limits allowing for float noise: a value is past a limit only if it's past by more than 1e-9 of the axis's span, measured in powers of ten on a log axis. A stack that totals `axis.y.max` but for its last digits isn't reported by `outside-limits`; a reference line at a computed value that equals a set limit isn't an error; bars whose values are 0 but for float noise still stand on the axis; and a tick a hair past the end of the view, which matplotlib draws, is measured for layout and lint and counts when log labels choose between plain numbers and powers of ten.
|
|
33
|
-
- Dates and times draw the same on y as on x: every value placed on an axis (the data, its aggregates, stacks, reference lines, error bars and limits) becomes a number the same way, so a date y axis has date ticks, a reference line at a date column's aggregate lands on it, and error bars from a date column's spread are in days. With value labels off, a date `tick.label.format` such as `"%H:%M"` on y is no longer refused as a number format; value labels and a reference line's value on a date axis are written in a date format.
|
|
59
|
+
### Bug Fixes
|
|
34
60
|
|
|
35
|
-
|
|
61
|
+
- Dates on the y axis draw as they do on x: date ticks, reference lines at a date column's mean or median, and error bars in days.
|
|
62
|
+
- The lint no longer counts reference lines and error bars as data points outside the axis limits, or as values of 0 or below on a log axis.
|
|
63
|
+
- Values that differ from an axis limit only by rounding are no longer reported as outside it.
|
|
64
|
+
- In a theme with a light font weight, powers of ten on a log axis no longer give a `font-fallback` lint issue.
|
|
65
|
+
- `null` and `~` are accepted everywhere a spec can say None.
|
|
36
66
|
|
|
37
|
-
|
|
67
|
+
## 0.3.0 (2026-10-25)
|
|
38
68
|
|
|
39
69
|
### Added
|
|
40
70
|
|
|
@@ -78,8 +108,6 @@ Images that changed: the [visual changelog](docs/visual-changelog/0.3.0.html).
|
|
|
78
108
|
|
|
79
109
|
## 0.2.0 (2026-10-24)
|
|
80
110
|
|
|
81
|
-
Images that changed: the [visual changelog](docs/visual-changelog/0.2.0.html).
|
|
82
|
-
|
|
83
111
|
### Changed
|
|
84
112
|
|
|
85
113
|
- 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.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
cff-version: 1.2.0
|
|
2
|
+
message: If you use ForgeGraph in your work, please cite it as below.
|
|
3
|
+
title: ForgeGraph
|
|
4
|
+
abstract: Fast, consistent, publication-quality graphs from pandas DataFrames, for people and AI agents.
|
|
5
|
+
type: software
|
|
6
|
+
authors:
|
|
7
|
+
- given-names: Steven
|
|
8
|
+
family-names: Kaye
|
|
9
|
+
repository-code: https://github.com/sskaye/forgegraph
|
|
10
|
+
url: https://pypi.org/project/forgegraph/
|
|
11
|
+
license: MIT
|
|
12
|
+
keywords:
|
|
13
|
+
- data visualization
|
|
14
|
+
- plotting
|
|
15
|
+
- matplotlib
|
|
16
|
+
- scientific visualization
|
|
@@ -9,7 +9,7 @@ uv sync
|
|
|
9
9
|
uv run pre-commit install
|
|
10
10
|
```
|
|
11
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:
|
|
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 that changes more than pages no test reads (`review/`, `CHANGELOG.md`, `CONTRIBUTING.md`, and `docs/` other than the spec and pack pages), and it's the one to run before a release:
|
|
13
13
|
|
|
14
14
|
```bash
|
|
15
15
|
uv run pytest --full && uv run ruff check . && uv run ruff format --check && uv run pyright
|
|
@@ -31,14 +31,26 @@ uv run python scripts/build_recreations.py --baselines
|
|
|
31
31
|
|
|
32
32
|
`uv run python scripts/visual_changelog.py main` then shows every image that changed.
|
|
33
33
|
|
|
34
|
+
## The documentation site
|
|
35
|
+
|
|
36
|
+
The site is built with MkDocs from docs/site. Its Reference pages are generated as it's built: the commands from the CLI, the specifications and the built-in pack from their files, and the Python API from the docstrings (scripts/docs_site.py). To build it and read it while you work:
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
uv run --group docs mkdocs serve
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
CI builds it on every pull request, and a broken link fails the build. Publishing a GitHub release deploys it to GitHub Pages.
|
|
43
|
+
|
|
34
44
|
## Requesting a graph type
|
|
35
45
|
|
|
36
46
|
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.
|
|
37
47
|
|
|
38
48
|
## Releasing
|
|
39
49
|
|
|
40
|
-
1. Set the new version in pyproject.toml
|
|
50
|
+
1. Set the new version in pyproject.toml, in the built-in pack's pack.yaml and in the definitions' (src/forgegraph/specifications/pack.yaml), and for a new minor version, their `requires` (`">=0.4, <0.5"` for 0.4).
|
|
41
51
|
2. Rebuild the catalog and mirrors (above).
|
|
42
|
-
3. Write the
|
|
43
|
-
4.
|
|
44
|
-
5.
|
|
52
|
+
3. Write the CHANGELOG entry: the key features a user would want to know were added, changed or removed, and the bugs fixed.
|
|
53
|
+
4. Write the visual changelog: `uv run python scripts/visual_changelog.py v<previous version>`, which saves docs/visual-changelog/<version>.html.
|
|
54
|
+
5. Merge with CI green, and tag the merge commit `v<version>`.
|
|
55
|
+
6. Run the Publish workflow, then create the GitHub release with the CHANGELOG entry as its notes.
|
|
56
|
+
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: forgegraph
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.6.0
|
|
4
4
|
Summary: Fast, consistent, publication-quality graphs from pandas DataFrames, usable by people and AI agents.
|
|
5
5
|
Project-URL: Repository, https://github.com/sskaye/forgegraph
|
|
6
6
|
Project-URL: Issues, https://github.com/sskaye/forgegraph/issues
|
|
@@ -39,8 +39,9 @@ You describe a graph in a **GraphSpec**. ForgeGraph draws it in a house style se
|
|
|
39
39
|
- **Themes:** fixes the look of the graph (fonts, palette, lines, keys, etc.).
|
|
40
40
|
- **Formats:** sets the destination: figure size, base font size, file types and resolution, e.g. a slide, a journal column or a dashboard tile.
|
|
41
41
|
- **GraphTypes:** defines the type of graph and its parameters. E.g. `xy` (lines, markers and bars).
|
|
42
|
-
- **Layers:** features drawn over a graph. E.g. reference lines, notes, & error bars.
|
|
42
|
+
- **Layers:** features drawn over a graph. E.g. reference lines and bands, notes, & error bars.
|
|
43
43
|
- **GraphSpecs:** specify the data, theme, format, and all customizable properties.
|
|
44
|
+
- **Series:** each series in a graph has its own marker, line and bar properties, and can show a summary of its data, such as the mean, a percentile or a confidence interval.
|
|
44
45
|
- **Layouts:** combine multiple graphs into a larger figure or multi-tab dashboard.
|
|
45
46
|
- **Scheduled renders:** re-render graphs and dashboards on a schedule set with cron, launchd, or by an agent.
|
|
46
47
|
- **Provenance:** every saved file contains its specifications as metadata, enabling inspection of how the graph was made and reproduction of it.
|
|
@@ -48,7 +49,7 @@ You describe a graph in a **GraphSpec**. ForgeGraph draws it in a house style se
|
|
|
48
49
|
- **Configs:** control which packs may be used, per user or folder. Used to enforce use of style pack(s) and watermark non-standard graphs.
|
|
49
50
|
- **Lint:** Graphs are linted on rendering, with warnings for issues including overlapping or clipped text, a key covering data, or fonts too small.
|
|
50
51
|
|
|
51
|
-
**Status:** 0.
|
|
52
|
+
**Status:** Until 1.0, a new minor version may change how graphs look or how specs are written; the [changelog](https://github.com/sskaye/forgegraph/blob/main/CHANGELOG.md) lists what changed in each release. `forgegraph catalog` lists the graph types, layers and packs you have. More graph types are planned. If there are specific ones you want, [open an issue](https://github.com/sskaye/forgegraph/issues).
|
|
52
53
|
|
|
53
54
|
## Install
|
|
54
55
|
|
|
@@ -131,7 +132,7 @@ forgegraph render voltage.yaml
|
|
|
131
132
|
|
|
132
133
|
## Packs and configs
|
|
133
134
|
|
|
134
|
-
Every named theme, format, GraphSpec, layout and schedule comes from a **pack**, a folder or pip package of specs, and is named `pack/name`. ForgeGraph's built-in pack, `forgegraph_default`, is stored in src/forgegraph/packs
|
|
135
|
+
Every named theme, format, GraphSpec, layout and schedule comes from a **pack**, a folder or pip package of specs, and is named `pack/name`. ForgeGraph's built-in pack, `forgegraph_default`, is stored in src/forgegraph/packs. It has a theme and formats, so a graph can always be drawn, and specs to extend; `forgegraph catalog` lists them.
|
|
135
136
|
|
|
136
137
|
A **config** lists the packs that may be used:
|
|
137
138
|
|
|
@@ -145,11 +146,13 @@ On macOS, a scheduled render that writes into a cloud-synced folder needs Full D
|
|
|
145
146
|
|
|
146
147
|
## Commands
|
|
147
148
|
|
|
149
|
+
`forgegraph --help` lists every command. The main ones:
|
|
150
|
+
|
|
148
151
|
- `forgegraph render <graphspec or layout>`: draw and save, and report lint.
|
|
149
152
|
- `forgegraph explain <graphspec or layout>`: every value it's drawn with, and which file set it.
|
|
150
153
|
- `forgegraph catalog`: the packs, graph types, layer types, themes, formats, GraphSpecs, layouts, schedules and reference notes available here.
|
|
151
154
|
- `forgegraph schema graphspec --graph-type <type> --theme <theme> --format <format>`: every parameter a GraphSpec can set.
|
|
152
|
-
- `forgegraph schema <kind>`: every parameter of a theme, format, layer, layout, schedule, pack or config.
|
|
155
|
+
- `forgegraph schema <kind>`: every parameter of a theme, format, graph type, layer, layout, schedule, pack or config.
|
|
153
156
|
- `forgegraph pack-notes`: the reference notes of the packs available here.
|
|
154
157
|
- `forgegraph load <file>`: a saved graph's record, and its GraphSpec.
|
|
155
158
|
- `forgegraph job run <schedule>`: render a schedule's GraphSpecs and layouts once.
|
|
@@ -173,9 +176,7 @@ ForgeGraph is [MIT-licensed](https://github.com/sskaye/forgegraph/blob/main/LICE
|
|
|
173
176
|
- [Built-in pack](https://github.com/sskaye/forgegraph/blob/main/docs/packs/forgegraph_default): forgegraph_default's specs.
|
|
174
177
|
- [Changelog](https://github.com/sskaye/forgegraph/blob/main/CHANGELOG.md).
|
|
175
178
|
- [Contributing](https://github.com/sskaye/forgegraph/blob/main/CONTRIBUTING.md): working on ForgeGraph itself.
|
|
176
|
-
-
|
|
177
|
-
- [Architecture](https://github.com/sskaye/forgegraph/blob/main/docs/design/architecture.md): how ForgeGraph is designed, and why.
|
|
178
|
-
- [To do](https://github.com/sskaye/forgegraph/blob/main/docs/design/todo.md): what's still planned.
|
|
179
|
+
- [Architecture](https://github.com/sskaye/forgegraph/blob/main/docs/design/architecture.md): how ForgeGraph is designed, and why.
|
|
179
180
|
|
|
180
181
|
## Contributing
|
|
181
182
|
|
|
@@ -196,5 +197,5 @@ Feature requests and bug reports go to [GitHub issues](https://github.com/sskaye
|
|
|
196
197
|
- **examples/**: sample data; `packs/acme`, an example pack in a deliberately different style; and `layouts/`, a paper figure and a dashboard.
|
|
197
198
|
- **evals/skill/**: the skill's eval cases, run by `scripts/run_skill_evals.py`.
|
|
198
199
|
- **tests/**, **scripts/**: tests, and build and maintenance scripts.
|
|
199
|
-
- **docs/**: the specifications' and packs' pages, the design record and the visual changelogs. **review/**: each build phase's
|
|
200
|
+
- **docs/**: the specifications' and packs' pages, the design record and the visual changelogs. **review/**: review pages: each build phase's, the audit's and the refactoring's, and the open issues list.
|
|
200
201
|
|
|
@@ -9,8 +9,9 @@ You describe a graph in a **GraphSpec**. ForgeGraph draws it in a house style se
|
|
|
9
9
|
- **Themes:** fixes the look of the graph (fonts, palette, lines, keys, etc.).
|
|
10
10
|
- **Formats:** sets the destination: figure size, base font size, file types and resolution, e.g. a slide, a journal column or a dashboard tile.
|
|
11
11
|
- **GraphTypes:** defines the type of graph and its parameters. E.g. `xy` (lines, markers and bars).
|
|
12
|
-
- **Layers:** features drawn over a graph. E.g. reference lines, notes, & error bars.
|
|
12
|
+
- **Layers:** features drawn over a graph. E.g. reference lines and bands, notes, & error bars.
|
|
13
13
|
- **GraphSpecs:** specify the data, theme, format, and all customizable properties.
|
|
14
|
+
- **Series:** each series in a graph has its own marker, line and bar properties, and can show a summary of its data, such as the mean, a percentile or a confidence interval.
|
|
14
15
|
- **Layouts:** combine multiple graphs into a larger figure or multi-tab dashboard.
|
|
15
16
|
- **Scheduled renders:** re-render graphs and dashboards on a schedule set with cron, launchd, or by an agent.
|
|
16
17
|
- **Provenance:** every saved file contains its specifications as metadata, enabling inspection of how the graph was made and reproduction of it.
|
|
@@ -18,7 +19,7 @@ You describe a graph in a **GraphSpec**. ForgeGraph draws it in a house style se
|
|
|
18
19
|
- **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
20
|
- **Lint:** Graphs are linted on rendering, with warnings for issues including overlapping or clipped text, a key covering data, or fonts too small.
|
|
20
21
|
|
|
21
|
-
**Status:** 0.
|
|
22
|
+
**Status:** Until 1.0, a new minor version may change how graphs look or how specs are written; the [changelog](https://github.com/sskaye/forgegraph/blob/main/CHANGELOG.md) lists what changed in each release. `forgegraph catalog` lists the graph types, layers and packs you have. More graph types are planned. If there are specific ones you want, [open an issue](https://github.com/sskaye/forgegraph/issues).
|
|
22
23
|
|
|
23
24
|
## Install
|
|
24
25
|
|
|
@@ -101,7 +102,7 @@ forgegraph render voltage.yaml
|
|
|
101
102
|
|
|
102
103
|
## Packs and configs
|
|
103
104
|
|
|
104
|
-
Every named theme, format, GraphSpec, layout and schedule comes from a **pack**, a folder or pip package of specs, and is named `pack/name`. ForgeGraph's built-in pack, `forgegraph_default`, is stored in src/forgegraph/packs
|
|
105
|
+
Every named theme, format, GraphSpec, layout and schedule comes from a **pack**, a folder or pip package of specs, and is named `pack/name`. ForgeGraph's built-in pack, `forgegraph_default`, is stored in src/forgegraph/packs. It has a theme and formats, so a graph can always be drawn, and specs to extend; `forgegraph catalog` lists them.
|
|
105
106
|
|
|
106
107
|
A **config** lists the packs that may be used:
|
|
107
108
|
|
|
@@ -115,11 +116,13 @@ On macOS, a scheduled render that writes into a cloud-synced folder needs Full D
|
|
|
115
116
|
|
|
116
117
|
## Commands
|
|
117
118
|
|
|
119
|
+
`forgegraph --help` lists every command. The main ones:
|
|
120
|
+
|
|
118
121
|
- `forgegraph render <graphspec or layout>`: draw and save, and report lint.
|
|
119
122
|
- `forgegraph explain <graphspec or layout>`: every value it's drawn with, and which file set it.
|
|
120
123
|
- `forgegraph catalog`: the packs, graph types, layer types, themes, formats, GraphSpecs, layouts, schedules and reference notes available here.
|
|
121
124
|
- `forgegraph schema graphspec --graph-type <type> --theme <theme> --format <format>`: every parameter a GraphSpec can set.
|
|
122
|
-
- `forgegraph schema <kind>`: every parameter of a theme, format, layer, layout, schedule, pack or config.
|
|
125
|
+
- `forgegraph schema <kind>`: every parameter of a theme, format, graph type, layer, layout, schedule, pack or config.
|
|
123
126
|
- `forgegraph pack-notes`: the reference notes of the packs available here.
|
|
124
127
|
- `forgegraph load <file>`: a saved graph's record, and its GraphSpec.
|
|
125
128
|
- `forgegraph job run <schedule>`: render a schedule's GraphSpecs and layouts once.
|
|
@@ -143,9 +146,7 @@ ForgeGraph is [MIT-licensed](https://github.com/sskaye/forgegraph/blob/main/LICE
|
|
|
143
146
|
- [Built-in pack](https://github.com/sskaye/forgegraph/blob/main/docs/packs/forgegraph_default): forgegraph_default's specs.
|
|
144
147
|
- [Changelog](https://github.com/sskaye/forgegraph/blob/main/CHANGELOG.md).
|
|
145
148
|
- [Contributing](https://github.com/sskaye/forgegraph/blob/main/CONTRIBUTING.md): working on ForgeGraph itself.
|
|
146
|
-
-
|
|
147
|
-
- [Architecture](https://github.com/sskaye/forgegraph/blob/main/docs/design/architecture.md): how ForgeGraph is designed, and why.
|
|
148
|
-
- [To do](https://github.com/sskaye/forgegraph/blob/main/docs/design/todo.md): what's still planned.
|
|
149
|
+
- [Architecture](https://github.com/sskaye/forgegraph/blob/main/docs/design/architecture.md): how ForgeGraph is designed, and why.
|
|
149
150
|
|
|
150
151
|
## Contributing
|
|
151
152
|
|
|
@@ -166,5 +167,5 @@ Feature requests and bug reports go to [GitHub issues](https://github.com/sskaye
|
|
|
166
167
|
- **examples/**: sample data; `packs/acme`, an example pack in a deliberately different style; and `layouts/`, a paper figure and a dashboard.
|
|
167
168
|
- **evals/skill/**: the skill's eval cases, run by `scripts/run_skill_evals.py`.
|
|
168
169
|
- **tests/**, **scripts/**: tests, and build and maintenance scripts.
|
|
169
|
-
- **docs/**: the specifications' and packs' pages, the design record and the visual changelogs. **review/**: each build phase's
|
|
170
|
+
- **docs/**: the specifications' and packs' pages, the design record and the visual changelogs. **review/**: review pages: each build phase's, the audit's and the refactoring's, and the open issues list.
|
|
170
171
|
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# Security
|
|
2
|
+
|
|
3
|
+
## Supported versions
|
|
4
|
+
|
|
5
|
+
Security fixes go into the latest minor release. Upgrade to it to get them.
|
|
6
|
+
|
|
7
|
+
## Reporting a vulnerability
|
|
8
|
+
|
|
9
|
+
Please report a vulnerability privately, through the repository's [Security tab](https://github.com/sskaye/forgegraph/security/advisories/new), not in a public issue. Say what's affected, how to reproduce it, and what it lets someone do. You'll get a reply there, and the fix is released with an advisory once it's ready.
|