{ "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": "Persistent filesystem based flags for state and control.\n\nFilesystem visible boolean flags\nfor control and status,\nallowing easy monitoring of services or other status,\nand control by flag management\nfor programmes which also monitor the flags.\n\nThe flags are expressed as individual files with uppercase names\nin a common directory ($HOME/var/flags by default);\nan empty or missing file is \"false\"\nand a nonempty file is \"true\".\n\nThe Flags class provides easy Pythonic access to this directory.\nIt presents as a modifiable mapping whose keys are the flag names:\n\n flags = Flags()\n flags['UNTOPPOST'] = True\n\nThere is also a FlaggedMixin class providing convenient methods and attributes\nfor maintaining a collection of flags associated with some object\nwith flag names prefixed by the object's .name attribute\nuppercased and with an underscore appended:\n\n class SvcD(...,FlaggedMixin):\n def __init__(self, name, ...)\n self.name = name\n FlaggedMixin.__init__(self)\n ...\n def disable(self):\n self.flag_disable = True\n def restart(self):\n self.flag_restart = True\n def _restart(self):\n self.flag_restart = False\n ... restart the SvcD ...\n\nso that an object set up as:\n\n svcd = SvcD(\"portfwd\")\n print(svcd.flag_disable)\n\naccesses the flag named \"PORTFWD_DISABLE\".\n\n## Class `FlaggedMixin`\n\nA mixin class adding flag_* and flagname_* attributes.\n\n This defines the following attributes on instances:\n * `flags`: the `Flags` instance providing the flag values.\n * `flags_prefix`: the prefix for the flags of interest.\n * `flagname_`*name*: the full name within `.flags`\n of the flag referred to as *name*.\n This is `.flags_prefix + '_' + `*name*\n if `.flags_prefix` is not empty,\n or just *name* otherwise.\n* `flag_`*name*: the value from `.flags`\n of the flag referred to as *name*.\n This is a setable attribute\n with changes propagated to `.flags`.\n\n### Method `FlaggedMixin.__init__(self, flags=None, debug=None, prefix=None)`\n\nInitialise the mixin.\n\nParameters:\n* `flags`: optional parameter;\n if `None` defaults to a new default `Flags()`.\n* `prefix`: optional prefix;\n if not provided the prefix is derived\n from the object's `.name` attribute,\n or is empty if there is no `.name`\n\n## Class `Flags`\n\nMRO: `collections.abc.MutableMapping`, `collections.abc.Mapping`, `collections.abc.Collection`, `collections.abc.Sized`, `collections.abc.Iterable`, `collections.abc.Container`, `FlaggedMixin` \nA mapping which directly inspects the flags directory.\n\n### Method `Flags.__init__(self, flagdir=None, environ=None, lock=None, debug=None)`\n\nInitialise the `Flags` instance.\n\nParameters:\n* `flagdir`: the directory holding flag state files;\n if omitted use the value from `cs.env.FLAGDIR(environ)`\n* `environ`: the environment mapping to use,\n default `os.environ`\n* `lock`: a `Lock`like mutex to control multithreaded access;\n if omitted no locking is down\n* `debug`: debug mode, default `False`\n\n## Function `lowername(s)`\n\nLowercase letters, transmute '_' to '-'. Note: NOT the reverse of uppername.\n\n## Function `main(argv=None)`\n\nMain program: inspect or modify flags.\n\n## Function `main_flagset(argv=None, stdin=None)`\n\nMain program for \"flagset\" command.\n\n## Class `PolledFlags`\n\nMRO: `builtins.dict` \nA mapping which maintains a dict of the current state of the flags directory\nand updates it regularly.\n\nThis allows an application to consult the flags very frequently\nwithout hammering the filesystem.\n\n## Function `truthy(value)`\n\nDecide whether a value is considered true.\n\nStrings are converted to:\n* `'0'`: `False`\n* `'1'`: `True`\n* `'true'`: `True` (case insensitive)\n* `'false'`: `False` (case insensitive)\n* other string values are unchanged.\n\nOther types are converted with `bool()`.\n\n## Function `uppername(s)`\n\nUppercase letters, transmute some characters to '_' or '__'.", "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.app.flag", "package_url": "https://pypi.org/project/cs.app.flag/", "platform": "", "project_url": "https://pypi.org/project/cs.app.flag/", "project_urls": { "Homepage": "https://bitbucket.org/cameron_simpson/css/commits/all" }, "release_url": "https://pypi.org/project/cs.app.flag/20190729/", "requires_dist": null, "requires_python": "", "summary": "Persistent filesystem based flags for state and control.", "version": "20190729" }, "last_serial": 5597070, "releases": { "20170905": [ { "comment_text": "", "digests": { "md5": "19a12172258daaa4fb05732224abe943", "sha256": "37656d495def3df40a34c88629656df9ef6588c26742ed745f58348d31b55e6f" }, "downloads": -1, "filename": "cs.app.flag-20170905.tar.gz", "has_sig": false, "md5_digest": "19a12172258daaa4fb05732224abe943", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3996, "upload_time": "2017-09-05T10:52:48", "url": "https://files.pythonhosted.org/packages/2d/ed/05a3b5800d34f8fb53d593bbaa99fb1d6cf665f83d644aadb30586008e65/cs.app.flag-20170905.tar.gz" } ], "20170906": [ { "comment_text": "", "digests": { "md5": "2c2070c45982d6a377df548e520d3226", "sha256": "ba881980012a927a96f0970a6bbf99f73961a8e96c8ffe21b430f50ae9280bf2" }, "downloads": -1, "filename": "cs.app.flag-20170906.tar.gz", "has_sig": false, "md5_digest": "2c2070c45982d6a377df548e520d3226", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4648, "upload_time": "2017-09-06T00:19:36", "url": "https://files.pythonhosted.org/packages/9e/b7/4f34e1c5dd54a075d4d0272cea0a6877f2db8ee551a24e205865e477e007/cs.app.flag-20170906.tar.gz" } ], "20170906.1": [ { "comment_text": "", "digests": { "md5": "fbb66d4cabb95efb18d866a65b45101e", "sha256": "9bb52b67567e57dd54d7c9b5bae0a2393a5e88973fe1e405a4bb946d3d2bc70e" }, "downloads": -1, "filename": "cs.app.flag-20170906.1.tar.gz", "has_sig": false, "md5_digest": "fbb66d4cabb95efb18d866a65b45101e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4705, "upload_time": "2017-09-06T00:26:19", "url": "https://files.pythonhosted.org/packages/5c/0e/80d17db9e2378bc585752ff2f15382eb1eb335aadb93691ab96b2c802eec/cs.app.flag-20170906.1.tar.gz" } ], "20170906.2": [ { "comment_text": "", "digests": { "md5": "3be4fca7226f0bc4d933feaa8078c260", "sha256": "0278b3ad4e2a9d6575e1d0e43ad870b25de803e0d427e4e9b9a0b6b0a75e19f3" }, "downloads": -1, "filename": "cs.app.flag-20170906.2.tar.gz", "has_sig": false, "md5_digest": "3be4fca7226f0bc4d933feaa8078c260", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4704, "upload_time": "2017-09-06T00:36:56", "url": "https://files.pythonhosted.org/packages/89/70/f73201fc9004805ae5d9cf95274e46c17b98037de69c573d49efea95105b/cs.app.flag-20170906.2.tar.gz" } ], "20181109": [ { "comment_text": "", "digests": { "md5": "20994f9aa96ee71e86cd7f2ac5a1797c", "sha256": "9658f03ca9faf92e4206170642309fc25675fee6cd334559cae9966d18c6c08b" }, "downloads": -1, "filename": "cs.app.flag-20181109.tar.gz", "has_sig": false, "md5_digest": "20994f9aa96ee71e86cd7f2ac5a1797c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6491, "upload_time": "2018-11-09T02:05:08", "url": "https://files.pythonhosted.org/packages/7c/96/6225c0b560a5f9b3c77846f2df913fb6ed657c3c704705d636d8d7eb2f33/cs.app.flag-20181109.tar.gz" } ], "20190220": [ { "comment_text": "", "digests": { "md5": "668ee1ceac4eb727c54135114c01b848", "sha256": "8f10cdc968cd69665393a091af9ef516a14dea702c3f0e26841a6f429ffecc40" }, "downloads": -1, "filename": "cs.app.flag-20190220.tar.gz", "has_sig": false, "md5_digest": "668ee1ceac4eb727c54135114c01b848", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6832, "upload_time": "2019-02-20T08:51:31", "url": "https://files.pythonhosted.org/packages/ad/ed/38dc9914d28b037a6936189d2a2b8bd21296a98bd369ce7c72b65ff4f726/cs.app.flag-20190220.tar.gz" } ], "20190729": [ { "comment_text": "", "digests": { "md5": "a8042b474032543935c7cffae5f7b23f", "sha256": "29d36d4a7f26fc719bd68d32d53cc2d9c7d641fd7a87b4b542975ab7592e5f0b" }, "downloads": -1, "filename": "cs.app.flag-20190729.tar.gz", "has_sig": false, "md5_digest": "a8042b474032543935c7cffae5f7b23f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7289, "upload_time": "2019-07-28T23:37:27", "url": "https://files.pythonhosted.org/packages/14/74/48af5878b35ca2ad7888236e59ee08843f101634796e877b867d36124054/cs.app.flag-20190729.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "a8042b474032543935c7cffae5f7b23f", "sha256": "29d36d4a7f26fc719bd68d32d53cc2d9c7d641fd7a87b4b542975ab7592e5f0b" }, "downloads": -1, "filename": "cs.app.flag-20190729.tar.gz", "has_sig": false, "md5_digest": "a8042b474032543935c7cffae5f7b23f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7289, "upload_time": "2019-07-28T23:37:27", "url": "https://files.pythonhosted.org/packages/14/74/48af5878b35ca2ad7888236e59ee08843f101634796e877b867d36124054/cs.app.flag-20190729.tar.gz" } ] }