jarvisplot 2.0.0__tar.gz → 2.0.2__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.
Files changed (214) hide show
  1. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/JarvisPLOT.egg-info/PKG-INFO +1 -1
  2. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/PKG-INFO +1 -1
  3. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/Figure/figure.py +5 -2
  4. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/Figure/layout_runtime.py +15 -0
  5. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/cards/flowchart/default.json +1 -1
  6. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/core.py +12 -1
  7. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/flowchart.py +21 -5
  8. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/pyproject.toml +1 -1
  9. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_agent_digest.py +25 -0
  10. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_figure_contracts.py +33 -0
  11. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_flowchart_renderer.py +64 -1
  12. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/JarvisPLOT.egg-info/SOURCES.txt +0 -0
  13. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/JarvisPLOT.egg-info/dependency_links.txt +0 -0
  14. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/JarvisPLOT.egg-info/entry_points.txt +0 -0
  15. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/JarvisPLOT.egg-info/requires.txt +0 -0
  16. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/JarvisPLOT.egg-info/top_level.txt +0 -0
  17. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/README.md +0 -0
  18. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/Figure/__init__.py +0 -0
  19. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/Figure/adapters_rect.py +0 -0
  20. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/Figure/adapters_ternary.py +0 -0
  21. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/Figure/cards/std_axes_adapter_config.json +0 -0
  22. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/Figure/colorbar_runtime.py +0 -0
  23. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/Figure/config_runtime.py +0 -0
  24. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/Figure/data_pipelines.py +0 -0
  25. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/Figure/density_cell_runtime.py +0 -0
  26. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/Figure/design_runtime.py +0 -0
  27. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/Figure/dynesty_runtime.py +0 -0
  28. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/Figure/figure_types.py +0 -0
  29. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/Figure/helper.py +0 -0
  30. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/Figure/interp_2d_runtime.py +0 -0
  31. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/Figure/interp_natural_neighbor.py +0 -0
  32. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/Figure/interp_natural_neighbor_exact.py +0 -0
  33. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/Figure/layer_runtime.py +0 -0
  34. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/Figure/method_registry.py +0 -0
  35. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/Figure/posterior_density_runtime.py +0 -0
  36. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/Figure/posterior_hpd.py +0 -0
  37. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/Figure/posterior_mesh.py +0 -0
  38. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/Figure/preprocessor.py +0 -0
  39. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/Figure/preprocessor_runtime.py +0 -0
  40. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/Figure/profile_runtime.py +0 -0
  41. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/Figure/style_runtime.py +0 -0
  42. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/__init__.py +0 -0
  43. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/agent_digest.py +0 -0
  44. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/agent_io.py +0 -0
  45. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/cache_store.py +0 -0
  46. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/capabilities.py +0 -0
  47. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/cards/a4paper/1x1/ternary.json +0 -0
  48. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/cards/a4paper/2x1/dynesty_runplot.json +0 -0
  49. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/cards/a4paper/2x1/rect.json +0 -0
  50. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/cards/a4paper/2x1/rect5x1.json +0 -0
  51. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/cards/a4paper/2x1/rect_cmap.json +0 -0
  52. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/cards/a4paper/2x1/ternary.json +0 -0
  53. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/cards/a4paper/2x1/ternary_cmap.json +0 -0
  54. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/cards/a4paper/4x1/rect.json +0 -0
  55. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/cards/a4paper/4x1/rect_cmap.json +0 -0
  56. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/cards/a4paper/4x1/ternary.json +0 -0
  57. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/cards/a4paper/4x1/ternary_cmap.json +0 -0
  58. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/cards/args.json +0 -0
  59. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/cards/colors/colormaps.json +0 -0
  60. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/cards/default/output.json +0 -0
  61. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/cards/gambit/1x1/ternary.json +0 -0
  62. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/cards/gambit/2x1/rect_cmap.json +0 -0
  63. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/cards/gambit/2x1/ternary.json +0 -0
  64. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/cards/gambit/2x1/ternary_cmap.json +0 -0
  65. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/cards/icons/JarvisHEP.png +0 -0
  66. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/cards/icons/flowchart/JarvisHEP.png +0 -0
  67. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/cards/icons/flowchart/calculator.png +0 -0
  68. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/cards/icons/flowchart/inputfile.png +0 -0
  69. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/cards/icons/flowchart/opera.png +0 -0
  70. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/cards/icons/flowchart/outputfile.png +0 -0
  71. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/cards/icons/flowchart/sampler.png +0 -0
  72. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/cards/icons/gambit.png +0 -0
  73. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/cards/icons/gambit_small.png +0 -0
  74. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/cards/style_preference.json +0 -0
  75. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/cli.py +0 -0
  76. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/cli_help.py +0 -0
  77. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/client.py +0 -0
  78. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/column_demand.py +0 -0
  79. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/column_probe.py +0 -0
  80. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/config.py +0 -0
  81. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/config_address.py +0 -0
  82. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/core_assets.py +0 -0
  83. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/core_runtime.py +0 -0
  84. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/data_access.py +0 -0
  85. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/data_loader.py +0 -0
  86. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/data_loader_hdf5.py +0 -0
  87. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/data_loader_runtime.py +0 -0
  88. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/data_loader_summary.py +0 -0
  89. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/diagnostic_guidance.py +0 -0
  90. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/diagnostics.py +0 -0
  91. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/dryrun_runtime.py +0 -0
  92. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/expr_names.py +0 -0
  93. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/fix_apply.py +0 -0
  94. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/inner_func.py +0 -0
  95. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/man_catalog.py +0 -0
  96. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/man_methods.py +0 -0
  97. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/man_render_agent.py +0 -0
  98. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/man_render_human.py +0 -0
  99. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/man_transforms.py +0 -0
  100. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/manual_cards/agent-output.yaml +0 -0
  101. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/manual_cards/cli-map.yaml +0 -0
  102. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/manual_cards/data-columns.yaml +0 -0
  103. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/manual_cards/diagnostics.yaml +0 -0
  104. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/manual_cards/dryrun-viz.yaml +0 -0
  105. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/manual_cards/layer-method.yaml +0 -0
  106. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/manual_cards/manifest.yaml +0 -0
  107. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/manual_cards/method_notes.yaml +0 -0
  108. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/manual_cards/style-axes.yaml +0 -0
  109. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/manual_cards/type-posterior-2d.yaml +0 -0
  110. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/manual_cards/type-profile-2d.yaml +0 -0
  111. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/manual_cards/validate.yaml +0 -0
  112. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/manual_cards/workflow.yaml +0 -0
  113. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/manual_cards/yaml-root.yaml +0 -0
  114. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/memtrace.py +0 -0
  115. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/method_contracts.py +0 -0
  116. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/render_health.py +0 -0
  117. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/schema/core/common.json +0 -0
  118. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/schema/core/dataset.json +0 -0
  119. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/schema/core/figure.json +0 -0
  120. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/schema/core/layer.json +0 -0
  121. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/schema/core/transform.json +0 -0
  122. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/schema/manifest.json +0 -0
  123. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/schema/methods/bar.json +0 -0
  124. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/schema/methods/barh.json +0 -0
  125. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/schema/methods/contour.json +0 -0
  126. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/schema/methods/contourf.json +0 -0
  127. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/schema/methods/dynesty_runplot.json +0 -0
  128. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/schema/methods/errorbar.json +0 -0
  129. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/schema/methods/fill.json +0 -0
  130. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/schema/methods/fill_between.json +0 -0
  131. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/schema/methods/fill_betweenx.json +0 -0
  132. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/schema/methods/hist.json +0 -0
  133. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/schema/methods/imshow.json +0 -0
  134. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/schema/methods/jpcontour.json +0 -0
  135. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/schema/methods/jpcontourf.json +0 -0
  136. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/schema/methods/jpfield.json +0 -0
  137. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/schema/methods/pcolor.json +0 -0
  138. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/schema/methods/pcolormesh.json +0 -0
  139. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/schema/methods/plot.json +0 -0
  140. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/schema/methods/quiver.json +0 -0
  141. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/schema/methods/scatter.json +0 -0
  142. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/schema/methods/step.json +0 -0
  143. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/schema/methods/tricontour.json +0 -0
  144. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/schema/methods/tricontourf.json +0 -0
  145. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/schema/methods/tripcolor.json +0 -0
  146. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/schema/methods/tripcolor_axes.json +0 -0
  147. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/schema/methods/triplot.json +0 -0
  148. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/schema/methods/voronoi.json +0 -0
  149. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/schema/methods/voronoif.json +0 -0
  150. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/schema/plot-config.json +0 -0
  151. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/schema_catalog.py +0 -0
  152. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/schema_diagnostics.py +0 -0
  153. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/templates_catalog.py +0 -0
  154. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/transform_contracts.py +0 -0
  155. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/utils/__init__.py +0 -0
  156. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/utils/cmaps.py +0 -0
  157. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/utils/dataframes.py +0 -0
  158. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/utils/expression.py +0 -0
  159. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/utils/interpolator.py +0 -0
  160. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/utils/pathing.py +0 -0
  161. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/validation.py +0 -0
  162. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/verbs/__init__.py +0 -0
  163. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/verbs/cap.py +0 -0
  164. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/verbs/config_cmd.py +0 -0
  165. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/verbs/data.py +0 -0
  166. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/verbs/doctor.py +0 -0
  167. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/verbs/dryrun.py +0 -0
  168. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/verbs/explain.py +0 -0
  169. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/verbs/man.py +0 -0
  170. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/verbs/suggest.py +0 -0
  171. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/verbs/template.py +0 -0
  172. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/verbs/validate.py +0 -0
  173. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/yaml_io.py +0 -0
  174. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/setup.cfg +0 -0
  175. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_agent_envelope.py +0 -0
  176. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_axis_title.py +0 -0
  177. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_capabilities.py +0 -0
  178. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_cli_help.py +0 -0
  179. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_cli_verbs.py +0 -0
  180. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_cmaps.py +0 -0
  181. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_column_existence.py +0 -0
  182. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_config_addressing.py +0 -0
  183. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_config_edit.py +0 -0
  184. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_config_expand.py +0 -0
  185. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_data_access.py +0 -0
  186. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_data_describe.py +0 -0
  187. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_data_head_eval.py +0 -0
  188. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_data_loader_contracts.py +0 -0
  189. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_data_pipelines.py +0 -0
  190. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_density_cell_transform.py +0 -0
  191. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_diagnostic_guidance.py +0 -0
  192. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_docs_status_labels.py +0 -0
  193. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_doctor_partial.py +0 -0
  194. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_explain.py +0 -0
  195. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_figure_type_expander.py +0 -0
  196. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_fix_application.py +0 -0
  197. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_interp_2d_transform.py +0 -0
  198. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_interp_natural_neighbor.py +0 -0
  199. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_interpolator_contracts.py +0 -0
  200. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_jpcontour_methods.py +0 -0
  201. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_man_cli.py +0 -0
  202. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_method_contracts.py +0 -0
  203. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_parse_data_metadata.py +0 -0
  204. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_pathing_contracts.py +0 -0
  205. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_posterior_hpd.py +0 -0
  206. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_render_health.py +0 -0
  207. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_row_ledger.py +0 -0
  208. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_schema_catalog.py +0 -0
  209. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_suggest.py +0 -0
  210. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_suggest_axes.py +0 -0
  211. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_template_catalog.py +0 -0
  212. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_template_json.py +0 -0
  213. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_transform_contracts.py +0 -0
  214. {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_validate_no_matplotlib.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: JarvisPLOT
3
- Version: 2.0.0
3
+ Version: 2.0.2
4
4
  Summary: Jarvis-PLOT: YAML-driven plotting engine
5
5
  Requires-Python: >=3.10
6
6
  Description-Content-Type: text/markdown
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: JarvisPLOT
3
- Version: 2.0.0
3
+ Version: 2.0.2
4
4
  Summary: Jarvis-PLOT: YAML-driven plotting engine
5
5
  Requires-Python: >=3.10
6
6
  Description-Content-Type: text/markdown
@@ -26,6 +26,7 @@ from .layout_runtime import (
26
26
  apply_manual_ticks,
27
27
  ensure_numbered_rect_axes,
28
28
  has_manual_ticks,
29
+ hide_log_minor_tick_labels,
29
30
  is_numbered_ax,
30
31
  )
31
32
  from .colorbar_runtime import (
@@ -802,6 +803,7 @@ class Figure:
802
803
  self.ax.set_yscale("log")
803
804
  from matplotlib.ticker import LogLocator
804
805
  self.ax.yaxis.set_minor_locator(LogLocator(subs='auto'))
806
+ hide_log_minor_tick_labels(self.ax, "y")
805
807
  else:
806
808
  self.ax.yaxis.set_minor_locator(AutoMinorLocator())
807
809
 
@@ -809,6 +811,7 @@ class Figure:
809
811
  self.ax.set_xscale("log")
810
812
  from matplotlib.ticker import LogLocator
811
813
  self.ax.xaxis.set_minor_locator(LogLocator(subs='auto'))
814
+ hide_log_minor_tick_labels(self.ax, "x")
812
815
  else:
813
816
  self.ax.xaxis.set_minor_locator(AutoMinorLocator())
814
817
 
@@ -838,8 +841,8 @@ class Figure:
838
841
 
839
842
  # Apply manual ticks here at initialization if provided in YAML
840
843
  ax_ticks_cfg = self.frame.get('ax', {}).get('ticks', {})
841
- # self._apply_manual_ticks(self.ax, "x", ax_ticks_cfg.get('x', {}))
842
- # self._apply_manual_ticks(self.ax, "y", ax_ticks_cfg.get('y', {}))
844
+ self._apply_manual_ticks(self.ax, "x", ax_ticks_cfg.get('x', {}))
845
+ self._apply_manual_ticks(self.ax, "y", ax_ticks_cfg.get('y', {}))
843
846
 
844
847
 
845
848
  self.ax.tick_params(**self.frame['ax']['ticks'].get("both", {}))
@@ -61,6 +61,19 @@ def apply_axis_title(fig, ax_obj, ax_name: str) -> None:
61
61
  ax_obj.text(s=str(title), **text_params)
62
62
 
63
63
 
64
+ def hide_log_minor_tick_labels(ax_obj, which: str) -> None:
65
+ """Keep log minor tick marks, but hide their labels by default."""
66
+ target = ax_obj.ax if hasattr(ax_obj, "ax") else ax_obj
67
+ if which == "x":
68
+ target.tick_params(
69
+ axis="x", which="minor", labelbottom=False, labeltop=False
70
+ )
71
+ elif which == "y":
72
+ target.tick_params(
73
+ axis="y", which="minor", labelleft=False, labelright=False
74
+ )
75
+
76
+
64
77
  def ensure_numbered_rect_axes(fig, ax_name: str, kwgs: dict):
65
78
  if not is_numbered_ax(ax_name):
66
79
  raise ValueError(f"Illegal dynamic axes name '{ax_name}'. Only ax<NUMBER> is allowed.")
@@ -88,12 +101,14 @@ def ensure_numbered_rect_axes(fig, ax_name: str, kwgs: dict):
88
101
  if fig.frame.get(ax_name, {}).get("yscale", "").lower() == "log":
89
102
  ax_obj.set_yscale("log")
90
103
  ax_obj.yaxis.set_minor_locator(LogLocator(subs="auto"))
104
+ hide_log_minor_tick_labels(ax_obj, "y")
91
105
  else:
92
106
  ax_obj.yaxis.set_minor_locator(AutoMinorLocator())
93
107
 
94
108
  if fig.frame.get(ax_name, {}).get("xscale", "").lower() == "log":
95
109
  ax_obj.set_xscale("log")
96
110
  ax_obj.xaxis.set_minor_locator(LogLocator(subs="auto"))
111
+ hide_log_minor_tick_labels(ax_obj, "x")
97
112
  else:
98
113
  ax_obj.xaxis.set_minor_locator(AutoMinorLocator())
99
114
 
@@ -14,7 +14,7 @@
14
14
  "variable_dx": 2.55,
15
15
  "input_variable_dx": 2.55,
16
16
  "output_variable_dx": 3.25,
17
- "bridge_y_offset": 0.45,
17
+ "bridge_y_offset": 0.55,
18
18
  "bridge_output_pad": 0.18,
19
19
  "module_icon_size": 0.9,
20
20
  "module_label_dy": -0.45,
@@ -285,11 +285,22 @@ class JarvisPLOT():
285
285
  def _maybe_write_agent_digest(self, figure_cfg, figobj) -> None:
286
286
  """Write figure-level agent_output digest after a successful plot."""
287
287
  try:
288
- from .agent_digest import load_figure_source_dataframe, maybe_write_figure_digest
288
+ from .agent_digest import (
289
+ load_figure_source_dataframe,
290
+ maybe_write_figure_digest,
291
+ parse_agent_output,
292
+ )
289
293
  from .cli import JPLOT_VERSION
290
294
 
291
295
  if not isinstance(figure_cfg, dict):
292
296
  return
297
+ # Do not load the source dataframe just to discover that no agent
298
+ # digest was requested. This matters after rendering releases the
299
+ # last layer's source data.
300
+ root_config = getattr(self.yaml, "config", {}) or {}
301
+ root_output = root_config.get("output", {}) if isinstance(root_config, dict) else {}
302
+ if parse_agent_output(figure_cfg, root_output=root_output) is None:
303
+ return
293
304
  # Prefer raw YAML figure block (pre type-expand may have type: fields).
294
305
  # After expand_figure_types, config figures are already expanded; still OK.
295
306
  df = load_figure_source_dataframe(self, figure_cfg)
@@ -412,6 +412,7 @@ class _ClassicGraph:
412
412
  self.output_variable_dx = float(self.classic.get("output_variable_dx", self.variable_dx))
413
413
  self.bridge_y_offset = float(self.classic.get("bridge_y_offset", 0.45))
414
414
  self.bridge_output_pad = float(self.classic.get("bridge_output_pad", 0.18))
415
+ self.module_icon_size = float(self.classic.get("module_icon_size", 0.9))
415
416
  self.mains: dict[str, dict] = {}
416
417
  self.files: dict[str, dict] = {}
417
418
  self.variables: dict[str, dict] = {}
@@ -585,7 +586,7 @@ class _ClassicGraph:
585
586
  y = cursor - height / 2.0
586
587
  self._place_main_group(main_id, x, y, height)
587
588
  cursor -= height + self.group_gap
588
- self._place_standalone_bridges(layer_id, x, max_height)
589
+ self._place_standalone_bridges(layer_id, x, max_height, layer_groups.get(layer_id, []))
589
590
 
590
591
  self._place_unpositioned_variables(max_height)
591
592
  self._compute_bounds(max_height)
@@ -704,11 +705,20 @@ class _ClassicGraph:
704
705
  self._place_variable(var_id, x - self.input_variable_dx, y, align="right")
705
706
  self._place_variables(self._direct_output_variables(main_id), x + self.output_variable_dx, y, align="right")
706
707
 
707
- def _place_standalone_bridges(self, layer_id: str, x: float, max_height: float) -> None:
708
+ def _place_standalone_bridges(self, layer_id: str, x: float, max_height: float, main_ids: list[str]) -> None:
708
709
  bridges = self._standalone_bridges(layer_id)
709
710
  if not bridges:
710
711
  return
711
- ys = self._spread_y(max_height / 2.0 + self.bridge_y_offset, len(bridges), self.var_gap)
712
+ main_items = [self.mains[main_id] for main_id in main_ids if main_id in self.mains]
713
+ if main_items:
714
+ module_top = max(item["pos"][1] + self.module_icon_size / 2.0 for item in main_items)
715
+ lowest_bridge_y = module_top + self.bridge_y_offset
716
+ ys = [
717
+ lowest_bridge_y + (len(bridges) - 1 - idx) * self.var_gap
718
+ for idx in range(len(bridges))
719
+ ]
720
+ else:
721
+ ys = self._spread_y(max_height / 2.0 + self.bridge_y_offset, len(bridges), self.var_gap)
712
722
  for node_id, y in zip(bridges, ys):
713
723
  label = str(self.nodes[node_id].get("label") or "")
714
724
  self.bridges[node_id] = {
@@ -823,12 +833,18 @@ class _ClassicGraph:
823
833
  return [str(node_id) for node_id in layer.get("nodes", [])]
824
834
  return []
825
835
 
826
- def _bridge_order_key(self, bridge_id: str) -> tuple[int, int, str]:
836
+ def _bridge_order_key(self, bridge_id: str) -> tuple[float, float, str]:
827
837
  source_id = None
828
838
  for edge in self.edges:
829
839
  if str(edge.get("target", {}).get("node")) == bridge_id:
830
840
  source_id = str(edge.get("source", {}).get("node"))
831
841
  break
842
+
843
+ source_item = self.variables.get(source_id or "") or self.bridges.get(source_id or "")
844
+ if source_item is not None:
845
+ # Preserve the actual top-to-bottom order of the previous layer.
846
+ return (0.0, -float(source_item["pos"][1]), bridge_id)
847
+
832
848
  source_node = self.nodes.get(source_id or "")
833
849
  source_layer = str(source_node.get("layer", "")) if isinstance(source_node, Mapping) else ""
834
850
  layer_ids = self._layer_node_ids(source_layer)
@@ -841,7 +857,7 @@ class _ClassicGraph:
841
857
  if str(layer.get("id")) == source_layer:
842
858
  layer_pos = idx
843
859
  break
844
- return (layer_pos, source_pos, bridge_id)
860
+ return (float(layer_pos + 1), float(source_pos), bridge_id)
845
861
 
846
862
  def _incoming_variables(self, target_id: str) -> list[str]:
847
863
  return self._unique(
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "JarvisPLOT"
7
- version = "2.0.0"
7
+ version = "2.0.2"
8
8
  description = "Jarvis-PLOT: YAML-driven plotting engine"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -5,6 +5,7 @@ from __future__ import annotations
5
5
  import json
6
6
  import textwrap
7
7
  from pathlib import Path
8
+ from types import SimpleNamespace
8
9
 
9
10
  import numpy as np
10
11
 
@@ -18,6 +19,30 @@ from jarvisplot.client import main
18
19
  from jarvisplot.diagnostics import DiagnosticBag
19
20
 
20
21
 
22
+ def test_render_skips_agent_digest_source_load_when_not_requested(monkeypatch):
23
+ from jarvisplot.core import JarvisPLOT
24
+
25
+ core = JarvisPLOT()
26
+ core.yaml = SimpleNamespace(config={"output": {}})
27
+ core.logger = SimpleNamespace(warning=lambda *args, **kwargs: None)
28
+
29
+ def fail_if_source_is_loaded(*args, **kwargs):
30
+ raise AssertionError("agent digest source should not load when disabled")
31
+
32
+ monkeypatch.setattr(
33
+ "jarvisplot.agent_digest.load_figure_source_dataframe",
34
+ fail_if_source_is_loaded,
35
+ )
36
+
37
+ core._maybe_write_agent_digest(
38
+ {
39
+ "name": "plain_plot",
40
+ "layers": [{"data": [{"source": "samples"}]}],
41
+ },
42
+ SimpleNamespace(),
43
+ )
44
+
45
+
21
46
  def test_strip_digest_axes_stash_removes_key(tmp_path):
22
47
  from jarvisplot.agent_digest import strip_digest_axes_stash
23
48
 
@@ -716,6 +716,39 @@ def test_colorbar_manual_y_ticks_override_auto_ticks(axc_name):
716
716
  plt.close(fig.fig)
717
717
 
718
718
 
719
+ def test_main_axis_manual_log_x_ticks_are_applied_and_preserved():
720
+ positions = [0.1, 1.0, 5.0]
721
+ labels = ["0.1", "1", "5"]
722
+
723
+ fig = Figure()
724
+ fig.logger = _logger()
725
+ fig.frame = {
726
+ "figure": {"figsize": (2, 2)},
727
+ "ax": {
728
+ "labels": {"x": "", "y": ""},
729
+ "xlim": [0.1, 5.0],
730
+ "ylim": [0.1, 5.0],
731
+ "xscale": "log",
732
+ "yscale": "linear",
733
+ "ticks": {"x": {"positions": positions, "labels": labels}},
734
+ },
735
+ }
736
+ fig.fig = plt.figure(figsize=(2, 2))
737
+ fig.axes = {}
738
+ fig.ax = {"rect": [0.1, 0.1, 0.8, 0.8]}
739
+
740
+ fig.render()
741
+ fig.fig.canvas.draw()
742
+
743
+ np.testing.assert_allclose(fig.ax.xaxis.get_majorticklocs(), positions)
744
+ assert [label.get_text() for label in fig.ax.get_xticklabels()] == labels
745
+ assert all(
746
+ not tick.label1.get_visible() and not tick.label2.get_visible()
747
+ for tick in fig.ax.xaxis.get_minor_ticks()
748
+ )
749
+ plt.close(fig.fig)
750
+
751
+
719
752
  @pytest.mark.parametrize("ax_type", ["rect", "tri"])
720
753
  def test_render_layer_does_not_mutate_layer_data(monkeypatch, ax_type):
721
754
  original_data = object()
@@ -158,7 +158,10 @@ def test_flowchart_synthesizes_missing_bridge_for_cross_layer_file_input():
158
158
  ],
159
159
  }
160
160
 
161
- graph = _ClassicGraph(scene, {"classic": {"synthesize_missing_bridges": True}})
161
+ graph = _ClassicGraph(
162
+ scene,
163
+ {"classic": {"synthesize_missing_bridges": True, "bridge_y_offset": 0.6}},
164
+ )
162
165
 
163
166
  bridge_id = "bridge::x::L2"
164
167
  assert bridge_id in graph.nodes
@@ -181,6 +184,66 @@ def test_flowchart_synthesizes_missing_bridge_for_cross_layer_file_input():
181
184
  for edge in graph.edges
182
185
  )
183
186
 
187
+ graph.layout()
188
+ module_top = graph.mains["FirstModule"]["pos"][1] + graph.module_icon_size / 2.0
189
+ bridge_y = graph.bridges[bridge_id]["pos"][1]
190
+ assert abs(bridge_y - module_top - 0.6) < 1e-9
191
+
192
+
193
+ def test_flowchart_orders_bridge_chain_by_previous_layer_y_position():
194
+ scene = {
195
+ "schema": "jarvisplot.scene/v1",
196
+ "scene_type": "flowchart",
197
+ "layers": [
198
+ {"id": "layer_1", "index": 1, "nodes": ["Parameters", "var::top", "var::bottom"]},
199
+ {"id": "layer_2", "index": 2, "nodes": []},
200
+ {"id": "layer_3", "index": 3, "nodes": []},
201
+ {
202
+ "id": "layer_4",
203
+ "index": 4,
204
+ "nodes": ["FinalModule", "file::FinalModule::input::final_input"],
205
+ },
206
+ ],
207
+ "nodes": [
208
+ {"id": "Parameters", "kind": "source", "label": "Parameters", "layer": "layer_1"},
209
+ {"id": "var::top", "kind": "variable", "role": "parameter", "label": "top", "layer": "layer_1"},
210
+ {"id": "var::bottom", "kind": "variable", "role": "parameter", "label": "bottom", "layer": "layer_1"},
211
+ {"id": "FinalModule", "kind": "module", "label": "FinalModule", "layer": "layer_4"},
212
+ {
213
+ "id": "file::FinalModule::input::final_input",
214
+ "kind": "file",
215
+ "role": "input_file",
216
+ "label": "final_input",
217
+ "layer": "layer_4",
218
+ },
219
+ ],
220
+ "edges": [
221
+ {"source": {"node": "Parameters", "port": "top"}, "target": {"node": "var::top", "port": "in"}, "role": "parameterflow"},
222
+ {"source": {"node": "Parameters", "port": "bottom"}, "target": {"node": "var::bottom", "port": "in"}, "role": "parameterflow"},
223
+ {
224
+ "source": {"node": "var::bottom", "port": "out"},
225
+ "target": {"node": "file::FinalModule::input::final_input", "port": "in"},
226
+ "role": "fileflow",
227
+ "metadata": {"variable": "bottom"},
228
+ },
229
+ {
230
+ "source": {"node": "var::top", "port": "out"},
231
+ "target": {"node": "file::FinalModule::input::final_input", "port": "in"},
232
+ "role": "fileflow",
233
+ "metadata": {"variable": "top"},
234
+ },
235
+ ],
236
+ }
237
+
238
+ graph = _ClassicGraph(scene, {"classic": {"synthesize_missing_bridges": True}})
239
+ graph.layout()
240
+
241
+ layer_2_bridges = graph._standalone_bridges("layer_2")
242
+ layer_3_bridges = graph._standalone_bridges("layer_3")
243
+ assert layer_2_bridges == ["bridge::top::L2", "bridge::bottom::L2"]
244
+ assert layer_3_bridges == ["bridge::top::L3", "bridge::bottom::L3"]
245
+ assert graph.bridges["bridge::top::L3"]["pos"][1] > graph.bridges["bridge::bottom::L3"]["pos"][1]
246
+
184
247
 
185
248
  def test_flowchart_uses_triangle_for_file_output_variables():
186
249
  scene = {
File without changes
File without changes