Skip to content
Merged
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 34 additions & 1 deletion snakemake_interface_report_plugins/reporter.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@


from abc import ABC, abstractmethod
from typing import List, Mapping
from typing import List, Mapping, Dict, Optional, Union
from snakemake_interface_report_plugins.interfaces import (
CategoryInterface,
ConfigFileRecordInterface,
Expand All @@ -28,6 +28,9 @@ def __init__(
settings: ReportSettingsBase,
workflow_description: str,
dag: DAGReportInterface,
metadata: Optional[
Dict[str, Union[str, int, float, List[str], List[int], List[float]]]
] = {},
):
self.rules = rules
self.jobs = jobs
Expand All @@ -37,10 +40,40 @@ def __init__(
self.workflow_description = workflow_description
self.dag = dag

# ensure that metadata is a key value dictionary
if not validate_flat_dict(metadata):
raise TypeError(
"Metadata must be single level dict[str, str | int | float | list[str] | list[int] | list[float]]]"
)

self.metadata = metadata

self.__post_init__()

def __post_init__(self):
pass

@abstractmethod
def render(self): ...


def is_valid_flat_value(value) -> bool:
if isinstance(value, (str, int, float)):
return True
elif isinstance(value, list):
return all(isinstance(item, (str, int, float)) for item in value)
else:
return False


def validate_flat_dict(metadata: dict) -> bool:
if not isinstance(metadata, dict):
return False

for k, v in metadata.items():
if not isinstance(k, str):
return False
if not is_valid_flat_value(v):
return False

return True
Loading