okstra 0.114.0 → 0.115.0

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 (326) hide show
  1. package/docs/kr/architecture.md +2 -2
  2. package/docs/kr/follow-ups/2026-07-10-final-report-option-3.md +51 -0
  3. package/package.json +1 -1
  4. package/runtime/BUILD.json +2 -2
  5. package/runtime/agents/workers/report-writer-worker.md +1 -0
  6. package/runtime/prompts/lead/okstra-lead-contract.md +1 -1
  7. package/runtime/python/okstra_ctl/implementation_stage.py +46 -39
  8. package/runtime/python/okstra_ctl/report_views.py +151 -12
  9. package/runtime/python/okstra_ctl/run.py +24 -24
  10. package/runtime/python/okstra_ctl/worktree.py +1 -1
  11. package/runtime/python/okstra_token_usage/claude.py +58 -19
  12. package/runtime/python/okstra_token_usage/collect.py +3 -1
  13. package/runtime/python/okstra_vendor/__init__.py +3 -0
  14. package/runtime/schemas/final-report-v1.0.schema.json +20 -0
  15. package/runtime/templates/reports/final-report.template.md +14 -0
  16. package/runtime/templates/reports/i18n/en.json +23 -12
  17. package/runtime/templates/reports/i18n/ko.json +23 -12
  18. package/runtime/templates/reports/report.css +55 -0
  19. package/runtime/templates/reports/report.js +53 -1
  20. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/__init__.py +0 -0
  21. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_approx_clust_coeff.py +0 -41
  22. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_clique.py +0 -112
  23. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_connectivity.py +0 -199
  24. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_density.py +0 -146
  25. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_distance_measures.py +0 -59
  26. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_dominating_set.py +0 -78
  27. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_kcomponents.py +0 -303
  28. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_matching.py +0 -8
  29. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_maxcut.py +0 -94
  30. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_ramsey.py +0 -31
  31. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_steinertree.py +0 -306
  32. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_traveling_salesman.py +0 -1014
  33. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_treewidth.py +0 -274
  34. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_vertex_cover.py +0 -68
  35. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/tests/__init__.py +0 -0
  36. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/tests/base_test.py +0 -81
  37. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/tests/test_connectivity.py +0 -143
  38. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/tests/test_correlation.py +0 -122
  39. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/tests/test_mixing.py +0 -174
  40. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/tests/test_neighbor_degree.py +0 -107
  41. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/tests/test_pairs.py +0 -87
  42. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/__init__.py +0 -0
  43. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_basic.py +0 -125
  44. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_centrality.py +0 -192
  45. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_cluster.py +0 -84
  46. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_covering.py +0 -33
  47. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_edgelist.py +0 -240
  48. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_extendability.py +0 -334
  49. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_generators.py +0 -407
  50. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_link_analysis.py +0 -218
  51. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_matching.py +0 -327
  52. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_matrix.py +0 -138
  53. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_project.py +0 -409
  54. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_redundancy.py +0 -35
  55. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_spectral_bipartivity.py +0 -80
  56. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/__init__.py +0 -0
  57. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_betweenness_centrality.py +0 -923
  58. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_betweenness_centrality_subset.py +0 -354
  59. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_closeness_centrality.py +0 -274
  60. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_current_flow_betweenness_centrality.py +0 -259
  61. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_current_flow_betweenness_centrality_subset.py +0 -147
  62. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_current_flow_closeness.py +0 -43
  63. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_degree_centrality.py +0 -144
  64. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_dispersion.py +0 -73
  65. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_eigenvector_centrality.py +0 -186
  66. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_group.py +0 -277
  67. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_harmonic_centrality.py +0 -122
  68. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_katz_centrality.py +0 -345
  69. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_laplacian_centrality.py +0 -220
  70. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_load_centrality.py +0 -344
  71. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_percolation_centrality.py +0 -87
  72. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_reaching.py +0 -140
  73. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_second_order_centrality.py +0 -82
  74. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_subgraph.py +0 -110
  75. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_trophic.py +0 -302
  76. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_voterank.py +0 -64
  77. package/runtime/python/okstra_vendor/networkx/algorithms/coloring/tests/__init__.py +0 -0
  78. package/runtime/python/okstra_vendor/networkx/algorithms/coloring/tests/test_coloring.py +0 -863
  79. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/__init__.py +0 -0
  80. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_asyn_fluid.py +0 -147
  81. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_bipartitions.py +0 -157
  82. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_centrality.py +0 -85
  83. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_divisive.py +0 -106
  84. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_kclique.py +0 -91
  85. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_label_propagation.py +0 -241
  86. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_leiden.py +0 -138
  87. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_local.py +0 -76
  88. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_louvain.py +0 -264
  89. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_lukes.py +0 -152
  90. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_modularity_max.py +0 -340
  91. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_quality.py +0 -139
  92. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_utils.py +0 -26
  93. package/runtime/python/okstra_vendor/networkx/algorithms/components/tests/__init__.py +0 -0
  94. package/runtime/python/okstra_vendor/networkx/algorithms/components/tests/test_attracting.py +0 -70
  95. package/runtime/python/okstra_vendor/networkx/algorithms/components/tests/test_biconnected.py +0 -248
  96. package/runtime/python/okstra_vendor/networkx/algorithms/components/tests/test_connected.py +0 -138
  97. package/runtime/python/okstra_vendor/networkx/algorithms/components/tests/test_semiconnected.py +0 -55
  98. package/runtime/python/okstra_vendor/networkx/algorithms/components/tests/test_strongly_connected.py +0 -193
  99. package/runtime/python/okstra_vendor/networkx/algorithms/components/tests/test_weakly_connected.py +0 -96
  100. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/__init__.py +0 -0
  101. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_connectivity.py +0 -421
  102. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_cuts.py +0 -309
  103. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_disjoint_paths.py +0 -249
  104. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_edge_augmentation.py +0 -502
  105. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_edge_kcomponents.py +0 -488
  106. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_kcomponents.py +0 -323
  107. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_kcutsets.py +0 -280
  108. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_stoer_wagner.py +0 -102
  109. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/__init__.py +0 -0
  110. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/gl1.gpickle.bz2 +0 -0
  111. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/gw1.gpickle.bz2 +0 -0
  112. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/netgen-2.gpickle.bz2 +0 -0
  113. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/test_gomory_hu.py +0 -128
  114. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/test_maxflow.py +0 -573
  115. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/test_maxflow_large_graph.py +0 -155
  116. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/test_mincost.py +0 -475
  117. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/test_networksimplex.py +0 -481
  118. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/wlm3.gpickle.bz2 +0 -0
  119. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/__init__.py +0 -0
  120. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/iso_r01_s80.A99 +0 -0
  121. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/iso_r01_s80.B99 +0 -0
  122. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/si2_b06_m200.A99 +0 -0
  123. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/si2_b06_m200.B99 +0 -0
  124. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_ismags.py +0 -719
  125. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_isomorphism.py +0 -103
  126. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_isomorphvf2.py +0 -490
  127. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_match_helpers.py +0 -64
  128. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_temporalisomorphvf2.py +0 -212
  129. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_tree_isomorphism.py +0 -202
  130. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_vf2pp.py +0 -1655
  131. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_vf2pp_helpers.py +0 -3118
  132. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_vf2userfunc.py +0 -196
  133. package/runtime/python/okstra_vendor/networkx/algorithms/link_analysis/tests/__init__.py +0 -0
  134. package/runtime/python/okstra_vendor/networkx/algorithms/link_analysis/tests/test_hits.py +0 -77
  135. package/runtime/python/okstra_vendor/networkx/algorithms/link_analysis/tests/test_pagerank.py +0 -213
  136. package/runtime/python/okstra_vendor/networkx/algorithms/minors/tests/test_contraction.py +0 -544
  137. package/runtime/python/okstra_vendor/networkx/algorithms/operators/tests/__init__.py +0 -0
  138. package/runtime/python/okstra_vendor/networkx/algorithms/operators/tests/test_all.py +0 -328
  139. package/runtime/python/okstra_vendor/networkx/algorithms/operators/tests/test_binary.py +0 -451
  140. package/runtime/python/okstra_vendor/networkx/algorithms/operators/tests/test_product.py +0 -491
  141. package/runtime/python/okstra_vendor/networkx/algorithms/operators/tests/test_unary.py +0 -55
  142. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/tests/__init__.py +0 -0
  143. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/tests/test_astar.py +0 -254
  144. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/tests/test_dense.py +0 -212
  145. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/tests/test_dense_numpy.py +0 -88
  146. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/tests/test_generic.py +0 -511
  147. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/tests/test_unweighted.py +0 -149
  148. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/tests/test_weighted.py +0 -983
  149. package/runtime/python/okstra_vendor/networkx/algorithms/tests/__init__.py +0 -0
  150. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_asteroidal.py +0 -23
  151. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_boundary.py +0 -154
  152. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_bridges.py +0 -144
  153. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_broadcasting.py +0 -109
  154. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_chains.py +0 -136
  155. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_chordal.py +0 -129
  156. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_clique.py +0 -300
  157. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_cluster.py +0 -678
  158. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_communicability.py +0 -80
  159. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_core.py +0 -266
  160. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_covering.py +0 -85
  161. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_cuts.py +0 -171
  162. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_cycles.py +0 -984
  163. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_d_separation.py +0 -340
  164. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_dag.py +0 -835
  165. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_distance_measures.py +0 -831
  166. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_distance_regular.py +0 -85
  167. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_dominance.py +0 -299
  168. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_dominating.py +0 -115
  169. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_efficiency.py +0 -58
  170. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_euler.py +0 -314
  171. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_graph_hashing.py +0 -872
  172. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_graphical.py +0 -163
  173. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_hierarchy.py +0 -46
  174. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_hybrid.py +0 -24
  175. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_isolate.py +0 -26
  176. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_link_prediction.py +0 -615
  177. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_lowest_common_ancestors.py +0 -459
  178. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_matching.py +0 -556
  179. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_max_weight_clique.py +0 -179
  180. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_mis.py +0 -62
  181. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_moral.py +0 -15
  182. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_node_classification.py +0 -140
  183. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_non_randomness.py +0 -60
  184. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_perfect_graph.py +0 -27
  185. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_planar_drawing.py +0 -274
  186. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_planarity.py +0 -556
  187. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_polynomials.py +0 -57
  188. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_reciprocity.py +0 -37
  189. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_regular.py +0 -88
  190. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_richclub.py +0 -149
  191. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_similarity.py +0 -1158
  192. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_simple_paths.py +0 -803
  193. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_smallworld.py +0 -76
  194. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_smetric.py +0 -8
  195. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_sparsifiers.py +0 -138
  196. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_structuralholes.py +0 -191
  197. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_summarization.py +0 -642
  198. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_swap.py +0 -179
  199. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_threshold.py +0 -270
  200. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_time_dependent.py +0 -431
  201. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_tournament.py +0 -161
  202. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_triads.py +0 -248
  203. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_vitality.py +0 -41
  204. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_voronoi.py +0 -103
  205. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_walks.py +0 -54
  206. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_wiener.py +0 -157
  207. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/tests/__init__.py +0 -0
  208. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/tests/test_beamsearch.py +0 -25
  209. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/tests/test_bfs.py +0 -203
  210. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/tests/test_dfs.py +0 -307
  211. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/tests/test_edgebfs.py +0 -147
  212. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/tests/test_edgedfs.py +0 -131
  213. package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/__init__.py +0 -0
  214. package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/test_branchings.py +0 -624
  215. package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/test_coding.py +0 -114
  216. package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/test_decomposition.py +0 -79
  217. package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/test_distance_measures.py +0 -99
  218. package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/test_mst.py +0 -934
  219. package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/test_operations.py +0 -53
  220. package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/test_recognition.py +0 -174
  221. package/runtime/python/okstra_vendor/networkx/classes/tests/__init__.py +0 -0
  222. package/runtime/python/okstra_vendor/networkx/classes/tests/dispatch_interface.py +0 -192
  223. package/runtime/python/okstra_vendor/networkx/classes/tests/historical_tests.py +0 -476
  224. package/runtime/python/okstra_vendor/networkx/classes/tests/test_coreviews.py +0 -362
  225. package/runtime/python/okstra_vendor/networkx/classes/tests/test_digraph.py +0 -331
  226. package/runtime/python/okstra_vendor/networkx/classes/tests/test_digraph_historical.py +0 -110
  227. package/runtime/python/okstra_vendor/networkx/classes/tests/test_filters.py +0 -177
  228. package/runtime/python/okstra_vendor/networkx/classes/tests/test_function.py +0 -1045
  229. package/runtime/python/okstra_vendor/networkx/classes/tests/test_graph.py +0 -950
  230. package/runtime/python/okstra_vendor/networkx/classes/tests/test_graph_historical.py +0 -12
  231. package/runtime/python/okstra_vendor/networkx/classes/tests/test_graphviews.py +0 -349
  232. package/runtime/python/okstra_vendor/networkx/classes/tests/test_multidigraph.py +0 -459
  233. package/runtime/python/okstra_vendor/networkx/classes/tests/test_multigraph.py +0 -528
  234. package/runtime/python/okstra_vendor/networkx/classes/tests/test_reportviews.py +0 -1421
  235. package/runtime/python/okstra_vendor/networkx/classes/tests/test_special.py +0 -131
  236. package/runtime/python/okstra_vendor/networkx/classes/tests/test_subgraphviews.py +0 -371
  237. package/runtime/python/okstra_vendor/networkx/conftest.py +0 -261
  238. package/runtime/python/okstra_vendor/networkx/drawing/tests/__init__.py +0 -0
  239. package/runtime/python/okstra_vendor/networkx/drawing/tests/baseline/test_display_complex.png +0 -0
  240. package/runtime/python/okstra_vendor/networkx/drawing/tests/baseline/test_display_empty_graph.png +0 -0
  241. package/runtime/python/okstra_vendor/networkx/drawing/tests/baseline/test_display_house_with_colors.png +0 -0
  242. package/runtime/python/okstra_vendor/networkx/drawing/tests/baseline/test_display_labels_and_colors.png +0 -0
  243. package/runtime/python/okstra_vendor/networkx/drawing/tests/baseline/test_display_shortest_path.png +0 -0
  244. package/runtime/python/okstra_vendor/networkx/drawing/tests/baseline/test_house_with_colors.png +0 -0
  245. package/runtime/python/okstra_vendor/networkx/drawing/tests/test_agraph.py +0 -237
  246. package/runtime/python/okstra_vendor/networkx/drawing/tests/test_image_comparison_pylab_mpl.py +0 -229
  247. package/runtime/python/okstra_vendor/networkx/drawing/tests/test_latex.py +0 -285
  248. package/runtime/python/okstra_vendor/networkx/drawing/tests/test_layout.py +0 -631
  249. package/runtime/python/okstra_vendor/networkx/drawing/tests/test_pydot.py +0 -146
  250. package/runtime/python/okstra_vendor/networkx/drawing/tests/test_pylab.py +0 -1582
  251. package/runtime/python/okstra_vendor/networkx/generators/tests/__init__.py +0 -0
  252. package/runtime/python/okstra_vendor/networkx/generators/tests/test_atlas.py +0 -75
  253. package/runtime/python/okstra_vendor/networkx/generators/tests/test_classic.py +0 -642
  254. package/runtime/python/okstra_vendor/networkx/generators/tests/test_cographs.py +0 -20
  255. package/runtime/python/okstra_vendor/networkx/generators/tests/test_community.py +0 -362
  256. package/runtime/python/okstra_vendor/networkx/generators/tests/test_degree_seq.py +0 -224
  257. package/runtime/python/okstra_vendor/networkx/generators/tests/test_directed.py +0 -189
  258. package/runtime/python/okstra_vendor/networkx/generators/tests/test_duplication.py +0 -103
  259. package/runtime/python/okstra_vendor/networkx/generators/tests/test_ego.py +0 -39
  260. package/runtime/python/okstra_vendor/networkx/generators/tests/test_expanders.py +0 -182
  261. package/runtime/python/okstra_vendor/networkx/generators/tests/test_geometric.py +0 -488
  262. package/runtime/python/okstra_vendor/networkx/generators/tests/test_harary_graph.py +0 -133
  263. package/runtime/python/okstra_vendor/networkx/generators/tests/test_internet_as_graphs.py +0 -221
  264. package/runtime/python/okstra_vendor/networkx/generators/tests/test_intersection.py +0 -28
  265. package/runtime/python/okstra_vendor/networkx/generators/tests/test_interval_graph.py +0 -144
  266. package/runtime/python/okstra_vendor/networkx/generators/tests/test_joint_degree_seq.py +0 -125
  267. package/runtime/python/okstra_vendor/networkx/generators/tests/test_lattice.py +0 -264
  268. package/runtime/python/okstra_vendor/networkx/generators/tests/test_line.py +0 -316
  269. package/runtime/python/okstra_vendor/networkx/generators/tests/test_mycielski.py +0 -30
  270. package/runtime/python/okstra_vendor/networkx/generators/tests/test_nonisomorphic_trees.py +0 -82
  271. package/runtime/python/okstra_vendor/networkx/generators/tests/test_random_clustered.py +0 -33
  272. package/runtime/python/okstra_vendor/networkx/generators/tests/test_random_graphs.py +0 -495
  273. package/runtime/python/okstra_vendor/networkx/generators/tests/test_small.py +0 -220
  274. package/runtime/python/okstra_vendor/networkx/generators/tests/test_spectral_graph_forge.py +0 -49
  275. package/runtime/python/okstra_vendor/networkx/generators/tests/test_stochastic.py +0 -72
  276. package/runtime/python/okstra_vendor/networkx/generators/tests/test_sudoku.py +0 -92
  277. package/runtime/python/okstra_vendor/networkx/generators/tests/test_time_series.py +0 -64
  278. package/runtime/python/okstra_vendor/networkx/generators/tests/test_trees.py +0 -195
  279. package/runtime/python/okstra_vendor/networkx/generators/tests/test_triads.py +0 -15
  280. package/runtime/python/okstra_vendor/networkx/linalg/tests/__init__.py +0 -0
  281. package/runtime/python/okstra_vendor/networkx/linalg/tests/test_algebraic_connectivity.py +0 -400
  282. package/runtime/python/okstra_vendor/networkx/linalg/tests/test_attrmatrix.py +0 -108
  283. package/runtime/python/okstra_vendor/networkx/linalg/tests/test_bethehessian.py +0 -40
  284. package/runtime/python/okstra_vendor/networkx/linalg/tests/test_graphmatrix.py +0 -275
  285. package/runtime/python/okstra_vendor/networkx/linalg/tests/test_laplacian.py +0 -334
  286. package/runtime/python/okstra_vendor/networkx/linalg/tests/test_modularity.py +0 -86
  287. package/runtime/python/okstra_vendor/networkx/linalg/tests/test_spectrum.py +0 -70
  288. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/tests/__init__.py +0 -0
  289. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/tests/test_adjacency.py +0 -78
  290. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/tests/test_cytoscape.py +0 -78
  291. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/tests/test_node_link.py +0 -109
  292. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/tests/test_tree.py +0 -48
  293. package/runtime/python/okstra_vendor/networkx/readwrite/tests/__init__.py +0 -0
  294. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_adjlist.py +0 -354
  295. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_edgelist.py +0 -318
  296. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_gexf.py +0 -612
  297. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_gml.py +0 -744
  298. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_graph6.py +0 -181
  299. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_graphml.py +0 -1531
  300. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_leda.py +0 -30
  301. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_p2g.py +0 -63
  302. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_pajek.py +0 -128
  303. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_sparse6.py +0 -166
  304. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_text.py +0 -1742
  305. package/runtime/python/okstra_vendor/networkx/tests/__init__.py +0 -0
  306. package/runtime/python/okstra_vendor/networkx/tests/test_all_random_functions.py +0 -248
  307. package/runtime/python/okstra_vendor/networkx/tests/test_convert.py +0 -321
  308. package/runtime/python/okstra_vendor/networkx/tests/test_convert_numpy.py +0 -531
  309. package/runtime/python/okstra_vendor/networkx/tests/test_convert_pandas.py +0 -349
  310. package/runtime/python/okstra_vendor/networkx/tests/test_convert_scipy.py +0 -281
  311. package/runtime/python/okstra_vendor/networkx/tests/test_exceptions.py +0 -40
  312. package/runtime/python/okstra_vendor/networkx/tests/test_import.py +0 -11
  313. package/runtime/python/okstra_vendor/networkx/tests/test_lazy_imports.py +0 -96
  314. package/runtime/python/okstra_vendor/networkx/tests/test_relabel.py +0 -349
  315. package/runtime/python/okstra_vendor/networkx/tests/test_removed_functions_exception_messages.py +0 -8
  316. package/runtime/python/okstra_vendor/networkx/utils/tests/__init__.py +0 -0
  317. package/runtime/python/okstra_vendor/networkx/utils/tests/test__init.py +0 -11
  318. package/runtime/python/okstra_vendor/networkx/utils/tests/test_backends.py +0 -225
  319. package/runtime/python/okstra_vendor/networkx/utils/tests/test_config.py +0 -263
  320. package/runtime/python/okstra_vendor/networkx/utils/tests/test_decorators.py +0 -510
  321. package/runtime/python/okstra_vendor/networkx/utils/tests/test_heaps.py +0 -131
  322. package/runtime/python/okstra_vendor/networkx/utils/tests/test_mapped_queue.py +0 -268
  323. package/runtime/python/okstra_vendor/networkx/utils/tests/test_misc.py +0 -393
  324. package/runtime/python/okstra_vendor/networkx/utils/tests/test_random_sequence.py +0 -53
  325. package/runtime/python/okstra_vendor/networkx/utils/tests/test_rcm.py +0 -63
  326. package/runtime/python/okstra_vendor/networkx/utils/tests/test_unionfind.py +0 -55
