Skip to content

Commit

Permalink
Reworked CSS class names.
Browse files Browse the repository at this point in the history
  • Loading branch information
Paebbels committed Jan 11, 2024
1 parent c9eff8a commit ae81ea2
Show file tree
Hide file tree
Showing 11 changed files with 142 additions and 97 deletions.
4 changes: 4 additions & 0 deletions .idea/sphinx-reports.iml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 5 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -81,11 +81,11 @@ details.
"directory": "../myPackage",
"fail_below": 80,
"levels": {
30: {"class": "doccov-below30", "desc": "almost undocumented"},
50: {"class": "doccov-below50", "desc": "poorly documented"},
80: {"class": "doccov-below80", "desc": "roughly documented"},
90: {"class": "doccov-below90", "desc": "well documented"},
100: {"class": "doccov-below100", "desc": "excellent documented"},
30: {"class": "report-cov-below30", "desc": "almost undocumented"},
50: {"class": "report-cov-below50", "desc": "poorly documented"},
80: {"class": "report-cov-below80", "desc": "roughly documented"},
90: {"class": "report-cov-below90", "desc": "well documented"},
100: {"class": "report-cov-below100", "desc": "excellent documented"},
},
}
}
Expand Down
10 changes: 5 additions & 5 deletions doc/DocCov/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -53,11 +53,11 @@ See the :ref:`overview page <OVER>` on how to setup and enable the Sphinx extens
"directory": "../myPackage",
"fail_below": 80,
"levels": {
30: {"class": "doccov-below30", "desc": "almost undocumented"},
50: {"class": "doccov-below50", "desc": "poorly documented"},
80: {"class": "doccov-below80", "desc": "roughly documented"},
90: {"class": "doccov-below90", "desc": "well documented"},
100: {"class": "doccov-below100", "desc": "excellent documented"},
30: {"class": "report-cov-below30", "desc": "almost undocumented"},
50: {"class": "report-cov-below50", "desc": "poorly documented"},
80: {"class": "report-cov-below80", "desc": "roughly documented"},
90: {"class": "report-cov-below90", "desc": "well documented"},
100: {"class": "report-cov-below100", "desc": "excellent documented"},
},
}
}
Expand Down
23 changes: 12 additions & 11 deletions doc/conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -261,46 +261,47 @@
# ==============================================================================
# Sphinx-reports - DocCov
# ==============================================================================
_levels = {
30: {"class": "doccov-below30", "desc": "almost undocumented"},
50: {"class": "doccov-below50", "desc": "poorly documented"},
80: {"class": "doccov-below80", "desc": "roughly documented"},
90: {"class": "doccov-below90", "desc": "well documented"},
100: {"class": "doccov-below100", "desc": "excellent documented"}
_coverageLevels = {
30: {"class": "report-cov-below30", "desc": "almost undocumented"},
50: {"class": "report-cov-below50", "desc": "poorly documented"},
80: {"class": "report-cov-below80", "desc": "roughly documented"},
90: {"class": "report-cov-below90", "desc": "well documented"},
100: {"class": "report-cov-below100", "desc": "excellent documented"},
"error": {"class": "report-cov-error", "desc": "internal error"},
}

report_codecov_packages = {
"src": {
"name": "sphinx_reports",
"html_report": "../report/coverage/html",
"fail_below": 80,
"levels": _levels
"levels": _coverageLevels
}
}
report_doccov_packages = {
"src": {
"name": "sphinx_reports",
"directory": "../sphinx_reports",
"fail_below": 80,
"levels": _levels
"levels": _coverageLevels
},
"undocumented": {
"name": "undocumented",
"directory": "../tests/packages/undocumented",
"fail_below": 80,
"levels": _levels
"levels": _coverageLevels
},
"partially": {
"name": "partially",
"directory": "../tests/packages/partially",
"fail_below": 80,
"levels": _levels
"levels": _coverageLevels
},
"documented": {
"name": "documented",
"directory": "../tests/packages/documented",
"fail_below": 80,
"levels": _levels
"levels": _coverageLevels
}
}

Expand Down
18 changes: 10 additions & 8 deletions sphinx_reports/Adapter/Coverage.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@
from pyTooling.Decorators import export, readonly

from sphinx_reports.Common import ReportExtensionError
from sphinx_reports.DataModel.CodeCoverage import PackageCoverage, ModuleCoverage
from sphinx_reports.DataModel.CodeCoverage import PackageCoverage, ModuleCoverage, AggregatedCoverage


@export
Expand All @@ -49,8 +49,9 @@ class CodeCoverageError(ReportExtensionError):

@export
class Analyzer:
_packageName: str
_htmlReportDirectory: Path
_packageName: str
_htmlReportDirectory: Path
_coverageReportStatus: Configuration

def __init__(self, htmlReportDirectory: Path, packageName: str):
self._packageName = packageName
Expand All @@ -59,22 +60,23 @@ def __init__(self, htmlReportDirectory: Path, packageName: str):
self._ReadReportStatus(self._htmlReportDirectory / "status.json")

def _ReadReportStatus(self, jsonFile: Path):
status = Configuration(jsonFile)
self._coverageReportStatus = Configuration(jsonFile)

if int(status["format"]) != 2:
if int(self._coverageReportStatus["format"]) != 2:
raise CodeCoverageError(f"File format of '{jsonFile}' is not supported.")

def Convert(self):
rootPackageCoverage = PackageCoverage(Path("__init__.py"), self._packageName)

for statusRecord in status["files"]:
for statusRecord in self._coverageReportStatus["files"]:
fileID = statusRecord.Key

moduleFile = Path(statusRecord["index"]["relative_filename"])
reportFile = Path(statusRecord["index"]["html_filename"])
coverageStatus = Numbers(*(int(i) for i in statusRecord["index"]["nums"]))

moduleName = moduleFile.stem
modulePath = [p.name for p in moduleFile.parents if p.name != ""]
modulePath = [p.name for p in moduleFile.parents if p.name != ""][1:]

currentCoverageObject: AggregatedCoverage = rootPackageCoverage
for packageName in modulePath:
Expand All @@ -86,4 +88,4 @@ def _ReadReportStatus(self, jsonFile: Path):
if moduleName != "__init__":
currentCoverageObject = ModuleCoverage(moduleFile, moduleName, currentCoverageObject)

print(fileID, moduleFile, reportFile, coverageStatus)
return rootPackageCoverage
4 changes: 2 additions & 2 deletions sphinx_reports/Adapter/DocStrCoverage.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,10 +49,10 @@ class DocStrCoverageError(ReportExtensionError):

@export
class Analyzer:
_searchDirectory: Path
_packageName: str
_searchDirectory: Path
_moduleFiles: List[Path]
_coverageReport: str
_coverageReport: ResultCollection

def __init__(self, directory: Path, packageName: str) -> None:
self._searchDirectory = directory
Expand Down
72 changes: 39 additions & 33 deletions sphinx_reports/CodeCoverage.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,14 +32,14 @@
**Report code coverage as Sphinx documentation page(s).**
"""
from pathlib import Path
from typing import Dict, Tuple, Any, List, Iterable, Mapping, Generator, TypedDict
from typing import Dict, Tuple, Any, List, Iterable, Mapping, Generator, TypedDict, Union

from docutils import nodes
from pyTooling.Decorators import export

from sphinx_reports.Common import ReportExtensionError
from sphinx_reports.Sphinx import strip, LegendPosition, BaseDirective
from sphinx_reports.DataModel.CodeCoverage import PackageCoverage
from sphinx_reports.DataModel.CodeCoverage import PackageCoverage, AggregatedCoverage
from sphinx_reports.Adapter.Coverage import Analyzer


Expand Down Expand Up @@ -75,7 +75,7 @@ class CodeCoverage(BaseDirective):
_packageName: str
_html_report: Path
_failBelow: float
_levels: Dict[int, Dict[str, str]]
_levels: Dict[Union[int, str], Dict[str, str]]
_coverage: PackageCoverage

def _CheckOptions(self) -> None:
Expand Down Expand Up @@ -129,10 +129,14 @@ def _CheckConfiguration(self) -> None:
self._levels = {}
for level, levelConfig in levels.items():
try:
if not (0.0 <= int(level) <= 100.0):
if isinstance(level, str):
if level != "error":
raise ReportExtensionError(
f"conf.py: {ReportDomain.name}_{self.configPrefix}_packages:{self._packageID}.levels: Level is a keyword, but not 'error'.")
elif not (0.0 <= int(level) <= 100.0):
raise ReportExtensionError(f"conf.py: {ReportDomain.name}_{self.configPrefix}_packages:{self._packageID}.levels: Level is out of range 0..100.")
except ValueError as ex:
raise ReportExtensionError(f"conf.py: {ReportDomain.name}_{self.configPrefix}_packages:{self._packageID}.levels: Level is not an integer in range 0..100.") from ex
raise ReportExtensionError(f"conf.py: {ReportDomain.name}_{self.configPrefix}_packages:{self._packageID}.levels: Level is not a keyword or an integer in range 0..100.") from ex

try:
cssClass = levelConfig["class"]
Expand All @@ -147,6 +151,9 @@ def _CheckConfiguration(self) -> None:
self._levels[level] = {"class": cssClass, "desc": description}

def _ConvertToColor(self, currentLevel: float, configKey: str) -> str:
if currentLevel == -1.0:
return self._levels["error"][configKey]

for levelLimit, levelConfig in self._levels.items():
if (currentLevel * 100) < levelLimit:
return levelConfig[configKey]
Expand All @@ -164,7 +171,7 @@ def _GenerateCoverageTable(self) -> nodes.table:
"Missing": 100,
"Coverage in %": 100
},
classes=["doccov-table"]
classes=["report-doccov-table"]
)
tableBody = nodes.tbody()
tableGroup += tableBody
Expand All @@ -177,11 +184,11 @@ def renderlevel(tableBody: nodes.tbody, packageCoverage: PackageCoverage, level:
tableBody += nodes.row(
"",
nodes.entry("", nodes.paragraph(text=f"{' '*level}📦{packageCoverage.Name}")),
nodes.entry("", nodes.paragraph(text=f"{packageCoverage.Expected}")),
nodes.entry("", nodes.paragraph(text=f"{packageCoverage.Covered}")),
nodes.entry("", nodes.paragraph(text=f"{packageCoverage.Uncovered}")),
nodes.entry("", nodes.paragraph(text=f"{packageCoverage.Coverage:.1%}")),
classes=["doccov-table-row", self._ConvertToColor(packageCoverage.Coverage, "class")],
nodes.entry("", nodes.paragraph(text=f"")), # {packageCoverage.Expected}")),
nodes.entry("", nodes.paragraph(text=f"")), # {packageCoverage.Covered}")),
nodes.entry("", nodes.paragraph(text=f"")), # {packageCoverage.Uncovered}")),
nodes.entry("", nodes.paragraph(text=f"")), # {packageCoverage.Coverage:.1%}")),
classes=["report-doccov-table-row", self._ConvertToColor(packageCoverage.Coverage, "class")],
# style="background: rgba( 0, 200, 82, .2);"
)

Expand All @@ -192,11 +199,11 @@ def renderlevel(tableBody: nodes.tbody, packageCoverage: PackageCoverage, level:
tableBody += nodes.row(
"",
nodes.entry("", nodes.paragraph(text=f"{' '*(level+1)}  {module.Name}")),
nodes.entry("", nodes.paragraph(text=f"{module.Expected}")),
nodes.entry("", nodes.paragraph(text=f"{module.Covered}")),
nodes.entry("", nodes.paragraph(text=f"{module.Uncovered}")),
nodes.entry("", nodes.paragraph(text=f"{module.Coverage :.1%}")),
classes=["doccov-table-row", self._ConvertToColor(module.Coverage, "class")],
nodes.entry("", nodes.paragraph(text=f"")), # {module.Expected}")),
nodes.entry("", nodes.paragraph(text=f"")), # {module.Covered}")),
nodes.entry("", nodes.paragraph(text=f"")), # {module.Uncovered}")),
nodes.entry("", nodes.paragraph(text=f"")), # {module.Coverage :.1%}")),
classes=["report-doccov-table-row", self._ConvertToColor(module.Coverage, "class")],
# style="background: rgba( 0, 200, 82, .2);"
)

Expand All @@ -206,13 +213,12 @@ def renderlevel(tableBody: nodes.tbody, packageCoverage: PackageCoverage, level:
tableBody += nodes.row(
"",
nodes.entry("", nodes.paragraph(text=f"Overall ({self._coverage.FileCount} files):")),
nodes.entry("", nodes.paragraph(text=f"{self._coverage.AggregatedExpected}")),
nodes.entry("", nodes.paragraph(text=f"{self._coverage.AggregatedCovered}")),
nodes.entry("", nodes.paragraph(text=f"{self._coverage.AggregatedUncovered}")),
nodes.entry("", nodes.paragraph(text=f"{self._coverage.AggregatedCoverage:.1%}"),
nodes.entry("", nodes.paragraph(text=f"")), # {self._coverage.AggregatedExpected}")),
nodes.entry("", nodes.paragraph(text=f"")), # {self._coverage.AggregatedCovered}")),
nodes.entry("", nodes.paragraph(text=f"")), # {self._coverage.AggregatedUncovered}")),
nodes.entry("", nodes.paragraph(text=f"")), # {self._coverage.AggregatedCoverage:.1%}")),
# classes=[self._ConvertToColor(self._coverage.coverage(), "class")]
),
classes=["doccov-summary-row", self._ConvertToColor(self._coverage.AggregatedCoverage, "class")]
classes=["report-doccov-summary-row", self._ConvertToColor(self._coverage.Coverage, "class")] # self._coverage.AggregatedCoverage, "class")]
)

return table
Expand All @@ -236,12 +242,13 @@ def _CreateLegend(self, identifier: str, classes: Iterable[str]) -> List[nodes.E
tableGroup += tableBody

for level, config in self._levels.items():
tableBody += nodes.row(
"",
nodes.entry("", nodes.paragraph(text=f"≤{level}%")),
nodes.entry("", nodes.paragraph(text=config["desc"])),
classes=["doccov-legend-row", self._ConvertToColor((level - 1) / 100, "class")]
)
if isinstance(level, int):
tableBody += nodes.row(
"",
nodes.entry("", nodes.paragraph(text=f"≤{level}%")),
nodes.entry("", nodes.paragraph(text=config["desc"])),
classes=["report-doccov-legend-row", self._ConvertToColor((level - 1) / 100, "class")]
)

return [rubric, table]

Expand All @@ -251,18 +258,17 @@ def run(self) -> List[nodes.Node]:

# Assemble a list of Python source files
analyzer = Analyzer(self._html_report, self._packageName)
# analyzer.Analyze()
# self._coverage = analyzer.Convert()
self._coverage = analyzer.Convert()
# self._coverage.Aggregate()

container = nodes.container()

if LegendPosition.top in self._legend:
container += self._CreateLegend(identifier="legend1", classes=["doccov-legend"])
container += self._CreateLegend(identifier="legend1", classes=["report-doccov-legend"])

# container += self._GenerateCoverageTable()
container += self._GenerateCoverageTable()

if LegendPosition.bottom in self._legend:
container += self._CreateLegend(identifier="legend2", classes=["doccov-legend"])
container += self._CreateLegend(identifier="legend2", classes=["report-doccov-legend"])

return [container]
14 changes: 14 additions & 0 deletions sphinx_reports/DataModel/CodeCoverage.py
Original file line number Diff line number Diff line change
Expand Up @@ -72,13 +72,20 @@ def File(self) -> Path:

@export
class ModuleCoverage(AggregatedCoverage):
_coverage: float

def __init__(self, name: str, file: Path, parent: Nullable["PackageCoverage"] = None) -> None:
super().__init__(name, file, parent)

if parent is not None:
parent._modules[name] = self

self._coverage = -1.0

@readonly
def Coverage(self) -> float:
return self._coverage


@export
class PackageCoverage(AggregatedCoverage):
Expand All @@ -87,6 +94,8 @@ class PackageCoverage(AggregatedCoverage):
_modules: Dict[str, ModuleCoverage]
_packages: Dict[str, "PackageCoverage"]

_coverage: float

def __init__(self, file: Path, name: str, parent: Nullable["PackageCoverage"] = None) -> None:
super().__init__(name, file, parent)

Expand All @@ -96,6 +105,7 @@ def __init__(self, file: Path, name: str, parent: Nullable["PackageCoverage"] =
self._fileCount = 1
self._modules = {}
self._packages = {}
self._coverage = -1.0

@readonly
def FileCount(self) -> int:
Expand All @@ -109,6 +119,10 @@ def Modules(self) -> Dict[str, ModuleCoverage]:
def Packages(self) -> Dict[str, "PackageCoverage"]:
return self._packages

@readonly
def Coverage(self) -> float:
return self._coverage

def __getitem__(self, key: str) -> Union["PackageCoverage", ModuleCoverage]:
try:
return self._modules[key]
Expand Down
Loading

0 comments on commit ae81ea2

Please sign in to comment.