{ "info": { "author": "Josef Spillner", "author_email": "josef.spillner@zhaw.ch", "bugtrack_url": null, "classifiers": [ "Development Status :: 2 - Pre-Alpha", "Environment :: Console", "Environment :: No Input/Output (Daemon)", "Intended Audience :: Science/Research", "License :: OSI Approved :: Apache Software License", "Programming Language :: Python :: 3", "Topic :: Internet :: WWW/HTTP :: WSGI :: Middleware" ], "description": "Snafu: Snake Functions\n=========================================================\n\nSnafu is a tiny flexible Function-as-a-Service (FaaS) host process and\ntool for Python and other programming languages. Snafu is unique in\nreducing the effort to get going (no configuration is required, although\na configuration file is available for optional customisation), in\nchoosing the execution model (with and without isolation for instance),\nin exposure of functions, and in integration with other FaaS runtimes\nand commercial services.\n\nThink of it as the 'Swiss Army Knife of Serverless Computing'!\n\nFunctions are read from specified source files. If no directory is\nspecified, 'functions' with some sample functions as well as\n'functions-local' for user-imported functions are scanned. The set of\nexported functions consists of all of them (convention name: any) or\njust one pre-defined function by default named 'lambda_handler' with\nspecific arguments, for compatibility with AWS Lambda's Python 2.7\nruntime (convention name: 'lambda'). For languages requiring compilation\n(i.e. Java), this is attempted transparently.\n\nFunctions are invoked through connectors, for instance HTTP requests or\ninteractive command-line input or both at the same time. They correspond\nroughly to Lambda triggers. The invocations are recorded in loggers, for\ninstance CSV files. They are furthermore checked against authenticators.\nAll connectors, loggers, executors and authenticators are described\nbelow.\n\nThe utility script 'snafu-import' exists to slurp Lambda, OpenWhisk and\nGoogle Cloud functions and configurations for execution with Snafu or to\nsome extent with other FaaS runtimes.\nConfiguration support is limited to environment variables at the moment.\nConfiguration files are read as *.config associated to *.py. In their\nabsence, the handler name (.) becomes the function\nname.\n\nThe daemon 'snafu-control' implements a FaaS control plane in partial\ncompliance to Lambda, OpenWhisk and Google Cloud Functions so that the\nrespective command-line tools (aws, wsk, gcloud) can be used against it.\n\nSnafu is implemented in Python 3 so that any Lambda functions need to be\npassed through the 2to3 tool which 'snafu-import' can automate. It is\nexpected that Python 3 will be added to Lambda in the near future,\nmaking this step then obsolete. Alternatively, out-of-process execution\nexists for all supported programming languages, including Python 3 for\nimproved parallel execution performance.\n\nThe runtime and success status of invoked functions are measured through\nthe loggers and can be further processed for statistical analysis and\nbilling purposes.\n\nRequirements\n------------\nPython 3 is required. For the full functionality, install the 'flask'\nand 'pyesprima3' modules as well as compilers and interpreters for all\nsupported languages (i.e. python2, python3, nodejs, gcc, javac/java).\n\nUsage\n-----\nSnafu runs interactively until interrupted with Ctrl+C.\n\n% ./snafu [-h]\n% ./snafu --executor --logger --convention \n\n# e.g. ./snafu --executor python2stateful --logger sqlite\n\nTo fill up the functions pool with some already deployed in AWS, IBM or\nGoogle, use the import utility.\n\n% ./snafu-import [--convert] [--source ] [--target ]\n\n# e.g. --source gfunctions: deploy from Google into Snafu\n# e.g. --source openwhisk --target funktion: from IBM into Funktion\n\nApart from hosting the functions, Snafu can also be used in batch\nprocessing to test functions systematically. For instance:\n\n% echo \"{}\" | ./snafu -x lambda_function.lambda_handler\n\nThe control plane 'snafu-control' implements essential functionality\nfound in the Lambda control plane via Snafu. Use aws-cli with the option\n--endpoint-url to redirect all requests to your instance (by default, it\nruns on http://localhost:10000/). It is highly recommended to add\n--cli-read-timeout 0 as well. The gcloud tool needs patching\n(tools/patch-gcloud), the wsk tool needs --apihost set to\nhttp://localhost:10000.\n\n% ./snafu-control [-h]\n\n# e.g. ./snafu-control --reaper --deployer --authenticator aws\n\nThe file snafu.ini.dist can be copied to snafu.ini to customise the\nconfiguration of Snafu.\n\nConnectors (only in snafu)\n--------------------------\n* cli (interactive function name choice; payload asked or read from\n stdin)\n* web (function name chosen via URL path; payload via HTTP POST)\n* messaging (no function name choice apart from config; no payload choice: )\n* filesystem (no function name choice apart from config; no payload choice: )\n* cron (no function name choice apart from config; no payload choice: empty)\n\nLoggers\n-------\n* csv\n* sqlite\n* (none)\n\nExecutors\n---------\nNote: one default executor is defined and can be overridden for each\nfile type (.py, .js, .class, .so).\n\nFor Python:\n* inmemory (fastest, in-memory, only for truly stateless function)\n* inmemstateless (higher isolation level through module reload)\n* python2 (external\n* python2stateful (re-used instance with lower isolation level)\n* python3 (external)\n* lxc (wrapping function instances into LXC contexts for isolation)\n\nFor other programming languages:\n* java (external, under development)\n* javascript (external, under development)\n* c (external, under development)\n\nForwarders (only in snafu-control, as pseudo-executors)\n-------------------------------------------------------\n* proxy (redirect to another fixed or per-tenant instance of Snafu)\n* docker (redirect to a dynamically created per-tenant instance)\n* openshift (under development)\n\nAuthenticators (only in snafu-control)\n--------------------------------------\n* aws (AWS4 signature algorithm)\n* (none)\n\nImport/Export\n-------------\n* imports: from Google Cloud Functions, OpenWhisk, AWS Lambda\n* exports: to Funktion, Fission, Kubeless + of course Snafu\n\nPackaged Snafu\n--------------\nA containerised version is made available for running Snafu in a Docker\nenvironment. An alternate version of the image is complete rather than\nminimal and includes among others the command-line tools of several\ncommercial FaaS providers.\n\n% docker run -ti jszhaw/snafu\n% docker run -ti jszhaw/snafucomplete\n\nIntegration into OpenShift and Kubernetes is available for experiments\nand documented in the 'openshift' directory.\n\nFurthermore, a Python package is made available on PyPI.\n\n% pip install snafu\n\nResearch and Further Reading\n----------------------------\nSnafu results from service tooling research at the Service Prototyping\nLab at Zurich University of Applied Sciences. Preprints and\npeer-reviewed papers analyse the tool's characteristics and compare it\nwith other FaaS runtimes. While not recommended for production use,\nthese publications may give inspiration for using Snafu in prototyping\nand piloting settings.\n\nLicence\n-------\n(\u263a) 2017, 2018 Josef Spillner \n with contributions from Tobias Brunner, Bernard Jollans and others\n(C) 2017, 2018 Z\u00fcrcher Hochschule f\u00fcr Angewandte Wissenschaften\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use any file in this repository except in compliance with\nthe License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n\n", "description_content_type": "", "docs_url": "https://pythonhosted.org/snafu/", "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/serviceprototypinglab/snafu", "keywords": "cloud faas serverless functions", "license": "Apache 2.0", "maintainer": "", "maintainer_email": "", "name": "snafu", "package_url": "https://pypi.org/project/snafu/", "platform": "", "project_url": "https://pypi.org/project/snafu/", "project_urls": { "Homepage": "https://github.com/serviceprototypinglab/snafu" }, "release_url": "https://pypi.org/project/snafu/0.0.3/", "requires_dist": [ "flask" ], "requires_python": "", "summary": "Swiss Army Knife of Serverless Computing", "version": "0.0.3" }, "last_serial": 4019607, "releases": { "0.0.0": [ { "comment_text": "", "digests": { "md5": "f5b3d5f4c220d9fc0beb9f587b1dbf18", "sha256": "2049e27c28b046067348fe69f34651a3d5bba6af262402a4ba5b60ff64608254" }, "downloads": -1, "filename": "snafu-0.0.0-py3.5.egg", "has_sig": false, "md5_digest": "f5b3d5f4c220d9fc0beb9f587b1dbf18", "packagetype": "bdist_egg", "python_version": "3.5", "requires_python": null, "size": 45837, "upload_time": "2017-04-22T12:06:38", "url": "https://files.pythonhosted.org/packages/fe/10/24675fa4703334840f93544c0cc28aafe18c966367e7ddaafdd491e7258f/snafu-0.0.0-py3.5.egg" }, { "comment_text": "", "digests": { "md5": "58330fa8fc903c8275c27a0ad2573ca6", "sha256": "495bed33e2cbb519ebeec3bbbd47ac65cb777c8bab489ddfd90c6a3216d8d475" }, "downloads": -1, "filename": "snafu-0.0.0-py3-none-any.whl", "has_sig": false, "md5_digest": "58330fa8fc903c8275c27a0ad2573ca6", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 30980, "upload_time": "2017-04-22T12:06:36", "url": "https://files.pythonhosted.org/packages/a2/01/033c231d10b3d27d2f37f4ae28fc5255b48332911550f3433453d1fd621f/snafu-0.0.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d8f67a4d036533913128be4a70794381", "sha256": "504d882ba39454110089a544657107b619cb17fcc5c446fa4f6ae719c4915860" }, "downloads": -1, "filename": "snafu-0.0.0.tar.gz", "has_sig": false, "md5_digest": "d8f67a4d036533913128be4a70794381", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21542, "upload_time": "2017-04-22T12:06:39", "url": "https://files.pythonhosted.org/packages/17/79/60a2ad34a1a3e71abcdb0cdd11865c2dc5fd6ee14e8bd85830cdde2ba5b6/snafu-0.0.0.tar.gz" } ], "0.0.0.post1": [ { "comment_text": "", "digests": { "md5": "8a8a8a5dfcf9b655992ef648bf96cb2d", "sha256": "7ae4b3039b3654d1ff00bea5c33c39986bcc3494178dd50fc51d1aaf56f2f77b" }, "downloads": -1, "filename": "snafu-0.0.0.post1-py3-none-any.whl", "has_sig": false, "md5_digest": "8a8a8a5dfcf9b655992ef648bf96cb2d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 31417, "upload_time": "2017-04-22T12:30:48", "url": "https://files.pythonhosted.org/packages/ff/1e/6600ff6aa1d779076bdd6c600785c3b8605270575b6ef790e17f0af38c5f/snafu-0.0.0.post1-py3-none-any.whl" } ], "0.0.0.post2": [ { "comment_text": "", "digests": { "md5": "7e342b47ecfa421bd59d319779a6632d", "sha256": "02eb3d7884bcc1d2d76a1db61731c0a926d6951ea820ad604467678b8f89b036" }, "downloads": -1, "filename": "snafu-0.0.0.post2-py3.5.egg", "has_sig": false, "md5_digest": "7e342b47ecfa421bd59d319779a6632d", "packagetype": "bdist_egg", "python_version": "3.5", "requires_python": null, "size": 45861, "upload_time": "2017-04-22T12:31:39", "url": "https://files.pythonhosted.org/packages/31/2b/71377ccab6bd6b655f1f722fd3f9b01c46d533f79cfa334d86d6c1f4e93f/snafu-0.0.0.post2-py3.5.egg" }, { "comment_text": "", "digests": { "md5": "ee9ff64970eb911acec46b4e9851a524", "sha256": "e9da7648337915baa45a394ad84c104100fa6fd7f95e904bfddf36c43cc206e1" }, "downloads": -1, "filename": "snafu-0.0.0.post2-py3-none-any.whl", "has_sig": false, "md5_digest": "ee9ff64970eb911acec46b4e9851a524", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 31416, "upload_time": "2017-04-22T12:31:38", "url": "https://files.pythonhosted.org/packages/51/05/80ececf8b11abe46b153b6a8b7b0774762e6d94ca21d6877925b0c363523/snafu-0.0.0.post2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e486aaeade5b5ed4f0f0303b6b2623f1", "sha256": "824d9747b671edb8093ad656c92a42dd3671f0ff202eca977a0bdc789ebe0a13" }, "downloads": -1, "filename": "snafu-0.0.0.post2.tar.gz", "has_sig": false, "md5_digest": "e486aaeade5b5ed4f0f0303b6b2623f1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21621, "upload_time": "2017-04-22T12:31:41", "url": "https://files.pythonhosted.org/packages/28/2a/dc751473135d94e67702e1762db95ef001a9987b2b4ed73e5565ea1a5ce0/snafu-0.0.0.post2.tar.gz" } ], "0.0.0.post3": [ { "comment_text": "", "digests": { "md5": "9daa2ec87d68563d96d38e7804b215d4", "sha256": "ffb52bd2c1b129dd3deaaf8c932d84b1211bf266c309bbfd9c3e9989f5a34aaf" }, "downloads": -1, "filename": "snafu-0.0.0.post3-py3.5.egg", "has_sig": false, "md5_digest": "9daa2ec87d68563d96d38e7804b215d4", "packagetype": "bdist_egg", "python_version": "3.5", "requires_python": null, "size": 33869, "upload_time": "2017-04-27T06:02:10", "url": "https://files.pythonhosted.org/packages/ea/7d/7842d43866276a609e0f6574e87c7ee650f1f5bc7ad778888458dd36ca21/snafu-0.0.0.post3-py3.5.egg" }, { "comment_text": "", "digests": { "md5": "b5acd7de6f8ee767ba1d6b749111d0cf", "sha256": "7cfa4b72411691be319f99241340d937d8587a5ee2b15fb3b87c00e084d30686" }, "downloads": -1, "filename": "snafu-0.0.0.post3-py3-none-any.whl", "has_sig": false, "md5_digest": "b5acd7de6f8ee767ba1d6b749111d0cf", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 15692, "upload_time": "2017-04-27T06:02:08", "url": "https://files.pythonhosted.org/packages/33/37/03a23176462a9127bddc8771103a408e55777da52a6aa35a4505c77f2723/snafu-0.0.0.post3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0f529a12d58cfefd7536efb8709e4b87", "sha256": "6c331d71c3d0aecf2208d121af3b2af09a77bd38144408cbec8258cc49f1ab49" }, "downloads": -1, "filename": "snafu-0.0.0.post3.tar.gz", "has_sig": false, "md5_digest": "0f529a12d58cfefd7536efb8709e4b87", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26265, "upload_time": "2017-04-27T06:02:12", "url": "https://files.pythonhosted.org/packages/f1/86/a28f2996a573dc737105706bdb2941e0baf27c034baa2f94ae0401ba20ed/snafu-0.0.0.post3.tar.gz" } ], "0.0.0.post4": [ { "comment_text": "", "digests": { "md5": "9e71ed111227fa0a0f75e88080e9f09f", "sha256": "3e42fdd317b5e736d752dda49d205cb5af90ae416b6dc0529ebc965ebef736f7" }, "downloads": -1, "filename": "snafu-0.0.0.post4-py3.5.egg", "has_sig": false, "md5_digest": "9e71ed111227fa0a0f75e88080e9f09f", "packagetype": "bdist_egg", "python_version": "3.5", "requires_python": null, "size": 33737, "upload_time": "2017-04-27T06:17:39", "url": "https://files.pythonhosted.org/packages/39/5d/6aca5a56e3390841af7a9dba8632733e4e4d77ae75e6f315aa8e65ed02d1/snafu-0.0.0.post4-py3.5.egg" }, { "comment_text": "", "digests": { "md5": "8c0d4c489350ed667be6046f06e8590b", "sha256": "481427fac3d133f91db241b046e33485d414458e642ad5937d46aa8649595933" }, "downloads": -1, "filename": "snafu-0.0.0.post4-py3-none-any.whl", "has_sig": false, "md5_digest": "8c0d4c489350ed667be6046f06e8590b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 15705, "upload_time": "2017-04-27T06:17:37", "url": "https://files.pythonhosted.org/packages/fa/42/6cad7d0debc336dfc0dabfb60844639ef5dc282e2fd94a7e9e260d6fd32a/snafu-0.0.0.post4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c43462e7286200875f17a3bb9d2e297f", "sha256": "60488ea72aecfa341293ae1cb876eafe33405f12a637c50ec4970d5dcaa922a8" }, "downloads": -1, "filename": "snafu-0.0.0.post4.tar.gz", "has_sig": false, "md5_digest": "c43462e7286200875f17a3bb9d2e297f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14888, "upload_time": "2017-04-27T06:17:42", "url": "https://files.pythonhosted.org/packages/90/f0/63d915b5039bcec02b82fe70be643ed7ebbe1fef47ca003e5900db601cad/snafu-0.0.0.post4.tar.gz" } ], "0.0.0.post5": [ { "comment_text": "", "digests": { "md5": "6d3b494f81442939502755ab9e148248", "sha256": "7cd0703d33b16ae42fa1641dfb7ea2d91eea8e44288ead310b4df40548ea4807" }, "downloads": -1, "filename": "snafu-0.0.0.post5-py3.5.egg", "has_sig": false, "md5_digest": "6d3b494f81442939502755ab9e148248", "packagetype": "bdist_egg", "python_version": "3.5", "requires_python": null, "size": 67790, "upload_time": "2017-04-27T06:24:25", "url": "https://files.pythonhosted.org/packages/a2/80/fb0e0bdd80b5e754e940d08be93352299fb6dfb04ebf8c1302d907ffc72f/snafu-0.0.0.post5-py3.5.egg" }, { "comment_text": "", "digests": { "md5": "eee1ee8a7c216531e1393fb77392fa9b", "sha256": "52c51791acc25464e9f85280d3c11f6a48e4c50a55ac3560df0516edf60ce1a7" }, "downloads": -1, "filename": "snafu-0.0.0.post5-py3-none-any.whl", "has_sig": false, "md5_digest": "eee1ee8a7c216531e1393fb77392fa9b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 30136, "upload_time": "2017-04-27T06:24:22", "url": "https://files.pythonhosted.org/packages/2f/66/0357866a98ac01e7920fbb1e425cfd7322f831284d12ac8a0ff8dc5f5420/snafu-0.0.0.post5-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4a827c2716acea28fb27e5c6098af9b0", "sha256": "0232193068fc76c4d8fd2b05962f9fa9319c16cafe7b0345da5ebae4f39515b9" }, "downloads": -1, "filename": "snafu-0.0.0.post5.tar.gz", "has_sig": false, "md5_digest": "4a827c2716acea28fb27e5c6098af9b0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20964, "upload_time": "2017-04-27T06:24:27", "url": "https://files.pythonhosted.org/packages/e7/02/2b6e445a3a6300974014f226955bd9b027a7941834a0f8bd96c1e0d89eb3/snafu-0.0.0.post5.tar.gz" } ], "0.0.0.post6": [ { "comment_text": "", "digests": { "md5": "9ced579099822445d0ab3fa19dfaa098", "sha256": "a98fa98c6235859a1b8c683fa779e3cfbd7507f448dafdf3290894c4b0fa6bdc" }, "downloads": -1, "filename": "snafu-0.0.0.post6-py3.5.egg", "has_sig": false, "md5_digest": "9ced579099822445d0ab3fa19dfaa098", "packagetype": "bdist_egg", "python_version": "3.5", "requires_python": null, "size": 68461, "upload_time": "2017-04-27T10:18:07", "url": "https://files.pythonhosted.org/packages/1f/2d/a094a4f26298966eea0fcc6ad45ce3f9eaa931000e295ae29a778bd8188b/snafu-0.0.0.post6-py3.5.egg" }, { "comment_text": "", "digests": { "md5": "0def2033b4daf7f4c6f79c2063df0feb", "sha256": "f607116d14105402f4b58a22e00fce826239135b7bb3d29b9c7f59d3d3eed45e" }, "downloads": -1, "filename": "snafu-0.0.0.post6-py3-none-any.whl", "has_sig": false, "md5_digest": "0def2033b4daf7f4c6f79c2063df0feb", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 30421, "upload_time": "2017-04-27T10:18:06", "url": "https://files.pythonhosted.org/packages/4b/a9/82a7b1a93126297759b781458ac645098e505bdfe108041b0c3b571bc7e9/snafu-0.0.0.post6-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1a46202d9cea64119de3142d90b9ea7c", "sha256": "1624e6f8f71ccc26bb4ae927f6fbd01d75eeb17608606d23a2ce04f48c642a81" }, "downloads": -1, "filename": "snafu-0.0.0.post6.tar.gz", "has_sig": false, "md5_digest": "1a46202d9cea64119de3142d90b9ea7c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21095, "upload_time": "2017-04-27T10:18:09", "url": "https://files.pythonhosted.org/packages/4b/d0/01b7e761e7f0c387582685f8f274cf0e035b043e5a861af6d51e2bbe0145/snafu-0.0.0.post6.tar.gz" } ], "0.0.0.post7": [ { "comment_text": "", "digests": { "md5": "813ea250dbb016cc7c1260e67684e0e9", "sha256": "a7b5eb27c8250c9583a611dda3c7acaf8e76dc957adcd11e0b75a5a4548e977e" }, "downloads": -1, "filename": "snafu-0.0.0.post7-py3.5.egg", "has_sig": false, "md5_digest": "813ea250dbb016cc7c1260e67684e0e9", "packagetype": "bdist_egg", "python_version": "3.5", "requires_python": null, "size": 68508, "upload_time": "2017-04-27T10:32:27", "url": "https://files.pythonhosted.org/packages/fb/77/2915374714050cc2b21f1d61670deb7b125d93922c40be347a231b18c5c8/snafu-0.0.0.post7-py3.5.egg" }, { "comment_text": "", "digests": { "md5": "1590a9531a899070ab95f1b4632acac2", "sha256": "80a0e95ac618db6735f7a57ac78b176e00550fff5a86cf000d3afb1b0c8d955b" }, "downloads": -1, "filename": "snafu-0.0.0.post7-py3-none-any.whl", "has_sig": false, "md5_digest": "1590a9531a899070ab95f1b4632acac2", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 30441, "upload_time": "2017-04-27T10:32:25", "url": "https://files.pythonhosted.org/packages/2d/96/d48c2edd778d31123f50ec69066cdfc0de7893fa4d80c7ba8215f1dea641/snafu-0.0.0.post7-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "de0f0eeed3c6852568ab3fdff2f6950c", "sha256": "5c4195d1057ce9d69fca4b1a0111cb620f6051072c4603304ba02ded9a7c3f62" }, "downloads": -1, "filename": "snafu-0.0.0.post7.tar.gz", "has_sig": false, "md5_digest": "de0f0eeed3c6852568ab3fdff2f6950c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21115, "upload_time": "2017-04-27T10:32:29", "url": "https://files.pythonhosted.org/packages/3a/94/af7bbf4ccb7f8d336fff19278a09236607ffa29dd4c5845dea1ef6918a7d/snafu-0.0.0.post7.tar.gz" } ], "0.0.1": [ { "comment_text": "", "digests": { "md5": "35a6761dfb3e8473c0128117853c9ad7", "sha256": "ffd541edcc34329823c78cb94bb72a4504b33ca08082fc6f5053b34990f916d8" }, "downloads": -1, "filename": "snafu-0.0.1-py3.5.egg", "has_sig": false, "md5_digest": "35a6761dfb3e8473c0128117853c9ad7", "packagetype": "bdist_egg", "python_version": "3.5", "requires_python": null, "size": 69837, "upload_time": "2017-07-03T12:47:25", "url": "https://files.pythonhosted.org/packages/59/79/b9eac5c489246ca2a0b89fe8cfc312054c227c94e671e2dd3c18cb0294f1/snafu-0.0.1-py3.5.egg" }, { "comment_text": "", "digests": { "md5": "af2af910147543c968092f4e8c7c7a96", "sha256": "95865aafb3bcf6b5576d9c9d56a4bd1bb798ff011bc3349520c3b030b2261c84" }, "downloads": -1, "filename": "snafu-0.0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "af2af910147543c968092f4e8c7c7a96", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 30801, "upload_time": "2017-07-03T12:47:23", "url": "https://files.pythonhosted.org/packages/fd/ba/19b5ef5074961b4ed65963f46bb2e15478fb39410a2bae02af767ba82e56/snafu-0.0.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "825f3ed3c8b0b3385404626eac49a8e4", "sha256": "6e92eb7eca004f9e8995cc954b79a7fcda3f0086206b0ab65a28842269019d6b" }, "downloads": -1, "filename": "snafu-0.0.1.tar.gz", "has_sig": false, "md5_digest": "825f3ed3c8b0b3385404626eac49a8e4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21300, "upload_time": "2017-07-03T12:47:28", "url": "https://files.pythonhosted.org/packages/27/47/7c65a9b92eef5f75e08cdb5c751bc2b5ff2fd541e982c0610845da7e5dc5/snafu-0.0.1.tar.gz" } ], "0.0.2": [ { "comment_text": "", "digests": { "md5": "894191c4ec52c30a6a72e4a4b1fb70d2", "sha256": "683e854231ad46a115e44758117356ba4910f277c84a11636186c1fd50b4757c" }, "downloads": -1, "filename": "snafu-0.0.2-py3.5.egg", "has_sig": false, "md5_digest": "894191c4ec52c30a6a72e4a4b1fb70d2", "packagetype": "bdist_egg", "python_version": "3.5", "requires_python": null, "size": 83522, "upload_time": "2018-07-01T06:34:54", "url": "https://files.pythonhosted.org/packages/e5/8a/216af802315aa854d54c0bd25c395ce2a2304e9aefa5ea89581db894fa6c/snafu-0.0.2-py3.5.egg" }, { "comment_text": "", "digests": { "md5": "cd3672da96a7311f81e4703bb4557d46", "sha256": "8646984a3a6bbadd2871227838a3c4df18cf5005b0a6d03f20ead6f8409bd79d" }, "downloads": -1, "filename": "snafu-0.0.2-py3-none-any.whl", "has_sig": false, "md5_digest": "cd3672da96a7311f81e4703bb4557d46", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 36528, "upload_time": "2018-07-01T06:34:52", "url": "https://files.pythonhosted.org/packages/fe/2c/3b3ed71baad4b157a65abcbe61d17b834c6b08cc974efe00b9368645d5dd/snafu-0.0.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "df0b8bc1c7c29706fd141b073faa2e6a", "sha256": "c4db3b696be3b34c3326a0c1a983ca28b88c72f0b84d32f6091f3b87a789804a" }, "downloads": -1, "filename": "snafu-0.0.2.tar.gz", "has_sig": false, "md5_digest": "df0b8bc1c7c29706fd141b073faa2e6a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 25511, "upload_time": "2018-07-01T06:34:56", "url": "https://files.pythonhosted.org/packages/ac/44/c359721c1fd57348f999d3b5e15472ca606c10a7ff1d8650a5f2e7d84fda/snafu-0.0.2.tar.gz" } ], "0.0.3": [ { "comment_text": "", "digests": { "md5": "4076412e7dfcda16fdcb64fda5425bd3", "sha256": "6c35eefbe57a22ee37ce6ab1a4276c71c8da52232662d2c1f7ea70543c373d32" }, "downloads": -1, "filename": "snafu-0.0.3-py3.5.egg", "has_sig": false, "md5_digest": "4076412e7dfcda16fdcb64fda5425bd3", "packagetype": "bdist_egg", "python_version": "3.5", "requires_python": null, "size": 86790, "upload_time": "2018-07-01T06:42:02", "url": "https://files.pythonhosted.org/packages/f1/4a/198462abfdbbc637fb43daf98fdfad561892d94f42143c08e395a2e02947/snafu-0.0.3-py3.5.egg" }, { "comment_text": "", "digests": { "md5": "a2445d8daf7e98258eccf8e93dafcc53", "sha256": "7c38185357ec5ed15b21c893afa748dbe18c47e939ce7cff8f6a8c31983416e4" }, "downloads": -1, "filename": "snafu-0.0.3-py3-none-any.whl", "has_sig": false, "md5_digest": "a2445d8daf7e98258eccf8e93dafcc53", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 42917, "upload_time": "2018-07-01T06:42:00", "url": "https://files.pythonhosted.org/packages/a7/88/b22ff610d736677b985ea8e128fbf8c3a41ce5b85000b61ba1257dc2e2b2/snafu-0.0.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5d7421f10085bcc4a647af316b8febad", "sha256": "c244e4583c60768492b166d8e729942bb93608f9ff8740f8a3fb40e0ce5d0e53" }, "downloads": -1, "filename": "snafu-0.0.3.tar.gz", "has_sig": false, "md5_digest": "5d7421f10085bcc4a647af316b8febad", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 29457, "upload_time": "2018-07-01T06:42:03", "url": "https://files.pythonhosted.org/packages/87/f2/2359265d9229b20b64b65ffd3604461dc0d1d3e29a3d914a1f7675024ea4/snafu-0.0.3.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "4076412e7dfcda16fdcb64fda5425bd3", "sha256": "6c35eefbe57a22ee37ce6ab1a4276c71c8da52232662d2c1f7ea70543c373d32" }, "downloads": -1, "filename": "snafu-0.0.3-py3.5.egg", "has_sig": false, "md5_digest": "4076412e7dfcda16fdcb64fda5425bd3", "packagetype": "bdist_egg", "python_version": "3.5", "requires_python": null, "size": 86790, "upload_time": "2018-07-01T06:42:02", "url": "https://files.pythonhosted.org/packages/f1/4a/198462abfdbbc637fb43daf98fdfad561892d94f42143c08e395a2e02947/snafu-0.0.3-py3.5.egg" }, { "comment_text": "", "digests": { "md5": "a2445d8daf7e98258eccf8e93dafcc53", "sha256": "7c38185357ec5ed15b21c893afa748dbe18c47e939ce7cff8f6a8c31983416e4" }, "downloads": -1, "filename": "snafu-0.0.3-py3-none-any.whl", "has_sig": false, "md5_digest": "a2445d8daf7e98258eccf8e93dafcc53", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 42917, "upload_time": "2018-07-01T06:42:00", "url": "https://files.pythonhosted.org/packages/a7/88/b22ff610d736677b985ea8e128fbf8c3a41ce5b85000b61ba1257dc2e2b2/snafu-0.0.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5d7421f10085bcc4a647af316b8febad", "sha256": "c244e4583c60768492b166d8e729942bb93608f9ff8740f8a3fb40e0ce5d0e53" }, "downloads": -1, "filename": "snafu-0.0.3.tar.gz", "has_sig": false, "md5_digest": "5d7421f10085bcc4a647af316b8febad", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 29457, "upload_time": "2018-07-01T06:42:03", "url": "https://files.pythonhosted.org/packages/87/f2/2359265d9229b20b64b65ffd3604461dc0d1d3e29a3d914a1f7675024ea4/snafu-0.0.3.tar.gz" } ] }