okstra 0.113.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 (348) hide show
  1. package/README.kr.md +2 -2
  2. package/README.md +2 -2
  3. package/docs/for-ai/README.md +2 -2
  4. package/docs/for-ai/skills/{okstra-brief.md → okstra-brief-gen.md} +3 -3
  5. package/docs/for-ai/skills/okstra-inspect.md +1 -1
  6. package/docs/kr/architecture.md +11 -11
  7. package/docs/kr/cli.md +1 -1
  8. package/docs/kr/follow-ups/2026-07-10-final-report-option-3.md +51 -0
  9. package/docs/project-structure-overview.md +2 -2
  10. package/package.json +1 -1
  11. package/runtime/BUILD.json +2 -2
  12. package/runtime/agents/workers/report-writer-worker.md +1 -0
  13. package/runtime/prompts/lead/context-loader.md +2 -2
  14. package/runtime/prompts/lead/okstra-lead-contract.md +1 -1
  15. package/runtime/prompts/profiles/_common-contract.md +3 -3
  16. package/runtime/prompts/profiles/implementation-planning.md +1 -1
  17. package/runtime/prompts/profiles/requirements-discovery.md +2 -2
  18. package/runtime/python/okstra_ctl/fix_cycles.py +1 -1
  19. package/runtime/python/okstra_ctl/implementation_stage.py +46 -39
  20. package/runtime/python/okstra_ctl/report_views.py +151 -12
  21. package/runtime/python/okstra_ctl/run.py +24 -24
  22. package/runtime/python/okstra_ctl/wizard.py +3 -3
  23. package/runtime/python/okstra_ctl/worktree.py +1 -1
  24. package/runtime/python/okstra_token_usage/claude.py +58 -19
  25. package/runtime/python/okstra_token_usage/collect.py +3 -1
  26. package/runtime/python/okstra_vendor/__init__.py +3 -0
  27. package/runtime/schemas/final-report-v1.0.schema.json +20 -0
  28. package/runtime/skills/{okstra-brief → okstra-brief-gen}/SKILL.md +6 -6
  29. package/runtime/skills/{okstra-brief → okstra-brief-gen}/references/reporter-confirmations.md +1 -1
  30. package/runtime/skills/{okstra-brief → okstra-brief-gen}/references/tracker-recursion.md +1 -1
  31. package/runtime/skills/okstra-inspect/SKILL.md +2 -2
  32. package/runtime/templates/reports/brief.template.md +2 -2
  33. package/runtime/templates/reports/final-report.template.md +14 -0
  34. package/runtime/templates/reports/i18n/en.json +23 -12
  35. package/runtime/templates/reports/i18n/ko.json +23 -12
  36. package/runtime/templates/reports/report.css +55 -0
  37. package/runtime/templates/reports/report.js +53 -1
  38. package/runtime/validators/validate-brief.py +5 -5
  39. package/runtime/validators/validate-brief.sh +1 -1
  40. package/src/commands/lifecycle/uninstall.mjs +2 -1
  41. package/src/lib/skill-catalog.mjs +2 -1
  42. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/__init__.py +0 -0
  43. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_approx_clust_coeff.py +0 -41
  44. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_clique.py +0 -112
  45. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_connectivity.py +0 -199
  46. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_density.py +0 -146
  47. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_distance_measures.py +0 -59
  48. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_dominating_set.py +0 -78
  49. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_kcomponents.py +0 -303
  50. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_matching.py +0 -8
  51. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_maxcut.py +0 -94
  52. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_ramsey.py +0 -31
  53. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_steinertree.py +0 -306
  54. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_traveling_salesman.py +0 -1014
  55. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_treewidth.py +0 -274
  56. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_vertex_cover.py +0 -68
  57. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/tests/__init__.py +0 -0
  58. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/tests/base_test.py +0 -81
  59. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/tests/test_connectivity.py +0 -143
  60. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/tests/test_correlation.py +0 -122
  61. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/tests/test_mixing.py +0 -174
  62. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/tests/test_neighbor_degree.py +0 -107
  63. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/tests/test_pairs.py +0 -87
  64. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/__init__.py +0 -0
  65. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_basic.py +0 -125
  66. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_centrality.py +0 -192
  67. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_cluster.py +0 -84
  68. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_covering.py +0 -33
  69. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_edgelist.py +0 -240
  70. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_extendability.py +0 -334
  71. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_generators.py +0 -407
  72. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_link_analysis.py +0 -218
  73. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_matching.py +0 -327
  74. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_matrix.py +0 -138
  75. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_project.py +0 -409
  76. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_redundancy.py +0 -35
  77. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_spectral_bipartivity.py +0 -80
  78. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/__init__.py +0 -0
  79. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_betweenness_centrality.py +0 -923
  80. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_betweenness_centrality_subset.py +0 -354
  81. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_closeness_centrality.py +0 -274
  82. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_current_flow_betweenness_centrality.py +0 -259
  83. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_current_flow_betweenness_centrality_subset.py +0 -147
  84. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_current_flow_closeness.py +0 -43
  85. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_degree_centrality.py +0 -144
  86. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_dispersion.py +0 -73
  87. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_eigenvector_centrality.py +0 -186
  88. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_group.py +0 -277
  89. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_harmonic_centrality.py +0 -122
  90. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_katz_centrality.py +0 -345
  91. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_laplacian_centrality.py +0 -220
  92. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_load_centrality.py +0 -344
  93. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_percolation_centrality.py +0 -87
  94. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_reaching.py +0 -140
  95. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_second_order_centrality.py +0 -82
  96. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_subgraph.py +0 -110
  97. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_trophic.py +0 -302
  98. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_voterank.py +0 -64
  99. package/runtime/python/okstra_vendor/networkx/algorithms/coloring/tests/__init__.py +0 -0
  100. package/runtime/python/okstra_vendor/networkx/algorithms/coloring/tests/test_coloring.py +0 -863
  101. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/__init__.py +0 -0
  102. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_asyn_fluid.py +0 -147
  103. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_bipartitions.py +0 -157
  104. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_centrality.py +0 -85
  105. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_divisive.py +0 -106
  106. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_kclique.py +0 -91
  107. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_label_propagation.py +0 -241
  108. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_leiden.py +0 -138
  109. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_local.py +0 -76
  110. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_louvain.py +0 -264
  111. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_lukes.py +0 -152
  112. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_modularity_max.py +0 -340
  113. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_quality.py +0 -139
  114. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_utils.py +0 -26
  115. package/runtime/python/okstra_vendor/networkx/algorithms/components/tests/__init__.py +0 -0
  116. package/runtime/python/okstra_vendor/networkx/algorithms/components/tests/test_attracting.py +0 -70
  117. package/runtime/python/okstra_vendor/networkx/algorithms/components/tests/test_biconnected.py +0 -248
  118. package/runtime/python/okstra_vendor/networkx/algorithms/components/tests/test_connected.py +0 -138
  119. package/runtime/python/okstra_vendor/networkx/algorithms/components/tests/test_semiconnected.py +0 -55
  120. package/runtime/python/okstra_vendor/networkx/algorithms/components/tests/test_strongly_connected.py +0 -193
  121. package/runtime/python/okstra_vendor/networkx/algorithms/components/tests/test_weakly_connected.py +0 -96
  122. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/__init__.py +0 -0
  123. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_connectivity.py +0 -421
  124. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_cuts.py +0 -309
  125. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_disjoint_paths.py +0 -249
  126. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_edge_augmentation.py +0 -502
  127. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_edge_kcomponents.py +0 -488
  128. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_kcomponents.py +0 -323
  129. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_kcutsets.py +0 -280
  130. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_stoer_wagner.py +0 -102
  131. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/__init__.py +0 -0
  132. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/gl1.gpickle.bz2 +0 -0
  133. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/gw1.gpickle.bz2 +0 -0
  134. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/netgen-2.gpickle.bz2 +0 -0
  135. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/test_gomory_hu.py +0 -128
  136. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/test_maxflow.py +0 -573
  137. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/test_maxflow_large_graph.py +0 -155
  138. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/test_mincost.py +0 -475
  139. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/test_networksimplex.py +0 -481
  140. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/wlm3.gpickle.bz2 +0 -0
  141. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/__init__.py +0 -0
  142. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/iso_r01_s80.A99 +0 -0
  143. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/iso_r01_s80.B99 +0 -0
  144. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/si2_b06_m200.A99 +0 -0
  145. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/si2_b06_m200.B99 +0 -0
  146. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_ismags.py +0 -719
  147. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_isomorphism.py +0 -103
  148. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_isomorphvf2.py +0 -490
  149. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_match_helpers.py +0 -64
  150. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_temporalisomorphvf2.py +0 -212
  151. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_tree_isomorphism.py +0 -202
  152. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_vf2pp.py +0 -1655
  153. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_vf2pp_helpers.py +0 -3118
  154. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_vf2userfunc.py +0 -196
  155. package/runtime/python/okstra_vendor/networkx/algorithms/link_analysis/tests/__init__.py +0 -0
  156. package/runtime/python/okstra_vendor/networkx/algorithms/link_analysis/tests/test_hits.py +0 -77
  157. package/runtime/python/okstra_vendor/networkx/algorithms/link_analysis/tests/test_pagerank.py +0 -213
  158. package/runtime/python/okstra_vendor/networkx/algorithms/minors/tests/test_contraction.py +0 -544
  159. package/runtime/python/okstra_vendor/networkx/algorithms/operators/tests/__init__.py +0 -0
  160. package/runtime/python/okstra_vendor/networkx/algorithms/operators/tests/test_all.py +0 -328
  161. package/runtime/python/okstra_vendor/networkx/algorithms/operators/tests/test_binary.py +0 -451
  162. package/runtime/python/okstra_vendor/networkx/algorithms/operators/tests/test_product.py +0 -491
  163. package/runtime/python/okstra_vendor/networkx/algorithms/operators/tests/test_unary.py +0 -55
  164. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/tests/__init__.py +0 -0
  165. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/tests/test_astar.py +0 -254
  166. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/tests/test_dense.py +0 -212
  167. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/tests/test_dense_numpy.py +0 -88
  168. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/tests/test_generic.py +0 -511
  169. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/tests/test_unweighted.py +0 -149
  170. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/tests/test_weighted.py +0 -983
  171. package/runtime/python/okstra_vendor/networkx/algorithms/tests/__init__.py +0 -0
  172. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_asteroidal.py +0 -23
  173. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_boundary.py +0 -154
  174. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_bridges.py +0 -144
  175. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_broadcasting.py +0 -109
  176. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_chains.py +0 -136
  177. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_chordal.py +0 -129
  178. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_clique.py +0 -300
  179. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_cluster.py +0 -678
  180. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_communicability.py +0 -80
  181. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_core.py +0 -266
  182. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_covering.py +0 -85
  183. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_cuts.py +0 -171
  184. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_cycles.py +0 -984
  185. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_d_separation.py +0 -340
  186. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_dag.py +0 -835
  187. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_distance_measures.py +0 -831
  188. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_distance_regular.py +0 -85
  189. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_dominance.py +0 -299
  190. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_dominating.py +0 -115
  191. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_efficiency.py +0 -58
  192. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_euler.py +0 -314
  193. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_graph_hashing.py +0 -872
  194. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_graphical.py +0 -163
  195. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_hierarchy.py +0 -46
  196. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_hybrid.py +0 -24
  197. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_isolate.py +0 -26
  198. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_link_prediction.py +0 -615
  199. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_lowest_common_ancestors.py +0 -459
  200. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_matching.py +0 -556
  201. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_max_weight_clique.py +0 -179
  202. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_mis.py +0 -62
  203. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_moral.py +0 -15
  204. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_node_classification.py +0 -140
  205. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_non_randomness.py +0 -60
  206. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_perfect_graph.py +0 -27
  207. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_planar_drawing.py +0 -274
  208. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_planarity.py +0 -556
  209. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_polynomials.py +0 -57
  210. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_reciprocity.py +0 -37
  211. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_regular.py +0 -88
  212. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_richclub.py +0 -149
  213. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_similarity.py +0 -1158
  214. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_simple_paths.py +0 -803
  215. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_smallworld.py +0 -76
  216. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_smetric.py +0 -8
  217. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_sparsifiers.py +0 -138
  218. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_structuralholes.py +0 -191
  219. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_summarization.py +0 -642
  220. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_swap.py +0 -179
  221. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_threshold.py +0 -270
  222. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_time_dependent.py +0 -431
  223. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_tournament.py +0 -161
  224. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_triads.py +0 -248
  225. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_vitality.py +0 -41
  226. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_voronoi.py +0 -103
  227. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_walks.py +0 -54
  228. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_wiener.py +0 -157
  229. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/tests/__init__.py +0 -0
  230. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/tests/test_beamsearch.py +0 -25
  231. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/tests/test_bfs.py +0 -203
  232. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/tests/test_dfs.py +0 -307
  233. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/tests/test_edgebfs.py +0 -147
  234. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/tests/test_edgedfs.py +0 -131
  235. package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/__init__.py +0 -0
  236. package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/test_branchings.py +0 -624
  237. package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/test_coding.py +0 -114
  238. package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/test_decomposition.py +0 -79
  239. package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/test_distance_measures.py +0 -99
  240. package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/test_mst.py +0 -934
  241. package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/test_operations.py +0 -53
  242. package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/test_recognition.py +0 -174
  243. package/runtime/python/okstra_vendor/networkx/classes/tests/__init__.py +0 -0
  244. package/runtime/python/okstra_vendor/networkx/classes/tests/dispatch_interface.py +0 -192
  245. package/runtime/python/okstra_vendor/networkx/classes/tests/historical_tests.py +0 -476
  246. package/runtime/python/okstra_vendor/networkx/classes/tests/test_coreviews.py +0 -362
  247. package/runtime/python/okstra_vendor/networkx/classes/tests/test_digraph.py +0 -331
  248. package/runtime/python/okstra_vendor/networkx/classes/tests/test_digraph_historical.py +0 -110
  249. package/runtime/python/okstra_vendor/networkx/classes/tests/test_filters.py +0 -177
  250. package/runtime/python/okstra_vendor/networkx/classes/tests/test_function.py +0 -1045
  251. package/runtime/python/okstra_vendor/networkx/classes/tests/test_graph.py +0 -950
  252. package/runtime/python/okstra_vendor/networkx/classes/tests/test_graph_historical.py +0 -12
  253. package/runtime/python/okstra_vendor/networkx/classes/tests/test_graphviews.py +0 -349
  254. package/runtime/python/okstra_vendor/networkx/classes/tests/test_multidigraph.py +0 -459
  255. package/runtime/python/okstra_vendor/networkx/classes/tests/test_multigraph.py +0 -528
  256. package/runtime/python/okstra_vendor/networkx/classes/tests/test_reportviews.py +0 -1421
  257. package/runtime/python/okstra_vendor/networkx/classes/tests/test_special.py +0 -131
  258. package/runtime/python/okstra_vendor/networkx/classes/tests/test_subgraphviews.py +0 -371
  259. package/runtime/python/okstra_vendor/networkx/conftest.py +0 -261
  260. package/runtime/python/okstra_vendor/networkx/drawing/tests/__init__.py +0 -0
  261. package/runtime/python/okstra_vendor/networkx/drawing/tests/baseline/test_display_complex.png +0 -0
  262. package/runtime/python/okstra_vendor/networkx/drawing/tests/baseline/test_display_empty_graph.png +0 -0
  263. package/runtime/python/okstra_vendor/networkx/drawing/tests/baseline/test_display_house_with_colors.png +0 -0
  264. package/runtime/python/okstra_vendor/networkx/drawing/tests/baseline/test_display_labels_and_colors.png +0 -0
  265. package/runtime/python/okstra_vendor/networkx/drawing/tests/baseline/test_display_shortest_path.png +0 -0
  266. package/runtime/python/okstra_vendor/networkx/drawing/tests/baseline/test_house_with_colors.png +0 -0
  267. package/runtime/python/okstra_vendor/networkx/drawing/tests/test_agraph.py +0 -237
  268. package/runtime/python/okstra_vendor/networkx/drawing/tests/test_image_comparison_pylab_mpl.py +0 -229
  269. package/runtime/python/okstra_vendor/networkx/drawing/tests/test_latex.py +0 -285
  270. package/runtime/python/okstra_vendor/networkx/drawing/tests/test_layout.py +0 -631
  271. package/runtime/python/okstra_vendor/networkx/drawing/tests/test_pydot.py +0 -146
  272. package/runtime/python/okstra_vendor/networkx/drawing/tests/test_pylab.py +0 -1582
  273. package/runtime/python/okstra_vendor/networkx/generators/tests/__init__.py +0 -0
  274. package/runtime/python/okstra_vendor/networkx/generators/tests/test_atlas.py +0 -75
  275. package/runtime/python/okstra_vendor/networkx/generators/tests/test_classic.py +0 -642
  276. package/runtime/python/okstra_vendor/networkx/generators/tests/test_cographs.py +0 -20
  277. package/runtime/python/okstra_vendor/networkx/generators/tests/test_community.py +0 -362
  278. package/runtime/python/okstra_vendor/networkx/generators/tests/test_degree_seq.py +0 -224
  279. package/runtime/python/okstra_vendor/networkx/generators/tests/test_directed.py +0 -189
  280. package/runtime/python/okstra_vendor/networkx/generators/tests/test_duplication.py +0 -103
  281. package/runtime/python/okstra_vendor/networkx/generators/tests/test_ego.py +0 -39
  282. package/runtime/python/okstra_vendor/networkx/generators/tests/test_expanders.py +0 -182
  283. package/runtime/python/okstra_vendor/networkx/generators/tests/test_geometric.py +0 -488
  284. package/runtime/python/okstra_vendor/networkx/generators/tests/test_harary_graph.py +0 -133
  285. package/runtime/python/okstra_vendor/networkx/generators/tests/test_internet_as_graphs.py +0 -221
  286. package/runtime/python/okstra_vendor/networkx/generators/tests/test_intersection.py +0 -28
  287. package/runtime/python/okstra_vendor/networkx/generators/tests/test_interval_graph.py +0 -144
  288. package/runtime/python/okstra_vendor/networkx/generators/tests/test_joint_degree_seq.py +0 -125
  289. package/runtime/python/okstra_vendor/networkx/generators/tests/test_lattice.py +0 -264
  290. package/runtime/python/okstra_vendor/networkx/generators/tests/test_line.py +0 -316
  291. package/runtime/python/okstra_vendor/networkx/generators/tests/test_mycielski.py +0 -30
  292. package/runtime/python/okstra_vendor/networkx/generators/tests/test_nonisomorphic_trees.py +0 -82
  293. package/runtime/python/okstra_vendor/networkx/generators/tests/test_random_clustered.py +0 -33
  294. package/runtime/python/okstra_vendor/networkx/generators/tests/test_random_graphs.py +0 -495
  295. package/runtime/python/okstra_vendor/networkx/generators/tests/test_small.py +0 -220
  296. package/runtime/python/okstra_vendor/networkx/generators/tests/test_spectral_graph_forge.py +0 -49
  297. package/runtime/python/okstra_vendor/networkx/generators/tests/test_stochastic.py +0 -72
  298. package/runtime/python/okstra_vendor/networkx/generators/tests/test_sudoku.py +0 -92
  299. package/runtime/python/okstra_vendor/networkx/generators/tests/test_time_series.py +0 -64
  300. package/runtime/python/okstra_vendor/networkx/generators/tests/test_trees.py +0 -195
  301. package/runtime/python/okstra_vendor/networkx/generators/tests/test_triads.py +0 -15
  302. package/runtime/python/okstra_vendor/networkx/linalg/tests/__init__.py +0 -0
  303. package/runtime/python/okstra_vendor/networkx/linalg/tests/test_algebraic_connectivity.py +0 -400
  304. package/runtime/python/okstra_vendor/networkx/linalg/tests/test_attrmatrix.py +0 -108
  305. package/runtime/python/okstra_vendor/networkx/linalg/tests/test_bethehessian.py +0 -40
  306. package/runtime/python/okstra_vendor/networkx/linalg/tests/test_graphmatrix.py +0 -275
  307. package/runtime/python/okstra_vendor/networkx/linalg/tests/test_laplacian.py +0 -334
  308. package/runtime/python/okstra_vendor/networkx/linalg/tests/test_modularity.py +0 -86
  309. package/runtime/python/okstra_vendor/networkx/linalg/tests/test_spectrum.py +0 -70
  310. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/tests/__init__.py +0 -0
  311. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/tests/test_adjacency.py +0 -78
  312. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/tests/test_cytoscape.py +0 -78
  313. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/tests/test_node_link.py +0 -109
  314. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/tests/test_tree.py +0 -48
  315. package/runtime/python/okstra_vendor/networkx/readwrite/tests/__init__.py +0 -0
  316. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_adjlist.py +0 -354
  317. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_edgelist.py +0 -318
  318. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_gexf.py +0 -612
  319. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_gml.py +0 -744
  320. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_graph6.py +0 -181
  321. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_graphml.py +0 -1531
  322. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_leda.py +0 -30
  323. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_p2g.py +0 -63
  324. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_pajek.py +0 -128
  325. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_sparse6.py +0 -166
  326. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_text.py +0 -1742
  327. package/runtime/python/okstra_vendor/networkx/tests/__init__.py +0 -0
  328. package/runtime/python/okstra_vendor/networkx/tests/test_all_random_functions.py +0 -248
  329. package/runtime/python/okstra_vendor/networkx/tests/test_convert.py +0 -321
  330. package/runtime/python/okstra_vendor/networkx/tests/test_convert_numpy.py +0 -531
  331. package/runtime/python/okstra_vendor/networkx/tests/test_convert_pandas.py +0 -349
  332. package/runtime/python/okstra_vendor/networkx/tests/test_convert_scipy.py +0 -281
  333. package/runtime/python/okstra_vendor/networkx/tests/test_exceptions.py +0 -40
  334. package/runtime/python/okstra_vendor/networkx/tests/test_import.py +0 -11
  335. package/runtime/python/okstra_vendor/networkx/tests/test_lazy_imports.py +0 -96
  336. package/runtime/python/okstra_vendor/networkx/tests/test_relabel.py +0 -349
  337. package/runtime/python/okstra_vendor/networkx/tests/test_removed_functions_exception_messages.py +0 -8
  338. package/runtime/python/okstra_vendor/networkx/utils/tests/__init__.py +0 -0
  339. package/runtime/python/okstra_vendor/networkx/utils/tests/test__init.py +0 -11
  340. package/runtime/python/okstra_vendor/networkx/utils/tests/test_backends.py +0 -225
  341. package/runtime/python/okstra_vendor/networkx/utils/tests/test_config.py +0 -263
  342. package/runtime/python/okstra_vendor/networkx/utils/tests/test_decorators.py +0 -510
  343. package/runtime/python/okstra_vendor/networkx/utils/tests/test_heaps.py +0 -131
  344. package/runtime/python/okstra_vendor/networkx/utils/tests/test_mapped_queue.py +0 -268
  345. package/runtime/python/okstra_vendor/networkx/utils/tests/test_misc.py +0 -393
  346. package/runtime/python/okstra_vendor/networkx/utils/tests/test_random_sequence.py +0 -53
  347. package/runtime/python/okstra_vendor/networkx/utils/tests/test_rcm.py +0 -63
  348. 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)