{ "info": { "author": "Vincent Pretre", "author_email": "vincent.pretre@gmail.com", "bugtrack_url": null, "classifiers": [ "Framework :: Django", "Framework :: Plone", "Framework :: Plone :: 3.3", "Framework :: Plone :: 4.0", "Framework :: Plone :: 4.1", "Framework :: Plone :: 4.2", "Framework :: Plone :: 4.3", "Programming Language :: Python", "Programming Language :: Python :: 2.4", "Programming Language :: Python :: 2.5", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7" ], "description": "jquery.pyproxy\n==============\n\nThe goal of jquery.pyproxy is to help integration of Ajax calls with JQuery\nin Python powered sites.\nThe main idea is to use jquery syntax inside your Python call to\nupdate the page the users are seeing. This way, you do not have to\nreturn complex data to the Javascript client that will have to decrypt\nthem.\n\nIMPORTANT: the product is not yet finalized and might not work in\nevery situations.\n\nInstalling\n----------\n\nAdd jquery.pyproxy to your buildout eggs and run the buildout, if you\ndo not use buildout, you can easy_install jquery.pyproxy (or do as you\nusually do with other products).\n\nIn Plone, go to the quickinstaller and install jquery.pyproxy. That's\nall, happy Plone users can now skip to 'Simple example'.\n\nIn Django, you should also add ``django-appmedia`` to you buildout eggs\nand ``appmedia`` to the list of installed apps. Run buildout, then run\nbin/django symlinkmedia.\nNow in your templates, add::\n\n \n\nIf you want to have a spinner automatically shown when a request is\ndone, you can also add in your header::\n\n \n \n\nYou need to have a ``pyproxy_spinner.gif`` image available at the root of\nthe site. If not (or if your media files are hosted on a different\nsubdomain), you should declare a javascrit variable called\n``pyproxy_spinner_location`` that points to the URL of the file. The\ndeclaration should be done before including the\n``jquery.pyproxy.spinner.js`` file.\n\nIf you do not want to use app_media, you can download the javascript\nlibrary from github\n(https://github.com/vincent-psarga/jquery.pyproxy/blob/master/jquery/pyproxy/media/jquery.pyproxy.min.js\n- please ensure to match the egg version and js version) and install\nit to your media folder. You can then include it to your \ntemplates.\n\n\nSimple example\n--------------\n\nA simple example should be easier to explain the idea behind\njquery.pyproxy. You do not want user to have to reload the full page\nwhen submitting a comment to your blog, so you will use an Ajax call.\nHere's how you do this with jquery.pyproxy.\n\nFirst, you create a view that will manage the information sent by the user\n(here with django, but the principle is the same with Plone)::\n\n from jquery.pyproxy.jq_django import JQueryProxy, jquery\n\n # The @jquery decorator handles the transformation of your results\n # into JSON so we can decode it on client side.\n\n @jquery\n def ajax_add_comment(request):\n # The JQuery proxy object helps us to manipulate the page the user sees.\n jq = JQueryProxy()\n # The data/form sent with Ajax just apear like a classical POST form.\n form = request.POST\n\n #we do some validation of the form.\n ...\n\n if errors:\n # We display an error message.\n jq('#my_error_message').show()\n return jq\n ...\n # We display a success message.\n jq('#my_success_message').show()\n\n # If the JQueryProxy object is not returned, nothing happens.\n return jq\n\nand finally, bind a jquery.pyproxy action to the button\nused to submit a form::\n\n $(document).ready(function() {\n $('#submit_comment').pyproxy('click',\n '/ajax_add_comment',\n '#comment_form');\n });\n\n\nUsing the JQueryPyproxy object\n------------------------------\n\nFirst, you need to import the correct JQueryProxy object:\n\n - if you use Plone: from jquery.pyproxy.plone import JQueryProxy\n\n - if you use Django: from jquery.pyproxy.jq_django import JQueryProxy\n\nBoth are based on the same object, defined in the base.py module::\n\n >>> from jquery.pyproxy.base import JQueryProxy\n\nThe main idea behind this project was to be able to use the same\nsyntax than with jQuery, so you can more or less copy-paste some\nsamples on the web or some existing code.\nOf course, as we are using Python, we can not use the dollar sign as a\nidentifier::\n\n >>> $ = JQueryPyproxy()\n Traceback (most recent call last):\n ...\n SyntaxError: invalid syntax\n\nSo in our examples we declare our object as ``jq``, which is the classic\nway in Plone to name the jQuery object::\n\n >>> jq = JQueryProxy()\n\nCurrently, JQueryProxy supports all manipulation API of JQuery 1.4 and all\nthe effect API.\n\n >>> sorted(jq.grammar.keys())\n ['addClass', 'after', 'animate', 'append', 'appendTo',\n 'attr', 'before', 'css', 'detach', 'empty', 'fadeIn',\n 'fadeOut', 'fadeTo', 'find', 'hide', 'html', 'insertAfter',\n 'insertBefore', 'parent', 'prepend', 'prependTo', 'remove',\n 'removeAttr', 'removeClass', 'replaceAll', 'replaceWith',\n 'show', 'slideDown', 'slideToggle', 'slideUp', 'text',\n 'toggle', 'toggleClass', 'unwrap', 'wrap', 'wrapAll', 'wrapInner']\n\n\nSo if you know how to use them in jQuery, you know how to use them\nwith pyproxy, for example::\n\n >>> jq('#error_msg').html('Errors have been found, please correct them')\n >>> jq('#error_email').show()\n\nThe way the jQuery methods are declared are matching the API of\njQuery (except for the callbacks, see the 'Limitations' part). So if\nyou use incorrect arguments, you will get errors in the Python code\n(which should help you a lot when debugging, at least you should have\nserver logs)::\n\n >>> jq('.to_slide').slideDown()\n Traceback (most recent call last):\n ...\n TypeError: Method 'slideDown' takes exactly 1 arguments\n\n >>> jq('.empty').empty('Spanish argument is like Spanish inquisition: no one expects it')\n Traceback (most recent call last):\n ...\n TypeError: Method 'empty' does not take any argument\n\n >>> jq('.to_fade').fadeTo('something', 'wrong type')\n Traceback (most recent call last):\n ...\n TypeError: Argument 2 of method fadeTo must be: \n\n\nIf you need to process a list of selectors, you can use the ``batch``\nmethod of the JQueryObject. It takes five arguments:\n\n - a list of selectors\n - the method to apply\n - the list of arguments for this method\n - a prefix to add before each selector (optional)\n - a substituion list on which the selector will be applied (optional)\n\nThat can be usefull for example when you have a list of error to display::\n\n >>> my_errors = ['email', 'title', 'text']\n >>> jq.batch(my_errors, 'addClass', ['error'], substitution='#%s_error')\n >>> jq.list_calls()[-3:]\n [\"jq('#email_error').addClass('error')\",\n \"jq('#title_error').addClass('error')\",\n \"jq('#text_error').addClass('error')\"]\n\nThat is equivalent to::\n\n >>> for err in my_errors:\n ... jq('#' + err + '_error').addClass('error')\n >>> jq.list_calls()[-3:]\n [\"jq('#email_error').addClass('error')\",\n \"jq('#title_error').addClass('error')\",\n \"jq('#text_error').addClass('error')\"]\n\nYou can also chain the jQuery calls as you would do on the Javascript side::\n\n >>> jq('.nice_divs').css({'width': '200px'}).fadeIn(10)\n >>> jq.list_calls()[-1]\n \"jq('.nice_divs').css({'width': '200px'}).fadeIn(10)\"\n\nNote that we don't check (yet) if the call returns something that can\nbe chained.\n\nWhen you need to have a clear overview of which calls have been done\nby the jq object, you can use the ``list_calls`` method::\n\n >>> jq.list_calls()\n [\"jq('#error_msg').html('Errors have been found, please correct them')\",\n \"jq('#error_email').show()\",\n \"jq('.to_slide').slideDown()\",\n \"jq('.empty').empty()\",\n \"jq('.to_fade').fadeTo()\",\n \"jq('#email_error').addClass('error')\",\n \"jq('#title_error').addClass('error')\",\n \"jq('#text_error').addClass('error')\",\n \"jq('#email_error').addClass('error')\",\n \"jq('#title_error').addClass('error')\",\n \"jq('#text_error').addClass('error')\",\n \"jq('.nice_divs').css({'width': '200px'}).fadeIn(10)\"]\n\n\nYou can see that even failing calls are stored here (but not the\nparameters).\nThis is due to the fact that we are in the doctests. In\nreal-life use case, as a exception is raised your code will stop after\nthe problem has been found.\n\n\nExtending JQuery proxy\n----------------------\n\nIf you want to be able to use jQuery methods that are not known by\ndefault, you have to extend the list of methods known by JQueryPyproxy.\nIn our example, we'll consider that you want to use a ``showDialog``\nmethod from an extra-plugin.\nBy default, it does not works (which is logical as pyproxy does not\nhave a clue of which jQuery plugins you are using)::\n\n >>> jq('.bla').showDialog()\n Traceback (most recent call last):\n ...\n AttributeError: 'JQueryCommand' object has no attribute 'showDialog'\n\nTo be able to use the method, you need to define the list of extra\nmethods you want to use and the parameters expected.\nHere we only define the ``showDialog`` method, taking three parameters\n(the first one is a string or unicode, the second one an int, a string\nor a unicode and the last one a optional dictionnary)::\n\n >>> from types import NoneType\n >>> my_plugin = {'showDialog': [[str, unicode],\n ... [str, unicode, int],\n ... [dict, NoneType]]}\n\nThen, you can use the ``extend_grammar`` method so your methods are recognized::\n\n >>> jq.extend_grammar(my_plugin)\n >>> 'showDialog' in jq.grammar\n True\n >>> jq.grammar['showDialog']\n [[, ],\n [, , ],\n [, ]]\n >>> jq('#my_dialog').showDialog('some text', 42, dict(opt1 = 2, opt2 = False))\n\n\nAnd of course it respects the grammar you defined::\n\n >>> jq('.bla').showDialog()\n Traceback (most recent call last):\n ...\n TypeError: Method 'showDialog' takes between 2 and 3 arguments\n\n >>> jq('.bla').showDialog(1, 2, 3)\n Traceback (most recent call last):\n ...\n TypeError: Argument 1 of method showDialog must have one of the following types: [, ]\n\n >>> jq('.grep').showDialog('blabla', 'fich')\n\nIf you need to use custom methods in all your Ajax views, it will be painfull\nto extend the grammar every time.\nYou have some options to solve this.\n\n1) if you use the source code of jquery.pyproxy:\nadd a file called ``my_plugin.py`` in jquery.pyproxy/jquery/pyproxy/plugins.\nIn this file, describe your plugin with the dictionnary as explained before.\nThis dictionnary must be called ``grammar``.\n\n2) you do not use the source, just the egg.\nCreate a new Python class, subclassing JQueryProxy. Declare a\n``base_grammar`` property in this object that describes your grammar::\n\n >>> class MyJQueryProxy(JQueryProxy):\n ... base_grammar = {'showDialog': [[str, unicode],\n ... [str, unicode, int],\n ... [dict, NoneType]]}\n >>> my_jq = MyJQueryProxy()\n >>> my_jq('.bla').showDialog('a', 2)\n\nand in your views, use this class instead of the JQueryProxy class.\n\n3) integrate your grammar in the next release.\nIn any case, do not hesitate to submit the grammars you defined so it can\nbe integrated in the next release of jquery.pyproxy.\n\n\nLimitations\n-----------\n\nThere is currently two (at least) major limitations.\n\nFirst, you can not store your selector, like this::\n\n >>> jq = JQueryProxy()\n >>> divs = jq('.nice_divs')\n >>> divs.css({'width': '200px'})\n >>> divs.fadeIn(10)\n\nIt seems to work fine, but if we have a close looks to what has been\nstored by the jq object, we can see that only the last call was\nsaved and the call to 'css({width': '200px'})' will never be executed::\n\n >>> jq.list_calls()\n [\"jq('.nice_divs').fadeIn(10)\"]\n\nThe proper way to write this code is::\n\n >>> jq = JQueryProxy()\n >>> jq('.nice_divs').css({'width': '200px'})\n >>> jq('.nice_divs').fadeIn(10)\n\nNow if we look at what has ben stored by the object, we see all wanted\ncalls::\n\n >>> jq.list_calls()\n [\"jq('.nice_divs').css({'width': '200px'})\",\n \"jq('.nice_divs').fadeIn(10)\"]\n\nThe second one is that the callback are not handled, so you can not use\nsomething like this::\n\n >>> jq('.animated').show(10, 'my_callback')\n Traceback (most recent call last):\n ...\n TypeError: Method 'show' takes between 0 and 1 arguments\n\nEven if the jQuery doc tells that the show method can take multiple\narguments (which is true, but not here).\n\n\nIs there some samples available ?\n---------------------------------\n\nIf you use Plone, add the following to one available\n``configure.zcml`` file (the one from your theme from example)::\n\n \n\nRestart the instance and then open\n``http://localhost:8080/your_plone_site/pyproxy_samples``.\n\nIf you use Django, some samples will be added later.\n\nTesting the module\n------------------\n\nThere are tests embedded in this package to ensure it works\ncorrectly. To run the tests on the python side, you can run::\n\n bin/instance test -m jquery.pyproxy (for Plone users)\n bin/django test pyproxy (for Django users with a buildout)\n ./manage.py test pyproxy (for Django users without buildout)\n\nThere is also qUnit tests to ensure the jQuery library works\ncorreclty. For the moment it is only available for Plone users. First,\nyou have to load the 'tests.zcml' file from jquery.pyproxy.\nFor example in the main configure.zcml of a product you develop::\n\n \n\nThen, in the ZMI, go to the portal_setup, then the ``import``\ntab. Select ``jquery.pyproxy tests`` in the list, select the ``Skins\ntools`` step and then click on ``Import selected steps``.\nIn the ``portal_skins`` tool, you should see a new folder called\n``pyproxy_tests``. Now open\n``http://localhost:8080/your_plone_site/pyproxy_tests`` and you will\nsee the qUnit tests running.\n\nI use Python but not Django or Plone\n------------------------------------\n\nYou should use Django.\n\nIf this solution is not acceptable, you can still update the\n@jquery decorator to work with your framework. The only\nthing this decorator does is to transform the JQueryProxy object\nreturned by the function into JSON.\nTo make the transformation, this code is enough::\n\n >>> import simplejson as json\n >>> jq_to_json = json.dumps(jq.json_serializable())\n >>> jq_to_json\n '[{\"args\": [{\"width\": \"200px\"}], \"call\": \"css\", \"selector\": \".nice_divs\"}, {\"args\": [10], \"call\": \"fadeIn\", \"selector\": \".nice_divs\"}, {\"args\": [], \"call\": \"show\", \"selector\": \".animated\"}]'\n\nThen, the jq_to_json object must be returned according to your\nframework system (for example for Plone we just return it, for Django \nwe wrap it into a HttpResponse object).\n\nIf you ported the @jquery decorator to any framework, please let me\nknow so it can be integrated in the next release.\n\n\nCompatibility\n-------------\n\nTested with:\n\n - jQuery 1.2 and 1.4\n\n - Python 2.4 and 2.6\n\n - Firefox\n\n - Chrome\n\n - Safari\n\n - IE\n\n\nRoadmap\n=======\n\nWhat should be coming for the next releases.\n\n0.5\n---\n\n - tests for the Plone specifics. [done]\n\n - tests for the Django specifics (there should only be the @jquery\n decorator). [done]\n\n0.6\n---\n\n - refactor the jQuery plugin, so it takes only one argument which\n will be a dictionnary of options.\n\n - include some utility to extract data from a URL (the opposite of\n the native 'params' method).\n\n - allow debug mode for a specific call instead of having a\n global setting.\n\n - add custom events when request starts/ends.\n\n - use the events to show the spinner.\n\n\n1.0\n---\n\n - allow storing the selector and do multiple calls on it.\n\nlater on\n--------\n\n - allow callbacks.\n\nChangelog\n=========\n\n0.5 (2013-09-24)\n----------------\n\n- Add empty upgrade step to properly set our profile version.\n [maurits]\n\n- Adapt imports to work in Plone 3.3 through 4.3.\n [maurits]\n\n\n0.4.3 (2013-06-04)\n------------------\n\n- Point to http://github.com/zestsoftware/jquery.pyproxy\n [maurits]\n\n- added Django specific tests. [vincent]\n\n- finished Plone specific tests. [vincent]\n\n\n0.4.2 (2013-02-25)\n------------------\n\n- Fix issue with Diazo wrapping the responses with HTML\n tags. [vincent]\n\n\n0.4.1 (2011-09-19)\n------------------\n\n- Updated the minified version. [vincent]\n\n0.4 (2011-09-19)\n----------------\n\n- added find() and parent() support. [vincent]\n\n- added support for chained calls. [vincent]\n\n- Added support for 'this'. [vincent]\n\n\n0.3.1 (2011-05-09)\n------------------\n\n- removed the 'debug' fonction that was sometimes comflicting with\n other products. [vincent]\n\n\n0.3 (2011-02-25)\n----------------\n\n- you can now specify a callback without specifying a form to\n send. [vincent]\n\n- added tests for the jQuery plugin. [vincent]\n\n- removed the 'eval()' calls in process_call. Also removed\n arg_to_string not needed anymore and disabled 'clean_string' which\n is also not needed anymore. [vincent]\n\n- extracted sub-methods from the jquery plugin to easy testing. All\n are prefixed with pyproxy to avoid name conflicts. [vincent]\n\n- added roadmap. [vincent]\n\n- added extra JS/CSS file to show a spinner when a request is\n done. The spinner image was generated using ajaxload.info/ [vincent] \n\n- finally added tests for the base python code. Tests for the jquery\n plugin and customized Plone.Django object to come. [vincent+maurits]\n\n- IMPORTANT: the 'grammar' attribute has been renamed 'base_grammar'\n attribute. If you created sub-classes of the JQueryProxy object,\n update them. Using the 'grammar' attribute caused a problem as it\n was not initialized in the __init__ method, the value was spread to\n every instances of the JQueryProxy object. [vincent]\n\n- added a 'batch' method on the JueryProxy object to process multiple\n entries. It should be used to replace show_errors and\n hide_errors. [vincent]\n\n- deprecated jq.show_errors and jq.hide_errors as it was based\n on Plone CSS classes. [vincent]\n\n- moved 'clean_string', 'package_contents' and 'custom_endswith' to\n utils. [vincent]\n\n- small bugfix in Plone version to hide the previous portal\n messages. [vincent]\n\n- updated __init__.py to declare the namespace to avoid problems with\n setuptools 0.7. [vincent]\n\n\n0.2 (2010-10-22)\n----------------\n\n- renamed django.py in jq_django.py as it was giving conflicts when\n importing HttpResponse. [vincent]\n\n- moved jquery.pyproxy.js in a folder called 'media' so it can be used\n easily by django user with django-appmedia. Also added some\n registration for plone users so jquery.pyproxy appears in the\n quick_installer and automatically adds the JS file to the\n jsregistry. [vincent]\n\n- bugfix: fadeOut and fadeIn did not have correct names in\n plugins/jq_effects. [vincent]\n\n- Added 'PreventDefault' in make_call - using 'return false' works for\n links but is not enough for submit buttons. [vincent]\n\n\n0.1 (2010-04-19)\n----------------\n\n- bugfix in base: package_contents did not work with python\n 2.4. [vincent]\n\n- renamed jquerypyproxy in jquery.pyproxy [vincent]\n\n- bugfix in base: the grammar was not passed to the objects\n created. [vincent] \n\n- bugfix in base: str.endswith(tuple) only works in python 2.5+, added\n a custom endswith. [vincent]\n\n- bugfix in plone.py: typo in the class name. [vincent]\n\n- added append in grammar. [vincent]\n\n- added basic javascript calls. [vincent]\n\n- added JQueryProxy Python class and decorators for plone and\n Django. [vincent]\n\n- added log file + python egg. [vincent]", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://github.com/zestsoftware/jquery.pyproxy", "keywords": "jquery python proxy", "license": "GPL", "maintainer": null, "maintainer_email": null, "name": "jquery.pyproxy", "package_url": "https://pypi.org/project/jquery.pyproxy/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/jquery.pyproxy/", "project_urls": { "Download": "UNKNOWN", "Homepage": "http://github.com/zestsoftware/jquery.pyproxy" }, "release_url": "https://pypi.org/project/jquery.pyproxy/0.5/", "requires_dist": null, "requires_python": null, "summary": "A simple python egg and jquery plugin to easily use JQuery in Django/Plone/.. websites.", "version": "0.5" }, "last_serial": 872645, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "8701e34cef994afddd9a61ed2b1e0883", "sha256": "f2bf9bedb03b5d2e2b023b47e4b56ee287ead63ddf52a99ee5e87ffb3f4ee93d" }, "downloads": -1, "filename": "jquery.pyproxy-0.1.tar.gz", "has_sig": false, "md5_digest": "8701e34cef994afddd9a61ed2b1e0883", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12402, "upload_time": "2010-04-23T11:53:45", "url": "https://files.pythonhosted.org/packages/46/17/22d0ad6589cac20966074a26f5f371873eb0ad903fe95cd8fd3bf218794f/jquery.pyproxy-0.1.tar.gz" } ], "0.2": [ { "comment_text": "", "digests": { "md5": "034bfacfd53fea08541746a9521d1884", "sha256": "7e215d3b49ab41e49972af12c519f17f31dfe89e3140d951fc3666bd2fa0c56f" }, "downloads": -1, "filename": "jquery.pyproxy-0.2.zip", "has_sig": false, "md5_digest": "034bfacfd53fea08541746a9521d1884", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23510, "upload_time": "2010-10-22T14:20:08", "url": "https://files.pythonhosted.org/packages/cd/a4/6ec1560ec6a4f053f96d9c5004179fd2bf6542b5bde481918a80bb1aa26b/jquery.pyproxy-0.2.zip" } ], "0.3": [ { "comment_text": "", "digests": { "md5": "fc526c69d5e40a424681b9e1ae612256", "sha256": "8204f4c8ce41c986d251617915f069c01b7224d71d4e3ccd4189f71678da71bc" }, "downloads": -1, "filename": "jquery.pyproxy-0.3.zip", "has_sig": false, "md5_digest": "fc526c69d5e40a424681b9e1ae612256", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 67709, "upload_time": "2011-02-25T20:12:26", "url": "https://files.pythonhosted.org/packages/eb/f0/abb0470537837711b6b5ffcb6a6adc436feac3f1818a487d1e1c26ecfada/jquery.pyproxy-0.3.zip" } ], "0.3.1": [ { "comment_text": "", "digests": { "md5": "925450cdae4c58bf601c9ecf9bb8b918", "sha256": "f46888bd66829143ae186f64eb564115977bacfa0de7b0c798728ffaca493908" }, "downloads": -1, "filename": "jquery.pyproxy-0.3.1.zip", "has_sig": false, "md5_digest": "925450cdae4c58bf601c9ecf9bb8b918", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 67951, "upload_time": "2011-05-09T15:18:58", "url": "https://files.pythonhosted.org/packages/c4/e6/923bc54a54c6f43ae0dd625d74e1c9661104e3a2d7b33906afd1f465b066/jquery.pyproxy-0.3.1.zip" } ], "0.4": [ { "comment_text": "", "digests": { "md5": "6deb91b7b5774cedddeeaf3dcface448", "sha256": "7d2c092c3ba72d86745386a6eb6d0ab63a4dd19749f786da6d159b93d941cdae" }, "downloads": -1, "filename": "jquery.pyproxy-0.4.zip", "has_sig": false, "md5_digest": "6deb91b7b5774cedddeeaf3dcface448", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 69340, "upload_time": "2011-09-19T11:24:38", "url": "https://files.pythonhosted.org/packages/2a/4b/f9762f761412732a23e74c49afa26a6309197eb96183fe38dd1555929a02/jquery.pyproxy-0.4.zip" } ], "0.4.1": [ { "comment_text": "", "digests": { "md5": "4de83b8c70ada1b000f66395252031e7", "sha256": "41f1db7ffc5a69abd36bdce2dd039758cedd4f1d14948e29ca92cb40c5fcd085" }, "downloads": -1, "filename": "jquery.pyproxy-0.4.1.zip", "has_sig": false, "md5_digest": "4de83b8c70ada1b000f66395252031e7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 69709, "upload_time": "2011-09-19T11:35:48", "url": "https://files.pythonhosted.org/packages/80/f0/f9b4a69538206977ffa95fc238cb6f815405278a109bcdc10c76fc6931a0/jquery.pyproxy-0.4.1.zip" } ], "0.4.2": [ { "comment_text": "", "digests": { "md5": "9640638b3cec27a3953820cac1fc4a81", "sha256": "2ebd2b01c7aefe2c1462d425771a4cf4df6de60a99c936ff06a149e6dccb2e4d" }, "downloads": -1, "filename": "jquery.pyproxy-0.4.2.zip", "has_sig": false, "md5_digest": "9640638b3cec27a3953820cac1fc4a81", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 70241, "upload_time": "2013-02-25T16:25:36", "url": "https://files.pythonhosted.org/packages/f4/d9/7e5744d785a03aff42a89e37ac7c380b239822d93145a32e9ceb71bbbd48/jquery.pyproxy-0.4.2.zip" } ], "0.4.3": [ { "comment_text": "", "digests": { "md5": "362443d8816ef7963036c205774a06eb", "sha256": "39429ecd4039f10df4d11f394e9741448f118a49e9a48bdffd16f1e4c92b7820" }, "downloads": -1, "filename": "jquery.pyproxy-0.4.3.zip", "has_sig": false, "md5_digest": "362443d8816ef7963036c205774a06eb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 74373, "upload_time": "2013-06-04T15:24:31", "url": "https://files.pythonhosted.org/packages/fe/58/4003caa5f832851685f1561e37123dbbbe9a315718ad41faf479e95cf426/jquery.pyproxy-0.4.3.zip" } ], "0.5": [ { "comment_text": "", "digests": { "md5": "df15b05ca6b021c9ca58c1dfa0305673", "sha256": "3ebafbf362c6c9f1b7aebf6a5cdd7ecb8de5f555b9a38c81510ce6196dad3671" }, "downloads": -1, "filename": "jquery.pyproxy-0.5.zip", "has_sig": false, "md5_digest": "df15b05ca6b021c9ca58c1dfa0305673", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 75336, "upload_time": "2013-09-24T11:04:28", "url": "https://files.pythonhosted.org/packages/7a/01/7b55c2d6123d3db56b44985ed2f2650e5c8c9efe18d288f18ebe390cb15c/jquery.pyproxy-0.5.zip" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "df15b05ca6b021c9ca58c1dfa0305673", "sha256": "3ebafbf362c6c9f1b7aebf6a5cdd7ecb8de5f555b9a38c81510ce6196dad3671" }, "downloads": -1, "filename": "jquery.pyproxy-0.5.zip", "has_sig": false, "md5_digest": "df15b05ca6b021c9ca58c1dfa0305673", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 75336, "upload_time": "2013-09-24T11:04:28", "url": "https://files.pythonhosted.org/packages/7a/01/7b55c2d6123d3db56b44985ed2f2650e5c8c9efe18d288f18ebe390cb15c/jquery.pyproxy-0.5.zip" } ] }