Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package python-networkx for openSUSE:Factory checked in at 2023-01-06 17:04:56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-networkx (Old) and /work/SRC/openSUSE:Factory/.python-networkx.new.1563 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-networkx" Fri Jan 6 17:04:56 2023 rev:34 rq:1056126 version:2.8.8 Changes: -------- --- /work/SRC/openSUSE:Factory/python-networkx/python-networkx.changes 2022-10-03 13:43:51.001229055 +0200 +++ /work/SRC/openSUSE:Factory/.python-networkx.new.1563/python-networkx.changes 2023-01-06 17:05:27.656149439 +0100 @@ -1,0 +2,34 @@ +Wed Jan 4 22:18:00 UTC 2023 - Dirk Müller <dmuel...@suse.com> + +- update to 2.8.8: + * Fix warnings from running tests in randomized order + * Update pydata-sphinx-theme + * update secutiry link to tidelift + * Update numpydoc + * Support Python 3.11 + * Minor updates to expanders generator tests + * Add missing asserts to tests + * fixes #6036 + * Improve test coverage expanders line graph generators solved (PR for issue #6034) + * Replace .A call with .toarray for sparse array in example. + * Improve test coverage for algorithms/richclub.py + * Tested boykov_kolmogorov and dinitz with cutoff + * Improve test coverage for multigraph class + * Improve test coverage for algorithms in dominating_set.py (PR for issue 6032) + * Improve test coverage for graph class + * added coverage in generators/tree.py + * DOC: Specifically branch off main, instead of current branch + * Improve test coverage for multidigraph class + * Improve test coverage for digraph class + * Improve test coverage for algorithms in dispersion.py + * Test on Python 3.11 + * Improve test coverage in algorithms shortest paths unweighted.py + * Increased test coverage algorithms/matching.py + * Renamed test functions in test_lowest_common_ancestors + * Increase covering coverage + * Add example for fiedler_vector + * Improve test coverage for cycles.py + * Added an example in all_pairs_node_connectivity + * Amount of nodes and edges have mistakes when reading adjlist file + +------------------------------------------------------------------- Old: ---- networkx-2.8.7.tar.gz New: ---- networkx-2.8.8.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-networkx.spec ++++++ --- /var/tmp/diff_new_pack.BUmDub/_old 2023-01-06 17:05:28.432153797 +0100 +++ /var/tmp/diff_new_pack.BUmDub/_new 2023-01-06 17:05:28.436153819 +0100 @@ -1,7 +1,7 @@ # # spec file for package python-networkx # -# Copyright (c) 2022 SUSE LLC +# Copyright (c) 2023 SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -18,7 +18,7 @@ %{?!python_module:%define python_module() python3-%{**}} Name: python-networkx -Version: 2.8.7 +Version: 2.8.8 Release: 0 Summary: Python package for the study of complex networks License: BSD-3-Clause ++++++ networkx-2.8.7.tar.gz -> networkx-2.8.8.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/networkx-2.8.7/CONTRIBUTING.rst new/networkx-2.8.8/CONTRIBUTING.rst --- old/networkx-2.8.7/CONTRIBUTING.rst 2022-09-30 18:57:13.000000000 +0200 +++ new/networkx-2.8.8/CONTRIBUTING.rst 2022-11-01 19:53:50.000000000 +0100 @@ -94,7 +94,7 @@ branch name will appear in the merge message, use a sensible name such as 'bugfix-for-issue-1480':: - git checkout -b bugfix-for-issue-1480 + git checkout -b bugfix-for-issue-1480 main * Commit locally as you progress (``git add`` and ``git commit``) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/networkx-2.8.7/PKG-INFO new/networkx-2.8.8/PKG-INFO --- old/networkx-2.8.7/PKG-INFO 2022-10-01 22:51:50.154833800 +0200 +++ new/networkx-2.8.8/PKG-INFO 2022-11-01 21:31:21.107464800 +0100 @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: networkx -Version: 2.8.7 +Version: 2.8.8 Summary: Python package for creating and manipulating graphs and networks Home-page: https://networkx.org/ Author: Aric Hagberg @@ -24,6 +24,7 @@ Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 Classifier: Programming Language :: Python :: 3 :: Only Classifier: Topic :: Software Development :: Libraries :: Python Modules Classifier: Topic :: Scientific/Engineering :: Bio-Informatics @@ -41,8 +42,8 @@ NetworkX ======== -.. image:: https://github.com/networkx/networkx/workflows/test/badge.svg?tag=networkx-2.8.7 - :target: https://github.com/networkx/networkx/actions?query=branch%3Anetworkx-2.8.7 +.. image:: https://github.com/networkx/networkx/workflows/test/badge.svg?tag=networkx-2.8.8 + :target: https://github.com/networkx/networkx/actions?query=branch%3Anetworkx-2.8.8 .. image:: https://codecov.io/gh/networkx/networkx/branch/main/graph/badge.svg :target: https://app.codecov.io/gh/networkx/networkx/branch/main @@ -59,7 +60,7 @@ - **Mailing list:** https://groups.google.com/forum/#!forum/networkx-discuss - **Source:** https://github.com/networkx/networkx - **Bug reports:** https://github.com/networkx/networkx/issues -- **Report a security vulnerability:** https://tidelift.com/docs/security +- **Report a security vulnerability:** https://tidelift.com/security - **Tutorial:** https://networkx.org/documentation/latest/tutorial.html - **GitHub Discussions:** https://github.com/networkx/networkx/discussions diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/networkx-2.8.7/README.rst new/networkx-2.8.8/README.rst --- old/networkx-2.8.7/README.rst 2022-10-01 22:50:53.000000000 +0200 +++ new/networkx-2.8.8/README.rst 2022-11-01 21:30:43.000000000 +0100 @@ -1,8 +1,8 @@ NetworkX ======== -.. image:: https://github.com/networkx/networkx/workflows/test/badge.svg?tag=networkx-2.8.7 - :target: https://github.com/networkx/networkx/actions?query=branch%3Anetworkx-2.8.7 +.. image:: https://github.com/networkx/networkx/workflows/test/badge.svg?tag=networkx-2.8.8 + :target: https://github.com/networkx/networkx/actions?query=branch%3Anetworkx-2.8.8 .. image:: https://codecov.io/gh/networkx/networkx/branch/main/graph/badge.svg :target: https://app.codecov.io/gh/networkx/networkx/branch/main @@ -19,7 +19,7 @@ - **Mailing list:** https://groups.google.com/forum/#!forum/networkx-discuss - **Source:** https://github.com/networkx/networkx - **Bug reports:** https://github.com/networkx/networkx/issues -- **Report a security vulnerability:** https://tidelift.com/docs/security +- **Report a security vulnerability:** https://tidelift.com/security - **Tutorial:** https://networkx.org/documentation/latest/tutorial.html - **GitHub Discussions:** https://github.com/networkx/networkx/discussions diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/networkx-2.8.7/doc/release/index.rst new/networkx-2.8.8/doc/release/index.rst --- old/networkx-2.8.7/doc/release/index.rst 2022-09-30 18:57:13.000000000 +0200 +++ new/networkx-2.8.8/doc/release/index.rst 2022-11-01 21:26:17.000000000 +0100 @@ -15,6 +15,7 @@ :maxdepth: 2 release_dev + release_2.8.8 release_2.8.7 release_2.8.6 release_2.8.5 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/networkx-2.8.7/doc/release/release_2.8.8.rst new/networkx-2.8.8/doc/release/release_2.8.8.rst --- old/networkx-2.8.7/doc/release/release_2.8.8.rst 1970-01-01 01:00:00.000000000 +0100 +++ new/networkx-2.8.8/doc/release/release_2.8.8.rst 2022-11-01 21:25:44.000000000 +0100 @@ -0,0 +1,70 @@ +NetworkX 2.8.7 +============== + +Release date: 1 November 2022 + +Supports Python 3.8, 3.9, 3.10, and 3.11. + +NetworkX is a Python package for the creation, manipulation, and study of the +structure, dynamics, and functions of complex networks. + +For more information, please visit our `website <https://networkx.org/>`_ +and our :ref:`gallery of examples <examples_gallery>`. +Please send comments and questions to the `networkx-discuss mailing list +<http://groups.google.com/group/networkx-discuss>`_. + +Highlights +---------- + +Minor documentation and bug fixes. + +Merged PRs +---------- + +- Bump release version +- Fix warnings from running tests in randomized order (#6014) +- Update pydata-sphinx-theme (#6012) +- update secutiry link to tidelift (#6019) +- Update numpydoc (#6022) +- Support Python 3.11 (#6023) +- Update linters (#6024) +- Minor updates to expanders generator tests (#6027) +- Add missing asserts to tests (#6039) +- fixes #6036 (#6080) +- Improve test coverage expanders line graph generators solved (PR for issue #6034) (#6071) +- Replace .A call with .toarray for sparse array in example. (#6106) +- Improve test coverage for algorithms/richclub.py (#6089) +- Tested boykov_kolmogorov and dinitz with cutoff (#6104) +- Improve test coverage for multigraph class (#6101) +- Improve test coverage for algorithms in dominating_set.py (PR for issue 6032) (#6068) +- Improve test coverage for graph class (#6105) +- added coverage in generators/tree.py (#6082) +- DOC: Specifically branch off main, instead of current branch (#6127) +- Improve test coverage for multidigraph class (#6131) +- Improve test coverage for digraph class (#6130) +- Improve test coverage for algorithms in dispersion.py (#6100) +- Test on Python 3.11 (#6159) +- Improve test coverage in algorithms shortest paths unweighted.py (#6121) +- Increased test coverage algorithms/matching.py (#6095) +- Renamed test functions in test_lowest_common_ancestors (#6110) +- Increase covering coverage (#6099) +- Add example for fiedler_vector (#6155) +- Improve test coverage for cycles.py (#6152) +- Added an example in all_pairs_node_connectivity (#6126) +- Amount of nodes and edges have mistakes when reading adjlist file (#6132) +- Update pytest (#6165) + +Contributors +------------ + +- Ross Barnowski +- Paula Pérez Bianchi +- DiamondJoseph +- Jarrod Millman +- Mjh9122 +- Alimi Qudirah +- Okite chimaobi Samuel +- Jefter Santiago +- Dan Schult +- Mridul Seth +- Tindi Sommers diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/networkx-2.8.7/examples/drawing/plot_eigenvalues.py new/networkx-2.8.8/examples/drawing/plot_eigenvalues.py --- old/networkx-2.8.7/examples/drawing/plot_eigenvalues.py 2021-05-31 22:28:22.000000000 +0200 +++ new/networkx-2.8.8/examples/drawing/plot_eigenvalues.py 2022-11-01 18:27:46.000000000 +0100 @@ -14,7 +14,7 @@ G = nx.gnm_random_graph(n, m, seed=5040) # Seed for reproducibility L = nx.normalized_laplacian_matrix(G) -e = numpy.linalg.eigvals(L.A) +e = numpy.linalg.eigvals(L.toarray()) print("Largest eigenvalue:", max(e)) print("Smallest eigenvalue:", min(e)) plt.hist(e, bins=100) # histogram with 100 bins diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/networkx-2.8.7/networkx/__init__.py new/networkx-2.8.8/networkx/__init__.py --- old/networkx-2.8.7/networkx/__init__.py 2022-10-01 22:46:52.000000000 +0200 +++ new/networkx-2.8.8/networkx/__init__.py 2022-11-01 21:27:06.000000000 +0100 @@ -8,7 +8,7 @@ See https://networkx.org for complete documentation. """ -__version__ = "2.8.7" +__version__ = "2.8.8" def __getattr__(name): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/networkx-2.8.7/networkx/algorithms/approximation/connectivity.py new/networkx-2.8.8/networkx/algorithms/approximation/connectivity.py --- old/networkx-2.8.7/networkx/algorithms/approximation/connectivity.py 2022-03-29 15:37:39.000000000 +0200 +++ new/networkx-2.8.8/networkx/algorithms/approximation/connectivity.py 2022-11-01 18:29:08.000000000 +0100 @@ -244,6 +244,20 @@ K : dictionary Dictionary, keyed by source and target, of pairwise node connectivity + Examples + -------- + A 3 node cycle with one extra node attached has connectivity 2 between all + nodes in the cycle and connectivity 1 between the extra node and the rest: + + >>> G = nx.cycle_graph(3) + >>> G.add_edge(2, 3) + >>> import pprint # for nice dictionary formatting + >>> pprint.pprint(nx.all_pairs_node_connectivity(G)) + {0: {1: 2, 2: 2, 3: 1}, + 1: {0: 2, 2: 2, 3: 1}, + 2: {0: 2, 1: 2, 3: 1}, + 3: {0: 1, 1: 1, 2: 1}} + See Also -------- local_node_connectivity diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/networkx-2.8.7/networkx/algorithms/approximation/tests/test_dominating_set.py new/networkx-2.8.8/networkx/algorithms/approximation/tests/test_dominating_set.py --- old/networkx-2.8.7/networkx/algorithms/approximation/tests/test_dominating_set.py 2022-06-03 01:39:15.000000000 +0200 +++ new/networkx-2.8.8/networkx/algorithms/approximation/tests/test_dominating_set.py 2022-11-01 18:28:05.000000000 +0100 @@ -1,3 +1,5 @@ +import pytest + import networkx as nx from networkx.algorithms.approximation import ( min_edge_dominating_set, @@ -37,6 +39,11 @@ G = nx.relabel_nodes(G, {0: 9, 9: 0}) assert min_weighted_dominating_set(G) == {9} + def test_null_graph(self): + """Tests that the unique dominating set for the null graph is an empty set""" + G = nx.Graph() + assert min_weighted_dominating_set(G) == set() + def test_min_edge_dominating_set(self): graph = nx.path_graph(5) dom_set = min_edge_dominating_set(graph) @@ -65,3 +72,7 @@ for dom_edge in dom_set: found |= u == dom_edge[0] or u == dom_edge[1] assert found, "Non adjacent edge found!" + + graph = nx.Graph() # empty Networkx graph + with pytest.raises(ValueError, match="Expected non-empty NetworkX graph!"): + min_edge_dominating_set(graph) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/networkx-2.8.7/networkx/algorithms/bipartite/tests/test_matching.py new/networkx-2.8.8/networkx/algorithms/bipartite/tests/test_matching.py --- old/networkx-2.8.7/networkx/algorithms/bipartite/tests/test_matching.py 2022-06-03 01:39:15.000000000 +0200 +++ new/networkx-2.8.8/networkx/algorithms/bipartite/tests/test_matching.py 2022-11-01 19:53:55.000000000 +0100 @@ -16,7 +16,7 @@ class TestMatching: """Tests for bipartite matching algorithms.""" - def setup(self): + def setup_method(self): """Creates a bipartite graph for use in testing matching algorithms. The bipartite graph has a maximum cardinality matching that leaves diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/networkx-2.8.7/networkx/algorithms/centrality/tests/test_dispersion.py new/networkx-2.8.8/networkx/algorithms/centrality/tests/test_dispersion.py --- old/networkx-2.8.7/networkx/algorithms/centrality/tests/test_dispersion.py 2022-06-04 19:36:56.000000000 +0200 +++ new/networkx-2.8.8/networkx/algorithms/centrality/tests/test_dispersion.py 2022-11-01 18:28:33.000000000 +0100 @@ -58,6 +58,13 @@ assert len(disp_Gu) == len(G) - 1 assert isinstance(disp_uv, float) + def test_dispersion_v_only(self): + G = small_ego_G() + disp_G_h = nx.dispersion(G, v="h", normalized=False) + disp_G_h_normalized = nx.dispersion(G, v="h", normalized=True) + assert disp_G_h == {"c": 0, "f": 0, "j": 0, "k": 0, "u": 4} + assert disp_G_h_normalized == {"c": 0.0, "f": 0.0, "j": 0.0, "k": 0.0, "u": 1.0} + def test_impossible_things(self): G = nx.karate_club_graph() disp = nx.dispersion(G) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/networkx-2.8.7/networkx/algorithms/centrality/tests/test_load_centrality.py new/networkx-2.8.8/networkx/algorithms/centrality/tests/test_load_centrality.py --- old/networkx-2.8.7/networkx/algorithms/centrality/tests/test_load_centrality.py 2022-06-03 01:39:15.000000000 +0200 +++ new/networkx-2.8.8/networkx/algorithms/centrality/tests/test_load_centrality.py 2022-11-01 18:27:34.000000000 +0100 @@ -24,6 +24,7 @@ cls.P3 = nx.path_graph(3) cls.P4 = nx.path_graph(4) cls.K5 = nx.complete_graph(5) + cls.P2 = nx.path_graph(2) cls.C4 = nx.cycle_graph(4) cls.T = nx.balanced_tree(r=2, h=2) @@ -41,6 +42,13 @@ assert result[n] == pytest.approx(b[n], abs=1e-3) assert result[n] == pytest.approx(nx.load_centrality(self.D, n), abs=1e-3) + def test_P2_normalized_load(self): + G = self.P2 + c = nx.load_centrality(G, normalized=True) + d = {0: 0.000, 1: 0.000} + for n in sorted(G): + assert c[n] == pytest.approx(d[n], abs=1e-3) + def test_weighted_load(self): b = nx.load_centrality(self.G, weight="weight", normalized=False) for n in sorted(self.G): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/networkx-2.8.7/networkx/algorithms/community/tests/test_kclique.py new/networkx-2.8.8/networkx/algorithms/community/tests/test_kclique.py --- old/networkx-2.8.7/networkx/algorithms/community/tests/test_kclique.py 2021-05-31 22:28:22.000000000 +0200 +++ new/networkx-2.8.8/networkx/algorithms/community/tests/test_kclique.py 2022-11-01 19:53:55.000000000 +0100 @@ -25,7 +25,7 @@ class TestZacharyKarateClub: - def setup(self): + def setup_method(self): self.G = nx.karate_club_graph() def _check_communities(self, k, expected): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/networkx-2.8.7/networkx/algorithms/connectivity/kcutsets.py new/networkx-2.8.8/networkx/algorithms/connectivity/kcutsets.py --- old/networkx-2.8.7/networkx/algorithms/connectivity/kcutsets.py 2022-06-03 01:39:15.000000000 +0200 +++ new/networkx-2.8.8/networkx/algorithms/connectivity/kcutsets.py 2022-11-01 18:29:08.000000000 +0100 @@ -39,9 +39,10 @@ computed. Default value: None. flow_func : function - Function to perform the underlying flow computations. Default value - edmonds_karp. This function performs better in sparse graphs with - right tailed degree distributions. shortest_augmenting_path will + Function to perform the underlying flow computations. Default value is + :func:`~networkx.algorithms.flow.edmonds_karp`. This function performs + better in sparse graphs with right tailed degree distributions. + :func:`~networkx.algorithms.flow.shortest_augmenting_path` will perform better in denser graphs. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/networkx-2.8.7/networkx/algorithms/flow/tests/test_maxflow.py new/networkx-2.8.8/networkx/algorithms/flow/tests/test_maxflow.py --- old/networkx-2.8.7/networkx/algorithms/flow/tests/test_maxflow.py 2022-06-03 01:39:15.000000000 +0200 +++ new/networkx-2.8.8/networkx/algorithms/flow/tests/test_maxflow.py 2022-11-01 19:53:55.000000000 +0100 @@ -386,7 +386,7 @@ class TestMaxFlowMinCutInterface: - def setup(self): + def setup_method(self): G = nx.DiGraph() G.add_edge("x", "a", capacity=3.0) G.add_edge("x", "b", capacity=1.0) @@ -539,11 +539,20 @@ assert k <= R.graph["flow_value"] <= (2 * k) R = edmonds_karp(G, "s", "t", cutoff=k) assert k <= R.graph["flow_value"] <= (2 * k) + R = dinitz(G, "s", "t", cutoff=k) + assert k <= R.graph["flow_value"] <= (2 * k) + R = boykov_kolmogorov(G, "s", "t", cutoff=k) + assert k <= R.graph["flow_value"] <= (2 * k) def test_complete_graph_cutoff(self): G = nx.complete_graph(5) nx.set_edge_attributes(G, {(u, v): 1 for u, v in G.edges()}, "capacity") - for flow_func in [shortest_augmenting_path, edmonds_karp]: + for flow_func in [ + shortest_augmenting_path, + edmonds_karp, + dinitz, + boykov_kolmogorov, + ]: for cutoff in [3, 2, 1]: result = nx.maximum_flow_value( G, 0, 4, flow_func=flow_func, cutoff=cutoff diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/networkx-2.8.7/networkx/algorithms/isomorphism/tests/test_match_helpers.py new/networkx-2.8.8/networkx/algorithms/isomorphism/tests/test_match_helpers.py --- old/networkx-2.8.7/networkx/algorithms/isomorphism/tests/test_match_helpers.py 2022-06-03 01:39:15.000000000 +0200 +++ new/networkx-2.8.8/networkx/algorithms/isomorphism/tests/test_match_helpers.py 2022-11-01 19:53:55.000000000 +0100 @@ -11,7 +11,7 @@ class TestGenericMultiEdgeMatch: - def setup(self): + def setup_method(self): self.G1 = nx.MultiDiGraph() self.G2 = nx.MultiDiGraph() self.G3 = nx.MultiDiGraph() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/networkx-2.8.7/networkx/algorithms/shortest_paths/tests/test_unweighted.py new/networkx-2.8.8/networkx/algorithms/shortest_paths/tests/test_unweighted.py --- old/networkx-2.8.7/networkx/algorithms/shortest_paths/tests/test_unweighted.py 2021-05-31 22:28:22.000000000 +0200 +++ new/networkx-2.8.8/networkx/algorithms/shortest_paths/tests/test_unweighted.py 2022-11-01 18:28:42.000000000 +0100 @@ -1,3 +1,5 @@ +import pytest + import networkx as nx @@ -32,6 +34,24 @@ 4, 4, 1, 12, nx.bidirectional_shortest_path(self.grid, 1, 12) ) assert nx.bidirectional_shortest_path(self.directed_cycle, 0, 3) == [0, 1, 2, 3] + # test source = target + assert nx.bidirectional_shortest_path(self.cycle, 3, 3) == [3] + + @pytest.mark.parametrize( + ("src", "tgt"), + ( + (8, 3), # source not in graph + (3, 8), # target not in graph + (8, 10), # neither source nor target in graph + (8, 8), # src == tgt, neither in graph - tests order of input checks + ), + ) + def test_bidirectional_shortest_path_src_tgt_not_in_graph(self, src, tgt): + with pytest.raises( + nx.NodeNotFound, + match=f"Either source {src} or target {tgt} is not in G", + ): + nx.bidirectional_shortest_path(self.cycle, src, tgt) def test_shortest_path_length(self): assert nx.shortest_path_length(self.cycle, 0, 3) == 3 @@ -64,6 +84,10 @@ assert p[3] == [3, 2, 1, 0] p = nx.single_target_shortest_path(self.cycle, 0, cutoff=0) assert p == {0: [0]} + # test missing targets + target = 8 + with pytest.raises(nx.NodeNotFound, match=f"Target {target} not in G"): + nx.single_target_shortest_path(self.cycle, target) def test_single_target_shortest_path_length(self): pl = nx.single_target_shortest_path_length @@ -71,6 +95,10 @@ assert dict(pl(self.cycle, 0)) == lengths lengths = {0: 0, 1: 6, 2: 5, 3: 4, 4: 3, 5: 2, 6: 1} assert dict(pl(self.directed_cycle, 0)) == lengths + # test missing targets + target = 8 + with pytest.raises(nx.NodeNotFound, match=f"Target {target} is not in G"): + nx.single_target_shortest_path_length(self.cycle, target) def test_all_pairs_shortest_path(self): p = dict(nx.all_pairs_shortest_path(self.cycle)) @@ -114,3 +142,8 @@ p, s = nx.predecessor(G, 0, 3, cutoff=2, return_seen=True) assert p == [] assert s == -1 + + def test_predecessor_missing_source(self): + source = 8 + with pytest.raises(nx.NodeNotFound, match=f"Source {source} not in G"): + nx.predecessor(self.cycle, source) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/networkx-2.8.7/networkx/algorithms/shortest_paths/tests/test_weighted.py new/networkx-2.8.8/networkx/algorithms/shortest_paths/tests/test_weighted.py --- old/networkx-2.8.7/networkx/algorithms/shortest_paths/tests/test_weighted.py 2022-03-29 16:02:47.000000000 +0200 +++ new/networkx-2.8.8/networkx/algorithms/shortest_paths/tests/test_weighted.py 2022-11-01 19:53:55.000000000 +0100 @@ -36,7 +36,7 @@ """ - def setup(self): + def setup_method(self): """Creates some graphs for use in the unit tests.""" cnlti = nx.convert_node_labels_to_integers self.grid = cnlti(nx.grid_2d_graph(4, 4), first_label=1, ordering="sorted") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/networkx-2.8.7/networkx/algorithms/tests/test_covering.py new/networkx-2.8.8/networkx/algorithms/tests/test_covering.py --- old/networkx-2.8.7/networkx/algorithms/tests/test_covering.py 2022-04-25 23:17:15.000000000 +0200 +++ new/networkx-2.8.8/networkx/algorithms/tests/test_covering.py 2022-11-01 18:28:55.000000000 +0100 @@ -1,3 +1,5 @@ +import pytest + import networkx as nx @@ -13,6 +15,15 @@ G.add_edge(0, 0) assert nx.min_edge_cover(G) == {(0, 0)} + def test_graph_with_isolated_v(self): + G = nx.Graph() + G.add_node(1) + with pytest.raises( + nx.NetworkXException, + match="Graph has a node with no edge incident on it, so no edge cover exists.", + ): + nx.min_edge_cover(G) + def test_graph_single_edge(self): G = nx.Graph([(0, 1)]) assert nx.min_edge_cover(G) in ({(0, 1)}, {(1, 0)}) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/networkx-2.8.7/networkx/algorithms/tests/test_cycles.py new/networkx-2.8.8/networkx/algorithms/tests/test_cycles.py --- old/networkx-2.8.7/networkx/algorithms/tests/test_cycles.py 2022-06-03 01:39:15.000000000 +0200 +++ new/networkx-2.8.8/networkx/algorithms/tests/test_cycles.py 2022-11-01 18:29:04.000000000 +0100 @@ -50,6 +50,15 @@ G = nx.MultiGraph() cy = networkx.cycle_basis(G, 0) + def test_cycle_basis_self_loop(self): + """Tests the function for graphs with self loops""" + G = nx.Graph() + nx.add_cycle(G, [0, 1, 2, 3]) + nx.add_cycle(G, [0, 0, 6, 2]) + cy = nx.cycle_basis(G) + sort_cy = sorted(sorted(c) for c in cy) + assert sort_cy == [[0], [0, 1, 2], [0, 2, 3], [0, 2, 6]] + def test_simple_cycles(self): edges = [(0, 0), (0, 1), (0, 2), (1, 2), (2, 0), (2, 1), (2, 2)] G = nx.DiGraph(edges) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/networkx-2.8.7/networkx/algorithms/tests/test_lowest_common_ancestors.py new/networkx-2.8.8/networkx/algorithms/tests/test_lowest_common_ancestors.py --- old/networkx-2.8.7/networkx/algorithms/tests/test_lowest_common_ancestors.py 2022-08-21 19:03:33.000000000 +0200 +++ new/networkx-2.8.8/networkx/algorithms/tests/test_lowest_common_ancestors.py 2022-11-01 18:28:51.000000000 +0100 @@ -51,39 +51,33 @@ for (a, b) in ((min(pair), max(pair)) for pair in chain(d1, d2)): assert get_pair(d1, a, b) == get_pair(d2, a, b) - def test_tree_all_pairs_lowest_common_ancestor1(self): - """Specifying the root is optional.""" + def test_tree_all_pairs_lca_default_root(self): assert dict(tree_all_pairs_lca(self.DG)) == self.ans - def test_tree_all_pairs_lowest_common_ancestor2(self): - """Specifying only some pairs gives only those pairs.""" + def test_tree_all_pairs_lca_return_subset(self): test_pairs = [(0, 1), (0, 1), (1, 0)] ans = dict(tree_all_pairs_lca(self.DG, 0, test_pairs)) assert (0, 1) in ans and (1, 0) in ans assert len(ans) == 2 - def test_tree_all_pairs_lowest_common_ancestor3(self): - """Specifying no pairs same as specifying all.""" + def test_tree_all_pairs_lca(self): all_pairs = chain(combinations(self.DG, 2), ((node, node) for node in self.DG)) ans = dict(tree_all_pairs_lca(self.DG, 0, all_pairs)) self.assert_has_same_pairs(ans, self.ans) - def test_tree_all_pairs_lowest_common_ancestor4(self): - """Gives the right answer.""" + def test_tree_all_pairs_gold_example(self): ans = dict(tree_all_pairs_lca(self.DG)) self.assert_has_same_pairs(self.gold, ans) - def test_tree_all_pairs_lowest_common_ancestor5(self): - """Handles invalid input correctly.""" + def test_tree_all_pairs_lca_invalid_input(self): empty_digraph = tree_all_pairs_lca(nx.DiGraph()) pytest.raises(nx.NetworkXPointlessConcept, list, empty_digraph) bad_pairs_digraph = tree_all_pairs_lca(self.DG, pairs=[(-1, -2)]) pytest.raises(nx.NodeNotFound, list, bad_pairs_digraph) - def test_tree_all_pairs_lowest_common_ancestor6(self): - """Works on subtrees.""" + def test_tree_all_pairs_lca_subtrees(self): ans = dict(tree_all_pairs_lca(self.DG, 1)) gold = { pair: lca @@ -92,8 +86,7 @@ } self.assert_has_same_pairs(gold, ans) - def test_tree_all_pairs_lowest_common_ancestor7(self): - """Works on disconnected nodes.""" + def test_tree_all_pairs_lca_disconnected_nodes(self): G = nx.DiGraph() G.add_node(1) assert {(1, 1): 1} == dict(tree_all_pairs_lca(G)) @@ -104,8 +97,7 @@ pytest.raises(nx.NetworkXError, list, tree_all_pairs_lca(G)) - def test_tree_all_pairs_lowest_common_ancestor8(self): - """Raises right errors if not a tree.""" + def test_tree_all_pairs_lca_error_if_input_not_tree(self): # Cycle G = nx.DiGraph([(1, 2), (2, 1)]) pytest.raises(nx.NetworkXError, list, tree_all_pairs_lca(G)) @@ -113,27 +105,24 @@ G = nx.DiGraph([(0, 2), (1, 2)]) pytest.raises(nx.NetworkXError, list, tree_all_pairs_lca(G)) - def test_tree_all_pairs_lowest_common_ancestor9(self): - """Test that pairs works correctly as a generator.""" + def test_tree_all_pairs_lca_generator(self): pairs = iter([(0, 1), (0, 1), (1, 0)]) some_pairs = dict(tree_all_pairs_lca(self.DG, 0, pairs)) assert (0, 1) in some_pairs and (1, 0) in some_pairs assert len(some_pairs) == 2 - def test_tree_all_pairs_lowest_common_ancestor10(self): - """Test that pairs not in the graph raises error.""" + def test_tree_all_pairs_lca_nonexisting_pairs_exception(self): lca = tree_all_pairs_lca(self.DG, 0, [(-1, -1)]) pytest.raises(nx.NodeNotFound, list, lca) # check if node is None lca = tree_all_pairs_lca(self.DG, None, [(-1, -1)]) pytest.raises(nx.NodeNotFound, list, lca) - def test_tree_all_pairs_lowest_common_ancestor12(self): - """Test that tree routine bails on DAGs.""" + def test_tree_all_pairs_lca_routine_bails_on_DAGs(self): G = nx.DiGraph([(3, 4), (5, 4)]) pytest.raises(nx.NetworkXError, list, tree_all_pairs_lca(G)) - def test_not_implemented_for(self): + def test_tree_all_pairs_lca_not_implemented(self): NNI = nx.NetworkXNotImplemented G = nx.Graph([(0, 1)]) with pytest.raises(NNI): @@ -154,8 +143,7 @@ next(all_pairs_lca(G)) pytest.raises(NNI, nx.lowest_common_ancestor, G, 0, 1) - def test_tree_all_pairs_lowest_common_ancestor13(self): - """Test that it works on non-empty trees with no LCAs.""" + def test_tree_all_pairs_lca_trees_without_LCAs(self): G = nx.DiGraph() G.add_node(3) ans = list(tree_all_pairs_lca(G)) @@ -232,24 +220,20 @@ root_distance[get_pair(d1, a, b)] == root_distance[get_pair(d2, a, b)] ) - def test_all_pairs_lowest_common_ancestor1(self): - """Produces the correct results.""" + def test_all_pairs_lca_gold_example(self): self.assert_lca_dicts_same(dict(all_pairs_lca(self.DG)), self.gold) - def test_all_pairs_lowest_common_ancestor2(self): - """Produces the correct results when all pairs given.""" + def test_all_pairs_lca_all_pairs_given(self): all_pairs = list(product(self.DG.nodes(), self.DG.nodes())) ans = all_pairs_lca(self.DG, pairs=all_pairs) self.assert_lca_dicts_same(dict(ans), self.gold) - def test_all_pairs_lowest_common_ancestor3(self): - """Produces the correct results when all pairs given as a generator.""" + def test_all_pairs_lca_generator(self): all_pairs = product(self.DG.nodes(), self.DG.nodes()) ans = all_pairs_lca(self.DG, pairs=all_pairs) self.assert_lca_dicts_same(dict(ans), self.gold) - def test_all_pairs_lowest_common_ancestor4(self): - """Graph with two roots.""" + def test_all_pairs_lca_input_graph_with_two_roots(self): G = self.DG.copy() G.add_edge(9, 10) G.add_edge(9, 4) @@ -268,52 +252,43 @@ G.add_edge(-1, 0) self.assert_lca_dicts_same(testing, gold, G) - def test_all_pairs_lowest_common_ancestor5(self): - """Test that pairs not in the graph raises error.""" + def test_all_pairs_lca_nonexisting_pairs_exception(self): pytest.raises(nx.NodeNotFound, all_pairs_lca, self.DG, [(-1, -1)]) - def test_all_pairs_lowest_common_ancestor6(self): - """Test that pairs with no LCA specified emits nothing.""" + def test_all_pairs_lca_pairs_without_lca(self): G = self.DG.copy() G.add_node(-1) gen = all_pairs_lca(G, [(-1, -1), (-1, 0)]) assert dict(gen) == {(-1, -1): -1} - def test_all_pairs_lowest_common_ancestor7(self): - """Test that LCA on null graph bails.""" + def test_all_pairs_lca_null_graph(self): pytest.raises(nx.NetworkXPointlessConcept, all_pairs_lca, nx.DiGraph()) - def test_all_pairs_lowest_common_ancestor8(self): - """Test that LCA on non-dags bails.""" + def test_all_pairs_lca_non_dags(self): pytest.raises(nx.NetworkXError, all_pairs_lca, nx.DiGraph([(3, 4), (4, 3)])) - def test_all_pairs_lowest_common_ancestor9(self): - """Test that it works on non-empty graphs with no LCAs.""" + def test_all_pairs_lca_nonempty_graph_without_lca(self): G = nx.DiGraph() G.add_node(3) ans = list(all_pairs_lca(G)) assert ans == [((3, 3), 3)] - def test_all_pairs_lowest_common_ancestor10(self): - """Test that it works on a small graph that previously revealed a bug gh-4942""" + def test_all_pairs_lca_bug_gh4942(self): G = nx.DiGraph([(0, 2), (1, 2), (2, 3)]) ans = list(all_pairs_lca(G)) assert len(ans) == 9 - def test_lowest_common_ancestor1(self): - """Test that the one-pair function works on default.""" + def test_all_pairs_lca_default_kwarg(self): G = nx.DiGraph([(0, 1), (2, 1)]) sentinel = object() assert nx.lowest_common_ancestor(G, 0, 2, default=sentinel) is sentinel - def test_lowest_common_ancestor2(self): - """Test that the one-pair function works on identity.""" + def test_all_pairs_lca_identity(self): G = nx.DiGraph() G.add_node(3) assert nx.lowest_common_ancestor(G, 3, 3) == 3 - def test_naive_lowest_common_ancestor1(self): - """Test that the one-pair function works for issue #4574.""" + def test_all_pairs_lca_issue_4574(self): G = nx.DiGraph() G.add_nodes_from(range(17)) G.add_edges_from( @@ -339,8 +314,7 @@ assert nx.lowest_common_ancestor(G, 7, 9) == None - def test_naive_lowest_common_ancestor2(self): - """Test that the one-pair function works for issue #4942.""" + def test_all_pairs_lca_one_pair_gh4942(self): G = nx.DiGraph() G.add_edge(0, 1) G.add_edge(2, 0) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/networkx-2.8.7/networkx/algorithms/tests/test_matching.py new/networkx-2.8.8/networkx/algorithms/tests/test_matching.py --- old/networkx-2.8.7/networkx/algorithms/tests/test_matching.py 2022-06-03 01:39:15.000000000 +0200 +++ new/networkx-2.8.8/networkx/algorithms/tests/test_matching.py 2022-11-01 19:53:50.000000000 +0100 @@ -450,7 +450,7 @@ assert not nx.is_matching(G, {(0, 0), (1, 2), (2, 3)}) # selfloop edge in G G.add_edge(0, 0) - assert not nx.is_matching(G, {(0, 0), (1, 2), (2, 3)}) + assert not nx.is_matching(G, {(0, 0), (1, 2)}) def test_invalid_matching(self): G = nx.path_graph(4) @@ -476,6 +476,16 @@ G = nx.path_graph(4) assert nx.is_maximal_matching(G, {0: 1, 1: 0, 2: 3, 3: 2}) + def test_invalid_input(self): + error = nx.NetworkXError + G = nx.path_graph(4) + # edge to node not in G + raises(error, nx.is_maximal_matching, G, {(0, 5)}) + raises(error, nx.is_maximal_matching, G, {(5, 0)}) + # edge not a 2-tuple + raises(error, nx.is_maximal_matching, G, {(0, 1, 2), (2, 3)}) + raises(error, nx.is_maximal_matching, G, {(0,), (2, 3)}) + def test_valid(self): G = nx.path_graph(4) assert nx.is_maximal_matching(G, {(0, 1), (2, 3)}) @@ -483,6 +493,9 @@ def test_not_matching(self): G = nx.path_graph(4) assert not nx.is_maximal_matching(G, {(0, 1), (1, 2), (2, 3)}) + assert not nx.is_maximal_matching(G, {(0, 3)}) + G.add_edge(0, 0) + assert not nx.is_maximal_matching(G, {(0, 0)}) def test_not_maximal(self): G = nx.path_graph(4) @@ -511,8 +524,30 @@ assert nx.is_perfect_matching(G, {(1, 4), (0, 3), (5, 2)}) + def test_invalid_input(self): + error = nx.NetworkXError + G = nx.path_graph(4) + # edge to node not in G + raises(error, nx.is_perfect_matching, G, {(0, 5)}) + raises(error, nx.is_perfect_matching, G, {(5, 0)}) + # edge not a 2-tuple + raises(error, nx.is_perfect_matching, G, {(0, 1, 2), (2, 3)}) + raises(error, nx.is_perfect_matching, G, {(0,), (2, 3)}) + + def test_selfloops(self): + error = nx.NetworkXError + G = nx.path_graph(4) + # selfloop for node not in G + raises(error, nx.is_perfect_matching, G, {(5, 5), (2, 3)}) + # selfloop edge not in G + assert not nx.is_perfect_matching(G, {(0, 0), (1, 2), (2, 3)}) + # selfloop edge in G + G.add_edge(0, 0) + assert not nx.is_perfect_matching(G, {(0, 0), (1, 2)}) + def test_not_matching(self): G = nx.path_graph(4) + assert not nx.is_perfect_matching(G, {(0, 3)}) assert not nx.is_perfect_matching(G, {(0, 1), (1, 2), (2, 3)}) def test_maximal_but_not_perfect(self): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/networkx-2.8.7/networkx/algorithms/tests/test_richclub.py new/networkx-2.8.8/networkx/algorithms/tests/test_richclub.py --- old/networkx-2.8.7/networkx/algorithms/tests/test_richclub.py 2022-06-03 01:39:15.000000000 +0200 +++ new/networkx-2.8.8/networkx/algorithms/tests/test_richclub.py 2022-11-01 18:27:51.000000000 +0100 @@ -80,6 +80,17 @@ nx.rich_club_coefficient(G) +def test_rich_club_selfloop(): + G = nx.Graph() # or DiGraph, MultiGraph, MultiDiGraph, etc + G.add_edge(1, 1) # self loop + G.add_edge(1, 2) + with pytest.raises( + Exception, + match="rich_club_coefficient is not implemented for " "graphs with self loops.", + ): + nx.rich_club_coefficient(G) + + # def test_richclub2_normalized(): # T = nx.balanced_tree(2,10) # rcNorm = nx.richclub.rich_club_coefficient(T,Q=2) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/networkx-2.8.7/networkx/algorithms/tests/test_structuralholes.py new/networkx-2.8.8/networkx/algorithms/tests/test_structuralholes.py --- old/networkx-2.8.7/networkx/algorithms/tests/test_structuralholes.py 2022-06-03 01:39:15.000000000 +0200 +++ new/networkx-2.8.8/networkx/algorithms/tests/test_structuralholes.py 2022-11-01 19:53:55.000000000 +0100 @@ -18,7 +18,7 @@ """ - def setup(self): + def setup_method(self): self.D = nx.DiGraph() self.D.add_edges_from([(0, 1), (0, 2), (1, 0), (2, 1)]) self.D_weights = {(0, 1): 2, (0, 2): 2, (1, 0): 1, (2, 1): 1} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/networkx-2.8.7/networkx/algorithms/tree/tests/test_mst.py new/networkx-2.8.8/networkx/algorithms/tree/tests/test_mst.py --- old/networkx-2.8.7/networkx/algorithms/tree/tests/test_mst.py 2022-06-08 18:11:41.000000000 +0200 +++ new/networkx-2.8.8/networkx/algorithms/tree/tests/test_mst.py 2022-11-01 19:53:55.000000000 +0100 @@ -283,7 +283,7 @@ Order of Increasing Cost """ - def setup(self): + def setup_method(self): # Original Graph edges = [(0, 1, 5), (1, 2, 4), (1, 4, 6), (2, 3, 5), (2, 4, 7), (3, 4, 3)] self.G = nx.Graph() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/networkx-2.8.7/networkx/classes/tests/test_coreviews.py new/networkx-2.8.8/networkx/classes/tests/test_coreviews.py --- old/networkx-2.8.7/networkx/classes/tests/test_coreviews.py 2022-09-30 18:57:13.000000000 +0200 +++ new/networkx-2.8.8/networkx/classes/tests/test_coreviews.py 2022-11-01 19:53:55.000000000 +0100 @@ -7,7 +7,7 @@ class TestAtlasView: # node->data - def setup(self): + def setup_method(self): self.d = {0: {"color": "blue", "weight": 1.2}, 1: {}, 2: {"color": 1}} self.av = nx.classes.coreviews.AtlasView(self.d) @@ -62,7 +62,7 @@ class TestAdjacencyView: # node->nbr->data - def setup(self): + def setup_method(self): dd = {"color": "blue", "weight": 1.2} self.nd = {0: dd, 1: {}, 2: {"color": 1}} self.adj = {3: self.nd, 0: {3: dd}, 1: {}, 2: {3: {"color": 1}}} @@ -114,7 +114,7 @@ class TestMultiAdjacencyView(TestAdjacencyView): # node->nbr->key->data - def setup(self): + def setup_method(self): dd = {"color": "blue", "weight": 1.2} self.kd = {0: dd, 1: {}, 2: {"color": 1}} self.nd = {3: self.kd, 0: {3: dd}, 1: {0: {}}, 2: {3: {"color": 1}}} @@ -143,7 +143,7 @@ class TestUnionAtlas: # node->data - def setup(self): + def setup_method(self): self.s = {0: {"color": "blue", "weight": 1.2}, 1: {}, 2: {"color": 1}} self.p = {3: {"color": "blue", "weight": 1.2}, 4: {}, 2: {"watch": 2}} self.av = nx.classes.coreviews.UnionAtlas(self.s, self.p) @@ -199,7 +199,7 @@ class TestUnionAdjacency: # node->nbr->data - def setup(self): + def setup_method(self): dd = {"color": "blue", "weight": 1.2} self.nd = {0: dd, 1: {}, 2: {"color": 1}} self.s = {3: self.nd, 0: {}, 1: {}, 2: {3: {"color": 1}}} @@ -249,7 +249,7 @@ class TestUnionMultiInner(TestUnionAdjacency): # nbr->key->data - def setup(self): + def setup_method(self): dd = {"color": "blue", "weight": 1.2} self.kd = {7: {}, "ekey": {}, 9: {"color": 1}} self.s = {3: self.kd, 0: {7: dd}, 1: {}, 2: {"key": {"color": 1}}} @@ -284,7 +284,7 @@ class TestUnionMultiAdjacency(TestUnionAdjacency): # node->nbr->key->data - def setup(self): + def setup_method(self): dd = {"color": "blue", "weight": 1.2} self.kd = {7: {}, 8: {}, 9: {"color": 1}} self.nd = {3: self.kd, 0: {9: dd}, 1: {8: {}}, 2: {9: {"color": 1}}} @@ -314,7 +314,7 @@ class TestFilteredGraphs: - def setup(self): + def setup_method(self): self.Graphs = [nx.Graph, nx.DiGraph, nx.MultiGraph, nx.MultiDiGraph] def test_hide_show_nodes(self): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/networkx-2.8.7/networkx/classes/tests/test_digraph.py new/networkx-2.8.8/networkx/classes/tests/test_digraph.py --- old/networkx-2.8.7/networkx/classes/tests/test_digraph.py 2022-07-18 22:43:59.000000000 +0200 +++ new/networkx-2.8.8/networkx/classes/tests/test_digraph.py 2022-11-01 18:28:29.000000000 +0100 @@ -244,6 +244,8 @@ assert G.adj == {0: {1: {}}, 1: {}} assert G.succ == {0: {1: {}}, 1: {}} assert G.pred == {0: {}, 1: {0: {}}} + with pytest.raises(ValueError, match="None cannot be a node"): + G.add_edge(None, 3) def test_add_edges_from(self): G = self.Graph() @@ -258,6 +260,8 @@ G.add_edges_from([(0, 1, 2, 3)]) # too many in tuple with pytest.raises(TypeError): G.add_edges_from([0]) # not a tuple + with pytest.raises(ValueError, match="None cannot be a node"): + G.add_edges_from([(None, 3), (3, 2)]) def test_remove_edge(self): G = self.K3.copy() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/networkx-2.8.7/networkx/classes/tests/test_graph.py new/networkx-2.8.8/networkx/classes/tests/test_graph.py --- old/networkx-2.8.7/networkx/classes/tests/test_graph.py 2022-08-21 18:29:48.000000000 +0200 +++ new/networkx-2.8.8/networkx/classes/tests/test_graph.py 2022-11-01 18:28:10.000000000 +0100 @@ -683,6 +683,9 @@ G = self.Graph() G.add_edge(*(0, 1)) assert G.adj == {0: {1: {}}, 1: {0: {}}} + G = self.Graph() + with pytest.raises(ValueError): + G.add_edge(None, "anything") def test_add_edges_from(self): G = self.Graph() @@ -706,6 +709,8 @@ G.add_edges_from([(0, 1, 2, 3)]) # too many in tuple with pytest.raises(TypeError): G.add_edges_from([0]) # not a tuple + with pytest.raises(ValueError): + G.add_edges_from([(None, 3), (3, 2)]) # None cannot be a node def test_remove_edge(self): G = self.K3.copy() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/networkx-2.8.7/networkx/classes/tests/test_graphviews.py new/networkx-2.8.8/networkx/classes/tests/test_graphviews.py --- old/networkx-2.8.7/networkx/classes/tests/test_graphviews.py 2022-09-30 18:57:13.000000000 +0200 +++ new/networkx-2.8.8/networkx/classes/tests/test_graphviews.py 2022-11-01 19:53:55.000000000 +0100 @@ -7,7 +7,7 @@ class TestReverseView: - def setup(self): + def setup_method(self): self.G = nx.path_graph(9, create_using=nx.DiGraph()) self.rv = nx.reverse_view(self.G) @@ -55,7 +55,7 @@ class TestMultiReverseView: - def setup(self): + def setup_method(self): self.G = nx.path_graph(9, create_using=nx.MultiDiGraph()) self.G.add_edge(4, 5) self.rv = nx.reverse_view(self.G) @@ -98,7 +98,7 @@ class TestToDirected: - def setup(self): + def setup_method(self): self.G = nx.path_graph(9) self.dv = nx.to_directed(self.G) self.MG = nx.path_graph(9, create_using=nx.MultiGraph()) @@ -137,7 +137,7 @@ class TestToUndirected: - def setup(self): + def setup_method(self): self.DG = nx.path_graph(9, create_using=nx.DiGraph()) self.uv = nx.to_undirected(self.DG) self.MDG = nx.path_graph(9, create_using=nx.MultiDiGraph()) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/networkx-2.8.7/networkx/classes/tests/test_multidigraph.py new/networkx-2.8.8/networkx/classes/tests/test_multidigraph.py --- old/networkx-2.8.7/networkx/classes/tests/test_multidigraph.py 2022-07-18 22:43:59.000000000 +0200 +++ new/networkx-2.8.8/networkx/classes/tests/test_multidigraph.py 2022-11-01 18:28:24.000000000 +0100 @@ -285,6 +285,8 @@ assert G._adj == {0: {1: {0: {}}}, 1: {}} assert G._succ == {0: {1: {0: {}}}, 1: {}} assert G._pred == {0: {}, 1: {0: {0: {}}}} + with pytest.raises(ValueError, match="None cannot be a node"): + G.add_edge(None, 3) def test_add_edges_from(self): G = self.Graph() @@ -321,6 +323,8 @@ pytest.raises(nx.NetworkXError, G.add_edges_from, [(0, 1, 2, 3, 4)]) # not a tuple pytest.raises(TypeError, G.add_edges_from, [0]) + with pytest.raises(ValueError, match="None cannot be a node"): + G.add_edges_from([(None, 3), (3, 2)]) def test_remove_edge(self): G = self.K3 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/networkx-2.8.7/networkx/classes/tests/test_multigraph.py new/networkx-2.8.8/networkx/classes/tests/test_multigraph.py --- old/networkx-2.8.7/networkx/classes/tests/test_multigraph.py 2022-07-18 22:43:59.000000000 +0200 +++ new/networkx-2.8.8/networkx/classes/tests/test_multigraph.py 2022-11-01 18:28:01.000000000 +0100 @@ -303,6 +303,9 @@ G = self.Graph() G.add_edge(*(0, 1)) assert G.adj == {0: {1: {0: {}}}, 1: {0: {0: {}}}} + G = self.Graph() + with pytest.raises(ValueError): + G.add_edge(None, "anything") def test_add_edge_conflicting_key(self): G = self.Graph() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/networkx-2.8.7/networkx/drawing/tests/test_pylab.py new/networkx-2.8.8/networkx/drawing/tests/test_pylab.py --- old/networkx-2.8.7/networkx/drawing/tests/test_pylab.py 2022-06-03 01:39:15.000000000 +0200 +++ new/networkx-2.8.8/networkx/drawing/tests/test_pylab.py 2022-11-01 19:53:50.000000000 +0100 @@ -485,18 +485,19 @@ def test_alpha_iter(): pos = nx.random_layout(barbell) + fig = plt.figure() # with fewer alpha elements than nodes - plt.subplot(131) + fig.add_subplot(131) # Each test in a new axis object nx.draw_networkx_nodes(barbell, pos, alpha=[0.1, 0.2]) # with equal alpha elements and nodes num_nodes = len(barbell.nodes) alpha = [x / num_nodes for x in range(num_nodes)] colors = range(num_nodes) - plt.subplot(132) + fig.add_subplot(132) nx.draw_networkx_nodes(barbell, pos, node_color=colors, alpha=alpha) # with more alpha elements than nodes alpha.append(1) - plt.subplot(133) + fig.add_subplot(133) nx.draw_networkx_nodes(barbell, pos, alpha=alpha) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/networkx-2.8.7/networkx/generators/tests/test_expanders.py new/networkx-2.8.8/networkx/generators/tests/test_expanders.py --- old/networkx-2.8.7/networkx/generators/tests/test_expanders.py 2022-06-03 01:39:15.000000000 +0200 +++ new/networkx-2.8.8/networkx/generators/tests/test_expanders.py 2022-11-01 18:27:41.000000000 +0100 @@ -5,69 +5,83 @@ import pytest import networkx as nx -from networkx import adjacency_matrix, number_of_nodes -from networkx.generators.expanders import ( - chordal_cycle_graph, - margulis_gabber_galil_graph, - paley_graph, -) - - -def test_margulis_gabber_galil_graph(): - for n in 2, 3, 5, 6, 10: - g = margulis_gabber_galil_graph(n) - assert number_of_nodes(g) == n * n - for node in g: - assert g.degree(node) == 8 - assert len(node) == 2 - for i in node: - assert int(i) == i - assert 0 <= i < n + +@pytest.mark.parametrize("n", (2, 3, 5, 6, 10)) +def test_margulis_gabber_galil_graph_properties(n): + g = nx.margulis_gabber_galil_graph(n) + assert g.number_of_nodes() == n * n + for node in g: + assert g.degree(node) == 8 + assert len(node) == 2 + for i in node: + assert int(i) == i + assert 0 <= i < n + + +@pytest.mark.parametrize("n", (2, 3, 5, 6, 10)) +def test_margulis_gabber_galil_graph_eigvals(n): np = pytest.importorskip("numpy") sp = pytest.importorskip("scipy") import scipy.linalg + g = nx.margulis_gabber_galil_graph(n) # Eigenvalues are already sorted using the scipy eigvalsh, # but the implementation in numpy does not guarantee order. - w = sorted(sp.linalg.eigvalsh(adjacency_matrix(g).A)) + w = sorted(sp.linalg.eigvalsh(nx.adjacency_matrix(g).toarray())) assert w[-2] < 5 * np.sqrt(2) -def test_chordal_cycle_graph(): +@pytest.mark.parametrize("p", (3, 5, 7, 11)) # Primes +def test_chordal_cycle_graph(p): """Test for the :func:`networkx.chordal_cycle_graph` function.""" - primes = [3, 5, 7, 11] - for p in primes: - G = chordal_cycle_graph(p) - assert len(G) == p - # TODO The second largest eigenvalue should be smaller than a constant, - # independent of the number of nodes in the graph: - # - # eigs = sorted(sp.linalg.eigvalsh(adjacency_matrix(G).A)) - # assert_less(eigs[-2], ...) - # + G = nx.chordal_cycle_graph(p) + assert len(G) == p + # TODO The second largest eigenvalue should be smaller than a constant, + # independent of the number of nodes in the graph: + # + # eigs = sorted(sp.linalg.eigvalsh(nx.adjacency_matrix(G).toarray())) + # assert_less(eigs[-2], ...) + # -def test_paley_graph(): +@pytest.mark.parametrize("p", (3, 5, 7, 11, 13)) # Primes +def test_paley_graph(p): """Test for the :func:`networkx.paley_graph` function.""" - primes = [3, 5, 7, 11, 13] - for p in primes: - G = paley_graph(p) - # G has p nodes - assert len(G) == p - # G is (p-1)/2-regular - in_degrees = {G.in_degree(node) for node in G.nodes} - out_degrees = {G.out_degree(node) for node in G.nodes} - assert len(in_degrees) == 1 and in_degrees.pop() == (p - 1) // 2 - assert len(out_degrees) == 1 and out_degrees.pop() == (p - 1) // 2 - - # If p = 1 mod 4, -1 is a square mod 4 and therefore the - # edge in the Paley graph are symmetric. - if p % 4 == 1: - for (u, v) in G.edges: - assert (v, u) in G.edges - - -def test_margulis_gabber_galil_graph_badinput(): - pytest.raises(nx.NetworkXError, margulis_gabber_galil_graph, 3, nx.DiGraph()) - pytest.raises(nx.NetworkXError, margulis_gabber_galil_graph, 3, nx.Graph()) + G = nx.paley_graph(p) + # G has p nodes + assert len(G) == p + # G is (p-1)/2-regular + in_degrees = {G.in_degree(node) for node in G.nodes} + out_degrees = {G.out_degree(node) for node in G.nodes} + assert len(in_degrees) == 1 and in_degrees.pop() == (p - 1) // 2 + assert len(out_degrees) == 1 and out_degrees.pop() == (p - 1) // 2 + + # If p = 1 mod 4, -1 is a square mod 4 and therefore the + # edge in the Paley graph are symmetric. + if p % 4 == 1: + for (u, v) in G.edges: + assert (v, u) in G.edges + + +@pytest.mark.parametrize("graph_type", (nx.Graph, nx.DiGraph, nx.MultiDiGraph)) +def test_margulis_gabber_galil_graph_badinput(graph_type): + with pytest.raises( + nx.NetworkXError, match="`create_using` must be an undirected multigraph" + ): + nx.margulis_gabber_galil_graph(3, create_using=graph_type) + + +@pytest.mark.parametrize("graph_type", (nx.Graph, nx.DiGraph, nx.MultiDiGraph)) +def test_chordal_cycle_graph_badinput(graph_type): + with pytest.raises( + nx.NetworkXError, match="`create_using` must be an undirected multigraph" + ): + nx.chordal_cycle_graph(3, create_using=graph_type) + + +def test_paley_graph_badinput(): + with pytest.raises( + nx.NetworkXError, match="`create_using` cannot be a multigraph." + ): + nx.paley_graph(3, create_using=nx.MultiGraph) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/networkx-2.8.7/networkx/generators/tests/test_trees.py new/networkx-2.8.8/networkx/generators/tests/test_trees.py --- old/networkx-2.8.7/networkx/generators/tests/test_trees.py 2022-06-03 01:39:15.000000000 +0200 +++ new/networkx-2.8.8/networkx/generators/tests/test_trees.py 2022-11-01 18:28:15.000000000 +0100 @@ -86,3 +86,16 @@ """Tests that a random tree is in fact a tree.""" T = nx.random_tree(10, seed=1234) assert nx.is_tree(T) + + +def test_random_tree_n_zero(): + """Tests if n = 0 then the NetworkXPointlessConcept exception is raised.""" + with pytest.raises(nx.NetworkXPointlessConcept): + T = nx.random_tree(0, seed=1234) + + +def test_random_tree_using_generator(): + """Tests that creating a ramdom tree with a generator works""" + G = nx.Graph() + T = nx.random_tree(10, seed=1234, create_using=G) + assert nx.is_tree(T) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/networkx-2.8.7/networkx/linalg/algebraicconnectivity.py new/networkx-2.8.8/networkx/linalg/algebraicconnectivity.py --- old/networkx-2.8.7/networkx/linalg/algebraicconnectivity.py 2022-06-03 01:39:15.000000000 +0200 +++ new/networkx-2.8.8/networkx/linalg/algebraicconnectivity.py 2022-11-01 18:28:59.000000000 +0100 @@ -460,6 +460,18 @@ See Also -------- laplacian_matrix + + Examples + -------- + Given a connected graph the signs of the values in the Fiedler vector can be + used to partition the graph into two components. + + >>> G = nx.barbell_graph(5, 0) + >>> nx.fiedler_vector(G, normalized=True, seed=1) + array([-0.32864129, -0.32864129, -0.32864129, -0.32864129, -0.26072899, + 0.26072899, 0.32864129, 0.32864129, 0.32864129, 0.32864129]) + + The connected components are the two 5-node cliques of the barbell graph. """ import numpy as np diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/networkx-2.8.7/networkx/readwrite/adjlist.py new/networkx-2.8.8/networkx/readwrite/adjlist.py --- old/networkx-2.8.7/networkx/readwrite/adjlist.py 2022-06-03 01:39:15.000000000 +0200 +++ new/networkx-2.8.8/networkx/readwrite/adjlist.py 2022-11-01 18:29:12.000000000 +0100 @@ -60,6 +60,14 @@ -------- write_adjlist, read_adjlist + Notes + ----- + The default `delimiter=" "` will result in unexpected results if node names contain + whitespace characters. To avoid this problem, specify an alternate delimiter when spaces are + valid in node names. + + NB: This option is not available for data that isn't user-generated. + """ directed = G.is_directed() seen = set() @@ -113,6 +121,11 @@ Notes ----- + The default `delimiter=" "` will result in unexpected results if node names contain + whitespace characters. To avoid this problem, specify an alternate delimiter when spaces are + valid in node names. + NB: This option is not available for data that isn't user-generated. + This format does not store graph, node, or edge data. See Also diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/networkx-2.8.7/networkx/readwrite/json_graph/tests/test_adjacency.py new/networkx-2.8.8/networkx/readwrite/json_graph/tests/test_adjacency.py --- old/networkx-2.8.7/networkx/readwrite/json_graph/tests/test_adjacency.py 2022-06-03 01:39:15.000000000 +0200 +++ new/networkx-2.8.8/networkx/readwrite/json_graph/tests/test_adjacency.py 2022-11-01 18:27:29.000000000 +0100 @@ -10,7 +10,7 @@ def test_graph(self): G = nx.path_graph(4) H = adjacency_graph(adjacency_data(G)) - nx.is_isomorphic(G, H) + assert nx.is_isomorphic(G, H) def test_graph_attributes(self): G = nx.path_graph(4) @@ -36,7 +36,7 @@ nx.add_path(G, [1, 2, 3]) H = adjacency_graph(adjacency_data(G)) assert H.is_directed() - nx.is_isomorphic(G, H) + assert nx.is_isomorphic(G, H) def test_multidigraph(self): G = nx.MultiDiGraph() @@ -50,7 +50,7 @@ G.add_edge(1, 2, key="first") G.add_edge(1, 2, key="second", color="blue") H = adjacency_graph(adjacency_data(G)) - nx.is_isomorphic(G, H) + assert nx.is_isomorphic(G, H) assert H[1][2]["second"]["color"] == "blue" def test_exception(self): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/networkx-2.8.7/networkx/readwrite/json_graph/tests/test_cytoscape.py new/networkx-2.8.8/networkx/readwrite/json_graph/tests/test_cytoscape.py --- old/networkx-2.8.7/networkx/readwrite/json_graph/tests/test_cytoscape.py 2022-09-30 18:57:13.000000000 +0200 +++ new/networkx-2.8.8/networkx/readwrite/json_graph/tests/test_cytoscape.py 2022-11-01 19:53:50.000000000 +0100 @@ -27,7 +27,7 @@ def test_graph(): G = nx.path_graph(4) H = cytoscape_graph(cytoscape_data(G)) - nx.is_isomorphic(G, H) + assert nx.is_isomorphic(G, H) def test_input_data_is_not_modified_when_building_graph(): @@ -69,7 +69,7 @@ nx.add_path(G, [1, 2, 3]) H = cytoscape_graph(cytoscape_data(G)) assert H.is_directed() - nx.is_isomorphic(G, H) + assert nx.is_isomorphic(G, H) def test_multidigraph(): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/networkx-2.8.7/networkx/readwrite/json_graph/tests/test_node_link.py new/networkx-2.8.8/networkx/readwrite/json_graph/tests/test_node_link.py --- old/networkx-2.8.7/networkx/readwrite/json_graph/tests/test_node_link.py 2022-08-21 18:51:21.000000000 +0200 +++ new/networkx-2.8.8/networkx/readwrite/json_graph/tests/test_node_link.py 2022-11-01 18:27:29.000000000 +0100 @@ -107,7 +107,7 @@ G.add_edge(1, 2, key="first") G.add_edge(1, 2, key="second", color="blue") H = node_link_graph(node_link_data(G)) - nx.is_isomorphic(G, H) + assert nx.is_isomorphic(G, H) assert H[1][2]["second"]["color"] == "blue" def test_graph_with_tuple_nodes(self): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/networkx-2.8.7/networkx/readwrite/json_graph/tests/test_tree.py new/networkx-2.8.8/networkx/readwrite/json_graph/tests/test_tree.py --- old/networkx-2.8.7/networkx/readwrite/json_graph/tests/test_tree.py 2022-09-30 18:57:13.000000000 +0200 +++ new/networkx-2.8.8/networkx/readwrite/json_graph/tests/test_tree.py 2022-11-01 19:53:50.000000000 +0100 @@ -13,7 +13,7 @@ G.add_edge(1, 3, foo=10) G.add_edge(3, 4, foo=10) H = tree_graph(tree_data(G, 1)) - nx.is_isomorphic(G, H) + assert nx.is_isomorphic(G, H) def test_graph_attributes(): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/networkx-2.8.7/networkx/tests/test_relabel.py new/networkx-2.8.8/networkx/tests/test_relabel.py --- old/networkx-2.8.7/networkx/tests/test_relabel.py 2022-09-30 18:57:13.000000000 +0200 +++ new/networkx-2.8.8/networkx/tests/test_relabel.py 2022-11-01 19:53:50.000000000 +0100 @@ -180,10 +180,10 @@ K5 = nx.complete_graph(4) G = nx.complete_graph(4) G = nx.relabel_nodes(G, {i: i + 1 for i in range(4)}, copy=False) - nx.is_isomorphic(K5, G) + assert nx.is_isomorphic(K5, G) G = nx.complete_graph(4) G = nx.relabel_nodes(G, {i: i - 1 for i in range(4)}, copy=False) - nx.is_isomorphic(K5, G) + assert nx.is_isomorphic(K5, G) def test_relabel_selfloop(self): G = nx.DiGraph([(1, 1), (1, 2), (2, 3)]) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/networkx-2.8.7/networkx/utils/tests/test_mapped_queue.py new/networkx-2.8.8/networkx/utils/tests/test_mapped_queue.py --- old/networkx-2.8.7/networkx/utils/tests/test_mapped_queue.py 2022-06-03 01:39:15.000000000 +0200 +++ new/networkx-2.8.8/networkx/utils/tests/test_mapped_queue.py 2022-11-01 19:53:55.000000000 +0100 @@ -40,7 +40,7 @@ class TestMappedQueue: - def setup(self): + def setup_method(self): pass def _check_map(self, q): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/networkx-2.8.7/networkx.egg-info/PKG-INFO new/networkx-2.8.8/networkx.egg-info/PKG-INFO --- old/networkx-2.8.7/networkx.egg-info/PKG-INFO 2022-10-01 22:51:49.000000000 +0200 +++ new/networkx-2.8.8/networkx.egg-info/PKG-INFO 2022-11-01 21:31:20.000000000 +0100 @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: networkx -Version: 2.8.7 +Version: 2.8.8 Summary: Python package for creating and manipulating graphs and networks Home-page: https://networkx.org/ Author: Aric Hagberg @@ -24,6 +24,7 @@ Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 Classifier: Programming Language :: Python :: 3 :: Only Classifier: Topic :: Software Development :: Libraries :: Python Modules Classifier: Topic :: Scientific/Engineering :: Bio-Informatics @@ -41,8 +42,8 @@ NetworkX ======== -.. image:: https://github.com/networkx/networkx/workflows/test/badge.svg?tag=networkx-2.8.7 - :target: https://github.com/networkx/networkx/actions?query=branch%3Anetworkx-2.8.7 +.. image:: https://github.com/networkx/networkx/workflows/test/badge.svg?tag=networkx-2.8.8 + :target: https://github.com/networkx/networkx/actions?query=branch%3Anetworkx-2.8.8 .. image:: https://codecov.io/gh/networkx/networkx/branch/main/graph/badge.svg :target: https://app.codecov.io/gh/networkx/networkx/branch/main @@ -59,7 +60,7 @@ - **Mailing list:** https://groups.google.com/forum/#!forum/networkx-discuss - **Source:** https://github.com/networkx/networkx - **Bug reports:** https://github.com/networkx/networkx/issues -- **Report a security vulnerability:** https://tidelift.com/docs/security +- **Report a security vulnerability:** https://tidelift.com/security - **Tutorial:** https://networkx.org/documentation/latest/tutorial.html - **GitHub Discussions:** https://github.com/networkx/networkx/discussions diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/networkx-2.8.7/networkx.egg-info/SOURCES.txt new/networkx-2.8.8/networkx.egg-info/SOURCES.txt --- old/networkx-2.8.7/networkx.egg-info/SOURCES.txt 2022-10-01 22:51:49.000000000 +0200 +++ new/networkx-2.8.8/networkx.egg-info/SOURCES.txt 2022-11-01 21:31:20.000000000 +0100 @@ -170,6 +170,7 @@ doc/release/release_2.8.5.rst doc/release/release_2.8.6.rst doc/release/release_2.8.7.rst +doc/release/release_2.8.8.rst doc/release/release_2.8.rst doc/release/release_dev.rst doc/release/release_template.rst diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/networkx-2.8.7/networkx.egg-info/requires.txt new/networkx-2.8.8/networkx.egg-info/requires.txt --- old/networkx-2.8.7/networkx.egg-info/requires.txt 2022-10-01 22:51:49.000000000 +0200 +++ new/networkx-2.8.8/networkx.egg-info/requires.txt 2022-11-01 21:31:20.000000000 +0100 @@ -7,14 +7,14 @@ [developer] pre-commit>=2.20 -mypy>=0.981 +mypy>=0.982 [doc] -sphinx>=5 -pydata-sphinx-theme>=0.9 -sphinx-gallery>=0.10 -numpydoc>=1.4 -pillow>=9.1 +sphinx>=5.2 +pydata-sphinx-theme>=0.11 +sphinx-gallery>=0.11 +numpydoc>=1.5 +pillow>=9.2 nb2plots>=0.6 texext>=0.6.6 @@ -25,6 +25,6 @@ sympy>=1.10 [test] -pytest>=7.1 -pytest-cov>=3.0 +pytest>=7.2 +pytest-cov>=4.0 codecov>=2.1 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/networkx-2.8.7/requirements/developer.txt new/networkx-2.8.8/requirements/developer.txt --- old/networkx-2.8.7/requirements/developer.txt 2022-09-30 18:57:24.000000000 +0200 +++ new/networkx-2.8.8/requirements/developer.txt 2022-11-01 18:27:15.000000000 +0100 @@ -1,2 +1,2 @@ pre-commit>=2.20 -mypy>=0.981 +mypy>=0.982 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/networkx-2.8.7/requirements/doc.txt new/networkx-2.8.8/requirements/doc.txt --- old/networkx-2.8.7/requirements/doc.txt 2022-06-10 16:44:40.000000000 +0200 +++ new/networkx-2.8.8/requirements/doc.txt 2022-11-01 19:53:50.000000000 +0100 @@ -1,7 +1,7 @@ -sphinx>=5 -pydata-sphinx-theme>=0.9 -sphinx-gallery>=0.10 -numpydoc>=1.4 -pillow>=9.1 +sphinx>=5.2 +pydata-sphinx-theme>=0.11 +sphinx-gallery>=0.11 +numpydoc>=1.5 +pillow>=9.2 nb2plots>=0.6 texext>=0.6.6 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/networkx-2.8.7/requirements/test.txt new/networkx-2.8.8/requirements/test.txt --- old/networkx-2.8.7/requirements/test.txt 2022-04-09 19:03:19.000000000 +0200 +++ new/networkx-2.8.8/requirements/test.txt 2022-11-01 19:53:55.000000000 +0100 @@ -1,3 +1,3 @@ -pytest>=7.1 -pytest-cov>=3.0 +pytest>=7.2 +pytest-cov>=4.0 codecov>=2.1 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/networkx-2.8.7/setup.py new/networkx-2.8.8/setup.py --- old/networkx-2.8.7/setup.py 2022-09-30 18:57:13.000000000 +0200 +++ new/networkx-2.8.8/setup.py 2022-11-01 19:53:50.000000000 +0100 @@ -48,6 +48,7 @@ "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3 :: Only", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: Scientific/Engineering :: Bio-Informatics",