mock-alchemy


Namemock-alchemy JSON
Version 0.2.6 PyPI version JSON
download
home_pagehttps://github.com/rajivsarvepalli/mock-alchemy
SummarySQLAlchemy mock helpers.
upload_time2023-03-26 21:39:31
maintainer
docs_urlNone
authorRajiv Sarvepalli
requires_python>=3.7,<4.0
licenseMIT
keywords sqlalchemy mock testing sqlalchemy mock mock sqlalchemy
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            <p align="center"><a href="https://raw.githubusercontent.com/rajivsarvepalli/mock-alchemy/master/docs/_static/alchemy.svg"><img src="https://raw.githubusercontent.com/rajivsarvepalli/mock-alchemy/master/docs/_static/alchemy.svg" alt="alchemy bottle icon" height="60"/></a></p>
<h1 align="center">mock-alchemy</h1>
<p align="center">Simple and intuitive SQLAlchemy mock helpers.</p>

<p align="center">
    <a href="https://mock-alchemy.readthedocs.io/en/latest/?badge=latest"><img src="https://readthedocs.org/projects/mock-alchemy/badge/?version=latest"/></a>
    <a href="https://pypi.org/project/mock-alchemy/"><img src="https://img.shields.io/pypi/v/mock-alchemy.svg"/></a>
    <a href="https://github.com/rajivsarvepalli/mock-alchemy/actions?workflow=Tests"><img src="https://github.com/rajivsarvepalli/mock-alchemy/workflows/Tests/badge.svg"/></a>
</p>

<p align="center">
    <a href="https://codecov.io/gh/rajivsarvepalli/mock-alchemy"><img src="https://codecov.io/gh/rajivsarvepalli/mock-alchemy/branch/master/graph/badge.svg"/></a>
    <a href="https://pypi.org/project/mock-alchemy/"><img src="https://raw.githubusercontent.com/rajivsarvepalli/mock-alchemy/master/imgs/python_versions.svg"/></a>
        <a href="https://pepy.tech/project/mock-alchemy"><img src="https://pepy.tech/badge/mock-alchemy"/></a>
</p>
<br/><br/>

## 🤖 Mocking SQLAlchemy

SQLAlchemy is awesome.

Unittests are great.

Accessing DB during tests -
not so much. This library provides an easy way to mock SQLAlchemy's
session in unittests while preserving the ability to do sane asserts.

- Free software: MIT license
- GitHub: <https://github.com/rajivsarvepalli/mock-alchemy>

## 📚 Documentation

Full documentation is available at <http://mock-alchemy.rtfd.io/>. On
the documentation, you should be able to select a version of your choice
in order to view documentation of an older version if need be.

This README includes some basic examples, but more detailed examples are
included in the documentation, especially in the [user guide][]. If you
are looking for an API reference, it is also available on the
[documentation][].

## 📦 Installing

You can install `mock-alchemy` using pip:

    $ pip install mock-alchemy

If you want to use this package on Python 2.7 or Python 3.6, then
install `mock-alchemy` using:

    $ pip install "mock-alchemy>=0.1.0,<0.2.0"

Pip should auto-detect the correct version but this ensures the correct
version is downloaded for your needs.

[user guide]: https://mock-alchemy.readthedocs.io/en/latest/user_guide/
[documentation]: https://mock-alchemy.readthedocs.io/en/latest/api_reference/mock_alchemy.mocking.html

# 🔖 Versioning

There are several different versions of `mock-alchemy` available
depending on your needs. The versions `0.1.x` are available for use on
Python 2.7, Python 3.6+. The newer versions serve users who are on
Python 3.7+. For people interested in contributing, if you want to work
on Python 2.7 version checkout the branch <span
class="title-ref">0.1.x</span> and then create pull-requests to that
branch. There is a set of specific tests run for that branch on pushes
and pull-requests since there are different tests for the newer versions
of `mock-alchemy`. Check out [contributor guide][] for more information.

Documentation for the 0.1.0 version is [available][]. However, the
current documentation should do a sufficient job at illustrating both
the past and the features of the present version at least as of now.
Therefore, I suggest using the most recent documentation for now, and if
you want, you can switch using the readthedocs version system (click on
the drop-down menu on the bottom right of the screen on the
documentation or go to the [project page][]).

# 📤 Credit

