{ "info": { "author": "Steven Pate", "author_email": "steven@laac.dev", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Environment :: Web Environment", "Framework :: AsyncIO", "Intended Audience :: Developers", "Intended Audience :: Science/Research", "License :: OSI Approved :: BSD License", "Natural Language :: English", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Topic :: Internet :: WWW/HTTP" ], "description": "# Foxcross\n[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/python/black)\n[![License](https://img.shields.io/badge/License-BSD%203--Clause-blue.svg)](https://github.com/laactech/foxcross/blob/master/LICENSE.md)\n[![Build Status](https://travis-ci.org/laactech/foxcross.svg?branch=master)](https://travis-ci.org/laactech/foxcross)\n[![Build status](https://ci.appveyor.com/api/projects/status/github/laactech/foxcross?branch=master&svg=true)](https://ci.appveyor.com/project/laactech/foxcross)\n[![PyPI](https://img.shields.io/pypi/v/foxcross.svg?color=blue)](https://pypi.org/project/foxcross/)\n[![codecov](https://codecov.io/gh/laactech/foxcross/branch/master/graph/badge.svg)](https://codecov.io/gh/laactech/foxcross)\n\nAsyncIO serving for data science models built on [Starlette](https://www.starlette.io/)\n\n**Requirements**: Python 3.6+\n\n## Quick Start\nInstallation using `pip`:\n```bash\npip install foxcross\n```\n\nCreate some test data and a simple model in the same directory to be served:\n\ndirectory structure\n```\n.\n+-- data.json\n+-- models.py\n```\ndata.json\n```json\n[1,2,3,4,5]\n```\nmodels.py\n```python\nfrom foxcross.serving import ModelServing, run_model_serving\n\nclass AddOneModel(ModelServing):\n test_data_path = \"data.json\"\n\n def predict(self, data):\n return [x + 1 for x in data]\n\nif __name__ == \"__main__\":\n run_model_serving()\n```\n\nRun the model locally\n```bash\npython models.py\n```\n\nNavigate to `localhost:8000/predict-test/` in your web browser, and you should see the\nlist incremented by 1. You can visit `localhost:8000/` to see all the available\nendpoints for your model.\n\n## Why does this package exist?\nCurrently, some of the most popular data science model building frameworks such as PyTorch\nand Scikit-Learn do not come with a built in serving library similar to TensorFlow Serving.\n\nTo fill this gap, people create Flask applications to serve their model. This can be error\nprone, and the implementation can differ between each model. Additionally, Flask is a\n[WSGI](https://en.wikipedia.org/wiki/Web_Server_Gateway_Interface)\nweb framework whereas Foxcross is built on [Starlette](https://www.starlette.io/), a\nmore performant [ASGI](https://asgi.readthedocs.io/en/latest/) web framework.\n\nFoxcross aims to be the serving library for data science models built with frameworks\nthat do not come with their own serving library. Using Foxcross enables consistent\nand testable serving of data science models.\n\n## Security\n\nIf you believe you've found a bug with security implications, please do not disclose this\nissue in a public forum.\n\nEmail us at [support@laac.dev](mailto:support@laac.dev)\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/laactech/foxcross", "keywords": "data science,machine learning,serving,python,async,dataframe,pandas,scikit-learn,pytorch,http,rest api", "license": "BSD-3-Clause", "maintainer": "Steven Pate", "maintainer_email": "steven@laac.dev", "name": "foxcross", "package_url": "https://pypi.org/project/foxcross/", "platform": "", "project_url": "https://pypi.org/project/foxcross/", "project_urls": { "Documentation": "https://www.foxcross.dev/", "Homepage": "https://github.com/laactech/foxcross", "Repository": "https://github.com/laactech/foxcross" }, "release_url": "https://pypi.org/project/foxcross/0.8.0/", "requires_dist": [ "python-slugify[unidecode] (>=3.0,<4.0)", "aiofiles (>=0.4.0,<0.5.0)", "jinja2 (>=2.10,<3.0)", "ujson (>=1.35,<2.0); extra == \"ujson\"", "modin (>=0.5.1,<0.6.0); extra == \"modin\"", "pandas (>=0.24.2,<0.25.0); extra == \"pandas\"", "uvicorn (>=0.8.3,<0.9.0)", "starlette (>=0.12.2,<0.13.0)" ], "requires_python": ">=3.6,<4.0", "summary": "AsyncIO serving for data science models", "version": "0.8.0" }, "last_serial": 5537344, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "a64bca86066d9fa62daa5bf780c4d10c", "sha256": "72ff2758e93409df7c79f659c29fa9c5b8e1f447973f47f03e526a898cc45962" }, "downloads": -1, "filename": "foxcross-0.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "a64bca86066d9fa62daa5bf780c4d10c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6,<4.0", "size": 1158, "upload_time": "2019-05-31T02:11:37", "url": "https://files.pythonhosted.org/packages/60/4e/98999670d9ef8cfc46b68cffb2807a7d9f59b24c9f280df34d429f2847eb/foxcross-0.1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "eff7692f2e87741234d11038346c0a67", "sha256": "e79d531873ca23baef1d93b49c69ebb613816b36a71db6745f127aa668c17537" }, "downloads": -1, "filename": "foxcross-0.1.0.tar.gz", "has_sig": false, "md5_digest": "eff7692f2e87741234d11038346c0a67", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6,<4.0", "size": 1341, "upload_time": "2019-05-31T02:11:39", "url": "https://files.pythonhosted.org/packages/94/dd/e8bff919bb40c0c2adf83bc2715a6b29e0d6023cbae9feeca9fcb1ec293b/foxcross-0.1.0.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "441ce0491cc427c1ad401b1f4d08b94f", "sha256": "17a3d5a4b90b1fd01028dbe6a6701eac945a93d5d781fe2a71174b25619afc86" }, "downloads": -1, "filename": "foxcross-0.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "441ce0491cc427c1ad401b1f4d08b94f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6,<4.0", "size": 8217, "upload_time": "2019-05-31T18:51:32", "url": "https://files.pythonhosted.org/packages/6d/bd/4b132beb89cdfd6c1b9fba6fa2af62eb3d311031ab1b396ea2b8aedb81c7/foxcross-0.2.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b8fb6c8073764c2501e718533641f31c", "sha256": "4863c89894a4531cf14ce4940c948aa8f9f25d6becfc5a5c4523a47ae93241c5" }, "downloads": -1, "filename": "foxcross-0.2.0.tar.gz", "has_sig": false, "md5_digest": "b8fb6c8073764c2501e718533641f31c", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6,<4.0", "size": 7197, "upload_time": "2019-05-31T18:51:33", "url": "https://files.pythonhosted.org/packages/02/1f/2a37d295f69cfb7993c4e5df81f98d136876597a5d16ba14c789f43ccfea/foxcross-0.2.0.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "c532a682250d1058a59cb91585b457b6", "sha256": "55a73ba2b2ef429ad173742b0ca2a4e702fe5e77d4c629ec9ebc249ea48e0c28" }, "downloads": -1, "filename": "foxcross-0.3.0-py3-none-any.whl", "has_sig": false, "md5_digest": "c532a682250d1058a59cb91585b457b6", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6,<4.0", "size": 8141, "upload_time": "2019-05-31T20:35:28", "url": "https://files.pythonhosted.org/packages/c4/0f/7d04202af0d1c0ae4df7f8be159664a26d27d1989efffb617c320df2e1f1/foxcross-0.3.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "490fb8fda090936e1be0d6c4cd414ead", "sha256": "add94f06586aec21db9858c8f63d91ee314873aa889ba195d4e9b8fbc036fc01" }, "downloads": -1, "filename": "foxcross-0.3.0.tar.gz", "has_sig": false, "md5_digest": "490fb8fda090936e1be0d6c4cd414ead", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6,<4.0", "size": 7195, "upload_time": "2019-05-31T20:35:29", "url": "https://files.pythonhosted.org/packages/41/6f/d03f558a85ec6d11feebcee3c8cb09182ac4b0815c963894183e19fd6494/foxcross-0.3.0.tar.gz" } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "37b842ee234e835e277561d019f24dea", "sha256": "6ebffa554059f802eef2863ae75f47931d2adb390257a08022088c47b79daf67" }, "downloads": -1, "filename": "foxcross-0.4.0-py3-none-any.whl", "has_sig": false, "md5_digest": "37b842ee234e835e277561d019f24dea", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6,<4.0", "size": 8598, "upload_time": "2019-05-31T23:11:59", "url": "https://files.pythonhosted.org/packages/c7/82/72f80226cb0c707a4e50016e5f0c51086f787da19173bc767fd58aa1f736/foxcross-0.4.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0d45f0901069f066ab1d773a3fff24a2", "sha256": "66230606ebd0a1d5ef6f889b529316123e794d9b1f6ba2765239358dff6a2c79" }, "downloads": -1, "filename": "foxcross-0.4.0.tar.gz", "has_sig": false, "md5_digest": "0d45f0901069f066ab1d773a3fff24a2", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6,<4.0", "size": 7713, "upload_time": "2019-05-31T23:12:00", "url": "https://files.pythonhosted.org/packages/8f/ec/40ec2406af00edd195e212af80edbe37cb22278baf10f74b2a009e2308a4/foxcross-0.4.0.tar.gz" } ], "0.5.0": [ { "comment_text": "", "digests": { "md5": "465028f28cfd3c0f64909bbafb87e381", "sha256": "e986d21e4de59312b8ce25b92f3b5395add723ca97e1816d1652ec88554ca180" }, "downloads": -1, "filename": "foxcross-0.5.0-py3-none-any.whl", "has_sig": false, "md5_digest": "465028f28cfd3c0f64909bbafb87e381", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6,<4.0", "size": 8556, "upload_time": "2019-06-05T19:14:56", "url": "https://files.pythonhosted.org/packages/99/b5/51c779f64bbc60be18862aa212f55d6700db8e5b327882a1494f280fa78f/foxcross-0.5.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8983a6900a6a71dcf4605a4a5ce0669f", "sha256": "2faa65dbb3162b3a33d8460fb07d52b35f4951ab518df43d676799dde0d0fb6f" }, "downloads": -1, "filename": "foxcross-0.5.0.tar.gz", "has_sig": false, "md5_digest": "8983a6900a6a71dcf4605a4a5ce0669f", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6,<4.0", "size": 7794, "upload_time": "2019-06-05T19:14:57", "url": "https://files.pythonhosted.org/packages/b5/3f/ded2486ceaa0166dcf7c05799a433304214ab449fc81fd7b1eb9fcbd667b/foxcross-0.5.0.tar.gz" } ], "0.6.0": [ { "comment_text": "", "digests": { "md5": "3c0053e259f165d7955820b7ca94a3e1", "sha256": "feb4727a1dced2606f595702ea161cd0f837e3da79da213c2081c29c1c14c9c8" }, "downloads": -1, "filename": "foxcross-0.6.0-py3-none-any.whl", "has_sig": false, "md5_digest": "3c0053e259f165d7955820b7ca94a3e1", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6,<4.0", "size": 9109, "upload_time": "2019-06-12T21:50:02", "url": "https://files.pythonhosted.org/packages/1d/60/f1844d82011659d236fbb000b16b02aa364b9b5667e66b1dd25f987a3f3a/foxcross-0.6.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "dc580bcdde5508bf0df9d4bd9b597dd8", "sha256": "c6f7ba9b6a2bf6811c53013902046adc8282365e0a8a2a3427835c1e99dfc244" }, "downloads": -1, "filename": "foxcross-0.6.0.tar.gz", "has_sig": false, "md5_digest": "dc580bcdde5508bf0df9d4bd9b597dd8", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6,<4.0", "size": 8662, "upload_time": "2019-06-12T21:50:04", "url": "https://files.pythonhosted.org/packages/07/ac/570090faa1b9740b75d09f10923f622db8ecfe970123751d88ccb6c46db9/foxcross-0.6.0.tar.gz" } ], "0.7.0": [ { "comment_text": "", "digests": { "md5": "bf87c3d097e7f62988e45af356c98f18", "sha256": "9358621caf77199f4039bf02c5cfc1bfd2e33ae6f0ee7f87cebb6af7db61ac9d" }, "downloads": -1, "filename": "foxcross-0.7.0-py3-none-any.whl", "has_sig": false, "md5_digest": "bf87c3d097e7f62988e45af356c98f18", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6,<4.0", "size": 12854, "upload_time": "2019-07-01T20:55:42", "url": "https://files.pythonhosted.org/packages/99/c5/fcd995ed43658cb67e80e3b45e3c10b74e8bfbf7c4276e93509535b5deb5/foxcross-0.7.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2d12d9b8db84993cd87eb21d7610753b", "sha256": "6814539a797b44557415b946d15920f3f3ef0af4b4b36b8c5c1cb7469b3654f5" }, "downloads": -1, "filename": "foxcross-0.7.0.tar.gz", "has_sig": false, "md5_digest": "2d12d9b8db84993cd87eb21d7610753b", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6,<4.0", "size": 10879, "upload_time": "2019-07-01T20:55:43", "url": "https://files.pythonhosted.org/packages/a0/ce/08ac8fd22067ff1453897ce86394b470b792bdae7c84b9180605632afa15/foxcross-0.7.0.tar.gz" } ], "0.7.1": [ { "comment_text": "", "digests": { "md5": "884cd9ea68abf4b9705804cc6d0a940a", "sha256": "cafdd6147b9dae1ecaf1b3076d05b7c3bd5052642a86ad24b304e5b48fb48340" }, "downloads": -1, "filename": "foxcross-0.7.1-py3-none-any.whl", "has_sig": false, "md5_digest": "884cd9ea68abf4b9705804cc6d0a940a", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6,<4.0", "size": 12866, "upload_time": "2019-07-01T21:49:01", "url": "https://files.pythonhosted.org/packages/ea/26/14eaaef5f64fe3d0c9a7d60d8ab2dae98d32cb52a285c8c71eaea2e93216/foxcross-0.7.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b177d0bd4be42cca5c845358a6d200d5", "sha256": "e8f8038bb4d2c14d39f19d8ff41aa373f4df18cdaa63f5fa1b3eeae1d7f22da6" }, "downloads": -1, "filename": "foxcross-0.7.1.tar.gz", "has_sig": false, "md5_digest": "b177d0bd4be42cca5c845358a6d200d5", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6,<4.0", "size": 10887, "upload_time": "2019-07-01T21:49:02", "url": "https://files.pythonhosted.org/packages/0e/0d/8d960696a88a004083ed09bd433f96132dc8e2723fbd4d14f319a22765aa/foxcross-0.7.1.tar.gz" } ], "0.8.0": [ { "comment_text": "", "digests": { "md5": "eaa133fd7cb5194b9b3dd64210653a7d", "sha256": "3fdb1fc36537741a9501b37906c5e5d4686bc654b277de3faa19ad4802afdd83" }, "downloads": -1, "filename": "foxcross-0.8.0-py3-none-any.whl", "has_sig": false, "md5_digest": "eaa133fd7cb5194b9b3dd64210653a7d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6,<4.0", "size": 13622, "upload_time": "2019-07-15T22:16:47", "url": "https://files.pythonhosted.org/packages/2e/57/d16fa123c86b35f129c8bd8913114d1b760df9e2204bf54cfd7690dfe081/foxcross-0.8.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7af135f2bd8dff05e31a5d8a1eae99fd", "sha256": "607c26099b7fa6e593a1452892da83b50f5d4ea58fd07b2f5bcee114ff4ce9b1" }, "downloads": -1, "filename": "foxcross-0.8.0.tar.gz", "has_sig": false, "md5_digest": "7af135f2bd8dff05e31a5d8a1eae99fd", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6,<4.0", "size": 11353, "upload_time": "2019-07-15T22:16:48", "url": "https://files.pythonhosted.org/packages/a4/69/fe7b4250afe5d5feb54fb0a238204d2446e4296699a414bd9bd003421f65/foxcross-0.8.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "eaa133fd7cb5194b9b3dd64210653a7d", "sha256": "3fdb1fc36537741a9501b37906c5e5d4686bc654b277de3faa19ad4802afdd83" }, "downloads": -1, "filename": "foxcross-0.8.0-py3-none-any.whl", "has_sig": false, "md5_digest": "eaa133fd7cb5194b9b3dd64210653a7d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6,<4.0", "size": 13622, "upload_time": "2019-07-15T22:16:47", "url": "https://files.pythonhosted.org/packages/2e/57/d16fa123c86b35f129c8bd8913114d1b760df9e2204bf54cfd7690dfe081/foxcross-0.8.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7af135f2bd8dff05e31a5d8a1eae99fd", "sha256": "607c26099b7fa6e593a1452892da83b50f5d4ea58fd07b2f5bcee114ff4ce9b1" }, "downloads": -1, "filename": "foxcross-0.8.0.tar.gz", "has_sig": false, "md5_digest": "7af135f2bd8dff05e31a5d8a1eae99fd", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6,<4.0", "size": 11353, "upload_time": "2019-07-15T22:16:48", "url": "https://files.pythonhosted.org/packages/a4/69/fe7b4250afe5d5feb54fb0a238204d2446e4296699a414bd9bd003421f65/foxcross-0.8.0.tar.gz" } ] }