{
"info": {
"author": "Mark Vartanyan",
"author_email": "kolypto@gmail.com",
"bugtrack_url": null,
"classifiers": [
"Development Status :: 5 - Production/Stable",
"Intended Audience :: Developers",
"Natural Language :: English",
"Operating System :: OS Independent",
"Programming Language :: Python :: 2",
"Programming Language :: Python :: 3",
"Topic :: Software Development :: Libraries :: Python Modules"
],
"description": "[](https://travis-ci.org/kolypto/py-smsframework)\n[](.travis.yml)\n\nSMSframework\n============\n\nSMS framework with pluggable providers.\n\nKey features:\n\n* Send messages\n* Receive messages\n* Delivery confirmations\n* Handle multiple pluggable providers with a single gateway\n* Synchronous message receipt through events\n* Reliable message handling\n* Supports provider APIs (like getting the balance)\n* Providers use [Flask microframework](http://flask.pocoo.org) for message receivers (not required)\n* 0 dependencies\n* Unit-tested\n\n\n\n\n\n\nTable of Contents\n=================\n\n* Tutorial\n* Supported Providers\n* Installation\n* Gateway\n * Providers\n * Gateway.add_provider(name, Provider, **config):IProvider\n * Gateway.default_provider\n * Gateway.get_provider(name):IProvider\n * Sending Messages\n * Gateway.send(message):OutgoingMessage\n * Event Hooks\n * Gateway.onSend\n * Gateway.onReceive\n * Gateway.onStatus\n* Data Objects\n * IncomingMessage\n * OutgoingMessage\n * MessageStatus\n * Exceptions\n* Provider HTTP Receivers\n * Gateway.receiver_blueprint_for(name): flask.Blueprint\n * Gateway.receiver_blueprints():(name, flask.Blueprint)*\n * Gateway.receiver_blueprints_register(app, prefix='/'):flask.Flask\n* Message Routing\n* Bundled Providers\n * NullProvider\n * LogProvider\n * LoopbackProvider\n * LoopbackProvider.get_traffic():list\n * LoopbackProvider.received(src, body):IncomingMessage\n * LoopbackProvider.subscribe(number, callback):IProvider\n * ForwardServerProvider, ForwardClientProvider\n * ForwardClientProvider\n * ForwardServerProvider\n * Routing Server \n\n\n\n\n\nTutorial\n========\n\n## Sending Messages\n\nIn order to send a message, you will use a `Gateway`:\n\n```python\nfrom smsframework import Gateway\ngateway = Gateway()\n```\n\nBy itself, it cannot do anything. However, if you install a *provider* -- a library that implements some SMS service --\nyou can add it to the `Gateway` and configure it to send your messages through a provider:\n\n```python\nfrom smsframework_clickatell import ClickatellProvider\n\ngateway.add_provider('main', ClickatellProvider) # the default one\n```\n\nThe first provider defined becomes the default one. \n(If you have multiple providers, `Gateway` supports routing: rules that select which provider to use).\n\nNow, let's send a message:\n\n```python\nfrom smsframework import OutgoingMessage\n\ngateway.send(OutgoingMessage('+123456789', 'hi there!'))\n``` \n\n\n\n## Receiving Messages\n\nIn order to receive messages, you will use the same `Gateway` object and ask it to generate an HTTP API endpoint\nfor you. It uses Flask framework, and you'll need to run a Flask application in order to receive SMS messages:\n\n```pyhon\nfrom flask import Flask\n\napp = Flask()\nbp = gateway.receiver_blueprint_for('main') # SMS receiver\napp.register_blueprint(bp, url_prefix='/sms/main') # register it with Flask\n```\n\nNow, use Clickatell's web interface and register the following URL: `http://example.com/sms/main`.\nIt will send you messages to the application.\n\nNext, you need to handle the incoming messages in your code.\nTo to this, you need to subscribe your handler to the `gateway.onReceive` event:\n\n```python\ndef on_receive(message):\n \"\"\" :type message: IncomingMessage \"\"\"\n pass # Your logic here\n\ngateway.onReceive += on_receive\n```\n\nIn addition to receiving messages, you can receive status reports about the messages you have sent.\nSee Gateway.onStatus for more information.\n\n\n\n\n\nSupported Providers\n===================\n\nSMSframework supports the following bundled providers:\n\n* [log](#logprovider): log provider for testing. Bundled.\n* [null](#nullprovider): null provider for testing. Bundled.\n* [loopback](#loopbackprovider): loopback provider for testing. Bundled.\n\nSupported providers list:\n\n* [Clickatell](https://github.com/kolypto/py-smsframework-clickatell)\n* [Vianett](https://github.com/kolypto/py-smsframework-vianett)\n* [PSWin](https://github.com/dignio/py-smsframework-pswin)\n* [Twilio Studio](https://github.com/dignio/py-smsframework-twiliostudio)\n* Expecting more!\n\nAlso see the [full list of providers](https://pypi.python.org/pypi?%3Aaction=search&term=smsframework).\n\n\n\n\n\n\nInstallation\n============\n\nInstall from pypi:\n\n $ pip install smsframework\n\nInstall with some additional providers:\n\n $ pip install smsframework[clickatell]\n\nTo receive SMS messages, you need to ensure that [Flask microframework](http://flask.pocoo.org) is also installed:\n\n $ pip install smsframework[clickatell,receiver]\n\n\n\n\n\n\nGateway\n=======\n\nSMSframework handles the whole messaging thing with a single *Gateway* object.\n\nLet's start with initializing a gateway:\n\n```python\nfrom smsframework import Gateway\n\ngateway = Gateway()\n```\n\nThe `Gateway()` constructor currently has no arguments.\n\n\n\nProviders\n---------\nA *Provider* is a package which implements the logic for a specific SMS provider.\n\nEach provider reside in an individual package `smsframework_*`.\nYou'll probably want to install [some of these](#supported-providers) first.\n\n### Gateway.add_provider(name, Provider, **config):IProvider\nRegister a provider on the gateway\n\nArguments:\n\n* `provider: str` Provider name that will be used to uniquely identify it\n* `Provider: type` Provider class that inherits from `smsframework.IProvider`\n You'll use this string in order to send messages via a specific provider.\n* `**config` Provider configuration. Please refer to the Provider documentation.\n\n```python\nfrom smsframework.providers import NullProvider\nfrom smsframework_clickatell import ClickatellProvider\n\ngateway.add_provider('main', ClickatellProvider) # the default one\ngateway.add_provider('null', NullProvider)\n```\n\nThe first provider defined becomes the default one: used in case the routing function has no better idea.\nSee: [Message Routing](#message-routing).\n\n### Gateway.default_provider\nProperty which contains the default provider name. You can change it to something else:\n\n```python\ngateway.default_provider = 'null'\n```\n\n### Gateway.get_provider(name):IProvider\nGet a provider by name\n\nYou don't normally need this, unless the provider has some public API:\nrefer to the provider documentation for the details.\n\n\n\nSending Messages\n----------------\n\n### Gateway.send(message):OutgoingMessage\nTo send a message, you first create the [`OutgoingMessage`](#outgoingmessage) object\nand then pass it as the first argument.\n\nArguments:\n\n* `message: OutgoingMessage`: The messasge to send\n\nExceptions:\n\n* `AssertionError`: Wrong provider name encountered (returned by the router, or provided to OutgoingMessage)\n* `ProviderError`: Generic provider error\n* `ConnectionError`: Connection failed\n* `MessageSendError`: Generic sending error\n* `RequestError`: Request error: likely, validation errors\n* `UnsupportedError`: The requested operation is not supported\n* `ServerError`: Server error: sevice unavailable, etc\n* `AuthError`: Provider authentication failed\n* `LimitsError`: Sending limits exceeded\n* `CreditError`: Not enough money on the account\n\nReturns: the same `OutgoingMessage`, with some additional fields populated: `msgid`, `meta`, ..\n\n```python\nfrom smsframework import OutgoingMessage\n\nmsg = gateway.send(OutgoingMessage('+123456789', 'hi there!'))\n```\n\nA message sending fail when the provider raises an exception. This typically occurs when the wrapped HTTP API\nhas returned an immediate error. Note that some errors occur later, and are typically reported with status messages:\nsee [`MessageStatus`](#messagestatus)\n\n\n\nEvent Hooks\n-----------\n\nThe `Gateway` object has three events you can subscribe to.\n\nThe event is a simple object that implements the `+=` and `-=` operators which allow you to subscribe to the event\nand unsubscribe respectively.\n\nEvent hook is a python callable which accepts arguments explained in the further sections.\n\nNote that if you accidentally replace the hook with a callable (using the `=` operator instead of `+=`), you'll end\nup having a single hook, but smsframework will continue to work normally: thanks to the implementation.\n\nSee [smsframework/lib/events.py](smsframework/lib/events.py).\n\n### Gateway.onSend\nOutgoing Message: a message that was successfully sent.\n\nArguments:\n\n* `message: OutgoingMessage`: The message that was sent. See [OutgoingMessage](#outgoingmessage).\n\nThe message object is populated with the additional information from the provider, namely, the `msgid` and `meta` fields.\n\nNote that if the hook raises an Exception, it will propagate to the place where `Gateway.send()` was called!\n\n```python\ndef on_send(message):\n \"\"\" :type message: OutgoingMessage \"\"\"\n print(message)\n\ngw.onSend += on_send\n```\n\n### Gateway.onReceive\nIncoming Message: a message that was received from the provider.\n\nArguments:\n\n* `message: IncomingMessage`: The received message. See [IncomingMessage](#incomingmessage).\n\nNote that if the hook raises an Exception, the Provider will report the error to the sms service.\nMost services will retry the message delivery with increasing delays.\n\n```python\ndef on_receive(message):\n \"\"\" :type message: IncomingMessage \"\"\"\n print(message)\n\ngw.onReceive += on_receive\n```\n\n### Gateway.onStatus\nMessage Status: a message status reported by the provider.\n\nA status report is only delivered when explicitly requested with `OutgoingMessage.options(status_report=True)`.\n\nArguments:\n\n* `status: MessageStatus`: The status info. See [MessageStatus](#messagestatus) and its subclasses.\n\nNote that if the hook raises an Exception, the Provider will report the error to the sms service.\nMost services will retry the status delivery with increasing delays.\n\n```python\ndef on_status(status):\n \"\"\" :type status: MessageStatus \"\"\"\n print(status)\n\ngw.onStatus += on_status\n```\n\n\n\n\n\n\nData Objects\n============\nSMSframework uses the following objects to represent message flows.\n\nNote that internally all non-digit characters are removed from all phone numbers, both outgoing and incoming.\nPhone numbers are typically provided in international formats, though some local providers may be less strict with this.\n\nIncomingMessage\n---------------\nA messsage received from the provider.\n\nSource: [smsframework/data/IncomingMessage.py](smsframework/data/IncomingMessage.py).\n\nOutgoingMessage\n--------------\nA message being sent.\n\nSource: [smsframework/data/OutgoingMessage.py](smsframework/data/OutgoingMessage.py).\n\nMessageStatus\n-------------\nA status report received from the provider.\n\nSource: [smsframework/data/MessageStatus.py](smsframework/data/MessageStatus.py).\n\nExceptions\n----------\n\nSource: [smsframework/exc.py](smsframework/exc.py).\n\n\n\n\n\n\nProvider HTTP Receivers\n=======================\nNote: the whole receiver feature is optional. Skip this section if you only need to send messages.\n\nIn order to receive messages, most providers need an HTTP handler.\n\nTo get standardized, by default providers use [Flask microframework](http://flask.pocoo.org) for this:\na provider defines a [Blueprint](http://flask.pocoo.org/docs/blueprints/) which can be registered on your Flask\napplication as the receiver endpoint.\n\nThe resources are provider-dependent: refer to the provider documentation for the details.\nThe recommended approach is to use `/im` for incoming messages, and `/status` for status reports.\n\n## Gateway.receiver_blueprint_for(name): flask.Blueprint\nGet a Flask blueprint for the named provider that handles incoming messages & status reports.\n\nReturns: [flask.Blueprint](http://flask.pocoo.org/docs/blueprints/)\n\nErrors:\n\n* `KeyError`: provider not found\n* `NotImplementedError`: Provider does not implement a receiver\n\nThis method is mostly internal, as the following ones are usually much more convenient.\n\n## Gateway.receiver_blueprints():(name, flask.Blueprint)*\nGet Flask blueprints for every provider that supports it.\n\nThe method is a generator that yields `(name, blueprint)` tuples,\nwhere `blueprint` is `flask.Blueprint` for provider named `name`.\n\nUse this method to register your receivers manually:\n\n```python\nfrom flask import Flask\n\napp = Flask()\n\nfor name, bp in gateway.receiver_blueprints():\n app.register_blueprint(bp, url_prefix='/sms/'+name)\n```\n\nWith the example above, each receivers will be registered under */name* prefix.\n\nAssuming the *'clickatell'* provider defines */im* and */status* receivers and your app is running on *http://localhost:5000/*,\nyou will configure the SMS service to send messages to:\n\n* http://localhost:5000/sms/clickatell/im\n* http://localhost:5000/sms/clickatell/status\n\n## Gateway.receiver_blueprints_register(app, prefix='/'):flask.Flask\nRegister all provider receivers on the provided Flask application under '/{prefix}/provider-name'.\n\nThis is a convenience method to register all blueprints at once using the following recommended rules:\n\n* If `prefix` is provided, all blueprints are registered under this prefix\n* Provider receivers are registered under '/provider-name' path\n\nIt's adviced to mount the receivers under some difficult-to-guess prefix: otherwise, attackers can send\nfake messages into your system!\n\nSecure example:\n\n```js\ngateway.receiver_blueprints_register(app, '/24fb0d6963f/');\n```\n\nNOTE: Other mechanisms, such as basic authentication, are not typically useful as some services do not support that.\n\n\n\n\n\n\nMessage Routing\n===============\nSMSframework requires you to explicitly specify the provider for each message:\notherwise, it uses the first defined provider by default.\n\nIn real world conditions with multiple providers, you may want a router function that decides on which provider to use\nand which options to pick.\n\nIn order to achieve flexible message routing, we need to associate some metadata with each message, for instance:\n\n* `module`: name of the sending module: e.g. \"users\"\n* `type`: type of the message: e.g. \"notification\"\n\nThese 2 arbitrary strings need to be standardized in the application code, thus offering the possibility to define\ncomplex routing rules.\n\nWhen creating the message, use `OutgoingMessage.route()` function to specify these values:\n\n```python\ngateway.send(OutgoingMessage('+1234', 'hi').route('users', 'notification'))\n```\n\nNow, set a router function on the gateway:\na function which gets an outgoing message + some additional routing values, and decides on the provider to use:\n\n```python\ngateway.add_provider('primary', ClickatellProvider, ...)\ngateway.add_provider('quick', ClickatellProvider, ...)\ngateway.add_provider('usa', ClickatellProvider, ...)\n\ndef router(message, module, type):\n \"\"\" Custom router function \"\"\"\n if message.dst.startswith('1'):\n return 'usa' # Use 'usa' for all messages sent to the United States\n elif type == 'notification':\n return 'quick' # use the 'quick' for all notifications\n else:\n return None # Use the default provider ('primary') for everything else\n\n self.gw.router = router\n```\n\nRouter function is also the right place to specify provider-specific options.\n\n\n\n\n\n\nBundled Providers\n=================\nThe following providers are bundled with SMSframework and thus require no additional packages.\n\nNullProvider\n------------\n\nSource: [smsframework/providers/null.py](smsframework/providers/null.py)\n\nThe `'null'` provider just ignores all outgoing messages.\n\nConfiguration: none\n\nSending: does nothing, but increments message.msgid\n\nReceipt: Not implemented\n\nStatus: Not implemented\n\n```python\nfrom smsframework.providers import NullProvider\n\ngw.add_provider('null', NullProvider)\n```\n\nLogProvider\n-----------\n\nSource: [smsframework/providers/log.py](smsframework/providers/log.py)\n\nLogs the outgoing messages to a python logger provided as the config option.\n\nConfiguration:\n\n* `logger: logging.Logger`: The logger to use. Default logger is used if nothing provided.\n\nSending: does nothing, increments message.msgid, prints the message to the log\n\nReceipt: Not implemented\n\nStatus: Not implemented\n\nExample:\n\n```python\nimport logging\nfrom smsframework.providers import LogProvider\n\ngw.add_provider('log', LogProvider, logger=logging.getLogger(__name__))\n```\n\nLoopbackProvider\n----------------\n\nSource: [smsframework/providers/loopback.py](smsframework/providers/loopback.py)\n\nThe `'loopback'` provider is used as a dummy for testing purposes.\n\nAll messages are stored in the local log and can be retrieved as a list.\n\nThe provider even supports status & delivery notifications.\n\nIn addition, is supports virtual subscribers: callbacks bound to some phone numbers which are called when any\nsimulated message is sent to their phone number. Replies are also supported!\n\nConfiguration: none\n\nSending: sends message to a registered subscriber (see: :meth:`LoopbackProvider.subscribe`),\n silently ignores other messages.\n\nReceipt: simulation with a method\n\nStatus: always reports success\n\n### LoopbackProvider.get_traffic():list\nLoopbackProvider stores all messages that go through it: both IncomingMessage and OutgoingMessage.\n\nTo get those messages, call `.get_traffic()`.\nThis method empties the message log and returns its previous state:\n\n```python\nfrom smsframework.providers import LoopbackProvider\n\ngateway.add_provider('lo', LoopbackProvider);\ngateway.send(OutgoingMessage('+123', 'hi'))\n\ntraffic = gateway.get_provider('lo').get_traffic()\nprint(traffic[0].body) #-> 'hi'\n```\n\n### LoopbackProvider.received(src, body):IncomingMessage\nSimulate an incoming message.\n\nThe message is reported to the Gateway as if it has been received from the sms service.\n\nArguments:\n\n* `src: str`: Source number\n* `body: str | unicode`: Message text\n\nReturns: IncomingMessage\n\n### LoopbackProvider.subscribe(number, callback):IProvider\nRegister a virtual subscriber which receives messages to the matching number.\n\nArguments:\n\n* `number: str`: Subscriber phone number\n* `callback: `: A `callback(OutgoingMessage)` which handles the messages directed to the subscriber.\n The message object is augmented with the `.reply(str)` method which allows to send a reply easily!\n\n```python\ndef subscriber(message):\n print(message) #-> OutgoingMessage('1', 'obey me')\n message.reply('got it') # use the augmented reply method\n\nprovider = gateway.get_provider('lo')\nprovider.subscribe('+1', subscriber) # register the subscriber\n\ngateway.send('+1', 'obey me')\n```\n\nForwardServerProvider, ForwardClientProvider\n--------------------------------------------\n\nSource: [smsframework/providers/forward/provider.py](smsframework/providers/forward/provider.py)\n\nA pair of providers to bind two application instances together:\n\n* `ForwardClientProvider` can be used to send and receive messages using a remote server as a proxy\n* `ForwardServerProvider` is the remote server which:\n\n * Gets outgoing messages from clients and loops them back to the gateway so they're sent with another provider\n * Hooks into the gateway and passes all incoming messages and statuses to the clients\n\nTwo providers are bound together using two pairs of receivers. You are not required to care about this :)\n\nRemote errors will be transparently re-raised on the local host.\n\nTo support message receipt, include the necessary dependencies:\n\n pip install smsframework[receiver,async]\n\n### ForwardClientProvider\n\nExample setup:\n\n```python\nfrom smsframework.providers import ForwardClientProvider\n\ngw.add_provider('fwd', ForwardClientProvider, \n server_url='http://sms.example.com/sms/fwd')\n```\n\nConfiguration:\n\n* `server_url`: URL to ForwardServerProvider installed on a remote host.\n All outgoing messages will be sent through it instead.\n\n### ForwardServerProvider\n\nExample setup:\n\n```python\nfrom smsframework.providers import ForwardServerProvider\n\ngw.add_provider(....) # Default provider\ngw.add_provider('fwd', ForwardServerProvider, clients=[\n 'http://a.example.com/sms/fwd',\n 'http://b.example.com/sms/fwd',\n])\n```\n\nConfiguration:\n\n* `clients`: List of URLs to ForwardClientProvider installed on remote hosts.\n All incoming messages and statuses will be forwarded to all specified clients.\n\n#### Routing Server\nIf you want to forward only specific messages, you need to override the `choose_clients` method:\ngiven an object, which is either [`IncomingMessage`](#incomingmessage) or [`MessageStatus`](#messagestatus), it should\nreturn a list of client URLs the object should be forwarded to.\n\nExample: send all messages to \"a.example.com\", and status reports to \"b.example.com\":\n\n\n```python\nfrom smsframework import ForwardServerProvider\nfrom smsframework.data import OutgoingMessage, MessageStatus\n\nclass RoutingProvider(ForwardServerProvider):\n def choose_clients(self, obj):\n if isinstance(obj, OutgoingMessage):\n return [ self.clients[0] ]\n else:\n return [ self.clients[1] ]\n\ngw.add_provider(....) # Default provider\ngw.add_provider('fwd', RoutingProvider, clients=[\n 'http://a.example.com/sms/fwd',\n 'http://b.example.com/sms/fwd',\n])\n```\n\n#### Async\n\nIf your Server is going to forward messages to multiple clients simultaneously, you will probably want this to happen\nin parallel.\n\nJust install the `asynctools` dependency:\n\n pip install smsframework[receiver,async]\n\n#### Authentication\n\nBoth Client and Server support HTTP basic authentication in URLs:\n\n http://user:password@a.example.com/sms/fwd\n\nFor requests. Server-side authentication is your responsibility ;)\n\n\n\n",
"description_content_type": "text/markdown",
"docs_url": null,
"download_url": "",
"downloads": {
"last_day": -1,
"last_month": -1,
"last_week": -1
},
"home_page": "https://github.com/kolypto/py-smsframework",
"keywords": "sms,message,notification,receive,send",
"license": "BSD",
"maintainer": "",
"maintainer_email": "",
"name": "smsframework",
"package_url": "https://pypi.org/project/smsframework/",
"platform": "any",
"project_url": "https://pypi.org/project/smsframework/",
"project_urls": {
"Homepage": "https://github.com/kolypto/py-smsframework"
},
"release_url": "https://pypi.org/project/smsframework/0.0.9.post3/",
"requires_dist": [
"asynctools (>=0.1.3) ; extra == 'async'",
"smsframework-clickatell (>=0.0.3) ; extra == 'clickatell'",
"flask (>=0.10) ; extra == 'receiver'",
"smsframework-vianett (>=0.0.2) ; extra == 'vianett'"
],
"requires_python": "",
"summary": "Bi-directional SMS gateway with pluggable providers",
"version": "0.0.9.post3"
},
"last_serial": 4698078,
"releases": {
"0.0.1": [
{
"comment_text": "",
"digests": {
"md5": "241b297c510219ef08cdc470fdd9058d",
"sha256": "255d262df9623bf1c646442e177ab9699abc08df4b66b4020b862d18f1718641"
},
"downloads": -1,
"filename": "smsframework-0.0.1-py2.7.egg",
"has_sig": false,
"md5_digest": "241b297c510219ef08cdc470fdd9058d",
"packagetype": "bdist_egg",
"python_version": "2.7",
"requires_python": null,
"size": 16835,
"upload_time": "2014-01-29T01:02:09",
"url": "https://files.pythonhosted.org/packages/cf/b2/616469409933c70a56dc00802391deaaefbafcb5fbe2aff04077ca293020/smsframework-0.0.1-py2.7.egg"
},
{
"comment_text": "",
"digests": {
"md5": "213dc09a70d9687e5730d3b4cb3d8317",
"sha256": "dd7463a23dfcf5dabbe58d4e4f8d773464604a7fae347250e74d036830b6f291"
},
"downloads": -1,
"filename": "smsframework-0.0.1.tar.gz",
"has_sig": false,
"md5_digest": "213dc09a70d9687e5730d3b4cb3d8317",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 15174,
"upload_time": "2014-01-29T01:02:05",
"url": "https://files.pythonhosted.org/packages/ed/c6/b37845c49423e438fe675330a7ab28f82afc3b8749690bb119f49df375d8/smsframework-0.0.1.tar.gz"
}
],
"0.0.2": [
{
"comment_text": "",
"digests": {
"md5": "46cb9409883423c7580cb6beb167a625",
"sha256": "b758321fe1a39efc9fe4b840d2889a01b1ad9c12d1e92df92fa5b4e0882a77d2"
},
"downloads": -1,
"filename": "smsframework-0.0.2-py2.7.egg",
"has_sig": false,
"md5_digest": "46cb9409883423c7580cb6beb167a625",
"packagetype": "bdist_egg",
"python_version": "2.7",
"requires_python": null,
"size": 16837,
"upload_time": "2014-01-29T01:05:49",
"url": "https://files.pythonhosted.org/packages/7c/ca/39e13434543217c6b683b0a45deebfc375a87297bcba6a2a4cbdf90602c8/smsframework-0.0.2-py2.7.egg"
},
{
"comment_text": "",
"digests": {
"md5": "f0f28f50297951fa9f728569ec5a07ac",
"sha256": "204aed6c443dc1e61dae2452f93fa7b9726e750a3cdfb8aa10dc9717d55b2476"
},
"downloads": -1,
"filename": "smsframework-0.0.2.tar.gz",
"has_sig": false,
"md5_digest": "f0f28f50297951fa9f728569ec5a07ac",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 15176,
"upload_time": "2014-01-29T01:05:45",
"url": "https://files.pythonhosted.org/packages/ac/fa/e61c79c01b9ee4347b7290d47f77fc31e00654ee4968ce055fc9b0106197/smsframework-0.0.2.tar.gz"
}
],
"0.0.2-1": [
{
"comment_text": "",
"digests": {
"md5": "a262af931764285428f20565ce59f804",
"sha256": "7465c607714f07d17f34bd2ab8027cf41d84749df7c0ad153cb07333bfa2d220"
},
"downloads": -1,
"filename": "smsframework-0.0.2_1-py2.7.egg",
"has_sig": false,
"md5_digest": "a262af931764285428f20565ce59f804",
"packagetype": "bdist_egg",
"python_version": "2.7",
"requires_python": null,
"size": 32962,
"upload_time": "2014-01-29T13:07:42",
"url": "https://files.pythonhosted.org/packages/c5/ba/26b9bf931467408856f55ae408ab10361d15d4cc8cc8fb33953e1fdd921f/smsframework-0.0.2_1-py2.7.egg"
},
{
"comment_text": "",
"digests": {
"md5": "a0ad6c9e0a13158f2f4014f134f2751c",
"sha256": "90ffd381879e0daaf7d03a92e2abf9f9821afc25c1cdad0b52c584c8fcc580a6"
},
"downloads": -1,
"filename": "smsframework-0.0.2-1.tar.gz",
"has_sig": false,
"md5_digest": "a0ad6c9e0a13158f2f4014f134f2751c",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 18575,
"upload_time": "2014-01-29T13:07:38",
"url": "https://files.pythonhosted.org/packages/55/a6/06a8d403339392e2825d937a692b76caae81de0d356233baed01560f065a/smsframework-0.0.2-1.tar.gz"
}
],
"0.0.3": [
{
"comment_text": "",
"digests": {
"md5": "b5e041e9e3beb70baa84f63da8235bda",
"sha256": "d9adb4b8fa1be4a58b96b1e5066a118f1021110fe4a80f5ce3bd35149b7a4a36"
},
"downloads": -1,
"filename": "smsframework-0.0.3-py2.7.egg",
"has_sig": false,
"md5_digest": "b5e041e9e3beb70baa84f63da8235bda",
"packagetype": "bdist_egg",
"python_version": "2.7",
"requires_python": null,
"size": 33346,
"upload_time": "2014-01-29T15:05:27",
"url": "https://files.pythonhosted.org/packages/db/33/d9d6653bea3280c03db0b2bdf015ce0fc28192bb06a17308275c50abbb70/smsframework-0.0.3-py2.7.egg"
},
{
"comment_text": "",
"digests": {
"md5": "8717553a22ad37893f01848fa335fa1e",
"sha256": "9bba5432e9269e07eec8247a58f9615758a6a30578eb8722c9f99f7a4ebc9680"
},
"downloads": -1,
"filename": "smsframework-0.0.3.tar.gz",
"has_sig": false,
"md5_digest": "8717553a22ad37893f01848fa335fa1e",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 18721,
"upload_time": "2014-01-29T15:05:23",
"url": "https://files.pythonhosted.org/packages/34/60/93602cc95cd0893ecfe1478ea5c38bb39ebb14c23e33b9616c35efe3fe5d/smsframework-0.0.3.tar.gz"
}
],
"0.0.3-1": [
{
"comment_text": "",
"digests": {
"md5": "afa1dbb9b4e08d9fc1fd9ebc9b59af45",
"sha256": "72b47e0a77bc018e321f4c3796f37cd2311b6335c87468757ab075c1a53ea937"
},
"downloads": -1,
"filename": "smsframework-0.0.3_1-py2.7.egg",
"has_sig": false,
"md5_digest": "afa1dbb9b4e08d9fc1fd9ebc9b59af45",
"packagetype": "bdist_egg",
"python_version": "2.7",
"requires_python": null,
"size": 33462,
"upload_time": "2014-01-29T15:55:26",
"url": "https://files.pythonhosted.org/packages/91/31/eb3cdf0ebcdbbf7dc62ebd14cb5dea731c96ea3b2fefd9cb7d939cf71629/smsframework-0.0.3_1-py2.7.egg"
},
{
"comment_text": "",
"digests": {
"md5": "ecf1ea53d67f7cf37104e2005f6d8914",
"sha256": "7df635831518e69b29e9884eade550fd2124c7ff543b992f71ae7fcc837f8383"
},
"downloads": -1,
"filename": "smsframework-0.0.3-1.tar.gz",
"has_sig": false,
"md5_digest": "ecf1ea53d67f7cf37104e2005f6d8914",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 18788,
"upload_time": "2014-01-29T15:55:21",
"url": "https://files.pythonhosted.org/packages/46/5d/31f1b5176f0f1e01fd2975e732902d0469822aa8ad5814faad35b7b5ad82/smsframework-0.0.3-1.tar.gz"
}
],
"0.0.3-2": [
{
"comment_text": "built for Linux-3.13.0-30-generic-x86_64-with-glibc2.4",
"digests": {
"md5": "2beea9ffecf41c753c29b2d695ea5a7c",
"sha256": "b64874a04797e83a3627dfac6540476cf93ea5b45601d0cc28bc1339aba4d38d"
},
"downloads": -1,
"filename": "smsframework-0.0.3-2.linux-x86_64.tar.gz",
"has_sig": false,
"md5_digest": "2beea9ffecf41c753c29b2d695ea5a7c",
"packagetype": "bdist_dumb",
"python_version": "any",
"requires_python": null,
"size": 22011,
"upload_time": "2014-07-16T16:53:58",
"url": "https://files.pythonhosted.org/packages/36/3d/5a3257abbdcfbd55969f4ab582f00225996708c8ad02fd5bf2c9fe377d01/smsframework-0.0.3-2.linux-x86_64.tar.gz"
},
{
"comment_text": "",
"digests": {
"md5": "93f0d67f0d9cff52367747c63705ba27",
"sha256": "f99c582c7236e3f8f452835c05a68c3db1170ea7f0c6cc78ebfa7ed412ad5221"
},
"downloads": -1,
"filename": "smsframework-0.0.3-2.tar.gz",
"has_sig": false,
"md5_digest": "93f0d67f0d9cff52367747c63705ba27",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 18998,
"upload_time": "2014-07-16T16:53:55",
"url": "https://files.pythonhosted.org/packages/f0/77/d206f18eb64b8626af5df738046bcfccd237c72911b66a389248a9ca5f66/smsframework-0.0.3-2.tar.gz"
}
],
"0.0.4-0": [
{
"comment_text": "built for Linux-3.13.0-30-generic-x86_64-with-glibc2.4",
"digests": {
"md5": "c084335e27b9977801b3efe7a29ca027",
"sha256": "77a95c7e4ba65682ebb3de69d50686a7c916def1cc77e535b450227da4675999"
},
"downloads": -1,
"filename": "smsframework-0.0.4-0.linux-x86_64.tar.gz",
"has_sig": false,
"md5_digest": "c084335e27b9977801b3efe7a29ca027",
"packagetype": "bdist_dumb",
"python_version": "any",
"requires_python": null,
"size": 30883,
"upload_time": "2014-07-17T12:44:48",
"url": "https://files.pythonhosted.org/packages/af/fb/ed6176c8d53babd581401d2b9ef70dc8cab5b8fcaabaae6fd5f803589c48/smsframework-0.0.4-0.linux-x86_64.tar.gz"
},
{
"comment_text": "",
"digests": {
"md5": "7ec665a11a77b9f467affa651c7c7c7a",
"sha256": "a42f6cd65cbcd5bac6d2c480f3dc6dca8ef99bc8362d8419155088d377b68077"
},
"downloads": -1,
"filename": "smsframework-0.0.4-0.tar.gz",
"has_sig": false,
"md5_digest": "7ec665a11a77b9f467affa651c7c7c7a",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 23905,
"upload_time": "2014-07-17T12:44:45",
"url": "https://files.pythonhosted.org/packages/ef/6e/2ef54b8c13a50075c8fb5924a27526bdf6efb91bbe096eaab7677c607125/smsframework-0.0.4-0.tar.gz"
}
],
"0.0.5-0": [
{
"comment_text": "built for Linux-3.13.0-30-generic-x86_64-with-glibc2.4",
"digests": {
"md5": "cdef692d2c7a28d266f7ff05e80fc8e5",
"sha256": "30b17dc32e0ebfc13c75e544d5d8e79778f4a3e421e97dfee7f9ac1c6e7eb3c3"
},
"downloads": -1,
"filename": "smsframework-0.0.5-0.linux-x86_64.tar.gz",
"has_sig": false,
"md5_digest": "cdef692d2c7a28d266f7ff05e80fc8e5",
"packagetype": "bdist_dumb",
"python_version": "any",
"requires_python": null,
"size": 31373,
"upload_time": "2014-07-18T16:33:20",
"url": "https://files.pythonhosted.org/packages/f7/26/62c16b6bb9f72505ecc5a3587346cf3adc5301d8e1eaee1147d0cb5eb47e/smsframework-0.0.5-0.linux-x86_64.tar.gz"
},
{
"comment_text": "",
"digests": {
"md5": "d12dd7ddd8baf3ae2d015fb02782774c",
"sha256": "491b5a1a1e596befa726ca1ee8c58c8c4a4989c7b580408c1d1a1f1365440217"
},
"downloads": -1,
"filename": "smsframework-0.0.5-0.tar.gz",
"has_sig": false,
"md5_digest": "d12dd7ddd8baf3ae2d015fb02782774c",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 24497,
"upload_time": "2014-07-18T16:33:16",
"url": "https://files.pythonhosted.org/packages/ff/a1/bf48596e25b12435a192fbee0cc26ea08531388d40f4b15435f43e5fe1e8/smsframework-0.0.5-0.tar.gz"
}
],
"0.0.5-1": [
{
"comment_text": "built for Linux-3.13.0-30-generic-x86_64-with-glibc2.4",
"digests": {
"md5": "7388fae7aec3913191814e24bf8fe2e0",
"sha256": "d29d2eb26b699fe1d49b745fe2b9aaaf72a86779dac7ebb294df13587c4a95f9"
},
"downloads": -1,
"filename": "smsframework-0.0.5-1.linux-x86_64.tar.gz",
"has_sig": false,
"md5_digest": "7388fae7aec3913191814e24bf8fe2e0",
"packagetype": "bdist_dumb",
"python_version": "any",
"requires_python": null,
"size": 29882,
"upload_time": "2014-07-18T17:11:00",
"url": "https://files.pythonhosted.org/packages/0c/7a/1b41987e03a4bf54abaa548016110f909fbc447fa22768c0ff8525417480/smsframework-0.0.5-1.linux-x86_64.tar.gz"
},
{
"comment_text": "",
"digests": {
"md5": "ddc5d4899a6625d99afed60fb93ba5ca",
"sha256": "2aa01f9088b2ecb95e33640dd2ae2478b29d58d5fd6e4ae225a86ec7398f206b"
},
"downloads": -1,
"filename": "smsframework-0.0.5-1.tar.gz",
"has_sig": false,
"md5_digest": "ddc5d4899a6625d99afed60fb93ba5ca",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 24508,
"upload_time": "2014-07-18T17:10:56",
"url": "https://files.pythonhosted.org/packages/aa/5c/b8d119b73909802fb94b0e42a1b0f394b473a7f31674d1c61fc2aeca9613/smsframework-0.0.5-1.tar.gz"
}
],
"0.0.6": [
{
"comment_text": "built for Linux-3.13.0-30-generic-x86_64-with-glibc2.4",
"digests": {
"md5": "5be1288ba1ea910d5aed4690a1656475",
"sha256": "29059f5e471fe1621c8f758fe1ac90b0aae5511075c3591228006320abc7a541"
},
"downloads": -1,
"filename": "smsframework-0.0.6.linux-x86_64.tar.gz",
"has_sig": false,
"md5_digest": "5be1288ba1ea910d5aed4690a1656475",
"packagetype": "bdist_dumb",
"python_version": "any",
"requires_python": null,
"size": 31823,
"upload_time": "2014-07-19T18:05:45",
"url": "https://files.pythonhosted.org/packages/b9/36/c0b876b3c50ef30ec25faa88e58e7e387ee7c86a7b0b8da8ecd2ede1d07d/smsframework-0.0.6.linux-x86_64.tar.gz"
},
{
"comment_text": "",
"digests": {
"md5": "d1133eb803e1638f6f64e2865fffe7b2",
"sha256": "b82feffa0f551170aea31c0b68183e3d28293a002a4e73015021e5671cb54749"
},
"downloads": -1,
"filename": "smsframework-0.0.6.tar.gz",
"has_sig": false,
"md5_digest": "d1133eb803e1638f6f64e2865fffe7b2",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 24808,
"upload_time": "2014-07-19T18:05:41",
"url": "https://files.pythonhosted.org/packages/60/3a/dc589ae594e590c3abfde6c642b19b115e9acec70e25ecbca2529094fab8/smsframework-0.0.6.tar.gz"
}
],
"0.0.6-0": [
{
"comment_text": "built for Linux-3.13.0-30-generic-x86_64-with-glibc2.4",
"digests": {
"md5": "52f9f4c04f5791b315aac064f79eb68e",
"sha256": "6295b61f12080f3a82f0bd58b9a0108c79444246eae720823eca953acd503199"
},
"downloads": -1,
"filename": "smsframework-0.0.6-0.linux-x86_64.tar.gz",
"has_sig": false,
"md5_digest": "52f9f4c04f5791b315aac064f79eb68e",
"packagetype": "bdist_dumb",
"python_version": "any",
"requires_python": null,
"size": 31835,
"upload_time": "2014-07-19T18:06:07",
"url": "https://files.pythonhosted.org/packages/ed/9e/5fc7c1000f84bc06e64a739aa859e36b8cacde62bba2228e3a213af54d60/smsframework-0.0.6-0.linux-x86_64.tar.gz"
},
{
"comment_text": "",
"digests": {
"md5": "ee11ed69d810c657669a2e122c85f241",
"sha256": "a759868e1d5cd9698386a544692ee2af070feaa30137728cfb9cfe1a7a573f62"
},
"downloads": -1,
"filename": "smsframework-0.0.6-0.tar.gz",
"has_sig": false,
"md5_digest": "ee11ed69d810c657669a2e122c85f241",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 24817,
"upload_time": "2014-07-19T18:06:04",
"url": "https://files.pythonhosted.org/packages/e4/25/7278eca4a42d628e75fe3f8a355f976f5ac380ad423a947f18aff1ca6214/smsframework-0.0.6-0.tar.gz"
}
],
"0.0.6-1": [
{
"comment_text": "built for Linux-3.13.0-30-generic-x86_64-with-glibc2.4",
"digests": {
"md5": "e955f8dcbbdbe2bb12d667ff8ed7f571",
"sha256": "f58aa1f322114d6cb94757be5dfc406598156248065d9068ad23c5f69b616397"
},
"downloads": -1,
"filename": "smsframework-0.0.6-1.linux-x86_64.tar.gz",
"has_sig": false,
"md5_digest": "e955f8dcbbdbe2bb12d667ff8ed7f571",
"packagetype": "bdist_dumb",
"python_version": "any",
"requires_python": null,
"size": 32177,
"upload_time": "2014-07-21T10:00:25",
"url": "https://files.pythonhosted.org/packages/47/ed/070a0429312713bba240b2750d7add79213e7edabe700f7e7cc21b04aa5e/smsframework-0.0.6-1.linux-x86_64.tar.gz"
},
{
"comment_text": "",
"digests": {
"md5": "f69a8a2c6edd5e3993da2ad7608855b8",
"sha256": "e966c70184f462cc038d2d6fd2894e2c7187effd44574a0ea1408ca13571cbc7"
},
"downloads": -1,
"filename": "smsframework-0.0.6-1.tar.gz",
"has_sig": false,
"md5_digest": "f69a8a2c6edd5e3993da2ad7608855b8",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 25003,
"upload_time": "2014-07-21T10:00:22",
"url": "https://files.pythonhosted.org/packages/7f/56/8a6d7bf609cbaa5782b17d639f728f555a8c1289186363141309afefaa1d/smsframework-0.0.6-1.tar.gz"
}
],
"0.0.6-2": [
{
"comment_text": "built for Linux-3.13.0-32-generic-x86_64-with-glibc2.4",
"digests": {
"md5": "cddd27bbaf4dda523b6026f1db500ad9",
"sha256": "1957a9e1c612f35524ca86249aa563f39c536f06e2377116f3b9f8213cf9afdb"
},
"downloads": -1,
"filename": "smsframework-0.0.6-2.linux-x86_64.tar.gz",
"has_sig": false,
"md5_digest": "cddd27bbaf4dda523b6026f1db500ad9",
"packagetype": "bdist_dumb",
"python_version": "any",
"requires_python": null,
"size": 32275,
"upload_time": "2014-08-07T13:05:42",
"url": "https://files.pythonhosted.org/packages/42/44/98db692cc7a24bb3f92c057a1a96e68668c04cee427cac9d007b240c38ba/smsframework-0.0.6-2.linux-x86_64.tar.gz"
},
{
"comment_text": "",
"digests": {
"md5": "d6e5109f6676e071d8942100e2d5de71",
"sha256": "8a8c0ec413ce55f1274425928e10ee0f126db7bab4efd89526ace45ec39350fa"
},
"downloads": -1,
"filename": "smsframework-0.0.6-2.tar.gz",
"has_sig": false,
"md5_digest": "d6e5109f6676e071d8942100e2d5de71",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 25041,
"upload_time": "2014-08-07T13:05:38",
"url": "https://files.pythonhosted.org/packages/31/c3/ae9ef6fbfa6867a456f404b160785fb8a70d181bd9fb6b366db44e486cf8/smsframework-0.0.6-2.tar.gz"
}
],
"0.0.7-0": [
{
"comment_text": "built for Linux-3.13.0-32-generic-x86_64-with-glibc2.4",
"digests": {
"md5": "0aa859c89c63da028b946673eced007c",
"sha256": "55b6ec23c026d93629ea90ae440bb5f5643bd52e5e7e62378a734261148efe22"
},
"downloads": -1,
"filename": "smsframework-0.0.7-0.linux-x86_64.tar.gz",
"has_sig": false,
"md5_digest": "0aa859c89c63da028b946673eced007c",
"packagetype": "bdist_dumb",
"python_version": "any",
"requires_python": null,
"size": 32239,
"upload_time": "2014-08-08T12:16:28",
"url": "https://files.pythonhosted.org/packages/bc/2f/d9836d756ede416d8266ace70c78a72c0d1e65ab7c3d5168ee3519f9d140/smsframework-0.0.7-0.linux-x86_64.tar.gz"
},
{
"comment_text": "",
"digests": {
"md5": "4fdad0d85708793ad2c075fb22a56870",
"sha256": "758b412493299bf752b1ecd9fd1bf0f372bf860cf3ac03114dbcf0046291759b"
},
"downloads": -1,
"filename": "smsframework-0.0.7-0.tar.gz",
"has_sig": false,
"md5_digest": "4fdad0d85708793ad2c075fb22a56870",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 25046,
"upload_time": "2014-08-08T12:16:25",
"url": "https://files.pythonhosted.org/packages/25/02/bcfcfddea741126c70c20bf34fb057ee0aac187fe89044f7c70e1f38409b/smsframework-0.0.7-0.tar.gz"
}
],
"0.0.7-1": [
{
"comment_text": "",
"digests": {
"md5": "39f5948ef63c21376a3ad74c03be7e4b",
"sha256": "2778f0b6aa054a634af3e2818a054e91c226cdf09cf481e221264ffe73be6369"
},
"downloads": -1,
"filename": "smsframework-0.0.7_1-py2-none-any.whl",
"has_sig": false,
"md5_digest": "39f5948ef63c21376a3ad74c03be7e4b",
"packagetype": "bdist_wheel",
"python_version": "2.7",
"requires_python": null,
"size": 32313,
"upload_time": "2014-08-14T15:53:12",
"url": "https://files.pythonhosted.org/packages/99/3f/72fea6f20e0aa4ab22c8b7238dd8f3d294d64ab1471af7cf37c9d442560d/smsframework-0.0.7_1-py2-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "d2e9b8b4f61b1963f9fbd5a3b8f23c7c",
"sha256": "3afe744d3ee589cb6b8cf23c7f10b8b7ec20dfb79a15ac6dcfca3ef2cef5aa32"
},
"downloads": -1,
"filename": "smsframework-0.0.7-1.tar.gz",
"has_sig": false,
"md5_digest": "d2e9b8b4f61b1963f9fbd5a3b8f23c7c",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 25053,
"upload_time": "2014-08-14T15:53:03",
"url": "https://files.pythonhosted.org/packages/fc/e1/7c1d42b19fe101b01d48cd86b263e4c2d9618ecf44bd40a2760e7ad219e1/smsframework-0.0.7-1.tar.gz"
}
],
"0.0.9.post1": [
{
"comment_text": "",
"digests": {
"md5": "4af29fef3f3543d0c5f1d0437052c71a",
"sha256": "3079b5263255b2c75e8e3cbfb67948cbc1cb123da7d9f5050b31187aa0a6bda4"
},
"downloads": -1,
"filename": "smsframework-0.0.9.post1-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "4af29fef3f3543d0c5f1d0437052c71a",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": null,
"size": 26473,
"upload_time": "2019-01-11T09:41:24",
"url": "https://files.pythonhosted.org/packages/b2/4a/36ad6362dcb22d21e4a53601f0f94d3a69c301561ab1d068e0c7ab369771/smsframework-0.0.9.post1-py2.py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "509f5adf00a40142df488cde3562a7b9",
"sha256": "0f1ceecc10f64568852a4aa9cc42f6e609507a02b8115af2dae750f7ee3e1ce7"
},
"downloads": -1,
"filename": "smsframework-0.0.9.post1.tar.gz",
"has_sig": false,
"md5_digest": "509f5adf00a40142df488cde3562a7b9",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 33485,
"upload_time": "2019-01-11T09:41:26",
"url": "https://files.pythonhosted.org/packages/aa/d5/3584b778cfd23c736b97a4670425decc8de9613783751ac0089f4a5d7a98/smsframework-0.0.9.post1.tar.gz"
}
],
"0.0.9.post2": [
{
"comment_text": "",
"digests": {
"md5": "3ed2a74aaab698e5cf89ea130e64c972",
"sha256": "ab618dcffdda6696ba857ac845f2346f9da94a97e681861a0ae87c05cb2c60a4"
},
"downloads": -1,
"filename": "smsframework-0.0.9.post2-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "3ed2a74aaab698e5cf89ea130e64c972",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": null,
"size": 26504,
"upload_time": "2019-01-12T13:53:28",
"url": "https://files.pythonhosted.org/packages/7b/eb/291f52f3467500d81569d9276ff10d01fc8a79e450deaedf8a3d7ec71fa6/smsframework-0.0.9.post2-py2.py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "852155235037c8bce947c3851222d162",
"sha256": "de775c3e0a994eba99988fe43520d6789e90ca4c8c5bce25fbc44b6f2fcca10b"
},
"downloads": -1,
"filename": "smsframework-0.0.9.post2.tar.gz",
"has_sig": false,
"md5_digest": "852155235037c8bce947c3851222d162",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 33540,
"upload_time": "2019-01-12T13:53:30",
"url": "https://files.pythonhosted.org/packages/15/10/3c4d33f3f175092d337b4270aadcb5b3a61357f616574edb35051e48d4dd/smsframework-0.0.9.post2.tar.gz"
}
],
"0.0.9.post3": [
{
"comment_text": "",
"digests": {
"md5": "b2c1f80a68402fb5da6ab22b08d5dbe6",
"sha256": "aebd8ec6263863e0e5b52e3fa581607223a211dd4461e617358134b230c68618"
},
"downloads": -1,
"filename": "smsframework-0.0.9.post3-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "b2c1f80a68402fb5da6ab22b08d5dbe6",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": null,
"size": 26514,
"upload_time": "2019-01-15T09:15:57",
"url": "https://files.pythonhosted.org/packages/78/d5/5f1b49f7ff83a1336f192b1bae40c1f4f7297da3cfcd91b86ed4381375f1/smsframework-0.0.9.post3-py2.py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "44cb6417ad30509e6d02def3a40d7085",
"sha256": "6a7124abae6a3e3af547464d8c1b57d3c8ae9a6a53ae6b6216917d4813dbbc33"
},
"downloads": -1,
"filename": "smsframework-0.0.9.post3.tar.gz",
"has_sig": false,
"md5_digest": "44cb6417ad30509e6d02def3a40d7085",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 33551,
"upload_time": "2019-01-15T09:15:59",
"url": "https://files.pythonhosted.org/packages/5c/00/6299ecb2bf30c283b3f2e90c6813133789cd068864ab6caa3fa4650a06ff/smsframework-0.0.9.post3.tar.gz"
}
]
},
"urls": [
{
"comment_text": "",
"digests": {
"md5": "b2c1f80a68402fb5da6ab22b08d5dbe6",
"sha256": "aebd8ec6263863e0e5b52e3fa581607223a211dd4461e617358134b230c68618"
},
"downloads": -1,
"filename": "smsframework-0.0.9.post3-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "b2c1f80a68402fb5da6ab22b08d5dbe6",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": null,
"size": 26514,
"upload_time": "2019-01-15T09:15:57",
"url": "https://files.pythonhosted.org/packages/78/d5/5f1b49f7ff83a1336f192b1bae40c1f4f7297da3cfcd91b86ed4381375f1/smsframework-0.0.9.post3-py2.py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "44cb6417ad30509e6d02def3a40d7085",
"sha256": "6a7124abae6a3e3af547464d8c1b57d3c8ae9a6a53ae6b6216917d4813dbbc33"
},
"downloads": -1,
"filename": "smsframework-0.0.9.post3.tar.gz",
"has_sig": false,
"md5_digest": "44cb6417ad30509e6d02def3a40d7085",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 33551,
"upload_time": "2019-01-15T09:15:59",
"url": "https://files.pythonhosted.org/packages/5c/00/6299ecb2bf30c283b3f2e90c6813133789cd068864ab6caa3fa4650a06ff/smsframework-0.0.9.post3.tar.gz"
}
]
}