{ "info": { "author": "Lars Fenneberg , Daniel Kraft ", "author_email": "lf@elemental.net, daniel.kraft@d9t.de", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Environment :: Console", "Intended Audience :: System Administrators", "License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)", "Operating System :: POSIX", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Topic :: System :: Archiving :: Backup" ], "description": ".. image:: https://img.shields.io/travis/elemental-lf/benji/master.svg?style=plastic&label=Travis%20CI\n :target: https://travis-ci.org/elemental-lf/benji\n\n.. image:: https://img.shields.io/pypi/l/benji.svg?style=plastic&label=License\n :target: https://pypi.org/project/benji/\n\n.. image:: https://img.shields.io/pypi/v/benji.svg?style=plastic&label=PyPI%20version\n :target: https://pypi.org/project/benji/\n\n.. image:: https://img.shields.io/pypi/pyversions/benji.svg?style=plastic&label=Supported%20Python%20versions\n :target: https://pypi.org/project/benji/\n\nBenji Backup\n============\n\nBenji Backup is a block based deduplicating backup software. It builds on the\nexcellent foundations and concepts of `backy\u00b2 `_ by Daniel Kraft.\nMany thanks go to him for making his work public and releasing backy\u00b2 as\nopen-source software!\n\nThe primary use cases for Benji are:\n\n* Fast and resource-efficient backup of Ceph RBD images to object or file storage\n* Backup of LVM volumes (e.g. from servers or personal computers) to external hard\n drives or the cloud\n\nBenji features a Docker image and Helm chart for integration with\n`Kubernetes `_. This makes it easy to setup a backup solution \nfor your persistent volumes.\n\nStatus\n------\n\nBenji is currently nearing beta quality. It passes all included tests. The\ndocumentation isn't completely up-to-date. Please open an issue on GitHub if you have\na usage question that is not or incorrectly covered by the documentation. And have a\nlook at the CHANGES file for any upgrade notes.\n\nBenji requires **Python 3.6.5 or newer** because older Python versions\nhave some shortcomings in the ``concurrent.futures`` implementation which lead to an\nexcessive memory usage.\n\nOlder versions contained a Docker image for integrating with `Rook `_.\nAs I no longer have access to a Rook installation and Rook changed its Docker base\nimage in the meantime I've dropped this support for the time being. The new generic\nKubernetes image (``benji-k8s``) can be used instead, but it will require some work to get\nthe Ceph credentials into the container. I'd accept patches for a third Docker\nimage (resurrecting the old ``benji-rook`` image) or maybe it's also possible to integrate\nthe changes into the ``benji-k8s`` image without too much fuss.\n\n\nMain Features\n-------------\n\n**Small backups**\n Benji deduplicates while reading from the block device and only writes\n blocks once if they have the same checksum. Deduplication takes into\n account all historic data present in the backup storage target and so\n spans all backups and all backup sources. This can make deduplication\n more effective if images are clones of a common ancestor.\n\n**Fast backups**\n With the help of Ceph's ``rbd diff``, Benji will only read the blocks\n that have changed since the last backup. Even when this information\n is not available (like with LVM) Benji will still only backup\n changed blocks.\n\n**Fast restores**\n With supporting block storage (like Ceph's RBD), a sparse restore is\n possible. This means, sparse blocks (i.e. blocks which are holes or are\n all zeros) will be skipped on restore.\n\n**NBD server facilitating file-based restores**\n Benji brings its own NBD (network block device) server which makes backup\n images directly mountable - even over the network on another machine. This\n enables file-based restores without restoring the whole image.\n\n These mounts are read/write (unless you specify ``-r``) and writing to them\n creates a copy-on-write backup version (**i.e. the original version is not modified**).\n This makes it possible to do repairs on the image (``fsck``, etc.) and restore\n the repaired copy afterwards.\n\n**Small bandwidth requirements**\n As only changed blocks are written to the backup storage, a small connection\n is sufficient even for larger backups. Even with newly created block devices\n the traffic to the backup target is small, because these block devices usually\n contain mostly zeros and are deduplicated before reaching the target storage.\n\n In addition to this Benji supports fast state-of-the-art compression based on\n `zstandard `_. This further reduces the\n required bandwidth and also reduces the storage space requirements.\n\n**Support for a variety of backup storage targets**\n Benji supports AWS S3 as a data backend but also has options to enable\n compatibility with other S3 implementations like Google Storage, Ceph's\n RADOS Gateway or `Minio `_.\n\n Benji also supports `Backblaze's `_ B2 Cloud\n Storage which opens up a very cost effective way to keep your backups.\n\n Last but not least Benji can also use any file based storage including\n external hard drives and NFS based storage solutions.\n\n**Confidentiality**\n Benji supports AES-256 in GCM mode to encrypt all your data on the backup\n storage. By using envelope encryption every block is encrypted with its\n own unique random key which makes plaintext attacks even more difficult.\n\n**Integrity**\n Every backed up block keeps a checksum with it. When Benji scrubs the\n backup, it reads the block from the backup storage, calculates its\n checksum and compares it to the stored checksum. If the checksum differs,\n it's most likely that there was an error while storing or reading\n the block, or because of bit rot on the backup target storage.\n\n Benji also supports a faster light-weight scrubbing mode which only checks\n the object's existence and metadata consistency.\n\n If a scrubbing failure occurs, the defective block and the backups it belongs\n to are marked as 'invalid' and the block will be re-read for the next backup\n version even if ``rbd diff`` indicates that it hasn't changed.\n\n Scrubbing can also take a percentage value of how many blocks of the backup\n it should scrub. So you can statistically scrub 16% each day and have a\n full scrub each week (16*7 > 100).\n\n**Concurrency: Backup while scrubbing while restoring**\n As Benji is a long-running process, you don't want to wait until something has\n finished of course. You can scrub, backup and restore at the same time and\n multiple times each.\n\n Benji even supports distributed operation where multiple instances run on\n different hosts or in different containers at the same time.\n\n**Cache friendly**\n While reading large pieces of data on Linux, buffers and caches get filled\n up with data, which in case of backups is essentially only needed once.\n Benji instructs Linux and Ceph to immediately forget the data once it's processed.\n\n**Simplicity: As simple as cp, but as clever as a backup solution needs to be**\n With a small set of commands, good ``--help`` and intuitive usage,\n Benji feels mostly like ``cp``. And that's intentional, because we think,\n a restore must be fool-proof and succeed even if you're woken up at 3am in the\n morning.\n\n**Prevents you from doing something stupid**\n By providing a configuration value for how old backups need to be in order to\n be able to remove them, you can't accidentally remove very young backups. An\n exception to this is the enforcement of retention policies which will also\n remove recent backups if configured.\n\n With ``benji protect`` you can protect versions from being removed.\n This is important when you plan to restore a version which according to the\n retention policy may be removed soon. During restore a lock will also prevent\n removal, however, by protecting it, it cannot be removed until you decide\n that it is no longer needed.\n\n Also, you'll need to use ``--force`` to overwrite existing files or volumes.\n\n**Free and Open Source Software**\n Anyone can review the source code and audit security and functionality.\n Benji is licensed under the LGPLv3 license. Please see the documentation\n for a full list of licenses.\n\n\n", "description_content_type": "text/x-rst", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://benji-backup.me/", "keywords": "backup", "license": "LGPL-3", "maintainer": "", "maintainer_email": "", "name": "benji", "package_url": "https://pypi.org/project/benji/", "platform": "", "project_url": "https://pypi.org/project/benji/", "project_urls": { "Homepage": "https://benji-backup.me/" }, "release_url": "https://pypi.org/project/benji/0.7.1/", "requires_dist": [ "PrettyTable (<1,>=0.7.2)", "sqlalchemy (<2,>=1.2.6)", "setproctitle (<2,>=1.1.8)", "python-dateutil (<3,>=2.6.0)", "alembic (<2,>=1.0.5)", "ruamel.yaml (<0.16,>0.15)", "psycopg2-binary (<3,>=2.7.4)", "argcomplete (<2,>=1.9.4)", "sparsebitfield (<1,>=0.2.2)", "cerberus (<2,>=1.2)", "pycryptodome (<4,>=3.6.1)", "pyparsing (<3,>=2.3.0)", "semantic-version (==2.6.0)", "dateparser (<1,>=0.7.0)", "structlog (>=19.1.0)", "colorama (<1,>=0.4.1)", "diskcache (>=3.0.6)", "b2 (<=1.3.8,>=1.3.2) ; extra == 'b2'", "zstandard (>=0.9.0) ; extra == 'compression'", "parameterized ; extra == 'dev'", "wheel ; extra == 'dev'", "yapf ; extra == 'dev'", "mypy ; extra == 'dev'", "sphinx ; extra == 'doc'", "sphinx-rtd-theme ; extra == 'doc'", "sphinxcontrib-programoutput ; extra == 'doc'", "blinker (<2,>=1.4) ; extra == 'helpers'", "prometheus-client (<1,>=0.7.0) ; extra == 'helpers'", "kubernetes (<11,>=10.0.0) ; extra == 'helpers'", "bottle (<1,>=0.12.16) ; extra == 'rest-api'", "gunicorn (<20,>=19.9.0) ; extra == 'rest-api'", "webargs (<6,>=5.3.1) ; extra == 'rest-api'", "boto3 (>=1.7.28) ; extra == 's3'" ], "requires_python": "~=3.6", "summary": "A block based deduplicating backup software for Ceph RBD, image files and devices", "version": "0.7.1" }, "last_serial": 5756742, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "32ebdd740001c22f8125925fbc162ca4", "sha256": "7a45ee2c324c2229d8c51b40702676dc1fbf2457c7566485cb48e010c567c875" }, "downloads": -1, "filename": "benji-0.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "32ebdd740001c22f8125925fbc162ca4", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": "~=3.6", "size": 100048, "upload_time": "2019-01-02T20:36:01", "url": "https://files.pythonhosted.org/packages/15/8d/005b2049d6afd6c621feb46b5b357cd1afc1d1bd3c845db6f27c9beb90dd/benji-0.1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f11ba313b3197b1efaade386d4fa411b", "sha256": "64d4e595ef019bc1a2360ad7b78c116ca48bbbfe476c50f4985f6aedf4650a83" }, "downloads": -1, "filename": "benji-0.1.0.tar.gz", "has_sig": false, "md5_digest": "f11ba313b3197b1efaade386d4fa411b", "packagetype": "sdist", "python_version": "source", "requires_python": "~=3.6", "size": 1543458, "upload_time": "2019-01-02T20:36:05", "url": "https://files.pythonhosted.org/packages/8f/00/5a988c20586e873022d368763e69bd575a042ef43fb9035547ad83892156/benji-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "087cbf83e1aa619a1bc577005624eae7", "sha256": "2898a3ee7e62f810fd7a055f1494783eac35b8ece818d521d8b51a2d8305aa64" }, "downloads": -1, "filename": "benji-0.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "087cbf83e1aa619a1bc577005624eae7", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": "~=3.6", "size": 100017, "upload_time": "2019-01-02T20:49:00", "url": "https://files.pythonhosted.org/packages/85/3b/40944151b963d8f60003243975e056f5c849a0b8a5c10fa15035b65cd306/benji-0.1.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e58296a640c1cacb3140f814d7f789fc", "sha256": "5d6ab550ca91968db77f0df93f84d3b1c87e5ea7fd827aaa2fd120c5062352ac" }, "downloads": -1, "filename": "benji-0.1.1.tar.gz", "has_sig": false, "md5_digest": "e58296a640c1cacb3140f814d7f789fc", "packagetype": "sdist", "python_version": "source", "requires_python": "~=3.6", "size": 1543439, "upload_time": "2019-01-02T20:49:03", "url": "https://files.pythonhosted.org/packages/30/79/29320b3f177483fe3b541a993997546fd0be0e92b4f4d60650f9aad637e3/benji-0.1.1.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "1b391d527d2376e6de214d7bf3caa254", "sha256": "e18560f8308f70f1b796d87c701dd9f48106cd9492c4c783ef3a8ecbf3c486eb" }, "downloads": -1, "filename": "benji-0.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "1b391d527d2376e6de214d7bf3caa254", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": "~=3.6", "size": 106000, "upload_time": "2019-02-01T17:07:00", "url": "https://files.pythonhosted.org/packages/98/13/2a0931dac216efe881beb4f0dbbe647f56dc02068277157e016b13ad5bc4/benji-0.2.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b497087c6f8a07b72f2cda399b56822e", "sha256": "a9743a4f5da4fd35ef4d266dcf00dc196388ebe226996188cc40f9e825c2ee4f" }, "downloads": -1, "filename": "benji-0.2.0.tar.gz", "has_sig": false, "md5_digest": "b497087c6f8a07b72f2cda399b56822e", "packagetype": "sdist", "python_version": "source", "requires_python": "~=3.6", "size": 1561977, "upload_time": "2019-02-01T17:07:02", "url": "https://files.pythonhosted.org/packages/a0/4a/fe9004d6df86c5391dc68348e6ecc1852300def75c307e1a057c9173becb/benji-0.2.0.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "b04da5caee4f0191a521a3f6be58e8fb", "sha256": "d3aea102e2f63c94fee1effbd819f33b05942010c52c3acb0fc5a5cc0a62f454" }, "downloads": -1, "filename": "benji-0.3.0-py3-none-any.whl", "has_sig": false, "md5_digest": "b04da5caee4f0191a521a3f6be58e8fb", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": "~=3.6", "size": 107532, "upload_time": "2019-02-25T14:22:02", "url": "https://files.pythonhosted.org/packages/d8/d1/3224937b9eae2c456b3e69a6947aabeb0243178cf68d3f4be9e01b287d12/benji-0.3.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "491a5837b49687a6e599b4699e1b9c24", "sha256": "a9f87328dcbaacba8a673ab0d2bbc7e5fe2908b2e669abbad85f8380e17d69a4" }, "downloads": -1, "filename": "benji-0.3.0.tar.gz", "has_sig": false, "md5_digest": "491a5837b49687a6e599b4699e1b9c24", "packagetype": "sdist", "python_version": "source", "requires_python": "~=3.6", "size": 1563247, "upload_time": "2019-02-25T14:22:04", "url": "https://files.pythonhosted.org/packages/4e/3b/d34ffdffe792c25e902e7e916fbc81183ff79c2ff33c3d54abea45344e52/benji-0.3.0.tar.gz" } ], "0.3.1": [ { "comment_text": "", "digests": { "md5": "4e68381dce78224d050873dfaa5830df", "sha256": "18055e4991564b1364dc720af0b64fef78e4d89b811d1e27a198dc4ba18b7792" }, "downloads": -1, "filename": "benji-0.3.1-py3-none-any.whl", "has_sig": false, "md5_digest": "4e68381dce78224d050873dfaa5830df", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": "~=3.6", "size": 107534, "upload_time": "2019-02-26T10:41:24", "url": "https://files.pythonhosted.org/packages/de/6a/d8feb1e3f2790037d2fab31d3158058566ecef14e448e9796cd16ae164ca/benji-0.3.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "44b896a36a1cf6ae0344dd9e029dd7c3", "sha256": "c874dcc7202abb835ad3d393cd8ab81478bbc4f947856b21d3ae38b8f6b33a46" }, "downloads": -1, "filename": "benji-0.3.1.tar.gz", "has_sig": false, "md5_digest": "44b896a36a1cf6ae0344dd9e029dd7c3", "packagetype": "sdist", "python_version": "source", "requires_python": "~=3.6", "size": 1563254, "upload_time": "2019-02-26T10:41:27", "url": "https://files.pythonhosted.org/packages/08/11/9a7ff5f7ec6d43f8ac735a3fcae7270267a4afab4df1aa6794f55144417b/benji-0.3.1.tar.gz" } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "4cdafbc93301da1e19d2eec2c901938e", "sha256": "4e251e1c3ab1ab766ff4faaf764c6f8b8192de5ef2c1046cc585574eb567d7bb" }, "downloads": -1, "filename": "benji-0.4.0-py3-none-any.whl", "has_sig": false, "md5_digest": "4cdafbc93301da1e19d2eec2c901938e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": "~=3.6", "size": 108737, "upload_time": "2019-03-20T10:20:46", "url": "https://files.pythonhosted.org/packages/02/27/16b2b6cb7a436a1c5b1946e10ee7b152735c6d8106fbbb3776fb8e8a5454/benji-0.4.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "077886269bc735219a45c16b64763e84", "sha256": "b6d7a101d46e920c5cba49aead1d975af2144449d11e1542d12bf02f2bbb35b8" }, "downloads": -1, "filename": "benji-0.4.0.tar.gz", "has_sig": false, "md5_digest": "077886269bc735219a45c16b64763e84", "packagetype": "sdist", "python_version": "source", "requires_python": "~=3.6", "size": 1564757, "upload_time": "2019-03-20T10:20:49", "url": "https://files.pythonhosted.org/packages/a4/54/72eb6e23e056c3270feabafdc7acc2588d34c51088eb67599293b7f873e2/benji-0.4.0.tar.gz" } ], "0.5.0": [ { "comment_text": "", "digests": { "md5": "3ee7aa394b29d553fa8e0b13cd0ef1f9", "sha256": "7279df5bf528fdab3fd24888b4300c8223a4e4aae80c9a62fdadeebc3a2f2262" }, "downloads": -1, "filename": "benji-0.5.0-py3-none-any.whl", "has_sig": false, "md5_digest": "3ee7aa394b29d553fa8e0b13cd0ef1f9", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": "~=3.6", "size": 112269, "upload_time": "2019-04-02T09:46:53", "url": "https://files.pythonhosted.org/packages/f9/67/b4df917f067ee51ec18882d7608a2913c928ae11d90fb879b4edeff4bc50/benji-0.5.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "30d74edf2bf218f52010df6d43544a64", "sha256": "0572d042209100105c5d9dcbe5a10cc0573bc7a3d987495e60594cfb9049d255" }, "downloads": -1, "filename": "benji-0.5.0.tar.gz", "has_sig": false, "md5_digest": "30d74edf2bf218f52010df6d43544a64", "packagetype": "sdist", "python_version": "source", "requires_python": "~=3.6", "size": 1569527, "upload_time": "2019-04-02T09:46:56", "url": "https://files.pythonhosted.org/packages/98/4b/672f4e36aecd2326dcac308c4f9f616c3f35abc954d1bb5155ba6dc441b3/benji-0.5.0.tar.gz" } ], "0.6.0": [ { "comment_text": "", "digests": { "md5": "30beedee7b57bc62f3821fd4c50ac7da", "sha256": "d8c484edfd217a298a8003fe7d9a6b0aa8926f7176b12bd7ff57721b58682e0c" }, "downloads": -1, "filename": "benji-0.6.0-py3-none-any.whl", "has_sig": false, "md5_digest": "30beedee7b57bc62f3821fd4c50ac7da", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": "~=3.6", "size": 115456, "upload_time": "2019-05-23T07:42:09", "url": "https://files.pythonhosted.org/packages/4a/8b/3562c0a3eacdc705254d6d0617969a720944b1ab517ce9835d08d1d72ffa/benji-0.6.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c4232ca478d7d55fb2c23d3df472bed5", "sha256": "e7ff4257f2c310796f271829f8878c443adb6b2163e8cc8808b537e9cd0fef6a" }, "downloads": -1, "filename": "benji-0.6.0.tar.gz", "has_sig": false, "md5_digest": "c4232ca478d7d55fb2c23d3df472bed5", "packagetype": "sdist", "python_version": "source", "requires_python": "~=3.6", "size": 728376, "upload_time": "2019-05-23T07:42:13", "url": "https://files.pythonhosted.org/packages/05/9b/12083d9c8826b28e568f02c7eab484cad30bae771e5a6073de28cddb4797/benji-0.6.0.tar.gz" } ], "0.7.0": [ { "comment_text": "", "digests": { "md5": "4615d2f7397773134295f4f61d0a1f47", "sha256": "500a7d6c9af8abdfb7ab28825a5a9fac4a3b2f666c5f3ba82ce168758e3c5b95" }, "downloads": -1, "filename": "benji-0.7.0-py3-none-any.whl", "has_sig": false, "md5_digest": "4615d2f7397773134295f4f61d0a1f47", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": "~=3.6", "size": 131182, "upload_time": "2019-08-27T12:53:24", "url": "https://files.pythonhosted.org/packages/d0/a2/5d752f75a703090a986ff2a068f10d501dbcc331a7a073c72e1b5b439c0d/benji-0.7.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b83cbe38dbf3946bd097a6c7cfcda00d", "sha256": "1e3a0a23e079503ab6230521e948721f8defafbba505c239090a254f0a5b6fb5" }, "downloads": -1, "filename": "benji-0.7.0.tar.gz", "has_sig": false, "md5_digest": "b83cbe38dbf3946bd097a6c7cfcda00d", "packagetype": "sdist", "python_version": "source", "requires_python": "~=3.6", "size": 1568136, "upload_time": "2019-08-27T12:53:26", "url": "https://files.pythonhosted.org/packages/22/0e/f267e2563095f57c52bfdeb9152eb418b09c2b643c8ba8c539f47a0358a9/benji-0.7.0.tar.gz" } ], "0.7.1": [ { "comment_text": "", "digests": { "md5": "ba97ca9e49b5e6631f5ca1adf8e381e4", "sha256": "7528f8d8646abe37325b68716d3c340b4f3a3625c52b0b47768042ee782d7f57" }, "downloads": -1, "filename": "benji-0.7.1-py3-none-any.whl", "has_sig": false, "md5_digest": "ba97ca9e49b5e6631f5ca1adf8e381e4", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": "~=3.6", "size": 131193, "upload_time": "2019-08-29T20:16:42", "url": "https://files.pythonhosted.org/packages/05/4e/ff54536ec1cfc9de20479de811ecef10ad34b7202b996cf4e00a0dfb605e/benji-0.7.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "895d4a80822493a738de0fe29b315a32", "sha256": "9f7baa50a42c1f74108f9fbfc09cca4c538493765655c6accdb0dd246f79fd42" }, "downloads": -1, "filename": "benji-0.7.1.tar.gz", "has_sig": false, "md5_digest": "895d4a80822493a738de0fe29b315a32", "packagetype": "sdist", "python_version": "source", "requires_python": "~=3.6", "size": 1568114, "upload_time": "2019-08-29T20:16:45", "url": "https://files.pythonhosted.org/packages/cf/de/8714e8253b344db576843dc480646f5431a0920e9eb2f2d9eb77f5750ec4/benji-0.7.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "ba97ca9e49b5e6631f5ca1adf8e381e4", "sha256": "7528f8d8646abe37325b68716d3c340b4f3a3625c52b0b47768042ee782d7f57" }, "downloads": -1, "filename": "benji-0.7.1-py3-none-any.whl", "has_sig": false, "md5_digest": "ba97ca9e49b5e6631f5ca1adf8e381e4", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": "~=3.6", "size": 131193, "upload_time": "2019-08-29T20:16:42", "url": "https://files.pythonhosted.org/packages/05/4e/ff54536ec1cfc9de20479de811ecef10ad34b7202b996cf4e00a0dfb605e/benji-0.7.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "895d4a80822493a738de0fe29b315a32", "sha256": "9f7baa50a42c1f74108f9fbfc09cca4c538493765655c6accdb0dd246f79fd42" }, "downloads": -1, "filename": "benji-0.7.1.tar.gz", "has_sig": false, "md5_digest": "895d4a80822493a738de0fe29b315a32", "packagetype": "sdist", "python_version": "source", "requires_python": "~=3.6", "size": 1568114, "upload_time": "2019-08-29T20:16:45", "url": "https://files.pythonhosted.org/packages/cf/de/8714e8253b344db576843dc480646f5431a0920e9eb2f2d9eb77f5750ec4/benji-0.7.1.tar.gz" } ] }