The original library (`alchemy-mock`) was created by Miroslav
Shubernetskiy and Serkan Hoscai. This is a forked version due to a lack
of updates in the original library. It appeared that the `alchemy-mock`
project was no longer supported. Therefore, since I desired to add some
basic support for deleting, I created my own version of the library.

Full credit goes to the original creators for starting and building this
project. You can find the original package on [PyPi][] and [Github][].

[contributor guide]: http://mock-alchemy.rtfd.io/en/latest/contributor_guide
[available]: https://mock-alchemy.readthedocs.io/en/v0.1.0/
[project page]: https://readthedocs.org/projects/mock-alchemy/
[pypi]: https://pypi.org/project/alchemy-mock/
[github]: https://github.com/miki725/alchemy-mock

# âš™ Using

Normally SQLAlchemy's expressions cannot be easily compared
as comparison on binary expression produces yet another binary expression:

    >>> type((Model.foo == 5) == (Model.bar == 5))
    <class 'sqlalchemy.sql.elements.BinaryExpression'>

But they can be compared with this library:

    >>> ExpressionMatcher(Model.foo == 5) == (Model.bar == 5)
    False

`ExpressionMatcher` can be directly used:

    >>> from mock_alchemy.comparison import ExpressionMatcher
    >>> ExpressionMatcher(Model.foo == 5) == (Model.foo == 5)
    True

Alternatively `AlchemyMagicMock` can be used to mock out SQLAlchemy session:

    >>> from mock_alchemy.mocking import AlchemyMagicMock
    >>> session = AlchemyMagicMock()
    >>> session.query(Model).filter(Model.foo == 5).all()

    >>> session.query.return_value.filter.assert_called_once_with(Model.foo == 5)

In real world though session can be interacted with multiple times to query some data.
In those cases `UnifiedAlchemyMagicMock` can be used which combines various calls for easier assertions:

    >>> from mock_alchemy.mocking import UnifiedAlchemyMagicMock
    >>> session = UnifiedAlchemyMagicMock()

    >>> m = session.query(Model)
    >>> q = m.filter(Model.foo == 5)
    >>> if condition:
    ...     q = q.filter(Model.bar > 10).all()
    >>> data1 = q.all()
    >>> data2 = m.filter(Model.note == 'hello world').all()

    >>> session.filter.assert_has_calls([
    ...     mock.call(Model.foo == 5, Model.bar > 10),
    ...     mock.call(Model.note == 'hello world'),
    ... ])

Also real-data can be stubbed by criteria:

    >>> from mock_alchemy.mocking import UnifiedAlchemyMagicMock
    >>> session = UnifiedAlchemyMagicMock(data=[
    ...     (
    ...         [mock.call.query(Model),
    ...          mock.call.filter(Model.foo == 5, Model.bar > 10)],
    ...         [Model(foo=5, bar=11)]
    ...     ),
    ...     (
    ...         [mock.call.query(Model),
    ...          mock.call.filter(Model.note == 'hello world')],
    ...         [Model(note='hello world')]
    ...     ),
    ...     (
    ...         [mock.call.query(AnotherModel),
    ...          mock.call.filter(Model.foo == 5, Model.bar > 10)],
    ...         [AnotherModel(foo=5, bar=17)]
    ...     ),
    ... ])
    >>> session.query(Model).filter(Model.foo == 5).filter(Model.bar > 10).all()
    [Model(foo=5, bar=11)]
    >>> session.query(Model).filter(Model.note == 'hello world').all()
    [Model(note='hello world')]
    >>> session.query(AnotherModel).filter(Model.foo == 5).filter(Model.bar > 10).all()
    [AnotherModel(foo=5, bar=17)]
    >>> session.query(AnotherModel).filter(Model.note == 'hello world').all()
    []

The `UnifiedAlchemyMagicMock` can partially fake session mutations
such as `session.add(instance)`. For example:

    >>> session = UnifiedAlchemyMagicMock()
    >>> session.add(Model(pk=1, foo='bar'))
    >>> session.add(Model(pk=2, foo='baz'))
    >>> session.query(Model).all()
    [Model(foo='bar'), Model(foo='baz')]
    >>> session.query(Model).get(1)
    Model(foo='bar')
    >>> session.query(Model).get(2)
    Model(foo='baz')

Note that its partially correct since if added models are filtered on,
session is unable to actually apply any filters so it returns everything:

    >>> session.query(Model).filter(Model.foo == 'bar').all()
    [Model(foo='bar'), Model(foo='baz')]

