{ "info": { "author": "KPN DE Platform", "author_email": "de-platform@kpn.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Environment :: Web Environment", "Intended Audience :: Developers", "License :: OSI Approved :: Apache Software License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Topic :: Internet :: WWW/HTTP", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "Time Execution\n==============\n\n.. image:: https://secure.travis-ci.org/kpn-digital/py-timeexecution.svg?branch=master\n :target: http://travis-ci.org/kpn-digital/py-timeexecution?branch=master\n\n.. image:: https://img.shields.io/codecov/c/github/kpn-digital/py-timeexecution/master.svg\n :target: http://codecov.io/github/kpn-digital/py-timeexecution?branch=master\n\n.. image:: https://img.shields.io/pypi/v/timeexecution.svg\n :target: https://pypi.org/project/timeexecution\n\n.. image:: https://img.shields.io/pypi/pyversions/timeexecution.svg\n :target: https://pypi.org/project/timeexecution\n\n.. image:: https://readthedocs.org/projects/py-timeexecution/badge/?version=latest\n :target: http://py-timeexecution.readthedocs.org/en/latest/?badge=latest\n\n.. image:: https://img.shields.io/pypi/l/timeexecution.svg\n :target: https://pypi.org/project/timeexecution\n\n.. image:: https://img.shields.io/badge/code%20style-black-000000.svg\n\nThis package is designed to record application metrics into specific backends.\nWith the help of Grafana_ or Kibana_ you can easily use these metrics to create meaningful monitoring dashboards.\n\n\nFeatures\n--------\n\n- Sending data to multiple backends (e.g. ElasticSearch)\n- Custom backends\n- Hooks to include additional data per metric.\n\nAvailable backends\n------------------\n\n- InfluxDB 0.8\n- Elasticsearch >=5,<7\n- Kafka\n\n\nInstallation\n------------\n\nIf you want to use it with the ``ElasticSearchBackend``:\n\n.. code-block:: bash\n\n $ pip install timeexecution[elasticsearch]\n\nwith ``InfluxBackend``:\n\n.. code-block:: bash\n\n $ pip install timeexecution[influxdb]\n\nwith ``KafkaBackend``:\n\n.. code-block:: bash\n\n $ pip install timeexecution[kafka]\n\nor if you prefer to have all backends available and easily switch between them:\n\n.. code-block:: bash\n\n $ pip install timeexecution[all]\n\n\nUsage\n-----\n\nTo use this package you decorate the functions you want to time its execution.\nEvery wrapped function will create a metric consisting of 3 default values:\n\n- ``name`` - The name of the series the metric will be stored in. Byt default, timeexecution will use the fully qualified name of the decorated method or function (e.g. ).\n- ``value`` - The time it took in ms for the wrapped function to complete\n- ``hostname`` - The hostname of the machine the code is running on\n\nSee the following example\n\n.. code-block:: python\n\n from time_execution import settings, time_execution\n from time_execution.backends.influxdb import InfluxBackend\n from time_execution.backends.elasticsearch import ElasticsearchBackend\n\n # Setup the desired backend\n influx = InfluxBackend(host='influx', database='metrics', use_udp=False)\n elasticsearch = ElasticsearchBackend('elasticsearch', index='metrics')\n\n # Configure the time_execution decorator\n settings.configure(backends=[influx, elasticsearch])\n\n # Wrap the methods where u want the metrics\n @time_execution\n def hello():\n return 'World'\n\n # Now when we call hello() and we will get metrics in our backends\n hello()\n\nThis will result in an entry in the influxdb\n\n.. code-block:: json\n\n [\n {\n \"name\": \"__main__.hello\",\n \"columns\": [\n \"time\",\n \"sequence_number\",\n \"value\",\n \"hostname\",\n ],\n \"points\": [\n [\n 1449739813939,\n 1111950001,\n 312,\n \"machine.name\",\n ]\n ]\n }\n ]\n\nAnd the following in Elasticsearch\n\n.. code-block:: json\n\n [\n {\n \"_index\": \"metrics-2016.01.28\",\n \"_type\": \"metric\",\n \"_id\": \"AVKIp9DpnPWamvqEzFB3\",\n \"_score\": null,\n \"_source\": {\n \"timestamp\": \"2016-01-28T14:34:05.416968\",\n \"hostname\": \"dfaa4928109f\",\n \"name\": \"__main__.hello\",\n \"value\": 312\n },\n \"sort\": [\n 1453991645416\n ]\n }\n ]\n\nIt's also possible to run backend in different thread with logic behind it, to send metrics in bulk mode.\n\nFor example:\n\n.. code-block:: python\n\n from time_execution import settings, time_execution\n from time_execution.backends.threaded import ThreadedBackend\n\n # Setup threaded backend which will be run on separate thread\n threaded_backend = ThreadedBackend(\n backend=ElasticsearchBackend,\n backend_kwargs={\n \"host\" : \"elasticsearch\",\n \"index\": \"metrics\",\n }\n )\n\n # there is also possibility to configure backend by import path, like:\n threaded_backend = ThreadedBackend(\n backend=\"time_execution.backends.kafka.KafkaBackend\",\n #: any other configuration belongs to backend\n backend_kwargs={\n \"hosts\" : \"kafka\",\n \"topic\": \"metrics\"\n }\n )\n\n # Configure the time_execution decorator\n settings.configure(backends=[threaded_backend])\n\n # Wrap the methods where u want the metrics\n @time_execution\n def hello():\n return 'World'\n\n # Now when we call hello() we put metrics in queue to send it either in some configurable time later\n # or when queue will reach configurable limit.\n hello()\n\nIt's also possible to decorate coroutines or awaitables in Python >=3.5.\n\nFor example:\n\n.. code-block:: python\n\n import asyncio\n from time_execution import time_execution_async\n\n # ... Setup the desired backend(s) as described above ...\n\n # Wrap the methods where you want the metrics\n @time_execution_async\n async def hello():\n await asyncio.sleep(1)\n return 'World'\n\n # Now when we schedule hello() we will get metrics in our backends\n loop = asyncio.get_event_loop()\n loop.run_until_complete(hello())\n\n\n.. _usage-hooks: \n\nHooks\n-----\n\n``time_execution`` supports hooks where you can change the metric before its\nbeing sent to the backend.\n\nWith a hook you can add additional and change existing fields. This can be\nuseful for cases where you would like to add a column to the metric based on\nthe response of the wrapped function.\n\nA hook will always get 3 arguments:\n\n- ``response`` - The returned value of the wrapped function\n- ``exception`` - The raised exception of the wrapped function\n- ``metric`` - A dict containing the data to be send to the backend\n- ``func_args`` - Original args received by the wrapped function.\n- ``func_kwargs`` - Original kwargs received by the wrapped function.\n\nFrom within a hook you can change the `name` if you want the metrics to be split\ninto multiple series.\n\nSee the following example how to setup hooks.\n\n.. code-block:: python\n\n # Now lets create a hook\n def my_hook(response, exception, metric, func, func_args, func_kwargs):\n status_code = getattr(response, 'status_code', None)\n if status_code:\n return dict(\n name='{}.{}'.format(metric['name'], status_code),\n extra_field='foo bar'\n )\n\n # Configure the time_execution decorator, but now with hooks\n settings.configure(backends=[backend], hooks=[my_hook])\n\n\nThere is also possibility to create decorator with custom set of hooks. It is needed for example to track `celery` tasks.\n\n.. code-block:: python\n\n from multiprocessing import current_process\n # Hook for celery tasks\n def celery_hook(response, exception, metric, func, func_args, func_kwargs):\n \"\"\"\n Add celery worker-specific details into response.\n \"\"\"\n p = current_process()\n hook = {\n 'name': metric.get('name'),\n 'value': metric.get('value'),\n 'success': exception is None,\n 'process_name': p.name,\n 'process_pid': p.pid,\n }\n return hook\n\n # Create time_execution decorator with extra hooks\n time_execution_celery = time_execution(extra_hooks=[celery_hook])\n\n @celery.task\n @time_execution_celery\n def celery_task(self, **kwargs):\n return True\n\n # Or do it in place where it is needed\n @celery.task\n @time_execution(extra_hooks=[celery_hook])\n def celery_task(self, **kwargs):\n return True\n\n # Or override default hooks by custom ones. Just setup `disable_default_hooks` flag\n @celery.task\n @time_execution(extra_hooks=[celery_hook], disable_default_hooks=True)\n def celery_task(self, **kwargs):\n return True\n\n\n\nManually sending metrics\n------------------------\n\nYou can also send any metric you have manually to the backend. These will not\nadd the default values and will not hit the hooks.\n\nSee the following example.\n\n.. code-block:: python\n\n from time_execution import write_metric\n\n loadavg = os.getloadavg()\n write_metric('cpu.load.1m', value=loadavg[0])\n write_metric('cpu.load.5m', value=loadavg[1])\n write_metric('cpu.load.15m', value=loadavg[2])\n\n\nCustom Backend\n--------------\n\nWriting a custom backend is very simple, all you need to do is create a class\nwith a `write` method. It is not required to extend `BaseMetricsBackend`\nbut, in order to easily upgrade, we recommend you do.\n\n.. code-block:: python\n\n from time_execution.backends.base import BaseMetricsBackend\n\n\n class MetricsPrinter(BaseMetricsBackend):\n def write(self, name, **data):\n print(name, data)\n\n\nExample scenario\n----------------\n\nIn order to read the metrics, e.g. using ElasticSearch as a backend, the following lucene query could be used:\n\n.. code-block::\n\n name:\"__main__.hello\" AND hostname:dfaa4928109f\n\nFor more advanced query syntax, please have a look at the `Lucene documentation`_ and the `ElasticSearch Query DSL`_ reference.\n\n\nContribute\n----------\n\nYou have something to contribute? Great! There are a few things that may come in handy.\n\nTesting in this project is done via docker. There is a docker-compose to easily\nget all the required containers up and running.\n\nThere is a Makefile with a few targets that we use often:\n\n- ``make test``\n- ``make isort``\n- ``make lint``\n- ``make build``\n- ``make setup.py``\n\nAll of these make targets can be prefixed by ``docker/``. This will execute\nthe target inside the docker container instead of on your local machine.\nFor example ``make docker/build``.\n\n\n.. _Grafana: http://grafana.org/\n.. _Kibana: https://www.elastic.co/products/kibana\n.. _Lucene Documentation: https://lucene.apache.org/core/documentation.html\n.. _ElasticSearch Query DSL: https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl.html", "description_content_type": "", "docs_url": "https://pythonhosted.org/timeexecution/", "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/kpn-digital/py-timeexecution", "keywords": "", "license": "", "maintainer": "", "maintainer_email": "", "name": "timeexecution", "package_url": "https://pypi.org/project/timeexecution/", "platform": "", "project_url": "https://pypi.org/project/timeexecution/", "project_urls": { "Homepage": "https://github.com/kpn-digital/py-timeexecution" }, "release_url": "https://pypi.org/project/timeexecution/4.1.1/", "requires_dist": null, "requires_python": "", "summary": "Python project", "version": "4.1.1" }, "last_serial": 5624024, "releases": { "0.0.0": [ { "comment_text": "", "digests": { "md5": "1a8499dc8db29de1347da219c0a7cec8", "sha256": "87b7e4e0267d103e4a86baad4fcd2b24bef5c8a9d7da13cc46510ef64b037029" }, "downloads": -1, "filename": "timeexecution-0.0.0.tar.gz", "has_sig": false, "md5_digest": "1a8499dc8db29de1347da219c0a7cec8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17646, "upload_time": "2016-07-19T21:20:03", "url": "https://files.pythonhosted.org/packages/7a/3c/f6bf49519a751aa22ea7007edc33b5e1966638c4159738236c97bdaafa7f/timeexecution-0.0.0.tar.gz" } ], "1.10.1": [ { "comment_text": "", "digests": { "md5": "fa4d2f1a16703f4107cf6ae829b2378b", "sha256": "2ee6fa77f86edd27ab77b64556fbe3e7410627a620f5f2a724fb88bdc9116dfa" }, "downloads": -1, "filename": "timeexecution-1.10.1.tar.gz", "has_sig": false, "md5_digest": "fa4d2f1a16703f4107cf6ae829b2378b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20958, "upload_time": "2016-09-07T14:54:18", "url": "https://files.pythonhosted.org/packages/c4/24/211ff082807c585e2ca5c7963e26a22fb13e79eb7b7825699149e2df3908/timeexecution-1.10.1.tar.gz" } ], "1.10.2": [ { "comment_text": "", "digests": { "md5": "f7ec3bcc8e7dcb8e202ac0380036aea5", "sha256": "d768c1426f3513004282801ff87fe9b3b385cd69ec0903ab9cb5d88f143eb9cd" }, "downloads": -1, "filename": "timeexecution-1.10.2.tar.gz", "has_sig": false, "md5_digest": "f7ec3bcc8e7dcb8e202ac0380036aea5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20975, "upload_time": "2016-09-09T12:12:33", "url": "https://files.pythonhosted.org/packages/37/f4/96c844ff6414947066138582d5d2a9728333eb8ae050674369303ac0fec0/timeexecution-1.10.2.tar.gz" } ], "1.10.3": [ { "comment_text": "", "digests": { "md5": "f46d2b455ec0c79ab088778149a9873d", "sha256": "376d01a703ea09970b98f98828beaac10cec0c30fc19bc16efb38cf4303f998e" }, "downloads": -1, "filename": "timeexecution-1.10.3.tar.gz", "has_sig": false, "md5_digest": "f46d2b455ec0c79ab088778149a9873d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21103, "upload_time": "2016-09-29T12:30:46", "url": "https://files.pythonhosted.org/packages/34/34/4aebe115bde58743cf917621be72929e1b0b771bf2535f71073410562842/timeexecution-1.10.3.tar.gz" } ], "1.10.4": [ { "comment_text": "", "digests": { "md5": "e1a30208437f2bcd5bad8b19b07d2fde", "sha256": "7d1c63393d6b5f3c907bf0f2fc276294eba1ea66f747db59eb3ddcc7249441f3" }, "downloads": -1, "filename": "timeexecution-1.10.4.tar.gz", "has_sig": false, "md5_digest": "e1a30208437f2bcd5bad8b19b07d2fde", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21147, "upload_time": "2016-10-04T04:25:49", "url": "https://files.pythonhosted.org/packages/e8/8b/0b8982d1f8d2588fa0a9d3d3cc01f307e06be96069692cdbc9b1f39e5451/timeexecution-1.10.4.tar.gz" } ], "1.11": [ { "comment_text": "", "digests": { "md5": "b9a958b4178b9d84192eac4085cc6856", "sha256": "88661746582ef8602241c06267923b2603aad70baa53f6b372d8e06a961f59c6" }, "downloads": -1, "filename": "timeexecution-1.11.tar.gz", "has_sig": false, "md5_digest": "b9a958b4178b9d84192eac4085cc6856", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17480, "upload_time": "2017-01-02T12:04:11", "url": "https://files.pythonhosted.org/packages/c2/d9/f2c9911d8e2a6fdf462cf39d4616ef30fb884cf6fd7db441cff9ce5882b9/timeexecution-1.11.tar.gz" } ], "1.12": [ { "comment_text": "", "digests": { "md5": "ddfd3450ef2bcc0a49273a31af07b7b0", "sha256": "2d9bfb3d7e1ace7beaa0e1b087b77588d027fe52bbdb103298b24391920acb77" }, "downloads": -1, "filename": "timeexecution-1.12.tar.gz", "has_sig": false, "md5_digest": "ddfd3450ef2bcc0a49273a31af07b7b0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17520, "upload_time": "2017-04-18T08:52:16", "url": "https://files.pythonhosted.org/packages/ea/44/b842876a3ed7cb61542008d242307c5ca0418af71c2c21a677599c234b2c/timeexecution-1.12.tar.gz" } ], "1.4.0": [ { "comment_text": "", "digests": { "md5": "3dec8441830528c03cac81b558636823", "sha256": "99bf0f8e5f87d766248bb3b55d3918e2cf29413b9ad87948fcfc6ac1f4b6f7f9" }, "downloads": -1, "filename": "timeexecution-1.4.0.tar.gz", "has_sig": false, "md5_digest": "3dec8441830528c03cac81b558636823", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17116, "upload_time": "2016-03-12T13:37:33", "url": "https://files.pythonhosted.org/packages/bd/4b/4946c62a0afc9d4502e1cc5973094df3974e1fd4797e4de4d7af3d7236eb/timeexecution-1.4.0.tar.gz" } ], "1.5.0": [ { "comment_text": "", "digests": { "md5": "9c4c00019b50713faea7ab550dca6971", "sha256": "bf99984e6b030b14a8b8c89104cf1ec56611b930c9ff6a71415dbf6213060fe5" }, "downloads": -1, "filename": "timeexecution-1.5.0.tar.gz", "has_sig": false, "md5_digest": "9c4c00019b50713faea7ab550dca6971", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17140, "upload_time": "2016-05-10T10:16:13", "url": "https://files.pythonhosted.org/packages/dc/05/7284699cf8e166d772b4fa1d768e83beeace17ae6c371c84d95e161f96f9/timeexecution-1.5.0.tar.gz" } ], "1.6.0": [ { "comment_text": "", "digests": { "md5": "376aa2194da1ddc9a195aa314c1058a0", "sha256": "91db5a15df2ef2b8444e6740e0843a496fdc7b1056a4ab189087ef53b8d94fbc" }, "downloads": -1, "filename": "timeexecution-1.6.0.tar.gz", "has_sig": false, "md5_digest": "376aa2194da1ddc9a195aa314c1058a0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16880, "upload_time": "2016-05-12T15:33:23", "url": "https://files.pythonhosted.org/packages/fe/a7/c45bf01bc1fb25f362bf1847fff25fdebfba5a8da063da22e22f88d11215/timeexecution-1.6.0.tar.gz" } ], "1.6.1": [ { "comment_text": "", "digests": { "md5": "91a4fbc130c71c23c5dc465ab3f3a936", "sha256": "1beb2b43e5e4015398b4b5c23e776a80eef31e267028aa6b742208957d89531f" }, "downloads": -1, "filename": "timeexecution-1.6.1.tar.gz", "has_sig": false, "md5_digest": "91a4fbc130c71c23c5dc465ab3f3a936", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16957, "upload_time": "2016-05-13T11:59:09", "url": "https://files.pythonhosted.org/packages/53/c3/d8356d390809aff1952b5645a768bc1af0830e40bad75c75b4c30a83e657/timeexecution-1.6.1.tar.gz" } ], "1.7.0": [ { "comment_text": "", "digests": { "md5": "6003c8d49c7a4efe2316af8b600d095b", "sha256": "ca1104bcefeddabcc37ec66c0d2e002ce5aab42953755ce9b3b9617c7e758d6e" }, "downloads": -1, "filename": "timeexecution-1.7.0.tar.gz", "has_sig": false, "md5_digest": "6003c8d49c7a4efe2316af8b600d095b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16954, "upload_time": "2016-06-29T14:06:48", "url": "https://files.pythonhosted.org/packages/b9/a1/b655596242715cbd68d5ed87138f9781231189c40e3210daf0bec40ef602/timeexecution-1.7.0.tar.gz" } ], "1.7.1": [ { "comment_text": "", "digests": { "md5": "482fb94a76fd9d5e245120b9ab063200", "sha256": "019d0f9491a7b0d6c957347814737404bd302a9fef5242591d2dc38911854d34" }, "downloads": -1, "filename": "timeexecution-1.7.1.tar.gz", "has_sig": false, "md5_digest": "482fb94a76fd9d5e245120b9ab063200", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16961, "upload_time": "2016-06-29T15:01:39", "url": "https://files.pythonhosted.org/packages/30/ad/48a9d1411af1539f2f00b0441c378f85ee338de7fa5f5b100c23a749484f/timeexecution-1.7.1.tar.gz" } ], "1.8.0": [ { "comment_text": "", "digests": { "md5": "9acd3ba90f87f30cb64c654855e1ae38", "sha256": "b443ccc12de792cc03b09d7bce5b9a2c06b6ac357569538f94c7eade74d57a93" }, "downloads": -1, "filename": "timeexecution-1.8.0.tar.gz", "has_sig": false, "md5_digest": "9acd3ba90f87f30cb64c654855e1ae38", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17492, "upload_time": "2016-07-14T09:01:20", "url": "https://files.pythonhosted.org/packages/0a/8d/77d235f8bae860307dacd23178d230b52c28b8aad1713cdc5ff5e5582c44/timeexecution-1.8.0.tar.gz" } ], "1.9.0": [ { "comment_text": "", "digests": { "md5": "37837908fc901e12c33be6e51960b4b8", "sha256": "26fef3fe12c94ad947c2d59b61dee6f17f3c583373c5e28a5d568ee9acffc704" }, "downloads": -1, "filename": "timeexecution-1.9.0.tar.gz", "has_sig": false, "md5_digest": "37837908fc901e12c33be6e51960b4b8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17650, "upload_time": "2016-07-19T21:35:10", "url": "https://files.pythonhosted.org/packages/5a/c5/07890deed45f898fab6f248ccfe46cbffea8ee153ff01614b03e4f646799/timeexecution-1.9.0.tar.gz" } ], "2.0": [ { "comment_text": "", "digests": { "md5": "2ce72f2967898d9b11f0c1c1eb29f00f", "sha256": "b577790814e0a015714e8d15941fb4b633a8c0d5d6ccd03403bf6438f08cd34c" }, "downloads": -1, "filename": "timeexecution-2.0.tar.gz", "has_sig": false, "md5_digest": "2ce72f2967898d9b11f0c1c1eb29f00f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17924, "upload_time": "2017-05-04T14:44:30", "url": "https://files.pythonhosted.org/packages/dc/49/da58ab4e984698a924c23476561388911f5547360ced755b4f30d7cf70ef/timeexecution-2.0.tar.gz" } ], "2.1": [ { "comment_text": "", "digests": { "md5": "b1999fceed55228c62d9885271a4bfce", "sha256": "bddd5b69a1cd486129c88365d61f6584a081b752175394cf6db92e781fb677c7" }, "downloads": -1, "filename": "timeexecution-2.1.tar.gz", "has_sig": false, "md5_digest": "b1999fceed55228c62d9885271a4bfce", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17918, "upload_time": "2017-05-29T16:13:52", "url": "https://files.pythonhosted.org/packages/b4/9e/8f4ce96003b16a75e1ec4c3a55e1e4d47e35fde67911e72c5c77f4357691/timeexecution-2.1.tar.gz" } ], "3.0": [ { "comment_text": "", "digests": { "md5": "000314aeee16d22970a0281fd3e59360", "sha256": "e83a05bc85f587edb4598566692b1f1aad45dd4c859e89e36b1808158f811e47" }, "downloads": -1, "filename": "timeexecution-3.0.tar.gz", "has_sig": false, "md5_digest": "000314aeee16d22970a0281fd3e59360", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17881, "upload_time": "2017-06-02T10:21:49", "url": "https://files.pythonhosted.org/packages/de/86/fbde410f212089aeff917d6aa9fde191249bccb506156b93a248d17236a3/timeexecution-3.0.tar.gz" } ], "3.1.0": [ { "comment_text": "", "digests": { "md5": "9cb4e982a6878a6410960e47aa390ec7", "sha256": "f90c3d5e35a8695364ef3052fea02ba56989db95714f3dff4c5cbcd22c9ecf80" }, "downloads": -1, "filename": "timeexecution-3.1.0.tar.gz", "has_sig": false, "md5_digest": "9cb4e982a6878a6410960e47aa390ec7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21686, "upload_time": "2017-07-12T11:52:52", "url": "https://files.pythonhosted.org/packages/8c/37/e1597f845b55d7e3a987600f8c22f1b92d5c65f4425756b9ec901b97573a/timeexecution-3.1.0.tar.gz" } ], "3.2.0": [ { "comment_text": "", "digests": { "md5": "7b1937a346870c9f64e1c08f49fa422f", "sha256": "e7544ac043e6ecf3d8ac33866eb29c40d8510e8e2572b41d8cdee2cb31503814" }, "downloads": -1, "filename": "timeexecution-3.2.0.tar.gz", "has_sig": false, "md5_digest": "7b1937a346870c9f64e1c08f49fa422f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21247, "upload_time": "2018-02-20T10:29:05", "url": "https://files.pythonhosted.org/packages/bb/39/7008fb9be905b87f62826b065638c7f3cad21a84fbf831f18a7ec888e62e/timeexecution-3.2.0.tar.gz" } ], "3.3.0": [ { "comment_text": "", "digests": { "md5": "492c941eeb20332292df83087b2eb16f", "sha256": "090c8865cb8aba6a0301cd141da9d5108440ebe08eeeccc2477c8cd0e741f79b" }, "downloads": -1, "filename": "timeexecution-3.3.0.tar.gz", "has_sig": false, "md5_digest": "492c941eeb20332292df83087b2eb16f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21235, "upload_time": "2018-05-16T12:59:33", "url": "https://files.pythonhosted.org/packages/0a/dc/64b5588a857b22f43e18a7266441dcb823af975d73adb5f3504a06226098/timeexecution-3.3.0.tar.gz" } ], "4.0.0": [ { "comment_text": "", "digests": { "md5": "82ccbf5b78c778ad4c30e37215e494f8", "sha256": "c894670729fb98c154cfe3f4b98460edfb2388f5409ed80845a7f8a05eb0df75" }, "downloads": -1, "filename": "timeexecution-4.0.0.tar.gz", "has_sig": false, "md5_digest": "82ccbf5b78c778ad4c30e37215e494f8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26732, "upload_time": "2019-05-03T13:21:00", "url": "https://files.pythonhosted.org/packages/bf/02/650711b964e4f98c350c9de07cfab3760c921f29debae70c805b6ce6fa83/timeexecution-4.0.0.tar.gz" } ], "4.0.0a2": [ { "comment_text": "", "digests": { "md5": "c8ed4935e1a8ed426e8d2718df579307", "sha256": "abe3d6e14d2bf6b054971814e6c1c757407d73e25b7aaa7e67fee00f9470bdf7" }, "downloads": -1, "filename": "timeexecution-4.0.0a2.tar.gz", "has_sig": false, "md5_digest": "c8ed4935e1a8ed426e8d2718df579307", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 24568, "upload_time": "2019-02-05T09:42:48", "url": "https://files.pythonhosted.org/packages/b6/de/ad9ee85d7e61b2fad2e7a6b35e25c4e4f3969a345a3c575fc07064dc2cf3/timeexecution-4.0.0a2.tar.gz" } ], "4.1.0": [ { "comment_text": "", "digests": { "md5": "a531153e7144b51ff32f4b56075b6520", "sha256": "4b2384298b8f1548e2c2f3d8291db1630fd448cae2f01ce36b88c344c69a796c" }, "downloads": -1, "filename": "timeexecution-4.1.0.tar.gz", "has_sig": false, "md5_digest": "a531153e7144b51ff32f4b56075b6520", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 27159, "upload_time": "2019-05-10T13:08:03", "url": "https://files.pythonhosted.org/packages/fe/4c/adda68950d1810ecee7d731a6b9281e0a8f1d2bc9f6221155836fca5d54a/timeexecution-4.1.0.tar.gz" } ], "4.1.1": [ { "comment_text": "", "digests": { "md5": "1c6d244b93f9aa88704cc063e610b64e", "sha256": "a317506b5bbe576385470e625dd52a65caff8b342be40054d70fab3f73797523" }, "downloads": -1, "filename": "timeexecution-4.1.1.tar.gz", "has_sig": false, "md5_digest": "1c6d244b93f9aa88704cc063e610b64e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 27641, "upload_time": "2019-08-02T12:41:46", "url": "https://files.pythonhosted.org/packages/0a/57/7cfbcd3e149d448bbcebceb10c28fffaa8e2ef9867f527f35220820f1ebc/timeexecution-4.1.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "1c6d244b93f9aa88704cc063e610b64e", "sha256": "a317506b5bbe576385470e625dd52a65caff8b342be40054d70fab3f73797523" }, "downloads": -1, "filename": "timeexecution-4.1.1.tar.gz", "has_sig": false, "md5_digest": "1c6d244b93f9aa88704cc063e610b64e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 27641, "upload_time": "2019-08-02T12:41:46", "url": "https://files.pythonhosted.org/packages/0a/57/7cfbcd3e149d448bbcebceb10c28fffaa8e2ef9867f527f35220820f1ebc/timeexecution-4.1.1.tar.gz" } ] }