{ "info": { "author": "Thomas Aglassinger", "author_email": "roskakori@users.sourceforge.net", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Environment :: Plugins", "Intended Audience :: Developers", "License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL)", "Natural Language :: English", "Operating System :: OS Independent", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Topic :: Internet :: WWW/HTTP :: Dynamic Content", "Topic :: Software Development :: Libraries", "Topic :: Text Processing :: Markup :: XML" ], "description": "loxun is a Python module to write large output in XML using Unicode and\nnamespaces. Of course you can also use it for small XML output with plain 8\nbit strings and no namespaces.\n\nloxun's features are:\n\n* **small memory foot print**: the document is created on the fly by writing to\n an output stream, no need to keep all of it in memory.\n\n* **easy to use namespaces**: simply add a namespace and refer to it using the\n standard ``namespace:tag`` syntax.\n\n* **mix unicode and io.BytesIO**: pass both unicode or plain 8 bit strings to any\n of the methods. Internally loxun converts them to unicode, so once a\n parameter got accepted by the API you can rely on it not causing any\n messy ``UnicodeError`` trouble.\n\n* **automatic escaping**: no need to manually handle special characters such\n as ``<`` or ``&`` when writing text and attribute values.\n\n* **robustness**: while you write the document, sanity checks are performed on\n everything you do. Many silly mistakes immediately result in an\n ``XmlError``, for example missing end elements or references to undeclared\n namespaces.\n\n* **open source**: distributed under the GNU Lesser General Public License 3\n or later.\n\nHere is a very basic example. First you have to create an output stream. In\nmany cases this would be a file, but for the sake of simplicity we use a\n``io.BytesIO`` here:\n\n >>> from __future__ import unicode_literals\n >>> import io\n >>> out = io.BytesIO()\n\nThen you can create an `XmlWriter` to write to this output:\n\n >>> xml = XmlWriter(out)\n\nNow write the content:\n\n >>> xml.addNamespace(\"xhtml\", \"http://www.w3.org/1999/xhtml\")\n >>> xml.startTag(\"xhtml:html\")\n >>> xml.startTag(\"xhtml:body\")\n >>> xml.text(\"Hello world!\")\n >>> xml.tag(\"xhtml:img\", {\"src\": \"smile.png\", \"alt\": \":-)\"})\n >>> xml.endTag()\n >>> xml.endTag()\n >>> xml.close()\n\nAnd the result is:\n\n >>> print out.getvalue().rstrip(\"\\r\\n\")\n \n \n \n Hello world!\n \n \n \n\nWriting a simple document\n=========================\n\nThe following example creates a very simple XHTML document.\n\nTo make it simple, the output goes to a ``BytesIO``, but you could also use\na binary file that has been created using ``io.open(filename, \"wb\")``.\n\n >>> from __future__ import unicode_literals\n >>> import io\n >>> out = io.BytesIO()\n\nFirst create an `XmlWriter` to write the XML code to the specified output:\n\n >>> xml = XmlWriter(out)\n\nThis automatically adds the XML prolog:\n\n >>> print out.getvalue().rstrip(\"\\r\\n\")\n \n\nNext add the ```` start tag:\n\n >>> xml.startTag(\"html\")\n\nNow comes the . To pass attributes, specify them in a dictionary.\nSo in order to add::\n\n \n\nuse:\n\n >>> xml.startTag(\"body\", {\"id\": \"top\"})\n\nLet' add a little text so there is something to look at:\n\n >>> xml.text(\"Hello world!\")\n\nWrap it up: close all elements and the document.\n\n >>> xml.endTag()\n >>> xml.endTag()\n >>> xml.close()\n\nAnd this is what we get:\n\n >>> print out.getvalue().rstrip(\"\\r\\n\")\n \n \n \n Hello world!\n \n \n\nSpecifying attributes\n\nFirst create a writer:\n\n >>> import io\n >>> out = io.BytesIO()\n >>> xml = XmlWriter(out)\n\nNow write the content:\n\n >>> xml.tag(\"img\", {\"src\": \"smile.png\", \"alt\": \":-)\"})\n\nAttribute values do not have to be strings, other types will be converted to\nUnicode using Python's ``unicode()`` function:\n\n >>> xml.tag(\"img\", {\"src\": \"wink.png\", \"alt\": \";-)\", \"width\": 32, \"height\": 24})\n\nAnd the result is:\n\n >>> print out.getvalue().rstrip(\"\\r\\n\")\n \n \":-)\"\n \";-)\"\n\nUsing namespaces\n================\n\nNow the same thing but with a namespace. First create the prolog\nand header like above:\n\n >>> out = io.BytesIO()\n >>> xml = XmlWriter(out)\n\nNext add the namespace:\n\n >>> xml.addNamespace(\"xhtml\", \"http://www.w3.org/1999/xhtml\")\n\nNow elements can use qualified tag names using a colon (:) to separate\nnamespace and tag name:\n\n >>> xml.startTag(\"xhtml:html\")\n >>> xml.startTag(\"xhtml:body\")\n >>> xml.text(\"Hello world!\")\n >>> xml.endTag()\n >>> xml.endTag()\n >>> xml.close()\n\nAs a result, tag names are now prefixed with \"xhtml:\":\n\n >>> print out.getvalue().rstrip(\"\\r\\n\")\n \n \n \n Hello world!\n \n \n\nWorking with non ASCII characters\n=================================\n\nSometimes you want to use characters outside the ASCII range, for example\nGerman Umlauts, the Euro symbol or Japanese Kanji. The easiest and performance\nwise best way is to use Unicode strings. For example:\n\n >>> import io\n >>> out = io.BytesIO()\n >>> xml = XmlWriter(out, prolog=False)\n >>> xml.text(u\"The price is \\u20ac 100\") # Unicode of Euro symbol\n >>> out.getvalue().rstrip(\"\\r\\n\")\n 'The price is \\xe2\\x82\\xac 100'\n\nNotice the \"u\" before the string passed to `XmlWriter.text()`, it declares the\nstring to be a unicode string that can hold any character, even those that are\nbeyond the 8 bit range.\n\nAlso notice that in the output the Euro symbol looks very different from the\ninput. This is because the output encoding is UTF-8 (the default), which\nhas the advantage of keeping all ASCII characters the same and turning any\ncharacters with a code of 128 or more into a sequence of 8 bit bytes that\ncan easily fit into an output stream to a binary file or ``io.BytesIO``.\n\nIf you have to stick to classic 8 bit string parameters, loxun attempts to\nconvert them to unicode. By default it assumes ASCII encoding, which does\nnot work out as soon as you use a character outside the ASCII range:\n\n >>> import io\n >>> out = io.BytesIO()\n >>> xml = XmlWriter(out, prolog=False)\n >>> xml.text(\"The price is \\xa4 100\") # ISO-8859-15 code of Euro symbol\n Traceback (most recent call last):\n ...\n UnicodeDecodeError: 'ascii' codec can't decode byte 0xa4 in position 13: ordinal not in range(128)\n\nIn this case you have to tell the writer the encoding you use by specifying\nthe the ``sourceEncoding``:\n\n >>> import io\n >>> out = io.BytesIO()\n >>> xml = XmlWriter(out, prolog=False, sourceEncoding=\"iso-8859-15\")\n\nNow everything works out again:\n\n >>> xml.text(\"The price is \\xa4 100\") # ISO-8859-15 code of Euro symbol\n >>> out.getvalue().rstrip(\"\\r\\n\")\n 'The price is \\xe2\\x82\\xac 100'\n\nOf course in practice you will not mess around with hex codes to pass your\ntexts. Instead you just specify the source encoding using the mechanisms\ndescribed in PEP 263,\n`Defining Python Source Code Encodings `_.\n\nPretty printing and indentation\n===============================\n\nBy default, loxun starts a new line for each ``startTag`` and indents the\ncontent with two spaces. You can change the spaces to any number of spaces and\ntabs you like:\n\n >>> out = io.BytesIO()\n >>> xml = XmlWriter(out, indent=\" \") # <-- Indent with 4 spaces.\n >>> xml.startTag(\"html\")\n >>> xml.startTag(\"body\")\n >>> xml.text(\"Hello world!\")\n >>> xml.endTag()\n >>> xml.endTag()\n >>> xml.close()\n >>> print out.getvalue().rstrip(\"\\r\\n\")\n \n \n \n Hello world!\n \n \n\nYou can disable pretty printing all together using ``pretty=False``, resulting\nin an output of a single large line:\n\n >>> out = io.BytesIO()\n >>> xml = XmlWriter(out, pretty=False) # <-- Disable pretty printing.\n >>> xml.startTag(\"html\")\n >>> xml.startTag(\"body\")\n >>> xml.text(\"Hello world!\")\n >>> xml.endTag()\n >>> xml.endTag()\n >>> xml.close()\n >>> print out.getvalue().rstrip(\"\\r\\n\")\n Hello world!\n\nChanging the XML prolog\n=======================\n\nWhen you create a writer, it automatically write an XML prolog\nprocessing instruction to the output. This is what the default prolog\nlooks like:\n\n >>> import io\n >>> out = io.BytesIO()\n >>> xml = XmlWriter(out)\n >>> print out.getvalue().rstrip(\"\\r\\n\")\n \n\nYou can change the version or encoding:\n\n >>> out = io.BytesIO()\n >>> xml = XmlWriter(out, encoding=u\"ascii\", version=u\"1.1\")\n >>> print out.getvalue().rstrip(\"\\r\\n\")\n \n\nTo completely omit the prolog, set the parameter ``prolog=False``:\n\n >>> out = io.BytesIO()\n >>> xml = XmlWriter(out, prolog=False)\n >>> out.getvalue()\n ''\n\nAdding other content\n====================\n\nApart from text and tags, XML provides a few more things you can add to\ndocuments. Here's an example that shows how to do it with loxun.\n\nFirst, create a writer:\n\n >>> import io\n >>> out = io.BytesIO()\n >>> xml = XmlWriter(out)\n\nLet's add a document type definition:\n\n >>> xml.raw(\"\")\n >>> xml.newline()\n\nNotice that loxun uses the generic `XmlWriter.raw()` for that, which allows to\nadd any content without validation or escaping. You can do all sorts of nasty\nthings with ``raw()`` that will result in invalid XML, but this is one of its\nreasonable uses.\n\nNext, let's add a comment:\n\n >>> xml.comment(\"Show case some rarely used XML constructs\")\n\nHere is a processing instruction:\n\n >>> xml.processingInstruction(\"xml-stylesheet\", \"href=\\\"default.css\\\" type=\\\"text/css\\\"\")\n\nAnd finally a CDATA section:\n\n >>> xml.cdata(\">> this will not be parsed <<\")\n\nAnd the result is:\n\n >>> print out.getvalue().rstrip(\"\\r\\n\")\n \n \n \n \n > this will not be parsed <<]]>\n\n\nOptimization\n============\n\nLoxun automatically optimized pairs of empty start/end tags. For example:\n\n >>> out = io.BytesIO()\n >>> xml = XmlWriter(out)\n >>> xml.startTag(\"customers\")\n >>> xml.startTag(\"person\", {\"id\": \"12345\", \"name\": \"Doe, John\"})\n >>> xml.endTag(\"person\") # without optimization, this would add .\n >>> xml.endTag()\n >>> xml.close()\n >>> print out.getvalue().rstrip(\"\\r\\n\")\n \n \n \n \n\nDespite the explicit ``startTag(\"person\")`` and matching ``endtag()``, the\noutput only contains a simple ```` tag.\n\nContributing\n------------\n\nIf you want to help improve loxun, you can access the source code at\n.\n\nFuture\n======\n\nCurrently loxun does what it was built for.\n\nThere are is no real plans to improve it in the near future, but here is a list\nof features that might be added at some point:\n\n* Add validation of tag and attribute names to ensure that all characters used\n are allowed. For instance, currently loxun does not complain about a tag\n named \"a#b*c$d_\".\n* Raise an `XmlError` when namespaces are added with attributes instead of\n `XmlWriter.addNamespace()`.\n* Logging support to simplify debugging of the calling code. Probably\n `XmlWriter` would get a property ``logger`` which is a standard\n ``logging.Logger``. By default it could log original exceptions that\n loxun turns into an `XmlError` and namespaces opened and closed.\n Changing it to ``logging.DEBUG`` would log each tag and XML construct\n written, including additional information about the internal tag stack.\n That way you could dynamically increase or decrease logging output.\n* Rethink pretty printing. Instead of a global property that can only be set\n when initializing an `XmlWriter`, it could be a optional parameter for\n `XmlWriter.startTag()` where it could be turned on and off as needed. And\n the property could be named ``literal`` instead of ``pretty`` (with an\n inverse logic).\n* Add a ``DomWriter`` that creates a ``xml.dom.minidom.Document``.\n\nSome features other XML libraries support but I never saw any real use for:\n\n* Specify attribute order for tags.\n\nVersion history\n===============\n\nVersion 2.0, 2014-07-28\n\n* Added support for Python 3.2+ while retaining the option to run with\n Python 2.6+ (issue #5; thanks go to `Stefan Schwarzer`_ who offered his\n guidance during a \"Python 2 to 3\" sprint at EuroPython 2014).\n* Dropped support for Python 2.5, keep using loxun 1.3 if you are stuck\n with with this version.\n\n.. _Stefan Schwarzer: http://www.sschwarzer.net\n\nVersion 1.3, 2012-01-01\n\n* Added ``endTags()`` to close several or all open tags (issue #3,\n contributed by Anton Kolechkin).\n* Added ``ChainXmlWriter`` which is similar to ``XmlWriter`` and allows to\n chain methods for more concise source code (issue #3, contributed by Anton\n Kolechkin).\n\nVersion 1.2, 2011-03-12\n\n* Fixed ``AttributeError`` when ``XmlWriter(..., encoding=...)`` was set.\n\nVersion 1.1, 08-Jan-2011\n\n* Fixed ``AssertionError`` when ``pretty`` was set to ``False``\n (issue #1; fixed by David Cramer).\n\nVersion 1.0, 11-Oct-2010\n\n* Added support for Python's ``with`` so you don not have to manually call\n `XmlWriter.close()` anymore.\n* Added Git repository at .\n\nVersion 0.8, 11-Jul-2010\n\n* Added possibility to pass attributes to `XmlWriter.startTag()` and\n `XmlWriter.tag()` with values that have other types than ``str`` or\n ``unicode``. When written to XML, the value is converted using Python's\n built-in ``unicode()`` function.\n* Added a couple of files missing from the distribution, most important the\n test suite.\n\nVersion 0.7, 03-Jul-2010\n\n* Added optimization of matching start and end tag without any content in\n between. For example, ``x.startTag(\"some\"); x.endTag()`` results in\n ```` instead of ````.\n* Fixed handling of unknown name spaces. They now raise an `XmlError` instead\n of ``ValueError``.\n\nVersion 0.6, 03-Jun-2010\n\n* Added option ``indent`` to specify the indentation text each new line starts with.\n* Added option ``newline`` to specify how lines written should end.\n* Fixed that `XmlWriter.tag()` did not remove namespaces declared immediately\n before it.\n* Cleaned up documentation.\n\nVersion 0.5, 25-May-2010\n\n* Fixed typo in namespace attribute name.\n* Fixed adding of namespaces before calls to `XmlWriter.tag()` which resulted\n in an `XmlError`.\n\nVersion 0.4, 21-May-2010\n\n* Added option ``sourceEncoding`` to simplify processing of classic strings.\n The manual section \"Working with non ASCII characters\" explains how to use\n it.\n\nVersion 0.3, 17-May-2010\n\n* Added scoped namespaces which are removed automatically by\n `XmlWriter.endTag()`.\n* Changed ``text()`` to normalize newlines and white space if pretty printing\n is enabled.\n* Moved writing of XML prolog to the constructor and removed\n ``XmlWriter.prolog()``. To omit the prolog, specify ``prolog=False`` when\n creating the `XmlWriter`. If you later want to write the prolog yourself,\n use `XmlWriter.processingInstruction()`.\n* Renamed ``*Element()`` to ``*Tag`` because they really only write tags, not\n whole elements.\n\nVersion 0.2, 16-May-2010\n\n* Added `XmlWriter.comment()`, `XmlWriter.cdata()` and\n `XmlWriter.processingInstruction()` to write these specific XML constructs.\n* Added indentation and automatic newline to text if pretty printing is\n enabled.\n* Removed newline from prolog in case pretty printing is disabled.\n* Fixed missing \"?\" in prolog.\n\nVersion 0.1, 15-May-2010\n\n* Initial release.", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://pypi.python.org/pypi/loxun/", "keywords": "xml output stream large big huge namespace unicode memory footprint", "license": "GNU Lesser General Public License 3 or later", "maintainer": null, "maintainer_email": null, "name": "loxun", "package_url": "https://pypi.org/project/loxun/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/loxun/", "project_urls": { "Download": "UNKNOWN", "Homepage": "http://pypi.python.org/pypi/loxun/" }, "release_url": "https://pypi.org/project/loxun/2.0/", "requires_dist": null, "requires_python": null, "summary": "large output in XML using unicode and namespaces", "version": "2.0" }, "last_serial": 1171404, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "81b969194f37367887a141087b3c02f7", "sha256": "9cc94b085f8a40f85085bc5415dec4d9f321505c08b5358ac6a790c87ac8cafa" }, "downloads": -1, "filename": "loxun-0.1.zip", "has_sig": false, "md5_digest": "81b969194f37367887a141087b3c02f7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8344, "upload_time": "2010-05-15T08:27:07", "url": "https://files.pythonhosted.org/packages/02/de/c95bec7f7d7080731bdb4e9f2fc79966c41d795427d899afe4cb5c4b900a/loxun-0.1.zip" } ], "0.2": [ { "comment_text": "", "digests": { "md5": "05236d1373c04431b8334df0dcdaad8c", "sha256": "b5c97a9d85be86e4585703e6d1d1bff94836060ca0668340354091304258b841" }, "downloads": -1, "filename": "loxun-0.2.zip", "has_sig": false, "md5_digest": "05236d1373c04431b8334df0dcdaad8c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10266, "upload_time": "2010-05-16T10:07:39", "url": "https://files.pythonhosted.org/packages/e6/7b/e6d3e2af212ed01d59aec6875f5b89809a635f280913d26571285dad2749/loxun-0.2.zip" } ], "0.3": [ { "comment_text": "", "digests": { "md5": "5346fff2b4ba32f8a4e5123442b7dc55", "sha256": "e2439a2faa18d435c68f969a7d6d866cdbc7ddb3ece3be782bf0abf0ed80d2bd" }, "downloads": -1, "filename": "loxun-0.3.zip", "has_sig": false, "md5_digest": "5346fff2b4ba32f8a4e5123442b7dc55", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12167, "upload_time": "2010-05-17T00:57:55", "url": "https://files.pythonhosted.org/packages/26/06/6d4018bf5ba3e32092f5aa15fbdb6ddde0504f8a034c26ec7e617a3b1f70/loxun-0.3.zip" } ], "0.4": [ { "comment_text": "", "digests": { "md5": "f1346ea656f472ed9016948b7dba4eae", "sha256": "959f295ff37f42a905639fc9276643d2c357d1ab59b2dcf724e89537132a0081" }, "downloads": -1, "filename": "loxun-0.4.zip", "has_sig": false, "md5_digest": "f1346ea656f472ed9016948b7dba4eae", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13895, "upload_time": "2010-05-21T19:53:36", "url": "https://files.pythonhosted.org/packages/b4/eb/826d62242b9834df9aad092006d4878362a69f45b506d62bc9a20b135402/loxun-0.4.zip" } ], "0.5": [ { "comment_text": "", "digests": { "md5": "0a1d7efadfa86ebb555cc0f7aca431f7", "sha256": "1b04770b816f409bc96343c1f89e8107a731ed601fec2c46e1249ab561ddcb25" }, "downloads": -1, "filename": "loxun-0.5.zip", "has_sig": false, "md5_digest": "0a1d7efadfa86ebb555cc0f7aca431f7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14031, "upload_time": "2010-05-25T18:26:37", "url": "https://files.pythonhosted.org/packages/5b/db/a1c5df305cdabd47841bcbf8e18d77ce886c25301344dbe8eac889823808/loxun-0.5.zip" } ], "0.6": [ { "comment_text": "", "digests": { "md5": "4a24f070e6fd5e8f5ee42a1901f93ead", "sha256": "c49283a80d9027e3a11e3414888c5ead64616090a82fd0c17a7f6145afc8aa03" }, "downloads": -1, "filename": "loxun-0.6.zip", "has_sig": false, "md5_digest": "4a24f070e6fd5e8f5ee42a1901f93ead", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15620, "upload_time": "2010-06-03T20:42:32", "url": "https://files.pythonhosted.org/packages/ab/a8/f073bcbe203f296605a9e78f858c66b305c8863595a4e6d6055838587549/loxun-0.6.zip" } ], "0.7": [ { "comment_text": "", "digests": { "md5": "214995b698a94595a741d719c624b143", "sha256": "6826677349f77fab00b145788fa658b46585345290e3fac39302f051ba1d86c3" }, "downloads": -1, "filename": "loxun-0.7.zip", "has_sig": false, "md5_digest": "214995b698a94595a741d719c624b143", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16787, "upload_time": "2010-07-03T17:12:55", "url": "https://files.pythonhosted.org/packages/4e/2f/3f6e51708fff178ac4d6d089a8b400df5633bbb9aacefcbfa43f08feab1e/loxun-0.7.zip" } ], "0.8": [ { "comment_text": "", "digests": { "md5": "a0b0891c0f47cf638727302fa76491f2", "sha256": "fd6f7f4508225024cef888e6e68fce7143c75271e913bce89306b0dc315ca520" }, "downloads": -1, "filename": "loxun-0.8.zip", "has_sig": false, "md5_digest": "a0b0891c0f47cf638727302fa76491f2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 24457, "upload_time": "2010-07-11T15:03:24", "url": "https://files.pythonhosted.org/packages/17/a3/a9a828db2cb8ca8fb1a81deb9f1eef0544a507ad360d4ff865685dc6b938/loxun-0.8.zip" } ], "1.0": [ { "comment_text": "", "digests": { "md5": "7f0f316613d8c5a65f2a91852c1f3d09", "sha256": "4f07aba993662b45f42fb538ce365d27035c4e199b6a366d382eb68bfd9fd05b" }, "downloads": -1, "filename": "loxun-1.0.zip", "has_sig": false, "md5_digest": "7f0f316613d8c5a65f2a91852c1f3d09", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 25431, "upload_time": "2010-10-11T21:06:45", "url": "https://files.pythonhosted.org/packages/6f/8c/8f2eba191e8b1f394e2b1be3ba171265e9726a26e06723af53222a0f36d7/loxun-1.0.zip" } ], "1.1": [ { "comment_text": "", "digests": { "md5": "6b36324b705995e516c0534749addd22", "sha256": "781deb3c46010a69a05b49f4dffeb188490dfa45737f848027eb9190c8c8935f" }, "downloads": -1, "filename": "loxun-1.1.zip", "has_sig": false, "md5_digest": "6b36324b705995e516c0534749addd22", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26220, "upload_time": "2011-01-08T11:16:58", "url": "https://files.pythonhosted.org/packages/f9/a0/cb7aa1619a1cef58c4fe465bccb4a32818aa6704299cb67c435a7e91b9bf/loxun-1.1.zip" } ], "1.2": [ { "comment_text": "", "digests": { "md5": "a7efaf829e070cdd015ef233abcd7942", "sha256": "9fbac53738355724593aa8dc6b582ae57b910a3ee1889c3f34451215912e0ab4" }, "downloads": -1, "filename": "loxun-1.2.zip", "has_sig": false, "md5_digest": "a7efaf829e070cdd015ef233abcd7942", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26295, "upload_time": "2011-03-12T23:20:43", "url": "https://files.pythonhosted.org/packages/23/f9/b8091706fd78331e2205717ceef86661c87bdb6903e1fc7e0058e736fb79/loxun-1.2.zip" } ], "1.3": [ { "comment_text": "", "digests": { "md5": "a5a58d2c331c2f286d87d8217f54312c", "sha256": "27c9707791992595685bce549daec309f97dd4983aaac0dd6983882c9bbfa3db" }, "downloads": -1, "filename": "loxun-1.3.zip", "has_sig": false, "md5_digest": "a5a58d2c331c2f286d87d8217f54312c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 27198, "upload_time": "2012-01-01T09:28:55", "url": "https://files.pythonhosted.org/packages/38/13/9bdaf065dba433b40356c49597fd012fd20752747bf62d23f51542f729fc/loxun-1.3.zip" } ], "2.0": [ { "comment_text": "", "digests": { "md5": "58575afc9bf1ec58f6dd9e2ca3f41641", "sha256": "9f90d4aa3ff21946555492132a1e51e284a6aab2ed6d2ded7d85d82826c1e5e7" }, "downloads": -1, "filename": "loxun-2.0.zip", "has_sig": false, "md5_digest": "58575afc9bf1ec58f6dd9e2ca3f41641", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 27836, "upload_time": "2014-07-28T06:35:08", "url": "https://files.pythonhosted.org/packages/70/ec/dde8dc534ac957ce422bd21b5566eb6216b3c579e13b98dd464d67d549db/loxun-2.0.zip" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "58575afc9bf1ec58f6dd9e2ca3f41641", "sha256": "9f90d4aa3ff21946555492132a1e51e284a6aab2ed6d2ded7d85d82826c1e5e7" }, "downloads": -1, "filename": "loxun-2.0.zip", "has_sig": false, "md5_digest": "58575afc9bf1ec58f6dd9e2ca3f41641", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 27836, "upload_time": "2014-07-28T06:35:08", "url": "https://files.pythonhosted.org/packages/70/ec/dde8dc534ac957ce422bd21b5566eb6216b3c579e13b98dd464d67d549db/loxun-2.0.zip" } ] }