{ "info": { "author": "Brian Schiller", "author_email": "bgschiller@gmail.com", "bugtrack_url": null, "classifiers": [ "License :: OSI Approved :: MIT License", "Programming Language :: Python", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy" ], "description": "\nsuperdelegate\n=============\n\n**Delegate methods and properties to child objects in a terse, explicit style**\n\nConsider the motivating example of a sorted list. In order to encapsulate the list and prevent clients from breaking the sorted order, we want to only allow certain methods through to the underlying list:\n\n```python\nimport bisect\n\nclass SortedList:\n def __init__(self, *args, **kwargs):\n self._lst = list(*args, **kwargs)\n\n def insert(self, elem):\n bisect.insort(self._lst, elem)\n\n def __contains__(self, elem):\n ix = bisect.bisect(self._lst, elem)\n return ix != len(self._lst) and self._lst[ix] == elem\n\n def __getitem__(self, key):\n return self._lst.__getitem__(key)\n\n def __reversed__(self):\n return self._lst.__reversed__()\n\n def __len__(self):\n return self._lst.__len__()\n\n def __iter__(self):\n return self._lst.__iter__()\n```\n\nMuch of that code is pretty repetitive. Can we do better? Yes! with superdelegate!\n\n```python\nimport bisect\nfrom superdelegate import SuperDelegate, delegate_to\n\nclass SortedList(SuperDelegate):\n def __init__(self, *args, **kwargs):\n self._lst = list(*args, **kwargs)\n\n def insert(self, elem):\n bisect.insort(self._lst, elem)\n\n def __contains__(self, elem):\n ix = bisect.bisect(self._lst, elem)\n return ix != len(self._lst) and self._lst[ix] == elem\n\n __getitem__ = __reversed__ = __len__ = __iter__ = delegate_to('_lst')\n```\n\n### FAQs\n\n**Does it work for properties?** It _does_ work for properties!\n\n```python\nclass OnlyGrowsOlder:\n def __init__(self):\n self._age\n\n @property\n def age(self):\n return self._age\n @age.setter\n def age(self, new_age):\n if new_age > self._age:\n self._age = new_age\n else:\n raise ValueError('Time is like a boy band. It only flows in one direction')\n\nclass OlderWrapper(SuperDelegate):\n def __init__(self):\n self._ager\n\n age = delegate_to('_ager')\n```\n\n**Can you have multiple delgatees?** You can!\n\n```python\n class SandwichMaker:\n def choose_cheese(self):\n return 'swiss'\n class NavyEngineer:\n def lift_periscope(self):\n return 'done'\n class SubmarineTechnician(SuperDelegate):\n def __init__(self):\n self.sm = SandwichMaker()\n self.ne = NavyEngineer()\n\n choose_cheese = delegate_to('sm')\n lift_periscope = delegate_to('ne')\n```\n\n### Inspiration\n\nThis library was inspired by Ruby ActiveSupport's `Module#delegate` extension.\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/bgschiller/superdelegate", "keywords": "", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "superdelegate", "package_url": "https://pypi.org/project/superdelegate/", "platform": "", "project_url": "https://pypi.org/project/superdelegate/", "project_urls": { "Homepage": "https://github.com/bgschiller/superdelegate" }, "release_url": "https://pypi.org/project/superdelegate/0.0.2/", "requires_dist": null, "requires_python": ">=3.2.6", "summary": "Delegate methods and properties to child objects in a terse, explicit style", "version": "0.0.2" }, "last_serial": 5218043, "releases": { "0.0.1": [ { "comment_text": "", "digests": { "md5": "65c0b1321b0f27e972e0ce3b4a41831a", "sha256": "24c1f034e04b93befc62e339b503640067b6f662db3979c401dd510d0b5a7ab9" }, "downloads": -1, "filename": "superdelegate-0.0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "65c0b1321b0f27e972e0ce3b4a41831a", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.2.6", "size": 2928, "upload_time": "2019-05-02T15:16:14", "url": "https://files.pythonhosted.org/packages/45/7f/3c908b2e9659694ef1a4125f43472921c62e05d9fcd848f011a96f971814/superdelegate-0.0.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f0ec81dab84c1601ee1c9a3f8c0cb9a5", "sha256": "74e8a4b884c87e323f359dbf7b3a7458899c47cf72b6f1fe447dbfbe4532f2c7" }, "downloads": -1, "filename": "superdelegate-0.0.1.tar.gz", "has_sig": false, "md5_digest": "f0ec81dab84c1601ee1c9a3f8c0cb9a5", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.2.6", "size": 3307, "upload_time": "2019-05-02T15:16:16", "url": "https://files.pythonhosted.org/packages/11/8e/73c1c3b20d2130f8cdac6def199498fc386a46480767e87549ab07c7e2ce/superdelegate-0.0.1.tar.gz" } ], "0.0.2": [ { "comment_text": "", "digests": { "md5": "c771b73d69bd10fdc9966266f9d46dea", "sha256": "b4f146d936b78699670b3ee74196928500877fb0714aed7d6146471d01662d5d" }, "downloads": -1, "filename": "superdelegate-0.0.2-py3-none-any.whl", "has_sig": false, "md5_digest": "c771b73d69bd10fdc9966266f9d46dea", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.2.6", "size": 4866, "upload_time": "2019-05-02T15:38:44", "url": "https://files.pythonhosted.org/packages/5e/72/a4917ffde969ee47f7bdddb4090a1698b0dd74bc44b975d00533d567fdd2/superdelegate-0.0.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "96c5f65e4d83cfc1ee3dcea37cb0c7c3", "sha256": "32d80b8b08913195e6961552edfe2c93f7accaa3d8aaab1e95989866f2360dce" }, "downloads": -1, "filename": "superdelegate-0.0.2.tar.gz", "has_sig": false, "md5_digest": "96c5f65e4d83cfc1ee3dcea37cb0c7c3", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.2.6", "size": 4384, "upload_time": "2019-05-02T15:38:46", "url": "https://files.pythonhosted.org/packages/2f/54/ea09047fe57f2b9c0f1cec1aac063b93ab5086e03858745cccc328fd93e0/superdelegate-0.0.2.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "c771b73d69bd10fdc9966266f9d46dea", "sha256": "b4f146d936b78699670b3ee74196928500877fb0714aed7d6146471d01662d5d" }, "downloads": -1, "filename": "superdelegate-0.0.2-py3-none-any.whl", "has_sig": false, "md5_digest": "c771b73d69bd10fdc9966266f9d46dea", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.2.6", "size": 4866, "upload_time": "2019-05-02T15:38:44", "url": "https://files.pythonhosted.org/packages/5e/72/a4917ffde969ee47f7bdddb4090a1698b0dd74bc44b975d00533d567fdd2/superdelegate-0.0.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "96c5f65e4d83cfc1ee3dcea37cb0c7c3", "sha256": "32d80b8b08913195e6961552edfe2c93f7accaa3d8aaab1e95989866f2360dce" }, "downloads": -1, "filename": "superdelegate-0.0.2.tar.gz", "has_sig": false, "md5_digest": "96c5f65e4d83cfc1ee3dcea37cb0c7c3", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.2.6", "size": 4384, "upload_time": "2019-05-02T15:38:46", "url": "https://files.pythonhosted.org/packages/2f/54/ea09047fe57f2b9c0f1cec1aac063b93ab5086e03858745cccc328fd93e0/superdelegate-0.0.2.tar.gz" } ] }