{
"info": {
"author": "Jonathan Eunice",
"author_email": "jonathan.eunice@gmail.com",
"bugtrack_url": null,
"classifiers": [
"Development Status :: 4 - Beta",
"Intended Audience :: Developers",
"License :: OSI Approved :: BSD License",
"Operating System :: OS Independent",
"Programming Language :: Python",
"Programming Language :: Python :: 2.6",
"Programming Language :: Python :: 2.7",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.2",
"Programming Language :: Python :: 3.3",
"Programming Language :: Python :: 3.4",
"Programming Language :: Python :: 3.5",
"Programming Language :: Python :: Implementation :: CPython",
"Programming Language :: Python :: Implementation :: PyPy",
"Topic :: Software Development :: Libraries :: Python Modules"
],
"description": "| |version| |downloads| |supported-versions| |supported-implementations|\n\n.. |version| image:: http://img.shields.io/pypi/v/chores.svg?style=flat\n :alt: PyPI Package latest release\n :target: https://pypi.python.org/pypi/chores\n\n.. |downloads| image:: http://img.shields.io/pypi/dm/chores.svg?style=flat\n :alt: PyPI Package monthly downloads\n :target: https://pypi.python.org/pypi/chores\n\n.. |supported-versions| image:: https://img.shields.io/pypi/pyversions/chores.svg\n :alt: Supported versions\n :target: https://pypi.python.org/pypi/chores\n\n.. |supported-implementations| image:: https://img.shields.io/pypi/implementation/chores.svg\n :alt: Supported implementations\n :target: https://pypi.python.org/pypi/chores\n\n\nJust about all programs process \"items\" of one sort or another. That's what\nloops are for, right?\n\nBut with the exception of the current loop value or index, programming\nlanguages don't help track how processing is going. How many items have been\n*successfully* processed? How many *errors* are there? How far along the\ntotal job are we right now? Which items had problems that need to be looked\nat later?\n\nEven though these bookkeeping tasks are essential to just about every\nprogram, they're \"left to the reader.\" \"Here are some basic loops. Have\nfun!\" So developers \"reinvent the wheel,\" tracking status with *ad hoc*\ncontainers, counters, and status flags for every new program. Not so\nhigh-level after all, huh?\n\n``chores`` fights needless this complexity, errors, and effort by providing\na simple, repeatable pattern for processing items and tracking their status.\n\nThe documentation can be found at `Read the Docs\n`_.\n\nUsage\n=====\n\n::\n\n from chores import Chores\n\n chores = Chores('Jones able baker charlie 8348 Smith Brown Davis'.split())\n\n for c in chores:\n status = 'name' if c.istitle() else 'other'\n chores.mark(c, status)\n\n print chores.count('name'), \"names,\", \\\n chores.count('^name'), \"others\"\n\nYields::\n\n 4 names, 4 others\n\nOr if you decide you actually want more information, change just the output\nstatements::\n\n print todos.count('name'), \"names:\", todos.marked('name')\n print todos.count('^name'), \"others:\", todos.marked('^name')\n\nNow you get::\n\n 4 names: ['Jones', 'Smith', 'Brown', 'Davis']\n 4 others: ['able', 'baker', 'charlie', '8348']\n\nDiscussion\n==========\n\nMany programs track the status of items being processed with various lists,\ndictionaries, sets, counters, and status flags. ``chores`` might not seem a\ngreat advance at first, since it has the same kind of initialization and\nlooping.\n\nBut it gets more interesting at the end of the processing loop, where the\nsummary or report of what was processed, the disposition of each item worked\non, what items yielded errors or other conditions, and what special cases\nwere handled is produced.\n\nIn the examples above, we never had to keep a counter of how many names were found,\nor how many non-names. When we decided we wanted to change the output from\nsummary counts to a full listing, we didn't have go back and collect\ndifferent information. We just differently displayed information already at\nat hand. Also note that the order of the results is nicely maintained.\nWhen we're reviewing reports about \"what transpired,\" we don't have to work\nvery hard to correlate the results with the inputs; unlike when using ``dict``\nand ``set`` structures, items are reported on in the same order they arrived.\n\nTypically a developer will start with only a little thought about various\ndispositions for each item being processed. Over time, she'll start to\nrealize: \"I need to count those cases, so I can report on them!\" Or, \"I kept\nan error counter, but I really should have been keeping a list of which\nitems broke, because I now have to tell the user not just how many went\nwrong, but which ones in particular.\" Or \"I need to keep track of which ones\nfailed the main processing so that I can do more intensive processing on\njust those special cases.\" Then she'll go back and add counters, collection\nlists, and so on--adding a fair amount of *ad hoc* code that must be built,\ntested, and debugged.\n\nThis is especially tricky for data that needs to move through multiple\nstages or phases of work. The developer then has to add structures to\ncommunicate from earlier processing steps to later ones.\n\nWith ``chores``, there's no need for such custom work. It takes over\ntracking which items led to which outcomes. It's always ready to render\nquality information, either for reporting or for managing subsequent\nprocessing. Bookkeeping information is readily available in\na tidy, logical format, with no additional development effort.\n\n``chores`` especially shows its virtues as processing code becomes\nmore intricate and as program needs evolve over time.\n\nAdditional information can be found at `Read the Docs\n`_.\n\nNotes\n=====\n\n * I've successfully used ``chores`` in my own projects, and it has a\n real test suite. But realistically it should be considered\n \"early beta\" code. It's explicitly part of experiment to up-level\n development tasks, so its API and mode of use will evolve.\n\n * ``chores`` is an example of \"cross-cutting\"--dealing with several\n apparently disconnected concerns in a concerted way because they are,\n in fact, connected, and need to be handled systematically.\n\n * Automated multi-version testing managed with the wonderful `pytest\n `_ and `tox\n `_. Successfully packaged for, and\n tested against, all late-model versions of Python: 2.6, 2.7, 3.2, 3.3,\n and 3.4, as well as PyPy 2.6.0 (based on 2.7.9) and PyPy3 2.4.0 (based\n on 3.2.5). Should run fine on Python 3.5, though py.test is broken on\n its pre-release iterations.\n\n * The author, `Jonathan Eunice `_ or\n `@jeunice on Twitter `_\n welcomes your comments and suggestions.\n\nInstallation\n============\n\nTo install or upgrade to the latest version::\n\n pip install -U chores\n\nTo ``easy_install`` under a specific Python version (3.3 in this example)::\n\n python3.3 -m easy_install --upgrade chores\n\n(You may need to prefix these with ``sudo`` command to authorize\ninstallation. In environments without super-user privileges, you may want to\nuse ``pip``'s ``--user`` option, to install only for a single user, rather\nthan system-wide.)",
"description_content_type": null,
"docs_url": null,
"download_url": "UNKNOWN",
"downloads": {
"last_day": -1,
"last_month": -1,
"last_week": -1
},
"home_page": "UNKNOWN",
"keywords": "chore chores status work queue task job processing stages phases for loop",
"license": "UNKNOWN",
"maintainer": null,
"maintainer_email": null,
"name": "chores",
"package_url": "https://pypi.org/project/chores/",
"platform": "UNKNOWN",
"project_url": "https://pypi.org/project/chores/",
"project_urls": {
"Download": "UNKNOWN",
"Homepage": "UNKNOWN"
},
"release_url": "https://pypi.org/project/chores/0.6.3/",
"requires_dist": null,
"requires_python": null,
"summary": "The next-generation for loop and work tracker",
"version": "0.6.3"
},
"last_serial": 1649036,
"releases": {
"0.6": [
{
"comment_text": "",
"digests": {
"md5": "76ce3d5aadba7c7e204c25239d887387",
"sha256": "b4d42766ddcc888716bab98658e7fb682a502c9cbef5ebeeb720611a3855a0fc"
},
"downloads": -1,
"filename": "chores-0.6.tar.gz",
"has_sig": false,
"md5_digest": "76ce3d5aadba7c7e204c25239d887387",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 10904,
"upload_time": "2015-07-24T22:57:43",
"url": "https://files.pythonhosted.org/packages/33/87/a63e04eab9b90d17710aa953b54d23218b61f4b280127f9c3031a0f75b24/chores-0.6.tar.gz"
},
{
"comment_text": "",
"digests": {
"md5": "fcbaacc8f012389c5ddfc485dcbc8591",
"sha256": "19bc142394a852ae3b5e24ed08e1ec63ab6ad1d767ec3c83e763e7b406adcd1a"
},
"downloads": -1,
"filename": "chores-0.6.zip",
"has_sig": false,
"md5_digest": "fcbaacc8f012389c5ddfc485dcbc8591",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 19792,
"upload_time": "2015-07-24T22:57:39",
"url": "https://files.pythonhosted.org/packages/d9/df/50b51b17b9b9f410513e88e17280b607efb2ed574db41360e8f1582124a1/chores-0.6.zip"
}
],
"0.6.1": [
{
"comment_text": "",
"digests": {
"md5": "adf7a99332ff11fd255d8b06ca94073a",
"sha256": "9d218dfb4c5fb1c562f59653e3985b733ef80df1c9b19b758f2bf8d9d810f2a1"
},
"downloads": -1,
"filename": "chores-0.6.1.tar.gz",
"has_sig": false,
"md5_digest": "adf7a99332ff11fd255d8b06ca94073a",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 10753,
"upload_time": "2015-07-24T23:33:50",
"url": "https://files.pythonhosted.org/packages/cf/bd/b69d489f14d32642d04cb30ad7dc25432893c38693b67d0f196eb4e08d14/chores-0.6.1.tar.gz"
},
{
"comment_text": "",
"digests": {
"md5": "5589be5185e85f5c1d8e0517f2d86388",
"sha256": "70ca39df73fe62f4357dfd3e697059d010b7f7e51747ed46a6412b0301c6b7bf"
},
"downloads": -1,
"filename": "chores-0.6.1.zip",
"has_sig": false,
"md5_digest": "5589be5185e85f5c1d8e0517f2d86388",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 19380,
"upload_time": "2015-07-24T23:33:46",
"url": "https://files.pythonhosted.org/packages/23/63/681384bcd168e4080d486e74a2b08a61162ab8bfce858bd577623d183266/chores-0.6.1.zip"
}
],
"0.6.2": [
{
"comment_text": "",
"digests": {
"md5": "6ce03cf6db6d308b3a0b1f9b4f44d39b",
"sha256": "9ea619927ef89961c5d1ddb276ba56bd0f403c31864edf185e0e104293a8fc31"
},
"downloads": -1,
"filename": "chores-0.6.2.tar.gz",
"has_sig": false,
"md5_digest": "6ce03cf6db6d308b3a0b1f9b4f44d39b",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 11647,
"upload_time": "2015-07-25T01:55:19",
"url": "https://files.pythonhosted.org/packages/e6/fb/b6bb55dbf63fa16d15546077290fcf5f8e70d7e52b6ce6d4cd5cd47ddd72/chores-0.6.2.tar.gz"
},
{
"comment_text": "",
"digests": {
"md5": "f77871ba898c97e2ee908a44fe5714da",
"sha256": "6fc463a4050267b7055a84a5e3e5cc8dcb7e37533de2ccc0d4ae2e8cb9213069"
},
"downloads": -1,
"filename": "chores-0.6.2.zip",
"has_sig": false,
"md5_digest": "f77871ba898c97e2ee908a44fe5714da",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 20639,
"upload_time": "2015-07-25T01:55:15",
"url": "https://files.pythonhosted.org/packages/ad/af/4f3c58689f0ffe1502d92464f7ae9ee56248bbb4654739d5c7c4f37be248/chores-0.6.2.zip"
}
],
"0.6.3": [
{
"comment_text": "",
"digests": {
"md5": "3ae4d232b644145219caa6b547262c04",
"sha256": "b5e3f7181c19615ece95bf44baa10491b9524e9853ab01453bc59dac9d397c5b"
},
"downloads": -1,
"filename": "chores-0.6.3.tar.gz",
"has_sig": false,
"md5_digest": "3ae4d232b644145219caa6b547262c04",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 11626,
"upload_time": "2015-07-25T05:32:03",
"url": "https://files.pythonhosted.org/packages/1c/da/d555c2ad3df0b0b544c6c8d569790bcd4f3d6ef32aed8266d8ec74d9cea5/chores-0.6.3.tar.gz"
},
{
"comment_text": "",
"digests": {
"md5": "2e357b94d6216c05dd6e1179676c1041",
"sha256": "aa97e3fa7174d17264b617721ad36a2d506954977ac3f9b370796531a5898f05"
},
"downloads": -1,
"filename": "chores-0.6.3.zip",
"has_sig": false,
"md5_digest": "2e357b94d6216c05dd6e1179676c1041",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 20609,
"upload_time": "2015-07-25T05:31:59",
"url": "https://files.pythonhosted.org/packages/c5/a1/929f240f0dbec1f1d589f422a323f396875d98b2d13b94c602015cacc1b4/chores-0.6.3.zip"
}
]
},
"urls": [
{
"comment_text": "",
"digests": {
"md5": "3ae4d232b644145219caa6b547262c04",
"sha256": "b5e3f7181c19615ece95bf44baa10491b9524e9853ab01453bc59dac9d397c5b"
},
"downloads": -1,
"filename": "chores-0.6.3.tar.gz",
"has_sig": false,
"md5_digest": "3ae4d232b644145219caa6b547262c04",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 11626,
"upload_time": "2015-07-25T05:32:03",
"url": "https://files.pythonhosted.org/packages/1c/da/d555c2ad3df0b0b544c6c8d569790bcd4f3d6ef32aed8266d8ec74d9cea5/chores-0.6.3.tar.gz"
},
{
"comment_text": "",
"digests": {
"md5": "2e357b94d6216c05dd6e1179676c1041",
"sha256": "aa97e3fa7174d17264b617721ad36a2d506954977ac3f9b370796531a5898f05"
},
"downloads": -1,
"filename": "chores-0.6.3.zip",
"has_sig": false,
"md5_digest": "2e357b94d6216c05dd6e1179676c1041",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 20609,
"upload_time": "2015-07-25T05:31:59",
"url": "https://files.pythonhosted.org/packages/c5/a1/929f240f0dbec1f1d589f422a323f396875d98b2d13b94c602015cacc1b4/chores-0.6.3.zip"
}
]
}