Finally, `UnifiedAlchemyMagicMock` can partially fake deleting. Anything that can be
accessed with `all` can also be deleted. For example:

    >>> s = UnifiedAlchemyMagicMock()
    >>> s.add(SomeClass(pk1=1, pk2=1))
    >>> s.add_all([SomeClass(pk1=2, pk2=2)])
    >>> s.query(SomeClass).all()
    [1, 2]
    >>> s.query(SomeClass).delete()
    2
    >>> s.query(SomeClass).all()
    []

Note the limitation for dynamic sessions remains the same. Additionally, the delete will not be propagated across
queries (only unified in the exact same query). As in, if there are multiple queries in which the 'same'
object is present, this library considers them separate objects. For example:

    >>> s = UnifiedAlchemyMagicMock(data=[
    ...     (
    ...         [mock.call.query('foo'),
    ...          mock.call.filter(c == 'one', c == 'two')],
    ...         [SomeClass(pk1=1, pk2=1), SomeClass(pk1=2, pk2=2)]
    ...     ),
    ...     (
    ...         [mock.call.query('foo'),
    ...          mock.call.filter(c == 'one', c == 'two'),
    ...          mock.call.order_by(c)],
    ...         [SomeClass(pk1=2, pk2=2), SomeClass(pk1=1, pk2=1)]
    ...     ),
    ...     (
    ...         [mock.call.filter(c == 'three')],
    ...         [SomeClass(pk1=3, pk2=3)]
    ...     ),
    ...     (
    ...         [mock.call.query('foo'),
    ...          mock.call.filter(c == 'one', c == 'two', c == 'three')],
    ...         [SomeClass(pk1=1, pk2=1), SomeClass(pk1=2, pk2=2), SomeClass(pk1=3, pk2=3)]
    ...     ),
    ... ])

    >>> s.query('foo').filter(c == 'three').delete()
    1
    >>> s.query('foo').filter(c == 'three').all()
    []
    >>> s.query('foo').filter(c == 'one').filter(c == 'two').filter(c == 'three').all()
    [1, 2, 3]

The item referred to by `c == 'three'` is still present in the filtered query despite the individual item being deleted.

# 👷 Contributing

Contributions are welcome. To learn more, see the [Contributor Guide][].

# 📕 License

Distributed under the terms of the [MIT][] license, _mock-alchemy_ is
free and open source software.

# 💥 Issues

If you encounter any issues or problems, please [file an issue][] along
with a detailed description.

