tensor-network-visualization 2.0.2__tar.gz → 2.0.3__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 (172) hide show
  1. {tensor_network_visualization-2.0.2/src/tensor_network_visualization.egg-info → tensor_network_visualization-2.0.3}/PKG-INFO +5 -1
  2. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/README.md +29 -29
  3. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/pyproject.toml +5 -1
  4. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3/src/tensor_network_visualization.egg-info}/PKG-INFO +5 -1
  5. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_visualization.egg-info/SOURCES.txt +1 -0
  6. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_visualization.egg-info/requires.txt +4 -0
  7. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/draw/hover.py +2 -2
  8. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/renderer.py +2 -1
  9. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_input_inspection.py +2 -2
  10. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_interaction/controller.py +6 -3
  11. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_interaction/views.py +4 -2
  12. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_tensor_elements_data.py +8 -4
  13. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_tensor_elements_rendering.py +2 -1
  14. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/contraction_viewer.py +8 -4
  15. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_ci_workflow.py +35 -2
  16. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_engineering_baseline.py +12 -9
  17. tensor_network_visualization-2.0.3/tests/test_security_config.py +31 -0
  18. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_translation_api.py +300 -300
  19. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_verify_script.py +27 -1
  20. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/LICENSE +0 -0
  21. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/setup.cfg +0 -0
  22. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_visualization.egg-info/dependency_links.txt +0 -0
  23. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_visualization.egg-info/top_level.txt +0 -0
  24. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/__init__.py +0 -0
  25. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_auto_display.py +0 -0
  26. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_contraction_viewer_style.py +0 -0
  27. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_contraction_viewer_ui.py +0 -0
  28. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/__init__.py +0 -0
  29. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/_draw_common.py +0 -0
  30. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/_label_format.py +0 -0
  31. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/_nodes_edges_common.py +0 -0
  32. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/axis_directions.py +0 -0
  33. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/contractions.py +0 -0
  34. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/curves.py +0 -0
  35. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/draw/__init__.py +0 -0
  36. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/draw/constants.py +0 -0
  37. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/draw/contraction_edges.py +0 -0
  38. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/draw/contraction_scheme.py +0 -0
  39. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/draw/dangling_self_edges.py +0 -0
  40. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/draw/disk_metrics.py +0 -0
  41. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/draw/edge_labels.py +0 -0
  42. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/draw/edge_orchestration.py +0 -0
  43. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/draw/edges.py +0 -0
  44. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/draw/fonts_and_scale.py +0 -0
  45. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/draw/graph_pipeline.py +0 -0
  46. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/draw/label_descriptors.py +0 -0
  47. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/draw/labels_misc.py +0 -0
  48. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/draw/pick_distance.py +0 -0
  49. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/draw/plotter.py +0 -0
  50. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/draw/plotter_2d.py +0 -0
  51. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/draw/plotter_3d.py +0 -0
  52. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/draw/plotter_common.py +0 -0
  53. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/draw/render_prep.py +0 -0
  54. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/draw/scene_state.py +0 -0
  55. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/draw/tensors.py +0 -0
  56. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/draw/vectors.py +0 -0
  57. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/draw/viewport_geometry.py +0 -0
  58. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/focus.py +0 -0
  59. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/graph.py +0 -0
  60. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/graph_cache.py +0 -0
  61. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/graph_utils.py +0 -0
  62. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/layout/__init__.py +0 -0
  63. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/layout/body.py +0 -0
  64. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/layout/direction_common.py +0 -0
  65. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/layout/force_directed.py +0 -0
  66. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/layout/free_directions_2d.py +0 -0
  67. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/layout/free_directions_3d.py +0 -0
  68. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/layout/generic_coarsening.py +0 -0
  69. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/layout/geometry.py +0 -0
  70. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/layout/parameters.py +0 -0
  71. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/layout/positions.py +0 -0
  72. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/layout/types.py +0 -0
  73. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/layout_structure.py +0 -0
  74. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/layout_structure_coordinates.py +0 -0
  75. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_core/layout_structure_sparse_grid.py +0 -0
  76. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_engine_specs.py +0 -0
  77. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_import_state.py +0 -0
  78. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_interaction/__init__.py +0 -0
  79. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_interaction/bridge.py +0 -0
  80. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_interaction/controls.py +0 -0
  81. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_interaction/scheme.py +0 -0
  82. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_interaction/state.py +0 -0
  83. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_interaction/tensor_inspector.py +0 -0
  84. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_interactive_scene.py +0 -0
  85. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_logging.py +0 -0
  86. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_matplotlib_state.py +0 -0
  87. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_registry.py +0 -0
  88. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_tensor_comparison_support.py +0 -0
  89. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_tensor_elements_controller.py +0 -0
  90. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_tensor_elements_inputs.py +0 -0
  91. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_tensor_elements_models.py +0 -0
  92. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_tensor_elements_payloads.py +0 -0
  93. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_tensor_elements_support.py +0 -0
  94. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_translation_codegen.py +0 -0
  95. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_translation_models.py +0 -0
  96. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_typing.py +0 -0
  97. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_ui_utils.py +0 -0
  98. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/_widgets.py +0 -0
  99. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/config.py +0 -0
  100. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/einsum_module/__init__.py +0 -0
  101. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/einsum_module/_backend.py +0 -0
  102. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/einsum_module/_equation.py +0 -0
  103. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/einsum_module/_trace_state.py +0 -0
  104. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/einsum_module/_trace_types.py +0 -0
  105. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/einsum_module/contraction_cost.py +0 -0
  106. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/einsum_module/graph.py +0 -0
  107. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/einsum_module/renderer.py +0 -0
  108. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/einsum_module/trace.py +0 -0
  109. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/exceptions.py +0 -0
  110. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/interactive_viewer.py +0 -0
  111. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/py.typed +0 -0
  112. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/quimb/__init__.py +0 -0
  113. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/quimb/graph.py +0 -0
  114. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/quimb/renderer.py +0 -0
  115. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/snapshot.py +0 -0
  116. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/tenpy/__init__.py +0 -0
  117. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/tenpy/explicit.py +0 -0
  118. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/tenpy/graph.py +0 -0
  119. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/tenpy/renderer.py +0 -0
  120. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/tensor_comparison.py +0 -0
  121. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/tensor_comparison_config.py +0 -0
  122. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/tensor_elements.py +0 -0
  123. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/tensor_elements_config.py +0 -0
  124. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/tensorkrowch/__init__.py +0 -0
  125. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/tensorkrowch/_history.py +0 -0
  126. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/tensorkrowch/graph.py +0 -0
  127. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/tensorkrowch/renderer.py +0 -0
  128. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/tensornetwork/__init__.py +0 -0
  129. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/tensornetwork/graph.py +0 -0
  130. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/tensornetwork/renderer.py +0 -0
  131. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/translation.py +0 -0
  132. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/src/tensor_network_viz/viewer.py +0 -0
  133. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_bench_user_workflows.py +0 -0
  134. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_contraction_cost.py +0 -0
  135. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_contraction_groups_once.py +0 -0
  136. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_contraction_scheme.py +0 -0
  137. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_contraction_scheme_api.py +0 -0
  138. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_contraction_viewer.py +0 -0
  139. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_demo_cli_scheme.py +0 -0
  140. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_documentation_gallery.py +0 -0
  141. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_draw_performance.py +0 -0
  142. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_edge_index_label_2d.py +0 -0
  143. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_edge_index_label_3d.py +0 -0
  144. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_einsum_autotrace.py +0 -0
  145. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_einsum_backend.py +0 -0
  146. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_engine_detection.py +0 -0
  147. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_examples.py +0 -0
  148. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_examples_structure.py +0 -0
  149. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_graph_cache.py +0 -0
  150. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_integration_einsum.py +0 -0
  151. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_integration_tensorkrowch.py +0 -0
  152. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_integration_tensornetwork.py +0 -0
  153. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_interaction_controls.py +0 -0
  154. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_interaction_state.py +0 -0
  155. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_label_draw_metrics_perf.py +0 -0
  156. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_label_format.py +0 -0
  157. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_layout_core.py +0 -0
  158. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_lazy_imports.py +0 -0
  159. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_logging_and_exceptions.py +0 -0
  160. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_matplotlib_state.py +0 -0
  161. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_node_degrees_perf.py +0 -0
  162. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_packaging_metadata.py +0 -0
  163. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_plotting.py +0 -0
  164. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_public_api.py +0 -0
  165. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_quimb_backend.py +0 -0
  166. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_render_performance_controls.py +0 -0
  167. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_show_tensor_network_throughput.py +0 -0
  168. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_snapshot_api.py +0 -0
  169. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_tenpy_backend.py +0 -0
  170. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_tensor_comparison.py +0 -0
  171. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_tensor_elements.py +0 -0
  172. {tensor_network_visualization-2.0.2 → tensor_network_visualization-2.0.3}/tests/test_tensor_elements_perf.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tensor-network-visualization
