{ "info": { "author": "Paul Michali", "author_email": "pc@michali.net", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Intended Audience :: Developers", "License :: OSI Approved :: Apache Software License", "Natural Language :: English", "Operating System :: OS Independent", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.2", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Topic :: Software Development :: Build Tools" ], "description": "whodunit\n========\n\nThis helps identify the \"owners\" of lines in project files, with the intention\nto assist in code coverage resolution (although can be used for other nefarious\npurposes :).\n\nUsage A: Ownership Detection\n----------------------------\n\nIn a git repo, you may want to know who can help fix coverage issues. Here,\nwhodunit can identify who is the author/committer for lines in a file or\na tree of files, starting at some directory. For example, from the top of a\nproject tree, you can enter::\n\n whodunit /opt/stack/neutron/neutron\n\n /opt/stack/neutron-lib/neutron_lib/\n\n constants.py (Andy Able, Doug Delta, Felix Foxtrot, Leo Lion, Bob Baker)\n __init__.py (Doug Delta)\n _i18n.py (Charlie Coder, Doug Delta)\n config.py (Doug Delta)\n exceptions.py (Doug Delta)\n version.py (Felix Foxtrot)\n\n\n /opt/stack/neutron-lib/neutron_lib/api/\n\n converters.py (Felix Foxtrot)\n __init__.py ()\n validators.py (Doug Delta, Felix Foxtrot)\n ...\n\nThis shows the directory, and then each file in the directory, with a list of\nowners, as it recursively processes files. It will skip any files that are not\ntracked by git.The default is to list the owners by most recent commit date.\nMore interesting, is to use the --detail option, where it shows more information\non each file::\n\n validators.py (Doug Delta, Felix Foxtrot)\n 28523670 309 Doug Delta 2016-01-29\n 7d9980f7 227 Felix Foxtrot 2016-01-15\n\nHere you see the abbreviated commit ID, number of lines for that commit,\nauthor, and date of the most recent commit (we're sorting by date). You\ncan add the --verbose option to see the author's email address, full date\nand time of the commit, the the committer's name and email address.\n\nAlternately, you can sort the output by number of lines of code, per author\n(and any committer(s) for that commit, in case the last commit was done\nby someone else), by using \"--sort size\" argument, instead of the implied\ndefault of \"--sort date\". This looks like this (with verbose on too)::\n\n dfa_db_models.py (Felix Foxtrot, Nader Lahouti)\n 4c637f50 306 Felix Foxtrot 2016-02-12 10:46:20 +0000 Sam Source \n 222f1afb 20 Ned Nerf 2015-10-06 09:51:26 -0700 Ned Nerf \n\nWith the summary list of authors shown next to the file name, they are\nin the order based on the sort. For sorting by size, the author with\nthe most lines is shown first. For sorting by date, the author with\nthe most recent commit is shown first. Duplicates are removed, in that\ncase, so you may have fewer names in the summary, if a person has\nseveral commits.\n\nYou can limit the amount of output, by using the --max option,\nwhich, by default is set to zero to show all output. With \"--sort date\",\nit'll show the N most recent commits, by size, it'll show the N largest\nauthor lines per file. This can liit things to the most recent commits\nor most significant authors.\n\nYou can use the --filter option to restrict the files that are evaluated.\nThis is a regular expression like value, where '*' matches '.' as well,\nso hidden files would be included, with the default value of '*'.\n\nInstead of providing a directory to start from, you can provide an\nindividual file (tracked by git), and it will produce a report for that\nfile.\n\n\nUsage A: Coverage Ownership\n---------------------------\n\nIf you have run a coverage test in the repo, and have a cover directory\nwith coverage reports on the repo files, you can use whodunit to provide\nownership for lines in modules that are missing coverage or have partial\ncoverage.\n\nTo do this, you specify the root directory for the repo, and provide\nthe \"--sort cover\" argument. This will automatically select the --detail\noption. You can choose to use the --verbose option for author email,\nfull date/time, and committer name and email output in the report.\n\nYou cannot specify the --max option to limit the output (which doesn't\nmake sense as you want to see all the lines that do not have coverage.\nLikewise, the --filter and --details options are not allowed either.\nThe filter is forced to \"*\", and details are implied in the output.\n\nFor example::\n\n whodunit -s cover /opt/stack/networking-cisco\n\n routerrole.py (Bob Betatester)\n a238bf6b 54 Bob Betatester 2015-10-13\n a238bf6b 61-64 Bob Betatester 2015-10-13\n\nHere, the same commit, author, and date information information is shown\n(and committer, if --verbose used), but the number after the commit ID is\nthe line number, or line range in the file.\n\nYou can use the -h option to see what the arguments are for this script.", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/pmichali/whodunit", "keywords": null, "license": "Apache Software License", "maintainer": null, "maintainer_email": null, "name": "whodunit", "package_url": "https://pypi.org/project/whodunit/", "platform": "any", "project_url": "https://pypi.org/project/whodunit/", "project_urls": { "Download": "UNKNOWN", "Homepage": "https://github.com/pmichali/whodunit" }, "release_url": "https://pypi.org/project/whodunit/0.3/", "requires_dist": null, "requires_python": null, "summary": "Identifies owner(s) for module lines in a git repo.", "version": "0.3" }, "last_serial": 1994378, "releases": { "0.1": [], "0.2": [ { "comment_text": "", "digests": { "md5": "73ae8b272c001fb77882ccf13844db2f", "sha256": "261922a941d46f1cc667dd4e1e936032a790c95d0f2b86d3ccd23bebc9ab7aa8" }, "downloads": -1, "filename": "whodunit-0.2.tar.gz", "has_sig": false, "md5_digest": "73ae8b272c001fb77882ccf13844db2f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9767, "upload_time": "2016-03-07T20:48:15", "url": "https://files.pythonhosted.org/packages/72/8d/a63458192c2ac3c62e2f065d4eecdc8954e37e946ed3ad017b02dcdf7a2b/whodunit-0.2.tar.gz" } ], "0.3": [ { "comment_text": "", "digests": { "md5": "521eea26ac771137226fc6ee260234cc", "sha256": "a7ab9ae72e5f3822251165b2fb68b318cfdbe33c23000771bac75a94521b5566" }, "downloads": -1, "filename": "whodunit-0.3.tar.gz", "has_sig": false, "md5_digest": "521eea26ac771137226fc6ee260234cc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9770, "upload_time": "2016-03-07T21:44:39", "url": "https://files.pythonhosted.org/packages/89/ac/329eebe5dae766495c16abace58014d5699b9ebe913f097e0f1cb885f891/whodunit-0.3.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "521eea26ac771137226fc6ee260234cc", "sha256": "a7ab9ae72e5f3822251165b2fb68b318cfdbe33c23000771bac75a94521b5566" }, "downloads": -1, "filename": "whodunit-0.3.tar.gz", "has_sig": false, "md5_digest": "521eea26ac771137226fc6ee260234cc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9770, "upload_time": "2016-03-07T21:44:39", "url": "https://files.pythonhosted.org/packages/89/ac/329eebe5dae766495c16abace58014d5699b9ebe913f097e0f1cb885f891/whodunit-0.3.tar.gz" } ] }