{ "info": { "author": "Jim Fulton", "author_email": "jim@zope.com", "bugtrack_url": null, "classifiers": [], "description": "===============================\nR\u00e9sum\u00e9-based WSGI load balancer\n===============================\n\nThis package provides a load balancer for WSGI applications that sorts\nrequests into request classes and assigns requests of a given class to\nthe same workers.\n\nThe load balancer can benefit you if you have an application that:\n\n- has too much load (or is too slow) to be handled by a single\n process,\n\n- has a working set that is too large to fit in the caches\n used by your process, and\n\n- there is a way to classify requests so that there is little overlap\n in the working sets of the various classes.\n\nIf what's above applies to you (or if you're curious), read on.\n\n.. contents::\n\nArchitecture\n============\n\nAn application deployed using the load balancer consistes of one or\nmore load balancers, and multiple workers. Web requests come into the\nload balancers, are converted to WSGI environments and requests, in\nenvironment form, are handed over to workers over long-lived\nmulti-plexed connections.\n\nWorkers compute r\u00e9sum\u00e9s, which are dictionaries mapping request\nclasses to scores, which are average requests per second. Workers send\nload balancers their r\u00e9sum\u00e9s periodically, and when load balancers\nconnect to them.\n\nMultiple load balancers can be used for redundancy or load\ndistribution. R\u00e9sum\u00e9s are managed by workers to assure that load\nbalancer's have the same information about worker skills.\n\nStatus\n======\n\nThe current version of the load-balancer should be considered\nexperimental. We're currently testing it in production.\n\nThe documentation is a bit thin, but there are extensive doctests.\n\nRequest Classification\n======================\n\nYou need to provide a request-classification function that takes a\nWSGI environment and returns a request class string.\n\nTwo classifiers are built-in:\n\nhost\n The host classifier uses HTTP Host header values, normalized by\n removing leading \"www.\" prefixes, if present.\n\nre_classifier\n A general classifier (factory) that applies a regular expression\n with a ``class`` group to an environment value.\n\n For example, to use the first step in a request URL path, you'd use\n the following request-classifier option to one of the load-balancer\n scripts described below::\n\n -r 'zc.resumelb.lb:re_classifier(\"PATH_INFO\",r\"/(?P[^/]+)\")'\n\nDeployment\n==========\n\nDeploying the load balancer requires deploying each of the workers,\nand deploying the load balancer(s) itself. The workers are deployed much\nlike any WSGI stack. The workers serve as WSGI servers, even though\nthey don't accept HTTP requests directly.\n\nThere are two built-in strategies for deploying applications,\ndepending on whether you're willing to drink some ZooKeeper kool-aid.\n\nIf you use ZooKeeper, workers can bind to ephemeral ports and register\nthem with ZooKeeper. The load balancer monitors ZooKeeper and adds\nand removes workers to it's pool as worker processes are worker\nprocesses are started and stopped.\n\nBasic deployment\n----------------\n\nThe basic deployment is the easiest to get up and running quickly.\n\nBasic worker deployment\n~~~~~~~~~~~~~~~~~~~~~~~\n\nIn the basic deployment, you deploy each worker as you would any WSGI\napplication. A Paste Deployment server runner is provided by the\n``paste.server_runner`` ``main`` entry point. The runner accepts\nparameters:\n\nuse egg:zc.resumelb\n This selects the basic worker runner.\n\naddress HOST:PORT\n The address to listen on, in the form HOST:PORT\n\nhistory SIZE\n Roughly, the number of requests to consider when computing a\n worker's r\u00e9sum\u00e9. This defaults to 9999.\n\nmax_skill_age SIZE\n The maximum number of requests without a request in a request class\n before a request class is dropped from a worker's r\u00e9sum\u00e9.\n\n If not specified, this defaults to 10 times the history.\n\nthreads NTHREADS\n If specified with a number greater than zero, then a thread pool of\n the given size is used to call the underlying WSGI stack.\n\nresume_file PATH\n The path to a r\u00e9sum\u00e9 file. Periodically, the worker's r\u00e9sum\u00e9 is\n saved to this file and the file is read on startup to initialize\n the worker's r\u00e9sum\u00e9.\n\ntracelog LOGGER\n Request trace logging and specify the name of the Python logger to\n use.\n\nBasic load-balancer deployment\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThe load balancer is a program that should be run with a daemonizer,\nlike zdaemon, or supervisor. It get's it's configuration by way of\ncommand-line arguments. Run it with ``-h`` to get a list of options.\n\nThe basic load-balancer is provided by the ``resumelb`` script\nprovided by the package.\n\nBasic Example\n~~~~~~~~~~~~~\n\nHere's a sample ``paste.ini`` file defining a WSGI stack::\n\n [app:main]\n use = egg:bobo\n bobo_resources = zc.resumelb.tests\n\n [server:main]\n use = egg:zc.resumelb\n address = 127.0.0.1:8000\n\nAnd here's a load-balancer command you'd use with this worker::\n\n resumelb -LINFO -a :8080 127.0.0.1:8000\n\nIn this example, the load balancer listens on port 8080 and connects\nto the worker on port 8000.\n\nZooKeeper-based deployment\n---------------------------\n\nIn a ZooKeeper-based deployment, workers register with ZooKeeper and\nthe load balancer gets worker addresses from ZooKeeper. As workers are\nstarted and stopped, they're automatically added to and removed from\nthe load-balancer pool. In addition, most configuration parameters are\nread from ZooKeeper and are updated at run time when they are changed\nin ZooKeeper. To learn more about ZooKeeper and how to build and\nmaintain a ZooKeeper tree, see http://pypi.python.org/pypi/zc.zk.\n\nZooKeeoper-based worker deployment\n----------------------------------\n\nAs with the basic deployment, you deploy ZooKeeoper-based workers as\nservers in a WSGI stack. A Paste Deployment server runner is provided by the\n``paste.server_runner`` ``zk`` entry point. The runner accepts\nparameters:\n\nuse egg:zc.resumelb#zk\n This selects the ZooKeeoper-based worker runner.\n\nzookeeper CONNECTION\n A ZooKeeoper connection string.\n\npath PATH\n The path to a ZooKeeper node where the worker should get\n configuration and register it's address. The node should have a\n ``providers`` subnode where address is is published.\n\naddress HOST:PORT\n The address to listen on, in the form HOST:PORT\n\nthreads NTHREADS\n If specified with a number greater than zero, then a thread pool of\n the given size is used to call the underlying WSGI stack.\n\nresume_file PATH\n The path to a r\u00e9sum\u00e9 file. Periodically, the worker's r\u00e9sum\u00e9 is\n saved to this file and the file is read on startup to initialize\n the worker's r\u00e9sum\u00e9.\n\ntracelog LOGGER\n Request trace logging and specify the name of the Python logger to\n use.\n\nZooKeeper-based load-balancer deployment\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThe load balancer is a program that should be run with a daemonizer,\nlike zdaemon, or supervisor. It get's it's configuration by way of\ncommand-line arguments. Run it with ``-h`` to get a list of options.\n\nZooKeeper Example\n~~~~~~~~~~~~~~~~~\n\nHere's a sample ``paste.ini`` file defining a WSGI stack::\n\n [app:main]\n use = egg:bobo\n bobo_resources = zc.resumelb.tests\n\n [server:main]\n use = egg:zc.resumelb#zk\n zookeeper = 127.0.0.1:2181\n path = /lb/workers\n\nAnd here's a load-balancer command you'd use with this worker::\n\n zkresumelb -LINFO 127.0.0.1:2181 /lb\n\nThe above example assumes you have a ZooKeeper server running on port\n2181 and that it includes a tree that looks like::\n\n /lb\n /providers\n /workers\n /providers\n\nSee http://pypi.python.org/pypi/zc.zk to learn more about building and\nmaintaining ZooKeeper trees.\n\nChange History\n==============\n\n1.0.2 (2015-03-11)\n------------------\n\n- Fixed: the nagios monitor metric for max request age showed -1 when\n there were no outstanding requests. This was silly.\n\n- Fixed a packaging bug.\n\n1.0.1 (2015-03-03)\n------------------\n\n- Fixed: uncaught applications exceptions were mishandled for HEAD\n requests.\n\n- Fixed: LB worker paths couldn't be links in single-version mode, or\n when using alternate pool implementations.\n\n1.0.0 (2015-02-19)\n------------------\n\n- Nagios monitoring plugin. See src/zc/resumelb/nagios.rst.\n\n- You can now supply alternative pool implementations.\n\n Thanks to: https://github.com/zopefoundation/zc.resumelb/pull/3\n\n- There's a new pool implementation\n ``zc.resumelb.classlesspool.ClasslessPool`` that allocates work\n solely based on backlogs, ignoring resumes. This is useful for\n smaller applications that don't have large resident sets or a good\n way to segregate requests, but that can benefit from ZooKeeper-aware\n load balancing.\n\n0.7.5 (2014-11-18)\n------------------\n\n- Fixed: Tracelogs didn't include start and stop records.\n\n0.7.4 (2014-10-29)\n------------------\n\n- Fixed: Applications or middleware that didn't call the WSGI\n start_response function before returning an iterator weren't handled\n properly.\n\n- Fixed: File-descriptors leaked when load balancers disconnected from\n workers.\n\n0.7.3 (2014-06-04)\n------------------\n\n- Added some optimizations to reduce latency between load balancers\n and workers.\n\n0.7.2 (2014-06-02)\n------------------\n\n- Added keep-alive messages from load balancers to workers to detect\n workers that have gone away uncleanly.\n\n (Note that workers don't have to be updated.)\n\n0.7.1 (2012-10-17)\n------------------\n\n- Fixed: When used with ZooKeeper, a load balancer could end up with\n multiple connections to the same worker due to ZooKeeper\n \"flapping\". (ZooKeeper might report that workers had gone away and\n come back without the workers actually going away.)\n\n- Fixed: When using single-version mode, flapping between versions\n could cause worker and book backlogs to be computed concorrectly,\n causing assertion errors.\n\n- In single-version mode, log version changes.\n\n0.7.0 (2012-07-05)\n------------------\n\n- Added support in the load balancer for applications that can't have\n multiple worker versions. You can upgrade workers\n gradually. Workers with the new version will be ignored until\n they're in the majority, at which time the lb will stop using\n workers with the old version.\n\n0.6.2 (2012-06-15)\n------------------\n\n- Fixed: a lack of socket timeout could cause requests to leak.\n\n0.6.0 (2012-05-11)\n------------------\n\n- Added a command-line script to fetch lb status data, assuming you're\n using the ZooKeeper-aware load-balancer script and have requested a\n status server. (Also updated the status output to show request\n start times as integer seconds.)\n\n0.5.2 (2012-05-09)\n------------------\n\n- Fixed: Temporary files created when buffering data in the load\n balancers weren't closed explicitly. Generally, they were closed\n through garbage collection, but in certain situations, their numbers\n could build quickly, leading to file-descriptor exhaustion.\n\n- Fixed: Tracelog 'I' records didn't always contain input length information.\n\n- Fixed: Tracelog 'I' records were only included when using thread pools.\n\n0.5.1 (2012-05-07)\n------------------\n\n- Fixed: Worker resume data wasn't initialized correctly when no\n parameters are passed to the constructor and when reading a resume\n file, causing resmes not not to update.\n\n- Fixed: worker errors were written to standard out rather than being\n logged.\n\n- Fixed: Poorly-behaved WSGI applications that fail to catch errors\n caused requests to hang rather than return 500 responses.\n\n0.5.0 (2012-05-03)\n------------------\n\n- Changed the way tracelog records are identified to reflect lb\n request numbers. Records are disambiguated by including an lb\n identifier as a prefix. For example \"1.22\" indicated request number\n 22 from lb 1.\n\n- When defining workers that register with ZooKeeper, you can now\n supply a description in the paste.ini file that shows up in\n ZooKeeper. While the pid alone provides enough information to find\n a worker, often a description (e.g. instance name or path) can make\n it easier.\n\n0.4.0 (2012-04-27)\n------------------\n\n- Change the load-balancing algorithm to take backlogs of\n underutilized workers into account to allow a lower variance\n parameter to be used, which allows new workers to be better\n utilized.\n\n- Changed the load-balancing algorithm to try just a little bit harder\n to keep work with skilled workers by not penalizing workers for\n their first outstanding request. (In other words, when adjusting\n worker scrores chacking a maximum backlog, we subtract 1 from the\n worker's backlog if it's non-zero.\n\n- The status server provided when using ZooKeeper now listens on a\n unix-domain socket.\n\n- The status server provided when using ZooKeeper now includes the\n start time of the oldest request for each worker, to be used for\n monitoring.\n\n- Fixed: Workers buffered large request bodies in memory. Now large\n request bodies are buffered to disk.\n\n- Internal optimizations, especially writh regard to handling large\n request and response bodies.\n\n0.3.0 (2012-03-28)\n------------------\n\nChanged the way the zkresumelb (load-balancer program that works with\nZooKeeper) handles access logs. Now, you pass a Python logging logger\nname. If you don't pass anything, then nothing will be logged.\n\n0.2.0 (2012-03-27)\n------------------\n\n- There's a new API for getting worker r\u00e9sum\u00e9s, typically from\n monitoring code::\n\n >>> import zc.resume.worker\n >>> print zc.resume.worker.get_resume(addr)\n\n This is useful both for getting a worker's r\u00e9sum\u00e9 and for making\n sure that the worker is accepting load-balancer connections.\n\n There's also a scriot version of this::\n\n bin/get-worker-resume 192.168.24.60:33161\n\n- When using ZooKeeper, you can request an lb status server. The\n address gets registered with ZooKeeper. When you connect to it, you\n get back a json string containing the overall lb backlog and\n addresses and backlogs of each worker.\n\n- The update settings methods were changed to revert settings to\n default when not provided. This is especially important when used\n with ZooKeeper, so you can look at a tree and know what settings are\n without knowing the change history.\n\n- Added graceful load-balancer and worker shutdown on SIGTERM.\n\n- Fixed: trace log request ids weren't assigned correctly when using\n multiple load balancers.\n\n- Added packaging meta data to help find gevent 1.0b1\n (which is at http://code.google.com/p/gevent/downloads/list)\n\n- Updated the API for application trace logging to match that of\n zc.zservertracelog, mainly to get database logging for ZTK\n applications.\n\n0.1.0 (2012-03-09)\n------------------\n\nInitial release.", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "UNKNOWN", "keywords": null, "license": "ZPL 2.1", "maintainer": null, "maintainer_email": null, "name": "zc.resumelb", "package_url": "https://pypi.org/project/zc.resumelb/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/zc.resumelb/", "project_urls": { "Download": "UNKNOWN", "Homepage": "UNKNOWN" }, "release_url": "https://pypi.org/project/zc.resumelb/1.0.2/", "requires_dist": null, "requires_python": null, "summary": "R\u00e9sum\u00e9-based WSGI load balancer", "version": "1.0.2" }, "last_serial": 1457328, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "571f7a2865fd9f8c2cec26aa80b75811", "sha256": "05549f369c953d488804d98e277439b645ad9cfc0ebeb6f1fe0f28306407e104" }, "downloads": -1, "filename": "zc.resumelb-0.1.0.tar.gz", "has_sig": false, "md5_digest": "571f7a2865fd9f8c2cec26aa80b75811", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 34658, "upload_time": "2012-03-09T23:24:05", "url": "https://files.pythonhosted.org/packages/5e/b4/0b4783d7c2408f34828503cc63629c0a87c8050815d758950df41a2dc996/zc.resumelb-0.1.0.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "7dda55d84bcfac4a24c022b08d909fb3", "sha256": "2b90984e46222122a849701a8f27dd2d3b85ee73a33af72e6728ae43c879a18f" }, "downloads": -1, "filename": "zc.resumelb-0.2.0.tar.gz", "has_sig": false, "md5_digest": "7dda55d84bcfac4a24c022b08d909fb3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 38433, "upload_time": "2012-03-27T16:57:48", "url": "https://files.pythonhosted.org/packages/2d/a1/a20a32175c8c95a3bcaf9224375671a274c5d95153939247d872f25fade3/zc.resumelb-0.2.0.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "6a84f2bb481078fb66271fc032893e59", "sha256": "c5cfbd04640cecd6775b9c1d7fa261020c4817829c7d4bdd400a6c2ae2d30002" }, "downloads": -1, "filename": "zc.resumelb-0.3.0.tar.gz", "has_sig": false, "md5_digest": "6a84f2bb481078fb66271fc032893e59", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 39586, "upload_time": "2012-03-28T21:36:59", "url": "https://files.pythonhosted.org/packages/2e/da/dd520f0af7618039806c8bcb87f5c5b2840e4580c3cf64aa2bd0df650bfc/zc.resumelb-0.3.0.tar.gz" } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "b0a9c5fe2e5935e1de5e2b3f29516fae", "sha256": "957e06f5bcf4533fa495bcafd462912ea7b9d4919ff6d6b15348fb4c4a84c988" }, "downloads": -1, "filename": "zc.resumelb-0.4.0.tar.gz", "has_sig": false, "md5_digest": "b0a9c5fe2e5935e1de5e2b3f29516fae", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 44500, "upload_time": "2012-04-27T16:07:38", "url": "https://files.pythonhosted.org/packages/8f/96/cf9394ba39d404ad8644a5e3a4f4a89f5592d85f92d03e23ae0e445dae52/zc.resumelb-0.4.0.tar.gz" } ], "0.5.0": [ { "comment_text": "", "digests": { "md5": "1b84017fc61e6ecea3dd0b1b44885ec2", "sha256": "387583fe0714f088365d05671cc77f22d141daedca2d5a88dd196d60a4e3d475" }, "downloads": -1, "filename": "zc.resumelb-0.5.0.tar.gz", "has_sig": false, "md5_digest": "1b84017fc61e6ecea3dd0b1b44885ec2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 45707, "upload_time": "2012-05-03T19:38:55", "url": "https://files.pythonhosted.org/packages/65/5b/6f362a283b793f43ee6fb4e8a4123779645a1f9aa1d5bc41a9220073a6c1/zc.resumelb-0.5.0.tar.gz" } ], "0.5.1": [ { "comment_text": "", "digests": { "md5": "914f2d04605a14547cff9f5de4b0382b", "sha256": "cac55458f0ca9a9b1b96934b41874d0c9aadaaf14e6133c09f61d0b31fb71ba9" }, "downloads": -1, "filename": "zc.resumelb-0.5.1.tar.gz", "has_sig": false, "md5_digest": "914f2d04605a14547cff9f5de4b0382b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 47154, "upload_time": "2012-05-07T21:53:18", "url": "https://files.pythonhosted.org/packages/7f/e7/a4d1fff42e7d0cf5e4606e24ac610747f61d993051fbd3d8005fea558cec/zc.resumelb-0.5.1.tar.gz" } ], "0.5.2": [ { "comment_text": "", "digests": { "md5": "6c35b7b46c3b1c8519c2ac20cc19799b", "sha256": "9fe971ba80a618952efd957a42aa828dd5b1329e2164289dfceaccd018265c70" }, "downloads": -1, "filename": "zc.resumelb-0.5.2.tar.gz", "has_sig": false, "md5_digest": "6c35b7b46c3b1c8519c2ac20cc19799b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 48236, "upload_time": "2012-05-09T23:46:15", "url": "https://files.pythonhosted.org/packages/e2/5d/7fdd69318008a6e3f93a6395bb197b376c3318fa219eb78221b9bb430060/zc.resumelb-0.5.2.tar.gz" } ], "0.6.2": [ { "comment_text": "", "digests": { "md5": "df8548aa0de2d271ca57804715d74f77", "sha256": "ee1824da206e26d12d286c1b99857bd440308b2e2cbdcac99cbbca837b12596c" }, "downloads": -1, "filename": "zc.resumelb-0.6.2.tar.gz", "has_sig": false, "md5_digest": "df8548aa0de2d271ca57804715d74f77", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 49809, "upload_time": "2012-06-16T14:15:01", "url": "https://files.pythonhosted.org/packages/f9/6b/bee1a105fee3e5a6838c02ab90e3a243874ea0110b65c03c0d927e799272/zc.resumelb-0.6.2.tar.gz" } ], "0.7.0": [ { "comment_text": "", "digests": { "md5": "980d0532a33b113e45d17c4e586b103b", "sha256": "a1a63322748a42e70b2a17f45f57f36b53e762bd651395d917e71dedc878a2e2" }, "downloads": -1, "filename": "zc.resumelb-0.7.0.tar.gz", "has_sig": false, "md5_digest": "980d0532a33b113e45d17c4e586b103b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 52982, "upload_time": "2012-07-05T17:50:53", "url": "https://files.pythonhosted.org/packages/5f/26/175c4643c285cacad1c2be7e5464decd4f69109ce3919d2ff66ad7e56cd6/zc.resumelb-0.7.0.tar.gz" } ], "0.7.1": [ { "comment_text": "", "digests": { "md5": "70c3e280b51aa0eab5d57bf3e6799be8", "sha256": "b6746d41dc5c45c5e3988396d399fb9cb53e39e7011a46482fa764ee8b441c2a" }, "downloads": -1, "filename": "zc.resumelb-0.7.1.tar.gz", "has_sig": false, "md5_digest": "70c3e280b51aa0eab5d57bf3e6799be8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 54030, "upload_time": "2012-10-17T21:21:13", "url": "https://files.pythonhosted.org/packages/6c/97/dcccddd14d1c470a102005df360d1aa5d8c09e08152749c75b711d6b2ad6/zc.resumelb-0.7.1.tar.gz" } ], "0.7.2": [ { "comment_text": "", "digests": { "md5": "00f9746469678cca6162448577562848", "sha256": "0cf540a96300f936cdcbba0db07a7ec76cf5fa5db27c32fba1c8cb23c48654b3" }, "downloads": -1, "filename": "zc.resumelb-0.7.2.tar.gz", "has_sig": false, "md5_digest": "00f9746469678cca6162448577562848", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 55682, "upload_time": "2014-06-02T19:53:06", "url": "https://files.pythonhosted.org/packages/5d/34/1028be7d27d0db8d2a214b4d95a9cb57a7535d158c7c1e8fca7c3795f639/zc.resumelb-0.7.2.tar.gz" } ], "0.7.3": [ { "comment_text": "", "digests": { "md5": "0a0c4c407e3a324813c1ae9bbed4368f", "sha256": "1c8587273439f6523c7a895ed46f30582e190eaeba8e517f52864c6c8e4cb5d9" }, "downloads": -1, "filename": "zc.resumelb-0.7.3.tar.gz", "has_sig": false, "md5_digest": "0a0c4c407e3a324813c1ae9bbed4368f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 56020, "upload_time": "2014-06-04T21:10:05", "url": "https://files.pythonhosted.org/packages/84/f2/1519209cb24e5f10ede0368e325981df130545f8905951f9058d91d21e79/zc.resumelb-0.7.3.tar.gz" } ], "0.7.4": [ { "comment_text": "", "digests": { "md5": "38ec6c5c4cbd0065f013de2f0889fdd1", "sha256": "936b7bc334648c868b2140b4fd5bbbd3f41962247652e2f933d94661eebeacaa" }, "downloads": -1, "filename": "zc.resumelb-0.7.4.tar.gz", "has_sig": false, "md5_digest": "38ec6c5c4cbd0065f013de2f0889fdd1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 58913, "upload_time": "2014-10-29T18:46:24", "url": "https://files.pythonhosted.org/packages/db/56/b1b9f11fbea0ee1791dcef867d277d867a681017c9557f6561cd0708ee01/zc.resumelb-0.7.4.tar.gz" } ], "0.7.5": [ { "comment_text": "", "digests": { "md5": "a80c46bd756a8a7bc1cc65ba72538a2b", "sha256": "728138c908ea2e563a9921fab80a37f4de179ec1ab8f5cbf863b021ab2cc73be" }, "downloads": -1, "filename": "zc.resumelb-0.7.5.tar.gz", "has_sig": false, "md5_digest": "a80c46bd756a8a7bc1cc65ba72538a2b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 59170, "upload_time": "2014-11-18T22:19:29", "url": "https://files.pythonhosted.org/packages/f2/5b/34a76d72d1965eb7c3cbed9cfb28053fa789cca637a36f61f569eecc1820/zc.resumelb-0.7.5.tar.gz" } ], "1.0.0": [ { "comment_text": "", "digests": { "md5": "3639170c73011a1f8118b8e7113a13c0", "sha256": "f88d9b08b8706d939a9047534bc470db9acbbca61f60928e47e89f48805605eb" }, "downloads": -1, "filename": "zc.resumelb-1.0.0.tar.gz", "has_sig": false, "md5_digest": "3639170c73011a1f8118b8e7113a13c0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 58375, "upload_time": "2015-02-19T11:23:33", "url": "https://files.pythonhosted.org/packages/1e/0a/cbcb873fe8b63d506cb6528a84236ff38eef5ad31f61c8e873a6fd75503b/zc.resumelb-1.0.0.tar.gz" } ], "1.0.1": [ { "comment_text": "", "digests": { "md5": "d276e110f54146400317320be2712a58", "sha256": "90efb59f25c42911571c221b9c9cc1180f81a008e37b1d8fa1a3ffddff00ad26" }, "downloads": -1, "filename": "zc.resumelb-1.0.1.tar.gz", "has_sig": false, "md5_digest": "d276e110f54146400317320be2712a58", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 60036, "upload_time": "2015-03-03T23:06:34", "url": "https://files.pythonhosted.org/packages/33/fb/b5f60030cef7276e7ed07ea8bad916897c85031ed7b5d09ad2e198928b0b/zc.resumelb-1.0.1.tar.gz" } ], "1.0.2": [ { "comment_text": "", "digests": { "md5": "22dacb3e01943c2fbea4feb5ffa9649d", "sha256": "f56bacfd2fce35546b46a5ba3ca1f7c4cccd86a9f0bab88fd910f4d4aa2931ba" }, "downloads": -1, "filename": "zc.resumelb-1.0.2.tar.gz", "has_sig": false, "md5_digest": "22dacb3e01943c2fbea4feb5ffa9649d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 60267, "upload_time": "2015-03-11T13:32:34", "url": "https://files.pythonhosted.org/packages/d8/07/3291e2f1c009b35cbcce52d176a2e95ae2e1bc363c5c6d56ac8ae871389b/zc.resumelb-1.0.2.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "22dacb3e01943c2fbea4feb5ffa9649d", "sha256": "f56bacfd2fce35546b46a5ba3ca1f7c4cccd86a9f0bab88fd910f4d4aa2931ba" }, "downloads": -1, "filename": "zc.resumelb-1.0.2.tar.gz", "has_sig": false, "md5_digest": "22dacb3e01943c2fbea4feb5ffa9649d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 60267, "upload_time": "2015-03-11T13:32:34", "url": "https://files.pythonhosted.org/packages/d8/07/3291e2f1c009b35cbcce52d176a2e95ae2e1bc363c5c6d56ac8ae871389b/zc.resumelb-1.0.2.tar.gz" } ] }