3
- Version: 2.0.2
3
+ Version: 2.0.3
4
4
  Summary: Minimal Matplotlib visualizations for TensorKrowch, TensorNetwork, Quimb, TeNPy, and traced PyTorch/NumPy einsum tensor networks.
5
5
  Author: Alejandro Mata Ali
6
6
  License-Expression: MIT
@@ -27,10 +27,14 @@ Requires-Dist: matplotlib>=3.7
27
27
  Requires-Dist: networkx>=3.0
28
28
  Requires-Dist: numpy>=2.0
29
29
  Provides-Extra: dev
30
+ Requires-Dist: bandit; extra == "dev"
30
31
  Requires-Dist: build; extra == "dev"
31
32
  Requires-Dist: pytest; extra == "dev"
32
33
  Requires-Dist: ruff; extra == "dev"
34
+ Requires-Dist: setuptools; extra == "dev"
33
35
  Requires-Dist: pyright; extra == "dev"
36
+ Requires-Dist: pip-audit; extra == "dev"
37
+ Requires-Dist: twine; extra == "dev"
34
38
  Requires-Dist: ipython; extra == "dev"
35
39
  Requires-Dist: tensorkrowch; extra == "dev"
36
40
  Requires-Dist: tensornetwork; extra == "dev"
@@ -62,20 +62,20 @@ Tensor-network libraries expose different Python objects. This package gives the
62
62
  visualization API so you can inspect structure, tensor values, contraction playback, and normalized