@@ -1,96 +0,0 @@
1
- import sys
2
- import types
3
-
4
- import pytest
5
-
6
- import networkx.lazy_imports as lazy
7
-
8
-
9
- def test_lazy_import_basics():
10
- math = lazy._lazy_import("math")
11
- anything_not_real = lazy._lazy_import("anything_not_real")
12
-
13
- # Now test that accessing attributes does what it should
14
- assert math.sin(math.pi) == pytest.approx(0, 1e-6)
15
- # poor-mans pytest.raises for testing errors on attribute access
16
- try:
17
- anything_not_real.pi
18
- assert False # Should not get here
19
- except ModuleNotFoundError:
20
- pass
21
- assert isinstance(anything_not_real, lazy.DelayedImportErrorModule)
22
- # see if it changes for second access
23
- try:
24
- anything_not_real.pi
25
- assert False # Should not get here
26
- except ModuleNotFoundError:
27
- pass
28
-
29
-
30
- def test_lazy_import_impact_on_sys_modules():
31
- math = lazy._lazy_import("math")
32
- anything_not_real = lazy._lazy_import("anything_not_real")
33
-
34
- assert isinstance(math, types.ModuleType)
35
- assert "math" in sys.modules
36
- assert type(anything_not_real) is lazy.DelayedImportErrorModule
37
- assert "anything_not_real" not in sys.modules
38
-
39
- # only do this if numpy is installed
40
- np_test = pytest.importorskip("numpy")
41
- np = lazy._lazy_import("numpy")
42
- assert isinstance(np, types.ModuleType)
43
- assert "numpy" in sys.modules
44
-
45
- np.pi # trigger load of numpy
46
-
47
- assert isinstance(np, types.ModuleType)
48
- assert "numpy" in sys.modules
49
-
50
-
51
- def test_lazy_import_nonbuiltins():
52
- sp = lazy._lazy_import("scipy")
53
- np = lazy._lazy_import("numpy")
54
- if isinstance(sp, lazy.DelayedImportErrorModule):
55
- try:
56
- sp.special.erf
57
- assert False
58
- except ModuleNotFoundError:
59
- pass
60
- elif isinstance(np, lazy.DelayedImportErrorModule):
61
- try:
62
- np.sin(np.pi)
63
- assert False
64
- except ModuleNotFoundError:
65
- pass
66
- else:
67
- assert sp.special.erf(np.pi) == pytest.approx(1, 1e-4)
68
-
69
-
70
- def test_lazy_attach():
71
- name = "mymod"
72
- submods = ["mysubmodule", "anothersubmodule"]
73
- myall = {"not_real_submod": ["some_var_or_func"]}
74
-
75
- locls = {
76
- "attach": lazy.attach,
77
- "name": name,
78
- "submods": submods,
79
- "myall": myall,
80
- }
81
- s = "__getattr__, __lazy_dir__, __all__ = attach(name, submods, myall)"
82
-
83
- exec(s, {}, locls)
84
- expected = {
85
- "attach": lazy.attach,
86
- "name": name,
87
- "submods": submods,
88
- "myall": myall,
89
- "__getattr__": None,
90
- "__lazy_dir__": None,
91
- "__all__": None,
92
- }
93
- assert locls.keys() == expected.keys()
94
- for k, v in expected.items():
95
- if v is not None:
96
- assert locls[k] == v
@@ -1,349 +0,0 @@
1
- import pytest
2
-
3
- import networkx as nx
4
- from networkx.generators.classic import empty_graph
5
- from networkx.utils import edges_equal, nodes_equal
6
-
7
-
8
- class TestRelabel:
9
- def test_convert_node_labels_to_integers(self):
10
- # test that empty graph converts fine for all options
11
- G = empty_graph()
12
- H = nx.convert_node_labels_to_integers(G, 100)
13
- assert list(H.nodes()) == []
14
- assert list(H.edges()) == []
15
-
16
- for opt in ["default", "sorted", "increasing degree", "decreasing degree"]:
17
- G = empty_graph()
18
- H = nx.convert_node_labels_to_integers(G, 100, ordering=opt)
19
- assert list(H.nodes()) == []
20
- assert list(H.edges()) == []
21
-
22
- G = empty_graph()
23
- G.add_edges_from([("A", "B"), ("A", "C"), ("B", "C"), ("C", "D")])
24
- H = nx.convert_node_labels_to_integers(G)
25
- degH = (d for n, d in H.degree())
26
- degG = (d for n, d in G.degree())
27
- assert sorted(degH) == sorted(degG)
28
-
29
- H = nx.convert_node_labels_to_integers(G, 1000)
30
- degH = (d for n, d in H.degree())
31
- degG = (d for n, d in G.degree())
32
- assert sorted(degH) == sorted(degG)
33
- assert nodes_equal(H.nodes(), [1000, 1001, 1002, 1003])
34
-
35
- H = nx.convert_node_labels_to_integers(G, ordering="increasing degree")
36
- degH = (d for n, d in H.degree())
37
- degG = (d for n, d in G.degree())
38
- assert sorted(degH) == sorted(degG)
39
- assert H.degree(0) == 1
40
- assert H.degree(1) == 2
41
- assert H.degree(2) == 2
42
- assert H.degree(3) == 3
43
-
44
- H = nx.convert_node_labels_to_integers(G, ordering="decreasing degree")
45
- degH = (d for n, d in H.degree())
46
- degG = (d for n, d in G.degree())
47
- assert sorted(degH) == sorted(degG)
48
- assert H.degree(0) == 3
49
- assert H.degree(1) == 2
50
- assert H.degree(2) == 2
51
- assert H.degree(3) == 1
52
-
53
- H = nx.convert_node_labels_to_integers(
54
- G, ordering="increasing degree", label_attribute="label"
55
- )
56
- degH = (d for n, d in H.degree())
57
- degG = (d for n, d in G.degree())
58
- assert sorted(degH) == sorted(degG)
59
- assert H.degree(0) == 1
60
- assert H.degree(1) == 2
61
- assert H.degree(2) == 2
62
- assert H.degree(3) == 3
63
-
64
- # check mapping
65
- assert H.nodes[3]["label"] == "C"
66
- assert H.nodes[0]["label"] == "D"
67
- assert H.nodes[1]["label"] == "A" or H.nodes[2]["label"] == "A"
68
- assert H.nodes[1]["label"] == "B" or H.nodes[2]["label"] == "B"
69
-
70
- def test_convert_to_integers2(self):
71
- G = empty_graph()
72
- G.add_edges_from([("C", "D"), ("A", "B"), ("A", "C"), ("B", "C")])
73
- H = nx.convert_node_labels_to_integers(G, ordering="sorted")
74
- degH = (d for n, d in H.degree())
75
- degG = (d for n, d in G.degree())
76
- assert sorted(degH) == sorted(degG)
77
-
78
- H = nx.convert_node_labels_to_integers(
79
- G, ordering="sorted", label_attribute="label"
80
- )
81
- assert H.nodes[0]["label"] == "A"
82
- assert H.nodes[1]["label"] == "B"
83
- assert H.nodes[2]["label"] == "C"
84
- assert H.nodes[3]["label"] == "D"
85
-
86
- def test_convert_to_integers_raise(self):
87
- with pytest.raises(nx.NetworkXError):
88
- G = nx.Graph()
89
- H = nx.convert_node_labels_to_integers(G, ordering="increasing age")
90
-
91
- def test_relabel_nodes_copy(self):
92
- G = nx.empty_graph()
93
- G.add_edges_from([("A", "B"), ("A", "C"), ("B", "C"), ("C", "D")])
94
- mapping = {"A": "aardvark", "B": "bear", "C": "cat", "D": "dog"}
95
- H = nx.relabel_nodes(G, mapping)
96
- assert nodes_equal(H.nodes(), ["aardvark", "bear", "cat", "dog"])
97
-
98
- def test_relabel_nodes_function(self):
99
- G = nx.empty_graph()
100
- G.add_edges_from([("A", "B"), ("A", "C"), ("B", "C"), ("C", "D")])
101
- # function mapping no longer encouraged but works
102
-
103
- def mapping(n):
104
- return ord(n)
105
-
106
- H = nx.relabel_nodes(G, mapping)
107
- assert nodes_equal(H.nodes(), [65, 66, 67, 68])
108
-
109
- def test_relabel_nodes_callable_type(self):
110
- G = nx.path_graph(4)
111
- H = nx.relabel_nodes(G, str)
112
- assert nodes_equal(H.nodes, ["0", "1", "2", "3"])
113
-
114
- @pytest.mark.parametrize("non_mc", ("0123", ["0", "1", "2", "3"]))
115
- def test_relabel_nodes_non_mapping_or_callable(self, non_mc):
116
- """If `mapping` is neither a Callable or a Mapping, an exception
117
- should be raised."""
118
- G = nx.path_graph(4)
119
- with pytest.raises(AttributeError):
120
- nx.relabel_nodes(G, non_mc)
121
-
122
- def test_relabel_nodes_graph(self):
123
- G = nx.Graph([("A", "B"), ("A", "C"), ("B", "C"), ("C", "D")])
124
- mapping = {"A": "aardvark", "B": "bear", "C": "cat", "D": "dog"}
125
- H = nx.relabel_nodes(G, mapping)
126
- assert nodes_equal(H.nodes(), ["aardvark", "bear", "cat", "dog"])
127
-
128
- def test_relabel_nodes_orderedgraph(self):
129
- G = nx.Graph()
130
- G.add_nodes_from([1, 2, 3])
131
- G.add_edges_from([(1, 3), (2, 3)])
132
- mapping = {1: "a", 2: "b", 3: "c"}
133
- H = nx.relabel_nodes(G, mapping)
134
- assert list(H.nodes) == ["a", "b", "c"]
135
-
136
- def test_relabel_nodes_digraph(self):
137
- G = nx.DiGraph([("A", "B"), ("A", "C"), ("B", "C"), ("C", "D")])
138
- mapping = {"A": "aardvark", "B": "bear", "C": "cat", "D": "dog"}
139
- H = nx.relabel_nodes(G, mapping, copy=False)
140
- assert nodes_equal(H.nodes(), ["aardvark", "bear", "cat", "dog"])
141
-
142
- def test_relabel_nodes_multigraph(self):
143
- G = nx.MultiGraph([("a", "b"), ("a", "b")])
144
- mapping = {"a": "aardvark", "b": "bear"}
145
- G = nx.relabel_nodes(G, mapping, copy=False)
146
- assert nodes_equal(G.nodes(), ["aardvark", "bear"])
147
- assert edges_equal(G.edges(), [("aardvark", "bear"), ("aardvark", "bear")])
148
-
149
- def test_relabel_nodes_multidigraph(self):
150
- G = nx.MultiDiGraph([("a", "b"), ("a", "b")])
151
- mapping = {"a": "aardvark", "b": "bear"}
152
- G = nx.relabel_nodes(G, mapping, copy=False)
153
- assert nodes_equal(G.nodes(), ["aardvark", "bear"])
154
- assert edges_equal(
155
- G.edges(), [("aardvark", "bear"), ("aardvark", "bear")], directed=True
156
- )
157
-
158
- def test_relabel_isolated_nodes_to_same(self):
159
- G = nx.Graph()
160
- G.add_nodes_from(range(4))
161
- mapping = {1: 1}
162
- H = nx.relabel_nodes(G, mapping, copy=False)
163
- assert nodes_equal(H.nodes(), list(range(4)))
164
-
165
- def test_relabel_nodes_missing(self):
166
- G = nx.Graph([("A", "B"), ("A", "C"), ("B", "C"), ("C", "D")])
167
- mapping = {0: "aardvark"}
168
- # copy=True
169
- H = nx.relabel_nodes(G, mapping, copy=True)
170
- assert nodes_equal(H.nodes, G.nodes)
171
- # copy=False
172
- GG = G.copy()
173
- nx.relabel_nodes(G, mapping, copy=False)
174
- assert nodes_equal(G.nodes, GG.nodes)
175
-
176
- def test_relabel_copy_name(self):
177
- G = nx.Graph()
178
- H = nx.relabel_nodes(G, {}, copy=True)
179
- assert H.graph == G.graph
180
- H = nx.relabel_nodes(G, {}, copy=False)
181
- assert H.graph == G.graph
182
- G.name = "first"
183
- H = nx.relabel_nodes(G, {}, copy=True)
184
- assert H.graph == G.graph
185
- H = nx.relabel_nodes(G, {}, copy=False)
186
- assert H.graph == G.graph
187
-
188
- def test_relabel_toposort(self):
189
- K5 = nx.complete_graph(4)
190
- G = nx.complete_graph(4)
191
- G = nx.relabel_nodes(G, {i: i + 1 for i in range(4)}, copy=False)
192
- assert nx.is_isomorphic(K5, G)
193
- G = nx.complete_graph(4)
194
- G = nx.relabel_nodes(G, {i: i - 1 for i in range(4)}, copy=False)
195
- assert nx.is_isomorphic(K5, G)
196
-
197
- def test_relabel_selfloop(self):
198
- G = nx.DiGraph([(1, 1), (1, 2), (2, 3)])
199
- G = nx.relabel_nodes(G, {1: "One", 2: "Two", 3: "Three"}, copy=False)
200
- assert nodes_equal(G.nodes(), ["One", "Three", "Two"])
201
- G = nx.MultiDiGraph([(1, 1), (1, 2), (2, 3)])
202
- G = nx.relabel_nodes(G, {1: "One", 2: "Two", 3: "Three"}, copy=False)
203
- assert nodes_equal(G.nodes(), ["One", "Three", "Two"])
204
- G = nx.MultiDiGraph([(1, 1)])
205
- G = nx.relabel_nodes(G, {1: 0}, copy=False)
206
- assert nodes_equal(G.nodes(), [0])
207
-
208
- def test_relabel_multidigraph_inout_merge_nodes(self):
209
- for MG in (nx.MultiGraph, nx.MultiDiGraph):
210
- for cc in (True, False):
211
- G = MG([(0, 4), (1, 4), (4, 2), (4, 3)])
212
- G[0][4][0]["value"] = "a"
213
- G[1][4][0]["value"] = "b"
214
- G[4][2][0]["value"] = "c"
215
- G[4][3][0]["value"] = "d"
216
- G.add_edge(0, 4, key="x", value="e")
217
- G.add_edge(4, 3, key="x", value="f")
218
- mapping = {0: 9, 1: 9, 2: 9, 3: 9}
219
- H = nx.relabel_nodes(G, mapping, copy=cc)
220
- # No ordering on keys enforced
221
- assert {"value": "a"} in H[9][4].values()
222
- assert {"value": "b"} in H[9][4].values()
223
- assert {"value": "c"} in H[4][9].values()
224
- assert len(H[4][9]) == 3 if G.is_directed() else 6
225
- assert {"value": "d"} in H[4][9].values()
226
- assert {"value": "e"} in H[9][4].values()
227
- assert {"value": "f"} in H[4][9].values()
228
- assert len(H[9][4]) == 3 if G.is_directed() else 6
229
-
230
- def test_relabel_multigraph_merge_inplace(self):
231
- G = nx.MultiGraph([(0, 1), (0, 2), (0, 3), (0, 1), (0, 2), (0, 3)])
232
- G[0][1][0]["value"] = "a"
233
- G[0][2][0]["value"] = "b"
234
- G[0][3][0]["value"] = "c"
235
- mapping = {1: 4, 2: 4, 3: 4}
236
- nx.relabel_nodes(G, mapping, copy=False)
237
- # No ordering on keys enforced
238
- assert {"value": "a"} in G[0][4].values()
239
- assert {"value": "b"} in G[0][4].values()
240
- assert {"value": "c"} in G[0][4].values()
241
-
242
- def test_relabel_multidigraph_merge_inplace(self):
243
- G = nx.MultiDiGraph([(0, 1), (0, 2), (0, 3)])
244
- G[0][1][0]["value"] = "a"
245
- G[0][2][0]["value"] = "b"
246
- G[0][3][0]["value"] = "c"
247
- mapping = {1: 4, 2: 4, 3: 4}
248
- nx.relabel_nodes(G, mapping, copy=False)
249
- # No ordering on keys enforced
250
- assert {"value": "a"} in G[0][4].values()
251
- assert {"value": "b"} in G[0][4].values()
252
- assert {"value": "c"} in G[0][4].values()
253
-
254
- def test_relabel_multidigraph_inout_copy(self):
255
- G = nx.MultiDiGraph([(0, 4), (1, 4), (4, 2), (4, 3)])
256
- G[0][4][0]["value"] = "a"
257
- G[1][4][0]["value"] = "b"
258
- G[4][2][0]["value"] = "c"
259
- G[4][3][0]["value"] = "d"
260
- G.add_edge(0, 4, key="x", value="e")
261
- G.add_edge(4, 3, key="x", value="f")
262
- mapping = {0: 9, 1: 9, 2: 9, 3: 9}
263
- H = nx.relabel_nodes(G, mapping, copy=True)
264
- # No ordering on keys enforced
265
- assert {"value": "a"} in H[9][4].values()
266
- assert {"value": "b"} in H[9][4].values()
267
- assert {"value": "c"} in H[4][9].values()
268
- assert len(H[4][9]) == 3
269
- assert {"value": "d"} in H[4][9].values()
270
- assert {"value": "e"} in H[9][4].values()
271
- assert {"value": "f"} in H[4][9].values()
272
- assert len(H[9][4]) == 3
273
-
274
- def test_relabel_multigraph_merge_copy(self):
275
- G = nx.MultiGraph([(0, 1), (0, 2), (0, 3)])
276
- G[0][1][0]["value"] = "a"
277
- G[0][2][0]["value"] = "b"
278
- G[0][3][0]["value"] = "c"
279
- mapping = {1: 4, 2: 4, 3: 4}
280
- H = nx.relabel_nodes(G, mapping, copy=True)
281
- assert {"value": "a"} in H[0][4].values()
282
- assert {"value": "b"} in H[0][4].values()
283
- assert {"value": "c"} in H[0][4].values()
284
-
285
- def test_relabel_multidigraph_merge_copy(self):
286
- G = nx.MultiDiGraph([(0, 1), (0, 2), (0, 3)])
287
- G[0][1][0]["value"] = "a"
288
- G[0][2][0]["value"] = "b"
289
- G[0][3][0]["value"] = "c"
290
- mapping = {1: 4, 2: 4, 3: 4}
291
- H = nx.relabel_nodes(G, mapping, copy=True)
292
- assert {"value": "a"} in H[0][4].values()
293
- assert {"value": "b"} in H[0][4].values()
294
- assert {"value": "c"} in H[0][4].values()
295
-
296
- def test_relabel_multigraph_nonnumeric_key(self):
297
- for MG in (nx.MultiGraph, nx.MultiDiGraph):
298
- for cc in (True, False):
299
- G = nx.MultiGraph()
300
- G.add_edge(0, 1, key="I", value="a")
301
- G.add_edge(0, 2, key="II", value="b")
302
- G.add_edge(0, 3, key="II", value="c")
303
- mapping = {1: 4, 2: 4, 3: 4}
304
- nx.relabel_nodes(G, mapping, copy=False)
305
- assert {"value": "a"} in G[0][4].values()
306
- assert {"value": "b"} in G[0][4].values()
307
- assert {"value": "c"} in G[0][4].values()
308
- assert 0 in G[0][4]
309
- assert "I" in G[0][4]
310
- assert "II" in G[0][4]
311
-
312
- def test_relabel_circular(self):
313
- G = nx.path_graph(3)
314
- mapping = {0: 1, 1: 0}
315
- H = nx.relabel_nodes(G, mapping, copy=True)
316
- with pytest.raises(nx.NetworkXUnfeasible):
317
- H = nx.relabel_nodes(G, mapping, copy=False)
318
-
319
- def test_relabel_preserve_node_order_full_mapping_with_copy_true(self):
320
- G = nx.path_graph(3)
321
- original_order = list(G.nodes())
322
- mapping = {2: "a", 1: "b", 0: "c"} # dictionary keys out of order on purpose
323
- H = nx.relabel_nodes(G, mapping, copy=True)
324
- new_order = list(H.nodes())
325
- assert [mapping.get(i, i) for i in original_order] == new_order
326
-
327
- def test_relabel_preserve_node_order_full_mapping_with_copy_false(self):
328
- G = nx.path_graph(3)
329
- original_order = list(G)
330
- mapping = {2: "a", 1: "b", 0: "c"} # dictionary keys out of order on purpose
331
- H = nx.relabel_nodes(G, mapping, copy=False)
332
- new_order = list(H)
333
- assert [mapping.get(i, i) for i in original_order] == new_order
334
-
335
- def test_relabel_preserve_node_order_partial_mapping_with_copy_true(self):
336
- G = nx.path_graph(3)
337
- original_order = list(G)
338
- mapping = {1: "a", 0: "b"} # partial mapping and keys out of order on purpose
339
- H = nx.relabel_nodes(G, mapping, copy=True)
340
- new_order = list(H)
341
- assert [mapping.get(i, i) for i in original_order] == new_order
342
-
343
- def test_relabel_preserve_node_order_partial_mapping_with_copy_false(self):
344
- G = nx.path_graph(3)
345
- original_order = list(G)
346
- mapping = {1: "a", 0: "b"} # partial mapping and keys out of order on purpose
347
- H = nx.relabel_nodes(G, mapping, copy=False)
348
- new_order = list(H)
349
- assert [mapping.get(i, i) for i in original_order] != new_order
@@ -1,8 +0,0 @@
1
- import pytest
2
-
3
- import networkx as nx
4
-
5
-
6
- def test_random_tree():
7
- with pytest.raises(AttributeError, match=".*Use `nx.random_labeled_tree` instead"):
8
- nx.random_tree(3)
@@ -1,11 +0,0 @@
1
- import pytest
2
-
3
-
4
- def test_utils_namespace():
5
- """Ensure objects are not unintentionally exposed in utils namespace."""
6
- with pytest.raises(ImportError):
7
- from networkx.utils import nx
8
- with pytest.raises(ImportError):
9
- from networkx.utils import sys
10
- with pytest.raises(ImportError):
11
- from networkx.utils import defaultdict, deque
@@ -1,225 +0,0 @@
1
- import pickle
2
-
3
- import pytest
4
-
5
- import networkx as nx
6
-
7
- sp = pytest.importorskip("scipy")
8
- pytest.importorskip("numpy")
9
-
10
-
11
- @nx._dispatchable(implemented_by_nx=False)
12
- def _stub_func(G):
13
- raise NotImplementedError("_stub_func is a stub")
14
-
15
-
16
- def test_dispatch_kwds_vs_args():
17
- G = nx.path_graph(4)
18
- nx.pagerank(G)
19
- nx.pagerank(G=G)
20
- with pytest.raises(TypeError):
21
- nx.pagerank()
22
-
23
-
24
- def test_pickle():
25
- count = 0
26
- for name, func in nx.utils.backends._registered_algorithms.items():
27
- pickled = pickle.dumps(func.__wrapped__)
28
- assert pickle.loads(pickled) is func.__wrapped__
29
- try:
30
- # Some functions can't be pickled, but it's not b/c of _dispatchable
31
- pickled = pickle.dumps(func)
32
- except pickle.PicklingError:
33
- continue
34
- assert pickle.loads(pickled) is func
35
- count += 1
36
- assert count > 0
37
- assert pickle.loads(pickle.dumps(nx.inverse_line_graph)) is nx.inverse_line_graph
38
-
39
-
40
- @pytest.mark.skipif(
41
- "not nx.config.backend_priority.algos "
42
- "or nx.config.backend_priority.algos[0] != 'nx_loopback'"
43
- )
44
- def test_graph_converter_needs_backend():
45
- # When testing, `nx.from_scipy_sparse_array` will *always* call the backend
46
- # implementation if it's implemented. If `backend=` isn't given, then the result
47
- # will be converted back to NetworkX via `convert_to_nx`.
48
- # If not testing, then calling `nx.from_scipy_sparse_array` w/o `backend=` will
49
- # always call the original version. `backend=` is *required* to call the backend.
50
- from networkx.classes.tests.dispatch_interface import (
51
- LoopbackBackendInterface,
52
- LoopbackGraph,
53
- )
54
-
55
- A = sp.sparse.coo_array([[0, 3, 2], [3, 0, 1], [2, 1, 0]])
56
-
57
- side_effects = []
58
-
59
- def from_scipy_sparse_array(self, *args, **kwargs):
60
- side_effects.append(1) # Just to prove this was called
61
- return self.convert_from_nx(
62
- self.__getattr__("from_scipy_sparse_array")(*args, **kwargs),
63
- preserve_edge_attrs=True,
64
- preserve_node_attrs=True,
65
- preserve_graph_attrs=True,
66
- )
67
-
68
- @staticmethod
69
- def convert_to_nx(obj, *, name=None):
70
- if type(obj) is nx.Graph:
71
- return obj
72
- return nx.Graph(obj)
73
-
74
- # *This mutates LoopbackBackendInterface!*
75
- orig_convert_to_nx = LoopbackBackendInterface.convert_to_nx
76
- LoopbackBackendInterface.convert_to_nx = convert_to_nx
77
- LoopbackBackendInterface.from_scipy_sparse_array = from_scipy_sparse_array
78
-
79
- try:
80
- assert side_effects == []
81
- assert type(nx.from_scipy_sparse_array(A)) is nx.Graph
82
- assert side_effects == [1]
83
- assert (
84
- type(nx.from_scipy_sparse_array(A, backend="nx_loopback")) is LoopbackGraph
85
- )
86
- assert side_effects == [1, 1]
87
- # backend="networkx" is default implementation
88
- assert type(nx.from_scipy_sparse_array(A, backend="networkx")) is nx.Graph
89
- assert side_effects == [1, 1]
90
- finally:
91
- LoopbackBackendInterface.convert_to_nx = staticmethod(orig_convert_to_nx)
92
- del LoopbackBackendInterface.from_scipy_sparse_array
93
- with pytest.raises(ImportError, match="backend is not installed"):
94
- nx.from_scipy_sparse_array(A, backend="bad-backend-name")
95
-
96
-
97
- @pytest.mark.skipif(
98
- "not nx.config.backend_priority.algos "
99
- "or nx.config.backend_priority.algos[0] != 'nx_loopback'"
100
- )
101
- def test_networkx_backend():
102
- """Test using `backend="networkx"` in a dispatchable function."""
103
- # (Implementing this test is harder than it should be)
104
- from networkx.classes.tests.dispatch_interface import (
105
- LoopbackBackendInterface,
106
- LoopbackGraph,
107
- )
108
-
109
- G = LoopbackGraph()
110
- G.add_edges_from([(0, 1), (1, 2), (1, 3), (2, 4)])
111
-
112
- @staticmethod
113
- def convert_to_nx(obj, *, name=None):
114
- if isinstance(obj, LoopbackGraph):
115
- new_graph = nx.Graph()
116
- new_graph.__dict__.update(obj.__dict__)
117
- return new_graph
118
- return obj
119
-
120
- # *This mutates LoopbackBackendInterface!*
121
- # This uses the same trick as in the previous test.
122
- orig_convert_to_nx = LoopbackBackendInterface.convert_to_nx
123
- LoopbackBackendInterface.convert_to_nx = convert_to_nx
124
- try:
125
- G2 = nx.ego_graph(G, 0, backend="networkx")
126
- assert type(G2) is nx.Graph
127
- finally:
128
- LoopbackBackendInterface.convert_to_nx = staticmethod(orig_convert_to_nx)
129
-
130
-
131
- def test_dispatchable_are_functions():
132
- assert type(nx.pagerank) is type(nx.pagerank.orig_func)
133
-
134
-
135
- @pytest.mark.skipif("not nx.utils.backends.backends")
136
- def test_mixing_backend_graphs():
137
- from networkx.classes.tests import dispatch_interface
138
-
139
- G = nx.Graph()
140
- G.add_edge(1, 2)
141
- G.add_edge(2, 3)
142
- H = nx.Graph()
143
- H.add_edge(2, 3)
144
- rv = nx.intersection(G, H)
145
- assert set(nx.intersection(G, H)) == {2, 3}
146
- G2 = dispatch_interface.convert(G)
147
- H2 = dispatch_interface.convert(H)
148
- if "nx_loopback" in nx.config.backend_priority:
149
- # Auto-convert
150
- assert set(nx.intersection(G2, H)) == {2, 3}
151
- assert set(nx.intersection(G, H2)) == {2, 3}
152
- elif not nx.config.backend_priority and "nx_loopback" not in nx.config.backends:
153
- # G2 and H2 are backend objects for a backend that is not registered!
154
- with pytest.raises(ImportError, match="backend is not installed"):
155
- nx.intersection(G2, H)
156
- with pytest.raises(ImportError, match="backend is not installed"):
157
- nx.intersection(G, H2)
158
- # It would be nice to test passing graphs from *different* backends,
159
- # but we are not set up to do this yet.
160
-
161
-
162
- def test_bad_backend_name():
163
- """Using `backend=` raises with unknown backend even if there are no backends."""
164
- with pytest.raises(
165
- ImportError, match="'this_backend_does_not_exist' backend is not installed"
166
- ):
167
- nx.null_graph(backend="this_backend_does_not_exist")
168
-
169
-
170
- def test_not_implemented_by_nx():
171
- assert "networkx" in nx.pagerank.backends
172
- assert "networkx" not in _stub_func.backends
173
-
174
- if "nx_loopback" in nx.config.backends:
175
- from networkx.classes.tests.dispatch_interface import LoopbackBackendInterface
176
-
177
- def stub_func_implementation(G):
178
- return True
179
-
180
- LoopbackBackendInterface._stub_func = staticmethod(stub_func_implementation)
181
- try:
182
- assert _stub_func(nx.Graph()) is True
183
- finally:
184
- del LoopbackBackendInterface._stub_func
185
-
186
- with pytest.raises(NotImplementedError):
187
- _stub_func(nx.Graph())
188
-
189
-
190
- @pytest.mark.skipif(
191
- "not nx.config.backend_priority.algos "
192
- "or nx.config.backend_priority.algos[0] != 'nx_loopback'"
193
- )
194
- def test_dispatch_graph_new():
195
- from networkx.classes.tests.dispatch_interface import LoopbackGraph
196
-
197
- G = nx.Graph()
198
- assert not isinstance(G, LoopbackGraph)
199
-
200
- # `backend=` argument that gets passed to __init__ is ignored.
201
- # Best practice is that it should not be in the `.graph` dict.
202
- G = nx.Graph(backend="networkx")
203
- assert type(G) is nx.Graph
204
- assert "backend" not in G.graph
205
-
206
- G = nx.Graph(backend="nx_loopback")
207
- assert isinstance(G, LoopbackGraph)
208
- assert "backend" not in G.graph
209
-
210
- # Args are passed
211
- G1 = nx.Graph([(0, 1), (1, 2)])
212
- assert not isinstance(G1, LoopbackGraph)
213
- G2 = nx.Graph([(0, 1), (1, 2)], backend="nx_loopback")
214
- assert isinstance(G2, LoopbackGraph)
215
- assert nx.utils.misc.graphs_equal(G1, G2)
216
-
217
- # Test config for automatic usage
218
- with nx.config.backend_priority(classes=["nx_loopback"]):
219
- G = nx.Graph()
220
- assert isinstance(G, LoopbackGraph)
221
- # LoopbackDiGraph __new__ is not implemented
222
- G = nx.DiGraph()
223
- assert not isinstance(G, LoopbackGraph)
224
- G = nx.Graph()
225
- assert not isinstance(G, LoopbackGraph)