You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Currently the plugin api for providing a custom reporter is def file_reporter(filename) -> FileReporter. This API makes it hard to subclass PythonFileReporter since its constructor takes and optional coverage argument in addition to the morf to report on. In particular, the Coverage instance is not optional for the successful execution of fr.parser and fr.no_branch_lines. This can be worked around ~like so:
classMyFileReporter(PythonFileReporter):
def__init__(self, morf, fancy_rel_filename, coverage=None):
super(MyFileReporter, self).__init__(morf, coverage=coverage)
self._fancy_rel_filename=fancy_rel_filename# What I want to customize:defrelative_filename(self):
returnself._fancy_rel_filename# What I have to implement to workaround:@propertydefparser(self):
"""Lazily create a :class:`PythonParser`."""ifself._parserisNone:
self._parser=PythonParser(
filename=self.filename,
exclude=None, # Lost configurability here.
)
self._parser.parse_source()
returnself._parser@expensivedefno_branch_lines(self):
no_branch=self.parser.lines_matching(
join_regex(DEFAULT_PARTIAL[:]), # Lost configurability here.join_regex(DEFAULT_PARTIAL_ALWAYS[:]) # Lost configurability here.
)
returnno_branch
The workaround is necessitated by the plugin lifecycle as it stands, where there is no access to the active Coverage instance FWICT. It looks like configuring plugins set up a bit of chicken/egg if Coverage passed itself into coverage_init; although, this would work in the example case since by the time MyFileReporter actually used the passed-in Coverage instance, it would be fulliy _init'ed. Perhaps the CoveragePlugin API could have def python_file_reporter(filename, coverage) -> PythonFileReporter method added or else there could be a PythonCoveragePlugin or CoveragePlugin2 API that amended the existing file_reporter API signature. ...Or, perhaps I'm missing something! That would be best.
I'm happy to whip up a patch if one is needed and any of these ideas or others would work.
@jsirois Thanks for the report, and for trying the plugins! Help me understand what you are trying to accomplish with your plugin: what's the larger problem you are trying to solve?
Original comment byJohn Sirois (Bitbucket: jsirois, GitHub: jsirois)
Ah, looks like combine doesn't have any include/exclude filtering, so I think running 1 combine per source root won't do the trick. The 1st run will just map all symlink farm files to the 1st source root and then all remaining combines will no-op.
Originally reported by John Sirois (Bitbucket: jsirois, GitHub: jsirois)
N.B.: Obsoletes https://bitbucket.org/ned/coveragepy/issues/645/modifying-coverage-reporting-for-python
Currently the plugin api for providing a custom reporter is
def file_reporter(filename) -> FileReporter
. This API makes it hard to subclassPythonFileReporter
since its constructor takes and optionalcoverage
argument in addition to themorf
to report on. In particular, theCoverage
instance is not optional for the successful execution offr.parser
andfr.no_branch_lines
. This can be worked around ~like so:The workaround is necessitated by the plugin lifecycle as it stands, where there is no access to the active
Coverage
instance FWICT. It looks like configuring plugins set up a bit of chicken/egg ifCoverage
passed itself intocoverage_init
; although, this would work in the example case since by the timeMyFileReporter
actually used the passed-inCoverage
instance, it would be fulliy _init'ed. Perhaps theCoveragePlugin
API could havedef python_file_reporter(filename, coverage) -> PythonFileReporter
method added or else there could be aPythonCoveragePlugin
orCoveragePlugin2
API that amended the existingfile_reporter
API signature. ...Or, perhaps I'm missing something! That would be best.I'm happy to whip up a patch if one is needed and any of these ideas or others would work.
The text was updated successfully, but these errors were encountered: