jarvisplot 2.1.13__tar.gz → 2.1.14__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.
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/CHANGELOG.md +12 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/JarvisPLOT.egg-info/PKG-INFO +2 -2
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/JarvisPLOT.egg-info/SOURCES.txt +1 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/PKG-INFO +2 -2
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/README.md +1 -1
- jarvisplot-2.1.14/VERSION +1 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/adapters_rect.py +17 -6
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/layer_runtime.py +1 -1
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/preprocessor_runtime.py +1 -1
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/data_loader.py +30 -17
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/data_loader_runtime.py +2 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/diagnostic_guidance.py +1 -1
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/dryrun_runtime.py +38 -23
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/render_health.py +3 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/transform_contracts.py +1 -4
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/utils/expression.py +9 -1
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/validation.py +33 -2
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/verbs/doctor.py +3 -1
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/pyproject.toml +1 -1
- jarvisplot-2.1.14/tests/test_review_regressions.py +163 -0
- jarvisplot-2.1.13/VERSION +0 -1
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/Example/README.md +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/Example/a4paper_2x1.yaml +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/Example/a4paper_4x1_rectcmap.yaml +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/Example/compact_legend.yaml +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/Example/correlation_demo.csv +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/Example/correlation_demo_wide.csv +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/Example/corrplot_diamond.yaml +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/Example/corrplot_matrix.yaml +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/Example/corrplot_scales.yaml +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/Example/forest/README.md +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/Example/forest/box.yaml +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/Example/forest/data/box.csv +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/Example/forest/data/forest-points.csv +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/Example/forest/data/forest-rows.csv +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/Example/forest/data/interval.csv +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/Example/forest/data/points.csv +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/Example/forest/data/summary-intervals.csv +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/Example/forest/data/summary-labels.csv +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/Example/forest/data/summary-points.csv +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/Example/forest/data/summary-rows.csv +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/Example/forest/interval.yaml +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/Example/forest/intervals-only.yaml +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/Example/forest/multi-interval.yaml +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/Example/forest/real-demo-debug.yaml +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/Example/forest/real-demo.yaml +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/Example/gambit_2x1.yaml +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/Example/generated_data.yaml +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/Example/legend_cards.yaml +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/Example/pdf_cdf_1d.yaml +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/Example/ternary_1x1.yaml +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/JarvisPLOT.egg-info/dependency_links.txt +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/JarvisPLOT.egg-info/entry_points.txt +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/JarvisPLOT.egg-info/requires.txt +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/JarvisPLOT.egg-info/top_level.txt +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/MANIFEST.in +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/__init__.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/adapters_ternary.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/adaptive_cdf_runtime.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/bin_stat_runtime.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/cards/std_axes_adapter_config.json +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/colorbar_runtime.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/config_runtime.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/corr_layout.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/corr_layout_diamond.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/corr_order.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/correlation_runtime.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/corrplot_runtime.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/data_pipelines.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/debug_config.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/density_cell_runtime.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/design_runtime.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/distribution_1d_runtime.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/dynesty_runtime.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/figure.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/figure_types.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/forest_debug.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/forest_legend.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/forest_runtime.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/helper.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/interp_2d_runtime.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/interp_natural_neighbor.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/interp_natural_neighbor_exact.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/layout_runtime.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/legend_runtime.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/method_registry.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/posterior_density_runtime.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/posterior_hpd.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/posterior_mesh.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/preprocessor.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/profile_runtime.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/significance_runtime.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/style_runtime.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/__init__.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/agent_digest.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/agent_io.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cache_registry.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cache_store.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/capabilities.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cards/a4paper/1x1/ternary.json +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cards/a4paper/2x1/dynesty_runplot.json +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cards/a4paper/2x1/rect.json +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cards/a4paper/2x1/rect5x1.json +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cards/a4paper/2x1/rect_cmap.json +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cards/a4paper/2x1/rect_marginal.json +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cards/a4paper/2x1/rectratio.json +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cards/a4paper/2x1/ternary.json +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cards/a4paper/2x1/ternary_cmap.json +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cards/a4paper/4x1/rect.json +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cards/a4paper/4x1/rect_cmap.json +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cards/a4paper/4x1/ternary.json +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cards/a4paper/4x1/ternary_cmap.json +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cards/args.json +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cards/colors/colormaps.json +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cards/corrplot/diamond.json +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cards/corrplot/matrix.json +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cards/default/output.json +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cards/flowchart/default.json +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cards/fonts/default.json +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cards/forest/swiss_column.json +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cards/gambit/1x1/ternary.json +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cards/gambit/2x1/rect_cmap.json +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cards/gambit/2x1/ternary.json +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cards/gambit/2x1/ternary_cmap.json +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cards/icons/JarvisHEP.png +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cards/icons/flowchart/JarvisHEP.png +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cards/icons/flowchart/calculator.png +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cards/icons/flowchart/inputfile.png +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cards/icons/flowchart/opera.png +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cards/icons/flowchart/outputfile.png +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cards/icons/flowchart/sampler.png +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cards/icons/gambit.png +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cards/icons/gambit_small.png +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cards/legends/compact/legend-card.json +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cards/legends/default/legend-card.json +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cards/legends/paper/legend-card.json +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cards/legends/presentation/legend-card.json +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cards/style_preference.json +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cli.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cli_help.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/client.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/column_demand.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/column_probe.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/config.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/config_address.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/core.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/core_assets.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/core_runtime.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/data_access.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/data_generation_contracts.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/data_loader_hdf5.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/data_loader_summary.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/dataset_types.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/diagnostics.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/distribution_1d_config.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/expr_names.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/flowchart.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/font_runtime.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/fonts.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/forest_contract.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/forest_text.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/generated_data.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/inner_func.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/legend_cards.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/man_catalog.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/man_methods.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/man_render_agent.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/man_render_human.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/man_transforms.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/manual_cards/agent-output.yaml +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/manual_cards/agent-readme.yaml +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/manual_cards/cache.yaml +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/manual_cards/cli-map.yaml +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/manual_cards/data-columns.yaml +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/manual_cards/debug-overlay.yaml +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/manual_cards/diagnostics.yaml +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/manual_cards/doctor.yaml +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/manual_cards/dryrun-viz.yaml +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/manual_cards/field-interp.yaml +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/manual_cards/fonts.yaml +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/manual_cards/generated-data.yaml +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/manual_cards/layer-method.yaml +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/manual_cards/legend.yaml +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/manual_cards/manifest.yaml +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/manual_cards/method_notes.yaml +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/manual_cards/style-axes.yaml +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/manual_cards/type-correlation-matrix.yaml +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/manual_cards/type-forest.yaml +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/manual_cards/type-posterior-2d.yaml +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/manual_cards/type-profile-2d.yaml +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/manual_cards/workflow.yaml +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/manual_cards/yaml-root.yaml +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/memtrace.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/method_contracts.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/core/common.json +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/core/dataset.json +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/core/distribution-1d.json +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/core/figure.json +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/core/generated-data.json +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/core/layer.json +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/core/legend-card.json +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/core/legend.json +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/core/transform.json +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/manifest.json +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/methods/bar.json +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/methods/barh.json +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/methods/contour.json +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/methods/contourf.json +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/methods/corrplot.json +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/methods/dynesty_runplot.json +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/methods/errorbar.json +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/methods/fill.json +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/methods/fill_between.json +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/methods/fill_betweenx.json +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/methods/hist.json +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/methods/hist2d.json +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/methods/imshow.json +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/methods/jpcontour.json +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/methods/jpcontourf.json +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/methods/jpfield.json +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/methods/pcolor.json +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/methods/pcolormesh.json +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/methods/plot.json +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/methods/quiver.json +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/methods/scatter.json +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/methods/stairs.json +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/methods/step.json +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/methods/tricontour.json +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/methods/tricontourf.json +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/methods/tripcolor.json +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/methods/tripcolor_axes.json +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/methods/triplot.json +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/methods/voronoi.json +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/methods/voronoif.json +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/plot-config.json +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/types/forest.json +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema_catalog.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema_diagnostics.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/templates_catalog.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/utils/__init__.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/utils/cmaps.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/utils/dataframes.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/utils/interpolator.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/utils/pathing.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/verbs/__init__.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/verbs/cache.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/verbs/cap.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/verbs/config_cmd.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/verbs/data.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/verbs/dryrun.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/verbs/explain.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/verbs/fonts.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/verbs/man.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/verbs/suggest.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/verbs/template.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/version.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/yaml_io.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/setup.cfg +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/conftest.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_adaptive_cdf.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_add_column.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_agent_digest.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_agent_envelope.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_axis_title.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_cache_cleanup.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_cache_policy.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_cache_registry.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_capabilities.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_card_debug_shape.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_cli_help.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_cli_verbs.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_cmaps.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_column_existence.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_column_pruning.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_config_addressing.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_config_edit.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_config_expand.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_correlation_runtime.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_corrplot.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_data_access.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_data_describe.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_data_head_eval.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_data_loader_contracts.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_data_pipelines.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_debug_config.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_debug_switches.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_debug_yaml_override.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_density_cell_transform.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_design_runtime.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_diagnostic_guidance.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_distribution_1d_transform.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_doctor_partial.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_examples_validate.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_explain.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_expression_semantics.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_figure_contracts.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_figure_type_expander.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_flowchart_renderer.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_font_runtime.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_fonts.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_fonts_cli.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_forest.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_forest_examples.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_forest_legend.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_forest_text.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_generated_data.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_imshow_adapter.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_interp_2d_transform.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_interp_natural_neighbor.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_interpolator_contracts.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_jpcontour_methods.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_layer_legend.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_legend_cards.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_legend_runtime.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_man_cli.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_method_contracts.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_parse_data_metadata.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_pathing_contracts.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_posterior_hpd.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_profile_runtime.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_release_contract.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_render_defects.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_render_health.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_render_lifecycle.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_row_ledger.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_savefig_provenance.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_schema_catalog.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_suggest.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_suggest_axes.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_template_catalog.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_ternary_debug.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_transform_contracts.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_validation_imports.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_version.py +0 -0
- {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tools/check_release.py +0 -0
|
@@ -4,6 +4,18 @@ Release history of the `JarvisPLOT` distribution (import package `jarvisplot`,
|
|
|
4
4
|
CLI `jplot`). User guides and reference documentation are available in
|
|
5
5
|
[Jarvis-Books `Docs/Jarvis-PLOT/`](https://github.com/Pengxuan-Zhu-Phys/Jarvis-Books/blob/main/Docs/Jarvis-PLOT/README.md).
|
|
6
6
|
|
|
7
|
+
## 2.1.14
|
|
8
|
+
|
|
9
|
+
### Fixed
|
|
10
|
+
|
|
11
|
+
- Render `pcolor` from named coordinates and keep Voronoi boundary fills from
|
|
12
|
+
acquiring Matplotlib's default cycle colour.
|
|
13
|
+
- Load CSV path lists and apply `add_column.fillna` consistently across backends.
|
|
14
|
+
- Allow unambiguous HDF5 leaf names in expressions while retaining full paths.
|
|
15
|
+
- Make doctor honor HDF5 renaming and validity masks, load Functions, count literal
|
|
16
|
+
coordinates, detect missing style axes and avoid duplicate path diagnostics.
|
|
17
|
+
- Advertise only supported `make_interp_2d` methods in capability metadata.
|
|
18
|
+
|
|
7
19
|
## 2.1.13 — 2026-10-29
|
|
8
20
|
### Fixed
|
|
9
21
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: JarvisPLOT
|
|
3
|
-
Version: 2.1.
|
|
3
|
+
Version: 2.1.14
|
|
4
4
|
Summary: Jarvis-PLOT: YAML-driven plotting engine
|
|
5
5
|
Requires-Python: >=3.10
|
|
6
6
|
Description-Content-Type: text/markdown
|
|
@@ -30,7 +30,7 @@ but it can also be used as a **standalone scientific plotting tool**.
|
|
|
30
30
|
|
|
31
31
|
It provides a simple command-line interface (CLI) to generate publication-quality figures from YAML configuration files, with most layout and style decisions handled by predefined profiles and style cards.
|
|
32
32
|
|
|
33
|
-
Current source candidate: **2.1.
|
|
33
|
+
Current source candidate: **2.1.14** (`jplot -v` reports the installed version).
|
|
34
34
|
Release history: [CHANGELOG.md](https://github.com/Pengxuan-Zhu-Phys/Jarvis-PLOT/blob/main/CHANGELOG.md). Design documents and specifications: [Jarvis-Books `Docs/Jarvis-PLOT/`](https://github.com/Pengxuan-Zhu-Phys/Jarvis-Books/blob/main/Docs/Jarvis-PLOT/README.md).
|
|
35
35
|
|
|
36
36
|
---
|
|
@@ -318,6 +318,7 @@ tests/test_release_contract.py
|
|
|
318
318
|
tests/test_render_defects.py
|
|
319
319
|
tests/test_render_health.py
|
|
320
320
|
tests/test_render_lifecycle.py
|
|
321
|
+
tests/test_review_regressions.py
|
|
321
322
|
tests/test_row_ledger.py
|
|
322
323
|
tests/test_savefig_provenance.py
|
|
323
324
|
tests/test_schema_catalog.py
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: JarvisPLOT
|
|
3
|
-
Version: 2.1.
|
|
3
|
+
Version: 2.1.14
|
|
4
4
|
Summary: Jarvis-PLOT: YAML-driven plotting engine
|
|
5
5
|
Requires-Python: >=3.10
|
|
6
6
|
Description-Content-Type: text/markdown
|
|
@@ -30,7 +30,7 @@ but it can also be used as a **standalone scientific plotting tool**.
|
|
|
30
30
|
|
|
31
31
|
It provides a simple command-line interface (CLI) to generate publication-quality figures from YAML configuration files, with most layout and style decisions handled by predefined profiles and style cards.
|
|
32
32
|
|
|
33
|
-
Current source candidate: **2.1.
|
|
33
|
+
Current source candidate: **2.1.14** (`jplot -v` reports the installed version).
|
|
34
34
|
Release history: [CHANGELOG.md](https://github.com/Pengxuan-Zhu-Phys/Jarvis-PLOT/blob/main/CHANGELOG.md). Design documents and specifications: [Jarvis-Books `Docs/Jarvis-PLOT/`](https://github.com/Pengxuan-Zhu-Phys/Jarvis-Books/blob/main/Docs/Jarvis-PLOT/README.md).
|
|
35
35
|
|
|
36
36
|
---
|
|
@@ -5,7 +5,7 @@ but it can also be used as a **standalone scientific plotting tool**.
|
|
|
5
5
|
|
|
6
6
|
It provides a simple command-line interface (CLI) to generate publication-quality figures from YAML configuration files, with most layout and style decisions handled by predefined profiles and style cards.
|
|
7
7
|
|
|
8
|
-
Current source candidate: **2.1.
|
|
8
|
+
Current source candidate: **2.1.14** (`jplot -v` reports the installed version).
|
|
9
9
|
Release history: [CHANGELOG.md](https://github.com/Pengxuan-Zhu-Phys/Jarvis-PLOT/blob/main/CHANGELOG.md). Design documents and specifications: [Jarvis-Books `Docs/Jarvis-PLOT/`](https://github.com/Pengxuan-Zhu-Phys/Jarvis-Books/blob/main/Docs/Jarvis-PLOT/README.md).
|
|
10
10
|
|
|
11
11
|
---
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
2.1.14
|
|
@@ -379,18 +379,24 @@ class StdAxesAdapter:
|
|
|
379
379
|
artists = self.ax.scatter(x, y, **kw)
|
|
380
380
|
return _auto_clip(artists, self.ax, self._clip_path)
|
|
381
381
|
|
|
382
|
+
def pcolor(self, *args, **kwargs):
|
|
383
|
+
return self._quadmesh("pcolor", args, kwargs)
|
|
384
|
+
|
|
382
385
|
def pcolormesh(self, *args, **kwargs):
|
|
383
|
-
""
|
|
386
|
+
return self._quadmesh("pcolormesh", args, kwargs)
|
|
387
|
+
|
|
388
|
+
def _quadmesh(self, method, args, kwargs):
|
|
389
|
+
"""Render either quad-mesh method from coordinates or a compact grid table."""
|
|
384
390
|
if args:
|
|
385
|
-
kw = self._merge(
|
|
386
|
-
artist = self.ax
|
|
391
|
+
kw = self._merge(method, kwargs)
|
|
392
|
+
artist = getattr(self.ax, method)(*args, **kw)
|
|
387
393
|
return _auto_clip(artist, self.ax, self._clip_path)
|
|
388
394
|
|
|
389
395
|
x = np.asarray(kwargs.pop("x"), dtype=float)
|
|
390
396
|
y = np.asarray(kwargs.pop("y"), dtype=float)
|
|
391
397
|
z = np.asarray(kwargs.pop("z", np.zeros_like(x)), dtype=float)
|
|
392
398
|
df = kwargs.pop("__df__", None)
|
|
393
|
-
kw = self._merge(
|
|
399
|
+
kw = self._merge(method, kwargs)
|
|
394
400
|
|
|
395
401
|
# Strip kwargs that are not used by pcolormesh rendering.
|
|
396
402
|
for k in ("shading", "levels", "extend", "space", "marker", "s", "c"):
|
|
@@ -451,7 +457,7 @@ class StdAxesAdapter:
|
|
|
451
457
|
kw.setdefault("zorder", zorder)
|
|
452
458
|
|
|
453
459
|
if norm is not None:
|
|
454
|
-
artist = self.ax
|
|
460
|
+
artist = getattr(self.ax, method)(
|
|
455
461
|
x_edges,
|
|
456
462
|
y_edges,
|
|
457
463
|
grid,
|
|
@@ -460,7 +466,7 @@ class StdAxesAdapter:
|
|
|
460
466
|
**kw,
|
|
461
467
|
)
|
|
462
468
|
else:
|
|
463
|
-
artist = self.ax
|
|
469
|
+
artist = getattr(self.ax, method)(
|
|
464
470
|
x_edges,
|
|
465
471
|
y_edges,
|
|
466
472
|
grid,
|
|
@@ -1251,6 +1257,11 @@ class StdAxesAdapter:
|
|
|
1251
1257
|
kw_edge, kw_face, kw_rest = split_fill_kwargs(kw_all)
|
|
1252
1258
|
kw_edge.update(kw_rest)
|
|
1253
1259
|
kw_face.update(kw_rest)
|
|
1260
|
+
if "color" in kw_all:
|
|
1261
|
+
kw_edge.setdefault("facecolor", kw_all["color"])
|
|
1262
|
+
kw_face.setdefault("facecolor", kw_all["color"])
|
|
1263
|
+
elif "facecolor" not in kw_edge and "fc" not in kw_edge:
|
|
1264
|
+
kw_edge["facecolor"] = kw_all.get("edgecolor", kw_all.get("ec", "none"))
|
|
1254
1265
|
# ---- inputs ----
|
|
1255
1266
|
x = _np.asarray(x)
|
|
1256
1267
|
y = _np.asarray(y)
|
|
@@ -32,7 +32,7 @@ _MISSING_CLIP_PATH = object()
|
|
|
32
32
|
#: coordinates: the grid methods read the ``__grid_*`` metadata off it, and
|
|
33
33
|
#: corrplot reads the whole correlation table -- var names, indices, rho and
|
|
34
34
|
#: the per-pair row count that significance is computed from.
|
|
35
|
-
_GRID_TABLE_METHODS = frozenset({"pcolormesh", "imshow", "corrplot"})
|
|
35
|
+
_GRID_TABLE_METHODS = frozenset({"pcolor", "pcolormesh", "imshow", "corrplot"})
|
|
36
36
|
|
|
37
37
|
def _normalize_layer_combine(value) -> str:
|
|
38
38
|
"""Return the canonical combine spelling while keeping v1 YAML usable."""
|
|
@@ -280,7 +280,7 @@ def add_column(df, adds, logger):
|
|
|
280
280
|
return df
|
|
281
281
|
name = str(adds.get("name")).strip()
|
|
282
282
|
expr = adds.get("expr")
|
|
283
|
-
value = eval_dataframe_expression(df, expr, logger=logger, allow_column=True)
|
|
283
|
+
value = eval_dataframe_expression(df, expr, logger=logger, allow_column=True, fillna=adds.get("fillna"))
|
|
284
284
|
# The frame may be a table other blocks still read (a preprofile pass
|
|
285
285
|
# works on the source itself); add to a copy, never into the caller's.
|
|
286
286
|
df = df.copy(deep=False)
|
|
@@ -25,6 +25,7 @@ JP_ROW_IDX = "__jp_row_idx__"
|
|
|
25
25
|
|
|
26
26
|
class DataSet():
|
|
27
27
|
def __init__(self):
|
|
28
|
+
self.paths: list[str] = []
|
|
28
29
|
self._file: Optional[str] = None
|
|
29
30
|
self.path: Optional[str] = None
|
|
30
31
|
self.rootpath: Optional[str] = None
|
|
@@ -62,9 +63,14 @@ class DataSet():
|
|
|
62
63
|
# transforms (see the ``to_df`` / ``to_ds`` steps).
|
|
63
64
|
self.file = None
|
|
64
65
|
else:
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
66
|
+
raw_paths = dtinfo['path'] if isinstance(dtinfo['path'], list) else [dtinfo['path']]
|
|
67
|
+
paths = [str(resolve_project_path(path, base_dir=rootpath or ".")) for path in raw_paths]
|
|
68
|
+
if not paths:
|
|
69
|
+
raise ValueError("DataSet.path must contain at least one file")
|
|
70
|
+
if len(paths) > 1 and declared_type != "csv":
|
|
71
|
+
raise ValueError("DataSet.path lists currently require type: csv")
|
|
72
|
+
self.file = paths[0]
|
|
73
|
+
self.paths = paths
|
|
68
74
|
self.name = dtinfo['name']
|
|
69
75
|
self.type = declared_type
|
|
70
76
|
self.transform = dtinfo.get("transform", None)
|
|
@@ -118,7 +124,8 @@ class DataSet():
|
|
|
118
124
|
if not wanted:
|
|
119
125
|
return None
|
|
120
126
|
names = [str(c) for c in available]
|
|
121
|
-
keep = [c for c in names if c in wanted
|
|
127
|
+
keep = [c for c in names if c in wanted or
|
|
128
|
+
(self.type == "hdf5" and c.rsplit("/", 1)[-1].rsplit(":", 1)[-1] in wanted)]
|
|
122
129
|
if not any(c != JP_ROW_IDX for c in keep) or len(keep) == len(names):
|
|
123
130
|
return None
|
|
124
131
|
return keep
|
|
@@ -134,8 +141,8 @@ class DataSet():
|
|
|
134
141
|
"""Fetch cheap metadata only; avoid full table load."""
|
|
135
142
|
if self.type == "csv":
|
|
136
143
|
try:
|
|
137
|
-
|
|
138
|
-
|
|
144
|
+
self.keys = list(dict.fromkeys(column for path in (self.paths or [self.path])
|
|
145
|
+
for column in pd.read_csv(path, nrows=0).columns))
|
|
139
146
|
if self.logger:
|
|
140
147
|
self.logger.debug(
|
|
141
148
|
f"Dataset '{self.name}' registered in lazy mode (csv columns={len(self.keys)})."
|
|
@@ -182,6 +189,8 @@ class DataSet():
|
|
|
182
189
|
"transform": self.transform,
|
|
183
190
|
"columns": self.columns,
|
|
184
191
|
"full_load": bool(getattr(self, "full_load", False)),
|
|
192
|
+
"sources": [(path, os.stat(path).st_size, os.stat(path).st_mtime_ns)
|
|
193
|
+
for path in self.paths if os.path.isfile(path)],
|
|
185
194
|
}
|
|
186
195
|
from .distribution_1d_config import distribution_kind
|
|
187
196
|
|
|
@@ -396,13 +405,15 @@ class DataSet():
|
|
|
396
405
|
|
|
397
406
|
@file.setter
|
|
398
407
|
def file(self, value: Optional[str]) -> None:
|
|
399
|
-
if value is None:
|
|
408
|
+
if value is None:
|
|
409
|
+
self.paths = []
|
|
400
410
|
self._file = None
|
|
401
411
|
self.path = None
|
|
402
412
|
self.base = None
|
|
403
413
|
return
|
|
404
414
|
|
|
405
415
|
p = Path(value).expanduser().resolve()
|
|
416
|
+
self.paths = [str(p)]
|
|
406
417
|
self._file = str(p)
|
|
407
418
|
self.path = os.path.abspath(p)
|
|
408
419
|
self.base = os.path.basename(p)
|
|
@@ -426,21 +437,23 @@ class DataSet():
|
|
|
426
437
|
# of the table: dropping them here would silently apply a policy
|
|
427
438
|
# across every column before an explicit transform can decide how
|
|
428
439
|
# required and optional fields should be handled.
|
|
429
|
-
|
|
440
|
+
selected = None
|
|
430
441
|
if self.required_columns:
|
|
431
|
-
header = list(
|
|
442
|
+
header = list(dict.fromkeys(column for path in (self.paths or [self.path])
|
|
443
|
+
for column in pd.read_csv(path, nrows=0).columns))
|
|
432
444
|
planned = self.planned_columns(header)
|
|
433
445
|
if planned is not None:
|
|
434
|
-
#
|
|
435
|
-
#
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
446
|
+
# Union headers allow each input to omit columns supplied
|
|
447
|
+
# by another file; pandas keeps its duplicate-name handling.
|
|
448
|
+
selected = set(planned)
|
|
449
|
+
self._log_column_plan(len(selected), len(header))
|
|
450
|
+
frames = [pd.read_csv(
|
|
451
|
+
path, low_memory=False,
|
|
452
|
+
usecols=(lambda name: name in selected) if selected is not None else None,
|
|
441
453
|
dtype={name: str for name in self.literal_columns},
|
|
442
454
|
keep_default_na=not self.preserve_empty_strings,
|
|
443
|
-
)
|
|
455
|
+
) for path in (self.paths or [self.path])]
|
|
456
|
+
self.data = pd.concat(frames, ignore_index=True, sort=False) if len(frames) > 1 else frames[0]
|
|
444
457
|
self.keys = list(self.data.columns)
|
|
445
458
|
runtime.apply_dataset_transform(self, stage="csv")
|
|
446
459
|
|
|
@@ -419,6 +419,8 @@ def _apply_dataset_transform_polars(
|
|
|
419
419
|
lf = lf.with_columns(key.alias(skey)).sort(skey).drop(skey)
|
|
420
420
|
elif "add_column" in trans:
|
|
421
421
|
adds = trans.get("add_column", {})
|
|
422
|
+
if isinstance(adds, dict) and adds.get("fillna") is not None:
|
|
423
|
+
raise TypeError("add_column.fillna requires the shared pandas evaluator")
|
|
422
424
|
if not isinstance(adds, dict):
|
|
423
425
|
raise TypeError("add_column step must be dict")
|
|
424
426
|
problem = add_column_spec_problem(adds)
|
|
@@ -103,7 +103,7 @@ _GUIDANCE_BY_CODE: dict[str, tuple[str, Optional[str]]] = {
|
|
|
103
103
|
# Data / figures / refs
|
|
104
104
|
"JP-DAT-004": (
|
|
105
105
|
"Paths resolve relative to the config file's directory "
|
|
106
|
-
"(or use the &JP/ prefix for
|
|
106
|
+
"(or use the &JP/ prefix for bundled resource paths).",
|
|
107
107
|
"path: ./DATABASE/samples.csv",
|
|
108
108
|
),
|
|
109
109
|
"JP-DAT-005": (
|
|
@@ -152,6 +152,11 @@ def _dryrun_config(
|
|
|
152
152
|
"type_expanded": [],
|
|
153
153
|
}, bag
|
|
154
154
|
|
|
155
|
+
from .core_assets import load_interpolators
|
|
156
|
+
try:
|
|
157
|
+
load_interpolators(work, yaml_dir=base_dir)
|
|
158
|
+
except Exception as exc:
|
|
159
|
+
bag.error("JP-VIZ-003", "$.Functions", f"could not load Functions: {exc}")
|
|
155
160
|
datasets_meta, frames = _load_datasets(work, base_dir=base_dir, bag=bag)
|
|
156
161
|
forest_layouts = []
|
|
157
162
|
observations: list[LayerObservation] = []
|
|
@@ -356,29 +361,34 @@ def _load_datasets(
|
|
|
356
361
|
meta[name] = {"path": None, "rows": 0, "in_memory": True}
|
|
357
362
|
continue
|
|
358
363
|
raw_path = entry.get("path")
|
|
359
|
-
if
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
f"$.DataSet[{index}].path",
|
|
363
|
-
f"dataset {name!r} has no single string path; dryrun skips it",
|
|
364
|
-
)
|
|
364
|
+
paths = raw_path if isinstance(raw_path, list) else [raw_path]
|
|
365
|
+
if not paths or not all(isinstance(path, str) for path in paths):
|
|
366
|
+
bag.error("JP-DAT-004", f"$.DataSet[{index}].path", f"dataset {name!r} needs a path or path list")
|
|
365
367
|
continue
|
|
366
|
-
resolved = resolve_project_path(
|
|
367
|
-
if not
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
368
|
+
resolved = [resolve_project_path(path, base_dir) for path in paths]
|
|
369
|
+
missing = [path for path in resolved if not path.exists()]
|
|
370
|
+
if missing:
|
|
371
|
+
bag.error("JP-DAT-004", f"$.DataSet[{index}].path", f"data file not found: {missing[0]}")
|
|
372
|
+
meta[name] = {"path": str(missing[0]), "rows": None, "error": "missing"}
|
|
373
|
+
continue
|
|
374
|
+
kind = str(entry.get("type") or detect_type(str(resolved[0]), "auto"))
|
|
375
|
+
display_path = str(resolved[0]) if len(resolved) == 1 else [str(path) for path in resolved]
|
|
376
|
+
if len(resolved) > 1 and kind != "csv":
|
|
377
|
+
bag.error("JP-DAT-006", f"$.DataSet[{index}].path", "DataSet.path lists currently require type: csv")
|
|
374
378
|
continue
|
|
375
|
-
kind = str(entry.get("type") or detect_type(str(resolved), "auto"))
|
|
376
379
|
try:
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
380
|
+
if kind == "hdf5":
|
|
381
|
+
import logging
|
|
382
|
+
from .data_loader import DataSet
|
|
383
|
+
loader = DataSet()
|
|
384
|
+
loader.logger = logging.getLogger("jarvisplot.dryrun.data")
|
|
385
|
+
spec = dict(entry)
|
|
386
|
+
spec.pop("transform", None)
|
|
387
|
+
loader.setinfo(spec, rootpath=base_dir, eager=True)
|
|
388
|
+
df = loader.get_data()
|
|
389
|
+
else:
|
|
390
|
+
tables = [load_dataframe(str(path), kind=kind) for path in resolved]
|
|
391
|
+
df = pd.concat(tables, ignore_index=True, sort=False) if len(tables) > 1 else tables[0]
|
|
382
392
|
# dataset-level transform (simple steps only)
|
|
383
393
|
_heavy = []
|
|
384
394
|
ds_transform = entry.get("transform")
|
|
@@ -387,7 +397,7 @@ def _load_datasets(
|
|
|
387
397
|
rows = int(len(df))
|
|
388
398
|
frames[name] = df
|
|
389
399
|
meta[name] = {
|
|
390
|
-
"path":
|
|
400
|
+
"path": display_path,
|
|
391
401
|
"type": kind,
|
|
392
402
|
"rows": rows,
|
|
393
403
|
"columns": [str(c) for c in df.columns],
|
|
@@ -399,7 +409,7 @@ def _load_datasets(
|
|
|
399
409
|
f"$.DataSet[{index}]",
|
|
400
410
|
f"could not load dataset {name!r}: {exc}",
|
|
401
411
|
)
|
|
402
|
-
meta[name] = {"path":
|
|
412
|
+
meta[name] = {"path": display_path, "rows": None, "error": str(exc)}
|
|
403
413
|
return meta, frames
|
|
404
414
|
|
|
405
415
|
|
|
@@ -598,6 +608,11 @@ def _observe_layer(
|
|
|
598
608
|
incomplete_sources = incomplete_sources or set()
|
|
599
609
|
data_blocks = layer.get("data") or []
|
|
600
610
|
if not isinstance(data_blocks, list) or not data_blocks:
|
|
611
|
+
if layer.get("coordinates"):
|
|
612
|
+
import pandas as pd
|
|
613
|
+
obs = observe_layer_dataframe(figure=figure_name, layer=layer, df=pd.DataFrame(),
|
|
614
|
+
frame_cfg=frame_cfg, source="<literal>")
|
|
615
|
+
return obs, None, []
|
|
601
616
|
return (
|
|
602
617
|
LayerObservation(
|
|
603
618
|
figure=figure_name,
|
|
@@ -690,7 +705,7 @@ def _observe_layer(
|
|
|
690
705
|
source=", ".join(source_labels),
|
|
691
706
|
n_points=0,
|
|
692
707
|
notes=notes or ["no loadable data blocks"],
|
|
693
|
-
incomplete=incomplete_source_seen,
|
|
708
|
+
incomplete=incomplete_source_seen or bool(heavy_skipped),
|
|
694
709
|
),
|
|
695
710
|
None,
|
|
696
711
|
heavy_skipped,
|
|
@@ -267,9 +267,12 @@ def observe_layer_dataframe(
|
|
|
267
267
|
|
|
268
268
|
|
|
269
269
|
def _eval_axis_expr(df, coordinates: Mapping[str, Any], name: str, eval_fn) -> Any:
|
|
270
|
+
import numpy as np
|
|
270
271
|
if name not in coordinates:
|
|
271
272
|
return None
|
|
272
273
|
spec = coordinates[name]
|
|
274
|
+
if isinstance(spec, (list, tuple, np.ndarray)):
|
|
275
|
+
return np.asarray(spec)
|
|
273
276
|
expr = spec.get("expr") if isinstance(spec, Mapping) else spec
|
|
274
277
|
if expr is None and isinstance(spec, Mapping):
|
|
275
278
|
expr = spec.get("name")
|
|
@@ -918,11 +918,8 @@ TRANSFORM_CONTRACTS: dict[str, dict[str, Any]] = {
|
|
|
918
918
|
enums={
|
|
919
919
|
"method": [
|
|
920
920
|
"natural_neighbor",
|
|
921
|
-
"
|
|
922
|
-
"cubic",
|
|
923
|
-
"nearest",
|
|
921
|
+
"triangulation",
|
|
924
922
|
"griddata",
|
|
925
|
-
"rbf",
|
|
926
923
|
],
|
|
927
924
|
"nan_policy": ["strict", "ignore", "fill"],
|
|
928
925
|
"backend_options.boundary": ["nan", "clamp", "nearest"],
|
|
@@ -201,7 +201,15 @@ def _expression_locals(df: pd.DataFrame, names) -> dict[str, Any]:
|
|
|
201
201
|
"""Only the columns the expression reads, as Series."""
|
|
202
202
|
if not df.columns.is_unique:
|
|
203
203
|
return df.to_dict("series")
|
|
204
|
-
|
|
204
|
+
values = {name: df[name] for name in names if name in df.columns}
|
|
205
|
+
# HDF5 paths remain usable verbatim; an unambiguous leaf also works in arithmetic.
|
|
206
|
+
for name in names:
|
|
207
|
+
if name in values:
|
|
208
|
+
continue
|
|
209
|
+
matches = [column for column in df.columns if str(column).rsplit("/", 1)[-1].rsplit(":", 1)[-1] == name]
|
|
210
|
+
if len(matches) == 1:
|
|
211
|
+
values[name] = df[matches[0]]
|
|
212
|
+
return values
|
|
205
213
|
|
|
206
214
|
|
|
207
215
|
def build_eval_globals(extra: Optional[Mapping[str, Any]] = None) -> dict[str, Any]:
|
|
@@ -132,12 +132,13 @@ def validate_config(
|
|
|
132
132
|
_check_layer_sources(config, set(resolved_paths) | _collect_shared_names(config), bag)
|
|
133
133
|
_check_layer_keys(config, bag)
|
|
134
134
|
_check_method_contracts(config, bag)
|
|
135
|
+
_check_style_axes(config, bag)
|
|
135
136
|
_check_corrplot_contracts(config, bag)
|
|
136
137
|
_check_forest_contracts(config, bag, base_dir=base_dir)
|
|
137
138
|
_check_legend_contracts(config, bag, base_dir=base_dir)
|
|
138
139
|
_check_ignored_keys(config, bag)
|
|
139
140
|
if check_columns:
|
|
140
|
-
_check_columns_exist(config, resolved_paths, bag)
|
|
141
|
+
_check_columns_exist(config, resolved_paths, bag, base_dir)
|
|
141
142
|
return bag
|
|
142
143
|
|
|
143
144
|
|
|
@@ -276,7 +277,7 @@ def _check_dataset_files(
|
|
|
276
277
|
f"data file not found: {resolved}",
|
|
277
278
|
suggestion=(
|
|
278
279
|
"Paths resolve relative to the config file's directory "
|
|
279
|
-
"(or use the &JP/ prefix for
|
|
280
|
+
"(or use the &JP/ prefix for bundled resource paths)."
|
|
280
281
|
),
|
|
281
282
|
context={"declared": source, "resolved": str(resolved)},
|
|
282
283
|
)
|
|
@@ -288,6 +289,31 @@ def _check_dataset_files(
|
|
|
288
289
|
# --------------------------------------------------------------------------- #
|
|
289
290
|
|
|
290
291
|
|
|
292
|
+
def _check_style_axes(config: dict[str, Any], bag: DiagnosticBag) -> None:
|
|
293
|
+
from .core_assets import load_styles
|
|
294
|
+
from .utils.pathing import resolve_project_path
|
|
295
|
+
from .Figure.style_runtime import resolve_style_bundle_payload
|
|
296
|
+
|
|
297
|
+
styles = load_styles(lambda path: str(resolve_project_path(path)))
|
|
298
|
+
for index, figure in enumerate(config.get("Figures") or ()):
|
|
299
|
+
if not isinstance(figure, dict) or figure.get("enable", True) is False or figure.get("type"):
|
|
300
|
+
continue
|
|
301
|
+
tokens = figure.get("style", ["a4paper_2x1", "rect"])
|
|
302
|
+
try:
|
|
303
|
+
_, _, bundle = resolve_style_bundle_payload(styles, tokens)
|
|
304
|
+
frame = bundle.get("Frame") or {}
|
|
305
|
+
custom = figure.get("frame") or {}
|
|
306
|
+
axes = set(frame) | set(custom)
|
|
307
|
+
if not axes:
|
|
308
|
+
raise ValueError("style card defines no axes")
|
|
309
|
+
for layer in figure.get("layers") or ():
|
|
310
|
+
if isinstance(layer, dict) and layer.get("axes") and layer["axes"] not in axes:
|
|
311
|
+
raise ValueError(f"layer {layer.get('name')!r} requests missing axes {layer['axes']!r}")
|
|
312
|
+
except (KeyError, TypeError, ValueError) as exc:
|
|
313
|
+
bag.error("JP-VIZ-000", f"$.Figures[{index}].style", f"invalid style/axes: {exc}",
|
|
314
|
+
suggestion="Choose a style card with the layer's axes; see jplot cap styles --json.")
|
|
315
|
+
|
|
316
|
+
|
|
291
317
|
def _check_unique_names(config: dict[str, Any], bag: DiagnosticBag) -> None:
|
|
292
318
|
"""Names are addresses. A duplicate silently redirects or overwrites."""
|
|
293
319
|
_report_duplicates(
|
|
@@ -431,6 +457,7 @@ def _check_columns_exist(
|
|
|
431
457
|
config: dict[str, Any],
|
|
432
458
|
resolved_paths: dict[str, str],
|
|
433
459
|
bag: DiagnosticBag,
|
|
460
|
+
base_dir: str | None = None,
|
|
434
461
|
) -> None:
|
|
435
462
|
"""Answer "does column 'aa' exist?" before the renderer raises `name 'aa' is not defined`.
|
|
436
463
|
|
|
@@ -469,6 +496,10 @@ def _check_columns_exist(
|
|
|
469
496
|
continue
|
|
470
497
|
|
|
471
498
|
probe = probe_dataset_columns(entry, path)
|
|
499
|
+
if isinstance(entry.get("path"), list):
|
|
500
|
+
for raw in entry["path"]:
|
|
501
|
+
extra = probe_dataset_columns(entry, str(resolve_project_path(raw, base_dir)))
|
|
502
|
+
probe.names.update(extra.names)
|
|
472
503
|
if probe.error:
|
|
473
504
|
bag.warning(
|
|
474
505
|
"JP-COL-900",
|
|
@@ -63,8 +63,10 @@ def run(argv: Sequence[str], *, prog: str = "jplot doctor") -> int:
|
|
|
63
63
|
merged = DiagnosticBag()
|
|
64
64
|
for d in vbag:
|
|
65
65
|
merged.add(d)
|
|
66
|
+
seen = {(d.code, str(d.path)) for d in vbag}
|
|
66
67
|
for d in dbag:
|
|
67
|
-
|
|
68
|
+
if (d.code, str(d.path)) not in seen:
|
|
69
|
+
merged.add(d)
|
|
68
70
|
|
|
69
71
|
dryrun_verdict = report.get("ok")
|
|
70
72
|
coverage = str(report.get("coverage") or ("full" if dbag.ok else "failed"))
|