dumbdumbdumb is a single Python file analyzer running multiple quality tools, outputting a single normalized JSON report.
Given one target file, the analyzer runs:
ruff(fast linting + common correctness checks)black --check(format compliance)mypy --strict(strict static type checking)pylint(deeper style/design/code-smell analysis)flake8(PEP8 and plugin-based lint checks)complexipy(reports cognitive complexity per file/function)
./build.shThis tags localhost/dumbdumbdumb:latest (the localhost/ prefix keeps Podman from asking which registry to use, which fails when stdout is not a TTY—for example ./dumbdumbdumb file.py > out.json). Re-run it whenever you pull changes or want refreshed analyzer versions inside the image.
You only need Docker or Podman and bash. The wrapper script is self-contained: copy dumbdumbdumb anywhere on your PATH (for example ~/bin/) if you like; it always runs localhost/dumbdumbdumb:latest.
chmod +x dumbdumbdumb # once, if needed
./dumbdumbdumb path/to/file.pyPretty JSON:
./dumbdumbdumb --pretty path/to/file.pyTo work on the in-container Python code, use a normal editable install (python -m pip install -e .) while iterating; production use is still Docker + this script.
Top-level fields:
target: analyzed file path as seen inside the containergenerated_at: UTC ISO-8601 timestampsummary: aggregate counts and recommended process exit codefindings: flat list of all normalized findings from every tool (in run order)tools: per-tool execution summary (no raw stdout/stderr; use the tool directly if you need that)
summary includes:
tool_countfinding_count(all severities)actionable_finding_count(excludes severityinfo, e.g. complexity notes)suppressed_finding_count(aggregated across tools)failed_tools(names where execution failed)tools_with_issues(names that reported lint/type issues)exit_code:0clean,1actionable findings or tools with issues,2at least one tool failed to run
Each object in findings includes:
tool,severity,message,path- Optional:
line,column,end_line,end_column,code,symbol(omitted when not applicable)
Each object in tools includes:
name,status(ok|issues|error),exit_code,duration_msfinding_count,suppressed_finding_counterror(present only whenstatusiserror)
- Using Docker
python-alpineinstead ofpython-slimwill result in 1GB bigger image, since it has to installbuild-base