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