{ "info": { "author": "Daniel Farina", "author_email": "daniel@fdr.io", "bugtrack_url": null, "classifiers": [ "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Topic :: Database", "Topic :: System :: Archiving", "Topic :: System :: Recovery Tools" ], "description": "WAL-E\n=====\n---------------------------------\nContinuous archiving for Postgres\n---------------------------------\n\nWAL-E is a program designed to perform continuous archiving of\nPostgreSQL WAL files and base backups.\n\nTo correspond on using WAL-E or to collaborate on its development, do\nnot hesitate to send mail to the mailing list at\nwal-e@googlegroups.com (`archives and subscription settings`_).\nGithub issues are also currently being used to track known problems,\nso please feel free to submit those.\n\n\n.. contents:: Table of Contents\n\n.. _archives and subscription settings:\n https://groups.google.com/forum/#!forum/wal-e\n\n\nInstallation\n------------\n\nIf no up-to-date packages are available to you via a package manager,\nthis command can work on most operating systems::\n\n sudo python3 -m pip install wal-e[aws,azure,google,swift]\n\nYou can omit storage services you do not wish to use from the above\nlist.\n\n\nPrimary Commands\n----------------\n\nWAL-E has these key commands:\n\n* backup-fetch\n* backup-push\n* wal-fetch\n* wal-push\n* `delete`_\n\nAll of these operators work in a context of several environment\nvariables that WAL-E reads. The variables set depend on the storage\nprovider being used, and are detailed below.\n\nWAL-E's organizing concept is the `PREFIX`. Prefixes must be set\nuniquely for each *writing* database, and prefix all objects stored\nfor a given database. For example: ``s3://bucket/databasename``.\n\nOf these, the \"push\" operators send backup data to storage and \"fetch\"\noperators get backup data from storage.\n\n``wal`` commands are called by Postgres's ``archive_command`` and\n``restore_command`` to fetch or pull write ahead log, and ``backup``\ncommands are used to fetch or push a hot backup of the base database\nthat WAL segments can be applied to. Finally, the ``delete`` command\nis used to prune the archives as to retain a finite number of backups.\n\nAWS S3 and Work-alikes\n''''''''''''''''''''''\n\n* WALE_S3_PREFIX (e.g. ``s3://bucket/path/optionallymorepath``)\n* AWS_ACCESS_KEY_ID\n* AWS_SECRET_ACCESS_KEY\n* AWS_REGION (e.g. ``us-east-1``)\n\nOptional:\n\n* WALE_S3_ENDPOINT: See `Manually specifying the S3 Endpoint`_\n* AWS_SECURITY_TOKEN: When using AWS STS\n* Pass ``--aws-instance-profile`` to gather credentials from the\n Instance Profile. See `Using AWS IAM Instance Profiles`.\n\n\nAzure Blob Store\n''''''''''''''''\nExample below is based on the following blob storage in Azure in the\nresource group ``resgroup`` :\nhttps://store1.blob.core.windows.net/container1/nextpath\n\n* WALE_WABS_PREFIX (e.g. ``wabs://container1/nextpath``)\n* WABS_ACCOUNT_NAME (e.g. ``store1``)\n* WABS_ACCESS_KEY (Use key1 from running ``azure storage account keys\n list store1 --resource-group resgroup`` You will need to have the\n Azure CLI installed for this to work.)\n* WABS_SAS_TOKEN (You only need this if you have not provided an\n WABS_ACCESS_KEY)\n\n\nGoogle Storage\n''''''''''''''\n\n* WALE_GS_PREFIX (e.g. ``gs://bucket/path/optionallymorepath``)\n* GOOGLE_APPLICATION_CREDENTIALS\n\nSwift\n'''''\n\n* WALE_SWIFT_PREFIX (e.g. ``swift://container/path/optionallymorepath``)\n* SWIFT_AUTHURL\n* SWIFT_TENANT\n* SWIFT_USER\n* SWIFT_PASSWORD\n\nOptional Variables:\n\n* SWIFT_AUTH_VERSION which defaults to ``2``. Some object stores such as\n Softlayer require version ``1``.\n* SWIFT_ENDPOINT_TYPE defaults to ``publicURL``, this may be set to\n ``internalURL`` on object stores like Rackspace Cloud Files in order\n to use the internal network.\n\nFile System\n'''''''''''\n\n* WALE_FILE_PREFIX (e.g. ``file://localhost/backups/pg``)\n\n.. IMPORTANT::\n Ensure that all writing servers have different _PREFIXes set.\n Reuse of a value between two, writing databases will likely cause\n unrecoverable backups.\n\n\nDependencies\n------------\n\n* python (>= 3.4)\n* lzop\n* psql (>= 8.4)\n* pv\n\nThis software also has Python dependencies: installing with ``pip``\nwill attempt to resolve them:\n\n* gevent>=1.1.1\n* boto>=2.40.0\n* azure>=1.0.3\n* google-cloud-storage>=1.4.0\n* python-swiftclient>=3.0.0\n* python-keystoneclient>=3.0.0\n\nIt is possible to use WAL-E without the dependencies of back-end\nstorage one does not use installed: the imports for those are only\nperformed if the storage configuration demands their use.\n\nExamples\n--------\n\nPushing a base backup to S3::\n\n $ AWS_SECRET_ACCESS_KEY=... wal-e \\\n -k AWS_ACCESS_KEY_ID \\\n --s3-prefix=s3://some-bucket/directory/or/whatever \\\n backup-push /var/lib/my/database\n\nSending a WAL segment to WABS::\n\n $ WABS_ACCESS_KEY=... wal-e \\\n -a WABS_ACCOUNT_NAME \\\n --wabs-prefix=wabs://some-bucket/directory/or/whatever \\\n wal-push /var/lib/my/database/pg_xlog/WAL_SEGMENT_LONG_HEX\n\nPush a base backup to Swift::\n\n $ WALE_SWIFT_PREFIX=\"swift://my_container_name\" \\\n SWIFT_AUTHURL=\"http://my_keystone_url/v2.0/\" \\\n SWIFT_TENANT=\"my_tennant\" \\\n SWIFT_USER=\"my_user\" \\\n SWIFT_PASSWORD=\"my_password\" wal-e \\\n backup-push /var/lib/my/database\n\nPush a base backup to Google Cloud Storage::\n\n $ WALE_GS_PREFIX=\"gs://some-bucket/directory-or-whatever\" \\\n GOOGLE_APPLICATION_CREDENTIALS=... \\\n wal-e backup-push /var/lib/my/database\n\nIt is generally recommended that one use some sort of environment\nvariable management with WAL-E: working with it this way is less verbose,\nless prone to error, and less likely to expose secret information in\nlogs.\n\n.. _archive_command: http://www.postgresql.org/docs/8.3/static/runtime-config-wal.html#GUC-ARCHIVE-COMMAND>\n\nenvdir_, part of the daemontools_ package is one recommended approach\nto setting environment variables. One can prepare an\nenvdir-compatible directory like so::\n\n # Assumption: the group is trusted to read secret information\n # S3 Setup\n $ umask u=rwx,g=rx,o=\n $ mkdir -p /etc/wal-e.d/env\n $ echo \"secret-key-content\" > /etc/wal-e.d/env/AWS_SECRET_ACCESS_KEY\n $ echo \"access-key\" > /etc/wal-e.d/env/AWS_ACCESS_KEY_ID\n $ echo 's3://some-bucket/directory/or/whatever' > \\\n /etc/wal-e.d/env/WALE_S3_PREFIX\n $ chown -R root:postgres /etc/wal-e.d\n\n\n # Assumption: the group is trusted to read secret information\n # WABS Setup\n $ umask u=rwx,g=rx,o=\n $ mkdir -p /etc/wal-e.d/env\n $ echo \"secret-key-content\" > /etc/wal-e.d/env/WABS_ACCESS_KEY\n $ echo \"access-key\" > /etc/wal-e.d/env/WABS_ACCOUNT_NAME\n $ echo 'wabs://some-container/directory/or/whatever' > \\\n /etc/wal-e.d/env/WALE_WABS_PREFIX\n $ chown -R root:postgres /etc/wal-e.d\n\nAfter having done this preparation, it is possible to run WAL-E\ncommands much more simply, with less risk of accidentally using\nincorrect values::\n\n $ envdir /etc/wal-e.d/env wal-e backup-push ...\n $ envdir /etc/wal-e.d/env wal-e wal-push ...\n\nenvdir is conveniently combined with the archive_command functionality\nused by PostgreSQL to enable continuous archiving. To enable\ncontinuous archiving, one needs to edit ``postgresql.conf`` and\nrestart the server. The important settings to enable continuous\narchiving are related here::\n\n wal_level = archive # hot_standby and logical in 9.x is also acceptable\n archive_mode = on\n archive_command = 'envdir /etc/wal-e.d/env wal-e wal-push %p'\n archive_timeout = 60\n\nEvery segment archived will be noted in the PostgreSQL log.\n\n.. WARNING::\n PostgreSQL users can check the pg_settings table and see the\n archive_command employed. Do not put secret information into\n postgresql.conf for that reason, and use envdir instead.\n\nA base backup (via ``backup-push``) can be uploaded at any time, but\nthis must be done at least once in order to perform a restoration. It\nmust be done again if you decided to skip archiving any WAL segments:\nreplication will not be able to continue if there are any gaps in the\nstored WAL segments.\n\n.. _envdir: http://cr.yp.to/daemontools/envdir.html\n.. _daemontools: http://cr.yp.to/daemontools.html\n\n\nPrimary Commands\n----------------\n``backup-push``, ``backup-fetch``, ``wal-push``, ``wal-fetch`` represent\nthe primary functionality of WAL-E and must reside on the database machine.\nUnlike ``wal-push`` and ``wal-fetch`` commands, which function as described\nabove, the ``backup-push`` and ``backup-fetch`` require a little additional\nexplanation.\n\nbackup-push\n'''''''''''\n\nBy default ``backup-push`` will include all user defined tablespaces in\nthe database backup. please see the ``backup-fetch`` section below for\nWAL-E's tablespace restoration behavior.\n\nbackup-fetch\n''''''''''''\n\nUse ``backup-fetch`` to restore a base backup from storage.\n\nThis command makes use of the ``LATEST`` pseudo-backup-name to find a\nbackup to download::\n\n $ envdir /etc/wal-e.d/fetch-env wal-e \\\n --s3-prefix=s3://some-bucket/directory/or/whatever \\\n backup-fetch /var/lib/my/database LATEST\n\nAlso allowed is naming a backup specifically as seen in\n``backup-list``, which can be useful for restoring older backups for\nthe purposes of point in time recovery::\n\n $ envdir /etc/wal-e.d/fetch-env wal-e \\\n --s3-prefix=s3://some-bucket/directory/or/whatever \\\n backup-fetch \\\n /var/lib/my/database base_LONGWALNUMBER_POSITION_NUMBER\n\nOne will need to provide a `recovery.conf`_ file to recover WAL\nsegments associated with the backup. In short, `recovery.conf`_ needs\nto be created in the Postgres's data directory with content like::\n\n restore_command = 'envdir /etc/wal-e.d/env wal-e wal-fetch %f %p'\n standby_mode = on\n\n.. _recovery.conf: https://www.postgresql.org/docs/current/static/recovery-config.html\n\nA database with such a `recovery.conf` set will poll WAL-E storage for\nWAL indefinitely. You can exit recovery by running `pg_ctl promote`_.\n\nIf you wish to perform Point In Time Recovery (PITR) can add `recovery\ntargets`_ to `recovery.conf`_, looking like this::\n\n recovery_target_time = '2017-02-01 19:58:55'\n\nThere are several other ways to specify recovery target,\ne.g. transaction id.\n\nRegardless of recovery target, the result by default is Postgres will\npause recovery at this time, allowing inspection before promotion.\nSee `recovery targets`_ for details on how to customize what happens\nwhen the target criterion is reached.\n\n.. _pg_ctl promote: https://www.postgresql.org/docs/current/static/app-pg-ctl.html\n.. _recovery targets: https://www.postgresql.org/docs/current/static/recovery-target-settings.html\n\nTablespace Support\n******************\n\nIf and only if you are using Tablespaces, you will need to consider\nadditional issues on how run ``backup-fetch``. The options are:\n\n* User-directed Restore\n\n WAL-E expects that tablespace symlinks will be in place prior to a\n ``backup-fetch`` run. This means prepare your target path by\n insuring ``${PG_CLUSTER_DIRECTORY}/pg_tblspc`` contains all required\n symlinks before restoration time. If any expected symlink does not\n exist ``backup-fetch`` will fail.\n\n* Blind Restore\n\n If you are unable to reproduce tablespace storage structures prior\n to running ``backup-fetch`` you can set the option flag\n ``--blind-restore``. This will direct WAL-E to skip the symlink\n verification process and place all data directly in the\n ``${PG_CLUSTER_DIRECTORY}/pg_tblspc`` path.\n\n* Restoration Specification\n\n You can provide a restoration specification file to WAL-E using the\n ``backup-fetch`` ``--restore-spec RESTORE_SPEC`` option. This spec\n must be valid JSON and contain all contained tablespaces as well as\n the target storage path they require, and the symlink postgres\n expects for the tablespace. Here is an example for a cluster with a\n single tablespace::\n\n {\n \"12345\": {\n \"loc\": \"/data/postgres/tablespaces/tblspc001/\",\n \"link\": \"pg_tblspc/12345\"\n },\n \"tablespaces\": [\n \"12345\"\n ],\n }\n\n Given this information WAL-E will create the data storage directory\n and symlink it appropriately in\n ``${PG_CLUSTER_DIRECTORY}/pg_tblspc``.\n\n.. WARNING::\n ``\"link\"`` properties of tablespaces in the restore specification\n must contain the ``pg_tblspc`` prefix, it will not be added for you.\n\nAuxiliary Commands\n------------------\n\nThese are commands that are not used expressly for backup or WAL\npushing and fetching, but are important to the monitoring or\nmaintenance of WAL-E archived databases. Unlike the critical four\noperators for taking and restoring backups (``backup-push``,\n``backup-fetch``, ``wal-push``, ``wal-fetch``) that must reside on the\ndatabase machine, these commands can be productively run from any\ncomputer with the appropriate _PREFIX set and the necessary credentials to\nmanipulate or read data there.\n\n\nbackup-list\n'''''''''''\n\nbackup-list is useful for listing base backups that are complete for a\ngiven WAL-E context. Some fields are only filled in when the\n``--detail`` option is passed to ``backup-list`` [#why-detail-flag]_.\n\n.. NOTE::\n Some ``--detail`` only fields are not strictly to the right of\n fields that do not require ``--detail`` be passed. This is not a\n problem if one uses any CSV parsing library (as two tab-delimiters\n will be emitted) to signify the empty column, but if one is hoping\n to use string mangling to extract fields, exhibit care.\n\nFirstly, the fields that are filled in regardless of if ``--detail``\nis passed or not:\n\n================================ ====================================\n Header in CSV Meaning\n================================ ====================================\nname The name of the backup, which can be\n passed to the ``delete`` and\n ``backup-fetch`` commands.\n\nlast_modified The date and time the backup was\n completed and uploaded, rendered in\n an ISO-compatible format with\n timezone information.\n\nwal_segment_backup_start The wal segment number. It is a\n 24-character hexadecimal number.\n This information identifies the\n timeline and relative ordering of\n various backups.\n\nwal_segment_offset_backup_start The offset in the WAL segment that\n this backup starts at. This is\n mostly to avoid ambiguity in event\n of backups that may start in the\n same WAL segment.\n================================ ====================================\n\nSecondly, the fields that are filled in only when ``--detail`` is\npassed:\n\n================================ ====================================\n Header in CSV Meaning\n================================ ====================================\nexpanded_size_bytes The decompressed size of the backup\n in bytes.\n\nwal_segment_backup_stop The last WAL segment file required\n to bring this backup into a\n consistent state, and thus available\n for hot-standby.\n\nwal_segment_offset_backup_stop The offset in the last WAL segment\n file required to bring this backup\n into a consistent state.\n================================ ====================================\n\n.. [#why-detail-flag] ``backup-list --detail`` is slower (one web\n request per backup, rather than one web request per thousand\n backups or so) than ``backup-list``, and often (but not always) the\n information in the regular ``backup-list`` is all one needs.\n\ndelete\n''''''\n\n``delete`` contains additional subcommands that are used for deleting\ndata from storage for various reasons. These commands are organized\nseparately because the ``delete`` subcommand itself takes options that\napply to any subcommand that does deletion, such as ``--confirm``.\n\nAll deletions are designed to be reentrant and idempotent: there are\nno negative consequences if one runs several deletions at once or if\none resubmits the same deletion command several times, with or without\ncanceling other deletions that may be concurrent.\n\nThese commands have a ``dry-run`` mode that is the default. The\ncommand is basically optimized for not deleting data except in a very\nspecific circumstance to avoid operator error. Should a dry-run be\nperformed, ``wal-e`` will instead simply report every key it would\notherwise delete if it was not running in dry-run mode, along with\nprominent HINT-lines for every key noting that nothing was actually\ndeleted from the blob store.\n\nTo *actually* delete any data, one must pass ``--confirm`` to ``wal-e\ndelete``. If one passes both ``--dry-run`` and ``--confirm``, a dry\nrun will be performed, regardless of the order of options passed.\n\nCurrently, these kinds of deletions are supported. Examples omit\nenvironment variable configuration for clarity:\n\n* ``before``: Delete all backups and wal segment files before the\n given base-backup name. This does not include the base backup\n passed: it will remain a viable backup.\n\n Example::\n\n $ wal-e delete [--confirm] before base_00000004000002DF000000A6_03626144\n\n* ``retain``: Leave the given number of backups in place, and delete\n all base backups and wal segment files older than them.\n\n Example::\n\n $ wal-e delete [--confirm] retain 5\n\n* ``old-versions``: Delete all backups and wal file segments with an\n older format. This is only intended to be run after a major WAL-E\n version upgrade and the subsequent base-backup. If no base backup\n is successfully performed first, one is more exposed to data loss\n until one does perform a base backup.\n\n Example::\n\n $ wal-e delete [--confirm] old-versions\n\n* ``everything``: Delete all backups and wal file segments in the\n context. This is appropriate if one is decommissioning a database\n and has no need for its archives.\n\n Example::\n\n $ wal-e delete [--confirm] everything\n\n\nCompression and Temporary Files\n-------------------------------\n\nAll assets pushed to storage are run through the program \"lzop\" which\ncompresses the object using the very fast lzo compression algorithm.\nIt takes roughly 2 CPU seconds to compress a gigabyte, which when\nsending things to storage at about 25MB/s occupies about 5% CPU time.\nCompression ratios are expected to make file sizes 50% or less of the\noriginal file size in most cases, making backups and restorations\nconsiderably faster.\n\nBecause storage services generally require the Content-Length header\nof a stored object to be set up-front, it is necessary to completely\nfinish compressing an entire input file and storing the compressed\noutput in a temporary file. Thus, the temporary file directory needs\nto be big enough and fast enough to support this, although this tool\nis designed to avoid calling fsync(), so some memory can be leveraged.\n\nBase backups first have their files consolidated into disjoint tar\nfiles of limited length to avoid the relatively large per-file transfer\noverhead. This has the effect of making base backups and restores\nmuch faster when many small relations and ancillary files are\ninvolved.\n\n\nOther Options\n-------------\n\nEncryption\n''''''''''\n\nTo encrypt backups as well as compress them, first generate a key pair\nusing ``gpg --gen-key``. You don't need the private key on the machine\nto back up, but you will need it to restore. The private key may have\na password, but to restore, the password should be present in GPG\nagent. WAL-E does not support entering GPG passwords via a tty device.\n\nOnce this is done, set the ``WALE_GPG_KEY_ID`` environment variable or\nthe ``--gpg-key-id`` command line option to the ID of the secret key\nfor backup and restore commands.\n\nHere's an example of how you can restore with a private key that has a\npassword, by forcing decryption of an arbitrary file with the correct\nkey to unlock the GPG keychain::\n\n # This assumes you have \"keychain\" gpg-agent installed.\n eval $( keychain --eval --agents gpg )\n\n # If you want default gpg-agent, use this instead\n # eval $( gpg-agent --daemon )\n\n # Force storing the private key password in the agent. Here you\n # will need to enter the key password.\n export TEMPFILE=`tempfile`\n gpg --recipient \"$WALE_GPG_KEY_ID\" --encrypt \"$TEMPFILE\"\n gpg --decrypt \"$TEMPFILE\".gpg || exit 1\n\n rm \"$TEMPFILE\" \"$TEMPFILE\".gpg\n unset TEMPFILE\n\n # Now use wal-e to fetch the backup.\n wal-e backup-fetch [...]\n\n # If you have WAL segments encrypted, don't forget to add\n # restore_command to recovery.conf, e.g.\n #\n # restore_command = 'wal-e wal-fetch \"%f\" \"%p\"'\n\n # Start the restoration postgres server in a context where you have\n # gpg-agent's environment variables initialized, such as the current\n # shell.\n pg_ctl -D [...] start\n\n\nControlling the I/O of a Base Backup\n''''''''''''''''''''''''''''''''''''\n\nTo reduce the read load on base backups, they are sent through the\ntool ``pv`` first. To use this rate-limited-read mode, use the option\n``--cluster-read-rate-limit`` as seen in ``wal-e backup-push``.\n\nLogging\n'''''''\n\nWAL-E supports logging configuration with following environment\nvariables:\n\n* ``WALE_LOG_DESTINATION`` comma separated values, **syslog** and\n **stderr** are supported. The default is equivalent to:\n ``syslog,stderr``.\n\n* ``WALE_SYSLOG_FACILITY`` from ``LOCAL0`` to ``LOCAL7`` and ``USER``.\n\nTo restrict log statements to warnings and errors, use the ``--terse``\noption.\n\nIncreasing throughput of wal-push\n'''''''''''''''''''''''''''''''''\n\nIn certain situations, the ``wal-push`` process can take long enough\nthat it can't keep up with WAL segments being produced by Postgres,\nwhich can lead to unbounded disk usage and an eventual crash of the\ndatabase.\n\nOne can instruct WAL-E to pool WAL segments together and send them in\ngroups by passing the ``--pool-size`` parameter to ``wal-push``. This\ncan increase throughput significantly.\n\nAs of version 0.7.x, ``--pool-size`` defaults to 8.\n\n\nUsing AWS IAM Instance Profiles\n'''''''''''''''''''''''''''''''\n\nStoring credentials on AWS EC2 instances has usability and security\ndrawbacks. When using WAL-E with AWS S3 and AWS EC2, most uses of\nWAL-E would benefit from use with the `AWS Instance Profile feature`_,\nwhich automatically generates and rotates credentials on behalf of an\ninstance.\n\nTo instruct WAL-E to use these credentials for access to S3, pass the\n``--aws-instance-profile`` flag.\n\n.. _AWS Instance Profile feature:\n http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AESDG-chapter-instancedata.html\n\nInstance profiles may *not* be preferred in more complex scenarios\nwhen one has multiple AWS IAM policies written for multiple programs\nrun on an instance, or an existing key management infrastructure.\n\nManually specifying the S3 Endpoint\n'''''''''''''''''''''''''''''''''''\n\nIf one wishes to target WAL-E against an alternate S3 endpoint\n(e.g. Ceph RADOS), one can set the ``WALE_S3_ENDPOINT`` environment\nvariable. This can also be used take fine-grained control over\nendpoints and calling conventions with AWS.\n\nThe format is that of::\n\n protocol+convention://hostname:port\n\nWhere valid protocols are ``http`` and ``https``, and conventions are\n``path``, ``virtualhost``, and ``subdomain``.\n\nExample::\n\n # Turns off encryption and specifies us-west-1 endpoint.\n WALE_S3_ENDPOINT=http+path://s3-us-west-1.amazonaws.com:80\n\n # For radosgw.\n WALE_S3_ENDPOINT=http+path://hostname\n\n # As seen when using Deis, which uses radosgw.\n WALE_S3_ENDPOINT=http+path://deis-store-gateway:8888\n\nDevelopment\n-----------\n\nDevelopment is heavily reliant on the tool tox_ being existent within\nthe development environment. All additional dependencies of WAL-E are\nmanaged by tox_. In addition, the coding conventions are checked by\nthe tox_ configuration included with WAL-E.\n\nTo run the tests, run::\n\n $ tox -e py35\n\nTo run a somewhat more lengthy suite of integration tests that\ncommunicate with a real blob store account, one might run tox_ like\nthis::\n\n $ WALE_S3_INTEGRATION_TESTS=TRUE \\\n AWS_ACCESS_KEY_ID=[AKIA...] \\\n AWS_SECRET_ACCESS_KEY=[...] \\\n WALE_WABS_INTEGRATION_TESTS=TRUE \\\n WABS_ACCOUNT_NAME=[...] \\\n WABS_ACCESS_KEY=[...] \\\n WALE_GS_INTEGRATION_TESTS=TRUE \\\n GOOGLE_APPLICATION_CREDENTIALS=[~/my-credentials.json] \\\n tox -e py35 -- -n 8\n\nLooking carefully at the above, notice the ``-n 8`` added the tox_\ninvocation. This ``-n 8`` is after a ``--`` that indicates to tox_\nthat the subsequent arguments are for the underlying test program\npytest_.\n\nThis is to enable parallel test execution, which makes the integration\ntests complete a small fraction of the time it would take otherwise.\nIt is a design requirement of new tests that parallel execution not be\nsacrificed.\n\nCoverage testing can be used by combining any of these using\npytest-cov_, e.g.: ``tox -- --cov wal_e`` and\n``tox -- --cov wal_e --cov-report html; see htmlcov/index.html``.\n\n.. _tox: https://pypi.python.org/pypi/tox\n.. _pytest: https://pypi.python.org/pypi/pytest\n.. _unittest: http://docs.python.org/2/library/unittest.html\n.. _pytest-cov: https://pypi.python.org/pypi/pytest-cov\n", "description_content_type": null, "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/wal-e/wal-e", "keywords": "postgres postgresql database backup archive archiving s3 aws openstack swift wabs azure google gce gcs wal shipping", "license": "BSD", "maintainer": "", "maintainer_email": "", "name": "wal-e", "package_url": "https://pypi.org/project/wal-e/", "platform": "any", "project_url": "https://pypi.org/project/wal-e/", "project_urls": { "Homepage": "https://github.com/wal-e/wal-e" }, "release_url": "https://pypi.org/project/wal-e/1.1.0/", "requires_dist": null, "requires_python": "", "summary": "Continuous Archiving for Postgres", "version": "1.1.0" }, "last_serial": 3303788, "releases": { "0.5.12": [ { "comment_text": "", "digests": { "md5": "06daf6266f76d0375f419d2ff1621654", "sha256": "e77d236eb63ab06b01863595182755a2c66a317456e36aa8b4151d1debd7fd8f" }, "downloads": -1, "filename": "wal-e-0.5.12.tar.gz", "has_sig": false, "md5_digest": "06daf6266f76d0375f419d2ff1621654", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 61027, "upload_time": "2013-05-12T08:51:15", "url": "https://files.pythonhosted.org/packages/24/58/ea30717b9511b2388ddb9fa3e59de5751a2de3522b85e6b47701b95f3a27/wal-e-0.5.12.tar.gz" } ], "0.5.13": [ { "comment_text": "", "digests": { "md5": "ae9213959e748701cdc3de69e660ac73", "sha256": "e974997009c5b4e46aa4f2ca6111e8b805aeb895a79ae83f5fca737112b3b91a" }, "downloads": -1, "filename": "wal-e-0.5.13.tar.gz", "has_sig": false, "md5_digest": "ae9213959e748701cdc3de69e660ac73", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 60587, "upload_time": "2013-05-12T08:54:57", "url": "https://files.pythonhosted.org/packages/ab/42/e49057128e49767783a495993ea7630c7f09793640652d8e4e667cec4ed3/wal-e-0.5.13.tar.gz" } ], "0.5.14": [ { "comment_text": "", "digests": { "md5": "c253d6b4f5e16f8cbd0280c82e40ba36", "sha256": "c57f4fc83e141443ae3eb14084179c95240c3ec7280c404c160a24823c2d43f2" }, "downloads": -1, "filename": "wal-e-0.5.14.tar.gz", "has_sig": false, "md5_digest": "c253d6b4f5e16f8cbd0280c82e40ba36", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 59440, "upload_time": "2013-05-12T08:56:57", "url": "https://files.pythonhosted.org/packages/4c/6b/fe3b908ef639503aace8a443433b0c847bb99eff67bb271a656be876e206/wal-e-0.5.14.tar.gz" } ], "0.6.10": [ { "comment_text": "", "digests": { "md5": "f1be33427d777c1fad57c96b4e3edab5", "sha256": "c391c54ea9135ba9e3666dc222b0ed545d3fb0ab040c7ce43f3872c34e2f63a8" }, "downloads": -1, "filename": "wal-e-0.6.10.tar.gz", "has_sig": false, "md5_digest": "f1be33427d777c1fad57c96b4e3edab5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 63177, "upload_time": "2014-05-21T21:40:59", "url": "https://files.pythonhosted.org/packages/26/5a/168fc2ed957871cc1a52209b00629f8157e5420ae33f72d4a8a704e8529c/wal-e-0.6.10.tar.gz" } ], "0.6.2": [ { "comment_text": "", "digests": { "md5": "3d87c16fb41f4dd76c17c1638151f317", "sha256": "8adb1cc4deb4ab1f29313461b89cd4edb26557fcd02c8db2b81847c4c0f21bb0" }, "downloads": -1, "filename": "wal-e-0.6.2.tar.gz", "has_sig": false, "md5_digest": "3d87c16fb41f4dd76c17c1638151f317", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 42888, "upload_time": "2013-05-12T09:05:36", "url": "https://files.pythonhosted.org/packages/09/d4/9c680031c81e26bb66d8868bd20dbd236fddc64545f446bcb6f8de466746/wal-e-0.6.2.tar.gz" } ], "0.6.3": [ { "comment_text": "", "digests": { "md5": "f941e6aa74ef1bb4e341def74415a5cd", "sha256": "d6f35c82cd2a3467a6e4f0b85f59c5a2e76c28c60fc0946728236f030d8b0353" }, "downloads": -1, "filename": "wal-e-0.6.3.tar.gz", "has_sig": false, "md5_digest": "f941e6aa74ef1bb4e341def74415a5cd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 63871, "upload_time": "2013-07-29T17:07:21", "url": "https://files.pythonhosted.org/packages/ee/a5/a687dea8139a6d4080daa0e410b8b0ccecd1527923b89f7e97bf21415c97/wal-e-0.6.3.tar.gz" } ], "0.6.4": [ { "comment_text": "", "digests": { "md5": "18383bf8af50c3fc05f3400455f1e4a6", "sha256": "5e04f9a303cf60bee06fcfdce4005830760cb6af0eac85d4125448dfbcd9bede" }, "downloads": -1, "filename": "wal-e-0.6.4.tar.gz", "has_sig": false, "md5_digest": "18383bf8af50c3fc05f3400455f1e4a6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 63888, "upload_time": "2013-07-29T20:49:13", "url": "https://files.pythonhosted.org/packages/16/12/3a1cdbb381f51ccde6312e9999ff7850d5bb3d3ee9f7b0e4429939b9ab75/wal-e-0.6.4.tar.gz" } ], "0.6.5": [ { "comment_text": "", "digests": { "md5": "b96993007c4a17d934e9349e314ddb06", "sha256": "05fbfe9fb2ba498a7cd3775e58990e31008e506ba6291ec0a5fbe08ec612210c" }, "downloads": -1, "filename": "wal-e-0.6.5.tar.gz", "has_sig": false, "md5_digest": "b96993007c4a17d934e9349e314ddb06", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 87895, "upload_time": "2013-08-07T22:28:37", "url": "https://files.pythonhosted.org/packages/c5/e1/3988878b1ee317eff8efd5c9e4d60b161e92287470a203c059d5b3891ca7/wal-e-0.6.5.tar.gz" } ], "0.6.6": [ { "comment_text": "", "digests": { "md5": "60c6c2474967502a5d0531111d659cb9", "sha256": "f7d72227552e503a898c8a569942321ddbefd440b76ed542c016847b56dde9ab" }, "downloads": -1, "filename": "wal-e-0.6.6.tar.gz", "has_sig": false, "md5_digest": "60c6c2474967502a5d0531111d659cb9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 66799, "upload_time": "2013-11-27T07:55:51", "url": "https://files.pythonhosted.org/packages/88/73/b2385ffe79cb0d7e847d22e823a598ac87bb27951b94e39637929969f612/wal-e-0.6.6.tar.gz" } ], "0.6.7": [ { "comment_text": "", "digests": { "md5": "4acd48007a2a35d1af302c557981ca7c", "sha256": "1b5ab5106b261f74d185a2b545129115df7d8a78f5fd82f6d840e9c7d052acd0" }, "downloads": -1, "filename": "wal-e-0.6.7.tar.gz", "has_sig": false, "md5_digest": "4acd48007a2a35d1af302c557981ca7c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 60840, "upload_time": "2014-02-03T00:29:21", "url": "https://files.pythonhosted.org/packages/26/7f/0f7cb3c941b0bfb1ee168de0eaa687d4c493dd2e78c8f7c872362077fcf3/wal-e-0.6.7.tar.gz" } ], "0.6.8": [ { "comment_text": "", "digests": { "md5": "481c0c5bf4509eb08ef35ba97a3cf38f", "sha256": "a054b2b011fa6796334b9f05e62fabebdf9b9c70939db250943ae51736b59d4f" }, "downloads": -1, "filename": "wal-e-0.6.8.tar.gz", "has_sig": false, "md5_digest": "481c0c5bf4509eb08ef35ba97a3cf38f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 86391, "upload_time": "2014-02-03T01:32:53", "url": "https://files.pythonhosted.org/packages/f0/73/fb13a32e5d7b7ad62540cae24a38c9779deb2628ca88ff544e4949c619f8/wal-e-0.6.8.tar.gz" } ], "0.6.9": [ { "comment_text": "", "digests": { "md5": "4ff3a2f909c84dcdce09ad61bda8cbbe", "sha256": "ad7f052d34c67622a01863e6c9983e77161467613f6bb21380c385d5107356ac" }, "downloads": -1, "filename": "wal-e-0.6.9.tar.gz", "has_sig": false, "md5_digest": "4ff3a2f909c84dcdce09ad61bda8cbbe", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 62921, "upload_time": "2014-02-23T05:12:12", "url": "https://files.pythonhosted.org/packages/97/56/6ede4e8ab8466dfb9874f97e57fe6f483e44da86547e6d56654eb901713b/wal-e-0.6.9.tar.gz" } ], "0.7.0": [ { "comment_text": "", "digests": { "md5": "c804f59949f8d128043bae3770f61125", "sha256": "a3632bc562fb47ff66138dbdfebf11d60e75aaef303e4e5e9cffdaffc9151fc6" }, "downloads": -1, "filename": "wal-e-0.7.0.tar.gz", "has_sig": false, "md5_digest": "c804f59949f8d128043bae3770f61125", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 127412, "upload_time": "2014-03-31T23:53:02", "url": "https://files.pythonhosted.org/packages/a7/69/e55dde33a8812926e8c0c3ffffe260afb754480288366f1f699d1fbc955b/wal-e-0.7.0.tar.gz" } ], "0.7.1": [ { "comment_text": "", "digests": { "md5": "40d943e842c05363bb64720cb95bfa99", "sha256": "d03cf0f69957ad8dc47552e3ecb2361622f44c0f621630e38a15fe23d264e766" }, "downloads": -1, "filename": "wal-e-0.7.1.tar.gz", "has_sig": false, "md5_digest": "40d943e842c05363bb64720cb95bfa99", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 92030, "upload_time": "2014-05-21T21:40:34", "url": "https://files.pythonhosted.org/packages/36/d3/fc3880c013962bb3758e95282e91c1a19134dd674de10f0197a8ec0f168b/wal-e-0.7.1.tar.gz" } ], "0.7.2": [ { "comment_text": "", "digests": { "md5": "728e25a7389557d6800aecbb9b069195", "sha256": "2a7e99b9862f303dc10ade63939a91aafe38d7483a1028b5906b0c45d9c185d5" }, "downloads": -1, "filename": "wal-e-0.7.2.tar.gz", "has_sig": false, "md5_digest": "728e25a7389557d6800aecbb9b069195", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 92188, "upload_time": "2014-07-30T17:36:04", "url": "https://files.pythonhosted.org/packages/5c/58/198ee90d161af414ee11501e7127061f7eef1b61526a5faf3bd57093097d/wal-e-0.7.2.tar.gz" } ], "0.7.3": [ { "comment_text": "", "digests": { "md5": "6f15b92aa4b26d758575ad8e4bb97d80", "sha256": "82c8206d81c3a9be8e2798a57c86685c2590e6058c72e7d02904197c2c3d1550" }, "downloads": -1, "filename": "wal-e-0.7.3.tar.gz", "has_sig": false, "md5_digest": "6f15b92aa4b26d758575ad8e4bb97d80", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 92242, "upload_time": "2014-10-07T22:01:57", "url": "https://files.pythonhosted.org/packages/25/e7/fba66d484d8054f5f9b31d8ac86cc0332c6c3df3a4287325c9e6d374b56b/wal-e-0.7.3.tar.gz" } ], "0.8.0": [ { "comment_text": "", "digests": { "md5": "b08a30385faf968b3d61896d3d6ce24b", "sha256": "e009dcecc27dbd57ef637832e5bf291d4d1f8413e57977a1deced23c1a3626f4" }, "downloads": -1, "filename": "wal-e-0.8.0.tar.gz", "has_sig": false, "md5_digest": "b08a30385faf968b3d61896d3d6ce24b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 106587, "upload_time": "2015-03-24T23:33:21", "url": "https://files.pythonhosted.org/packages/85/e9/73c984ac33092408371998018b8f4f889e280cdb56a4e487e155bcbbe1c0/wal-e-0.8.0.tar.gz" } ], "0.8.1": [ { "comment_text": "", "digests": { "md5": "96f40adb7ff64c3712bc873ba6e4b79f", "sha256": "c7ee4ca77221a1af07b507de14af930a8ad4b7630280af3948e5803853504bf4" }, "downloads": -1, "filename": "wal-e-0.8.1.tar.gz", "has_sig": false, "md5_digest": "96f40adb7ff64c3712bc873ba6e4b79f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 101307, "upload_time": "2015-06-08T18:28:32", "url": "https://files.pythonhosted.org/packages/cd/87/26da43740f5e0c60b0284328793dc8094c90961f63ed1db641ac70b1c002/wal-e-0.8.1.tar.gz" } ], "0.9.0": [ { "comment_text": "", "digests": { "md5": "8b74eaa9ff9bf0f15de995155a647bc1", "sha256": "4c9c14f81ee0d2bc3f4df0dfda9786a93752736a136a5a3d824608b27be21793" }, "downloads": -1, "filename": "wal-e-0.9.0.tar.gz", "has_sig": false, "md5_digest": "8b74eaa9ff9bf0f15de995155a647bc1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 100284, "upload_time": "2016-03-04T22:52:26", "url": "https://files.pythonhosted.org/packages/d2/3c/8c33e815ed15e5f67e4d478793790a682c7dde257f30c3c4551cac199a26/wal-e-0.9.0.tar.gz" } ], "0.9.1": [ { "comment_text": "", "digests": { "md5": "469d9398a408ff2b519ec6f812625b8b", "sha256": "14354e5fb4b7b72557518c01ed33252db9e5d38d67ad5bd7651f0fda128accce" }, "downloads": -1, "filename": "wal-e-0.9.1.tar.gz", "has_sig": false, "md5_digest": "469d9398a408ff2b519ec6f812625b8b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 100477, "upload_time": "2016-04-13T19:58:59", "url": "https://files.pythonhosted.org/packages/12/f9/944572860c2c9ff11a4061938bf02db49a4bd68301949d7519b966c44716/wal-e-0.9.1.tar.gz" } ], "0.9.2": [ { "comment_text": "", "digests": { "md5": "85c227582853e5642e96c57f62826c79", "sha256": "01b590307231f29623cf58876e3f4751e71292d2e40cf3143dbc6bdf5ff0e341" }, "downloads": -1, "filename": "wal-e-0.9.2.tar.gz", "has_sig": false, "md5_digest": "85c227582853e5642e96c57f62826c79", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 100551, "upload_time": "2016-05-03T07:37:40", "url": "https://files.pythonhosted.org/packages/7a/67/4da340652303e3adb26f6e9aa97b2118dbe5cd17be87e8a21dff9e9bc507/wal-e-0.9.2.tar.gz" } ], "0.9a1": [ { "comment_text": "", "digests": { "md5": "0a799c5c8f681cb2d7060068a8f5b45e", "sha256": "07713916c5e9ffdcadb743e44d1f7c0ea712397d75b2ccd87121afa1b9a5c1ef" }, "downloads": -1, "filename": "wal-e-0.9a1.tar.gz", "has_sig": false, "md5_digest": "0a799c5c8f681cb2d7060068a8f5b45e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 100275, "upload_time": "2016-03-04T22:50:28", "url": "https://files.pythonhosted.org/packages/2d/c8/832e88505377ac89bcbec442512960bb4ba5115c1905c8a9fce53eaf71f7/wal-e-0.9a1.tar.gz" } ], "1.0.0": [ { "comment_text": "", "digests": { "md5": "28eb4b0e0548103c7397744b0c7853bd", "sha256": "f7bbd27e0a5f1d42dd73658a56b67e6ea47f2ca0a23fb1e4e720bdf9588ea8fa" }, "downloads": -1, "filename": "wal-e-1.0.0.tar.gz", "has_sig": false, "md5_digest": "28eb4b0e0548103c7397744b0c7853bd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 88250, "upload_time": "2016-10-04T20:12:08", "url": "https://files.pythonhosted.org/packages/af/7b/3876f37ad4db6c2f314302742505aa2a27d298cd25498726ba638c370ca7/wal-e-1.0.0.tar.gz" } ], "1.0.0a1": [ { "comment_text": "", "digests": { "md5": "21751041cfae3d1c19f53a60466594fa", "sha256": "b2d8d227b2628b82f929ea1c721c4705dd7a9d5f1fccff3273a01e85c7a0fdc3" }, "downloads": -1, "filename": "wal-e-1.0.0a1.tar.gz", "has_sig": false, "md5_digest": "21751041cfae3d1c19f53a60466594fa", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 88132, "upload_time": "2016-08-01T20:53:22", "url": "https://files.pythonhosted.org/packages/82/52/c7eeeead152754624c8721a85515901264887114f95f1d9301a3d1e155dc/wal-e-1.0.0a1.tar.gz" } ], "1.0.0a2": [ { "comment_text": "", "digests": { "md5": "b4ca213e7100cda125fdd171cd141bb4", "sha256": "1b356acfcb7b4b4fa0864b978a4f40d73a9a882ca09466a4ebcde9878d162f2c" }, "downloads": -1, "filename": "wal-e-1.0.0a2.tar.gz", "has_sig": false, "md5_digest": "b4ca213e7100cda125fdd171cd141bb4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 88246, "upload_time": "2016-08-25T23:51:48", "url": "https://files.pythonhosted.org/packages/bd/75/efc9e6de5ac55721a0e12722f7297886b32da99f27a485d4d7dfb31453e9/wal-e-1.0.0a2.tar.gz" } ], "1.0.0b1": [ { "comment_text": "", "digests": { "md5": "c52f2bb776e7653bde537224dadc564e", "sha256": "4c5555e208fa82854564611ab1e350f7bd74d9f42ce59547d9b459a54392dabd" }, "downloads": -1, "filename": "wal-e-1.0.0b1.tar.gz", "has_sig": false, "md5_digest": "c52f2bb776e7653bde537224dadc564e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 88253, "upload_time": "2016-09-06T20:30:50", "url": "https://files.pythonhosted.org/packages/31/e5/8a527b3f92a0bc146b55cbd526988f8dbbb2905f9a04ec857c1e6accde9e/wal-e-1.0.0b1.tar.gz" } ], "1.0.0rc1": [ { "comment_text": "", "digests": { "md5": "5f56ab9ab922566fb332b118289d398a", "sha256": "9f9f8168fefa0f5040fc2e428584c3595280731899e24d98a4f59737123d67c2" }, "downloads": -1, "filename": "wal-e-1.0.0rc1.tar.gz", "has_sig": false, "md5_digest": "5f56ab9ab922566fb332b118289d398a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 88281, "upload_time": "2016-09-20T17:04:20", "url": "https://files.pythonhosted.org/packages/e3/46/e18f4334d220cb98acc6d18110cabe759f12986f7fe545d3a25f07baa94f/wal-e-1.0.0rc1.tar.gz" } ], "1.0.1": [ { "comment_text": "", "digests": { "md5": "b3916360b711af2d278a12c1ea1e8cb9", "sha256": "d9db2d58354c8f5c8f1267de25757bf17d844798a5f6934a85f6ed93a60fd714" }, "downloads": -1, "filename": "wal-e-1.0.1.tar.gz", "has_sig": false, "md5_digest": "b3916360b711af2d278a12c1ea1e8cb9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 88294, "upload_time": "2016-10-25T00:44:39", "url": "https://files.pythonhosted.org/packages/86/70/0eec2642651db483eb96ba826d39d862b8e1e1c10ef04c80335b5e3ee70a/wal-e-1.0.1.tar.gz" } ], "1.0.2": [ { "comment_text": "", "digests": { "md5": "1ad52cf105a65d61346fec57dc4a1b83", "sha256": "3d805065b363fd33b8801358b50d3338de932d7c54d8ccb1534e03e2b0c44bcc" }, "downloads": -1, "filename": "wal-e-1.0.2.tar.gz", "has_sig": false, "md5_digest": "1ad52cf105a65d61346fec57dc4a1b83", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 88651, "upload_time": "2016-12-14T23:35:20", "url": "https://files.pythonhosted.org/packages/b9/2b/1eaab206789ab8d908ce6dad2d0615e4438d0dd4a841d69975b70ddacd88/wal-e-1.0.2.tar.gz" } ], "1.0.3": [ { "comment_text": "", "digests": { "md5": "912ed6d289d787149d1651d86d45202e", "sha256": "0209c2bd97c547a2339be6163c562e21da948ec401f8a82ddb003b18089107f2" }, "downloads": -1, "filename": "wal-e-1.0.3.tar.gz", "has_sig": false, "md5_digest": "912ed6d289d787149d1651d86d45202e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 88890, "upload_time": "2017-01-03T21:20:12", "url": "https://files.pythonhosted.org/packages/87/0c/82c611ab6be4253aea94b92b8c2b7f230fe9dbf8b82cca4df52b27e851a8/wal-e-1.0.3.tar.gz" } ], "1.1.0": [ { "comment_text": "", "digests": { "md5": "48427e5517668799b611dedecdf86cb0", "sha256": "1b49590a325a25b28471526d739d904428d6f2f20d1761364266a646181fa916" }, "downloads": -1, "filename": "wal-e-1.1.0.tar.gz", "has_sig": false, "md5_digest": "48427e5517668799b611dedecdf86cb0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 92943, "upload_time": "2017-11-03T17:27:57", "url": "https://files.pythonhosted.org/packages/d6/73/b210a8900d4fc8ef4e5b919f96358cdddcb2b909fcd81bf673b3c7f08aa6/wal-e-1.1.0.tar.gz" } ], "1.1.0b1": [ { "comment_text": "", "digests": { "md5": "6a643bd1d29ba27f0e5b7c76975e2227", "sha256": "d40edf6943ff332f79688caccd74ff744f31e7746bdf8646731d7730a2a451e0" }, "downloads": -1, "filename": "wal-e-1.1.0b1.tar.gz", "has_sig": false, "md5_digest": "6a643bd1d29ba27f0e5b7c76975e2227", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 89877, "upload_time": "2017-02-16T23:53:46", "url": "https://files.pythonhosted.org/packages/05/07/1dbb4560c895276437bf877d2b5cf7867e7a8e7011df100f2849a8f09f36/wal-e-1.1.0b1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "48427e5517668799b611dedecdf86cb0", "sha256": "1b49590a325a25b28471526d739d904428d6f2f20d1761364266a646181fa916" }, "downloads": -1, "filename": "wal-e-1.1.0.tar.gz", "has_sig": false, "md5_digest": "48427e5517668799b611dedecdf86cb0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 92943, "upload_time": "2017-11-03T17:27:57", "url": "https://files.pythonhosted.org/packages/d6/73/b210a8900d4fc8ef4e5b919f96358cdddcb2b909fcd81bf673b3c7f08aa6/wal-e-1.1.0.tar.gz" } ] }