{ "info": { "author": "Kai Lautaportti", "author_email": "kai.lautaportti@hexagonit.fi", "bugtrack_url": null, "classifiers": [ "Framework :: Buildout", "Framework :: Buildout :: Recipe", "Intended Audience :: Developers", "License :: OSI Approved :: Zope Public License", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3.2", "Programming Language :: Python :: 3.3", "Topic :: Software Development :: Build Tools", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "*******************************\nDownload recipe for zc.buildout\n*******************************\n\n.. contents::\n\nThe recipe downloads packages from the net and extracts them on the\nfilesystem. It is based on the gocept.download_ recipe with a few\nadditional features.\n\n * Github page: http://github.com/hexagonit/hexagonit.recipe.download\n * Clone URL: git://github.com/hexagonit/hexagonit.recipe.download.git\n * Issue tracker: http://github.com/hexagonit/hexagonit.recipe.download/issues\n * Travis build: |travis|\n\nSupported Python versions: 2.6, 2.7, 3.2, 3.3\n\nSupported zc.buildout versions: 1.x, 2.x\n\n.. |travis| image:: https://api.travis-ci.org/hexagonit/hexagonit.recipe.download.png\n\n.. _gocept.download: http://pypi.python.org/pypi/gocept.download\n\nDetailed Documentation\n**********************\n\nSupported options\n=================\n\nThe ``hexagonit.recipe.download`` recipe can be used to download and\nextract packages from the net. It supports the following options:\n\n``url``\n\n URL to the package that will be downloaded and extracted. The\n supported package formats include ``.tar.gz``, ``.tar.bz2``, and ``.zip``.\n (Anything that the stdlib ``zipfile`` and ``tarfile`` \n modules accept is OK; for example ``.war`` and ``.docx`` files.)\n The value must be a full URL,\n e.g. http://python.org/ftp/python/2.4.4/Python-2.4.4.tgz.\n\n``strip-top-level-dir``\n\n Switch to remove the top level directory from the\n extracted archive. This will work only if the archive has exactly\n one top level directory. Accepted values are 'true' or\n 'false'. Defaults to 'false'.\n\n``ignore-existing``\n\n Switch to ignore existing files and/or directories. By\n default, the extraction process fails if there is existing files\n or directories matching the ones from the archive. Enabling this\n option will skip these files/directories from the archive. When\n this recipe is uninstalled the ignored files/directories *will\n not* be removed. Accepted values are 'true' or 'false'. Defaults\n to 'false'.\n\n``md5sum``\n\n MD5 checksum for the package file. If available the MD5\n checksum of the downloaded package will be compared to this value\n and if the values do not match the execution of the recipe will\n fail.\n\n``destination``\n\n Path to a directory where the extracted contents of the package\n will be placed. If omitted, a directory will be created under the\n ``buildout['parts-directory']`` with the name of the section using\n the recipe.\n\n``download-only``\n\n When set to 'true', the recipe downloads the file without trying\n to extract it. This is useful for downloading non-tarball\n files. The ``strip-top-level-dir`` option will be ignored if this\n option is enabled. Defaults to ``false``.\n\n``mode``\n\n Sets the file mode on the downloaded file using the specified octal mode.\n This option has effect only if ``download-only`` is set to ``true``.\n New in version 1.7.0.\n\n``filename``\n\n Allows renaming the downloaded file when using ``download-only = true``.\n The downloaded file will still be placed under the ``destination``\n directory with the given filename. If ``download-only = false`` this\n option will be ignored. By default the original filename will be used. New\n in version 1.4.1.\n\n``hash-name``\n\n When set to 'true', passes the ``hash_name=True`` keyword parameter to the\n ``zc.buildout`` Download utility which in turn uses MD5 hashes to name the\n downloaded files. See the corresponding `documentation\n `_\n for details. Setting the parameter to ``false`` will use the original\n filename. Defaults to ``true``. New in version 1.4.0.\n\n``excludes``\n\n A list of newline separated path specifications to filter out files and\n directories while unpacking. The path specifications may contain Unix\n shell-style wildcards as implemented by the `fnmatch.fnmatch\n `_ function.\n\n For example, to limit the disk usage when downloading the Solr package the\n following configuration may be used to exclude the documentation and\n contrib from being unpacked::\n\n excludes =\n apache-solr-*/contrib/*\n apache-solr-*/docs/*\n\n``on-update``\n\n When set to ``true``, the recipe will re-run itself when updated by the\n buildout. Defaults to ``false``.\n New in version 1.7.0.\n\nThe recipe uses the zc.buildout\n`Download API `_\nto perform the actual download which allows additional configuration of the\ndownload process. You can use the\n`download-cache `_\noption to optionally cache downloaded files.\n\n\nSimple example\n==============\n\n >>> import os.path\n >>> testdata = join(os.path.dirname(__file__), 'testdata')\n >>> server = start_server(testdata)\n >>> mkdir(sample_buildout, 'downloads')\n\nIn the simplest form we can download a simple package and have it\nextracted in the parts directory.\n\n >>> write(sample_buildout, 'buildout.cfg',\n ... \"\"\"\n ... [buildout]\n ... newest = false\n ... parts = package1\n ...\n ... [package1]\n ... recipe = hexagonit.recipe.download\n ... url = {server}package1-1.2.3-final.tar.gz\n ... \"\"\".format(server=server))\n\nOk, let's run the buildout:\n\n >>> print(system(buildout))\n Installing package1.\n Downloading http://test.server/package1-1.2.3-final.tar.gz\n package1: Extracting package to /sample-buildout/parts/package1\n\nLet's take a look at the buildout parts directory now.\n\n >>> ls(sample_buildout, 'parts')\n d package1\n\nThe containing directory is named after our part name. Within this\ndirectory are the contents of the extracted package.\n\n >>> ls(sample_buildout, 'parts', 'package1')\n d package1-1.2.3-final\n\nThe package contained a single top level directory. Let's peek what's inside.\n\n >>> ls(sample_buildout, 'parts', 'package1', 'package1-1.2.3-final')\n - CHANGES.txt\n - README.txt\n d src\n\n >>> rmdir('downloads')\n\nSharing packages between buildouts\n==================================\n\nUsing the ``download-cache`` option in the buildout allows you to\nstore the downloaded packages in central location on your\nfilesystem. Using the the same location for the ``download-cache`` in\nmultiple buildouts will effectively share the packages between them\nand reduce the network traffic and storage requirements.\n\nLet's create a directory to be used as the download cache.\n\n >>> cache = tmpdir('cache')\n\nAnd create a new buildout that sets the ``buildout-cache`` option\naccordingly.\n\n >>> write(sample_buildout, 'buildout.cfg',\n ... \"\"\"\n ... [buildout]\n ... newest = false\n ... parts = sharedpackage\n ... download-cache = {cache}\n ...\n ... [sharedpackage]\n ... recipe = hexagonit.recipe.download\n ... url = {server}package1-1.2.3-final.tar.gz\n ... \"\"\".format(cache=cache, server=server))\n\nOk, let's run the buildout:\n\n >>> print(system(buildout))\n Uninstalling package1.\n Installing sharedpackage.\n Downloading http://test.server/package1-1.2.3-final.tar.gz\n sharedpackage: Extracting package to /sample-buildout/parts/sharedpackage\n\nWe can see that the package was placed under the shared container\ninstead of the default location under the buildout directory. By default the\nthe filename of the downloaded package is hashed.\n\n >>> rmdir(cache, 'dist')\n >>> ls(cache)\n - dfb1e3136ba092f200be0f9c57cf62ec\n\nWe can keep the original filename by setting the ``hash-name`` parameter to\n``false``. For readability all the following examples will have hashing\ndisabled.\n\n\nMD5 checksums\n=============\n\nThe downloaded package can be verified against an MD5 checksum. This will\nmake it easier to spot problems if the file has been changed.\n\nIf the checksum fails we get an error.\n\n >>> write(sample_buildout, 'buildout.cfg',\n ... \"\"\"\n ... [buildout]\n ... newest = false\n ... parts = package1\n ...\n ... [package1]\n ... recipe = hexagonit.recipe.download\n ... url = {server}package1-1.2.3-final.tar.gz\n ... md5sum = invalid\n ... hash-name = false\n ... \"\"\".format(server=server))\n\n >>> print(system(buildout))\n Uninstalling sharedpackage.\n Installing package1.\n Downloading http://test.server/package1-1.2.3-final.tar.gz\n While:\n Installing package1.\n Error: MD5 checksum mismatch downloading 'http://test.server/package1-1.2.3-final.tar.gz'\n\nUsing a valid checksum allows the recipe to proceed.\n\n >>> write(sample_buildout, 'buildout.cfg',\n ... \"\"\"\n ... [buildout]\n ... newest = false\n ... parts = package1\n ...\n ... [package1]\n ... recipe = hexagonit.recipe.download\n ... url = {server}package1-1.2.3-final.tar.gz\n ... md5sum = 821ecd681758d3fc03dcf76d3de00412\n ... hash-name = false\n ... \"\"\".format(server=server))\n\n >>> print(system(buildout))\n Installing package1.\n Downloading http://test.server/package1-1.2.3-final.tar.gz\n package1: Extracting package to /sample-buildout/parts/package1\n\n\nControlling the extraction process\n==================================\n\nWe can also extract the archive to any arbitrary location and have the\ntop level directory be stripped, which is often a useful feature.\n\n >>> tmpcontainer = tmpdir('otherplace')\n >>> write(sample_buildout, 'buildout.cfg',\n ... \"\"\"\n ... [buildout]\n ... newest = false\n ... parts = package1\n ...\n ... [package1]\n ... recipe = hexagonit.recipe.download\n ... url = {server}package1-1.2.3-final.tar.gz\n ... md5sum = 821ecd681758d3fc03dcf76d3de00412\n ... destination = {dest}\n ... strip-top-level-dir = true\n ... hash-name = false\n ... \"\"\".format(server=server, dest=tmpcontainer))\n\nRerunning the buildout now gives us\n\n >>> print(system(buildout))\n Uninstalling package1.\n Installing package1.\n Downloading http://test.server/package1-1.2.3-final.tar.gz\n package1: Extracting package to /otherplace\n\nTaking a look at the extracted contents we can also see that the\ntop-level directory has been stripped.\n\n >>> ls(tmpcontainer)\n - CHANGES.txt\n - README.txt\n d src\n\n\nPartial extraction over existing content\n========================================\n\nBy default, the recipe will fail if the destination where the package\nwill be extracted already contains files or directories also included\nin the package.\n\n >>> container = tmpdir('existing')\n >>> existingdir = mkdir(container, 'src')\n\n >>> write(sample_buildout, 'buildout.cfg',\n ... \"\"\"\n ... [buildout]\n ... newest = false\n ... parts = package1\n ...\n ... [package1]\n ... recipe = hexagonit.recipe.download\n ... url = {server}package1-1.2.3-final.tar.gz\n ... md5sum = 821ecd681758d3fc03dcf76d3de00412\n ... destination = {dest}\n ... strip-top-level-dir = true\n ... hash-name = false\n ... \"\"\".format(server=server, dest=container))\n\nRunning the buildout now will fail because of the existing ``src``\ndirectory in the destination.\n\n >>> print(system(buildout))\n Uninstalling package1.\n Installing package1.\n Downloading http://test.server/package1-1.2.3-final.tar.gz\n package1: Extracting package to /existing\n package1: Target /existing/src already exists. Either remove it or set ``ignore-existing = true`` in your buildout.cfg to ignore existing files and directories.\n While:\n Installing package1.\n Error: File or directory already exists.\n\nSetting the ``ignore-existing`` option will allow the recipe to\nproceed.\n\n >>> rmdir(container)\n >>> container = tmpdir('existing')\n >>> existingdir = mkdir(container, 'src')\n\n >>> write(sample_buildout, 'buildout.cfg',\n ... \"\"\"\n ... [buildout]\n ... newest = false\n ... parts = package1\n ...\n ... [package1]\n ... recipe = hexagonit.recipe.download\n ... url = {server}package1-1.2.3-final.tar.gz\n ... md5sum = 821ecd681758d3fc03dcf76d3de00412\n ... destination = {dest}\n ... strip-top-level-dir = true\n ... ignore-existing = true\n ... hash-name = false\n ... \"\"\".format(server=server, dest=container))\n\n >>> print(system(buildout))\n Installing package1.\n Downloading http://test.server/package1-1.2.3-final.tar.gz\n package1: Extracting package to /existing\n package1: Ignoring existing target: /existing/src\n\n >>> ls(container)\n - CHANGES.txt\n - README.txt\n d src\n\nAlso note that when the recipe is uninstalled the ignored targets will\nnot be removed as they are not part of the output of this recipe. We\ncan verify this by running the buildout again with a different\ndestination.\n\n >>> write(sample_buildout, 'buildout.cfg',\n ... \"\"\"\n ... [buildout]\n ... newest = false\n ... parts = package1\n ...\n ... [package1]\n ... recipe = hexagonit.recipe.download\n ... url = {server}package1-1.2.3-final.tar.gz\n ... md5sum = 821ecd681758d3fc03dcf76d3de00412\n ... strip-top-level-dir = true\n ... ignore-existing = true\n ... hash-name = false\n ... \"\"\".format(server=server))\n\n >>> print(system(buildout))\n Uninstalling package1.\n Installing package1.\n Downloading http://test.server/package1-1.2.3-final.tar.gz\n package1: Extracting package to /sample-buildout/parts/package1\n\nNow when we look into the directory containing the previous buildout\nwe can see that the ``src`` directory is still there but the rest of\nthe files are gone.\n\n >>> ls(container)\n d src\n\n\nExcluding package contents\n==========================\n\nIt is possible to exclude selected contents of the downloaded package from\nbeing extracted on the filesystem. The primary use case is to save disk space\nin case the package contains content which is not necessary.\n\nThe ``excludes`` option allows multiple filtering definitions and supports\nUnix shell-style wildcards for matching the package contents. The matching is\nimplemented using `fnmatch\n`_ and done in a\ncase-insensitive manner. Each filtering definition must be given on a separate\nline.\n\nIn the following example we will exclude the *CHANGES.txt* file and everything\nunder and including the *src* directory.\n\n >>> mkdir(sample_buildout, 'downloads')\n >>> write(sample_buildout, 'buildout.cfg',\n ... \"\"\"\n ... [buildout]\n ... newest = false\n ... parts = package1\n ... download-cache = downloads\n ...\n ... [package1]\n ... recipe = hexagonit.recipe.download\n ... url = {server}package1-1.2.3-final.tar.gz\n ... hash-name = false\n ... excludes =\n ... package1-*/CHANGES.txt\n ... package1-*/src*\n ... \"\"\".format(server=server))\n\nRunning the buildout will show how many files matched the configured excludes.\n\n >>> print(system(buildout))\n Uninstalling package1.\n Installing package1.\n Downloading http://test.server/package1-1.2.3-final.tar.gz\n package1: Excluding 3 file(s) matching the exclusion pattern.\n package1: Extracting package to /sample-buildout/parts/package1\n\nIncreasing the buildout verbosity with ``-vv`` will show the individual files\nthat got excluded.\n\n >>> rmdir('parts', 'package1')\n >>> print(system(buildout + ' -vv'))\n \n ...\n Uninstalling package1.\n ...\n Installing package1.\n Searching cache at /sample-buildout/downloads/\n Using cache file /sample-buildout/downloads/package1-1.2.3-final.tar.gz\n package1: Excluding package1-1.2.3-final/CHANGES.txt\n package1: Excluding package1-1.2.3-final/src\n package1: Excluding package1-1.2.3-final/src/foo.txt\n package1: Excluding 3 file(s) matching the exclusion pattern.\n package1: Extracting package to /sample-buildout/parts/package1\n\nViewing the unpacked package contents shows that the excluded paths are not\nthere.\n\n >>> ls(sample_buildout, 'parts', 'package1', 'package1-1.2.3-final')\n - README.txt\n\n\nOffline mode\n============\n\nIf the buildout is run in offline mode the recipe will still work if\nthe package is cached in the downloads directory. Otherwise the user\nwill be informed that downloading the file is not possible in offline\nmode.\n\n >>> write(sample_buildout, 'buildout.cfg',\n ... \"\"\"\n ... [buildout]\n ... newest = false\n ... parts = package1\n ... offline = true\n ... download-cache = downloads\n ...\n ... [package1]\n ... recipe = hexagonit.recipe.download\n ... url = {server}package1-1.2.3-final.tar.gz\n ... md5sum = 821ecd681758d3fc03dcf76d3de00412\n ... strip-top-level-dir = true\n ... hash-name = false\n ... \"\"\".format(server=server))\n\nLet's verify that we do have a cached copy in our downloads directory.\n\n >>> ls(sample_buildout, 'downloads')\n d dist\n - package1-1.2.3-final.tar.gz\n\n >>> print(system(buildout))\n Uninstalling package1.\n Installing package1.\n package1: Extracting package to /sample-buildout/parts/package1\n\nWhen we remove the file from the filesystem the recipe will not work.\n\n >>> remove(sample_buildout, 'downloads', 'package1-1.2.3-final.tar.gz')\n >>> write(sample_buildout, 'buildout.cfg',\n ... \"\"\"\n ... [buildout]\n ... newest = false\n ... parts = package1\n ... offline = true\n ...\n ... [package1]\n ... recipe = hexagonit.recipe.download\n ... url = {server}package1-1.2.3-final.tar.gz\n ... md5sum = 821ecd681758d3fc03dcf76d3de00412\n ... hash-name = false\n ... \"\"\".format(server=server))\n\n >>> print(system(buildout))\n Uninstalling package1.\n Installing package1.\n While:\n Installing package1.\n Error: Couldn't download 'http://test.server/package1-1.2.3-final.tar.gz' in offline mode.\n\n\nDownloading arbitrary files\n===========================\n\nWe can download any file when setting the ``download-only`` option to\n``true``. This will simply place the file in the ``destination``\ndirectory.\n\n >>> empty_download_cache(cache)\n >>> downloads = tmpdir('my-downloads')\n >>> write(sample_buildout, 'buildout.cfg',\n ... \"\"\"\n ... [buildout]\n ... newest = false\n ... parts = package\n ... download-cache = {cache}\n ...\n ... [package]\n ... recipe = hexagonit.recipe.download\n ... url = {server}package1-1.2.3-final.tar.gz\n ... md5sum = 821ecd681758d3fc03dcf76d3de00412\n ... destination = {dest}\n ... download-only = true\n ... \"\"\".format(server=server, dest=downloads, cache=cache))\n\n >>> print(system(buildout))\n Installing package.\n Downloading http://test.server/package1-1.2.3-final.tar.gz\n\nLooking into the destination directory we can see that the file was\ndownloaded but not extracted. Using the ``download-only`` option will\nwork for any file regardless of the type.\n\n >>> ls(downloads)\n - package1-1.2.3-final.tar.gz\n\nAs seen above, with ``download-only`` the original filename will be preserved\nregardless whether filename hashing is in use or not. However, the cached copy\nwill be hashed by default.\n\nThe downloaded files may also be renamed to better reflect their purpose using\nthe ``filename`` parameter.\n\n >>> empty_download_cache(cache)\n >>> write(sample_buildout, 'buildout.cfg',\n ... \"\"\"\n ... [buildout]\n ... newest = false\n ... parts = package\n ... download-cache = {cache}\n ...\n ... [package]\n ... recipe = hexagonit.recipe.download\n ... url = {server}package1-1.2.3-final.tar.gz\n ... md5sum = 821ecd681758d3fc03dcf76d3de00412\n ... destination = {dest}\n ... download-only = true\n ... filename = renamed-package-1.2.3.tgz\n ... \"\"\".format(server=server, dest=downloads, cache=cache))\n\n >>> print(system(buildout))\n Uninstalling package.\n Installing package.\n Downloading http://test.server/package1-1.2.3-final.tar.gz\n\n >>> ls(downloads)\n - renamed-package-1.2.3.tgz\n\nA mode can also be specified to set access permissions of the downloaded file.\nThis is the equivalent of the ``chmod`` shell command in Unix-like operating\nsystems, using octal mode only.\n\n >>> empty_download_cache(cache)\n >>> write(sample_buildout, 'buildout.cfg',\n ... \"\"\"\n ... [buildout]\n ... newest = false\n ... parts = package\n ... download-cache = {cache}\n ...\n ... [package]\n ... recipe = hexagonit.recipe.download\n ... url = {server}package1-1.2.3-final.tar.gz\n ... md5sum = 821ecd681758d3fc03dcf76d3de00412\n ... destination = {dest}\n ... download-only = true\n ... mode = 0654\n ... \"\"\".format(server=server, dest=downloads, cache=cache))\n\n >>> print(system(buildout))\n Uninstalling package.\n Installing package.\n Downloading http://test.server/package1-1.2.3-final.tar.gz\n\n >>> oct(os.stat(os.path.join(downloads, 'package1-1.2.3-final.tar.gz')).st_mode)[-4:]\n '0654'\n\n`Variable substitions\n`_ may be used\nwith the ``filename`` parameter to generate the resulting filename dynamically.\n\n >>> empty_download_cache(cache)\n >>> write(sample_buildout, 'buildout.cfg',\n ... \"\"\"\n ... [buildout]\n ... newest = false\n ... parts = package\n ... download-cache = %(cache)s\n ... example = foobar-1.2.3\n ...\n ... [package]\n ... recipe = hexagonit.recipe.download\n ... url = %(server)spackage1-1.2.3-final.tar.gz\n ... md5sum = 821ecd681758d3fc03dcf76d3de00412\n ... destination = %(dest)s\n ... download-only = true\n ... filename = ${:_buildout_section_name_}-${buildout:example}.tgz\n ... \"\"\" % dict(server=server, dest=downloads, cache=cache))\n\n >>> print(system(buildout))\n Uninstalling package.\n Installing package.\n Downloading http://test.server/package1-1.2.3-final.tar.gz\n\nIn this example we have used the section name and a value from the [buildout]\nsection to demonstrate the dynamic naming.\n\n >>> ls(downloads)\n - package-foobar-1.2.3.tgz\n\n\nRe-running install on update\n============================\n\nSetting the ``on-update`` flag to ``true`` will re-run the install process on\nbuildout update.\n\n >>> write(sample_buildout, 'buildout.cfg',\n ... \"\"\"\n ... [buildout]\n ... newest = false\n ... parts = package\n ...\n ... [package]\n ... recipe = hexagonit.recipe.download\n ... url = {server}package1-1.2.3-final.tar.gz\n ... md5sum = 821ecd681758d3fc03dcf76d3de00412\n ... download-only = true\n ... on-update = true\n ... \"\"\".format(server=server))\n\n >>> print(system(buildout))\n Uninstalling package.\n Installing package.\n Downloading http://test.server/package1-1.2.3-final.tar.gz\n\n\n >>> print(system(buildout))\n Updating package.\n Downloading http://test.server/package1-1.2.3-final.tar.gz\n\nChange History\n**************\n\n1.7.1 (2016-02-13)\n==================\n\n- Do not copy source to target when ignore-existing is set #30\n [mgrbyte]\n\n- Fix utf-8 error with Python 3.4 #32\n [thefunny42]\n\n\n1.7 (2013-04-07)\n================\n\n - New option, `mode`, to explicitly set the file mode of downloaded files when\n `download-only` is set to `true`. See\n https://github.com/hexagonit/hexagonit.recipe.download/pull/18\n [desaintmartin]\n\n - Travis CI support, see https://travis-ci.org/hexagonit/hexagonit.recipe.download\n [dokai]\n\n - Tox support for running tests.\n [dokai]\n\n - zc.buildout 2.x support. Latest versions of both 1.x and 2.x are supported.\n [toumorokoshi]\n\n - New option, `on-update`, which makes the recipe re-run itself on updates\n when set to `true`. Defaults to `false`. See\n https://github.com/hexagonit/hexagonit.recipe.download/pull/16\n [toumorokoshi]\n\n\n1.6 (2012-11-14)\n================\n\n - py3k support\n [iElectric]\n\n\n1.5.1 (2012-07-13)\n==================\n\n - Ensure that the temporary extraction directory gets deleted even if an error\n occurs later in the build. Previously it was possible for the temporary\n directory to fill up without limit. See\n https://github.com/hexagonit/hexagonit.recipe.download/pull/10 for details.\n [desaintmartin]\n\n - The download cache is no longer configured automatically because this could\n result in buildout errors if the default download cache directory was not\n created in time. See https://github.com/hexagonit/hexagonit.recipe.download/pull/9\n for details.\n [miano]\n\n1.5.0 (2011-01-26)\n==================\n\n - Implemented support for excluding paths while unpacking.\n [fschulze]\n\n - Reverted back to using ``zope.testing.doctest`` because on Python 2.4 the\n ``__file__`` variable is not available using stdlib ``doctest``. [dokai]\n\n - Fixed a spurious test failure because the results of ``ls()`` were\n unpredictable due to random filename hashing. [dokai]\n\n - Use the stdlib ``doctest`` module instead of ``zope.testing.doctest``.\n [dokai]\n\n1.4.1 (2010-04-08)\n==================\n\n - Implemented support for specifying the filename of a downloaded file when\n using ``download-only = true``. This closes\n http://github.com/hexagonit/hexagonit.recipe.download/issues#issue/3\n [dokai]\n\n - Fixed the filename handling for ``download-only = true``. The filename\n hashing introduced in 1.4.0 resulted in the names of the downloaded files\n to be hashed also. Now the original filename is preserved regardless\n whether filenames are hashed in the download cache. This closes\n http://github.com/hexagonit/hexagonit.recipe.download/issues#issue/2\n [dokai]\n\n1.4.0 (2010-04-06)\n==================\n\n - Changed the download policy to hash the downloaded filenames by default.\n You can revert back to the original behavior by setting a ``hash-name =\n false`` parameter in the section using the recipe. This closes\n http://github.com/hexagonit/hexagonit.recipe.download/issues#issue/1\n [dokai]\n\n1.3.0 (2009-09-20)\n==================\n\n - Removed support for the deprecated ``download-directory``\n option. [dokai]\n\n - Refactored the download logic to use the Download API in\n zc.buildout. We now require zc.buildout >= 1.4.0. [dokai]\n\n\n1.2.2 (2009-08-17)\n==================\n\n - Merged the current trunk (revision 79982) from the Plone Collective\n Subversion repository. The collective repository is now abandoned and the\n Github repository is the canonical one. [dokai]\n\n - Open files in binary mode when calculating MD5 checksums. This fixes a\n bug with checksums on the Windows platform. Bug report and patch thanks to\n Alexander Ivanov. [dokai]\n\n1.2.1 (2008-04-13)\n==================\n\n - Rename the buildout ``download-directory`` option to ``download-cache``\n (which is the name used by buildout) [thefunny]\n\n - Added BBB support for the ``download-directory`` option. It will\n emit a deprecation warning and set the ``download-cache`` option\n accordingly. [dokai]\n\n1.2.0 (2008-01-19)\n==================\n\n - Added the `download-only` option to allow downloading arbitrary\n files. [dokai]\n\n1.1.0 (2007-10-14)\n==================\n\n - Refactored the install method so recipe subclasses can override the base\n directory. For more info see ``calculate_base`` method on ``Recipe`` class.\n [hexsprite]\n\n - Recipe is now a new-style Python class so recipe subclasses can use super()\n method to get some default behavior. [hexsprite]\n\n1.0.1 (2007-08-14)\n==================\n\n - For consistency with other similar recipes, the recipe now sets a\n ``location`` option which may be read by other sections to learn\n where the package was extracted. This is an alias for the\n ``destination`` option.\n\n1.0.0\n=====\n\n - First public release.\n\nContributors\n***********************\n\n * Kai Lautaportti (dokai), Author - kai.lautaportti@hexagonit.fi\n * Jordan Baker (hexsprite) - jbb@scryent.com\n * Sylvain Viollon (thefunny)\n * Alexander Ivanov\n * Florian Schulze (fschulze)\n * C\u00e9dric de Saint Martin (desaintmartin)\n * Miano Njoka (miano)\n * Domen Ko\u017ear (iElectric)\n * Yusuke Tsutsumi (toumorokoshi)\n\nDownload\n***********************", "description_content_type": null, "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://github.com/hexagonit/hexagonit.recipe.download", "keywords": "development buildout recipe", "license": "ZPL", "maintainer": "", "maintainer_email": "", "name": "hexagonit.recipe.download", "package_url": "https://pypi.org/project/hexagonit.recipe.download/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/hexagonit.recipe.download/", "project_urls": { "Homepage": "http://github.com/hexagonit/hexagonit.recipe.download" }, "release_url": "https://pypi.org/project/hexagonit.recipe.download/1.7.1/", "requires_dist": [ "zc.buildout (>=1.4.0)", "setuptools", "zope.testing; extra == 'test'", "manuel; extra == 'test'" ], "requires_python": "", "summary": "zc.buildout recipe for downloading and extracting packages", "version": "1.7.1" }, "last_serial": 1954402, "releases": { "1.0.0": [ { "comment_text": "", "digests": { "md5": "12875b87fd13e0ef2700fc51ba3d65d2", "sha256": "c0e15ca50b329fd03ee80ec1ade2f0f75a1a244d92255fbb81be129a9da68dfc" }, "downloads": -1, "filename": "hexagonit.recipe.download-1.0.0-py2.4.egg", "has_sig": false, "md5_digest": "12875b87fd13e0ef2700fc51ba3d65d2", "packagetype": "bdist_egg", "python_version": "2.4", "requires_python": null, "size": 14133, "upload_time": "2007-07-31T17:51:30", "url": "https://files.pythonhosted.org/packages/6c/99/94738e4ef8736071fea36ae29e8e427b5cc469e2adf4847d3b8071e81bba/hexagonit.recipe.download-1.0.0-py2.4.egg" }, { "comment_text": "", "digests": { "md5": "e801e2fbf685d08e4d47a7f3b58aa707", "sha256": "8d629f7eb6006d0914ba598be1bebaa291e2aaaf4ffdea623737fc057c81d05c" }, "downloads": -1, "filename": "hexagonit.recipe.download-1.0.0.tar.gz", "has_sig": false, "md5_digest": "e801e2fbf685d08e4d47a7f3b58aa707", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7335, "upload_time": "2007-07-31T17:51:29", "url": "https://files.pythonhosted.org/packages/1d/d6/f0a1a7044de10a79408efa1b00a8836c13b43778775b3b0f0c109b8f5d86/hexagonit.recipe.download-1.0.0.tar.gz" } ], "1.0.1": [ { "comment_text": "", "digests": { "md5": "45d1c5166f7c5c28c32df10091c9e765", "sha256": "de7c32054590b98f0a82c9e54b7eeadf4d46bf816c5357fa4ed83ef487ed460a" }, "downloads": -1, "filename": "hexagonit.recipe.download-1.0.1-py2.4.egg", "has_sig": false, "md5_digest": "45d1c5166f7c5c28c32df10091c9e765", "packagetype": "bdist_egg", "python_version": "2.4", "requires_python": null, "size": 14280, "upload_time": "2007-08-14T07:37:59", "url": "https://files.pythonhosted.org/packages/5e/76/ca9e1149f5c60cfe64c9821287f12eb185b083dedf8f6e79519bdf90383e/hexagonit.recipe.download-1.0.1-py2.4.egg" }, { "comment_text": "", "digests": { "md5": "1e5df3ca627f60cdf8f55efab68536f7", "sha256": "2781be12c9f5dfdad0f58b3fb11d9f36628e93376b7f895c99cfd354d3fbaa4c" }, "downloads": -1, "filename": "hexagonit.recipe.download-1.0.1.tar.gz", "has_sig": false, "md5_digest": "1e5df3ca627f60cdf8f55efab68536f7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7502, "upload_time": "2007-08-14T07:37:59", "url": "https://files.pythonhosted.org/packages/9f/eb/a97825127ed49f58a0190dd004a1b0a993132989c09519aef5bba3e7a358/hexagonit.recipe.download-1.0.1.tar.gz" } ], "1.1.0": [ { "comment_text": "", "digests": { "md5": "d5525141d6d80968f195db5f0dcb6644", "sha256": "faaa8cbc9de3376f0dbcdae5f9abf9c4eee528914e578cc5bd7845be1db9858c" }, "downloads": -1, "filename": "hexagonit.recipe.download-1.1.0.tar.gz", "has_sig": false, "md5_digest": "d5525141d6d80968f195db5f0dcb6644", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9038, "upload_time": "2008-01-19T14:03:32", "url": "https://files.pythonhosted.org/packages/95/53/b02fa6ca97739ec4e806347bc4bc18c1bd3a3b89496a5c2bbbed99d73f41/hexagonit.recipe.download-1.1.0.tar.gz" } ], "1.1.1": [ { "comment_text": "", "digests": { "md5": "364fb228ce36d14ba0c2b9472519c30c", "sha256": "e88cfde5a1e7d18d227b8dd3f5c29ef3650c71717962bd61db3940f01cc0af0d" }, "downloads": -1, "filename": "hexagonit.recipe.download-1.1.1.tar.gz", "has_sig": false, "md5_digest": "364fb228ce36d14ba0c2b9472519c30c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8257, "upload_time": "2009-08-06T09:22:30", "url": "https://files.pythonhosted.org/packages/94/16/9664e67f6692440d2eae161a3a5de22d476450727d2a833de700ea079888/hexagonit.recipe.download-1.1.1.tar.gz" } ], "1.2.0": [ { "comment_text": "", "digests": { "md5": "10a68eeae3ea840cd3bcfc2277e586e4", "sha256": "7ace2b7c617bb6993effe384cae62b844177ea59e46328017b7c68d42520feae" }, "downloads": -1, "filename": "hexagonit.recipe.download-1.2.0.tar.gz", "has_sig": false, "md5_digest": "10a68eeae3ea840cd3bcfc2277e586e4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9742, "upload_time": "2008-01-19T14:05:41", "url": "https://files.pythonhosted.org/packages/1a/20/a05a890e3bd3493f10bc4771d6ac073f44cfc68b7c9ad2f31f1539509ecc/hexagonit.recipe.download-1.2.0.tar.gz" } ], "1.2.1": [ { "comment_text": "", "digests": { "md5": "8186a8fafb4a9e14b09f2758cbc7a11c", "sha256": "81ea6641619f81192d34f8cbd3b2992ddf2d9d1ce2f78bb787f50ce784734c43" }, "downloads": -1, "filename": "hexagonit.recipe.download-1.2.1.tar.gz", "has_sig": false, "md5_digest": "8186a8fafb4a9e14b09f2758cbc7a11c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10674, "upload_time": "2008-04-13T10:41:51", "url": "https://files.pythonhosted.org/packages/2a/7a/651cce0deeb274bce276b67a858ecfae1d1567e16010bd768a894193ab54/hexagonit.recipe.download-1.2.1.tar.gz" } ], "1.2.2": [ { "comment_text": "", "digests": { "md5": "6f35c9c4311c04f457fcb515980aa5b6", "sha256": "5d584b63e4f66f5a04bb7e44717654378e3dc5811cf6046fd714fbb7e18d4018" }, "downloads": -1, "filename": "hexagonit.recipe.download-1.2.2.tar.gz", "has_sig": false, "md5_digest": "6f35c9c4311c04f457fcb515980aa5b6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9999, "upload_time": "2009-08-17T07:53:08", "url": "https://files.pythonhosted.org/packages/65/15/7120cd75910f94bd337eb461754943cf1bcc3afdf44bb7f9bf6986fdc454/hexagonit.recipe.download-1.2.2.tar.gz" } ], "1.3.0": [ { "comment_text": "", "digests": { "md5": "3fa181f223944651bada05fe94d2717a", "sha256": "c4bb7a19bc317ed74950edc7fdd2caaab73e2cdd6801d96a3e4adba93a61a6d0" }, "downloads": -1, "filename": "hexagonit.recipe.download-1.3.0.tar.gz", "has_sig": false, "md5_digest": "3fa181f223944651bada05fe94d2717a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9741, "upload_time": "2009-09-20T15:30:34", "url": "https://files.pythonhosted.org/packages/93/2b/dfce35e7a2de3964348994fe97e53f98270d817772b567780dd6a1fd6b3f/hexagonit.recipe.download-1.3.0.tar.gz" } ], "1.4.0": [ { "comment_text": "", "digests": { "md5": "90a5adf31b452f7f2461bec743726428", "sha256": "9206586e4bb6f8175fa9885daa3909d6df7d3984d07adf279eac8d81835a8c65" }, "downloads": -1, "filename": "hexagonit.recipe.download-1.4.0.tar.gz", "has_sig": false, "md5_digest": "90a5adf31b452f7f2461bec743726428", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10916, "upload_time": "2010-04-06T10:00:36", "url": "https://files.pythonhosted.org/packages/9b/62/75690b1e7400e9bb78d1e0efbf88fb9414e2a753be987ac25d0b05724e0f/hexagonit.recipe.download-1.4.0.tar.gz" } ], "1.4.1": [ { "comment_text": "", "digests": { "md5": "2fae20a96e89dcb396618cd077e9569c", "sha256": "0444681c0d8572bb3290fcf4e49aa92f0c9a7f2e50b4fef5fbba548027a6d626" }, "downloads": -1, "filename": "hexagonit.recipe.download-1.4.1.tar.gz", "has_sig": false, "md5_digest": "2fae20a96e89dcb396618cd077e9569c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17036, "upload_time": "2010-04-08T11:29:40", "url": "https://files.pythonhosted.org/packages/d7/30/39dd11e8f791098414bb530660de42e48ebccbf7ac7b7f37e32190608ba8/hexagonit.recipe.download-1.4.1.tar.gz" } ], "1.5.0": [ { "comment_text": "", "digests": { "md5": "c2fc6599baad7ffa6b061ecbe80cd7e9", "sha256": "13e9d5d749fec2153d260c6c7a5e108c21d2d7cd84d3612b5a15fcc0ccf755b9" }, "downloads": -1, "filename": "hexagonit.recipe.download-1.5.0.tar.gz", "has_sig": false, "md5_digest": "c2fc6599baad7ffa6b061ecbe80cd7e9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20168, "upload_time": "2011-01-26T19:24:38", "url": "https://files.pythonhosted.org/packages/94/dc/9d8ff325194cdec979e7a959d5e244cc9cc7e11da9b9c96510c509471fae/hexagonit.recipe.download-1.5.0.tar.gz" } ], "1.5.1": [ { "comment_text": "", "digests": { "md5": "2aa83c560dfa287f05384129de2ee0ec", "sha256": "7f901a720719f872f36a4ad799b1a50ad1b8a452ce77625c387c6eb60bb29984" }, "downloads": -1, "filename": "hexagonit.recipe.download-1.5.1.zip", "has_sig": false, "md5_digest": "2aa83c560dfa287f05384129de2ee0ec", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 27764, "upload_time": "2012-07-13T10:20:17", "url": "https://files.pythonhosted.org/packages/46/cb/0bee2e1091430472423dc54df7bb13fc87f5ab1822ae2f198cddc494fefd/hexagonit.recipe.download-1.5.1.zip" } ], "1.6": [ { "comment_text": "", "digests": { "md5": "185501d1ff6d3885b3d5edb155d07206", "sha256": "dfd5c8903a5296256bad3e354338f6eaa2cc1e2af416754a81230671643a7702" }, "downloads": -1, "filename": "hexagonit.recipe.download-1.6.zip", "has_sig": false, "md5_digest": "185501d1ff6d3885b3d5edb155d07206", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 32465, "upload_time": "2012-11-14T19:15:52", "url": "https://files.pythonhosted.org/packages/9c/4d/e19f751e4c2854af8a90eeff55b7b2a07ed2d32a2ada59f9f492ee8f9b75/hexagonit.recipe.download-1.6.zip" } ], "1.7": [ { "comment_text": "", "digests": { "md5": "1b9aecd4b8d44ff2436c9581758b9230", "sha256": "43550de2909165733b0065b56166a6596baf59721444d162dc51c6b018bced3b" }, "downloads": -1, "filename": "hexagonit.recipe.download-1.7.tar.gz", "has_sig": false, "md5_digest": "1b9aecd4b8d44ff2436c9581758b9230", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26444, "upload_time": "2013-04-07T16:44:50", "url": "https://files.pythonhosted.org/packages/3e/dc/d71092f1a9574cbd76d703d50963e1187114333d923afb27cd3ba19ca22a/hexagonit.recipe.download-1.7.tar.gz" } ], "1.7.1": [ { "comment_text": "", "digests": { "md5": "d5bb96d8d0214aaeff2e2e42fce9b02e", "sha256": "52c29f9c04e3514bc2f2dee2f631a5dcb2b775d382f787c6a5c09202e7c78701" }, "downloads": -1, "filename": "hexagonit.recipe.download-1.7.1-py2-none-any.whl", "has_sig": false, "md5_digest": "d5bb96d8d0214aaeff2e2e42fce9b02e", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 25618, "upload_time": "2016-02-13T13:24:18", "url": "https://files.pythonhosted.org/packages/e5/6a/18ce25de310a944eee3e6bac20187babcab2f1283889cf0f165a3989a38f/hexagonit.recipe.download-1.7.1-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b168a3059d2ba12b772ec181bd9d10cb", "sha256": "308444b8f58b56ab49dc32d27c71e7bd06c4b9646c4bfb8bdce135fbc92cf056" }, "downloads": -1, "filename": "hexagonit.recipe.download-1.7.1.tar.gz", "has_sig": false, "md5_digest": "b168a3059d2ba12b772ec181bd9d10cb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 25585, "upload_time": "2016-02-13T13:24:24", "url": "https://files.pythonhosted.org/packages/a8/1b/f1a5d8455a920582ecd434e7acba9d76c3f0d6a95b14e69d688252ab597d/hexagonit.recipe.download-1.7.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "d5bb96d8d0214aaeff2e2e42fce9b02e", "sha256": "52c29f9c04e3514bc2f2dee2f631a5dcb2b775d382f787c6a5c09202e7c78701" }, "downloads": -1, "filename": "hexagonit.recipe.download-1.7.1-py2-none-any.whl", "has_sig": false, "md5_digest": "d5bb96d8d0214aaeff2e2e42fce9b02e", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 25618, "upload_time": "2016-02-13T13:24:18", "url": "https://files.pythonhosted.org/packages/e5/6a/18ce25de310a944eee3e6bac20187babcab2f1283889cf0f165a3989a38f/hexagonit.recipe.download-1.7.1-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b168a3059d2ba12b772ec181bd9d10cb", "sha256": "308444b8f58b56ab49dc32d27c71e7bd06c4b9646c4bfb8bdce135fbc92cf056" }, "downloads": -1, "filename": "hexagonit.recipe.download-1.7.1.tar.gz", "has_sig": false, "md5_digest": "b168a3059d2ba12b772ec181bd9d10cb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 25585, "upload_time": "2016-02-13T13:24:24", "url": "https://files.pythonhosted.org/packages/a8/1b/f1a5d8455a920582ecd434e7acba9d76c3f0d6a95b14e69d688252ab597d/hexagonit.recipe.download-1.7.1.tar.gz" } ] }