Skip to content

David-Lor/python-wait4it

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

26 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

python-wait4it

Test PyPi License

Wait-For-It Python module, that waits until a certain TCP port is available.

Based on the idea behind the well-known wait-for-it script, but created mainly as a Python package to be used on other Python applications, services or modules, instead of being mainly a CLI tool.

Installing

Package is available at PyPi, so you can install it with pip install wait4it - or from sources with python setup.py install.

Usage

from wait4it import wait_for, WaitForTimeoutError

# This should return instantly (if you have connection)
wait_for(host="google.com", port=80)

# This should fail in 5 seconds
try:
    wait_for(host="google.com", port=12345, timeout=5)
except TimeoutError:
    # Actually will raise custom WaitForTimeoutError exception, but inherits from TimeoutError (except on Python2)
    print("Failed! (as expected)")

# This should return False in 15 seconds
wait_for(host="google.com", port=12345, raise_error=False)

# Normally you will want to check for a port in localhost (e.g. a MySQL/MariaDB database).
# This can be done directly like:
wait_for(3306)

# The exceptions include the failing host/port
try:
    wait_for(host="google.com", port=12345)
except WaitForTimeoutError as ex:
    assert ex.host == "google.com"
    assert ex.port == 12345

wait_for_pass decorator

It works similarly to wait_for, but if the considered exceptions are raised on the decorated function, it will re-run until it runs without raising these errors, or until the given retries limit is reached.

The following example will randomly raise ZeroDivisionError in the function divide_by_random, which runs 10 times. If fails more than twice, the exception will be thrown outside the function.

from random import randint
from wait4it import wait_for_pass

@wait_for_pass(ZeroDivisionError, retries=2)
def divide_by_random(n=10):
    d = randint(0, 1)
    print("Gonna divide", n, "/", d)
    return n / d

for _ in range(10):
    r = divide_by_random()
    print("Got result:", r)

If retries is set to 0, the function will run forever until it passes without raising exceptions.

wait_for_pass also allows a parameter retries_delay, which can be used to define a delay, in seconds, between failed function executions.

Dependencies & Compatibility

Not external dependencies are required. Compatible (tested with) Python 2.7, 3.4, 3.5, 3.6, 3.7, 3.8 - under Linux.

Changelog

  • 0.2.1 - Add retries_delay parameter to wait_for_pass
  • 0.1.2 - Fix wait_for_pass decorator not looping indefinitely when retries=0
  • 0.1.1 - Add wait_for_pass decorator
  • 0.0.1 - Initial release

TODO

  • Set retries limit on wait_for
  • Set timeout on wait_for_pass