63
63
  graph exports without rewriting plotting code for every backend.
64
64
 
65
- The common entry points are:
66
-
67
- ```python
68
- show_tensor_network(...)
69
- show_tensor_elements(...)
70
- show_tensor_comparison(...)
71
- translate_tensor_network(...)
72
- normalize_tensor_network(...)
73
- export_tensor_network_snapshot(...)
74
- ```
75
-
76
- If you want code for another backend rather than a figure, `translate_tensor_network(...)` can turn
77
- supported TensorKrowch, TensorNetwork, Quimb, TeNPy, and traced `einsum` inputs into executable
78
- Python for `tensornetwork`, `quimb`, `einsum`, or `tensorkrowch`.
65
+ The common entry points are:
66
+
67
+ ```python
68
+ show_tensor_network(...)
69
+ show_tensor_elements(...)
70
+ show_tensor_comparison(...)
71
+ translate_tensor_network(...)
72
+ normalize_tensor_network(...)
73
+ export_tensor_network_snapshot(...)
74
+ ```
75
+
76
+ If you want code for another backend rather than a figure, `translate_tensor_network(...)` can turn
77
+ supported TensorKrowch, TensorNetwork, Quimb, TeNPy, and traced `einsum` inputs into executable
78
+ Python for `tensornetwork`, `quimb`, `einsum`, or `tensorkrowch`.
79
79
 
80
80
  ## Install
81
81
 
@@ -205,27 +205,27 @@ The repository examples are organized around the same launcher:
205
205
  python examples/run_demo.py <group> <demo>
