{
"info": {
"author": "Alex Conrad",
"author_email": "alexandre.conrad@gmail.com",
"bugtrack_url": null,
"classifiers": [
"License :: OSI Approved :: MIT License",
"Natural Language :: English",
"Operating System :: OS Independent",
"Programming Language :: Python",
"Programming Language :: Python :: 2.6",
"Programming Language :: Python :: 2.7",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.3",
"Programming Language :: Python :: 3.4",
"Topic :: Software Development :: Libraries :: Python Modules"
],
"description": "pycobertura\n===========\n\nA code coverage diff tool for Cobertura reports.\n\n|Travis| |PyPI|\n\n- `About <#about>`__\n- `Install <#install>`__\n- `CLI usage <#cli-usage>`__\n- `Library usage <#library-usage>`__\n- `How to contribute? <#how-to-contribute>`__\n- `FAQ <#faq>`__\n\nAbout\n-----\n\npycobertura is a generic\n`Cobertura `__ report parser. It\nwas also designed to help prevent code coverage from decreasing with the\n``pycobertura diff`` command: any line changed should be tested and\nuncovered changes should be clearly visible without letting legacy\nuncovered code get in the way so developers can focus solely on their\nchanges.\n\nFeatures:\n\n- show coverage summary of a cobertura file\n- output in plain text or HTML\n- compare two cobertura files and show changes in coverage\n- colorized diff output\n- diff exit status of non-zero if coverage worsened or if any changes\n were left uncovered\n- fail based on uncovered lines rather than on decrease of coverage\n rate (`see\n why <#why-is-the-number-of-uncovered-lines-used-as-the-metric-to-check-if-code-coverage-worsened-rather-than-the-line-rate>`__)\n\nNOTE: The API is unstable any may be subject to changes until it reaches\n1.0.\n\nInstall\n-------\n\n::\n\n $ pip install pycobertura\n\nCLI usage\n---------\n\npycobertura provides a command line interface to report on coverage\nfiles.\n\nHelp commands\n~~~~~~~~~~~~~\n\nDifferent help screens are available depending on what you need help\nabout.\n\n::\n\n $ pycobertura --help\n $ pycobertura show --help\n $ pycobertura diff --help\n\nCommand ``show``\n~~~~~~~~~~~~~~~~\n\nThe ``show`` command displays the report summary of a coverage file.\n\n::\n\n $ pycobertura show coverage.xml\n Filename Stmts Miss Cover Missing\n ------------------------- ------- ------ ------- ---------\n pycobertura/__init__.py 1 0 100.00%\n pycobertura/cli.py 18 0 100.00%\n pycobertura/cobertura.py 93 0 100.00%\n pycobertura/reporters.py 129 0 100.00%\n pycobertura/utils.py 12 0 100.00%\n TOTAL 253 0 100.00%\n\nThe following is a screenshot of the HTML version of another coverage\nfile which also include the source code with highlighted source code to\nindicate whether lines were covered (green) or not (red).\n\n::\n\n pycobertura show --format html --output coverage.html coverage.xml\n\n|image2|\n\nCommand ``diff``\n~~~~~~~~~~~~~~~~\n\nYou can also use the ``diff`` command to show the difference between two\ncoverage files. To properly compute the ``Missing`` column, it is\nnecessary to provide the source code that was used to generate each of\nthe passed Cobertura reports (`see\nwhy <#why-do-i-need-to-provide-the-path-to-the-source-code-directory>`__).\n\n::\n\n $ pycobertura diff coverage.old.xml coverage.new.xml --source1 old_source/ --source2 new_source/\n Filename Stmts Miss Cover Missing\n ---------------- ------- ------ -------- ---------\n dummy/dummy.py - -2 +50.00% -2, -5\n dummy/dummy2.py +2 - +100.00%\n TOTAL +2 -2 +50.00%\n\nThe column ``Missing`` will show line numbers prefixed with either a\nplus sign ``+`` or a minus sign ``-``. When prefixed with a plus sign,\nthe line was introduced as uncovered and is shown in red, when prefixed\nas a minus sign, the line is no longer uncovered and is rendered in\ngreen.\n\nThis screenshot shows how the HTML output only applies coverage\nhighlighting to the parts of the code where the coverage has changed\n(from covered to uncovered, or vice versa).\n\n::\n\n pycobertura diff --format html --output coverage.html ./master/coverage.xml ./myfeature/coverage.xml\n\n|image3|\n\n``diff`` exit codes\n^^^^^^^^^^^^^^^^^^^\n\nUpon exit, the ``diff`` command may return various exit codes:\n\n- 0: all is good\n- 1: some exception occurred (likely due to inappropriate usage or a\n bug in pycobertura)\n- 2: coverage worsened (implies 3)\n- 3: not all changes are covered\n\nLibrary usage\n-------------\n\nUsing it as a library in your Python application is easy:\n\n.. code:: python\n\n from pycobertura import Cobertura\n cobertura = Cobertura('coverage.xml')\n\n cobertura.version == '4.0.2'\n cobertura.line_rate() == 1.0 # 100%\n cobertura.files() == [\n 'pycobertura/__init__.py',\n 'pycobertura/cli.py',\n 'pycobertura/cobertura.py',\n 'pycobertura/reporters.py',\n 'pycobertura/utils.py',\n ]\n cobertura.line_rate('pycobertura/cli.py') == 1.0\n\n from pycobertura import TextReporter\n tr = TextReporter(cobertura)\n tr.generate() == \"\"\"\\\n Filename Stmts Miss Cover Missing\n ------------------------- ------- ------ ------- ---------\n pycobertura/__init__.py 1 0 100.00%\n pycobertura/cli.py 18 0 100.00%\n pycobertura/cobertura.py 93 0 100.00%\n pycobertura/reporters.py 129 0 100.00%\n pycobertura/utils.py 12 0 100.00%\n TOTAL 253 0 100.00%\"\"\"\n\n from pycobertura import TextReporterDelta\n\n coverage1 = Cobertura('coverage1.xml')\n coverage2 = Cobertura('coverage2.xml')\n delta = TextReporterDelta(coverage1, coverage2)\n delta.generate() == \"\"\"\\\n Filename Stmts Miss Cover Missing\n ---------------- ------- ------ -------- ---------\n dummy/dummy.py - -2 +50.00% -2, -5\n dummy/dummy2.py +2 - +100.00%\n TOTAL +2 -2 +50.00%\"\"\"\n\nHow to contribute?\n------------------\n\nFound a bug/typo? Got a patch? Have an idea? Please use Github issues or\nfork pycobertura and submit a pull request (PR). All contributions are\nwelcome!\n\nIf you submit a PR:\n\n- ensure the description of your PR illustrates your changes clearly by\n showing what the problem was and how you fixed it (before/after)\n- make sure your changes are covered with one or more tests\n- add a descriptive note in the CHANGES file under the ``Unreleased``\n section\n- update the README accordingly if your changes outdate the\n documentation\n- make sure all tests are passing using ``tox``\n\n::\n\n pip install tox\n tox\n\nFAQ\n---\n\nHow does pycobertura work?\n~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nPycobertura takes two different Cobertura reports and compares them line\nby line. If the coverage status of a line changed from covered to\nuncovered or vice versa, then pycobertura will report it. Sometimes you\nhave no code changes at all, the only changes were to add more tests and\npycobertura will show you the progress.\n\nPycobertura was initially designed as a general purpose Cobertura parser\nand can generate a summary table for a single Cobertura file (the\n``show`` command).\n\nI only have one Cobertura report, can I just see my uncovered changes?\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nYes. All you have to do is pass your same coverage report twice and\nprovide the path to the two different code bases:\n\n.. code:: bash\n\n pycobertura diff coverage.xml coverage.xml --source1 master/ --source2 myfeature/\n\nBut keep in mind that this will not show you if your changes have\nintroduced a drop in coverage elsewhere in the code base.\n\nWhy doesn\u2019t pycobertura use git to diff the source given revision SHAs rather than passing paths to the source code?\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nBecause we would have to support N version control systems (VCS). It is\neasy enough to generate a directory that contains the source code at a\ngiven commit or branch name that it\u2019s not a top priority for pycobertura\nto be VCS-aware:\n\n.. code:: bash\n\n git archive --prefix=source1/ ${BRANCH_OR_COMMIT1} | tar -xf -\n git archive --prefix=source2/ ${BRANCH_OR_COMMIT2} | tar -xf -\n pycobertura diff --source1 source1/ --source2 source2/ coverage1.xml coverage2.xml -o output.html\n rm -rf source1/ source2/\n\nMercurial has ``hg archive`` and Subversion has ``svn export``. These\nare simple pre-steps to running ``pycobertura diff``.\n\nAlso, the code repository may not always be available at the time\npycobertura is run. Typically, in Continous Delivery pipelines, only\n`artifacts `__\nare available.\n\nWhy do I need to provide the path to the source code directory?\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nWith the command ``pycobertura show``, you don\u2019t need to provide the\nsource code directory, unless you want the HTML output which will\nconveniently render the highlighted source code for you.\n\nBut with ``pycobertura diff``, if you care about *which* lines are\ncovered or uncovered (and not just a global count), then you will need\nto provide the source for *each* of the reports.\n\nTo better understand why, let\u2019s assume we have 2 Cobertura reports with\nthe following info:\n\nReport A:\n\n::\n\n line 1, hit\n line 2, miss\n line 3, hit\n\nand Report B:\n\n::\n\n line 1, hit\n line 2, miss\n line 3, hit\n line 4, miss\n line 5, hit\n\nHow can you tell which lines need to be highlighted? Naively, you\u2019d\nassume that lines 4-5 were added and these should be the highlighted\nlines, the ones part of your coverage diff. Well, that doesn\u2019t quite\nwork.\n\nThe code for Report A is:\n\n.. code:: python\n\n if foo is True: # line 1\n total += 1 # line 2\n return total # line 3\n\nThe code for Report B is:\n\n.. code:: python\n\n if foo is False: # line 1 # new line\n total -= 1 # line 2 # new line\n elif foo is True: # line 3 # modified line\n total += 1 # line 4, unchanged\n return total # line 5, unchanged\n\nThe code change are lines 1-3 and these are the ones you want to\nhighlight. Lines 4-5 don\u2019t need to be highlighted (unless coverage\nstatus changed in-between).\n\nSo, to accurately highlight the lines that have changed, the coverage\nreports alone are not sufficient and this is why you need to provide the\npath to the source that was used to generate each of the Cobertura\nreports and diff them to see which lines actually changed to report\naccurate coverage.\n\nWhen should I use pycobertura?\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\npycobertura was built as a tool to educate developers about the testing\nculture in such way that any code change should have one or more tests\nalong with it.\n\nYou can use pycobertura in your Continous Integration (CI) or Continous\nDelivery (CD) pipeline which would fail a build if the code changes\nworsened the coverage. For example, when a pull request is submitted,\nthe new code should have equal or better coverage than the branch it\u2019s\ngoing to be merged into. Or if code navigates through a release pipeline\nand the new code has worse coverage than what\u2019s already in Production,\nthen the release is aborted.\n\nWhen a build is triggered by your CI/CD pipeline, each testing stage\nwould typically store an\n`artifact `__\nof the source code and another one of the Cobertura report. An extra\nstage in the pipeline could ensure that the coverage did not worsen.\nThis can be done by retrieving the artifacts of the current build as\nwell as the \u201ctarget\u201d artifacts (code and Cobertura report of Production\nor target branch of a pull request). Then ``pycobertura diff`` will take\ncare of failing the build if the coverage worsened (return a non-zero\nexit code) and then the pycobertura report can be published as an\nartifact to make it available to developers to look at.\n\nThe step could look like this:\n\n.. code:: bash\n\n # Download artifacts of current build\n curl -o coverage.${BUILD_ID}.xml https://ciserver/artifacts/${BUILD_ID}/coverage.xml\n curl -o source.${BUILD_ID}.zip https://ciserver/artifacts/${BUILD_ID}/source.zip\n\n # Download artifacts of already-in-Prod build\n curl -o coverage.${PROD_BUILD}.xml https://ciserver/artifacts/${PROD_BUILD}/coverage.xml\n curl -o source.${PROD_BUILD}.zip https://ciserver/artifacts/${PROD_BUILD}/source.zip\n\n unzip source.${BUILD_ID}.zip -d source.${BUILD_ID}\n unzip source.${PROD_BUILD}.zip -d source.${PROD_BUILD}\n\n # Compare\n pycobertura diff --format html \\\n --output pycobertura-diff.${BUILD_ID}.html \\\n --source1 source.${PROD_BUILD} \\\n --source2 source.${BUILD_ID} \\\n coverage.${PROD_BUILD}.xml \\\n coverage.${BUILD_ID}.xml\n\n # Upload the pycobertura report artifact\n curl -F filedata=@pycobertura-diff.${BUILD_ID}.html http://ciserver/artifacts/${BUILD_ID}/\n\nWhy is the number of uncovered lines used as the metric to check if code coverage worsened rather than the line rate?\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThe line rate (percentage of covered lines) can legitimately go down for\na number of reasons. To illustrate, suppose we have this code coverage\nreport for version A of our code:\n\n::\n\n line 1: hit\n line 2: hit\n line 3: miss\n line 4: hit\n line 5: hit\n\nHere, the line rate is 80% and uncovered lines is 1 (miss). Later in\nversion B of our code, we legitimately delete a covered line and the\nfollowing coverage report is generated:\n\n::\n\n line 1: hit\n ### line deleted ###\n line 2: miss\n line 3: hit\n line 4: hit\n\nThe line rate decreased from 80% to 75% but uncovered lines is still at\n1. In this case, failing the build based on line rate is inappropriate,\nthus making the line rate the wrong metric to look at when validating\ncoverage.\n\nThe basic idea is that a code base may have technical debt of N\nuncovered lines and you want to prevent N from ever going up.\n\npycobertura sounds cool, but how to I generate a Cobertura file?\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nDepending on your programing language, you need to find a tool that\nmeasures code coverage and generates a Cobertura report which is an XML\nrepresentation of your code coverage results.\n\nIn Python, `coverage.py `__ is\na great tool for measuring code coverage and plugins such as\n`pytest-cov `__ for\n`pytest `__ and\n`nosexcover `__ for\n`nose `__ are available to\ngenerate Cobertura reports while running tests.\n\n`Istanbul `__ can generate\nCobertura reports for Javascript and also has plugins for\n`CoffeeScript `__ if that is\nyour cup of tea.\n\nCobertura is a very common file format available in many testing tools\nfor pretty much all programing languages. pycobertura is language\nagnostic and should work with reports generated by tools in any\nlanguage. But it was mostly developped and tested against reports\ngenerated with the ``pytest-cov`` plugin in Python. If you see issues,\nplease `create a\nticket `__.\n\n.. |Travis| image:: http://img.shields.io/travis/aconrad/pycobertura.svg?style=flat\n :target: https://travis-ci.org/aconrad/pycobertura\n.. |PyPI| image:: http://img.shields.io/pypi/v/pycobertura.svg?style=flat\n :target: https://pypi.python.org/pypi/pycobertura\n.. |image2| image:: http://i.imgur.com/BYnXmAp.png\n.. |image3| image:: http://i.imgur.com/L5ZUarI.png\n\n\n\nRelease Notes\n=============\n\nUnreleased\n----------\n\n0.10.5 (2018-12-11)\n-------------------\n\n- Use a different ``memoize()`` implementation so that cached objects\n can be freed/garbage collected and prevent from running out of memory\n when processing a lot of cobertura files. Thanks @kannaiah\n\n.. _section-1:\n\n0.10.4 (2018-04-17)\n-------------------\n\n- Calculate the correct line rate for diffs (#83). Previously\n ``CoberturaDiff.diff_line_rate`` with no filename argument would\n total up the different line rate changes from all of the modified\n files, which is not the correct difference in line rates between all\n files. Now the difference in line rate from the two reports objects\n will be directly used if no argument is passed. (@borgstrom)\n\n.. _section-2:\n\n0.10.3 (2018-03-20)\n-------------------\n\n- Update author/repository info\n- Update release script to use twine\n\n.. _section-3:\n\n0.10.2 (2018-03-20)\n-------------------\n\n- Avoid duplicate file names in files() (#82). Some coverage reports\n include metrics for multiple classes within the same file and\n redundant rows would be generated for such reports. Thanks James\n DeFelice! (@jdef)\n\n.. _section-4:\n\n0.10.1 (2017-12-30)\n-------------------\n\n- Drop support for Python 2.6\n- Fix a ``IndexError: list index out of range`` error by being less\n specific about where to find ``class`` elements in the Cobertura\n report.\n\n.. _section-5:\n\n0.10.0 (2016-09-27)\n-------------------\n\n- BACKWARDS INCOMPATIBLE: when a source file is not found in disk\n pycobertura will now raise a\n ``pycobertura.filesystem.FileSystem.FileNotFound`` exception instead\n of an ``IOError``.\n- possibility to pass a zip archive containing the source code instead\n of a directory\n- BACKWARDS INCOMPATIBLE: Rename keyword argument\n ``Cobertura(base_path=None)`` > ``Cobertura(source=None)``\n- Introduce new keyword argument ``Cobertura(source_prefix=None)``\n- Fix an ``IOError`` / ``FileNotFound`` error which happens when the\n same coverage report is provided twice to ``pycobertura diff`` (diff\n in degraded mode) but the first code base (``--source1``) is missing\n a file mentioned in the coverage report.\n- Fix a rare bug when diffing coverage xml where one file goes from\n zero lines to non-zero lines.\n\n.. _section-6:\n\n0.9.0 (2016-01-29)\n------------------\n\n- The coverage report now displays the class\u2019s filename instead of the\n class\u2019s name, the latter being more subject to different\n interpretations by coverage tools. This change was done to support\n coverage.py versions 3.x and 4.x.\n- BACKWARDS INCOMPATIBLE: removed ``CoberturaDiff.filename()``\n- BACKWARDS INCOMPATIBLE: removed the term \u201cclass\u201d from the API which\n make it more difficult to reason about. Now preferring \u201cfilename\u201d:\n\n - ``Cobertura.line_rate(class_name=None)`` >\n ``Cobertura.line_rate(filename=None)``\n - ``Cobertura.branch_rate(class_name=None)`` >\n ``Cobertura.branch_rate(filename=None)``\n - ``Cobertura.missed_statements(class_name)`` >\n ``Cobertura.missed_statements(filename)``\n - ``Cobertura.hit_statements(class_name)`` >\n ``Cobertura.hit_statements(filename)``\n - ``Cobertura.line_statuses(class_name)`` >\n ``Cobertura.line_statuses(filename)``\n - ``Cobertura.missed_lines(class_name)`` >\n ``Cobertura.missed_lines(filename)``\n - ``Cobertura.class_source(class_name)`` >\n ``Cobertura.file_source(filename)``\n - ``Cobertura.total_misses(class_name=None)`` >\n ``Cobertura.total_misses(filename=None)``\n - ``Cobertura.total_hits(class_name=None)`` >\n ``Cobertura.total_hits(filename=None)``\n - ``Cobertura.total_statements(class_name=None)`` >\n ``Cobertura.total_statements(filename=None)``\n - ``Cobertura.filepath(class_name)`` >\n ``Cobertura.filepath(filename)``\n - ``Cobertura.classes()`` > ``Cobertura.files()``\n - ``Cobertura.has_classfile(class_name)`` >\n ``Cobertura.has_file(filename)``\n - ``Cobertura.class_lines(class_name)`` >\n ``Cobertura.source_lines(filename)``\n - ``CoberturaDiff.diff_total_statements(class_name=None)`` >\n ``CoberturaDiff.diff_total_statements(filename=None)``\n - ``CoberturaDiff.diff_total_misses(class_name=None)`` >\n ``CoberturaDiff.diff_total_misses(filename=None)``\n - ``CoberturaDiff.diff_total_hits(class_name=None)`` >\n ``CoberturaDiff.diff_total_hits(filename=None)``\n - ``CoberturaDiff.diff_line_rate(class_name=None)`` >\n ``CoberturaDiff.diff_line_rate(filename=None)``\n - ``CoberturaDiff.diff_missed_lines(class_name)`` >\n ``CoberturaDiff.diff_missed_lines(filename)``\n - ``CoberturaDiff.classes()`` > ``CoberturaDiff.files()``\n - ``CoberturaDiff.class_source(class_name)`` >\n ``CoberturaDiff.file_source(filename)``\n - ``CoberturaDiff.class_source_hunks(class_name)`` >\n ``CoberturaDiff.file_source_hunks(filename)``\n - ``Reporter.get_source(class_name)`` >\n ``Reporter.get_source(filename)``\n - ``HtmlReporter.get_class_row(class_name)`` >\n ``HtmlReporter.get_class_row(filename)``\n - ``DeltaReporter.get_source_hunks(class_name)`` >\n ``DeltaReporter.get_source_hunks(filename)``\n - ``DeltaReporter.get_class_row(class_name)`` >\n ``DeltaReporter.get_file_row(filename)``\n\n.. _section-7:\n\n0.8.0 (2015-09-28)\n------------------\n\n- *BACKWARDS INCOMPATIBLE*: return different exit codes depending on\n ``diff`` status. Thanks Marc Abramowitz.\n\n.. _section-8:\n\n0.7.3 (2015-07-23)\n------------------\n\n- a non-zero exit code will be returned if not all changes have been\n covered. If ``--no-source`` is provided then it will only check if\n coverage has worsened, which is less strict.\n\n.. _section-9:\n\n0.7.2 (2015-05-29)\n------------------\n\n- memoize expensive methods of ``Cobertura`` (lxml/disk)\n- assume source code is UTF-8\n\n.. _section-10:\n\n0.7.1 (2015-04-20)\n------------------\n\n- prevent misalignment of source code and line numbers, this would\n happen when the source is too long causing it to wrap around.\n\n.. _section-11:\n\n0.7.0 (2015-04-17)\n------------------\n\n- pycobertura diff now renders colors in terminal with Python 2.x\n (worked for Python 3.x). For this to work we need to require Click\n 4.0 so that the color auto-detection of Click can be overridden (not\n possible in Click 3.0)\n- Introduce ``Line`` namedtuple object which represents a line of\n source code and coverage status.\n- *BACKWARDS INCOMPATIBLE*: List of tuples generated or handled by\n various function now return ``Line`` objects (namedtuple) for each\n line.\n- add plus sign (+) in front of lines that were added/modified on HTML\n diff report\n- upgrade to Skeleton 2.0.4 (88f03612b05f093e3f235ced77cf89d3a8fcf846)\n- add legend to HTML diff report\n\n.. _section-12:\n\n0.6.0 (2015-02-03)\n------------------\n\n- expose ``CoberturaDiff`` under the pycobertura namespace\n- pycobertura diff no longer reports unchanged classes\n\n.. _section-13:\n\n0.5.2 (2015-01-13)\n------------------\n\n- fix incorrect \u201cTOTAL\u201d row counts of the diff command when classes\n were added or removed from the second report.\n\n.. _section-14:\n\n0.5.1 (2015-01-08)\n------------------\n\n- Options of pycobertura diff ``--missed`` and ``--no-missed`` have\n been renamed to ``--source`` and ``--no-source`` which will not show\n the source code nor display missing lines since they cannot be\n accurately computed without the source.\n- Optimized xpath syntax for faster class name lookup (~3x)\n- Colorize total missed statements\n- ``pycobertura diff`` exit code will be non-zero until all changes are\n covered\n\n.. _section-15:\n\n0.5.0 (2015-01-07)\n------------------\n\n- ``pycobertura diff`` HTML output now only includes hunks of lines\n that have coverage changes and skips unchanged classes\n- handle asymmetric presence of classes in the reports (regression\n introduced in 0.4.0)\n- introduce ``CoberturaDiff.diff_missed_lines()``\n- introduce ``CoberturaDiff.classes()``\n- introduce ``CoberturaDiff.filename()``\n- introduce ``Cobertura.filepath()`` which will return the system path\n to the file. It uses ``base_path`` to resolve the path.\n- the summary table of ``pycobertura diff`` no longer shows classes\n that are no longer present\n- ``Cobertura.filename()`` now only returns the filename of the class\n as found in the Cobertura report, any ``base_path`` computation is\n omitted.\n- Argument ``xml_source`` of ``Cobertura.__init__()`` is renamed to\n ``xml_path`` and only accepts an XML path because much of the logic\n involved in source code path resolution is based on the path provided\n which cannot work with file objects or XML strings.\n- Rename ``Cobertura.source`` -> ``Cobertura.xml_path``\n- ``pycobertura diff`` now takes options ``--missed`` (default) or\n ``--no-missed`` to show missed line numbers. If ``--missed`` is\n given, the paths to the source code must be accessible.\n\n.. _section-16:\n\n0.4.1 (2015-01-05)\n------------------\n\n- return non-zero exit code if uncovered lines rises (previously based\n on line rate)\n\n.. _section-17:\n\n0.4.0 (2015-01-04)\n------------------\n\n- rename ``Cobertura.total_lines()`` ->\n ``Cobertura.total_statements()``\n- rename ``Cobertura.line_hits()`` -> ``Cobertura.hit_statements()``\n- introduce ``Cobertura.missed_statements()``\n- introduce ``Cobertura.line_statuses()`` which returns line numbers\n for a given class name with hit/miss statuses\n- introduce ``Cobertura.class_source()`` which returns the source code\n for a given class along with hit/miss status\n- ``pycobertura show`` now includes HTML source\n- ``pycobertura show`` now accepts ``--source`` which indicates where\n the source code directory is located\n- ``Cobertura()`` now takes an optional ``base_path`` argument which\n will be used to resolve the path to the source code by joining the\n ``base_path`` value to the path found in the Cobertura report.\n- an error is now raised if ``Cobertura`` is passed a non-existent XML\n file path\n- ``pycobertura diff`` now includes HTML source\n- ``pycobertura diff`` now accepts ``--source1`` and ``--source2``\n which indicates where the source code directory of each of the\n Cobertura reports are located\n- introduce ``CoberturaDiff`` used to diff ``Cobertura`` objects\n- argument ``class_name`` for ``Cobertura.total_statements`` is now\n optional\n- argument ``class_name`` for ``Cobertura.total_misses`` is now\n optional\n- argument ``class_name`` for ``Cobertura.total_hits`` is now optional\n\n.. _section-18:\n\n0.3.0 (2014-12-23)\n------------------\n\n- update description of pycobertura\n- pep8-ify\n- add pep8 tasks for tox and travis\n- diff command returns non-zero exit code if coverage worsened\n- ``Cobertura.branch_rate`` is now a method that can take an optional\n ``class_name`` argument\n- refactor internals for improved readability\n- show classes that contain no lines, e.g. ``__init__.py``\n- add ``Cobertura.filename(class_name)`` to retrieve the filename of a\n class\n- fix erroneous reporting of missing lines which was equal to the\n number of missed statements (wrong because of multiline statements)\n\n.. _section-19:\n\n0.2.1 (2014-12-10)\n------------------\n\n- fix py26 compatibility by switching the XML parser to ``lxml`` which\n has a more predictible behavior when used across all Python versions.\n- add Travis CI\n\n.. _section-20:\n\n0.2.0 (2014-12-10)\n------------------\n\n- apply Skeleton 2.0 theme to html output\n- add ``-o`` / ``--output`` option to write reports to a file.\n- known issue: diffing 2 files with options ``--format text``,\n ``--color`` and ``--output`` does not render color under PY2.\n\n.. _section-21:\n\n0.1.0 (2014-12-03)\n------------------\n\n- add ``--color`` and ``--no-color`` options to ``pycobertura diff``.\n- add option ``-f`` and ``--format`` with output of ``text`` (default)\n and ``html``.\n- change class naming from ``report`` to ``reporter``\n\n.. _section-22:\n\n0.0.2 (2014-11-27)\n------------------\n\n- MIT license\n- use pypandoc to convert the ``long_description`` in setup.py from\n Markdown to reStructuredText so pypi can digest and format the\n pycobertura page properly.\n\n.. _section-23:\n\n0.0.1 (2014-11-24)\n------------------\n\n- Initial version",
"description_content_type": "",
"docs_url": null,
"download_url": "",
"downloads": {
"last_day": -1,
"last_month": -1,
"last_week": -1
},
"home_page": "https://github.com/aconrad/pycobertura",
"keywords": "cobertura coverage diff report parser parse xml",
"license": "MIT License",
"maintainer": "",
"maintainer_email": "",
"name": "pycobertura",
"package_url": "https://pypi.org/project/pycobertura/",
"platform": "",
"project_url": "https://pypi.org/project/pycobertura/",
"project_urls": {
"Homepage": "https://github.com/aconrad/pycobertura"
},
"release_url": "https://pypi.org/project/pycobertura/0.10.5/",
"requires_dist": null,
"requires_python": "",
"summary": "A Cobertura coverage parser that can diff reports and show coverage progress.",
"version": "0.10.5"
},
"last_serial": 4588629,
"releases": {
"0.0.1": [
{
"comment_text": "",
"digests": {
"md5": "bdfd070fb6ea938059e5a18a6cea2f26",
"sha256": "5b345352bdb5e9a8735a0dd52c91aa28de6c859311da9e332995463155467f79"
},
"downloads": -1,
"filename": "pycobertura-0.0.1.tar.gz",
"has_sig": false,
"md5_digest": "bdfd070fb6ea938059e5a18a6cea2f26",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 10993,
"upload_time": "2014-11-24T07:21:31",
"url": "https://files.pythonhosted.org/packages/fe/26/6ff5ba4a84304ebeda7cff87d920809d2f27fb76293e1a5e98d3cb648d11/pycobertura-0.0.1.tar.gz"
}
],
"0.0.2": [
{
"comment_text": "",
"digests": {
"md5": "bd2951197db3a2d3d701e41fc30186e4",
"sha256": "0651fb68aba08b470a196694e554e975ba112f381f49710777e532d75dab7b9b"
},
"downloads": -1,
"filename": "pycobertura-0.0.2.tar.gz",
"has_sig": false,
"md5_digest": "bd2951197db3a2d3d701e41fc30186e4",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 11955,
"upload_time": "2014-11-27T05:09:07",
"url": "https://files.pythonhosted.org/packages/25/d2/a1f929e687a568d5daf5d167c8b2e1da8ee221393e622ffd9b4a4ed351a6/pycobertura-0.0.2.tar.gz"
}
],
"0.1.0": [
{
"comment_text": "",
"digests": {
"md5": "3a57b9fdaf8c339a0d00606fbd584abc",
"sha256": "b67d43f8b4c2a464d785ba3b5be10a98143b683ac772e13a9a613889491f2a69"
},
"downloads": -1,
"filename": "pycobertura-0.1.0.tar.gz",
"has_sig": false,
"md5_digest": "3a57b9fdaf8c339a0d00606fbd584abc",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 14808,
"upload_time": "2014-12-03T09:12:24",
"url": "https://files.pythonhosted.org/packages/b4/d2/e45cdc9db25ddf6c95f974658b5635e1f657503d3898a2c2a82a7e4bd8b1/pycobertura-0.1.0.tar.gz"
}
],
"0.10.0": [
{
"comment_text": "",
"digests": {
"md5": "70852f480a44b6131db54df02a16619b",
"sha256": "bca6b056dc166081fb6b450bcdd28a49185f0bd97ed9303cdd3fbf914e4777b2"
},
"downloads": -1,
"filename": "pycobertura-0.10.0.tar.gz",
"has_sig": false,
"md5_digest": "70852f480a44b6131db54df02a16619b",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 54209,
"upload_time": "2016-09-28T06:57:29",
"url": "https://files.pythonhosted.org/packages/2a/bd/cbaf8e62fcecc2f4ded1bf05e34c64a12e1d69e1b6c7db34b3838687d568/pycobertura-0.10.0.tar.gz"
}
],
"0.10.1": [
{
"comment_text": "",
"digests": {
"md5": "101309c555c2c76105ed22e0a4a2316c",
"sha256": "a0dc30b7ace65af574cd37b06b51741865d44f53e0bf0e1b3832501bb48650f2"
},
"downloads": -1,
"filename": "pycobertura-0.10.1.tar.gz",
"has_sig": false,
"md5_digest": "101309c555c2c76105ed22e0a4a2316c",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 54959,
"upload_time": "2017-12-30T17:35:37",
"url": "https://files.pythonhosted.org/packages/36/be/7af3086c9f5ef57c4f8d78e05b91abfea42549a9927f3f0f461c8635fa24/pycobertura-0.10.1.tar.gz"
}
],
"0.10.2": [
{
"comment_text": "",
"digests": {
"md5": "42d12fb19fe13da7bb68c9455db6a7e1",
"sha256": "c9fd05d3085229a929f63cdfdfe180410ee34f9c456972fb66264778b0f60bd1"
},
"downloads": -1,
"filename": "pycobertura-0.10.2.tar.gz",
"has_sig": false,
"md5_digest": "42d12fb19fe13da7bb68c9455db6a7e1",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 55600,
"upload_time": "2018-03-20T17:28:35",
"url": "https://files.pythonhosted.org/packages/dc/3b/21cdbe0735230ca0380648750b6b1eaa29e193b312a856bce7b0fb3a63cb/pycobertura-0.10.2.tar.gz"
}
],
"0.10.3": [
{
"comment_text": "",
"digests": {
"md5": "772d538dd9bfe60cc1dfa16fd29faf87",
"sha256": "5ac32bdbcac3d7f1678934398396584f1d0b668f59e44837ab8d58b45aa57961"
},
"downloads": -1,
"filename": "pycobertura-0.10.3.tar.gz",
"has_sig": false,
"md5_digest": "772d538dd9bfe60cc1dfa16fd29faf87",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 55741,
"upload_time": "2018-03-20T21:11:57",
"url": "https://files.pythonhosted.org/packages/94/58/40a663a3ae485079c3e23bf82a0313bdd4d11d3a03fb2b825ad1f91b3107/pycobertura-0.10.3.tar.gz"
}
],
"0.10.4": [
{
"comment_text": "",
"digests": {
"md5": "f6ee44ba4ffa902e0c250577a61731e9",
"sha256": "6031326f22bae0ee055ebd232cd0eb77697cefbe4ccc8177a7c9a8c5dfdefbeb"
},
"downloads": -1,
"filename": "pycobertura-0.10.4.tar.gz",
"has_sig": false,
"md5_digest": "f6ee44ba4ffa902e0c250577a61731e9",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 55230,
"upload_time": "2018-04-18T06:27:16",
"url": "https://files.pythonhosted.org/packages/6f/5b/ae6767ef5c11a749f651d9c0411d87da3a447dcca6f8760f5e27e0aa8043/pycobertura-0.10.4.tar.gz"
}
],
"0.10.5": [
{
"comment_text": "",
"digests": {
"md5": "5f5c91d5c6489874725d731035aa0b7f",
"sha256": "e35dc9b9bd6e7bc2a0062b20f950b36e0d34644c4cba008cb3cf92505ec2659c"
},
"downloads": -1,
"filename": "pycobertura-0.10.5.tar.gz",
"has_sig": false,
"md5_digest": "5f5c91d5c6489874725d731035aa0b7f",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 56147,
"upload_time": "2018-12-12T04:20:14",
"url": "https://files.pythonhosted.org/packages/ce/dc/4a6c587dd1804dd52447319704d497845d38d6a30b2cde863b91692bff67/pycobertura-0.10.5.tar.gz"
}
],
"0.2.0": [
{
"comment_text": "",
"digests": {
"md5": "23134dc3aa7fe0c3fc88265f79ba8dc8",
"sha256": "5bf1d63936ee14ece60467194ac24b5728aa6de11aa450cc46c1cfda9920fa51"
},
"downloads": -1,
"filename": "pycobertura-0.2.0.tar.gz",
"has_sig": false,
"md5_digest": "23134dc3aa7fe0c3fc88265f79ba8dc8",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 21199,
"upload_time": "2014-12-10T18:38:47",
"url": "https://files.pythonhosted.org/packages/84/e7/827bd7f18d016869d4a4b2162f9a54fd93f01af6af7c8aab08d41f4db67d/pycobertura-0.2.0.tar.gz"
}
],
"0.2.1": [
{
"comment_text": "",
"digests": {
"md5": "abef74a3ec65dc6861adaa9ec0a7180c",
"sha256": "2a2b280f9ed41d20fcfb46889b440d3d5342eb12bd6681fd813cc1d84c4bbc90"
},
"downloads": -1,
"filename": "pycobertura-0.2.1.tar.gz",
"has_sig": false,
"md5_digest": "abef74a3ec65dc6861adaa9ec0a7180c",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 21540,
"upload_time": "2014-12-10T20:40:51",
"url": "https://files.pythonhosted.org/packages/ac/50/fa395198c79fecd6a58200098f0bacc52869e68b67462ca83c1a58ea6f4a/pycobertura-0.2.1.tar.gz"
}
],
"0.3.0": [
{
"comment_text": "",
"digests": {
"md5": "196b528609673ffa8b8a2fff23f2bd55",
"sha256": "a14ef21f251bcbcd0940945ff44281dedc85ce70bf8ae1e64f4f89069b1a8267"
},
"downloads": -1,
"filename": "pycobertura-0.3.0.tar.gz",
"has_sig": false,
"md5_digest": "196b528609673ffa8b8a2fff23f2bd55",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 23718,
"upload_time": "2014-12-23T09:45:18",
"url": "https://files.pythonhosted.org/packages/f8/28/2166ef93b19742b9979396447bed69d477aacf102b45b80fd3f5e6d99563/pycobertura-0.3.0.tar.gz"
}
],
"0.4.0": [
{
"comment_text": "",
"digests": {
"md5": "159cdbd44d8c3b5979849fef5e4ff1f9",
"sha256": "d4fa216b90c0d8dda9722983f85ea36e81ef19b6243870302f69370b7ecc93c1"
},
"downloads": -1,
"filename": "pycobertura-0.4.0.tar.gz",
"has_sig": false,
"md5_digest": "159cdbd44d8c3b5979849fef5e4ff1f9",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 29568,
"upload_time": "2015-01-05T06:13:35",
"url": "https://files.pythonhosted.org/packages/47/59/d1158563409062471a2c94ae4c39445dbb74d8d4053a50ea7521f9f9a5a2/pycobertura-0.4.0.tar.gz"
}
],
"0.4.1": [
{
"comment_text": "",
"digests": {
"md5": "71e6a7a3462c4145c922dabfeeb85aa4",
"sha256": "2705e576b3c37e4459c7b585e5bc81071b6072c487f0c3a4a14e19e3a36a3040"
},
"downloads": -1,
"filename": "pycobertura-0.4.1.tar.gz",
"has_sig": false,
"md5_digest": "71e6a7a3462c4145c922dabfeeb85aa4",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 35070,
"upload_time": "2015-01-06T00:53:22",
"url": "https://files.pythonhosted.org/packages/99/5a/a1bf937bea00714cff54fcb6e63a5f228868731cd7930427892d162b2e68/pycobertura-0.4.1.tar.gz"
}
],
"0.5.0": [
{
"comment_text": "",
"digests": {
"md5": "fc24efd2a45423b19c19c16ef4e72e59",
"sha256": "39227793dde5bdf05495af914781bf42db946c0ed9ab2d8ababc30a99d7c2890"
},
"downloads": -1,
"filename": "pycobertura-0.5.0.tar.gz",
"has_sig": false,
"md5_digest": "fc24efd2a45423b19c19c16ef4e72e59",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 37528,
"upload_time": "2015-01-08T00:51:17",
"url": "https://files.pythonhosted.org/packages/db/6e/df59880885280d325283bf4a9bd906085b548ccdac511e475ceb89345ccf/pycobertura-0.5.0.tar.gz"
}
],
"0.5.1": [
{
"comment_text": "",
"digests": {
"md5": "38e48f94a6f5c89ddce501ffe43369e9",
"sha256": "ae576efea57678a78f9eb6866e87b52813b3fdf581fec28b47eee9cef449ed5a"
},
"downloads": -1,
"filename": "pycobertura-0.5.1.tar.gz",
"has_sig": false,
"md5_digest": "38e48f94a6f5c89ddce501ffe43369e9",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 38888,
"upload_time": "2015-01-08T22:51:49",
"url": "https://files.pythonhosted.org/packages/75/87/0fabdde3bad6b49f8c3f4dfab4a7c39fb9b89a3f1f87394bab06f5720271/pycobertura-0.5.1.tar.gz"
}
],
"0.5.2": [
{
"comment_text": "",
"digests": {
"md5": "43e1410bb527979c1bbe1556c4015581",
"sha256": "7e7cd71c40f9fdbec71ab9bab7fda55e809b2b23e13b00773731b028479e53d3"
},
"downloads": -1,
"filename": "pycobertura-0.5.2.tar.gz",
"has_sig": false,
"md5_digest": "43e1410bb527979c1bbe1556c4015581",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 41579,
"upload_time": "2015-01-13T19:06:50",
"url": "https://files.pythonhosted.org/packages/16/a2/ff99b57e90d37db8fc529b6f2fe18b3048361835c15bc1705add11c189bd/pycobertura-0.5.2.tar.gz"
}
],
"0.6.0": [
{
"comment_text": "",
"digests": {
"md5": "03c437314e1d554a7c9653696b19e4d5",
"sha256": "10e18be57f7c09bfbeaea691b5251f93ef17c08c10894530ecb47a2327b6c926"
},
"downloads": -1,
"filename": "pycobertura-0.6.0.tar.gz",
"has_sig": false,
"md5_digest": "03c437314e1d554a7c9653696b19e4d5",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 41760,
"upload_time": "2015-02-04T07:27:20",
"url": "https://files.pythonhosted.org/packages/96/1a/df1e49cf227f4cd0fd768ca6f304e70e59245f47f29846f0f0ae10859945/pycobertura-0.6.0.tar.gz"
}
],
"0.7.0": [
{
"comment_text": "",
"digests": {
"md5": "7281aa4794a788a229000e49b9351beb",
"sha256": "f9bc5279107d7b5c8a56a3a5644c5f6467ae060159dcfa348844ffbc8e60456e"
},
"downloads": -1,
"filename": "pycobertura-0.7.0.tar.gz",
"has_sig": false,
"md5_digest": "7281aa4794a788a229000e49b9351beb",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 43389,
"upload_time": "2015-04-17T15:37:38",
"url": "https://files.pythonhosted.org/packages/3d/7c/514b6f3913a335ba346ea968a5ec0a872edb5fcfda3befb0a53dda92c262/pycobertura-0.7.0.tar.gz"
}
],
"0.7.1": [
{
"comment_text": "",
"digests": {
"md5": "8bbdd7c24745785374a132c2413622c7",
"sha256": "d87ff46c48fe9507cde8723b6a3a7a5b99876a166b2ca064297deda0695b54c2"
},
"downloads": -1,
"filename": "pycobertura-0.7.1.tar.gz",
"has_sig": false,
"md5_digest": "8bbdd7c24745785374a132c2413622c7",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 43796,
"upload_time": "2015-04-20T18:41:51",
"url": "https://files.pythonhosted.org/packages/f3/6d/81a145854d2455a76db86ae522ab7b8027ff4b8c9038c8ec555cddb35665/pycobertura-0.7.1.tar.gz"
}
],
"0.7.2": [
{
"comment_text": "",
"digests": {
"md5": "dc3c980569643c222052969b2d2deaac",
"sha256": "69db44116f18d7ef8f354185d72f23a1d31d4aa2d64d00805af1f69fcc627a8e"
},
"downloads": -1,
"filename": "pycobertura-0.7.2.tar.gz",
"has_sig": false,
"md5_digest": "dc3c980569643c222052969b2d2deaac",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 44532,
"upload_time": "2015-05-29T23:44:37",
"url": "https://files.pythonhosted.org/packages/f0/18/3dc42759fcbac90b34eec066fdb20c6741af06b86e422d4ab068f50052ec/pycobertura-0.7.2.tar.gz"
}
],
"0.7.3": [
{
"comment_text": "",
"digests": {
"md5": "85ed3eea3d7bed62a3a4de03c9e19442",
"sha256": "4d50164414d3cb1f32fb289face56a95b400976e7630515554cdf1a32080aeb5"
},
"downloads": -1,
"filename": "pycobertura-0.7.3.tar.gz",
"has_sig": false,
"md5_digest": "85ed3eea3d7bed62a3a4de03c9e19442",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 45535,
"upload_time": "2015-07-23T21:34:18",
"url": "https://files.pythonhosted.org/packages/eb/5c/404a9a3df5ecbb22a35c32f5ff2e45f644da148ad557cd6f030919947215/pycobertura-0.7.3.tar.gz"
}
],
"0.8.0": [
{
"comment_text": "",
"digests": {
"md5": "72376c85919328df36328105a7c97119",
"sha256": "abeee2edb3ebc3fc248a8285f0c92775d378f67e73f3d671a095edfee082da4f"
},
"downloads": -1,
"filename": "pycobertura-0.8.0.tar.gz",
"has_sig": false,
"md5_digest": "72376c85919328df36328105a7c97119",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 44023,
"upload_time": "2015-09-28T17:49:37",
"url": "https://files.pythonhosted.org/packages/fd/1e/ff9395cf58c271f4420401d7de9d8956d1631ddf5e79dd509cba3f851ec4/pycobertura-0.8.0.tar.gz"
}
],
"0.9.0": [
{
"comment_text": "",
"digests": {
"md5": "b052132a1cc7736de7aa274e36b49fd6",
"sha256": "083910a3115f03081fa512fbe70ad5c1a68106bfa5d9ba8d4febdd4a52bd974b"
},
"downloads": -1,
"filename": "pycobertura-0.9.0.tar.gz",
"has_sig": false,
"md5_digest": "b052132a1cc7736de7aa274e36b49fd6",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 51278,
"upload_time": "2016-01-29T17:56:23",
"url": "https://files.pythonhosted.org/packages/e6/ef/a0288c4ff2d58835a2f51909efcfb7f4d2974f3201d073d47f328132e136/pycobertura-0.9.0.tar.gz"
}
]
},
"urls": [
{
"comment_text": "",
"digests": {
"md5": "5f5c91d5c6489874725d731035aa0b7f",
"sha256": "e35dc9b9bd6e7bc2a0062b20f950b36e0d34644c4cba008cb3cf92505ec2659c"
},
"downloads": -1,
"filename": "pycobertura-0.10.5.tar.gz",
"has_sig": false,
"md5_digest": "5f5c91d5c6489874725d731035aa0b7f",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 56147,
"upload_time": "2018-12-12T04:20:14",
"url": "https://files.pythonhosted.org/packages/ce/dc/4a6c587dd1804dd52447319704d497845d38d6a30b2cde863b91692bff67/pycobertura-0.10.5.tar.gz"
}
]
}