{ "info": { "author": "Armand Lynch", "author_email": "lyncha@users.sourceforge.net", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Environment :: Console", "Environment :: Web Environment", "Intended Audience :: Developers", "Intended Audience :: Telecommunications Industry", "License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL)", "Natural Language :: English", "Operating System :: OS Independent", "Programming Language :: Python", "Topic :: Database :: Front-Ends", "Topic :: Internet :: WAP", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: Utilities" ], "description": "WURFL and Python\n================\n\n#### by Armand Lynch (lyncha at users dot sourceforge dot net)\n\n**Please note: As of pywurfl v7.0.0 all textual capabilities (including WURFL\nIDs and user agents) are unicode strings and all textual parameters to the API\nfunctions should be given as unicode strings.**\n\n[pywurfl][1] is a [Python][3] language package that makes dealing with the\n[WURFL][2] in Python a little easier. It contains tools that allow you to\nretrieve objects that represent devices defined in the WURFL or manipulate the\nWURFL device hierarchy by using a simple set of [API][9] functions or a\npywurfl specific [query language][4]. Also included within the package is a\n[WURFL processor][5] class that provides an event based API that can be used\nto alleviate some of the work when processing the WURFL sequentially.\n\nLicense\n-------\n\npywurfl is Copyright 2004-2011, Armand Lynch (lyncha at users dot sourceforge\ndot net) The code is free software; you can redistribute it and/or modify it\nunder the terms of the [LGPL][6] License (see the file LICENSE included with\nthe distribution).\n\nRequires\n--------\n\nPython >= 2.6\n\nRequired Modules\n----------------\n\n[Levenshtein Module][7] >= 0.10.1 is required for the user agent similarity\nalgorithms.\n\nOptional Modules\n----------------\n\n[pyparsing][8] >= 1.5 is required if you want to use the pywurfl query language.\n\nScripts\n-------\n\nThe pywurfl package contains a wurfl2python.py script that translates a WURFL\ncompatible XML file into a python class hierarchy that the pywurfl API can use\ndirectly. The default name for the output file is wurfl.py. Type the following\nat the command line to produce it:\n\n python wurfl2python.py wurfl.xml\n\nPatching\n--------\n\nIn order to [patch][13] your wurfl.xml file, use the [WURFL XSLT Tools][14].\nThen run wurfl2python on the patched file.\n\nA quick usage example\n---------------------\n\nAfter you have created the wurfl.py module, you can use the following code to\nget a device object based on a user agent and print it to stdout.\n\n from wurfl import devices\n from pywurfl.algorithms import TwoStepAnalysis\n\n user_agent = u\"Nokia3350/1.0 (05.01)\"\n search_algorithm = TwoStepAnalysis(devices)\n\n device = devices.select_ua(user_agent, search=search_algorithm)\n\n # Print out the specialized capabilities for this device.\n print device\n\nThat's it.\n\npywurfl API\n-----------\n\nTo get an object that represents a device, you can use one of 2 methods of the\n'devices' object imported from the wurfl.py module.\n\n select_id(unicode, [actual_device_root=False], [instance=True])\n\nThis method returns a device object based on the WURFL ID provided.\n\nIf `actual_device_root` is `True` then the `select_id` method will return the\nrequested device or a device in its fallbacks if it is an actual device.\n\nIf instance is `False` then the `select_id` method will return a class object\ninstead of an instance.\n\n select_ua(unicode, [actual_device_root=False], [search=False], [instance=True])\n\nThis method returns a device object based on the user agent provided.\n\nIf `actual_device_root` is `True` then the `select_ua` method will return the\nrequested device or a device in its fallbacks if it is an actual device.\n\nThe search argument takes an instance of [pywurfl.algorithms.Algorithm][12].\nAt this time, only four algorithms are provided: TwoStepAnalysis, Tokenizer,\nLevenshtein distance and JaroWinkler. The TwoStepAnalysis algorithm is the\ndefault algorithm used in Java and PHP APIs, you can find a description of it\n[here][11]. The other three algorithms are older and probably shouldn't be\nused in new programs. \n\nIf instance is `False` then the `select_ua` method will return a class object\ninstead of an instance.\n\n### More API methods\n\nThere are a few more methods that you can use on the 'devices' object to\nmanipulate the device class hierarchy itself.\n\n add(parent, devid, devua, [actual_device_root=False], [capabilities=None])\n\n add_capability(group, capability, object)\n\n add_group(group)\n\n insert_after(parent, devid, devua, [actual_device_root=False], [capabilities=None])\n\n insert_before(child, devid, devua, [actual_device_root=False], [capabilities=None])\n\n remove(devid)\n\n remove_capability(capability)\n\n remove_group(group)\n\n remove_tree(devid)\n\nHere's an example\n\n from wurfl import devices\n\n # Add a new device\n devices.add(u'generic',\n u'teledev1',\n u'Mozilla/25.0 (X11; U; Linux i686; en-US; rv:25.0.0) Gecko/21000711 Firefox/28.1.5',\n actual_device_root=True)\n\n # Add a new capability group\n devices.add_group(u'teleporter')\n\n # Add some capabilities to the teleporter group\n devices.add_capability(u'teleporter', u'teleportation_device', False)\n devices.add_capability(u'teleporter', u'distance', 20) # in km\n devices.add_capability(u'teleporter', u'can_recover_from_errors', False)\n\n # Add a new device overriding a default capability value\n # Note that no devices had a 'teleportation_device' attribute until we added it\n devices.add(u'teledev1',\n u'teledev2',\n u'Mozilla/25.0 (X11; U; Linux i686; en-US; rv:26.0.0) Gecko/21000712 Firefox/28.1.6',\n actual_device_root=True,\n capabilities={u'teleportation_device': True})\n\n # Add another group and capabilities\n devices.add_group(u'python')\n devices.add_capability(u'python', u'py_version', u'2.6')\n devices.add_capability(u'python', u'py_heap_size', 0)\n\n # Remove an unused group\n devices.remove_group(u'j2me')\n\n # Not interested in tiff files\n devices.remove_capability(u'tiff')\n\nCheck the [documentation][9] for more information.\n\nSerialization\n-------------\n\nIt's also possible to serialize changes that you make to a WURFL compatible\nXML file.\n\n from wurfl import devices\n from pywurfl.serialize import Serialize\n\n # Remove some groups and their capabilities from the WURFL hierarchy\n devices.remove_group(u'j2me')\n devices.remove_group(u'mms')\n\n Serialize(devices).to_xml(\"no_j2me_or_mms.xml\")\n\nSearch Algorithm Classes\n------------------------\n\nThe algorithms module contains four algorithm classes (TwoStepAnalysis,\nTokenizer, JaroWinkler and LevenshteinDistance). When instantiating any of\nthese classes, a callable object will be returned that can be used to search a\n'devices' object with the provided user agent.\n\n TwoStepAnalysis(devices, [use_normalized_ua=False])\n\nIn order to use the TwoStepAnalysis algorithm, you must initialize it with a\nset of known devices. `use_normalized_ua` determines whether or not the search\nalgorithm requires that a normalized user agent be presented to it. The\nTwoStepAnalysis algorithm does its own normalization internally, hence the\n`False` specification here.\n\n Tokenizer([devwindow], [use_normalized_ua=True])\n\nThe devwindow argument determines the upper limit of device matches before the\nalgorithm would return the generic device.\n\n JaroWinkler([accuracy=1.0], [weight=0.05], [use_normalized_ua=True])\n\nThe accuracy argument determines the lower limit at which pywurfl will\ndetermine if a user agent matches another. If no device can be found that\nscores equal to or greater than accuracy, a generic device is returned. Valid\nvalues are between 0.0 and 1.0\n\n LevenshteinDistance([use_normalized_ua=True])\n\nThe LevenshteinDistance algorithm only has an optional `use_normalized_ua` argument.\n\n from wurfl import devices\n from pywurfl.algorithms import JaroWinkler, Tokenizer, LevenshteinDistance\n\n tsa = TwoStepAnalysis(devices)\n tokenizer = Tokenizer()\n jarow = JaroWinkler()\n levdis = LevenshteinDistance()\n\n user_agent = u\"Nokia3350/1.0 (05.01)\"\n device1 = jarow(user_agent, devices)\n device2 = tokenizer(user_agent, devices)\n device3 = levdis(user_agent, devices)\n\n device4 = devices.select_ua(user_agent, search=tsa)\n device5 = devices.select_ua(user_agent, search=jarow)\n device6 = devices.select_ua(user_agent, search=tokenizer)\n device7 = devices.select_ua(user_agent, search=levdis)\n\nIt's also very easy to define your own algorithm for use in pywurfl in case\nthe algorithms provided don't serve your needs. Just subclass the\npywurfl.algorithms.Algorithm class and follow the protocol.\n\nDevice Objects\n--------------\n\nThe object returned by either `select_id` or `select_ua` is usually a Device\ninstance.\n\n device = devices.select_id(unicode)\n\nA device object has many attributes. The device id, user agent, `fall_back`\nand `actual_device_root` attributes are exposed with the following attributes\nof the device object:\n\n device.devid\n device.devua\n device.fall_back # All devices have a fall_back attribute\n device.actual_device_root\n\nAny capability that is defined in the WURFL becomes an attribute of the device\nobject. For example:\n\n device.brand_name\n device.model_name\n device.ringtone\n\nAll attributes are converted into their respective Python types. For example:\n\n device.ringtone # Attribute is boolean\n device.preferred_markup # Attribute is a unicode string\n device.rows # Attribute is an integer\n\nYou can iterate over a device object to select each capability and its\ncorresponding value. For example, to print out all capabilities of a device\nobject you can use the code below:\n\n for group, capability, value in device:\n print group, capability, value\n\nEvery device has a shared groups attribute which is a Python dictionary where\nthe keys are the capability group names as defined in the WURFL and the values\nare lists of the capability names for that specific group.\n\n for group in sorted(device.groups):\n print group\n\n### Classes and Instances\n\nThe API methods can also return a class object instead of an instance. What\nwurfl2python does is produce a module that creates a single inheritance class\nhierarchy of all WURFL devices. You can use this to your advantage if you want\nto change the attributes of a device at run-time and have all of its\ndescendants represent that change.\n\n # get an arbitrary device instance\n device = devices.select_id(u'blackberry_generic_ver3_sub2')\n\n # get the generic device *class*\n gen = devices.select_id(u'generic', instance=False)\n\n # modify the generic class\n gen.teleportation_device = False\n\n # since all devices inherit from the generic device, this will not raise\n # an attribute error now\n device.teleportation_device # == False\n\nIf you want to maintain the integrity of the class hierarchy, you should use\nthe add/remove/insert API methods on the 'devices' object mentioned above.\n\nQuery Language\n--------------\n\nThe pywurfl package includes a query language that makes it easier to retrieve\na list of devices, WURFL IDs or user agents based on the capabilities of a\ndevice. The best way to see what the query language looks like and what it can\ndo is with an example.\n\n from wurfl import devices\n from pywurfl.ql import QL # Import the query function generator\n\n # Retrieve a function that will query the devices object\n query = QL(devices)\n\n # QL also adds a query method to devices (devices.query)\n\n q1 = u\"\"\"select id where ringtone=true and rows < 5 and\n columns > 5 and preferred_markup = 'wml_1_1'\"\"\"\n\n for wurfl_id in query(q1):\n print wurfl_id\n\n # Let's look for some nice phones\n q2 = u\"\"\"select device where all(ringtone_mp3, ringtone_aac, wallpaper_png,\n streaming_mp4) = true\"\"\"\n\n # Notice that we can also retrieve device classes\n for device in devices.query(q2, instance=False):\n print device.brand_name, device.model_name\n\n # We can also use the methods on the capability types to refine our queries.\n # Note that you should *always* quote the strings that are passed to functions\n # and those that are used in comparisons.\n q3 = u\"\"\"select ua where brand_name.lower()='nokia'\"\"\"\n for ua in query(q3):\n print ua\n\n q4 = u\"\"\"select ua where brand_name.replace('No', 'Si').lower()='sikia'\"\"\"\n for ua in query(q4):\n print ua\n\n q5 = u\"\"\"select ua where model_name.isdigit()=true and actual_device_root=true\"\"\"\n for ua in query(q5):\n print ua\n\n # There are also a couple of regex methods (match and imatch) that were added\n # to the string type to make those kind of queries possible. Use imatch to\n # ignore case.\n q6 = u\"\"\"select ua where brand_name.match('^No')=true\"\"\"\n for ua in query(q6):\n print ua\n\n # and arbitrary nesting is supported\n q7 = u\"\"\"select ua where brand_name.replace('Nokia', brand_name.lower())='nokia'\"\"\"\n for ua in query(q7):\n print ua\n\nA full description of the query language is included in the documentation.\n\nThe WURFL Processor\n-------------------\n\nThe WURFL processor is a general class that walks a WURFL XML file and\nexecutes hooks as specific events occur in a fashion similar to SAX. The best\nway to understand the WURFL processor is to look at its [documentation][10].\nFor an example of how to use use it, look at the source for wurfl2python.py.\n\nContributors\n------------\n\nTo *Pau Aliagas*, *Gabriele Fantini* and *Michele Bariani*: Thank you for the\nmany patches, bug reports and improvements.\n\nComments and/or suggestions are appreciated.\n\n\n[1]: http://celljam.net/api/index.html \"pywurfl\"\n[2]: http://wurfl.sourceforge.net/ \"WURFL\"\n[3]: http://www.python.org/ \"Python\"\n[4]: http://celljam.net/#query \"Query Language\"\n[5]: http://celljam.net/#processor \"WURFL processor\"\n[6]: http://www.opensource.org/licenses/lgpl-license.php \"LGPL\"\n[7]: http://pypi.python.org/pypi/python-Levenshtein/0.10.2 \"Levenshtein Module\"\n[8]: http://pyparsing.wikispaces.com/ \"pyparsing\"\n[9]: http://celljam.net/api/index.html \"API documentation\"\n[10]: http://celljam.net/api/pywurfl.wurflprocessor-module.html \"WURFL processor documentation\"\n[11]: http://wurfl.sourceforge.net/newapi/ \"TwoStepAnalysis description\"\n[12]: http://celljam.net/api/pywurfl.algorithms.Algorithm-class.html \"Algorithm class API documentation\"\n[13]: http://wurfl.sourceforge.net/patchfile.php \"What is a patch file\"\n[14]: http://wurfl.sourceforge.net/xslt/index.php \"WURFL XSLT Tools\"", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://celljam.net/", "keywords": null, "license": "LGPL", "maintainer": null, "maintainer_email": null, "name": "pywurfl", "package_url": "https://pypi.org/project/pywurfl/", "platform": "All", "project_url": "https://pypi.org/project/pywurfl/", "project_urls": { "Download": "UNKNOWN", "Homepage": "http://celljam.net/" }, "release_url": "https://pypi.org/project/pywurfl/7.2.1/", "requires_dist": null, "requires_python": null, "summary": "pywurfl - Python tools for processing and querying the Wireless Universal Resource File (WURFL)", "version": "7.2.1" }, "last_serial": 238220, "releases": { "6.3.0b": [ { "comment_text": "", "digests": { "md5": "ce659211153a71dadcfd5e553682872d", "sha256": "2c6551f6ca58ccc0aa43743ebf0cbc343c5c9441bd83d3f224aca53506a967c6" }, "downloads": -1, "filename": "pywurfl-6.3.0b-py2.4.egg", "has_sig": false, "md5_digest": "ce659211153a71dadcfd5e553682872d", "packagetype": "bdist_egg", "python_version": "2.4", "requires_python": null, "size": 40450, "upload_time": "2007-02-11T04:35:47", "url": "https://files.pythonhosted.org/packages/36/06/69cd85ef1d93168f4ea3b48a8905644b94a881c9f0f811521c5acc47e9a8/pywurfl-6.3.0b-py2.4.egg" }, { "comment_text": "", "digests": { "md5": "dc492cc950e3bfdcc3be99e9295757e1", "sha256": "731879c3efbb5945921f39fbe3279eb9045a1367e4d51d7c17c8f54e2e51b6dc" }, "downloads": -1, "filename": "pywurfl-6.3.0b.tar.gz", "has_sig": false, "md5_digest": "dc492cc950e3bfdcc3be99e9295757e1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 119046, "upload_time": "2007-02-11T04:35:46", "url": "https://files.pythonhosted.org/packages/89/ab/59b761190b3ed0ee4064c4e3ffd76975feb6ee7285df2ae324f5fc68728a/pywurfl-6.3.0b.tar.gz" } ], "6.3.1b": [ { "comment_text": "", "digests": { "md5": "1d708d43abf87e9bc93c1200be1d9cef", "sha256": "3073112ca0cc5c9c825f660d89d5c04fcf45af1bc205f286ff70fbdf75bdd157" }, "downloads": -1, "filename": "pywurfl-6.3.1b-py2.5.egg", "has_sig": false, "md5_digest": "1d708d43abf87e9bc93c1200be1d9cef", "packagetype": "bdist_egg", "python_version": "2.5", "requires_python": null, "size": 40133, "upload_time": "2007-07-31T21:38:31", "url": "https://files.pythonhosted.org/packages/3e/ce/f3c2d6ec3b17e2f01b283ecfa41e52676802156d7ff84a33695bd6e75b85/pywurfl-6.3.1b-py2.5.egg" }, { "comment_text": "", "digests": { "md5": "fa8c9aedcc0b31f6eecbe8c1275d6abb", "sha256": "7239ee009f43157c27c15ea125e2269e8823d888b323bf6fbc533a108fa2849e" }, "downloads": -1, "filename": "pywurfl-6.3.1b.tar.gz", "has_sig": false, "md5_digest": "fa8c9aedcc0b31f6eecbe8c1275d6abb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 125173, "upload_time": "2007-07-31T21:38:30", "url": "https://files.pythonhosted.org/packages/2e/cb/f1ab12f2216b55d9a86576916a4773219ae3970d34c2cdd0f2c39a269dc4/pywurfl-6.3.1b.tar.gz" } ], "6.4.0b": [ { "comment_text": "", "digests": { "md5": "89aedb80ec03d95428a78f001aad9d09", "sha256": "751488ffae6afcb6f0c516ee2d6f8167822c8696aeeeabc6fa5a2f94b9c94e3b" }, "downloads": -1, "filename": "pywurfl-6.4.0b-py2.5.egg", "has_sig": false, "md5_digest": "89aedb80ec03d95428a78f001aad9d09", "packagetype": "bdist_egg", "python_version": "2.5", "requires_python": null, "size": 43934, "upload_time": "2008-04-14T01:19:06", "url": "https://files.pythonhosted.org/packages/b4/38/dfa5eac919807a734fc469707b0245d65ac89e2463b7a5dd944eca72cd2f/pywurfl-6.4.0b-py2.5.egg" }, { "comment_text": "", "digests": { "md5": "0d2d745f347bc1814b5bd7ae09eacd90", "sha256": "1dfe04890345cf15a0b8316fd694d059a2d999319810c9b383f11f8151417874" }, "downloads": -1, "filename": "pywurfl-6.4.0b.tar.gz", "has_sig": false, "md5_digest": "0d2d745f347bc1814b5bd7ae09eacd90", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 137910, "upload_time": "2008-04-14T01:19:04", "url": "https://files.pythonhosted.org/packages/3b/d2/02b6b9e0ebc29c1b496dc8d85e842260f8f807d6692e00cf5af6d4426770/pywurfl-6.4.0b.tar.gz" } ], "6.4.1b": [ { "comment_text": "", "digests": { "md5": "63e0bc2566f028614b90eed5dec336eb", "sha256": "1e38c53333e38523d9806380f1a50ef9338ba71db6006f17f164790dec658149" }, "downloads": -1, "filename": "pywurfl-6.4.1b-py2.5.egg", "has_sig": false, "md5_digest": "63e0bc2566f028614b90eed5dec336eb", "packagetype": "bdist_egg", "python_version": "2.5", "requires_python": null, "size": 43971, "upload_time": "2009-04-19T00:58:21", "url": "https://files.pythonhosted.org/packages/bb/ad/473785fdf661c7f08437308f1b31f74b0603970cc982b37bf9ed48668492/pywurfl-6.4.1b-py2.5.egg" }, { "comment_text": "", "digests": { "md5": "781cc33088ef4039fcc7ad3913ab906c", "sha256": "1deee69b7ac6fc657a51bf7706a870789e17e3fb1ae9742d0ef4eaa437000c96" }, "downloads": -1, "filename": "pywurfl-6.4.1b.tar.gz", "has_sig": false, "md5_digest": "781cc33088ef4039fcc7ad3913ab906c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 138628, "upload_time": "2009-04-19T00:58:19", "url": "https://files.pythonhosted.org/packages/ec/f1/a1e62a20d2bada23cb4d079d2b00ed4e757d00a0b4f25dd42cb0cd3e8c48/pywurfl-6.4.1b.tar.gz" } ], "7.0.0": [ { "comment_text": "", "digests": { "md5": "d26129598690b916c04a9099a3e8f9cb", "sha256": "1352b5a7b2e1081e45c16746c895a5c084ba3ff258260a5fe041d8e8393fdc1f" }, "downloads": -1, "filename": "pywurfl-7.0.0-py2.5.egg", "has_sig": false, "md5_digest": "d26129598690b916c04a9099a3e8f9cb", "packagetype": "bdist_egg", "python_version": "2.5", "requires_python": null, "size": 44528, "upload_time": "2010-03-07T00:31:12", "url": "https://files.pythonhosted.org/packages/80/67/26f33e297980d1e7bb0abae5078bd7d92ce40a8ba7042b025f7241424203/pywurfl-7.0.0-py2.5.egg" }, { "comment_text": "", "digests": { "md5": "de577ae719fa93c0e362f19c32233f6f", "sha256": "cd766410ce8d9f3ee395b99332bd29c6679ffb03a7d5f56be347c2106f4df7ee" }, "downloads": -1, "filename": "pywurfl-7.0.0.tar.gz", "has_sig": false, "md5_digest": "de577ae719fa93c0e362f19c32233f6f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 139794, "upload_time": "2010-03-07T00:31:11", "url": "https://files.pythonhosted.org/packages/dc/33/7df5ca3fa99f04ad7c1b7fc4db80e6fc8250e38eabb70def58c72de77169/pywurfl-7.0.0.tar.gz" } ], "7.1.0": [ { "comment_text": "", "digests": { "md5": "1bb866134dbc73b05e15555956a403cb", "sha256": "07b29ceb74ed091ca9d1854c7590476a6db1a790a7f638c3af19ecca07d2ab2e" }, "downloads": -1, "filename": "pywurfl-7.1.0-py2.5.egg", "has_sig": false, "md5_digest": "1bb866134dbc73b05e15555956a403cb", "packagetype": "bdist_egg", "python_version": "2.5", "requires_python": null, "size": 66192, "upload_time": "2010-05-07T04:12:53", "url": "https://files.pythonhosted.org/packages/eb/20/be4112177fda4b1fbee2fb5c740c8b59ec1b4d7012e21f9616a5336ace7e/pywurfl-7.1.0-py2.5.egg" }, { "comment_text": "", "digests": { "md5": "eca9f3c7d0761784630bf4d60d116c99", "sha256": "20c6d6b8a63827017566d402fa46ecb71b3d165db6ffdf48f4bab483fef3fc6a" }, "downloads": -1, "filename": "pywurfl-7.1.0.tar.gz", "has_sig": false, "md5_digest": "eca9f3c7d0761784630bf4d60d116c99", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 216320, "upload_time": "2010-05-07T04:12:52", "url": "https://files.pythonhosted.org/packages/7f/ae/fe3db24d2d91d843a3951d38f0d91f96fbdfa825099173fca1347e719513/pywurfl-7.1.0.tar.gz" } ], "7.1.1": [ { "comment_text": "", "digests": { "md5": "05d95f6f1f44fa9ce622d9ee43c49c8b", "sha256": "4299f00eaf576cdfc224c027c12c5ea3e904592f7265c32de9efd82fdeec5635" }, "downloads": -1, "filename": "pywurfl-7.1.1-py2.5.egg", "has_sig": false, "md5_digest": "05d95f6f1f44fa9ce622d9ee43c49c8b", "packagetype": "bdist_egg", "python_version": "2.5", "requires_python": null, "size": 67326, "upload_time": "2010-08-03T20:23:18", "url": "https://files.pythonhosted.org/packages/da/ef/9af63f59dd3b01947f18854c06750adf7f01e520806d0d5acf7003754a9c/pywurfl-7.1.1-py2.5.egg" }, { "comment_text": "", "digests": { "md5": "4dc5ecab57d8dbdc85b81c124cd83fe2", "sha256": "e05128a0b878c261caaa8e3c931478e4f1be6423f30004826cfce90a7a0db947" }, "downloads": -1, "filename": "pywurfl-7.1.1.tar.gz", "has_sig": false, "md5_digest": "4dc5ecab57d8dbdc85b81c124cd83fe2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 220817, "upload_time": "2010-08-03T20:22:46", "url": "https://files.pythonhosted.org/packages/aa/be/97d2644b18e97999ee26c42b9237635a3d36ce3a0ff90193389e957087a9/pywurfl-7.1.1.tar.gz" } ], "7.2": [ { "comment_text": "", "digests": { "md5": "464ebe71568d4306f178809a16806ca5", "sha256": "5eba8018a97ec8a60f3ceeb4f5fda4196779eeb00202f5a7d841d2cb8129e914" }, "downloads": -1, "filename": "pywurfl-7.2-py2.6.egg", "has_sig": false, "md5_digest": "464ebe71568d4306f178809a16806ca5", "packagetype": "bdist_egg", "python_version": "2.6", "requires_python": null, "size": 75885, "upload_time": "2010-12-16T22:31:18", "url": "https://files.pythonhosted.org/packages/b6/ad/e49823d912690ca388121e367f7e753db2cf11a11bf1fac7e6106f460d19/pywurfl-7.2-py2.6.egg" }, { "comment_text": "", "digests": { "md5": "8eb1c14ce2fe597134c7c3d96a48c3fe", "sha256": "bfcc89669beffe85a1e38d08077cfdeed80bba5eb5ef3f726dc1a2e00a96072a" }, "downloads": -1, "filename": "pywurfl-7.2.tar.gz", "has_sig": false, "md5_digest": "8eb1c14ce2fe597134c7c3d96a48c3fe", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 236460, "upload_time": "2010-12-16T22:31:16", "url": "https://files.pythonhosted.org/packages/29/a6/ff18546b0de71f898ab72972a6c52d846852f5a424728de21595ce375617/pywurfl-7.2.tar.gz" } ], "7.2.1": [ { "comment_text": "", "digests": { "md5": "427491b718892399e68e665817763578", "sha256": "64210350347e72eb0e330c410be606534b93eefc0b607b7ab348abcc4dfa445a" }, "downloads": -1, "filename": "pywurfl-7.2.1-py2.6.egg", "has_sig": false, "md5_digest": "427491b718892399e68e665817763578", "packagetype": "bdist_egg", "python_version": "2.6", "requires_python": null, "size": 76177, "upload_time": "2011-01-06T21:38:27", "url": "https://files.pythonhosted.org/packages/e1/39/b4677c450d0a86294e71a9273f1cb1c045e06ccb74d8f7ad4fc7bdf3eb60/pywurfl-7.2.1-py2.6.egg" }, { "comment_text": "", "digests": { "md5": "9c487f2548e90f7ba24125c81ed55538", "sha256": "f59e2df02b002764c31b1bcc98fdcfcc90f78ed2af48deb2345c64bf9fd79ab7" }, "downloads": -1, "filename": "pywurfl-7.2.1.tar.gz", "has_sig": false, "md5_digest": "9c487f2548e90f7ba24125c81ed55538", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 237283, "upload_time": "2011-01-06T21:38:25", "url": "https://files.pythonhosted.org/packages/70/a1/539c987497bc31dc5ed3694ea249226b37aac856d2b24d4d3e0bbb32be1d/pywurfl-7.2.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "427491b718892399e68e665817763578", "sha256": "64210350347e72eb0e330c410be606534b93eefc0b607b7ab348abcc4dfa445a" }, "downloads": -1, "filename": "pywurfl-7.2.1-py2.6.egg", "has_sig": false, "md5_digest": "427491b718892399e68e665817763578", "packagetype": "bdist_egg", "python_version": "2.6", "requires_python": null, "size": 76177, "upload_time": "2011-01-06T21:38:27", "url": "https://files.pythonhosted.org/packages/e1/39/b4677c450d0a86294e71a9273f1cb1c045e06ccb74d8f7ad4fc7bdf3eb60/pywurfl-7.2.1-py2.6.egg" }, { "comment_text": "", "digests": { "md5": "9c487f2548e90f7ba24125c81ed55538", "sha256": "f59e2df02b002764c31b1bcc98fdcfcc90f78ed2af48deb2345c64bf9fd79ab7" }, "downloads": -1, "filename": "pywurfl-7.2.1.tar.gz", "has_sig": false, "md5_digest": "9c487f2548e90f7ba24125c81ed55538", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 237283, "upload_time": "2011-01-06T21:38:25", "url": "https://files.pythonhosted.org/packages/70/a1/539c987497bc31dc5ed3694ea249226b37aac856d2b24d4d3e0bbb32be1d/pywurfl-7.2.1.tar.gz" } ] }