206
206
  ```
207
207
 
208
- The gallery includes backend demos for TensorKrowch, TensorNetwork, Quimb, TeNPy, and `einsum`,
209
- plus three focused groups:
208
+ The gallery includes backend demos for TensorKrowch, TensorNetwork, Quimb, TeNPy, and `einsum`,
209
+ plus three focused groups:
210
210
 
211
211
  - `themes overview`: compares the `PlotConfig` visual presets for tensor-network figures.
212
212
  - `themes tensor_elements`: compares the `TensorElementsConfig` presets for `show_tensor_elements(...)`
213
213
  and the linked tensor inspector.
214
214
  - `placements`: shows object, list, 2D grid, 3D grid, manual positions, manual schemes, and named
215
215
  index inputs.
216
- - `geometry`: renders larger irregular, incomplete, triangular, pyramidal, circular, and
217
- disconnected networks.
218
-
219
- There is also a dedicated translation demo:
220
-
221
- ```bash
222
- python examples/translate_demo.py --source-engine tensornetwork --target-engine quimb --example mps
223
- ```
224
-
225
- It generates Python code for the translated tensor network and can render the original and
226
- translated versions side by side for comparison.
227
-
228
- For batch checks, use:
216
+ - `geometry`: renders larger irregular, incomplete, triangular, pyramidal, circular, and
217
+ disconnected networks.
218
+
219
+ There is also a dedicated translation demo:
220
+
221
+ ```bash
222
+ python examples/translate_demo.py --source-engine tensornetwork --target-engine quimb --example mps
223
+ ```
224
+
225
+ It generates Python code for the translated tensor network and can render the original and
226
+ translated versions side by side for comparison.
227
+
228
+ For batch checks, use:
229
229
 
230
230
  ```bash
231
231
  python examples/run_all_examples.py --group engines --views 2d --list
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "tensor-network-visualization"
7
- version = "2.0.2"
7
+ version = "2.0.3"
8
8
  description = "Minimal Matplotlib visualizations for TensorKrowch, TensorNetwork, Quimb, TeNPy, and traced PyTorch/NumPy einsum tensor networks."
9
9
  authors = [{ name = "Alejandro Mata Ali" }]
10
10
  readme = "README.md"
@@ -39,10 +39,14 @@ Issues = "https://github.com/DOKOS-TAYOS/Tensor-Network-Visualization/issues"
39
39
 
40
40
  [project.optional-dependencies]
