{ "info": { "author": "Oliver Russell", "author_email": "ojhrussell@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Programming Language :: Python", "Programming Language :: Python :: 3.2", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Topic :: Software Development" ], "description": "# immerframe\nCreate the next immutable object by simply modifying the current one\n\n*This is a Python port of [immer](https://github.com/mweststrate/immer).*\n\n```bash\npip install immerframe\n```\n\nWant to do a deep update on a Python data structure without mutating it? No problem:\n\n```python\nfrom immerframe import Proxy, produce\n\nAnt = namedtuple('Ant', 'age')\nnested = {\n 'foo': [\n Ant(age=2),\n 'bar',\n ],\n}\n\nproxy = Proxy()\nproxy['foo'][0].age += 1\nproxy['foo'].pop()\nproxy['qux'] = 99\n\nnew_nested = produce(proxy, nested)\n```\n\n`new_nested` will now equal\n\n```python\n{\n 'foo': [\n Ant(age=3),\n ],\n 'qux': 99,\n}\n```\n\nwhile `nested` will remain unchanged.\n\n\"What about my typing?\"\n\n```python\nfrom typing import cast\n\nCat = namedtuple('Cat', 'name')\n\nproxy = cast(Cat, Proxy())\n# continue as before but with autocomplete and type checking!\nproxy.name = 'Felix'\n```\n\n`immerframe` uses structural sharing, so should be efficient in most cases:\n\n```python\nd = {'foo': 1}\nl = [d]\n\nproxy = Proxy()\nproxy.append(100)\nnew_l = produce(proxy, l)\nassert new_l == [d, 100]\nassert new_l[0] is d\n```\n\n`immerframe` supports:\n\n- `dict`s\n- `list`s\n- `set`s\n- `tuples`s\n- `namedtuples`s\n- `attrs`s\n\n## `Lens`\n\n`immerframe` comes with a `Lens` class to help with path reuse, it has `.get`, `.set`, `.modify`:\n\n```python\nd = {'foo': [1, 2, 3, 4]}\n\nlens = Lens(Proxy()['foo'][1])\n\nnew_d = lens.set(d, 100)\nassert new_d == {'foo': [1, 100, 3, 4]}\nassert d == {'foo': [1, 2, 3, 4]}\nassert lens.get(d) == 2\n\nanother_d = lens.modify(d, lambda n: n + 1000)\nassert another_d == {'foo': [1, 1002, 3, 4]}\n```\n\n`Lens`s are composable via their `.proxy()` method, (this duplicates of the originally provided proxy) `Lens(Lens(Proxy()['foo']).proxy()[1])` is equivalent to `Lens(Proxy()['foo'][1])`.\n\n## Plugins:\n\n`immerframe` currently has an `attrs` plugin, registering plugins is pretty easy, just mutate the `immerframe.plugins` list (see [here](https://github.com/leontrolski/immerframe/blob/master/immerframe/__init__.py#L171) for the structure of the existing attr plugin).", "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/leontrolski/immerframe", "keywords": "", "license": "MIT License", "maintainer": "", "maintainer_email": "", "name": "immerframe", "package_url": "https://pypi.org/project/immerframe/", "platform": "", "project_url": "https://pypi.org/project/immerframe/", "project_urls": { "Homepage": "https://github.com/leontrolski/immerframe" }, "release_url": "https://pypi.org/project/immerframe/0.0.5/", "requires_dist": null, "requires_python": "", "summary": "creates the next immutable object by simply modifying the current one", "version": "0.0.5" }, "last_serial": 5129996, "releases": { "0.0.1": [ { "comment_text": "", "digests": { "md5": "81a0c9438761178bcb03f9a3a976dacc", "sha256": "4dad4550a42e21ee2a77cba04a89301e82dc8cc98c393e49490e163542085588" }, "downloads": -1, "filename": "immerframe-0.0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "81a0c9438761178bcb03f9a3a976dacc", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 5163, "upload_time": "2019-03-29T09:34:01", "url": "https://files.pythonhosted.org/packages/e3/54/e74a0958e3c80d4d583aa850d197510a31eed614c5a0cbc69c91964b294a/immerframe-0.0.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a3d3927e2953d7f2f2d9ddbf6eaee23a", "sha256": "168332fc9ad306083764e81ac947189991e98b1a76dc660244bb6ff285d76d17" }, "downloads": -1, "filename": "immerframe-0.0.1.tar.gz", "has_sig": false, "md5_digest": "a3d3927e2953d7f2f2d9ddbf6eaee23a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3831, "upload_time": "2019-03-29T09:34:03", "url": "https://files.pythonhosted.org/packages/4d/69/4bb2e928681b73cec16249150bfae28f241abf11ce323e13c09610650d64/immerframe-0.0.1.tar.gz" } ], "0.0.2": [ { "comment_text": "", "digests": { "md5": "acb02ca72da5597e4b26ceaa716b3b7d", "sha256": "85a88044a73bbe6a3f06957a7e80af7341821b58c537294b85ce0906368d0048" }, "downloads": -1, "filename": "immerframe-0.0.2-py3-none-any.whl", "has_sig": false, "md5_digest": "acb02ca72da5597e4b26ceaa716b3b7d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 5256, "upload_time": "2019-03-29T13:44:34", "url": "https://files.pythonhosted.org/packages/46/66/52d461f55982ba11ec01e59093fc92657ffcf808e95d26e6a0f9a3626136/immerframe-0.0.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2d1dd84a7ca36aaa93adbf6e389377d4", "sha256": "2afa7722c151f45954a05e76f6e9a13023d835b0fae08f77b619ed9851628c31" }, "downloads": -1, "filename": "immerframe-0.0.2.tar.gz", "has_sig": false, "md5_digest": "2d1dd84a7ca36aaa93adbf6e389377d4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3929, "upload_time": "2019-03-29T13:44:36", "url": "https://files.pythonhosted.org/packages/ac/fa/28e56eb5c38420ee123e189cd7ab5f668fb40a23e7a466cc3be8bbb5ab73/immerframe-0.0.2.tar.gz" } ], "0.0.3": [ { "comment_text": "", "digests": { "md5": "303ecc3135c33143bbaac5aa3da9bb02", "sha256": "528eb69b1373c94f6ee450da6fb64dee32dcb2463ce707f748981d77ba18295f" }, "downloads": -1, "filename": "immerframe-0.0.3.tar.gz", "has_sig": false, "md5_digest": "303ecc3135c33143bbaac5aa3da9bb02", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4260, "upload_time": "2019-04-11T15:57:57", "url": "https://files.pythonhosted.org/packages/0d/62/a507407fe023ccca7bb2ca621f5daf27e2f07f015f498cf7a2cde7ea34b3/immerframe-0.0.3.tar.gz" } ], "0.0.4": [ { "comment_text": "", "digests": { "md5": "84004deefde3bbdd5771bdabb94b3aff", "sha256": "94413e362a6315dbcbe93c0b893dacb89c11caef877980ae9d01806a27014bd3" }, "downloads": -1, "filename": "immerframe-0.0.4.tar.gz", "has_sig": false, "md5_digest": "84004deefde3bbdd5771bdabb94b3aff", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4339, "upload_time": "2019-04-11T16:10:56", "url": "https://files.pythonhosted.org/packages/41/2c/c99f8ede83974f59bff99bd9efc054abe5e71dfbcfec8a568fa9bfc2f8bb/immerframe-0.0.4.tar.gz" } ], "0.0.5": [ { "comment_text": "", "digests": { "md5": "21cb6de57f98a20066bfeac7fb1aae39", "sha256": "abae9ccaf8f2393d1441d15894314f13e539de8de5c305af3af1747bd4a0fc6a" }, "downloads": -1, "filename": "immerframe-0.0.5.tar.gz", "has_sig": false, "md5_digest": "21cb6de57f98a20066bfeac7fb1aae39", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4538, "upload_time": "2019-04-11T17:01:50", "url": "https://files.pythonhosted.org/packages/a0/52/259d44ef726f2bb47301b5d54174d0c59b18b2787a2c96ea0683ab4a4fb5/immerframe-0.0.5.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "21cb6de57f98a20066bfeac7fb1aae39", "sha256": "abae9ccaf8f2393d1441d15894314f13e539de8de5c305af3af1747bd4a0fc6a" }, "downloads": -1, "filename": "immerframe-0.0.5.tar.gz", "has_sig": false, "md5_digest": "21cb6de57f98a20066bfeac7fb1aae39", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4538, "upload_time": "2019-04-11T17:01:50", "url": "https://files.pythonhosted.org/packages/a0/52/259d44ef726f2bb47301b5d54174d0c59b18b2787a2c96ea0683ab4a4fb5/immerframe-0.0.5.tar.gz" } ] }