[contributor guide]: https://mock-alchemy.readthedocs.io/en/latest/contributor_guide/
[mit]: http://opensource.org/licenses/MIT
[file an issue]: https://github.com/rajivsarvepalli/mock-alchemy/issues

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/rajivsarvepalli/mock-alchemy",
    "name": "mock-alchemy",
    "maintainer": "",
    "docs_url": null,
    "requires_python": ">=3.7,<4.0",
    "maintainer_email": "",
    "keywords": "sqlalchemy mock testing,sqlalchemy mock,mock sqlalchemy",
    "author": "Rajiv Sarvepalli",
    "author_email": "rajiv@sarvepalli.net",
    "download_url": "https://files.pythonhosted.org/packages/a7/80/5af6036ed9a97d927c36384b63ea2f270224726cda7f1402cb62781d7054/mock_alchemy-0.2.6.tar.gz",
    "platform": null,
    "description": "<p align=\"center\"><a href=\"https://raw.githubusercontent.com/rajivsarvepalli/mock-alchemy/master/docs/_static/alchemy.svg\"><img src=\"https://raw.githubusercontent.com/rajivsarvepalli/mock-alchemy/master/docs/_static/alchemy.svg\" alt=\"alchemy bottle icon\" height=\"60\"/></a></p>\n<h1 align=\"center\">mock-alchemy</h1>\n<p align=\"center\">Simple and intuitive SQLAlchemy mock helpers.</p>\n\n<p align=\"center\">\n    <a href=\"https://mock-alchemy.readthedocs.io/en/latest/?badge=latest\"><img src=\"https://readthedocs.org/projects/mock-alchemy/badge/?version=latest\"/></a>\n    <a href=\"https://pypi.org/project/mock-alchemy/\"><img src=\"https://img.shields.io/pypi/v/mock-alchemy.svg\"/></a>\n    <a href=\"https://github.com/rajivsarvepalli/mock-alchemy/actions?workflow=Tests\"><img src=\"https://github.com/rajivsarvepalli/mock-alchemy/workflows/Tests/badge.svg\"/></a>\n</p>\n\n<p align=\"center\">\n    <a href=\"https://codecov.io/gh/rajivsarvepalli/mock-alchemy\"><img src=\"https://codecov.io/gh/rajivsarvepalli/mock-alchemy/branch/master/graph/badge.svg\"/></a>\n    <a href=\"https://pypi.org/project/mock-alchemy/\"><img src=\"https://raw.githubusercontent.com/rajivsarvepalli/mock-alchemy/master/imgs/python_versions.svg\"/></a>\n        <a href=\"https://pepy.tech/project/mock-alchemy\"><img src=\"https://pepy.tech/badge/mock-alchemy\"/></a>\n</p>\n<br/><br/>\n\n## \ud83e\udd16 Mocking SQLAlchemy\n\nSQLAlchemy is awesome.\n\nUnittests are great.\n\nAccessing DB during tests -\nnot so much. This library provides an easy way to mock SQLAlchemy's\nsession in unittests while preserving the ability to do sane asserts.\n\n- Free software: MIT license\n- GitHub: <https://github.com/rajivsarvepalli/mock-alchemy>\n\n## \ud83d\udcda Documentation\n\nFull documentation is available at <http://mock-alchemy.rtfd.io/>. On\nthe documentation, you should be able to select a version of your choice\nin order to view documentation of an older version if need be.\n\nThis README includes some basic examples, but more detailed examples are\nincluded in the documentation, especially in the [user guide][]. If you\nare looking for an API reference, it is also available on the\n[documentation][].\n\n## \ud83d\udce6 Installing\n\nYou can install `mock-alchemy` using pip:\n\n    $ pip install mock-alchemy\n\nIf you want to use this package on Python 2.7 or Python 3.6, then\ninstall `mock-alchemy` using:\n\n    $ pip install \"mock-alchemy>=0.1.0,<0.2.0\"\n\nPip should auto-detect the correct version but this ensures the correct\nversion is downloaded for your needs.\n\n[user guide]: https://mock-alchemy.readthedocs.io/en/latest/user_guide/\n[documentation]: https://mock-alchemy.readthedocs.io/en/latest/api_reference/mock_alchemy.mocking.html\n\n# \ud83d\udd16 Versioning\n\nThere are several different versions of `mock-alchemy` available\ndepending on your needs. The versions `0.1.x` are available for use on\nPython 2.7, Python 3.6+. The newer versions serve users who are on\nPython 3.7+. For people interested in contributing, if you want to work\non Python 2.7 version checkout the branch <span\nclass=\"title-ref\">0.1.x</span> and then create pull-requests to that\nbranch. There is a set of specific tests run for that branch on pushes\nand pull-requests since there are different tests for the newer versions\nof `mock-alchemy`. Check out [contributor guide][] for more information.\n\nDocumentation for the 0.1.0 version is [available][]. However, the\ncurrent documentation should do a sufficient job at illustrating both\nthe past and the features of the present version at least as of now.\nTherefore, I suggest using the most recent documentation for now, and if\nyou want, you can switch using the readthedocs version system (click on\nthe drop-down menu on the bottom right of the screen on the\ndocumentation or go to the [project page][]).\n\n# \ud83d\udce4 Credit\n\nThe original library (`alchemy-mock`) was created by Miroslav\nShubernetskiy and Serkan Hoscai. This is a forked version due to a lack\nof updates in the original library. It appeared that the `alchemy-mock`\nproject was no longer supported. Therefore, since I desired to add some\nbasic support for deleting, I created my own version of the library.\n\nFull credit goes to the original creators for starting and building this\nproject. You can find the original package on [PyPi][] and [Github][].\n\n[contributor guide]: http://mock-alchemy.rtfd.io/en/latest/contributor_guide\n[available]: https://mock-alchemy.readthedocs.io/en/v0.1.0/\n[project page]: https://readthedocs.org/projects/mock-alchemy/\n[pypi]: https://pypi.org/project/alchemy-mock/\n[github]: https://github.com/miki725/alchemy-mock\n\n# \u2699 Using\n\nNormally SQLAlchemy's expressions cannot be easily compared\nas comparison on binary expression produces yet another binary expression:\n\n    >>> type((Model.foo == 5) == (Model.bar == 5))\n    <class 'sqlalchemy.sql.elements.BinaryExpression'>\n\nBut they can be compared with this library:\n\n    >>> ExpressionMatcher(Model.foo == 5) == (Model.bar == 5)\n    False\n\n`ExpressionMatcher` can be directly used:\n\n    >>> from mock_alchemy.comparison import ExpressionMatcher\n    >>> ExpressionMatcher(Model.foo == 5) == (Model.foo == 5)\n    True\n\nAlternatively `AlchemyMagicMock` can be used to mock out SQLAlchemy session:\n\n    >>> from mock_alchemy.mocking import AlchemyMagicMock\n    >>> session = AlchemyMagicMock()\n    >>> session.query(Model).filter(Model.foo == 5).all()\n\n    >>> session.query.return_value.filter.assert_called_once_with(Model.foo == 5)\n\nIn real world though session can be interacted with multiple times to query some data.\nIn those cases `UnifiedAlchemyMagicMock` can be used which combines various calls for easier assertions:\n\n    >>> from mock_alchemy.mocking import UnifiedAlchemyMagicMock\n    >>> session = UnifiedAlchemyMagicMock()\n\n    >>> m = session.query(Model)\n    >>> q = m.filter(Model.foo == 5)\n    >>> if condition:\n    ...     q = q.filter(Model.bar > 10).all()\n    >>> data1 = q.all()\n    >>> data2 = m.filter(Model.note == 'hello world').all()\n\n    >>> session.filter.assert_has_calls([\n    ...     mock.call(Model.foo == 5, Model.bar > 10),\n    ...     mock.call(Model.note == 'hello world'),\n    ... ])\n\nAlso real-data can be stubbed by criteria:\n\n    >>> from mock_alchemy.mocking import UnifiedAlchemyMagicMock\n    >>> session = UnifiedAlchemyMagicMock(data=[\n    ...     (\n    ...         [mock.call.query(Model),\n    ...          mock.call.filter(Model.foo == 5, Model.bar > 10)],\n    ...         [Model(foo=5, bar=11)]\n    ...     ),\n    ...     (\n    ...         [mock.call.query(Model),\n    ...          mock.call.filter(Model.note == 'hello world')],\n    ...         [Model(note='hello world')]\n    ...     ),\n    ...     (\n    ...         [mock.call.query(AnotherModel),\n    ...          mock.call.filter(Model.foo == 5, Model.bar > 10)],\n    ...         [AnotherModel(foo=5, bar=17)]\n    ...     ),\n    ... ])\n    >>> session.query(Model).filter(Model.foo == 5).filter(Model.bar > 10).all()\n    [Model(foo=5, bar=11)]\n    >>> session.query(Model).filter(Model.note == 'hello world').all()\n    [Model(note='hello world')]\n    >>> session.query(AnotherModel).filter(Model.foo == 5).filter(Model.bar > 10).all()\n    [AnotherModel(foo=5, bar=17)]\n    >>> session.query(AnotherModel).filter(Model.note == 'hello world').all()\n    []\n\nThe `UnifiedAlchemyMagicMock` can partially fake session mutations\nsuch as `session.add(instance)`. For example:\n\n    >>> session = UnifiedAlchemyMagicMock()\n    >>> session.add(Model(pk=1, foo='bar'))\n    >>> session.add(Model(pk=2, foo='baz'))\n    >>> session.query(Model).all()\n    [Model(foo='bar'), Model(foo='baz')]\n    >>> session.query(Model).get(1)\n    Model(foo='bar')\n    >>> session.query(Model).get(2)\n    Model(foo='baz')\n\nNote that its partially correct since if added models are filtered on,\nsession is unable to actually apply any filters so it returns everything:\n\n    >>> session.query(Model).filter(Model.foo == 'bar').all()\n    [Model(foo='bar'), Model(foo='baz')]\n\nFinally, `UnifiedAlchemyMagicMock` can partially fake deleting. Anything that can be\naccessed with `all` can also be deleted. For example:\n\n    >>> s = UnifiedAlchemyMagicMock()\n    >>> s.add(SomeClass(pk1=1, pk2=1))\n    >>> s.add_all([SomeClass(pk1=2, pk2=2)])\n    >>> s.query(SomeClass).all()\n    [1, 2]\n    >>> s.query(SomeClass).delete()\n    2\n    >>> s.query(SomeClass).all()\n    []\n\nNote the limitation for dynamic sessions remains the same. Additionally, the delete will not be propagated across\nqueries (only unified in the exact same query). As in, if there are multiple queries in which the 'same'\nobject is present, this library considers them separate objects. For example:\n\n    >>> s = UnifiedAlchemyMagicMock(data=[\n    ...     (\n    ...         [mock.call.query('foo'),\n    ...          mock.call.filter(c == 'one', c == 'two')],\n    ...         [SomeClass(pk1=1, pk2=1), SomeClass(pk1=2, pk2=2)]\n    ...     ),\n    ...     (\n    ...         [mock.call.query('foo'),\n    ...          mock.call.filter(c == 'one', c == 'two'),\n    ...          mock.call.order_by(c)],\n    ...         [SomeClass(pk1=2, pk2=2), SomeClass(pk1=1, pk2=1)]\n    ...     ),\n    ...     (\n    ...         [mock.call.filter(c == 'three')],\n    ...         [SomeClass(pk1=3, pk2=3)]\n    ...     ),\n    ...     (\n    ...         [mock.call.query('foo'),\n    ...          mock.call.filter(c == 'one', c == 'two', c == 'three')],\n    ...         [SomeClass(pk1=1, pk2=1), SomeClass(pk1=2, pk2=2), SomeClass(pk1=3, pk2=3)]\n    ...     ),\n    ... ])\n\n    >>> s.query('foo').filter(c == 'three').delete()\n    1\n    >>> s.query('foo').filter(c == 'three').all()\n    []\n    >>> s.query('foo').filter(c == 'one').filter(c == 'two').filter(c == 'three').all()\n    [1, 2, 3]\n\nThe item referred to by `c == 'three'` is still present in the filtered query despite the individual item being deleted.\n\n# \ud83d\udc77 Contributing\n\nContributions are welcome. To learn more, see the [Contributor Guide][].\n\n# \ud83d\udcd5 License\n\nDistributed under the terms of the [MIT][] license, _mock-alchemy_ is\nfree and open source software.\n\n# \ud83d\udca5 Issues\n\nIf you encounter any issues or problems, please [file an issue][] along\nwith a detailed description.\n\n[contributor guide]: https://mock-alchemy.readthedocs.io/en/latest/contributor_guide/\n[mit]: http://opensource.org/licenses/MIT\n[file an issue]: https://github.com/rajivsarvepalli/mock-alchemy/issues\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "SQLAlchemy mock helpers.",
    "version": "0.2.6",
    "split_keywords": [
        "sqlalchemy mock testing",
        "sqlalchemy mock",
        "mock sqlalchemy"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "aa938d1f7ee9fa858d1c13511de6e0bedf7f57d15e9c7aab0e9fdf4d66074417",
                "md5": "3c1774ced5f6bacab94c6b407def08a7",
                "sha256": "d5e17f2c92d0299d70cd9a0d3c8f96f759a81c285c76b03f4192451583bf865f"
            },
            "downloads": -1,
            "filename": "mock_alchemy-0.2.6-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "3c1774ced5f6bacab94c6b407def08a7",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.7,<4.0",
            "size": 16410,
            "upload_time": "2023-03-26T21:39:29",
            "upload_time_iso_8601": "2023-03-26T21:39:29.486112Z",
            "url": "https://files.pythonhosted.org/packages/aa/93/8d1f7ee9fa858d1c13511de6e0bedf7f57d15e9c7aab0e9fdf4d66074417/mock_alchemy-0.2.6-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "a7805af6036ed9a97d927c36384b63ea2f270224726cda7f1402cb62781d7054",
                "md5": "b1378b63003f6ee48393b9e6e2ae7ff7",
                "sha256": "807cc2bd7f658fb98292900052eaa6eeb4a65b2d62364e639462480a275299ef"
            },
            "downloads": -1,
            "filename": "mock_alchemy-0.2.6.tar.gz",
            "has_sig": false,
            "md5_digest": "b1378b63003f6ee48393b9e6e2ae7ff7",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.7,<4.0",
            "size": 17361,
            "upload_time": "2023-03-26T21:39:31",
            "upload_time_iso_8601": "2023-03-26T21:39:31.339680Z",
            "url": "https://files.pythonhosted.org/packages/a7/80/5af6036ed9a97d927c36384b63ea2f270224726cda7f1402cb62781d7054/mock_alchemy-0.2.6.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2023-03-26 21:39:31",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "github_user": "rajivsarvepalli",
    "github_project": "mock-alchemy",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "requirements": [],
    "lcname": "mock-alchemy"
}
        
Elapsed time: 0.72064s