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,459 +0,0 @@
1
- from collections import UserDict
2
-
3
- import pytest
4
-
5
- import networkx as nx
6
- from networkx.utils import edges_equal
7
-
8
- from .test_multigraph import BaseMultiGraphTester
9
- from .test_multigraph import TestEdgeSubgraph as _TestMultiGraphEdgeSubgraph
10
- from .test_multigraph import TestMultiGraph as _TestMultiGraph
11
-
12
-
13
- class BaseMultiDiGraphTester(BaseMultiGraphTester):
14
- def test_edges(self):
15
- G = self.K3
16
- edges = [(0, 1), (0, 2), (1, 0), (1, 2), (2, 0), (2, 1)]
17
- assert sorted(G.edges()) == edges
18
- assert sorted(G.edges(0)) == [(0, 1), (0, 2)]
19
- pytest.raises((KeyError, nx.NetworkXError), G.edges, -1)
20
-
21
- def test_edges_data(self):
22
- G = self.K3
23
- edges = [(0, 1, {}), (0, 2, {}), (1, 0, {}), (1, 2, {}), (2, 0, {}), (2, 1, {})]
24
- assert sorted(G.edges(data=True)) == edges
25
- assert sorted(G.edges(0, data=True)) == [(0, 1, {}), (0, 2, {})]
26
- pytest.raises((KeyError, nx.NetworkXError), G.neighbors, -1)
27
-
28
- def test_edges_multi(self):
29
- G = self.K3
30
- assert sorted(G.edges()) == [(0, 1), (0, 2), (1, 0), (1, 2), (2, 0), (2, 1)]
31
- assert sorted(G.edges(0)) == [(0, 1), (0, 2)]
32
- G.add_edge(0, 1)
33
- assert sorted(G.edges()) == [
34
- (0, 1),
35
- (0, 1),
36
- (0, 2),
37
- (1, 0),
38
- (1, 2),
39
- (2, 0),
40
- (2, 1),
41
- ]
42
-
43
- def test_out_edges(self):
44
- G = self.K3
45
- assert sorted(G.out_edges()) == [(0, 1), (0, 2), (1, 0), (1, 2), (2, 0), (2, 1)]
46
- assert sorted(G.out_edges(0)) == [(0, 1), (0, 2)]
47
- pytest.raises((KeyError, nx.NetworkXError), G.out_edges, -1)
48
- assert sorted(G.out_edges(0, keys=True)) == [(0, 1, 0), (0, 2, 0)]
49
-
50
- def test_out_edges_multi(self):
51
- G = self.K3
52
- assert sorted(G.out_edges()) == [(0, 1), (0, 2), (1, 0), (1, 2), (2, 0), (2, 1)]
53
- assert sorted(G.out_edges(0)) == [(0, 1), (0, 2)]
54
- G.add_edge(0, 1, 2)
55
- assert sorted(G.out_edges()) == [
56
- (0, 1),
57
- (0, 1),
58
- (0, 2),
59
- (1, 0),
60
- (1, 2),
61
- (2, 0),
62
- (2, 1),
63
- ]
64
-
65
- def test_out_edges_data(self):
66
- G = self.K3
67
- assert sorted(G.edges(0, data=True)) == [(0, 1, {}), (0, 2, {})]
68
- G.remove_edge(0, 1)
69
- G.add_edge(0, 1, data=1)
70
- assert sorted(G.edges(0, data=True)) == [(0, 1, {"data": 1}), (0, 2, {})]
71
- assert sorted(G.edges(0, data="data")) == [(0, 1, 1), (0, 2, None)]
72
- assert sorted(G.edges(0, data="data", default=-1)) == [(0, 1, 1), (0, 2, -1)]
73
-
74
- def test_in_edges(self):
75
- G = self.K3
76
- assert sorted(G.in_edges()) == [(0, 1), (0, 2), (1, 0), (1, 2), (2, 0), (2, 1)]
77
- assert sorted(G.in_edges(0)) == [(1, 0), (2, 0)]
78
- pytest.raises((KeyError, nx.NetworkXError), G.in_edges, -1)
79
- G.add_edge(0, 1, 2)
80
- assert sorted(G.in_edges()) == [
81
- (0, 1),
82
- (0, 1),
83
- (0, 2),
84
- (1, 0),
85
- (1, 2),
86
- (2, 0),
87
- (2, 1),
88
- ]
89
- assert sorted(G.in_edges(0, keys=True)) == [(1, 0, 0), (2, 0, 0)]
90
-
91
- def test_in_edges_no_keys(self):
92
- G = self.K3
93
- assert sorted(G.in_edges()) == [(0, 1), (0, 2), (1, 0), (1, 2), (2, 0), (2, 1)]
94
- assert sorted(G.in_edges(0)) == [(1, 0), (2, 0)]
95
- G.add_edge(0, 1, 2)
96
- assert sorted(G.in_edges()) == [
97
- (0, 1),
98
- (0, 1),
99
- (0, 2),
100
- (1, 0),
101
- (1, 2),
102
- (2, 0),
103
- (2, 1),
104
- ]
105
-
106
- assert sorted(G.in_edges(data=True, keys=False)) == [
107
- (0, 1, {}),
108
- (0, 1, {}),
109
- (0, 2, {}),
110
- (1, 0, {}),
111
- (1, 2, {}),
112
- (2, 0, {}),
113
- (2, 1, {}),
114
- ]
115
-
116
- def test_in_edges_data(self):
117
- G = self.K3
118
- assert sorted(G.in_edges(0, data=True)) == [(1, 0, {}), (2, 0, {})]
119
- G.remove_edge(1, 0)
120
- G.add_edge(1, 0, data=1)
121
- assert sorted(G.in_edges(0, data=True)) == [(1, 0, {"data": 1}), (2, 0, {})]
122
- assert sorted(G.in_edges(0, data="data")) == [(1, 0, 1), (2, 0, None)]
123
- assert sorted(G.in_edges(0, data="data", default=-1)) == [(1, 0, 1), (2, 0, -1)]
124
-
125
- def is_shallow(self, H, G):
126
- # graph
127
- assert G.graph["foo"] == H.graph["foo"]
128
- G.graph["foo"].append(1)
129
- assert G.graph["foo"] == H.graph["foo"]
130
- # node
131
- assert G.nodes[0]["foo"] == H.nodes[0]["foo"]
132
- G.nodes[0]["foo"].append(1)
133
- assert G.nodes[0]["foo"] == H.nodes[0]["foo"]
134
- # edge
135
- assert G[1][2][0]["foo"] == H[1][2][0]["foo"]
136
- G[1][2][0]["foo"].append(1)
137
- assert G[1][2][0]["foo"] == H[1][2][0]["foo"]
138
-
139
- def is_deep(self, H, G):
140
- # graph
141
- assert G.graph["foo"] == H.graph["foo"]
142
- G.graph["foo"].append(1)
143
- assert G.graph["foo"] != H.graph["foo"]
144
- # node
145
- assert G.nodes[0]["foo"] == H.nodes[0]["foo"]
146
- G.nodes[0]["foo"].append(1)
147
- assert G.nodes[0]["foo"] != H.nodes[0]["foo"]
148
- # edge
149
- assert G[1][2][0]["foo"] == H[1][2][0]["foo"]
150
- G[1][2][0]["foo"].append(1)
151
- assert G[1][2][0]["foo"] != H[1][2][0]["foo"]
152
-
153
- def test_to_undirected(self):
154
- # MultiDiGraph -> MultiGraph changes number of edges so it is
155
- # not a copy operation... use is_shallow, not is_shallow_copy
156
- G = self.K3
157
- self.add_attributes(G)
158
- H = nx.MultiGraph(G)
159
- # self.is_shallow(H,G)
160
- # the result is traversal order dependent so we
161
- # can't use the is_shallow() test here.
162
- try:
163
- assert edges_equal(H.edges(), [(0, 1), (1, 2), (2, 0)])
164
- except AssertionError:
165
- assert edges_equal(H.edges(), [(0, 1), (1, 2), (1, 2), (2, 0)])
166
- H = G.to_undirected()
167
- self.is_deep(H, G)
168
-
169
- def test_has_successor(self):
170
- G = self.K3
171
- assert G.has_successor(0, 1)
172
- assert not G.has_successor(0, -1)
173
-
174
- def test_successors(self):
175
- G = self.K3
176
- assert sorted(G.successors(0)) == [1, 2]
177
- pytest.raises((KeyError, nx.NetworkXError), G.successors, -1)
178
-
179
- def test_has_predecessor(self):
180
- G = self.K3
181
- assert G.has_predecessor(0, 1)
182
- assert not G.has_predecessor(0, -1)
183
-
184
- def test_predecessors(self):
185
- G = self.K3
186
- assert sorted(G.predecessors(0)) == [1, 2]
187
- pytest.raises((KeyError, nx.NetworkXError), G.predecessors, -1)
188
-
189
- def test_degree(self):
190
- G = self.K3
191
- assert sorted(G.degree()) == [(0, 4), (1, 4), (2, 4)]
192
- assert dict(G.degree()) == {0: 4, 1: 4, 2: 4}
193
- assert G.degree(0) == 4
194
- assert list(G.degree(iter([0]))) == [(0, 4)]
195
- G.add_edge(0, 1, weight=0.3, other=1.2)
196
- assert sorted(G.degree(weight="weight")) == [(0, 4.3), (1, 4.3), (2, 4)]
197
- assert sorted(G.degree(weight="other")) == [(0, 5.2), (1, 5.2), (2, 4)]
198
-
199
- def test_in_degree(self):
200
- G = self.K3
201
- assert sorted(G.in_degree()) == [(0, 2), (1, 2), (2, 2)]
202
- assert dict(G.in_degree()) == {0: 2, 1: 2, 2: 2}
203
- assert G.in_degree(0) == 2
204
- assert list(G.in_degree(iter([0]))) == [(0, 2)]
205
- assert G.in_degree(0, weight="weight") == 2
206
-
207
- def test_out_degree(self):
208
- G = self.K3
209
- assert sorted(G.out_degree()) == [(0, 2), (1, 2), (2, 2)]
210
- assert dict(G.out_degree()) == {0: 2, 1: 2, 2: 2}
211
- assert G.out_degree(0) == 2
212
- assert list(G.out_degree(iter([0]))) == [(0, 2)]
213
- assert G.out_degree(0, weight="weight") == 2
214
-
215
- def test_size(self):
216
- G = self.K3
217
- assert G.size() == 6
218
- assert G.number_of_edges() == 6
219
- G.add_edge(0, 1, weight=0.3, other=1.2)
220
- assert round(G.size(weight="weight"), 2) == 6.3
221
- assert round(G.size(weight="other"), 2) == 7.2
222
-
223
- def test_to_undirected_reciprocal(self):
224
- G = self.Graph()
225
- G.add_edge(1, 2)
226
- assert G.to_undirected().has_edge(1, 2)
227
- assert not G.to_undirected(reciprocal=True).has_edge(1, 2)
228
- G.add_edge(2, 1)
229
- assert G.to_undirected(reciprocal=True).has_edge(1, 2)
230
-
231
- def test_reverse_copy(self):
232
- G = nx.MultiDiGraph([(0, 1), (0, 1)])
233
- R = G.reverse()
234
- assert sorted(R.edges()) == [(1, 0), (1, 0)]
235
- R.remove_edge(1, 0)
236
- assert sorted(R.edges()) == [(1, 0)]
237
- assert sorted(G.edges()) == [(0, 1), (0, 1)]
238
-
239
- def test_reverse_nocopy(self):
240
- G = nx.MultiDiGraph([(0, 1), (0, 1)])
241
- R = G.reverse(copy=False)
242
- assert sorted(R.edges()) == [(1, 0), (1, 0)]
243
- pytest.raises(nx.NetworkXError, R.remove_edge, 1, 0)
244
-
245
- def test_di_attributes_cached(self):
246
- G = self.K3.copy()
247
- assert id(G.in_edges) == id(G.in_edges)
248
- assert id(G.out_edges) == id(G.out_edges)
249
- assert id(G.in_degree) == id(G.in_degree)
250
- assert id(G.out_degree) == id(G.out_degree)
251
- assert id(G.succ) == id(G.succ)
252
- assert id(G.pred) == id(G.pred)
253
-
254
-
255
- class TestMultiDiGraph(BaseMultiDiGraphTester, _TestMultiGraph):
256
- def setup_method(self):
257
- self.Graph = nx.MultiDiGraph
258
- # build K3
259
- self.k3edges = [(0, 1), (0, 2), (1, 2)]
260
- self.k3nodes = [0, 1, 2]
261
- self.K3 = self.Graph()
262
- self.K3._succ = {0: {}, 1: {}, 2: {}}
263
- # K3._adj is synced with K3._succ
264
- self.K3._pred = {0: {}, 1: {}, 2: {}}
265
- for u in self.k3nodes:
266
- for v in self.k3nodes:
267
- if u == v:
268
- continue
269
- d = {0: {}}
270
- self.K3._succ[u][v] = d
271
- self.K3._pred[v][u] = d
272
- self.K3._node = {}
273
- self.K3._node[0] = {}
274
- self.K3._node[1] = {}
275
- self.K3._node[2] = {}
276
-
277
- def test_add_edge(self):
278
- G = self.Graph()
279
- G.add_edge(0, 1)
280
- assert G._adj == {0: {1: {0: {}}}, 1: {}}
281
- assert G._succ == {0: {1: {0: {}}}, 1: {}}
282
- assert G._pred == {0: {}, 1: {0: {0: {}}}}
283
- G = self.Graph()
284
- G.add_edge(*(0, 1))
285
- assert G._adj == {0: {1: {0: {}}}, 1: {}}
286
- assert G._succ == {0: {1: {0: {}}}, 1: {}}
287
- assert G._pred == {0: {}, 1: {0: {0: {}}}}
288
- with pytest.raises(ValueError, match="None cannot be a node"):
289
- G.add_edge(None, 3)
290
-
291
- def test_add_edges_from(self):
292
- G = self.Graph()
293
- G.add_edges_from([(0, 1), (0, 1, {"weight": 3})])
294
- assert G._adj == {0: {1: {0: {}, 1: {"weight": 3}}}, 1: {}}
295
- assert G._succ == {0: {1: {0: {}, 1: {"weight": 3}}}, 1: {}}
296
- assert G._pred == {0: {}, 1: {0: {0: {}, 1: {"weight": 3}}}}
297
-
298
- G.add_edges_from([(0, 1), (0, 1, {"weight": 3})], weight=2)
299
- assert G._succ == {
300
- 0: {1: {0: {}, 1: {"weight": 3}, 2: {"weight": 2}, 3: {"weight": 3}}},
301
- 1: {},
302
- }
303
- assert G._pred == {
304
- 0: {},
305
- 1: {0: {0: {}, 1: {"weight": 3}, 2: {"weight": 2}, 3: {"weight": 3}}},
306
- }
307
-
308
- G = self.Graph()
309
- edges = [
310
- (0, 1, {"weight": 3}),
311
- (0, 1, (("weight", 2),)),
312
- (0, 1, 5),
313
- (0, 1, "s"),
314
- ]
315
- G.add_edges_from(edges)
316
- keydict = {0: {"weight": 3}, 1: {"weight": 2}, 5: {}, "s": {}}
317
- assert G._succ == {0: {1: keydict}, 1: {}}
318
- assert G._pred == {1: {0: keydict}, 0: {}}
319
-
320
- # too few in tuple
321
- pytest.raises(nx.NetworkXError, G.add_edges_from, [(0,)])
322
- # too many in tuple
323
- pytest.raises(nx.NetworkXError, G.add_edges_from, [(0, 1, 2, 3, 4)])
324
- # not a tuple
325
- pytest.raises(TypeError, G.add_edges_from, [0])
326
- with pytest.raises(ValueError, match="None cannot be a node"):
327
- G.add_edges_from([(None, 3), (3, 2)])
328
-
329
- def test_remove_edge(self):
330
- G = self.K3
331
- G.remove_edge(0, 1)
332
- assert G._succ == {
333
- 0: {2: {0: {}}},
334
- 1: {0: {0: {}}, 2: {0: {}}},
335
- 2: {0: {0: {}}, 1: {0: {}}},
336
- }
337
- assert G._pred == {
338
- 0: {1: {0: {}}, 2: {0: {}}},
339
- 1: {2: {0: {}}},
340
- 2: {0: {0: {}}, 1: {0: {}}},
341
- }
342
- pytest.raises((KeyError, nx.NetworkXError), G.remove_edge, -1, 0)
343
- pytest.raises((KeyError, nx.NetworkXError), G.remove_edge, 0, 2, key=1)
344
-
345
- def test_remove_multiedge(self):
346
- G = self.K3
347
- G.add_edge(0, 1, key="parallel edge")
348
- G.remove_edge(0, 1, key="parallel edge")
349
- assert G._adj == {
350
- 0: {1: {0: {}}, 2: {0: {}}},
351
- 1: {0: {0: {}}, 2: {0: {}}},
352
- 2: {0: {0: {}}, 1: {0: {}}},
353
- }
354
-
355
- assert G._succ == {
356
- 0: {1: {0: {}}, 2: {0: {}}},
357
- 1: {0: {0: {}}, 2: {0: {}}},
358
- 2: {0: {0: {}}, 1: {0: {}}},
359
- }
360
-
361
- assert G._pred == {
362
- 0: {1: {0: {}}, 2: {0: {}}},
363
- 1: {0: {0: {}}, 2: {0: {}}},
364
- 2: {0: {0: {}}, 1: {0: {}}},
365
- }
366
- G.remove_edge(0, 1)
367
- assert G._succ == {
368
- 0: {2: {0: {}}},
369
- 1: {0: {0: {}}, 2: {0: {}}},
370
- 2: {0: {0: {}}, 1: {0: {}}},
371
- }
372
- assert G._pred == {
373
- 0: {1: {0: {}}, 2: {0: {}}},
374
- 1: {2: {0: {}}},
375
- 2: {0: {0: {}}, 1: {0: {}}},
376
- }
377
- pytest.raises((KeyError, nx.NetworkXError), G.remove_edge, -1, 0)
378
-
379
- def test_remove_edges_from(self):
380
- G = self.K3
381
- G.remove_edges_from([(0, 1)])
382
- assert G._succ == {
383
- 0: {2: {0: {}}},
384
- 1: {0: {0: {}}, 2: {0: {}}},
385
- 2: {0: {0: {}}, 1: {0: {}}},
386
- }
387
- assert G._pred == {
388
- 0: {1: {0: {}}, 2: {0: {}}},
389
- 1: {2: {0: {}}},
390
- 2: {0: {0: {}}, 1: {0: {}}},
391
- }
392
- G.remove_edges_from([(0, 0)]) # silent fail
393
-
394
-
395
- class TestEdgeSubgraph(_TestMultiGraphEdgeSubgraph):
396
- """Unit tests for the :meth:`MultiDiGraph.edge_subgraph` method."""
397
-
398
- def setup_method(self):
399
- # Create a quadruply-linked path graph on five nodes.
400
- G = nx.MultiDiGraph()
401
- nx.add_path(G, range(5))
402
- nx.add_path(G, range(5))
403
- nx.add_path(G, reversed(range(5)))
404
- nx.add_path(G, reversed(range(5)))
405
- # Add some node, edge, and graph attributes.
406
- for i in range(5):
407
- G.nodes[i]["name"] = f"node{i}"
408
- G.adj[0][1][0]["name"] = "edge010"
409
- G.adj[0][1][1]["name"] = "edge011"
410
- G.adj[3][4][0]["name"] = "edge340"
411
- G.adj[3][4][1]["name"] = "edge341"
412
- G.graph["name"] = "graph"
413
- # Get the subgraph induced by one of the first edges and one of
414
- # the last edges.
415
- self.G = G
416
- self.H = G.edge_subgraph([(0, 1, 0), (3, 4, 1)])
417
-
418
-
419
- class CustomDictClass(UserDict):
420
- pass
421
-
422
-
423
- class MultiDiGraphSubClass(nx.MultiDiGraph):
424
- node_dict_factory = CustomDictClass # type: ignore[assignment]
425
- node_attr_dict_factory = CustomDictClass # type: ignore[assignment]
426
- adjlist_outer_dict_factory = CustomDictClass # type: ignore[assignment]
427
- adjlist_inner_dict_factory = CustomDictClass # type: ignore[assignment]
428
- edge_key_dict_factory = CustomDictClass # type: ignore[assignment]
429
- edge_attr_dict_factory = CustomDictClass # type: ignore[assignment]
430
- graph_attr_dict_factory = CustomDictClass # type: ignore[assignment]
431
-
432
-
433
- class TestMultiDiGraphSubclass(TestMultiDiGraph):
434
- def setup_method(self):
435
- self.Graph = MultiDiGraphSubClass
436
- # build K3
437
- self.k3edges = [(0, 1), (0, 2), (1, 2)]
438
- self.k3nodes = [0, 1, 2]
439
- self.K3 = self.Graph()
440
- self.K3._succ = self.K3.adjlist_outer_dict_factory(
441
- {
442
- 0: self.K3.adjlist_inner_dict_factory(),
443
- 1: self.K3.adjlist_inner_dict_factory(),
444
- 2: self.K3.adjlist_inner_dict_factory(),
445
- }
446
- )
447
- # K3._adj is synced with K3._succ
448
- self.K3._pred = {0: {}, 1: {}, 2: {}}
449
- for u in self.k3nodes:
450
- for v in self.k3nodes:
451
- if u == v:
452
- continue
453
- d = {0: {}}
454
- self.K3._succ[u][v] = d
455
- self.K3._pred[v][u] = d
456
- self.K3._node = self.K3.node_dict_factory()
457
- self.K3._node[0] = self.K3.node_attr_dict_factory()
458
- self.K3._node[1] = self.K3.node_attr_dict_factory()
459
- self.K3._node[2] = self.K3.node_attr_dict_factory()