{ "info": { "author": "Brian Cappello", "author_email": "", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6" ], "description": "# Py Meta Utils\n\n## Useful Links\n\n* [Official Documentation on Read The Docs](http://py-meta-utils.readthedocs.io/)\n* [Source Code on GitHub](https://github.com/briancappello/py-meta-utils)\n* [PyPI](https://pypi.org/project/Py-Meta-Utils/)\n\n## The Meta Options Factory Pattern as a library, and related metaclass utilities\n\nOK, but just what is the Meta options factory pattern? Perhaps the easiest way to explain it is to start with an example. Let's say you wanted your end users to be able to optionally enable logging of the actions of a class from a library you're writing:\n\n```python\nclass EndUserClass(YourLoggableService):\n class Meta:\n debug: bool = True\n verbosity: int = 2\n log_destination: str = '/tmp/end-user-class.log'\n```\n\nThe first step is to define your custom [MetaOption](https://py-meta-utils.readthedocs.io/en/latest/api.html#py_meta_utils.MetaOption) subclasses:\n\n- All that's absolutely required to implement is the constructor and its `name` argument. That said, it's recommended to also specify the `default` and `inherit` arguments for the sake of being explicit.\n- The `check_value` method is optional, but useful for making sure your users aren't giving you garbage.\n- The `get_value` method has a default implementation that normally you shouldn't need to override, unless your default value is mutable or you have advanced logic.\n- There's also a `contribute_to_class` method that we'll cover later on.\n\n```python\nimport os\nimport sys\n\n# first we have to import what we need from py_meta_utils\nfrom py_meta_utils import (McsArgs, MetaOption, MetaOptionsFactory,\n process_factory_meta_options, _missing)\n\n# then we have to declare the meta options the meta options factory should support\nclass DebugMetaOption(MetaOption):\n def __init__(self):\n super().__init__(name='debug', default=False, inherit=True)\n\n def check_value(self, value, mcs_args: McsArgs):\n if not isinstance(value, bool):\n raise TypeError(f'The {self.name} Meta option must be a bool')\n\n\nclass VerbosityMetaOption(MetaOption):\n def __init__(self):\n super().__init__(name='verbosity', default=1, inherit=True)\n\n def check_value(self, value, mcs_args: McsArgs):\n if value not in {1, 2, 3}:\n raise ValueError(f'The {self.name} Meta option must either 1, 2, or 3')\n\n\nclass LogDestinationMetaOption(MetaOption):\n def __init__(self):\n super().__init__(name='log_destination', default=_missing, inherit=True)\n\n # this pattern is useful if you need a mutable default value like [] or {}\n def get_value(self, Meta, base_classes_meta, mcs_args: McsArgs):\n value = super().get_value(Meta, base_classes_meta, mcs_args)\n return value if value != _missing else 'stdout'\n\n def check_value(self, value, mcs_args: McsArgs):\n if value in {'stdout', 'stderr'}:\n return\n\n try:\n valid_dir = os.path.exists(os.path.dirname(value))\n except Exception:\n valid_dir = False\n\n if not valid_dir:\n raise ValueError(f'The {self.name} Meta option must be one of `stdout`, '\n '`stderr`, or a valid filepath')\n```\n\nThe next step is to subclass [MetaOptionsFactory](https://py-meta-utils.readthedocs.io/en/latest/api.html#py_meta_utils.MetaOptionsFactory) and specify the [MetaOption](https://py-meta-utils.readthedocs.io/en/latest/api.html#py_meta_utils.MetaOption) subclasses you want:\n\n```python\nclass LoggingMetaOptionsFactory(MetaOptionsFactory):\n _options = [\n DebugMetaOption,\n VerbosityMetaOption,\n LogDestinationMetaOption,\n ]\n```\n\nThen you need a metaclass to actually apply the factory options:\n\n```python\nclass LoggingMetaclass(type):\n def __new__(mcs, name, bases, clsdict):\n mcs_args = McsArgs(mcs, name, bases, clsdict)\n factory_cls = mcs_args.getattr('_meta_options_factory_class',\n LoggingMetaOptionsFactory)\n options_factory = factory_cls()\n options_factory._contribute_to_class(mcs_args)\n # the above three lines can be replaced by:\n # process_factory_meta_options(mcs_args, LoggingMetaOptionsFactory)\n return super().__new__(*mcs_args)\n```\n\nAnd lastly, create the public class, using the metaclass just defined:\n\n```python\nclass YourLoggableService(metaclass=LoggingMetaclass):\n def do_important_stuff(self):\n if self.Meta.verbosity < 3:\n self._log('doing important stuff')\n else:\n self._log('doing really detailed important stuff like so')\n\n def _log(self, msg):\n if not self.Meta.debug:\n return\n\n if self.Meta.log_destination == 'stdout':\n print(msg)\n elif self.Meta.log_destination == 'stderr':\n sys.stderr.write(msg)\n sys.stderr.flush()\n else:\n with open(self.Meta.log_destination, 'a') as f:\n f.write(msg)\n```\n\nThe options factory automatically adds the `Meta` attribute to the class-under-construction (in this example, `YourLoggableService`). (In this case the `Meta` attribute will be populated with the default values as supplied by the [MetaOption](https://py-meta-utils.readthedocs.io/en/latest/api.html#py_meta_utils.MetaOption) subclasses specified by the factory.) In the case where the class-under-construction has a partial `Meta` class, the missing meta options will be added to it.(*)\n\n(*) In effect that's what happens, and for all practical purposes is probably how you should think about it, but technically speaking, the class-under-construction's `Meta` attribute actually gets replaced with a populated instance of the specified [MetaOptionsFactory](https://py-meta-utils.readthedocs.io/en/latest/api.html#py_meta_utils.MetaOptionsFactory) subclass.\n\nThe one thing we didn't cover is `MetaOption.contribute_to_class`. This is an optional callback hook that allows `MetaOption` subclasses to, well, contribute something to the class-under-construction. Most likely it adds/removes attributes to/from the class, or perhaps it wraps some method(s) with a decorator or something else entirely. \n\nA good simple example can be found in the source code for the included [AbstractMetaOption](https://py-meta-utils.readthedocs.io/en/latest/api.html#py_meta_utils.AbstractMetaOption):\n\n```python\nABSTRACT_ATTR = '__abstract__'\n\n\nclass AbstractMetaOption(MetaOption):\n def __init__(self):\n super().__init__(name='abstract', default=False, inherit=False)\n\n def get_value(self, Meta, base_classes_meta, mcs_args: McsArgs):\n # class attributes take precedence over the class Meta's value\n if mcs_args.clsdict.get(ABSTRACT_ATTR, False) is True:\n return True\n return super().get_value(Meta, base_classes_meta, mcs_args) is True\n\n def contribute_to_class(self, mcs_args: McsArgs, value):\n if value is True:\n mcs_args.clsdict[ABSTRACT_ATTR] = True\n else:\n mcs_args.clsdict[ABSTRACT_ATTR] = False\n```\n\nA number of libraries use the `__abstract__` class attribute to determine whether or not the class-under-construction should be considered concrete or not, but they won't understand class `Meta` options. Therefore, we implement `MetaOption.contribute_to_class` to set the `__abstract__` class attribute to the appropriate value for backwards compatibility with such libraries.\n\n## Included Metaclass Utilities\n\n### Singleton\n\n[Singleton](http://localhost:8000/api.html#singleton) is an included metaclass that makes any class utilizing it a singleton:\n\n```python\nfrom py_meta_utils import Singleton\n\n\nclass YourSingleton(metaclass=Singleton):\n pass\n\n\ninstance = YourSingleton()\nassert instance == YourSingleton()\n```\n\nClasses using [Singleton](http://localhost:8000/api.html#singleton) can be subclassed, however, you must inform the base class of your subclass:\n\n```python\nfrom py_meta_utils import Singleton\n\nclass BaseSingleton(metaclass=Singleton):\n pass\n\nclass Extended(BaseSingleton):\n pass\n\nBaseSingleton.set_singleton_class(Extended)\nbase_instance = BaseSingleton()\nextended_instance = Extended()\nassert base_instance == extended_instance == BaseSingleton() == Extended()\n```\n\n### deep_getattr\n\n```python\ndeep_getattr(clsdict, bases, 'attr_name', [default])\n```\n\n`deep_getattr` acts just like `getattr` would on a constructed class object, except this operates on the pre-class-construction class dictionary and base classes. In other words, first we look for the attribute in the class dictionary, and then we search all the base classes (in method resolution order), finally returning the default value if the attribute was not found in any of the class dictionary or base classes (or it raises `AttributeError` if `default` not given).\n\n\n### OptionalMetaclass and OptionalClass\n\n```python\ntry:\n from optional_dependency import SomeClass\nexcept ImportError:\n from py_meta_utils import OptionalClass as SomeClass\n\n\nclass Optional(SomeClass):\n pass\n```\n\n## License\n\nMIT\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/briancappello/py-meta-utils", "keywords": "", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "Py-Meta-Utils", "package_url": "https://pypi.org/project/Py-Meta-Utils/", "platform": "", "project_url": "https://pypi.org/project/Py-Meta-Utils/", "project_urls": { "Homepage": "https://github.com/briancappello/py-meta-utils" }, "release_url": "https://pypi.org/project/Py-Meta-Utils/0.7.6/", "requires_dist": [ "m2r; extra == 'docs'", "sphinx; extra == 'docs'", "sphinx-autobuild; extra == 'docs'", "sphinx-rtd-theme; extra == 'docs'" ], "requires_python": ">=3.5", "summary": "Metaclass utilities for Python", "version": "0.7.6" }, "last_serial": 5130163, "releases": { "0.0.1": [ { "comment_text": "", "digests": { "md5": "4f374114b41af718f9db67e550f83f44", "sha256": "ac8ded8654d9b7a66a61ecd8cb9212b1f137081db4f6f930a33e3b7ca5f4d348" }, "downloads": -1, "filename": "Py_Meta_Utils-0.0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "4f374114b41af718f9db67e550f83f44", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 3090, "upload_time": "2018-09-24T20:59:01", "url": "https://files.pythonhosted.org/packages/fd/33/4529e3278d26bc271bfa2e1bf8b68f86b71ffe28121900109d6421f62c91/Py_Meta_Utils-0.0.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "41e36cf8bae43dbb42d9911dfe30cf6e", "sha256": "954d955d15db8e588a8b7c5cdb1a1289d5ee291ea0b5bf4cbd43e211c4a555e3" }, "downloads": -1, "filename": "Py Meta Utils-0.0.1.tar.gz", "has_sig": false, "md5_digest": "41e36cf8bae43dbb42d9911dfe30cf6e", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 3993, "upload_time": "2018-09-24T20:59:03", "url": "https://files.pythonhosted.org/packages/9c/fd/76fe99680360475dccac7f29be44477413cc3213462f3fd8165d1c0e952e/Py%20Meta%20Utils-0.0.1.tar.gz" } ], "0.1.0": [ { "comment_text": "", "digests": { "md5": "edc0ca5c5e677b30483cb32eb45b8173", "sha256": "3853803e3d73c7e7bbc0deea3a66abf98281b6366ea3d38ccb4c6c0cc8710aca" }, "downloads": -1, "filename": "Py_Meta_Utils-0.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "edc0ca5c5e677b30483cb32eb45b8173", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 3135, "upload_time": "2018-09-25T00:04:18", "url": "https://files.pythonhosted.org/packages/51/e3/3339bcb37bba63bba5d7c55e9a4c02b18f909fb811952c058db02dcdbbbe/Py_Meta_Utils-0.1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "39ec26cbff9c985dc93d115b45d28283", "sha256": "fadd4ced4e0a4ae830b471ad68e6e9cbd1505e73610559c2914683b8609f4796" }, "downloads": -1, "filename": "Py Meta Utils-0.1.0.tar.gz", "has_sig": false, "md5_digest": "39ec26cbff9c985dc93d115b45d28283", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 4142, "upload_time": "2018-09-25T00:04:19", "url": "https://files.pythonhosted.org/packages/3a/f5/387dc2abb58c0882da853185b2c969f7cb5d21b070b0bccdf70211e0231f/Py%20Meta%20Utils-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "b14e96555dcd1458865758021006d73c", "sha256": "cce7d7bc791952096902ee423ff1a42fa1347da6319beac0d2255802183a9870" }, "downloads": -1, "filename": "Py_Meta_Utils-0.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "b14e96555dcd1458865758021006d73c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 3472, "upload_time": "2018-09-27T02:05:28", "url": "https://files.pythonhosted.org/packages/67/7f/54f86318436a570f398b3553e4706722ab4b63074cce09dbdc4893378c40/Py_Meta_Utils-0.1.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "139907aa6046c747723dbf5c3d6f1546", "sha256": "995f9853f2702b9598201c6f970494894d86148049ebe2fc80e0b85e6522e7b3" }, "downloads": -1, "filename": "Py Meta Utils-0.1.1.tar.gz", "has_sig": false, "md5_digest": "139907aa6046c747723dbf5c3d6f1546", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 4502, "upload_time": "2018-09-27T02:05:29", "url": "https://files.pythonhosted.org/packages/f2/1c/fcc75c71042421b3699869fd0f449211ccd5e75792cfd932002f11de2aec/Py%20Meta%20Utils-0.1.1.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "c93a8588daec28ca52e67186284a9798", "sha256": "0b13341b67040e6a0b0aac905f2fd17801b55fff3eb9110bb5d5c605e1e6fb49" }, "downloads": -1, "filename": "Py_Meta_Utils-0.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "c93a8588daec28ca52e67186284a9798", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 3468, "upload_time": "2018-09-28T22:45:47", "url": "https://files.pythonhosted.org/packages/18/6f/fda0bdd9b3d97c039d65943ff9fec6af75555f7d62b9ed93c82cbf17c18f/Py_Meta_Utils-0.2.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "87694116c7ebc23a50f7a1157453980a", "sha256": "1c3d7fd75e72d0d682810ac5455ba47d706447663686d0f9b19518ce4e0dca1f" }, "downloads": -1, "filename": "Py Meta Utils-0.2.0.tar.gz", "has_sig": false, "md5_digest": "87694116c7ebc23a50f7a1157453980a", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 4545, "upload_time": "2018-09-28T22:45:49", "url": "https://files.pythonhosted.org/packages/33/09/5e44ea9ab30e98fc57ae5bbd36d5e02eba62260bc020996574269a368dd9/Py%20Meta%20Utils-0.2.0.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "2d3a97ca1b383ffa2d84891d9cce667d", "sha256": "97be20251a6a0981b48bf823c7e8c6690d665c9c74a32d8bdb9974d819fb9dcc" }, "downloads": -1, "filename": "Py_Meta_Utils-0.3.0-py3-none-any.whl", "has_sig": false, "md5_digest": "2d3a97ca1b383ffa2d84891d9cce667d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 3601, "upload_time": "2018-10-01T01:13:02", "url": "https://files.pythonhosted.org/packages/af/58/48337afe0e13faee1e47a2707c181537b996fdde5a395b9c56354fa667d8/Py_Meta_Utils-0.3.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7bf94ba166333386c969d1414ed80cf4", "sha256": "18d1692b91978ba4b1a3da32b79ef0eebb3b1667af27703c9e162f3a37ca597f" }, "downloads": -1, "filename": "Py Meta Utils-0.3.0.tar.gz", "has_sig": false, "md5_digest": "7bf94ba166333386c969d1414ed80cf4", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 4805, "upload_time": "2018-10-01T01:13:03", "url": "https://files.pythonhosted.org/packages/f7/31/ed91cf16122d13cb091bfafbe8d3c5ce986ba6c25f308572923b077fbbda/Py%20Meta%20Utils-0.3.0.tar.gz" } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "7856b31eac4d1ca108081d71fecb9052", "sha256": "c9917e1825f41b2f88fa1084942fd92052ab53df0f980bef6a9c2e2e3fcc8f3f" }, "downloads": -1, "filename": "Py_Meta_Utils-0.4.0-py3-none-any.whl", "has_sig": false, "md5_digest": "7856b31eac4d1ca108081d71fecb9052", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 8006, "upload_time": "2018-10-13T19:03:58", "url": "https://files.pythonhosted.org/packages/f2/ce/fc04efb7b043c182889d952d5097543e80891ace60b92ea3eab9d7b2de1d/Py_Meta_Utils-0.4.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "28b4c9201bf969fb7cd3e33240488d10", "sha256": "413ec533c19b77f5c48288b902567907528a4ebc270df15e09f3e7461f9ae084" }, "downloads": -1, "filename": "Py Meta Utils-0.4.0.tar.gz", "has_sig": false, "md5_digest": "28b4c9201bf969fb7cd3e33240488d10", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 9344, "upload_time": "2018-10-13T19:04:00", "url": "https://files.pythonhosted.org/packages/cf/ea/1888bc5b8d1ed291c649c2502a7f085fe844b7f373fab921bfce462a2bd1/Py%20Meta%20Utils-0.4.0.tar.gz" } ], "0.4.1": [ { "comment_text": "", "digests": { "md5": "88d4a394563d2be1e2f286af3a6b02c3", "sha256": "92ad62226c231b69a1a79f740e3bd53cee7f9f32cde619480b3615934a73acad" }, "downloads": -1, "filename": "Py_Meta_Utils-0.4.1-py3-none-any.whl", "has_sig": false, "md5_digest": "88d4a394563d2be1e2f286af3a6b02c3", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 8804, "upload_time": "2018-10-13T19:19:45", "url": "https://files.pythonhosted.org/packages/82/7e/140261a24a09b8a3ee4ff887a519952a0c14f12892a3a6e3d06ab0970f34/Py_Meta_Utils-0.4.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "11188efa17a68675a9a4003f14e01432", "sha256": "89c6c77eb647b09aba16ac7013a9461e6d5769249a7094e8451d29ee23331e60" }, "downloads": -1, "filename": "Py Meta Utils-0.4.1.tar.gz", "has_sig": false, "md5_digest": "11188efa17a68675a9a4003f14e01432", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 9360, "upload_time": "2018-10-13T19:19:47", "url": "https://files.pythonhosted.org/packages/c3/fd/e12af5c797ae3cef8521fd7c0fd3be32914d18a1bac3891751266d8637bc/Py%20Meta%20Utils-0.4.1.tar.gz" } ], "0.5.0": [ { "comment_text": "", "digests": { "md5": "2095675375a07c179277617e7e7f0d5d", "sha256": "51a828796d34612dc339f370d459e0349ba3cb53f7757b53e8aa22dcb3cf1b85" }, "downloads": -1, "filename": "Py_Meta_Utils-0.5.0-py3-none-any.whl", "has_sig": false, "md5_digest": "2095675375a07c179277617e7e7f0d5d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 9540, "upload_time": "2018-10-14T16:32:35", "url": "https://files.pythonhosted.org/packages/69/df/a7b3101a5ba001d76e9401043caa49ec91a58cc34f1bc582791cba26f7cf/Py_Meta_Utils-0.5.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6d3eb46654bf64f336df22361c47a675", "sha256": "9e8d621869144c9767f22020d055cb2803d5624bd0dc3e1a44376023f90d5a12" }, "downloads": -1, "filename": "Py Meta Utils-0.5.0.tar.gz", "has_sig": false, "md5_digest": "6d3eb46654bf64f336df22361c47a675", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 10181, "upload_time": "2018-10-14T16:32:37", "url": "https://files.pythonhosted.org/packages/a9/70/a5d4d77aca9e1b9a0515512da942cedfa0556b69b9d8d1f27028b1e36600/Py%20Meta%20Utils-0.5.0.tar.gz" } ], "0.5.1": [ { "comment_text": "", "digests": { "md5": "7ec58203f94dab76cc4625f34c74793a", "sha256": "dbed7fcb0874d667ada5109e035d1a66ff1fd714b9e1c1cbdebf87ad3eeb391e" }, "downloads": -1, "filename": "Py_Meta_Utils-0.5.1-py3-none-any.whl", "has_sig": false, "md5_digest": "7ec58203f94dab76cc4625f34c74793a", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 9563, "upload_time": "2018-10-14T16:35:31", "url": "https://files.pythonhosted.org/packages/9a/cc/8dcfff3a2e7f2feb63c560d2c0fe16de189d20013ecc7e0397f9ff4ddb74/Py_Meta_Utils-0.5.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b8eb24d6d68ac745f383a64cf4605687", "sha256": "c2ad1d8e005de6976884dccd227a5f98b05779363c57bea93aa5a5d1aa3dd865" }, "downloads": -1, "filename": "Py Meta Utils-0.5.1.tar.gz", "has_sig": false, "md5_digest": "b8eb24d6d68ac745f383a64cf4605687", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 10243, "upload_time": "2018-10-14T16:35:32", "url": "https://files.pythonhosted.org/packages/0f/b7/8e94fc4dc2a7338a247e6089ccbbf557c38f327fc7652f59f5b657147818/Py%20Meta%20Utils-0.5.1.tar.gz" } ], "0.6.0": [ { "comment_text": "", "digests": { "md5": "4662ddfa3ff06bfd6f73e03807973b45", "sha256": "7b6e0d609d2c60aedb523b7b81d1b3991e38fe318f4537880b6482bee504d7fa" }, "downloads": -1, "filename": "Py_Meta_Utils-0.6.0-py3-none-any.whl", "has_sig": false, "md5_digest": "4662ddfa3ff06bfd6f73e03807973b45", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 9670, "upload_time": "2018-10-16T20:45:31", "url": "https://files.pythonhosted.org/packages/9e/3d/e84a5749df2025a64277553c1551c3ac001573116beba515f694cad5c436/Py_Meta_Utils-0.6.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1d2afbffa36b559edc6bd137e7cbf97e", "sha256": "cf23bc537922c492d2689d376ee28b500bfb074fdfc52db473a6e0775d90c0e5" }, "downloads": -1, "filename": "Py Meta Utils-0.6.0.tar.gz", "has_sig": false, "md5_digest": "1d2afbffa36b559edc6bd137e7cbf97e", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 10485, "upload_time": "2018-10-16T20:45:33", "url": "https://files.pythonhosted.org/packages/04/83/a801b9a6f6e7d5aecc997c44dd75ac37cb81dd56d41b4b57f7414832c73d/Py%20Meta%20Utils-0.6.0.tar.gz" } ], "0.6.1": [ { "comment_text": "", "digests": { "md5": "397f720b9a99e0975a8242fc61a5d405", "sha256": "05c7f7978cc218dfd5db33feadf54bd4d3d7bb0dda17934cc73326a9671c825a" }, "downloads": -1, "filename": "Py_Meta_Utils-0.6.1-py3-none-any.whl", "has_sig": false, "md5_digest": "397f720b9a99e0975a8242fc61a5d405", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 9701, "upload_time": "2018-10-16T21:44:01", "url": "https://files.pythonhosted.org/packages/64/bc/c159db8bd5c829d8a737eddff81b533eb28ffe1418f2c6aeecc11a56b078/Py_Meta_Utils-0.6.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9046c71832398faea14dae7d075d34d2", "sha256": "bf5706ba0795feb13cecde25f81bcf91d89567f66ea4ba39f879ee03a603d95e" }, "downloads": -1, "filename": "Py Meta Utils-0.6.1.tar.gz", "has_sig": false, "md5_digest": "9046c71832398faea14dae7d075d34d2", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 10528, "upload_time": "2018-10-16T21:44:03", "url": "https://files.pythonhosted.org/packages/09/ae/811a486670ce94538012a6fa1b5cafebdf1cc110963a08f44dd4e9c9662b/Py%20Meta%20Utils-0.6.1.tar.gz" } ], "0.6.2": [ { "comment_text": "", "digests": { "md5": "8966cdc422e9178221e2d7337a55cb73", "sha256": "dc2c308168a0381eb77e651eff8357db7f83784a5971feb3a35853b3b15b9cf5" }, "downloads": -1, "filename": "Py_Meta_Utils-0.6.2-py3-none-any.whl", "has_sig": false, "md5_digest": "8966cdc422e9178221e2d7337a55cb73", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 8916, "upload_time": "2018-10-21T21:05:22", "url": "https://files.pythonhosted.org/packages/7f/7a/cb1f19aaf19e34f711b70993b6bec5905aad18ac0ea2d953462ee63091b4/Py_Meta_Utils-0.6.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a79f1aa6e4e125d701fad274960ac5ed", "sha256": "c9df15b10f0897340939a8c4d07b582362358a06f704d05bb9eac939d25ab6fe" }, "downloads": -1, "filename": "Py Meta Utils-0.6.2.tar.gz", "has_sig": false, "md5_digest": "a79f1aa6e4e125d701fad274960ac5ed", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 10587, "upload_time": "2018-10-21T21:05:48", "url": "https://files.pythonhosted.org/packages/67/8b/14e4ed3f67543c3344663df3184ee3aec4ba83b2bfdb7fa002edecf702fb/Py%20Meta%20Utils-0.6.2.tar.gz" } ], "0.7.0": [ { "comment_text": "", "digests": { "md5": "879553e7b1efe692cda23ef439283bf3", "sha256": "8a343206ab26d983d08a1d1ff0fdb435611b31282d0177016c93270fe82e9f95" }, "downloads": -1, "filename": "Py_Meta_Utils-0.7.0-py3-none-any.whl", "has_sig": false, "md5_digest": "879553e7b1efe692cda23ef439283bf3", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 9719, "upload_time": "2018-10-23T08:36:01", "url": "https://files.pythonhosted.org/packages/37/c0/3e6d4af165c741e994df1ab7a56ce260a8a916a07679bee48f27453dbf72/Py_Meta_Utils-0.7.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b2c01f61b4d2cda22c7c3825b78d11b7", "sha256": "264001388e2ce05253acc4369f5dd67656a9b4a8441dde83d0f13019fca7a21f" }, "downloads": -1, "filename": "Py Meta Utils-0.7.0.tar.gz", "has_sig": false, "md5_digest": "b2c01f61b4d2cda22c7c3825b78d11b7", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 10655, "upload_time": "2018-10-23T08:36:02", "url": "https://files.pythonhosted.org/packages/c1/2d/03859f64a06e09d0e85bf6805dadeeea741d4e11d6c52107139204198d34/Py%20Meta%20Utils-0.7.0.tar.gz" } ], "0.7.1": [ { "comment_text": "", "digests": { "md5": "ea31f7d9f4b3b21e67bdadcb2a44c8ce", "sha256": "d0ec2cc725c625a848e5adf1705fcbc276aca0d1c8aecb67933c7d418435b8f1" }, "downloads": -1, "filename": "Py_Meta_Utils-0.7.1-py3-none-any.whl", "has_sig": false, "md5_digest": "ea31f7d9f4b3b21e67bdadcb2a44c8ce", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 9719, "upload_time": "2018-10-23T17:11:37", "url": "https://files.pythonhosted.org/packages/59/39/80b5c5252f5ef42e5a8f8f59f6a2f19af0062416dd5b316b847e2aed8b06/Py_Meta_Utils-0.7.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "81216f9161d4e9bbdbf896bb8fc8cff1", "sha256": "17198b22daf5aa866b2086c5419c5c190cea9527340b09972670f71cdce52fe4" }, "downloads": -1, "filename": "Py Meta Utils-0.7.1.tar.gz", "has_sig": false, "md5_digest": "81216f9161d4e9bbdbf896bb8fc8cff1", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 10671, "upload_time": "2018-10-23T17:11:38", "url": "https://files.pythonhosted.org/packages/79/de/b461f3ff841523441442d94c72dc1a3558c8dc9e76cea8b8dc50e1b6a651/Py%20Meta%20Utils-0.7.1.tar.gz" } ], "0.7.2": [ { "comment_text": "", "digests": { "md5": "1d56a9c7779a63dad40b2d49a8c2db94", "sha256": "1cc6557a3f3b7f12726e9e404903079703fd83eedebaf8ae757e69e452974cf5" }, "downloads": -1, "filename": "Py_Meta_Utils-0.7.2-py3-none-any.whl", "has_sig": false, "md5_digest": "1d56a9c7779a63dad40b2d49a8c2db94", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 9845, "upload_time": "2018-10-28T06:55:28", "url": "https://files.pythonhosted.org/packages/e9/99/bcb5a03aa6b3493aad51438c6f7c94f57b0312699e5dcc94b6a70bff6ede/Py_Meta_Utils-0.7.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "76947508d861cfa7df4ce48a4e456940", "sha256": "3de25f0fa9ece2fc329aa584576c5c38e09c0c847535605cfa63201f72c31d81" }, "downloads": -1, "filename": "Py Meta Utils-0.7.2.tar.gz", "has_sig": false, "md5_digest": "76947508d861cfa7df4ce48a4e456940", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 10839, "upload_time": "2018-10-28T06:55:30", "url": "https://files.pythonhosted.org/packages/13/ac/152605896138f972befb4ce82da63984e5acd445d66670f361d8d37ad71d/Py%20Meta%20Utils-0.7.2.tar.gz" } ], "0.7.3": [ { "comment_text": "", "digests": { "md5": "4cada0bd2f4a42bbe6b5fee722f45e69", "sha256": "d09bf875071b633bb71b5ed66bdd79903294136277bd29ba1c6df35bd7d69d5d" }, "downloads": -1, "filename": "Py_Meta_Utils-0.7.3-py3-none-any.whl", "has_sig": false, "md5_digest": "4cada0bd2f4a42bbe6b5fee722f45e69", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 9081, "upload_time": "2018-10-28T19:08:55", "url": "https://files.pythonhosted.org/packages/19/b8/076bd593f35dfa669a685326c359bda6b41be84518ec8b20563d6dc16806/Py_Meta_Utils-0.7.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e978f4ae3715b563e6e717a33ccd681f", "sha256": "231c56706b4c460f7155596fa593edf0c308eaf0d730741515913ab6c27a9877" }, "downloads": -1, "filename": "Py Meta Utils-0.7.3.tar.gz", "has_sig": false, "md5_digest": "e978f4ae3715b563e6e717a33ccd681f", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 10927, "upload_time": "2018-10-28T19:08:56", "url": "https://files.pythonhosted.org/packages/3d/56/95e990a5cda823df8ddfe3cbdfb3e2eb7a320e92b5004745733f0e7e1368/Py%20Meta%20Utils-0.7.3.tar.gz" } ], "0.7.4": [ { "comment_text": "", "digests": { "md5": "37bd0e133d5492a824048305892a30c0", "sha256": "4c294ae93837774458e7b21b4fbeb9b50db48a3ad68d956b85ddf7c84a2c063f" }, "downloads": -1, "filename": "Py_Meta_Utils-0.7.4-py3-none-any.whl", "has_sig": false, "md5_digest": "37bd0e133d5492a824048305892a30c0", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 9946, "upload_time": "2018-12-29T07:04:34", "url": "https://files.pythonhosted.org/packages/f2/b8/ac980e5e2a67776d3a81e0facebaa7a4259ffdaf29f64ec63b26d385f72c/Py_Meta_Utils-0.7.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5b358b1a188fdd6b531a244b47ec2fdb", "sha256": "b0d5e4d6ce58cd79d0944fbabb3f10bdb081ac7dbdc67790ae8b22505531353a" }, "downloads": -1, "filename": "Py Meta Utils-0.7.4.tar.gz", "has_sig": false, "md5_digest": "5b358b1a188fdd6b531a244b47ec2fdb", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 11037, "upload_time": "2018-12-29T07:04:35", "url": "https://files.pythonhosted.org/packages/13/9a/0003b0758880fa073d8acb369b50f027d6edf4abd25d2958a0aa4c47eed4/Py%20Meta%20Utils-0.7.4.tar.gz" } ], "0.7.5": [ { "comment_text": "", "digests": { "md5": "af4d0aa932ec53a5742201b8f86dbf13", "sha256": "603e99e69ba1c9fc4b22a4713e79647506935a5ef00bbfa15c14399039119230" }, "downloads": -1, "filename": "Py_Meta_Utils-0.7.5-py3-none-any.whl", "has_sig": false, "md5_digest": "af4d0aa932ec53a5742201b8f86dbf13", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 9135, "upload_time": "2019-02-26T05:24:05", "url": "https://files.pythonhosted.org/packages/49/84/34d95aea6e967d6854960c838582165d56bf5c52f56f87e3b9188c8f1215/Py_Meta_Utils-0.7.5-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ff2356074db9df20eed2d2af50b13c2b", "sha256": "d0585f9f384cad11fed175038a9aa35c757da81c22bd16e95a8845371885acc6" }, "downloads": -1, "filename": "Py-Meta-Utils-0.7.5.tar.gz", "has_sig": false, "md5_digest": "ff2356074db9df20eed2d2af50b13c2b", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 11039, "upload_time": "2019-02-26T05:24:06", "url": "https://files.pythonhosted.org/packages/35/f6/1d67dc3ee78f14946a399a67d088cd02880fc3afc40a92af2b90db373775/Py-Meta-Utils-0.7.5.tar.gz" } ], "0.7.6": [ { "comment_text": "", "digests": { "md5": "d3809644a5181bfdda06f0e8eee86d62", "sha256": "d29115e37cf914697458b23ebe2261e77050fce3ec699fa8d8a60c86515cdb4f" }, "downloads": -1, "filename": "Py_Meta_Utils-0.7.6-py3-none-any.whl", "has_sig": false, "md5_digest": "d3809644a5181bfdda06f0e8eee86d62", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 9152, "upload_time": "2019-04-11T17:49:48", "url": "https://files.pythonhosted.org/packages/c1/d4/987c04f0bc9754df371f5465413be07cf9bfbdfeab9d2f438cd050720515/Py_Meta_Utils-0.7.6-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "56dde7ef0c9e9f3792cb132ef3660dbf", "sha256": "31302fd65510adbce3388a0d751f163a20a0e684f93390bbda10219d97f54231" }, "downloads": -1, "filename": "Py-Meta-Utils-0.7.6.tar.gz", "has_sig": false, "md5_digest": "56dde7ef0c9e9f3792cb132ef3660dbf", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 11091, "upload_time": "2019-04-11T17:49:50", "url": "https://files.pythonhosted.org/packages/cf/3f/03e98bf099e85cdb36bebb79ac3d663ded2fab1f595d2a1a70bc06e81424/Py-Meta-Utils-0.7.6.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "d3809644a5181bfdda06f0e8eee86d62", "sha256": "d29115e37cf914697458b23ebe2261e77050fce3ec699fa8d8a60c86515cdb4f" }, "downloads": -1, "filename": "Py_Meta_Utils-0.7.6-py3-none-any.whl", "has_sig": false, "md5_digest": "d3809644a5181bfdda06f0e8eee86d62", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 9152, "upload_time": "2019-04-11T17:49:48", "url": "https://files.pythonhosted.org/packages/c1/d4/987c04f0bc9754df371f5465413be07cf9bfbdfeab9d2f438cd050720515/Py_Meta_Utils-0.7.6-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "56dde7ef0c9e9f3792cb132ef3660dbf", "sha256": "31302fd65510adbce3388a0d751f163a20a0e684f93390bbda10219d97f54231" }, "downloads": -1, "filename": "Py-Meta-Utils-0.7.6.tar.gz", "has_sig": false, "md5_digest": "56dde7ef0c9e9f3792cb132ef3660dbf", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 11091, "upload_time": "2019-04-11T17:49:50", "url": "https://files.pythonhosted.org/packages/cf/3f/03e98bf099e85cdb36bebb79ac3d663ded2fab1f595d2a1a70bc06e81424/Py-Meta-Utils-0.7.6.tar.gz" } ] }