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,1421 +0,0 @@
|
|
|
1
|
-
import pickle
|
|
2
|
-
from copy import deepcopy
|
|
3
|
-
|
|
4
|
-
import pytest
|
|
5
|
-
|
|
6
|
-
import networkx as nx
|
|
7
|
-
from networkx.classes import reportviews as rv
|
|
8
|
-
from networkx.classes.reportviews import NodeDataView
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
# Nodes
|
|
12
|
-
class TestNodeView:
|
|
13
|
-
@classmethod
|
|
14
|
-
def setup_class(cls):
|
|
15
|
-
cls.G = nx.path_graph(9)
|
|
16
|
-
cls.nv = cls.G.nodes # NodeView(G)
|
|
17
|
-
|
|
18
|
-
def test_pickle(self):
|
|
19
|
-
import pickle
|
|
20
|
-
|
|
21
|
-
nv = self.nv
|
|
22
|
-
pnv = pickle.loads(pickle.dumps(nv, -1))
|
|
23
|
-
assert nv == pnv
|
|
24
|
-
assert nv.__slots__ == pnv.__slots__
|
|
25
|
-
|
|
26
|
-
def test_str(self):
|
|
27
|
-
assert str(self.nv) == "[0, 1, 2, 3, 4, 5, 6, 7, 8]"
|
|
28
|
-
|
|
29
|
-
def test_repr(self):
|
|
30
|
-
assert repr(self.nv) == "NodeView((0, 1, 2, 3, 4, 5, 6, 7, 8))"
|
|
31
|
-
|
|
32
|
-
def test_contains(self):
|
|
33
|
-
G = self.G.copy()
|
|
34
|
-
nv = G.nodes
|
|
35
|
-
assert 7 in nv
|
|
36
|
-
assert 9 not in nv
|
|
37
|
-
G.remove_node(7)
|
|
38
|
-
G.add_node(9)
|
|
39
|
-
assert 7 not in nv
|
|
40
|
-
assert 9 in nv
|
|
41
|
-
|
|
42
|
-
def test_getitem(self):
|
|
43
|
-
G = self.G.copy()
|
|
44
|
-
nv = G.nodes
|
|
45
|
-
G.nodes[3]["foo"] = "bar"
|
|
46
|
-
assert nv[7] == {}
|
|
47
|
-
assert nv[3] == {"foo": "bar"}
|
|
48
|
-
# slicing
|
|
49
|
-
with pytest.raises(nx.NetworkXError):
|
|
50
|
-
G.nodes[0:5]
|
|
51
|
-
|
|
52
|
-
def test_iter(self):
|
|
53
|
-
nv = self.nv
|
|
54
|
-
for i, n in enumerate(nv):
|
|
55
|
-
assert i == n
|
|
56
|
-
inv = iter(nv)
|
|
57
|
-
assert next(inv) == 0
|
|
58
|
-
assert iter(nv) != nv
|
|
59
|
-
assert iter(inv) == inv
|
|
60
|
-
inv2 = iter(nv)
|
|
61
|
-
next(inv2)
|
|
62
|
-
assert list(inv) == list(inv2)
|
|
63
|
-
# odd case where NodeView calls NodeDataView with data=False
|
|
64
|
-
nnv = nv(data=False)
|
|
65
|
-
for i, n in enumerate(nnv):
|
|
66
|
-
assert i == n
|
|
67
|
-
|
|
68
|
-
def test_call(self):
|
|
69
|
-
nodes = self.nv
|
|
70
|
-
assert nodes is nodes()
|
|
71
|
-
assert nodes is not nodes(data=True)
|
|
72
|
-
assert nodes is not nodes(data="weight")
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
class TestNodeDataView:
|
|
76
|
-
@classmethod
|
|
77
|
-
def setup_class(cls):
|
|
78
|
-
cls.G = nx.path_graph(9)
|
|
79
|
-
cls.nv = NodeDataView(cls.G)
|
|
80
|
-
cls.ndv = cls.G.nodes.data(True)
|
|
81
|
-
cls.nwv = cls.G.nodes.data("foo")
|
|
82
|
-
|
|
83
|
-
def test_viewtype(self):
|
|
84
|
-
nv = self.G.nodes
|
|
85
|
-
ndvfalse = nv.data(False)
|
|
86
|
-
assert nv is ndvfalse
|
|
87
|
-
assert nv is not self.ndv
|
|
88
|
-
|
|
89
|
-
def test_pickle(self):
|
|
90
|
-
import pickle
|
|
91
|
-
|
|
92
|
-
nv = self.nv
|
|
93
|
-
pnv = pickle.loads(pickle.dumps(nv, -1))
|
|
94
|
-
assert nv == pnv
|
|
95
|
-
assert nv.__slots__ == pnv.__slots__
|
|
96
|
-
|
|
97
|
-
def test_str(self):
|
|
98
|
-
msg = str([(n, {}) for n in range(9)])
|
|
99
|
-
assert str(self.ndv) == msg
|
|
100
|
-
|
|
101
|
-
def test_repr(self):
|
|
102
|
-
expected = "NodeDataView((0, 1, 2, 3, 4, 5, 6, 7, 8))"
|
|
103
|
-
assert repr(self.nv) == expected
|
|
104
|
-
expected = (
|
|
105
|
-
"NodeDataView({0: {}, 1: {}, 2: {}, 3: {}, "
|
|
106
|
-
+ "4: {}, 5: {}, 6: {}, 7: {}, 8: {}})"
|
|
107
|
-
)
|
|
108
|
-
assert repr(self.ndv) == expected
|
|
109
|
-
expected = (
|
|
110
|
-
"NodeDataView({0: None, 1: None, 2: None, 3: None, 4: None, "
|
|
111
|
-
+ "5: None, 6: None, 7: None, 8: None}, data='foo')"
|
|
112
|
-
)
|
|
113
|
-
assert repr(self.nwv) == expected
|
|
114
|
-
|
|
115
|
-
def test_contains(self):
|
|
116
|
-
G = self.G.copy()
|
|
117
|
-
nv = G.nodes.data()
|
|
118
|
-
nwv = G.nodes.data("foo")
|
|
119
|
-
G.nodes[3]["foo"] = "bar"
|
|
120
|
-
assert (7, {}) in nv
|
|
121
|
-
assert (3, {"foo": "bar"}) in nv
|
|
122
|
-
assert (3, "bar") in nwv
|
|
123
|
-
assert (7, None) in nwv
|
|
124
|
-
# default
|
|
125
|
-
nwv_def = G.nodes(data="foo", default="biz")
|
|
126
|
-
assert (7, "biz") in nwv_def
|
|
127
|
-
assert (3, "bar") in nwv_def
|
|
128
|
-
|
|
129
|
-
def test_getitem(self):
|
|
130
|
-
G = self.G.copy()
|
|
131
|
-
nv = G.nodes
|
|
132
|
-
G.nodes[3]["foo"] = "bar"
|
|
133
|
-
assert nv[3] == {"foo": "bar"}
|
|
134
|
-
# default
|
|
135
|
-
nwv_def = G.nodes(data="foo", default="biz")
|
|
136
|
-
assert nwv_def[7], "biz"
|
|
137
|
-
assert nwv_def[3] == "bar"
|
|
138
|
-
# slicing
|
|
139
|
-
with pytest.raises(nx.NetworkXError):
|
|
140
|
-
G.nodes.data()[0:5]
|
|
141
|
-
|
|
142
|
-
def test_iter(self):
|
|
143
|
-
G = self.G.copy()
|
|
144
|
-
nv = G.nodes.data()
|
|
145
|
-
ndv = G.nodes.data(True)
|
|
146
|
-
nwv = G.nodes.data("foo")
|
|
147
|
-
for i, (n, d) in enumerate(nv):
|
|
148
|
-
assert i == n
|
|
149
|
-
assert d == {}
|
|
150
|
-
inv = iter(nv)
|
|
151
|
-
assert next(inv) == (0, {})
|
|
152
|
-
G.nodes[3]["foo"] = "bar"
|
|
153
|
-
# default
|
|
154
|
-
for n, d in nv:
|
|
155
|
-
if n == 3:
|
|
156
|
-
assert d == {"foo": "bar"}
|
|
157
|
-
else:
|
|
158
|
-
assert d == {}
|
|
159
|
-
# data=True
|
|
160
|
-
for n, d in ndv:
|
|
161
|
-
if n == 3:
|
|
162
|
-
assert d == {"foo": "bar"}
|
|
163
|
-
else:
|
|
164
|
-
assert d == {}
|
|
165
|
-
# data='foo'
|
|
166
|
-
for n, d in nwv:
|
|
167
|
-
if n == 3:
|
|
168
|
-
assert d == "bar"
|
|
169
|
-
else:
|
|
170
|
-
assert d is None
|
|
171
|
-
# data='foo', default=1
|
|
172
|
-
for n, d in G.nodes.data("foo", default=1):
|
|
173
|
-
if n == 3:
|
|
174
|
-
assert d == "bar"
|
|
175
|
-
else:
|
|
176
|
-
assert d == 1
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
def test_nodedataview_unhashable():
|
|
180
|
-
G = nx.path_graph(9)
|
|
181
|
-
G.nodes[3]["foo"] = "bar"
|
|
182
|
-
nvs = [G.nodes.data()]
|
|
183
|
-
nvs.append(G.nodes.data(True))
|
|
184
|
-
H = G.copy()
|
|
185
|
-
H.nodes[4]["foo"] = {1, 2, 3}
|
|
186
|
-
nvs.append(H.nodes.data(True))
|
|
187
|
-
# raise unhashable
|
|
188
|
-
for nv in nvs:
|
|
189
|
-
pytest.raises(TypeError, set, nv)
|
|
190
|
-
pytest.raises(TypeError, eval, "nv | nv", locals())
|
|
191
|
-
# no raise... hashable
|
|
192
|
-
Gn = G.nodes.data(False)
|
|
193
|
-
set(Gn)
|
|
194
|
-
Gn | Gn
|
|
195
|
-
Gn = G.nodes.data("foo")
|
|
196
|
-
set(Gn)
|
|
197
|
-
Gn | Gn
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
class TestNodeViewSetOps:
|
|
201
|
-
@classmethod
|
|
202
|
-
def setup_class(cls):
|
|
203
|
-
cls.G = nx.path_graph(9)
|
|
204
|
-
cls.G.nodes[3]["foo"] = "bar"
|
|
205
|
-
cls.nv = cls.G.nodes
|
|
206
|
-
|
|
207
|
-
def n_its(self, nodes):
|
|
208
|
-
return set(nodes)
|
|
209
|
-
|
|
210
|
-
def test_len(self):
|
|
211
|
-
G = self.G.copy()
|
|
212
|
-
nv = G.nodes
|
|
213
|
-
assert len(nv) == 9
|
|
214
|
-
G.remove_node(7)
|
|
215
|
-
assert len(nv) == 8
|
|
216
|
-
G.add_node(9)
|
|
217
|
-
assert len(nv) == 9
|
|
218
|
-
|
|
219
|
-
def test_and(self):
|
|
220
|
-
nv = self.nv
|
|
221
|
-
some_nodes = self.n_its(range(5, 12))
|
|
222
|
-
assert nv & some_nodes == self.n_its(range(5, 9))
|
|
223
|
-
assert some_nodes & nv == self.n_its(range(5, 9))
|
|
224
|
-
|
|
225
|
-
def test_or(self):
|
|
226
|
-
nv = self.nv
|
|
227
|
-
some_nodes = self.n_its(range(5, 12))
|
|
228
|
-
assert nv | some_nodes == self.n_its(range(12))
|
|
229
|
-
assert some_nodes | nv == self.n_its(range(12))
|
|
230
|
-
|
|
231
|
-
def test_xor(self):
|
|
232
|
-
nv = self.nv
|
|
233
|
-
some_nodes = self.n_its(range(5, 12))
|
|
234
|
-
nodes = {0, 1, 2, 3, 4, 9, 10, 11}
|
|
235
|
-
assert nv ^ some_nodes == self.n_its(nodes)
|
|
236
|
-
assert some_nodes ^ nv == self.n_its(nodes)
|
|
237
|
-
|
|
238
|
-
def test_sub(self):
|
|
239
|
-
nv = self.nv
|
|
240
|
-
some_nodes = self.n_its(range(5, 12))
|
|
241
|
-
assert nv - some_nodes == self.n_its(range(5))
|
|
242
|
-
assert some_nodes - nv == self.n_its(range(9, 12))
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
class TestNodeDataViewSetOps(TestNodeViewSetOps):
|
|
246
|
-
@classmethod
|
|
247
|
-
def setup_class(cls):
|
|
248
|
-
cls.G = nx.path_graph(9)
|
|
249
|
-
cls.G.nodes[3]["foo"] = "bar"
|
|
250
|
-
cls.nv = cls.G.nodes.data("foo")
|
|
251
|
-
|
|
252
|
-
def n_its(self, nodes):
|
|
253
|
-
return {(node, "bar" if node == 3 else None) for node in nodes}
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
class TestNodeDataViewDefaultSetOps(TestNodeDataViewSetOps):
|
|
257
|
-
@classmethod
|
|
258
|
-
def setup_class(cls):
|
|
259
|
-
cls.G = nx.path_graph(9)
|
|
260
|
-
cls.G.nodes[3]["foo"] = "bar"
|
|
261
|
-
cls.nv = cls.G.nodes.data("foo", default=1)
|
|
262
|
-
|
|
263
|
-
def n_its(self, nodes):
|
|
264
|
-
return {(node, "bar" if node == 3 else 1) for node in nodes}
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
# Edges Data View
|
|
268
|
-
class TestEdgeDataView:
|
|
269
|
-
@classmethod
|
|
270
|
-
def setup_class(cls):
|
|
271
|
-
cls.G = nx.path_graph(9)
|
|
272
|
-
cls.eview = nx.reportviews.EdgeView
|
|
273
|
-
|
|
274
|
-
def test_pickle(self):
|
|
275
|
-
import pickle
|
|
276
|
-
|
|
277
|
-
ev = self.eview(self.G)(data=True)
|
|
278
|
-
pev = pickle.loads(pickle.dumps(ev, -1))
|
|
279
|
-
assert list(ev) == list(pev)
|
|
280
|
-
assert ev.__slots__ == pev.__slots__
|
|
281
|
-
|
|
282
|
-
def modify_edge(self, G, e, **kwds):
|
|
283
|
-
G._adj[e[0]][e[1]].update(kwds)
|
|
284
|
-
|
|
285
|
-
def test_str(self):
|
|
286
|
-
ev = self.eview(self.G)(data=True)
|
|
287
|
-
rep = str([(n, n + 1, {}) for n in range(8)])
|
|
288
|
-
assert str(ev) == rep
|
|
289
|
-
|
|
290
|
-
def test_repr(self):
|
|
291
|
-
ev = self.eview(self.G)(data=True)
|
|
292
|
-
rep = (
|
|
293
|
-
"EdgeDataView([(0, 1, {}), (1, 2, {}), "
|
|
294
|
-
+ "(2, 3, {}), (3, 4, {}), "
|
|
295
|
-
+ "(4, 5, {}), (5, 6, {}), "
|
|
296
|
-
+ "(6, 7, {}), (7, 8, {})])"
|
|
297
|
-
)
|
|
298
|
-
assert repr(ev) == rep
|
|
299
|
-
|
|
300
|
-
def test_iterdata(self):
|
|
301
|
-
G = self.G.copy()
|
|
302
|
-
evr = self.eview(G)
|
|
303
|
-
ev = evr(data=True)
|
|
304
|
-
ev_def = evr(data="foo", default=1)
|
|
305
|
-
|
|
306
|
-
for u, v, d in ev:
|
|
307
|
-
pass
|
|
308
|
-
assert d == {}
|
|
309
|
-
|
|
310
|
-
for u, v, wt in ev_def:
|
|
311
|
-
pass
|
|
312
|
-
assert wt == 1
|
|
313
|
-
|
|
314
|
-
self.modify_edge(G, (2, 3), foo="bar")
|
|
315
|
-
for e in ev:
|
|
316
|
-
assert len(e) == 3
|
|
317
|
-
if set(e[:2]) == {2, 3}:
|
|
318
|
-
assert e[2] == {"foo": "bar"}
|
|
319
|
-
checked = True
|
|
320
|
-
else:
|
|
321
|
-
assert e[2] == {}
|
|
322
|
-
assert checked
|
|
323
|
-
|
|
324
|
-
for e in ev_def:
|
|
325
|
-
assert len(e) == 3
|
|
326
|
-
if set(e[:2]) == {2, 3}:
|
|
327
|
-
assert e[2] == "bar"
|
|
328
|
-
checked_wt = True
|
|
329
|
-
else:
|
|
330
|
-
assert e[2] == 1
|
|
331
|
-
assert checked_wt
|
|
332
|
-
|
|
333
|
-
def test_iter(self):
|
|
334
|
-
evr = self.eview(self.G)
|
|
335
|
-
ev = evr()
|
|
336
|
-
for u, v in ev:
|
|
337
|
-
pass
|
|
338
|
-
iev = iter(ev)
|
|
339
|
-
assert next(iev) == (0, 1)
|
|
340
|
-
assert iter(ev) != ev
|
|
341
|
-
assert iter(iev) == iev
|
|
342
|
-
|
|
343
|
-
def test_contains(self):
|
|
344
|
-
evr = self.eview(self.G)
|
|
345
|
-
ev = evr()
|
|
346
|
-
if self.G.is_directed():
|
|
347
|
-
assert (1, 2) in ev and (2, 1) not in ev
|
|
348
|
-
else:
|
|
349
|
-
assert (1, 2) in ev and (2, 1) in ev
|
|
350
|
-
assert (1, 4) not in ev
|
|
351
|
-
assert (1, 90) not in ev
|
|
352
|
-
assert (90, 1) not in ev
|
|
353
|
-
|
|
354
|
-
def test_contains_with_nbunch(self):
|
|
355
|
-
evr = self.eview(self.G)
|
|
356
|
-
ev = evr(nbunch=[0, 2])
|
|
357
|
-
if self.G.is_directed():
|
|
358
|
-
assert (0, 1) in ev
|
|
359
|
-
assert (1, 2) not in ev
|
|
360
|
-
assert (2, 3) in ev
|
|
361
|
-
else:
|
|
362
|
-
assert (0, 1) in ev
|
|
363
|
-
assert (1, 2) in ev
|
|
364
|
-
assert (2, 3) in ev
|
|
365
|
-
assert (3, 4) not in ev
|
|
366
|
-
assert (4, 5) not in ev
|
|
367
|
-
assert (5, 6) not in ev
|
|
368
|
-
assert (7, 8) not in ev
|
|
369
|
-
assert (8, 9) not in ev
|
|
370
|
-
|
|
371
|
-
def test_len(self):
|
|
372
|
-
evr = self.eview(self.G)
|
|
373
|
-
ev = evr(data="foo")
|
|
374
|
-
assert len(ev) == 8
|
|
375
|
-
assert len(evr(1)) == 2
|
|
376
|
-
assert len(evr([1, 2, 3])) == 4
|
|
377
|
-
|
|
378
|
-
assert len(self.G.edges(1)) == 2
|
|
379
|
-
assert len(self.G.edges()) == 8
|
|
380
|
-
assert len(self.G.edges) == 8
|
|
381
|
-
|
|
382
|
-
H = self.G.copy()
|
|
383
|
-
H.add_edge(1, 1)
|
|
384
|
-
assert len(H.edges(1)) == 3
|
|
385
|
-
assert len(H.edges()) == 9
|
|
386
|
-
assert len(H.edges) == 9
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
class TestOutEdgeDataView(TestEdgeDataView):
|
|
390
|
-
@classmethod
|
|
391
|
-
def setup_class(cls):
|
|
392
|
-
cls.G = nx.path_graph(9, create_using=nx.DiGraph())
|
|
393
|
-
cls.eview = nx.reportviews.OutEdgeView
|
|
394
|
-
|
|
395
|
-
def test_repr(self):
|
|
396
|
-
ev = self.eview(self.G)(data=True)
|
|
397
|
-
rep = (
|
|
398
|
-
"OutEdgeDataView([(0, 1, {}), (1, 2, {}), "
|
|
399
|
-
+ "(2, 3, {}), (3, 4, {}), "
|
|
400
|
-
+ "(4, 5, {}), (5, 6, {}), "
|
|
401
|
-
+ "(6, 7, {}), (7, 8, {})])"
|
|
402
|
-
)
|
|
403
|
-
assert repr(ev) == rep
|
|
404
|
-
|
|
405
|
-
def test_len(self):
|
|
406
|
-
evr = self.eview(self.G)
|
|
407
|
-
ev = evr(data="foo")
|
|
408
|
-
assert len(ev) == 8
|
|
409
|
-
assert len(evr(1)) == 1
|
|
410
|
-
assert len(evr([1, 2, 3])) == 3
|
|
411
|
-
|
|
412
|
-
assert len(self.G.edges(1)) == 1
|
|
413
|
-
assert len(self.G.edges()) == 8
|
|
414
|
-
assert len(self.G.edges) == 8
|
|
415
|
-
|
|
416
|
-
H = self.G.copy()
|
|
417
|
-
H.add_edge(1, 1)
|
|
418
|
-
assert len(H.edges(1)) == 2
|
|
419
|
-
assert len(H.edges()) == 9
|
|
420
|
-
assert len(H.edges) == 9
|
|
421
|
-
|
|
422
|
-
def test_contains_with_nbunch(self):
|
|
423
|
-
evr = self.eview(self.G)
|
|
424
|
-
ev = evr(nbunch=[0, 2])
|
|
425
|
-
assert (0, 1) in ev
|
|
426
|
-
assert (1, 2) not in ev
|
|
427
|
-
assert (2, 3) in ev
|
|
428
|
-
assert (3, 4) not in ev
|
|
429
|
-
assert (4, 5) not in ev
|
|
430
|
-
assert (5, 6) not in ev
|
|
431
|
-
assert (7, 8) not in ev
|
|
432
|
-
assert (8, 9) not in ev
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
class TestInEdgeDataView(TestOutEdgeDataView):
|
|
436
|
-
@classmethod
|
|
437
|
-
def setup_class(cls):
|
|
438
|
-
cls.G = nx.path_graph(9, create_using=nx.DiGraph())
|
|
439
|
-
cls.eview = nx.reportviews.InEdgeView
|
|
440
|
-
|
|
441
|
-
def test_repr(self):
|
|
442
|
-
ev = self.eview(self.G)(data=True)
|
|
443
|
-
rep = (
|
|
444
|
-
"InEdgeDataView([(0, 1, {}), (1, 2, {}), "
|
|
445
|
-
+ "(2, 3, {}), (3, 4, {}), "
|
|
446
|
-
+ "(4, 5, {}), (5, 6, {}), "
|
|
447
|
-
+ "(6, 7, {}), (7, 8, {})])"
|
|
448
|
-
)
|
|
449
|
-
assert repr(ev) == rep
|
|
450
|
-
|
|
451
|
-
def test_contains_with_nbunch(self):
|
|
452
|
-
evr = self.eview(self.G)
|
|
453
|
-
ev = evr(nbunch=[0, 2])
|
|
454
|
-
assert (0, 1) not in ev
|
|
455
|
-
assert (1, 2) in ev
|
|
456
|
-
assert (2, 3) not in ev
|
|
457
|
-
assert (3, 4) not in ev
|
|
458
|
-
assert (4, 5) not in ev
|
|
459
|
-
assert (5, 6) not in ev
|
|
460
|
-
assert (7, 8) not in ev
|
|
461
|
-
assert (8, 9) not in ev
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
class TestMultiEdgeDataView(TestEdgeDataView):
|
|
465
|
-
@classmethod
|
|
466
|
-
def setup_class(cls):
|
|
467
|
-
cls.G = nx.path_graph(9, create_using=nx.MultiGraph())
|
|
468
|
-
cls.eview = nx.reportviews.MultiEdgeView
|
|
469
|
-
|
|
470
|
-
def modify_edge(self, G, e, **kwds):
|
|
471
|
-
G._adj[e[0]][e[1]][0].update(kwds)
|
|
472
|
-
|
|
473
|
-
def test_repr(self):
|
|
474
|
-
ev = self.eview(self.G)(data=True)
|
|
475
|
-
rep = (
|
|
476
|
-
"MultiEdgeDataView([(0, 1, {}), (1, 2, {}), "
|
|
477
|
-
+ "(2, 3, {}), (3, 4, {}), "
|
|
478
|
-
+ "(4, 5, {}), (5, 6, {}), "
|
|
479
|
-
+ "(6, 7, {}), (7, 8, {})])"
|
|
480
|
-
)
|
|
481
|
-
assert repr(ev) == rep
|
|
482
|
-
|
|
483
|
-
def test_contains_with_nbunch(self):
|
|
484
|
-
evr = self.eview(self.G)
|
|
485
|
-
ev = evr(nbunch=[0, 2])
|
|
486
|
-
assert (0, 1) in ev
|
|
487
|
-
assert (1, 2) in ev
|
|
488
|
-
assert (2, 3) in ev
|
|
489
|
-
assert (3, 4) not in ev
|
|
490
|
-
assert (4, 5) not in ev
|
|
491
|
-
assert (5, 6) not in ev
|
|
492
|
-
assert (7, 8) not in ev
|
|
493
|
-
assert (8, 9) not in ev
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
class TestOutMultiEdgeDataView(TestOutEdgeDataView):
|
|
497
|
-
@classmethod
|
|
498
|
-
def setup_class(cls):
|
|
499
|
-
cls.G = nx.path_graph(9, create_using=nx.MultiDiGraph())
|
|
500
|
-
cls.eview = nx.reportviews.OutMultiEdgeView
|
|
501
|
-
|
|
502
|
-
def modify_edge(self, G, e, **kwds):
|
|
503
|
-
G._adj[e[0]][e[1]][0].update(kwds)
|
|
504
|
-
|
|
505
|
-
def test_repr(self):
|
|
506
|
-
ev = self.eview(self.G)(data=True)
|
|
507
|
-
rep = (
|
|
508
|
-
"OutMultiEdgeDataView([(0, 1, {}), (1, 2, {}), "
|
|
509
|
-
+ "(2, 3, {}), (3, 4, {}), "
|
|
510
|
-
+ "(4, 5, {}), (5, 6, {}), "
|
|
511
|
-
+ "(6, 7, {}), (7, 8, {})])"
|
|
512
|
-
)
|
|
513
|
-
assert repr(ev) == rep
|
|
514
|
-
|
|
515
|
-
def test_contains_with_nbunch(self):
|
|
516
|
-
evr = self.eview(self.G)
|
|
517
|
-
ev = evr(nbunch=[0, 2])
|
|
518
|
-
assert (0, 1) in ev
|
|
519
|
-
assert (1, 2) not in ev
|
|
520
|
-
assert (2, 3) in ev
|
|
521
|
-
assert (3, 4) not in ev
|
|
522
|
-
assert (4, 5) not in ev
|
|
523
|
-
assert (5, 6) not in ev
|
|
524
|
-
assert (7, 8) not in ev
|
|
525
|
-
assert (8, 9) not in ev
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
class TestInMultiEdgeDataView(TestOutMultiEdgeDataView):
|
|
529
|
-
@classmethod
|
|
530
|
-
def setup_class(cls):
|
|
531
|
-
cls.G = nx.path_graph(9, create_using=nx.MultiDiGraph())
|
|
532
|
-
cls.eview = nx.reportviews.InMultiEdgeView
|
|
533
|
-
|
|
534
|
-
def test_repr(self):
|
|
535
|
-
ev = self.eview(self.G)(data=True)
|
|
536
|
-
rep = (
|
|
537
|
-
"InMultiEdgeDataView([(0, 1, {}), (1, 2, {}), "
|
|
538
|
-
+ "(2, 3, {}), (3, 4, {}), "
|
|
539
|
-
+ "(4, 5, {}), (5, 6, {}), "
|
|
540
|
-
+ "(6, 7, {}), (7, 8, {})])"
|
|
541
|
-
)
|
|
542
|
-
assert repr(ev) == rep
|
|
543
|
-
|
|
544
|
-
def test_contains_with_nbunch(self):
|
|
545
|
-
evr = self.eview(self.G)
|
|
546
|
-
ev = evr(nbunch=[0, 2])
|
|
547
|
-
assert (0, 1) not in ev
|
|
548
|
-
assert (1, 2) in ev
|
|
549
|
-
assert (2, 3) not in ev
|
|
550
|
-
assert (3, 4) not in ev
|
|
551
|
-
assert (4, 5) not in ev
|
|
552
|
-
assert (5, 6) not in ev
|
|
553
|
-
assert (7, 8) not in ev
|
|
554
|
-
assert (8, 9) not in ev
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
# Edge Views
|
|
558
|
-
class TestEdgeView:
|
|
559
|
-
@classmethod
|
|
560
|
-
def setup_class(cls):
|
|
561
|
-
cls.G = nx.path_graph(9)
|
|
562
|
-
cls.eview = nx.reportviews.EdgeView
|
|
563
|
-
|
|
564
|
-
def test_pickle(self):
|
|
565
|
-
import pickle
|
|
566
|
-
|
|
567
|
-
ev = self.eview(self.G)
|
|
568
|
-
pev = pickle.loads(pickle.dumps(ev, -1))
|
|
569
|
-
assert ev == pev
|
|
570
|
-
assert ev.__slots__ == pev.__slots__
|
|
571
|
-
|
|
572
|
-
def modify_edge(self, G, e, **kwds):
|
|
573
|
-
G._adj[e[0]][e[1]].update(kwds)
|
|
574
|
-
|
|
575
|
-
def test_str(self):
|
|
576
|
-
ev = self.eview(self.G)
|
|
577
|
-
rep = str([(n, n + 1) for n in range(8)])
|
|
578
|
-
assert str(ev) == rep
|
|
579
|
-
|
|
580
|
-
def test_repr(self):
|
|
581
|
-
ev = self.eview(self.G)
|
|
582
|
-
rep = (
|
|
583
|
-
"EdgeView([(0, 1), (1, 2), (2, 3), (3, 4), "
|
|
584
|
-
+ "(4, 5), (5, 6), (6, 7), (7, 8)])"
|
|
585
|
-
)
|
|
586
|
-
assert repr(ev) == rep
|
|
587
|
-
|
|
588
|
-
def test_getitem(self):
|
|
589
|
-
G = self.G.copy()
|
|
590
|
-
ev = G.edges
|
|
591
|
-
G.edges[0, 1]["foo"] = "bar"
|
|
592
|
-
assert ev[0, 1] == {"foo": "bar"}
|
|
593
|
-
|
|
594
|
-
# slicing
|
|
595
|
-
with pytest.raises(nx.NetworkXError, match=".*does not support slicing"):
|
|
596
|
-
G.edges[0:5]
|
|
597
|
-
|
|
598
|
-
# Invalid edge
|
|
599
|
-
with pytest.raises(KeyError, match=r".*edge.*is not in the graph."):
|
|
600
|
-
G.edges[0, 9]
|
|
601
|
-
|
|
602
|
-
def test_call(self):
|
|
603
|
-
ev = self.eview(self.G)
|
|
604
|
-
assert id(ev) == id(ev())
|
|
605
|
-
assert id(ev) == id(ev(data=False))
|
|
606
|
-
assert id(ev) != id(ev(data=True))
|
|
607
|
-
assert id(ev) != id(ev(nbunch=1))
|
|
608
|
-
|
|
609
|
-
def test_data(self):
|
|
610
|
-
ev = self.eview(self.G)
|
|
611
|
-
assert id(ev) != id(ev.data())
|
|
612
|
-
assert id(ev) == id(ev.data(data=False))
|
|
613
|
-
assert id(ev) != id(ev.data(data=True))
|
|
614
|
-
assert id(ev) != id(ev.data(nbunch=1))
|
|
615
|
-
|
|
616
|
-
def test_iter(self):
|
|
617
|
-
ev = self.eview(self.G)
|
|
618
|
-
for u, v in ev:
|
|
619
|
-
pass
|
|
620
|
-
iev = iter(ev)
|
|
621
|
-
assert next(iev) == (0, 1)
|
|
622
|
-
assert iter(ev) != ev
|
|
623
|
-
assert iter(iev) == iev
|
|
624
|
-
|
|
625
|
-
def test_contains(self):
|
|
626
|
-
ev = self.eview(self.G)
|
|
627
|
-
edv = ev()
|
|
628
|
-
if self.G.is_directed():
|
|
629
|
-
assert (1, 2) in ev and (2, 1) not in ev
|
|
630
|
-
assert (1, 2) in edv and (2, 1) not in edv
|
|
631
|
-
else:
|
|
632
|
-
assert (1, 2) in ev and (2, 1) in ev
|
|
633
|
-
assert (1, 2) in edv and (2, 1) in edv
|
|
634
|
-
assert (1, 4) not in ev
|
|
635
|
-
assert (1, 4) not in edv
|
|
636
|
-
# edge not in graph
|
|
637
|
-
assert (1, 90) not in ev
|
|
638
|
-
assert (90, 1) not in ev
|
|
639
|
-
assert (1, 90) not in edv
|
|
640
|
-
assert (90, 1) not in edv
|
|
641
|
-
|
|
642
|
-
def test_contains_with_nbunch(self):
|
|
643
|
-
ev = self.eview(self.G)
|
|
644
|
-
evn = ev(nbunch=[0, 2])
|
|
645
|
-
assert (0, 1) in evn
|
|
646
|
-
assert (1, 2) in evn
|
|
647
|
-
assert (2, 3) in evn
|
|
648
|
-
assert (3, 4) not in evn
|
|
649
|
-
assert (4, 5) not in evn
|
|
650
|
-
assert (5, 6) not in evn
|
|
651
|
-
assert (7, 8) not in evn
|
|
652
|
-
assert (8, 9) not in evn
|
|
653
|
-
|
|
654
|
-
def test_len(self):
|
|
655
|
-
ev = self.eview(self.G)
|
|
656
|
-
num_ed = 9 if self.G.is_multigraph() else 8
|
|
657
|
-
assert len(ev) == num_ed
|
|
658
|
-
|
|
659
|
-
H = self.G.copy()
|
|
660
|
-
H.add_edge(1, 1)
|
|
661
|
-
assert len(H.edges(1)) == 3 + H.is_multigraph() - H.is_directed()
|
|
662
|
-
assert len(H.edges()) == num_ed + 1
|
|
663
|
-
assert len(H.edges) == num_ed + 1
|
|
664
|
-
|
|
665
|
-
def test_and(self):
|
|
666
|
-
ev = self.eview(self.G)
|
|
667
|
-
some_edges = {(0, 1), (1, 0), (0, 2)}
|
|
668
|
-
if self.G.is_directed():
|
|
669
|
-
assert some_edges & ev, {(0, 1)}
|
|
670
|
-
assert ev & some_edges, {(0, 1)}
|
|
671
|
-
else:
|
|
672
|
-
assert ev & some_edges == {(0, 1), (1, 0)}
|
|
673
|
-
assert some_edges & ev == {(0, 1), (1, 0)}
|
|
674
|
-
return
|
|
675
|
-
|
|
676
|
-
def test_or(self):
|
|
677
|
-
ev = self.eview(self.G)
|
|
678
|
-
some_edges = {(0, 1), (1, 0), (0, 2)}
|
|
679
|
-
result1 = {(n, n + 1) for n in range(8)}
|
|
680
|
-
result1.update(some_edges)
|
|
681
|
-
result2 = {(n + 1, n) for n in range(8)}
|
|
682
|
-
result2.update(some_edges)
|
|
683
|
-
assert (ev | some_edges) in (result1, result2)
|
|
684
|
-
assert (some_edges | ev) in (result1, result2)
|
|
685
|
-
|
|
686
|
-
def test_xor(self):
|
|
687
|
-
ev = self.eview(self.G)
|
|
688
|
-
some_edges = {(0, 1), (1, 0), (0, 2)}
|
|
689
|
-
if self.G.is_directed():
|
|
690
|
-
result = {(n, n + 1) for n in range(1, 8)}
|
|
691
|
-
result.update({(1, 0), (0, 2)})
|
|
692
|
-
assert ev ^ some_edges == result
|
|
693
|
-
else:
|
|
694
|
-
result = {(n, n + 1) for n in range(1, 8)}
|
|
695
|
-
result.update({(0, 2)})
|
|
696
|
-
assert ev ^ some_edges == result
|
|
697
|
-
return
|
|
698
|
-
|
|
699
|
-
def test_sub(self):
|
|
700
|
-
ev = self.eview(self.G)
|
|
701
|
-
some_edges = {(0, 1), (1, 0), (0, 2)}
|
|
702
|
-
result = {(n, n + 1) for n in range(8)}
|
|
703
|
-
result.remove((0, 1))
|
|
704
|
-
assert ev - some_edges, result
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
class TestOutEdgeView(TestEdgeView):
|
|
708
|
-
@classmethod
|
|
709
|
-
def setup_class(cls):
|
|
710
|
-
cls.G = nx.path_graph(9, nx.DiGraph())
|
|
711
|
-
cls.eview = nx.reportviews.OutEdgeView
|
|
712
|
-
|
|
713
|
-
def test_repr(self):
|
|
714
|
-
ev = self.eview(self.G)
|
|
715
|
-
rep = (
|
|
716
|
-
"OutEdgeView([(0, 1), (1, 2), (2, 3), (3, 4), "
|
|
717
|
-
+ "(4, 5), (5, 6), (6, 7), (7, 8)])"
|
|
718
|
-
)
|
|
719
|
-
assert repr(ev) == rep
|
|
720
|
-
|
|
721
|
-
def test_contains_with_nbunch(self):
|
|
722
|
-
ev = self.eview(self.G)
|
|
723
|
-
evn = ev(nbunch=[0, 2])
|
|
724
|
-
assert (0, 1) in evn
|
|
725
|
-
assert (1, 2) not in evn
|
|
726
|
-
assert (2, 3) in evn
|
|
727
|
-
assert (3, 4) not in evn
|
|
728
|
-
assert (4, 5) not in evn
|
|
729
|
-
assert (5, 6) not in evn
|
|
730
|
-
assert (7, 8) not in evn
|
|
731
|
-
assert (8, 9) not in evn
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
class TestInEdgeView(TestEdgeView):
|
|
735
|
-
@classmethod
|
|
736
|
-
def setup_class(cls):
|
|
737
|
-
cls.G = nx.path_graph(9, nx.DiGraph())
|
|
738
|
-
cls.eview = nx.reportviews.InEdgeView
|
|
739
|
-
|
|
740
|
-
def test_repr(self):
|
|
741
|
-
ev = self.eview(self.G)
|
|
742
|
-
rep = (
|
|
743
|
-
"InEdgeView([(0, 1), (1, 2), (2, 3), (3, 4), "
|
|
744
|
-
+ "(4, 5), (5, 6), (6, 7), (7, 8)])"
|
|
745
|
-
)
|
|
746
|
-
assert repr(ev) == rep
|
|
747
|
-
|
|
748
|
-
def test_contains_with_nbunch(self):
|
|
749
|
-
ev = self.eview(self.G)
|
|
750
|
-
evn = ev(nbunch=[0, 2])
|
|
751
|
-
assert (0, 1) not in evn
|
|
752
|
-
assert (1, 2) in evn
|
|
753
|
-
assert (2, 3) not in evn
|
|
754
|
-
assert (3, 4) not in evn
|
|
755
|
-
assert (4, 5) not in evn
|
|
756
|
-
assert (5, 6) not in evn
|
|
757
|
-
assert (7, 8) not in evn
|
|
758
|
-
assert (8, 9) not in evn
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
class TestMultiEdgeView(TestEdgeView):
|
|
762
|
-
@classmethod
|
|
763
|
-
def setup_class(cls):
|
|
764
|
-
cls.G = nx.path_graph(9, nx.MultiGraph())
|
|
765
|
-
cls.G.add_edge(1, 2, key=3, foo="bar")
|
|
766
|
-
cls.eview = nx.reportviews.MultiEdgeView
|
|
767
|
-
|
|
768
|
-
def modify_edge(self, G, e, **kwds):
|
|
769
|
-
if len(e) == 2:
|
|
770
|
-
e = e + (0,)
|
|
771
|
-
G._adj[e[0]][e[1]][e[2]].update(kwds)
|
|
772
|
-
|
|
773
|
-
def test_str(self):
|
|
774
|
-
ev = self.eview(self.G)
|
|
775
|
-
replist = [(n, n + 1, 0) for n in range(8)]
|
|
776
|
-
replist.insert(2, (1, 2, 3))
|
|
777
|
-
rep = str(replist)
|
|
778
|
-
assert str(ev) == rep
|
|
779
|
-
|
|
780
|
-
def test_getitem(self):
|
|
781
|
-
G = self.G.copy()
|
|
782
|
-
ev = G.edges
|
|
783
|
-
G.edges[0, 1, 0]["foo"] = "bar"
|
|
784
|
-
assert ev[0, 1, 0] == {"foo": "bar"}
|
|
785
|
-
|
|
786
|
-
# slicing
|
|
787
|
-
with pytest.raises(nx.NetworkXError):
|
|
788
|
-
G.edges[0:5]
|
|
789
|
-
|
|
790
|
-
def test_repr(self):
|
|
791
|
-
ev = self.eview(self.G)
|
|
792
|
-
rep = (
|
|
793
|
-
"MultiEdgeView([(0, 1, 0), (1, 2, 0), (1, 2, 3), (2, 3, 0), "
|
|
794
|
-
+ "(3, 4, 0), (4, 5, 0), (5, 6, 0), (6, 7, 0), (7, 8, 0)])"
|
|
795
|
-
)
|
|
796
|
-
assert repr(ev) == rep
|
|
797
|
-
|
|
798
|
-
def test_call(self):
|
|
799
|
-
ev = self.eview(self.G)
|
|
800
|
-
assert id(ev) == id(ev(keys=True))
|
|
801
|
-
assert id(ev) == id(ev(data=False, keys=True))
|
|
802
|
-
assert id(ev) != id(ev(keys=False))
|
|
803
|
-
assert id(ev) != id(ev(data=True))
|
|
804
|
-
assert id(ev) != id(ev(nbunch=1))
|
|
805
|
-
|
|
806
|
-
def test_data(self):
|
|
807
|
-
ev = self.eview(self.G)
|
|
808
|
-
assert id(ev) != id(ev.data())
|
|
809
|
-
assert id(ev) == id(ev.data(data=False, keys=True))
|
|
810
|
-
assert id(ev) != id(ev.data(keys=False))
|
|
811
|
-
assert id(ev) != id(ev.data(data=True))
|
|
812
|
-
assert id(ev) != id(ev.data(nbunch=1))
|
|
813
|
-
|
|
814
|
-
def test_iter(self):
|
|
815
|
-
ev = self.eview(self.G)
|
|
816
|
-
for u, v, k in ev:
|
|
817
|
-
pass
|
|
818
|
-
iev = iter(ev)
|
|
819
|
-
assert next(iev) == (0, 1, 0)
|
|
820
|
-
assert iter(ev) != ev
|
|
821
|
-
assert iter(iev) == iev
|
|
822
|
-
|
|
823
|
-
def test_iterkeys(self):
|
|
824
|
-
G = self.G
|
|
825
|
-
evr = self.eview(G)
|
|
826
|
-
ev = evr(keys=True)
|
|
827
|
-
for u, v, k in ev:
|
|
828
|
-
pass
|
|
829
|
-
assert k == 0
|
|
830
|
-
ev = evr(keys=True, data="foo", default=1)
|
|
831
|
-
for u, v, k, wt in ev:
|
|
832
|
-
pass
|
|
833
|
-
assert wt == 1
|
|
834
|
-
|
|
835
|
-
self.modify_edge(G, (2, 3, 0), foo="bar")
|
|
836
|
-
ev = evr(keys=True, data=True)
|
|
837
|
-
for e in ev:
|
|
838
|
-
assert len(e) == 4
|
|
839
|
-
if set(e[:2]) == {2, 3}:
|
|
840
|
-
assert e[2] == 0
|
|
841
|
-
assert e[3] == {"foo": "bar"}
|
|
842
|
-
checked = True
|
|
843
|
-
elif set(e[:3]) == {1, 2, 3}:
|
|
844
|
-
assert e[2] == 3
|
|
845
|
-
assert e[3] == {"foo": "bar"}
|
|
846
|
-
checked_multi = True
|
|
847
|
-
else:
|
|
848
|
-
assert e[2] == 0
|
|
849
|
-
assert e[3] == {}
|
|
850
|
-
assert checked
|
|
851
|
-
assert checked_multi
|
|
852
|
-
ev = evr(keys=True, data="foo", default=1)
|
|
853
|
-
for e in ev:
|
|
854
|
-
if set(e[:2]) == {1, 2} and e[2] == 3:
|
|
855
|
-
assert e[3] == "bar"
|
|
856
|
-
if set(e[:2]) == {1, 2} and e[2] == 0:
|
|
857
|
-
assert e[3] == 1
|
|
858
|
-
if set(e[:2]) == {2, 3}:
|
|
859
|
-
assert e[2] == 0
|
|
860
|
-
assert e[3] == "bar"
|
|
861
|
-
assert len(e) == 4
|
|
862
|
-
checked_wt = True
|
|
863
|
-
assert checked_wt
|
|
864
|
-
ev = evr(keys=True)
|
|
865
|
-
for e in ev:
|
|
866
|
-
assert len(e) == 3
|
|
867
|
-
elist = sorted([(i, i + 1, 0) for i in range(8)] + [(1, 2, 3)])
|
|
868
|
-
assert sorted(ev) == elist
|
|
869
|
-
# test that the keyword arguments are passed correctly
|
|
870
|
-
ev = evr((1, 2), "foo", keys=True, default=1)
|
|
871
|
-
with pytest.raises(TypeError):
|
|
872
|
-
evr((1, 2), "foo", True, 1)
|
|
873
|
-
with pytest.raises(TypeError):
|
|
874
|
-
evr((1, 2), "foo", True, default=1)
|
|
875
|
-
for e in ev:
|
|
876
|
-
if set(e[:2]) == {1, 2}:
|
|
877
|
-
assert e[2] in {0, 3}
|
|
878
|
-
if e[2] == 3:
|
|
879
|
-
assert e[3] == "bar"
|
|
880
|
-
else: # e[2] == 0
|
|
881
|
-
assert e[3] == 1
|
|
882
|
-
if G.is_directed():
|
|
883
|
-
assert len(list(ev)) == 3
|
|
884
|
-
else:
|
|
885
|
-
assert len(list(ev)) == 4
|
|
886
|
-
|
|
887
|
-
def test_or(self):
|
|
888
|
-
ev = self.eview(self.G)
|
|
889
|
-
some_edges = {(0, 1, 0), (1, 0, 0), (0, 2, 0)}
|
|
890
|
-
result = {(n, n + 1, 0) for n in range(8)}
|
|
891
|
-
result.update(some_edges)
|
|
892
|
-
result.update({(1, 2, 3)})
|
|
893
|
-
assert ev | some_edges == result
|
|
894
|
-
assert some_edges | ev == result
|
|
895
|
-
|
|
896
|
-
def test_sub(self):
|
|
897
|
-
ev = self.eview(self.G)
|
|
898
|
-
some_edges = {(0, 1, 0), (1, 0, 0), (0, 2, 0)}
|
|
899
|
-
result = {(n, n + 1, 0) for n in range(8)}
|
|
900
|
-
result.remove((0, 1, 0))
|
|
901
|
-
result.update({(1, 2, 3)})
|
|
902
|
-
assert ev - some_edges, result
|
|
903
|
-
assert some_edges - ev, result
|
|
904
|
-
|
|
905
|
-
def test_xor(self):
|
|
906
|
-
ev = self.eview(self.G)
|
|
907
|
-
some_edges = {(0, 1, 0), (1, 0, 0), (0, 2, 0)}
|
|
908
|
-
if self.G.is_directed():
|
|
909
|
-
result = {(n, n + 1, 0) for n in range(1, 8)}
|
|
910
|
-
result.update({(1, 0, 0), (0, 2, 0), (1, 2, 3)})
|
|
911
|
-
assert ev ^ some_edges == result
|
|
912
|
-
assert some_edges ^ ev == result
|
|
913
|
-
else:
|
|
914
|
-
result = {(n, n + 1, 0) for n in range(1, 8)}
|
|
915
|
-
result.update({(0, 2, 0), (1, 2, 3)})
|
|
916
|
-
assert ev ^ some_edges == result
|
|
917
|
-
assert some_edges ^ ev == result
|
|
918
|
-
|
|
919
|
-
def test_and(self):
|
|
920
|
-
ev = self.eview(self.G)
|
|
921
|
-
some_edges = {(0, 1, 0), (1, 0, 0), (0, 2, 0)}
|
|
922
|
-
if self.G.is_directed():
|
|
923
|
-
assert ev & some_edges == {(0, 1, 0)}
|
|
924
|
-
assert some_edges & ev == {(0, 1, 0)}
|
|
925
|
-
else:
|
|
926
|
-
assert ev & some_edges == {(0, 1, 0), (1, 0, 0)}
|
|
927
|
-
assert some_edges & ev == {(0, 1, 0), (1, 0, 0)}
|
|
928
|
-
|
|
929
|
-
def test_contains_with_nbunch(self):
|
|
930
|
-
ev = self.eview(self.G)
|
|
931
|
-
evn = ev(nbunch=[0, 2])
|
|
932
|
-
assert (0, 1) in evn
|
|
933
|
-
assert (1, 2) in evn
|
|
934
|
-
assert (2, 3) in evn
|
|
935
|
-
assert (3, 4) not in evn
|
|
936
|
-
assert (4, 5) not in evn
|
|
937
|
-
assert (5, 6) not in evn
|
|
938
|
-
assert (7, 8) not in evn
|
|
939
|
-
assert (8, 9) not in evn
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
class TestOutMultiEdgeView(TestMultiEdgeView):
|
|
943
|
-
@classmethod
|
|
944
|
-
def setup_class(cls):
|
|
945
|
-
cls.G = nx.path_graph(9, nx.MultiDiGraph())
|
|
946
|
-
cls.G.add_edge(1, 2, key=3, foo="bar")
|
|
947
|
-
cls.eview = nx.reportviews.OutMultiEdgeView
|
|
948
|
-
|
|
949
|
-
def modify_edge(self, G, e, **kwds):
|
|
950
|
-
if len(e) == 2:
|
|
951
|
-
e = e + (0,)
|
|
952
|
-
G._adj[e[0]][e[1]][e[2]].update(kwds)
|
|
953
|
-
|
|
954
|
-
def test_repr(self):
|
|
955
|
-
ev = self.eview(self.G)
|
|
956
|
-
rep = (
|
|
957
|
-
"OutMultiEdgeView([(0, 1, 0), (1, 2, 0), (1, 2, 3), (2, 3, 0),"
|
|
958
|
-
+ " (3, 4, 0), (4, 5, 0), (5, 6, 0), (6, 7, 0), (7, 8, 0)])"
|
|
959
|
-
)
|
|
960
|
-
assert repr(ev) == rep
|
|
961
|
-
|
|
962
|
-
def test_contains_with_nbunch(self):
|
|
963
|
-
ev = self.eview(self.G)
|
|
964
|
-
evn = ev(nbunch=[0, 2])
|
|
965
|
-
assert (0, 1) in evn
|
|
966
|
-
assert (1, 2) not in evn
|
|
967
|
-
assert (2, 3) in evn
|
|
968
|
-
assert (3, 4) not in evn
|
|
969
|
-
assert (4, 5) not in evn
|
|
970
|
-
assert (5, 6) not in evn
|
|
971
|
-
assert (7, 8) not in evn
|
|
972
|
-
assert (8, 9) not in evn
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
class TestInMultiEdgeView(TestMultiEdgeView):
|
|
976
|
-
@classmethod
|
|
977
|
-
def setup_class(cls):
|
|
978
|
-
cls.G = nx.path_graph(9, nx.MultiDiGraph())
|
|
979
|
-
cls.G.add_edge(1, 2, key=3, foo="bar")
|
|
980
|
-
cls.eview = nx.reportviews.InMultiEdgeView
|
|
981
|
-
|
|
982
|
-
def modify_edge(self, G, e, **kwds):
|
|
983
|
-
if len(e) == 2:
|
|
984
|
-
e = e + (0,)
|
|
985
|
-
G._adj[e[0]][e[1]][e[2]].update(kwds)
|
|
986
|
-
|
|
987
|
-
def test_repr(self):
|
|
988
|
-
ev = self.eview(self.G)
|
|
989
|
-
rep = (
|
|
990
|
-
"InMultiEdgeView([(0, 1, 0), (1, 2, 0), (1, 2, 3), (2, 3, 0), "
|
|
991
|
-
+ "(3, 4, 0), (4, 5, 0), (5, 6, 0), (6, 7, 0), (7, 8, 0)])"
|
|
992
|
-
)
|
|
993
|
-
assert repr(ev) == rep
|
|
994
|
-
|
|
995
|
-
def test_contains_with_nbunch(self):
|
|
996
|
-
ev = self.eview(self.G)
|
|
997
|
-
evn = ev(nbunch=[0, 2])
|
|
998
|
-
assert (0, 1) not in evn
|
|
999
|
-
assert (1, 2) in evn
|
|
1000
|
-
assert (2, 3) not in evn
|
|
1001
|
-
assert (3, 4) not in evn
|
|
1002
|
-
assert (4, 5) not in evn
|
|
1003
|
-
assert (5, 6) not in evn
|
|
1004
|
-
assert (7, 8) not in evn
|
|
1005
|
-
assert (8, 9) not in evn
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
# Degrees
|
|
1009
|
-
class TestDegreeView:
|
|
1010
|
-
GRAPH = nx.Graph
|
|
1011
|
-
dview = nx.reportviews.DegreeView
|
|
1012
|
-
|
|
1013
|
-
@classmethod
|
|
1014
|
-
def setup_class(cls):
|
|
1015
|
-
cls.G = nx.path_graph(6, cls.GRAPH())
|
|
1016
|
-
cls.G.add_edge(1, 3, foo=2)
|
|
1017
|
-
cls.G.add_edge(1, 3, foo=3)
|
|
1018
|
-
|
|
1019
|
-
def test_pickle(self):
|
|
1020
|
-
import pickle
|
|
1021
|
-
|
|
1022
|
-
deg = self.G.degree
|
|
1023
|
-
pdeg = pickle.loads(pickle.dumps(deg, -1))
|
|
1024
|
-
assert dict(deg) == dict(pdeg)
|
|
1025
|
-
|
|
1026
|
-
def test_str(self):
|
|
1027
|
-
dv = self.dview(self.G)
|
|
1028
|
-
rep = str([(0, 1), (1, 3), (2, 2), (3, 3), (4, 2), (5, 1)])
|
|
1029
|
-
assert str(dv) == rep
|
|
1030
|
-
dv = self.G.degree()
|
|
1031
|
-
assert str(dv) == rep
|
|
1032
|
-
|
|
1033
|
-
def test_repr(self):
|
|
1034
|
-
dv = self.dview(self.G)
|
|
1035
|
-
rep = "DegreeView({0: 1, 1: 3, 2: 2, 3: 3, 4: 2, 5: 1})"
|
|
1036
|
-
assert repr(dv) == rep
|
|
1037
|
-
|
|
1038
|
-
def test_iter(self):
|
|
1039
|
-
dv = self.dview(self.G)
|
|
1040
|
-
for n, d in dv:
|
|
1041
|
-
pass
|
|
1042
|
-
idv = iter(dv)
|
|
1043
|
-
assert iter(dv) != dv
|
|
1044
|
-
assert iter(idv) == idv
|
|
1045
|
-
assert next(idv) == (0, dv[0])
|
|
1046
|
-
assert next(idv) == (1, dv[1])
|
|
1047
|
-
# weighted
|
|
1048
|
-
dv = self.dview(self.G, weight="foo")
|
|
1049
|
-
for n, d in dv:
|
|
1050
|
-
pass
|
|
1051
|
-
idv = iter(dv)
|
|
1052
|
-
assert iter(dv) != dv
|
|
1053
|
-
assert iter(idv) == idv
|
|
1054
|
-
assert next(idv) == (0, dv[0])
|
|
1055
|
-
assert next(idv) == (1, dv[1])
|
|
1056
|
-
|
|
1057
|
-
def test_nbunch(self):
|
|
1058
|
-
dv = self.dview(self.G)
|
|
1059
|
-
dvn = dv(0)
|
|
1060
|
-
assert dvn == 1
|
|
1061
|
-
dvn = dv([2, 3])
|
|
1062
|
-
assert sorted(dvn) == [(2, 2), (3, 3)]
|
|
1063
|
-
|
|
1064
|
-
def test_getitem(self):
|
|
1065
|
-
dv = self.dview(self.G)
|
|
1066
|
-
assert dv[0] == 1
|
|
1067
|
-
assert dv[1] == 3
|
|
1068
|
-
assert dv[2] == 2
|
|
1069
|
-
assert dv[3] == 3
|
|
1070
|
-
dv = self.dview(self.G, weight="foo")
|
|
1071
|
-
assert dv[0] == 1
|
|
1072
|
-
assert dv[1] == 5
|
|
1073
|
-
assert dv[2] == 2
|
|
1074
|
-
assert dv[3] == 5
|
|
1075
|
-
|
|
1076
|
-
def test_weight(self):
|
|
1077
|
-
dv = self.dview(self.G)
|
|
1078
|
-
dvw = dv(0, weight="foo")
|
|
1079
|
-
assert dvw == 1
|
|
1080
|
-
dvw = dv(1, weight="foo")
|
|
1081
|
-
assert dvw == 5
|
|
1082
|
-
dvw = dv([2, 3], weight="foo")
|
|
1083
|
-
assert sorted(dvw) == [(2, 2), (3, 5)]
|
|
1084
|
-
dvd = dict(dv(weight="foo"))
|
|
1085
|
-
assert dvd[0] == 1
|
|
1086
|
-
assert dvd[1] == 5
|
|
1087
|
-
assert dvd[2] == 2
|
|
1088
|
-
assert dvd[3] == 5
|
|
1089
|
-
|
|
1090
|
-
def test_len(self):
|
|
1091
|
-
dv = self.dview(self.G)
|
|
1092
|
-
assert len(dv) == 6
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
class TestDiDegreeView(TestDegreeView):
|
|
1096
|
-
GRAPH = nx.DiGraph
|
|
1097
|
-
dview = nx.reportviews.DiDegreeView
|
|
1098
|
-
|
|
1099
|
-
def test_repr(self):
|
|
1100
|
-
dv = self.G.degree()
|
|
1101
|
-
rep = "DiDegreeView({0: 1, 1: 3, 2: 2, 3: 3, 4: 2, 5: 1})"
|
|
1102
|
-
assert repr(dv) == rep
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
class TestOutDegreeView(TestDegreeView):
|
|
1106
|
-
GRAPH = nx.DiGraph
|
|
1107
|
-
dview = nx.reportviews.OutDegreeView
|
|
1108
|
-
|
|
1109
|
-
def test_str(self):
|
|
1110
|
-
dv = self.dview(self.G)
|
|
1111
|
-
rep = str([(0, 1), (1, 2), (2, 1), (3, 1), (4, 1), (5, 0)])
|
|
1112
|
-
assert str(dv) == rep
|
|
1113
|
-
dv = self.G.out_degree()
|
|
1114
|
-
assert str(dv) == rep
|
|
1115
|
-
|
|
1116
|
-
def test_repr(self):
|
|
1117
|
-
dv = self.G.out_degree()
|
|
1118
|
-
rep = "OutDegreeView({0: 1, 1: 2, 2: 1, 3: 1, 4: 1, 5: 0})"
|
|
1119
|
-
assert repr(dv) == rep
|
|
1120
|
-
|
|
1121
|
-
def test_nbunch(self):
|
|
1122
|
-
dv = self.dview(self.G)
|
|
1123
|
-
dvn = dv(0)
|
|
1124
|
-
assert dvn == 1
|
|
1125
|
-
dvn = dv([2, 3])
|
|
1126
|
-
assert sorted(dvn) == [(2, 1), (3, 1)]
|
|
1127
|
-
|
|
1128
|
-
def test_getitem(self):
|
|
1129
|
-
dv = self.dview(self.G)
|
|
1130
|
-
assert dv[0] == 1
|
|
1131
|
-
assert dv[1] == 2
|
|
1132
|
-
assert dv[2] == 1
|
|
1133
|
-
assert dv[3] == 1
|
|
1134
|
-
dv = self.dview(self.G, weight="foo")
|
|
1135
|
-
assert dv[0] == 1
|
|
1136
|
-
assert dv[1] == 4
|
|
1137
|
-
assert dv[2] == 1
|
|
1138
|
-
assert dv[3] == 1
|
|
1139
|
-
|
|
1140
|
-
def test_weight(self):
|
|
1141
|
-
dv = self.dview(self.G)
|
|
1142
|
-
dvw = dv(0, weight="foo")
|
|
1143
|
-
assert dvw == 1
|
|
1144
|
-
dvw = dv(1, weight="foo")
|
|
1145
|
-
assert dvw == 4
|
|
1146
|
-
dvw = dv([2, 3], weight="foo")
|
|
1147
|
-
assert sorted(dvw) == [(2, 1), (3, 1)]
|
|
1148
|
-
dvd = dict(dv(weight="foo"))
|
|
1149
|
-
assert dvd[0] == 1
|
|
1150
|
-
assert dvd[1] == 4
|
|
1151
|
-
assert dvd[2] == 1
|
|
1152
|
-
assert dvd[3] == 1
|
|
1153
|
-
|
|
1154
|
-
|
|
1155
|
-
class TestInDegreeView(TestDegreeView):
|
|
1156
|
-
GRAPH = nx.DiGraph
|
|
1157
|
-
dview = nx.reportviews.InDegreeView
|
|
1158
|
-
|
|
1159
|
-
def test_str(self):
|
|
1160
|
-
dv = self.dview(self.G)
|
|
1161
|
-
rep = str([(0, 0), (1, 1), (2, 1), (3, 2), (4, 1), (5, 1)])
|
|
1162
|
-
assert str(dv) == rep
|
|
1163
|
-
dv = self.G.in_degree()
|
|
1164
|
-
assert str(dv) == rep
|
|
1165
|
-
|
|
1166
|
-
def test_repr(self):
|
|
1167
|
-
dv = self.G.in_degree()
|
|
1168
|
-
rep = "InDegreeView({0: 0, 1: 1, 2: 1, 3: 2, 4: 1, 5: 1})"
|
|
1169
|
-
assert repr(dv) == rep
|
|
1170
|
-
|
|
1171
|
-
def test_nbunch(self):
|
|
1172
|
-
dv = self.dview(self.G)
|
|
1173
|
-
dvn = dv(0)
|
|
1174
|
-
assert dvn == 0
|
|
1175
|
-
dvn = dv([2, 3])
|
|
1176
|
-
assert sorted(dvn) == [(2, 1), (3, 2)]
|
|
1177
|
-
|
|
1178
|
-
def test_getitem(self):
|
|
1179
|
-
dv = self.dview(self.G)
|
|
1180
|
-
assert dv[0] == 0
|
|
1181
|
-
assert dv[1] == 1
|
|
1182
|
-
assert dv[2] == 1
|
|
1183
|
-
assert dv[3] == 2
|
|
1184
|
-
dv = self.dview(self.G, weight="foo")
|
|
1185
|
-
assert dv[0] == 0
|
|
1186
|
-
assert dv[1] == 1
|
|
1187
|
-
assert dv[2] == 1
|
|
1188
|
-
assert dv[3] == 4
|
|
1189
|
-
|
|
1190
|
-
def test_weight(self):
|
|
1191
|
-
dv = self.dview(self.G)
|
|
1192
|
-
dvw = dv(0, weight="foo")
|
|
1193
|
-
assert dvw == 0
|
|
1194
|
-
dvw = dv(1, weight="foo")
|
|
1195
|
-
assert dvw == 1
|
|
1196
|
-
dvw = dv([2, 3], weight="foo")
|
|
1197
|
-
assert sorted(dvw) == [(2, 1), (3, 4)]
|
|
1198
|
-
dvd = dict(dv(weight="foo"))
|
|
1199
|
-
assert dvd[0] == 0
|
|
1200
|
-
assert dvd[1] == 1
|
|
1201
|
-
assert dvd[2] == 1
|
|
1202
|
-
assert dvd[3] == 4
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
class TestMultiDegreeView(TestDegreeView):
|
|
1206
|
-
GRAPH = nx.MultiGraph
|
|
1207
|
-
dview = nx.reportviews.MultiDegreeView
|
|
1208
|
-
|
|
1209
|
-
def test_str(self):
|
|
1210
|
-
dv = self.dview(self.G)
|
|
1211
|
-
rep = str([(0, 1), (1, 4), (2, 2), (3, 4), (4, 2), (5, 1)])
|
|
1212
|
-
assert str(dv) == rep
|
|
1213
|
-
dv = self.G.degree()
|
|
1214
|
-
assert str(dv) == rep
|
|
1215
|
-
|
|
1216
|
-
def test_repr(self):
|
|
1217
|
-
dv = self.G.degree()
|
|
1218
|
-
rep = "MultiDegreeView({0: 1, 1: 4, 2: 2, 3: 4, 4: 2, 5: 1})"
|
|
1219
|
-
assert repr(dv) == rep
|
|
1220
|
-
|
|
1221
|
-
def test_nbunch(self):
|
|
1222
|
-
dv = self.dview(self.G)
|
|
1223
|
-
dvn = dv(0)
|
|
1224
|
-
assert dvn == 1
|
|
1225
|
-
dvn = dv([2, 3])
|
|
1226
|
-
assert sorted(dvn) == [(2, 2), (3, 4)]
|
|
1227
|
-
|
|
1228
|
-
def test_getitem(self):
|
|
1229
|
-
dv = self.dview(self.G)
|
|
1230
|
-
assert dv[0] == 1
|
|
1231
|
-
assert dv[1] == 4
|
|
1232
|
-
assert dv[2] == 2
|
|
1233
|
-
assert dv[3] == 4
|
|
1234
|
-
dv = self.dview(self.G, weight="foo")
|
|
1235
|
-
assert dv[0] == 1
|
|
1236
|
-
assert dv[1] == 7
|
|
1237
|
-
assert dv[2] == 2
|
|
1238
|
-
assert dv[3] == 7
|
|
1239
|
-
|
|
1240
|
-
def test_weight(self):
|
|
1241
|
-
dv = self.dview(self.G)
|
|
1242
|
-
dvw = dv(0, weight="foo")
|
|
1243
|
-
assert dvw == 1
|
|
1244
|
-
dvw = dv(1, weight="foo")
|
|
1245
|
-
assert dvw == 7
|
|
1246
|
-
dvw = dv([2, 3], weight="foo")
|
|
1247
|
-
assert sorted(dvw) == [(2, 2), (3, 7)]
|
|
1248
|
-
dvd = dict(dv(weight="foo"))
|
|
1249
|
-
assert dvd[0] == 1
|
|
1250
|
-
assert dvd[1] == 7
|
|
1251
|
-
assert dvd[2] == 2
|
|
1252
|
-
assert dvd[3] == 7
|
|
1253
|
-
|
|
1254
|
-
|
|
1255
|
-
class TestDiMultiDegreeView(TestMultiDegreeView):
|
|
1256
|
-
GRAPH = nx.MultiDiGraph
|
|
1257
|
-
dview = nx.reportviews.DiMultiDegreeView
|
|
1258
|
-
|
|
1259
|
-
def test_repr(self):
|
|
1260
|
-
dv = self.G.degree()
|
|
1261
|
-
rep = "DiMultiDegreeView({0: 1, 1: 4, 2: 2, 3: 4, 4: 2, 5: 1})"
|
|
1262
|
-
assert repr(dv) == rep
|
|
1263
|
-
|
|
1264
|
-
|
|
1265
|
-
class TestOutMultiDegreeView(TestDegreeView):
|
|
1266
|
-
GRAPH = nx.MultiDiGraph
|
|
1267
|
-
dview = nx.reportviews.OutMultiDegreeView
|
|
1268
|
-
|
|
1269
|
-
def test_str(self):
|
|
1270
|
-
dv = self.dview(self.G)
|
|
1271
|
-
rep = str([(0, 1), (1, 3), (2, 1), (3, 1), (4, 1), (5, 0)])
|
|
1272
|
-
assert str(dv) == rep
|
|
1273
|
-
dv = self.G.out_degree()
|
|
1274
|
-
assert str(dv) == rep
|
|
1275
|
-
|
|
1276
|
-
def test_repr(self):
|
|
1277
|
-
dv = self.G.out_degree()
|
|
1278
|
-
rep = "OutMultiDegreeView({0: 1, 1: 3, 2: 1, 3: 1, 4: 1, 5: 0})"
|
|
1279
|
-
assert repr(dv) == rep
|
|
1280
|
-
|
|
1281
|
-
def test_nbunch(self):
|
|
1282
|
-
dv = self.dview(self.G)
|
|
1283
|
-
dvn = dv(0)
|
|
1284
|
-
assert dvn == 1
|
|
1285
|
-
dvn = dv([2, 3])
|
|
1286
|
-
assert sorted(dvn) == [(2, 1), (3, 1)]
|
|
1287
|
-
|
|
1288
|
-
def test_getitem(self):
|
|
1289
|
-
dv = self.dview(self.G)
|
|
1290
|
-
assert dv[0] == 1
|
|
1291
|
-
assert dv[1] == 3
|
|
1292
|
-
assert dv[2] == 1
|
|
1293
|
-
assert dv[3] == 1
|
|
1294
|
-
dv = self.dview(self.G, weight="foo")
|
|
1295
|
-
assert dv[0] == 1
|
|
1296
|
-
assert dv[1] == 6
|
|
1297
|
-
assert dv[2] == 1
|
|
1298
|
-
assert dv[3] == 1
|
|
1299
|
-
|
|
1300
|
-
def test_weight(self):
|
|
1301
|
-
dv = self.dview(self.G)
|
|
1302
|
-
dvw = dv(0, weight="foo")
|
|
1303
|
-
assert dvw == 1
|
|
1304
|
-
dvw = dv(1, weight="foo")
|
|
1305
|
-
assert dvw == 6
|
|
1306
|
-
dvw = dv([2, 3], weight="foo")
|
|
1307
|
-
assert sorted(dvw) == [(2, 1), (3, 1)]
|
|
1308
|
-
dvd = dict(dv(weight="foo"))
|
|
1309
|
-
assert dvd[0] == 1
|
|
1310
|
-
assert dvd[1] == 6
|
|
1311
|
-
assert dvd[2] == 1
|
|
1312
|
-
assert dvd[3] == 1
|
|
1313
|
-
|
|
1314
|
-
|
|
1315
|
-
class TestInMultiDegreeView(TestDegreeView):
|
|
1316
|
-
GRAPH = nx.MultiDiGraph
|
|
1317
|
-
dview = nx.reportviews.InMultiDegreeView
|
|
1318
|
-
|
|
1319
|
-
def test_str(self):
|
|
1320
|
-
dv = self.dview(self.G)
|
|
1321
|
-
rep = str([(0, 0), (1, 1), (2, 1), (3, 3), (4, 1), (5, 1)])
|
|
1322
|
-
assert str(dv) == rep
|
|
1323
|
-
dv = self.G.in_degree()
|
|
1324
|
-
assert str(dv) == rep
|
|
1325
|
-
|
|
1326
|
-
def test_repr(self):
|
|
1327
|
-
dv = self.G.in_degree()
|
|
1328
|
-
rep = "InMultiDegreeView({0: 0, 1: 1, 2: 1, 3: 3, 4: 1, 5: 1})"
|
|
1329
|
-
assert repr(dv) == rep
|
|
1330
|
-
|
|
1331
|
-
def test_nbunch(self):
|
|
1332
|
-
dv = self.dview(self.G)
|
|
1333
|
-
dvn = dv(0)
|
|
1334
|
-
assert dvn == 0
|
|
1335
|
-
dvn = dv([2, 3])
|
|
1336
|
-
assert sorted(dvn) == [(2, 1), (3, 3)]
|
|
1337
|
-
|
|
1338
|
-
def test_getitem(self):
|
|
1339
|
-
dv = self.dview(self.G)
|
|
1340
|
-
assert dv[0] == 0
|
|
1341
|
-
assert dv[1] == 1
|
|
1342
|
-
assert dv[2] == 1
|
|
1343
|
-
assert dv[3] == 3
|
|
1344
|
-
dv = self.dview(self.G, weight="foo")
|
|
1345
|
-
assert dv[0] == 0
|
|
1346
|
-
assert dv[1] == 1
|
|
1347
|
-
assert dv[2] == 1
|
|
1348
|
-
assert dv[3] == 6
|
|
1349
|
-
|
|
1350
|
-
def test_weight(self):
|
|
1351
|
-
dv = self.dview(self.G)
|
|
1352
|
-
dvw = dv(0, weight="foo")
|
|
1353
|
-
assert dvw == 0
|
|
1354
|
-
dvw = dv(1, weight="foo")
|
|
1355
|
-
assert dvw == 1
|
|
1356
|
-
dvw = dv([2, 3], weight="foo")
|
|
1357
|
-
assert sorted(dvw) == [(2, 1), (3, 6)]
|
|
1358
|
-
dvd = dict(dv(weight="foo"))
|
|
1359
|
-
assert dvd[0] == 0
|
|
1360
|
-
assert dvd[1] == 1
|
|
1361
|
-
assert dvd[2] == 1
|
|
1362
|
-
assert dvd[3] == 6
|
|
1363
|
-
|
|
1364
|
-
|
|
1365
|
-
@pytest.mark.parametrize(
|
|
1366
|
-
("reportview", "err_msg_terms"),
|
|
1367
|
-
(
|
|
1368
|
-
(rv.NodeView, "list(G.nodes"),
|
|
1369
|
-
(rv.NodeDataView, "list(G.nodes.data"),
|
|
1370
|
-
(rv.EdgeView, "list(G.edges"),
|
|
1371
|
-
# Directed EdgeViews
|
|
1372
|
-
(rv.InEdgeView, "list(G.in_edges"),
|
|
1373
|
-
(rv.OutEdgeView, "list(G.edges"),
|
|
1374
|
-
# Multi EdgeViews
|
|
1375
|
-
(rv.MultiEdgeView, "list(G.edges"),
|
|
1376
|
-
(rv.InMultiEdgeView, "list(G.in_edges"),
|
|
1377
|
-
(rv.OutMultiEdgeView, "list(G.edges"),
|
|
1378
|
-
),
|
|
1379
|
-
)
|
|
1380
|
-
def test_slicing_reportviews(reportview, err_msg_terms):
|
|
1381
|
-
G = nx.complete_graph(3)
|
|
1382
|
-
view = reportview(G)
|
|
1383
|
-
with pytest.raises(nx.NetworkXError) as exc:
|
|
1384
|
-
view[0:2]
|
|
1385
|
-
errmsg = str(exc.value)
|
|
1386
|
-
assert type(view).__name__ in errmsg
|
|
1387
|
-
assert err_msg_terms in errmsg
|
|
1388
|
-
|
|
1389
|
-
|
|
1390
|
-
@pytest.mark.parametrize(
|
|
1391
|
-
"graph", [nx.Graph, nx.DiGraph, nx.MultiGraph, nx.MultiDiGraph]
|
|
1392
|
-
)
|
|
1393
|
-
def test_cache_dict_get_set_state(graph):
|
|
1394
|
-
G = nx.path_graph(5, graph())
|
|
1395
|
-
G.nodes, G.edges, G.adj, G.degree
|
|
1396
|
-
if G.is_directed():
|
|
1397
|
-
G.pred, G.succ, G.in_edges, G.out_edges, G.in_degree, G.out_degree
|
|
1398
|
-
cached_dict = G.__dict__
|
|
1399
|
-
assert "nodes" in cached_dict
|
|
1400
|
-
assert "edges" in cached_dict
|
|
1401
|
-
assert "adj" in cached_dict
|
|
1402
|
-
assert "degree" in cached_dict
|
|
1403
|
-
if G.is_directed():
|
|
1404
|
-
assert "pred" in cached_dict
|
|
1405
|
-
assert "succ" in cached_dict
|
|
1406
|
-
assert "in_edges" in cached_dict
|
|
1407
|
-
assert "out_edges" in cached_dict
|
|
1408
|
-
assert "in_degree" in cached_dict
|
|
1409
|
-
assert "out_degree" in cached_dict
|
|
1410
|
-
|
|
1411
|
-
# Raises error if the cached properties and views do not work
|
|
1412
|
-
pickle.loads(pickle.dumps(G, -1))
|
|
1413
|
-
deepcopy(G)
|
|
1414
|
-
|
|
1415
|
-
|
|
1416
|
-
def test_edge_views_inherit_from_EdgeViewABC():
|
|
1417
|
-
all_edge_view_classes = (v for v in dir(nx.reportviews) if "Edge" in v)
|
|
1418
|
-
for eview_class in all_edge_view_classes:
|
|
1419
|
-
assert issubclass(
|
|
1420
|
-
getattr(nx.reportviews, eview_class), nx.reportviews.EdgeViewABC
|
|
1421
|
-
)
|