{ "info": { "author": "Konrad Ha\u0142as", "author_email": "halas.konrad@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 1 - Planning", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: Software Development :: Testing", "Topic :: Software Development :: Testing :: Mocking" ], "description": "# mimid\n\n[![Build Status](https://travis-ci.org/konradhalas/mimid.svg?branch=master)](https://travis-ci.org/konradhalas/mimid)\n[![Coverage Status](https://coveralls.io/repos/github/konradhalas/mimid/badge.svg?branch=master)](https://coveralls.io/github/konradhalas/mimid?branch=master)\n[![License](https://img.shields.io/pypi/l/mimid.svg)](https://pypi.python.org/pypi/mimid/)\n[![Version](https://img.shields.io/pypi/v/mimid.svg)](https://pypi.python.org/pypi/mimid/)\n[![Python versions](https://img.shields.io/pypi/pyversions/mimid.svg)](https://pypi.python.org/pypi/mimid/)\n[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/ambv/black)\n\nModern mocking library for Python.\n\n**\u26a0\ufe0f This project is under heavy development, API could be unstable.**\n\n## Installation\n\nTo install `mimid`, simply use `pip`:\n\n```\n$ pip install mimid\n```\n\n## Quick start\n\n\n```python\nfrom mimid import mock, every, verify, any, gt\n\ndef add(a: int, b: int) -> int:\n return a + b\n\ndef test_add():\n add_mock = mock(add)\n every(add_mock).returns(5) \n\n result = add_mock(2, 2)\n\n assert result == 5\n verify(add_mock).with_args(any(), gt(0)).called(times=1)\n```\n\n## Features\n\nMimid supports following features:\n\n- easy mock behaviour configuration and verification\n- works with classes and plain functions\n- fully type hinted - it works with IDE's and type checkers\n- clean API, without too much magic\n\n## Why not `mock`?\n\nPython built-in `mock` module is an awesome tool. It's a first choice if you want to mock something in your tests.\n\nHowever it has a few disadvantages:\n\n- it doesn't work well with modern IDEs (e.g. auto completion) and type checkers\n- it's difficult to define different behaviours for different cases\n- it allows too much freedom, you can do anything with your mock object, even if you didn't define any behaviour\n\n## Inspiration\n\nMimid is highly inspired by mocking frameworks from a JVM world, like [mockito] or [mockk].\n\n## Usage\n\nThere are 3 simple steps in the `mimid` mocking workflow:\n\n1. [Creation](#creation)\n2. [Configuration](#configuration)\n3. [Verification](#verification)\n\nAdditionally you can use [matchers](#matchers) in both configuration and verification steps. \n\n### Creation\n\nYou have to use `mock` function to create your mock object. It works both with classes and functions.\n\nClass example:\n\n```python\nfrom mimid import mock\n\nclass A:\n\n def foo(self, param):\n pass\n\nclass_mock = mock(A) \n```\n\nFunction example:\n\n```python\nfrom mimid import mock\n\ndef foo(param):\n pass\n\nfunction_mock = mock(foo)\n```\n\n### Configuration\n\nBefore you call your mock (function or method) you have to configure its behaviour. Use `every` with additional\nmethods (`returns`, `raises`, ...) to define how it should works during your test.\n\n```python\nfrom mimid import mock, every\n\ndef foo(param):\n pass\n\nfunction_mock = mock(foo)\nevery(function_mock).returns(1)\n``` \n\nYou can also specify arguments which should trigger defined behaviour.\n\n```python\nfrom mimid import mock, every\n\ndef foo(param):\n pass\n\nfunction_mock = mock(foo)\nevery(function_mock).with_args(param=2).returns(1)\nevery(function_mock).with_args(param=3).raises(Exception())\n```\n\nAvailable configurations:\n\n| Configuration | Description |\n| ---------------- | ------------------------------------- |\n| `returns` | return given value |\n| `returns_many` | return each value from provided list |\n| `raises` | raise given exception | \n| `execute` | call given callable | \n\n### Verification\n\nAt the end of your test you can check if mock was called as expected with `verify`.\n\n```python\nfrom mimid import mock, verify\n\ndef foo(param):\n pass\n\nfunction_mock = mock(foo)\n\n... # mock calls\n\nverify(function_mock).called(times=2)\n```\n\nYou can use the same `with_args` also during verification step:\n\n```python\nfrom mimid import mock, every, verify\n\ndef foo(param):\n pass\n\nfunction_mock = mock(foo)\n\n... # mock calls\n\nverify(function_mock).with_args(param=1).called(times=2)\n```\n\n### Matchers\n\nYou can use matchers during configuration (`with_args`) and verification (`with_args`, `called`) steps. You can also combine matchers with `|` or `&` and negate it with `~`.\n\nExample:\n\n```python\nfrom mimid import mock, every, verify, gt, lt, gte\n\ndef foo(param):\n pass\n\nfunction_mock = mock(foo)\nevery(function_mock).with_args(gt(0)).returns(1)\n\nresult = function_mock(10)\n\nassert result == 1\nverify(function_mock).with_args(gt(5) | lt(15)).called(times=gte(1))\n\n```\n\n`capture` is a special matcher - it behaves like `any()` but additionally it \nstores given argument in provided slot.\n\nExample:\n\n```python\nfrom mimid import mock, every, slot, capture\n\ndef foo(param):\n pass\n\nfunction_mock = mock(foo)\nparam_slot = slot()\nevery(function_mock).with_args(capture(param_slot)).execute(lambda: param_slot.value + 1)\n\nresult = function_mock(1)\n\nassert result == 2\nassert param_slot.value == 1\n\n```\n\nAvailable matchers:\n\n| Matcher | Description |\n| ---------------- | ------------------------------------- |\n| `any` | match any value |\n| `eq` | match equal value |\n| `lt` | match lower value | \n| `lte` | match lower or equal value | \n| `gt` | match greater value | \n| `gte` | match greater or equal value | \n| `capture` | capture provided argument | \n\n## Authors\n\nCreated by [Konrad Ha\u0142as][halas-homepage].\n\n[halas-homepage]: https://konradhalas.pl\n[mockito]: https://site.mockito.org\n[mockk]: https://github.com/mockk/mockk\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/konradhalas/mimid", "keywords": "testing mocking", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "mimid", "package_url": "https://pypi.org/project/mimid/", "platform": "", "project_url": "https://pypi.org/project/mimid/", "project_urls": { "Homepage": "https://github.com/konradhalas/mimid" }, "release_url": "https://pypi.org/project/mimid/0.0.6/", "requires_dist": [ "pytest (>=4) ; extra == 'dev'", "pytest-cov ; extra == 'dev'", "coveralls ; extra == 'dev'", "black ; extra == 'dev'", "mypy ; extra == 'dev'", "pylint ; extra == 'dev'" ], "requires_python": ">=3.6", "summary": "Modern mocking library for Python.", "version": "0.0.6" }, "last_serial": 5520255, "releases": { "0.0.2": [ { "comment_text": "", "digests": { "md5": "ea53e37d935663a7bd53f28b3a83b2db", "sha256": "eb899f6ae7b5eb80d27677e98d3c8720e48f04e860ce23950e64223285605590" }, "downloads": -1, "filename": "mimid-0.0.2-py3-none-any.whl", "has_sig": false, "md5_digest": "ea53e37d935663a7bd53f28b3a83b2db", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 3668, "upload_time": "2019-06-09T21:27:54", "url": "https://files.pythonhosted.org/packages/c7/c8/9512420c41403c56064f654f8dd9f70d3d44e472baa25f1bb9f9be3e000d/mimid-0.0.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "91876aa1b1c6508ba76fca1eb7dc72e8", "sha256": "190e98295b77b339d325200d8756d941bbc525977f752c536e4c6d0d7dc69994" }, "downloads": -1, "filename": "mimid-0.0.2.tar.gz", "has_sig": false, "md5_digest": "91876aa1b1c6508ba76fca1eb7dc72e8", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 2792, "upload_time": "2019-06-09T21:27:56", "url": "https://files.pythonhosted.org/packages/1e/a8/ab1fe9a8d38ce9e68f72f5ddaeb59479f8c1ef2e7e850235bde166c868a2/mimid-0.0.2.tar.gz" } ], "0.0.4": [ { "comment_text": "", "digests": { "md5": "15a64c35688b4684f1b4e09655c34c45", "sha256": "c3b01cb024bf104b512685a11f9c74e12a6b32cdbe654b35541c355e8c59c059" }, "downloads": -1, "filename": "mimid-0.0.4-py3-none-any.whl", "has_sig": false, "md5_digest": "15a64c35688b4684f1b4e09655c34c45", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 3699, "upload_time": "2019-06-09T21:42:25", "url": "https://files.pythonhosted.org/packages/49/c8/a625026c92d2eb0090ad3f943bf3899b31a577e9c53ab508603127273ddb/mimid-0.0.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4146f7dc10ca12b9ad82f422a3e08b0c", "sha256": "7bb4c1d6923e3b27faccb47956717298a86aa467f55de81bd810716c6427b68a" }, "downloads": -1, "filename": "mimid-0.0.4.tar.gz", "has_sig": false, "md5_digest": "4146f7dc10ca12b9ad82f422a3e08b0c", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 2830, "upload_time": "2019-06-09T21:42:27", "url": "https://files.pythonhosted.org/packages/d2/91/fa74b4e0c7b89069e22cf162c0b23a2a3ba7ecc2b12b587b5e2710d07187/mimid-0.0.4.tar.gz" } ], "0.0.5": [ { "comment_text": "", "digests": { "md5": "08ceddceeca250ffa2fc6a81bd7c8535", "sha256": "a79e33a43e2e2f96171097886743fa0206f05262c018fad8f0ea4bfc4d983030" }, "downloads": -1, "filename": "mimid-0.0.5-py3-none-any.whl", "has_sig": false, "md5_digest": "08ceddceeca250ffa2fc6a81bd7c8535", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 4177, "upload_time": "2019-06-17T11:58:00", "url": "https://files.pythonhosted.org/packages/c3/2b/2bb78330d2b2f546855b78b2895ad3ccb8bc764c835e15cf65b07396455b/mimid-0.0.5-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e484feee22e1492db630bba540d84fce", "sha256": "e0884485aa78590955da2c4f2d10366846a5f5e89f3e2274bb1b539658faff92" }, "downloads": -1, "filename": "mimid-0.0.5.tar.gz", "has_sig": false, "md5_digest": "e484feee22e1492db630bba540d84fce", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 3380, "upload_time": "2019-06-17T11:58:02", "url": "https://files.pythonhosted.org/packages/f7/ca/175a0c0bae42aec0b0d3f89e1d3de0905dae0b1e48aaaec5f91d20482140/mimid-0.0.5.tar.gz" } ], "0.0.6": [ { "comment_text": "", "digests": { "md5": "ceb2105ce24927368512ff08dccf2bd6", "sha256": "5840fe0deeed22df68436c4cf2b625bbe9c54e62c14f8c9c30f6ce48492e6b5b" }, "downloads": -1, "filename": "mimid-0.0.6-py3-none-any.whl", "has_sig": false, "md5_digest": "ceb2105ce24927368512ff08dccf2bd6", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 8549, "upload_time": "2019-07-11T21:12:00", "url": "https://files.pythonhosted.org/packages/66/35/193f6d14350576f5956441538ca1dbc6fafc95ebf398fef08107f934ccd7/mimid-0.0.6-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7d45930af27f9c9d14da40780fc45868", "sha256": "49a8daf5de8ddf7e373d10ea9033f20d1492c5a4c2bf89b045223cf4bee0716c" }, "downloads": -1, "filename": "mimid-0.0.6.tar.gz", "has_sig": false, "md5_digest": "7d45930af27f9c9d14da40780fc45868", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 6984, "upload_time": "2019-07-11T21:12:02", "url": "https://files.pythonhosted.org/packages/69/f4/8e99e612a118b0718c9469ca4f91a23317ce97174c966bcbec3acc21c940/mimid-0.0.6.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "ceb2105ce24927368512ff08dccf2bd6", "sha256": "5840fe0deeed22df68436c4cf2b625bbe9c54e62c14f8c9c30f6ce48492e6b5b" }, "downloads": -1, "filename": "mimid-0.0.6-py3-none-any.whl", "has_sig": false, "md5_digest": "ceb2105ce24927368512ff08dccf2bd6", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 8549, "upload_time": "2019-07-11T21:12:00", "url": "https://files.pythonhosted.org/packages/66/35/193f6d14350576f5956441538ca1dbc6fafc95ebf398fef08107f934ccd7/mimid-0.0.6-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7d45930af27f9c9d14da40780fc45868", "sha256": "49a8daf5de8ddf7e373d10ea9033f20d1492c5a4c2bf89b045223cf4bee0716c" }, "downloads": -1, "filename": "mimid-0.0.6.tar.gz", "has_sig": false, "md5_digest": "7d45930af27f9c9d14da40780fc45868", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 6984, "upload_time": "2019-07-11T21:12:02", "url": "https://files.pythonhosted.org/packages/69/f4/8e99e612a118b0718c9469ca4f91a23317ce97174c966bcbec3acc21c940/mimid-0.0.6.tar.gz" } ] }