{ "info": { "author": "Cameron Simpson", "author_email": "cs@cskk.id.au", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 3", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "*Latest release 20191012*:\nNew @contextual decorator to turn a simple function into a context manager.\n@strable: mention context manager requirement and @contextual as workaround.\n\nAssorted decorator functions.\n\n## Function `cached(*a, **kw)`\n\nCompatibility wrapper for `@cachedmethod`, issuing a warning.\n\n## Function `cachedmethod(*da, **dkw)`\n\nDecorator to cache the result of a method and keep a revision\ncounter for changes.\n\nThe cached values are stored on the instance (`self`).\nThe revision counter supports the `@revised` decorator.\n\nThis decorator may be used in 2 modes.\nDirectly:\n\n @cachedmethod\n def method(self, ...)\n\nor indirectly:\n\n @cachedmethod(poll_delay=0.25)\n def method(self, ...)\n\nOptional keyword arguments:\n* `attr_name`: the basis name for the supporting attributes.\n Default: the name of the method.\n* `poll_delay`: minimum time between polls; after the first\n access, subsequent accesses before the `poll_delay` has elapsed\n will return the cached value.\n Default: `None`, meaning no poll delay.\n* `sig_func`: a signature function, which should be significantly\n cheaper than the method. If the signature is unchanged, the\n cached value will be returned. The signature function\n expects the instance (`self`) as its first parameter.\n Default: `None`, meaning no signature function;\n the first computed value will be kept and never updated.\n* `unset_value`: the value to return before the method has been\n called successfully.\n Default: `None`.\n\nIf the method raises an exception, this will be logged and\nthe method will return the previously cached value,\nunless there is not yet a cached value\nin which case the exception will be reraised.\n\nIf the signature function raises an exception\nthen a log message is issued and the signature is considered unchanged.\n\nAn example use of this decorator might be to keep a \"live\"\nconfiguration data structure, parsed from a configuration\nfile which might be modified after the program starts. One\nmight provide a signature function which called `os.stat()` on\nthe file to check for changes before invoking a full read and\nparse of the file.\n\n*Note*: use of this decorator requires the `cs.pfx` module.\n\n## Function `contextual(func)`\n\nWrap a simple function as a context manager.\n\nThis was written to support `@strable`,\nwhich requires its `open_func` to be a context manager.\n\n>>> f = lambda: 3\n>>> cf = contextual(f)\n>>> with cf() as x: print(x)\n3\n\n## Function `decorator(deco)`\n\nWrapper for decorator functions to support optional arguments.\n\nThe actual decorator function ends up being called as:\n\n mydeco(func, *da, **dkw)\n\nallowing `da` and `dkw` to affect the behaviour of the decorator `mydeco`.\n\nExamples:\n\n @decorator\n def mydeco(func, *da, kw=None):\n ... decorate func subject to the values of da and kw\n\n @mydeco\n def func1(...):\n ...\n\n @mydeco('foo', arg2='bah')\n def func2(...):\n ...\n\n## Function `fmtdoc(func)`\n\nDecorator to replace a function's docstring with that string\nformatted against the function's module `__dict__`.\n\nThis supports simple formatted docstrings:\n\n ENVVAR_NAME = 'FUNC_DEFAULT'\n\n @fmtdoc\n def func():\n \"\"\"Do something with os.environ[{ENVVAR_NAME}].\"\"\"\n print(os.environ[ENVVAR_NAME])\n\nThis gives `func` this docstring:\n\n Do something with os.environ[FUNC_DEFAULT].\n\n*Warning*: this decorator is intended for wiring \"constants\"\ninto docstrings, not for dynamic values. Use for other types\nof values should be considered with trepidation.\n\n## Function `observable_class(property_names, only_unequal=False)`\n\nClass decorator to make various instance attributes observable.\n\nParameters:\n* `property_names`:\n an interable of instance property names to set up as\n observable properties. As a special case a single `str` can\n be supplied if only one attribute is to be observed.\n* `only_unequal`:\n only call the observers if the new property value is not\n equal to the previous proerty value. This requires property\n values to be comparable for inequality.\n Default: `False`, meaning that all updates will be reported.\n\n## Function `strable(*da, **dkw)`\n\nDecorator for functions which may accept a `str`\ninstead of their core type.\n\nParameters:\n* `func`: the function to decorate\n* `open_func`: the \"open\" factory to produce the core type\n if a string is provided;\n the default is the builtin \"open\" function.\n The returned value should be a context manager.\n Simpler functions can be decorated with `@contextual`\n to turn them into context managers if need be.\n\nThe usual (and default) example is a function to process an\nopen file, designed to be handed a file object but which may\nbe called with a filename. If the first argument is a `str`\nthen that file is opened and the function called with the\nopen file.\n\nExamples:\n\n @strable\n def count_lines(f):\n return len(line for line in f)\n\n class Recording:\n \"Class representing a video recording.\"\n ...\n @strable(open_func=Recording)\n def process_video(r):\n ... do stuff with `r` as a Recording instance ...\n\n*Note*: use of this decorator requires the `cs.pfx` module.\n\n\n\n# Release Log\n\n*Release 20191012*:\nNew @contextual decorator to turn a simple function into a context manager.\n@strable: mention context manager requirement and @contextual as workaround.\n\n*Release 20191006*:\nRename @cached to @cachedmethod, leave compatible @cached behind which issues a warning (will be removed in a future release).\n\n*Release 20191004*:\nAvoid circular import with cs.pfx by removing requirement and doing the import later if needed.\n\n*Release 20190905*:\nBugfix @deco: it turns out that you may not set the .__module__ attribute on a property object.\n\n*Release 20190830.2*:\nMake some getattr calls robust.\n\n*Release 20190830.1*:\n@decorator: set the __module__ of the wrapper.\n\n*Release 20190830*:\n@decorator: set the __module__ of the wrapper from the decorated target, aids cs.distinf.\n\n*Release 20190729*:\n@cached: sidestep uninitialised value.\n\n*Release 20190601.1*:\n@strable: fix the example in the docstring.\n\n*Release 20190601*:\nBugfix @decorator to correctly propagate the docstring of the subdecorator.\nImprove other docstrings.\n\n*Release 20190526*:\n@decorator: add support for positional arguments and rewrite - simpler and clearer.\n\n*Release 20190512*:\n@fmtdoc: add caveat against misuse of this decorator.\n\n*Release 20190404*:\nNew @fmtdoc decorator to format a function's doctsring against its module's globals.\n\n*Release 20190403*:\n@cached: bugfix: avoid using unset sig_func value on first pass.\n@observable_class: further tweaks.\n\n*Release 20190322.1*:\n@observable_class: bugfix __init__ wrapper function.\n\n*Release 20190322*:\nNew class decorator @observable_class.\nBugfix import of \"warning\".\n\n*Release 20190309*:\n@cached: improve the exception handling.\n\n*Release 20190307.2*:\nFix docstring typo.\n\n*Release 20190307.1*:\nBugfix @decorator: final plumbing step for decorated decorator.\n\n*Release 20190307*:\n@decorator: drop unused arguments, they get used by the returned decorator.\nRework the @cached logic.\n\n*Release 20190220*:\nBugfix @decorator decorator, do not decorate twice.\nHave a cut at inheriting the decorated function's docstring.\n\n*Release 20181227*:\nNew decoartor @strable for function which may accept a str instead of their primary type.\nImprovements to @cached.\n\n*Release 20171231*:\nInitial PyPI release.", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://bitbucket.org/cameron_simpson/css/commits/all", "keywords": "python2,python3", "license": "GNU General Public License v3 or later (GPLv3+)", "maintainer": "", "maintainer_email": "", "name": "cs.deco", "package_url": "https://pypi.org/project/cs.deco/", "platform": "", "project_url": "https://pypi.org/project/cs.deco/", "project_urls": { "Homepage": "https://bitbucket.org/cameron_simpson/css/commits/all" }, "release_url": "https://pypi.org/project/cs.deco/20191012/", "requires_dist": null, "requires_python": "", "summary": "Assorted decorator functions.", "version": "20191012" }, "last_serial": 5962880, "releases": { "20171231": [ { "comment_text": "", "digests": { "md5": "fa77dff47b323a7976524c28f44db547", "sha256": "9557b9f0a09b718459a5e830e8aeda1faa7cc941017b7d8a01455cad47080765" }, "downloads": -1, "filename": "cs.deco-20171231.tar.gz", "has_sig": false, "md5_digest": "fa77dff47b323a7976524c28f44db547", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2999, "upload_time": "2017-12-30T21:46:14", "url": "https://files.pythonhosted.org/packages/5d/c7/dcc17fd6b6a7ffd736c01c5608b54fe768994c26956eb596dd3d543c295a/cs.deco-20171231.tar.gz" } ], "20181227": [ { "comment_text": "", "digests": { "md5": "f8e02c3e5248c1084d4c03b2c0c7933d", "sha256": "9ae8c89a140e9e5dd89251956136e711bdc01376255deb14ae7021e25303136d" }, "downloads": -1, "filename": "cs.deco-20181227.tar.gz", "has_sig": false, "md5_digest": "f8e02c3e5248c1084d4c03b2c0c7933d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3565, "upload_time": "2018-12-27T05:32:30", "url": "https://files.pythonhosted.org/packages/fe/3a/dfd014392be2f1ed77596dd823ba1b03dca982c04a2865f46c5531b309c7/cs.deco-20181227.tar.gz" } ], "20190220": [ { "comment_text": "", "digests": { "md5": "3717b9cd22aeefc266d704d0d1f524d0", "sha256": "04562692583e94b1d0b1dc66ed5979d3936e08b1b2aa5584edf5e3464855f6cf" }, "downloads": -1, "filename": "cs.deco-20190220.tar.gz", "has_sig": false, "md5_digest": "3717b9cd22aeefc266d704d0d1f524d0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3600, "upload_time": "2019-02-20T09:04:15", "url": "https://files.pythonhosted.org/packages/7e/dd/377302bd522e8762489d50e06fe86966c01a5b267c8bee2d12346edae08a/cs.deco-20190220.tar.gz" } ], "20190307": [ { "comment_text": "", "digests": { "md5": "13bed8e97bde8eafb7a193205a7c2af3", "sha256": "da6aba9282b5bdd5a109a74cea2208f8b96a4b4acb1dc06598685b839b190d14" }, "downloads": -1, "filename": "cs.deco-20190307.tar.gz", "has_sig": false, "md5_digest": "13bed8e97bde8eafb7a193205a7c2af3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3742, "upload_time": "2019-03-07T09:32:29", "url": "https://files.pythonhosted.org/packages/df/15/b69d0ec7f13e691be0e82871557e81bbac4897561a60e5456bc0488a3a93/cs.deco-20190307.tar.gz" } ], "20190307.1": [ { "comment_text": "", "digests": { "md5": "c426ad318f51f4d0174d1da1539c0798", "sha256": "f43e5970b2051db031837e0814e66ed8f9a3c7fd006142dd913c49e64e4bb94e" }, "downloads": -1, "filename": "cs.deco-20190307.1.tar.gz", "has_sig": false, "md5_digest": "c426ad318f51f4d0174d1da1539c0798", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4474, "upload_time": "2019-03-07T09:39:47", "url": "https://files.pythonhosted.org/packages/bb/33/87277555488ae126e7ac9ce3aeb6ce84dfb3eb30cccd6f8aaddc4ebba215/cs.deco-20190307.1.tar.gz" } ], "20190307.2": [ { "comment_text": "", "digests": { "md5": "6b890b0a13de726430179f1cd102abfc", "sha256": "afac1ef14b7de5c48b80fea313d09f7972556825512096c2833e1a6e3a4d94f9" }, "downloads": -1, "filename": "cs.deco-20190307.2.tar.gz", "has_sig": false, "md5_digest": "6b890b0a13de726430179f1cd102abfc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4476, "upload_time": "2019-03-07T09:42:38", "url": "https://files.pythonhosted.org/packages/bb/90/e1c50b8cf3e71a89d1087a897e63f7e75c96fa6a1166c3e7485fa2736b2e/cs.deco-20190307.2.tar.gz" } ], "20190309": [ { "comment_text": "", "digests": { "md5": "1edfdae4489222983df744c5b16c131d", "sha256": "c68ad0a7bb8f7625ec9cf9c13de156e1e66e04cbd2c846606074126fe2bffb4a" }, "downloads": -1, "filename": "cs.deco-20190309.tar.gz", "has_sig": false, "md5_digest": "1edfdae4489222983df744c5b16c131d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4645, "upload_time": "2019-03-09T04:13:37", "url": "https://files.pythonhosted.org/packages/cf/8d/03a1d71448def9d4260ba933a4583b84e201aeebdacb31260952797c1e7e/cs.deco-20190309.tar.gz" } ], "20190322": [ { "comment_text": "", "digests": { "md5": "f1907e92fe8f53080167a631dd4e7109", "sha256": "8a4caab442718ffd47a0325a1ebf0a1de2edcc6ba299075f650a552df757a404" }, "downloads": -1, "filename": "cs.deco-20190322.tar.gz", "has_sig": false, "md5_digest": "f1907e92fe8f53080167a631dd4e7109", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5633, "upload_time": "2019-03-22T01:01:09", "url": "https://files.pythonhosted.org/packages/9d/79/fa9e1f272c29a449d56fb0344929d3202304a94e551e5389bfa9bd212e5e/cs.deco-20190322.tar.gz" } ], "20190322.1": [ { "comment_text": "", "digests": { "md5": "adf8371e19c9fc0d7d7202eb44e890b8", "sha256": "02670f86eb701721dce9eb63a59ea532f6b8eaaf0f348424cc861cb4ecd57447" }, "downloads": -1, "filename": "cs.deco-20190322.1.tar.gz", "has_sig": false, "md5_digest": "adf8371e19c9fc0d7d7202eb44e890b8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5635, "upload_time": "2019-03-22T01:32:16", "url": "https://files.pythonhosted.org/packages/b8/3e/14a0b36834b20e1927694edbd958041389a4d23553aa2072feb6897fd72d/cs.deco-20190322.1.tar.gz" } ], "20190403": [ { "comment_text": "", "digests": { "md5": "907656800f231ead98d199ebc23d3855", "sha256": "71c59ab904b1d538bbb9075669f96ca8987eb166dbcb07764a4c657c8d67ec49" }, "downloads": -1, "filename": "cs.deco-20190403.tar.gz", "has_sig": false, "md5_digest": "907656800f231ead98d199ebc23d3855", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5679, "upload_time": "2019-04-02T21:32:34", "url": "https://files.pythonhosted.org/packages/5b/a0/09c5bef96180b2cf17f59ffd4936fb7fea9c573d736b44b3d5d42449f158/cs.deco-20190403.tar.gz" } ], "20190404": [ { "comment_text": "", "digests": { "md5": "c7268add7fbcf931966dcdf5f0069042", "sha256": "f13741038f959dc465826a0a5c9737766ba02dfeeb00186b7733b7fe8b49ca86" }, "downloads": -1, "filename": "cs.deco-20190404.tar.gz", "has_sig": false, "md5_digest": "c7268add7fbcf931966dcdf5f0069042", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6064, "upload_time": "2019-04-04T04:17:01", "url": "https://files.pythonhosted.org/packages/5f/5b/ef973d1bcf898de957ac5d37627c83c15a0a734cc8dbee0076e1b7e23ad9/cs.deco-20190404.tar.gz" } ], "20190512": [ { "comment_text": "", "digests": { "md5": "7bfae6a4450fa463cb312d4223974fb2", "sha256": "ca7aca02f86d3ea38e87f6029cf401a0d56348ba6b76c7db42efed3a50557e87" }, "downloads": -1, "filename": "cs.deco-20190512.tar.gz", "has_sig": false, "md5_digest": "7bfae6a4450fa463cb312d4223974fb2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6165, "upload_time": "2019-05-12T00:01:22", "url": "https://files.pythonhosted.org/packages/b8/f1/d56578d5ec9cc86da6cce2f3f8d8b7b5f501202eda5d212a338c11709b63/cs.deco-20190512.tar.gz" } ], "20190526": [ { "comment_text": "", "digests": { "md5": "62b94b588709fc466e6f807dfe9c3fe0", "sha256": "760523e13e332f3760c8c45749af5ce6d45556c3d424efe949990b777f4fb4b1" }, "downloads": -1, "filename": "cs.deco-20190526.tar.gz", "has_sig": false, "md5_digest": "62b94b588709fc466e6f807dfe9c3fe0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5582, "upload_time": "2019-05-26T10:19:49", "url": "https://files.pythonhosted.org/packages/b2/39/d7c913a27fe17a10ade082d655846c6c9926221ceb68e7642048c7fcad3b/cs.deco-20190526.tar.gz" } ], "20190601": [ { "comment_text": "", "digests": { "md5": "a6c08e08444bf655254a0125544bd330", "sha256": "e55db127215c3e2634414e66667c9bbef7d77f9d9198384ef3b30e845919ee62" }, "downloads": -1, "filename": "cs.deco-20190601.tar.gz", "has_sig": false, "md5_digest": "a6c08e08444bf655254a0125544bd330", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6452, "upload_time": "2019-06-01T09:55:35", "url": "https://files.pythonhosted.org/packages/b5/03/7690d43c6dba3544ee0210d5148130b9817158dff24438708fde8011bb03/cs.deco-20190601.tar.gz" } ], "20190601.1": [ { "comment_text": "", "digests": { "md5": "b9a952e931719d16638b6b2bda2c5e91", "sha256": "545e15d2827e67dcfce72735d97c9d16fd931021e9febe75dee5efb2a757580f" }, "downloads": -1, "filename": "cs.deco-20190601.1.tar.gz", "has_sig": false, "md5_digest": "b9a952e931719d16638b6b2bda2c5e91", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6456, "upload_time": "2019-06-01T10:00:37", "url": "https://files.pythonhosted.org/packages/ad/14/6778f6335bba731de5002bbdb118fc5a1e42fe15eb82b02dbad1e31ff310/cs.deco-20190601.1.tar.gz" } ], "20190729": [ { "comment_text": "", "digests": { "md5": "9a4fc01280ae846e898cbf3617040949", "sha256": "aff036c14b7215f28fdbcbb818a5674509c09978e02c4553477f889b78c9f391" }, "downloads": -1, "filename": "cs.deco-20190729.tar.gz", "has_sig": false, "md5_digest": "9a4fc01280ae846e898cbf3617040949", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6462, "upload_time": "2019-07-28T23:36:00", "url": "https://files.pythonhosted.org/packages/ac/42/b02bde3530fb1d84d0f610b5ab589dba0f4c285dcb8c9844ea3e4545427a/cs.deco-20190729.tar.gz" } ], "20190830": [ { "comment_text": "", "digests": { "md5": "aee0ce1f54f0da2f3c35d09e82f61206", "sha256": "53055de98113b851ecc91d3937630ace1359af084911f8e18a5ce89d688ae0d9" }, "downloads": -1, "filename": "cs.deco-20190830.tar.gz", "has_sig": false, "md5_digest": "aee0ce1f54f0da2f3c35d09e82f61206", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7452, "upload_time": "2019-08-29T21:57:44", "url": "https://files.pythonhosted.org/packages/22/a0/f8e38999f899bd040abc0fb73244e0c5415f1a4a47095770d4b896c02bf2/cs.deco-20190830.tar.gz" } ], "20190830.1": [ { "comment_text": "", "digests": { "md5": "a350f67ce615eef5b423715070c6099d", "sha256": "619dbc91f85b8cd842498566c60936e2402091b72b2a5408f60fb19bd91e7d90" }, "downloads": -1, "filename": "cs.deco-20190830.1.tar.gz", "has_sig": false, "md5_digest": "a350f67ce615eef5b423715070c6099d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7491, "upload_time": "2019-08-29T22:02:45", "url": "https://files.pythonhosted.org/packages/db/27/b959d9dfec3d63cf00ea4e9e4c0be336ff0696083f5c82ecbe9918a59d33/cs.deco-20190830.1.tar.gz" } ], "20190830.2": [ { "comment_text": "", "digests": { "md5": "11c52c65ac37365c9da9595137fb2f48", "sha256": "57293fdb761f3195ad2a70a3281d5b59af966854c248029c5da0b36fcb5ffba3" }, "downloads": -1, "filename": "cs.deco-20190830.2.tar.gz", "has_sig": false, "md5_digest": "11c52c65ac37365c9da9595137fb2f48", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7512, "upload_time": "2019-08-29T22:14:50", "url": "https://files.pythonhosted.org/packages/ac/13/3a7ff90e164c8c99a7180ab3f472d7df9b545baf69ff601d0e679c3d6e5a/cs.deco-20190830.2.tar.gz" } ], "20190905": [ { "comment_text": "", "digests": { "md5": "85e6c2a60a1e0d669906fd43c14c8bc9", "sha256": "fea916a7d2b62726c72ac97982b6a8eb9e2f1160d56c4fb75eab60acfa895d03" }, "downloads": -1, "filename": "cs.deco-20190905.tar.gz", "has_sig": false, "md5_digest": "85e6c2a60a1e0d669906fd43c14c8bc9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8450, "upload_time": "2019-09-05T03:19:21", "url": "https://files.pythonhosted.org/packages/43/b5/a0755848fd7352b9953a450fd9b741f20ca6c46cd5b0f22b3f267651b11d/cs.deco-20190905.tar.gz" } ], "20191004": [ { "comment_text": "", "digests": { "md5": "52e6efcfc1870b020161a907f9d1af0b", "sha256": "f372d8f64648c78f4896815c4d0457c261a80c1ed43dc2c36f9fbd1fc7be6e68" }, "downloads": -1, "filename": "cs.deco-20191004.tar.gz", "has_sig": false, "md5_digest": "52e6efcfc1870b020161a907f9d1af0b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8512, "upload_time": "2019-10-04T10:29:45", "url": "https://files.pythonhosted.org/packages/0a/19/98f9d1eb52bebefe2f83180e8b9ab24e274ab5b74c741501b0911ccf1078/cs.deco-20191004.tar.gz" } ], "20191006": [ { "comment_text": "", "digests": { "md5": "5bb76158840c274cc6613561574255eb", "sha256": "d4e9061fc27d135db5b468bdbafcf10010e3fb97b81a7eec7dc4312429aa353b" }, "downloads": -1, "filename": "cs.deco-20191006.tar.gz", "has_sig": false, "md5_digest": "5bb76158840c274cc6613561574255eb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8759, "upload_time": "2019-10-06T03:05:39", "url": "https://files.pythonhosted.org/packages/db/d5/3019c080abd1301746cf7754763d64077afa643a21fcf222dfd66eea08c1/cs.deco-20191006.tar.gz" } ], "20191012": [ { "comment_text": "", "digests": { "md5": "51f6391a1a728c8c65cc3eaa89f096eb", "sha256": "e5268e0b9de740f12ced52c7bcc1b2cfb74df6ffc9d7f22b94b768ab3bb27a66" }, "downloads": -1, "filename": "cs.deco-20191012.tar.gz", "has_sig": false, "md5_digest": "51f6391a1a728c8c65cc3eaa89f096eb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9299, "upload_time": "2019-10-12T04:31:31", "url": "https://files.pythonhosted.org/packages/7a/7d/42c2c74f6f8de4d6b32fea5f2f18ef52a90a0c0a60e26f34da1b2bb70340/cs.deco-20191012.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "51f6391a1a728c8c65cc3eaa89f096eb", "sha256": "e5268e0b9de740f12ced52c7bcc1b2cfb74df6ffc9d7f22b94b768ab3bb27a66" }, "downloads": -1, "filename": "cs.deco-20191012.tar.gz", "has_sig": false, "md5_digest": "51f6391a1a728c8c65cc3eaa89f096eb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9299, "upload_time": "2019-10-12T04:31:31", "url": "https://files.pythonhosted.org/packages/7a/7d/42c2c74f6f8de4d6b32fea5f2f18ef52a90a0c0a60e26f34da1b2bb70340/cs.deco-20191012.tar.gz" } ] }