Coder Social home page Coder Social logo

expyct's Introduction

GitHub Actions Contributors Forks Stargazers Issues MIT License


Expyct

Partial matching of any Python object.
Explore the docs »

Report Bug · Request Feature

Table of Contents

  1. Expyct
  2. Getting Started
  3. Usage
  4. Roadmap
  5. Contributing
  6. License
  7. Contact
  8. Acknowledgements

Expyct

Partial matching of any Python object.

import expyct as exp


def test_my_function():
    result = my_function()

    assert result == exp.Float(optional=True, close_to=0.076, error=0.01)

Using Expyct is a good idea when you need to assert something in a test case but there is some non-determinism.

For example, rounding errors prevent you from comparing a float exactly. Or a timestamp is created on-the-fly, and therefore changes every test run.

In these cases, you need to be able to set specific constraints on the expected value. That is what Expyct is for!

The constraints can be provided as constructor arguments. For example n == Number(min=3, max=5) is only true when n is between 3 and 5.

Some other examples of classes are Float, String, Any and DateTime. As you can see, they closely match the built-in Python types.

The library also comes with many commonly used data validators like ANY_UUID which matches any UUID string. And TODAY which matches any datetime occurring on the current day.

Checking nested data structures is easy as well.

See Usage examples

Getting Started

Prerequisites

Supported and tested for:

  • Python 3.6
  • Python 3.7
  • Python 3.8
  • Python 3.9

Installation

pip install expyct

Or install using any Python package manager like conda, pipenv or poetry.

Usage

See below examples of how to use Expyct with pytest.

Simple example:

import expyct as exp
from myclass import MyClass


def test_my_function():
    result = my_function()

    assert result == exp.AnyValue(instance_of=MyClass, vars={"property": "value"})

More complicated nested example:

import expyct as exp
from datetime import datetime


def test_my_function():
    result = my_function()

    assert result == {
        "first_name": exp.String(regex="(mary)|(peter)", ignore_case=True),
        "last_name": "Johnson",
        "signup_date": exp.DateTime(after=datetime(2020, 1, 2), before=datetime(2020, 3, 5)),
        "details": {
            "number": exp.Int(min=2),
            "amount": exp.Float(close_to=2.3, error=0.001),
            "purchases": exp.List(exp.Dict(keys={"id", "product", "category"}), non_empty=True),
        },
        "time_of_purchase": exp.OneOf([exp.TODAY, exp.THIS_HOUR]),
        "type": exp.AnyType(subclass_of=str),
        "item_ids": exp.Set(subset_of=[1, 2, 3]),
        "metadata": exp.Dict(keys_any=exp.Collection(superset_of=["a", "b"])),
        "context": exp.ANY,
    }

Roadmap

See the open issues for a list of proposed features (and known issues).

Contributing

Any contributions you make are greatly appreciated.

  1. Fork the Project
  2. Create your Feature Branch (git checkout -b feature/AmazingFeature)
  3. Commit your Changes (git commit -m 'Add some AmazingFeature')
  4. Bump the version in expyct/__version__.py following SemVer
  5. Push the Branch (git push origin feature/AmazingFeature)
  6. Open a Pull Request

Before starting to contribute to Expyct, please install pre-commit to make sure your changes get checked for style and standards before committing them to repository:

$ pre-commit install

License

Distributed under the MIT License. See LICENSE for more information.

Contact

Please file an issue on Github.

Acknowledgements

expyct's People

Contributors

mthaak avatar

Stargazers

José L. Patiño Andrés avatar

Watchers

James Cloos avatar  avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.