{ "info": { "author": "Bryce Boe", "author_email": "bbzbryce@gmail.com", "bugtrack_url": null, "classifiers": [ "Environment :: Console", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Natural Language :: English", "Operating System :: OS Independent", "Programming Language :: Python :: 2.7", "Topic :: Utilities" ], "description": "# Hairball\n\nHairball is a plugin-able framework useful for static analysis of Scratch\nprojects.\n\nThe paper and presentation slides for Hairball can be found at:\nhttp://cs.ucsb.edu/~bboe/p/cv#sigcse13\n\nA Hairball demo web service is running and available at:\nhttp://hairball.herokuapp.com\n\n\n## Hairball installation\n\nWith a proper python environment (one which has `pip` available), installation\nis as simple as `pip install hairball`. `easy_install` can also be used via\n`easy_install hairball`.\n\nTo install from source, first checkout this project and then navigate your\ncommand-line interface to the outer hairball directory that contains\n`setup.py`. Then run `python setup.py install`.\n\n## Running Hairball\n\nOnce installed, to see how to use hairball run `hairball --help`. That will\nproduce output similar to the following:\n\n```\nUsage: hairball -p PLUGIN_NAME [options] PATH...\n\nPATH can be either the path to a scratch file, or a directory containing\nscratch files. Multiple PATH arguments can be provided.\n\nOptions:\n --version show program's version number and exit\n -h, --help show this help message and exit\n -d DIR, --plugin-dir=DIR\n Specify the path to a directory containing plugins.\n Plugins in this directory take precedence over\n similarly named plugins included with Hairball.\n -p PLUGIN, --plugin=PLUGIN\n Use the named plugin to perform analysis. This option\n can be provided multiple times.\n -k KURT_PLUGIN, --kurt-plugin=KURT_PLUGIN\n Provide either a python import path (e.g, kelp.octopi)\n to a package/module, or the path to a python file,\n which will be loaded as a Kurt plugin. This option can\n be provided multiple times.\n```\n\n## Available Plugins\n\nBelow are a list of available plugins that can be used as the `-p PLUGIN_NAME`\noption:\n\n* blocks.BlockCounts\n* blocks.DeadCode\n* checks.Animation (not fully tested)\n* checks.BroadcastReceive\n* checks.SaySoundSync (not fully tested)\n* duplicate.DuplicateScripts\n* initialization.AttributeInitialization\n* initialization.VariableInitialization (not fully tested)\n\nNote: The output for each plugin is not yet completely standardized. Please\nfeel free to file any issues or make improvements and send pull requests.\n\n## Caching Support\n\nThe python Kurt package unfortunately is pretty slow to parse Scratch 1.4 (and\nsimilar) files. To remedy this situation, Hairball has built-in support for\ncaching a serialized version of the Kurt object. On subsequent passes through\nthe same data you should notice a TREMENDOUS speed improvement.\n\n__Note__: At the moment the cache is unbounded, so keep an eye on your disk\nspace. The cache location can be discovered by running:\n\n python -c \"import appdirs; print appdirs.user_cache_dir('Hairball', 'bboe')\"", "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/ucsb-cs-education/hairball", "keywords": "scratch static-analysis", "license": "Simplified BSD License", "maintainer": null, "maintainer_email": null, "name": "hairball", "package_url": "https://pypi.org/project/hairball/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/hairball/", "project_urls": { "Download": "UNKNOWN", "Homepage": "https://github.com/ucsb-cs-education/hairball" }, "release_url": "https://pypi.org/project/hairball/0.3/", "requires_dist": null, "requires_python": null, "summary": "Hairball is a plugin-able framework useful for static analysis of Scratch projects.", "version": "0.3" }, "last_serial": 1179624, "releases": { "0.1b": [ { "comment_text": "", "digests": { "md5": "cef34a08618c743f74676492c3b7cd33", "sha256": "8a66570e35e6ecbadd8995d1dc5a3164f715226b58df0c8ce0e0d95b1eb7208d" }, "downloads": -1, "filename": "hairball-0.1b.tar.gz", "has_sig": true, "md5_digest": "cef34a08618c743f74676492c3b7cd33", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11370, "upload_time": "2013-03-07T08:07:07", "url": "https://files.pythonhosted.org/packages/83/a5/53fb0b191e06e2abd279f1a35ccb25b470e52eab52ceff8318f62b27ff20/hairball-0.1b.tar.gz" } ], "0.1rc0": [ { "comment_text": "", "digests": { "md5": "a227a084ca40bde25d261dc4b5681c14", "sha256": "be356f2a794969fe0ae2fe63d9b6e860e3b26535026983dba1b46b8915a3accb" }, "downloads": -1, "filename": "hairball-0.1rc0.tar.gz", "has_sig": true, "md5_digest": "a227a084ca40bde25d261dc4b5681c14", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10716, "upload_time": "2013-03-08T07:36:57", "url": "https://files.pythonhosted.org/packages/db/8c/7f139129e8f2a2096727539aa494a25a22a3d05fd00d12b441ec903d4158/hairball-0.1rc0.tar.gz" } ], "0.1rc1": [ { "comment_text": "", "digests": { "md5": "39ac2a3d11b24ef95c326152bb1aec7c", "sha256": "6e0fb03a27a2304b7fbf9a70a714b224924bc2f5d145e04d538878594c72dcef" }, "downloads": -1, "filename": "hairball-0.1rc1.tar.gz", "has_sig": true, "md5_digest": "39ac2a3d11b24ef95c326152bb1aec7c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10808, "upload_time": "2013-08-13T16:09:12", "url": "https://files.pythonhosted.org/packages/d9/13/17d78ba8d32d64a4ca26d7c0fb82d02d05ccf526cd7318df56f9e13c8149/hairball-0.1rc1.tar.gz" } ], "0.1rc2": [ { "comment_text": "", "digests": { "md5": "79559ff4bc23e778ae675832841518a4", "sha256": "176a5bf39e92609b99580b6d3f32367bad4ad256d93a94dfc6eabdd3d71406cd" }, "downloads": -1, "filename": "hairball-0.1rc2.tar.gz", "has_sig": true, "md5_digest": "79559ff4bc23e778ae675832841518a4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10831, "upload_time": "2013-08-15T00:36:42", "url": "https://files.pythonhosted.org/packages/db/c5/6ccd845c2a5a9fb16ebed8b755ac698d33fb2df3d3cefa470ae526133d4b/hairball-0.1rc2.tar.gz" } ], "0.1rc3": [ { "comment_text": "", "digests": { "md5": "6aedb7dc8000392b3975688bda962b5c", "sha256": "f7cd5ddd17e7794cc5a2ca4f4382e740c54c243de5a2ce364a4227505d497b52" }, "downloads": -1, "filename": "hairball-0.1rc3.tar.gz", "has_sig": true, "md5_digest": "6aedb7dc8000392b3975688bda962b5c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10834, "upload_time": "2013-09-04T01:24:23", "url": "https://files.pythonhosted.org/packages/78/4a/0c08b0ffb29502e84c5e244406f0a8bd10c60fe6cb46a74167580313112e/hairball-0.1rc3.tar.gz" } ], "0.2": [ { "comment_text": "", "digests": { "md5": "cf671183c1a03b024b3d2c0b68b0bdf6", "sha256": "ea74e8cdd259cab495517cae633240efda5176a04ca9a4768391521f9590aff4" }, "downloads": -1, "filename": "hairball-0.2-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "cf671183c1a03b024b3d2c0b68b0bdf6", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 18714, "upload_time": "2014-04-15T16:59:19", "url": "https://files.pythonhosted.org/packages/1d/e8/f69dce66f8422734862b275bc8a431e0fa98beb47e7371cb5cb3365edb7c/hairball-0.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9a3b5945f48c3d53453ffaf5d61168a4", "sha256": "eec911729a8c72fca7b95f7d1e360d76b75c0de62505d435ca49d9f30670bf97" }, "downloads": -1, "filename": "hairball-0.2.tar.gz", "has_sig": true, "md5_digest": "9a3b5945f48c3d53453ffaf5d61168a4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13419, "upload_time": "2014-04-15T16:59:26", "url": "https://files.pythonhosted.org/packages/50/30/843490ad570be679631dc2e6ee151ade4c2a6aa7581bb6371b16290da6f4/hairball-0.2.tar.gz" } ], "0.3": [ { "comment_text": "", "digests": { "md5": "5402f40b62db620ec4616556179872a0", "sha256": "2b6b12639e30b359adfb402e6d3b1dada337f997d826b6449040715965bec27e" }, "downloads": -1, "filename": "hairball-0.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "5402f40b62db620ec4616556179872a0", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 18799, "upload_time": "2014-08-04T17:46:30", "url": "https://files.pythonhosted.org/packages/9b/ec/8c3c889f19fd617c49fa5ec9715ba705d21658289309c06d80e79ffd2109/hairball-0.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "164e0f787e38958e2333af94d6add65c", "sha256": "a83f91f5930817c73534fdd881c4af7408d44c95bf46103335daa6af20cfb3a6" }, "downloads": -1, "filename": "hairball-0.3.tar.gz", "has_sig": false, "md5_digest": "164e0f787e38958e2333af94d6add65c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14694, "upload_time": "2014-08-04T17:46:33", "url": "https://files.pythonhosted.org/packages/7a/b6/ae7ce365ab07c1770241a59ca74f7d4ad069c05fc08d7b26a0a787549c2c/hairball-0.3.tar.gz" } ], "0.3rc1": [ { "comment_text": "", "digests": { "md5": "dfc73fdb9e4927c4587b08b355f898b2", "sha256": "daafb1463565f800aba4bca4654dcb6c6cac4c5c29e114b9ffa4cbba11d48a18" }, "downloads": -1, "filename": "hairball-0.3rc1-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "dfc73fdb9e4927c4587b08b355f898b2", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 18785, "upload_time": "2014-04-21T16:13:40", "url": "https://files.pythonhosted.org/packages/66/41/d2bfbca8004dd060f478932d595d2ca5087c84fcc933f191470d0eccdaed/hairball-0.3rc1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b90c5c50dd996cb9c0986942a9551033", "sha256": "a0eff237b85d5843c509b8fbb000bc4ba963dea0700b79bd617eaa4124890023" }, "downloads": -1, "filename": "hairball-0.3rc1.tar.gz", "has_sig": true, "md5_digest": "b90c5c50dd996cb9c0986942a9551033", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13451, "upload_time": "2014-04-21T16:13:47", "url": "https://files.pythonhosted.org/packages/5f/c8/1d85047bd3ef214e599755934ce3a8a6410dc720e8ebd612a5e19f0b9221/hairball-0.3rc1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "5402f40b62db620ec4616556179872a0", "sha256": "2b6b12639e30b359adfb402e6d3b1dada337f997d826b6449040715965bec27e" }, "downloads": -1, "filename": "hairball-0.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "5402f40b62db620ec4616556179872a0", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 18799, "upload_time": "2014-08-04T17:46:30", "url": "https://files.pythonhosted.org/packages/9b/ec/8c3c889f19fd617c49fa5ec9715ba705d21658289309c06d80e79ffd2109/hairball-0.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "164e0f787e38958e2333af94d6add65c", "sha256": "a83f91f5930817c73534fdd881c4af7408d44c95bf46103335daa6af20cfb3a6" }, "downloads": -1, "filename": "hairball-0.3.tar.gz", "has_sig": false, "md5_digest": "164e0f787e38958e2333af94d6add65c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14694, "upload_time": "2014-08-04T17:46:33", "url": "https://files.pythonhosted.org/packages/7a/b6/ae7ce365ab07c1770241a59ca74f7d4ad069c05fc08d7b26a0a787549c2c/hairball-0.3.tar.gz" } ] }