{ "info": { "author": "Azat Ibrakov", "author_email": "azatibrakov@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: MacOS :: MacOS X", "Operating System :: Microsoft :: Windows", "Operating System :: POSIX", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy" ], "description": "memoir\n======\n\n[![](https://travis-ci.org/lycantropos/memoir.svg?branch=master)](https://travis-ci.org/lycantropos/memoir \"Travis CI\")\n[![](https://ci.appveyor.com/api/projects/status/github/lycantropos/memoir?branch=master&svg=true)](https://ci.appveyor.com/project/lycantropos/memoir \"AppVeyor\")\n[![](https://codecov.io/gh/lycantropos/memoir/branch/master/graph/badge.svg)](https://codecov.io/gh/lycantropos/memoir \"Codecov\")\n[![](https://img.shields.io/github/license/lycantropos/memoir.svg)](https://github.com/lycantropos/memoir/blob/master/LICENSE \"License\")\n[![](https://badge.fury.io/py/memoir.svg)](https://badge.fury.io/py/memoir \"PyPI\")\n\nIn what follows\n- `python` is an alias for `python3.5` or any later\nversion (`python3.6` and so on),\n- `pypy` is an alias for `pypy3.5` or any later\nversion (`pypy3.6` and so on).\n\nInstallation\n------------\n\nInstall the latest `pip` & `setuptools` packages versions:\n- with `CPython`\n ```bash\n python -m pip install --upgrade pip setuptools\n ```\n- with `PyPy`\n ```bash\n pypy -m pip install --upgrade pip setuptools\n ```\n\n### User\n\nDownload and install the latest stable version from `PyPI` repository:\n- with `CPython`\n ```bash\n python -m pip install --upgrade memoir\n ```\n- with `PyPy`\n ```bash\n pypy -m pip install --upgrade memoir\n ```\n\n### Developer\n\nDownload the latest version from `GitHub` repository\n```bash\ngit clone https://github.com/lycantropos/memoir.git\ncd memoir\n```\n\nInstall:\n- with `CPython`\n ```bash\n python setup.py install\n ```\n- with `PyPy`\n ```bash\n pypy setup.py install\n ```\n\nUsage\n-----\n\nLet's suppose we are defining a class \nwith expensive read-only [`property`](https://docs.python.org/library/functions.html#property) \nwhich can be calculated once and reused afterwards.\n\nCommon way of solving this is by introducing private'ish attribute like\n```python\n>>> class Example:\n... @property\n... def expensive_property(self):\n... try:\n... result = self._expensive_property\n... except AttributeError:\n... result = do_expensive_calculations(...)\n... self._expensive_property = result\n... return result\n\n```\nthis works fine, but each such property\n\n- introduces an extra attribute,\n- requires a lot of boilerplate code.\n\nIf we have\n\n- [weakly-referencable](https://docs.python.org/library/weakref.html) \n(which is by default if not suppressed explicitly, \ne.g. by using [`__slots__` class variable](https://docs.python.org/reference/datamodel.html#slots)),\n- [hashable](https://docs.python.org/glossary.html#term-hashable)\n\nclass we can implement it like\n```python\n>>> from memoir import cached\n>>> class Example:\n... @cached.property_\n... def expensive_property(self):\n... return do_expensive_calculations(...)\n\n```\n\nDevelopment\n-----------\n\n### Bumping version\n\n#### Preparation\n\nInstall\n[bump2version](https://github.com/c4urself/bump2version#installation).\n\n#### Pre-release\n\nChoose which version number category to bump following [semver\nspecification](http://semver.org/).\n\nTest bumping version\n```bash\nbump2version --dry-run --verbose $CATEGORY\n```\n\nwhere `$CATEGORY` is the target version number category name, possible\nvalues are `patch`/`minor`/`major`.\n\nBump version\n```bash\nbump2version --verbose $CATEGORY\n```\n\nThis will set version to `major.minor.patch-alpha`. \n\n#### Release\n\nTest bumping version\n```bash\nbump2version --dry-run --verbose --tag release\n```\n\nBump version\n```bash\nbump2version --verbose --tag release\n```\n\nThis will set version to `major.minor.patch` and add `Git` tag.\n\n#### Notes\n\nTo avoid inconsistency between branches and pull requests,\nbumping version should be merged into `master` branch as separate pull\nrequest.\n\n### Running tests\n\nPlain:\n- with `CPython`\n ```bash\n python setup.py test\n ```\n- with `PyPy`\n ```bash\n pypy setup.py test\n ```\n\nInside `Docker` container:\n- with `CPython`\n ```bash\n docker-compose --file docker-compose.cpython.yml up\n ```\n- with `PyPy`\n ```bash\n docker-compose --file docker-compose.pypy.yml up\n ```\n\n`Bash` script (e.g. can be used in `Git` hooks):\n- with `CPython`\n ```bash\n ./run-tests.sh\n ```\n or\n ```bash\n ./run-tests.sh cpython\n ```\n\n- with `PyPy`\n ```bash\n ./run-tests.sh pypy\n ```\n\n`PowerShell` script (e.g. can be used in `Git` hooks):\n- with `CPython`\n ```powershell\n .\\run-tests.ps1\n ```\n or\n ```powershell\n .\\run-tests.ps1 cpython\n ```\n- with `PyPy`\n ```powershell\n .\\run-tests.ps1 pypy\n ```\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "https://github.com/lycantropos/memoir/archive/master.zip", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/lycantropos/memoir/", "keywords": "", "license": "MIT License", "maintainer": "", "maintainer_email": "", "name": "memoir", "package_url": "https://pypi.org/project/memoir/", "platform": "", "project_url": "https://pypi.org/project/memoir/", "project_urls": { "Download": "https://github.com/lycantropos/memoir/archive/master.zip", "Homepage": "https://github.com/lycantropos/memoir/" }, "release_url": "https://pypi.org/project/memoir/0.0.2/", "requires_dist": null, "requires_python": ">=3.5.3", "summary": "Decorators for adding memoization.", "version": "0.0.2" }, "last_serial": 5928279, "releases": { "0.0.0": [ { "comment_text": "", "digests": { "md5": "f898d1d9e5c97cbc2242dc6e5dfe76cd", "sha256": "5ae2b9650f5754ff24e732a8aab463e7f59958d81f855065043aeb21226c7657" }, "downloads": -1, "filename": "memoir-0.0.0-py3-none-any.whl", "has_sig": false, "md5_digest": "f898d1d9e5c97cbc2242dc6e5dfe76cd", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 2323, "upload_time": "2019-05-27T18:31:00", "url": "https://files.pythonhosted.org/packages/2e/56/bf96b767e070491d9e9098931da08283185213070ad29fd33d8801bbd4db/memoir-0.0.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "833147a94465b6d10699b9ab884570c6", "sha256": "2691975c7b3779d6faf1185f3de30ff3f2f83efb08a9bd89e5b600aa0e79fdd4" }, "downloads": -1, "filename": "memoir-0.0.0.tar.gz", "has_sig": false, "md5_digest": "833147a94465b6d10699b9ab884570c6", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 2612, "upload_time": "2019-05-27T18:31:02", "url": "https://files.pythonhosted.org/packages/53/7c/794eab5e658096605122ec9c7f13b0829d737ee1837b5749a4c2fa3b2670/memoir-0.0.0.tar.gz" } ], "0.0.1": [ { "comment_text": "", "digests": { "md5": "2bff3ea5c8edbd0ad84b986d118d06a2", "sha256": "fb753d4e71709c16310270a28c641bd6c1fce55a02d552f0304829aea0a369ab" }, "downloads": -1, "filename": "memoir-0.0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "2bff3ea5c8edbd0ad84b986d118d06a2", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5.3", "size": 4597, "upload_time": "2019-05-28T16:19:31", "url": "https://files.pythonhosted.org/packages/f2/d5/8a1c9d1ce0f8c7d65dff879c02ee420b6b1711e62b2d807e84cd68f0cf72/memoir-0.0.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "41b2acf95e5d014008b324baf87650a8", "sha256": "f1ccc2e8f2be78e4f97133c18c781204b3020ed7ecc761257d40cd3f5310baf4" }, "downloads": -1, "filename": "memoir-0.0.1.tar.gz", "has_sig": false, "md5_digest": "41b2acf95e5d014008b324baf87650a8", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5.3", "size": 3865, "upload_time": "2019-05-28T16:19:32", "url": "https://files.pythonhosted.org/packages/a8/7c/dd539b8f0a460511bb83dce620f71113c2790c61bf0b7f8b9baf1d3b29a3/memoir-0.0.1.tar.gz" } ], "0.0.2": [ { "comment_text": "", "digests": { "md5": "f25e5b2c413050d8082bf3d85aba416a", "sha256": "6711db9f999c7c864732a0b96d8cf759a2ccc8e307c053fba6ccbb124e57360d" }, "downloads": -1, "filename": "memoir-0.0.2-py3-none-any.whl", "has_sig": false, "md5_digest": "f25e5b2c413050d8082bf3d85aba416a", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5.3", "size": 4919, "upload_time": "2019-10-04T13:12:56", "url": "https://files.pythonhosted.org/packages/38/6f/d1409229c0f176a5ecbc732d9ee8cf4a34fc558dbeb629b443864f79e813/memoir-0.0.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d5c3bcca90eaf34d24334eba57b4c842", "sha256": "5da9ac6b3c6a1ca8a2d2cfad34db7c93cdd7af81d8983f37c2ca9e5e49866138" }, "downloads": -1, "filename": "memoir-0.0.2.tar.gz", "has_sig": false, "md5_digest": "d5c3bcca90eaf34d24334eba57b4c842", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5.3", "size": 4241, "upload_time": "2019-10-04T13:12:58", "url": "https://files.pythonhosted.org/packages/d0/92/9a202bddc3d128b3f34e241d157d36f726e8a098c7cf8756ededce933b84/memoir-0.0.2.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "f25e5b2c413050d8082bf3d85aba416a", "sha256": "6711db9f999c7c864732a0b96d8cf759a2ccc8e307c053fba6ccbb124e57360d" }, "downloads": -1, "filename": "memoir-0.0.2-py3-none-any.whl", "has_sig": false, "md5_digest": "f25e5b2c413050d8082bf3d85aba416a", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5.3", "size": 4919, "upload_time": "2019-10-04T13:12:56", "url": "https://files.pythonhosted.org/packages/38/6f/d1409229c0f176a5ecbc732d9ee8cf4a34fc558dbeb629b443864f79e813/memoir-0.0.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d5c3bcca90eaf34d24334eba57b4c842", "sha256": "5da9ac6b3c6a1ca8a2d2cfad34db7c93cdd7af81d8983f37c2ca9e5e49866138" }, "downloads": -1, "filename": "memoir-0.0.2.tar.gz", "has_sig": false, "md5_digest": "d5c3bcca90eaf34d24334eba57b4c842", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5.3", "size": 4241, "upload_time": "2019-10-04T13:12:58", "url": "https://files.pythonhosted.org/packages/d0/92/9a202bddc3d128b3f34e241d157d36f726e8a098c7cf8756ededce933b84/memoir-0.0.2.tar.gz" } ] }