{ "info": { "author": "Remi Rampin", "author_email": "remirampin@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Intended Audience :: Developers", "Intended Audience :: System Administrators", "License :: OSI Approved :: BSD License", "Operating System :: OS Independent", "Topic :: Internet", "Topic :: Utilities" ], "description": "api_stats tool\n==============\n\napi_stats is a Python tool aimed at recording statistics from an API endpoint. For example, the GitHub API gives out a single number of downloads for each release; by running this tool, you can easily graph rolling averages and historical figures.\n\nQuickstart\n----------\n\napi_stats loads a \"configuration file\" that tells it what to fetch and which fields to record. This file is a Python script that will be loaded by api_stats, with a single global ``stats`` that acts as the interface with the program. This interface currently offers two functions: ``record(key, value)``, and ``get_json(url)``.\n\nHere is an example configuration file, that records the number of downloads of each file from GitHub releases:\n\n.. code-block:: python\n\n releases = stats.get_json(\n \"https://api.github.com/repos/remram44/api_stats/releases\")\n for release in releases:\n relname = release.get('tag_name') or release['name']\n for asset in release['assets']:\n stats.record('%s/%s' % (relname, asset['name']),\n asset['download_count'])\n\nThen you can plot the data, for example using matplotlib:\n\n.. code-block:: bash\n\n python -m api_stats.plot -m '^(.+)$' 'api_stats:\\g<1>' data.jsonl\n\nA more complex example\n----------------------\n\nYou might want to use functions to factor the retrieval of data points from a specific source:\n\n.. code-block:: python\n\n def github(repo):\n releases = stats.get_json(\n \"https://api.github.com/repos/%s/releases\" % repo)\n for release in releases:\n if release['draft']:\n continue\n relname = release.get('tag_name') or release['name']\n for asset in release['assets']:\n stats.record('github/%s/%s/%s' % (repo, relname, asset['name']),\n asset['download_count'])\n\n\n github('VisTrails/VisTrails')\n github('remram44/api_stats')\n\n\n def pypi(pkg):\n releases = stats.get_json(\n \"https://pypi.python.org/pypi/%s/json\" % pkg)['releases']\n for relname, release in releases.items():\n for asset in release:\n stats.record('pypi/%s/%s/%s' % (pkg, relname, asset['filename']),\n asset['downloads'])\n\n\n pypi('VisTrails')\n pypi('api_stats')\n\nThis will record data under ``pypi///`` and ``github////``. You can then plot the data, one figure per project, aggregated by version but adding PyPI and GitHub together, using:\n\n.. code-block:: bash\n\n python -m api_stats.plot \\\n -m '^pypi/([^/]+)/([^/]+)/.+$' '\\g<1>:\\g<2>' \\\n -m '^github/[^/]+/([^/]+)/v([^/]+)/.+$' '\\g<1>:\\g<2>' \\\n releases.jsonl\n\n.. image:: https://cloud.githubusercontent.com/assets/426784/10232482/0550d7e0-6857-11e5-835f-86631dd89b4d.png\n :alt: Example Plot with matplotlib", "description_content_type": null, "docs_url": null, "download_url": null, "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/remram44/api_stats", "keywords": "api,log,record,stats,statistics,graph", "license": "BSD", "maintainer": null, "maintainer_email": null, "name": "api_stats", "package_url": "https://pypi.org/project/api_stats/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/api_stats/", "project_urls": { "Homepage": "https://github.com/remram44/api_stats" }, "release_url": "https://pypi.org/project/api_stats/0.3/", "requires_dist": null, "requires_python": null, "summary": "Record historical statistics from an API that only offers current numbers.", "version": "0.3" }, "last_serial": 1747887, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "ea18cd613a7f8ca951c436a9e20042ab", "sha256": "7f7e9216da4381aa673f5da6bc2884424ff8f875749efb582bb89738b8671cd2" }, "downloads": -1, "filename": "api_stats-0.1-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "ea18cd613a7f8ca951c436a9e20042ab", "packagetype": "bdist_wheel", "python_version": "any", "requires_python": null, "size": 5114, "upload_time": "2015-09-25T19:50:48", "url": "https://files.pythonhosted.org/packages/f7/f7/aeaa7144e833cb888b85e024b0a47dc36c6f39e6d56e0b1570f7d5b2c8d9/api_stats-0.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "dc3993017a4a850fcbcfe3b3b06ce372", "sha256": "f3ae7b299bd785176bde553ae9708b8aa256e3ae87bf6f327ccdf0ab8c1d98c9" }, "downloads": -1, "filename": "api_stats-0.1.tar.gz", "has_sig": true, "md5_digest": "dc3993017a4a850fcbcfe3b3b06ce372", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4188, "upload_time": "2015-09-25T19:51:05", "url": "https://files.pythonhosted.org/packages/87/b5/302c97341d256a6e60243e79240c866c5425a5b929645fee65014432d13e/api_stats-0.1.tar.gz" } ], "0.2": [ { "comment_text": "", "digests": { "md5": "494e1650a542031efd2c6cc4f632c515", "sha256": "c1d54926d418ebaad96e4ababc03b5a99914b36f38417c6dab15aec98b538daa" }, "downloads": -1, "filename": "api_stats-0.2-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "494e1650a542031efd2c6cc4f632c515", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 5141, "upload_time": "2015-09-27T04:42:46", "url": "https://files.pythonhosted.org/packages/39/d2/5f1738085021918a4868c5094737e088a08792193ccab8c519ff76895d21/api_stats-0.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "571b108c5e9b24ec29377028f5e03e45", "sha256": "49f8b352ee6c09b53b576111cfb76e3a8402cbc871584018ddb09158fc9599c9" }, "downloads": -1, "filename": "api_stats-0.2.tar.gz", "has_sig": true, "md5_digest": "571b108c5e9b24ec29377028f5e03e45", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4232, "upload_time": "2015-09-27T04:42:33", "url": "https://files.pythonhosted.org/packages/cc/54/6f031ea4ef4c5116bf80f6691e1276bf7602776042c29c07b59e155333f5/api_stats-0.2.tar.gz" } ], "0.3": [ { "comment_text": "", "digests": { "md5": "127715da6bfbecf3bd42510d445b141e", "sha256": "4eed1d6f1ad686615392c13564299966e564a800cf9b6f8c7042e6943aeb399d" }, "downloads": -1, "filename": "api_stats-0.3-1.tar.gz", "has_sig": true, "md5_digest": "127715da6bfbecf3bd42510d445b141e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6360, "upload_time": "2015-10-01T20:26:51", "url": "https://files.pythonhosted.org/packages/a1/a8/84ce1d59361109fc5bdd1c0469848d6e5cc3eb762cde7f52e56efc2184d2/api_stats-0.3-1.tar.gz" }, { "comment_text": "", "digests": { "md5": "0a2648398be355f5b9f46d98aa92cd4d", "sha256": "4d655960e94e696bfa75a462460c9bc74364d8404145fd2843f261e993bdf255" }, "downloads": -1, "filename": "api_stats-0.3-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "0a2648398be355f5b9f46d98aa92cd4d", "packagetype": "bdist_wheel", "python_version": "any", "requires_python": null, "size": 11331, "upload_time": "2015-10-01T20:26:01", "url": "https://files.pythonhosted.org/packages/c3/2e/3db2f118e5d1b3f93706186a00b028860392b5786bf049af4b6d22eb87c2/api_stats-0.3-py2.py3-none-any.whl" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "127715da6bfbecf3bd42510d445b141e", "sha256": "4eed1d6f1ad686615392c13564299966e564a800cf9b6f8c7042e6943aeb399d" }, "downloads": -1, "filename": "api_stats-0.3-1.tar.gz", "has_sig": true, "md5_digest": "127715da6bfbecf3bd42510d445b141e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6360, "upload_time": "2015-10-01T20:26:51", "url": "https://files.pythonhosted.org/packages/a1/a8/84ce1d59361109fc5bdd1c0469848d6e5cc3eb762cde7f52e56efc2184d2/api_stats-0.3-1.tar.gz" }, { "comment_text": "", "digests": { "md5": "0a2648398be355f5b9f46d98aa92cd4d", "sha256": "4d655960e94e696bfa75a462460c9bc74364d8404145fd2843f261e993bdf255" }, "downloads": -1, "filename": "api_stats-0.3-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "0a2648398be355f5b9f46d98aa92cd4d", "packagetype": "bdist_wheel", "python_version": "any", "requires_python": null, "size": 11331, "upload_time": "2015-10-01T20:26:01", "url": "https://files.pythonhosted.org/packages/c3/2e/3db2f118e5d1b3f93706186a00b028860392b5786bf049af4b6d22eb87c2/api_stats-0.3-py2.py3-none-any.whl" } ] }