Skip to main content

pytest-play plugin with python expressions and assertions

Project description

===========
play python
===========


.. image:: https://img.shields.io/pypi/v/play_python.svg
:target: https://pypi.python.org/pypi/play_python

.. image:: https://img.shields.io/travis/tierratelematics/play_python.svg
:target: https://travis-ci.org/tierratelematics/play_python

.. image:: https://readthedocs.org/projects/play-python/badge/?version=latest
:target: https://play-python.readthedocs.io/en/latest/?badge=latest
:alt: Documentation Status

.. image:: https://codecov.io/gh/tierratelematics/play_python/branch/develop/graph/badge.svg
:target: https://codecov.io/gh/tierratelematics/play_python


pytest-play plugin with restricted Python expressions and assertions and it is
based on the ``RestrictedPython`` package.

``RestrictedPython`` is a tool that helps to define a subset of the Python
language which allows to provide a program input into a trusted environment.
RestrictedPython is not a sandbox system or a secured environment, but it helps
to define a trusted environment and execute untrusted code inside of it.

See:

* https://github.com/zopefoundation/RestrictedPython

More info and examples on:

* pytest-play_, documentation
* cookiecutter-qa_, see ``pytest-play`` in action with a working example if you want to start hacking


Features
========


This project defines the following pytest-play_ commands based on Python
expressions.


Store variables
---------------

You can store a pytest-play_ variables::

{
'provider': 'python',
'type': 'store_variable',
'expression': '1+1',
'name': 'foo'
}

Make a Python assertion
-----------------------

You can make an assertion based on a Python expression::

{
'provider': 'python',
'type': 'assert',
'expression': 'variables["foo"] == 2'
}

Sleep
-----

Sleep for a given amount of seconds::

{
'provider': 'python',
'type': 'sleep',
'seconds': 2
}

Exec a Python expresssion
-------------------------

You can execute a Python expression::

{
'provider': 'python',
'type': 'exec',
'expression': 'variables.update({'play_requests': {'parameters': {'headers': {'Authorization': '$bearer', 'Content-Type': 'application/json'}}}})'
}

Wait until condition
--------------------

The ``wait_until_not`` command waits until the wait expression is False::

{
'provider': 'python',
'type': 'wait_until_not',
'expression': 'variables["expected_id"] is not None and variables["expected_id"][0] == $id',
'timeout': 5,
'poll': 0.1,
'subcommands': [{
'provider': 'play_sql',
'type': 'sql',
'database_url': 'postgresql://$db_user:$db_pwd@$db_host/$db_name',
'query': 'SELECT id FROM table WHERE id=$id ORDER BY id DESC;',
'variable': 'expected_id',
'expression': 'results.first()'
}]
}

assuming that the subcommand updates the execution results updating a ``pytest-play``
variable (eg: ``expected_id``) where tipically the ``$id`` value comes
from a previously executed command that causes an asynchrounous update on a relational
database soon or later (eg: a play_requests_ command making a ``HTTP POST`` call
or a ``MQTT`` message coming from a simulated IoT device with play_mqtt_).

The wait command will try (and retry) to execute the subcommand with a poll frequency
``poll`` (default: 0.1 seconds) until the provided ``timeout`` expressed
in seconds expires or an exception occurs.

You can use the opposite command named ``wait_until`` that waits until the wait
expression is not False.

Loop commands
-------------

You can repeat a group of subcommands using a variable as a counter. Assuming you
have defined a ``countdown`` variable with 10 value, the wait until command will
repeat the group of commands for 10 times::

play_json.execute_command({
'provider': 'python',
'type': 'wait_until',
'expression': 'variables["countdown"] == 0',
'timeout': 0,
'poll': 0,
'sub_commands': [{
'provider': 'python',
'type': 'store_variable',
'name': 'countdown',
'expression': 'variables["countdown"] - 1'
}]
})

Twitter
=======

``pytest-play`` tweets happens here:

* `@davidemoro`_

Credits
=======

This package was created with Cookiecutter_ and the cookiecutter-play-plugin_ (based on `audreyr/cookiecutter-pypackage`_ project template).

.. _Cookiecutter: https://github.com/audreyr/cookiecutter
.. _`audreyr/cookiecutter-pypackage`: https://github.com/audreyr/cookiecutter-pypackage
.. _`cookiecutter-play-plugin`: https://github.com/tierratelematics/cookiecutter-play-plugin
.. _pytest-play: https://github.com/tierratelematics/pytest-play
.. _cookiecutter-qa: https://github.com/tierratelematics/cookiecutter-qa
.. _`@davidemoro`: https://twitter.com/davidemoro
.. _play_requests: https://github.com/tierratelematics/play_requests
.. _play_mqtt: https://github.com/tierratelematics/play_mqtt


=======
CHANGES
=======

0.1.1 (2018-01-17)
------------------

- add ``filter`` and ``map``


0.1.0 (2018-01-16)
------------------

- add ``wait_until`` and ``wait_until_not`` commands

- add ``datetime`` based expressions

- add json ``dumps`` and ``loads`` based expressions


0.0.1 (2018-01-10)
------------------

* First release


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

play_python-0.1.1.tar.gz (15.2 kB view details)

Uploaded Source

Built Distribution

play_python-0.1.1-py2.py3-none-any.whl (7.6 kB view details)

Uploaded Python 2 Python 3

File details

Details for the file play_python-0.1.1.tar.gz.

File metadata

  • Download URL: play_python-0.1.1.tar.gz
  • Upload date:
  • Size: 15.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for play_python-0.1.1.tar.gz
Algorithm Hash digest
SHA256 a9ed9bd7ad5e8203d6aea5bcc2ff42f4ab3e9862984863e95485df2ef8fbe87a
MD5 e2be84eb29a5742aa49bc15e9784c154
BLAKE2b-256 45a8bbbbeb269f4844551e1c7098544db1ec5b3453a91916f8ecd04d881162b8

See more details on using hashes here.

File details

Details for the file play_python-0.1.1-py2.py3-none-any.whl.

File metadata

File hashes

Hashes for play_python-0.1.1-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 37784a7d8d53be68bda7b84ba81a04ad27d0e3bd60dd4a3e70dc89323a5fe480
MD5 88a4f9bfed874bf33f209ce7ca6cc940
BLAKE2b-256 2bce92c921f5e8fa7837463be4620ba4c5a0515c4a474970f950fbcd7cddb233

See more details on using hashes here.

Supported by

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