{ "info": { "author": "Larry Hastings", "author_email": "larry@hastings.org", "bugtrack_url": null, "classifiers": [ "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Programming Language :: Python :: 3 :: Only" ], "description": "blurb\n=====\n\n.. image:: https://img.shields.io/pypi/v/blurb.svg\n :target: https://pypi.org/project/blurb/\n\nOverview\n--------\n\n**blurb** is a tool designed to rid CPython core development\nof the scourge of ``Misc/NEWS`` conflicts.\n\nThe core concept: split ``Misc/NEWS`` into many\nseparate files that, when concatenated back together\nin sorted order, reconstitute the original ``Misc/NEWS`` file.\nAfter that, ``Misc/NEWS`` could be deleted from the CPython\nrepo and thereafter rendered on demand (e.g. when building\na release). When checking in a change to CPython, the checkin\nprocess will write out a new file that sorts into the correct place,\nusing a filename unlikely to have a merge conflict.\n\n**blurb** is a single command with a number of subcommands.\nIt's designed to be run inside a valid CPython (git) repo,\nand automatically uses the correct file paths.\n\nYou can install **blurb** from PyPI using ``pip``. Alternatively,\nsimply add ``blurb`` to a directory on your path.\n**blurb**'s only dependency is Python 3.5+.\n\n\nFiles used by blurb\n-------------------\n\n**blurb** uses a new directory tree called ``Misc/NEWS.d``.\nEverything it does is in there, except for possibly\nmodifying ``Misc/NEWS``.\n\nUnder ``Misc/NEWS.d`` you'll find the following:\n\n* A single file for all news entries per previous revision,\n named for the exact version number, with the extension ``.rst``.\n Example: ``Misc/NEWS.d/3.6.0b2.rst``.\n\n* The ``next`` directory, which contains subdirectories representing\n the various ``Misc/NEWS`` categories. Inside these subdirectories\n are more ``.rst`` files with long, uninteresting, computer-generated\n names. Example:\n ``Misc/NEWS.d/next/Library/2017-05-04-12-24-06.bpo-25458.Yl4gI2.rst``\n\n\nblurb subcommands\n-----------------\n\nLike many modern utilities, **blurb** has only one executable\n(called ``blurb``), but provides a diverse set of functionality\nthrough subcommands. The subcommand is the first argument specified\non the command-line.\n\nIf you're a CPython core developer, you probably don't need to use\nanything except ``blurb add``--and you don't even need to specify\nthe ``add`` part.\n(If no subcommand is specified, **blurb** assumes you meant ``blurb add``.)\nThe other commands are only expected to be useful for CPython release\nmanagers.\n\n\n\nblurb help\n~~~~~~~~~~\n\n**blurb** is self-documenting through the ``blurb help`` subcommand.\nRun without any further arguments, it prints a list of all subcommands,\nwith a one-line summary of the functionality of each. Run with a\nthird argument, it prints help on that subcommand (e.g. ``blurb help release``).\n\n\nblurb add\n~~~~~~~~~\n\n``blurb add`` adds a new Misc/NEWS entry for you.\nIt opens a text editor on a template; you edit the\nfile, save, and exit. **blurb** then stores the file\nin the correct place, and stages it in ``git`` for you.\n\nThe template for the ``blurb add`` message looks like this::\n\n #\n # Please enter the relevant bugs.python.org issue number here:\n #\n .. bpo:\n\n #\n # Uncomment one of these \"section:\" lines to specify which section\n # this entry should go in in Misc/NEWS.\n #\n #.. section: Security\n #.. section: Core and Builtins\n #.. section: Library\n #.. section: Documentation\n #.. section: Tests\n #.. section: Build\n #.. section: Windows\n #.. section: macOS\n #.. section: IDLE\n #.. section: Tools/Demos\n #.. section: C API\n\n # Write your Misc/NEWS entry below. It should be a simple ReST paragraph.\n # Don't start with \"- Issue #: \" or \"- bpo-: \"or that sort of stuff.\n ###########################################################################\n\nHere's how you interact with the file:\n\n* Add the ``bugs.python.org`` issue number for this checkin to the\n end of the ``.. bpo:`` line.\n\n* Uncomment the line with the relevant ``Misc/NEWS`` section for this entry.\n For example, if this should go in the ``Library`` section, uncomment\n the line reading ``#.. section: Library``. To uncomment, just delete\n the ``#`` at the front of the line.\n\n* Finally, go to the end of the file, and enter your NEWS entry.\n This should be a single paragraph of English text using\n simple ReST markup.\n\nWhen ``blurb add`` gets a valid entry, it writes it to a file\nwith the following format::\n\n Misc/NEWS.d/next/
/.bpo-..rst\n\nFor example, a file added by ``blurb add`` might look like this::\n\n Misc/NEWS.d/next/Library/2017-05-04-12-24-06.bpo-25458.Yl4gI2.rst\n\n``
`` is the section provided in the checkin message.\n\n```` is the current UTC time, formatted as\n``YYYY-MM-DD-hh-mm-ss``.\n\n```` is a hopefully-unique string of characters meant to\nprevent filename collisions. **blurb** creates this by computing\nthe MD5 hash of the text, converting it to base64 (using the\n\"urlsafe\" alphabet), and taking the first 6 characters of that.\n\n\nThis filename ensures several things:\n\n* All entries in ``Misc/NEWS`` will be sorted by time.\n\n* It is unthinkably unlikely that there'll be a conflict\n between the filenames generated for two developers checking in,\n even if they check in at the exact same second.\n\n\nFinally, ``blurb add`` stages the file in git for you.\n\n\nblurb merge\n~~~~~~~~~~~\n\n``blurb merge`` recombines all the files in the\n``Misc/NEWS.d`` tree back into a single ``NEWS`` file.\n\n``blurb merge`` accepts only a single command-line argument:\nthe file to write to. By default it writes to\n``Misc/NEWS`` (relative to the root of your CPython checkout).\n\nSplitting and recombining the existing ``Misc/NEWS`` file\ndoesn't recreate the previous ``Misc/NEWS`` exactly. This\nis because ``Misc/NEWS`` never used a consistent ordering\nfor the \"sections\" inside each release, whereas ``blurb merge``\nhas a hard-coded preferred ordering for the sections. Also,\n**blurb** aggressively reflows paragraphs to < 78 columns,\nwheras the original hand-edited file occasionally had lines\n> 80 columns. Finally, **blurb** strictly uses ``bpo-:`` to\nspecify issue numbers at the beginnings of entries, wheras\nthe legacy approach to ``Misc/NEWS`` required using ``Issue #:``.\n\n\nblurb release\n~~~~~~~~~~~~~\n\n``blurb release`` is used by the release manager as part of\nthe CPython release process. It takes exactly one argument,\nthe name of the version being released.\n\nHere's what it does under the hood:\n\n* Combines all recently-added NEWS entries from\n the ``Misc/NEWS.d/next`` directory into ``Misc/NEWS.d/.rst``.\n* Runs ``blurb merge`` to produce an updated ``Misc/NEWS`` file.\n\nOne hidden feature: if the version specified is ``.``, ``blurb release``\nuses the name of the directory CPython is checked out to.\n(When making a release I generally name the directory after the\nversion I'm releasing, and using this shortcut saves me some typing.)\n\n\nblurb split\n~~~~~~~~~~~\n\n``blurb split`` only needs to be run once per-branch, ever.\nIt reads in ``Misc/NEWS``\nand splits it into individual ``.rst`` files.\nThe text files are stored as follows::\n\n Misc/NEWS.d/.rst\n\n```` is the version number of Python where the\nchange was committed. Pre-release versions are denoted\nwith an abbreviation: ``a`` for alphas, ``b`` for betas,\nand ``rc`` for release candidates.\n\nThe individual ``.rst`` files actually (usually)\ncontain multiple entries. Each entry is delimited by a\nsingle line containing ``..`` by itself.\n\nThe assumption is, at the point we convert over to *blurb*,\nwe'll run ``blurb split`` on each active branch,\nremove ``Misc/NEWS`` from the repo entirely,\nnever run ``blurb split`` ever again,\nand ride off into the sunset, confident that the world is now\na better place.\n\n\n\nThe \"next\" directory\n--------------------\n\nYou may have noticed that ``blurb add`` adds news entries to\na directory called ``next``, and ``blurb release`` combines those\nnews entries into a single file named with the version. Why\nis that?\n\nFirst, it makes naming the next version a late-binding decision.\nIf we are currently working on 3.6.5rc1, but there's a zero-day\nexploit and we need to release an emergency 3.6.5 final, we don't\nhave to fix up a bunch of metadata.\n\nSecond, it means that if you cherry-pick a commit forward or\nbackwards, you automatically pick up the NEWS entry too. You\ndon't need to touch anything up--the system will already do\nthe right thing. If NEWS entries were already written to the\nfinal version directory, you'd have to move those around as\npart of the cherry-picking process.\n\nChangelog\n---------\n\n1.0.6\n~~~~~\n\n- When word wrapping, don't break on long words or hyphens.\n- Use the ``-f`` flag when adding **blurb** files to a ``git``\n checkin. This forces them to be added, even when the files\n might normally be ignored based on a ``.gitignore`` directive.\n- Explicitly support the ``-help`` command-line option.\n- Fix Travis CI integration.\n\nCopyright\n---------\n\n**blurb** is Copyright 2015-2018 by Larry Hastings.\nLicensed to the PSF under a contributor agreement.\n", "description_content_type": "text/x-rst", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/python/core-workflow/tree/master/blurb", "keywords": "", "license": "", "maintainer": "Python Core Developers", "maintainer_email": "core-workflow@mail.python.org", "name": "blurb", "package_url": "https://pypi.org/project/blurb/", "platform": "", "project_url": "https://pypi.org/project/blurb/", "project_urls": { "Homepage": "https://github.com/python/core-workflow/tree/master/blurb" }, "release_url": "https://pypi.org/project/blurb/1.0.7/", "requires_dist": null, "requires_python": ">=3.5", "summary": "Command-line tool to manage CPython Misc/NEWS.d entries.", "version": "1.0.7" }, "last_serial": 3982512, "releases": { "1.0.0.post1": [ { "comment_text": "", "digests": { "md5": "4faf1d37bbb17502b5471dfa84ada12e", "sha256": "b45afcb31307ee745695ad8ff2b36d9f4a99ea579ca4f1044ae0497bcd87686c" }, "downloads": -1, "filename": "blurb-1.0.0.post1-py3-none-any.whl", "has_sig": false, "md5_digest": "4faf1d37bbb17502b5471dfa84ada12e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 56642, "upload_time": "2017-06-24T16:56:00", "url": "https://files.pythonhosted.org/packages/bc/92/ce7ffb09fc98975a4718acc89e180e6e8410f8beb518f4fbcb55af2005eb/blurb-1.0.0.post1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "082bb8a9edffff0b9095327c1f7ca860", "sha256": "c5365e80872c6d29ace7b976f039d8c9f48cbe9fd084715adf07c9f55060180b" }, "downloads": -1, "filename": "blurb-1.0.0.post1.tar.gz", "has_sig": false, "md5_digest": "082bb8a9edffff0b9095327c1f7ca860", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 18451, "upload_time": "2017-06-24T16:56:02", "url": "https://files.pythonhosted.org/packages/3d/d3/b17ae953f530f9287e29e86acaec4c6a858eae576ae487f3348edbd0b6af/blurb-1.0.0.post1.tar.gz" } ], "1.0.1": [ { "comment_text": "", "digests": { "md5": "a6e52e66796167012b09af71b795584d", "sha256": "c78563a317ac0ecff8b92c94cf4b596f8e521f5176afb6f542430d5fd97ab2cc" }, "downloads": -1, "filename": "blurb-1.0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "a6e52e66796167012b09af71b795584d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 56921, "upload_time": "2017-07-08T18:00:20", "url": "https://files.pythonhosted.org/packages/59/3f/7fad7eb4044573c3c442945b8efd97b70a65392a0290c3c10552d8d122a9/blurb-1.0.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "cd3cc72ee9465a371f1f609fb87a0130", "sha256": "15f360ca6e779ef2598af7db183756c1b97eccec1b7d4c531e0c3b076b9f2152" }, "downloads": -1, "filename": "blurb-1.0.1.tar.gz", "has_sig": false, "md5_digest": "cd3cc72ee9465a371f1f609fb87a0130", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 18465, "upload_time": "2017-07-08T18:00:22", "url": "https://files.pythonhosted.org/packages/81/38/9c55685c7162dcaace7a034ff97e2c0253c965501378bd703479da9c282b/blurb-1.0.1.tar.gz" } ], "1.0.1.post1": [ { "comment_text": "", "digests": { "md5": "114f7f9d3851d6e9cef2ab1d0b351ac4", "sha256": "30538900624077d24b60f3053c8bd7cc01dc6d17efd8994d33f3ff5b75987893" }, "downloads": -1, "filename": "blurb-1.0.1.post1-py3-none-any.whl", "has_sig": false, "md5_digest": "114f7f9d3851d6e9cef2ab1d0b351ac4", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 56994, "upload_time": "2017-07-10T23:05:27", "url": "https://files.pythonhosted.org/packages/2b/23/51a7bc8a9dc6fe04ba5635c96000c93e738bfe4d11e008b0c04bc5e519bc/blurb-1.0.1.post1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "00380bc2a84870c5a6e0cc4e83ea7636", "sha256": "9fd3051499c6a2402812184b953781db945cf4acd1d42f7ec030874fb41a3372" }, "downloads": -1, "filename": "blurb-1.0.1.post1.tar.gz", "has_sig": false, "md5_digest": "00380bc2a84870c5a6e0cc4e83ea7636", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 18485, "upload_time": "2017-07-10T23:05:29", "url": "https://files.pythonhosted.org/packages/32/dd/0a5e12bd32380fda9229eec68d5a3b2da014ebca8075ecf8cd3c4b18bab8/blurb-1.0.1.post1.tar.gz" } ], "1.0.2.dev1": [ { "comment_text": "", "digests": { "md5": "d240df35570e23971cbf8b3058c1d6e1", "sha256": "c9f09676ae38669b3d83562ef1fcaf3f3f911bb74e8fc105012dfcb1404efa57" }, "downloads": -1, "filename": "blurb-1.0.2.dev1-py3-none-any.whl", "has_sig": false, "md5_digest": "d240df35570e23971cbf8b3058c1d6e1", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 57435, "upload_time": "2017-07-16T14:01:13", "url": "https://files.pythonhosted.org/packages/0b/f6/e7cd43f9c3d582e5640dffe6f266694ac78ee45712993a7efeb6099650be/blurb-1.0.2.dev1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "bfda3e4deae686c122a5ff10ea0ae6c8", "sha256": "96a59b4b2a282dd4ef12df5107772c85e7cdbf6a42fb04c2747e972b2f9139f1" }, "downloads": -1, "filename": "blurb-1.0.2.dev1.tar.gz", "has_sig": false, "md5_digest": "bfda3e4deae686c122a5ff10ea0ae6c8", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 18556, "upload_time": "2017-07-16T14:01:16", "url": "https://files.pythonhosted.org/packages/b8/ac/bf076a991f9c38eb7c140eebeffb2d9f6ae1c18b4673862461aa572a43ec/blurb-1.0.2.dev1.tar.gz" } ], "1.0.3": [ { "comment_text": "", "digests": { "md5": "3ffec5130dad3f85e6f4c8825d9b96e3", "sha256": "a5ed66560e6b872fa67c95d01bf6b5bcbd6c4aa974cc742391d13367dde5a88e" }, "downloads": -1, "filename": "blurb-1.0.3-py3-none-any.whl", "has_sig": false, "md5_digest": "3ffec5130dad3f85e6f4c8825d9b96e3", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 58290, "upload_time": "2017-07-22T20:43:31", "url": "https://files.pythonhosted.org/packages/c2/27/6bb9429bc126e6796a25eabbf3f472170e99d68aa2b3a8372f7a13e1babc/blurb-1.0.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "90c936b71fd46667a67a3945b7107b16", "sha256": "f01b8218a56f48e352aed269973a5802754189fd97bde9ae98eb19b7cc38776e" }, "downloads": -1, "filename": "blurb-1.0.3.tar.gz", "has_sig": false, "md5_digest": "90c936b71fd46667a67a3945b7107b16", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 18830, "upload_time": "2017-07-22T20:43:33", "url": "https://files.pythonhosted.org/packages/ee/be/62c216959f57c97d277c730978b06beb0a9ce0ffc7dcaa83535ab6440c6e/blurb-1.0.3.tar.gz" } ], "1.0.4": [ { "comment_text": "", "digests": { "md5": "b0ea6f7f34345e34412e0037168fa9ad", "sha256": "331612799c4740e700f75c47575c93eb4dacf4d537b630c471f44207af308ad4" }, "downloads": -1, "filename": "blurb-1.0.4-py3-none-any.whl", "has_sig": false, "md5_digest": "b0ea6f7f34345e34412e0037168fa9ad", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 59777, "upload_time": "2017-07-24T00:40:02", "url": "https://files.pythonhosted.org/packages/be/52/acf0440fd5107f4ffb104d4cf376542f648aa3933a82753ca9590a814147/blurb-1.0.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7b730fc19cc412fc66ffdba7bd261473", "sha256": "17d21769636b4edc531c0b346ac0e7967b8eb090a89260af243be38f36fa7dca" }, "downloads": -1, "filename": "blurb-1.0.4.tar.gz", "has_sig": false, "md5_digest": "7b730fc19cc412fc66ffdba7bd261473", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 19196, "upload_time": "2017-07-24T00:40:04", "url": "https://files.pythonhosted.org/packages/4b/f3/76ea04c73110e5b936c1e164e5cbdbbebb6fb0a239b0b9198a932ec17bda/blurb-1.0.4.tar.gz" } ], "1.0.5": [ { "comment_text": "", "digests": { "md5": "17a0f8c6b270bd5b7b26e61e5475e0b6", "sha256": "8c7e52488a9c6880c071473bcdac9f2897e7b3767fb5214864c84938c1b350a4" }, "downloads": -1, "filename": "blurb-1.0.5-py3-none-any.whl", "has_sig": false, "md5_digest": "17a0f8c6b270bd5b7b26e61e5475e0b6", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 59782, "upload_time": "2017-09-04T23:17:43", "url": "https://files.pythonhosted.org/packages/05/41/dfaf65e3a013b1ab4cad9d6f7b3be8bf02a94c3e4a27167df244eddbdaf4/blurb-1.0.5-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "df26dd5dafca90274ff5c587226b1a5d", "sha256": "5eba7b21c35282b5b6ea6530508cc6f082c3a944bc84c1622f38967be0a005c6" }, "downloads": -1, "filename": "blurb-1.0.5.tar.gz", "has_sig": false, "md5_digest": "df26dd5dafca90274ff5c587226b1a5d", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 19193, "upload_time": "2017-09-04T23:17:45", "url": "https://files.pythonhosted.org/packages/23/6d/62f98dc0e916235185874cb1fcb7db375fff498aec3c1389493a9414a42e/blurb-1.0.5.tar.gz" } ], "1.0.6": [ { "comment_text": "", "digests": { "md5": "33a7cd383b641bd36cb4105c0651c02f", "sha256": "b8d52ef73d8df73549cad490ce9b244cbd9bbb4ea7dd99bd0d9888b33792c6d5" }, "downloads": -1, "filename": "blurb-1.0.6-py3-none-any.whl", "has_sig": false, "md5_digest": "33a7cd383b641bd36cb4105c0651c02f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 62213, "upload_time": "2018-01-23T12:17:54", "url": "https://files.pythonhosted.org/packages/b4/7d/a21fcdd5f6c53b51bb6acf0d25aea2fb6ee73923c721d578d2ba29697596/blurb-1.0.6-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7494ecfc407cfe2bbc5f7f8e51bef159", "sha256": "90c7d2e5d141d7d1fc6ca0fe660025317ac81ca078e6045c46b1bc5a675ce5d1" }, "downloads": -1, "filename": "blurb-1.0.6.tar.gz", "has_sig": false, "md5_digest": "7494ecfc407cfe2bbc5f7f8e51bef159", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 20047, "upload_time": "2018-01-23T12:17:56", "url": "https://files.pythonhosted.org/packages/f2/2d/541cf1d8054dbb320aca5e9dcce5d66efb227be9adb75d2697ee45d1f742/blurb-1.0.6.tar.gz" } ], "1.0.7": [ { "comment_text": "", "digests": { "md5": "583e8a1fc645da2ac23d98f6861b036c", "sha256": "fd3217af6283613ea15a4e13848568243a1203f6e346e9ba9716a4febbbbbeec" }, "downloads": -1, "filename": "blurb-1.0.7-py3-none-any.whl", "has_sig": false, "md5_digest": "583e8a1fc645da2ac23d98f6861b036c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 62973, "upload_time": "2018-06-20T18:29:34", "url": "https://files.pythonhosted.org/packages/41/90/cdce96c5f5767e08a87dad88cb2da0b962c692e826d2083d983d1f6f4019/blurb-1.0.7-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "050580d247088003c24b9adabe8b7eac", "sha256": "1849eb2c9ceb74928d24eab847d344a8602e8ee822aeba2e930c4e6c7543e9e4" }, "downloads": -1, "filename": "blurb-1.0.7.tar.gz", "has_sig": false, "md5_digest": "050580d247088003c24b9adabe8b7eac", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 21248, "upload_time": "2018-06-20T18:29:35", "url": "https://files.pythonhosted.org/packages/29/4f/268f9aa095cbcf53253c665fd0f5103f22dccf246fe317ab9c5c481b38f5/blurb-1.0.7.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "583e8a1fc645da2ac23d98f6861b036c", "sha256": "fd3217af6283613ea15a4e13848568243a1203f6e346e9ba9716a4febbbbbeec" }, "downloads": -1, "filename": "blurb-1.0.7-py3-none-any.whl", "has_sig": false, "md5_digest": "583e8a1fc645da2ac23d98f6861b036c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 62973, "upload_time": "2018-06-20T18:29:34", "url": "https://files.pythonhosted.org/packages/41/90/cdce96c5f5767e08a87dad88cb2da0b962c692e826d2083d983d1f6f4019/blurb-1.0.7-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "050580d247088003c24b9adabe8b7eac", "sha256": "1849eb2c9ceb74928d24eab847d344a8602e8ee822aeba2e930c4e6c7543e9e4" }, "downloads": -1, "filename": "blurb-1.0.7.tar.gz", "has_sig": false, "md5_digest": "050580d247088003c24b9adabe8b7eac", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 21248, "upload_time": "2018-06-20T18:29:35", "url": "https://files.pythonhosted.org/packages/29/4f/268f9aa095cbcf53253c665fd0f5103f22dccf246fe317ab9c5c481b38f5/blurb-1.0.7.tar.gz" } ] }