Deprecations
============

.. _deprecation_policy:

Policy
------

If the behavior of the library has to be changed, a deprecation cycle must be
followed to warn users.

A deprecation cycle is *not* necessary when:

* adding a new function, or
* adding a new keyword argument to the *end* of a function signature, or
* fixing buggy behavior

A deprecation cycle is necessary for *any breaking API change*, meaning a
change where the function, invoked with the same arguments, would return a
different result after the change. This includes:

* changing the order of arguments or keyword arguments, or
* adding arguments or keyword arguments to a function, or
* changing the name of a function, class, method, etc., or
* moving a function, class, etc. to a different module, or
* changing the default value of a function's arguments.

Usually, our policy is to put in place a deprecation cycle over two minor
releases (e.g., if a deprecation warning appears in 2.3, then the functionality
should be removed in 2.5).  For major releases we usually require that all
deprecations have at least a 1-release deprecation cycle (e.g., if 3.0 occurs
after 2.5, then all removed functionality in 3.0 should be deprecated in 2.5).

Note that these 1- and 2-release deprecation cycles for major and minor
releases is not a strict rule and in some cases, the developers can agree on a
different procedure upon justification (like when we can't detect the change,
or it involves moving or deleting an entire function for example).

Todo
----

Make sure to review ``networkx/conftest.py`` after removing deprecated code.

Version 3.0
~~~~~~~~~~~

* In ``readwrite/gml.py`` remove ``literal_stringizer`` and related tests.
* In ``readwrite/gml.py`` remove ``literal_destringizer`` and related tests.
* In ``utils/misc.py`` remove ``is_string_like`` and related tests.
* In ``utils/misc.py`` remove ``make_str`` and related tests.
* In ``utils/misc.py`` remove ``is_iterator``.
* In ``utils/misc.py`` remove ``iterable``.
* In ``utils/misc.py`` remove ``is_list_of_ints``.
* In ``utils/misc.py`` remove ``consume``.
* In ``utils/misc.py`` remove ``default_opener``.
* In ``utils/misc.py`` remove ``empty_generator``.
* Remove ``utils/contextmanagers.py`` and related tests.
* In ``drawing/nx_agraph.py`` remove ``display_pygraphviz`` and related tests.
* In ``algorithms/chordal.py`` replace ``chordal_graph_cliques`` with ``_chordal_graph_cliques``.
* In ``algorithms/centrality/betweenness_centrality_subset.py`` remove ``betweenness_centrality_source``.
* In ``algorithms/centrality/betweenness.py`` remove ``edge_betweeness``.
* In ``algorithms/community_modularity_max.py`` remove old name ``_naive_greedy_modularity_communities``.
* In ``linalg/algebraicconnectivity.py`` remove ``_CholeskySolver`` and related code.
* In ``convert_matrix.py`` remove ``to_numpy_matrix`` and ``from_numpy_matrix``.
* In ``readwrite/json_graph/cytoscape.py``, change function signature for
  ``cytoscape_graph`` and ``cytoscape_data`` to replace the ``attrs`` keyword.
  argument with explicit ``name`` and ``ident`` keyword args.
* In ``readwrite/json_graph/tree.py``, remove ``attrs`` kwarg from ``tree_graph``
  and ``tree_data``.
* Undo changes related to the removal of ``pyyaml``. Remove the
  ``__getattr__`` definitions from ``networkx/__init__.py``,
  ``networkx/readwrite/__init__.py`` and ``networkx/readwrite/nx_yaml.py`` and
  remove ``networkx/readwrite/tests/test_getattr_nxyaml_removal.py``
* Remove ``readwrite/gpickle.py`` and related tests.
* Remove ``readwrite/nx_shp.py`` and related tests (add info in alternatives).
* Remove ``copy`` method in the coreview Filtered-related classes and related tests.
* In ``algorithms/link_analysis/pagerank_alg.py`` replace ``pagerank`` with ``pagerank_scipy``.
* In ``algorithms/link_analysis/pagerank_alg.py`` rename ``pagerank_numpy`` as ``_pagerank_numpy``.
* In ``convert_matrix.py`` remove ``order`` kwarg from ``to_pandas_edgelist`` and docstring
* Remove ``readwrite/json_graph/jit.py`` and related tests.
* In ``utils/misc.py`` remove ``generate_unique_node`` and related tests.
* In ``algorithms/link_analysis/hits_alg.py`` remove ``hub_matrix`` and ``authority_matrix``
* In ``algorithms/link_analysis/hits_alg.py``, remove ``hits_numpy`` and ``hist_scipy``.
* In ``classes`` remove the ``ordered`` module and the four ``Ordered``
  classes defined therein.
* In ``utils/decorators.py`` remove ``preserve_random_state``.
* In ``algorithms/community/quality.py`` remove ``coverage`` and ``performance``.
* Remove ``testing``.
* In ``linalg/graphmatrix.py`` remove ``adj_matrix``.
* In ``algorithms/similarity.py`` replace ``simrank_similarity`` with ``simrank_similarity_numpy``.
* In ``algorithms/assortativity/mixing.py`` remove ``numeric_mixing_matrix``.
* In ``algorithms/assortativity/connectivity.py`` remove ``k_nearest_neighbors``.
* In ``utils/decorators.py`` remove ``random_state``.
* In ``algorithms/operators/binary.py`` remove ``name`` kwarg from ``union`` and docstring.
* In ``generators/geometric.py`` remove ``euclidean`` and tests.
* In ``algorithms/node_classification/`` remove ``hmn.py``, ``lgc.py``,
  and ``utils.py`` after moving the functions defined therein into the newly created
  ``node_classification.py`` module, which will replace the current package.
* In ``algorithms/link_analysis/pagerank_alg.py``, remove the
  ``np.asmatrix`` wrappers on the return values of ``google_matrix`` and remove
  the associated FutureWarning.
* In ``convert_matrix.py`` remove ``from_scipy_sparse_matrix`` and
  ``to_scipy_sparse_matrix``.
* In ``linalg/attrmatrix.py`` remove the FutureWarning, update the
  return type by removing ``np.asmatrix``, and update the docstring to
  reflect that the function returns a ``numpy.ndarray`` instance.
* In ``generators/small.py`` remove ``make_small_graph`` and
  ``make_small_undirected_graph``.
* In ``convert_matrix.py`` remove ``to_numpy_recarray``.
* In ``classes/function.py`` remove ``info``.
* In ``algorithms/community/modularity_max.py``, remove the deprecated
  ``n_communities`` parameter from the ``greedy_modularity_communities``
  function.
* In ``algorithms/distance_measures.py`` remove ``extrema_bounding``.
* In ``utils/misc.py`` remove ``dict_to_numpy_array1`` and ``dict_to_numpy_array2``.
* In ``utils/misc.py`` remove ``to_tuple``.
* In ``algorithms/matching.py``, remove parameter ``maxcardinality`` from ``min_weight_matching``.
