{ "info": { "author": "Kostis Anagnostopoulos", "author_email": "ankostis@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Intended Audience :: Developers", "License :: OSI Approved :: European Union Public Licence 1.1 (EUPL 1.1)", "Natural Language :: English", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7" ], "description": "==================================================================\nPolyvers: Bump sub-project versions in Git monorepos independently\n==================================================================\n\n.. _opening-start:\n.. https://img.shields.io/pypi/v/polyvers.svg\n :alt: Deployed in PyPi?\n :target: https://pypi.org/pypi/polyvers\n\n.. https://img.shields.io/travis/JRCSTU/polyvers.svg\n :alt: TravisCI (linux) build ok?\n :target: https://travis-ci.org/JRCSTU/polyvers\n\n.. https://ci.appveyor.com/api/projects/status/lyyjtmit5ti7tg1n?svg=true\n :alt: Apveyor (Windows) build?\n :scale: 100%\n :target: https://ci.appveyor.com/project/ankostis/polyvers\n\n.. https://img.shields.io/coveralls/github/JRCSTU/polyvers.svg\n :alt: Test-case coverage report\n :scale: 100%\n :target: https://coveralls.io/github/JRCSTU/polyvers?branch=master&service=github\n\n.. https://readthedocs.org/projects/polyvers/badge/?version=latest\n :target: https://polyvers.readthedocs.io/en/latest/?badge=latest\n :alt: Auto-generated documentation status\n\n.. https://pyup.io/repos/github/JRCSTU/polyvers/shield.svg\n :target: https://pyup.io/repos/github/JRCSTU/polyvers/\n :alt: Dependencies needing updates?\n\n.. https://api.codacy.com/project/badge/Grade/11b2545fd0264f1cab4c862998833503\n :target: https://www.codacy.com/app/ankostis/polyvers_jrc\n :alt: Code quality metric\n\n:version: 0.1.1a1\n:updated: 2018-08-07T13:30:07.601687\n:Documentation: https://polyvers.readthedocs.io\n:repository: https://github.com/JRCSTU/polyvers\n:pypi-repo: https://pypi.org/project/polyvers/, https://pypi.org/project/polyversion/\n:keywords: version-management, configuration-management, versioning, git, monorepos,\n tool, library\n:copyright: 2018 JRC.C4(STU), European Commission (`JRC `_)\n:license: `EUPL 1.2 `_\n\nA Python 3.6+ command-line tool to manage `PEP-440 version-ids\n`_ of dependent sub-projects\nhosted in a *Git* **monorepo**\\s, independently.\n\nThe key features are:\n\n- **setuptools integration**,\n- x2 **repo scheme**\\s (**monorepo**, **mono-project**),\n- configurable **version scheme**,\n- *leaf* **release scheme**,\n- intuitive **version-bump algebra** (TODO),\n- configurable **engravings**.\n\nThe *leaf version scheme* feature departs from the logic of ref: *similar-tools*.\nSpecifically, when bumping the version of sub-project(s), this tool\nadds **+2 tags and +1 commits**:\n\n - one **Version tag** in-trunk like ``foo-proj-v0.1.0``,\n - and another **Release tag** on a new **out-of-trunk commit** (leaf)\n like ``foo-proj-r0.1.0`` (the new version-ids are **engrave**\\d only\n in this release-commit):\n\n .. _static/leaf_commits.png\n :align: center\n :alt: Leaf-commits & version/release tags for the two repo's sub-projects\n\n Leaf-commits & version/release-tags for the two sub-project's,\n as shown in this repo's git history.\n\n.. Note::\n The reason for this feature is to allow exchange code across branches (for the\n different sub-projects) without **engravings** getting in your way as\n merge-conflicts.\n\nAdditional capabilities and utilities:\n\n- It is still possible to use plain **version tags (vtags)** like ``v0.1.0``,\n assuming you have a single project (called hereinafter a **mono-project**)\n\n- A separate Python 2.7+ **polyversion** project, which contains API to extract\n sub-project's version from past tags (provided as a separate subproject\n so client programs do not get ``polyvers`` commands transitive dependencies).\n The library functions as a **setuptools plugin**.\n\n.. _opening-end:\n\n.. contents:: Table of Contents\n :backlinks: top\n :depth: 4\n\n\n.. _usage:\n\nTutorial\n========\nInstall the tool\n----------------\nAnd you get the ``polyvers`` command:\n\n.. code-block:: console\n\n $ pip install polyvers\n ...\n $ polyvers --version\n 0.0.0\n $ polyvers --help\n ...\n\n $ polyvers status\n polyvers: Neither `setup.py` nor `.polyvers(.json|.py|.salt)` config-files found!\n\n.. Note::\n Actually two projects are installed:\n\n - **polyvers** cmd-line tool, for developing python **monorepo**\\s,\n - **polyversion**: the base python library used by projects developed\n with *polyvers* tool, so that their sources can discover their subproject-version\n on runtime from Git.\n\n\nPrepare project\n---------------\nAssuming our **monorepo** project ``/monorepo.git/`` contains two sub-projects,\nthen you need enter the following configurations into your build files::\n\n /monorepo.git/\n +--setup.py # see below for contents\n +--mainprog/__init__.py\n | from polyversion import polyversion, polytime\n | __version__ = polyversion()\n | __updated__ = polytime()\n | ...\n |\n +--core-lib/\n +--setup.py: # like above\n +--core/__init__.py # like above\n +--...\n\n.. Tip::\n You may see different sample approaches for your setup-files by looking\n into both `polyvers` & `polyversion` subprojects of this repo (because\n they eat their own dog food).\n\nThe `polyversion` library function as a *setuptools* \"plugin\", and\nadds a new ``setup()`` keyword ``polyversion = (bool | dict)``\n(see func(`polyversion.init_plugin_kw`) for its content), which you can use it\nlike this:\n\n.. code-block:: python\n\n from setuptools import setup\n\n setup(\n project='myname',\n version='' # omit (or None) to abort if cannot auto-version\n polyversion={ # dict or bool\n 'version_scheme: 'mono-project',\n ... # See `polyversion.init_plugin_kw()` for more keys.\n },\n setup_requires=[..., 'polyversion'],\n ...\n )\n\n.. Hint::\n The ``setup_requires=['polyvers']`` keyword (only available with *setuptools*,\n and not *distutils*), enables the new ``polyversion=`` setup-keyword.\n\nAlternatively, a subproject may use pep(`0518`) to pre-install `polyversion`\nlibrary *before* pip-installing or launching ``setup.py`` script.\nTo do that, add the ``pyproject.toml`` file below next to your `setup` script::\n\n [build-system]\n requires = [\"setuptools\", \"wheel\", \"polyversion\"]\n\nand then you can simply import ``polyversion`` from your ``setup.py``:\n\n.. code-block:: python\n\n from setuptools import setup\n from polyversion import polyversion\n\n setup(\n project='myname',\n version=polyversion(mono_project=True) # version implied empty string.\n\n.. Attention::\n To properly install a pep(`0518`) project you need ``pip-v10+`` version.\n\n\nInitialize `polyvers`\n---------------------\n...we let the tool auto-discover the mapping of *project folders \u00e2\u2020\u201d project-names*\nand create a `traitlets configuration YAML-file `_\nnamed as ``/monorepo.git/.polyvers.py``:\n\n.. code-block:: console\n\n $ cd monorepo.git\n\n $ polyvers init --monorepo\n Created new config-file '.polyvers.yaml'.\n\n $ cat .polyvers.yaml\n ...\n PolyversCmd:\n projects:\n - pname: mainprog # name extracted from `setup.py`.\n basepath: . # path discovered by the location of `setup.py`\n - pname: core\n basepath: core-lib\n ...\n\n $ git add .polyvers.yaml\n $ git commit -m 'add polyvers config-gile'\n\nAnd now we can use the ``polyvers`` command to inspect the versions of all\nsub-projects:\n\n.. code-block:: console\n\n $ polyvers status\n - mainprog\n - core\n\nIndeed there are no tags in in git-history for the tool to derive and display\nproject-versions, so only project-names are shown. With ``--all`` option\nmore gets displayed:\n\n.. code-block:: console\n\n $ polyvers status -a\n - pname: mainprog\n basepath: .\n gitver:\n history: []\n - pname: core\n basepath: core-lib\n gitver:\n history: []\n\n..where ``gitver`` would be the result of ``git-describe``.\n\n\nBump versions\n-------------\nWe can now use tool to set the same version to all sub-projects:\n\n.. code-block:: console\n\n $ polyvers bump 0.0.0 -f noengraves # all projects implied, if no project-name given\n 00:52:06 |WARNI|polyvers.bumpcmd.BumpCmd|Ignored 1 errors while checking if at least one version-engraving happened:\n ignored (--force=noengraves): CmdException: No version-engravings happened, bump aborted.\n 00:52:07 |NOTIC|polyvers.bumpcmd.BumpCmd|Bumped projects: mainprog-0.0.0 --> 0.0.0, core-0.0.0 --> 0.0.0\n\nThe ``--force=noengraves`` disables a safety check that requires at least one\nfile modification for **engrave**\\ing the current version in the leaf \"Release\" commit\n(see next step).\n\n.. code-block:: console\n\n $ polyvers status\n - mainprog-v0.0.0\n - core-v0.0.0\n\n $ git lg # Ok, augmented `lg` output a bit here...HEAD --> UPPER branch.\n COMMITS BRANCH TAGS REMARKS\n ======= ====== ==================== ========================================\n O latest mainprog-r0.0.0 - x2 tags on \"Release\" leaf-commit\n / core-r0.0.0 outside-of-trunk (not in HEAD).\n O MASTER mainprog-v0.0.0 - x2 tags on \"Version\" commit\n | core-v0.0.0 for bumping both projects to v0.0.0\n O - Previous commit, before version bump.\n\n .. Hint::\n Note the difference between ``ABC-v0.0.0`` vs ``ABC-r0.0.0`` tags.\n\n In the source code, it's only the \"release\" commit that has **engrave**\\d* version-ids:\n\n .. code-block:: console\n\n $ cat mainprog/mainprog/__init__.py # Untouched!\n import polyvers\n\n __title__ = \"mainprog\"\n __version__ = polyvers.version('mainprog')\n ...\n\n $ git checkout latest\n $ cat mainprog/mainprog/__init__.py\n import polyvers\n\n __title__ = \"mainprog\"\n __version__ = '0.0.0'\n ...\n\n $ git checkout - # to return to master.\n\n\nEngrave version in the sources\n------------------------------\nUsually programs report their version somehow when run, e.g. with ```cmd --version``.\nWith *polyvers* we can derive the latest from the tags created in the previous step,\nusing a code like this, usually in the file ``/mainprog/mainprog/__init__.py:``:\n\n.. code-block:: python\n\n import polyvers\n\n __title__ = \"mainprog\"\n __version__ = polyvers.version('mainprog')\n ...\n\n...and respectively ``/core-lib/core/__init__.py:``:\n\n.. code-block:: python\n\n __version__ = polyvers.version('core')\n\n\n\nBump sub-projects selectively\n-----------------------------\nNow let's add another dummy commit and then bump ONLY ONE sub-project:\n\n.. code-block:: console\n\n $ git commit --allow-empty -m \"some head work\"\n $ polyvers bump ^1 mainprog\n 00:53:07 |NOTIC|polyvers.bumpcmd.BumpCmd|Bumped projects: mainprog-0.0.0 --> 0.0.1\n\n $ git lg\n COMMITS BRANCH TAGS REMARKS\n ======= ====== ==================== ========================================\n O latest mainprog-r0.0.1.dev0 - The latest \"Release\" leaf-commit.\n / branch `latest` was reset non-ff.\n O MASTER mainprog-v0.0.1.dev0 - The latest \"Version\" commit.\n O - some head work\n | O mainprog-r0.0.0 - Now it's obvious why \"Release\" commits\n |/ core-r0.0.0 are called \"leafs\".\n O mainprog-v0.0.0\n | core-v0.0.0\n O\n\n $ git checkout latest\n $ cat mainprog/mainprog/__init__.py\n import polyvers\n\n __title__ = \"mainprog\"\n __version__ = '0.0.1.dev0'\n ...\n\n $ cat core/core/__init__.py\n import polyvers\n\n __title__ = \"core\"\n __version__ = '0.0.0+mainprog.0.0.1.dev0'\n ...\n $ git checkout -\n\nNotice how the the `\"local\" part of PEP-440\n`_ (statring with ``+...``)\nis used by the engraved version of the **un-bumped** ``core`` project to signify\nthe correlated version of the **bumped** ``mainprog``. This trick is not necessary\nfor tags because they apply repo-wide, to all sub-projects.\n\n\n.. _features:\n\nFeatures\n========\n.. include:: \nrubric::\n\n PEP 440 version ids\n While most versioning tools use `Semantic versioning\n `_, python's ``distutils`` native library\n supports the quasi-superset, but more versatile, `PEP-440 version ids\n `_, like that:\n\n - Pre-releases: when working on new features::\n\n X.YbN # Beta release\n X.YrcN or X.YcN # Release Candidate\n X.Y # Final release\n\n - Post-release::\n\n X.YaN.postM # Post-release of an alpha release\n X.YrcN.postM # Post-release of a release candidate\n\n - Dev-release::\n\n X.YaN.devM # Developmental release of an alpha release\n X.Y.postN.devM # Developmental release of a post-release\n\n version-bump algebra\n When bumping, the increment over the base-version can be specified with a\n \"relative version\", which is a combination of pep(`0440`) segments and\n one of these modifiers: ``+^~=``\n See mod(`polyvers.vermath`) for more.\n\n repo scheme\n monorepo\n mono-project\n whether a git repo hosts a single or multiple subprojects\n\n **Rational:**\n\n When your single project succeeds, problems like these are known only too well:\n\n Changes in **web-server** part depend on **core** features that cannot\n go public because the \"official\" **wire-protocol** is freezed.\n\n While downstream projects using **core** as a library complain about\n its bloated transitive dependencies (asking why *flask* library is needed??).\n\n So the time to \"split the project\" has come. But from **Lerna**:\n\n |laquo|\\ Splitting up large codebases into separate independently versioned packages\n is extremely useful for code sharing. However, making changes across\n many repositories is messy and difficult to track, and testing across repositories\n gets complicated really fast.\\ |Raquo|\n\n So a *monorepo* [#]_ [#]_ is the solution.\n But as `Yarn `_ put it:\n\n |laquo|\\ OTOH, splitting projects into their own folders is sometimes not enough.\n Testing, managing dependencies, and publishing multiple packages quickly\n gets complicated and many such projects adopt tools such as ...\\ |Raquo|\n\n *Polyvers* is such a tool.\n\n .. [#] `_\n on all other the *dependent* sub-projects in the monorepo signify their relationship\n at the time of the bump.\n\n Lock release trains as \"developmental\"\n [TODO] Specific branches can be selected always to be published into *PyPi* only as\n `PEP-440's \"Developmental\" releases\n `_, meanining that\n users need ``pip install --pre`` to install from such release-trains.\n This is a safeguard to avoid accidentally landing half-baked code to users.\n\n default version env-var\n From which env-var to read a project's *version* if git cmd fail.\n It does not override any value given as ``default_version`` keyword\n for func(`polyversion.polyversion()`).\n Also func(`polyversion.polytime()`) assumes keyword ``no_raise=True``\n if such env-var is found.\n [Default var-name: ``_VERSION``]\n\n Other Features\n - Highly configurable using `traitlets `_,\n with sensible defaults; it should be possible to start using the tool\n without any config file (see `init` cmd), or by adding one of the flags\n ``--monorepo``/``--mono-project`` in all commands, in the face of\n conflicting tags.\n - Always accurate version reported on runtime when run from git repos\n (never again wonder with which version your experimental-data were produced).\n\n\nKnown Limitations, Drawbacks & Workarounds\n------------------------------------------\n.. TODO: epoch vermath, and update README\n\n- PEP440 `Epoch` handling is not yet working.\n- Version-bump's grammar is not yet as described in \"GRAMMAR\" section\n of command's doc::\n\n $ polyvers config desc --class BumpCmd\n BumpCmd(_SubCmd)\n ----------------\n Increase or set the version of project(s) to the (relative/absolute) version.\n SYNTAX:\n polyvers config desc [OPTIONS] []...\n - If no project(s) specified, increase the versions on all projects.\n - Denied if version for some projects is backward-in-time (or has jumped parts?);\n use --force if you might.\n VERSION: - A version specifier, either ABSOLUTE, or RELATIVE to the current\n version og each project:\n - *ABSOLUTE* PEP-440 version samples:\n - Pre-releases: when working on new features:\n X.YbN # Beta release\n X.YrcN or X.YcN # Release Candidate\n X.Y # Final release\n ...\n\n- (not related to this tool) In ``setup.py`` script, the kw-argument\n ``package_dir={'': }`` arg is needed for `py_modules` to work\n when packaging sub-projects (also useful with ``find_packages()``,\n check this project's sources).\n But ```` must be relative to launch cwd, or else,\n ``pip install -e `` and/or ``python setup.py develop``\n break.\n\n- (not related to this tool) When building projects with ``python setup.py bdist_XXX``,\n you have to clean up your build directory (e.g. ``python setup.py clean --all``)\n or else, the distribution package will contain the sources from all previous\n subprojects built. That applies also when rebuilding a project between versions.\n\n- Installing directly from git-repos needs an engraved branch (e.g. ``latest``)::\n\n pip install git+https://github.com/JRCSTU/polyvers@latest\n\n If you still want to install non-engraved branhces (e.g. ``master``),\n set the **default version env-var**; for example, since *polyvers* subproject\n has not customized the name of its env-var, you may install the very latest\n like this::\n\n polyvers_VERSION=1.2.3 pip install git+https://github.com/JRCSTU/polyvers\n\n .. Attention::\n The version given in the env-var is irrelevant.\n The installed version will still derive from git tags, and the local-part\n from the actual git-commit.\n\n- (not related to this tool) If you don't place a ``setup.py`` file at the root\n of your git-repo (using ``package_dir`` argument to ``setup()`` function or\n in ``find_packages()``, according to `setuptools-docs\n `_), then\n in order to ``pip install git+https://...`` directly from remote URLs\n you have to use `this official trick\n `_.\n For example, to install *polyversion* subproject::\n\n pip install \"git+https://github.com/JRCSTU/polyvers@latest#egg=polyversion&subdirectory=pvlib\"\n\n Notice that the quotes are needed to escape the ``&`` char from bash.\n Respectively, use this to install from the very latest::\n\n polyversion_VERSION=1.2.3 pip install git+https://github.com/JRCSTU/polyvers#egg=polyversion&subdirectory=pvlib\"\n\n\n- Set branch ``latest`` as default in GitHub to show **engrave**\\d sub-project version-ids.\n\n- See ref: *to-dos*.\n\nRecipes\n=======\nAutomatically sign tags:\n------------------------\nAdd this to your ``~/.polyvers.yaml``:\n\n.. code-block:: yaml\n\n BumpCmd:\n sign_tags: true\n sign_user: \n\n\n.. _contribute-section:\n.. _similar-tools:\n\nSimilar Tools\n=============\nBumped across these projects while building it...\n\nrubric::\n\n bumpversion\n The original **bumpversion** project; development stopped after 2015:\n (recomended also by **python guide**)\n https://github.com/peritus/bumpversion\n\n bump2version\n active clone of the original:\n https://github.com/c4urself/bump2version\n\n releash\n another **monorepo**\\s managing tool, that publishes also to PyPi:\n https://github.com/maartenbreddels/releash\n\n Git Bump\n bump version using git-hooks:\n https://github.com/arrdem/git-bump\n\n Lerna\n A tool for managing JavaScript projects\n with multiple packages.\n https://lernajs.io/\n\n Pants\n a build system designed for codebases that:\n - Are large and/or growing rapidly.\n - Consist of many subprojects that share a significant amount of code.\n - Have complex dependencies on third-party libraries.\n - Use a variety of languages, code generators and frameworks.\n - https://www.pantsbuild.org/\n\n pbr\n a ``setup_requires`` library that\n injects sensible default and behaviors into your *setuptools*.\n Crafted for *Semantic Versioning*, maintained for OpenStack projects.\n https://docs.openstack.org/pbr/\n\n Zest.releaser\n easy releasing and tagging for Python packages; make easy, quick and\n neat releases of your Python packages. You need to change the version number,\n add a new heading in your changelog, record the release date, svn/git/bzr/hg tag\n your project, perhaps upload it to pypi... *zest.releaser* takes care\n of the boring bits for you.\n (recomended also by **python guide**)\n http://zestreleaser.readthedocs.io/\n\n incremental\n a small *setuptools* plugin library that versions Python projects.\n https://github.com/twisted/incremental\n\n changes\n Manages the release of a Python Library (intuitive logo,\n recomended also by **python guide**):\n\n - Auto generates changelog entries from commit messages\n - CLI that follows Semantic Versioning principles to auto-increment the library version\n - Runs the library tests\n - Checks the package installation from a tarball and PyPi\n - Uploads the distribution to PyPi\n - Tags the GitHub repository\n\n https://github.com/michaeljoseph/changes\n\n setuptools_scm\n managing versions in scm metadata instead of declaring them as\n the version argument or in a scm managed file, apart from handling\n file finders for the supported scm\u00e2\u20ac\u2122s.\n (recomended also by **python guide**)\n https://pypi.org/project/setuptools_scm/\n\n .. Note:\n Interesting how this project parses ``git describe`` tags:\n https://pypi.org/project/setuptools_scm/#default-versioning-scheme\n\n python guide\n There is a dedicated guide for this problem in pythons docs:\n https://packaging.python.org/guides/single-sourcing-package-version/\n\nFind more than `34 similar projects in GitHub:\n`_\nand in awesome: https://github.com/korfuri/awesome-monorepo.\n\n\n\n\nCredits\n=======\n- Contains a function from the BSD-tool :term`pbr` to fetch version from *pkg-metadata*\n when invoked as a **setuptools plugin** from inside an egg.\n\n- This package was created with Cookiecutter_ and the `audreyr/cookiecutter-pypackage`_ project template.\n\n- Using `towncrier `_ for generating CHANGES.\n\n.. _Cookiecutter: https://github.com/audreyr/cookiecutter\n.. _`audreyr/cookiecutter-pypackage`: https://github.com/audreyr/cookiecutter-pypackage\n\n\nChanges\n=======\n\n.. *towncrier* instructions for the developers:\n\n - Install cmd-line tool in your workstation::\n\n pip install towncrier\n\n - Add change-items in `changes.d/.` files like that::\n\n echo 'Fixed a thing!' > ./changes.d/1234.fix\n\n Available change types:\n - break\n - feat\n - drop\n - fix\n - change\n - doc\n - chore\n\n - Generate new changes for the comming release::\n\n towncrier --draft # to preview\n towncrier\n\n - *towncrier*'s config file is `pyproject.toml`.\n\n. contents:: Releases\n :local:\n\n.. _to-dos:\n\nTODOs\n=====\n- Parse ``git describe`` like `setuptools_scm plugin\n `_ does.\n\n- Drop `pvcmd/pvtags.py`, and replace it with `polyversion`?\n\n- Engravings: Not easy to extend!\n\n - Configurable hooks - refactor **engravings** as one of them.\n to run, for example, housekeeping commands on all subprojects like\n ``pip install -e `` and immediately start working in \"develop mode\".\n\n This would allow housekeeping commands and *validate tests*\n before/after every bump::\n\n ## Pre-release hook\n #\n pytest tests\n\n\n ## Post-release hook\n #\n rm -r dist/* build/*;\n python setup.py sdist bdist_wheel\n twine upload dist/*whl -s\n\n - Add top-level engrave glob-excludes.\n\n - Use `astor `_ grafter.\n\n- Refactor **version-bump algebra** to support a single modifier per segment\n (see ``multivermath`` branch).\n\n- Lock release-trains as \"alpha/beta\".., specific branches can be selected\n Based on **version-bump algebra**), this will force users to always\n use ``pip install --pre`` to fetch such release-trains.\n This is a safeguard to avoid accidentally landing half-baked code to users.\n\n- Retrofit `polyversion` library as a plugin of `polyvers` command.\n\n- Function as plugin for other 3rd-party projects, bake a cookiecutter\n\n- Check what happens with `no-commit`, e.g. to temporarily package a wheel.\n\n.. towncrier release notes start\n\n\n2018-08-07: polyversion-v0.2.2a1, polyvers-v0.1.1a1\n===================================================\nMaintenance release.\n\n- enh: `polyversion` now logs which was cmd not found on Windows\n (usually it is executing ``git``).\n- chore: Merge all *pyupd* requests for dependencies.\n\n\n2018-07-08: polyversion-v0.2.2a0\n================================\n- FIX: `git < 2.15.0` was buggy with multiple match-patterns in command::\n\n git describe --match=... --match=...\n\n (see https://github.com/git/git/blob/master/Documentation/RelNotes/2.15.0.txt)\n\n The ``polyvers`` cmd still affected by this.\n\n\n2018-07-06: polyvers-v0.1.1a0\n=============================\nFIX: engravings were applied unsorted (based on their start-point) and offsets\nwere miss-located when switching graft in a same file.\n\n\n2018-07-05: polyversion-v0.2.1a0\n================================\n- Feature: The envvar(`POLYVERSION_LOG_LEVEL`) control *polyversion* verbosity.\n Run ``polyversion -h`` fo help.\n- Change: minor reordering when searching version from package-metadata.\n- fix: add standalone ``bin/pvlib.run`` from last release.\n- fix: func(`~polyversion.polyversion()`)/func(`~polyversion.polytime()`)\n are guessing ``basepath`` keyword from the path of caller's top-package\n (not just from caller's fpath).\n\n\n2018-07-04: polyversion-v0.2.0a2\n================================\n- Version `v0.2.0a0` not in pypi, consumed for standalone ``bin/pvlib.run``.\n- Version `v0.2.0a1` were not finding sbling-dir versions if ``pip install git+...``,\n and had not replaced all skip-bdist flags.\n\n\nFeatures\n--------\n- Teach non-engraved projects how to retrieve polyversion when pip-installed:\n\n - The functions func(`~polyversion.polyversion()`) & func(`~polyversion.polytime()`)\n now attempt to fetch version from package/site-package infos.\n - And the function doing this func(`polyversion.pkg_metadata_version()`)\n retrofitted to:\n\n - search for `.egg-info/PKG-INFO` in `baspath` sibling folder\n (before searching PKG-INFO, METADATA in `basepath`),\n - so now `basepath` always needed in ``polyversion()/polytime()`` functions\n to locate sibling dir.\n\n\nBreaking Changes\n----------------\n- Rename **setuptools** flag from ``skip_polyversion_check -->\n polyversion_check_bdist_enabled`` to flip its default logic (not checking by\n default), since non-engraved wheels install just fine now.\n- Rename the keyword of ``polyversion()``/``polytime()`` functions from\n ``repo_path --> basepath`` to denote its importance for retrieving the version\n of installed projects from sibling dirs inside ``PYTHONPATH/site-packages/``.\n\n\n2018-06-29: polyversion-v0.1.1a3\n================================\n(change actually done in `v0.1.1a1`, just a fixes & doc-msg in `a2`)\n\n- FIX: teach **setuptools plugin** about **default version env-var**.\n Now can ``pip install git+https://some.git.repo/but-from/non-engraved-branch``.\n\n\n2018-06-27: polyversion-v0.1.1a0\n================================\n- FEAT: Introduce configurable **default version env-var** to fall-back\n to envvar(`_VERSION`) if it exists, in case of errors (e.g. no git).\n The presence of such a variable also sets ``polytime(no_raise=True)``,\n which now also support the ``pname`` and ``default_version_env_var`` kwds.\n\n\n2018-06-06: polyvers-v0.1.0a1, polyversion-v0.1.0a7\n===================================================\nMostly docs, combined release.\n\n+ FEAT: reinstated **engravings** on ``_version.py``\n (see previous release for rational).\n\n\n2018-06-05: polyvers-v0.1.0a0, polyversion-v0.1.0a6: co2mpas-ready\n==================================================================\n+ FEAT: reinstated **engravings** on ``setup.py`` (dropped only for a while\n in `2018-06-03: polyversion-v0.1.0a3: setuptools`_ ), since, assuming clients have adopted\n the new **setuptools plugin** keyword, it is the `default_version` that\n will be engraved, which is fine.\n\n+ fix: report any version matched both from **v-tag**\\s and **r-tag**'s.\n\n+ fix: ``bump`` command does not engrave *egg*-related files.\n\n+ ``polyversion`` command got a bit more civilized (with logging to explain\n problems with related stacktraces.\n\n+ dev: don't test building wheel on travis...too much fuzzz.\n\n\n2018-06-05: polyversion-v0.1.0a5\n================================\n- Disable standalone-wheel hack from ``pvlib/setup.py`` and rely on\n *setuptools* plugin even for *polyversion* ONCE MORE.\n (but no need to update standalone, which is a wheel, unaffected by that)\n\n\n2018-06-05: polyversion-v0.1.0a4\n================================\nBugfixing `polyversion` (and generate a non-buggy standalone wheel):\n\n- FIX `polyversion` where it ignored ``setup(default_version`` keyword.\n (git(`6519a1ba`))\n- fix: `polyversion` stop eating half of its own dog food: cannot reliably use\n **setuptools plugin** for its installation. (git(`56a894cde`))\n- Monkeypatching *distutils* for **bdist-check** was failing in *PY2*\n due to being an \"old class\". (git(`1f72baec`))\n\n- doc: fixed recommendation about how to bypass **bdist-check** to this:\n\n ...\n You may bypass this check and create a package with non-engraved sources\n (although it might not work correctly) by adding `skip_polyversion_check` option\n in your ``$CWD/setup.cfg`` file, like this::\n\n [global]\n skip_polyversion_check = true\n ...\n\n\n2018-06-03: polyversion-v0.1.0a3: *setuptools*\n==============================================\n- `v0.1.0a2`Canceled (like the previous 2), cannot release from r-tags because ``setup()``\n reports version from v-tag.\n\n - Q: Is a new setup-keyword needed ``--is-polyversion-release``?\n - A: no, just search both.\n- `v0.1.0a0` had been canceled for the same reason, but somewhere down the road,\n the fix was reverted (**bdist-check** works for r-tag only).\n- `v0.1.0a1` just marked that our ``setup.py`` files ate our dog food.\n\nBreaking changes\n-----------------\n- Dropped all positional-arguments from func(`polyversion.polyversion()`);\n was error-prone. They have all been converted to keyword-arguments.\n\n- Renamed data in mod(`polyversion`)\n (also applied for class(`polyvers.pvproject.Project()`))::\n\n pvtag_frmt --> pvtag_format\n vtag_frmt --> vtag_format\n\n- Changed arguments in func(`polyversion.polyversion()`)\n (affect also class(`polyvers.pvproject.Project()`))::\n\n default --> default_version\n tag_frmt --> tag_format\n --> vprefixes (new)\n --> is_release (new)\n\n- REVERTED again the `0.0.2a9` default logic to raise when it version/time\n cannot be derived. Now by default it raises, unless default-version or\n ``no_raise`` for func(`polyversion.polytime()`).\n\n- Stopped engraving ``setup.py`` files ; clients should use *setuptools* plugin\n to derive version for those files (see new features, below)).\n For reference, this is the removed element from default class(`~Project`)'s\n configuration (in YAML)::\n\n globs: [setup.py]\n grafts:\n - regex: -|\n (?xm)\n \\bversion\n (\\ *=\\ *)\n .+?(,\n \\ *[\\n\\r])+\n\n- *polyversion* library searches both *v-tags* and *r-tags* (unless limited).\n Previously, even checked-out on an *r-tag*, both ``polyversion`` command\n and ``polyvers bump`` would ignore it, and report +1 from the *v-tag*!\n\nFeatures\n--------\n- The `polyversion` library function as a *setuptools* \"plugin\", and\n adds two new ``setup()`` keywords for deriving subproject versions\n from PKG-INFO or git tags (see func(`polyversion.init_plugin_kw`)):\n\n 1. keyword: ``polyversion --> (bool | dict)``\n When a dict, its keys roughly mimic those in func(`polyversion()`),\n and can be used like this:\n\n .. code-block:: python\n\n from setuptools import setup\n\n setup(\n project='myname',\n version='' # omit (or None) to abort if cannot auto-version\n polyversion={ # dict or bool\n 'mono_project': True, # false by default\n ... # See `polyversion.init_plugin_kw()` for more keys.\n },\n setup_requires=[..., 'polyversion'],\n ...\n )\n\n 2. keyword: ``skip_polyversion_check --> bool``\n When true, disable **bdist-check**, when false (default),\n any `bdist_*` (e.g. ``bdist_wheel``), commands will abort if not run\n from a **release tag**.\n You may bypass this check and create a package with non-engraved sources\n (although it might not work correctly) by invoking the setup-script\n from command-line like this::\n\n $ python setup.py bdist_wheel --skip-polyversion-check\n\n- `bump` cmd: engrave also non-bumped projects with their ``git describe``-derived\n version (controlled by ``--BumpCmd.engrave_bumped_only`` flag).\n\n- Assign names to engraves & grafts for readable printouts, and for refering to\n them from the new `Project.enabled_engarves` list. (namengraves)\n\n- ``polyversion -t`` command-line tool prints the full tag (not the version)\n to make it easy to know if it is a v-tag or r-tag.\n\nDocumentation changes\n---------------------\n\n- Adopt `towncrier` for compiling CHANGES. So now each code change can describe\n its change in the same commit, without conflicts. (towncrier)\n- usage: explain how to set your projects pep(`0518`) ``pyproject.toml``\n file & ``setup_requires`` keyword in ``setup.py`` in your script.\n- add `pbr`, `incremental` and `Zest.release` in ref: *similar-tools* section\n as *setuptools* plugins.\n- re-wrote and shrinked opening section using glossary terms.\n\n- Chore development:\n - deps: don't pin `packaging==17.1`, any bigger +17 is fine for parsing\n version correctly.\n\n\n2018-05-24: 0.0.2a10: polyvers\n==============================\n- fix: slight change of default engraving for ``setup.py:version=...``.\n- Remove default versions from the sources of our-own-dog-food\n (affects installations for developing this tool).\n- refact: merged ```pvlib.whl`` and ``pvlib.run`` into a single executable and\n importable standalone wheel in ``bin/pvlib.run``, generated from\n ``polyversion-0.0.2a9``, release below.\n- doc: expand section for installing and contributing into this project.\n- chore: tighten various test harnesses.\n\n2018-05-24: 0.0.2a9: polyversion\n--------------------------------\n2nd interim release to embed new ``bin/pvlib.run``.\n\n- INVERT by default ``polyversion()/polytime()`` functions not to raise\n if vtags missing.\n- fix: `pvlib.run` shebang to use ``#!/usr/bin/env python`` to work on linux.\n\n2018-05-23: 0.0.2a8: polyversion\n--------------------------------\nInterim release to embed new ``bin/pvlib.run``.\n\n- FIX ``polyversion`` barebone command (a utility for when not installing\n the full `polyvers` tool).\n- feat: make project-name optional in func(`polyversion.polyversion()`);\n if not given, defaults to caller's last segment of the module.\n- doc: rudimentary explanation of how to use the lib on its own README.\n\n\n2018-05-23: 0.0.2a9.post0: polyvers\n===================================\n- feat: add ``-C`` option to change project dir before running command.\n- ``init`` command:\n - fix: were creating invalid ``.polyvers.yaml`` configuration-file\n unless ``--monorepo/--mono-project`` flags were given.\n - feat: include config-help in generated file only if\n the new ``--doc`` flag given.\n - feat: inform user of the projects auto-discovered and what type of config-file\n was generated.\n- various fixes.\n\n\n2018-05-19: 0.0.2a8: polyvers\n=============================\n- FIX(bump): was engraving all projects and not limiting to those\n specified in the command-line - command's syntax slightly changed.\n- chore: Stop increasing `polyversion` version from now on.\n- doc: fix all sphinx errors and API reference.\n\n2018-05-18: 0.0.2a7\n-------------------\nInterim release to embed re-LICENSED ``pvlib/bin/pvlib.whl``,\nfrom EUPLv1.2-->MIT\n\n\n2018-05-18: 0.0.2a6: ``bump``!\n==============================\n- ``bump`` command:\n - feat: ``--amend`` now works\n - feat: ``--engrave-only``.\n - feat: log ``PRETEND`` while doing actions.\n - feat: Log which files where engraved in the final message.\n- fix(engrave): don't waste cycles/log-messages on empty-matches (minor).\n\n\n2018-05-18: 0.0.2a5\n===================\nActually most changes happened in \"interim\" release `v0.0.2a2`, below.\n\n- feat: make a standalone polyversion-lib wheel to facilitate bootstrap\n when installing & building from sources (and the lib is not yet installed).\n- Add ``bin/package.sh`` that create the `pvlib` wheel as executable ``dist/pvlib.run``.\n- doc: fix rtd & pypi sites.\n\n2018-05-18: 0.0.2a4\n-------------------\ndoc: bad PyPi landing page.\n\n2018-05-17: 0.0.2a3\n-------------------\nThe `pvcmd` was actually broken so far; was missing `polyversion` lib\ndependency!\n\n2018-05-17: 0.0.2a2\n-------------------\nInterim release to produce executable wheel needed by next release.\n\n\n2018-05-17: 0.0.2a1: *monorepo*!\n================================\n- 2nd release, own \"mono-project\" splitted into 2-project \"monorepo\":\n - **polyvers:** cmdline tool\n - **polyversion:** library code for program-sources to derive version from git-tags\n- `init`, `status`, `bump` and `config` commands work.\n- Read/write YAML config file ``.polyvers.yaml`` at the git-root,\n and can automatically discover used configuration (from existing git *tags*\n or projects files).\n- Support both ``--monorepo`` and ``--mono-project`` configurations.\n- By default ``__init__.py``, ``setup.py`` and ``README.rst`` files are engraved\n with bumped version.\n\n2018-05-16: 0.0.2a0\n-------------------\nbroken\n\n\n2018-01-29: 0.0.1a0: *mono-project*\n===================================\n- First release on PyPI as *mono-project*\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "https://pypi.org/project/polyvers/", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/jrcstu/polyvers", "keywords": "version-management,configuration-management,versioning,git,monorepo,tool,library", "license": "EUPL 1.2", "maintainer": "", "maintainer_email": "", "name": "polyvers", "package_url": "https://pypi.org/project/polyvers/", "platform": "any", "project_url": "https://pypi.org/project/polyvers/", "project_urls": { "Documentation": "https://polyvers.readthedocs.io/", "Download": "https://pypi.org/project/polyvers/", "Homepage": "https://github.com/jrcstu/polyvers", "Polyversion": "https://pypi.org/project/polyversion/", "Source": "https://github.com/jrcstu/polyvers", "Tracker": "https://github.com/jrcstu/polyvers/issues" }, "release_url": "https://pypi.org/project/polyvers/0.1.1a1/", "requires_dist": [ "polyversion (>=0.2.0a2)", "boltons", "toolz", "rainbow-logging-handler", "ruamel.yaml", "ipython-genutils", "spectate", "ruamel.yaml (>=0.15.37)", "packaging (>=17.1)", "contextvars; python_version < \"3.7\"", "pytest (>=3.5.0); extra == 'test'", "pytest-runner; extra == 'test'", "pytest-cov; extra == 'test'", "flake8; extra == 'test'", "flake8-builtins; extra == 'test'", "flake8-mutable; extra == 'test'", "mypy; (python_version>=\"3\") and extra == 'test'" ], "requires_python": ">=3.6", "summary": "Bump sub-project versions in Git monorepos independently.", "version": "0.1.1a1" }, "last_serial": 4143804, "releases": { "0.0.1a1": [ { "comment_text": "", "digests": { "md5": "05dba5e978a6ca057dc741eb1eb19248", "sha256": "701e52105b5299cb41d3aa0bde76a5ed6c41289c0e4bda638bfe377f9ff4b20b" }, "downloads": -1, "filename": "polyvers-0.0.1a1-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "05dba5e978a6ca057dc741eb1eb19248", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 146328, "upload_time": "2018-04-02T17:47:04", "url": "https://files.pythonhosted.org/packages/8f/13/31c538efed613ba547afdd5d1fa8808d4759c6e0b70a8aafdbdd09321b39/polyvers-0.0.1a1-py2.py3-none-any.whl" } ], "0.0.1a3": [ { "comment_text": "", "digests": { "md5": "6449a7d7814ba2605e215f285c7afd52", "sha256": "aba91d8906e1a31b1ed885e3839f3f72846a5315293442bf783cb15899e5a8a8" }, "downloads": -1, "filename": "polyvers-0.0.1a3-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "6449a7d7814ba2605e215f285c7afd52", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 147565, "upload_time": "2018-04-02T19:58:21", "url": "https://files.pythonhosted.org/packages/29/29/e67b682b724d43d321a652fa93052e52dd4b3460111f6a54d0157af7d6d2/polyvers-0.0.1a3-py2.py3-none-any.whl" } ], "0.0.2a0": [ { "comment_text": "", "digests": { "md5": "f56a738684a9d5dcbf07770b5f24cb5b", "sha256": "d54152bc3839ae89b30fff17a365a2bce5438f277cf6ce29ae4aa9256fd9d110" }, "downloads": -1, "filename": "polyvers-0.0.2a0-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "f56a738684a9d5dcbf07770b5f24cb5b", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6", "size": 147121, "upload_time": "2018-05-17T00:14:16", "url": "https://files.pythonhosted.org/packages/1d/c6/9d22b8f680ad50c5f8224ff72c261ce345e63a97f0da6b7ddd37f92e4901/polyvers-0.0.2a0-py2.py3-none-any.whl" } ], "0.0.2a1": [ { "comment_text": "", "digests": { "md5": "201179a8825e0fb9c5dac59dc616a42e", "sha256": "0a53b813fb2e1ad0484c75e8cd86c87c681639e60f8ea4a6c1ff77e7c8b1125c" }, "downloads": -1, "filename": "polyvers-0.0.2a1-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "201179a8825e0fb9c5dac59dc616a42e", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6", "size": 147420, "upload_time": "2018-05-17T02:36:39", "url": "https://files.pythonhosted.org/packages/9e/c5/e394ec75834ae0e0b973f40e12837e47a67e511a9f4bcb0ce9341c07a14a/polyvers-0.0.2a1-py2.py3-none-any.whl" } ], "0.0.2a10": [ { "comment_text": "", "digests": { "md5": "7f5dbf620712811b5d65d43a68b1f21a", "sha256": "bf5ab422c61aa3d4fbc35b2a4df9be79570e82d61d1b4163e7e8b5222ed315a0" }, "downloads": -1, "filename": "polyvers-0.0.2a10-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "7f5dbf620712811b5d65d43a68b1f21a", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6", "size": 151279, "upload_time": "2018-05-24T01:51:57", "url": "https://files.pythonhosted.org/packages/47/35/bcf946632920c54740281e995daa91db00d064d8277c2548a0c1d625fa39/polyvers-0.0.2a10-py2.py3-none-any.whl" } ], "0.0.2a3": [ { "comment_text": "", "digests": { "md5": "657f9fa9b390dd258010db82056a7c7c", "sha256": "70cb6bd0b1bf8a43f6c2c2177963f7c6ea3279b809a7211f4bcb01062ff32af0" }, "downloads": -1, "filename": "polyvers-0.0.2a3-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "657f9fa9b390dd258010db82056a7c7c", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6", "size": 147604, "upload_time": "2018-05-17T22:20:29", "url": "https://files.pythonhosted.org/packages/70/88/f0700c6360034373e420b606fdfd393dfe1012044b860f22d01efdc996a4/polyvers-0.0.2a3-py2.py3-none-any.whl" } ], "0.0.2a4": [ { "comment_text": "", "digests": { "md5": "84a744f0aa184aab4a4453ff3a76a975", "sha256": "59d3fe5990961d005bb6d270623c7ec461d9f9b8a5d58a95e603c1a4a3e0778b" }, "downloads": -1, "filename": "polyvers-0.0.2a4-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "84a744f0aa184aab4a4453ff3a76a975", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6", "size": 147650, "upload_time": "2018-05-17T22:29:18", "url": "https://files.pythonhosted.org/packages/82/16/590f4e8fa0b23ef7e95fc6a9d462d9a0756f46a3efe3f5ce3ebe149259b4/polyvers-0.0.2a4-py2.py3-none-any.whl" } ], "0.0.2a5": [ { "comment_text": "", "digests": { "md5": "8d136c006ea2633b5f2a98541d53d6ca", "sha256": "a1be30c8d552699c2dda4cf487db32250b62eae06a84dc9b97a6343e5eed632d" }, "downloads": -1, "filename": "polyvers-0.0.2a5-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "8d136c006ea2633b5f2a98541d53d6ca", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6", "size": 147663, "upload_time": "2018-05-18T01:42:12", "url": "https://files.pythonhosted.org/packages/1c/c5/2b6d5e6aeaa55dd77e352e85b0b688e0963d399dd848d487076c6c58b7ee/polyvers-0.0.2a5-py2.py3-none-any.whl" } ], "0.0.2a6": [ { "comment_text": "", "digests": { "md5": "650ce63b99c2e8ba9bd8f8aae4dc58c4", "sha256": "ad6936b520da7784f110230646e56cf4abf205dddf9e58682804b95233775842" }, "downloads": -1, "filename": "polyvers-0.0.2a6-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "650ce63b99c2e8ba9bd8f8aae4dc58c4", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6", "size": 149194, "upload_time": "2018-05-18T16:37:00", "url": "https://files.pythonhosted.org/packages/49/d6/0101999f6b174ea374b4388badb27e0201bca1472a8b8d09bdc2370ecbf0/polyvers-0.0.2a6-py2.py3-none-any.whl" } ], "0.0.2a7": [ { "comment_text": "", "digests": { "md5": "c6e3b6a7f3d0f6b5c7141127de41fef2", "sha256": "bd1538a20391002fcf9cf9cd32387b18b1f4a52ff7a9654b493674455d0e8c63" }, "downloads": -1, "filename": "polyvers-0.0.2a7-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "c6e3b6a7f3d0f6b5c7141127de41fef2", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6", "size": 149398, "upload_time": "2018-05-18T19:54:35", "url": "https://files.pythonhosted.org/packages/5a/1f/d462c4ac57e773592fc5b5c3868dff5fde3097b6bef55686c8a328cb8c7e/polyvers-0.0.2a7-py2.py3-none-any.whl" } ], "0.0.2a8": [ { "comment_text": "", "digests": { "md5": "05d4fd1c58116f5b39e494e2b5b69811", "sha256": "a8c01e5173a5f59c63a365b6a9aaa733276a4e0b10b121b760ae4cb4a8f533a8" }, "downloads": -1, "filename": "polyvers-0.0.2a8-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "05d4fd1c58116f5b39e494e2b5b69811", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6", "size": 149609, "upload_time": "2018-05-18T21:51:54", "url": "https://files.pythonhosted.org/packages/8b/b2/a8744aa3ccb294575da2d9a785e6359d06735d50cbc4a036b7268871eb0f/polyvers-0.0.2a8-py2.py3-none-any.whl" } ], "0.0.2a9": [ { "comment_text": "", "digests": { "md5": "db77c1709c9a72172117c6345709e6d0", "sha256": "55a611285f9842129d5febf143e8c411d9fde1019bf5730da1ed97b2023ed752" }, "downloads": -1, "filename": "polyvers-0.0.2a9-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "db77c1709c9a72172117c6345709e6d0", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6", "size": 150799, "upload_time": "2018-05-23T02:14:54", "url": "https://files.pythonhosted.org/packages/3f/1d/85b23b0efb2855482ae11f579d343908f2e3df96d710ba3f6318bf356150/polyvers-0.0.2a9-py2.py3-none-any.whl" } ], "0.0.2a9.post0": [ { "comment_text": "", "digests": { "md5": "4ce097e69ed632738579ae417faf62ad", "sha256": "52cd58e2af6c9df5739e931a49a878790b3a5b31d338c16278c31cbea1580c57" }, "downloads": -1, "filename": "polyvers-0.0.2a9.post0-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "4ce097e69ed632738579ae417faf62ad", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6", "size": 150889, "upload_time": "2018-05-23T02:18:17", "url": "https://files.pythonhosted.org/packages/66/8f/b3034596d38c15c2a705b0cf12eb4b5a11ec338006e752fa8270495a6e67/polyvers-0.0.2a9.post0-py2.py3-none-any.whl" } ], "0.1.0a0": [ { "comment_text": "", "digests": { "md5": "03e243bae89c78f50d0b733d76249c49", "sha256": "6724d70aaed3ef8e511464e5df19f6889f4d20a25e159b5d8cc44d40b7ccf893" }, "downloads": -1, "filename": "polyvers-0.1.0a0-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "03e243bae89c78f50d0b733d76249c49", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6", "size": 155763, "upload_time": "2018-06-05T12:56:14", "url": "https://files.pythonhosted.org/packages/f9/3e/7a302a6850aa186f5e57ae37fcad197709cb5eaa2b770cd40a95065ba44a/polyvers-0.1.0a0-py2.py3-none-any.whl" } ], "0.1.0a1": [ { "comment_text": "", "digests": { "md5": "4996e3d46406b2742aa3b0a4f3dfd0af", "sha256": "fcdddf0da0bf256e11ecf7a5547b82833a52c295f0a0850f6d9b5c0753567e59" }, "downloads": -1, "filename": "polyvers-0.1.0a1-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "4996e3d46406b2742aa3b0a4f3dfd0af", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6", "size": 160684, "upload_time": "2018-06-06T14:58:03", "url": "https://files.pythonhosted.org/packages/a3/00/023ab5579bc526d82ccf9247a32d4cedda627732789b4e8d1544450a6004/polyvers-0.1.0a1-py2.py3-none-any.whl" } ], "0.1.1a0": [ { "comment_text": "", "digests": { "md5": "66048ab37bcacf78e451a551f815ddc3", "sha256": "f7aeed51185c0f86f24a603374ab4abb27ff4c50c444d52444e42c1b9e61cda4" }, "downloads": -1, "filename": "polyvers-0.1.1a0-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "66048ab37bcacf78e451a551f815ddc3", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6", "size": 162511, "upload_time": "2018-07-06T00:46:34", "url": "https://files.pythonhosted.org/packages/92/9a/b5063b0d91ff50550fd2ddca4ccc3916d0debe3502ae42d18fe78c2d444b/polyvers-0.1.1a0-py2.py3-none-any.whl" } ], "0.1.1a1": [ { "comment_text": "", "digests": { "md5": "4e268b849e3e013ccbf47e1100e286f0", "sha256": "43e95f4629c24a01880169f233f597c748c7dcf69f55b25e9e2acb5fe2f4776d" }, "downloads": -1, "filename": "polyvers-0.1.1a1-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "4e268b849e3e013ccbf47e1100e286f0", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6", "size": 162724, "upload_time": "2018-08-07T11:38:38", "url": "https://files.pythonhosted.org/packages/71/9c/ad12077ac160e53e51335e0b2bf993573f21bc09ef52e0a5bd9257b4816d/polyvers-0.1.1a1-py2.py3-none-any.whl" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "4e268b849e3e013ccbf47e1100e286f0", "sha256": "43e95f4629c24a01880169f233f597c748c7dcf69f55b25e9e2acb5fe2f4776d" }, "downloads": -1, "filename": "polyvers-0.1.1a1-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "4e268b849e3e013ccbf47e1100e286f0", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6", "size": 162724, "upload_time": "2018-08-07T11:38:38", "url": "https://files.pythonhosted.org/packages/71/9c/ad12077ac160e53e51335e0b2bf993573f21bc09ef52e0a5bd9257b4816d/polyvers-0.1.1a1-py2.py3-none-any.whl" } ] }