Skip to main content

Deprecation tooling

Project description

pyDeprecate

Simple tooling for marking deprecated functions or classes and re-routing to the new successors' instance.

PyPI - Python Version PyPI Status PyPI Status license

CI testing Code formatting codecov CodeFactor


The common use-case is moving your functions across codebase or outsourcing some functionalities to new packages. For most of these cases, you want to hold some compatibility, so you cannot simply remove past function, and also for some time you want to warn users that functionality they have been using is moved and not it is deprecated in favor of another function (which shall be used instead) and soon it will be removed completely.

Another good aspect is to do not overwhelm a user with too many warnings, so per function/class, this warning is raised only N times in the preferable stream (warning, logger, etc.).

Installation

Simple installation from PyPI:

pip install pyDeprecate
Other installations

Simply install with pip from source:

pip install https://github.com/Borda/pyDeprecate/archive/main.zip

Use-cases

The functionality is kept simple and all default shall be reasonable, but still you can do extra customization such as:

  • define user warning message and preferable stream
  • extended argument mapping to target function/method

Simple function forwarding

It is very straight forward, you forward your function call to new function and all arguments are mapped:

def base_sum(a: int = 0, b: int = 3) -> int:
    """My new function anywhere in codebase or even other package."""
    return a + b

# ---------------------------

from deprecate import deprecated

@deprecated(target=base_sum, deprecated_in="0.1", remove_in="0.5")
def depr_sum(a: int, b: int = 5) -> int:
    """
    My deprecated function which now has empty body
     as all calls are routed to the new function.
    """
    pass  # or you can just place docstring as one above

# call this function will raise deprecation warning
depr_sum(1, 2)
# returns: 3

Advanced argument mapping

Another more complex example is using argument mapping is:

import logging
from sklearn.metrics import accuracy_score
from deprecate import deprecated

@deprecated(
  # use standard sklearn accuracy implementation
  target=accuracy_score,
  # custom warning stream
  stream=logging.warning,
  # custom message template
  template_mgs="`%(source_name)s` was deprecated, use `%(target_path)s`",
  # as target args are different, define mapping
  args_mapping={'preds': 'y_pred', 'target': 'y_true', 'blabla': None}
)
def depr_accuracy(preds: list, target: list, blabla: float) -> float:
    """
    My deprecated function which is mapping to sklearn accuracy.
    """
    pass  # or you can just place docstring as one above

# call this function will raise deprecation warning:
# WARNING:root:`depr_accuracy` was deprecated, use `sklearn.metrics.accuracy_score`
depr_accuracy([1, 0, 1, 2], [0, 1, 1, 2], 1.23)
# returns: 0.5

Deprecation warning only

Base use-case with no forwarding and just raising warning :

from deprecate import deprecated

@deprecated(target=None, deprecated_in="0.1", remove_in="0.5")
def my_sum(a: int, b: int = 5) -> int:
    """
    My deprecated function which still has to have implementation.
    """
    return a + b

# call this function will raise deprecation warning
my_sum(1, 2)
# returns: 3

Class deprecation

This case can be quite complex as you may deprecate just some methods, here we show full class deprecation:

class NewCls:
    """My new class anywhere in the codebase or other package."""

    def __init__(self, c: float, d: str = "abc"):
        self.my_c = c
        self.my_d = d

# ---------------------------

from deprecate import deprecated

class PastCls(NewCls):
    """
    The deprecated class shall be inherited from the successor class
     to hold all methods.
    """

    @deprecated(target=NewCls, deprecated_in="0.2", remove_in="0.4")
    def __init__(self, c: int, d: str = "efg"):
        """
        You place the decorator around __init__ as you want
         to warn user just at the time of creating object.
        """
        pass  # or you can just place docstring as one above

# call this function will raise deprecation warning
inst = PastCls(7)
inst.my_c  # returns: 7
inst.my_d  # returns: "efg"

Contribution

Have you faced this in past or even now, do you have good ideas for improvement, all is welcome!

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pyDeprecate-0.1.0.tar.gz (11.5 kB view details)

Uploaded Source

Built Distribution

pyDeprecate-0.1.0-py3-none-any.whl (10.5 kB view details)

Uploaded Python 3

File details

Details for the file pyDeprecate-0.1.0.tar.gz.

File metadata

  • Download URL: pyDeprecate-0.1.0.tar.gz
  • Upload date:
  • Size: 11.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/3.7.3 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.59.0 CPython/3.9.2

File hashes

Hashes for pyDeprecate-0.1.0.tar.gz
Algorithm Hash digest
SHA256 2b8e6924d7e50692e2bfcbe17a3a1e9225c49cf7e1c25392d656d2296819bfb2
MD5 45348258726ac4f119cd3433d1a0f4fd
BLAKE2b-256 1b0b4f27ba6eef43e411b1610062923291c3bd2e6b5ab5a8b1e0ab3466781696

See more details on using hashes here.

File details

Details for the file pyDeprecate-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: pyDeprecate-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 10.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/3.7.3 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.59.0 CPython/3.9.2

File hashes

Hashes for pyDeprecate-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 35c9b1958cf9e13cc7c6bacd4c9378e1029b81460f23c17f9d2686542a4f6c63
MD5 91a341494a5b91c99743c3ea6f08029e
BLAKE2b-256 95c6e60d847254916a4227b11b9b367170ccdc2c5e6ce7a4ee2b615776d9674c

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page