{ "info": { "author": "Jean-Francois Roche", "author_email": "jfroche@affinitic.be", "bugtrack_url": null, "classifiers": [ "Environment :: Web Environment", "Framework :: Zope2", "Framework :: Zope3", "License :: OSI Approved :: Zope Public License", "Operating System :: OS Independent", "Programming Language :: Python", "Topic :: Internet :: WWW/HTTP :: Site Management", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "SOAP Support\n============\n\nThis SOAP implementation allows you provide SOAP views for objects. The\nSOAP layer is based on `ZSI `__.\n\nThe package requires ZSI 2.0 or better.\n\nSOAP support is implemented in a way very similar to the standard Zope\nXML-RPC support. To call methods via SOAP, you need to create and\nregister SOAP views.\n\nVersion >= 0.5.4 are intended to be used with Zope 2.13 and higher.\nOlder versions (0.5.3 and under) should work correctly with Zope < 2.13\n\nThis package is largely inspired from Zope 3 SOAP (http://svn.zope.org/soap).\n\nLet's write a simple SOAP view that echoes various types of input:\n\n >>> import ZSI\n >>> from Products.Five import BrowserView\n >>> class EchoView(BrowserView):\n ...\n ... def echoString(self, value):\n ... return value\n ...\n ... def echoStringArray(self, value):\n ... return value\n ...\n ... def echoInteger(self, value):\n ... return value\n ...\n ... def echoIntegerArray(self, value):\n ... return value\n ...\n ... def echoFloat(self, value):\n ... return value\n ...\n ... def echoFloatArray(self, value):\n ... return value\n ...\n ... def echoStruct(self, value):\n ... return value\n ...\n ... def echoStructArray(self, value):\n ... return value\n ...\n ... def echoVoid(self):\n ... return\n ...\n ... def echoBase64(self, value):\n ... import base64\n ... return base64.encodestring(value)\n ...\n ... def echoDate(self, value):\n ... import time\n ... return time.gmtime(time.mktime(value))\n ...\n ... def echoDecimal(self, value):\n ... return value\n ...\n ... def echoBoolean(self, value):\n ... return value\n ...\n ... def ValidateEmailRequest(self, requestData, response):\n ... mail = requestData._Email\n ... response._Status = '%s is OK' % mail\n ... return response\n ...\n ... def testFault(self):\n ... raise ZSI.Fault(ZSI.Fault.Client, \"Testing the zsi fault\")\n\n\n\nNow we'll register it as a SOAP view. For now we'll just register the\nview for folder objects and call it on the root folder:\n\n >>> from zope.configuration import xmlconfig\n >>> ignored = xmlconfig.string(\"\"\"\n ... \n ...\n ... \n ...\n ... \n ... \n ... \n ...\n ... \n ...\n ... \n ...\n ... \n ...\n ...\n ... \n ... \"\"\")\n\n\nAnd call our SOAP method:\n\n >>> from Testing.ZopeTestCase import user_name, user_password\n >>> self.setRoles(['Manager'])\n\n >>> print http(r\"\"\"\n ... POST /test_folder_1_ HTTP/1.0\n ... Authorization: Basic %s:%s\n ... Content-Length: 102\n ... Content-Type: text/xml\n ... SOAPAction: /\n ...\n ... \n ... \n ... \n ... \n ... hello\n ... \n ... \n ... \n ... \"\"\" % (user_name, user_password), handle_errors=True)\n HTTP/1.0 200 OK\n Content-Length: ...\n Content-Type: text/xml\n \n ...hello...\n\n\nNote that we get an unauthorized error if we don't supply authentication\ncredentials, because we protected the view with the ManageContent permission\nwhen we registered it:\n\n >>> self.logout()\n >>> print http(r\"\"\"\n ... POST /test_folder_1_ HTTP/1.0\n ... Content-Length: 102\n ... Content-Type: text/xml\n ... SOAPAction: /\n ...\n ... \n ... \n ... \n ... \n ... hello\n ... \n ... \n ... \n ... \"\"\")\n HTTP/1.0 401 Unauthorized\n Content-Length: ...\n Content-Type: text/xml\n Www-Authenticate: basic realm=\"Zope2\"\n \n SOAP-ENV:ServerNot authorized\n\n\nParameters\n----------\n\nSOAP views can take any parameters that ZSI can understand. The following\ndemonstrate the use of primitive SOAP-defined types:\n\n >>> print http(r\"\"\"\n ... POST /test_folder_1_ HTTP/1.0\n ... Authorization: Basic %s:%s\n ... Content-Length: 102\n ... Content-Type: text/xml\n ... SOAPAction: /\n ...\n ... \n ... \n ... \n ... \n ... hello\n ... \n ... \n ... \n ... \"\"\" % (user_name, user_password))\n HTTP/1.0 200 OK\n Content-Length: ...\n Content-Type: text/xml...\n \n ...hello...\n\n\n >>> print http(r\"\"\"\n ... POST /test_folder_1_ HTTP/1.0\n ... Authorization: Basic %s:%s\n ... Content-Length: 102\n ... Content-Type: text/xml\n ... SOAPAction: /\n ...\n ... \n ... \n ... \n ... \n ... \n ... one\n ... two\n ... three\n ... four\n ... \n ... \n ... \n ... \n ... \"\"\" % (user_name, user_password))\n HTTP/1.0 200 OK\n Content-Length: ...\n Content-Type: text/xml...\n \n ...one...two...three...four...\n\n\n >>> print http(r\"\"\"\n ... POST /test_folder_1_ HTTP/1.0\n ... Authorization: Basic %s:%s\n ... Content-Length: 102\n ... Content-Type: text/xml\n ... SOAPAction: /\n ...\n ... \n ... \n ... \n ... \n ... 42\n ... \n ... \n ... \n ... \"\"\" % (user_name, user_password))\n HTTP/1.0 200 OK\n Content-Length: ...\n Content-Type: text/xml...\n \n ...42...\n\n\n >>> print http(r\"\"\"\n ... POST /test_folder_1_ HTTP/1.0\n ... Authorization: Basic %s:%s\n ... Content-Length: 102\n ... Content-Type: text/xml\n ... SOAPAction: /\n ...\n ... \n ... \n ... \n ... \n ... \n ... 1\n ... 2\n ... 3\n ... 4\n ... \n ... \n ... \n ... \n ... \"\"\" % (user_name, user_password))\n HTTP/1.0 200 OK\n Content-Length: ...\n Content-Type: text/xml...\n \n ...1...2...3...4...\n\n\nNote that floats are returned as xsd:decimal values:\n\n >>> print http(r\"\"\"\n ... POST /test_folder_1_ HTTP/1.0\n ... Authorization: Basic %s:%s\n ... Content-Length: 102\n ... Content-Type: text/xml\n ... SOAPAction: /\n ...\n ... \n ... \n ... \n ... \n ... 42.2\n ... \n ... \n ... \n ... \"\"\" % (user_name, user_password))\n HTTP/1.0 200 OK\n Content-Length: ...\n Content-Type: text/xml\n \n ...xsi:type=\"xsd:float\">42.200000>> print http(r\"\"\"\n ... POST /test_folder_1_ HTTP/1.0\n ... Authorization: Basic %s:%s\n ... Content-Length: 102\n ... Content-Type: text/xml\n ... SOAPAction: /\n ...\n ... \n ... \n ... \n ... \n ... \n ... 1.1\n ... 2.2\n ... 3.3\n ... 4.4\n ... \n ... \n ... \n ... \n ... \"\"\" % (user_name, user_password))\n HTTP/1.0 200 OK\n Content-Length: ...\n Content-Type: text/xml\n \n ...xsi:type=\"xsd:float\">1.1000002.2000003.3000004.400000>> result = http(r\"\"\"\n ... POST /test_folder_1_ HTTP/1.0\n ... Authorization: Basic %s:%s\n ... Content-Length: 102\n ... Content-Type: text/xml\n ... SOAPAction: /\n ...\n ... \n ... \n ... \n ... \n ... \n ... first 1\n ... last 1\n ... \n ... \n ... \n ... \n ... \"\"\" % (user_name, user_password))\n\n >>> result = str(result)\n >>> assert(result.find('first 1') > -1)\n >>> assert(result.find('last 1') > -1)\n\n\nNote that arrays of structs (at least per the interop suite) do not\nseem to work:\n\n >>> print http(r\"\"\"\n ... POST /test_folder_1_ HTTP/1.0\n ... Authorization: Basic %s:%s\n ... Content-Length: 102\n ... Content-Type: text/xml\n ... SOAPAction: /\n ...\n ... \n ... \n ... \n ... \n ... \n ... \n ... str 1\n ... 1\n ... \n ... \n ... str 2\n ... 2\n ... \n ... \n ... \n ... \n ... \n ... \"\"\" % (user_name, user_password), handle_errors=True)\n HTTP/1.0 500 Internal Server Error\n Content-Length: ...\n Content-Type: text/xml\n \n >> print http(r\"\"\"\n ... POST /test_folder_1_ HTTP/1.0\n ... Authorization: Basic %s:%s\n ... Content-Length: 102\n ... Content-Type: text/xml\n ... SOAPAction: /\n ...\n ... \n ... \n ... \n ... \n ... \n ... \n ... \n ... \"\"\" % (user_name, user_password))\n HTTP/1.0 200 OK\n Content-Length: ...\n Content-Type: text/xml\n \n ...echoVoidResponse...\n\n\n >>> print http(r\"\"\"\n ... POST /test_folder_1_ HTTP/1.0\n ... Authorization: Basic %s:%s\n ... Content-Length: 102\n ... Content-Type: text/xml\n ... SOAPAction: /\n ...\n ... \n ... \n ... \n ... \n ... AAECAwQF\n ... \n ... \n ... \n ... \"\"\" % (user_name, user_password))\n HTTP/1.0 200 OK\n Content-Length: ...\n Content-Type: text/xml...\n \n ...AAECAwQF...\n\n\nDatetimes appear to work:\n\n >>> print http(r\"\"\"\n ... POST /test_folder_1_ HTTP/1.0\n ... Authorization: Basic %s:%s\n ... Content-Length: 102\n ... Content-Type: text/xml\n ... SOAPAction: /\n ...\n ... \n ... \n ... \n ... \n ... 1970-11-27T11:34:56.000Z\n ... \n ... \n ... \n ... \"\"\" % (user_name, user_password))\n HTTP/1.0 200 OK\n Content-Length: ...\n Content-Type: text/xml...\n \n ...1970-11-27T10:34:56...\n\n >>> print http(r\"\"\"\n ... POST /test_folder_1_ HTTP/1.0\n ... Authorization: Basic %s:%s\n ... Content-Length: 102\n ... Content-Type: text/xml\n ... SOAPAction: /\n ...\n ... \n ... \n ... \n ... \n ... 123456789.0123\n ... \n ... \n ... \n ... \"\"\" % (user_name, user_password))\n HTTP/1.0 200 OK\n Content-Length: ...\n Content-Type: text/xml...\n \n ...123456789.0123...\n\n\n >>> print http(r\"\"\"\n ... POST /test_folder_1_ HTTP/1.0\n ... Authorization: Basic %s:%s\n ... Content-Length: 102\n ... Content-Type: text/xml\n ... SOAPAction: /\n ...\n ... \n ... \n ... \n ... \n ... 1\n ... \n ... \n ... \n ... \"\"\" % (user_name, user_password))\n HTTP/1.0 200 OK\n Content-Length: ...\n Content-Type: text/xml...\n \n ...1...\n\n\n\nFaults\n------\n\nIf you need to raise an error, you can either raise an exception as usual\nor (if you need more control over fault info) return a `ZSI.Fault` object\ndirectly. Either case causes a fault response to be returned:\n\n >>> print http(r\"\"\"\n ... POST /test_folder_1_ HTTP/1.0\n ... Authorization: Basic %s:%s\n ... Content-Length: 104\n ... Content-Type: text/xml\n ... SOAPAction: /\n ...\n ... \n ... \n ... \n ... \n ... hello\n ... \n ... \n ... \n ... \"\"\" % (user_name, user_password), handle_errors=True)\n HTTP/1.0 500 Internal Server Error\n Content-Length: ...\n Content-Type: text/xml\n \n SOAP-ENV:ServerProcessing Failure\n ...\n\nHere is a ZSI Fault response:\n\n >>> print http(r\"\"\"\n ... POST /test_folder_1_ HTTP/1.0\n ... Authorization: Basic %s:%s\n ... Content-Length: 104\n ... Content-Type: text/xml\n ... SOAPAction: /\n ...\n ... \n ... \n ... \n ... \n ... \n ... \n ... \n ... \"\"\" % (user_name, user_password), handle_errors=True)\n HTTP/1.0 200 OK\n Content-Length: 488\n Content-Type: text/xml\n \n SOAP-ENV:ClientTesting the zsi fault\n\n\nComplex Types\n-------------\n\nFor ZSI to successfully marshal complex values (instances of classes),\nyou must define a typecode that describes the object (see the ZSI docs\nfor details on defining typecodes). Once the typecode is defined, it must\nbe accessible through an instance via the attribute name 'typecode' to\nbe automatically marshalled.\n\n\n >>> print http(r\"\"\"\n ... POST /test_folder_1_ HTTP/1.0\n ... Authorization: Basic %s:%s\n ... Content-Length: 104\n ... Content-Type: text/xml\n ... SOAPAction: /\n ...\n ... \n ... \n ... \n ... \n ... jfroche@affinitic.be\n ... \n ... \n ... \"\"\" % (user_name, user_password))\n HTTP/1.0 200 OK\n Content-Length: ...\n Content-Type: text/xml\n \n ...jfroche@affinitic.be is OK...\n\nMem tests\n=========\n\n >>> import sys\n >>> from xml.dom.minidom import Element, Node\n >>> print sys.getrefcount(Element)\n 5\n >>> from z3c.soap.tests.mailvalidation import ns1\n >>> from ZSI import SoapWriter\n >>> from ZSI import TC\n >>> element = ns1.ValidateEmailRequest_Dec().pyclass()\n >>> element._Email = 'foo@bar.be'\n >>> sw = SoapWriter(nsdict={}, header=True, outputclass=None,\n ... encodingStyle=None)\n >>> tc = TC.Any(aslist=1, pname='test')\n\nWe serialize more than one copy of the previously created element\n\n >>> res = sw.serialize([element, element, element, element, element], tc)\n >>> print sys.getrefcount(Element)\n 19\n >>> print sw\n foo@bar.befoo@bar.befoo@bar.befoo@bar.befoo@bar.be\n >>> print sys.getrefcount(Element)\n 19\n >>> del res\n >>> del sw.body.node\n >>> del sw.body\n >>> del sw.dom.node\n >>> del sw.dom\n >>> del sw\n >>> print sys.getrefcount(Element)\n 19\n\nSo when a soapwriter is deleted there are still 19 references to Element active (this can be a\ndisaster with large xml).\n\nWhat if we unlink the nodes first::\n\n >>> sw = SoapWriter(nsdict={}, header=True, outputclass=None,\n ... encodingStyle=None)\n >>> res = sw.serialize([element, element, element, element, element], tc)\n >>> print sys.getrefcount(Element)\n 19\n >>> Node.unlink(sw.body.node)\n >>> Node.unlink(sw.dom.node)\n >>> print sys.getrefcount(Element)\n 8\n >>> del res\n >>> del sw.body.node\n >>> del sw.body\n >>> del sw.dom.node\n >>> del sw.dom\n >>> del sw\n >>> print sys.getrefcount(Element)\n 6\n\nThere are thus less references to Element when using unlink before deleting the soapwriter object.\n\nChangelog\n=========\n\n0.5.5 (2013-10-09)\n------------------\n\n- Do not fail when importing _handle_for from zope.app.publisher.browser.viewmeta\n as it has been moved to zope.browserpage.metaconfigure\n\n0.5.4 (2013-05-21)\n------------------\n\n- Added Zope 2.13 support\n\n- Removed collective.autopermission dependency\n\n\n0.5.3 (2011-01-05)\n------------------\n\n- Remove CMF dependency, use collective.autopermission to define permission\n\n- Using Python's ``doctest`` module instead of depreacted\n ``zope.testing.doctest``.\n\n\n0.5.2 (2010-05-05)\n------------------\n\n* Added Zope 2.12 support (thanks to patch from E. Leddy)\n\n\n0.5.1 (2009-12-07)\n------------------\n\n* include meta file into configure\n\n0.5 - (2009-09-22)\n------------------\n\n* fix & test memory leak in zsi soapwriter\n* buildout update\n\n0.4 - (2009-05-04)\n------------------\n\n* return correctly the serialized string\n\n0.3 - (2008-12-17)\n------------------\n\n* Handle correclty ZSI.Fault exception\n\n0.2 - (2008-11-14)\n------------------\n\n* Handle correctly Unauthorized exception\n\n* Add SOAP Access permission\n\n* Remove realm from response if Unauthorized is raised\n\n0.1 - (2008-11-13)\n------------------\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": "https://github.com/zopefoundation/z3c.soap", "keywords": "Zope2 SOAP ZSI", "license": "ZPL 2.1", "maintainer": null, "maintainer_email": null, "name": "z3c.soap", "package_url": "https://pypi.org/project/z3c.soap/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/z3c.soap/", "project_urls": { "Download": "UNKNOWN", "Homepage": "https://github.com/zopefoundation/z3c.soap" }, "release_url": "https://pypi.org/project/z3c.soap/0.5.5/", "requires_dist": null, "requires_python": null, "summary": "Soap using ZSI in Zope 2", "version": "0.5.5" }, "last_serial": 885101, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "41728756283596c2d6583c1c58a78f99", "sha256": "4f0cdc9066c1b67fdb9b934f6c148a633398aaa2c6ebceb8029811ae52315710" }, "downloads": -1, "filename": "z3c.soap-0.1-py2.4.egg", "has_sig": false, "md5_digest": "41728756283596c2d6583c1c58a78f99", "packagetype": "bdist_egg", "python_version": "2.4", "requires_python": null, "size": 56882, "upload_time": "2008-11-13T12:14:28", "url": "https://files.pythonhosted.org/packages/a3/5a/fcd2c37e49a24536575b028a813a67662090b4932b5b239618e10d5a87f5/z3c.soap-0.1-py2.4.egg" } ], "0.2": [ { "comment_text": "", "digests": { "md5": "0a6e807118c8c9416b8e86d4f10aa73c", "sha256": "0bada37f114cd1670ebc73c784f6bbde673afb8e0fcf8d06daae5816f3209c8b" }, "downloads": -1, "filename": "z3c.soap-0.2.tar.gz", "has_sig": false, "md5_digest": "0a6e807118c8c9416b8e86d4f10aa73c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 29275, "upload_time": "2008-11-14T15:45:21", "url": "https://files.pythonhosted.org/packages/19/d6/783a94f87c03eec6af21a1f3e1756909c93bddbc486a4a894e649a459770/z3c.soap-0.2.tar.gz" } ], "0.3": [ { "comment_text": "", "digests": { "md5": "48150efee2bf2714cb00f10d06eb948e", "sha256": "f6939e7b1818e7615e8e6b00e21ef51f8da9a1338c65e0c10a527c2e17185d1e" }, "downloads": -1, "filename": "z3c.soap-0.3.tar.gz", "has_sig": false, "md5_digest": "48150efee2bf2714cb00f10d06eb948e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 29709, "upload_time": "2008-12-17T15:18:43", "url": "https://files.pythonhosted.org/packages/d0/e8/708c4c8e47fc3a6b3645b28e2e084af484c008c88a11ff800708d4c7f81c/z3c.soap-0.3.tar.gz" } ], "0.4": [ { "comment_text": "", "digests": { "md5": "0086cd37c92a7a4813bed5ee67a2b132", "sha256": "fb085d5d301060ce745aba5253ca97cabd7998f143f04412213b4e6b7fda31ba" }, "downloads": -1, "filename": "z3c.soap-0.4.tar.gz", "has_sig": false, "md5_digest": "0086cd37c92a7a4813bed5ee67a2b132", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 29838, "upload_time": "2009-05-04T16:50:18", "url": "https://files.pythonhosted.org/packages/aa/05/1e12545ae41fb15e0b2f2166f34f7554f117fc24a643ab3e0110c558dc74/z3c.soap-0.4.tar.gz" } ], "0.5": [ { "comment_text": "", "digests": { "md5": "73537d0eab1bb4211e23310c47aa20fe", "sha256": "5998eab43dcdb75616a32ba9746bc2e86c0f80d784f02b9387f14d0913f91353" }, "downloads": -1, "filename": "z3c.soap-0.5.tar.gz", "has_sig": false, "md5_digest": "73537d0eab1bb4211e23310c47aa20fe", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 32935, "upload_time": "2009-09-22T19:23:06", "url": "https://files.pythonhosted.org/packages/11/14/4d4d134aef39d1fe0e20b4c36f9f135688f1f747a4b6ac4cdc4843ccebca/z3c.soap-0.5.tar.gz" } ], "0.5.1": [ { "comment_text": "", "digests": { "md5": "3a75a315e64c04815435c637b28fc431", "sha256": "8ae7a8cbe2a8c0173a710d36669cc35c9100d88c43255230b87e0a333e846bfd" }, "downloads": -1, "filename": "z3c.soap-0.5.1.tar.gz", "has_sig": false, "md5_digest": "3a75a315e64c04815435c637b28fc431", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 33014, "upload_time": "2009-12-07T15:09:33", "url": "https://files.pythonhosted.org/packages/9b/a1/b42ce1a9b6db3e757ef3dd82bf231848a61244bb7e9ad021531cd341becd/z3c.soap-0.5.1.tar.gz" } ], "0.5.2": [ { "comment_text": "", "digests": { "md5": "e915155fc3515d33792492a9acaf39fc", "sha256": "51db0eb785da0c6c49f6a3756c3b6788ba7d661f9a39e9e3ff7e1cb5f6b032bd" }, "downloads": -1, "filename": "z3c.soap-0.5.2.zip", "has_sig": false, "md5_digest": "e915155fc3515d33792492a9acaf39fc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 45420, "upload_time": "2010-05-05T19:10:04", "url": "https://files.pythonhosted.org/packages/32/72/de2fd48cb4dd6eee3a9f673f093bf9f600535fa26d1f1d42b94dfb679712/z3c.soap-0.5.2.zip" } ], "0.5.3": [ { "comment_text": "", "digests": { "md5": "9459e622b274768d388e25ff131069e9", "sha256": "9c9202d81aa5e8fc730246766913f01b80ad6ae764b9e79df987fd8685c27efa" }, "downloads": -1, "filename": "z3c.soap-0.5.3.tar.gz", "has_sig": false, "md5_digest": "9459e622b274768d388e25ff131069e9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 34353, "upload_time": "2011-01-05T20:19:15", "url": "https://files.pythonhosted.org/packages/d0/7b/1892361aa5d8902739430cdd982bbf4aa73565f55c3c0c0d3a72783e0b91/z3c.soap-0.5.3.tar.gz" } ], "0.5.4": [ { "comment_text": "", "digests": { "md5": "c7da20be47333cebde90cc2c6e742ed0", "sha256": "fd60197277ad7a3a3eabac125faa1df745ea283d99089b7b581f3d986fafb930" }, "downloads": -1, "filename": "z3c.soap-0.5.4.zip", "has_sig": false, "md5_digest": "c7da20be47333cebde90cc2c6e742ed0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 50218, "upload_time": "2013-05-21T10:12:14", "url": "https://files.pythonhosted.org/packages/2f/76/5f917cf5bc842e3321445cd429b6b952552a27793bb0796414421abf83a8/z3c.soap-0.5.4.zip" } ], "0.5.5": [ { "comment_text": "", "digests": { "md5": "104564d4c7ba242e0ab9e29bd7b04e85", "sha256": "bb4b8ebd04b4035e758af80bd6aced74d9e7db46e5955dad0762f8fafaa28489" }, "downloads": -1, "filename": "z3c.soap-0.5.5.zip", "has_sig": false, "md5_digest": "104564d4c7ba242e0ab9e29bd7b04e85", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 46994, "upload_time": "2013-10-09T13:37:09", "url": "https://files.pythonhosted.org/packages/1d/a3/612ca10198b39046f8500ea811f4aa3f0ee063204512bca095f7aa7b0c1c/z3c.soap-0.5.5.zip" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "104564d4c7ba242e0ab9e29bd7b04e85", "sha256": "bb4b8ebd04b4035e758af80bd6aced74d9e7db46e5955dad0762f8fafaa28489" }, "downloads": -1, "filename": "z3c.soap-0.5.5.zip", "has_sig": false, "md5_digest": "104564d4c7ba242e0ab9e29bd7b04e85", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 46994, "upload_time": "2013-10-09T13:37:09", "url": "https://files.pythonhosted.org/packages/1d/a3/612ca10198b39046f8500ea811f4aa3f0ee063204512bca095f7aa7b0c1c/z3c.soap-0.5.5.zip" } ] }