okstra 0.130.3 → 0.131.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 (367) hide show
  1. package/README.md +0 -1
  2. package/docs/architecture.md +2 -2
  3. package/docs/cli.md +1 -1
  4. package/docs/for-ai/README.md +0 -2
  5. package/docs/for-ai/skills/okstra-run.md +13 -2
  6. package/docs/for-ai/skills/okstra-setup.md +4 -1
  7. package/docs/project-structure-overview.md +5 -4
  8. package/docs/task-process/implementation-planning.md +13 -0
  9. package/docs/task-process/implementation.md +17 -2
  10. package/package.json +1 -1
  11. package/runtime/BUILD.json +2 -2
  12. package/runtime/agents/workers/report-writer-worker.md +7 -0
  13. package/runtime/bin/lib/okstra/usage.sh +4 -4
  14. package/runtime/prompts/lead/okstra-lead-contract.md +2 -2
  15. package/runtime/prompts/lead/plan-body-verification.md +26 -5
  16. package/runtime/prompts/lead/report-writer.md +6 -2
  17. package/runtime/prompts/profiles/_common-contract.md +2 -1
  18. package/runtime/prompts/profiles/_implementation-deliverable.md +6 -1
  19. package/runtime/prompts/profiles/_implementation-executor.md +2 -2
  20. package/runtime/prompts/profiles/_implementation-verifier.md +33 -10
  21. package/runtime/prompts/profiles/final-verification.md +21 -6
  22. package/runtime/prompts/profiles/implementation-planning.md +21 -4
  23. package/runtime/python/okstra_ctl/codex_dispatch.py +31 -0
  24. package/runtime/python/okstra_ctl/conformance.py +49 -11
  25. package/runtime/python/okstra_ctl/report_finalize.py +52 -1
  26. package/runtime/python/okstra_ctl/report_views.py +32 -5
  27. package/runtime/python/okstra_ctl/run.py +15 -3
  28. package/runtime/python/okstra_ctl/worker_prompt_contract.py +14 -6
  29. package/runtime/python/okstra_ctl/worker_prompt_policy.py +19 -1
  30. package/runtime/python/okstra_vendor/__init__.py +0 -44
  31. package/runtime/schemas/final-report-v1.0.schema.json +101 -6
  32. package/runtime/skills/okstra-run/SKILL.md +11 -4
  33. package/runtime/skills/okstra-setup/SKILL.md +3 -2
  34. package/runtime/skills/okstra-setup/references/project-config.md +16 -7
  35. package/runtime/templates/reports/final-report.template.md +18 -12
  36. package/runtime/templates/reports/i18n/en.json +1 -0
  37. package/runtime/templates/reports/i18n/ko.json +1 -0
  38. package/runtime/templates/reports/report.css +18 -0
  39. package/runtime/validators/lib/fixtures.sh +6 -0
  40. package/runtime/validators/validate-run.py +1722 -98
  41. package/src/cli-registry.mjs +0 -7
  42. package/src/commands/lifecycle/doctor.mjs +0 -9
  43. package/src/lib/skill-catalog.mjs +0 -1
  44. package/docs/for-ai/skills/okstra-graphify.md +0 -64
  45. package/runtime/python/okstra_ctl/graphify_cmd.py +0 -225
  46. package/runtime/python/okstra_vendor/graphify/.vendored-version +0 -1
  47. package/runtime/python/okstra_vendor/graphify/__init__.py +0 -28
  48. package/runtime/python/okstra_vendor/graphify/__main__.py +0 -1371
  49. package/runtime/python/okstra_vendor/graphify/analyze.py +0 -540
  50. package/runtime/python/okstra_vendor/graphify/benchmark.py +0 -129
  51. package/runtime/python/okstra_vendor/graphify/build.py +0 -107
  52. package/runtime/python/okstra_vendor/graphify/cache.py +0 -169
  53. package/runtime/python/okstra_vendor/graphify/cluster.py +0 -137
  54. package/runtime/python/okstra_vendor/graphify/detect.py +0 -510
  55. package/runtime/python/okstra_vendor/graphify/export.py +0 -1014
  56. package/runtime/python/okstra_vendor/graphify/extract.py +0 -3277
  57. package/runtime/python/okstra_vendor/graphify/hooks.py +0 -220
  58. package/runtime/python/okstra_vendor/graphify/ingest.py +0 -297
  59. package/runtime/python/okstra_vendor/graphify/manifest.py +0 -4
  60. package/runtime/python/okstra_vendor/graphify/report.py +0 -175
  61. package/runtime/python/okstra_vendor/graphify/security.py +0 -203
  62. package/runtime/python/okstra_vendor/graphify/serve.py +0 -373
  63. package/runtime/python/okstra_vendor/graphify/skill-aider.md +0 -1184
  64. package/runtime/python/okstra_vendor/graphify/skill-claw.md +0 -1184
  65. package/runtime/python/okstra_vendor/graphify/skill-codex.md +0 -1242
  66. package/runtime/python/okstra_vendor/graphify/skill-copilot.md +0 -1268
  67. package/runtime/python/okstra_vendor/graphify/skill-droid.md +0 -1239
  68. package/runtime/python/okstra_vendor/graphify/skill-kiro.md +0 -1183
  69. package/runtime/python/okstra_vendor/graphify/skill-opencode.md +0 -1238
  70. package/runtime/python/okstra_vendor/graphify/skill-trae.md +0 -1208
  71. package/runtime/python/okstra_vendor/graphify/skill-vscode.md +0 -253
  72. package/runtime/python/okstra_vendor/graphify/skill-windows.md +0 -1245
  73. package/runtime/python/okstra_vendor/graphify/skill.md +0 -1319
  74. package/runtime/python/okstra_vendor/graphify/transcribe.py +0 -182
  75. package/runtime/python/okstra_vendor/graphify/validate.py +0 -72
  76. package/runtime/python/okstra_vendor/graphify/watch.py +0 -188
  77. package/runtime/python/okstra_vendor/graphify/wiki.py +0 -214
  78. package/runtime/python/okstra_vendor/networkx/__init__.py +0 -62
  79. package/runtime/python/okstra_vendor/networkx/algorithms/__init__.py +0 -134
  80. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/__init__.py +0 -26
  81. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/clique.py +0 -259
  82. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/clustering_coefficient.py +0 -71
  83. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/connectivity.py +0 -412
  84. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/density.py +0 -396
  85. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/distance_measures.py +0 -150
  86. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/dominating_set.py +0 -149
  87. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/kcomponents.py +0 -369
  88. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/matching.py +0 -44
  89. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/maxcut.py +0 -143
  90. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/ramsey.py +0 -53
  91. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/steinertree.py +0 -265
  92. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/traveling_salesman.py +0 -1508
  93. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/treewidth.py +0 -255
  94. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/vertex_cover.py +0 -83
  95. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/__init__.py +0 -5
  96. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/connectivity.py +0 -122
  97. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/correlation.py +0 -302
  98. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/mixing.py +0 -255
  99. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/neighbor_degree.py +0 -160
  100. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/pairs.py +0 -127
  101. package/runtime/python/okstra_vendor/networkx/algorithms/asteroidal.py +0 -164
  102. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/__init__.py +0 -88
  103. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/basic.py +0 -322
  104. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/centrality.py +0 -290
  105. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/cluster.py +0 -289
  106. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/covering.py +0 -57
  107. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/edgelist.py +0 -360
  108. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/extendability.py +0 -105
  109. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/generators.py +0 -603
  110. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/link_analysis.py +0 -316
  111. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/matching.py +0 -590
  112. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/matrix.py +0 -232
  113. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/projection.py +0 -526
  114. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/redundancy.py +0 -112
  115. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/spectral.py +0 -69
  116. package/runtime/python/okstra_vendor/networkx/algorithms/boundary.py +0 -168
  117. package/runtime/python/okstra_vendor/networkx/algorithms/bridges.py +0 -205
  118. package/runtime/python/okstra_vendor/networkx/algorithms/broadcasting.py +0 -164
  119. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/__init__.py +0 -20
  120. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/betweenness.py +0 -591
  121. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/betweenness_subset.py +0 -236
  122. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/closeness.py +0 -282
  123. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/current_flow_betweenness.py +0 -364
  124. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/current_flow_betweenness_subset.py +0 -227
  125. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/current_flow_closeness.py +0 -96
  126. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/degree_alg.py +0 -150
  127. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/dispersion.py +0 -107
  128. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/eigenvector.py +0 -357
  129. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/flow_matrix.py +0 -130
  130. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/group.py +0 -787
  131. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/harmonic.py +0 -88
  132. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/katz.py +0 -331
  133. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/laplacian.py +0 -150
  134. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/load.py +0 -200
  135. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/percolation.py +0 -128
  136. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/reaching.py +0 -209
  137. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/second_order.py +0 -141
  138. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/subgraph_alg.py +0 -361
  139. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/trophic.py +0 -181
  140. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/voterank_alg.py +0 -95
  141. package/runtime/python/okstra_vendor/networkx/algorithms/chains.py +0 -172
  142. package/runtime/python/okstra_vendor/networkx/algorithms/chordal.py +0 -443
  143. package/runtime/python/okstra_vendor/networkx/algorithms/clique.py +0 -818
  144. package/runtime/python/okstra_vendor/networkx/algorithms/cluster.py +0 -732
  145. package/runtime/python/okstra_vendor/networkx/algorithms/coloring/__init__.py +0 -4
  146. package/runtime/python/okstra_vendor/networkx/algorithms/coloring/equitable_coloring.py +0 -505
  147. package/runtime/python/okstra_vendor/networkx/algorithms/coloring/greedy_coloring.py +0 -565
  148. package/runtime/python/okstra_vendor/networkx/algorithms/communicability_alg.py +0 -163
  149. package/runtime/python/okstra_vendor/networkx/algorithms/community/__init__.py +0 -28
  150. package/runtime/python/okstra_vendor/networkx/algorithms/community/asyn_fluid.py +0 -153
  151. package/runtime/python/okstra_vendor/networkx/algorithms/community/bipartitions.py +0 -354
  152. package/runtime/python/okstra_vendor/networkx/algorithms/community/centrality.py +0 -171
  153. package/runtime/python/okstra_vendor/networkx/algorithms/community/community_utils.py +0 -30
  154. package/runtime/python/okstra_vendor/networkx/algorithms/community/divisive.py +0 -216
  155. package/runtime/python/okstra_vendor/networkx/algorithms/community/kclique.py +0 -79
  156. package/runtime/python/okstra_vendor/networkx/algorithms/community/label_propagation.py +0 -338
  157. package/runtime/python/okstra_vendor/networkx/algorithms/community/leiden.py +0 -162
  158. package/runtime/python/okstra_vendor/networkx/algorithms/community/local.py +0 -220
  159. package/runtime/python/okstra_vendor/networkx/algorithms/community/louvain.py +0 -384
  160. package/runtime/python/okstra_vendor/networkx/algorithms/community/lukes.py +0 -227
  161. package/runtime/python/okstra_vendor/networkx/algorithms/community/modularity_max.py +0 -452
  162. package/runtime/python/okstra_vendor/networkx/algorithms/community/quality.py +0 -347
  163. package/runtime/python/okstra_vendor/networkx/algorithms/components/__init__.py +0 -6
  164. package/runtime/python/okstra_vendor/networkx/algorithms/components/attracting.py +0 -115
  165. package/runtime/python/okstra_vendor/networkx/algorithms/components/biconnected.py +0 -394
  166. package/runtime/python/okstra_vendor/networkx/algorithms/components/connected.py +0 -282
  167. package/runtime/python/okstra_vendor/networkx/algorithms/components/semiconnected.py +0 -71
  168. package/runtime/python/okstra_vendor/networkx/algorithms/components/strongly_connected.py +0 -359
  169. package/runtime/python/okstra_vendor/networkx/algorithms/components/weakly_connected.py +0 -196
  170. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/__init__.py +0 -11
  171. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/connectivity.py +0 -811
  172. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/cuts.py +0 -616
  173. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/disjoint_paths.py +0 -408
  174. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/edge_augmentation.py +0 -1270
  175. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/edge_kcomponents.py +0 -592
  176. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/kcomponents.py +0 -220
  177. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/kcutsets.py +0 -235
  178. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/stoerwagner.py +0 -152
  179. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/utils.py +0 -88
  180. package/runtime/python/okstra_vendor/networkx/algorithms/core.py +0 -588
  181. package/runtime/python/okstra_vendor/networkx/algorithms/covering.py +0 -142
  182. package/runtime/python/okstra_vendor/networkx/algorithms/cuts.py +0 -416
  183. package/runtime/python/okstra_vendor/networkx/algorithms/cycles.py +0 -1234
  184. package/runtime/python/okstra_vendor/networkx/algorithms/d_separation.py +0 -677
  185. package/runtime/python/okstra_vendor/networkx/algorithms/dag.py +0 -1392
  186. package/runtime/python/okstra_vendor/networkx/algorithms/distance_measures.py +0 -1095
  187. package/runtime/python/okstra_vendor/networkx/algorithms/distance_regular.py +0 -272
  188. package/runtime/python/okstra_vendor/networkx/algorithms/dominance.py +0 -142
  189. package/runtime/python/okstra_vendor/networkx/algorithms/dominating.py +0 -268
  190. package/runtime/python/okstra_vendor/networkx/algorithms/efficiency_measures.py +0 -167
  191. package/runtime/python/okstra_vendor/networkx/algorithms/euler.py +0 -470
  192. package/runtime/python/okstra_vendor/networkx/algorithms/flow/__init__.py +0 -11
  193. package/runtime/python/okstra_vendor/networkx/algorithms/flow/boykovkolmogorov.py +0 -370
  194. package/runtime/python/okstra_vendor/networkx/algorithms/flow/capacityscaling.py +0 -407
  195. package/runtime/python/okstra_vendor/networkx/algorithms/flow/dinitz_alg.py +0 -238
  196. package/runtime/python/okstra_vendor/networkx/algorithms/flow/edmondskarp.py +0 -241
  197. package/runtime/python/okstra_vendor/networkx/algorithms/flow/gomory_hu.py +0 -178
  198. package/runtime/python/okstra_vendor/networkx/algorithms/flow/maxflow.py +0 -611
  199. package/runtime/python/okstra_vendor/networkx/algorithms/flow/mincost.py +0 -356
  200. package/runtime/python/okstra_vendor/networkx/algorithms/flow/networksimplex.py +0 -662
  201. package/runtime/python/okstra_vendor/networkx/algorithms/flow/preflowpush.py +0 -425
  202. package/runtime/python/okstra_vendor/networkx/algorithms/flow/shortestaugmentingpath.py +0 -300
  203. package/runtime/python/okstra_vendor/networkx/algorithms/flow/utils.py +0 -194
  204. package/runtime/python/okstra_vendor/networkx/algorithms/graph_hashing.py +0 -435
  205. package/runtime/python/okstra_vendor/networkx/algorithms/graphical.py +0 -483
  206. package/runtime/python/okstra_vendor/networkx/algorithms/hierarchy.py +0 -57
  207. package/runtime/python/okstra_vendor/networkx/algorithms/hybrid.py +0 -196
  208. package/runtime/python/okstra_vendor/networkx/algorithms/isolate.py +0 -107
  209. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/__init__.py +0 -7
  210. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/ismags.py +0 -1306
  211. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/isomorph.py +0 -336
  212. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/isomorphvf2.py +0 -1262
  213. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/matchhelpers.py +0 -352
  214. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/temporalisomorphvf2.py +0 -308
  215. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tree_isomorphism.py +0 -264
  216. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/vf2pp.py +0 -1102
  217. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/vf2userfunc.py +0 -192
  218. package/runtime/python/okstra_vendor/networkx/algorithms/link_analysis/__init__.py +0 -2
  219. package/runtime/python/okstra_vendor/networkx/algorithms/link_analysis/hits_alg.py +0 -337
  220. package/runtime/python/okstra_vendor/networkx/algorithms/link_analysis/pagerank_alg.py +0 -498
  221. package/runtime/python/okstra_vendor/networkx/algorithms/link_prediction.py +0 -687
  222. package/runtime/python/okstra_vendor/networkx/algorithms/lowest_common_ancestors.py +0 -280
  223. package/runtime/python/okstra_vendor/networkx/algorithms/matching.py +0 -1148
  224. package/runtime/python/okstra_vendor/networkx/algorithms/minors/__init__.py +0 -27
  225. package/runtime/python/okstra_vendor/networkx/algorithms/minors/contraction.py +0 -738
  226. package/runtime/python/okstra_vendor/networkx/algorithms/mis.py +0 -78
  227. package/runtime/python/okstra_vendor/networkx/algorithms/moral.py +0 -59
  228. package/runtime/python/okstra_vendor/networkx/algorithms/node_classification.py +0 -219
  229. package/runtime/python/okstra_vendor/networkx/algorithms/non_randomness.py +0 -155
  230. package/runtime/python/okstra_vendor/networkx/algorithms/operators/__init__.py +0 -4
  231. package/runtime/python/okstra_vendor/networkx/algorithms/operators/all.py +0 -324
  232. package/runtime/python/okstra_vendor/networkx/algorithms/operators/binary.py +0 -468
  233. package/runtime/python/okstra_vendor/networkx/algorithms/operators/product.py +0 -633
  234. package/runtime/python/okstra_vendor/networkx/algorithms/operators/unary.py +0 -77
  235. package/runtime/python/okstra_vendor/networkx/algorithms/perfect_graph.py +0 -73
  236. package/runtime/python/okstra_vendor/networkx/algorithms/planar_drawing.py +0 -464
  237. package/runtime/python/okstra_vendor/networkx/algorithms/planarity.py +0 -1463
  238. package/runtime/python/okstra_vendor/networkx/algorithms/polynomials.py +0 -306
  239. package/runtime/python/okstra_vendor/networkx/algorithms/reciprocity.py +0 -98
  240. package/runtime/python/okstra_vendor/networkx/algorithms/regular.py +0 -167
  241. package/runtime/python/okstra_vendor/networkx/algorithms/richclub.py +0 -138
  242. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/__init__.py +0 -5
  243. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/astar.py +0 -239
  244. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/dense.py +0 -264
  245. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/generic.py +0 -716
  246. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/unweighted.py +0 -625
  247. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/weighted.py +0 -2542
  248. package/runtime/python/okstra_vendor/networkx/algorithms/similarity.py +0 -2107
  249. package/runtime/python/okstra_vendor/networkx/algorithms/simple_paths.py +0 -966
  250. package/runtime/python/okstra_vendor/networkx/algorithms/smallworld.py +0 -404
  251. package/runtime/python/okstra_vendor/networkx/algorithms/smetric.py +0 -30
  252. package/runtime/python/okstra_vendor/networkx/algorithms/sparsifiers.py +0 -296
  253. package/runtime/python/okstra_vendor/networkx/algorithms/structuralholes.py +0 -374
  254. package/runtime/python/okstra_vendor/networkx/algorithms/summarization.py +0 -564
  255. package/runtime/python/okstra_vendor/networkx/algorithms/swap.py +0 -406
  256. package/runtime/python/okstra_vendor/networkx/algorithms/threshold.py +0 -981
  257. package/runtime/python/okstra_vendor/networkx/algorithms/time_dependent.py +0 -142
  258. package/runtime/python/okstra_vendor/networkx/algorithms/tournament.py +0 -406
  259. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/__init__.py +0 -5
  260. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/beamsearch.py +0 -90
  261. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/breadth_first_search.py +0 -576
  262. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/depth_first_search.py +0 -529
  263. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/edgebfs.py +0 -185
  264. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/edgedfs.py +0 -182
  265. package/runtime/python/okstra_vendor/networkx/algorithms/tree/__init__.py +0 -7
  266. package/runtime/python/okstra_vendor/networkx/algorithms/tree/branchings.py +0 -1042
  267. package/runtime/python/okstra_vendor/networkx/algorithms/tree/coding.py +0 -413
  268. package/runtime/python/okstra_vendor/networkx/algorithms/tree/decomposition.py +0 -88
  269. package/runtime/python/okstra_vendor/networkx/algorithms/tree/distance_measures.py +0 -219
  270. package/runtime/python/okstra_vendor/networkx/algorithms/tree/mst.py +0 -1281
  271. package/runtime/python/okstra_vendor/networkx/algorithms/tree/operations.py +0 -106
  272. package/runtime/python/okstra_vendor/networkx/algorithms/tree/recognition.py +0 -273
  273. package/runtime/python/okstra_vendor/networkx/algorithms/triads.py +0 -500
  274. package/runtime/python/okstra_vendor/networkx/algorithms/vitality.py +0 -76
  275. package/runtime/python/okstra_vendor/networkx/algorithms/voronoi.py +0 -86
  276. package/runtime/python/okstra_vendor/networkx/algorithms/walks.py +0 -77
  277. package/runtime/python/okstra_vendor/networkx/algorithms/wiener.py +0 -278
  278. package/runtime/python/okstra_vendor/networkx/classes/__init__.py +0 -13
  279. package/runtime/python/okstra_vendor/networkx/classes/coreviews.py +0 -435
  280. package/runtime/python/okstra_vendor/networkx/classes/digraph.py +0 -1363
  281. package/runtime/python/okstra_vendor/networkx/classes/filters.py +0 -95
  282. package/runtime/python/okstra_vendor/networkx/classes/function.py +0 -1549
  283. package/runtime/python/okstra_vendor/networkx/classes/graph.py +0 -2082
  284. package/runtime/python/okstra_vendor/networkx/classes/graphviews.py +0 -269
  285. package/runtime/python/okstra_vendor/networkx/classes/multidigraph.py +0 -977
  286. package/runtime/python/okstra_vendor/networkx/classes/multigraph.py +0 -1294
  287. package/runtime/python/okstra_vendor/networkx/classes/reportviews.py +0 -1447
  288. package/runtime/python/okstra_vendor/networkx/convert.py +0 -502
  289. package/runtime/python/okstra_vendor/networkx/convert_matrix.py +0 -1314
  290. package/runtime/python/okstra_vendor/networkx/drawing/__init__.py +0 -7
  291. package/runtime/python/okstra_vendor/networkx/drawing/layout.py +0 -2036
  292. package/runtime/python/okstra_vendor/networkx/drawing/nx_agraph.py +0 -470
  293. package/runtime/python/okstra_vendor/networkx/drawing/nx_latex.py +0 -570
  294. package/runtime/python/okstra_vendor/networkx/drawing/nx_pydot.py +0 -361
  295. package/runtime/python/okstra_vendor/networkx/drawing/nx_pylab.py +0 -2978
  296. package/runtime/python/okstra_vendor/networkx/exception.py +0 -131
  297. package/runtime/python/okstra_vendor/networkx/generators/__init__.py +0 -34
  298. package/runtime/python/okstra_vendor/networkx/generators/atlas.dat.gz +0 -0
  299. package/runtime/python/okstra_vendor/networkx/generators/atlas.py +0 -227
  300. package/runtime/python/okstra_vendor/networkx/generators/classic.py +0 -1091
  301. package/runtime/python/okstra_vendor/networkx/generators/cographs.py +0 -68
  302. package/runtime/python/okstra_vendor/networkx/generators/community.py +0 -1070
  303. package/runtime/python/okstra_vendor/networkx/generators/degree_seq.py +0 -886
  304. package/runtime/python/okstra_vendor/networkx/generators/directed.py +0 -572
  305. package/runtime/python/okstra_vendor/networkx/generators/duplication.py +0 -174
  306. package/runtime/python/okstra_vendor/networkx/generators/ego.py +0 -66
  307. package/runtime/python/okstra_vendor/networkx/generators/expanders.py +0 -499
  308. package/runtime/python/okstra_vendor/networkx/generators/geometric.py +0 -1037
  309. package/runtime/python/okstra_vendor/networkx/generators/harary_graph.py +0 -163
  310. package/runtime/python/okstra_vendor/networkx/generators/internet_as_graphs.py +0 -443
  311. package/runtime/python/okstra_vendor/networkx/generators/intersection.py +0 -125
  312. package/runtime/python/okstra_vendor/networkx/generators/interval_graph.py +0 -70
  313. package/runtime/python/okstra_vendor/networkx/generators/joint_degree_seq.py +0 -664
  314. package/runtime/python/okstra_vendor/networkx/generators/lattice.py +0 -405
  315. package/runtime/python/okstra_vendor/networkx/generators/line.py +0 -501
  316. package/runtime/python/okstra_vendor/networkx/generators/mycielski.py +0 -110
  317. package/runtime/python/okstra_vendor/networkx/generators/nonisomorphic_trees.py +0 -259
  318. package/runtime/python/okstra_vendor/networkx/generators/random_clustered.py +0 -117
  319. package/runtime/python/okstra_vendor/networkx/generators/random_graphs.py +0 -1416
  320. package/runtime/python/okstra_vendor/networkx/generators/small.py +0 -1070
  321. package/runtime/python/okstra_vendor/networkx/generators/social.py +0 -554
  322. package/runtime/python/okstra_vendor/networkx/generators/spectral_graph_forge.py +0 -120
  323. package/runtime/python/okstra_vendor/networkx/generators/stochastic.py +0 -54
  324. package/runtime/python/okstra_vendor/networkx/generators/sudoku.py +0 -131
  325. package/runtime/python/okstra_vendor/networkx/generators/time_series.py +0 -74
  326. package/runtime/python/okstra_vendor/networkx/generators/trees.py +0 -1070
  327. package/runtime/python/okstra_vendor/networkx/generators/triads.py +0 -94
  328. package/runtime/python/okstra_vendor/networkx/lazy_imports.py +0 -188
  329. package/runtime/python/okstra_vendor/networkx/linalg/__init__.py +0 -13
  330. package/runtime/python/okstra_vendor/networkx/linalg/algebraicconnectivity.py +0 -650
  331. package/runtime/python/okstra_vendor/networkx/linalg/attrmatrix.py +0 -466
  332. package/runtime/python/okstra_vendor/networkx/linalg/bethehessianmatrix.py +0 -77
  333. package/runtime/python/okstra_vendor/networkx/linalg/graphmatrix.py +0 -168
  334. package/runtime/python/okstra_vendor/networkx/linalg/laplacianmatrix.py +0 -512
  335. package/runtime/python/okstra_vendor/networkx/linalg/modularitymatrix.py +0 -166
  336. package/runtime/python/okstra_vendor/networkx/linalg/spectrum.py +0 -186
  337. package/runtime/python/okstra_vendor/networkx/readwrite/__init__.py +0 -17
  338. package/runtime/python/okstra_vendor/networkx/readwrite/adjlist.py +0 -330
  339. package/runtime/python/okstra_vendor/networkx/readwrite/edgelist.py +0 -489
  340. package/runtime/python/okstra_vendor/networkx/readwrite/gexf.py +0 -1084
  341. package/runtime/python/okstra_vendor/networkx/readwrite/gml.py +0 -879
  342. package/runtime/python/okstra_vendor/networkx/readwrite/graph6.py +0 -427
  343. package/runtime/python/okstra_vendor/networkx/readwrite/graphml.py +0 -1053
  344. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/__init__.py +0 -19
  345. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/adjacency.py +0 -156
  346. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/cytoscape.py +0 -190
  347. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/node_link.py +0 -261
  348. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/tree.py +0 -137
  349. package/runtime/python/okstra_vendor/networkx/readwrite/leda.py +0 -108
  350. package/runtime/python/okstra_vendor/networkx/readwrite/multiline_adjlist.py +0 -393
  351. package/runtime/python/okstra_vendor/networkx/readwrite/p2g.py +0 -113
  352. package/runtime/python/okstra_vendor/networkx/readwrite/pajek.py +0 -286
  353. package/runtime/python/okstra_vendor/networkx/readwrite/sparse6.py +0 -379
  354. package/runtime/python/okstra_vendor/networkx/readwrite/text.py +0 -851
  355. package/runtime/python/okstra_vendor/networkx/relabel.py +0 -285
  356. package/runtime/python/okstra_vendor/networkx/utils/__init__.py +0 -8
  357. package/runtime/python/okstra_vendor/networkx/utils/backends.py +0 -2171
  358. package/runtime/python/okstra_vendor/networkx/utils/configs.py +0 -396
  359. package/runtime/python/okstra_vendor/networkx/utils/decorators.py +0 -1233
  360. package/runtime/python/okstra_vendor/networkx/utils/heaps.py +0 -338
  361. package/runtime/python/okstra_vendor/networkx/utils/mapped_queue.py +0 -297
  362. package/runtime/python/okstra_vendor/networkx/utils/misc.py +0 -703
  363. package/runtime/python/okstra_vendor/networkx/utils/random_sequence.py +0 -198
  364. package/runtime/python/okstra_vendor/networkx/utils/rcm.py +0 -159
  365. package/runtime/python/okstra_vendor/networkx/utils/union_find.py +0 -106
  366. package/runtime/skills/okstra-graphify/SKILL.md +0 -169
  367. package/src/commands/graphify.mjs +0 -32
