{ "info": { "author": "Andrei Suiu", "author_email": "andrei.suiu@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy" ], "description": "pyxtension\n==========\n\n| |build Status|\n| |Coverage Status|\n\n`pyxtension `__ is a pure Python\nGNU-licensed library that includes Scala-like streams, Json with\nattribute access syntax, and other common-use stuff.\n\nInstallation\n------------\n\n::\n\n pip install pyxtension\n\nor from Github:\n\n::\n\n git clone https://github.com/asuiu/pyxtension.git\n cd pyxtension\n python setup.py install\n\nor\n\n::\n\n git submodule add https://github.com/asuiu/pyxtension.git\n\nModules overview\n----------------\n\nJson.py\n~~~~~~~\n\nJson\n^^^^\n\n| A ``dict`` subclass to represent a Json object. You should be able to\n use this\n| absolutely anywhere you can use a ``dict``. While this is probably the\n class you\n| want to use, there are a few caveats that follow from this being a\n ``dict`` under\n| the hood.\n\n**Never again will you have to write code like this**:\n\n.. code:: python\n\n body = {\n 'query': {\n 'filtered': {\n 'query': {\n 'match': {'description': 'addictive'}\n },\n 'filter': {\n 'term': {'created_by': 'ASU'}\n }\n }\n }\n }\n\nFrom now on, you may simply write the following three lines:\n\n.. code:: python\n\n body = Json()\n body.query.filtered.query.match.description = 'addictive'\n body.query.filtered.filter.term.created_by = 'ASU'\n\nstreams.py\n~~~~~~~~~~\n\nstream\n^^^^^^\n\n| ``stream`` subclasses ``collections.Iterable``. It's the same Python\n iterable, but with more added methods, suitable for multithreading and\n multiprocess processings.\n| Used to create stream processing pipelines, similar to those used in\n `Scala `__ and\n `MapReduce `__ programming\n model.\n| Those who used `Apache Spark `__\n `RDD `__\n functions will find this model of processing very easy to use.\n\n`streams `__\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n**Never again will you have to write code like this**:\n\n.. code:: python\n\n > lst = xrange(1,6)\n > reduce(lambda x, y: x * y, map(lambda _: _ * _, filter(lambda _: _ % 2 == 0, lst)))\n 64\n\nFrom now on, you may simply write the following lines:\n\n.. code:: python\n\n > the_stream = stream( xrange(1,6) )\n > the_stream.\\\n filter(lambda _: _ % 2 == 0).\\\n map(lambda _: _ * _).\\\n reduce(lambda x, y: x * y)\n 64\n\nA Word Count `Map-Reduce `__ naive example using multiprocessing map\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n.. code:: python\n\n corpus = [\n \"MapReduce is a programming model and an associated implementation for processing and generating large data sets with a parallel, distributed algorithm on a cluster.\",\n \"At Google, MapReduce was used to completely regenerate Google's index of the World Wide Web\",\n \"Conceptually similar approaches have been very well known since 1995 with the Message Passing Interface standard having reduce and scatter operations.\"]\n\n def reduceMaps(m1, m2):\n for k, v in m2.iteritems():\n m1[k] = m1.get(k, 0) + v\n return m1\n\n word_counts = stream(corpus).\\\n mpmap(lambda line: stream(line.lower().split(' ')).countByValue()).\\\n reduce(reduceMaps)\n\nBasic methods\n^^^^^^^^^^^^^\n\n**map(f)**\n''''''''''\n\nIdentic with builtin ``map`` but returns a stream\n\n**mpmap(f, poolSize=16)**\n'''''''''''''''''''''''''\n\nParallel ordered map using ``multiprocessing.Pool.imap()``.\n\nIt can replace the ``map`` when need to split computations to multiple\ncores, and order of results matters.\n\nIt spawns at most ``poolSize`` processes and applies the ``f`` function.\n\nThe elements in the result stream appears in the same order they appear\nin the initial iterable.\n\n::\n\n :type f: (T) -> V\n :rtype: `stream`\n\n**mpfastmap(f, poolSize=16)**\n'''''''''''''''''''''''''''''\n\nParallel ordered map using ``multiprocessing.Pool.imap_unordered()``.\n\nIt can replace the ``map`` when the ordered of results doesn't matter.\n\nIt spawns at most ``poolSize`` processes and applies the ``f`` function.\n\nThe elements in the result stream appears in the unpredicted order.\n\n::\n\n :type f: (T) -> V\n :rtype: `stream`\n\n**fastmap(f, poolSize=16)**\n'''''''''''''''''''''''''''\n\n| Parallel unordered map using multithreaded pool.\n| It can replace the ``map`` when the ordered of results doesn't matter.\n\nIt spawns at most ``poolSize`` threads and applies the ``f`` function.\n\nThe elements in the result stream appears in the unpredicted order.\n\nBecause of CPython\n`GIL `__ it's most\nusefull for I/O or CPU intensive consuming native functions, or on\nJython or IronPython interpreters.\n\n:type f: (T) -> V\n\n:rtype: ``stream``\n\n\\*\\*flatMap(predicate=\\_IDENTITY\\_FUNC)\\*\\*\n:param predicate: is a function that will receive elements of self collection and return an iterable\n''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''\n\nBy default predicate is an identity function\n\n:type predicate: (V)-> collections.Iterable[T]\n\n:return: will return stream of objects of the same type of elements from the stream returned by predicate()\n\nExample:\n\n.. code:: python\n\n stream([[1, 2], [3, 4], [4, 5]]).flatMap().toList() == [1, 2, 3, 4, 4, 5]\n\n**filter(predicate)**\n'''''''''''''''''''''\n\nidentic with builtin filter, but returns stream\n\n**reversed()**\n''''''''''''''\n\nreturns reversed stream\n\n**exists(predicate)**\n'''''''''''''''''''''\n\nTests whether a predicate holds for some of the elements of this\nsequence.\n\n:rtype: bool\n\nExample:\n\n.. code:: python\n\n stream([1, 2, 3]).exists(0) -> False\n stream([1, 2, 3]).exists(1) -> True\n\n\\*\\*keyBy(keyfunc = \\_IDENTITY\\_FUNC)\\*\\*\nTransforms stream of values to a stream of tuples (key, value)\n''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''\n\n:param keyfunc: function to map values to keys\n\n:type keyfunc: (V) -> T\n\n:return: stream of Key, Value pairs\n\n:rtype: stream[( T, V )]\n\nExample:\n\n.. code:: python\n\n stream([1, 2, 3, 4]).keyBy(lambda _:_ % 2) -> [(1, 1), (0, 2), (1, 3), (0, 4)]\n\n**groupBy()**\n'''''''''''''\n\ngroupBy([keyfunc]) -> Make an iterator that returns consecutive keys and\ngroups from the iterable.\n\nThe iterable needs not to be sorted on the same key function, but the\nkeyfunction need to return hasable objects.\n\n:param keyfunc: [Optional] The key is a function computing a key value for each element.\n\n:type keyfunc: (T) -> (V)\n\n:return: (key, sub-iterator) grouped by each value of key(value).\n\n:rtype: stream[ ( V, slist[T] ) ]\n\nExample:\n\n.. code:: python\n\n stream([1, 2, 3, 4]).groupBy(lambda _: _ % 2) -> [(0, [2, 4]), (1, [1, 3])]\n\n**countByValue()**\n''''''''''''''''''\n\nReturns a collections.Counter of values\n\nExample\n\n.. code:: python\n\n stream(['a', 'b', 'a', 'b', 'c', 'd']).countByValue() == {'a': 2, 'b': 2, 'c': 1, 'd': 1}\n\n**distinct()**\n''''''''''''''\n\nReturns stream of distinct values. Values must be hashable.\n\n.. code:: python\n\n stream(['a', 'b', 'a', 'b', 'c', 'd']).distinct() == {'a', 'b', 'c', 'd'}\n\n**reduce(f, init=None)**\n''''''''''''''''''''''''\n\nsame arguments with builtin reduce() function\n\n**toSet()**\n'''''''''''\n\nreturns sset() instance\n\n**toList()**\n''''''''''''\n\nreturns slist() instance\n\n**toMap()**\n'''''''''''\n\nreturns sdict() instance\n\n**sorted(key=None, cmp=None, reverse=False)**\n'''''''''''''''''''''''''''''''''''''''''''''\n\nsame arguments with builtin sorted()\n\n**size()**\n''''''''''\n\nreturns length of stream. Use carefully on infinite streams.\n\n**join(f)**\n'''''''''''\n\nReturns a string joined by f. Proivides same functionality as str.join()\nbuiltin method.\n\nif f is basestring, uses it to join the stream, else f should be a\ncallable that returns a string to be used for join\n\n**mkString(f)**\n'''''''''''''''\n\nidentic with join(f)\n\n**take(n)**\n'''''''''''\n\n::\n\n returns first n elements from stream\n\n**head()**\n''''''''''\n\n::\n\n returns first element from stream\n\n**zip()**\n'''''''''\n\n::\n\n the same behavior with itertools.izip()\n\n\\*\\*unique(predicate=\\_IDENTITY\\_FUNC)\\*\\*\nReturns a stream of unique (according to predicate) elements appearing in the same order as in original stream\n''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''\n\n::\n\n The items returned by predicate should be hashable and comparable.\n\nStatistics related methods\n^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n**entropy()**\n'''''''''''''\n\ncalculates the Shannon entropy of the values from stream\n\n**pstddev()**\n'''''''''''''\n\nCalculates the population standard deviation.\n\n**mean()**\n''''''''''\n\nreturns the arithmetical mean of the values\n\n**sum()**\n'''''''''\n\nreturns the sum of elements from stream\n\n\\*\\*min(key=\\_IDENTITY\\_FUNC)\\*\\*\nsame functionality with builtin min() funcion\n'''''''''''''''''''''''''''''''''''''''''''''\n\n\\*\\*min\\_default(default, key=\\_IDENTITY\\_FUNC)\\*\\*\nsame functionality with min() but returns :default: when called on empty streams\n''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''\n\n**max()**\n'''''''''\n\nsame functionality with builtin max()\n\n\\*\\*maxes(key=\\_IDENTITY\\_FUNC)\\*\\*\nreturns a stream of max values from stream\n''''''''''''''''''''''''''''''''''''''''''\n\n\\*\\*mins(key=\\_IDENTITY\\_FUNC)\\*\\*\nreturns a stream of min values from stream\n''''''''''''''''''''''''''''''''''''''''''\n\nOther classes\n~~~~~~~~~~~~~\n\nslist\n^^^^^\n\nInherits ``streams.stream`` and built-in ``list`` classes, and keeps in\nmemory a list allowing faster index access\n\nsset\n^^^^\n\nInherits ``streams.stream`` and built-in ``set`` classes, and keeps in\nmemory the whole set of values\n\nsdict\n^^^^^\n\nInherits ``streams.stream`` and built-in ``dict``, and keeps in memory\nthe dict object.\n\ndefaultstreamdict\n^^^^^^^^^^^^^^^^^\n\nInherits ``streams.sdict`` and adds functionality of\n``collections.defaultdict`` from stdlib\n\n`Json `__\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n`Json `__ is a\nmodule that provides mapping objects that allow their elements to be\naccessed both as keys and as attributes:\n\n.. code:: python\n\n > from pyxtension.Json import Json\n > a = Json({'foo': 'bar'})\n > a.foo\n 'bar'\n > a['foo']\n 'bar'\n\nAttribute access makes it easy to create convenient, hierarchical\nsettings objects:\n\n.. code:: python\n\n with open('settings.yaml') as fileobj:\n settings = Json(yaml.safe_load(fileobj))\n\n cursor = connect(**settings.db.credentials).cursor()\n\n cursor.execute(\"SELECT column FROM table;\")\n\nBasic Usage\n~~~~~~~~~~~\n\n| Json comes with two different classes, ``Json``, and ``JsonList``.\n| Json is fairly similar to native ``dict`` as it extends it an is a\n mutable mapping that allow creating, accessing, and deleting key-value\n pairs as attributes.\n| ``JsonList`` is similar to native ``list`` as it extends it and offers\n a way to transform the ``dict`` objects from inside also in ``Json``\n instances.\n\nConstruction\n^^^^^^^^^^^^\n\nDirectly from a JSON string\n'''''''''''''''''''''''''''\n\n.. code:: python\n\n > Json('{\"key1\": \"val1\", \"lst1\": [1,2] }')\n {u'key1': u'val1', u'lst1': [1, 2]}\n\nFrom ``tuple``\\ s:\n''''''''''''''''''\n\n.. code:: python\n\n > Json( ('key1','val1'), ('lst1', [1,2]) )\n {'key1': 'val1', 'lst1': [1, 2]}\n # keep in mind that you should provide at least two tuples with key-value pairs\n\nAs a built-in ``dict``\n''''''''''''''''''''''\n\n.. code:: python\n\n > Json( [('key1','val1'), ('lst1', [1,2])] )\n {'key1': 'val1', 'lst1': [1, 2]}\n\n Json({'key1': 'val1', 'lst1': [1, 2]})\n {'key1': 'val1', 'lst1': [1, 2]}\n\nConvert to a ``dict``\n^^^^^^^^^^^^^^^^^^^^^\n\n.. code:: python\n\n > json = Json({'key1': 'val1', 'lst1': [1, 2]})\n > json.toOrig()\n {'key1': 'val1', 'lst1': [1, 2]}\n\nValid Names\n^^^^^^^^^^^\n\nAny key can be used as an attribute as long as:\n\n#. The key represents a valid attribute (i.e., it is a string comprised\n only of\n alphanumeric characters and underscores that doesn't start with a\n number)\n#. The key does not shadow a class attribute (e.g., get).\n\nAttributes vs. Keys\n^^^^^^^^^^^^^^^^^^^\n\n| There is a minor difference between accessing a value as an attribute\n vs.\n| accessing it as a key, is that when a dict is accessed as an\n attribute, it will\n| automatically be converted to a ``Json`` object. This allows you to\n recursively\n| access keys::\n\n.. code:: python\n\n > attr = Json({'foo': {'bar': 'baz'}})\n > attr.foo.bar\n 'baz'\n\n| Relatedly, by default, sequence types that aren't ``bytes``, ``str``,\n or ``unicode``\n| (e.g., ``list``\\ s, ``tuple``\\ s) will automatically be converted to\n ``tuple``\\ s, with any\n| mappings converted to ``Json``:\n\n.. code:: python\n\n > attr = Json({'foo': [{'bar': 'baz'}, {'bar': 'qux'}]})\n > for sub_attr in attr.foo:\n > print(sub_attr.bar)\n 'baz'\n 'qux'\n\n| To get this recursive functionality for keys that cannot be used as\n attributes,\n| you can replicate the behavior by using dict syntax on ``Json``\n object::\n\n\n.. code:: python\n\n > json = Json({1: {'two': 3}})\n > json[1].two\n 3\n\n``JsonList`` usage examples:\n\n.. code:: python\n\n > json = Json('{\"lst\":[1,2,3]}')\n > type(json.lst)\n \n\n > json = Json('{\"1\":[1,2]}')\n > json[\"1\"][1]\n 2\n\nAssignment as keys will still work::\n\n.. code:: python\n\n > json = Json({'foo': {'bar': 'baz'}})\n > json['foo']['bar'] = 'baz'\n > json.foo\n {'bar': 'baz'}\n\nLicense\n~~~~~~~\n\n| pyxtension is released under a GNU Public license.\n| The idea for\n `Json `__\n module was inspired from\n `addict `__ and\n `AttrDict `__,\n| but it has a better performance with lower memory consumption.\n\n.. |build Status| image:: https://travis-ci.org/asuiu/pyxtension.svg?branch=master\n :target: https://travis-ci.org/asuiu/pyxtension\n.. |Coverage Status| image:: https://coveralls.io/repos/asuiu/pyxtension/badge.svg?branch=master&service=github\n :target: https://coveralls.io/github/asuiu/pyxtension?branch=master", "description_content_type": "", "docs_url": "https://pythonhosted.org/pyxtension/", "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/asuiu/pyxtension", "keywords": "", "license": "", "maintainer": "", "maintainer_email": "", "name": "pyxtension", "package_url": "https://pypi.org/project/pyxtension/", "platform": "", "project_url": "https://pypi.org/project/pyxtension/", "project_urls": { "Homepage": "https://github.com/asuiu/pyxtension" }, "release_url": "https://pypi.org/project/pyxtension/1.12.7/", "requires_dist": null, "requires_python": "", "summary": "Extension library for Python", "version": "1.12.7" }, "last_serial": 5893145, "releases": { "1.1": [ { "comment_text": "", "digests": { "md5": "c049275954f4674a8085688843434f20", "sha256": "c986f74853bc4cf9ce4cf67c13160e7dea32b1bacf424880437e11834a78da49" }, "downloads": -1, "filename": "pyxtension-1.11.zip", "has_sig": false, "md5_digest": "c049275954f4674a8085688843434f20", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 24417, "upload_time": "2017-11-06T00:06:20", "url": "https://files.pythonhosted.org/packages/04/de/1f5376c839d60a0a7a8dd4421e7e0b834aaabe9fdd89584d411d1665d890/pyxtension-1.11.zip" } ], "1.1.01": [ { "comment_text": "", "digests": { "md5": "213d206d02f829cdea11ca0f13a69ff1", "sha256": "919ffc35a4f8a59abdacd8f56a12b0a14c96140b5f5f5779472e0e3aa94862c8" }, "downloads": -1, "filename": "pyxtension-1.1.01.tar.gz", "has_sig": false, "md5_digest": "213d206d02f829cdea11ca0f13a69ff1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11071, "upload_time": "2017-11-06T14:53:05", "url": "https://files.pythonhosted.org/packages/e7/29/8e9bf98ae9774b622cd5b2f31faf177b93d1d29242b04e21e1d0413b3ff2/pyxtension-1.1.01.tar.gz" } ], "1.1.03": [ { "comment_text": "", "digests": { "md5": "5d01cc9d61c903d15abceee31a6f8d94", "sha256": "4e4bb21783ec0c0d9735ff661c0afaad68d5d7171330ac2e35c0c2a785ec13da" }, "downloads": -1, "filename": "pyxtension-1.1.03.tar.gz", "has_sig": false, "md5_digest": "5d01cc9d61c903d15abceee31a6f8d94", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 74663, "upload_time": "2017-11-07T17:39:28", "url": "https://files.pythonhosted.org/packages/d7/e2/9bd1155e350d9513c6b960df03017fc7db8657be5d7767903316d2bb3fb9/pyxtension-1.1.03.tar.gz" } ], "1.1.4": [ { "comment_text": "", "digests": { "md5": "7485a30a3823b019d275599343db4804", "sha256": "0be30350e0b5f32ed2e9f47399eb8dfc35bc677f1ce7500c22c538c4a799f997" }, "downloads": -1, "filename": "pyxtension-1.1.4.tar.gz", "has_sig": false, "md5_digest": "7485a30a3823b019d275599343db4804", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 75222, "upload_time": "2017-11-07T21:42:09", "url": "https://files.pythonhosted.org/packages/0b/5d/8d3a88c6007cd524b0ef3eee5998ac1bccafae75c93c4be278049b7ed1e2/pyxtension-1.1.4.tar.gz" } ], "1.1.6": [ { "comment_text": "", "digests": { "md5": "7e895a4888cb59923947df26d9537aee", "sha256": "06a4a69614ccef0deec960818fe49b1d7f783e93dbc523c2f7d7e96215cd906a" }, "downloads": -1, "filename": "pyxtension-1.1.6.tar.gz", "has_sig": false, "md5_digest": "7e895a4888cb59923947df26d9537aee", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 36068, "upload_time": "2018-05-10T17:59:16", "url": "https://files.pythonhosted.org/packages/db/06/3f31088e44d7bfdafd404e974838ab836ec2324a23b7a96ee9be1d829ef9/pyxtension-1.1.6.tar.gz" } ], "1.1.8": [ { "comment_text": "", "digests": { "md5": "fecefd1ef68972d0a5ef7070a5124146", "sha256": "6da7a4ecb09081ddc8fbd783aa074046dccb09f4446dc9ce98095113b619c31c" }, "downloads": -1, "filename": "pyxtension-1.1.8.tar.gz", "has_sig": false, "md5_digest": "fecefd1ef68972d0a5ef7070a5124146", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 39367, "upload_time": "2018-05-20T19:41:07", "url": "https://files.pythonhosted.org/packages/7a/ec/828f072ce1e2562912477e35b614215405e78eda86fefb899eb67834d7fe/pyxtension-1.1.8.tar.gz" } ], "1.12": [ { "comment_text": "", "digests": { "md5": "f64ed298a7eddbc691d33b42a4e81020", "sha256": "d5e079be1835d79536e1a5378ec4b044d5af0e537c8cfa67bfb76812b930e2eb" }, "downloads": -1, "filename": "pyxtension-1.12.zip", "has_sig": false, "md5_digest": "f64ed298a7eddbc691d33b42a4e81020", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 51460, "upload_time": "2019-03-31T13:15:53", "url": "https://files.pythonhosted.org/packages/f9/4b/8b7ecdf02ba753b9cc7c15396fde27b8ece8d4291fbcd7687960e1d1fcbf/pyxtension-1.12.zip" } ], "1.12.1": [ { "comment_text": "", "digests": { "md5": "ebe85f2e8556b76b8203b5646d676dc7", "sha256": "4d8cbdce38c5d8ca52ba6e6493dfe175f5643d60ca6ff5230333588714c4872e" }, "downloads": -1, "filename": "pyxtension-1.12.1.tar.gz", "has_sig": false, "md5_digest": "ebe85f2e8556b76b8203b5646d676dc7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 25505, "upload_time": "2019-05-14T17:13:17", "url": "https://files.pythonhosted.org/packages/b6/b2/5e49ed2a612f7aa9fe41bd5bbcb810ccda029e7f7b4d1377059bd36aeb2c/pyxtension-1.12.1.tar.gz" } ], "1.12.2": [ { "comment_text": "", "digests": { "md5": "f8ea770b2a917edd8062b303f71dd98c", "sha256": "ce302b1b36dfd5053376784ff64ea120b464d9269fee3990b64669832b74071b" }, "downloads": -1, "filename": "pyxtension-1.12.2.tar.gz", "has_sig": false, "md5_digest": "f8ea770b2a917edd8062b303f71dd98c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 25515, "upload_time": "2019-05-15T18:06:46", "url": "https://files.pythonhosted.org/packages/f0/e2/0696dfb3a279579be8d9855c857b37ada73e55cc273d072ad99ab74300fd/pyxtension-1.12.2.tar.gz" } ], "1.12.3": [ { "comment_text": "", "digests": { "md5": "70893e311a48432bd4743f01acfa9391", "sha256": "5a80560f415665cd0e5a5562119bb46e3252546e2f9815f0e57d7a0639834e2f" }, "downloads": -1, "filename": "pyxtension-1.12.3-py3-none-any.whl", "has_sig": false, "md5_digest": "70893e311a48432bd4743f01acfa9391", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 19624, "upload_time": "2019-09-22T00:16:31", "url": "https://files.pythonhosted.org/packages/6c/12/02d7a1dbb5f851f4b89e965bfbc787d7a194fe1e30f6b6d8481bada96f46/pyxtension-1.12.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "162dcfdd68186dbb292c8ab9d0a6015e", "sha256": "410d03cd5c0a3fd7d897aaab99e41f7a3c93c7f0f09bf696fc4dd7f582b6136c" }, "downloads": -1, "filename": "pyxtension-1.12.3.tar.gz", "has_sig": false, "md5_digest": "162dcfdd68186dbb292c8ab9d0a6015e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 29919, "upload_time": "2019-09-22T00:16:33", "url": "https://files.pythonhosted.org/packages/1c/41/65ede89dd0476a1f6ef5a2ba0b6023204440ad92944108a75dece5c2bb5c/pyxtension-1.12.3.tar.gz" } ], "1.12.4": [ { "comment_text": "", "digests": { "md5": "006b2e56426ee386013d8b6a953fd892", "sha256": "e0276c389a6242b018765540ab035ef0aff80295196a7dda96334e0bd4918f6c" }, "downloads": -1, "filename": "pyxtension-1.12.4.tar.gz", "has_sig": false, "md5_digest": "006b2e56426ee386013d8b6a953fd892", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 27598, "upload_time": "2019-09-22T09:34:51", "url": "https://files.pythonhosted.org/packages/4a/8d/d8d5936e4ee51f2f172bb8cfb79d4886b3ae62bf0a5c8ec2516f61e71d43/pyxtension-1.12.4.tar.gz" } ], "1.12.5": [ { "comment_text": "", "digests": { "md5": "d5d00c833ddffe69f3b7c6100a769657", "sha256": "ec2005e397e9353363e255f5b65863d0566ef05f2f92d531c9494cff1e81590a" }, "downloads": -1, "filename": "pyxtension-1.12.5.tar.gz", "has_sig": false, "md5_digest": "d5d00c833ddffe69f3b7c6100a769657", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 27696, "upload_time": "2019-09-22T12:54:09", "url": "https://files.pythonhosted.org/packages/40/d3/76eddb1926419d82dc11fec17ea2071ae6aeb170738c0661826bb67acc57/pyxtension-1.12.5.tar.gz" } ], "1.12.6": [ { "comment_text": "", "digests": { "md5": "54f3b6bbed6fe065ff2e9596c4f179bc", "sha256": "6a122b2353b74bde13565b954d7aa3848f63d9e20b5899a4b1da2f36f2acb6d6" }, "downloads": -1, "filename": "pyxtension-1.12.6.tar.gz", "has_sig": false, "md5_digest": "54f3b6bbed6fe065ff2e9596c4f179bc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 27733, "upload_time": "2019-09-22T14:21:48", "url": "https://files.pythonhosted.org/packages/f4/30/d61154f12203939b6ec14de4a793f44b22a9bdf06565d198f33496d439ff/pyxtension-1.12.6.tar.gz" } ], "1.12.7": [ { "comment_text": "", "digests": { "md5": "dfa75111b0bceae0bd9edf644700704f", "sha256": "cd5197396ca3b4f44cd11ed91089cddcaee36847511e5946109c38961e0d235b" }, "downloads": -1, "filename": "pyxtension-1.12.7.tar.gz", "has_sig": false, "md5_digest": "dfa75111b0bceae0bd9edf644700704f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 31685, "upload_time": "2019-09-26T22:55:36", "url": "https://files.pythonhosted.org/packages/fa/c4/4629fac64d552f96a585eaeff3533990e0775aa79f16ab966b74d58ad582/pyxtension-1.12.7.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "dfa75111b0bceae0bd9edf644700704f", "sha256": "cd5197396ca3b4f44cd11ed91089cddcaee36847511e5946109c38961e0d235b" }, "downloads": -1, "filename": "pyxtension-1.12.7.tar.gz", "has_sig": false, "md5_digest": "dfa75111b0bceae0bd9edf644700704f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 31685, "upload_time": "2019-09-26T22:55:36", "url": "https://files.pythonhosted.org/packages/fa/c4/4629fac64d552f96a585eaeff3533990e0775aa79f16ab966b74d58ad582/pyxtension-1.12.7.tar.gz" } ] }