{ "info": { "author": "Peter Odding", "author_email": "peter@peterodding.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Environment :: Console", "Intended Audience :: Developers", "Intended Audience :: System Administrators", "License :: OSI Approved :: MIT License", "Operating System :: MacOS :: MacOS X", "Operating System :: POSIX", "Operating System :: POSIX :: Linux", "Operating System :: Unix", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy", "Topic :: Software Development", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: System :: Archiving :: Backup", "Topic :: System :: Systems Administration" ], "description": "rotate-backups: Simple command line interface for backup rotation\n=================================================================\n\n.. image:: https://travis-ci.org/xolox/python-rotate-backups.svg?branch=master\n :target: https://travis-ci.org/xolox/python-rotate-backups\n\n.. image:: https://coveralls.io/repos/xolox/python-rotate-backups/badge.svg?branch=master\n :target: https://coveralls.io/r/xolox/python-rotate-backups?branch=master\n\nBackups are good for you. Most people learn this the hard way (including me).\nNowadays my Linux laptop automatically creates a full system snapshot every\nfour hours by pushing changed files to an `rsync`_ daemon running on the server\nin my home network and creating a snapshot afterwards using the ``cp -al``\ncommand (the article `Easy Automated Snapshot-Style Backups with Linux and\nRsync`_ explains the basic technique). The server has a second disk attached\nwhich asynchronously copies from the main disk so that a single disk failure\ndoesn't wipe all of my backups (the \"time delayed replication\" aspect has also\nproven to be very useful).\n\nOkay, cool, now I have backups of everything, up to date and going back in\ntime! But I'm running through disk space like crazy... A proper deduplicating\nfilesystem would be awesome but I'm running crappy consumer grade hardware and\ne.g. ZFS has not been a good experience in the past. So I'm going to have to\ndelete backups...\n\nDeleting backups is never nice, but an easy and proper rotation scheme can help\na lot. I wanted to keep things manageable so I wrote a Python script to do it\nfor me. Over the years I actually wrote several variants. Because I kept\ncopy/pasting these scripts around I decided to bring the main features together\nin a properly documented Python package and upload it to the `Python Package\nIndex`_.\n\nThe `rotate-backups` package is currently tested on cPython 2.6, 2.7, 3.4, 3.5,\n3.6 and PyPy (2.7). It's tested on Linux and Mac OS X and may work on other\nunixes but definitely won't work on Windows right now.\n\n.. contents::\n :local:\n\nFeatures\n--------\n\n**Dry run mode**\n **Use it.** I'm serious. If you don't and `rotate-backups` eats more backups\n than intended you have no right to complain ;-)\n\n**Flexible rotation**\n Rotation with any combination of hourly, daily, weekly, monthly and yearly\n retention periods.\n\n**Fuzzy timestamp matching in filenames**\n The modification times of the files and/or directories are not relevant. If\n you speak Python regular expressions, here is how the fuzzy matching\n works::\n\n # Required components.\n (?P\\d{4}) \\D?\n (?P\\d{2}) \\D?\n (?P\\d{2}) \\D?\n (\n # Optional components.\n (?P\\d{2}) \\D?\n (?P\\d{2}) \\D?\n (?P\\d{2})?\n )?\n\n**All actions are logged**\n Log messages are saved to the system log (e.g. ``/var/log/syslog``) so you\n can retrace what happened when something seems to have gone wrong.\n\nInstallation\n------------\n\nThe `rotate-backups` package is available on PyPI_ which means installation\nshould be as simple as:\n\n.. code-block:: sh\n\n $ pip install rotate-backups\n\nThere's actually a multitude of ways to install Python packages (e.g. the `per\nuser site-packages directory`_, `virtual environments`_ or just installing\nsystem wide) and I have no intention of getting into that discussion here, so\nif this intimidates you then read up on your options before returning to these\ninstructions ;-).\n\nUsage\n-----\n\nThere are two ways to use the `rotate-backups` package: As the command line\nprogram ``rotate-backups`` and as a Python API. For details about the Python\nAPI please refer to the API documentation available on `Read the Docs`_. The\ncommand line interface is described below.\n\nCommand line\n~~~~~~~~~~~~\n\n.. A DRY solution to avoid duplication of the `rotate-backups --help' text:\n..\n.. [[[cog\n.. from humanfriendly.usage import inject_usage\n.. inject_usage('rotate_backups.cli')\n.. ]]]\n\n**Usage:** `rotate-backups [OPTIONS] [DIRECTORY, ..]`\n\nEasy rotation of backups based on the Python package by the same name.\n\nTo use this program you specify a rotation scheme via (a combination of) the\n``--hourly``, ``--daily``, ``--weekly``, ``--monthly`` and/or ``--yearly`` options and the\ndirectory (or directories) containing backups to rotate as one or more\npositional arguments.\n\nYou can rotate backups on a remote system over SSH by prefixing a DIRECTORY\nwith an SSH alias and separating the two with a colon (similar to how rsync\naccepts remote locations).\n\nInstead of specifying directories and a rotation scheme on the command line you\ncan also add them to a configuration file. For more details refer to the online\ndocumentation (see also the ``--config`` option).\n\nPlease use the ``--dry-run`` option to test the effect of the specified rotation\nscheme before letting this program loose on your precious backups! If you don't\ntest the results using the dry run mode and this program eats more backups than\nintended you have no right to complain ;-).\n\n**Supported options:**\n\n.. csv-table::\n :header: Option, Description\n :widths: 30, 70\n\n\n \"``-M``, ``--minutely=COUNT``\",\"In a literal sense this option sets the number of \"\"backups per minute\"\" to\n preserve during rotation. For most use cases that doesn't make a lot of\n sense :-) but you can combine the ``--minutely`` and ``--relaxed`` options to\n preserve more than one backup per hour. Refer to the usage of the ``-H``,\n ``--hourly`` option for details about ``COUNT``.\"\n \"``-H``, ``--hourly=COUNT``\",\"Set the number of hourly backups to preserve during rotation:\n\n - If ``COUNT`` is a number it gives the number of hourly backups to preserve,\n starting from the most recent hourly backup and counting back in time.\n - Alternatively you can provide an expression that will be evaluated to get\n a number (e.g. if ``COUNT`` is \"\"7 \\* 2\"\" the result would be 14).\n - You can also pass \"\"always\"\" for ``COUNT``, in this case all hourly backups are\n preserved.\n - By default no hourly backups are preserved.\"\n \"``-d``, ``--daily=COUNT``\",\"Set the number of daily backups to preserve during rotation. Refer to the\n usage of the ``-H``, ``--hourly`` option for details about ``COUNT``.\"\n \"``-w``, ``--weekly=COUNT``\",\"Set the number of weekly backups to preserve during rotation. Refer to the\n usage of the ``-H``, ``--hourly`` option for details about ``COUNT``.\"\n \"``-m``, ``--monthly=COUNT``\",\"Set the number of monthly backups to preserve during rotation. Refer to the\n usage of the ``-H``, ``--hourly`` option for details about ``COUNT``.\"\n \"``-y``, ``--yearly=COUNT``\",\"Set the number of yearly backups to preserve during rotation. Refer to the\n usage of the ``-H``, ``--hourly`` option for details about ``COUNT``.\"\n \"``-I``, ``--include=PATTERN``\",\"Only process backups that match the shell pattern given by ``PATTERN``. This\n argument can be repeated. Make sure to quote ``PATTERN`` so the shell doesn't\n expand the pattern before it's received by rotate-backups.\"\n \"``-x``, ``--exclude=PATTERN``\",\"Don't process backups that match the shell pattern given by ``PATTERN``. This\n argument can be repeated. Make sure to quote ``PATTERN`` so the shell doesn't\n expand the pattern before it's received by rotate-backups.\"\n \"``-j``, ``--parallel``\",\"Remove backups in parallel, one backup per mount point at a time. The idea\n behind this approach is that parallel rotation is most useful when the\n files to be removed are on different disks and so multiple devices can be\n utilized at the same time.\n\n Because mount points are per system the ``-j``, ``--parallel`` option will also\n parallelize over backups located on multiple remote systems.\"\n \"``-p``, ``--prefer-recent``\",\"By default the first (oldest) backup in each time slot is preserved. If\n you'd prefer to keep the most recent backup in each time slot instead then\n this option is for you.\"\n \"``-r``, ``--relaxed``\",\"By default the time window for each rotation scheme is enforced (this is\n referred to as strict rotation) but the ``-r``, ``--relaxed`` option can be used\n to alter this behavior. The easiest way to explain the difference between\n strict and relaxed rotation is using an example:\n\n - When using strict rotation and the number of hourly backups to preserve\n is three, only backups created in the relevant time window (the hour of\n the most recent backup and the two hours leading up to that) will match\n the hourly frequency.\n\n - When using relaxed rotation the three most recent backups will all match\n the hourly frequency (and thus be preserved), regardless of the\n calculated time window.\n\n If the explanation above is not clear enough, here's a simple way to decide\n whether you want to customize this behavior or not:\n\n - If your backups are created at regular intervals and you never miss an\n interval then strict rotation (the default) is probably the best choice.\n\n - If your backups are created at irregular intervals then you may want to\n use the ``-r``, ``--relaxed`` option in order to preserve more backups.\"\n \"``-i``, ``--ionice=CLASS``\",\"Use the \"\"ionice\"\" program to set the I/O scheduling class and priority of\n the \"\"rm\"\" invocations used to remove backups. ``CLASS`` is expected to be one of\n the values \"\"idle\"\", \"\"best-effort\"\" or \"\"realtime\"\". Refer to the man page of\n the \"\"ionice\"\" program for details about these values.\"\n \"``-c``, ``--config=FILENAME``\",\"Load configuration from ``FILENAME``. If this option isn't given the following\n default locations are searched for configuration files:\n\n - /etc/rotate-backups.ini and /etc/rotate-backups.d/\\*.ini\n - ~/.rotate-backups.ini and ~/.rotate-backups.d/\\*.ini\n - ~/.config/rotate-backups.ini and ~/.config/rotate-backups.d/\\*.ini\n\n Any available configuration files are loaded in the order given above, so\n that sections in user-specific configuration files override sections by the\n same name in system-wide configuration files. For more details refer to the\n online documentation.\"\n \"``-u``, ``--use-sudo``\",\"Enable the use of \"\"sudo\"\" to rotate backups in directories that are not\n readable and/or writable for the current user (or the user logged in to a\n remote system over SSH).\"\n \"``-n``, ``--dry-run``\",\"Don't make any changes, just print what would be done. This makes it easy\n to evaluate the impact of a rotation scheme without losing any backups.\"\n \"``-C``, ``--removal-command=CMD``\",\"Change the command used to remove backups. The value of ``CMD`` defaults to\n ``rm ``-f``R``. This choice was made because it works regardless of whether\n \"\"backups to be rotated\"\" are files or directories or a mixture of both.\n\n As an example of why you might want to change this, CephFS snapshots are\n represented as regular directory trees that can be deleted at once with a\n single 'rmdir' command (even though according to POSIX semantics this\n command should refuse to remove nonempty directories, but I digress).\"\n \"``-v``, ``--verbose``\",Increase logging verbosity (can be repeated).\n \"``-q``, ``--quiet``\",Decrease logging verbosity (can be repeated).\n \"``-h``, ``--help``\",Show this message and exit.\n\n.. [[[end]]]\n\nConfiguration files\n~~~~~~~~~~~~~~~~~~~\n\nInstead of specifying directories and rotation schemes on the command line you\ncan also add them to a configuration file.\n\n.. [[[cog\n.. from update_dotdee import inject_documentation\n.. inject_documentation(program_name='rotate-backups')\n.. ]]]\n\nConfiguration files are text files in the subset of `ini syntax`_ supported by\nPython's configparser_ module. They can be located in the following places:\n\n========= ============================ =================================\nDirectory Main configuration file Modular configuration files\n========= ============================ =================================\n/etc /etc/rotate-backups.ini /etc/rotate-backups.d/\\*.ini\n~ ~/.rotate-backups.ini ~/.rotate-backups.d/\\*.ini\n~/.config ~/.config/rotate-backups.ini ~/.config/rotate-backups.d/\\*.ini\n========= ============================ =================================\n\nThe available configuration files are loaded in the order given above, so that\nuser specific configuration files override system wide configuration files.\n\n.. _configparser: https://docs.python.org/3/library/configparser.html\n.. _ini syntax: https://en.wikipedia.org/wiki/INI_file\n\n.. [[[end]]]\n\nYou can load a configuration file in a nonstandard location using the command\nline option ``--config``, in this case the default locations mentioned above\nare ignored.\n\nEach section in the configuration defines a directory that contains backups to\nbe rotated. The options in each section define the rotation scheme and other\noptions. Here's an example based on how I use `rotate-backups` to rotate the\nbackups of the Linux installations that I make regular backups of:\n\n.. code-block:: ini\n\n # /etc/rotate-backups.ini:\n # Configuration file for the rotate-backups program that specifies\n # directories containing backups to be rotated according to specific\n # rotation schemes.\n\n [/backups/laptop]\n hourly = 24\n daily = 7\n weekly = 4\n monthly = 12\n yearly = always\n ionice = idle\n\n [/backups/server]\n daily = 7 * 2\n weekly = 4 * 2\n monthly = 12 * 4\n yearly = always\n ionice = idle\n\n [/backups/mopidy]\n daily = 7\n weekly = 4\n monthly = 2\n ionice = idle\n\n [/backups/xbmc]\n daily = 7\n weekly = 4\n monthly = 2\n ionice = idle\n\nAs you can see in the retention periods of the directory ``/backups/server`` in\nthe example above you are allowed to use expressions that evaluate to a number\n(instead of having to write out the literal number).\n\nHere's an example of a configuration for two remote directories:\n\n.. code-block:: ini\n\n # SSH as a regular user and use `sudo' to elevate privileges.\n [server:/backups/laptop]\n use-sudo = yes\n hourly = 24\n daily = 7\n weekly = 4\n monthly = 12\n yearly = always\n ionice = idle\n\n # SSH as the root user (avoids sudo passwords).\n [server:/backups/server]\n ssh-user = root\n hourly = 24\n daily = 7\n weekly = 4\n monthly = 12\n yearly = always\n ionice = idle\n\nAs this example shows you have the option to connect as the root user or to\nconnect as a regular user and use ``sudo`` to elevate privileges.\n\nCustomizing the rotation algorithm\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nSince publishing `rotate-backups` I've found that the default rotation\nalgorithm is not to everyone's satisfaction and because the suggested\nalternatives were just as valid as the choices that I initially made,\noptions were added to expose the alternative behaviors:\n\n+-------------------------------------+-------------------------------------+\n| Default | Alternative |\n+=====================================+=====================================+\n| Strict rotation (the time window | Relaxed rotation (time windows are |\n| for each rotation frequency is | not enforced). Enabled by the |\n| enforced). | ``-r``, ``--relaxed`` option. |\n+-------------------------------------+-------------------------------------+\n| The oldest backup in each time slot | The newest backup in each time slot |\n| is preserved and newer backups in | is preserved and older backups in |\n| the time slot are removed. | the time slot are removed. Enabled |\n| | by the ``-p``, ``--prefer-recent`` |\n| | option. |\n+-------------------------------------+-------------------------------------+\n\nSupported configuration options\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n- Rotation schemes are defined using the ``minutely``, ``hourly``, ``daily``,\n ``weekly``, ``monthly`` and ``yearly`` options, these options support the\n same values as documented for the command line interface.\n\n- The ``include-list`` and ``exclude-list`` options define a comma separated\n list of filename patterns to include or exclude, respectively:\n\n - Make sure *not* to quote the patterns in the configuration file,\n just provide them literally.\n\n - If an include or exclude list is defined in the configuration file it\n overrides the include or exclude list given on the command line.\n\n- The ``prefer-recent``, ``strict`` and ``use-sudo`` options expect a boolean\n value (``yes``, ``no``, ``true``, ``false``, ``1`` or ``0``).\n\n- The ``removal-command`` option can be used to customize the command that is\n used to remove backups.\n\n- The ``ionice`` option expects one of the I/O scheduling class names ``idle``,\n ``best-effort`` or ``realtime``.\n\n- The ``ssh-user`` option can be used to override the name of the remote SSH\n account that's used to connect to a remote system.\n\nHow it works\n------------\n\nThe basic premise of `rotate-backups` is fairly simple:\n\n1. You point `rotate-backups` at a directory containing timestamped backups.\n\n2. It will scan the directory for entries (it doesn't matter whether they are\n files or directories) with a recognizable timestamp in the name.\n\n .. note:: All of the matched directory entries are considered to be backups\n of the same data source, i.e. there's no filename similarity logic\n to distinguish unrelated backups that are located in the same\n directory. If this presents a problem consider using the\n ``--include`` and/or ``--exclude`` options.\n\n3. The user defined rotation scheme is applied to the entries. If this doesn't\n do what you'd expect it to you can try the ``--relaxed`` and/or\n ``--prefer-recent`` options.\n\n4. The entries to rotate are removed (or printed in dry run).\n\nContact\n-------\n\nThe latest version of `rotate-backups` is available on PyPI_ and GitHub_. The\ndocumentation is hosted on `Read the Docs`_ and includes a changelog_. For bug\nreports please create an issue on GitHub_. If you have questions, suggestions,\netc. feel free to send me an e-mail at `peter@peterodding.com`_.\n\nLicense\n-------\n\nThis software is licensed under the `MIT license`_.\n\n\u00a9 2018 Peter Odding.\n\n.. External references:\n\n.. _changelog: https://rotate-backups.readthedocs.org/en/latest/changelog.html\n.. _Easy Automated Snapshot-Style Backups with Linux and Rsync: http://www.mikerubel.org/computers/rsync_snapshots/\n.. _GitHub: https://github.com/xolox/python-rotate-backups\n.. _MIT license: http://en.wikipedia.org/wiki/MIT_License\n.. _per user site-packages directory: https://www.python.org/dev/peps/pep-0370/\n.. _peter@peterodding.com: peter@peterodding.com\n.. _PyPI: https://pypi.python.org/pypi/rotate-backups\n.. _Python Package Index: https://pypi.python.org/pypi/rotate-backups\n.. _Read the Docs: https://rotate-backups.readthedocs.org\n.. _rsync: http://en.wikipedia.org/wiki/rsync\n.. _virtual environments: http://docs.python-guide.org/en/latest/dev/virtualenvs/\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/xolox/python-rotate-backups", "keywords": "", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "rotate-backups", "package_url": "https://pypi.org/project/rotate-backups/", "platform": "", "project_url": "https://pypi.org/project/rotate-backups/", "project_urls": { "Homepage": "https://github.com/xolox/python-rotate-backups" }, "release_url": "https://pypi.org/project/rotate-backups/6.0/", "requires_dist": [ "coloredlogs (>=5.1)", "executor (>=19.2)", "humanfriendly (>=3.4)", "naturalsort (>=1.4)", "property-manager (>=2.3)", "python-dateutil (>=2.2)", "simpleeval (>=0.8.7)", "six (>=1.9.0)", "update-dotdee (>=5.0)", "verboselogs (>=1.5)" ], "requires_python": "", "summary": "Simple command line interface for backup rotation", "version": "6.0" }, "last_serial": 4130607, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "47e8c818bc3142ecd61573498d97b6d2", "sha256": "3d8f54536f4ba239425fa584a20ac535d93b1f34505010fafb7e1cdc2919d61c" }, "downloads": -1, "filename": "rotate-backups-0.1.tar.gz", "has_sig": false, "md5_digest": "47e8c818bc3142ecd61573498d97b6d2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13842, "upload_time": "2014-07-02T23:25:09", "url": "https://files.pythonhosted.org/packages/8d/16/c2eb1d1ff7d5fd1c6d8080a22ed954e236ae78ca20971531d61983dbae96/rotate-backups-0.1.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "e808da108bc6bbec642328a2601414d5", "sha256": "702780608ba53fa0cd315f6d1eb4713e82358f23957ae3e93b9f571eba52584e" }, "downloads": -1, "filename": "rotate-backups-0.1.1.tar.gz", "has_sig": false, "md5_digest": "e808da108bc6bbec642328a2601414d5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14126, "upload_time": "2014-07-02T23:39:39", "url": "https://files.pythonhosted.org/packages/93/56/6f1b3363425c30923226352b85c94d23f7b68ee6b9f45933717cbcc74e77/rotate-backups-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "1d1164fdb2b61b76cf8ed02d4c2f1c60", "sha256": "997fd7285f7a806a353642cfba86f1299c66007a95e91e44bf29829587dacf43" }, "downloads": -1, "filename": "rotate-backups-0.1.2.tar.gz", "has_sig": false, "md5_digest": "1d1164fdb2b61b76cf8ed02d4c2f1c60", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14148, "upload_time": "2015-07-15T18:34:50", "url": "https://files.pythonhosted.org/packages/e5/bc/0b768235f60905df4a20454086d0245d22ba572f998c2174e59bdd968e11/rotate-backups-0.1.2.tar.gz" } ], "1.0": [ { "comment_text": "", "digests": { "md5": "7739d05cb4df9edebd2541895a9cf163", "sha256": "18daa9628c7dd300ba586f151f2f97499a63cf30a14b66af53f04d43e080828c" }, "downloads": -1, "filename": "rotate-backups-1.0.tar.gz", "has_sig": false, "md5_digest": "7739d05cb4df9edebd2541895a9cf163", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21412, "upload_time": "2015-07-19T13:42:25", "url": "https://files.pythonhosted.org/packages/d4/dd/9d6ae4c0dede0211ac138abe20e62b44b5c4b1c8795fed49c55e27e91072/rotate-backups-1.0.tar.gz" } ], "1.1": [ { "comment_text": "", "digests": { "md5": "bd6de0ec5a22c241deb96afddb688cf2", "sha256": "1ede977e1d2e768fde64789b082783ec65647d05bfe5add65d655da6b4ea560e" }, "downloads": -1, "filename": "rotate-backups-1.1.tar.gz", "has_sig": false, "md5_digest": "bd6de0ec5a22c241deb96afddb688cf2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23741, "upload_time": "2015-07-19T15:35:45", "url": "https://files.pythonhosted.org/packages/07/fa/c828edaecc4a4a5eb1424bb836e018489d62d910d01793141fdcc50b4c32/rotate-backups-1.1.tar.gz" } ], "2.2": [ { "comment_text": "", "digests": { "md5": "985d50669146f8263be5c4362da9b5ec", "sha256": "a484847016a5df5da7abad7e1fca9f11fbd434b8b0b2e6ca3d465acbcefffd32" }, "downloads": -1, "filename": "rotate-backups-2.2.tar.gz", "has_sig": false, "md5_digest": "985d50669146f8263be5c4362da9b5ec", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18489, "upload_time": "2015-07-19T21:44:47", "url": "https://files.pythonhosted.org/packages/0d/a4/1703959ad3799112ef35125d5d7abef17ca794c80eb06d36746d86225ef8/rotate-backups-2.2.tar.gz" } ], "2.3": [ { "comment_text": "", "digests": { "md5": "6037ff790d766c77ba1de5d6393c0447", "sha256": "251cb1808a665910aafd58f3aca837b8e0a33a80179d30cee1a807f547d6197e" }, "downloads": -1, "filename": "rotate-backups-2.3.tar.gz", "has_sig": false, "md5_digest": "6037ff790d766c77ba1de5d6393c0447", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18669, "upload_time": "2015-08-30T10:03:41", "url": "https://files.pythonhosted.org/packages/a9/3b/dd3daf94036ce4d1085763141348af3ae98552419c5a9343c244b289e3c0/rotate-backups-2.3.tar.gz" } ], "3.0": [ { "comment_text": "", "digests": { "md5": "31c0d71fc6f735d3f3612a444e74f88f", "sha256": "22c33477800159150aac1d83e6c3bf99cf318c854b770d34a4ca34cab6050730" }, "downloads": -1, "filename": "rotate-backups-3.0.tar.gz", "has_sig": false, "md5_digest": "31c0d71fc6f735d3f3612a444e74f88f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21131, "upload_time": "2016-04-13T19:22:48", "url": "https://files.pythonhosted.org/packages/2a/3b/524c6a85d6112cf3bbc8add965563009716cfbae75554c5c5965641ceb77/rotate-backups-3.0.tar.gz" } ], "3.1": [ { "comment_text": "", "digests": { "md5": "08eac6483b75be8cfd04b14c41d10b0b", "sha256": "d2c997072627760d602b38c0a1bcf33b23872464109b5f0426bafab56a027aeb" }, "downloads": -1, "filename": "rotate-backups-3.1.tar.gz", "has_sig": false, "md5_digest": "08eac6483b75be8cfd04b14c41d10b0b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23408, "upload_time": "2016-04-13T20:07:12", "url": "https://files.pythonhosted.org/packages/8f/22/ead83444fb572d883308dc687dd3da5b526bbc8f439a336e3a5cba48a524/rotate-backups-3.1.tar.gz" } ], "3.2": [ { "comment_text": "", "digests": { "md5": "73adc7ab85c47d4e947f92aeff11da61", "sha256": "8131eccd89965a1de2f7346a59622b6bfb9918ab018dae958334092a3a414789" }, "downloads": -1, "filename": "rotate_backups-3.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "73adc7ab85c47d4e947f92aeff11da61", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 26207, "upload_time": "2016-07-08T20:47:54", "url": "https://files.pythonhosted.org/packages/54/73/8e3047b785cf3762c52bda12f7c1715d9c27ac37819deab838703c986026/rotate_backups-3.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "76c8b2d03f65a0b21becf3fd70fc9ff6", "sha256": "3a686bc65060007ff788518ea5603295cc2f2bd439e0e3fa7b21cd1e7f0db747" }, "downloads": -1, "filename": "rotate-backups-3.2.tar.gz", "has_sig": false, "md5_digest": "76c8b2d03f65a0b21becf3fd70fc9ff6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23648, "upload_time": "2016-07-08T20:47:58", "url": "https://files.pythonhosted.org/packages/d7/a0/a5af6ec25204867bcff4a60799587e7a7a26b6ddd4bdb66ca3d4e8c32639/rotate-backups-3.2.tar.gz" } ], "3.3": [ { "comment_text": "", "digests": { "md5": "f5f1c3426b4e1ec8d3f3b52123fedde3", "sha256": "f878ac1ffc22b775e3a227da38baa7e46d1256d6fff65c2ae48107d8e681870c" }, "downloads": -1, "filename": "rotate_backups-3.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "f5f1c3426b4e1ec8d3f3b52123fedde3", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 26372, "upload_time": "2016-07-08T22:15:47", "url": "https://files.pythonhosted.org/packages/a8/ba/5a61512c54bf0e718c4f1ab927266f5e8c92c80072b545832fcc5b085f82/rotate_backups-3.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2557204b35dd4ebb2a6eea2046a658d7", "sha256": "7dca385c41e7bc20064380e699f16b65c3c3ecb98109050e3d5e4d947c32ad24" }, "downloads": -1, "filename": "rotate-backups-3.3.tar.gz", "has_sig": false, "md5_digest": "2557204b35dd4ebb2a6eea2046a658d7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23813, "upload_time": "2016-07-08T22:15:51", "url": "https://files.pythonhosted.org/packages/11/69/d5181aad106aaf5b86dee4709d08197e3045c666ba35b7602a7651ae6fc0/rotate-backups-3.3.tar.gz" } ], "3.4": [ { "comment_text": "", "digests": { "md5": "500852eddde1678a192bac7a49714de9", "sha256": "32d91abf876420898d19c682e4a794b07b02ee06c0fe848b7f6067e16ca7023e" }, "downloads": -1, "filename": "rotate_backups-3.4-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "500852eddde1678a192bac7a49714de9", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 26931, "upload_time": "2016-07-08T22:21:49", "url": "https://files.pythonhosted.org/packages/e0/b6/22bb6a2b9b74d6797aff86df8b9aead98dd7a34e103e185823f2251685bc/rotate_backups-3.4-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1f6772d1ed6bc22f6e4069f21b426e6c", "sha256": "eafbfe7fb5bfc1c70b79cae09690e379d0f35f3f2a71c26c98d42f8fa11b84fb" }, "downloads": -1, "filename": "rotate-backups-3.4.tar.gz", "has_sig": false, "md5_digest": "1f6772d1ed6bc22f6e4069f21b426e6c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 24428, "upload_time": "2016-07-08T22:21:53", "url": "https://files.pythonhosted.org/packages/70/0a/35e996d16620a99a835fa052228f8ccb0e53d1bd0e320b2438676593d57c/rotate-backups-3.4.tar.gz" } ], "3.5": [ { "comment_text": "", "digests": { "md5": "3c4c1c66e79d9f653c6b5c190c02bce7", "sha256": "3a55a7d8f310f5897249a01b050c60f1a95a1fbde05acc86893890ba7408b8d3" }, "downloads": -1, "filename": "rotate_backups-3.5-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "3c4c1c66e79d9f653c6b5c190c02bce7", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 27146, "upload_time": "2016-07-08T22:59:05", "url": "https://files.pythonhosted.org/packages/bd/81/e114516725772440c940325813d4f496f68ca44d24e964eb0f6c32ea1a1e/rotate_backups-3.5-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "46dcfedfd895c0ab4e442def28ac82d5", "sha256": "ae2bd89c5185d49becc21ffb135e80378a9ab052ed8074558284176c5e8c48dc" }, "downloads": -1, "filename": "rotate-backups-3.5.tar.gz", "has_sig": false, "md5_digest": "46dcfedfd895c0ab4e442def28ac82d5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 24639, "upload_time": "2016-07-08T22:59:09", "url": "https://files.pythonhosted.org/packages/18/75/2b3ea41e814cc45d1b85b7e4025e45568c91d547e514d48e66eb48636ccd/rotate-backups-3.5.tar.gz" } ], "4.1": [ { "comment_text": "", "digests": { "md5": "96a305a49e7eeb25103e1b8e7723cdfc", "sha256": "1bceedae8ed96cc9fe4db1c44a2956d827c220e3361be94152a9c74f2c2e54dc" }, "downloads": -1, "filename": "rotate_backups-4.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "96a305a49e7eeb25103e1b8e7723cdfc", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 29691, "upload_time": "2016-08-04T23:08:07", "url": "https://files.pythonhosted.org/packages/61/3d/ae29202521c69cf1666a042866235a5a00f9083d701e8dc42737091c1e2b/rotate_backups-4.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2d1a8d725240e9eff43064c04f010224", "sha256": "b1a1d283119ba99006071bfede1fa7f738291c1f4d446fe93d7f5cd1b4c31f47" }, "downloads": -1, "filename": "rotate-backups-4.1.tar.gz", "has_sig": false, "md5_digest": "2d1a8d725240e9eff43064c04f010224", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 27156, "upload_time": "2016-08-04T23:08:10", "url": "https://files.pythonhosted.org/packages/80/42/3883bc21ddccee3657134f8b82a87294f76c833b445aef06e205ecaf67e0/rotate-backups-4.1.tar.gz" } ], "4.2": [ { "comment_text": "", "digests": { "md5": "d8dbec27db457107b2f1d6ddd6bdb84e", "sha256": "958d715b9a4bdc04e664e06c131591dc124fc0ad09e78f5fc0f734696b89adb0" }, "downloads": -1, "filename": "rotate_backups-4.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "d8dbec27db457107b2f1d6ddd6bdb84e", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 30132, "upload_time": "2016-08-04T23:49:34", "url": "https://files.pythonhosted.org/packages/ed/95/3eb69b7cb940d296b165c285befde4ff24772f5be538be54b8d7def754f3/rotate_backups-4.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "daf9a329dda1a72b7c096c1e215e5526", "sha256": "a6dc1b478a1300d213367efd853c07b0739dfa1c93bd14aa26a0770786b0eec0" }, "downloads": -1, "filename": "rotate-backups-4.2.tar.gz", "has_sig": false, "md5_digest": "daf9a329dda1a72b7c096c1e215e5526", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 27585, "upload_time": "2016-08-04T23:49:37", "url": "https://files.pythonhosted.org/packages/25/0f/45400761e5d4f0bf447cc1a21c8c6b403264eef10cd56618c26bcf1d6ceb/rotate-backups-4.2.tar.gz" } ], "4.3": [ { "comment_text": "", "digests": { "md5": "26d70f8be4c4c68be3f6d71d76f96685", "sha256": "c71170fa2c5cb40214cb63cef37cc3b696582f6676918517eec97654ea858a20" }, "downloads": -1, "filename": "rotate_backups-4.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "26d70f8be4c4c68be3f6d71d76f96685", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 30517, "upload_time": "2016-10-31T22:55:40", "url": "https://files.pythonhosted.org/packages/7d/32/f46d2afa67efc5623363b3ab41deba027d02eee1045ab625909693c98a4b/rotate_backups-4.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c725be5974928d16a40f3cb592aebf87", "sha256": "8824f97f3e928f46728749669b039d994e88cd7c583ebb7f83f4325b892ab794" }, "downloads": -1, "filename": "rotate-backups-4.3.tar.gz", "has_sig": false, "md5_digest": "c725be5974928d16a40f3cb592aebf87", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 28013, "upload_time": "2016-10-31T22:55:42", "url": "https://files.pythonhosted.org/packages/c1/e2/3808925193242975ec9da8e4fab83cdaacadfb1ef29e1921018155ae64f0/rotate-backups-4.3.tar.gz" } ], "4.3.1": [ { "comment_text": "", "digests": { "md5": "0ce947504fab49a46398b6d848686334", "sha256": "fbb1328166fa591d45dbfde063614163d673029c0a9627292271507491dc38d9" }, "downloads": -1, "filename": "rotate_backups-4.3.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "0ce947504fab49a46398b6d848686334", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 30566, "upload_time": "2017-04-13T18:56:30", "url": "https://files.pythonhosted.org/packages/45/ff/ace80e8e02a2a1aacd822a965f6b26c47fad78d3195ec5867ff9eb12a090/rotate_backups-4.3.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2ed3678c7c5b21881ae967479d436ff7", "sha256": "5dedf8ada64f24883be060af78f51c7750221fc5a3616cdf0cff916370d1de55" }, "downloads": -1, "filename": "rotate-backups-4.3.1.tar.gz", "has_sig": false, "md5_digest": "2ed3678c7c5b21881ae967479d436ff7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26083, "upload_time": "2017-04-13T18:56:31", "url": "https://files.pythonhosted.org/packages/ae/da/7e52370b55819616d44c4c9ff07aa889bdfac773f445eae77b217b143a49/rotate-backups-4.3.1.tar.gz" } ], "4.4": [ { "comment_text": "", "digests": { "md5": "2bf8e15cf0f6d5d03eec6cc545024f09", "sha256": "fdd43d930b284f0ecb2841adff7b8b61c9001ed584042a69e4c48ad924da40be" }, "downloads": -1, "filename": "rotate_backups-4.4-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "2bf8e15cf0f6d5d03eec6cc545024f09", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 30423, "upload_time": "2017-04-13T21:49:59", "url": "https://files.pythonhosted.org/packages/7b/bd/7555bcff31c5a0ab5b1eab3bafa7e537ee686b62e1b1bff3215f2424927b/rotate_backups-4.4-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6743cd8bf8a56f05b0f8c8821806a541", "sha256": "06a76b0c9b230e0b9de4ec19b6759193b0220b935d660daded77bbc0c0e28d61" }, "downloads": -1, "filename": "rotate-backups-4.4.tar.gz", "has_sig": false, "md5_digest": "6743cd8bf8a56f05b0f8c8821806a541", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 25990, "upload_time": "2017-04-13T21:50:02", "url": "https://files.pythonhosted.org/packages/54/0e/182a3fd0769689d3e8b4c1ed2b97da795628b7def378458aea4e5d25f403/rotate-backups-4.4.tar.gz" } ], "5.0": [ { "comment_text": "", "digests": { "md5": "8bdd2785baf6accdabbb406749b6920f", "sha256": "3c0293a4e8dc51e3723588010a52a09a370d0ad74b6fcb63009f6ec2508fe2c0" }, "downloads": -1, "filename": "rotate_backups-5.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "8bdd2785baf6accdabbb406749b6920f", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 30501, "upload_time": "2018-03-28T23:44:54", "url": "https://files.pythonhosted.org/packages/6a/85/4ee37b0134ddb2894387392864a5baaacd3e97bb114f2adc9e516ce8fc03/rotate_backups-5.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5606ac0a9fcf46f497032154b9d88be1", "sha256": "9c4f06bf34824f83f62f405f79fd160ff5ac4d49a7c1f2af8b0a928eaeb840f2" }, "downloads": -1, "filename": "rotate-backups-5.0.tar.gz", "has_sig": false, "md5_digest": "5606ac0a9fcf46f497032154b9d88be1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 27425, "upload_time": "2018-03-28T23:44:55", "url": "https://files.pythonhosted.org/packages/5a/08/c9190602f6d3ad07281e9c49e925f54ec4b8fcb5720d6a3748d94c276d0d/rotate-backups-5.0.tar.gz" } ], "5.1": [ { "comment_text": "", "digests": { "md5": "6d6bb7bef74bbbecf02f66623ead148f", "sha256": "338061a197f1355e18ee584252513826ee6b343de0e942b934c58e180db18e87" }, "downloads": -1, "filename": "rotate_backups-5.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "6d6bb7bef74bbbecf02f66623ead148f", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 31873, "upload_time": "2018-04-26T23:03:44", "url": "https://files.pythonhosted.org/packages/02/78/0a36c983cfa5ed8c11c5d0b50b4b5cd4f399fd45c47afc8bebc6377d49fb/rotate_backups-5.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "782858d9136eb659cf9efbff88c61767", "sha256": "907047f062e5af15b118123894153337e91dc7e1671ad68308c504923434d450" }, "downloads": -1, "filename": "rotate-backups-5.1.tar.gz", "has_sig": false, "md5_digest": "782858d9136eb659cf9efbff88c61767", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 31643, "upload_time": "2018-04-26T23:03:45", "url": "https://files.pythonhosted.org/packages/42/fc/05b9aef62203171e1fd560e021257c4ee5c71ed1a0075abba5e7ad63aa69/rotate-backups-5.1.tar.gz" } ], "5.2": [ { "comment_text": "", "digests": { "md5": "854f70566969ed447653bdf991f8db37", "sha256": "40cf0407185c6fb1338a506ba8306336218edd1375fa2e1db86ba74a8ffd1b9e" }, "downloads": -1, "filename": "rotate_backups-5.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "854f70566969ed447653bdf991f8db37", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 32729, "upload_time": "2018-04-27T19:47:20", "url": "https://files.pythonhosted.org/packages/33/f5/3fe6f036e1b2b247492b5844722ee76c27e31757245d208732a03d68000e/rotate_backups-5.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "fe7a914e4dbdd8d9d83c456aee79ea66", "sha256": "8afffc2f7a8839753a4aa386eb041f75077cc9cb47b0fad50204bedf3525edf0" }, "downloads": -1, "filename": "rotate-backups-5.2.tar.gz", "has_sig": false, "md5_digest": "fe7a914e4dbdd8d9d83c456aee79ea66", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 32541, "upload_time": "2018-04-27T19:47:22", "url": "https://files.pythonhosted.org/packages/ab/36/fa8e42da90be1553954b76dcb3ff771c8fba3bdec199d2ec13e5a4841b4b/rotate-backups-5.2.tar.gz" } ], "5.3": [ { "comment_text": "", "digests": { "md5": "d380fd13f8dc7def1a265279329e7ef0", "sha256": "11ff68c1012ebde5742d28696f7302d8edf481dd458467cd6369b36304afaee2" }, "downloads": -1, "filename": "rotate_backups-5.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "d380fd13f8dc7def1a265279329e7ef0", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 26364, "upload_time": "2018-08-02T22:27:12", "url": "https://files.pythonhosted.org/packages/f1/75/088f099282402785c38fb19159548ef5d231beea4b8b8fdcc4c30637cc87/rotate_backups-5.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7d836382609c68b6345187c04b2132a2", "sha256": "6a214039685d1eb7e9578175d8a3d96efdf414c56079b97a73a6456f5ff14531" }, "downloads": -1, "filename": "rotate-backups-5.3.tar.gz", "has_sig": false, "md5_digest": "7d836382609c68b6345187c04b2132a2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 34249, "upload_time": "2018-08-02T22:27:14", "url": "https://files.pythonhosted.org/packages/a1/d9/5babd6bdc71e8f3eb85012bdd69531d4fa11eee368b709964179d9bd6260/rotate-backups-5.3.tar.gz" } ], "6.0": [ { "comment_text": "", "digests": { "md5": "d6b0984a7cadf67efc58201904eda62c", "sha256": "70436f6f909b4d4c8aa5ea1cced2b7128d67ab267a3af8c2392198a0903b6208" }, "downloads": -1, "filename": "rotate_backups-6.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "d6b0984a7cadf67efc58201904eda62c", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 26561, "upload_time": "2018-08-02T22:53:04", "url": "https://files.pythonhosted.org/packages/c2/65/9cd9c34c1f0a7d8671603779f49326fee9583556b9edf558ce7a2a34bd81/rotate_backups-6.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d187cd09ca4f77ee33ce5e4198ddd340", "sha256": "f342d87ed7e13df132110011985eb781a83ab4a4649c99de4cbd4573950dcc58" }, "downloads": -1, "filename": "rotate-backups-6.0.tar.gz", "has_sig": false, "md5_digest": "d187cd09ca4f77ee33ce5e4198ddd340", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 34675, "upload_time": "2018-08-02T22:53:06", "url": "https://files.pythonhosted.org/packages/a6/67/30be1c91a4da9cf49ef982f8c81ac6d6ad07ba13ee281ce5881cb6dba20a/rotate-backups-6.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "d6b0984a7cadf67efc58201904eda62c", "sha256": "70436f6f909b4d4c8aa5ea1cced2b7128d67ab267a3af8c2392198a0903b6208" }, "downloads": -1, "filename": "rotate_backups-6.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "d6b0984a7cadf67efc58201904eda62c", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 26561, "upload_time": "2018-08-02T22:53:04", "url": "https://files.pythonhosted.org/packages/c2/65/9cd9c34c1f0a7d8671603779f49326fee9583556b9edf558ce7a2a34bd81/rotate_backups-6.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d187cd09ca4f77ee33ce5e4198ddd340", "sha256": "f342d87ed7e13df132110011985eb781a83ab4a4649c99de4cbd4573950dcc58" }, "downloads": -1, "filename": "rotate-backups-6.0.tar.gz", "has_sig": false, "md5_digest": "d187cd09ca4f77ee33ce5e4198ddd340", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 34675, "upload_time": "2018-08-02T22:53:06", "url": "https://files.pythonhosted.org/packages/a6/67/30be1c91a4da9cf49ef982f8c81ac6d6ad07ba13ee281ce5881cb6dba20a/rotate-backups-6.0.tar.gz" } ] }