{ "info": { "author": "Jeff Rush", "author_email": "jeff@taupro.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 2 - Pre-Alpha", "Intended Audience :: Developers", "License :: OSI Approved :: GNU General Public License (GPL)", "Operating System :: OS Independent", "Programming Language :: Python", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "=====================\n General Information\n=====================\n\n.. include:: \n\n.. sidebar:: A Brief Historical Note\n :subtitle: Is this software part of Project Xanadu\\ |trade|?\n\n `Project Xanadu`_\\ |trade| is a trademark and project of `Ted Nelson`_.\n This software is an independent derivation from the C source of the Xanadu\\\n |trade| 88.1 version (renamed to `Udanax Green`_) of that project,\n simplified by taking advantage of the power of Python in representing\n tuples and infinite-precision integers. Tumblers are a generally useful\n tool.\n\n .. _`Project Xanadu`: http://www.xanadu.com/\n .. _`Ted Nelson`: http://en.wikipedia.org/wiki/Ted_Nelson\n .. _`Udanax Green`: http://www.udanax.com/green/index.html\n\n.. contents::\n\n\nSetting Up for Development\n**************************\n\n::\n\n $ svn co https://www.taupro.com/pubsvn/Projects/Xanalogica/xanalogica.tumbler/trunk xanalogica.tumbler\n $ cd xanalogica.tumbler\n $ python2.5 bootstrap.py\n $ bin/buildout\n $ bin/test\n\nAbstract\n********\n\nThe xanalogica.tumbler package implements a basic one-dimensional coordinate\ntype for xanalogical storage systems. It is useful as keys in mappings and\nB-trees, including xanalogical enfilades. It is written purely in Python but\nthere are old versions written in C that may be resurrected as 'cTumbler' if\nmore performance is needed.\n\n.. epigraph::\n\n Our Kingdom is already twice the size of Spain, and every day we drift\n makes it bigger.\n\n -- The Kaiser in Werner Herzog's film, \"Aguirre, The Wrath of God\"\n\nTheory of Operation\n*******************\n\nConceptual Overview\n===================\n\nA tumbler is an element of a coordinate system laid out along a number line,\nacting as forking multipart integers representing an unbounded, countable but\nfinite address space. You've seen them in the numbering of an outline, as\nversioning notation or the Dewey Decimal System. Mathematically they are\nrelated to a field of study called \"transfinite arithmetic\".\n\nTumbler addressing is about storage management; the spontaneous creation of\nplaces at which to put things, and to symbolically reference those locations\nas individual points or ranges of points.\n\nSome are the advantages of tumblers are:\n\n 1. There is always a tumbler between two different tumblers, so insertions\n never require renumbering.\n\n 2. A set of tumblers can be ordered.\n\n 3. The tumblers can be arranged to form a hierarchy, making it easy to\n specify all tumblers that start with a shorter tumbler. This is used in\n the Xanadu green system for queries like \"all documents of this\n user\". This is also useful for delegating assignment authority, in the\n manner of the Domain Name System (DNS) of the Internet.\n\n 4. Arithmetic can be done with tumblers. Specifically addition and\n subtraction, making it possible to compute ranges with tumblers.\n\n.. sidebar:: Whence Humbers?\n :subtitle: Leveraging Python in Providing Humungous Numbers\n\n In Ted Nelson's book, **Literary Machines**, mention is made of Humbers,\n which stand for *humungous numbers*. In the book they are used to\n efficiently represent integers of unbounded magnitudes, as digits within a\n tumbler. The Python language comes with a similar datatype called 'longs',\n which can represent such large integers. And in Python 2.1 and later, the\n language automatically converts traditional 'ints' to 'longs', as needed.\n\nYour Basic Tumbler\n==================\n\nTumblers are implemented as a subclass of tuple, with certain arithmetic\nproperties of integers. Being derived from tuples, tumblers are immutable.\n\nRepresentation\n--------------\n\nIn Project Xanadu\\|trade| tumblers are represented as a series of (unsigned)\nintegers, separated by decimal points. Since this syntax is not possible in\nthe native Python syntax, a choice of two forms is provided, either a\ndotted-digits string, or a comma-delimited tuple.\n\n >>> from xanalogica.tumbler import Tumbler\n\n >>> Tumbler('1')\n Tumbler(1)\n\n >>> Tumbler('1.2')\n Tumbler(1,2)\n\n >>> Tumbler('1.2.3')\n Tumbler(1,2,3)\n\n >>> Tumbler(\"1.1.0.3.1.0.3\")\n Tumbler(1,1,0,3,1,0,3)\n\n >>> Tumbler(1,1,0,3,1,0,3)\n Tumbler(1,1,0,3,1,0,3)\n\n >>> str(Tumbler(1,1,0,3,1,0,3))\n '1.1.0.3.1.0.3'\n\n >>> str(Tumbler('1'))\n '1'\n\n >>> str(Tumbler('1.2'))\n '1.2'\n\n >>> str(Tumbler('1.2.3'))\n '1.2.3'\n\n >>> Tumbler([1,2,3]) # accept a list\n Tumbler(1,2,3)\n\n >>> Tumbler((1,2,3)) # accept a distinct tuple\n Tumbler(1,2,3)\n\n >>> Tumbler(1,'a',2,3) # 0,'a',2 -> throw a TypeError exception\n Traceback (most recent call last):\n ...\n TypeError: 'a' in (1, 'a', 2, 3) is not an integer\n\nThe Tumbler class behaves like other primitive types in Python, in that\nconstructing one without a value results in a zero.\n\n >>> int()\n 0\n\n >>> float()\n 0.0\n\n >>> Tumbler()\n Tumbler(0)\n\nKinds of Tumblers\n-----------------\n\nA tumbler can be of either of two kinds: an address along the number line or a\ndifference between two such addresses. Certain mathematical operations do not\nmake sense between the different kinds.\n\nComparison of two tumblers for which is further to the right only makes sense\nfor address tumblers and not for difference tumblers. Similarly, comparing\ntwo difference tumblers for \n\n\n\n \"\"\"Compare two tumblers.\n\n Note that you only compare address tumblers with other address\n tumblers, and difference tumblers with difference tumblers.\n Comparing an address and a difference tumbler makes no mathematical\n sense.\n\n A difference tumbler always begins with one or more leading zeros,\n except where it designates the entire docuverse, in which case it\n is 1.\n\n Every address tumbler\n starts with a digit of 1, to permit referring to the entire docuverse.\n\n\nComparison and Boolean Behavior\n-------------------------------\n\nBeing conceptually laid out along a number line, tumblers can be compared to\neach other.\n\n >>> Tumbler(1,2) < Tumbler(4,5,6)\n True\n\n >>> Tumbler(1,2,3) < Tumbler(4,5,6)\n True\n\n >>> Tumbler(4,5,6) > Tumbler(1,2,3)\n True\n\n >>> Tumbler(4,5,6) < Tumbler(1,2,3)\n False\n\n >>> Tumbler(1,2,3) == Tumbler(1,2,3)\n True\n\n >>> Tumbler(1,2,3) != Tumbler(1,2,4)\n True\n\nAnd they interact with Python's boolean mechanism as expected:\n\n >>> bool(Tumbler(1)) # a non-zero tumbler is true\n True\n\n >>> bool(Tumbler(0)) # a zero tumbler is false\n False\n\nSequence Behavior\n-----------------\n\nsubscripting them returns a digit, slices return a tuple of their digits\n\nTumbler Length\n--------------\n\n >>> len(Tumbler(1,2,3))\n 3\n\n >>> len(Tumbler(1))\n 1\n\n >>> len(Tumbler(0))\n 1\n\n\nTumbler Subscripting\n--------------------\n\n >>> Tumbler(1,2,3)[0]\n 1\n\n >>> Tumbler(1,2,3)[1]\n 2\n\n >>> Tumbler(1,2,3)[2]\n 3\n\n >>> Tumbler(1,2,3)[-1]\n 3\n\n >>> Tumbler(1,2,3)[-2]\n 2\n\n >>> Tumbler(1,2,3)[-3]\n 1\n\n >>> Tumbler(1,2,3)[1:]\n (2, 3)\n\n\n\n\n\n\n\nArithmetic Behavior\n-------------------\n\nthey follow the numeric protocol of Python, for addition and subtraction\nto be coordinates rather than labels, operations can be performed on them\n\n\n\n\n\n\n\n\n\n\n\nTweak Digits\n------------\n\n >>> Tumbler(1,2,3).tweakdigit(-1, 1)\n Tumbler(1,3,3)\n\n >>> Tumbler(1,2,3).tweakdigit(-2, 1)\n Tumbler(2,2,3)\n\n >>> Tumbler(1,2,3).tweakdigit(-3, 1)\n Tumbler(1,2,4,1,2,3)\n\n >>> Tumbler(1,2,3).tweakdigit(0, 1)\n Tumbler(1,2,4)\n\n >>> Tumbler(1,2,3).tweakdigit(1, 1)\n Tumbler(1,2,3,1)\n\n >>> Tumbler(1,2,3).tweakdigit(2, 1)\n Tumbler(1,2,3,0,1)\n\n >>> Tumbler(0).tweakdigit(0, 1)\n Tumbler(1)\n\n >>> Tumbler(0).tweakdigit(0, 2)\n Tumbler(2)\n\n >>> Tumbler(0).tweakdigit(1, 1)\n Tumbler(0,1)\n\n\nLength Adjusts\n--------------\n\n >>> Tumbler(1,2,3).setlength(5)\n Tumbler(1,2,3,0,0)\n\n >>> Tumbler(1,2,3).setlength(4)\n Tumbler(1,2,3,0)\n\n >>> Tumbler(1,2,3).setlength(3)\n Tumbler(1,2,3)\n\n >>> Tumbler(1,2,3).setlength(2)\n Tumbler(1,2)\n\n >>> Tumbler(1,2,3).setlength(1)\n Tumbler(1)\n\n >>> isinstance(Tumbler(1,2,3).setlength(1), Tumbler)\n True\n\n\n\nAddress Tumblers\n================\n\ntumblers can be divided into two kinds; those that specify a position along\nthe number line, called an Address Tumbler, and those representing the result\nof subtracting two such positions, called Difference Tumblers.\n\nI defined a couple of subclasses to constrain the arithmetic operations to\nthose that have meaning.\n\nDefault Value\n-------------\n\n >>> from xanalogica.tumbler import AddrTumbler, DiffTumbler\n >>> str(AddrTumbler())\n '0'\n\nParsing and Formatting\n----------------------\n\n >>> repr(AddrTumbler('1'))\n 'AddrTumbler(1)'\n\n >>> repr(AddrTumbler('1.2'))\n 'AddrTumbler(1,2)'\n\n >>> repr(AddrTumbler('1.2.3'))\n 'AddrTumbler(1,2,3)'\n\n >>> str(AddrTumbler('1'))\n '1'\n\n >>> str(AddrTumbler('1.2'))\n '1.2'\n\n >>> str(AddrTumbler('1.2.3'))\n '1.2.3'\n\nLength Adjust\n-------------\n\n >>> isinstance(AddrTumbler(1,2,3).setlength(1), AddrTumbler)\n True\n\nAddition\n--------\n\n >>> AddrTumbler(1,2,3) + DiffTumbler(0)\n AddrTumbler(1,2,3)\n\n >>> AddrTumbler(1,2,3) + DiffTumbler(0,1)\n AddrTumbler(1,3)\n\n >>> AddrTumbler(1,2,3) + DiffTumbler(0,1,2)\n AddrTumbler(1,3,2)\n\n >>> AddrTumbler(1,2,3) + DiffTumbler(0,1,2,3)\n AddrTumbler(1,3,2,3)\n\n >>> AddrTumbler(1,2,3) + DiffTumbler(0,1,2,3,4)\n AddrTumbler(1,3,2,3,4)\n\n >>> isinstance(AddrTumbler(1,2,3) + DiffTumbler(0,1,2,3,4), AddrTumbler)\n True\n\n >>> try:\n ... AddrTumbler(1,2,3) + Tumbler(4)\n ... except TypeError, exc:\n ... print exc\n Tumbler(4) is not a DiffTumbler\n\n..\n\n ## def test():\n ## return AddrTumbler(1,2,3) + AddrTumbler(4)\n ## self.failUnlessRaises(TypeError, test)\n\n >>> AddrTumbler(1,2,3) + DiffTumbler(0,0,0)\n AddrTumbler(1,2,3)\n\n >>> AddrTumbler(1,2,3) + DiffTumbler(0,0,1)\n AddrTumbler(1,2,4)\n\nSubtraction\n-----------\n\n..\n\n self.failUnless(AddrTumbler(1,2,3) - AddrTumbler(1,1) == DiffTumbler(0,1,3))\n self.failUnless(AddrTumbler(1,2,3) - AddrTumbler(1,1,1) == DiffTumbler(0,1,3))\n self.failUnless(AddrTumbler(1,2,3) - AddrTumbler(1,1,1,1) == DiffTumbler(0,1,3))\n\n self.failUnless(AddrTumbler(1,2,3) - AddrTumbler(0,0,0) == DiffTumbler(1,2,3))\n self.failUnless(AddrTumbler(1,2,3) - AddrTumbler(0,0,1) == DiffTumbler(1,2,3))\n self.failUnless(isinstance(AddrTumbler(1,2,3) - AddrTumbler(0,0,1), DiffTumbler))\n\n ## def test():\n ## AddrTumbler(1,2,3) - DiffTumbler(1,1)\n ## self.failUnlessRaises(TypeError, test)\n\nIntDiff\n-------\n\n..\n\n self.failUnless(AddrTumbler(1,2,3).intdiff(AddrTumbler(1,2,3)) == 0)\n self.failUnless(AddrTumbler(1,2,3).intdiff(AddrTumbler(1,2,4)) == 1)\n self.failUnless(AddrTumbler(1,2,3,4).intdiff(AddrTumbler(1,2,4)) == 1)\n\nClassification\n--------------\n\n..\n\n self.failUnless(AddrTumbler(1,2,3).isaNodeAddress())\n self.failUnless(not AddrTumbler(1,2,3,0,4,5,6).isaNodeAddress())\n\n self.failUnless(AddrTumbler(1,2,3,0,4,5,6).isaAccountAddress())\n self.failUnless(not AddrTumbler(1,2,3).isaAccountAddress())\n self.failUnless(not AddrTumbler(1,2,3,0,4,5,6,0,7,8,9).isaAccountAddress())\n\n self.failUnless(not AddrTumbler(1,2,3,0,4,5,6).isaDocumentAddress())\n self.failUnless(not AddrTumbler(1,2,3).isaDocumentAddress())\n self.failUnless(AddrTumbler(1,2,3,0,4,5,6,0,7,8,9).isaDocumentAddress())\n\n self.failUnless(not AddrTumbler(1,2,3,0,4,5,6).isaAtomAddress())\n self.failUnless(not AddrTumbler(1,2,3).isaAtomAddress())\n self.failUnless(not AddrTumbler(1,2,3,0,4,5,6,0,7,8,9).isaAtomAddress())\n self.failUnless(AddrTumbler(1,2,3,0,4,5,6,0,7,8,9,0,1,35).isaAtomAddress())\n\nRelational Comparison\n---------------------\n\n..\n\n ## def test():\n ## AddrTumbler(1,2) < DiffTumbler(0,1) # Non-Comparable Types\n ## self.failUnlessRaises(TypeError, test)\n\nDifference Tumblers\n===================\n\nDefault Value\n-------------\n\n..\n\n self.failUnless(str(DiffTumbler()) == '0')\n\nParsing and Formatting\n----------------------\n\n..\n\n self.failUnless(repr(DiffTumbler('1')) == 'DiffTumbler(1)')\n self.failUnless(repr(DiffTumbler('1.2')) == 'DiffTumbler(1,2)')\n self.failUnless(repr(DiffTumbler('1.2.3')) == 'DiffTumbler(1,2,3)')\n self.failUnless(str(DiffTumbler('1')) == '1')\n self.failUnless(str(DiffTumbler('1.2')) == '1.2')\n self.failUnless(str(DiffTumbler('1.2.3')) == '1.2.3')\n\nAddition\n--------\n\n..\n\n ## def test():\n ## DiffTumbler(1,2,3) + DiffTumbler(1,1)\n ## self.failUnlessRaises(TypeError, test)\n\n ## def test():\n ## DiffTumbler(1,2,3) + AddrTumbler(1,1)\n ## self.failUnlessRaises(TypeError, test)\n\n ## def test():\n ## DiffTumbler(1,2,3) + Tumbler(1,1)\n ## self.failUnlessRaises(TypeError, test)\n\nSubtraction\n-----------\n\n..\n\n ## def test():\n ## DiffTumbler(1,2,3) - DiffTumbler(1,1)\n ## self.failUnlessRaises(TypeError, test)\n\n ## def test():\n ## DiffTumbler(1,2,3) - AddrTumbler(1,1)\n ## self.failUnlessRaises(TypeError, test)\n\n ## def test():\n ## DiffTumbler(1,2,3) - Tumbler(1,1)\n ## self.failUnlessRaises(TypeError, test)\n\nRelational Comparison\n---------------------\n\n..\n\n ## def test():\n ## AddrTumbler(1,2) < DiffTumbler(0,1) # Non-Comparable Types\n ## self.failUnlessRaises(TypeError, test)\n\n\nSpan Arithmetic\n---------------\n\n..\n\n # def test_001_span_parsing_and_formatting(self):\n # pass\n # self.failUnless(repr(Span(AddrTumbler(1,2,3), DiffTumbler(1))) == 'Span((1,2,3), (1)')\n # self.failUnless(repr(DiffTumbler('1.2')) == 'DiffTumbler(1,2)')\n # self.failUnless(repr(DiffTumbler('1.2.3')) == 'DiffTumbler(1,2,3)')\n # self.failUnless(str(DiffTumbler('1')) == '1')\n # self.failUnless(str(DiffTumbler('1.2')) == '1.2')\n # self.failUnless(str(DiffTumbler('1.2.3')) == '1.2.3')\n\n # def test_002_span_inrange(self):\n # self.failUnless(AddrTumbler(1,2,2) not in Span(AddrTumbler(1,2,3), DiffTumbler(0,0,5)))\n # self.failUnless(AddrTumbler(1,2,3) in Span(AddrTumbler(1,2,3), DiffTumbler(0,0,5)))\n # self.failUnless(AddrTumbler(1,2,4) in Span(AddrTumbler(1,2,3), DiffTumbler(0,0,5)))\n # self.failUnless(AddrTumbler(1,2,5) not in Span(AddrTumbler(1,2,3), DiffTumbler(0,0,2)))\n # self.failUnless(AddrTumbler(1,2,6) not in Span(AddrTumbler(1,2,3), DiffTumbler(0,0,2)))\n\n # def test_003_span_relational_compare_LT(self):\n # self.failUnless(not Span(AddrTumbler(1,2,3), DiffTumbler(0,0,2)) < AddrTumbler(1,1,1))\n # self.failUnless(not Span(AddrTumbler(1,2,3), DiffTumbler(0,0,2)) < AddrTumbler(1,2,2))\n # self.failUnless(not Span(AddrTumbler(1,2,3), DiffTumbler(0,0,2)) < AddrTumbler(1,2,3))\n # self.failUnless(not Span(AddrTumbler(1,2,3), DiffTumbler(0,0,2)) < AddrTumbler(1,2,4))\n # self.failUnless( Span(AddrTumbler(1,2,3), DiffTumbler(0,0,2)) < AddrTumbler(1,2,5))\n # self.failUnless( Span(AddrTumbler(1,2,3), DiffTumbler(0,0,2)) < AddrTumbler(1,2,6))\n # self.failUnless( Span(AddrTumbler(1,2,3), DiffTumbler(0,0,2)) < AddrTumbler(1,2,7))\n\n # def test_004_span_relational_compare_GT(self):\n # self.failUnless( Span(AddrTumbler(1,2,3), DiffTumbler(0,0,2)) > AddrTumbler(1,1,1))\n # self.failUnless( Span(AddrTumbler(1,2,3), DiffTumbler(0,0,2)) > AddrTumbler(1,2,2))\n # self.failUnless(not Span(AddrTumbler(1,2,3), DiffTumbler(0,0,2)) > AddrTumbler(1,2,3))\n # self.failUnless(not Span(AddrTumbler(1,2,3), DiffTumbler(0,0,2)) > AddrTumbler(1,2,4))\n # self.failUnless(not Span(AddrTumbler(1,2,3), DiffTumbler(0,0,2)) > AddrTumbler(1,2,5))\n # self.failUnless(not Span(AddrTumbler(1,2,3), DiffTumbler(0,0,2)) > AddrTumbler(1,2,6))\n # self.failUnless(not Span(AddrTumbler(1,2,3), DiffTumbler(0,0,2)) > AddrTumbler(1,2,7))\n\nBasic Theory\n============\n\nAbout tumblers...\n\nArithmetic Operations\n=====================\n\n >>> print 5\n 5\n >>> 5 == 4\n False\n\nentire docuverse placed between 1 and 2\n\nall differences placed between 0 and 1\n\nzero digits separate URI fields\n\nfour URI fields: server/user/document/version\n allows for delegation of numbering to independent entities\n allows to range specifiers to encompass sections of the number line\n\nThe tumbler has two primary functions: to represent addresses in the docuverse\nand to represent *spans* of addresses. A span is represented by a pair of\ntumblers, either a pair of address tumblers or an address and difference\ntumbler.\n\nTo-Do List\n**********\n\n * support comparison of tumbler to span\n * support comparison of span to tumbler\n * provide a tumbler-to-int converter that raises an exception if not possible __int__\n * how to reconcile addition with concatenation\n * study os.path and create equivalents for tumblers\n * AddrTumbler attributes: .node .account .document .atom .atomtype .atomsuffix\n * consider: summation of spans creates a spec/vspec/sporgl/???\n\nChanges\n*******\n\n0.1 (2008-09-14)\n================\n\nFeatures Added\n--------------\n\nInitial check-in for new Python egg/buildout distribution methology.\n\nDownload\n********\nAll packaged distributions can be found on the package `home page`_ in\nthe Python Package Index. Scroll to the very bottom of the page to find\nthe links. In addition to these PyPI downloads, the development\nversions are available from the Tau Productions Inc. `public Subversion\nrepository`_.\n\n.. _`home page`: http://pypi.python.org/pypi/xanalogica.tumbler\n.. _`public Subversion repository`: https://www.taupro.com/pubsvn/Projects/Xanalogica/xanalogica.tumbler/trunk/#egg=xanalogica.tumbler-dev", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://www.python.org/pypi/xanalogica.tumbler", "keywords": "xanalogica,tumblers", "license": "GPL 3", "maintainer": null, "maintainer_email": null, "name": "xanalogica.tumbler", "package_url": "https://pypi.org/project/xanalogica.tumbler/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/xanalogica.tumbler/", "project_urls": { "Download": "UNKNOWN", "Homepage": "http://www.python.org/pypi/xanalogica.tumbler" }, "release_url": "https://pypi.org/project/xanalogica.tumbler/0.2dev/", "requires_dist": null, "requires_python": null, "summary": "Flexible general-purpose coordinate elements with properties of integers and tuples.", "version": "0.2dev" }, "last_serial": 803457, "releases": { "0.1dev": [ { "comment_text": "", "digests": { "md5": "c52ec97b4dafd5233f89405f6b9aee0c", "sha256": "42d13ac30f33164ec350b28c1bc03a5226bf9faa5a952e92def642c08d0deb60" }, "downloads": -1, "filename": "xanalogica.tumbler-0.1dev-py2.5.egg", "has_sig": true, "md5_digest": "c52ec97b4dafd5233f89405f6b9aee0c", "packagetype": "bdist_egg", "python_version": "2.5", "requires_python": null, "size": 20038, "upload_time": "2008-08-31T08:40:17", "url": "https://files.pythonhosted.org/packages/e4/66/615f83fa5c551284cf3df5a3e606d6a6501a6daef5e549f6f1ee5c03e4cf/xanalogica.tumbler-0.1dev-py2.5.egg" }, { "comment_text": "", "digests": { "md5": "e4bd9bc0d1cf3b4815622a36b3ede094", "sha256": "559777db386e74bf0c4680280ed0361cfafa52f7ab703da30ec8a64a8531c7ad" }, "downloads": -1, "filename": "xanalogica.tumbler-0.1dev.tar.gz", "has_sig": true, "md5_digest": "e4bd9bc0d1cf3b4815622a36b3ede094", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 27998, "upload_time": "2008-08-31T08:40:00", "url": "https://files.pythonhosted.org/packages/f9/8f/42cf8651f4d43285a47a8f0570048b18ff7e69e23058c339ba5e5f3b70a3/xanalogica.tumbler-0.1dev.tar.gz" } ], "0.2dev": [ { "comment_text": "", "digests": { "md5": "6d0a4084bf8f7b9ead5330d61766c5b3", "sha256": "8088f8dbd9b32f830ba0ea61ae727e27caa63e891747981d97583159af19c8af" }, "downloads": -1, "filename": "xanalogica.tumbler-0.2dev-py2.5.egg", "has_sig": false, "md5_digest": "6d0a4084bf8f7b9ead5330d61766c5b3", "packagetype": "bdist_egg", "python_version": "2.5", "requires_python": null, "size": 20432, "upload_time": "2009-03-21T04:31:09", "url": "https://files.pythonhosted.org/packages/0e/8c/3b4a28f50bfb9109375e7d04a600e84ac0c11ccd0cc9ce92027bb45ce598/xanalogica.tumbler-0.2dev-py2.5.egg" }, { "comment_text": "", "digests": { "md5": "98c3c287be50a88cdaacac99b375fef9", "sha256": "6ad19fd395b6b8577e8b3ce2ca2fade9ddbac6f5c9050658d880ce223d37f21d" }, "downloads": -1, "filename": "xanalogica.tumbler-0.2dev.tar.gz", "has_sig": false, "md5_digest": "98c3c287be50a88cdaacac99b375fef9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 31882, "upload_time": "2009-03-21T04:30:31", "url": "https://files.pythonhosted.org/packages/88/ee/7b7ede752a099e9a098a2ff8156ad2d65144c12a3752416c5c8c6002e8b7/xanalogica.tumbler-0.2dev.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "6d0a4084bf8f7b9ead5330d61766c5b3", "sha256": "8088f8dbd9b32f830ba0ea61ae727e27caa63e891747981d97583159af19c8af" }, "downloads": -1, "filename": "xanalogica.tumbler-0.2dev-py2.5.egg", "has_sig": false, "md5_digest": "6d0a4084bf8f7b9ead5330d61766c5b3", "packagetype": "bdist_egg", "python_version": "2.5", "requires_python": null, "size": 20432, "upload_time": "2009-03-21T04:31:09", "url": "https://files.pythonhosted.org/packages/0e/8c/3b4a28f50bfb9109375e7d04a600e84ac0c11ccd0cc9ce92027bb45ce598/xanalogica.tumbler-0.2dev-py2.5.egg" }, { "comment_text": "", "digests": { "md5": "98c3c287be50a88cdaacac99b375fef9", "sha256": "6ad19fd395b6b8577e8b3ce2ca2fade9ddbac6f5c9050658d880ce223d37f21d" }, "downloads": -1, "filename": "xanalogica.tumbler-0.2dev.tar.gz", "has_sig": false, "md5_digest": "98c3c287be50a88cdaacac99b375fef9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 31882, "upload_time": "2009-03-21T04:30:31", "url": "https://files.pythonhosted.org/packages/88/ee/7b7ede752a099e9a098a2ff8156ad2d65144c12a3752416c5c8c6002e8b7/xanalogica.tumbler-0.2dev.tar.gz" } ] }