{ "info": { "author": "", "author_email": "", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: GNU General Public License v3 (GPLv3)", "Natural Language :: English", "Operating System :: OS Independent", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Topic :: Software Development :: Libraries :: Application Frameworks", "Topic :: Software Development :: Object Brokering", "Topic :: Utilities", "Typing :: Typed" ], "description": "Touchstone\n==========\n\n.. contents::\n :depth: 2\n :backlinks: none\n\nWhat is Touchstone?\n-------------------\n\nTouchstone is an annotations-driven Inversion of Control container for\nPython 3.6 and above.\n\nLinks:\n\n* `GitHub `__\n\n\nLearn by Example\n----------------\n\nAuto Wiring\n~~~~~~~~~~~\n\n.. code:: python\n\n from touchstone import Container\n\n class Child:\n pass\n\n class Parent:\n def __init__(self, child: Child) -> None:\n self.child = child\n\n\n container = Container()\n parent = container.make(Parent)\n\n assert isinstance(parent.child, Child)\n\nInterface Binding\n~~~~~~~~~~~~~~~~~\n\n.. code:: python\n\n from touchstone import Container\n\n class AbstractChild:\n pass\n\n class Child(AbstractChild):\n pass\n\n class Parent:\n def __init__(self, child: AbstractChild) -> None:\n self.child = child\n\n\n container = Container()\n container.bind(AbstractChild, Child)\n parent = container.make(Parent)\n\n assert isinstance(parent.child, Child)\n\nBinding with Factory Methods\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n.. code:: python\n\n from touchstone import Container\n\n class Child:\n def __init__(self, name: str) -> None:\n self.name = name\n\n class Parent:\n def __init__(self, child: Child) -> None:\n self.child = child\n\n\n container = Container()\n container.bind(Child, lambda: Child('them'))\n parent = container.make(Parent)\n\n assert isinstance(parent.child, Child)\n assert parent.child.name == 'them'\n\nBinding Singletons\n~~~~~~~~~~~~~~~~~~\n\n.. code:: python\n\n from touchstone import Container, SINGLETON\n\n class Child:\n def __init__(self, name: str) -> None:\n self.name = name\n\n class Parent:\n def __init__(self, child: Child) -> None:\n self.child = child\n\n\n container = Container()\n them_child = Child('them')\n container.bind_instance(Child, them_child)\n # Or...\n container.bind(Child, lambda: them_child, lifetime_strategy=SINGLETON)\n parent = container.make(Parent)\n\n assert isinstance(parent.child, Child)\n assert parent.child is them_child\n\nContextual Binding\n~~~~~~~~~~~~~~~~~~\n\n.. code:: python\n\n from touchstone import Container\n\n class Child:\n def __init__(self, name: str) -> None:\n self.name = name\n\n class Parent:\n def __init__(self, child1: Child, child2: Child) -> None:\n self.child1 = child1\n self.child2 = child2\n\n\n container = Container()\n container.bind_contextual(when=Parent, wants=Child, wants_name='child1', give=lambda: Child('her'))\n container.bind_contextual(when=Parent, wants=Child, wants_name='child2', give=lambda: Child('him'))\n parent = container.make(Parent)\n\n assert isinstance(parent.child1, Child)\n assert isinstance(parent.child2, Child)\n assert parent.child1.name == 'her'\n assert parent.child2.name == 'him'\n\nDjango Support\n--------------\n\nNow featuring Django support! New in v0.3.0\n\n* Configure your instance of ``touchstone.Container`` however you see fit.\n* In your main ``settings.py``, set ``TOUCHSTONE_CONTAINER_GETTER`` to\n the path to a callable that will return the singleton instance of\n ``touchstone.Container`` your app uses.\n\n * Note that your ``getter`` should build the ``Container`` precisely once, and\n then return that same ``Container`` on all subsequent calls. Build it as a\n singleton.\n\nTo get injected properties in your class-based views:\n\n* In your main ``settings.py``, add ``touchstone.django.InjectViewsMiddleware``\n to your ``MIDDLEWARE`` list.\n* Use class annotations on your class-based views. Cached Properties will be\n added to your view classes so that they automatically resolve using your\n configured touchstone container. For example:\n\n.. code:: python\n\n class MyView(View):\n something: MyObject\n def get(self, request):\n # You can now access self.something!\n\nTo get injected properties in your middleware, you'll need to do a\nlittle more work because we haven't found a good way to hook into\nDjango's middleware instantiation logic.\n\n.. code:: python\n\n from touchstone.django import inject_magic_properties\n\n @inject_magic_properties\n class MyMixin:\n something: MyObject\n # define your mixin here...\n # You'll be able to use `self.something` from within every instance method.\n\nCelery Tasks\n~~~~~~~~~~~~\n\nCelery tasks called can be applied to any callable with a decorator. For example:\n\n.. code:: python\n\n class MyLogger:\n def __init__(self, another_logger: AnotherLogger):\n self.another_logger = another_logger\n\n def log(self, msg):\n print(msg)\n self.another_logger.log(msg)\n\n @app.task\n def log_messages(msg):\n another_logger = AnotherLogger()\n my_logger = MyLogger(another_logger)\n\n my_logger.log(msg)\n\n log_messages.apply_async(args=['hello world'])\n\nHowever, if we want to refactor this code to make use of touchstone as a service locator:\n\n.. code:: python\n\n class MyLogger:\n def __init__(self, another_logger: AnotherLogger):\n self.another_logger = another_logger\n\n def log(self, msg):\n print(msg)\n self.another_logger.log(msg)\n\n @app.task\n def log_messages(msg):\n container = get_container()\n my_logger = container.make(MyLogger)\n\n my_logger.log(msg)\n\n log_messages.apply_async(args=['hello world'])\n\nEach task would then have quite a bit of repeated code to create the container for each task and then\nmake class instance we need.\n\n.. code:: python\n\n class MyLogger:\n def __init__(self, another_logger: AnotherLogger):\n self.another_logger = another_logger\n\n def log(self, msg):\n print(msg)\n self.another_logger.log(msg)\n\n @touchstone_task\n class LogMessagesTask:\n my_logger: MyLogger\n\n def run(self, msg):\n self.my_logger.log(msg)\n\n LogMessagesTask.apply_async(args=['hello world'])\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/gmaybrun/touchstone", "keywords": "", "license": "", "maintainer": "gmaybrun@gmail.com", "maintainer_email": "gmaybrun@gmail.com", "name": "touchstone", "package_url": "https://pypi.org/project/touchstone/", "platform": "", "project_url": "https://pypi.org/project/touchstone/", "project_urls": { "Homepage": "https://github.com/gmaybrun/touchstone" }, "release_url": "https://pypi.org/project/touchstone/2.0.3/", "requires_dist": [ "dataclasses", "setuptools (>=38.6.0) ; extra == 'dist'", "wheel (>=0.31.0) ; extra == 'dist'", "twine (>=1.11.0) ; extra == 'dist'", "django (==2.*) ; extra == 'django'", "django (==2.*) ; extra == 'django_celery'", "celery (==4.*) ; extra == 'django_celery'", "django (==2.*) ; extra == 'djangorestframework'", "djangorestframework (==3.*) ; extra == 'djangorestframework'", "pytest (==5.*) ; extra == 'tests'", "tox (==3.*) ; extra == 'tests'", "black (==19.3b0) ; extra == 'tests'", "isort (==4.*) ; extra == 'tests'", "flake8 (==3.6.*) ; extra == 'tests'", "flake8-tuple ; extra == 'tests'", "mypy ; extra == 'tests'", "docutils ; extra == 'tests'" ], "requires_python": "", "summary": "IoC framework driven by annotations and type hints", "version": "2.0.3", "yanked": false, "yanked_reason": null }, "last_serial": 6393117, "releases": { "0.1.1": [ { "comment_text": "", "digests": { "md5": "6a9138e898dd60924bc2dde6e9e229d7", "sha256": "f2e6699621fc605527292ce743fcdd11f8b847a9716fb91d8919d4c5aa8a423b" }, "downloads": -1, "filename": "touchstone-0.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "6a9138e898dd60924bc2dde6e9e229d7", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 18690, "upload_time": "2019-03-06T17:19:28", "upload_time_iso_8601": "2019-03-06T17:19:28.248456Z", "url": "https://files.pythonhosted.org/packages/9d/37/346797e79675b788749167aba0544691ad6e6a8b7b3904bfc47ecdb5adf9/touchstone-0.1.1-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "ae62c6bf2c105b535b71c1de3265e2c2", "sha256": "b7b5fe32743dba23a8438c8f6dc04d0431ea5b923332c5b01db7a0c923db21ae" }, "downloads": -1, "filename": "touchstone-0.1.1.tar.gz", "has_sig": false, "md5_digest": "ae62c6bf2c105b535b71c1de3265e2c2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5251, "upload_time": "2019-03-06T17:19:29", "upload_time_iso_8601": "2019-03-06T17:19:29.839902Z", "url": "https://files.pythonhosted.org/packages/8a/6e/77652ec5c91d16f0a2e06ed4fa40db7e401b6ee48183a3892338d9dd0546/touchstone-0.1.1.tar.gz", "yanked": false, "yanked_reason": null } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "87f57f244a8b9116f5f9ba2cceea173b", "sha256": "d9bf867c94f4bec030cdd16ce89ee31142b1443c6a9326ed764437069cf3e11e" }, "downloads": -1, "filename": "touchstone-0.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "87f57f244a8b9116f5f9ba2cceea173b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 19533, "upload_time": "2019-03-07T07:10:26", "upload_time_iso_8601": "2019-03-07T07:10:26.476881Z", "url": "https://files.pythonhosted.org/packages/83/cb/ed05ce9377ce717c01239c266d41ee7108aab622ab460c10b8e293689bc2/touchstone-0.2.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "63154ca578342ebfe102816717d27ab0", "sha256": "2928e9e6d6461c7f1bbc0a2227dd9d78ac031da430f911f97bdf6465bfc45a2d" }, "downloads": -1, "filename": "touchstone-0.2.0.tar.gz", "has_sig": false, "md5_digest": "63154ca578342ebfe102816717d27ab0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6243, "upload_time": "2019-03-07T07:10:27", "upload_time_iso_8601": "2019-03-07T07:10:27.628117Z", "url": "https://files.pythonhosted.org/packages/63/19/437b5e202cceb5f2f6a53d1633696015b66fef1aaab079364dd5037e6894/touchstone-0.2.0.tar.gz", "yanked": false, "yanked_reason": null } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "dd30cd80e0f65d604cead73a91b7a89c", "sha256": "ec4220d9cf120be7103a07b510ff00183eafd91d88e3aa32f1d5c371a1921a65" }, "downloads": -1, "filename": "touchstone-0.3.0-py3-none-any.whl", "has_sig": false, "md5_digest": "dd30cd80e0f65d604cead73a91b7a89c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 22071, "upload_time": "2019-03-15T01:27:10", "upload_time_iso_8601": "2019-03-15T01:27:10.217982Z", "url": "https://files.pythonhosted.org/packages/d9/95/75baa6cff0c85d7626b69221ba3e1d6d3403da46f011f7fd210c86f01aaa/touchstone-0.3.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "3fdce010a5e11b593fe8cbafe661999e", "sha256": "22856b46f7e83856e1ee62c6561272cc7ef82b7d2d969d61bb08cd8c1768c1eb" }, "downloads": -1, "filename": "touchstone-0.3.0.tar.gz", "has_sig": false, "md5_digest": "3fdce010a5e11b593fe8cbafe661999e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7713, "upload_time": "2019-03-15T01:27:11", "upload_time_iso_8601": "2019-03-15T01:27:11.793315Z", "url": "https://files.pythonhosted.org/packages/dd/39/95d3c7a2ceba2a2f6a7989112599d735adf6ce3ddac9ee0e7872822cf95c/touchstone-0.3.0.tar.gz", "yanked": false, "yanked_reason": null } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "a2b1e7a7dc5312f30a5757f6d09f3777", "sha256": "21dbeda91bade2d3623b177cd07a7b5cd35a439fabc1d721812c1643a93bf0ab" }, "downloads": -1, "filename": "touchstone-0.4.0-py3-none-any.whl", "has_sig": false, "md5_digest": "a2b1e7a7dc5312f30a5757f6d09f3777", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 22066, "upload_time": "2019-03-15T01:44:31", "upload_time_iso_8601": "2019-03-15T01:44:31.246248Z", "url": "https://files.pythonhosted.org/packages/28/3f/61fa4e75a5934b0cac860cb4864127b5bfd2ac4e6fa580a784be921be0a7/touchstone-0.4.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "f71432e5efd700ef2d96d21edef30432", "sha256": "00c1884a3b6e62151b3c138b1813f4c4aeabcc720c010cd5acf79758b9494295" }, "downloads": -1, "filename": "touchstone-0.4.0.tar.gz", "has_sig": false, "md5_digest": "f71432e5efd700ef2d96d21edef30432", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7737, "upload_time": "2019-03-15T01:44:32", "upload_time_iso_8601": "2019-03-15T01:44:32.681012Z", "url": "https://files.pythonhosted.org/packages/a3/2c/4d2f9baae0f595a27ce5d4c7f73a29f87aa9f5b0b2de8417746d60340fb3/touchstone-0.4.0.tar.gz", "yanked": false, "yanked_reason": null } ], "0.4.1": [ { "comment_text": "", "digests": { "md5": "4ba0192199c801bd7a91e10c7187965b", "sha256": "635b98818c9770554fd0d32a271f7ec112cb09e7d7d24859cb9ba48ff70b5efb" }, "downloads": -1, "filename": "touchstone-0.4.1-py3-none-any.whl", "has_sig": false, "md5_digest": "4ba0192199c801bd7a91e10c7187965b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 22148, "upload_time": "2019-10-25T18:56:15", "upload_time_iso_8601": "2019-10-25T18:56:15.034792Z", "url": "https://files.pythonhosted.org/packages/e1/7c/51222b1cfb0e657a35b40515ff281b29ba5d8a43860d1398236cfbab74c6/touchstone-0.4.1-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "7114118dea8b5599b0978494d707e88c", "sha256": "6e417f35f3329ec2b82ae235db697b84ed09723c2c9815c9d8248b764de0820c" }, "downloads": -1, "filename": "touchstone-0.4.1.tar.gz", "has_sig": false, "md5_digest": "7114118dea8b5599b0978494d707e88c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7845, "upload_time": "2019-10-25T18:56:16", "upload_time_iso_8601": "2019-10-25T18:56:16.560812Z", "url": "https://files.pythonhosted.org/packages/e7/97/632c940eefc02d33c582c1d11a26cc121afbdc6a08d7772956101b566dd2/touchstone-0.4.1.tar.gz", "yanked": false, "yanked_reason": null } ], "0.5.0": [ { "comment_text": "", "digests": { "md5": "e9442a8bf35d1584bcddb12547deea32", "sha256": "e809ab5a59b7965e737d44873910c845976271ba7ccc2f893faed2768800feda" }, "downloads": -1, "filename": "touchstone-0.5.0-py3-none-any.whl", "has_sig": false, "md5_digest": "e9442a8bf35d1584bcddb12547deea32", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 23105, "upload_time": "2019-10-25T19:46:39", "upload_time_iso_8601": "2019-10-25T19:46:39.291324Z", "url": "https://files.pythonhosted.org/packages/3c/55/111ae63bc3017b62ddcb54575bd9264040b72d819b78b4d19fb0467dbdad/touchstone-0.5.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "6327bb8f7958f19a7cb2bc7b0e7cc256", "sha256": "c4730f0185d5281a9c93ef73aca80b0e275706f20c416fe4cdb4b9cf08769cde" }, "downloads": -1, "filename": "touchstone-0.5.0.tar.gz", "has_sig": false, "md5_digest": "6327bb8f7958f19a7cb2bc7b0e7cc256", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8797, "upload_time": "2019-10-25T19:46:41", "upload_time_iso_8601": "2019-10-25T19:46:41.625513Z", "url": "https://files.pythonhosted.org/packages/2d/6f/976a7ac873bece2f2713524ff72ba3001dc5891db3a731cc4bd5d9c83142/touchstone-0.5.0.tar.gz", "yanked": false, "yanked_reason": null } ], "1.0.0": [ { "comment_text": "", "digests": { "md5": "88f630360fde3e8b95f33df4e3022db0", "sha256": "2510e490f94f70aafa77b905a6a41c0453cb62f2266a16a60fa4048ad5d4ac79" }, "downloads": -1, "filename": "touchstone-1.0.0-py3-none-any.whl", "has_sig": false, "md5_digest": "88f630360fde3e8b95f33df4e3022db0", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 23079, "upload_time": "2019-10-25T20:28:46", "upload_time_iso_8601": "2019-10-25T20:28:46.540689Z", "url": "https://files.pythonhosted.org/packages/50/c8/f7b66b812ee42e2839ed51623b4d4347728ba16f097f9c43e32b9ec050bf/touchstone-1.0.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "75fee91609a501a6c8602bd74f557d02", "sha256": "ad88f68d92134c2b64a8dffd77c8de4a023d4596a54e74bfbaf98ac1a1213567" }, "downloads": -1, "filename": "touchstone-1.0.0.tar.gz", "has_sig": false, "md5_digest": "75fee91609a501a6c8602bd74f557d02", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8809, "upload_time": "2019-10-25T20:28:48", "upload_time_iso_8601": "2019-10-25T20:28:48.521042Z", "url": "https://files.pythonhosted.org/packages/9f/d1/b11d1439322ce7f3df6447652560b78783a88be045bd05f5131f276f6977/touchstone-1.0.0.tar.gz", "yanked": false, "yanked_reason": null } ], "2.0.0": [ { "comment_text": "", "digests": { "md5": "40ad04133954183ec092051cdb0794c3", "sha256": "ca620c43b09fe0c1d2e9b84e4848b79f8a185a9a434b155e1dfee21ed20eef11" }, "downloads": -1, "filename": "touchstone-2.0.0-py3-none-any.whl", "has_sig": false, "md5_digest": "40ad04133954183ec092051cdb0794c3", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 23462, "upload_time": "2019-10-29T19:24:14", "upload_time_iso_8601": "2019-10-29T19:24:14.085092Z", "url": "https://files.pythonhosted.org/packages/aa/87/631c25a6e7dda07c2b0677e1e9d697a0ce1a75e93b61830bcbde714152c1/touchstone-2.0.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "952c2662ca97a58f6c213a5c49e96ad6", "sha256": "4e38ce66911a00cafb8af06f3106f7881a533a32f5d5ec9cc5a2b0aca34fe16e" }, "downloads": -1, "filename": "touchstone-2.0.0.tar.gz", "has_sig": false, "md5_digest": "952c2662ca97a58f6c213a5c49e96ad6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9123, "upload_time": "2019-10-29T19:24:16", "upload_time_iso_8601": "2019-10-29T19:24:16.172518Z", "url": "https://files.pythonhosted.org/packages/57/74/27e1a485558fc1ff896ac470a061db3d4dbcffcf9a011c73b37d69e8045e/touchstone-2.0.0.tar.gz", "yanked": false, "yanked_reason": null } ], "2.0.1": [ { "comment_text": "", "digests": { "md5": "6c8f2543fa1d2ea21c0498d455fd5d6c", "sha256": "72f6349b8720001e5b39046f199602db1effd4c284e2596814029f95c8788201" }, "downloads": -1, "filename": "touchstone-2.0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "6c8f2543fa1d2ea21c0498d455fd5d6c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 23552, "upload_time": "2019-10-30T20:44:26", "upload_time_iso_8601": "2019-10-30T20:44:26.029477Z", "url": "https://files.pythonhosted.org/packages/06/78/fb2f8da5e4112784af17de6d5d6308fb1572280c94bd3114da14ed98c103/touchstone-2.0.1-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "e155fd07b90ae52f36710b4987fb874b", "sha256": "4f7a87e2d705ae5997c05cbb71f23df050321b500e3e66bba330da7dddae660f" }, "downloads": -1, "filename": "touchstone-2.0.1.tar.gz", "has_sig": false, "md5_digest": "e155fd07b90ae52f36710b4987fb874b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9238, "upload_time": "2019-10-30T20:44:28", "upload_time_iso_8601": "2019-10-30T20:44:28.068463Z", "url": "https://files.pythonhosted.org/packages/82/dc/30a8745d90c47ccc551256fe3e39b3f6bdb4b7d844c70ce6b56553d7d5ff/touchstone-2.0.1.tar.gz", "yanked": false, "yanked_reason": null } ], "2.0.2": [ { "comment_text": "", "digests": { "md5": "68126d38718e29fbfc50534efadb1415", "sha256": "72553aa73217ecbe44b4d14737c40ea6a1bea76df44e27478f96310704625476" }, "downloads": -1, "filename": "touchstone-2.0.2-py3-none-any.whl", "has_sig": false, "md5_digest": "68126d38718e29fbfc50534efadb1415", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 23616, "upload_time": "2019-11-22T20:52:51", "upload_time_iso_8601": "2019-11-22T20:52:51.652423Z", "url": "https://files.pythonhosted.org/packages/2a/6b/28441b4f74396b7924ea9cadaf9f3ed11d644ffc481ee98c8d481d26e753/touchstone-2.0.2-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "5e9e2a6addaa2d936b4925fa84cc274d", "sha256": "16b719b11e13672529c91954ce9d717f257f474b1e06247b6fa3c0e8888c78b0" }, "downloads": -1, "filename": "touchstone-2.0.2.tar.gz", "has_sig": false, "md5_digest": "5e9e2a6addaa2d936b4925fa84cc274d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9325, "upload_time": "2019-11-22T20:52:53", "upload_time_iso_8601": "2019-11-22T20:52:53.675213Z", "url": "https://files.pythonhosted.org/packages/a7/36/ef74b75a9d70fecd486b19062ca760d154a8995b2ba4caf43d05cbed622e/touchstone-2.0.2.tar.gz", "yanked": false, "yanked_reason": null } ], "2.0.3": [ { "comment_text": "", "digests": { "md5": "9f8602da3e93099c03a0e384fba6b40e", "sha256": "54a61f654af99f830314a77a93036d7c13b53a7529d6c808ec28a112ce6af9b2" }, "downloads": -1, "filename": "touchstone-2.0.3-py3-none-any.whl", "has_sig": false, "md5_digest": "9f8602da3e93099c03a0e384fba6b40e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 23663, "upload_time": "2020-01-03T23:08:03", "upload_time_iso_8601": "2020-01-03T23:08:03.171827Z", "url": "https://files.pythonhosted.org/packages/4e/db/6f8dbad069af2f1ccba3876c16bf13069dc02cd0c8d4defe435183c09dfb/touchstone-2.0.3-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "268938230cacc6d6a1b78d0008838343", "sha256": "a92cc3d265736644e2906b95ec9888a2b763726ce784a1cdea7906f504c520a8" }, "downloads": -1, "filename": "touchstone-2.0.3.tar.gz", "has_sig": false, "md5_digest": "268938230cacc6d6a1b78d0008838343", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9359, "upload_time": "2020-01-03T23:08:06", "upload_time_iso_8601": "2020-01-03T23:08:06.842869Z", "url": "https://files.pythonhosted.org/packages/f8/13/fa9e3421377d83c161eb8adc1c46924a87dc8a393ba559436cd01d38e148/touchstone-2.0.3.tar.gz", "yanked": false, "yanked_reason": null } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "9f8602da3e93099c03a0e384fba6b40e", "sha256": "54a61f654af99f830314a77a93036d7c13b53a7529d6c808ec28a112ce6af9b2" }, "downloads": -1, "filename": "touchstone-2.0.3-py3-none-any.whl", "has_sig": false, "md5_digest": "9f8602da3e93099c03a0e384fba6b40e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 23663, "upload_time": "2020-01-03T23:08:03", "upload_time_iso_8601": "2020-01-03T23:08:03.171827Z", "url": "https://files.pythonhosted.org/packages/4e/db/6f8dbad069af2f1ccba3876c16bf13069dc02cd0c8d4defe435183c09dfb/touchstone-2.0.3-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "268938230cacc6d6a1b78d0008838343", "sha256": "a92cc3d265736644e2906b95ec9888a2b763726ce784a1cdea7906f504c520a8" }, "downloads": -1, "filename": "touchstone-2.0.3.tar.gz", "has_sig": false, "md5_digest": "268938230cacc6d6a1b78d0008838343", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9359, "upload_time": "2020-01-03T23:08:06", "upload_time_iso_8601": "2020-01-03T23:08:06.842869Z", "url": "https://files.pythonhosted.org/packages/f8/13/fa9e3421377d83c161eb8adc1c46924a87dc8a393ba559436cd01d38e148/touchstone-2.0.3.tar.gz", "yanked": false, "yanked_reason": null } ], "vulnerabilities": [] }