{ "info": { "author": "Hans-Peter Locher", "author_email": "hans-peter.locher@inquant.de", "bugtrack_url": null, "classifiers": [ "Intended Audience :: Developers", "License :: OSI Approved :: GNU General Public License (GPL)", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "silverpop\n=========\n\nPython implementation of the Silverpop API\n\nCurrently implemented API methods::\n\n def add_recipient(api_url, list_id, email, columns=[], optionals=ADD_RECIPIENT_OPTIONALS):\n \"\"\"Add recipient to a list (only email key supported)\n api_url, list_id, email are required, optionally\n takes a list of dicts to define additional columns like\n [{'column_name':'State', 'column_value':'Germany'},]\n optionally takes a list of dicts to define optionals, \n defaults to\n [{'optional_name':'UPDATE_IF_FOUND', 'optional_value':'true'},\n {'optional_name':'SEND_AUTOREPLY', 'optional_value':'true'},\n ]\n returns True or False\n \"\"\"\n\n def update_recipient(api_url, list_id, old_email, columns=[], optionals=UPDATE_RECIPIENT_OPTIONALS):\n \"\"\"Update recipient of a list,\n if the old_email is not a recipient of the list, a recipient will be added.\n api_url, list_id, old_email are required, optionally\n takes a list of dicts to define additional columns like:\n [{'column_name':'State', 'column_value':'Germany'},]\n Can change the email of a recipient by specifiying a column like:\n {'column_name':'EMAIL', 'column_value':'new@email.com'}\n Can re-opt-in an opted-out recipient by specifying a column like:\n {'column_name':'OPT_OUT', 'column_value':'False'}\n optionally takes a list of dicts to define optionals, \n defaults to\n [{'optional_name':'SEND_AUTOREPLY', 'optional_value':'true'},]\n returns True or False\n \"\"\"\n\n def opt_in_recipient(api_url, list_id, email, columns=[], optionals=OPT_IN_RECIPIENT_OPTIONALS):\n \"\"\"opt in a recipient to a list (only email key supported)\n api_url, list_id, email are required, optionally\n takes a list of dicts to define additional columns like\n [{'column_name':'State', 'column_value':'Germany'},]\n returns True or False\n optionally takes a list of dicts to define optionals, \n defaults to\n [{'optional_name':'SEND_AUTOREPLY', 'optional_value':'true'},]\n returns True or False\n \"\"\"\n\n def is_opted_in(api_url, list_id, email):\n \"\"\"Is the specified email opted in to the list?\n api_url, list_id, email are required\n returns True or False\n \"\"\"\n\n def opt_out_recipient(api_url, list_id, email):\n \"\"\"opt out a recipient from a list\n api_url, list_id, email are required\n returns True or False\n \"\"\"\n\n def select_recipient_data(api_url, list_id, email, column=None):\n \"\"\"get the recipients data\n api_url, list_id, email are required\n you may specify a column dict for non email key lists, like\n {'column_name': 'USER_ID', 'column_value': '4711'}\n returns the silverpop response (xml)\n \"\"\"\n\n def xml_request(api_url, xml):\n \"\"\"submit a custom xml request\n api_url, xml, are required\n returns the silverpop response (xml)\n \"\"\"\n\n- Silverpop: http://www.silverpop.com/\n\nChangelog\n*********\n\n0.6 (2010-02-25)\n----------------\n\n- api methods update_recipient, opt_in_recipient,\n add_recipient now set a optional node in created xml requests\n **true**\n- extended api_methods update_recipient, opt_in_recipient,\n add_recipient with optional parameter \n optionals to control optional nodes.\n [hplocher]\n\n0.5 (2009-05-18)\n----------------\n\n- Changed log level to DEBUG [hplocher]\n\n0.4 (2009-05-13)\n----------------\n\n- implemented api method:\n update_recipient(api_url, list_id, old_email, columns=[])\n opt_in_recipient(api_url, list_id, email, columns=[])\n [hplocher]\n\n0.3 (2009-05-12)\n----------------\n\n- implemented api methods:\n is_opted_in(api_url, list_id, email)\n select_recipient_data(api_url, list_id, email, column=None)\n [hplocher]\n\n\n0.2 (2009-05-12)\n----------------\n\n- added doctest [hplocher]\n- refactored [hplocher]\n- implemented xml_request(api_url, xml) [hplocher]\n\n0.1 (2009-05-12)\n----------------\n\n- Initial release\n- implemented api methods:\n add_recipient(api_url, list_id, email, columns=[])\n opt_out_recipient(api_url, list_id, email)\n [hplocher]\n- mocked api methods:\n is_opted_in(api_url, list_id, email)\n select_recipient_data(api_url, list_id, email, columns=[])\n xml_request(api_url, xml)\n [hplocher]\n\n- initial package skeleton [hplocher]\n\nDetailed documentation\n**********************\n\nTest Setup\n----------\n\nMost API methods will only return True or False,\nto get a more verbose output and prohibit\nmaking requests to Silverpop\nWe monkeypatch urllib to print\n(url, headers, data) instead of doing any requests.\n\nWe create a Fake class to be returned by urlib2.urlopen, \nwhich will always return a successful silverpop response::\n\n >>> class Fake(object):\n ... def read(self): return \"true\"\n\nIn our test method, we print request's url, headers, data (we decode\nthe urlencoded data for the test) and\nreturn a Fake object::\n\n >>> import cgi\n >>> def test_urlopen(req):\n ... print '-'*30 + 'request details' + '-'*30\n ... print req.get_full_url()\n ... print req.headers\n ... xml = dict(cgi.parse_qsl(req.data))['xml']\n ... print xml\n ... print '-'*75\n ... return Fake()\n >>> import urllib2\n\nFinally we patch urllib2.urlopen::\n\n >>> urllib2.urlopen = test_urlopen\n\nWe also define a FakeRequest class to define our request\ncontaining just a form::\n\n >>> class FakeRequest(dict):\n ... def __init__(self, **kwargs):\n ... self.form = kwargs\n\nAPI Methods\n-----------\n\nAll api methods can be accessed by importing the module::\n\n >>> import silverpop\n\n\nFirst, we define data needed for the various api_methods.\n\nThe URL of the Silverpop Server::\n\n >>> api_url = 'http://api1.silverpop.com/XMLAPI '\n\nA List Id::\n\n >>> list_id = 999\n\nAn Email Address (we only support email key lists, so this is\nour key identifying a newsletter subscriber)::\n\n >>> email = 'my@email.com'\n\nadd_recipient\n+++++++++++++\n\n\nLet's call the add_recipient api with the required attributes::\n\n >>> silverpop.add_recipient(api_url, list_id, email)\n ------------------------------request details------------------------------\n http://api1.silverpop.com/XMLAPI\n {'Content-type': 'application/x-www-form-urlencoded;charset=UTF-8'}\n \n \n \n 999\n 2\n true\n true\n \n EMAIL\n my@email.com\n \n \n \n \n ---------------------------------------------------------------------------\n True\n\nIf we provide a list of columns, these will be used in the request, leading to columns in silverpop.\n\nFor example, we want to use a custom column **gender**::\n\n >>> columns = [{'column_name': 'gender', 'column_value': 'male'}, ]\n\n >>> silverpop.add_recipient(api_url, list_id, email, columns)\n ------------------------------request details------------------------------\n http://api1.silverpop.com/XMLAPI\n {'Content-type': 'application/x-www-form-urlencoded;charset=UTF-8'}\n \n \n \n 999\n 2\n true\n true\n \n EMAIL\n my@email.com\n \n \n gender\n male\n \n \n \n \n ---------------------------------------------------------------------------\n True\n\nNote that we have some optional nodes (UPDATE_IF_FOUND, SEND_AUTOREPLY) in the created requests.\nThese are default. To change this we can use an additional parameter optionals.\n\nLet's call the add_recipient api with the additional optionals attribute to omit the **SEND_AUTOREPLY**::\n\n >>> custom_optionals = [{'optional_name':'UPDATE_IF_FOUND', 'optional_value':'true'},]\n >>> silverpop.add_recipient(api_url, list_id, email, optionals=custom_optionals)\n ------------------------------request details------------------------------\n http://api1.silverpop.com/XMLAPI\n {'Content-type': 'application/x-www-form-urlencoded;charset=UTF-8'}\n \n \n \n 999\n 2\n true\n \n EMAIL\n my@email.com\n \n \n \n \n ---------------------------------------------------------------------------\n True\n\nThe **SEND_AUTOREPLY** node is gone.\n\nOf course you can use this together with columns::\n\n >>> columns = [{'column_name': 'gender', 'column_value': 'male'}, ]\n\n >>> silverpop.add_recipient(api_url, list_id, email, columns, optionals=custom_optionals)\n ------------------------------request details------------------------------\n http://api1.silverpop.com/XMLAPI\n {'Content-type': 'application/x-www-form-urlencoded;charset=UTF-8'}\n \n \n \n 999\n 2\n true\n \n EMAIL\n my@email.com\n \n \n gender\n male\n \n \n \n \n ---------------------------------------------------------------------------\n True\n\nThe **SEND_AUTOREPLY** node is gone.\n\nupdate_recipient\n++++++++++++++++\n\n**update_recipient** works similar as **add_recipient**,\nbut offers to change the recipient's email address, and re-opt-in\nan opted out recipient in addition.\nfor our first test, we are not going to do that::\n\n >>> old_email = 'my@email.com'\n\nLet's call the update_recipient api with the required attributes::\n\n >>> silverpop.update_recipient(api_url, list_id, old_email)\n ------------------------------request details------------------------------\n http://api1.silverpop.com/XMLAPI\n {'Content-type': 'application/x-www-form-urlencoded;charset=UTF-8'}\n \n \n \n 999\n 2\n my@email.com\n true\n \n \n \n ---------------------------------------------------------------------------\n True\n\nIf we provide a list of columns, these will be used in the request, leading to columns in silverpop.\nThis is also used to change the recipient's email address.\n\nFor example, we want to change the **email address**, therefore we need to specify one column **EMAIL**::\n\n >>> columns = [{'column_name': 'EMAIL', 'column_value': 'new@email.com'}, ]\n\n >>> silverpop.update_recipient(api_url, list_id, old_email, columns)\n ------------------------------request details------------------------------\n http://api1.silverpop.com/XMLAPI\n {'Content-type': 'application/x-www-form-urlencoded;charset=UTF-8'}\n \n \n \n 999\n 2\n my@email.com\n true\n \n EMAIL\n new@email.com\n \n \n \n \n ---------------------------------------------------------------------------\n True\n\nAnother common use case is to to re-opt-in an opted-out recipient.\n\nTherefore we provide a column **OPT_OUT**, which when set to **False**\nwill re-opt-in the recipient::\n\n\n >>> columns = [{'column_name': 'OPT_OUT', 'column_value': 'False'}, ]\n\n >>> silverpop.update_recipient(api_url, list_id, old_email, columns)\n ------------------------------request details------------------------------\n http://api1.silverpop.com/XMLAPI\n {'Content-type': 'application/x-www-form-urlencoded;charset=UTF-8'}\n \n \n \n 999\n 2\n my@email.com\n true\n \n OPT_OUT\n False\n \n \n \n \n ---------------------------------------------------------------------------\n True\n\nNote that we have an optional node ( SEND_AUTOREPLY ) in the created requests.\nThis is default. To change this we can use an additional parameter optionals.\n\n\n >>> old_email = 'my@email.com'\n\nLet's call the update_recipient api with the additional optionals attribute to omit the **SEND_AUTOREPLY**::\n\n >>> silverpop.update_recipient(api_url, list_id, old_email, optionals=[])\n ------------------------------request details------------------------------\n http://api1.silverpop.com/XMLAPI\n {'Content-type': 'application/x-www-form-urlencoded;charset=UTF-8'}\n \n \n \n 999\n 2\n my@email.com\n \n \n \n ---------------------------------------------------------------------------\n True\n\nThe **SEND_AUTOREPLY** node is gone.\n\nOf course you can use this together with columns::\n\n >>> columns = [{'column_name': 'EMAIL', 'column_value': 'new@email.com'}, ]\n\n >>> silverpop.update_recipient(api_url, list_id, old_email, columns, optionals=[])\n ------------------------------request details------------------------------\n http://api1.silverpop.com/XMLAPI\n {'Content-type': 'application/x-www-form-urlencoded;charset=UTF-8'}\n \n \n \n 999\n 2\n my@email.com\n \n EMAIL\n new@email.com\n \n \n \n \n ---------------------------------------------------------------------------\n True\n\nThe **SEND_AUTOREPLY** node is gone.\n\nopt_in_recipient\n++++++++++++++++\n\nThis method is a wrapper around update_recipient_data,\nfor explicitly opting in a recipient.\n\nLet's call the opt_in_recipient api with the required attributes::\n\n >>> silverpop.opt_in_recipient(api_url, list_id, email)\n ------------------------------request details------------------------------\n http://api1.silverpop.com/XMLAPI\n {'Content-type': 'application/x-www-form-urlencoded;charset=UTF-8'}\n \n \n \n 999\n 2\n my@email.com\n true\n \n OPT_OUT\n False\n \n \n \n \n ---------------------------------------------------------------------------\n True\n\nIf we provide a list of columns, these will be used in the request, \nleading to columns in silverpop.\nThis can be also used to change the recipient's email address.\nFor example, we want to change the **email address**.\nTherefore we need to specify one column **EMAIL**::\n\n >>> columns = [{'column_name': 'EMAIL', 'column_value': 'new@email.com'}, ]\n\n >>> silverpop.opt_in_recipient(api_url, list_id, email, columns)\n ------------------------------request details------------------------------\n http://api1.silverpop.com/XMLAPI\n {'Content-type': 'application/x-www-form-urlencoded;charset=UTF-8'}\n \n \n \n 999\n 2\n my@email.com\n true\n \n OPT_OUT\n False\n \n \n EMAIL\n new@email.com\n \n \n \n \n ---------------------------------------------------------------------------\n True\n\nIf the user specifies an **OPT_OUT** column, this will be ignored,\nas we always want to opt in.\n\nLet's define the to be ignored column::\n\n >>> columns = [{'column_name': 'OPT_OUT', 'column_value': 'some value'}, ]\n\nNotice how the value of **OPT_OUT** is still **False**::\n\n >>> silverpop.opt_in_recipient(api_url, list_id, email)\n ------------------------------request details------------------------------\n http://api1.silverpop.com/XMLAPI\n {'Content-type': 'application/x-www-form-urlencoded;charset=UTF-8'}\n \n \n \n 999\n 2\n my@email.com\n true\n \n OPT_OUT\n False\n \n \n \n \n ---------------------------------------------------------------------------\n True\n\nNote that we have an optional node ( SEND_AUTOREPLY ) in the created requests.\nThis is default. To change this we can use an additional parameter optionals.\n\n\n >>> old_email = 'my@email.com'\n\nLet's call the opt_in_recipient api with the additional optionals attribute to omit the **SEND_AUTOREPLY**::\n\n >>> silverpop.opt_in_recipient(api_url, list_id, email, optionals=[])\n ------------------------------request details------------------------------\n http://api1.silverpop.com/XMLAPI\n {'Content-type': 'application/x-www-form-urlencoded;charset=UTF-8'}\n \n \n \n 999\n 2\n my@email.com\n \n OPT_OUT\n False\n \n \n \n \n ---------------------------------------------------------------------------\n True\n\nThe **SEND_AUTOREPLY** node is gone.\n\nOf course you can use this together with columns::\n\n >>> columns = [{'column_name': 'EMAIL', 'column_value': 'new@email.com'}, ]\n\n >>> silverpop.opt_in_recipient(api_url, list_id, email, columns, optionals=[])\n ------------------------------request details------------------------------\n http://api1.silverpop.com/XMLAPI\n {'Content-type': 'application/x-www-form-urlencoded;charset=UTF-8'}\n \n \n \n 999\n 2\n my@email.com\n \n OPT_OUT\n False\n \n \n EMAIL\n new@email.com\n \n \n \n \n ---------------------------------------------------------------------------\n True\n\nThe **SEND_AUTOREPLY** node is gone.\n\nopt_out_recipient\n+++++++++++++++++\n\nLet's call the opt_out_recipient api with the required attributes::\n\n >>> silverpop.opt_out_recipient(api_url, list_id, email)\n ------------------------------request details------------------------------\n http://api1.silverpop.com/XMLAPI\n {'Content-type': 'application/x-www-form-urlencoded;charset=UTF-8'}\n \n \n \n 999\n my@email.com\n \n \n \n ---------------------------------------------------------------------------\n True\n\nis_opted_in\n+++++++++++\n\nThis method returns **True** when the specified email is a\nnon-opted out recipient of a list. \nIf the list doesn't exist, or\nthe user isn't a recipient of an existing list, or \nthe user is opted out form the specified list, \nit should return **False**.\n\nFor this test we need to interpret the various responses,\nwhich we could get from silverpop, so we are going to change \nin more detail, so we change our Fake class simulating, the different Silverpop\nresponses.\n\nFirst, we assume that we have specified a non existing list_id\n(is_opted_in should return False)::\n\n >>> class Fake(object):\n ... def read(self): return \"\"\"\n ... \n ... \n ... \n ... false\n ... \n ... \n ... \n ... \n ... \n ... \n ... \n ... \n ... \n ... 108\n ... \n ... SP.ListManager\n ... \n ... \n ... \n ... \n ... \n ... \n ... \"\"\"\n\n >>> silverpop.is_opted_in(api_url, list_id, email)\n ------------------------------request details------------------------------\n http://api1.silverpop.com/XMLAPI\n {'Content-type': 'application/x-www-form-urlencoded;charset=UTF-8'}\n \n \n \n 999\n my@email.com\n \n \n \n ---------------------------------------------------------------------------\n False\n\nNow, we specify a list_id which is not valid (it must be an integer)::\n\n >>> class Fake(object):\n ... def read(self): return \"\"\"\n ... \n ... \n ... \n ... false\n ... \n ... \n ... \n ... \n ... \n ... \n ... \n ... \n ... \n ... 106\n ... \n ... SP.ListManager\n ... \n ... \n ... \n ... \n ... \n ... \n ... \"\"\"\n\n >>> silverpop.is_opted_in(api_url, 'NOT AN INTEGER', email)\n ------------------------------request details------------------------------\n http://api1.silverpop.com/XMLAPI\n {'Content-type': 'application/x-www-form-urlencoded;charset=UTF-8'}\n \n \n \n NOT AN INTEGER\n my@email.com\n \n \n \n ---------------------------------------------------------------------------\n False\n\nNow, we assume the provided email is not a member of the list::\n\n >>> class Fake(object):\n ... def read(self): return \"\"\"\n ... \n ... \n ... \n ... false\n ... \n ... \n ... \n ... \n ... \n ... \n ... \n ... \n ... \n ... 128\n ... \n ... SP.ListManager\n ... \n ... \n ... \n ... \n ... \n ... \n ... \"\"\"\n\n >>> silverpop.is_opted_in(api_url, list_id, email)\n ------------------------------request details------------------------------\n http://api1.silverpop.com/XMLAPI\n {'Content-type': 'application/x-www-form-urlencoded;charset=UTF-8'}\n \n \n \n 999\n my@email.com\n \n \n \n ---------------------------------------------------------------------------\n False\n\nNow, we assume the provided email is a member of the list, but the member is opted out\n(leading to a value in the **** tag)::\n\n >>> class Fake(object):\n ... def read(self): return \"\"\"\n ... \n ... \n ... \n ... TRUE\n ... my@email.com\n ... my@email.com\n ... 5\n ... 0\n ... 5/11/09 9:43 AM\n ... 2\n ... 3/26/09 10:29 AM\n ... 5/11/09 9:43 AM\n ... \n ... \n ... State\n ... Germany\n ... \n ... \n ... \n ... \n ... \n ... \"\"\"\n\n >>> silverpop.is_opted_in(api_url, list_id, email)\n ------------------------------request details------------------------------\n http://api1.silverpop.com/XMLAPI\n {'Content-type': 'application/x-www-form-urlencoded;charset=UTF-8'}\n \n \n \n 999\n my@email.com\n \n \n \n ---------------------------------------------------------------------------\n False\n\n\nFinally, we assume the provided email is a member of the list, and the member isn't opted out\n(leading to an empty **** tag)::\n\n >>> class Fake(object):\n ... def read(self): return \"\"\"\n ... \n ... \n ... \n ... TRUE\n ... my@email.com\n ... my@email.com\n ... 5\n ... 0\n ... 5/11/09 9:43 AM\n ... 2\n ... 3/26/09 10:29 AM\n ... \n ... \n ... \n ... State\n ... Germany\n ... \n ... \n ... \n ... \n ... \n ... \"\"\"\n\n >>> silverpop.is_opted_in(api_url, list_id, email)\n ------------------------------request details------------------------------\n http://api1.silverpop.com/XMLAPI\n {'Content-type': 'application/x-www-form-urlencoded;charset=UTF-8'}\n \n \n \n 999\n my@email.com\n \n \n \n ---------------------------------------------------------------------------\n True\n\nselect_recipient_data\n+++++++++++++++++++++\n\nFor this test, we want to have a simple xml as reply from Silverpop, \nas we don't process the response further::\n\n >>> class Fake(object):\n ... def read(self): return \"true\"\n\n\n >>> silverpop.select_recipient_data(api_url, list_id, email)\n ------------------------------request details------------------------------\n http://api1.silverpop.com/XMLAPI\n {'Content-type': 'application/x-www-form-urlencoded;charset=UTF-8'}\n \n \n \n 999\n my@email.com\n \n \n \n ---------------------------------------------------------------------------\n 'true'\n\nIf we provide a column, this will be used in the request\n(use for non email key lists only).\n\n\nFor example, we have a custom key **USER_ID**::\n\n >>> column = {'column_name': 'USER_ID', 'column_value': '4711'}\n\n >>> silverpop.select_recipient_data(api_url, list_id, email, column)\n ------------------------------request details------------------------------\n http://api1.silverpop.com/XMLAPI\n {'Content-type': 'application/x-www-form-urlencoded;charset=UTF-8'}\n \n \n \n 999\n my@email.com\n \n USER_ID\n 4711\n \n \n \n \n ---------------------------------------------------------------------------\n 'true'\n\nxml_request\n+++++++++++\n\nThe Silverpop XML API offers a quite large variaty of commands,\nof which we only implement a subset.\nIf you need to make different requests you can use this method to\nsubmit custom xml to Silverpop. As result, you will get the Silverpop\nResponse, which is also xml.\n\nImagine, we want to use the **ForwardToFrient** xml command. \n\nLet's define the custom xml::\n\n >>> xml = \"\"\"\n ... \n ... \n ... bob@bob.com\n ... 5\n ... 10\n ... jane@jane.com\n ... Forwarded: Check this out, I just got that\n ... \n ... \n ... \"\"\"\n\nThe xml is sent to Silverpop and we get the response back, for further processing::\n\n >>> silverpop.xml_request(api_url, xml)\n ------------------------------request details------------------------------\n http://api1.silverpop.com/XMLAPI\n {'Content-type': 'application/x-www-form-urlencoded;charset=UTF-8'}\n \n \n \n bob@bob.com\n 5\n 10\n jane@jane.com\n Forwarded: Check this out, I just got that\n \n \n \n ---------------------------------------------------------------------------\n 'true'\n\nContributors\n************\n\nHans-Peter Locher, Author\n\nDownload\n********", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://silverpop.googlecode.com/svn/", "keywords": "Silverpop API", "license": "GPL", "maintainer": null, "maintainer_email": null, "name": "silverpop", "package_url": "https://pypi.org/project/silverpop/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/silverpop/", "project_urls": { "Download": "UNKNOWN", "Homepage": "http://silverpop.googlecode.com/svn/" }, "release_url": "https://pypi.org/project/silverpop/0.6/", "requires_dist": null, "requires_python": null, "summary": "API for Silverpop Enterprise Newslettering", "version": "0.6" }, "last_serial": 799543, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "7c67a8e20605ad623b3ef73f82d22e2e", "sha256": "2c7d5d68083807ed2367f37fdd5e0de27b6060ade2dfef0db3afcb23993bd73a" }, "downloads": -1, "filename": "silverpop-0.1.zip", "has_sig": false, "md5_digest": "7c67a8e20605ad623b3ef73f82d22e2e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12687, "upload_time": "2009-05-12T08:51:14", "url": "https://files.pythonhosted.org/packages/d7/ff/29cf7aec5b4423bfb310b94436d4d8d9515d92acdbf5ee440c0ab69d344a/silverpop-0.1.zip" } ], "0.2": [ { "comment_text": "", "digests": { "md5": "0aef5697fb4f14ac2e1da355a625ba11", "sha256": "f0ab68bc491ef0663ac644926107c965aa93317a0d7aca8ec994f1e29b2f3690" }, "downloads": -1, "filename": "silverpop-0.2.zip", "has_sig": false, "md5_digest": "0aef5697fb4f14ac2e1da355a625ba11", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18703, "upload_time": "2009-05-12T13:34:01", "url": "https://files.pythonhosted.org/packages/45/11/309886d1e398ae99352f58eae2c431ef3da936b40de7fb76c5d9b1ed307f/silverpop-0.2.zip" } ], "0.3": [ { "comment_text": "", "digests": { "md5": "6f0f6a31b54820805b854d1fb17c4dc8", "sha256": "87fc1b5e68eaa44c16da085ab7d893b2cd958b8485f9b730aaaf21e91661f5e1" }, "downloads": -1, "filename": "silverpop-0.3.zip", "has_sig": false, "md5_digest": "6f0f6a31b54820805b854d1fb17c4dc8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22390, "upload_time": "2009-05-12T17:29:19", "url": "https://files.pythonhosted.org/packages/a3/aa/a6fd197f257c982bdaef162a2f00b1cd256a46a79f68351c9759e5808ff2/silverpop-0.3.zip" } ], "0.4": [ { "comment_text": "", "digests": { "md5": "334bc24b050e4e96566301f4d4327ef8", "sha256": "f3ab499756a000e68837c0fdd69b3a320637e26d4e54298f0fecfd89d21167d4" }, "downloads": -1, "filename": "silverpop-0.4.zip", "has_sig": false, "md5_digest": "334bc24b050e4e96566301f4d4327ef8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 24687, "upload_time": "2009-05-13T14:53:42", "url": "https://files.pythonhosted.org/packages/d4/7f/fb03be463a2ab4755a139578afc8180f3b70e2324fe8864df8e2af0963d3/silverpop-0.4.zip" } ], "0.5": [ { "comment_text": "", "digests": { "md5": "2f5723ea3672ccb711ac1cb7cc154f45", "sha256": "bdb7ddfe38178f1f1596229c03e01744bfffdd2b6555ee344821f7a8ea02e71a" }, "downloads": -1, "filename": "silverpop-0.5.zip", "has_sig": false, "md5_digest": "2f5723ea3672ccb711ac1cb7cc154f45", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 24795, "upload_time": "2009-05-18T14:50:17", "url": "https://files.pythonhosted.org/packages/a1/63/46559dd4bc901b55ac795c663787cf3d6c2120e4fa0a8ffeca31cf5807e8/silverpop-0.5.zip" } ], "0.6": [ { "comment_text": "", "digests": { "md5": "a309d4b56374d4ea50420b507fcfb289", "sha256": "0180fcc838e9174bdc250416640df2f5f300c3e18491a77fff46dd65b8fa5734" }, "downloads": -1, "filename": "silverpop-0.6.zip", "has_sig": false, "md5_digest": "a309d4b56374d4ea50420b507fcfb289", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26619, "upload_time": "2010-02-25T13:12:33", "url": "https://files.pythonhosted.org/packages/18/ff/53704286795766366def393d395ddcabed5fd2c76af3afc1a08c5aa4fea5/silverpop-0.6.zip" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "a309d4b56374d4ea50420b507fcfb289", "sha256": "0180fcc838e9174bdc250416640df2f5f300c3e18491a77fff46dd65b8fa5734" }, "downloads": -1, "filename": "silverpop-0.6.zip", "has_sig": false, "md5_digest": "a309d4b56374d4ea50420b507fcfb289", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26619, "upload_time": "2010-02-25T13:12:33", "url": "https://files.pythonhosted.org/packages/18/ff/53704286795766366def393d395ddcabed5fd2c76af3afc1a08c5aa4fea5/silverpop-0.6.zip" } ] }