@@ -1,470 +0,0 @@
1
- """
2
- ***************
3
- Graphviz AGraph
4
- ***************
5
-
6
- Interface to pygraphviz AGraph class.
7
-
8
- Examples
9
- --------
10
- >>> G = nx.complete_graph(5)
11
- >>> A = nx.nx_agraph.to_agraph(G)
12
- >>> H = nx.nx_agraph.from_agraph(A)
13
-
14
- See Also
15
- --------
16
- - Pygraphviz: http://pygraphviz.github.io/
17
- - Graphviz: https://www.graphviz.org
18
- - DOT Language: http://www.graphviz.org/doc/info/lang.html
19
- """
20
-
21
- import tempfile
22
-
23
- import networkx as nx
24
-
25
- __all__ = [
26
- "from_agraph",
27
- "to_agraph",
28
- "write_dot",
29
- "read_dot",
30
- "graphviz_layout",
31
- "pygraphviz_layout",
32
- "view_pygraphviz",
33
- ]
34
-
35
-
36
- @nx._dispatchable(graphs=None, returns_graph=True)
37
- def from_agraph(A, create_using=None):
38
- """Returns a NetworkX Graph or DiGraph from a PyGraphviz graph.
39
-
40
- Parameters
41
- ----------
42
- A : PyGraphviz AGraph
43
- A graph created with PyGraphviz
44
-
45
- create_using : NetworkX graph constructor, optional (default=None)
46
- Graph type to create. If graph instance, then cleared before populated.
47
- If `None`, then the appropriate Graph type is inferred from `A`.
48
-
49
- Examples
50
- --------
51
- >>> K5 = nx.complete_graph(5)
52
- >>> A = nx.nx_agraph.to_agraph(K5)
53
- >>> G = nx.nx_agraph.from_agraph(A)
54
-
55
- Notes
56
- -----
57
- The Graph G will have a dictionary G.graph_attr containing
58
- the default graphviz attributes for graphs, nodes and edges.
59
-
60
- Default node attributes will be in the dictionary G.node_attr
61
- which is keyed by node.
62
-
63
- Edge attributes will be returned as edge data in G. With
64
- edge_attr=False the edge data will be the Graphviz edge weight
65
- attribute or the value 1 if no edge weight attribute is found.
66
-
67
- """
68
- if create_using is None:
69
- if A.is_directed():
70
- if A.is_strict():
71
- create_using = nx.DiGraph
72
- else:
73
- create_using = nx.MultiDiGraph
74
- else:
75
- if A.is_strict():
76
- create_using = nx.Graph
77
- else:
78
- create_using = nx.MultiGraph
79
-
80
- # assign defaults
81
- N = nx.empty_graph(0, create_using)
82
- if A.name is not None:
83
- N.name = A.name
84
-
85
- # add graph attributes
86
- N.graph.update(A.graph_attr)
87
-
88
- # add nodes, attributes to N.node_attr
89
- for n in A.nodes():
90
- str_attr = {str(k): v for k, v in n.attr.items()}
91
- N.add_node(str(n), **str_attr)
92
-
93
- # add edges, assign edge data as dictionary of attributes
94
- for e in A.edges():
95
- u, v = str(e[0]), str(e[1])
96
- attr = dict(e.attr)
97
- str_attr = {str(k): v for k, v in attr.items()}
98
- if not N.is_multigraph():
99
- if e.name is not None:
100
- str_attr["key"] = e.name
101
- N.add_edge(u, v, **str_attr)
102
- else:
103
- N.add_edge(u, v, key=e.name, **str_attr)
104
-
105
- # add default attributes for graph, nodes, and edges
106
- # hang them on N.graph_attr
107
- graph_default_dict = dict(A.graph_attr)
108
- if graph_default_dict:
109
- N.graph["graph"] = graph_default_dict
110
- node_default_dict = dict(A.node_attr)
111
- if node_default_dict and node_default_dict != {"label": "\\N"}:
112
- N.graph["node"] = node_default_dict
113
- edge_default_dict = dict(A.edge_attr)
114
- if edge_default_dict:
115
- N.graph["edge"] = edge_default_dict
116
- return N
117
-
118
-
119
- def to_agraph(N):
120
- """Returns a pygraphviz graph from a NetworkX graph N.
121
-
122
- Parameters
123
- ----------
124
- N : NetworkX graph
125
- A graph created with NetworkX
126
-
127
- Examples
128
- --------
129
- >>> K5 = nx.complete_graph(5)
130
- >>> A = nx.nx_agraph.to_agraph(K5)
131
-
132
- Notes
133
- -----
134
- If N has an dict N.graph_attr an attempt will be made first
135
- to copy properties attached to the graph (see from_agraph)
136
- and then updated with the calling arguments if any.
137
-
138
- """
139
- try:
140
- import pygraphviz
141
- except ImportError as err:
142
- raise ImportError("requires pygraphviz http://pygraphviz.github.io/") from err
143
- directed = N.is_directed()
144
- strict = nx.number_of_selfloops(N) == 0 and not N.is_multigraph()
145
-
146
- A = pygraphviz.AGraph(name=N.name, strict=strict, directed=directed)
147
-
148
- # default graph attributes
149
- A.graph_attr.update(N.graph.get("graph", {}))
150
- A.node_attr.update(N.graph.get("node", {}))
151
- A.edge_attr.update(N.graph.get("edge", {}))
152
-
153
- A.graph_attr.update(
154
- (k, v) for k, v in N.graph.items() if k not in ("graph", "node", "edge")
155
- )
156
-
157
- # add nodes
158
- for n, nodedata in N.nodes(data=True):
159
- A.add_node(n)
160
- # Add node data
161
- a = A.get_node(n)
162
- for key, val in nodedata.items():
163
- if key == "pos":
164
- a.attr["pos"] = f"{val[0]},{val[1]}!"
165
- else:
166
- a.attr[key] = str(val)
167
-
168
- # loop over edges
169
- if N.is_multigraph():
170
- for u, v, key, edgedata in N.edges(data=True, keys=True):
171
- str_edgedata = {k: str(v) for k, v in edgedata.items() if k != "key"}
172
- A.add_edge(u, v, key=str(key))
173
- # Add edge data
174
- a = A.get_edge(u, v)
175
- a.attr.update(str_edgedata)
176
-
177
- else:
178
- for u, v, edgedata in N.edges(data=True):
179
- str_edgedata = {k: str(v) for k, v in edgedata.items()}
180
- A.add_edge(u, v)
181
- # Add edge data
182
- a = A.get_edge(u, v)
183
- a.attr.update(str_edgedata)
184
-
185
- return A
186
-
187
-
188
- def write_dot(G, path):
189
- """Write NetworkX graph G to Graphviz dot format on path.
190
-
191
- Parameters
192
- ----------
193
- G : graph
194
- A networkx graph
195
- path : filename
196
- Filename or file handle to write
197
-
198
- Notes
199
- -----
200
- To use a specific graph layout, call ``A.layout`` prior to `write_dot`.
201
- Note that some graphviz layouts are not guaranteed to be deterministic,
202
- see https://gitlab.com/graphviz/graphviz/-/issues/1767 for more info.
203
- """
204
- A = to_agraph(G)
205
- A.write(path)
206
- A.clear()
207
- return
208
-
209
-
210
- @nx._dispatchable(name="agraph_read_dot", graphs=None, returns_graph=True)
211
- def read_dot(path):
212
- """Returns a NetworkX graph from a dot file on path.
213
-
214
- Parameters
215
- ----------
216
- path : file or string
217
- File name or file handle to read.
218
- """
219
- try:
220
- import pygraphviz
221
- except ImportError as err:
222
- raise ImportError(
223
- "read_dot() requires pygraphviz http://pygraphviz.github.io/"
224
- ) from err
225
- A = pygraphviz.AGraph(file=path)
226
- gr = from_agraph(A)
227
- A.clear()
228
- return gr
229
-
230
-
231
- def graphviz_layout(G, prog="neato", root=None, args=""):
232
- """Create node positions for G using Graphviz.
233
-
234
- Parameters
235
- ----------
236
- G : NetworkX graph
237
- A graph created with NetworkX
238
- prog : string
239
- Name of Graphviz layout program
240
- root : string, optional
241
- Root node for twopi layout
242
- args : string, optional
243
- Extra arguments to Graphviz layout program
244
-
245
- Returns
246
- -------
247
- Dictionary of x, y, positions keyed by node.
248
-
249
- Examples
250
- --------
251
- >>> G = nx.petersen_graph()
252
- >>> pos = nx.nx_agraph.graphviz_layout(G)
253
- >>> pos = nx.nx_agraph.graphviz_layout(G, prog="dot")
254
-
255
- Notes
256
- -----
257
- This is a wrapper for pygraphviz_layout.
258
-
259
- Note that some graphviz layouts are not guaranteed to be deterministic,
260
- see https://gitlab.com/graphviz/graphviz/-/issues/1767 for more info.
261
- """
262
- return pygraphviz_layout(G, prog=prog, root=root, args=args)
263
-
264
-
265
- def pygraphviz_layout(G, prog="neato", root=None, args=""):
266
- """Create node positions for G using Graphviz.
267
-
268
- Parameters
269
- ----------
270
- G : NetworkX graph
271
- A graph created with NetworkX
272
- prog : string
273
- Name of Graphviz layout program
274
- root : string, optional
275
- Root node for twopi layout
276
- args : string, optional
277
- Extra arguments to Graphviz layout program
278
-
279
- Returns
280
- -------
281
- node_pos : dict
282
- Dictionary of x, y, positions keyed by node.
283
-
284
- Examples
285
- --------
286
- >>> G = nx.petersen_graph()
287
- >>> pos = nx.nx_agraph.graphviz_layout(G)
288
- >>> pos = nx.nx_agraph.graphviz_layout(G, prog="dot")
289
-
290
- Notes
291
- -----
292
- If you use complex node objects, they may have the same string
293
- representation and GraphViz could treat them as the same node.
294
- The layout may assign both nodes a single location. See Issue #1568
295
- If this occurs in your case, consider relabeling the nodes just
296
- for the layout computation using something similar to::
297
-
298
- >>> H = nx.convert_node_labels_to_integers(G, label_attribute="node_label")
299
- >>> H_layout = nx.nx_agraph.pygraphviz_layout(H, prog="dot")
300
- >>> G_layout = {H.nodes[n]["node_label"]: p for n, p in H_layout.items()}
301
-
302
- Note that some graphviz layouts are not guaranteed to be deterministic,
303
- see https://gitlab.com/graphviz/graphviz/-/issues/1767 for more info.
304
- """
305
- try:
306
- import pygraphviz
307
- except ImportError as err:
308
- raise ImportError("requires pygraphviz http://pygraphviz.github.io/") from err
309
- if root is not None:
310
- args += f"-Groot={root}"
311
- A = to_agraph(G)
312
- A.layout(prog=prog, args=args)
313
- node_pos = {}
314
- for n in G:
315
- node = pygraphviz.Node(A, n)
316
- try:
317
- xs = node.attr["pos"].split(",")
318
- node_pos[n] = tuple(float(x) for x in xs)
319
- except:
320
- print("no position for node", n)
321
- node_pos[n] = (0.0, 0.0)
322
- return node_pos
323
-
324
-
325
- @nx.utils.open_file(5, "w+b")
326
- def view_pygraphviz(
327
- G, edgelabel=None, prog="dot", args="", suffix="", path=None, show=True
328
- ):
329
- """Views the graph G using the specified layout algorithm.
330
-
331
- Parameters
332
- ----------
333
- G : NetworkX graph
334
- The machine to draw.
335
- edgelabel : str, callable, None
336
- If a string, then it specifies the edge attribute to be displayed
337
- on the edge labels. If a callable, then it is called for each
338
- edge and it should return the string to be displayed on the edges.
339
- The function signature of `edgelabel` should be edgelabel(data),
340
- where `data` is the edge attribute dictionary.
341
- prog : string
342
- Name of Graphviz layout program.
343
- args : str
344
- Additional arguments to pass to the Graphviz layout program.
345
- suffix : str
346
- If `filename` is None, we save to a temporary file. The value of
347
- `suffix` will appear at the tail end of the temporary filename.
348
- path : str, None
349
- The filename used to save the image. If None, save to a temporary
350
- file. File formats are the same as those from pygraphviz.agraph.draw.
351
- Filenames ending in .gz or .bz2 will be compressed.
352
- show : bool, default = True
353
- Whether to display the graph with :mod:`PIL.Image.show`,
354
- default is `True`. If `False`, the rendered graph is still available
355
- at `path`.
356
-
357
- Returns
358
- -------
359
- path : str
360
- The filename of the generated image.
361
- A : PyGraphviz graph
362
- The PyGraphviz graph instance used to generate the image.
363
-
364
- Notes
365
- -----
366
- If this function is called in succession too quickly, sometimes the
367
- image is not displayed. So you might consider time.sleep(.5) between
368
- calls if you experience problems.
369
-
370
- Note that some graphviz layouts are not guaranteed to be deterministic,
371
- see https://gitlab.com/graphviz/graphviz/-/issues/1767 for more info.
372
-
373
- """
374
- if not len(G):
375
- raise nx.NetworkXException("An empty graph cannot be drawn.")
376
-
377
- # If we are providing default values for graphviz, these must be set
378
- # before any nodes or edges are added to the PyGraphviz graph object.
379
- # The reason for this is that default values only affect incoming objects.
380
- # If you change the default values after the objects have been added,
381
- # then they inherit no value and are set only if explicitly set.
382
-
383
- # to_agraph() uses these values.
384
- attrs = ["edge", "node", "graph"]
385
- for attr in attrs:
386
- if attr not in G.graph:
387
- G.graph[attr] = {}
388
-
389
- # These are the default values.
390
- edge_attrs = {"fontsize": "10"}
391
- node_attrs = {
392
- "style": "filled",
393
- "fillcolor": "#0000FF40",
394
- "height": "0.75",
395
- "width": "0.75",
396
- "shape": "circle",
397
- }
398
- graph_attrs = {}
399
-
400
- def update_attrs(which, attrs):
401
- # Update graph attributes. Return list of those which were added.
402
- added = []
403
- for k, v in attrs.items():
404
- if k not in G.graph[which]:
405
- G.graph[which][k] = v
406
- added.append(k)
407
-
408
- def clean_attrs(which, added):
409
- # Remove added attributes
410
- for attr in added:
411
- del G.graph[which][attr]
412
- if not G.graph[which]:
413
- del G.graph[which]
414
-
415
- # Update all default values
416
- update_attrs("edge", edge_attrs)
417
- update_attrs("node", node_attrs)
418
- update_attrs("graph", graph_attrs)
419
-
420
- # Convert to agraph, so we inherit default values
421
- A = to_agraph(G)
422
-
423
- # Remove the default values we added to the original graph.
424
- clean_attrs("edge", edge_attrs)
425
- clean_attrs("node", node_attrs)
426
- clean_attrs("graph", graph_attrs)
427
-
428
- # If the user passed in an edgelabel, we update the labels for all edges.
429
- if edgelabel is not None:
430
- if not callable(edgelabel):
431
-
432
- def func(data):
433
- return "".join([" ", str(data[edgelabel]), " "])
434
-
435
- else:
436
- func = edgelabel
437
-
438
- # update all the edge labels
439
- if G.is_multigraph():
440
- for u, v, key, data in G.edges(keys=True, data=True):
441
- # PyGraphviz doesn't convert the key to a string. See #339
442
- edge = A.get_edge(u, v, str(key))
443
- edge.attr["label"] = str(func(data))
444
- else:
445
- for u, v, data in G.edges(data=True):
446
- edge = A.get_edge(u, v)
447
- edge.attr["label"] = str(func(data))
448
-
449
- if path is None:
450
- ext = "png"
451
- if suffix:
452
- suffix = f"_{suffix}.{ext}"
453
- else:
454
- suffix = f".{ext}"
455
- path = tempfile.NamedTemporaryFile(suffix=suffix, delete=False)
456
- else:
457
- # Assume the decorator worked and it is a file-object.
458
- pass
459
-
460
- # Write graph to file
461
- A.draw(path=path, format=None, prog=prog, args=args)
462
- path.close()
463
-
464
- # Show graph in a new window (depends on platform configuration)
465
- if show:
466
- from PIL import Image
467
-
468
- Image.open(path.name).show()
469
-
470
- return path.name, A