umpyre.collectors#
Collectors package - metric collection implementations.
Classes
Abstract base for metric collectors using Mapping interface. |
|
Registry for managing available collectors. |
|
|
Collect code statistics using AST parsing (no code execution). |
|
Collect GitHub workflow status using GitHub API. |
|
Collect complexity metrics using wily. |
|
Collect test coverage metrics from coverage reports. |
- class umpyre.collectors.CollectorRegistry[source]#
Bases:
objectRegistry for managing available collectors.
- register(name, collector_class)[source]#
Register a collector class.
- Parameters:
name (
str) – Collector identifiercollector_class (
type[MetricCollector]) – MetricCollector subclass
- class umpyre.collectors.CoverageCollector(repo_path=None, source='pytest-cov', coverage_file=None)[source]#
Bases:
MetricCollectorCollect test coverage metrics from coverage reports.
Supports:
coverage.py JSON reports
coverage.py XML reports (Cobertura format)
Tracks:
Line coverage percentage
Branch coverage percentage (if available)
Statements covered/total
Example
>>> # This requires coverage report files >>> # Skip in doctest as it requires actual test runs >>> True
- class umpyre.collectors.MetricCollector[source]#
-
Abstract base for metric collectors using Mapping interface.
Collectors implement the Mapping protocol to provide dict-like access to collected metrics, enabling flexible composition and iteration.
Example
>>> class SimpleCollector(MetricCollector): ... def collect(self) -> dict: ... return {'lines': 100, 'functions': 10} >>> collector = SimpleCollector() >>> collector['lines'] 100 >>> list(collector) ['lines', 'functions']
- class umpyre.collectors.UmpyreCollector(root_path=None, exclude_dirs=None)[source]#
Bases:
MetricCollectorCollect code statistics using AST parsing (no code execution).
Provides metrics like:
Number of functions and classes
Lines of code (total, empty, comments, docs)
Code ratios (comment/empty/function lines)
Mean lines per function
Uses AST parsing instead of dynamic imports for safety.
Example
>>> import tempfile >>> from pathlib import Path >>> # Create a simple Python file for testing >>> with tempfile.TemporaryDirectory() as tmpdir: ... test_file = Path(tmpdir) / "test.py" ... test_file.write_text('''def hello(): ... """Say hello.""" ... return "hello" ... ... class Greeter: ... """A greeter.""" ... pass ... ''') ... collector = UmpyreCollector(tmpdir) ... metrics = collector.collect() ... metrics['num_functions'] >= 1 and metrics['num_classes'] >= 1 True
- collect()[source]#
Collect code statistics from root directory using AST parsing.
- Returns:
num_functions: Total number of functions
num_classes: Total number of classes
total_lines: Total lines of code
empty_lines: Number of empty lines
comment_lines: Number of comment lines
docs_lines: Number of documentation lines
function_lines: Lines in functions
empty_lines_ratio: Ratio of empty lines
comment_lines_ratio: Ratio of comment lines
function_lines_ratio: Ratio of function lines
mean_lines_per_function: Average lines per function
files_analyzed: Number of files successfully analyzed
- Return type:
- class umpyre.collectors.WilyCollector(repo_path=None, max_revisions=5, operators=None)[source]#
Bases:
MetricCollectorCollect complexity metrics using wily.
Tracks:
Cyclomatic complexity (average)
Maintainability index
Total lines of code
Files analyzed
Note
Limited to recent commits (max_revisions) for performance.
Example
>>> # This requires wily to be installed and a git repo >>> # Skip in doctest as it requires git setup >>> True
- class umpyre.collectors.WorkflowStatusCollector(repo, token=None, lookback_runs=10, workflow_name=None)[source]#
Bases:
MetricCollectorCollect GitHub workflow status using GitHub API.
Tracks:
Last workflow run status (success/failure)
Last successful run timestamp
Recent failure count
Workflow run URL
Example
>>> # Mock test (requires actual GitHub API) >>> import os >>> if os.getenv('GITHUB_TOKEN'): ... collector = WorkflowStatusCollector( ... repo="thorwhalen/astate", ... token=os.getenv('GITHUB_TOKEN') ... ) ... metrics = collector.collect() ... 'last_run_status' in metrics ... else: ... True # Skip if no token True
- collect()[source]#
Collect workflow status from GitHub API.
- Returns:
last_run_status: ‘success’, ‘failure’, or ‘other’
last_success_timestamp: ISO timestamp or None
recent_failure_count: Number of failures in lookback window
run_url: URL of last run
total_runs_analyzed: Number of runs examined
- Return type:
Modules
Base collector class with Mapping interface. |
|
Collector for test coverage metrics. |
|
Collector using AST-based code analysis (safe, no code execution). |
|
Collector for complexity metrics using wily. |
|
Collector for GitHub workflow status using GitHub API. |