41
41
  dev = [
42
+ "bandit",
42
43
  "build",
43
44
  "pytest",
44
45
  "ruff",
46
+ "setuptools",
45
47
  "pyright",
48
+ "pip-audit",
49
+ "twine",
46
50
  "ipython",
47
51
  "tensorkrowch",
48
52
  "tensornetwork",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tensor-network-visualization
3
- Version: 2.0.2
3
+ Version: 2.0.3
4
4
  Summary: Minimal Matplotlib visualizations for TensorKrowch, TensorNetwork, Quimb, TeNPy, and traced PyTorch/NumPy einsum tensor networks.
5
5
  Author: Alejandro Mata Ali
6
6
  License-Expression: MIT
@@ -27,10 +27,14 @@ Requires-Dist: matplotlib>=3.7
27
27
  Requires-Dist: networkx>=3.0
28
28
  Requires-Dist: numpy>=2.0
29
29
  Provides-Extra: dev
30
+ Requires-Dist: bandit; extra == "dev"
30
31
  Requires-Dist: build; extra == "dev"
31
32
  Requires-Dist: pytest; extra == "dev"
32
33
  Requires-Dist: ruff; extra == "dev"
34
+ Requires-Dist: setuptools; extra == "dev"
33
35
  Requires-Dist: pyright; extra == "dev"
36
+ Requires-Dist: pip-audit; extra == "dev"
37
+ Requires-Dist: twine; extra == "dev"
34
38
  Requires-Dist: ipython; extra == "dev"
35
39
  Requires-Dist: tensorkrowch; extra == "dev"
36
40
  Requires-Dist: tensornetwork; extra == "dev"
@@ -159,6 +159,7 @@ tests/test_plotting.py
159
159
  tests/test_public_api.py
160
160
  tests/test_quimb_backend.py
161
161
  tests/test_render_performance_controls.py
162
+ tests/test_security_config.py
162
163
  tests/test_show_tensor_network_throughput.py
163
164
  tests/test_snapshot_api.py
164
165
  tests/test_tenpy_backend.py
@@ -3,10 +3,14 @@ networkx>=3.0
3
3
  numpy>=2.0
4
4
 
5
5
  [dev]
6
+ bandit
6
7
  build
7
8
  pytest
8
9
  ruff
10
+ setuptools
9
11
  pyright
12
+ pip-audit
13
+ twine
10
14
  ipython
11
15
  tensorkrowch
12
16
  tensornetwork
@@ -401,8 +401,8 @@ def _apply_saved_hover_state(
401
401
  )
402
402
  return
403
403
 
404
- assert state.positions is not None
405
- assert state.params is not None
404
+ if state.positions is None or state.params is None:
405
+ raise RuntimeError("3D hover registration requires resolved positions and parameters.")
406
406
  _register_3d_hover_labels(
407
407
  state.ax,
408
408
  state.figure,
@@ -515,7 +515,8 @@ def _plot_graph(
515
515
  style,
516
516
  visible_tensor_count=count_visible_tensors(draw_graph),
517
517
  )
518
- assert resolved_style.show_tensor_labels is not None
518
+ if resolved_style.show_tensor_labels is None:
519
+ raise RuntimeError("Auto display resolution did not resolve tensor-label visibility.")
519
520
  draw_positions = {
520
521
  node_id: geometry.positions[node_id]
521
522
  for node_id in draw_graph.nodes
@@ -4,7 +4,7 @@ from collections.abc import Callable, Iterable
4
4
  from dataclasses import replace
5
5
  from functools import cache
6
6
  from itertools import tee
7
- from typing import Any
7
+ from typing import Any, NoReturn
8
8
 
9
9
  from ._core.graph_utils import _is_unordered_collection
10
10
  from ._engine_specs import EngineName
@@ -108,7 +108,7 @@ def _is_grid_container(value: Any) -> bool:
108
108
  return isinstance(value, (list, tuple))
109
109
 
110
110
 
111
- def _raise_grid_error(message: str) -> None:
111
+ def _raise_grid_error(message: str) -> NoReturn:
112
112
  raise VisualizationInputError(message)
113
113
 
114
114
 
@@ -389,7 +389,8 @@ class _InteractiveTensorFigureController:
389
389
  @property
390
390
  def current_scene(self) -> _InteractiveSceneState:
391
391
  scene = self._view_manager.current_scene(self.current_view)
392
- assert scene is not None
392
+ if scene is None:
393
+ raise RuntimeError("Interactive scene is not available for the current view.")
393
394
  return scene
394
395
 
395
396
  @property
@@ -531,7 +532,8 @@ class _InteractiveTensorFigureController:
531
532
  )
532
533
 
533
534
  def _build_controls(self, scene: _InteractiveSceneState) -> None:
534
- assert self.figure is not None
535
+ if self.figure is None:
536
+ raise RuntimeError("Interactive controls require an initialized figure.")
535
537
  self._controls_panel = _InteractiveControlsPanel(
536
538
  fig=self.figure,
537
539
  layout=self._controls_layout(scene),
@@ -547,7 +549,8 @@ class _InteractiveTensorFigureController:
547
549
  )
548
550
 
549
551
  def _ensure_focus_status_text(self) -> Text:
550
- assert self.figure is not None
552
+ if self.figure is None:
553
+ raise RuntimeError("Focus status text requires an initialized figure.")
551
554
  if self._focus_status_text is None:
552
555
  self._focus_status_text = self.figure.text(
553
556
  0.5,
@@ -110,7 +110,8 @@ class _InteractiveViewManager:
110
110
 
111
111
  def rerender_cached_view(self, view: ViewName) -> _InteractiveSceneState:
112
112
  cache = self.view_caches[view]
113
- assert cache.ax is not None
113
+ if cache.ax is None:
114
+ raise RuntimeError("Cached view cannot be re-rendered before its axes are built.")
114
115
  old_scene = cache.scene
115
116
  if old_scene is not None and old_scene.contraction_controls is not None:
116
117
  viewer = old_scene.contraction_controls._viewer
@@ -120,7 +121,8 @@ class _InteractiveViewManager:
120
121
  viewer.hide_scheme_artists()
121
122
  fig, rendered_ax = self._render_view(view, cache.ax)
122
123
  scene = _scene_from_axes(rendered_ax)
123
- assert scene is not None
124
+ if scene is None:
125
+ raise RuntimeError("Rendered axes did not expose an interactive scene.")
124
126
  cache.ax = rendered_ax
125
127
  cache.scene = scene
126
128
  scene.contraction_controls = get_contraction_controls(rendered_ax)
@@ -186,7 +186,8 @@ def _balanced_axes_for_shape(shape: tuple[int, ...]) -> tuple[int, ...]:
186
186
  best_axes = candidate
187
187
  best_score = score
188
188
  best_rank_gap = rank_gap
189
- assert best_axes is not None
189
+ if best_axes is None:
190
+ raise RuntimeError("Could not resolve a balanced tensor-axis split.")
190
191
  return best_axes
191
192
 
192
193
 
@@ -231,10 +232,12 @@ def _resolve_matrix_axes(
231
232
  return resolved_rows, resolved_cols
232
233
 
233
234
  if resolved_rows is None:
234
- assert resolved_cols is not None
235
+ if resolved_cols is None:
236
+ raise RuntimeError("Column axes were not resolved.")
235
237
  resolved_rows = tuple(index for index in range(ndim) if index not in resolved_cols)
236
238
  if resolved_cols is None:
237
- assert resolved_rows is not None
239
+ if resolved_rows is None:
240
+ raise RuntimeError("Row axes were not resolved.")
238
241
  resolved_cols = tuple(index for index in range(ndim) if index not in resolved_rows)
239
242
 
240
243
  if set(resolved_rows).intersection(resolved_cols):
@@ -405,7 +408,8 @@ def _resolve_tensor_analysis(
405
408
  fallback_index=0,
406
409
  fallback=fallback,
407
410
  )
408
- assert slice_axis is not None
411
+ if slice_axis is None:
412
+ raise RuntimeError("Slice axis was not resolved for an active slice view.")
409
413
  slice_axis_name = original_axis_names[slice_axis]
410
414
  slice_axis_size = int(array.shape[slice_axis])
411
415
  requested_slice_index = (
@@ -278,7 +278,8 @@ def _render_panel(
278
278
  panel.main_ax.set_title(_panel_title(record, payload))
279
279
  return
280
280
 
281
- assert isinstance(payload, _HeatmapPayload)
281
+ if not isinstance(payload, _HeatmapPayload):
282
+ raise TypeError(f"Unsupported tensor-elements payload: {type(payload).__name__!r}.")
282
283
  matrix = np.asarray(payload.matrix)
283
284
  metadata = payload.metadata
284
285
  style_key = payload.style_key
@@ -787,7 +787,8 @@ class ContractionViewer2D(_ContractionViewerBase):
787
787
  if fig is None:
788
788
  fig, ax_new = plt.subplots()
789
789
  ax = cast(Axes, ax_new)
790
- assert ax is not None
790
+ if ax is None:
791
+ raise ValueError("ContractionViewer2D requires a 2D Axes when fig is provided.")
791
792
  if getattr(ax, "name", None) == "3d":
792
793
  raise TypeError("ContractionViewer2D requires a 2D Axes")
793
794
  super().__init__(
@@ -816,7 +817,8 @@ class ContractionViewer2D(_ContractionViewerBase):
816
817
  if fig is None:
817
818
  fig, ax_new = plt.subplots()
818
819
  ax = cast(Axes, ax_new)
819
- assert ax is not None
820
+ if ax is None:
821
+ raise ValueError("ContractionViewer2D.from_rectangles requires a 2D Axes.")
820
822
  artists: list[Rectangle] = []
821
823
  for x, y, w, h in rectangles:
822
824
  r = Rectangle(
@@ -850,7 +852,8 @@ class ContractionViewer3D(_ContractionViewerBase):
850
852
  if fig is None:
851
853
  fig = plt.figure()
852
854
  ax = cast(Axes3D, fig.add_subplot(111, projection="3d"))
853
- assert ax is not None
855
+ if ax is None:
856
+ raise ValueError("ContractionViewer3D requires Axes3D when fig is provided.")
854
857
  if not hasattr(ax, "zaxis"):
855
858
  raise TypeError("ContractionViewer3D requires Axes3D")
856
859
  super().__init__(
@@ -879,7 +882,8 @@ class ContractionViewer3D(_ContractionViewerBase):
879
882
  if fig is None:
880
883
  fig = plt.figure()
881
884
  ax = cast(Axes3D, fig.add_subplot(111, projection="3d"))
882
- assert ax is not None
885
+ if ax is None:
886
+ raise ValueError("ContractionViewer3D.from_boxes requires Axes3D.")
883
887
  artists: list[Poly3DCollection] = []
884
888
  for mn, mx in boxes:
885
889
  mn = np.asarray(mn, dtype=float).ravel()[:3]
@@ -22,7 +22,7 @@ def _parse_block_list_item(raw_value: str) -> str:
22
22
 
23
23
 
24
24
  def _load_workflow_text(text: str) -> dict[str, Any]:
25
- workflow: dict[str, Any] = {"jobs": {}}
25
+ workflow: dict[str, Any] = {"jobs": {}, "permissions": {}}
26
26
  current_job_name: str | None = None
27
27
  current_step: dict[str, Any] | None = None
28
28
  current_matrix_key: str | None = None
@@ -48,6 +48,8 @@ def _load_workflow_text(text: str) -> dict[str, Any]:
48
48
  continue
49
49
 
50
50
  if current_job_name is None:
51
+ if indent == 2 and stripped.startswith("contents: "):
52
+ workflow["permissions"]["contents"] = stripped.split(": ", 1)[1].strip()
51
53
  continue
52
54
 
53
55
  if indent == 8 and stripped.startswith("os: "):
@@ -109,6 +111,10 @@ def _load_workflow() -> dict[str, Any]:
109
111
  return _load_workflow_text(Path(".github/workflows/ci.yml").read_text(encoding="utf-8"))
110
112
 
111
113
 
114
+ def _workflow_text() -> str:
115
+ return Path(".github/workflows/ci.yml").read_text(encoding="utf-8")
116
+
117
+
112
118
  def _job_step_names(workflow: dict[str, Any], job_name: str) -> list[str]:
113
119
  return [step["name"] for step in workflow["jobs"][job_name]["steps"]]
114
120
 
@@ -153,8 +159,12 @@ jobs:
153
159
 
154
160
  def test_ci_workflow_declares_expected_jobs_and_runner_matrices() -> None:
155
161
  workflow = _load_workflow()
162
+ workflow_text = _workflow_text()
156
163
 
157
164
  assert set(workflow["jobs"]) == {"smoke-minimal", "wheel-smoke", "lint-and-test"}
165
+ assert workflow["permissions"]["contents"] == "read"
166
+ assert workflow_text.count("uses: actions/checkout@v6") == 3
167
+ assert workflow_text.count("uses: actions/setup-python@v6") == 3
158
168
  assert workflow["jobs"]["wheel-smoke"]["matrix"]["os"] == ["ubuntu-latest", "windows-latest"]
159
169
  assert workflow["jobs"]["wheel-smoke"]["matrix"]["python-version"] == ["3.12", "3.13"]
160
170
  assert workflow["jobs"]["lint-and-test"]["matrix"]["os"] == [
@@ -187,6 +197,9 @@ def test_ci_workflow_routes_core_checks_through_verify_script() -> None:
187
197
  assert _job_step(workflow, "lint-and-test", "Pytest")["run"] == (
188
198
  "python scripts/verify.py tests"
189
199
  )
200
+ assert _job_step(workflow, "lint-and-test", "Security")["run"] == (
201
+ "python scripts/verify.py security"
202
+ )
190
203
 
191
204
 
192
205
  def test_ci_workflow_keeps_minimal_and_packaging_smoke_guards() -> None:
@@ -196,7 +209,13 @@ def test_ci_workflow_keeps_minimal_and_packaging_smoke_guards() -> None:
196
209
  ]
197
210
 
198
211
  assert "python -m pip install -e . --no-deps" in minimal_install
199
- for requirement in ("matplotlib==3.10.8", "networkx==3.6.1", "numpy==2.4.3", "quimb==1.13.0"):
212
+ for requirement in (
213
+ "matplotlib==3.10.9",
214
+ "networkx==3.6.1",
215
+ "numpy==2.4.5",
216
+ "pytest==9.0.3",
217
+ "quimb==1.14.0",
218
+ ):
200
219
  assert requirement in minimal_install
201
220
 
202
221
  wheel_step_names = _job_step_names(workflow, "wheel-smoke")
@@ -204,13 +223,21 @@ def test_ci_workflow_keeps_minimal_and_packaging_smoke_guards() -> None:
204
223
  "Install build tool",
205
224
  "Create wheel test venv",
206
225
  "Create sdist test venv",
226
+ "Install wheel (Linux)",
207
227
  "Install wheel (Windows)",
208
228
  "Smoke import and render (Windows)",
229
+ "Install sdist (Linux)",
209
230
  "Install sdist (Windows)",
210
231
  "Smoke sdist import and render (Windows)",
211
232
  ):
212
233
  assert step_name in wheel_step_names
213
234
 
235
+ wheel_linux_install = _job_step(workflow, "wheel-smoke", "Install wheel (Linux)")["run"]
236
+ assert ".tmp/package-dist/*.whl" in wheel_linux_install
237
+
238
+ wheel_windows_install = _job_step(workflow, "wheel-smoke", "Install wheel (Windows)")["run"]
239
+ assert "Get-ChildItem .tmp\\package-dist\\*.whl" in wheel_windows_install
240
+
214
241
  wheel_windows_smoke = _job_step(workflow, "wheel-smoke", "Smoke import and render (Windows)")[
215
242
  "run"
216
243
  ]
@@ -219,6 +246,12 @@ def test_ci_workflow_keeps_minimal_and_packaging_smoke_guards() -> None:
219
246
  assert "show_tensor_network(" in wheel_windows_smoke
220
247
  assert "engine='einsum'" in wheel_windows_smoke
221
248
 
249
+ sdist_linux_install = _job_step(workflow, "wheel-smoke", "Install sdist (Linux)")["run"]
250
+ assert ".tmp/package-dist/*.tar.gz" in sdist_linux_install
251
+
252
+ sdist_windows_install = _job_step(workflow, "wheel-smoke", "Install sdist (Windows)")["run"]
253
+ assert "Get-ChildItem .tmp\\package-dist\\*.tar.gz" in sdist_windows_install
254
+
222
255
  sdist_windows_smoke = _job_step(
223
256
  workflow,
224
257
  "wheel-smoke",
@@ -144,19 +144,22 @@ def test_dev_requirements_pin_verification_tools_and_use_editable_install() -> N
144
144
 
145
145
  assert "-e ." in lines
146
146
  assert {
147
- "build==1.4.2",
148
- "ipython==9.10.1",
149
- "ipython==9.12.0",
150
- "matplotlib==3.10.8",
147
+ "build==1.5.0",
148
+ "bandit==1.9.4",
149
+ "ipython==9.13.0",
150
+ "matplotlib==3.10.9",
151
151
  "networkx==3.6.1",
152
- "numpy==2.4.3",
152
+ "numpy==2.4.5",
153
+ "pip-audit==2.10.0",
153
154
  "physics-tenpy==1.1.0",
154
- "pyright==1.1.408",
155
- "pytest==9.0.2",
156
- "quimb==1.13.0",
157
- "ruff==0.15.8",
155
+ "pyright==1.1.409",
156
+ "pytest==9.0.3",
157
+ "quimb==1.14.0",
158
+ "ruff==0.15.13",
159
+ "setuptools==81.0.0",
158
160
  "tensorkrowch==1.1.6",
159
161
  "tensornetwork==0.4.6",
162
+ "twine==6.2.0",
160
163
  }.issubset(set(lines))
161
164
 
162
165
 
@@ -0,0 +1,31 @@
1
+ from __future__ import annotations
2
+
3
+ import ast
4
+ from pathlib import Path
5
+
6
+
7
+ def _python_source_files(root: Path) -> list[Path]:
8
+ return sorted(root.rglob("*.py"))
9
+
10
+
11
+ def test_runtime_package_does_not_use_optimized_away_asserts() -> None:
12
+ assert_locations: list[str] = []
13
+ for path in _python_source_files(Path("src/tensor_network_viz")):
14
+ module = ast.parse(path.read_text(encoding="utf-8"))
15
+ for node in ast.walk(module):
16
+ if isinstance(node, ast.Assert):
17
+ assert_locations.append(f"{path}:{node.lineno}")
18
+
19
+ assert assert_locations == []
20
+
21
+
22
+ def test_dependabot_updates_python_and_github_actions_manifests() -> None:
23
+ config_path = Path(".github/dependabot.yml")
24
+
25
+ text = config_path.read_text(encoding="utf-8")
26
+
27
+ assert 'package-ecosystem: "pip"' in text
28
+ assert 'package-ecosystem: "github-actions"' in text
29
+ assert 'directory: "/"' in text
30
+ assert 'interval: "weekly"' in text
31
+ assert 'timezone: "Europe/Madrid"' in text