{ "info": { "author": "Daniel Rodriguez", "author_email": "", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Intended Audience :: Science/Research", "License :: Other/Proprietary License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Topic :: Scientific/Engineering" ], "description": "

\n \n

\n\n

\n \n \n \n \n \n \n \n \n \n \n \n \n

\n\n# S3Contents - Jupyter Notebooks in S3\n\nA transparent, drop-in replacement for Jupyter standard filesystem-backed storage system.\nWith this implementation of a\n[Jupyter Contents Manager](https://jupyter-server.readthedocs.io/en/latest/developers/contents.html)\nyou can save all your notebooks, files and directory structure directly to a\nS3/GCS bucket on AWS/GCP or a self hosted S3 API compatible like [MinIO](http://minio.io).\n\n## Installation\n\n```shell\npip install s3contents\n```\n\nInstall with GCS dependencies:\n\n```shell\npip install s3contents[gcs]\n```\n\n## s3contents vs X\n\nWhile there are some implementations of an S3 Jupyter Content Manager such as\n[s3nb](https://github.com/monetate/s3nb) or [s3drive](https://github.com/stitchfix/s3drive)\ns3contents is the only one tested against new versions of Jupyter.\nIt also supports more authentication methods and Google Cloud Storage.\n\nThis aims to be a fully tested implementation and it's based on [PGContents](https://github.com/quantopian/pgcontents).\n\n## Configuration\n\nCreate a `jupyter_notebook_config.py` file in one of the\n[Jupyter config directories](https://jupyter.readthedocs.io/en/latest/use/jupyter-directories.html#id1)\nfor example: `~/.jupyter/jupyter_notebook_config.py`.\n\n**Jupyter Notebook Classic**: If you plan to use the Classic Jupyter Notebook\ninterface you need to change `ServerApp` to `NotebookApp` for all the examples on this page.\n\n## AWS S3\n\n```python\nfrom s3contents import S3ContentsManager\n\nc = get_config()\n\n# Tell Jupyter to use S3ContentsManager\nc.ServerApp.contents_manager_class = S3ContentsManager\nc.S3ContentsManager.bucket = \"\"\n\n# Fix JupyterLab dialog issues\nc.ServerApp.root_dir = \"\"\n```\n\n### Authentication\n\nAdditionally you can configure multiple authentication methods:\n\nAccess and secret keys:\n\n```python\nc.S3ContentsManager.access_key_id = \"\"\nc.S3ContentsManager.secret_access_key = \"\"\n```\n\nSession token:\n\n```python\nc.S3ContentsManager.session_token = \"\"\n```\n\n### AWS EC2 role auth setup\n\nIt also possible to use IAM Role-based access to the S3 bucket from an Amazon EC2 instance or AWS resource.\n\nTo do that just leave any authentication options (`access_key_id`, `secret_access_key`) to their default of `None`\nand ensure that the EC2 instance has an IAM role which provides sufficient permissions (read and write) for the bucket.\n\n### Optional settings\n\n```python\n# A prefix in the S3 buckets to use as the root of the Jupyter file system\nc.S3ContentsManager.prefix = \"this/is/a/prefix/on/the/s3/bucket\"\n\n# Server-Side Encryption\nc.S3ContentsManager.sse = \"AES256\"\n\n# Authentication signature version\nc.S3ContentsManager.signature_version = \"s3v4\"\n\n# See AWS key refresh\nc.S3ContentsManager.init_s3_hook = init_function\n```\n\n### AWS key refresh\n\nThe optional `init_s3_hook` configuration can be used to enable AWS key rotation (described [here](https://dev.to/li_chastina/auto-refresh-aws-tokens-using-iam-role-and-boto3-2cjf) and [here](https://www.owenrumney.co.uk/2019/01/15/implementing-refreshingawscredentials-python/)) as follows:\n\n```python\nimport boto3\nimport botocore\nfrom botocore.credentials import RefreshableCredentials\nfrom botocore.session import get_session\nfrom configparser import ConfigParser\n\nfrom s3contents import S3ContentsManager\n\ndef refresh_external_credentials():\n config = ConfigParser()\n config.read('/home/jovyan/.aws/credentials')\n return {\n \"access_key\": config['default']['aws_access_key_id'],\n \"secret_key\": config['default']['aws_secret_access_key'],\n \"token\": config['default']['aws_session_token'],\n \"expiry_time\": config['default']['aws_expiration']\n }\n\nsession_credentials = RefreshableCredentials.create_from_metadata(\n metadata = refresh_external_credentials(),\n refresh_using = refresh_external_credentials,\n method = 'custom-refreshing-key-file-reader'\n)\n\ndef make_key_refresh_boto3(this_s3contents_instance):\n refresh_session = get_session() # from botocore.session\n refresh_session._credentials = session_credentials\n my_s3_session = boto3.Session(botocore_session=refresh_session)\n this_s3contents_instance.boto3_session = my_s3_session\n\n# Tell Jupyter to use S3ContentsManager\nc.ServerApp.contents_manager_class = S3ContentsManager\n\nc.S3ContentsManager.init_s3_hook = make_key_refresh_boto3\n```\n\n### MinIO playground example\n\nYou can test this using the [`play.minio.io:9000`](https://play.minio.io:9000) playground:\n\nJust be sure to create the bucket first.\n\n```python\nfrom s3contents import S3ContentsManager\n\nc = get_config()\n\n# Tell Jupyter to use S3ContentsManager\nc.ServerApp.contents_manager_class = S3ContentsManager\nc.S3ContentsManager.access_key_id = \"Q3AM3UQ867SPQQA43P2F\"\nc.S3ContentsManager.secret_access_key = \"zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG\"\nc.S3ContentsManager.endpoint_url = \"https://play.minio.io:9000\"\nc.S3ContentsManager.bucket = \"s3contents-demo\"\nc.S3ContentsManager.prefix = \"notebooks/test\"\n```\n\n## Access local files\n\nTo access local file as well as remote files in S3 you can use [hybridcontents](https://github.com/viaduct-ai/hybridcontents).\n\nInstall it:\n\n```shell\npip install hybridcontents\n```\n\nUse a configuration similar to this:\n\n```python\nfrom s3contents import S3ContentsManager\nfrom hybridcontents import HybridContentsManager\nfrom notebook.services.contents.largefilemanager import LargeFileManager\n\nc = get_config()\n\nc.ServerApp.contents_manager_class = HybridContentsManager\n\nc.HybridContentsManager.manager_classes = {\n # Associate the root directory with an S3ContentsManager.\n # This manager will receive all requests that don\"t fall under any of the\n # other managers.\n \"\": S3ContentsManager,\n # Associate /local_directory with a LargeFileManager.\n \"local_directory\": LargeFileManager,\n}\n\nc.HybridContentsManager.manager_kwargs = {\n # Args for root S3ContentsManager.\n \"\": {\n \"access_key_id\": \"\",\n \"secret_access_key\": \"\",\n \"bucket\": \"\",\n },\n # Args for the LargeFileManager mapped to /local_directory\n \"local_directory\": {\n \"root_dir\": \"/Users/danielfrg/Downloads\",\n },\n}\n```\n\n## GCP - Google Cloud Storage\n\nInstall the extra dependencies with:\n\n```shell\npip install s3contents[gcs]\n```\n\n```python\nfrom s3contents.gcs import GCSContentsManager\n\nc = get_config(\n\nc.ServerApp.contents_manager_class = GCSContentsManager\nc.GCSContentsManager.project = \"\"\nc.GCSContentsManager.token = \"~/.config/gcloud/application_default_credentials.json\"\nc.GCSContentsManager.bucket = \"\"\n```\n\nNote that the file `~/.config/gcloud/application_default_credentials.json` assumes\na POSIX system when you did `gcloud init`.\n\n## Other configuration\n\n### File Save Hooks\n\nIf you want to use pre/post file save hooks here are some examples.\n\nA `pre_save_hook` is written in the exact same way as normal, operating on the\nfile in local storage before committing it to the object store.\n\n```python\ndef scrub_output_pre_save(model, **kwargs):\n \"\"\"\n Scrub output before saving notebooks\n \"\"\"\n\n # only run on notebooks\n if model[\"type\"] != \"notebook\":\n return\n\n # only run on nbformat v4\n if model[\"content\"][\"nbformat\"] != 4:\n return\n\n for cell in model[\"content\"][\"cells\"]:\n if cell[\"cell_type\"] != \"code\":\n continue\n cell[\"outputs\"] = []\n cell[\"execution_count\"] = None\n\nc.S3ContentsManager.pre_save_hook = scrub_output_pre_save\n```\n\nA `post_save_hook` instead operates on the file in object storage,\nbecause of this it is useful to use the file methods on the `contents_manager`\nfor data manipulation.\nIn addition, one must use the following function signature (unique to `s3contents`):\n\n```python\ndef make_html_post_save(model, s3_path, contents_manager, **kwargs):\n \"\"\"\n Convert notebooks to HTML after saving via nbconvert\n \"\"\"\n from nbconvert import HTMLExporter\n\n if model[\"type\"] != \"notebook\":\n return\n\n content, _format = contents_manager.fs.read(s3_path, format=\"text\")\n my_notebook = nbformat.reads(content, as_version=4)\n\n html_exporter = HTMLExporter()\n html_exporter.template_name = \"classic\"\n\n (body, resources) = html_exporter.from_notebook_node(my_notebook)\n\n base, ext = os.path.splitext(s3_path)\n contents_manager.fs.write(path=(base + \".html\"), content=body, format=_format)\n\nc.S3ContentsManager.post_save_hook = make_html_post_save\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/danielfrg/s3contents", "keywords": "", "license": "Apache License, Version 2.0", "maintainer": "Daniel Rodriguez", "maintainer_email": "", "name": "s3contents", "package_url": "https://pypi.org/project/s3contents/", "platform": "", "project_url": "https://pypi.org/project/s3contents/", "project_urls": { "Documentation": "https://github.com/danielfrg/s3contents", "Homepage": "https://github.com/danielfrg/s3contents", "Repository": "https://github.com/danielfrg/s3contents" }, "release_url": "https://pypi.org/project/s3contents/0.9.0/", "requires_dist": [ "aiobotocore[boto3] (>=1.4.0,<2.0.0)", "gcsfs (>=2021.11.0,<2022.0.0); extra == \"gcs\"", "notebook (>=5.6,<7.0)", "s3fs (>=2021.11.0)" ], "requires_python": ">=3.7.1,<4", "summary": "S3 Contents Manager for Jupyter", "version": "0.9.0", "yanked": false, "yanked_reason": null }, "last_serial": 12167772, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "600364b880ff06a12c32e84ef149a0b2", "sha256": "d87434c43c1d9af9d2ffd9c4922bd0136a1254577815fdf4899e9bc0a46f98e2" }, "downloads": -1, "filename": "s3contents-0.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "600364b880ff06a12c32e84ef149a0b2", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 8838, "upload_time": "2016-10-22T18:38:06", "upload_time_iso_8601": "2016-10-22T18:38:06.457383Z", "url": "https://files.pythonhosted.org/packages/35/7a/7d5c2bee65180f928cdeaa9080c7507d8aaf1099abcc1df2f898784ad416/s3contents-0.1.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "3288879eef149add08bddc6a5dca2747", "sha256": "1e5769a6de39176a88ee68b025f1127a27768cd16d5e9be6b088882d53d57f0f" }, "downloads": -1, "filename": "s3contents-0.1.0.tar.gz", "has_sig": false, "md5_digest": "3288879eef149add08bddc6a5dca2747", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 25549, "upload_time": "2016-10-22T18:38:09", "upload_time_iso_8601": "2016-10-22T18:38:09.019301Z", "url": "https://files.pythonhosted.org/packages/b4/70/3099f9e665ac1513e660fc2d61b564779e7d037ca53c45cdeaf2178a2914/s3contents-0.1.0.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "8f32714186ee18a42b7307aeb5b8b958", "sha256": "8456b0d4046590cab2e12f47727446c1e5481c9e2e43ee26a85bd55d6d2101c3" }, "downloads": -1, "filename": "s3contents-0.1.1.tar.gz", "has_sig": false, "md5_digest": "8f32714186ee18a42b7307aeb5b8b958", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 25482, "upload_time": "2017-02-24T20:47:57", "upload_time_iso_8601": "2017-02-24T20:47:57.380739Z", "url": "https://files.pythonhosted.org/packages/5a/39/acd6e12e12d7306695a06a864950a70adca9c0eeff152b97099a2f57d4c6/s3contents-0.1.1.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1.10": [ { "comment_text": "", "digests": { "md5": "aa3c0c1c60ac8d3d2ebf93b375260e3f", "sha256": "36f9a1e9418497e0f877919f0f2d9ac5dc445c835ac612e80c1f8bd1174b07ee" }, "downloads": -1, "filename": "s3contents-0.1.10.tar.gz", "has_sig": false, "md5_digest": "aa3c0c1c60ac8d3d2ebf93b375260e3f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 30936, "upload_time": "2018-06-29T21:50:10", "upload_time_iso_8601": "2018-06-29T21:50:10.777055Z", "url": "https://files.pythonhosted.org/packages/64/03/5e65790a99d9e0c4b7b76948b6db9aee75e5cfdd1d124752c228714b86c5/s3contents-0.1.10.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1.11": [ { "comment_text": "", "digests": { "md5": "ac0af0789931248ab4f2f8ab2fcc45f7", "sha256": "846df246adb6c6abbed712b5be1ddd2c62fd06175f8e916c3813515c2877c6d4" }, "downloads": -1, "filename": "s3contents-0.1.11.tar.gz", "has_sig": false, "md5_digest": "ac0af0789931248ab4f2f8ab2fcc45f7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 31570, "upload_time": "2018-10-07T23:45:12", "upload_time_iso_8601": "2018-10-07T23:45:12.924416Z", "url": "https://files.pythonhosted.org/packages/3a/cc/62e96c1ec6a295a848eff810120a2ea564a045b25c3ffd29c6d02b9cc705/s3contents-0.1.11.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1.12": [ { "comment_text": "", "digests": { "md5": "83b805cade2b4f3543de1ee9bfe48ed8", "sha256": "d4512c31067befef6ac59a54c84aa7bbac8e6e8c646f31f5929e1f3de22218fc" }, "downloads": -1, "filename": "s3contents-0.1.12.tar.gz", "has_sig": false, "md5_digest": "83b805cade2b4f3543de1ee9bfe48ed8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 31678, "upload_time": "2018-11-14T16:56:45", "upload_time_iso_8601": "2018-11-14T16:56:45.217219Z", "url": "https://files.pythonhosted.org/packages/78/12/325b3d47eef8ad52d2ece4bb2682428eb7cde54f7aa5ce4873c8d8e3ef40/s3contents-0.1.12.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1.13": [ { "comment_text": "", "digests": { "md5": "9fd04f66b5a7698c05b6afe97717993f", "sha256": "0a7abcdaeed51100bdc6dc090141ff8a9061d01a60210443183c1fe9df0612d6" }, "downloads": -1, "filename": "s3contents-0.1.13.tar.gz", "has_sig": false, "md5_digest": "9fd04f66b5a7698c05b6afe97717993f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 31906, "upload_time": "2019-05-06T21:47:26", "upload_time_iso_8601": "2019-05-06T21:47:26.188125Z", "url": "https://files.pythonhosted.org/packages/99/c2/b683a92228066011a6665770664b10b5ce45be924d1922125c63a53f608b/s3contents-0.1.13.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "0bc97db5a3e76a3127e55adb5fef5472", "sha256": "fa787d59163ae65d783147ff1dc5f9608ad8aadec812d4b1a6cf2c982fe0e4cd" }, "downloads": -1, "filename": "s3contents-0.1.2.tar.gz", "has_sig": false, "md5_digest": "0bc97db5a3e76a3127e55adb5fef5472", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 25511, "upload_time": "2017-03-04T00:18:38", "upload_time_iso_8601": "2017-03-04T00:18:38.239181Z", "url": "https://files.pythonhosted.org/packages/43/8f/2eee23deab192ccd59f9d3cb897c75ab434bbdfb0662f7d3e14ac1a77d3d/s3contents-0.1.2.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "d90463fabe52dd927fb7939d19d60ff8", "sha256": "deae6f27bd53d2e9f91bf593b5280e4366decd33b23a2baf658d8875ab1f9860" }, "downloads": -1, "filename": "s3contents-0.1.3.tar.gz", "has_sig": false, "md5_digest": "d90463fabe52dd927fb7939d19d60ff8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26552, "upload_time": "2017-04-12T19:55:12", "upload_time_iso_8601": "2017-04-12T19:55:12.256660Z", "url": "https://files.pythonhosted.org/packages/7b/d8/0625ecb094034976d7543cd06525c4033be2226b8234b1b022022d4821c1/s3contents-0.1.3.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1.4": [ { "comment_text": "", "digests": { "md5": "476fd942b7864a221fde92daf9e59d07", "sha256": "0a405bcfee6c97f3ff4b87031edafc3c6fc0da2ae57e0548a461584f5d54e9df" }, "downloads": -1, "filename": "s3contents-0.1.4.tar.gz", "has_sig": false, "md5_digest": "476fd942b7864a221fde92daf9e59d07", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26538, "upload_time": "2017-07-28T16:31:28", "upload_time_iso_8601": "2017-07-28T16:31:28.109036Z", "url": "https://files.pythonhosted.org/packages/e1/eb/0ebaaeb12eab9e5ee71c4ed05d3c47083129436260ee06027764397e4c6d/s3contents-0.1.4.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1.5": [ { "comment_text": "", "digests": { "md5": "b5644d2b9bbfb6f314743a77b793c52c", "sha256": "40ddd975ed8b0ea6f125c4eff641fc0bc96a97e6561bd0f61e3d387f49b26d7c" }, "downloads": -1, "filename": "s3contents-0.1.5.tar.gz", "has_sig": false, "md5_digest": "b5644d2b9bbfb6f314743a77b793c52c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 29326, "upload_time": "2018-06-05T19:19:36", "upload_time_iso_8601": "2018-06-05T19:19:36.074790Z", "url": "https://files.pythonhosted.org/packages/90/cf/1c9e18e3ef3cdc1f1d6bd092a258817a692c62aa0aec6e492052350350fb/s3contents-0.1.5.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1.7": [ { "comment_text": "", "digests": { "md5": "92ce6562b52bf21b2b711bb763e00bc3", "sha256": "cf0a7a515c0896538a0f808d41783399865a8fe070d5d93f3b4659d412b30c0a" }, "downloads": -1, "filename": "s3contents-0.1.7.tar.gz", "has_sig": false, "md5_digest": "92ce6562b52bf21b2b711bb763e00bc3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 30845, "upload_time": "2018-06-06T17:09:23", "upload_time_iso_8601": "2018-06-06T17:09:23.564819Z", "url": "https://files.pythonhosted.org/packages/2d/53/2e474bff821efd11262f0427d54fd049f86941da66cbb05586fcc56b9495/s3contents-0.1.7.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1.8": [ { "comment_text": "", "digests": { "md5": "8ab9eb12ee5ab6a15c79fb83166dbcaa", "sha256": "cc6ea102d66b3bba2ff193ce4cd330bfe73b258439e5a2c6928b4dd6feb6e528" }, "downloads": -1, "filename": "s3contents-0.1.8.tar.gz", "has_sig": false, "md5_digest": "8ab9eb12ee5ab6a15c79fb83166dbcaa", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 30846, "upload_time": "2018-06-08T22:21:22", "upload_time_iso_8601": "2018-06-08T22:21:22.899762Z", "url": "https://files.pythonhosted.org/packages/01/45/ab0252ebd6cade1cd154978f57814eb065233c36e7f172ab59604caf7138/s3contents-0.1.8.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1.9": [ { "comment_text": "", "digests": { "md5": "a34438a17e6a5eb1a6eea66dc139665d", "sha256": "063d369bc1ec1e70067d61378a90441134d2a11f5279f8fbc7a2123510c6fc74" }, "downloads": -1, "filename": "s3contents-0.1.9.tar.gz", "has_sig": false, "md5_digest": "a34438a17e6a5eb1a6eea66dc139665d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 30932, "upload_time": "2018-06-29T21:23:12", "upload_time_iso_8601": "2018-06-29T21:23:12.024220Z", "url": "https://files.pythonhosted.org/packages/c7/4c/3593d5e18ba5459323e860b3eae26f09d07a5e1a48a2f0c4ba96ad8e10d3/s3contents-0.1.9.tar.gz", "yanked": false, "yanked_reason": null } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "7f31c34263a2ecbc003a35ac848fb762", "sha256": "a0cdfb09207f249f55fbad571685408999226798552fef25d02b5208ab8d0069" }, "downloads": -1, "filename": "s3contents-0.3.0.tar.gz", "has_sig": false, "md5_digest": "7f31c34263a2ecbc003a35ac848fb762", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 32504, "upload_time": "2019-09-03T16:48:46", "upload_time_iso_8601": "2019-09-03T16:48:46.399007Z", "url": "https://files.pythonhosted.org/packages/bb/d8/f787a56f47403d1cdb998882d8a92ab233ba0b7ed328bbdfedd36efa4ed0/s3contents-0.3.0.tar.gz", "yanked": false, "yanked_reason": null } ], "0.3.1": [ { "comment_text": "", "digests": { "md5": "182d0e33d7dbd7a3c8df4f28b88aa0ee", "sha256": "0c85917a0d99971d4969728c86e8d8e27e68befa7fdf1dc7a8115f9cfde2b6d8" }, "downloads": -1, "filename": "s3contents-0.3.1.tar.gz", "has_sig": false, "md5_digest": "182d0e33d7dbd7a3c8df4f28b88aa0ee", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 32549, "upload_time": "2019-10-29T01:34:08", "upload_time_iso_8601": "2019-10-29T01:34:08.079077Z", "url": "https://files.pythonhosted.org/packages/bc/82/c2f6b412919777a4e9d458298c68eba6df54e49c30fb73503a26cedebdd2/s3contents-0.3.1.tar.gz", "yanked": false, "yanked_reason": null } ], "0.3.2": [ { "comment_text": "", "digests": { "md5": "62cd84b53043edeb4a635d6edf1d52cc", "sha256": "8a519259cf2f12e50ede05f5e53f516c2fb5bf5379c7ad98fa20a22eb6403861" }, "downloads": -1, "filename": "s3contents-0.3.2.tar.gz", "has_sig": false, "md5_digest": "62cd84b53043edeb4a635d6edf1d52cc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 33787, "upload_time": "2019-11-11T22:09:46", "upload_time_iso_8601": "2019-11-11T22:09:46.773054Z", "url": "https://files.pythonhosted.org/packages/3c/48/a85099da1e1f730d4e61aabe202ba4c4cf7b8991331defd9cbfea9f65000/s3contents-0.3.2.tar.gz", "yanked": false, "yanked_reason": null } ], "0.3.3": [ { "comment_text": "", "digests": { "md5": "d33752bc66ceb2eb0117ebf5585514d8", "sha256": "7d61690ce78d64c1f8941d1e8342008eb4504b90d05b971b278048b93a09b65d" }, "downloads": -1, "filename": "s3contents-0.3.3.tar.gz", "has_sig": false, "md5_digest": "d33752bc66ceb2eb0117ebf5585514d8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 33957, "upload_time": "2020-01-03T05:11:05", "upload_time_iso_8601": "2020-01-03T05:11:05.706694Z", "url": "https://files.pythonhosted.org/packages/c2/ee/20e1a7694800cf0f5a35772a3d4798182eb0de2b1f9634e658e420ef45ea/s3contents-0.3.3.tar.gz", "yanked": false, "yanked_reason": null } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "38a8476cd848ed5fda3e8f0cbee11585", "sha256": "648c956859d6d3a9a83d214b39654a490d34c8a3829d79c3ad316ef5fd8ba821" }, "downloads": -1, "filename": "s3contents-0.4.0.tar.gz", "has_sig": false, "md5_digest": "38a8476cd848ed5fda3e8f0cbee11585", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.0,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*", "size": 34207, "upload_time": "2020-01-23T16:33:50", "upload_time_iso_8601": "2020-01-23T16:33:50.392245Z", "url": "https://files.pythonhosted.org/packages/bd/85/538083921fc4160ff4ec88531f13371ff81e3de158b819dc346ef427c3a7/s3contents-0.4.0.tar.gz", "yanked": false, "yanked_reason": null } ], "0.5.0": [ { "comment_text": "", "digests": { "md5": "72e753d4279baa8d73ac02c95da86230", "sha256": "1c932d71695658d7e8e28028d36dd3df3d15cb2283d33cabac3ec2b6f3c97ace" }, "downloads": -1, "filename": "s3contents-0.5.0.tar.gz", "has_sig": false, "md5_digest": "72e753d4279baa8d73ac02c95da86230", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 22831, "upload_time": "2020-05-08T21:37:55", "upload_time_iso_8601": "2020-05-08T21:37:55.839157Z", "url": "https://files.pythonhosted.org/packages/6d/d8/bb3fa01c34acf337a6aa0a1208a93c4848bf314ad9c0926ea941ad7be032/s3contents-0.5.0.tar.gz", "yanked": false, "yanked_reason": null } ], "0.5.1": [ { "comment_text": "", "digests": { "md5": "3b2a7b73808fc894f40cdb22466728d4", "sha256": "d335d0401bb5066ea1ab57bea064f99ada4ee68da12cf0bd478f32a37c31b837" }, "downloads": -1, "filename": "s3contents-0.5.1.tar.gz", "has_sig": false, "md5_digest": "3b2a7b73808fc894f40cdb22466728d4", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 25114, "upload_time": "2020-05-22T19:22:29", "upload_time_iso_8601": "2020-05-22T19:22:29.176843Z", "url": "https://files.pythonhosted.org/packages/cc/5d/9cd0ca72bd3b8ac948e840999261d29f1ebdb1cdf355c6d861b38f804ae5/s3contents-0.5.1.tar.gz", "yanked": false, "yanked_reason": null } ], "0.6.0": [ { "comment_text": "", "digests": { "md5": "016e269156d974e69b45490c1c4a840f", "sha256": "2019a8d2b829dc999ae1a07292bc8de499db03626af750bde51cb31ae2fcd0c3" }, "downloads": -1, "filename": "s3contents-0.6.0.tar.gz", "has_sig": false, "md5_digest": "016e269156d974e69b45490c1c4a840f", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7", "size": 27679, "upload_time": "2020-09-16T14:24:17", "upload_time_iso_8601": "2020-09-16T14:24:17.073091Z", "url": "https://files.pythonhosted.org/packages/8d/52/c174d5d91bf606b516e46c15e889700762936f2883dd816a350efc65ad5d/s3contents-0.6.0.tar.gz", "yanked": false, "yanked_reason": null } ], "0.6.1": [ { "comment_text": "", "digests": { "md5": "93d5dbb03bc1f3f33cc3f4a3069a8cb0", "sha256": "bd600e5509453c04308e19cb8ef0fc99abbc8ed6e1ca3f5f8938efb7b1ef6085" }, "downloads": -1, "filename": "s3contents-0.6.1.tar.gz", "has_sig": false, "md5_digest": "93d5dbb03bc1f3f33cc3f4a3069a8cb0", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7", "size": 29805, "upload_time": "2020-11-17T16:09:25", "upload_time_iso_8601": "2020-11-17T16:09:25.718445Z", "url": "https://files.pythonhosted.org/packages/d6/58/53a53bd7e1dd6a95f2cc291990537c7c86ce7ac359d911d433e4ab2e073d/s3contents-0.6.1.tar.gz", "yanked": false, "yanked_reason": null } ], "0.6.2": [ { "comment_text": "", "digests": { "md5": "d04a4dabcf36d7d1cdeb2abcb8fc99c6", "sha256": "f42148fabddc8fc7849ad72f6c9a391a128768079f314fa496fd3a65ec93dcef" }, "downloads": -1, "filename": "s3contents-0.6.2.tar.gz", "has_sig": false, "md5_digest": "d04a4dabcf36d7d1cdeb2abcb8fc99c6", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7", "size": 28277, "upload_time": "2021-02-03T20:06:32", "upload_time_iso_8601": "2021-02-03T20:06:32.846728Z", "url": "https://files.pythonhosted.org/packages/58/b5/0626d5da4f0f4e1ae2b9e9d7e719d1f4d19f69896609aa85a867bab10ee8/s3contents-0.6.2.tar.gz", "yanked": false, "yanked_reason": null } ], "0.6.3": [ { "comment_text": "", "digests": { "md5": "1e930e4b906dcc00b53b04e84eaf154a", "sha256": "d612f650263a676ae01dd2fa9abb4d6f6d6e84e7c83c2188dc2808d36866e3be" }, "downloads": -1, "filename": "s3contents-0.6.3.tar.gz", "has_sig": false, "md5_digest": "1e930e4b906dcc00b53b04e84eaf154a", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7", "size": 29878, "upload_time": "2021-04-16T16:28:45", "upload_time_iso_8601": "2021-04-16T16:28:45.299936Z", "url": "https://files.pythonhosted.org/packages/57/f1/8ffe1a41c07f4c8e5d39d3d4bdffb1f6d8021a373e474748188a5eadb4fd/s3contents-0.6.3.tar.gz", "yanked": false, "yanked_reason": null } ], "0.7.0": [ { "comment_text": "", "digests": { "md5": "486ce4342a11df661a2df15b55d64dcb", "sha256": "affd70964af185ceac3c36eb6d920ab23c333b85fcd6079dd4961a78ad47e6dc" }, "downloads": -1, "filename": "s3contents-0.7.0.tar.gz", "has_sig": false, "md5_digest": "486ce4342a11df661a2df15b55d64dcb", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7", "size": 30012, "upload_time": "2021-08-15T00:55:32", "upload_time_iso_8601": "2021-08-15T00:55:32.722986Z", "url": "https://files.pythonhosted.org/packages/a9/2a/336857423c275b3dc7013ee34d2cce3d64a0c241c8d7ff624bbd2e7f64fb/s3contents-0.7.0.tar.gz", "yanked": false, "yanked_reason": null } ], "0.9.0": [ { "comment_text": "", "digests": { "md5": "a6491064d28b081cc6e5557f3d09baa9", "sha256": "99078f29c286df7311d6d0e1f10a39035bb08455c5dd106cde6c3a836f2e2a77" }, "downloads": -1, "filename": "s3contents-0.9.0.tar.gz", "has_sig": false, "md5_digest": "a6491064d28b081cc6e5557f3d09baa9", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7.1,<4", "size": 26293, "upload_time": "2021-11-30T16:48:46", "upload_time_iso_8601": "2021-11-30T16:48:46.733618Z", "url": "https://files.pythonhosted.org/packages/86/12/b8f5084b91321bebcbdab4e6a27d6d4ffd066d95d58d4a4a148957d64ceb/s3contents-0.9.0.tar.gz", "yanked": false, "yanked_reason": null } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "a6491064d28b081cc6e5557f3d09baa9", "sha256": "99078f29c286df7311d6d0e1f10a39035bb08455c5dd106cde6c3a836f2e2a77" }, "downloads": -1, "filename": "s3contents-0.9.0.tar.gz", "has_sig": false, "md5_digest": "a6491064d28b081cc6e5557f3d09baa9", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7.1,<4", "size": 26293, "upload_time": "2021-11-30T16:48:46", "upload_time_iso_8601": "2021-11-30T16:48:46.733618Z", "url": "https://files.pythonhosted.org/packages/86/12/b8f5084b91321bebcbdab4e6a27d6d4ffd066d95d58d4a4a148957d64ceb/s3contents-0.9.0.tar.gz", "yanked": false, "yanked_reason": null } ], "vulnerabilities": [] }