{ "info": { "author": "Anthony Sottile", "author_email": "asottile@umich.edu", "bugtrack_url": null, "classifiers": [ "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: Implementation :: CPython" ], "description": "[![Build Status](https://travis-ci.org/asottile/git-code-debt.svg?branch=master)](https://travis-ci.org/asottile/git-code-debt)\n[![Coverage Status](https://img.shields.io/coveralls/asottile/git-code-debt.svg)](https://coveralls.io/r/asottile/git-code-debt?branch=master)\n\ngit-code-debt\n=============\n\nA dashboard for monitoring code debt in a git repository.\n\n\n## Installation\n\n`pip install git-code-debt`\n\n\n## Usage\n\n\n### Basic / tl;dr Usage\n\n#### make a `generate_config.yaml`\n\n```yaml\n# required: repository to clone (can be anything `git clone` understands) even\n# a repository already on disk\nrepo: git@github.com:asottile/git-code-debt\n\n# required: database generation path\ndatabase: database.db\n\n# optional: default False\nskip_default_metrics: false\n\n# optional: default []\nmetric_package_names: []\n\n# optional: default ^$ (python regex) to exclude paths such as '^vendor/'\nexclude: ^$\n```\n\n#### invoke the cli\n\n```\n# Generate code metric data (substitute your own repo path)\n$ git-code-debt-generate\n# Start the server\n$ git-code-debt-server database.db\n```\n\n### Updating data on an existing database\n\nAdding data to the database is as simple as running generate again.\n`git-code-debt` will pick up in the git history from where data was generated\npreviously.\n\n```\n$ git-code-debt-generate\n```\n\n### Creating your own metrics\n\n1. Create a python project which adds `git-code-debt` as a dependency.\n2. Create a package where you'll write your metrics\n3. Add your package to `metric_package_names` in your `generate_config.yaml`\n\n\nThe simplest way to write your own custom metrics is to extend\n`git_code_debt.metrics.base.SimpleLineCounterBase`\n\n\nHere's what the base class looks like\n\n```python\n\nclass SimpleLineCounterBase(DiffParserBase):\n # ...\n\n def should_include_file(self, file_diff_stat):\n \"\"\"Implement me to return whether a filename should be included.\n By default, this returns True.\n\n :param FileDiffStat file_diff_stat:\n \"\"\"\n return True\n\n def line_matches_metric(self, line, file_diff_stat):\n \"\"\"Implement me to return whether a line matches the metric.\n\n :param bytes line: Line in the file\n :param FileDiffStat file_diff_stat:\n \"\"\"\n raise NotImplementedError\n```\n\nHere's an example metric\n\n```python\nfrom git_code_debt.metrics.base import SimpleLineCounterBase\n\n\nclass Python__init__LineCount(SimpleLineCounterBase):\n \"\"\"Counts the number of lines in __init__.py\"\"\"\n\n def should_include_file(self, file_diff_stat):\n return file_diff_stat.filename == b'__init__.py'\n\n def line_matches_metric(self, line, file_diff_stat):\n # All lines in __init__.py match\n return True\n```\n\nMore complex metrics can extend `DiffParserBase`\n\n```python\nclass DiffParserBase(object):\n # Specify __metric__ = False to not be included (useful for base classes)\n __metric__ = False\n\n def get_metrics_from_stat(self, commit, file_diff_stats):\n \"\"\"Implement me to yield Metric objects from the input list of\n FileStat objects.\n\n Args:\n commit - Commit object\n file_diff_stats - list of FileDiffStat objects\n\n Returns:\n generator of Metric objects\n \"\"\"\n raise NotImplementedError\n\n def get_metrics_info(self):\n \"\"\"Implement me to yield `MetricInfo` objects.\"\"\"\n raise NotImplementedError\n```\n\n\n## Some screenshots\n\n### Index\n![Example screen index](https://raw.githubusercontent.com/asottile/git-code-debt/master/img/debt_screen_1.png)\n\n### Graph\n![Example screen graph](https://raw.githubusercontent.com/asottile/git-code-debt/master/img/debt_screen_2.png)\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/asottile/git-code-debt", "keywords": "", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "git-code-debt", "package_url": "https://pypi.org/project/git-code-debt/", "platform": "", "project_url": "https://pypi.org/project/git-code-debt/", "project_urls": { "Homepage": "https://github.com/asottile/git-code-debt" }, "release_url": "https://pypi.org/project/git-code-debt/0.11.0/", "requires_dist": [ "cfgv", "flask", "identify", "mako", "markdown-code-blocks", "pyyaml", "six" ], "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "summary": "A dashboard for monitoring code debt in a git repository.", "version": "0.11.0" }, "last_serial": 4877826, "releases": { "0.10.0": [ { "comment_text": "", "digests": { "md5": "4d550038fa2776f8e5e6ff147024346f", "sha256": "d43038bfafd18536b8f1dffe0039d85a0aa09689c3169249081d4c917e681514" }, "downloads": -1, "filename": "git_code_debt-0.10.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "4d550038fa2776f8e5e6ff147024346f", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 66934, "upload_time": "2018-05-03T14:31:20", "url": "https://files.pythonhosted.org/packages/d5/6b/05729dc311d90cc2ff2d33665281dafa217c1975ecabb9647b8cd3437fee/git_code_debt-0.10.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a56dfea9338b425e401d47d9ebf4f43f", "sha256": "f1916d20c0850f4e1a4adf88d0c5045571ed8009d2ccb54ca6e66feae1998ada" }, "downloads": -1, "filename": "git_code_debt-0.10.0.tar.gz", "has_sig": false, "md5_digest": "a56dfea9338b425e401d47d9ebf4f43f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 48944, "upload_time": "2018-05-03T14:31:22", "url": "https://files.pythonhosted.org/packages/81/05/a65a8a0236e0c61b9caa6d7d11d6355220b226869bf0f069b0ed55f6c82e/git_code_debt-0.10.0.tar.gz" } ], "0.10.1": [ { "comment_text": "", "digests": { "md5": "3d0ef9df1054dcd1afd74f576560451e", "sha256": "14b69396936e3981d51574ed47fc09993127cfd807d3bd9d7855fa9a8a58d6bd" }, "downloads": -1, "filename": "git_code_debt-0.10.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "3d0ef9df1054dcd1afd74f576560451e", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 66799, "upload_time": "2018-12-31T07:27:54", "url": "https://files.pythonhosted.org/packages/8e/f9/7451f7e2715b9b74c0ed83d060b4359d47c32bd011f90148f251653b4c46/git_code_debt-0.10.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7fd6d0315828a88de8005ca61ad35f24", "sha256": "b2ad0833533c7a08ca18cb0a097b84afab00397353a5f1a1ee92079595b1c0d2" }, "downloads": -1, "filename": "git_code_debt-0.10.1.tar.gz", "has_sig": false, "md5_digest": "7fd6d0315828a88de8005ca61ad35f24", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 49821, "upload_time": "2018-12-31T07:27:56", "url": "https://files.pythonhosted.org/packages/df/d4/7444a81b30bb2449f33ecba5b3c3012701e7dc23f21135dbf0589aa83a1f/git_code_debt-0.10.1.tar.gz" } ], "0.11.0": [ { "comment_text": "", "digests": { "md5": "a79c0102016dc7e8fbab4c6e37a827e5", "sha256": "53031e25438aec5c78dfbb91430174ea5c43f9361d11784a246ec299a627e27e" }, "downloads": -1, "filename": "git_code_debt-0.11.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "a79c0102016dc7e8fbab4c6e37a827e5", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "size": 68066, "upload_time": "2019-02-28T06:44:21", "url": "https://files.pythonhosted.org/packages/56/45/7a9d8dc3c2331ae501ca61c8744d4383675e707816484ca9a37527dc1eb1/git_code_debt-0.11.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ef95ef3b035e97ed94baea72fd1c95be", "sha256": "a8585493b92f52b573f40cba0561ba1ca850f7d71a094d1d922d6a2c979c36ef" }, "downloads": -1, "filename": "git_code_debt-0.11.0.tar.gz", "has_sig": false, "md5_digest": "ef95ef3b035e97ed94baea72fd1c95be", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "size": 51620, "upload_time": "2019-02-28T06:44:22", "url": "https://files.pythonhosted.org/packages/9e/1d/c3ecf84a2b5ff58c1fb614f1e9995be7eb61b02ebbda24c5fdb5502b51cf/git_code_debt-0.11.0.tar.gz" } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "29b3195a2ae514e7fec35e09e4095249", "sha256": "18e03c08ed9698f437f815bcc77bde51a92b95e4f07dfa4a5e5687acbbc63795" }, "downloads": -1, "filename": "git_code_debt-0.4.0.tar.gz", "has_sig": false, "md5_digest": "29b3195a2ae514e7fec35e09e4095249", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 36441, "upload_time": "2014-07-07T19:37:33", "url": "https://files.pythonhosted.org/packages/d4/74/1f52c48c63063a338b64b88be15e1673e7bb54e59e52765b5a8249d5fb71/git_code_debt-0.4.0.tar.gz" } ], "0.5.0": [ { "comment_text": "", "digests": { "md5": "2de78dd945b249b4d103a417b81cc486", "sha256": "c84a9e3743bd7a2f6a21660365f179cd083c76409c775e276de07c66158854c2" }, "downloads": -1, "filename": "git_code_debt-0.5.0.tar.gz", "has_sig": false, "md5_digest": "2de78dd945b249b4d103a417b81cc486", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 38447, "upload_time": "2014-07-18T13:55:26", "url": "https://files.pythonhosted.org/packages/0f/b9/a1b3a9c443018aa1bea84d4c2b11e8012ca3fee41b14a88200f77adbd05e/git_code_debt-0.5.0.tar.gz" } ], "0.5.1": [ { "comment_text": "", "digests": { "md5": "6bae55ee2bda5e37b9f9b39a5bc7434e", "sha256": "0bb7ae9410eb5885fd0a2b5ec7bd0a07288ff3d8d9004e1d2042493f55b28be2" }, "downloads": -1, "filename": "git_code_debt-0.5.1.tar.gz", "has_sig": false, "md5_digest": "6bae55ee2bda5e37b9f9b39a5bc7434e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 46650, "upload_time": "2014-07-18T17:02:14", "url": "https://files.pythonhosted.org/packages/c9/73/bb83ab11f40a75ad0e0641858d5c24f75fc1ca0f51ad6f19cbc59e3f7013/git_code_debt-0.5.1.tar.gz" } ], "0.5.2": [ { "comment_text": "", "digests": { "md5": "af809079d9865e3ebe9d68beb7997750", "sha256": "ed493b978316b4dce98e141a6f8f9b4c8bb3ebfc0ee89a79fb1d7ca89ff1ec0f" }, "downloads": -1, "filename": "git_code_debt-0.5.2.tar.gz", "has_sig": false, "md5_digest": "af809079d9865e3ebe9d68beb7997750", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 46796, "upload_time": "2014-07-28T23:16:16", "url": "https://files.pythonhosted.org/packages/e5/de/20a7c5f6437b5b7ab13e314382fa7196ae001f0ccdc2b3cd7874c922f6e8/git_code_debt-0.5.2.tar.gz" } ], "0.6.0": [ { "comment_text": "", "digests": { "md5": "6b0968d57c16b29a235ed0f58bc63e75", "sha256": "e2dc42fe56df09d2caa3556e630e1fa3bed7aad64b28b5b04a2d9f2e897c579a" }, "downloads": -1, "filename": "git_code_debt-0.6.0.tar.gz", "has_sig": false, "md5_digest": "6b0968d57c16b29a235ed0f58bc63e75", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 48023, "upload_time": "2014-11-06T21:52:55", "url": "https://files.pythonhosted.org/packages/9d/8f/631a4653cb086ee51d1bcb2fbf9c6a5c428f83fbe30e1e2cdfdbe62f8017/git_code_debt-0.6.0.tar.gz" } ], "0.6.1": [ { "comment_text": "", "digests": { "md5": "3347bee45852f114264df30c0881cc8b", "sha256": "0c6ae172f68de6b5889a7556e71e8060139d4acdf65a75630fb803e80afd0fc5" }, "downloads": -1, "filename": "git_code_debt-0.6.1.tar.gz", "has_sig": false, "md5_digest": "3347bee45852f114264df30c0881cc8b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 49484, "upload_time": "2014-12-17T04:06:07", "url": "https://files.pythonhosted.org/packages/47/99/c482b26bd3fc5f17bea7df9571adba820de679437f015f7b1b348c9b1249/git_code_debt-0.6.1.tar.gz" } ], "0.7.0": [ { "comment_text": "", "digests": { "md5": "5c14e0439c5acc9dab8d31517d5bb0dd", "sha256": "a69e4e88031c7a4afba022835d3f71a2c3a5f2d8b11904028f2b2055c2a48224" }, "downloads": -1, "filename": "git_code_debt-0.7.0.tar.gz", "has_sig": false, "md5_digest": "5c14e0439c5acc9dab8d31517d5bb0dd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 49463, "upload_time": "2015-12-22T14:17:30", "url": "https://files.pythonhosted.org/packages/7d/55/7c5fa82fbf9ce062f22fb25fac23e1620e44d95e72f9b9c39acd631c5c76/git_code_debt-0.7.0.tar.gz" } ], "0.7.1": [ { "comment_text": "", "digests": { "md5": "09af899eb1b1c947abebbbe7d39d6183", "sha256": "cad3d3faa0e980cdd6b6ddc3984e4c173a844140e89dd5fc6316bf14b102218a" }, "downloads": -1, "filename": "git_code_debt-0.7.1.tar.gz", "has_sig": false, "md5_digest": "09af899eb1b1c947abebbbe7d39d6183", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 48874, "upload_time": "2016-02-05T22:19:57", "url": "https://files.pythonhosted.org/packages/49/53/4c1a4736130d3d4033e7ff417b1f733aa45d50522eb591cbde084eac6335/git_code_debt-0.7.1.tar.gz" } ], "0.7.2": [ { "comment_text": "", "digests": { "md5": "c1faaeb14771298452599b9af8db8e06", "sha256": "524a8386bd675109c923017545c30a1e4fa63149faddcbbb00d5262fd406bd8d" }, "downloads": -1, "filename": "git_code_debt-0.7.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "c1faaeb14771298452599b9af8db8e06", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 68010, "upload_time": "2016-08-24T16:02:20", "url": "https://files.pythonhosted.org/packages/be/be/cb526ff6b1bce4d8bca15da2cf0318212c1a9a074900c09b39ba38bb4bb0/git_code_debt-0.7.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e5b0ce649c4bd8e6560091ffd6ea8ced", "sha256": "fe6859dbd862c7b75b42837f9fc6eca3c5d69abaa048b318684acc094107692d" }, "downloads": -1, "filename": "git_code_debt-0.7.2.tar.gz", "has_sig": false, "md5_digest": "e5b0ce649c4bd8e6560091ffd6ea8ced", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 49539, "upload_time": "2016-08-24T16:02:23", "url": "https://files.pythonhosted.org/packages/43/76/669362531292573419dd26af8fcc8f1a8973e715bf5ca2f829cce7a64fa0/git_code_debt-0.7.2.tar.gz" } ], "0.8.0": [ { "comment_text": "", "digests": { "md5": "044e9bca401e99532f7c33d53fddca22", "sha256": "d5063d7630e70e10df78f5d56a4cbe9e8e07a974d9a2733e5178db76fc577a56" }, "downloads": -1, "filename": "git_code_debt-0.8.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "044e9bca401e99532f7c33d53fddca22", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 67876, "upload_time": "2016-10-28T18:05:02", "url": "https://files.pythonhosted.org/packages/19/23/46620b5c1f528b641bbaa291dc46cb9ebddb4fd7cdd2d50f40a12b66f178/git_code_debt-0.8.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ec8a6ce6c6cce9d90e7798fd40e93efa", "sha256": "a45b87319d8900b05858c6a965b16f92013262d35c092493c9b44d244f0f2ac4" }, "downloads": -1, "filename": "git_code_debt-0.8.0.tar.gz", "has_sig": false, "md5_digest": "ec8a6ce6c6cce9d90e7798fd40e93efa", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 48935, "upload_time": "2016-10-28T18:05:05", "url": "https://files.pythonhosted.org/packages/3f/e0/3a9ea9ad028f6c994541b681cbd40a27869503cf2f978d02512c2b20a094/git_code_debt-0.8.0.tar.gz" } ], "0.9.0": [ { "comment_text": "", "digests": { "md5": "7e3d4beb39856019f679adcdf2cdd8d5", "sha256": "ad3a02ea2df800b9d282f30d44c1368ef7038d99594a5e72e59649c5956d7d0c" }, "downloads": -1, "filename": "git_code_debt-0.9.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "7e3d4beb39856019f679adcdf2cdd8d5", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 66398, "upload_time": "2018-01-16T04:23:12", "url": "https://files.pythonhosted.org/packages/27/da/3fd9459555343e0d3fc18383da1a8187f1cf3dccc678f38437253f7532a5/git_code_debt-0.9.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4c4b1eb526269194234ec6b3fa5b92ff", "sha256": "a3a58dc5c43800c8d58b83272f9617531f432debc32d5765912eafc8c34f1df9" }, "downloads": -1, "filename": "git_code_debt-0.9.0.tar.gz", "has_sig": false, "md5_digest": "4c4b1eb526269194234ec6b3fa5b92ff", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 48789, "upload_time": "2018-01-16T04:23:14", "url": "https://files.pythonhosted.org/packages/07/36/47c4525bed2124c9210f1cfd8b2e46d18b247e5f0d5fb804b4805c407c41/git_code_debt-0.9.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "a79c0102016dc7e8fbab4c6e37a827e5", "sha256": "53031e25438aec5c78dfbb91430174ea5c43f9361d11784a246ec299a627e27e" }, "downloads": -1, "filename": "git_code_debt-0.11.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "a79c0102016dc7e8fbab4c6e37a827e5", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "size": 68066, "upload_time": "2019-02-28T06:44:21", "url": "https://files.pythonhosted.org/packages/56/45/7a9d8dc3c2331ae501ca61c8744d4383675e707816484ca9a37527dc1eb1/git_code_debt-0.11.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ef95ef3b035e97ed94baea72fd1c95be", "sha256": "a8585493b92f52b573f40cba0561ba1ca850f7d71a094d1d922d6a2c979c36ef" }, "downloads": -1, "filename": "git_code_debt-0.11.0.tar.gz", "has_sig": false, "md5_digest": "ef95ef3b035e97ed94baea72fd1c95be", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "size": 51620, "upload_time": "2019-02-28T06:44:22", "url": "https://files.pythonhosted.org/packages/9e/1d/c3ecf84a2b5ff58c1fb614f1e9995be7eb61b02ebbda24c5fdb5502b51cf/git_code_debt-0.11.0.tar.gz" } ] }