{ "info": { "author": "Andrea La Scola", "author_email": "andrealascola@gmail.com", "bugtrack_url": null, "classifiers": [ "License :: OSI Approved :: MIT License", "Programming Language :: Python", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy" ], "description": "[![Build Status](https://travis-ci.com/andrea-lascola/Pytoolz.svg?branch=master)](https://travis-ci.com/andrea-lascola/Pytoolz)\n[![PyPI version](https://badge.fury.io/py/pytoolz.svg)](https://badge.fury.io/py/pytoolz)\n[![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/2441/badge)](https://bestpractices.coreinfrastructure.org/projects/2441)\n\n# Pytoolz \ud83d\ude80\n\nModule containing some python utilities/abstractions\npython >= 3.7 compatible\n\n## Prerequisites\n python >= 3.7\n\n## Installing\n pip install pytoolz\n\n## Sections\n\n* [Functional](#functional) \u03bb\n* [Data Structures](#data-structures) \ud83d\udcc2\n* [Cache](#cache) \ud83d\ude80\n* [Design](#design) \ud83c\udfdb\n* [Logs](#logs) \ud83d\udcd6\n* [Multiprocess](#multiprocess) \ud83d\udc6f\n* [Serialization](#serialization) \ud83e\udd16\n\n#### Functional\n\nA set of utilities oriented to functional programming.\n\n##### compose(f1: Callable, f2: Callable) -> Callable\nCompose two functions: return the fn composition of the two\n\n```python\nfrom pytoolz.functional import compose\n\nif __name__ == \"__main__\":\n f = compose(lambda x: x * 2,\n lambda x: x * 3)\n f(10)\n # 60\n```\n\n##### pipe(functions: List[Callable], obj)\nRecursively apply a list of morphism to an input value\n\n```python\nfrom pytoolz.functional import pipe\n\nif __name__ == \"__main__\":\n pipe([lambda x: x * 3,\n lambda x: x * 2,\n lambda x: x / 3], 10)\n # 20.0\n```\n\n##### flat_map(fn: Callable, collection: Iterable)\nApply the input function to every element in iterable and flatten the result list\ns\n```python\nfrom pytoolz.functional import flat_map\n\nif __name__ == \"__main__\":\n flat_map(lambda x: [x, x], [1, 2, 3])\n # [1, 1, 2, 2, 3, 3]\n flat_map(lambda x: (x, x), [1, 2, 3])\n # [1, 1, 2, 2, 3, 3]\n```\n\n##### iflat_map(fn: Callable, collection: Iterable)\nApply the input function to every element in iterable and flatten the result list **lazily**\n\n```python\nfrom pytoolz.functional import iflat_map\n\nif __name__ == \"__main__\":\n iflat_map(lambda x: [x, x], [1, 2, 3])\n # [1, 1, 2, 2, 3, 3]\n iflat_map(lambda x: (x, x), [1, 2, 3])\n # [1, 1, 2, 2, 3, 3]\n```\n\n\n##### for_each(fn: Callable, collection: Iterable)\nCreate side effect applying the input function for every element in iterable\n\n```python\nfrom pytoolz.functional import iflat_map\n\nif __name__ == \"__main__\":\n iflat_map(lambda x: [x, x], [1, 2, 3])\n # [1, 1, 2, 2, 3, 3]\n iflat_map(lambda x: (x, x), [1, 2, 3])\n # [1, 1, 2, 2, 3, 3]\n```\n\n\n\n##### Stream(iterable: Iterable) -> Stream\n[Experiment] Emulate the Java Stream API to create pipelines of transformations unsing function composition\n\n```python\nfrom pytoolz.functional import Stream\n\nif __name__ == \"__main__\":\n Stream([1, 2, 3]).map(lambda x: x * 3).to_list()\n # [3, 6, 9]\n Stream([1, 2, 3]).sum().to_int()\n # 6\n Stream([1, 2, 3]).map(lambda x: x * 3).filter(lambda x: x >= 6).to_tuple()\n # (6, 9)\n Stream([\"a\", \"b\", \"c\"]).map(lambda x: x + \"a\").to_set() == {'aa', 'ba', 'ca'}\n # True\n Stream([1, 4, 3]) \\\n .map(lambda x: x + 3) \\\n .map(lambda x: x * x) \\\n .filter(lambda x: x > 3) \\\n .sum() \\\n .to_float()\n # 101.0\n\n #Alternative constructor\n Stream.of([1, 2, 3], [\n (Stream.map, lambda x: x * 3),\n (Stream.map, lambda x: x * 3)\n ]).to_list()\n # [9, 18, 27]\n```\n\n#### Serialization\n\nSerialization and deSerialization of objects:\ndifferent engine are built-in: Json/Pickle/Dict\n\n```python\nfrom pytoolz.serialization import Dict, Json, Pickle\n\nif __name__ == \"__main__\":\n original = '{\"users\": [\"bob\", \"foo\", \"bar\"], \"companies\": {}}'\n\n data = Json(original).deserialize()\n print(type(data))\n # ''\n\n string_data = Json(data).serialize()\n print(type(string_data))\n # ''\n```\n\n#### Data structures\nUtilities related to data structures (missing data structures or customization of existing ones) \n\n##### LinkedList \n\n```python\nfrom pytooolz.ds import LinkedList, Node\n\nif __name__ == \"__main__\":\n ll = LinkedList()\n ll.add(Node(3))\n ll.add(Node(4))\n ll.add(Node(5))\n ll.add(Node(6))\n print(ll)\n #$ LinkedList(head=Node(value=6, next=Node(value=5, next=Node(value=4, next=Node(value=3, next=None)))))\n```\n\n##### DoublyLinkedList\n\nTODO complete\n\n#### Cache\nUtilities related to **caching**. Different backend will be implemented:\nex:\n* Redis\n* Memcache\n* LRU in-memory\n* Filesystem\n\n```python\nfrom pytooolz.cache import memoize # memoize decorator\nfrom pytooolz.cache import FileEngine # Disk cache engine\nfrom pytooolz.cache import InMemoryEngine # LRU in memory engine\nfrom pytooolz.cache import MemcachedEngine # Memcache engine\nfrom pytooolz.cache import RedisEngine # Redis engine\n\nif __name__ == \"__main__\":\n @memoize(InMemoryEngine(limit=10, expiration=10))\n def fn(*args):\n return args\n\n\n fn(1, 2, 3, 4, 5) # fn evaluated\n fn(1, 2, 3, 4, 5) # got from cache\n fn(1, 2, 3, 4, 5) # got from cache\n fn(1, 2, 3, 4, 5) # got from cache\n```\n\n\n#### Design\nUtilities related to application design\n**Singleton decorator** - Examples:\n```python\nfrom pytooolz.design import singleton\n\nif __name__ == \"__main__\":\n @singleton.singleton\n class MyClass:\n pass\n\n assert id(MyClass()) == id(MyClass())\n```\n\n**Traits** \nAttach a specific trait to an instance.\nThis should enable polimorphism using composition instead of classic inheritance\n\nTo use this feature:\n* decorate your class with ```@extendable``` decorator\n* implement your custom class that implements ```Trait``` interface\n* choose one (or more) traits during the class init using ```.with_trait(...)```\n\nExample:\n ```python\n from pytooolz.design import Trait\n from pytooolz.design import extendable\n \nif __name__ == \"__main__\":\n class UserRenderHtml(Trait):\n def render(self):\n print(\"\"\"\n

{0!s}

\n

{1!s}

\n \"\"\".format(self.name, self.surname))\n\n\n class UserRenderText(Trait):\n def render(self):\n print(self.name, self.surname)\n\n\n @extendable\n class User:\n def __init__(self, name, surname):\n self.name = name\n self.surname = surname\n\n usr = User(\"Andrea\", \"La Scola\").with_trait(UserRenderHtml)\n print(usr.render())\n ```\n\n#### Logs\n**log decorators**\n - multiple backends\n\n\n## Authors\n\n* **Andrea La Scola** - *Initial work* - [PurpleBooth](https://github.com/andrea-lascola)", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/andrea-lascola/Pytoolz", "keywords": "", "license": "Creative Commons Attribution-Noncommercial-Share Alike license", "maintainer": "", "maintainer_email": "", "name": "pytoolz", "package_url": "https://pypi.org/project/pytoolz/", "platform": "", "project_url": "https://pypi.org/project/pytoolz/", "project_urls": { "Homepage": "https://github.com/andrea-lascola/Pytoolz" }, "release_url": "https://pypi.org/project/pytoolz/0.1.7/", "requires_dist": null, "requires_python": "", "summary": "", "version": "0.1.7" }, "last_serial": 4705424, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "bcb8b8a49c8891d2bc535209ee573b55", "sha256": "848ad8c9d47947cf03cef3fc4b52d2ccbc68863f6b6ce09b5641666b97078d7f" }, "downloads": -1, "filename": "pytoolz-0.1.tar.gz", "has_sig": false, "md5_digest": "bcb8b8a49c8891d2bc535209ee573b55", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6099, "upload_time": "2019-01-04T16:50:45", "url": "https://files.pythonhosted.org/packages/52/7a/ce94f71a2815e2064c1ed9042055454217ac10e335238fa3fcf773c295f8/pytoolz-0.1.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "186e05cd962f6bdca1b7f9032a8c77e5", "sha256": "fd55784e2286ec6fc5a7480edfdea3123d45acdb41bfb1b0614a94f4e9869f87" }, "downloads": -1, "filename": "pytoolz-0.1.1.tar.gz", "has_sig": false, "md5_digest": "186e05cd962f6bdca1b7f9032a8c77e5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7823, "upload_time": "2019-01-04T21:27:30", "url": "https://files.pythonhosted.org/packages/0d/c1/c2f891129475f3a0f419573ececbf5480a8926963dccf9dcf6e2bbcb64a4/pytoolz-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "3f95f6af1d8af528ba66371b9663263e", "sha256": "ac608f5dafac1c19b490baa28eeb6744f4284780617d96bccd29327c66ecb53d" }, "downloads": -1, "filename": "pytoolz-0.1.2.tar.gz", "has_sig": false, "md5_digest": "3f95f6af1d8af528ba66371b9663263e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7883, "upload_time": "2019-01-04T21:30:47", "url": "https://files.pythonhosted.org/packages/ba/46/c17955c533ca15fc262d4325bb1956c65172fdb8187839ed13f5800e2c63/pytoolz-0.1.2.tar.gz" } ], "0.1.2.dev0": [ { "comment_text": "", "digests": { "md5": "d73f6a50789ae8ed39f2f0e7abf67e06", "sha256": "2a0833e82198ab7c9db608fb704162a33a68390fc3d8492ac9806fe0dcefe4ab" }, "downloads": -1, "filename": "pytoolz-0.1.2.dev0.tar.gz", "has_sig": false, "md5_digest": "d73f6a50789ae8ed39f2f0e7abf67e06", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8063, "upload_time": "2019-01-04T23:48:03", "url": "https://files.pythonhosted.org/packages/75/2d/fe16c6bd5cfa144d514e49abde60ea2977872347405e559977a1676af4a6/pytoolz-0.1.2.dev0.tar.gz" } ], "0.1.3.dev0": [ { "comment_text": "", "digests": { "md5": "d0a49a6a82a31c6f4681f6f723930b25", "sha256": "9fc76e16c85f8b63abed390a692f617a411785e79526a2cebab1623e56965eb7" }, "downloads": -1, "filename": "pytoolz-0.1.3.dev0.tar.gz", "has_sig": false, "md5_digest": "d0a49a6a82a31c6f4681f6f723930b25", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8062, "upload_time": "2019-01-04T23:49:58", "url": "https://files.pythonhosted.org/packages/3c/4f/6f24834f06fca55207935abf2804836494f73904b23c9a32ab47983ff6bc/pytoolz-0.1.3.dev0.tar.gz" } ], "0.1.4": [ { "comment_text": "", "digests": { "md5": "ad9cfbcf21a51b2787e5384f1c9e92fd", "sha256": "640d80ffeb87455baad74d2c73838b8ad911f48d4f94e1131cdb1122616639ea" }, "downloads": -1, "filename": "pytoolz-0.1.4.tar.gz", "has_sig": false, "md5_digest": "ad9cfbcf21a51b2787e5384f1c9e92fd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8849, "upload_time": "2019-01-06T22:42:22", "url": "https://files.pythonhosted.org/packages/75/41/67ca5302340f1ddb942643ed1dd5745c03960594e1f1811b59a52b3f09f5/pytoolz-0.1.4.tar.gz" } ], "0.1.4.dev0": [ { "comment_text": "", "digests": { "md5": "d00dc8e4c7fcddc5b858f709d1973cfe", "sha256": "2e371a45584bd244d0f63aa15da7a87c67e5779b3e132513c34f1b8bae5c1c04" }, "downloads": -1, "filename": "pytoolz-0.1.4.dev0.tar.gz", "has_sig": false, "md5_digest": "d00dc8e4c7fcddc5b858f709d1973cfe", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8768, "upload_time": "2019-01-06T22:29:01", "url": "https://files.pythonhosted.org/packages/87/4d/a9e6dc23d60341afdbf2015280b7a265eef58e158a3f343b4a3e9caec99f/pytoolz-0.1.4.dev0.tar.gz" } ], "0.1.5": [ { "comment_text": "", "digests": { "md5": "0bd6e2c7272bba23692227da84697696", "sha256": "e06903bd19c96e802788707b9542089e578c952ae9039bf5c3cfa7f4d130d274" }, "downloads": -1, "filename": "pytoolz-0.1.5.tar.gz", "has_sig": false, "md5_digest": "0bd6e2c7272bba23692227da84697696", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9097, "upload_time": "2019-01-08T10:44:20", "url": "https://files.pythonhosted.org/packages/9b/77/1fa264e0564114cd5cec1ef5e92f380addda8cc861b49cedc13c1da43770/pytoolz-0.1.5.tar.gz" } ], "0.1.6": [ { "comment_text": "", "digests": { "md5": "e5e885be34d18f36a2e1b847ddcb5ace", "sha256": "c0c8d5bc7903053622f4ce13d33b677439679ea1b9d6b89e158680bba5ad5b53" }, "downloads": -1, "filename": "pytoolz-0.1.6.tar.gz", "has_sig": false, "md5_digest": "e5e885be34d18f36a2e1b847ddcb5ace", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10103, "upload_time": "2019-01-14T20:09:40", "url": "https://files.pythonhosted.org/packages/9e/b6/c8617c17867c17ecf9253bea71ab636093b28ca7814926162b4cf14fbbc9/pytoolz-0.1.6.tar.gz" } ], "0.1.6.dev0": [ { "comment_text": "", "digests": { "md5": "2e67d65279fc4af82f9c7db479ff9b30", "sha256": "f89ecc70e43ca2b8d2188c1ac46e4c2f9758c0663c36dbb6a539bbc52c01c1ff" }, "downloads": -1, "filename": "pytoolz-0.1.6.dev0.tar.gz", "has_sig": false, "md5_digest": "2e67d65279fc4af82f9c7db479ff9b30", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9475, "upload_time": "2019-01-08T22:50:25", "url": "https://files.pythonhosted.org/packages/ee/6d/c446295a62782e6e037bdebfff003701623f5df47996f10103cbedf617a4/pytoolz-0.1.6.dev0.tar.gz" } ], "0.1.7": [ { "comment_text": "", "digests": { "md5": "e2552f3ff112527673d14b836358da67", "sha256": "77f14937adc2f45df27d30e0d707e8b3013abda32566cdae8e336cebbb169899" }, "downloads": -1, "filename": "pytoolz-0.1.7.tar.gz", "has_sig": false, "md5_digest": "e2552f3ff112527673d14b836358da67", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11368, "upload_time": "2019-01-16T22:49:41", "url": "https://files.pythonhosted.org/packages/f9/7b/ede04daa6899e72d09df6eb10e332a9393e4285084fef429317100d4161e/pytoolz-0.1.7.tar.gz" } ], "0.1.dev0": [ { "comment_text": "", "digests": { "md5": "7d24748d0d49dbabbdd20ef7a1b95752", "sha256": "380a6e12797bbde1ad3d7608b06f92c54acd8e927ab26df13c18a1e2b141967f" }, "downloads": -1, "filename": "pytoolz-0.1.dev0.tar.gz", "has_sig": false, "md5_digest": "7d24748d0d49dbabbdd20ef7a1b95752", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6078, "upload_time": "2019-01-04T16:38:22", "url": "https://files.pythonhosted.org/packages/26/97/628f0cd89687b27c2eb5ca0105112078fccc2fe7e6d8ca7d89d90a181ba0/pytoolz-0.1.dev0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "e2552f3ff112527673d14b836358da67", "sha256": "77f14937adc2f45df27d30e0d707e8b3013abda32566cdae8e336cebbb169899" }, "downloads": -1, "filename": "pytoolz-0.1.7.tar.gz", "has_sig": false, "md5_digest": "e2552f3ff112527673d14b836358da67", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11368, "upload_time": "2019-01-16T22:49:41", "url": "https://files.pythonhosted.org/packages/f9/7b/ede04daa6899e72d09df6eb10e332a9393e4285084fef429317100d4161e/pytoolz-0.1.7.tar.gz" } ] }